昨天已經模擬出改價了,現在更進階,使用小台的現價來改價。
參考網站:Futures
本日程式碼使用:d21_change_MXF_by_tick.py
根據昨天的程式進行修改,做成我們今日的程式碼。最主要的變動是在trader
中修改了改價的邏輯。
不過首先要看主程式碼,因為這邊訂閱了兩個商品的行情:
timer = threading.Thread(target=sleeper) # 建立執行緒
t = trader()
t.login()
t.subscribe(t.api.Contracts.Futures.TXF["TXF202110"]) # 訂閱台指期-2021/10
t.subscribe(t.api.Contracts.Futures.MXF["MXF202110"]) # 訂閱小台指期-2021/10
t.api.quote.set_quote_callback(t.quote_callback) # 設定處理回報的功能
timer.start() # 執行thread
timer.join() # 等待結束thread
t.unsubscribe(t.api.Contracts.Futures.TXF["TXF202110"]) # 取消訂閱台指期-2021/10
t.unsubscribe(t.api.Contracts.Futures.MXF["MXF202110"]) # 取消訂閱小台指期-2021/10
這邊訂閱了TXF和MXF,分別是大台和小台。而這邊用t.quote_callback
來處理這兩個訂閱的內容。
昨天的quote_callback()
功用只是印出行情資料,不過這邊要改成紀錄大小台的目前價格,以及根據大小台進行小台的價格處理。
def quote_callback(self, topic: str, quote: dict):
"""Get the quote info and change the oder price.
The quote's format is v0: quote is a dict and the value is a list.
"""
print(
f"{topic}-Price:[{quote['Close']}]Diff:[{quote['DiffPrice']}]volumn:[{quote['Volume']}]"
)
if topic.find("/TXF") > 0:
self.txf_point = quote["Close"] # 設定大台目前的價格
self.change_price(quote["Close"], True, 10)
elif topic.find("/MXF") > 0:
self.mxf_point = quote["Close"] # 設定小台目前的價格
def change_price(self, price, diff, points):
"""Simulate to change the price of the order."""
self.mxf_price = price[0] - points if diff else price[0] + points
print(f"小台:current price:{self.mxf_point}-new price:{self.mxf_price}")
在quote_callback()
中,使用字串.find("/TXF")
功能,找出這個行情topic是屬於誰的,如果是大台進入修改目前大台的價格,並且進入修改價格-也就是change_price()
-的地方。如果是小台的話,只是修改價格。
而在change_price()
則把昨天的簡單化,修改成用大台的點數-10的方式,當作小台的價格進行掛單作業。
到這邊有沒有發現,其實小台的價格跟昨天一樣,並不重要,因為在計算中沒有使用到小台的價格。其實運用可以很多種,這個是只用大台的點數價格當作小台的價格,我們也可以這樣運用,就是判斷大台和小台哪個比較小,然後用小的價格再減去一個數值,最後的數字就是我們委託單價格。諸如此類的運用。
不過這樣點數差距很大,除非穿價很厲害,不然很難打到我們這樣的算法XD
這只是一種訂閱的方式,以及運用的實例展示,真正的交易不會這麼隨便的!