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