Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Unprocessed Data #203

Open
electic opened this issue Feb 12, 2024 · 17 comments · Fixed by #216
Open

Unprocessed Data #203

electic opened this issue Feb 12, 2024 · 17 comments · Fixed by #216
Assignees

Comments

@electic
Copy link

electic commented Feb 12, 2024

Hi everyone,

Getting this error: Error: Decoding error on OPEN_ORDER: unprocessed data left on queue (["","","","",null]).

How can I debug this?

@BusinessDuck
Copy link
Contributor

Same for me.

Order in paper mode:

          orderType: ibOrderType.MKT,
          orderId: IBTransport.getReqId(),
          totalQuantity: pendingOrder.lots,
          action,
          tif: TimeInForce.IOC,
          transmit: true,

Fix via: #208

@rylorin
Copy link
Member

rylorin commented Mar 9, 2024

Hello,
Thanks for reporting.
Cloud you please provide some information about the order?
I was unable to reproduce this issue.
Ideally add a test case to ./src/test/unit/api/order to help improving the reliably of the API.
Thanks

@paaax
Copy link

paaax commented Apr 10, 2024

I am also getting the error on version 1.3.19 in the following code snippet:

createOrder(req: any) {
    const options = req.body.options;

    // Preparing the contract based on request options
    let contract: Contract;
    if (options.secId) {
      // If secType is FIGI, use this specific contract definition
      contract = {
        secIdType: "FIGI",
        secId: options.secId,
        exchange: options.exchange,
      };
    } else {
      // Default contract definition for other secTypes
      contract = {
        symbol: options.symbol,
        exchange: options.exchange,
        currency: options.currency,
        secType: this.getSecType(req),
      };
    }

    // Handling specific contract attributes based on secType
    if (contract.secType === "STK" && options.primaryExch) {
      contract.primaryExch = options.primaryExch;
    }

    // Futures
    if (contract.secType === "FUT" && options.lastTradeDateOrContractMonth) {
      contract.lastTradeDateOrContractMonth =
        options.lastTradeDateOrContractMonth;
    }
    if (contract.secType === "FUT" && options.localSymbol) {
      contract.localSymbol = options.localSymbol;
    }
    if (contract.secType === "FUT" && options.multiplier) {
      contract.multiplier = options.multiplier;
    }

    // Single order
    const singleOrder: Order = {
      orderId: this.nextOrderId++,
      action:
        options.orderAction === "BUY" ? OrderAction.BUY : OrderAction.SELL,
      orderType: this.getOrderType(req),
      totalQuantity: options.quantity,
      lmtPrice: options.orderType === "LMT" ? options.lmtPrice : undefined,
      auxPrice: options.orderType.startsWith("STP")
        ? options.auxPrice
        : undefined,
      account: this.account,
      transmit: true,
      tif: options.tif,
    };

    // Placing the single order
    this.ib.placeOrder(singleOrder.orderId!, contract, singleOrder);
    winston.log("info", `Order placed with ID: ${singleOrder.orderId}`);
  }

When sending this:

{
  "bracketOrder": false,
  "options": {
      "orderAction": "BUY",
      "symbol": "SPY",
      "exchange": "SMART",
      "lmtPrice": 1,
      "takeProfitLimitPrice": 1.2,
      "stopLossPrice": 0.9,
      "currency": "USD",
      "quantity": 1.0,
      "secType": "STK",
      "tif": "GTC",
      "orderType": "LMT"
  }
}

@rylorin
Copy link
Member

rylorin commented Apr 11, 2024

Thanks.
Could you please provide the values of singleOrder and contract when calling this.ib.placeOrder(singleOrder.orderId!, contract, singleOrder);?
Don't forget to hide you account number.

@paaax
Copy link

paaax commented Apr 13, 2024

Thank you for answering. It looks like the order id is set correctly and increases with incoming signals. The order is also being placed in TWS, but the error remains.

Here is my complete log (I changed the account number):

{"level":"info","message":"Listening to requests on 443"} {"level":"info","message":"Connecting to database..."} {"level":"info","message":"Connection to database established."} Broker connected Next valid order ID: 519 {"level":"info","message":"Signal received."} {"level":"info","message":"Placing order AAPL"} {"level":"info","message":"Contract Data: {\"symbol\":\"AAPL\",\"exchange\":\"SMART\",\"currency\":\"USD\",\"secType\":\"STK\"}"} {"level":"info","message":"Order Data: {\"orderId\":519,\"action\":\"BUY\",\"orderType\":\"LMT\",\"totalQuantity\":1,\"lmtPrice\":1,\"account\":\"DU1234567\",\"transmit\":true,\"tif\":\"GTC\"}"} {"level":"info","message":"singleOrder.orderId! 519"} {"level":"info","message":"Order placed with ID: 519"} {"level":"info","message":"::ffff:110.136.217.116 - - [13/Apr/2024:23:19:17 +0000] \"POST /webhooks/test HTTP/1.1\" 200 2 \"-\" \"Thunder Client (https://www.thunderclient.com)\"\n"} Error code 505 for reqId -1: Decoding error on OPEN_ORDER: unprocessed data left on queue (["","","","",null]). Please report to https://github.com/stoqey/ib {"level":"info","message":"Order 519 status: PreSubmitted"} Error code 505 for reqId -1: Decoding error on OPEN_ORDER: unprocessed data left on queue (["","","","",null]). Please report to https://github.com/stoqey/ib {"level":"info","message":"Order 519 status: PreSubmitted"}

And the complete implementation (I removed the createBracketOrder()-, getSecType()- and getOrderType()-functions for simplicity):

import * as dotenv from "dotenv";
dotenv.config({ path: __dirname + "/.env" });
import {
  IBApi,
  EventName,
  ErrorCode,
  Contract,
  SecType,
  Order,
  OrderType,
  OrderAction,
} from "@stoqey/ib";
import winston from "../config/winston";

class Broker {
  clientId: number;
  account: string;
  ib: IBApi;
  nextOrderId: number;

  constructor(_mode: string) {
    this.account =
      _mode === "LIVE"
        ? String(process.env.TWS_LIVE_ACCOUNT)
        : String(process.env.TWS_PAPER_ACCOUNT);
    this.clientId =
      _mode === "LIVE"
        ? Number(process.env.TWS_LIVE_CLIENT_ID)
        : Number(process.env.TWS_PAPER_CLIENT_ID);
    this.ib = new IBApi({
      port:
        _mode === "LIVE"
          ? Number(process.env.TWS_LIVE_PORT)
          : Number(process.env.TWS_PAPER_PORT),
    });
    this.connect();
    this.nextOrderId = 0;
    this.setupListeners();
  }

  connect() {
    this.ib
      .connect(this.clientId)
      .on(EventName.connected, () => console.log("Broker connected"));
  }

  disconnect() {
    this.ib.disconnect();
    console.log("Broker disconnected");
  }

  setupListeners() {
    this.ib
      .on(EventName.nextValidId, (orderId) => {
        this.nextOrderId = orderId;
        console.log(`Next valid order ID: ${orderId}`);
      })
      .on(EventName.error, (err: Error, code: ErrorCode, reqId: number) => {
        console.error(`Error code ${code} for reqId ${reqId}: ${err.message}`);
      })
      .on(EventName.orderStatus, (orderId: number, status: string) => {
        winston.log("info", `Order ${orderId} status: ${status}`);
        if (status === "Submitted" || status === "Filled") {
          console.log(`Order ${orderId} processed with status: ${status}`);
        }
      });
  }

  createOrder(req: any) {
    const options = req.body.options;

    // Preparing the contract based on request options
    let contract: Contract;
    if (options.secId) {
      contract = {
        secIdType: "FIGI",
        secId: options.secId,
        exchange: options.exchange,
      };
    } else {
      // Default contract definition for other secTypes
      contract = {
        symbol: options.symbol,
        exchange: options.exchange,
        currency: options.currency,
        secType: this.getSecType(req),
      };
    }

    // Handling specific contract attributes based on secType
    if (contract.secType === "STK" && options.primaryExch) {
      contract.primaryExch = options.primaryExch;
    }

    // Futures
    if (contract.secType === "FUT" && options.lastTradeDateOrContractMonth) {
      contract.lastTradeDateOrContractMonth =
        options.lastTradeDateOrContractMonth;
    }
    if (contract.secType === "FUT" && options.localSymbol) {
      contract.localSymbol = options.localSymbol;
    }
    if (contract.secType === "FUT" && options.multiplier) {
      contract.multiplier = options.multiplier;
    }

    // Single order
    const singleOrder: Order = {
      orderId: Number(this.nextOrderId++),
      action:
        options.orderAction === "BUY" ? OrderAction.BUY : OrderAction.SELL,
      orderType: this.getOrderType(req),
      totalQuantity: Number(options.quantity),
      lmtPrice: options.orderType === "LMT" ? Number(options.lmtPrice) : undefined,
      auxPrice: options.orderType.startsWith("STP")
        ? options.auxPrice
        : undefined,
      account: this.account,
      transmit: true,
      tif: options.tif,
    };
    winston.log('info', 'Contract Data: '+JSON.stringify(contract))
    winston.log('info', 'Order Data: '+JSON.stringify(singleOrder))

    // Placing the single order
    winston.log('info', 'singleOrder.orderId! ' +singleOrder.orderId!)
    this.ib.placeOrder(singleOrder.orderId!, contract, singleOrder);
    winston.log("info", `Order placed with ID: ${singleOrder.orderId}`);
  }

}

module.exports = Broker;

@rylorin
Copy link
Member

rylorin commented Apr 19, 2024

Hello,
I can't reproduce your issue with v1.3.19:

info Contract Data: {"symbol":"SPY","exchange":"SMART","currency":"USD","secType":"STK"}
info Order Data: {"orderId":0,"action":"BUY","orderType":"LMT","totalQuantity":1,"lmtPrice":1,"account":"undefined","transmit":true,"tif":"GTC"}
info singleOrder.orderId! 0
info Order placed with ID: 0
info Contract Data: {"symbol":"SPY","exchange":"SMART","currency":"USD","secType":"STK"}
info Order Data: {"orderId":1,"action":"BUY","orderType":"LMT","totalQuantity":1,"lmtPrice":1,"account":"undefined","transmit":true,"tif":"GTC"}
info singleOrder.orderId! 1
info Order placed with ID: 1
Broker connected
Next valid order ID: 2
Error code 10149 for reqId 0: Invalid order id: 0
info Order 1 status: PreSubmitted

I called createOrder twice because the first one failed because of a zero order Id but not decoding error.

@johnpantini
Copy link

The error started appearing again (for any orders) after the recent TWS update.

@rylorin
Copy link
Member

rylorin commented Jun 12, 2024

Could you please confirm which release you are using?

@johnpantini
Copy link

johnpantini commented Jun 12, 2024

Module version: "1.3.21"

TWS 1.30.0.16

@rylorin
Copy link
Member

rylorin commented Jun 12, 2024

What is TWS 1.30.0.16? I have TWS 10.19.2n, dated May 22 2024.
Can you provide a link to the location where you found it?

@johnpantini
Copy link

johnpantini commented Jun 12, 2024

What is TWS 1.30.0.16? I have TWS 10.19.2n, dated May 22 2024. Can you provide a link to the location where you found it?

My bad, TWS 10.30.1a Jun 10, 2024
https://www.interactivebrokers.com/en/trading/tws.php
TWS Beta

@rylorin rylorin self-assigned this Jun 13, 2024
@rylorin rylorin linked a pull request Jun 13, 2024 that will close this issue
rylorin added a commit that referenced this issue Jun 13, 2024
Issue Unprocessed Data #203 bug fix (server version >= 177)
@johnpantini
Copy link

The issue is still here :(

@rylorin rylorin reopened this Jun 13, 2024
@mafianekcek
Copy link
Contributor

mafianekcek commented Jun 14, 2024

Hello, I have a similar problem since today after I reinstalled my PC and had to do use npm install again

I am using TWS build 10.29.1h, Jun 5, 2024 10:53:32 PM

here is the program output with order and other details aswell:

14/06/2024 18:49:31.197	[LOG]IB API connected (demo)
14/06/2024 18:49:31.198	[DEBUG]nextValidId: 20 
14/06/2024 18:49:31.214	[LOG][IBAPI]id: -1 / code: 2104 / Market data farm connection is OK:usfarm.nj
14/06/2024 18:49:31.215	[LOG][IBAPI]id: -1 / code: 2104 / Market data farm connection is OK:usfuture
14/06/2024 18:49:31.215	[LOG][IBAPI]id: -1 / code: 2104 / Market data farm connection is OK:usfarm
14/06/2024 18:49:31.215	[LOG][IBAPI]id: -1 / code: 2106 / HMDS data farm connection is OK:ushmds
14/06/2024 18:49:31.216	[LOG][IBAPI]id: -1 / code: 2158 / Sec-def data farm connection is OK:secdefil
14/06/2024 18:49:47.111	[DEBUG][Order 8(20)]prepareOrder: order({"side":"LONG","orderFlag":null,"secType":"FOP","symbol":"MES","tradingClass":"X3B","expiration":"20240618","action":"BUY","count":1,"strike":"5425","right":"PUT","orderType":"LMT","outsideRTH":1,"tif":"DAY","conId":"708847529","underConId":"620731036","parentSymbol":"ES","parentConId":703139398,"parentUnderConId":551601561,"exchange":"CME","multiplier":5,"currency":"USD","id":8,"insertId":8,"tradeId":3,"date":1718383787011,"comboId":null,"isNew":true,"contract":{"conId":"708847529","exchange":"CME"},"account":"DU5784856","ibApiOrderId":20,"midAdjustTick":0,"failCount":0,"firstSubmitTime":1718383787109,"lastMidUpdate":1718383787109,"lastSubmitAttemp":1718383787109,"canTransmit":false}), placeOrderType({"action":"BUY","lmtPrice":0,"totalQuantity":1,"transmit":false,"orderType":"LMT","account":"DU5784856","tif":"DAY","orderRef":"RS/3/8"})
14/06/2024 18:49:47.113	[DEBUG][Order 9(21)]prepareOrder: order({"side":"LONG","orderFlag":null,"secType":"FOP","symbol":"MES","tradingClass":"X3B","expiration":"20240618","action":"SELL","count":1,"strike":"5425","right":"CALL","orderType":"LMT","outsideRTH":1,"tif":"DAY","conId":"708846212","underConId":"620731036","parentSymbol":"ES","parentConId":703138996,"parentUnderConId":551601561,"exchange":"CME","multiplier":5,"currency":"USD","id":9,"insertId":9,"tradeId":3,"date":1718383787011,"comboId":null,"isNew":true,"contract":{"conId":"708846212","exchange":"CME"},"account":"DU5784856","ibApiOrderId":21,"midAdjustTick":0,"failCount":0,"firstSubmitTime":1718383787112,"lastMidUpdate":1718383787112,"lastSubmitAttemp":1718383787112,"canTransmit":false}), placeOrderType({"action":"SELL","lmtPrice":0,"totalQuantity":1,"transmit":false,"orderType":"LMT","account":"DU5784856","tif":"DAY","orderRef":"RS/3/9"})
14/06/2024 18:49:48.376	[DEBUG][Order 8(20)]processOrderQueue: order({"side":"LONG","orderFlag":null,"secType":"FOP","symbol":"MES","tradingClass":"X3B","expiration":"20240618","action":"BUY","count":1,"strike":"5425","right":"PUT","orderType":"LMT","outsideRTH":1,"tif":"DAY","conId":"708847529","underConId":"620731036","parentSymbol":"ES","parentConId":703139398,"parentUnderConId":551601561,"exchange":"CME","multiplier":5,"currency":"USD","id":8,"insertId":8,"tradeId":3,"date":1718383787011,"comboId":null,"isNew":true,"contract":{"conId":"708847529","exchange":"CME"},"account":"DU5784856","ibApiOrderId":20,"midAdjustTick":0,"failCount":0,"firstSubmitTime":1718383787172,"lastMidUpdate":1718383788277,"lastSubmitAttemp":1718383788376,"canTransmit":true,"parentBid":17.5,"parentAsk":18,"mid":17.75,"bid":17.5,"ask":18,"forceUpadte":false,"lastMid":17.75}), LMTOrder({"action":"BUY","lmtPrice":17.75,"totalQuantity":1,"transmit":true,"orderType":"LMT","account":"DU5784856","tif":"DAY","orderRef":"RS/3/8"})
14/06/2024 18:49:48.377	[DEBUG][Order 9(21)]processOrderQueue: order({"side":"LONG","orderFlag":null,"secType":"FOP","symbol":"MES","tradingClass":"X3B","expiration":"20240618","action":"SELL","count":1,"strike":"5425","right":"CALL","orderType":"LMT","outsideRTH":1,"tif":"DAY","conId":"708846212","underConId":"620731036","parentSymbol":"ES","parentConId":703138996,"parentUnderConId":551601561,"exchange":"CME","multiplier":5,"currency":"USD","id":9,"insertId":9,"tradeId":3,"date":1718383787011,"comboId":null,"isNew":true,"contract":{"conId":"708846212","exchange":"CME"},"account":"DU5784856","ibApiOrderId":21,"midAdjustTick":0,"failCount":0,"firstSubmitTime":1718383787172,"lastMidUpdate":1718383788277,"lastSubmitAttemp":1718383788376,"canTransmit":true,"parentBid":18.75,"parentAsk":19.25,"mid":19,"bid":18.75,"ask":19.5,"forceUpadte":false,"lastMid":19}), LMTOrder({"action":"SELL","lmtPrice":19,"totalQuantity":1,"transmit":true,"orderType":"LMT","account":"DU5784856","tif":"DAY","orderRef":"RS/3/9"})
14/06/2024 18:49:48.579	[ERROR][IBAPI]id: -1 / code: 505 / Decoding error on OPEN_ORDER: unprocessed data left on queue (["","","","",null]). Please report to https://github.com/stoqey/ib
14/06/2024 18:49:48.580	[LOG][Order 8(20)]Submitted BUY 1x FOP MES LMT 20240618 5425 PUT
14/06/2024 18:49:48.687	[ERROR][IBAPI]id: -1 / code: 505 / Decoding error on OPEN_ORDER: unprocessed data left on queue (["","","","",null]). Please report to https://github.com/stoqey/ib
14/06/2024 18:49:48.688	[LOG][Order 9(21)]Submitted SELL 1x FOP MES LMT 20240618 5425 CALL
14/06/2024 18:49:55.222	[DEBUG][Order 8(20)]processOrderQueue: order({"side":"LONG","orderFlag":null,"secType":"FOP","symbol":"MES","tradingClass":"X3B","expiration":"20240618","action":"BUY","count":1,"strike":"5425","right":"PUT","orderType":"LMT","outsideRTH":1,"tif":"DAY","conId":"708847529","underConId":"620731036","parentSymbol":"ES","parentConId":703139398,"parentUnderConId":551601561,"exchange":"CME","multiplier":5,"currency":"USD","id":8,"insertId":8,"tradeId":3,"date":1718383787011,"comboId":null,"isNew":true,"contract":{"conId":"708847529","exchange":"CME"},"account":"DU5784856","ibApiOrderId":20,"midAdjustTick":0,"failCount":0,"firstSubmitTime":1718383787172,"lastMidUpdate":1718383795017,"lastSubmitAttemp":1718383795221,"canTransmit":true,"parentBid":17.25,"parentAsk":17.75,"mid":18,"bid":17.75,"ask":18,"forceUpadte":false,"lastMid":18,"lmtPrice":17.75,"auxPrice":0,"submitted":1718383788580,"permId":2096909561,"status":"SUBMITTED"}), LMTOrder({"action":"BUY","lmtPrice":18,"totalQuantity":1,"transmit":true,"orderType":"LMT","account":"DU5784856","tif":"DAY","orderRef":"RS/3/8"})
14/06/2024 18:49:55.410	[ERROR][IBAPI]id: -1 / code: 505 / Decoding error on OPEN_ORDER: unprocessed data left on queue (["","","","",null]). Please report to https://github.com/stoqey/ib
14/06/2024 18:49:55.500	[ERROR][IBAPI]id: -1 / code: 505 / Decoding error on OPEN_ORDER: unprocessed data left on queue (["","","","",null]). Please report to https://github.com/stoqey/ib
14/06/2024 18:49:55.501	[LOG][Order 8(20)]Filled BUY 1x FOP MES LMT 20240618 5425 PUT @18
14/06/2024 18:49:55.501	[ERROR][IBAPI]id: -1 / code: 505 / Decoding error on OPEN_ORDER: unprocessed data left on queue (["","","","",null]). Please report to https://github.com/stoqey/ib
14/06/2024 18:49:56.067	[ERROR][IBAPI]id: -1 / code: 505 / Decoding error on OPEN_ORDER: unprocessed data left on queue (["","","","",null]). Please report to https://github.com/stoqey/ib
14/06/2024 18:49:56.068	[LOG][Order 9(21)]Filled SELL 1x FOP MES LMT 20240618 5425 CALL @19
14/06/2024 18:49:56.178	[ERROR][IBAPI]id: -1 / code: 505 / Decoding error on OPEN_ORDER: unprocessed data left on queue (["","","","",null]). Please report to https://github.com/stoqey/ib

@rylorin
Copy link
Member

rylorin commented Jun 14, 2024

Sorry but once again I can't reproduce the problem:

    const refContract: Contract = {
      conId: 708846212,
      exchange: "CME",
      symbol: "MES",
    };
    const refOrder: Order = {
      action: OrderAction.BUY,
      lmtPrice: 1,
      totalQuantity: 1,
      transmit: true,
      orderType: OrderType.LMT,
      account: "DU5784856",
      tif: "DAY",
      orderRef: "RS/3/9",
    };
 PASS  src/tests/unit/api/order/placeOrder.test.ts (7.576 s)
  Place Orders
    ✓ Stock placeOrder (1034 ms)
    ✓ What if Order (803 ms)
    ✓ Crypto placeOrder (3555 ms)
    ✓ Option placeOrder (781 ms)
    ✓ Issue #203 (652 ms)

Test Suites: 1 passed, 1 total
Tests:       5 passed, 5 total
Snapshots:   0 total
Time:        9.675 s, estimated 31 s
Ran all test suites matching /.\/src\/tests\/unit\/api\/order\/placeOrder.test.ts/i.
✨  Done in 10.61s.

on TWS 10.29.1h

If somebody can contact me via PM and give me an access to his API maybe I would be able to reproduce this bug.
BTW I am using node v20.12.2 on a MacBook Air M1.

@fanazhe
Copy link

fanazhe commented Sep 8, 2024

const contract = {
  symbol: "ES",
  exchange: "CME",
  currency: "USD",
  lastTradeDateOrContractMonth: '20240920',
  secType: SecType.FUT,
};
const order = {
  orderType: OrderType.LMT,
  action: OrderAction.BUY,
  lmtPrice: 5400,
  orderId,
  totalQuantity: 1,
};

The order above shows Decoding error on OPEN_ORDER: unprocessed data left on queue (["",null]). Please report to https://github.com/stoqey/ib - code: 505 - reqId: -1

@rylorin
Copy link
Member

rylorin commented Sep 16, 2024

Thanks for your report.
Unfortunately, once again, it works fine for me:

 PASS  src/tests/unit/api/order/issue203.test.ts (10.576 s)
  Issue #203
    ✓ mafianekcek report (382 ms)
    ✓ fanazhe report (9617 ms)

Test Suites: 1 passed, 1 total
Tests:       2 passed, 2 total
Snapshots:   0 total
Time:        11.906 s, estimated 41 s

Could you maybe provide some more information about the exec env: OS, arch, Node release, IB GW or TWS release number, ... also I am available for a joint debug session on your environment.

@fanazhe
Copy link

fanazhe commented Sep 16, 2024

Thanks for your report. Unfortunately, once again, it works fine for me:

 PASS  src/tests/unit/api/order/issue203.test.ts (10.576 s)
  Issue #203
    ✓ mafianekcek report (382 ms)
    ✓ fanazhe report (9617 ms)

Test Suites: 1 passed, 1 total
Tests:       2 passed, 2 total
Snapshots:   0 total
Time:        11.906 s, estimated 41 s

Could you maybe provide some more information about the exec env: OS, arch, Node release, IB GW or TWS release number, ... also I am available for a joint debug session on your environment.

My test env: 64-bit Windows 10, Intel CPU, NodeJS v20.12.2, TWS Build 10.30.1j
In both live and paper mode can get the Decoding error on OPEN_ORDER:... error.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging a pull request may close this issue.

7 participants