<p>几年前我玩过tk,这就是我构建代码的方式。我创建了一个tkinter窗口,并从tkinter类连接到TWS</p>
<pre><code>from tkinter import *
import threading
from ibapi import wrapper
from ibapi.client import EClient
from ibapi.utils import iswrapper #just for decorator
from ibapi.common import *
from ibapi.ticktype import *
from ibapi.contract import Contract
class TkWdow():
def __init__(self):
root = Tk()
frame = Frame(root)
frame.pack()
button = Button(frame, text="START", fg="green", command=self.start)
button.pack(side=LEFT)
button = Button(frame, text="ReqData", command=self.reqData)
button.pack(side=LEFT)
button = Button(frame, text="QUIT", fg="red", command=self.quit)
button.pack(side=LEFT)
self.output = Text(root, height=50, width=100)
self.output.pack(side=BOTTOM)
self.log("This is where output goes")
root.mainloop()
#root.destroy()
def start(self):
self.client = TestApp(self)
self.log("starting")
self.client.connect("127.0.0.1", 7497, clientId=123)
thread = threading.Thread(target = self.client.run)
thread.start()
def log(self, *args):
for s in args:
self.output.insert(END, str(s) + " ")
self.output.insert(END, "\n")
def quit(self):
self.log("quitting")
self.client.disconnect()
def reqData(self):
self.log("reqData")
cont = Contract()
cont.symbol = "cl"
cont.secType = "FUT"
cont.currency = "USD"
cont.exchange = "nymex"
cont.lastTradeDateOrContractMonth = "202112"
self.client.reqMktData(1, cont, "233", False, False, None)
def cancelMktData(self, reqId:TickerId):
super().cancelMktData(reqId)
self.log('sub cancel')
class TestApp(wrapper.EWrapper, EClient):
def __init__(self, wdow):
self.wdow = wdow
wrapper.EWrapper.__init__(self)
EClient.__init__(self, wrapper=self)
@iswrapper
def nextValidId(self, orderId:int):
self.wdow.log("setting nextValidOrderId: " , orderId)
self.nextValidOrderId = orderId
@iswrapper
def error(self, reqId:TickerId, errorCode:int, errorString:str):
self.wdow.log("Error. Id: " , reqId, " Code: " , errorCode , " Msg: " , errorString)
@iswrapper
def tickString(self, reqId:TickerId, tickType:TickType, value:str):
if tickType == TickTypeEnum.RT_VOLUME:
self.wdow.log(value)#price,size,time
#if __name__ == "__main__":
TkWdow()
</code></pre>