python如何初始化一个二维数组_使用Python实现一个简单的商品期货布林指标突破策略...
生活随笔
收集整理的這篇文章主要介紹了
python如何初始化一个二维数组_使用Python实现一个简单的商品期货布林指标突破策略...
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
布林指標(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) 等于0if 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è)類庫,畫線類庫可以在策略廣場中搜索找到。
完整策略代碼:https://www.fmz.com/strategy/177584
總結(jié)
以上是生活随笔為你收集整理的python如何初始化一个二维数组_使用Python实现一个简单的商品期货布林指标突破策略...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 母根服务器对接 不准发信息,中国的母根服
- 下一篇: k8s如何设置虚拟内存_绝地求生内存优化