当日首个信号策略图
两条指数移动平均线在五分钟K线上交叉是很普通的信号,而在这样快节奏的周期上,它一天之内会重复出现很多次。本图每个自然日只交易每个方向上最早的那一次交叉,之后的每一次交叉都原样放过。让这一点成为可能的记忆来自两个标志 (Flag) 模块,而把这份记忆清空的,是策略时钟发现日期已经变了。
策略概览
- 已完成的五分钟K线送入一条快速和一条慢速指数移动平均线,交叉 (Crossing) 模块把这一对均线变成单一事件:快线上穿慢线时输出 true,下穿时输出 false。
- 一个逻辑非把同一个事件转成独立的下穿信号,因此一个交叉模块同时服务两个方向,无需再复制一份均线。
- 当前时间 (Current time) 模块把策略时钟持续送入一个转换器,由它从中读出自然日,于是本图有了一个与K线序列无关的日期编号。
- 一个变量保存这个日期编号,并在K线收盘时把它放行,这意味着它携带的始终是上一根K线所属的那一天;因此它与实时日期编号之间的不等于比较,恰好在午夜之后的第一根K线上为真一次。
- 每个方向各有一个标志模块:入场信号是它的触发,日期变更脉冲是它的复位。标志只在第一次被置位时才放行触发,因此当天首个被接受的信号之后的一切都被悄悄丢弃,直到日期改变为止。
- 入场由设为仅从空仓开仓的持仓修改 (Position modify) 模块完成,因此这两个锁存每天最多用掉一笔多头和一笔空头,绝不叠加数量。
- 反向交叉平掉已开的仓位:两个逻辑条件汇入一个组合 (Combination) 模块,触发唯一一个设为平仓的持仓修改模块,因此两边都不需要各自的出场模块。
- 持仓保护 (Position protection) 监视入场成交,可以在固定的止盈或止损距离上提前结束交易,因此持仓不会一直等待一个迟迟不来的交叉。
入场与出场规则
- 做多入场: 快线上穿慢线,且此时持仓为空。这一组合触发多头标志模块,而由于标志只在第一次置位时才触发,只有自上次日期变更以来还没有开过多头时,这次交叉才会被执行。随后持仓修改模块按设定的下单量以市价买入,若已有任何持仓则直接拒绝该委托。
- 做空入场: 快线下穿慢线,且此时持仓为空。信号经过空头标志模块,它同样只放行当天的第一次置位,随后持仓修改模块按相同的下单量以市价卖出。两个标志模块彼此独立,因此一天之内可以有一笔多头和一笔空头,先后顺序不限。
- 离场: 持多头时的下穿与持空头时的上穿由一个组合模块汇集,触发唯一一个设为平仓的持仓修改模块,平仓数量由它自行计算。持仓保护与之并行地作用于入场成交,可以在止盈或止损距离上更早地结束这笔交易。任何情况下都不会一步反手:持仓先回到空仓,反向的一边要等到某一次交叉发现账户已是空仓时才会开出。
参数
| 参数 | 默认值 | 说明 |
|---|---|---|
| Candles | 00:05:00 | 整张图运行所依据的K线序列周期。周期越慢,每天的交叉越少,每日一次的限制也就越少起作用。 |
| Fast EMA Length | 14 | 快速指数移动平均线的周期长度。 |
| Slow EMA Length | 40 | 慢速指数移动平均线的周期长度。要让它明显长于快线,否则两条均线会不停交叉——不过反正每天也只有第一次交叉能通过锁存。 |
| Volume | 1 | 单笔入场的数量,以品种单位计。两个方向都使用该值。 |
| Take Profit, % | 1.5 | 止盈距离,以入场价的百分比表示。 |
| Stop Loss, % | 1 | 止损距离,以入场价的百分比表示。 |
图表详情
- 日期编号来自时钟而不是K线,因此在有缺口的交易时段里复位依然有效,也不依赖于日期跨越的那一刻恰好有一根K线存在。
- 时钟按自己的节拍走动,比K线收盘频繁得多。正因如此,它的数值才没有被直接拿去与保存的数值比较:先由一个变量把它转到K线的节拍上,这才让比较的含义变成“这根K线与上一根K线属于不同的一天”。
- 标志模块会忽略任意一个插槽上到来的 false,因此日期变更比较可以整天持续输出 false 而不打扰锁存,一个求值为 false 的逻辑条件也不会带来任何代价。
- 入场闸门要求持仓为空,而入场模块本身也拒绝从其他状态工作,这是有意为之:锁存会被信号用掉,因此一个无法成交的信号会白白烧掉该方向当天的机会。
- 两个方向共用一个下单量变量和一个保护模块,因此多头和空头的数量与保护完全按同一条规则确定。
使用方法
将 .json 文件导入 Designer,在回测器中用历史数据运行,然后根据自己的交易品种调整参数或方块,确认无误后再用于实盘。