【编写技巧】:用指令分组替代TB中IF ELSE嵌套编写,提高测试、加载速度实例 (文华财经)

投资者咨询:【编写技巧】:用指令分组替代TB中IF ELSE嵌套编写,提高测试、加载速度实例 (文华财经)
来源:文华财经  日期:2013-7-1 16:09

在wh8中,使用指令分组的编写方法,可以轻松实现mt4、tb等软件中的复杂的IF ELSE嵌套编写,

并且在最新版wh8中这种编写方法可以提高效果预览、模组加载的速度,最低一倍,最高N倍的效果。

具体编写、改写方法如下例,如有改写需求请直接跟帖。

 

TB中IF ELSE嵌套编写源码:

 

 

Params

  Numeric  Length(9);	// KDJ指标参数1 
Numeric SlowLength(3); // KDJ指标参数2
Numeric SmoothLength(3); // KDJ指标参数3
Numeric FastLength(5); // 短周期参数
Numeric SlowLength1(10); // 长周期参数
Numeric boLength(20); // 四周法则指标参数
Vars
NumericSeries HighestValue; // 定义变量HighestValue
NumericSeries LowestValue; // 定义变量LowestValue
NumericSeries KValue; // 定义KDJ指标中的K变量KValue
NumericSeries HighAfterLongEntry; // 定义变量HighAfterLongEntry
NumericSeries LowAfterShortEntry; // 定义变量LowAfterShortEntry
Numeric SumHLValue; // 定义变量SumHLValue
Numeric SumCLValue; // 定义变量SumCLValue
Numeric DValue; // 定义KDJ指标中的D变量
Numeric MinPoint; // 定义合约最小变动价位变量
NumericSeries DonchianHi; // 定义变量DonchianLo
BoolSeries condBuy1(false); // 做多条件1
BoolSeries condSell1(false); // 做空条件1
BoolSeries condBuy2(false); // 做多条件2
BoolSeries condSell2(false); // 做空条件2
NumericSeries AvgValue1; // 5周期均线变量AvgValue1
NumericSeries AvgValue2; // 10周期均线变量AvgValue2
Numeric M(0); // 定义全局变量M
Numeric M1(0); // 定义全局变量M1
Numeric M2(0); // 定义全局变量M2
Numeric M3(0); // 定义全局变量M3
Begin
MinPoint=MinMove*PriceScale;
M=GetGlobalVar(0);
M1=GetGlobalVar(1);
M2=GetGlobalVar(2);
M3=GetGlobalVar(3);
//定义KDJ指标中的K、D
HighestValue = HighestFC(High, Length);
LowestValue = LowestFC(Low, Length);
SumHLValue = SummationFC(HighestValue-LowestValue,SlowLength);
SumCLValue = SummationFC(Close - LowestValue,SlowLength);
If(SumHLValue <> 0)
{
KValue = SumCLValue/SumHLValue*100;
}Else
{
KValue = 0;
}
DValue = AverageFC(KValue,SmoothLength);
//定义5、10两个周期均线
AvgValue1 = AverageFC(Close,FastLength);
AvgValue2 = AverageFC(Close,SlowLength1);
//定义当天最高价和最低价
if (Date<>Date[1]) //如果当前k线是当天第一根k线
{
HighAfterLongEntry=High;
LowAfterShortEntry=Low;
}Else
{
HighAfterLongEntry=Max(HighAfterLongEntry,High);
LowAfterShortEntry=Min(Low,LowAfterShortEntry);
}
//定义四周周期最高价,最低价
DonchianHi = HighestFC(High[1],boLength);
DonchianLo = LowestFC(Low[1],boLength);
// 计算是否出现了金叉死叉
condBuy1 = CrossOver(AvgValue1,AvgValue2);
condSell1 = CrossUnder(AvgValue1,AvgValue2);
condBuy2 = CrossOver(KValue,DValue);
condSell2 = CrossUnder(KValue,DValue);
//交易部分
If(MarketPosition <>1) //如果当前无多头持仓
{
If(condBuy1[1] == True ) //5周期均线金叉10周期均线条件成立
{
Buy(1,Close); //指令价做多1手
M =1;
}Else
If(condBuy2[1] == True && CurrentContracts() == 0 ) //K线金叉D线条件成立
{
Buy(3,Close); //指令价做多3手
M1 =1;
}
}
If(MarketPosition <>-1) //如果当前无空头持仓
{
If(condSell1[1] ==True ) //5周期均线死叉10周期均线条件成立
{
SellShort(1,Close); //指令价做空1手
M2=1;
}Else
If(condSell2[1] ==True && CurrentContracts() == 0 ) //K线死叉D线条件成立
{
SellShort(3,Close); //指令价做空3手
M3=1;
}
}
If(MarketPosition ==1 ) //如果当前含有多头持仓
{
if(Low <= DonchianLo && M==1 && M1==0) //如果最低价不大于4周k线最低价最小值条件成立
{
Sell(0,Close); //指令价多头全平
}else
IF(Close[1]<HighAfterLongEntry-10*MinPoint && M1==1 &&M==0) //如果指令价小于当天最高价之下10跳条件成立
{
Sell(0,Close); //指令价多头全平
}
}
IF(MarketPosition ==-1 ) //如果当前含有空头持仓
{
if(High >= DonchianHi && M2==1 && M3 ==0) //如果最高价不小于4周k线最高价最大值条件成立
{
BuyToCover(0,Close); //指令价空头全平
}else
IF(Close[1]>LowAfterShortEntry+10*MinPoint && M3==1 && M2==0) //如果指令价大于当天最低价之上10跳条件成立
{
BuyToCover(0,Close); //指令价空头全平
}
}
SetGlobalVar(0,M);
SetGlobalVar(1,M1);
SetGlobalVar(2,M2);
SetGlobalVar(3,M3);
End

上述源码在WH8中编写如下:
MA5:=MA(C,5); //定义5周期均线
MA10:=MA(C,10); //定义10周期均线
RSV:=(CLOSE-LLV(LOW,9))/(HHV(HIGH,9)-LLV(LOW,9))*100;//收盘价与N周期最高值做差,N周期最高值与N周期最低值做差,两差之间做比值。
K:SMA(RSV,3,1); //RSV的移动平均值
D:SMA(K,3,1); //K的移动平均值
N:=BARSLAST(DATE<>REF(DATE,1))+1; //取当天第一根k线到当前k线的周期数
JH:=HHV(H,N); //取当天最高价
JL:=LLV(L,N); //取当天最低价
HH:=HV(H,20); //取前一根k线4周k线最高价
LL:=LV(L,20); //取前一根k线4周k线最低价
CROSS(MA5,MA10),BK('A'); //如果5周期均线金叉10周期均线,做多并设定为A组
CROSS(MA10,MA5),SK('A'); //如果5周期均线死叉10周期均线,做空并设定为A组
L<=LL,SP('A'); //如果最低价不大于4周k线最低价,平多并设定为A组
H>=HH,BP('A'); //如果最高价不小于4周k线最高价,平空并设定为A组
CROSS(K,D),BK('B'); //如果k金叉d,做多并设定为B组
CROSS(D,K),SK('B'); //如果k死叉d,做空并设定为B组
C<=JH-10*MD,SP('B'); //如果价格小于等于当天最高价之下10跳,平多并设定为B组
C>=JL+10*MD,BP('B'); //如果价格大于等于当天最低价之上10跳,平空并设定为B组
AUTOFILTER; //模型为过滤模型
注:MD为最小变动价位,根据合约自行设定。

 

 

 

 
投资者咨询:【编写技巧】:用指令分组替代TB中IF ELSE嵌套编写,提高测试、加载速度实例 (文华财经)
来源:文华财经  日期:2013-7-1 16:09
太多了没仔细看,文华ifelse本来就可以嵌套使用吧.IFELSE(A,B,IFELSE(C,D,E))
技术人员回复
日期:2013-7-3 13:41

是的   IFELSE函数是支持嵌套式使用的。

1楼老师主要推荐的是复杂、逻辑清晰的模型建议使用指令分组。

新版中对后台算法进行了优化,指令分组情况下,可以提高效果测试以及模组加载速度。

投资者咨询:【编写技巧】:用指令分组替代TB中IF ELSE嵌套编写,提高测试、加载速度实例 (文华财经)
来源:文华财经  日期:2013-7-1 16:09

请问:指令分组问题:

开仓分组,平仓是否一定要对应分组?

技术人员回复
日期:2013-7-4 11:28
是的,A组开仓只能对应由A组平仓条件进行平仓
投资者咨询:【编写技巧】:用指令分组替代TB中IF ELSE嵌套编写,提高测试、加载速度实例 (文华财经)
来源:文华财经  日期:2013-7-1 16:09
这个相当于多个 交易条件的“或”,那么多个交易条件的“与”  有没有办法提高效率?或者其他写法?
技术人员回复
日期:2013-7-7 20:45

并且关系也可以使用指令分组的,如果您有具体思路,可以重新发帖,我们在新帖给您交流指导;

 

 

投资者咨询:【编写技巧】:用指令分组替代TB中IF ELSE嵌套编写,提高测试、加载速度实例 (文华财经)
来源:文华财经  日期:2013-7-1 16:09
执行起来,如果A组已经开了多仓, 在有AUTOFILTER;语句时 B组在符合条件时会开多仓、或者空仓吗?
如果是,模型可能持有两手多仓、空仓,也可能一多一空,也可能只有一手空、多仓,。。。。。
技术人员回复
日期:2013-7-16 11:01

不会的。

A组开仓后后续只能出现A组的平仓信号。是不会出现锁仓情况的

投资者咨询:【编写技巧】:用指令分组替代TB中IF ELSE嵌套编写,提高测试、加载速度实例 (文华财经)
来源:文华财经  日期:2013-7-1 16:09

原来分组指令是这样用的图片点击可在新窗口打开查看