This might be one of this 'well, duh' questions, but I'll ask anyway.
I tried out a new strategy yesterday with NT using IB as my broker. When running the strategy in Market Replay on a previously recorded day, the strategy executes and sends orders without a problem. However, when I try to use this same strategy with my IB paper account, it sends orders... lots of them, whenever a buy or sell short trigger is hit.
In fact, it sends so many orders in a sort of weird, recursive loop that the exchange starts to cancel orders because it can't find enough securities (to short for instance). My strategy then disables shortly there after.
Here's a printout of the log I'm looking at:
--------------------------------------
8/8/2012 8:52:04 AM Entered internal SubmitOrder() method at 8/8/2012 8:52:04 AM: Action=SellShort OrderType=Market Quantity=300 LimitPrice=0 StopPrice=0 OcoId='' Name='trendingShort'
----------------
SHORT START: Flat Market Order
----------------
stopPrice begins at (53.82)
stopPriceBar (diamond) was placed on bar #1.
----------------
8/8/2012 8:52:05 AM Entered internal SubmitOrder() method at 8/8/2012 8:52:05 AM: Action=SellShort OrderType=Market Quantity=300 LimitPrice=0 StopPrice=0 OcoId='' Name='trendingShort'
----------------
SHORT START: Flat Market Order
----------------
stopPrice begins at (53.82)
stopPriceBar (diamond) was placed on bar #1.
----------------
8/8/2012 8:52:05 AM Entered internal SubmitOrder() method at 8/8/2012 8:52:05 AM: Action=SellShort OrderType=Market Quantity=300 LimitPrice=0 StopPrice=0 OcoId='' Name='trendingShort'
----------------
SHORT START: Flat Market Order
----------------
stopPrice begins at (53.82)
stopPriceBar (diamond) was placed on bar #1.
----------------
8/8/2012 8:52:05 AM Entered internal SubmitOrder() method at 8/8/2012 8:52:05 AM: Action=SellShort OrderType=Market Quantity=300 LimitPrice=0 StopPrice=0 OcoId='' Name='trendingShort'
----------------
and it just keeps going like this. It looks like it's sending an order on every tick.
Here's the related code:
// Order relate code shortOrder = SubmitOrder(0, OrderAction.SellShort, OrderType.Market, numberofShares, 0, 0, "", "trendingShort"); shortOrder_start = true; /* Short Orders */ protected override void OnExecution(IExecution execution) { if (shortOrder == execution.Order && shortOrder.OrderState == OrderState.Filled) { // Starts if (shortOrder_start == true) { Print("Part 1 Hit"); DrawHorizontalLine("shortOrder", false, shortOrder.AvgFillPrice, Color.OrangeRed, DashStyle.Solid, 2); breakEvenPrice = shortOrder.AvgFillPrice - breakEvenAmount; shortOrder_start = false; } // Reversals else if (shortOrder_reversal == true && breakEvenAchieved == true) { Print("Part 2 Hit"); longOrder = SubmitOrder(0, OrderAction.Buy, OrderType.Market, numberofShares, 0, 0, "", "trendingLong"); } else if (longOrder_reversal == true && breakEvenAchieved == false) { Print("Part 3 Hit"); RemoveDrawObject("shortOrder"); shortOrder_reversal = false; breakEvenAchieved = false; } else if (longOrder_reversal == true) { Print("Part 4 Hit"); longOrder_reversal = false; breakEvenPrice = shortOrder.AvgFillPrice - breakEvenAmount; breakEvenAchieved = false; DrawHorizontalLine("shortOrder", false, shortOrder.AvgFillPrice, Color.OrangeRed, DashStyle.Solid, 2); RemoveDrawObject("longOrder"); } // Closing else if (shortOrder_close == true) { Print("Part 5 Hit"); shortOrder_close = false; // If a breakEven wasn't hit, install a 10 minute penalty. if (breakEvenAchieved == false) { breakEven_penaltyTime = 10; } else { breakEvenAchieved = false; } } } } protected override void OnOrderUpdate(IOrder order) { // When we determine to stop our strategy all logic in the OnOrderUpdate() method will cease. if (haltProcessing == true) return; /* Handle our entry order here. If our entry order is cancelled or rejected we want to reset either longOrder or shortOrder so we can enter the next time our entry signal appears. */ if (longOrder != null && longOrder == order) { if (longOrder.OrderState == OrderState.Cancelled || longOrder.OrderState == OrderState.Rejected) { longOrder = null; } // For long orders trying to close. Resubmit if cancelled or rejected. else if (longOrder.OrderId == "closingLong" && longOrder.OrderState == OrderState.Cancelled || longOrder.OrderId == "closingLong" && longOrder.OrderState == OrderState.Rejected) { longOrder = SubmitOrder(0, OrderAction.Sell, OrderType.Market, numberofShares, 0, 0, "", "closingLong"); } } else if (shortOrder != null && shortOrder == order) { if (shortOrder.OrderState == OrderState.Cancelled || shortOrder.OrderState == OrderState.Rejected) { shortOrder = null; } // For short orders trying to close. Resubmit if cancelled or rejected. else if (shortOrder.OrderId == "closingShort" && shortOrder.OrderState == OrderState.Cancelled || shortOrder.OrderId == "closingShort" && shortOrder.OrderState == OrderState.Rejected) { shortOrder = SubmitOrder(0, OrderAction.BuyToCover, OrderType.Market, numberofShares, 0, 0, "", "closingShort"); } } }
Yours,
Spider
PS - Working in an unmanaged environment, with data feed confirmed to IB. Can manually close and open orders without any problems.
Comment