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); }
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); }); }); }