public static decimal GetGBPPerPip(
            this IBrokersCandlesService candleService,
            IMarketDetailsService marketsService,
            IBroker broker, string market, decimal lotSize,
            DateTime date, bool updateCandles)
        {
            var     marketDetails = marketsService.GetMarketDetails(broker.Name, market);
            decimal price         = 0M;

            // If market contains GBP, then use the market for the price
            if (market.Contains("GBP"))
            {
                price = (decimal)candleService.GetLastClosedCandle(market, broker, Timeframe.D1, date, updateCandles).Value.OpenBid;

                if (market.StartsWith("GBP"))
                {
                    price = 1M / price;
                }
            }
            else
            {
                // Try to get GBP candle, if it exists
                var marketForPrice = !market.Contains("/") ? $"GBP/{marketDetails.Currency}" : $"GBP/{market.Split('/')[1]}";

                if (!marketsService.HasMarketDetails(broker.Name, marketForPrice))
                {
                    marketForPrice = $"{marketForPrice.Split('/')[1]}/{marketForPrice.Split('/')[0]}";
                }

                if (marketForPrice == "GBP/GBP")
                {
                    price = 1M;
                }
                else
                {
                    // Get candle price, if it exists
                    if (marketsService.HasMarketDetails(broker.Name, marketForPrice))
                    {
                        price = (decimal)candleService.GetLastClosedCandle(marketForPrice, broker, Timeframe.D1, date, updateCandles).Value.OpenBid;
                    }
                    else
                    {
                        // Otherwise, try to get the USD candle and convert back to GBP
                        // Try to get $ candle and convert to £
                        var usdCandle    = candleService.GetLastClosedCandle($"USD/{market.Split('/')[1]}", broker, Timeframe.D1, date, updateCandles);
                        var gbpUSDCandle = candleService.GetLastClosedCandle("GBP/USD", broker, Timeframe.D1, date, updateCandles);
                        price = (decimal)gbpUSDCandle.Value.OpenBid / (decimal)usdCandle.Value.OpenBid;
                    }
                }

                if (marketForPrice.StartsWith("GBP"))
                {
                    price = 1M / price;
                }
            }

            return(lotSize * (decimal)marketDetails.ContractMultiplier * (decimal)marketDetails.PointSize * price);
        }
Пример #2
0
        public static decimal GetTradeProfit(this Trade trade, DateTime dateTimeUTC, Timeframe candlesTimeframe,
                                             IBrokersCandlesService candlesService, MarketDetails marketDetails, IBroker broker, bool updateCandles)
        {
            if (trade.EntryPrice == null || trade.EntryDateTime == null)
            {
                return(0M);
            }

            if (trade.CloseDateTime != null && trade.CloseDateTime.Value <= dateTimeUTC)
            {
                return(trade.Profit ?? 0M);
            }

            if (trade.EntryDateTime >= dateTimeUTC)
            {
                return(0M);
            }

            var latestCandle = candlesService.GetLastClosedCandle(
                trade.Market, broker, candlesTimeframe, dateTimeUTC, updateCandles);

            if (latestCandle != null && trade.PricePerPip != null)
            {
                var closePriceToUse = trade.TradeDirection == TradeDirection.Long
                    ? (decimal)latestCandle.Value.CloseBid
                    : (decimal)latestCandle.Value.CloseAsk;
                var profitPips       = PipsHelper.GetPriceInPips(trade.TradeDirection == TradeDirection.Long ? closePriceToUse - trade.EntryPrice.Value : trade.EntryPrice.Value - closePriceToUse, marketDetails);
                var totalRunningTime = (DateTime.UtcNow - trade.EntryDateTime.Value).TotalDays;
                var runningTime      = (trade.EntryDateTime.Value - dateTimeUTC).TotalDays;

                var tradeProfit = trade.PricePerPip.Value * profitPips +
                                  (!totalRunningTime.Equals(0.0) && trade.Rollover != null
                                      ? trade.Rollover.Value * (decimal)(runningTime / totalRunningTime)
                                      : 0M);

                return(tradeProfit);
            }

            return(0M);
        }
        private void UpdateChartData(List <Trade> trades)
        {
            var series = new XyDataSeries <DateTime, double>();

            Task.Run(() =>
            {
                var xvalues = new List <DateTime>();
                var yvalues = new List <double>();

                var startedTrades = trades.Where(t => t.EntryDateTime != null && !t.Ignore).ToList();

                if (startedTrades.Count > 0)
                {
                    var earliest = startedTrades.OrderBy(t => t.EntryDateTime).First().EntryDateTime.Value.Date;
                    var latest   = DateTime.UtcNow;
                    var broker   = _brokerService.GetBroker("FXCM");

                    for (var date = earliest; date <= latest; date = date.AddDays(1))
                    {
                        var balance       = 10000M;
                        var currentTrades = trades.Where(t => t.EntryDateTime <= date).ToList();
                        foreach (var t in currentTrades)
                        {
                            if (date >= t.CloseDateTime)
                            {
                                balance += (decimal)t.Profit.Value;
                            }
                            else
                            {
                                var risk   = t.RiskAmount.Value;
                                var candle =
                                    _brokersCandlesService.GetLastClosedCandle(t.Market, _brokerService.GetBroker(t.Broker), Timeframe.D1, date,
                                                                               false);
                                var price = (decimal)(t.TradeDirection == TradeDirection.Long
                                    ? candle.Value.CloseBid
                                    : candle.Value.CloseAsk);


                                /*var stopDist = t.InitialStop.Value - t.EntryPrice;
                                 * var profit = (((decimal)price - t.EntryPrice.Value) / stopDist) * risk;*/
                                var profit = price * t.EntryQuantity.Value - t.EntryPrice.Value * t.EntryQuantity.Value; //TODO Add commission
                                balance   += (decimal)profit;
                            }
                        }

                        xvalues.Add(date);
                        yvalues.Add((double)balance);
                    }

                    series.Append(xvalues, yvalues);
                }

                _dispatcher.Invoke(() =>
                {
                    var renderableSeries = new FastLineRenderableSeries
                    {
                        DataSeries      = series,
                        StrokeThickness = 2
                    };

                    SeriesList.Add(renderableSeries);
                });
            });
        }