protected bool signalBuy(TA.PriceVolumeSeries series, int idx, double diff, int days) { bool res = false; if (idx >= days) { TA.Candle candleCur = (TA.Candle)series.Data[idx]; TA.Candle candlePrev = (TA.Candle)series.Data[idx - days]; res = (candleCur.high * diff > candlePrev.high); } return(res); }
/// <summary> /// Example /// Date,Open,High,Low,Close,Volume,Adj Close /// 2009-09-25,74.04,74.39,73.37,73.80,3470700,73.80 /// </summary> static bool strToCandle(string str, out TA.Candle candle) { candle = null; int start = 0; int end = 0; bool result = true; // skip date end = str.IndexOf(',', start); if (end <= 1) // no date ? { System.Console.WriteLine("242:Failed to parse candle data " + str); return(false); } start = end + 1; double open, close, max, min; int volume; string strVal; // open end = str.IndexOf(',', start); if ((end <= 1) || (end <= start)) // no open ? { System.Console.WriteLine("255:Failed to parse candle data " + str); return(false); } strVal = str.Substring(start, end - start); result = Double.TryParse(strVal, out open); if (!result) { System.Console.WriteLine("262:Failed to parse candle data " + str + "!" + strVal); return(false); } start = end + 1; // max end = str.IndexOf(',', start); if ((end <= 1) || (end <= start)) // no max ? { System.Console.WriteLine("271:Failed to parse candle data " + str); return(false); } strVal = str.Substring(start, end - start); result = Double.TryParse(strVal, out max); if (!result) { System.Console.WriteLine("278:Failed to parse candle data " + str + "!" + strVal); return(false); } start = end + 1; // min end = str.IndexOf(',', start); if ((end <= 1) || (end <= start)) // no min ? { System.Console.WriteLine("287:Failed to parse candle data " + str); return(false); } strVal = str.Substring(start, end - start); result = Double.TryParse(strVal, out min); if (!result) { System.Console.WriteLine("294:Failed to parse candle data " + str + "!" + strVal); return(false); } start = end + 1; // close end = str.IndexOf(',', start); if ((end <= 1) || (end <= start)) // no close ? { System.Console.WriteLine("304:Failed to parse candle data " + str); return(false); } strVal = str.Substring(start, end - start); result = Double.TryParse(strVal, out close); if (!result) { System.Console.WriteLine("311:Failed to parse candle data " + str + "!" + strVal); return(false); } start = end + 1; // volume end = str.IndexOf(',', start); if ((end <= 1) || (end <= start)) // no open ? { System.Console.WriteLine("320:Failed to parse candle data " + str); return(false); } strVal = str.Substring(start, end - start); result = Int32.TryParse(strVal, out volume); if (!result) { System.Console.WriteLine("327:Failed to parse candle data " + str + "!" + strVal); return(false); } start = end + 1; candle = new TA.Candle(open, close, min, max, volume); return(true); }
/// <summary> /// Example /// Date,Open,High,Low,Close,Volume,Adj Close /// 2009-09-25,74.04,74.39,73.37,73.80,3470700,73.80 /// </summary> static bool strToCandle(string str, out TA.Candle candle) { candle = null; int start = 0; int end = 0; bool result = true; // skip date end = str.IndexOf(',', start); if (end <= 1) // no date ? { System.Console.WriteLine("242:Failed to parse candle data " + str); return false; } start = end + 1; double open, close, max, min; int volume; string strVal; // open end = str.IndexOf(',', start); if ((end <= 1) || (end <= start)) // no open ? { System.Console.WriteLine("255:Failed to parse candle data " + str); return false; } strVal = str.Substring(start, end - start); result = Double.TryParse(strVal, out open); if (!result) { System.Console.WriteLine("262:Failed to parse candle data " + str + "!" + strVal); return false; } start = end + 1; // max end = str.IndexOf(',', start); if ((end <= 1) || (end <= start)) // no max ? { System.Console.WriteLine("271:Failed to parse candle data " + str); return false; } strVal = str.Substring(start, end - start); result = Double.TryParse(strVal, out max); if (!result) { System.Console.WriteLine("278:Failed to parse candle data " + str + "!" + strVal); return false; } start = end + 1; // min end = str.IndexOf(',', start); if ((end <= 1) || (end <= start)) // no min ? { System.Console.WriteLine("287:Failed to parse candle data " + str); return false; } strVal = str.Substring(start, end - start); result = Double.TryParse(strVal, out min); if (!result) { System.Console.WriteLine("294:Failed to parse candle data " + str + "!" + strVal); return false; } start = end + 1; // close end = str.IndexOf(',', start); if ((end <= 1) || (end <= start)) // no close ? { System.Console.WriteLine("304:Failed to parse candle data " + str); return false; } strVal = str.Substring(start, end - start); result = Double.TryParse(strVal, out close); if (!result) { System.Console.WriteLine("311:Failed to parse candle data " + str + "!" + strVal); return false; } start = end + 1; // volume end = str.IndexOf(',', start); if ((end <= 1) || (end <= start)) // no open ? { System.Console.WriteLine("320:Failed to parse candle data " + str); return false; } strVal = str.Substring(start, end - start); result = Int32.TryParse(strVal, out volume); if (!result) { System.Console.WriteLine("327:Failed to parse candle data " + str + "!" + strVal); return false; } start = end + 1; candle = new TA.Candle(open, close, min, max, volume); return true; }
protected void signalPerformance(TA.PriceVolumeSeries series, double stopLoss, int maxDays, int idx, bool isBuy, double diffSell, double diffBuy, int sigDays, out Trade trade) { trade = new Trade(); trade.isBuy = isBuy; trade.idx = idx; int count = series.Data.Count; TA.Candle candle = (TA.Candle)series.Data[idx]; trade.candleEntry = candle; double entryPoint = candle.close; double close = entryPoint; double bestClose = close; bool isSell = !isBuy; int i; int days = 0; for (i = idx + 1; i < count; i++) { candle = (TA.Candle)series.Data[i]; days++; if (signalStop(isBuy, stopLoss, maxDays, entryPoint, close, candle.close, days, bestClose)) { break; } if (isBuy && signalSell(series, idx, diffSell, sigDays)) { break; } if (isSell && signalBuy(series, idx, diffSell, sigDays)) { break; } close = candle.close; if (isBuy) { if (bestClose < close) { bestClose = close; } } else { if (bestClose > close) { bestClose = close; } } } double delta; delta = entryPoint - candle.close; if (isBuy) { delta = -delta; } double p = delta / entryPoint; trade.candleExit = candle; trade.entry = entryPoint; trade.exit = candle.close; trade.p = p; trade.days = days; }
protected void signalPerformanceOptimization(TA.PriceVolumeSeries series, double[] data, int windowSize, double stopLoss, int maxDays, double diffSell, double diffBuy, int days, System.Collections.Generic.List <TradeSession> bestBlocks) { Trade trade; System.Collections.Generic.List <Trade> trades = new System.Collections.Generic.List <Trade>(10); int i = 0; while (i < (data.Length - 1)) { int idx = i + windowSize; TA.Candle candle = (TA.Candle)series.Data[idx]; double p; if (signalSell(series, idx, diffSell, days)) { signalPerformance(series, stopLoss, maxDays, idx, false, diffSell, diffBuy, days, out trade); if (trades.Count < 200) { trades.Add(trade); } else { break; } i += Math.Max(1, trade.days); // System.Console.Write("\tSell at "+idx+" entry="+trade.entry+" exit="+trade.exit+" "+candle.ToString()); // System.Console.WriteLine(" p="+trade.p+", days="+trade.days+", exit at "+(idx+trade.days)); } else if (signalBuy(series, idx, diffBuy, days)) // buy condition and trigger { signalPerformance(series, stopLoss, maxDays, idx, true, diffSell, diffBuy, days, out trade); if (trades.Count < 200) { trades.Add(trade); } else { break; } i += Math.Max(1, trade.days); // System.Console.Write("\tBuy at "+idx+" entry="+trade.entry+" exit="+trade.exit+" "+candle.ToString()); // System.Console.WriteLine(" p="+trade.p+", days="+trade.days+", exit at "+(idx+trade.days)); } else { i++; } } double pTotal; int daysTotal; int hits; double maxDrawDown; signalPerformanceGetTrades(trades, out daysTotal, out hits, out pTotal, out maxDrawDown); int misses = trades.Count - hits; if ((pTotal > 1.1) && (trades.Count > 5) && (bestBlocks.Count < 1000)) { TradeSession ts = new TradeSession(); ts.trades = trades; ts.maxDays = maxDays; ts.p = pTotal; ts.days = daysTotal; ts.hits = hits; ts.stopLoss = stopLoss; ts.sellSignal = diffSell; ts.buySignal = diffBuy; ts.maxDays = maxDays; ts.maxDrawDown = maxDrawDown; bestBlocks.Add(ts); System.Console.Write("+"); // System.Console.WriteLine("p="+pTotal); // signalPerformancePrintTrades(trades); } if ((pTotal > 2) && (trades.Count > 5) && (bestBlocks.Count > 1000)) { System.Console.Write("-"); } // System.Console.Write("1"); }