雖然我們經(jīng)常說這些均線啊启盛、MACD啊或KD線等都是莊家忽悠散戶的,根本信不了葛家,可我想說的是户辞,你真的把它們做成固定的程序了嗎,照著這些程序化做過一段時(shí)間實(shí)盤嗎癞谒?當(dāng)然底燎,最好的還是先照著程序化來做一段時(shí)間模擬盤,了解這個(gè)程序的優(yōu)缺點(diǎn)弹砚,盈虧比双仍,操作風(fēng)格等全面了解了,才能真的照著程序來執(zhí)行迅栅。要不然殊校,剛好碰到一段時(shí)間的虧損,心里就開始對(duì)這些程序產(chǎn)生懷疑读存,隨之棄掉为流,返回自己的經(jīng)驗(yàn)做了。
好了让簿,也不廢話了敬察,我們還是來先看看KD指標(biāo)需要用到的函數(shù)吧,咱先對(duì)各個(gè)函數(shù)做個(gè)正確認(rèn)知尔当。
HighestFC求最高的函數(shù)代碼:
Params
NumericSeries Price(1);//聲明數(shù)值型序列參數(shù)莲祸,價(jià)格為Price蹂安,賦值為1。//
Numeric Length(10);//聲明數(shù)值型參數(shù)為Length锐帜,賦值為10田盈。//
Vars
Numeric HighestValue;//聲明變量為HighestValue。//
Numeric ExtremesBar;//聲明變量為ExtremesBar缴阎。//
Begin
HighestValue = Extremes(Price, Length, True, ExtremesBar);//Extremes求極值函數(shù)允瞧,語句意思是這樣的:計(jì)算10周期以來價(jià)格的極大值和極大值出現(xiàn)的回溯周期索引 。//
Return HighestValue;//把得到的數(shù)值返回給主函數(shù)蛮拔。//
End
LowestFC的源代碼如下述暂,解釋基本同求最大值:
Params
NumericSeries Price(1);
Numeric Length(10);
Vars
Numeric LowestValue;
Numeric ExtremesBar;
Begin
LowestValue = Extremes(Price, Length, False, ExtremesBar); //計(jì)算10周期以來價(jià)格的極小值和極小值出現(xiàn)的回溯周期索引。//
Return LowestValue;
End
還用到了這個(gè)函數(shù)SummationFC建炫,代碼如下:
Params
NumericSeries Price(1);//聲明數(shù)值型序列參數(shù)畦韭,價(jià)格為Price,賦值為1肛跌。//
Numeric Length(10);//聲明數(shù)值型參數(shù)為Length艺配,賦值為10。//
Vars
NumericSeries SumValue(0);//聲明數(shù)值型序列變量為Sumvalue惋砂,賦值為0妒挎。//
Numeric i;//聲明變量 i 。//
Begin
If(CurrentBar < Length)//CurrentBar西饵,直白意思就是當(dāng)前的K線數(shù)位酝掩,我們聲明參數(shù)Length初始值為10,這語句意思就是說假如當(dāng)前的K線數(shù)位小于10的眷柔,執(zhí)行下列的語句期虾。//
{
SumValue = 0;//這邊再次賦值給SumValue為0。//
for i = 0 to Length - 1 //這是循環(huán)語句驯嘱,變量i從賦值為0镶苞,開始執(zhí)行,直到數(shù)值為10-1=9鞠评,結(jié)束循環(huán)茂蚓。//
{
SumValue = SumValue + Price[i];//其實(shí)從if開始到現(xiàn)在的語句,整體表達(dá)的意思是這樣的剃幌,前10根k線價(jià)格是這樣求的聋涨,SumValue=P0+P1+P2+P3+...+P9,前10根k線價(jià)格累加起來负乡。//
}
}Else //從第11根k線開始牍白,執(zhí)行下列的語句來求和。//
{
SumValue = SumValue[1] + Price - Price[Length];//我們記住一個(gè)規(guī)則是這樣的抖棘,價(jià)格為當(dāng)前K線的價(jià)格茂腥,所以Price[10],意思告訴你減去最前一根狸涌。比如,第11根k線最岗,前10根總價(jià)帕胆,加上第11根的價(jià)格,減去第一根k線的價(jià)格般渡,得到了一個(gè)新總價(jià)S1惶楼;第12根,則是新總價(jià)S1诊杆,加上當(dāng)前12根價(jià)格,再減去第2根的價(jià)格何陆,得到一個(gè)新的總價(jià)S2晨汹。反正就是這么來回的求10根k線的總價(jià)了。//
}
Return SumValue;//把這總價(jià)數(shù)值返回給主函數(shù)了贷盲。//
End
接下來為正餐淘这,就是KD指標(biāo)的真正代碼了:
Params
Numeric Length(14);//聲明數(shù)值型參數(shù)Length,初始值為14.//
Numeric SlowLength(3); //聲明數(shù)值型參數(shù)SlowLength,初始值為3.//
Numeric SmoothLength(3);//聲明數(shù)值型參數(shù)SmoothLength巩剖,初始值為3.//
Vars
NumericSeries HighestValue; //聲明數(shù)值型序列變量HighestValue铝穷。//
NumericSeries LowestValue;//聲明數(shù)值型序列變量LowestValue。//
NumericSeries KValue;//聲明數(shù)值型序列變量KValue佳魔。//
Numeric SumHLValue;//聲明數(shù)值型變量SumHLValue曙聂。//
Numeric SumCLValue;//聲明數(shù)值型變量SumCLValue。//
Numeric DValue;//聲明數(shù)值型變量DValue鞠鲜。//
Begin
HighestValue = HighestFC(High, Length);//把高價(jià)和周期實(shí)參數(shù)返回函數(shù)HighestFC去求值宁脊,再把最高值返回來給這個(gè)主函數(shù)。//
LowestValue = LowestFC(Low, Length); //同理的贤姆,求出最低值來榆苞。//
SumHLValue = SummationFC(HighestValue-LowestValue,SlowLength);//返回函數(shù)SummationFC去求值,這個(gè)咱也可以一個(gè)個(gè)對(duì)應(yīng)上去的霞捡,把最高 - 最低得到的值替代Price坐漏,SlowLength的值3替代Length的值10,最后求出總價(jià)碧信。//
SumCLValue = SummationFC(Close - LowestValue,SlowLength);//同理赊琳,求出收盤價(jià)減去最低價(jià)的3個(gè)周期總價(jià)。//
If(SumHLValue <> 0)//假如最高減去最低的3個(gè)周期的總價(jià)不等于0音婶,執(zhí)行下列語句慨畸。//
{
KValue = SumCLValue/SumHLValue*100;//看表達(dá)式就直白翻譯了,最高減去最低的總價(jià)除以收盤價(jià)減去最低價(jià)的總價(jià)衣式,再乘以100.//
}Else//否則就是等于0了寸士。//
{
KValue = 0;//這個(gè)也等于0了檐什。//
}
DValue = AverageFC(KValue,SmoothLength);//這個(gè)函數(shù)AverageFC在系列2說過了,反正也就是把相應(yīng)的值跟周期返回去求解出新的值來了弱卡,再把這新值乃正,返回來給這個(gè)DValue。//
PlotNumeric("K",KValue);//畫線了婶博,線k代表KValue值瓮具。//
PlotNumeric("D",DValue);//線D代表DValue值。//
PlotNumeric("Ref1",20);//這是界限20凡人,輔助我們判斷是否超買賣的名党。//
PlotNumeric("Ref2",80);//這是界限80,同上挠轴。//
End
同理传睹,最后我能附上的,也就是添加一個(gè)用它做成的程序化交易系統(tǒng)了岸晦。至于這結(jié)果如何欧啤,我只能說真是很不盡如人意,關(guān)鍵就是在買賣的點(diǎn)位上了启上,這能不能改進(jìn)邢隧?該如何改進(jìn),我還真是想不出辦法的冈在。只能說倒慧,這是一個(gè)輔助判斷系統(tǒng),當(dāng)成程序化進(jìn)行買賣包券,結(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 && KValue[1] > DValue[1] && DValue < 30)
{
Buy(1,Open);
}
If(MarketPosition ==1 && KValue[1] < DValue[1] || DValue >95)
{
Sell(1,Open);
}
If(MarketPosition <>-1 && KValue[1] < DValue[1] && DValue > 70)
{
SellShort(1,Open);
}
If(MarketPosition ==-1 && KValue[1] > DValue[1] || DValue <5)
{
BuyToCover(1,open);
}
End