量化交易策略中分组指令的编写

Author: , Created: 2019-07-10 09:55:13, Updated: 2019-07-16 15:37:32

为什么要分组指令

策略开发者的需求

对于不同的行情需要用不同的指标来研判。我能否根据不同的开仓条件设置不同的止损价差呢?

比如传统模型编写平仓条件没有对不同的开仓条件加以区分。

以下代码是一个简单的传统的不区分开仓条件的策略:

MA5^^MA(C,5);
MA10^^MA(C,10);
RSV:=(CLOSE-LLV(LOW,9))/(HHV(HIGH,9)-LLV(LOW,9))*100;
K..SMA(RSV,3,1);
D..SMA(K,3,1);
CROSS(MA5,MA10)||CROSS(K,D),BK;
C>HV(H,10)||C<BKPRICE-5*MINPRICE,SP;
AUTOFILTER;

而使用分组指令则不同

分组指令可以对开平条件分成n个组,某个组的条件开的仓位只有某个组对应的平仓条件条件才能平,其他组的平仓条件满足不会出信号,也就不会委托。

例如:

第一组做多条件

MA5^^MA(C,5);
MA10^^MA(C,10);
CROSS(MA5,MA10),BK;
CROSS(MA10,MA5),SP;

第二组做多条件

RSV:=(CLOSE-LLV(LOW,9))/(HHV(HIGH,9)-LLV(LOW,9))*100;
K..SMA(RSV,3,1);
D..SMA(K,3,1); 
CROSS(K,D),BK; 
C>HV(H,10)||C<BKPRICE-5*MINPRICE,SP;

在同一个模型中如何区分不同组的条件那?让我们来将他们实现。

分组指令的编写方法

首先,模型分为过滤模型和非过滤模型:

  • 过滤模型:不同的开仓条件想以不同的平仓条件来平仓,可以使用指令分组来实现。

  • 非过滤模型:首次入场策略与加仓策略不同,想以不同的止损平仓策略来平仓,可以使用指令分组来实现。

过滤模型

//A组指令
A组的开多条件,BK('A');
A组的开空条件,SK('A');
A组的平多条件,SP('A');
A组的平空条件,BP('A');
//B组指令
B组的开多条件,BPK('B');
B组的开空条件,SPK('B');
B组的平多条件,SP('B');
B组的平空条件,BP('B');
AUTOFILTER;//过滤函数

注意:过滤模型的分组是需要在交易指令后加入组别并用单引号括起来。如BK(‘A’)

非过滤模型

//A组指令
A组的开多条件1,BK('A',2);
A组的开空条件1,SK('A',2);
A组的加多条件2,BK('A',1);
A组的加空条件2,SK('A',1);
A组的平多条件,SP('A',GROUPBKVOL('A'));
A组的平空条件,BP('A',GROUPSKVOL('A'));
//B组指令
B组的加多条件,BK('B',1);
B组的加空条件,SK('B',1);
B组的平多条件1,SP('B',GROUPBKVOL('B'));
B组的平空条件1,BP('B',GROUPSKVOL('B'));

注意:非过滤模型的分组是需要在交易指令后加入组别和手数的,组别需要用单引号括起来。 如BK(‘A’,2)

分组指令的运行机制

过滤模型:先是组过滤再信号过滤

  • 组过滤是指:如果上一根K线信号是组A发出的开仓信号(BK SK BPK SPK) 当前K线只能是组A的平仓信号。如果上一根K线信号是组A发出的平仓信号(BP SP) 当前K线可以是任意组的开仓信号。(以信号出现的顺序取第一个开仓信号)

  • 不分组的平仓条件只能平不分组的开仓条件

信号过滤是指:开平信号的过滤

优先顺序为:

  • 上一根K线是BK  当前K线必须是SPK或SP (SPK优先于SP,以下同理)
  • 上一根K线是SK  当前K线必须是BPK或BP
  • 上一根K线是BP  当前K线必须是BK或SK
  • 上一根K线是SP  当前K线必须是BK或SK
  • 上一根K线是BPK 当前K线必须是SPK或SP
  • 上一根K线是SPK 当前K线必须是BPK或BP

非过滤模型:

  • 如果上一个信号为组A发出的开仓信号,则下一信号必须为组A的加仓信号或平仓信号。
  • 如果上一个信号为组A的平仓信号并且组A持仓为0,下一信号可以为任意组的开仓信号。
  • 如果A组持仓大于0,则必须为A组的开仓信号或平仓信号。 注意:不分组的平仓条件只能平不分组的开仓条件

分组指令的案例分析

接下来,我们以几个策略为例子,看看编写代码时,是怎么分组这些指令的。

过滤模型

交易思路:以20周期和60周期均线金叉死叉作为趋势判断标准。

  • 在20周期均线大于60周期均线之上做多。反之做空。
  • 在做多趋势内,如果最高价创10根k线新高且为阳线,趋势做多。平仓时,以较大止损点止损平仓或者出现均线死叉平仓。做空反之。
  • 在做多趋势内,如果KDJ指标金叉且为阳线,波段做多。平仓时,以较小止损点止损平仓或者跌破波段开仓k线最低点止损平仓。做空反之。

代码:

MA20^^MA(C,20);
MA60^^MA(C,60);
RSV:=(CLOSE-LLV(LOW,9))/(HHV(HIGH,9)-LLV(LOW,9))*100;
K:=SMA(RSV,3,1);
D:=SMA(K,3,1);
J:=3*K-2*D;
HH:=HV(H,10);
LL:=LV(L,10);
MA20>MA60&&H>HH&&C>O,BK('A');
MA20<MA60&&L<LL&&C<O,SK('A');
L<LV(L,5)||CROSSDOWN(MA20,MA60)||C<BKPRICE-5*MINPRICE,SP('A');
H>HV(H,5)||CROSSUP(MA20,MA60)||C>SKPRICE+5*MINPRICE,BP('A');//只平A组开仓
MA20>MA60&&CROSSUP(K,D)&&C>O,BK('B');
MA20<MA60&&CROSSDOWN(K,D)&&C<O,SK('B');
C>BKPRICE+5*MINPRICE||C<BKPRICE-2*MINPRICE||C<REF(L,BARSBK),SP('B');
C<SKPRICE-5*MINPRICE||C>SKPRICE+2*MINPRICE||C>REF(H,BARSSK),BP('B');//只平B组开仓
//不同的开仓条件开仓,用不同的平仓条件,有针对性的平仓。达到不同行情试用不同策略的目的。
AUTOFILTER;

非过滤模型

交易思路:以5周期和10周期均线金叉死叉作为首次开仓的条件。

  • 在首次开多仓且没有平仓之前5周期和60周期均线金叉加多仓。在首次开空仓且没有平仓之前5周期和60周期均线死叉加空仓。
  • 在5周期大于60周期趋势下,最高价创10根k线新高,再第二次加多仓。在5周期小于60周期趋势下,最低价创10根k线新低,再第二次加空仓。
  • 对于第一次加多仓后,以创5根k线新低或较小止损点平仓。平空反之。
  • 对于第二次加多仓后,以5周期和60周期均线死叉平仓。平空反之。

代码:

MA5^^MA(C,5);
MA10^^MA(C,10);
MA20:=MA(C,20);
MA60^^MA(C,60);
RSV:=(CLOSE-LLV(LOW,9))/(HHV(HIGH,9)-LLV(LOW,9))*100;
K:=SMA(RSV,3,1);
D:=SMA(K,3,1);
J:=3*K-2*D;
HH:=HV(H,10);
LL:=LV(L,10);
CROSSUP(MA5,MA10)&&BKVOL=0&&C>=O,BK('A',2);
CROSSDOWN(MA5,MA10)&&SKVOL=0&&C<=O,SK('A',2);
CROSSUP(MA5,MA60)&&ISLASTBK&&BKVOL=2,BK('A',1);
CROSSDOWN(MA5,MA60)&&ISLASTSK&&SKVOL=2,SK('A',1);
MA5>MA60&&H>HH&&ISLASTSP&&REF(GROUPBKVOL('A'),BARSSP+1)>0,BK('B',1);
MA5<MA60&&L<LL&&ISLASTBP&&REF(GROUPSKVOL('A'),BARSBP+1)>0,SK('B',1);
L<LV(L,5)||C<REF(L,BARSBK)&&(C<BKPRICE-2*MINPRICE),SP('A',GROUPBKVOL('A'));
H>HV(H,5)||C>REF(H,BARSSK)&&(C>SKPRICE+2*MINPRICE),BP('A',GROUPSKVOL('A'));
C>BKPRICE+10*MINPRICE||CROSSDOWN(MA5,MA60),SP('B',BKVOL);
C<SKPRICE-10*MINPRICE||CROSS(MA5,MA60),BP('B',SKVOL);

以上就是对这两类模型的具体案例分析,读者可以从中看到My语言对于分组指令的处理方式,大家可以根据自己的策略逻辑制定不同的分组要求,这样可以尽量把想要表达的策略逻辑在代码中以最清晰且错误最少的方式表现出来。


More