在 GitHub 上查看

ATR 步长连续策略图

方向由两条移动平均线决定,但在它们交叉换位的那一刻并不买入。图中会在该时刻之后等待固定数量的已完成 K 线,然后才判断这笔交易是否仍值得做。等待由 N 值(N values)模块完成:它由两条均线的比较结果装填,并在数完指定数量的 K 线后发出一次信号。第二个条件衡量价格距离近期区间边缘还剩多少空间,而且这个空间用波动率而不是价格来度量:买入前,收盘价必须至少低于区间最高价一个 ATR 步长;卖出前,收盘价必须高于区间最低价同样一个步长。

策略概览

  • 已完成的十五分钟 K 线送入一个转换器(Converter),从中取出收盘价,并驱动五个指标:一条快速简单移动平均线、一条慢速简单移动平均线、一个 ATR,以及近期通道的最高价和最低价。
  • 两个比较(Comparison)模块把两条均线相互对比,并在每根 K 线上给出结果:快线在慢线之上时其中一个为真,快线在慢线之下时另一个为真。
  • 每个比较模块各自装填一个 N 值模块。该模块的输入接收 K 线数据流,从装填信号之后开始数已完成的 K 线,数满后发出一次脉冲,并在下一次比较为真时重新装填;因此图中开仓一侧的节奏比行情数据慢。
  • 一个公式(Formula)模块把 ATR 乘以步长倍数,另外两个公式模块把这个步长换算成一对警戒价位:最高价减去步长,以及最低价加上步长。
  • 再有两个比较模块判断收盘价是否仍低于上方警戒位,或仍高于下方警戒位——也就是价格是否已经深入通道,以至于不再留有交易空间。
  • 一个持仓(Position)模块与一个取值为零的变量作比较,这样开仓一侧就知道当前是否为空仓。
  • 每一侧都用一个设为 And 的逻辑条件(Logical condition)模块汇总四个条件:N 值模块发出的脉冲、在该时刻再次检查的均线比较结果、距通道边缘的空间,以及空仓状态。只有四者同时到齐,这道闸门才会放行。
  • 持仓修改(Modify position)模块按变量中给出的数量以市价开仓,另外两个持仓修改模块在相反的比较为真时平仓;持仓保护(Position protection)模块由每一笔开仓成交装填;图表面板画出 K 线、两条均线、通道的两个极值、全部委托和全部成交。

入场与出场规则

  • 做多入场: 快线在慢线之上,该侧的 N 值模块在这根 K 线上发出脉冲,收盘价至少比通道最高价低一个 ATR 步长,且当前为空仓。四个条件在多头一侧的 And 中会合,持仓修改模块便按委托数量以市价买入。该模块设置为仅开仓,因此只要已经持有任一方向的仓位,就不会再买入。
  • 做空入场: 与之镜像:快线在慢线之下,空头一侧的 N 值模块发出脉冲,收盘价至少比通道最低价高一个 ATR 步长,且当前为空仓。空头一侧的 And 把信号送给一个持仓修改模块,由它按委托数量以市价卖出,同样是仅开仓。
  • 离场: 离场有两条路。第一条是两条均线交叉换位:换位之后为真的那个比较模块驱动持仓那一侧的平仓模块,该模块以市价送出全部仓位。第二条是持仓保护模块——它由每一笔开仓成交装填,在 2% 处止盈、在 1% 处止损,计算依据是送入其价格输入端的已完成 K 线收盘价。由于两个开仓模块都是仅开仓,结束一笔交易的那个比较绝不会开出反向仓位;下一次开仓必须等到下一个在空仓状态下到来的脉冲。

参数

参数 默认值 说明
Candles 00:15:00 整个方案所使用的 K 线周期。方案中的所有计数——均线、ATR、通道、等待期——都以这些 K 线为单位。
Fast SMA Length 20 快速均线的长度。缩短它,两条均线换位会更频繁,等待模块被装填的次数随之增多,开仓也更多。
Slow SMA Length 60 慢速均线的长度。它与快线长度之间的差距,决定了一段趋势要持续多久才会被识别出来。
Bull Streak Bars 3 多头一侧的 N 值模块在均线排列成形与发出脉冲之间要数多少根已完成的 K 线。取 1 时方案在交叉后的下一根 K 线上开仓;取较大的值会把开仓推迟到行情走出很远之后,而且由于模块在每次脉冲后重新装填,各次开仓之间的间隔也会拉长。
Bear Streak Bars 3 空头一侧的同一个等待期。除非有意让两个方向用不同长短的时间来确认,否则应与多头一侧保持一致。
ATR Length 14 衡量波动率的 ATR 窗口。它决定了到通道边缘的距离用什么单位来表示。
Step Multiplier 2 价格到通道边缘必须留有多少个 ATR 的空间。调高它,只有离极值足够远时才会开仓,这种情况更少见;把它调向零,这个条件几乎消失,只剩下被延时的趋势信号单独起作用。
Channel High Length 20 最高价在多少根 K 线上取。它就是多头开仓必须以一个步长的距离保持在其下方的上沿。
Channel Low Length 20 最低价在多少根 K 线上取。它就是空头开仓必须以一个步长的距离保持在其上方的下沿。除非需要一个不对称的通道,否则应与最高价窗口保持一致。
Order Volume 1 两个开仓模块送出的数量。平仓模块不设数量:它们送出当前仓位的全部。
Take Profit, % 2 保护模块的止盈目标,按成交价的百分比计算。
Stop Loss, % 1 保护模块的止损限度,按成交价的百分比计算。它与止盈目标共同决定有多少笔交易是靠保护结束的,而不是靠均线换位结束的。

图表详情

  • N 值模块是一个延时器,而不是连续 K 线的计数器:它由看到的第一个为真的比较结果装填,随后数已完成的 K 线,并只发出一次信号。它并不检查条件在整个窗口内是否一直成立,正因如此,脉冲到达的那一刻要在 And 中再问一次同一个比较——在等待期间瓦解的趋势通不过这第二次检查,于是不会送出任何委托。
  • 逻辑条件模块一旦给出结果就会清空自己的输入,因此开仓闸门只能在带有脉冲的那些 K 线上作出判断。两次脉冲之间,各个比较结果仍在不断刷新,但什么也到不了开仓模块;正是这一点,使得条件连续数小时为真的方案不会在每根 K 线上都去交易。
  • 警戒价位是用衡量波动率的同一个 ATR 画出来的,因此行情走得越快,价格必须与通道边缘保持的距离就越大;行情平静下来,这个距离就收窄。两个通道指标都把正在判断的这根 K 线算在内,所以价位随极值一起移动,而不会落后于它们。
  • 方案中的常量——零、委托数量和步长倍数——都由 K 线数据流触发,因此它们的取值与被比较、被相乘的指标值落在同一个时刻。
  • 平仓模块直接接在均线比较之后,因此只要均线保持那种上下关系,每根 K 线都会触发它们。过滤靠的是它们的平仓条件:当这一侧没有仓位时,模块什么都不做,也就没有任何委托离开方案。

使用方法

将 .json 文件导入 Designer,在回测器中用历史数据运行,然后根据自己的交易品种调整参数或方块,确认无误后再用于实盘。