假日沒有行情,所以只能平日來做取得行情資料的工作,所以今天的文章是根據期貨行情,模擬價格修改的委託策略。這邊先不實作送單的作業。
參考網站:Futures
本日程式碼使用:d20_change_price_by_tick.py
在trader
中新增兩個function,其中一個是quote_callback(topic, quote)
,另一個是change_price(price, diff, points)
。
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']}]rate:[{quote['DiffRate']}]volumn:[{quote['Volume']}]"
)
self.change_price(
quote["Close"], True if quote["DiffRate"][0] > 0 else False, 10
)
def change_price(self, price, diff, points):
"""Simulate to change the price of the order."""
print(
f"current price:{price[0]}-new price:{price[0]-points if diff else price[0]+points}"
)
在quote_callback
是參考文件,使用傳統的做法,在主程式中使用set_quote_callback()
(下面會說明),把收到的行情資料,丟到這個function進行處理。而我們這邊處理的方式是經由change_price()
進行修改價格,但這個價格是模擬修改動作,並不是真的把價格修改掉。
set_quote_callback()
:在其中用quote["DiffRate"][0]
進行判斷,看變動率是正數還是負數,當為負數時,就表示False
,正數為True
,作為後續改價的依據。change_price()
:這個功能中有收到目前的價格,變動的正負號,以及點數要修改多少這三個變數,而修改價格的邏輯是,當變動為正數,表示上漲。以期貨來說,有買進和賣出兩個方向,假設我們的策略是:上漲時,我們買進期貨,下跌時,我們賣出期貨。所以當diff
為正數時,我們要用比較低的價格購買(低買高賣才會賺錢),所以就是「用現在的價格減去要變動的點數」,假設目前是16000所以就會是16000-10
,也就是15990
;反之,負數表示下跌,我們要高賣低買,所以就是16000+10
的價格去賣這期貨。主要執行的程式也是有個sleeper()
,進行給30秒的時間取回報。
def sleeper():
"""進行執行緒睡覺功能,用來等待並且處理價格"""
print("-start sleep...")
time.sleep(30)
print("-Wake up!!!!")
timer = threading.Thread(target=sleeper) # 建立執行緒
t = trader()
t.login()
t.subscribe(t.api.Contracts.Futures.TXF["TXF202110"]) # 訂閱台指期-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
其中,呼叫api.quote.set_quote_callback(function名)
的功能,把處理行情資料的功能回呼到我們的quote_callback()
中,讓程式可以取得資料,並且處理。當然最後要取消訂閱囉~
先做簡單的修改價格,後續再繼續玩更複雜的東西。