使用Java API(我想这也适用于任何其他TWS Interactive Brokers客户端API)我收到错误“未找到该请求的安全定义”常见问题解答和其他资源毫无帮助。
Contract contract = new Contract();
int id = incId;
System.out.println("Oder Id " + id );
// use UTC seconds as transaction id
// This is the problem you need to have a blank contractId
contract.m_conId = 12345;
contract.m_symbol = signal.symbol;
contract.m_secType = "STK";
contract.m_expiry = "";
contract.m_strike = 0;
contract.m_exchange = "SMART";
contract.m_primaryExch = "ISLAND";
contract.m_currency = "USD";
//etc
Order order = new Order();
// set order fields
order.m_account = "XXXXXX";
order.m_orderId = id;
//etc
GetInstance().wrapper.m_client.placeOrder(id, contract, order);
这里的关键是contractId字段应该留空。使用 ContractId 提交会导致安全错误。
通过将交易所设置为“SMART”,我解决了这个问题。
我的用例是获取我当前持有的所有合同并发送 MOC 订单。我使用 reqPositions 方法获取了合约,但是这些返回值中的合约仍然给出了这个错误。
将这些合约设置为 SMART 交换解决了我的问题。
在某些情况下,交换需要留空。我很幸运地使用了这个查找:
https://pennies.interactivebrokers.com/cstools/contract_info/v3.9/index.php
例如,对于 CL:
con.connect()
contract = Contract()
contract.m_symbol = "CL"
contract.m_exchange = ""
contract.m_currency = "USD"
contract.m_secType = "FUT"
con.reqContractDetails(1, contract)
time.sleep(2)
con.disconnect()
此错误的其他可能原因可能包括:
-ConId 应设置为 0。
-TradingClass 应留空。
-LocalSymbol 或 GlobalSymbol 的问题。
-其他合约变量设置不正确。
-所请求的具体合同目前在市场上不存在。
我也遇到了同样的问题,但那是因为我没有填写 SecIdType 和 SecId 的值。
这是订单和请求的示例有效:
IBApi.Order order = new IBApi.Order()
{
Account = OrderCreationConfig.IndividualAccount
, ClientId = OrderCreationConfig.OrderSlaveClientId //1
, Action = orderNodeEntity.OrderAction //"BUY"
, TotalQuantity = orderNodeEntity.NrOfStocks
, OrderType = OrderCreationConfig.OrderTypeLMT //"LMT"
, Tif = OrderCreationConfig.OrderTifGTC //"GTC"
, OcaType = OrderCreationConfig.OcaTypeId //3
, LmtPrice = price
, AuxPrice = 0
, TrailStopPrice = double.MaxValue
, VolatilityType = 0
, DeltaNeutralOrderType = "None"
};
IBApi.Contract contract = new IBApi.Contract()
{
Symbol = orderNodeEntity.Symbol
, SecType = OrderCreationConfig.ContractSecTypeSTK //"STK"
, Strike = 0
, Right = OrderCreationConfig.ContractRightQuestionMark //"?"
, Exchange = OrderCreationConfig.ContractExchangeIsland //"ISLAND"
, Currency = OrderCreationConfig.ContractCurrencyUSD //"USD"
, LocalSymbol = orderNodeEntity.Symbol
, TradingClass = null
, SecIdType = OrderCreationConfig.ContractSecIdTypeISIN //"ISIN"
, SecId = this.GetISINCode(orderNodeEntity.Symbol) //"US0378331005"
};
还要确保为您的合约选择正确的最后交易日期或合约月份。当我尝试在不合法的到期日出售期权时,我遇到了同样的错误......
使用 ISLAND 代替 SMART 进行交换。
Contract contract = new Contract();
int id = incId;
System.out.println("Oder Id " + id );
// use UTC seconds as transaction id
// This is the problem you need to have a blank contractId
contract.m_conId = 12345;
contract.m_symbol = signal.symbol;
contract.m_secType = "STK";
contract.m_expiry = "";
contract.m_strike = 0;
contract.m_exchange = "ISLAND";
contract.m_currency = "USD";
//etc
Order order = new Order();
// set order fields
order.m_account = "XXXXXX";
order.m_orderId = id;
//etc
GetInstance().wrapper.m_client.placeOrder(id, contract, order);
遇到同样的错误。兑换一定要正确。
m_strIBContractCode = "NQM4";
m_contract.conId = 0;
m_contract.localSymbol = m_strIBContractCode;
m_contract.exchange = "CME";
m_contract.currency = "USD";
m_contract.secType = "FUT";