python - 如何使用本机 Interactive Brokers Python API 创建条件订单?
问题描述
以下代码是 IB 提供的。我如何扩展它以创建条件订单,其中两个不同合约的价格可以在条件语句中用于执行所述合约的市场订单?
前任:if AAPL>SPY, "BUY" AAPL, else: "BUY" SPY...
from ibapi.client import EClient
from ibapi.wrapper import EWrapper
from ibapi.contract import Contract
from ibapi.ticktype import TickTypeEnum
from ibapi.utils import iswrapper #just for decorator
from ibapi.order import Order
from threading import Timer
import time
class TestApp(EWrapper, EClient):
def __init__(self):
EClient.__init__(self, self)
def error(self, reqId, errorCode, errorString):
print("Error: ", reqId, " ", errorCode, " ", errorString)
def nextValidId(self, orderId):
self.nextOrderId = orderId
self.start()
def nextOrderId(self):
oid = self.nextValidOrderId
self.nextValidOrderId +=1
return oid
def orderStatus(self, orderId , status:str, filled:float,
remaining:float, avgFillPrice:float, permId:int,
parentId:int, lastFillPrice:float, clientId:int,
whyHeld:str, mktCapPrice: float):
print(orderId, status, filled, remaining, lastFillPrice)
def openOrder(self, orderId, contract: Contract, order: Order,
orderState):
print("OpenOrder. ID:", orderId, "Symbol:", contract.symbol, "SecType:", contract.secType,
"Exchange:", contract.exchange, "Action:", order.action, "OrderType:", order.orderType,
"TotalQuantity:", order.totalQuantity, "Status:", orderState.status)
def execDetails(self, reqId: int, contract: Contract, execution):
print("ExecDetails. ReqId:", reqId, "Symbol:", contract.symbol, "SecType:", contract.secType, "Currency:", contract.currency, execution)
def tickPrice(self, reqId, tickType, price, attrib):
print(price)
def main():
app = TestApp()
app.connect("port", 7497, id)
app.run()
if __name__ == "__main__":
main()
解决方案
原生条件定单(即那些触发下单的逻辑在IBKR服务器上执行)不支持直接比较两种不同工具的价格,例如AAPL和SPY。相反,证券的价格必须与固定的硬编码值进行比较,例如
“如果 AAPL 的最新价格 > 200,请提交购买 SPY 的订单”
要熟悉允许的条件语句类型,建议先尝试在交易者工作站中创建订单,然后再从 TWS API 创建订单。
您可以在您的 API 程序中请求多个工具的流式市场数据,然后在那里实现逻辑以比较不同工具的价格并在满足某些条件时提交订单。
推荐阅读
- c++ - 将变量声明为类成员时使用已删除函数的 C++ 错误
- javascript - 多个 ajax 并行调用并在成功后调度 redux 操作导致“未捕获错误:操作必须是普通对象”
- discord.js - 在 discord.js 中更改昵称
- arrays - TArray 的排序问题
对于大数 - java - 如何使驱动程序类中的方法看到另一个类的子类?
- android - webview内的内部滚动,放置在SwipeRefreshLayout内向上滚动时不起作用
- java - 使用 Jackson 将 JSON 映射到 POJO
- tkinter - 添加标签时列表框调整大小:tkinter
- reactjs - Material-UI 中的颜色枚举“继承”和“默认”是什么意思?
- angular - 部署到heroku后缺少标志问题