python如何初始化一个二维数组_使用Python实现一个简单的商品期货布林指标突破策略...
生活随笔
收集整理的這篇文章主要介紹了
python如何初始化一个二维数组_使用Python实现一个简单的商品期货布林指标突破策略...
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
布林指標突破策略,思路非常簡單。使用Python語言編寫該策略,也非常容易實現(xiàn),加上回測配置信息,有70行代碼,實際可以更加精簡,鑒于教學策略,沒有使用難懂的Python語法,使用的是比較基礎的語句、結(jié)構(gòu)。便于使用Python語言進行商品期貨程序化交易的學習者借鑒、參考。鑒于文章篇幅,策略結(jié)構(gòu),說明注釋,直接寫在代碼注釋中。
策略:
使用BOLL指標上下軌作為突破邊界,突破上軌平空、做多。突破下軌平多,做空。用于捕捉趨勢行情,所以震蕩行情中會有回撤。
策略實現(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 # 定義一個 標記量,表示空閑狀態(tài) LONG = 1 # 定義一個 標記量,表示持多倉狀態(tài) SHORT = 2 # 定義一個 標記量,表示持空倉狀態(tài)def CancelAll(): # 實現(xiàn)一個取消所有掛單的功能函數(shù)while True: # 循環(huán)執(zhí)行orders = _C(exchange.GetOrders) # 讀取當前所有掛單,orders 是一個數(shù)組if len(orders) == 0 : # 判斷這個數(shù)組長度是不是為0,如果為0表示這個數(shù)組中沒有掛單了break # 跳出while循環(huán),沒有掛單說明不需要取消了for order in orders : # 通過上面的if檢測,執(zhí)行到這里,說明orders數(shù)組的長度不為0,有掛單,遍歷orders數(shù)組exchange.CancelOrder(order.Id) # 根據(jù)遍歷時訂單信息中的Id,取消該Id的訂單Sleep(1000) # 控制一下取消頻率,每次取消時暫停1秒def main(): # 策略主函數(shù),策略啟動后從這里開始執(zhí)行state = IDLE # 給策略定義一個狀態(tài)變量,初始化為空閑狀態(tài)direction = "" # 給策略定義一個下單方向變量,初始化為空字符串while True: # 執(zhí)行策略邏輯循環(huán)if exchange.IO("status"): # 檢測是否與期貨公司服務器連接,登錄成功LogStatus(_D(), "已經(jīng)連接") exchange.SetContractType("rb2001") # 設置要操作的合約,這里設置為rb2001,也可以做成參數(shù),由策略參數(shù)上進行設置records = _C(exchange.GetRecords) # 獲取K線數(shù)據(jù),策略參數(shù)界面上設置K線周期1小時,這里獲取的就是1小時K線數(shù)據(jù)if len(records) < 21: # 使用BOLL指標的默認參數(shù),所以K線數(shù)據(jù)的Bar數(shù)量要足夠21才能計算出有效的BOLL指標continue # 不滿足條件的情況下,continue跳過后面的代碼,重復循環(huán)boll = TA.BOLL(records) # 當符合 len(records) >= 21 時,執(zhí)行到這里,使用TA.BOLL計算布林指標數(shù)據(jù),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) 等于0if pos[0].Type == PD_LONG or pos[0].Type == PD_LONG_YD: # 根據(jù)持倉數(shù)據(jù)中的持倉方向,設置策略狀態(tài)變量state state = LONG # 設置為持有多倉狀態(tài)elif pos[0].Type == PD_SHORT or pos[0].Type == PD_SHORT_YD:state = SHORT # 設置為持有空倉狀態(tài)elif len(pos) == 0 : # 無持倉時state = IDLE # 持倉狀態(tài)設置為空閑else :raise "error len(pos) > 1" # 如果檢測到多個倉位,報錯,單獨跑這個策略,是不會有多個倉位的,如果出現(xiàn)說明異常if records[-2].Close > boll[0][-2] and (state == IDLE or state == SHORT): # 如果當前是空閑狀態(tài)或者持有空倉狀態(tài),K線BAR完成時確定價格突破上軌進行下一步判斷# 平空倉(如果是持有空倉的狀態(tài)),開多倉(如果是空閑狀態(tài)),設置direction交易方向變量if state == IDLE:direction = "buy" # 設置交易方向變量為開多倉else :direction = "closesell" # 設置交易方向變量為平空倉exchange.SetDirection(direction) # 調(diào)用交易方向設置函數(shù),設置方向exchange.Buy(records[-1].Close + 2, 1) # 根據(jù)當前價格,加兩跳(對于rb這個品種來說)吃單,下單量為1手,exchange.Buy 下單函數(shù),第一個參數(shù)為價格,第二個參數(shù)為下單量CancelAll() # 下單后嘗試取消所有掛單(未成交)elif records[-2].Close < boll[2][-2] and (state == IDLE or state == LONG): # 判斷突破下軌 # 平多倉(如果是持有多倉的狀態(tài)),開空倉(如果是空閑狀態(tài)),設置direction交易方向變量if state == IDLE:direction = "sell"else :direction = "closebuy"exchange.SetDirection(direction)exchange.Sell(records[-1].Close - 2, 1)CancelAll() else :LogStatus(_D(), "未連接") # 如果未連接上期貨公司服務器,在機器人狀態(tài)欄上顯示時間,和未連接信息Sleep(500) # 每次循環(huán)暫停500毫秒,用來控制程序邏輯輪轉(zhuǎn)頻率回測
使用rb2001合約回測
注意
需要注意的是,策略為了教學用途,設計上按照最簡單的原則設計。下單量使用的是1手,如果下單量是多手,可以思考下可能會帶來什么問題,應該如何改造升級,應對此類問題。
該策略引用了「畫線類庫」,策略需要在「模板欄」中勾選上這個類庫,畫線類庫可以在策略廣場中搜索找到。
完整策略代碼:https://www.fmz.com/strategy/177584
總結(jié)
以上是生活随笔為你收集整理的python如何初始化一个二维数组_使用Python实现一个简单的商品期货布林指标突破策略...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 母根服务器对接 不准发信息,中国的母根服
- 下一篇: 浅谈python_浅谈python-Dj