public void AddTrades(IEnumerable <TradeViewModel> trades) { var tempTrades = Trades.ToList(); foreach (var trade in trades) { var existingTrade = tempTrades.Where(t => t.Symbol == trade.Symbol && t.Time == trade.Time).FirstOrDefault(); if (existingTrade == null) { tempTrades.Add(trade); } else { tempTrades.ReplaceInPlace(existingTrade, trade); } } Trades = new ObservableCollection <TradeViewModel>(tempTrades.OrderByDescending(trade => trade.Time)); CalculateGainsPercentage(); }
public MainWindowViewModel( Func <string> getTradeCommentsFunc, Action <string> showMessageAction, Action <Cursor> setCursorAction, Func <IDisposable> suspendChartUpdatesAction, Action updateWindowAction) { DependencyContainer.ComposeParts(this); _directory = _dataDirectoryService.MainDirectoryWithApplicationName; if (!Directory.Exists(_directory)) { Directory.CreateDirectory(_directory); } _candlesService = new CandlesService(); /* // Create candles * Task.Run(() => * { * Log.Info("Creating candles"); * _candlesService.ConvertCandles(_brokerCandlesService, _fxcm, _marketsService.GetAllMarketDetails().Select(m => m.Name).ToList()); * Log.Info("Candles created"); * }); * return;*/ TimeFrameItems = new List <Timeframe> { Timeframe.D1, Timeframe.H4, Timeframe.H2, Timeframe.H1, Timeframe.M1 }; LargeChartTimeframeOptions.Clear(); LargeChartTimeframeOptions.Add(Timeframe.H4); LargeChartTimeframeOptions.Add(Timeframe.H2); // Setup available indicators AddAvailableIndicator(new ExponentialMovingAverage(8), Colors.DarkBlue, false, true); AddAvailableIndicator(new ExponentialMovingAverage(20), Colors.Blue, false, false); AddAvailableIndicator(new ExponentialMovingAverage(25), Colors.Blue, false, true); AddAvailableIndicator(new ExponentialMovingAverage(50), Colors.LightBlue, false, true); AddAvailableIndicator(new SimpleMovingAverage(50), Colors.Green, false, false); AddAvailableIndicator(new SimpleMovingAverage(200), Colors.LightGreen, false, false); AddAvailableIndicator(new AverageTrueRange(), Colors.Red, true, false); AddAvailableIndicator(new CommodityChannelIndex(), Colors.Red, true, false); AddAvailableIndicator(new T3CommodityChannelIndex(), Colors.Red, true, false); NewChartCommand = new DelegateCommand(o => NewChartMarket(), o => !Running); NextCandleCommand = new DelegateCommand(o => ProgressTime()); ClearTradesCommand = new DelegateCommand(o => ClearTrades()); CloseTradeCommand = new DelegateCommand(o => CloseTrade()); DeleteTradeCommand = new DelegateCommand(o => DeleteTrade()); StartLongTradeCommand = new DelegateCommand(o => StartTrade(TradeDirection.Long)); StartShortTradeCommand = new DelegateCommand(o => StartTrade(TradeDirection.Short)); _getTradeCommentsFunc = getTradeCommentsFunc; _showMessageAction = showMessageAction; _setCursorAction = setCursorAction; _suspendChartUpdatesAction = suspendChartUpdatesAction; _updateWindowAction = updateWindowAction; DependencyContainer.ComposeParts(this); _dispatcher = Dispatcher.CurrentDispatcher; _chartModeDisposable = ChartingService.ChartModeObservable.Subscribe(ChartModeChanged); TradeListDisplayOptions = TradeListDisplayOptionsFlag.ClosePrice | TradeListDisplayOptionsFlag.Comments | TradeListDisplayOptionsFlag.OrderPrice | TradeListDisplayOptionsFlag.Limit | TradeListDisplayOptionsFlag.OrderDate | TradeListDisplayOptionsFlag.ResultR | TradeListDisplayOptionsFlag.Status | TradeListDisplayOptionsFlag.Stop | TradeListDisplayOptionsFlag.Strategies; _markets = new List <string>(); foreach (var m in _marketsService.GetAllMarketDetails().Select(m => m.Name)) { if (File.Exists(_candlesService.GetCandlesPath(m, Timeframe.M5)) && File.Exists(_candlesService.GetCandlesPath(m, Timeframe.H2)) && File.Exists(_candlesService.GetCandlesPath(m, Timeframe.H4)) && File.Exists(_candlesService.GetCandlesPath(m, Timeframe.D1))) { _markets.Add(m); } } IsTradeEnabled = false; var path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "TraderSimulator"); if (!Directory.Exists(path)) { Directory.CreateDirectory(path); } _orderExpiryCandlesIndex = 0; ResultsViewModel = new TradesResultsViewModel(() => Trades.ToList()) { ShowOptions = true, ShowSubOptions = false, AdvStrategyNaming = true }; ResultsViewModel.ResultOptions.Remove("Timeframe"); ResultsViewModel.ShowOptions = false; ResultsViewModel.ShowIncludeOpenClosedTradesOptions = false; LoadTrades(); RemoveIncompleteTrades(); NewChartMarket(); _chartClickedDisposable = ChartingService.ChartClickObservable.Subscribe(ChartClicked); }