예제 #1
0
 public void DoTrade(TradeContext tradeContext)
 {
     foreach (var order in this)
     {
         tradeContext.DoTrade(order.TradeType, order.Time);
     }
 }
예제 #2
0
 public bool IsMatch(out Signal signal, TradeContext tradeContext)
 {
     signal = null;
     foreach (var c in TradeConditions)
     {
         Signal s      = null;
         bool   result = c.IsMatch(out s, tradeContext);
         if (s != null)
         {
             if (signal == null)
             {
                 signal = new AndSignal();
             }
             ((AndSignal)signal).Add(s);
         }
         if (result == false)
         {
             return(false);
         }
     }
     return(true);
 }
예제 #3
0
        public bool IsMatch(out Candlesticks.Signal signal, TradeContext tradeContext)
        {
            signal = null;
            DateTime date = tradeContext.Date;

            if (date.Add(CheckStartTime) > date.Add(CheckEndTime))
            {
                throw new Exception("checkStartDateTime > checkEndDateTime");
            }
            if (date.Add(CheckStartTime) >= DateTime.Now)
            {
                return(false);
            }
            signal = new Signal()
            {
                Pattern = this,
            };
            float startPrice = tradeContext.GetPrice(date.Add(CheckStartTime));

            ((Signal)signal).CheckStartPrice = startPrice;
            if (date.Add(CheckEndTime) >= DateTime.Now)
            {
                return(false);
            }

            float endPrice = tradeContext.GetPrice(date.Add(CheckEndTime));

            ((Signal)signal).CheckEndPrice = endPrice;

            if (this.IsCheckUp)
            {
                return(endPrice > startPrice);
            }
            else
            {
                return(endPrice < startPrice);
            }
        }
예제 #4
0
        public string GetTradeDescription(TradeContext tradeContext)
        {
            DateTime priceGettableTime = DateTime.Now.AddSeconds(-5);
            float    tradeStartPrice   = float.NaN;
            var      builder           = new StringBuilder();

            builder.Append(Time.ToString());
            builder.Append(" ");
            builder.Append(this.TradeType);
            builder.Append(" ");

            DateTime tradeStartDateTime = tradeContext.Date.AddTicks(this.Time.Ticks);

            if (tradeStartDateTime < priceGettableTime)
            {
                tradeStartPrice = tradeContext.GetPrice(tradeStartDateTime);
                builder.Append(PriceFormatter.Format(tradeStartPrice, Instrument));
            }
            else
            {
                builder.Append("???");
            }
            return(builder.ToString());
        }
예제 #5
0
 public string GetTradeDescription(TradeContext tradeContext)
 {
     return(String.Join(" ", this.Select(order => order.GetTradeDescription(tradeContext))));
 }
예제 #6
0
        private void ReportMultiCondition(Report report, TradeOrders tradeOrders, TradeCondition[] conditions, IEnumerable <Candlestick> candles)
        {
            report.SetHeader("condition", "prifit rate", "profit count", "total match");

            var dateTimePrice = new Dictionary <DateTime, float>();
            var dateSet       = new HashSet <DateTime>();

            foreach (var c in candles)
            {
                if (c.IsNull)
                {
                    continue;
                }
                dateTimePrice[c.DateTime] = c.Open;
                dateSet.Add(c.DateTime.Date);
            }
            Func <DateTime, float> getPrice = dateTime =>
                                              dateTimePrice.ContainsKey(dateTime) ? dateTimePrice[dateTime] : float.NaN;

            int c1, c2, c3, c4, total;
            int r1, r2, r3, r4;

            r1 = r2 = r3 = r4 = c1 = c2 = c3 = c4 = total = 0;

            foreach (var date in dateSet)
            {
                var  m       = new List <bool>();
                bool isValid = true;
                foreach (var condition in conditions)
                {
                    TradeContext c = new TradeContext()
                    {
                        Instrument = tradeOrders[0].Instrument,
                        Date       = date,
                        GetPrice   = getPrice,
                    };
                    Signal signal;
                    m.Add(condition.IsMatch(out signal, c));
                    if (signal == null || signal.IsValid == false)
                    {
                        isValid = false;
                    }
                }
                if (!isValid)
                {
                    continue;
                }
                TradeContext context = new TradeContext()
                {
                    Instrument = tradeOrders[0].Instrument,
                    Date       = date,
                    GetPrice   = getPrice,
                };
                tradeOrders.DoTrade(context);
                if (context.IsValid == false)
                {
                    continue;
                }
                bool isSuccess = context.Profit > 0f;

                total++;
                if (!m[0] && !m[1])
                {
                    c1++;
                    r1 += isSuccess ? 1 : 0;
                }
                if (m[0] && !m[1])
                {
                    c2++;
                    r2 += isSuccess ? 1 : 0;
                }
                if (!m[0] && m[1])
                {
                    c3++;
                    r3 += isSuccess ? 1 : 0;
                }
                if (m[0] && m[1])
                {
                    c4++;
                    r4 += isSuccess ? 1 : 0;
                }
            }
            report.WriteLine("!p1 && !p2", (float)r1 / c1, r1, c1);
            report.WriteLine("p1 && !p2", (float)r2 / c2, r2, c2);
            report.WriteLine("!p1 && p2", (float)r3 / c3, r3, c3);
            report.WriteLine("p1 && p2", (float)r4 / c4, r4, c4);
            report.WriteLine("total", (float)(r1 + r2 + r3 + r4) / (c1 + c2 + c3 + c4), r1 + r2 + r3 + r4, c1 + c2 + c3 + c4);
        }
예제 #7
0
        private void timer1_Tick(object sender, EventArgs e)
        {
            //			this.signalDataGrid.CurrentCell = null;
            using (DBUtils.OpenThreadConnection()) {
                int index = 0;
                this.signalDataGrid.CommitEdit(DataGridViewDataErrorContexts.Commit);
                foreach (var pattern in patterns)
                {
                    var cells = this.signalDataGrid.Rows[index].Cells;
                    cells["pattern"].Value = pattern.TradeCondition.GetCheckDescription();

                    Signal signal;
                    bool   isMatch = false;

                    TradeContext tradeContext = new TradeContext()
                    {
                        Instrument = pattern.TradeOrders[0].Instrument,
                        Date       = DateTime.Today
                    };

                    cells["trade"].Value = pattern.TradeOrders.GetTradeDescription(tradeContext);
                    if (pattern.TradeCondition.IsMatch(out signal, tradeContext))
                    {
                        pattern.TradeOrders.DoTrade(tradeContext);
                        if (tradeContext.Profit > 0f)
                        {
                            cells["trade"].Style.BackColor = Color.LightPink;
                        }
                        else
                        {
                            cells["trade"].Style.BackColor = pattern.TradeOrders.IsInTradeTime ? Color.Red : Color.Yellow;
                        }
                        isMatch = true;
                    }
                    else
                    {
                        cells["trade"].Style.BackColor = Color.White;
                        isMatch = false;
                    }

                    if (signal != null)
                    {
                        if (isMatch)
                        {
                            cells["match"].Value           = "Matched!" + signal.GetCheckResultDescription();
                            cells["match"].Style.BackColor = Color.Yellow;
                            var isAutoTrade = cells["autoTrade"].Value;
                            if (isAutoTrade != null && (bool)isAutoTrade)
                            {
                                DoTrade(pattern.TradeOrders);
                            }
                        }
                        else
                        {
                            if (signal.IsCheckFinished)
                            {
                                cells["match"].Style.BackColor = Color.LightGray;
                            }
                            cells["match"].Value = "Not Match " + signal.GetCheckResultDescription();
                        }
                    }
                    else
                    {
                        cells["match"].Value = "Not Match";
                    }
                    index++;
                }
                this.signalDataGrid.AutoResizeColumn(0);
                this.signalDataGrid.AutoResizeColumn(1);
                this.signalDataGrid.AutoResizeColumn(2);
            }
        }