在 GitHub 上查看

加权篮子趋势策略图

该图把两个合约当作一个篮子来交易,并且依据三条价格序列而非两条来作决策。系统用两个被交易的合约拼装出一个合成合约,其表达式中带有一个除数,把价格高的那条腿缩小,直到价格低的那条腿仍能推动结果;这个合成合约的趋势就是该图所说的篮子方向。随后每条腿再各自用同样的方式度量。只有当某条腿自身的趋势与篮子方向一致时,才买入或卖出这条腿;而当篮子反转时,所有方向与之相反的腿都会被平掉。没有别的平仓方式:既没有目标价也没有止损,篮子的符号既是持仓的理由,也是离场的理由。

策略概览

  • 一个证券指数模块用两个被交易的合约构建出单一的合成合约。权重写在它的表达式里,因此两条腿以可比的尺度参与运算,而不会让价格较高的一方淹没价格较低的一方。
  • 三条K线序列运行在同一周期上:一条取自合成篮子,另两条分别取自每条腿。三条序列都只订阅已完成的K线,因此下游的每个读数都属于一根已经收盘的K线。
  • 每条序列都送入一条快速平滑移动平均线和一条慢速平滑移动平均线,再由一个公式用快线减去慢线。结果是一个带符号的趋势差值,一共有三个:篮子一个,每条腿各一个。
  • 每个差值都被一个变量捕获并保存,等到第一条腿的K线收盘时才释放,因此一次决策绝不会由取自某一时刻的篮子读数和取自另一时刻的腿读数拼凑而成。
  • 数值来自最后产生它的那条序列,时刻则来自被交易的那根K线,因此下游的一切都带有发出委托那根K线的时间戳。
  • 六个比较把三个锁存的差值与零对照,转成带符号的标志:篮子向上或向下、第一条腿向上或向下、第二条腿向上或向下。
  • 两个持仓模块分别绑定到各自的合约,报告当前已经持有的头寸,另外两个比较则判断该腿此刻是否空仓。正是这一点使得重复出现的信号不会在同一条腿上叠加第二次开仓。
  • 四个逻辑条件各自汇集三个标志——篮子方向、腿的方向、该腿为空仓——每个条件触发一个市价委托模块。另外四个委托模块负责平仓,直接由两个篮子标志驱动。

入场与出场规则

  • 做多入场: 当篮子差值为正、该腿自身的差值也为正、且该腿上没有持仓时,就买入这条腿。两条腿在同一根K线上各自独立判断,因此可能同时做多,也可能一条做多而另一条留在场外,或者两条都不满足条件。
  • 做空入场: 当篮子差值为负、该腿自身的差值也为负、且该腿上没有持仓时,就卖出这条腿。空头一侧与多头一侧完全镜像对称,两条腿之间同样彼此独立。
  • 离场: 唯一的离场条件是篮子差值符号的改变。篮子为负时触发两个带卖出方向的平仓模块,篮子为正时触发两个带买入方向的平仓模块。平仓模块上的方向是过滤条件而不是指令:该模块只对方向相反的持仓起作用,因此卖出方向的平仓模块只会处理做多的腿,而当那条腿空仓或已经是空头时则什么也不做。若某条腿自身的差值已经反转而篮子尚未反转,这条腿就保持不动,直到篮子与之一致。

参数

参数 默认值 说明
First Leg BTCUSDT@BNBFT 第一个被交易的合约。它提供自己的K线序列、自己的一对均线、自己的持仓模块和自己的四个委托模块;改动它就等于挪动整条腿。
Second Leg TONUSDT@BNBFT 第二个被交易的合约,接线方式与第一个相同。两条腿是对称的,谁也不从属于谁。
Basket Index BTCUSDT@BNBFT / 20000 + TONUSDT@BNBFT 构建合成篮子合约所用的表达式。除数把两条腿放到可比的尺度上——调大它可让第二条腿占主导,调小它则给第一条腿更大的权重——而这条序列的符号正是每一次开仓的依据。
Basket Candles 00:15:00 篮子K线的周期。应与两条腿的周期保持一致:这三路数据本就应当作同一根K线来读。
First Leg Candles 00:15:00 第一条腿K线的周期。这条序列同时也是交易时钟:它触发锁存和常量,因而也决定了每一笔委托发出的时刻。
Second Leg Candles 00:15:00 第二条腿K线的周期。与第一条腿保持一致,使两条腿都在同样长度的K线上被评判。
Basket Fast Length 3 篮子上快速均线的长度。数值越小反应越早,篮子符号翻转也越频繁,从而开仓和平仓都更加频繁。
Basket Slow Length 7 篮子上慢速均线的长度。它与快线长度之间的差距决定了行情要走得多果断,才会被认为篮子已经反转。
First Leg Fast Length 3 第一条腿上快速均线的长度。它只决定这条腿是否与篮子一致,本身绝不设定篮子的方向。
First Leg Slow Length 7 第一条腿上慢速均线的长度。拉大两个长度之间的差距会让这条腿更少给出确认,于是篮子可能已经反转而它并未跟进。
Second Leg Fast Length 3 第二条腿上快速均线的长度,对该合约起同样的确认作用。
Second Leg Slow Length 7 第二条腿上慢速均线的长度。如果两条腿中有一条噪声更大,可以有意把它们调成不同的参数。
First Leg Volume 0.1 第一条腿上单笔委托的数量,以该合约自身的单位计。它值得与第二条腿的数量一起设置,使得一个完整的篮子在两边投入的资金大致相当。
Second Leg Volume 2000 第二条腿上单笔委托的数量。两个数量分开设置,是因为两个合约的价格尺度完全不同,用同一个数字会让其中一条腿变得微不足道。

图表详情

  • 平衡两条腿的权重是指数表达式的一部分,而不是接在图上的某个数字。重新平衡篮子只需修改这一个参数字符串,整条合成序列都会据此重建。
  • K线只按已完成的方式订阅。由正在更新的K线发出的委托带的是该K线开盘的时间戳,早于它实际发出的时刻,会因此被拒绝;只取已收盘的K线,可以让每一笔委托都带上属于它自己的时刻。
  • 正是这三个锁存变量才让篮子真正可用。合成合约由两路行情拼装而成,它的K线比普通K线更晚完成,因此若某个模块要等三个读数全部落在同一个时间窗口内,它等到的将是一组永远不会到齐的数据。把每个读数锁存到被交易的那根K线上,取的是数值当前的状态和K线给出的时刻,于是比较、逻辑条件和委托全都按被交易K线的时钟运行。
  • 开仓模块被设置为开立持仓,因此开仓只在空仓状态下才起作用。连续几根K线都成立的信号因而只产生一笔委托,而不是每根K线一笔,平仓模块是回到空仓的唯一途径。
  • 图表面板绘制全部三条K线序列、全部六条移动平均线,以及全部八个委托模块的每一笔委托和成交,因此可以把某根K线与授权它的篮子和确认它的那条腿对照着看。

使用方法

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