Is there any reason why some Stop-Losses {in a form of ExitLongStopMarket() / ExitShortStopMarket() } are not getting submitted, when using the Calculation.OnBarClose?
Example of a Stop-Loss for a BUY order:
private int Quant = 5; private Order [B]BUY_entryOrder [/B]= null; private int [B]BUY_sumFilled [/B]= 0; private Order [B]BUY_stopOrder [/B]= null; protected override void [B]OnStateChange[/B]() {[INDENT]if (State == State.SetDefaults) {[/INDENT][INDENT=2]... Calculate = Calculate.[B]OnBarClose[/B]; ...[/INDENT][INDENT]} else if (State == State.Configure) {[/INDENT][INDENT=2]AddDataSeries(i.FullName,BarsPeriodType.Minute, 15); [/INDENT][INDENT]} else if (State == State.Realtime) {[/INDENT][INDENT=2]// one time only, as we transition from historical // convert any old historical order object references // to the new live order submitted to the real-time account if (BUY_entryOrder != null) BUY_entryOrder = GetRealtimeOrder(BUY_entryOrder); if (BUY_stopOrder != null) BUY_stopOrder = GetRealtimeOrder(BUY_stopOrder);[/INDENT][INDENT]}[/INDENT] } protected override void [B]OnBarUpdate[/B]() {[INDENT]if (CurrentBars[1] > 50) return; if(BarsInProgress == 1){[/INDENT][INDENT=2] if( [I]LONG Conditions[/I] ) {[/INDENT][INDENT=3][B]EnterLong([/B]1, Quant, @"[B]Buy[/B]"[B]);[/B] BUY_SL_Price = [I]SomePriceValue;[/I][/INDENT][INDENT=2]} if( [I]TP Conditions[/I] ){[/INDENT][INDENT=3][B]ExitLong([/B]1, Quant, "[B]TP for Buy[/B]", "[B]Buy[/B]"[B]);[/B][/INDENT][INDENT=2]}[/INDENT][INDENT]}[/INDENT] } protected override void [B]OnOrderUpdate[/B](){[INDENT] [B]//Detecting the Buy order.[/B] if(order.Name == "[B]Buy[/B]" && orderState==OrderState.Filled){[/INDENT][INDENT=2]BUY_entryOrder = order; [B]// Reset the entryOrder object to null if order was cancelled without any fill[/B] if (order.OrderState == OrderState.Cancelled && order.Filled == 0) {[/INDENT][INDENT=3]BUY_entryOrder = null; BUY_sumFilled = 0;[/INDENT][INDENT=2]}[/INDENT][INDENT]}[/INDENT] } protected override void [B]OnExecutionUpdate[/B](){[INDENT]if (BUY_entryOrder != null && BUY_entryOrder == execution.Order) {[/INDENT][INDENT=2]if (execution.Order.OrderState == OrderState.Filled || execution.Order.OrderState == OrderState.PartFilled || (execution.Order.OrderState == OrderState.Cancelled && execution.Order.Filled > 0)) {[/INDENT][INDENT=3][B]// We sum the quantities of each execution making up the entry order[/B] BUY_sumFilled += execution.Quantity; [B]// Submit exit orders for partial fills[/B] if (execution.Order.OrderState == OrderState.PartFilled) {[/INDENT][INDENT=4]BUY_stopOrder = [B]ExitLongStopMarket[/B](1, true, execution.Order.Filled, BUY_SL_Price, "[B]SL_BUY[/B]", "[B]Buy[/B]");[/INDENT][INDENT=3]} [/INDENT][INDENT=3][B]// Update our exit order quantities once orderstate turns to filled and we have seen execution quantities match order quantities[/B] else if (execution.Order.OrderState == OrderState.Filled && BUY_sumFilled == execution.Order.Filled) {[/INDENT][INDENT=4][B]// Stop-Loss order for OrderState.Filled[/B] BUY_stopOrder = [B]ExitLongStopMarket[/B](1, true, execution.Order.Filled, BUY_SL_Price, "[B]SL_BUY[/B]", "[B]Buy[/B]");[/INDENT][INDENT=3]} [/INDENT][INDENT=3][B]// Resets the entryOrder object and the sumFilled counter to null / 0 after the order has been filled[/B] if (execution.Order.OrderState != OrderState.PartFilled && BUY_sumFilled == execution.Order.Filled) {[/INDENT][INDENT=4]BUY_entryOrder = null; BUY_sumFilled = 0;[/INDENT][INDENT=3]}[/INDENT][INDENT=2]}[/INDENT][INDENT]} [B]// Reset our stop order and target orders' Order objects after our position is closed. (1st Entry)[/B] if (BUY_stopOrder != null && BUY_stopOrder == execution.Order) {[/INDENT][INDENT=2]if (execution.Order.OrderState == OrderState.Filled || execution.Order.OrderState == OrderState.PartFilled) {[/INDENT][INDENT=3]BUY_stopOrder = null;[/INDENT][INDENT=2]}[/INDENT][INDENT]}[/INDENT] }
Comment