之前介紹過畫水平線,金魔方還可以通過波峰、波谷點(diǎn)函數(shù)自動畫出趨勢線并據(jù)此交易,讓我們看看這個(gè)公式:
//-------金魔方智能交易公式--------------
//例6_1 自動趨勢線交易加分級鎖定盈利策略
//用于5分鐘周期
{策略:
1.在當(dāng)天5分鐘周期走勢上自動畫出下降趨勢線
2.突破下降趨勢線買入
3.當(dāng)最大浮盈達(dá)到10點(diǎn)后,把盈利鎖定在買入價(jià)之上1點(diǎn)
4.當(dāng)最大浮盈達(dá)到20點(diǎn)后,把盈利鎖定在買入價(jià)之上8點(diǎn)
5.當(dāng)最大浮盈達(dá)到30點(diǎn)后,把盈利鎖定在買入價(jià)之上10點(diǎn)
6.買入價(jià)之上50點(diǎn)為止盈位,買入價(jià)之下10點(diǎn)為止損位
}
input: 波峰強(qiáng)度(3);
const: 點(diǎn)數(shù)量(5);
array: 波峰點(diǎn)日期[點(diǎn)數(shù)量](0),波峰點(diǎn)時(shí)間[點(diǎn)數(shù)量](0),波峰點(diǎn)數(shù)值[點(diǎn)數(shù)量](0);
variable: 下降線ID(-1), 起點(diǎn)下標(biāo)(0);
if Date <> Date[1] then begin //每個(gè)交易日內(nèi)重新找趨勢線
// print('=============', Date, '=============');
下降線ID := -1;
for pos=0 to 點(diǎn)數(shù)量 do begin //清空數(shù)組
波峰點(diǎn)日期[pos]:=0; 波峰點(diǎn)時(shí)間[pos]:=0; 波峰點(diǎn)數(shù)值[pos]:=0;
end
end
位置 : SwingHighBar(1,High,波峰強(qiáng)度,波峰強(qiáng)度+1),linethick0;
if 位置 = 波峰強(qiáng)度 then begin //出現(xiàn)新的波峰點(diǎn)
//該波峰點(diǎn)是當(dāng)天的且沒被記錄過
if Date[位置] = Date And Time[位置] <> 波峰點(diǎn)時(shí)間[0] then begin
// print('時(shí)間:', Time/100, ' 波峰強(qiáng)度: ', 波峰強(qiáng)度);
for pos = 點(diǎn)數(shù)量-1 DownTo 0 do begin
波峰點(diǎn)日期[pos+1] := 波峰點(diǎn)日期[pos];
波峰點(diǎn)時(shí)間[pos+1] := 波峰點(diǎn)時(shí)間[pos];
波峰點(diǎn)數(shù)值[pos+1] := 波峰點(diǎn)數(shù)值[pos];
end
//將新波峰點(diǎn)存入數(shù)組下標(biāo)0的位置
波峰點(diǎn)日期[0] := Date[波峰強(qiáng)度];
波峰點(diǎn)時(shí)間[0] := Time[波峰強(qiáng)度];
波峰點(diǎn)數(shù)值[0] := High[波峰強(qiáng)度];
// print('時(shí)間:', 波峰點(diǎn)時(shí)間[0]/100,' 數(shù)值:', 波峰點(diǎn)數(shù)值[0]);
if MarketPosition < 1 then begin //如果未持多倉,更新趨勢線
//找趨勢線起點(diǎn),起點(diǎn)應(yīng)比最近的新波峰點(diǎn)高,才能形成下降趨勢線
for pos = 1 to 點(diǎn)數(shù)量 do begin
if 波峰點(diǎn)數(shù)值[pos] > 波峰點(diǎn)數(shù)值[0] then begin//有更高的
起點(diǎn)下標(biāo) := pos;
pos := 點(diǎn)數(shù)量+1; //For語句中再加1,然后跳出循環(huán)
end
end
if pos <> 點(diǎn)數(shù)量+1 then begin //表示找到有更高的波峰點(diǎn)
// print('TL_SetBegin:', 波峰點(diǎn)時(shí)間[起點(diǎn)下標(biāo)]/100,' 數(shù)值:', 波峰點(diǎn)數(shù)值[起點(diǎn)下標(biāo)]);
// print('TL_SetEnd :', 波峰點(diǎn)時(shí)間[0]/100,' 數(shù)值:', 波峰點(diǎn)數(shù)值[0]);
// if 下降線ID = -1 then
下降線ID := TL_New(Date,Time,High,Date,Time,High);
TL_SetBegin(下降線ID, 波峰點(diǎn)日期[起點(diǎn)下標(biāo)],波峰點(diǎn)時(shí)間[起點(diǎn)下標(biāo)],波峰點(diǎn)數(shù)值[起點(diǎn)下標(biāo)]);
TL_SetEnd(下降線ID, 波峰點(diǎn)日期[0],波峰點(diǎn)時(shí)間[0],波峰點(diǎn)數(shù)值[0]);
end
end
end
end
else begin
TL_SetEnd(下降線ID,Date,Time,TL_GetValue(下降線ID,Date,Time));
end
TLValue:=TL_GetValue(下降線ID,Date,Time);
bEnterLong := CrossOver(C, TLValue);
if Time < 143000 And 下降線ID > -1 And bEnterLong then Buy;
if MarketPosition>0 then begin //持有多頭倉位
Sell('', DEFAULT, EntryPrice+50, 0, OT_LIMIT, OB_NEXTBAR, '止盈');
Sell('', DEFAULT, EntryPrice-10, -1, OT_STOP, OB_NEXTBAR, '止損');
if MaxContractProfit>10*BigPointValue then
Sell('', DEFAULT, EntryPrice+1, -1, OT_STOP, OB_NEXTBAR, '鎖盈1');
if MaxContractProfit>20*BigPointValue then
Sell('', DEFAULT, EntryPrice+8, -1, OT_STOP, OB_NEXTBAR, '鎖盈2');
if MaxContractProfit>30*BigPointValue then
Sell('', DEFAULT, EntryPrice+10, -1, OT_STOP, OB_NEXTBAR, '鎖盈3');
end
SetExitOnClose;
{
注解:
1.const:點(diǎn)數(shù)量(5) 聲明'點(diǎn)數(shù)量'為常量并賦值為5
2.array: 波峰點(diǎn)日期[點(diǎn)數(shù)量](0) 聲明'波峰點(diǎn)日期'為一維數(shù)組并賦初值為0
3.找出最近5個(gè)波峰點(diǎn),波峰點(diǎn)的H大于前后各N個(gè)周期的H,這個(gè)N即為波峰強(qiáng)度
4.新出現(xiàn)一個(gè)波峰點(diǎn)后,就向前找到一個(gè)比它更高的波峰點(diǎn)作為起點(diǎn),連接這兩個(gè)點(diǎn)形成下降趨勢線
5.周期收盤價(jià)上叉下降趨勢線時(shí)買入
6.MarketPosition函數(shù)返回當(dāng)前持倉方向
7.MaxContractProfit為以單口計(jì)算的最大浮動盈利,BigPointValue為1整數(shù)點(diǎn)的單口價(jià)值。
8.print函數(shù)輸出到[公式日志],可用于調(diào)試公式
}
可以看到,9月5日做了2筆趨勢線交易,第1筆“鎖盈1”平倉,第2筆日內(nèi)交易平倉。
這個(gè)公式比較復(fù)雜,本ID在編寫時(shí)用print函數(shù)在一些重要位置輸出(到【公式日志】,可在【量化交易】主菜單下打開)、觀察數(shù)據(jù)進(jìn)行調(diào)試,調(diào)試通過后再把print語句注釋掉。
各位可以試著把本公式中的print語句前的注釋去掉,運(yùn)行公式,看看【公式日志】,有助于理解公式逐根執(zhí)行的邏輯,提升調(diào)試技巧。
公式逐根執(zhí)行及其與逐行執(zhí)行的不同解釋如下:
逐行執(zhí)行:對整個(gè)K線序列逐行地執(zhí)行語句
逐根執(zhí)行:對K線序列逐根地執(zhí)行整個(gè)公式
假設(shè)當(dāng)前有100根K線,公式有2行計(jì)算指標(biāo)值1和指標(biāo)值2的語句
MA1:MA(C,5);
MA2:MA(C,10);
逐行執(zhí)行:
1.執(zhí)行第1行語句,計(jì)算這100根K線的MA1
2.執(zhí)行第2行語句,計(jì)算這100根K線的MA2
逐根執(zhí)行:
1.對第1根K線,執(zhí)行整個(gè)公式,計(jì)算第1根K線的MA1和MA2
2.對第2根K線,執(zhí)行整個(gè)公式,計(jì)算第2根K線的MA1和MA2
...
100.對第100根K線,執(zhí)行整個(gè)公式,計(jì)算第100根K線的MA1和MA2
繼續(xù),當(dāng)有新行情生成第101根K線時(shí)
逐行執(zhí)行:
3.執(zhí)行第1行語句,計(jì)算全部101根K線的MA1
4.執(zhí)行第2行語句,計(jì)算全部101根K線的MA2
逐根執(zhí)行:
101.對第101根K線,執(zhí)行整個(gè)公式,計(jì)算第101根K線的MA1和MA2
智能交易公式默認(rèn)為逐根執(zhí)行,為了能夠?qū)灰走M(jìn)行各種控制
技術(shù)指標(biāo)類公式默認(rèn)為逐行執(zhí)行,為了兼容國內(nèi)的主流公式
逐根執(zhí)行是更靈活的執(zhí)行方式,它能實(shí)現(xiàn)逐行執(zhí)行做不到的功能
對技術(shù)指標(biāo)類公式,可以用編譯開關(guān)#RunMode設(shè)置執(zhí)行模式
#RunMode RUN_BY_BAR //逐根執(zhí)行
#RunMode RUN_BY_SERIES //逐行執(zhí)行
只要控制好風(fēng)險(xiǎn),加上人工干預(yù),網(wǎng)格交易也是一種不錯(cuò)的方法,特別是在外匯市場,金魔方公式如何實(shí)現(xiàn)呢?