public void Simulate(DateTime from, DateTime to) { DateTime dateTime = from; TradePosition tradePosition = null; while (dateTime < to) { Candle candle = _candleCollection.GetCandle(dateTime); if (candle == null) { dateTime = dateTime.AddSeconds(5); continue; } if (tradePosition != null) { tradePosition.Evaluate(candle.Close); if (tradePosition.IsClosed) { _activity.Add(tradePosition); tradePosition = null; } } else { TradeDecision decision = _tradeStrategy.Evaluate(candle); if (decision.ShouldTrade) { tradePosition = new TradePosition(dateTime, candle.Close, decision); } } dateTime = dateTime.AddSeconds(5); var currentWin = _activity.Sum(c => c.Win); var currentLoss = _activity.Sum(c => c.Loss); var currentProfit = currentWin + currentLoss; var currentwincount = _activity.Count(c => c.Win > 0); var currentlossCount = _activity.Count(c => c.Loss < 0); } var Win = _activity.Sum(c => c.Win); var wincount = _activity.Count(c => c.Win > 0); var Loss = _activity.Sum(c => c.Loss); var lossCount = _activity.Count(c => c.Loss < 0); var profit = Win + Loss; double profitPercent = (double)wincount / (double)_activity.Count; Console.WriteLine($"\tProfit {profit}({profitPercent:#.##}) Win {Win}({wincount}) Loss {Loss}({lossCount}) trades {_activity.Count}"); }
static void Main2(string[] args) { System.Console.WriteLine("Loading model "); MLContext mlContext = new MLContext(); ITransformer mlModel = mlContext.Model.Load("MLModel.zip", out var modelInputSchema); var predEngine = mlContext.Model.CreatePredictionEngine <ModelInput, ModelOutput>(mlModel); System.Console.Write("[OK]\n"); System.Console.Write("Loading candles "); var candlesbefore = Oanda.LoadCandles("EUR_USD", "S5", DateTime.Now.AddDays(-2)); var candles = Oanda.LoadLiveCandles("EUR_USD", "S5"); System.Console.Write($"[OK {candles.Length}]\n"); System.Console.Write("Analyse data "); var collection = new CandleCollection("EUR_USD", Period.S, 5); var minuteconsolidation = new ConsolidatedCandleCollection(collection, Period.M, 1); var m15Consolidation = new ConsolidatedCandleCollection(collection, Period.M, 15); var stochasticS5 = new StochasticStats(collection); var stochasticM1 = new StochasticStats(minuteconsolidation); var stochasticM15 = new StochasticStats(m15Consolidation); var winpip = new PipExpectation(collection, 30); foreach (OandaCandle candle in candlesbefore) { DateTime datetime = new DateTime(candle.Time.Year, candle.Time.Month, candle.Time.Day, candle.Time.Hour, candle.Time.Minute, candle.Time.Second); collection.AddCandle(datetime, candle.Mid.O, candle.Mid.C, candle.Mid.H, candle.Mid.L, candle.Volume); } foreach (OandaCandle candle in candles) { DateTime datetime = new DateTime(candle.Time.Year, candle.Time.Month, candle.Time.Day, candle.Time.Hour, candle.Time.Minute, candle.Time.Second); collection.AddCandle(datetime, candle.Mid.O, candle.Mid.C, candle.Mid.H, candle.Mid.L, candle.Volume); } System.Console.Write("[OK]\n"); System.Console.Write("Prediciction "); foreach (DateTime dateTime in collection._list.Keys.OrderBy(c => c.Ticks)) { var S5Candle = collection.GetCandle(dateTime); if (S5Candle == null) { continue; } var M1Candle = minuteconsolidation.GetCandle(dateTime); if (M1Candle == null) { continue; } var M15Candle = m15Consolidation.GetCandle(dateTime); if (M15Candle == null) { continue; } var S5Stoch = stochasticS5.GetValue(dateTime); if (S5Stoch == null) { continue; } var M1Stoch = stochasticM1.GetValue(dateTime); if (M1Stoch == null) { continue; } var M15Stoch = stochasticM15.GetValue(dateTime); if (M15Stoch == null) { continue; } ModelInput input = new ModelInput() { Time = (float)S5Candle.DateTime.TimeOfDay.TotalSeconds, Decision = 0, S5V = S5Candle.Volume, S5C = decimal.ToSingle(S5Candle.CloseRelativ), S5H = decimal.ToSingle(S5Candle.HighRaltiv), S5L = decimal.ToSingle(S5Candle.LowRelativ), S5StochK = (float)(S5Stoch.K), S5StochD = (float)(S5Stoch.D), M1V = M1Candle.Volume, M1C = decimal.ToSingle(M1Candle.CloseRelativ), M1H = decimal.ToSingle(M1Candle.HighRaltiv), M1L = decimal.ToSingle(M1Candle.LowRelativ), M1StochK = (float)M1Stoch.K, M1StochD = (float)M1Stoch.D, M15V = M15Candle.Volume, M15C = decimal.ToSingle(M15Candle.CloseRelativ), M15H = decimal.ToSingle(M15Candle.HighRaltiv), M15L = decimal.ToSingle(M15Candle.LowRelativ), M15StochK = (float)M15Stoch.K, M15StochD = (float)M15Stoch.D }; ModelOutput result = predEngine.Predict(input); var expected = winpip.GetValue(dateTime); if (expected == null) { continue; } float decision = 0f; if (expected.Long > 5m && expected.Short < 1.6m) { decision = 1; } else if (expected.Short > 5m && expected.Long < 1.6m) { decision = 2; } else { decision = 0; } if (result.Prediction > 0 || decision > 0) { System.Console.WriteLine($"[{dateTime}] Decision {decision} result {result.Prediction} Predicted scores: [{String.Join(",", result.Score)}]"); } else if (result.Prediction > 0) { System.Console.WriteLine($"[{dateTime}] Operation {result.Prediction} Predicted scores: [{String.Join(",", result.Score)}]"); } } while (true) { Task.Delay(2000).Wait(); var candleslive = Oanda.LoadLiveCandles("EUR_USD", "S5", 2); foreach (OandaCandle candle in candleslive) { DateTime datetime = new DateTime(candle.Time.Year, candle.Time.Month, candle.Time.Day, candle.Time.Hour, candle.Time.Minute, candle.Time.Second); collection.AddCandle(datetime, candle.Mid.O, candle.Mid.C, candle.Mid.H, candle.Mid.L, candle.Volume); } foreach (DateTime dateTime in collection._list.Keys.OrderByDescending(c => c.Ticks).Take(2)) { var S5Candle = collection.GetCandle(dateTime); if (S5Candle == null) { continue; } var M1Candle = minuteconsolidation.GetCandle(dateTime); if (M1Candle == null) { continue; } var M15Candle = m15Consolidation.GetCandle(dateTime); if (M15Candle == null) { continue; } var S5Stoch = stochasticS5.GetValue(dateTime); if (S5Stoch == null) { continue; } var M1Stoch = stochasticM1.GetValue(dateTime); if (M1Stoch == null) { continue; } var M15Stoch = stochasticM15.GetValue(dateTime); if (M15Stoch == null) { continue; } ModelInput input = new ModelInput() { Time = (float)S5Candle.DateTime.TimeOfDay.TotalSeconds, Decision = 0, S5V = S5Candle.Volume, S5C = decimal.ToSingle(S5Candle.CloseRelativ), S5H = decimal.ToSingle(S5Candle.HighRaltiv), S5L = decimal.ToSingle(S5Candle.LowRelativ), S5StochK = (float)(S5Stoch.K), S5StochD = (float)(S5Stoch.D), M1V = M1Candle.Volume, M1C = decimal.ToSingle(M1Candle.CloseRelativ), M1H = decimal.ToSingle(M1Candle.HighRaltiv), M1L = decimal.ToSingle(M1Candle.LowRelativ), M1StochK = (float)M1Stoch.K, M1StochD = (float)M1Stoch.D, M15V = M15Candle.Volume, M15C = decimal.ToSingle(M15Candle.CloseRelativ), M15H = decimal.ToSingle(M15Candle.HighRaltiv), M15L = decimal.ToSingle(M15Candle.LowRelativ), M15StochK = (float)M15Stoch.K, M15StochD = (float)M15Stoch.D }; ModelOutput result = predEngine.Predict(input); System.Console.WriteLine($"[{dateTime}] Operation {result.Prediction} Predicted scores: [{String.Join(",", result.Score)}]"); } } }
static void Main3(string[] args) { var candles = Oanda.LoadCandles("EUR_USD", "S5", DateTime.Now.AddDays(-45)); var collection = new CandleCollection("EUR_USD", Period.S, 5); var minuteconsolidation = new ConsolidatedCandleCollection(collection, Period.M, 1); var m15Consolidation = new ConsolidatedCandleCollection(collection, Period.M, 15); var h1consolidation = new ConsolidatedCandleCollection(collection, Period.H, 1); var stochasticS5 = new StochasticStats(collection); var stochasticM1 = new StochasticStats(minuteconsolidation); var stochasticM15 = new StochasticStats(m15Consolidation); var h1stoch = new StochasticStats(h1consolidation); var winpip = new PipExpectation(collection, 60); foreach (OandaCandle candle in candles) { DateTime datetime = new DateTime(candle.Time.Year, candle.Time.Month, candle.Time.Day, candle.Time.Hour, candle.Time.Minute, candle.Time.Second); collection.AddCandle(datetime, candle.Mid.O, candle.Mid.C, candle.Mid.H, candle.Mid.L, candle.Volume); } var maxlong = winpip._futurPip.Values.Max(c => c.Long); var avglong = winpip._futurPip.Values.Average(c => c.Long); int moreThanSpreadLong = winpip._futurPip.Values.Count(c => c.Long > 5m && c.Short < 1.5m); var maxshort = winpip._futurPip.Values.Max(c => c.Short); var avgshort = winpip._futurPip.Values.Average(c => c.Short); int moreThanSpreadShort = winpip._futurPip.Values.Count(c => c.Short > 5m && c.Long < 1.5m); var records = new List <dynamic>(); foreach (DateTime dateTime in collection._list.Keys.OrderBy(c => c.Ticks)) { var S5Candle = collection.GetCandle(dateTime); if (S5Candle == null) { continue; } var M1Candle = minuteconsolidation.GetCandle(dateTime); if (M1Candle == null) { continue; } var M15Candle = m15Consolidation.GetCandle(dateTime); if (M15Candle == null) { continue; } var H1Candle = h1consolidation.GetCandle(dateTime); if (H1Candle == null) { continue; } var S5Stoch = stochasticS5.GetValue(dateTime); if (S5Stoch == null) { continue; } var M1Stoch = stochasticM1.GetValue(dateTime); if (M1Stoch == null) { continue; } var M15Stoch = stochasticM15.GetValue(dateTime); if (M15Stoch == null) { continue; } var H1Stoch = h1stoch.GetValue(dateTime); if (H1Stoch == null) { continue; } var expected = winpip.GetValue(dateTime); if (expected == null) { continue; } dynamic record = new ExpandoObject(); record.Time = S5Candle.DateTime.TimeOfDay.TotalSeconds; record.S5V = S5Candle.Volume; record.S5C = decimal.ToSingle(S5Candle.CloseRelativ); record.S5H = decimal.ToSingle(S5Candle.HighRaltiv); record.S5L = decimal.ToSingle(S5Candle.LowRelativ); record.S5StochK = (float)S5Stoch.K; record.S5StochD = (float)S5Stoch.D; record.M1V = M1Candle.Volume; record.M1C = decimal.ToSingle(M1Candle.CloseRelativ); record.M1H = decimal.ToSingle(M1Candle.HighRaltiv); record.M1L = decimal.ToSingle(M1Candle.LowRelativ); record.M1StochK = (float)M1Stoch.K; record.M1StochD = (float)M1Stoch.D; record.M15V = M15Candle.Volume; record.M15C = decimal.ToSingle(M15Candle.CloseRelativ); record.M15H = decimal.ToSingle(M15Candle.HighRaltiv); record.M15L = decimal.ToSingle(M15Candle.LowRelativ); record.M15StochK = (float)M15Stoch.K; record.M15StochD = (float)M15Stoch.D; record.H1V = H1Candle.Volume; record.H1C = decimal.ToSingle(H1Candle.CloseRelativ); record.H1H = decimal.ToSingle(H1Candle.HighRaltiv); record.H1L = decimal.ToSingle(H1Candle.LowRelativ); record.H1StochK = (float)H1Stoch.K; record.H1StochD = (float)H1Stoch.D; //record.FPL = expected.Long; //record.FPS = expected.Short; if (expected.Long > 5m) { record.Decision = 1; } //else if (expected.Long > 2m) //{ // record.Decision = 1; //} else { record.Decision = 0; } records.Add(record); } using (var writer = new StreamWriter("train.csv")) using (var csv = new CsvWriter(writer)) { csv.Configuration.Delimiter = ","; csv.WriteRecords(records); } MLContext mlContext = new MLContext(); ITransformer mlModel = mlContext.Model.Load("MLModel.zip", out var modelInputSchema); var predEngine = mlContext.Model.CreatePredictionEngine <ModelInput, ModelOutput>(mlModel); foreach (DateTime dateTime in collection._list.Keys.OrderBy(c => c.Ticks)) { var S5Candle = collection.GetCandle(dateTime); if (S5Candle == null) { continue; } var M1Candle = minuteconsolidation.GetCandle(dateTime); if (M1Candle == null) { continue; } var M15Candle = m15Consolidation.GetCandle(dateTime); if (M15Candle == null) { continue; } var H1Candle = h1consolidation.GetCandle(dateTime); if (H1Candle == null) { continue; } var S5Stoch = stochasticS5.GetValue(dateTime); if (S5Stoch == null) { continue; } var M1Stoch = stochasticM1.GetValue(dateTime); if (M1Stoch == null) { continue; } var M15Stoch = stochasticM15.GetValue(dateTime); if (M15Stoch == null) { continue; } var H1Stoch = h1stoch.GetValue(dateTime); if (H1Stoch == null) { continue; } var expected = winpip.GetValue(dateTime); if (expected == null) { continue; } float decision = 0f; if (expected.Long > 5m && expected.Short < 1.6m) { decision = 1; } else if (expected.Short > 5m && expected.Long < 1.6m) { decision = 2; } else { decision = 0; } ModelInput input = new ModelInput() { Time = (float)S5Candle.DateTime.TimeOfDay.TotalSeconds, Decision = 0, S5V = S5Candle.Volume, S5C = decimal.ToSingle(S5Candle.CloseRelativ), S5H = decimal.ToSingle(S5Candle.HighRaltiv), S5L = decimal.ToSingle(S5Candle.LowRelativ), S5StochK = (float)(S5Stoch.K), S5StochD = (float)(S5Stoch.D), M1V = M1Candle.Volume, M1C = decimal.ToSingle(M1Candle.CloseRelativ), M1H = decimal.ToSingle(M1Candle.HighRaltiv), M1L = decimal.ToSingle(M1Candle.LowRelativ), M1StochK = (float)M1Stoch.K, M1StochD = (float)M1Stoch.D, M15V = M15Candle.Volume, M15C = decimal.ToSingle(M15Candle.CloseRelativ), M15H = decimal.ToSingle(M15Candle.HighRaltiv), M15L = decimal.ToSingle(M15Candle.LowRelativ), M15StochK = (float)M15Stoch.K, M15StochD = (float)M15Stoch.D }; ModelOutput result = predEngine.Predict(input); if (result.Prediction > 0 || input.Decision > 0) { System.Console.WriteLine($"[{input.Time}] decision {input.Decision} result {result.Prediction} Predicted scores: [{String.Join(",", result.Score)}]"); } } }