Exemple #1
0
        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();
        }
Exemple #2
0
        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;
            }
        }