函數(shù)上穿CrossOver與下跌CrossUnder抽莱,其實是很方便的一對函數(shù)術(shù)語范抓,調(diào)用也很簡練∈愁恚可怎么說呢匕垫,這兩我一般不怎么喜歡用,不是因為什么不好虐呻,只是個人習(xí)慣而已象泵。這兩函數(shù)算法沒什么好說的寞秃,看字面意思都明白了,具體用代碼怎么表達(dá)呢偶惠,我們來看看這代碼編寫的蜕该,如下:
函數(shù)CrossOver代碼:
Params
NumericSeries Price1(1); //聲明數(shù)值序列參數(shù)Price1,初始值為1.//
NumericSeries Price2(1); //聲明數(shù)值序列參數(shù)Price2洲鸠,初始值為1.//
Vars
Bool Con1(False); //聲明布爾型變量Con1堂淡,初始判斷為假。//
Bool PreCon(False); //聲明布爾型變量PreCon扒腕,初始判斷為假绢淀。//
Numeric Counter(0); //聲明數(shù)值變量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)//這也是一個循環(huán)語句皆的,當(dāng)布爾型變量Con1為真,并且Counter值小于當(dāng)前k線索引值蹋盆。//
{
Counter = Counter + 1; //變量Counter = 前一個Counter值 +1//
Con1 = Price1[Counter] == Price2[Counter];//布爾型變量Con1值隨著變量Counter值變化了费薄,即Counter值月大,k線的價格往回倒騰數(shù)位越多栖雾。//
}
PreCon = Price1[Counter] < Price2[Counter];//當(dāng)k線返回索引價格Price2大于價格Price1時楞抡,把數(shù)值賦值給布爾型變量PreCon。這些運算符的先后順序析藕,跟數(shù)學(xué)運算符差不多召廷,一般都是先乘除后加減(* / + -),次判斷大姓穗省(<>)竞慢,最后才是賦值(=)//
Return PreCon;//把布爾型變量值PreCon返回給主函數(shù)。//
}Else//就是假如價格Price1小于或等于Price2時治泥。//
{
Return False; //返回給主函數(shù)是一個錯誤值筹煮,也就是沒有值反饋回去了。//
}
End
看著不難吧居夹,也是一步步翻譯下來败潦,就是同一根k線上,依據(jù)不同算法當(dāng)價格1大于價格2了吮播,比如均線10與均線120变屁,在同一根k線上,體現(xiàn)出來是不一樣的吧意狠,所以才有了這上穿和下跌的粟关。
函數(shù)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
解讀完這兩函數(shù)遮晚,我們可以調(diào)用KD指標(biāo)直接試著做一個簡單的程序化性昭,看用這兩函數(shù)與不用這兩函數(shù),交易時可有差異的县遣。第一個用這兩函數(shù)的代碼及結(jié)果糜颠,如下:
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
第二個,不用那兩函數(shù)的萧求,代碼及結(jié)果如下:
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
上下兩圖對比看到了吧其兴,基本是沒有差別的,這也是為什么我一般懶得用它們的原因夸政。當(dāng)然你們要是不相信可以直接試對比一下的元旬,這兩函數(shù)用的時候記得聲明為布爾型的就可以。很簡單吧守问,代碼沒有我們想像的那么難匀归,自己做程序化的交易也不是很難的,算法(即交易買賣規(guī)則)才是靈魂耗帕。