在 GitHub 上查看

延迟反转交易时段策略图

本图在信号与委托之间放入了两样东西:一段等待和一只时钟。围绕移动平均线画出一条百分比通道,价格离开该通道即被视为反转。反转发生的当时并不交易,而是交给延迟模块,由它数满固定数量的已完成K线,只有从另一端输出的脉冲才被允许接近下单模块——而且还要工作时段模块判定此刻处于交易时段之内。

策略概览

  • 整张图的每一个分支都由同一条K线序列驱动:周期三十分钟,且只取已完成的K线。
  • 移动平均线给出通道中轴;一个常量保存灵敏度,两个公式把二者换算成上下两条边界——即均线加上、减去均线乘以灵敏度所得的值。
  • 两个交叉模块把收盘价与这两条边界作比较。其中一个在收盘价自下向上穿越上边界时触发;另一个的接线方向相反,把下边界接到向上方向的输入端,因此它在收盘价向下跌破下边界时触发。
  • 每次交叉都会给各自的延迟模块上膛。延迟模块对上膛之后到达的已完成K线计数,数满即释放一个脉冲,于是信号在之后才被执行,而不是在产生它的那根K线上执行。
  • 工作时段模块读取每根K线的时间,判断该时刻是否处于交易时段之内;一个逻辑非把同一个标志翻转为“时段之外”标志。
  • 每个方向各有一个逻辑与,把释放出的脉冲与时段标志合并,因此落在工作时间之外的脉冲会被丢弃,而不是排队等待。
  • 开仓通过持仓修改(Position modify)模块以市价委托完成,这些模块被设置为仅在空仓状态下开仓,因此一个延迟信号只开一次仓,同方向的重复脉冲无法叠加加仓。
  • 第三个持仓修改模块负责平掉任何已有持仓,它由三个来源驱动:两个方向的延迟信号以及时段之外标志;图表面板绘制K线、均线、两条通道边界、委托和成交。

入场与出场规则

  • 做多入场: 收盘价自下向上穿越通道上边界,多头延迟随之上膛。经过设定数量的已完成K线之后,延迟模块释放脉冲;若此刻时钟处于交易时段之内,多头持仓修改模块便按市价买入设定的委托数量。由于该模块仅在空仓时开仓,已有持仓时买入会被跳过——那时同一个脉冲已经转而送到了平仓模块。
  • 做空入场: 收盘价向下跌破通道下边界,空头延迟随之上膛。经过设定数量的已完成K线之后脉冲到达,若时钟处于交易时段之内,空头持仓修改模块便按市价卖出设定的委托数量,同样只在空仓状态下执行。
  • 离场: 有两样东西会结束一笔交易。任一方向的延迟信号既接到自己的开仓模块,也接到平仓模块,因此一个被延迟持有的、与当前持仓方向相反的反转信号会按市价把仓位平掉;随后的开仓要等待下一个信号,因为开仓模块只在空仓状态下工作。另一样是时钟:工作时段标志一旦变为假,逻辑非模块便在每根K线上触发,平仓模块把持仓平掉,并保持空仓,直到交易时段重新开始。在空仓状态下,平仓模块什么也不做。这里没有止损模块,也没有止盈模块。

参数

参数 默认值 说明
Candles 00:30:00 整张图所依赖的那条唯一K线序列的周期。
Average Length 20 绘制通道中轴的移动平均线的周期长度。
Corridor Sensitivity 0.004 通道半宽相对于均线的比例——默认值为每侧百分之零点四。调高它,反转更少见、幅度更大;调低它,边界被穿越的次数会大幅增加。
Long Signal Delay 2 在向上反转与可能触发买入的脉冲之间所计数的已完成K线数量。设为 1 表示下一根K线;数值越大,信号被持有的时间越长。
Short Signal Delay 2 在向下反转与可能触发卖出的脉冲之间所计数的已完成K线数量。
Session Start 08:00:00 工作时段的开始时间。在此之前释放的脉冲会被丢弃,图保持空仓。
Session End 20:00:00 工作时段的结束时间。从这一刻起,时段之外标志会在每根K线上平掉任何已有持仓,直到交易时段重新开始。
Order Volume 1 开仓时发送的委托数量,以手为单位;平仓模块始终平掉全部已有持仓。

图表详情

  • 交叉模块给出的是事件,而不是状态。它只在两条序列位置互换的那根K线上发声,因此每次反转只给延迟模块上膛一次,而不会在价格停留于通道之外的每根K线上反复上膛。
  • 交叉模块也会以假值的形式报告相反的方向,而延迟模块的上膛输入端与下单触发端都会忽略假值,因此某个交叉模块的向下部分既无法给向上分支上膛,也无法触发它。
  • 在延迟模块计数期间,第二次上膛会被忽略。于是一连串密集的反转只产生一个脉冲,而不是一列排队的脉冲,计数是真正的暂停,而不是累加。
  • K线模块只输出已完成的K线。正在形成的K线的每次更新携带的是该K线的开始时间,据此构造的委托其时间戳落后于模拟器时钟,会被拒绝。
  • 交易时段取自K线自身的时间,而不是取自系统时钟,因此回放的行为与实盘运行完全一致,同一张图无需任何改动即可用于回测。

使用方法

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