public bool HasMarketDetails(string broker, string market) { lock (_marketDetailsList) { return(_marketDetailsList.ContainsKey(MarketDetails.GetKey(broker, market))); } }
public StrategyRunner(IBrokersCandlesService candleService, IMarketDetailsService marketDetailsService, IBroker broker, MarketDetails market) { _candleService = candleService; _marketDetailsService = marketDetailsService; _broker = broker; _market = market; }
public void AddMarketDetails(MarketDetails marketDetails) { lock (_marketDetailsList) { _marketDetailsList[MarketDetails.GetKey(marketDetails.Broker, marketDetails.Name)] = marketDetails; } }
public MarketDetails GetMarketDetails(string broker, string market) { lock (_marketDetailsList) { _marketDetailsList.TryGetValue(MarketDetails.GetKey(broker, market), out var ret); return(ret); } }
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); }
public List <Trade> CreateNewTrades( MarketDetails market, TimeframeLookup <List <CandleAndIndicators> > candlesLookup, List <Trade> existingTrades, ITradeDetailsAutoCalculatorService calculatorService, DateTime currentTime) { if (candlesLookup[Timeframe.M1].Count == 0) { return(null); } var candle = candlesLookup[Timeframe.M1][candlesLookup[Timeframe.M1].Count - 1]; ProcessExistingTrades(existingTrades, currentTime, candle, candlesLookup); List <Trade> ret = null; for (var i = _trades.Count - 1; i >= 0; i--) { var t = _trades[i]; if (t.OriginalTrade.OrderPrices.Count > 0 && t.OriginalTrade.OrderPrices[0].Date <= currentTime || t.OriginalTrade.EntryDateTime <= currentTime) { if (ret == null) { ret = new List <Trade>(); } ret.Add(t); _trades.RemoveAt(i); } } if (ret != null) { ProcessExistingTrades(ret, currentTime, candle, candlesLookup); } return(ret); }
private void LoadMarketDetailsList() { using (new LogRunTime("Load market details list")) { lock (_marketDetailsList) { var marketDetailsListPath = Path.Combine(_dataDirectoryService.MainDirectory, "MarketDetails.json"); if (File.Exists(marketDetailsListPath)) { var data = JsonConvert.DeserializeObject <List <MarketDetails> >( File.ReadAllText(marketDetailsListPath)); _marketDetailsList.Clear(); foreach (var d in data) { _marketDetailsList[MarketDetails.GetKey(d.Broker, d.Name)] = d; } } } } }
public static decimal GetPriceInPips(decimal price, MarketDetails market) { return(price / market.PointSize.Value); }