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