private void UpdateFXCandles(object obj) { if (_updatingCandles) return; if (string.IsNullOrEmpty(_uiService.SelectedStrategyFilename)) { MessageBox.Show("Select strategy to update candles"); return; } var strategyType = StrategyHelper.CompileStrategy(_uiService.SelectedCodeText); if (strategyType == null) { MessageBox.Show("Unable to compile strategy"); return; } var strategy = (StrategyBase)Activator.CreateInstance(strategyType); _updatingCandles = true; var dispatcher = Dispatcher.CurrentDispatcher; var fxcm = _brokersService.Brokers.First(x => x.Name == "FXCM"); var timeframes = strategy.Timeframes.Union(new[] { Timeframe.M1 }).ToArray(); var markets = strategy.Markets; if (markets == null) { markets = StrategyBase.GetDefaultMarkets(); } var view = new ProgressView { Owner = Application.Current.MainWindow }; view.TextToShow.Text = "Updating candles"; Task.Run(() => { try { CandlesHelper.UpdateCandles( fxcm, _candleService, markets, timeframes, updateProgressAction: s => { _dispatcher.BeginInvoke((Action)(() => { view.TextToShow.Text = s; })); }); } catch (Exception ex) { Log.Error("Unable to update candles", ex); } dispatcher.Invoke(() => { view.Close(); MessageBox.Show("Updating candles complete"); _updatingCandles = false; }); }); view.ShowDialog(); }
public static void SetChartViewModelVisibleRange( Trade trade, ChartViewModel cvm, IList <Candle> candles, Timeframe timeframe) { if (candles.Count == 0) { return; } var startTime = trade.OrderDateTime ?? trade.EntryDateTime.Value; var endTime = trade.CloseDateTime ?? new DateTime(candles.Last().CloseTimeTicks, DateTimeKind.Utc); var startCandle = CandlesHelper.GetFirstCandleThatClosesBeforeDateTime(candles, startTime); var endCandle = CandlesHelper.GetFirstCandleThatClosesBeforeDateTime(candles, endTime) ?? candles.Last(); var candlesBeforeTrade = 0; switch (timeframe) { case Timeframe.M1: candlesBeforeTrade = (1 * 60); break; case Timeframe.M5: candlesBeforeTrade = (6 * 12); break; case Timeframe.M15: candlesBeforeTrade = (2 * 12); break; case Timeframe.M30: candlesBeforeTrade = (2 * 12); break; case Timeframe.H1: candlesBeforeTrade = (2 * 24); break; case Timeframe.H2: candlesBeforeTrade = (5 * 12); break; case Timeframe.H4: candlesBeforeTrade = (10 * 6); break; case Timeframe.H8: candlesBeforeTrade = (20 * 3); break; case Timeframe.D1: candlesBeforeTrade = 30; break; default: throw new ApplicationException(timeframe + " timeframe not found for chart helper vis range"); } var candlesAfterTrade = (int)(candlesBeforeTrade * 0.1); var min = candles.IndexOf(startCandle.Value) - candlesBeforeTrade; var max = candles.IndexOf(endCandle) + candlesAfterTrade; if (min < 0) { min = 0; } SetChartXVisibleRange(cvm, min, max); var miny = double.NaN; var maxy = double.NaN; for (var i = min; i < candles.Count; i++) { if (double.IsNaN(miny) || candles[i].LowBid < miny) { miny = candles[i].LowBid; } if (double.IsNaN(maxy) || candles[i].HighBid > maxy) { maxy = candles[i].HighBid; } } if (trade.LimitPrice != null && trade.LimitPrice < (decimal)miny) { miny = (double)trade.LimitPrice; } if (trade.LimitPrice != null && trade.LimitPrice > (decimal)maxy) { maxy = (double)trade.LimitPrice; } if (trade.StopPrice != null && trade.StopPrice < (decimal)miny) { miny = (double)trade.StopPrice; } if (trade.StopPrice != null && trade.StopPrice > (decimal)maxy) { maxy = (double)trade.StopPrice; } }