使用Jupyter NoteBook進行IB查詢和交易,以及使用演算法交易示例

張國平發表於2019-10-09

在搞好IB盈透介面後,試了下客戶端交易,但是最終目的還是使用程式化交易。發現vnpy已經提供的Script_engine來支援Jupyter NoteBook 交易的,而且非常方便呼叫。
這裡就用寫了基於VNPY包,用程式碼實現IB盈透下的查詢和交易,和一個TWVP演算法交易。

Script_engine的大多操作都是針對main_engine的封裝,類似的邏輯,其他交易相關App,也可以用類似方法呼叫,真的很方便,比起之前除錯來說。其實演算法交易呼叫也很直接,直接傳入algo setting 的dict就可以。

應為Jupyter NoteBook程式碼不好貼,我這裡又改寫會直接python code。在啟動tws登入後,可以直接執行。
另外IB介面的返回資訊採用一箇中wrapper機制,有點類似Spring的反轉呼叫,可以理解為本地返回方法是被IBapi呼叫的寫入。

from vnpy.app.script_trader import init_cli_trading
from vnpy.gateway.ib import IbGateway
from time import sleep
# 連線到伺服器
setting = {
    "TWS地址": "127.0.0.1",
    "TWS埠": 7497,
    "客戶號":5 #每個連結用一個獨立的連結號,一個IBAPI支援32個來同時連結
}
engine = init_cli_trading([IbGateway]) #返回Script_engine 示例,並且給main_engine註冊了gateway
engine.connect_gateway(setting, "IB") #連結
# 查詢資金 - 自動
sleep(10)
print(engine.get_all_accounts(use_df = True))
# 查詢持倉
print(engine.get_all_positions(use_df = True))
# 訂閱行情
from vnpy.trader.constant import Exchange
from vnpy.trader.object import SubscribeRequest
# 從我測試直接用Script_engine有問題,IB的品種太多,get_all_contracts命令不行,需要指定具體後才可以,這裡使用main_engine訂閱
req1 = SubscribeRequest("152791428",Exchange.SEHK) #建立行情訂閱,騰訊
req2 = SubscribeRequest("332623976",Exchange.SEHK) #建立行情訂閱,美團
req3 = SubscribeRequest("12087792",Exchange.IDEALPRO) #建立行情訂閱,美團
engine.main_engine.subscribe(req1,"IB")
engine.main_engine.subscribe(req2,"IB")
engine.main_engine.subscribe(req3,"IB")
# 返回行情
sleep(10)
print(engine.get_all_contracts(use_df = True)) #返回所有已經訂閱的contact
print(engine.get_contract("152791428.SEHK",use_df = True)) #返回單個訂閱的contact
print(engine.get_ticks(["152791428.SEHK","332623976.SEHK"],use_df = True)) #返回訂閱的tick
# 委託下單,返回訂單號
from vnpy.trader.constant import OrderType
vt_orderid = engine.buy(vt_symbol = "12087792.IDEALPRO",price = 1.20, volume = 50000, order_type = OrderType.LIMIT)
print(vt_orderid)
# 按照訂單號查詢委託狀態,這裡也可以用get_orders, 查詢訂單號佇列
sleep(10)
print(engine.get_order(vt_orderid)) #
print(engine.get_trades(vt_orderid, use_df= True))
# 再次查詢持倉
print(engine.get_all_positions(use_df = True))
# 使用演算法交易引擎
from vnpy.app.algo_trading import AlgoTradingApp
engine.main_engine.add_app(AlgoTradingApp) #加入app
AlgoInstance = engine.main_engine.get_engine("AlgoTrading") #為了方便,這裡直接用返回的AlgoInstance
# 建立演算法交易的要執行交易內容, 這個可以複製 algo_trading_setting.json的內容,這裡這裡策略是,100秒內每隔10秒下單一次,每次購買10000
AlgotradingDict1 = {
        "template_name": "TwapAlgo",
        "vt_symbol": "12087792.IDEALPRO",
        "direction": "多",
        "price": 1.0985,
        "volume": 10000.0,
        "time": 100,
        "interval": 10,
        "offset": ""
    }
AlgoInstance.start_algo(setting = AlgotradingDict1)
# 再次查詢持倉
print(engine.get_all_positions(use_df = True))


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/22259926/viewspace-2659265/,如需轉載,請註明出處,否則將追究法律責任。

相關文章