public InstructionExecutionContext(InvestorInstruction investorInstruction)
 {
     this.investorInstruction = investorInstruction;
     this.initialQuantity = investorInstruction.Quantity;
     this.Quantity = investorInstruction.Quantity;
     this.Price = investorInstruction.Price;
     this.Way = investorInstruction.Way;
     this.AllowPartialExecution = investorInstruction.AllowPartialExecution;
 }
        //// TODO: remove investor instruction as arg here?
        private void RouteImpl(InvestorInstruction investorInstruction, InstructionExecutionContext instructionExecutionContext)
        {
            var solver = new MarketSweepSolver(this.marketSnapshotProvider);

            var orderBasket = solver.Solve(instructionExecutionContext);
            
            EventHandler<DealExecutedEventArgs> handler = (executedOrder, args) => instructionExecutionContext.Executed(args.Quantity);
            EventHandler<OrderFailedEventArgs> failHandler = (s, failure) => this.SendOrderFailed(investorInstruction, failure, instructionExecutionContext);

            investorInstruction.Executed += (sender, e) => this.investorInstruction_Executed(sender, e);

            orderBasket.OrderExecuted += handler;
            orderBasket.OrderFailed += failHandler;

            orderBasket.Send();

            orderBasket.OrderExecuted -= handler;
            orderBasket.OrderFailed -= failHandler;
        }
        private void SendOrderFailed(InvestorInstruction investorInstruction, OrderFailedEventArgs reason, InstructionExecutionContext instructionExecutionContext)
        {
            this.marketSnapshotProvider.MarketFailed(reason.Market);

            if (investorInstruction.GoodTill != null && 
                investorInstruction.GoodTill > DateTime.Now && 
                instructionExecutionContext.Quantity > 0)
            {
                // retries
                this.RouteImpl(investorInstruction, instructionExecutionContext);
            }
            else
            {
                Action<string> failureCallback;
                if (this.failureCallbacks.TryGetValue(investorInstruction.IdentifierDto, out failureCallback))
                {
                    failureCallback(reason.Reason);
                }
            }
        }