布林指标突破策略,思路非常简单。使用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) 等于0if 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手,如果下单量是多手,可以思考下可能会带来什么问题,应该如何改造升级,应对此类问题。

该策略引用了「画线类库」,策略需要在「模板栏」中勾选上这个类库,画线类库可以在策略广场中搜索找到。
完整策略代码:https://www.fmz.com/strategy/177584

python如何初始化一个二维数组_使用Python实现一个简单的商品期货布林指标突破策略...相关推荐

  1. python遍历二维数组_在Python中遍历二维数组?

    你需要告诉我们一些事情:dataset = datas.values 它可能是一个二维数组,因为它来自一个csv负载.但是什么形状和数据类型?甚至可能是阵列的一个样本. 这是函数中的data参数吗? ...

  2. 怎么输出一个二维数组_LeetCode54与59,一个口诀教会你旋转二维数组

    Halo, 好久不见各位小伙伴,这几天工作是在是太忙了,忙到都没有足够的时间去继续写算法题目,那么今天一次性带来两道比较类似的题目,在LeetCode中属于中等难度的题目.但其实只要你掌握其中的要点, ...

  3. python初始化一个二维数组_二维数组初始化

    对于一个M行N列的二维数组,可以看成是M行一维数组,一维数组是N列.例如 int array[3][2]; 是一个3行2列的二维数组,其实,如同3个一维数组,一维数组是2列.那么,对3行2列的二维数组 ...

  4. 如何把一个二维数组的地址赋给一个二维指针?

    int main() { int i = 0, j = 0; int arr[3][5] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14 }; ...

  5. python输出杨辉三角啊二维数组_用Python输出一个杨辉三角的例子

    这篇文章主要介绍了用Python和erlang输出一个杨辉三角的例子,同时还提供了一个erlang版杨辉三角,需要的朋友可以参考下 关于杨辉三角是什么东西,右转维基百科:杨辉三角 稍微看一下直观一点的 ...

  6. python定义二维数组_在python中定义二维数组

    原博文 2016-08-30 19:16 − 发表于 http://liamchzh.0fees.net/?p=234&i=1 一次偶然的机会,发现python中list非常有意思. 先看一段 ...

  7. python输入二维数组_用Python生成二维数组的置换矩阵

    我想为一个输入d(一个素数)生成所有的平方置换矩阵.我知道在一般情况下,对于所有的排列都有这样的例子,但是我在寻找满足数学定义的置换矩阵 置换矩阵是根据数字1到d的某种排列将dxd恒等式矩阵的行进行排 ...

  8. ​​​LabVIEW DLL传递一个二维数组报错

    ​​​LabVIEW DLL传递一个二维数组报错 当调用一个LabVIEW DLL时,首先需要声明处理程序变量并将其初始化为NULL,比如,在C中,代码如下所示: main() { /* Labvie ...

  9. python基础01-定义二维数组

    自学深度学习重拾python,发现自学打的基础就是不行,比如python中定义二维数组的问题,很怪,也很有意思. 找到了一篇大佬的文章:https://www.cnblogs.com/woshare/ ...

最新文章

  1. 编程入门:准备学Python入门编程 为什么前辈一直劝我不行?
  2. SpringSecurity使用自定义认证页面
  3. 在数组中找重复数、只出现一次的数或丢失数的题目(Leetcode题解-Python语言)
  4. Web前端期末大作业--重工机械设备检测生产企业官网网页设计(HTML+CSS+JavaScript )实现
  5. 一个iOS 框架介绍:MKNetworkKit
  6. 数据库期末复习知识点:(仅供参考)
  7. VMware ESXI 虚拟磁盘工具 - vmkfstools 使用实例
  8. flink读取不到文件_Flink流处理API——Source
  9. 面向对象--选课系统作业
  10. SpreadJS 全面支持 Angular2,V10.2 版本即将发布
  11. jeecgboot框架简介
  12. 常用的邮箱服务器配置
  13. 开源协议及应用 (BSD/GPL/LGPL/Apache/MIT)
  14. 使用Python脚本进行批量造数据
  15. 浏览器出现ERR_PROXY_CONNECTION_FAILED 错误代码
  16. sklearn中多种编码方式——category_encoders(one-hot多种用法)
  17. 已知 XYZ+YZZ=532,其中,X、Y、Z 为数字,编程求出 X、Y 和 Z 的值。
  18. 《Information Management:A Proposal》读后感
  19. mysql数据库备份与恢复命令
  20. 我的世界java版无效会话_我的世界局域网联机显示无效的会话和搜不到主机

热门文章

  1. spirng 如何把404转到特定的页面展示
  2. 2.4操作系统之死锁详解(预防、避免、检测、解除)+思维导图
  3. 键盘按下某键 停止运行java_实现按下一个键执行操作/松开一个键停止操作
  4. volatile、synchronized、(原子、可见、有序)、先行发生原则
  5. stm32之USART/UART应用实例(详细)
  6. python图形设置_python学习笔记——基本图形绘制
  7. Arduino--1838红外遥控
  8. 完整适配LUCI界面的Openwrt中EC20的QMI拨号
  9. 浅谈网页中的字体的设置
  10. The 2016 ACM-ICPC Asia China-Final Contest Promblem D