时间:2020-04-14 | 栏目:TB交易开拓者策略 | 点击:次
函数上穿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
十年专业期货服务平台,全国最低手续费保证金开户,咨询微信:cclk88