您好,登錄后才能下訂單哦!
這篇文章主要介紹如何使用Python實現一個簡單的商品期貨布林指標突破策略,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
布林指標突破策略,思路非常簡單。使用Python語言編寫該策略,也非常容易實現,加上回測配置信息,有70行代碼,實際可以更加精簡,鑒于教學策略,沒有使用難懂的Python語法,使用的是比較基礎的語句、結構。便于使用Python語言進行商品期貨程序化交易的學習者借鑒、參考。鑒于文章篇幅,策略結構,說明注釋,直接寫在代碼注釋中。
策略:
使用BOLL指標上下軌作為突破邊界,突破上軌平空、做多。突破下軌平多,做空。用于捕捉趨勢行情,所以震蕩行情中會有回撤。
策略實現:
'''backtest start: 2019-07-01 00:00:00 end: 2019-11-26 00:00:00 period: 1h exchanges: [{"eid":"Futures_CTP","currency":"FUTURES"}] ''' IDLE = 0 # 定義一個 標記量,表示空閑狀態 LONG = 1 # 定義一個 標記量,表示持多倉狀態 SHORT = 2 # 定義一個 標記量,表示持空倉狀態 def CancelAll(): # 實現一個取消所有掛單的功能函數 while True: # 循環執行 orders = _C(exchange.GetOrders) # 讀取當前所有掛單,orders 是一個數組 if len(orders) == 0 : # 判斷這個數組長度是不是為0,如果為0表示這個數組中沒有掛單了 break # 跳出while循環,沒有掛單說明不需要取消了 for order in orders : # 通過上面的if檢測,執行到這里,說明orders數組的長度不為0,有掛單,遍歷orders數組 exchange.CancelOrder(order.Id) # 根據遍歷時訂單信息中的Id,取消該Id的訂單 Sleep(1000) # 控制一下取消頻率,每次取消時暫停1秒 def main(): # 策略主函數,策略啟動后從這里開始執行 state = IDLE # 給策略定義一個狀態變量,初始化為空閑狀態 direction = "" # 給策略定義一個下單方向變量,初始化為空字符串 while True: # 執行策略邏輯循環 if exchange.IO("status"): # 檢測是否與期貨公司服務器連接,登錄成功 LogStatus(_D(), "已經連接") exchange.SetContractType("rb2001") # 設置要操作的合約,這里設置為rb2001,也可以做成參數,由策略參數上進行設置 records = _C(exchange.GetRecords) # 獲取K線數據,策略參數界面上設置K線周期1小時,這里獲取的就是1小時K線數據 if len(records) < 21: # 使用BOLL指標的默認參數,所以K線數據的Bar數量要足夠21才能計算出有效的BOLL指標 continue # 不滿足條件的情況下,continue跳過后面的代碼,重復循環 boll = TA.BOLL(records) # 當符合 len(records) >= 21 時,執行到這里,使用TA.BOLL計算布林指標數據,boll是一個二維列表,boll[0]是上軌,boll[1]是中線,boll[2]是下軌 ext.PlotRecords(records, "K") # 使用畫線類庫接口,畫K線,畫線類庫代碼可以在策略廣場找到 ext.PlotLine("up", boll[0][-2], records[-2].Time) # 使用畫線類庫接口,畫上軌 ext.PlotLine("mid", boll[1][-2], records[-2].Time) # 畫中線 ext.PlotLine("down", boll[2][-2], records[-2].Time) # 畫下軌 pos = _C(exchange.GetPosition) # 讀取當前賬戶持倉信息 if len(pos) == 1 : # 如果當前賬戶有持倉,無持倉時,len(pos) 等于0 if pos[0].Type == PD_LONG or pos[0].Type == PD_LONG_YD: # 根據持倉數據中的持倉方向,設置策略狀態變量state state = LONG # 設置為持有多倉狀態 elif pos[0].Type == PD_SHORT or pos[0].Type == PD_SHORT_YD: state = SHORT # 設置為持有空倉狀態 elif len(pos) == 0 : # 無持倉時 state = IDLE # 持倉狀態設置為空閑 else : raise "error len(pos) > 1" # 如果檢測到多個倉位,報錯,單獨跑這個策略,是不會有多個倉位的,如果出現說明異常 if records[-2].Close > boll[0][-2] and (state == IDLE or state == SHORT): # 如果當前是空閑狀態或者持有空倉狀態,K線BAR完成時確定價格突破上軌進行下一步判斷 # 平空倉(如果是持有空倉的狀態),開多倉(如果是空閑狀態),設置direction交易方向變量 if state == IDLE: direction = "buy" # 設置交易方向變量為開多倉 else : direction = "closesell" # 設置交易方向變量為平空倉 exchange.SetDirection(direction) # 調用交易方向設置函數,設置方向 exchange.Buy(records[-1].Close + 2, 1) # 根據當前價格,加兩跳(對于rb這個品種來說)吃單,下單量為1手,exchange.Buy 下單函數,第一個參數為價格,第二個參數為下單量 CancelAll() # 下單后嘗試取消所有掛單(未成交) elif records[-2].Close < boll[2][-2] and (state == IDLE or state == LONG): # 判斷突破下軌 # 平多倉(如果是持有多倉的狀態),開空倉(如果是空閑狀態),設置direction交易方向變量 if state == IDLE: direction = "sell" else : direction = "closebuy" exchange.SetDirection(direction) exchange.Sell(records[-1].Close - 2, 1) CancelAll() else : LogStatus(_D(), "未連接") # 如果未連接上期貨公司服務器,在機器人狀態欄上顯示時間,和未連接信息 Sleep(500) # 每次循環暫停500毫秒,用來控制程序邏輯輪轉頻率
回測
使用rb2001
合約回測
注意
需要注意的是,策略為了教學用途,設計上按照最簡單的原則設計。下單量使用的是1手,如果下單量是多手,可以思考下可能會帶來什么問題,應該如何改造升級,應對此類問題。
該策略引用了「畫線類庫」,策略需要在「模板欄」中勾選上這個類庫,畫線類庫可以在策略廣場中搜索找到。
以上是“如何使用Python實現一個簡單的商品期貨布林指標突破策略”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。