期货软件TB系统源代码解读系列19-函数上穿、下跌

函数上穿CrossOver与下跌CrossUnder,其实是很方便的一对函数术语,调用也很简练。可怎么说呢,这两我一般不怎么喜欢用,不是因为什么不好,只是个人习惯而已。这两函数算法没什么好说的,看字面意思都明白了,具体用代码怎么表达呢,我们来看看这代码编写的,如下:

函数CrossOver代码:

Params

NumericSeries Price1(1); //声明数值序列参数Price1,初始值为1.//

NumericSeries Price2(1); //声明数值序列参数Price2,初始值为1.//

Vars

Bool Con1(False); //声明布尔型变量Con1,初始判断为假。//

Bool PreCon(False); //声明布尔型变量PreCon,初始判断为假。//

Numeric Counter(0); //声明数值变量Counter,初值为0.//

Begin

If(Price1 > Price2) //假如价格Price1 大于Price2.//

{

Counter = 1;//变量Counter值等于1.//

Con1 = Price1[1] == Price2[1]; // 前一价格Price1等于前一价格Price2,把这两价格赋值给布尔型变量Con1//

While (Con1 and Counter < CurrentBar)//这也是一个循环语句,当布尔型变量Con1为真,并且Counter值小于当前k线索引值。//

{

Counter = Counter + 1; //变量Counter = 前一个Counter值 +1//

Con1 = Price1[Counter] == Price2[Counter];//布尔型变量Con1值随着变量Counter值变化了,即Counter值月大,k线的价格往回倒腾数位越多。//

}

PreCon = Price1[Counter] < Price2[Counter];//当k线返回索引价格Price2大于价格Price1时,把数值赋值给布尔型变量PreCon。这些运算符的先后顺序,跟数学运算符差不多,一般都是先乘除后加减(* / + -),次判断大小(<>),最后才是赋值(=)//

Return PreCon;//把布尔型变量值PreCon返回给主函数。//

}Else//就是假如价格Price1小于或等于Price2时。//

{

Return False; //返回给主函数是一个错误值,也就是没有值反馈回去了。//

}

End

看着不难吧,也是一步步翻译下来,就是同一根k线上,依据不同算法当价格1大于价格2了,比如均线10与均线120,在同一根k线上,体现出来是不一样的吧,所以才有了这上穿和下跌的。

函数CrossUnder代码,解读其实是一样的,就是条件改一下,价格Price1小于Price2时,怎么处理,如下:

Params

NumericSeries Price1(1);

NumericSeries Price2(1);

Vars

Bool Con1(False);

Bool PreCon(False);

Numeric Counter(0);

Begin

If(Price1 < Price2)

{

Counter = 1;

Con1 = Price1[1] == Price2[1];

While (Con1 and Counter < CurrentBar)

{

Counter = Counter + 1;

Con1 = Price1[Counter] == Price2[Counter];

}

PreCon = Price1[Counter] > Price2[Counter];

Return PreCon;

}Else

{

Return False;

}

End

解读完这两函数,我们可以调用KD指标直接试着做一个简单的程序化,看用这两函数与不用这两函数,交易时可有差异的。第一个用这两函数的代码及结果,如下:

Params

Numeric Length(14);

Numeric SlowLength(3);

Numeric SmoothLength(3);

Vars

NumericSeries HighestValue;

NumericSeries LowestValue;

NumericSeries KValue;

Numeric SumHLValue;

Numeric SumCLValue;

NumericSeries DValue;

Bool condition1;

Bool condition2;

Begin

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);

If(!CallAuctionFilter()) Return;

condition1 = CrossOver(KValue[1],DValue[1]);

condition2 = CrossUnder(KValue[1],DValue[1]);

If(MarketPosition <>1 And condition1)

{

Buy(1,Open);

}

If(MarketPosition <> -1 And condition2)

{

SellShort(1,Open);

}

End


第二个,不用那两函数的,代码及结果如下:

Params

Numeric Length(14);

Numeric SlowLength(3);

Numeric SmoothLength(3);

Vars

NumericSeries HighestValue;

NumericSeries LowestValue;

NumericSeries KValue;

Numeric SumHLValue;

Numeric SumCLValue;

NumericSeries DValue;

Begin

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);

If(!CallAuctionFilter()) Return;

If(MarketPosition <>1 And KValue[1] > DValue[1])

{

Buy(1,Open);

}

If(MarketPosition <> -1 And KValue[1] < DValue[1])

{

SellShort(1,Open);

}

End


上下两图对比看到了吧,基本是没有差别的,这也是为什么我一般懒得用它们的原因。当然你们要是不相信可以直接试对比一下的,这两函数用的时候记得声明为布尔型的就可以。很简单吧,代码没有我们想像的那么难,自己做程序化的交易也不是很难的,算法(即交易买卖规则)才是灵魂。

你可能感兴趣的:(期货软件TB系统源代码解读系列19-函数上穿、下跌)