使用Python实现一个简单的商品期货布林指标突破策略

论坛 期权论坛 期权     
国泰君安期货郑州营业部   2020-1-1 06:49   2083   0
    布林指标突破策略,思路非常简单。使用Python语言编写该策略,也非常容易实现,加上回测配置信息,有70行代码,实际可以更加精简,鉴于教学策略,没有使用难懂的Python语法,使用的是比较基础的语句、结构。便于使用Python语言进行商品期货程序化交易的学习者借鉴、参考。鉴于文章篇幅,策略结构,说明注释,直接写在代码注释中。

策略:
使用BOLL指标上下轨作为突破边界,突破上轨平空、做多。突破下轨平多,做空。用于捕捉趋势行情,所以震荡行情中会有回撤。

策略实现:
  1. '''backtest
  2. start: 2019-07-01 00:00:00
  3. end: 2019-11-26 00:00:00
  4. period: 1h
  5. exchanges: [{"eid":"Futures_CTP","currency":"FUTURES"}]
  6. '''
  7. IDLE = 0    # 定义一个 标记量,表示空闲状态
  8. LONG = 1    # 定义一个 标记量,表示持多仓状态
  9. SHORT = 2   # 定义一个 标记量,表示持空仓状态
  10. def CancelAll():     # 实现一个取消所有挂单的功能函数
  11.     while True:      # 循环执行
  12.         orders = _C(exchange.GetOrders)    # 读取当前所有挂单,orders 是一个数组
  13.         if len(orders) == 0 :              # 判断这个数组长度是不是为0,如果为0表示这个数组中没有挂单了
  14.             break                          # 跳出while循环,没有挂单说明不需要取消了
  15.         for order in orders :              # 通过上面的if检测,执行到这里,说明orders数组的长度不为0,有挂单,遍历orders数组
  16.             exchange.CancelOrder(order.Id) # 根据遍历时订单信息中的Id,取消该Id的订单
  17.             Sleep(1000)                    # 控制一下取消频率,每次取消时暂停1秒
  18. def main():                                # 策略主函数,策略启动后从这里开始执行
  19.     state = IDLE                           # 给策略定义一个状态变量,初始化为空闲状态
  20.     direction = ""                         # 给策略定义一个下单方向变量,初始化为空字符串
  21.     while True:                            # 执行策略逻辑循环
  22.         if exchange.IO("status"):          # 检测是否与期货公司服务器连接,登录成功
  23.             LogStatus(_D(), "已经连接")
  24.             exchange.SetContractType("rb2001")    # 设置要操作的合约,这里设置为rb2001,也可以做成参数,由策略参数上进行设置
  25.             records = _C(exchange.GetRecords)     # 获取K线数据,策略参数界面上设置K线周期1小时,这里获取的就是1小时K线数据
  26.             if len(records) < 21:                 # 使用BOLL指标的默认参数,所以K线数据的Bar数量要足够21才能计算出有效的BOLL指标
  27.                 continue                          # 不满足条件的情况下,continue跳过后面的代码,重复循环
  28.             boll = TA.BOLL(records)               # 当符合 len(records) >= 21 时,执行到这里,使用TA.BOLL计算布林指标数据,boll是一个二维列表,boll[0]是上轨,boll[1]是中线,boll[2]是下轨
  29.             ext.PlotRecords(records, "K")         # 使用画线类库接口,画K线,画线类库代码可以在策略广场找到
  30.             ext.PlotLine("up", boll[0][-2], records[-2].Time)     # 使用画线类库接口,画上轨
  31.             ext.PlotLine("mid", boll[1][-2], records[-2].Time)    # 画中线
  32.             ext.PlotLine("down", boll[2][-2], records[-2].Time)   # 画下轨
  33.             pos = _C(exchange.GetPosition)                        # 读取当前账户持仓信息
  34.             if len(pos) == 1 :                                            # 如果当前账户有持仓,无持仓时,len(pos) 等于0
  35.                 if pos[0].Type == PD_LONG or pos[0].Type == PD_LONG_YD:   # 根据持仓数据中的持仓方向,设置策略状态变量state
  36.                     state = LONG                                          # 设置为持有多仓状态
  37.                 elif pos[0].Type == PD_SHORT or pos[0].Type == PD_SHORT_YD:
  38.                     state = SHORT                                         # 设置为持有空仓状态
  39.             elif len(pos) == 0 :                                          # 无持仓时
  40.                 state = IDLE                                              # 持仓状态设置为空闲
  41.             else :
  42.                 raise "error len(pos) > 1"                                # 如果检测到多个仓位,报错,单独跑这个策略,是不会有多个仓位的,如果出现说明异常
  43.             if records[-2].Close > boll[0][-2] and (state == IDLE or state == SHORT):   # 如果当前是空闲状态或者持有空仓状态,K线BAR完成时确定价格突破上轨进行下一步判断
  44.                 # 平空仓(如果是持有空仓的状态),开多仓(如果是空闲状态),设置direction交易方向变量
  45.                 if state == IDLE:
  46.                     direction = "buy"          # 设置交易方向变量为开多仓
  47.                 else :
  48.                     direction = "closesell"    # 设置交易方向变量为平空仓
  49.                 exchange.SetDirection(direction)            # 调用交易方向设置函数,设置方向
  50.                 exchange.Buy(records[-1].Close + 2, 1)      # 根据当前价格,加两跳(对于rb这个品种来说)吃单,下单量为1手,exchange.Buy 下单函数,第一个参数为价格,第二个参数为下单量
  51.                 CancelAll()                                 # 下单后尝试取消所有挂单(未成交)
  52.             elif records[-2].Close < boll[2][-2] and (state == IDLE or state == LONG):  # 判断突破下轨
  53.                 # 平多仓(如果是持有多仓的状态),开空仓(如果是空闲状态),设置direction交易方向变量
  54.                 if state == IDLE:
  55.                     direction = "sell"
  56.                 else :
  57.                     direction = "closebuy"
  58.                 exchange.SetDirection(direction)
  59.                 exchange.Sell(records[-1].Close - 2, 1)
  60.                 CancelAll()
  61.         else :
  62.             LogStatus(_D(), "未连接")      # 如果未连接上期货公司服务器,在机器人状态栏上显示时间,和未连接信息
  63.         Sleep(500)                        # 每次循环暂停500毫秒,用来控制程序逻辑轮转频率
复制代码

回测
使用
  1. rb2001
复制代码
合约回测




注意
    需要注意的是,策略为了教学用途,设计上按照最简单的原则设计。下单量使用的是1手,如果下单量是多手,可以思考下可能会带来什么问题,应该如何改造升级,应对此类问题。
    该策略引用了「画线类库」,策略需要在「模板栏」中勾选上这个类库,画线类库可以在策略广场中搜索找到。
    完整策略代码:https://www.fmz.com/strategy/177584
免责声明:信息仅供参考,不构成投资及交易建议。投资者据此操作,风险自担。


分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:
帖子:
精华:
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP