protected StrategyTransaction CreateFillTransaction(Transaction t) { StrategyTransaction strategyTransaction = CreateStrategyTransaction(t.instrument, t.side, t.time, t.type, t.price, t.takeProfitPrice, t.stopLossPrice, t.id.ToString(), t.orderId.ToString(), null); IOrder tradeOrder = Orders.FirstOrDefault(o => o.id == t.orderId); if (tradeOrder != null) { ((MarketMinerOrder)tradeOrder).Filled = true; MarketMinerTrade tradeOpened = new MarketMinerTrade(t.tradeOpened); tradeOpened.SignalID = ((MarketMinerOrder)tradeOrder).SignalID; tradeOpened.StrategyTransactionID = strategyTransaction.StrategyTransactionID; AddOrUpdateAlgorithmTrade(tradeOpened); } return(strategyTransaction); }
protected async Task <bool> UpdateOrdersAndTrades() { AddAlgorithmMessage("Updating instance orders and trades ...", false, TraceEventType.Information); short orderCount = 0; short tradeCount = 0; MCE.Signal[] signals = await SubscriptionCaller.Instance().GetActiveSignalsByTypeAsync(MACC.Constants.SignalType.Thrust); foreach (MCE.Signal signal in signals) { if (signal.StrategyTransactionID.HasValue) { IEnumerable <StrategyTransaction> transactions; StrategyTransaction orderTransaction, tradeTransaction, exitTransaction; // get transaction collection from db int orderTransactionID = signal.StrategyTransactionID.Value; transactions = StrategyCaller.Instance().GetStrategyTransactionsCollectionAsync(orderTransactionID).Result; transactions = transactions.Where(t => t.StrategyID == _strategy.StrategyID); transactions = transactions.OrderBy(t => t.BrokerTransactionID); orderTransaction = transactions.FirstOrDefault(t => t.StrategyTransactionID == orderTransactionID); tradeTransaction = transactions.FirstOrDefault(t => t.Type == MACC.Constants.TransactionTypes.OrderFilled); exitTransaction = transactions.FirstOrDefault(t => t.BrokerTradeID != null && t.Type != MACC.Constants.TransactionTypes.TradeUpdate); if (exitTransaction != null) { signal.Active = false; SubscriptionCaller.Instance().UpdateSignalAsync(signal); continue; } if (tradeTransaction != null) { tradeCount++; long tradeId = Convert.ToInt64(tradeTransaction.BrokerTransactionID); TradeData oandaTrade = await Rest.GetTradeDetailsAsync(_accountId, tradeId); MarketMinerTrade mmTrade = new MarketMinerTrade(oandaTrade) { SignalID = signal.SignalID, StrategyTransactionID = signal.StrategyTransactionID, Closed = exitTransaction != null }; AddOrUpdateAlgorithmTrade(mmTrade); continue; } if (orderTransaction != null) { orderCount++; long orderId = Convert.ToInt64(orderTransaction.BrokerTransactionID); Order oandaOrder = await Rest.GetOrderDetailsAsync(_accountId, orderId); MarketMinerOrder mmOrder = new MarketMinerOrder(oandaOrder) { SignalID = signal.SignalID, StrategyTransactionID = signal.StrategyTransactionID, Filled = tradeTransaction != null, Cancelled = tradeTransaction != null }; AddOrUpdateAlgorithmOrder(mmOrder); } } } AddAlgorithmMessage(string.Format("{0} open orders updated.", orderCount), false, TraceEventType.Information); AddAlgorithmMessage(string.Format("{0} open trades updated.", tradeCount), false, TraceEventType.Information); return(true); }