使用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/,如需轉載,請註明出處,否則將追究法律責任。


相關文章

人工智慧|演算法

幽默:所有演算法現在都稱為AI - Eran Hammer

所有演算法現在都稱為AI回覆:1.現在,所有軟體開發人員都稱為軟體工程師。2.有時我想知道這是因為演算法變得更好了嗎?還是降低了構成智慧的門檻。3. 從歷史上來看,情況恰恰相反:每次發明“人工智慧”之
演算法|PHP

手把手使用 PHP 實現 LRU 快取淘汰演算法

:pencil2:LRU(cache):hourglass:LRU介紹快取是一種提高資料讀取效能的技術。但是對於計算機來說,並不可能快取所有的資料,在達到它的臨界空間時,我們需要通過一些規則用新的資料
演算法

分享一個權重隨機演算法

<?php\//權重隨機演算法排程\class WeightedRoundRobin\{\private static $_weightArray = array();\\private sta
演算法

演算法筆記(廣度優先搜尋)

廣度優先搜尋指出是否有從 A 到 B 的路徑。如果有,廣度優先搜尋將找出最短路徑。面臨類似於尋找最短路徑的問題時,可嘗試使用圖來建立模型,再使用廣度優先搜尋來解決問題。有向圖中的邊為箭頭,箭頭的方向指
Python|演算法

Python之 常用查詢演算法:最小項搜尋、順序搜尋、二分搜尋

最小項搜尋  def min_search(items):  """  最小項搜尋  :param items:  :return:  """  min_index = 0  for i in ran
演算法

分散式技術原理與演算法解析-聶鵬程-極客時間-返現24元

極客時間出品的《分散式技術原理與演算法解析》由聶鵬程所作,聶鵬程是智載雲帆CTO,前華為分散式Lab資深技術專家。本專欄帶你12周精通分散式核心技術  。課程訂閱及價格:原價¥99 ,限時¥68  ,
演算法

推薦!計算機視覺最適合入門的 8 本教程,演算法與實戰兼備

計算機視覺是人工智慧的一個分支,涉及理解數字影象的內容,如照片和視訊。深度學習在挑戰性的計算機視覺任務上取得了令人印象深刻的進展,並有望取得進一步的進展。快速熟悉這個領域的最好方法之一就是找一本關於這
演算法

淺談滴滴派單演算法

本文作者:王犇 滴滴 | 首席演算法工程師導讀:說到滴滴的派單演算法,大家可能感覺到既神祕又好奇,從計程車揚召到司機在滴滴平臺搶單最後到平臺派單,大家今天的出行體驗已經發生了翻天覆地的變化,面對著
Python|演算法

python實現Dijkstra演算法之 最短路徑問題

從某源點到其餘各頂點的最短路徑  Dijkstra演算法可用於求解圖中某源點到其餘各頂點的最短路徑。假設G={V,{E}}是含有n個頂點的有向圖,以該圖中頂點v為源點,使用Dijkstra演算法求頂點
NLP|演算法

常用文字挖掘/NLP 演算法彙總

常用文字挖掘/NLP 演算法彙總WORD2VECGLOVEFASTTEXTDOC2VECTFIDFPLSALDAHMMCRFDSSMBERTTRANSFORMERTEXTRANKSEQ2SEQLSTM