public void DoTrade(TradeContext tradeContext) { foreach (var order in this) { tradeContext.DoTrade(order.TradeType, order.Time); } }
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); }
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); } }
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()); }
public string GetTradeDescription(TradeContext tradeContext) { return(String.Join(" ", this.Select(order => order.GetTradeDescription(tradeContext)))); }
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); }
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); } }