[PEL] 复制代码
variable:up:=0,down:=0,l1:=0,h1:=0;//up是开多基准价
input:n(5,1,100,1);
//首次开仓以历史上第一根k为基准
if holding=0 and barpos=1 then
begin
up:=l+n*mindiff;
l1:=l;
down:=h-n*mindiff;
h1:=h;
end
//常规止损以收盘价和持仓均价差值为基准判断
if avgenterprice-c>=n*mindiff and holding>0 then
begin
多止损:sell(1,holding,marketr);
//平后立刻重置全局变量
up:=l+n*mindiff;
l1:=l;
down:=h-n*mindiff;
h1:=h;
end
if c-avgenterprice>=n*mindiff and holding<0 then
begin
空止损:sellshort(1,holding,marketr);
//平后立刻重置全局变量
up:=l+n*mindiff;
l1:=l;
down:=h-n*mindiff;
h1:=h;
end
if up>l1+2*n*mindiff and c<hhv(c,enterbars+1)-1.5*n*mindiff and holding>0 then
begin
sell(1,holding,marketr);
buyshort(holding=0,1,marketr);
//开仓后立刻重置全局变量
down:=h-n*mindiff;
h1:=h;
end
if down<h1-2*n*mindiff and c>llv(c,enterbars+1)+1.5*n*mindiff and holding<0 then
begin
sellshort(1,holding,marketr);
buy(holding=0,1,marketr);
up:=l+n*mindiff;
l1:=l;
end
//突破是以收盘价为基准
if cross(c,up) and holding<5 and holding>=0 then
begin
up:=up+n*mindiff;
buy(1,1,marketr);
end
//突破是以收盘价为基准
if cross(down,c) and holding>-5 and holding<=0 then
begin
down:=down-n*mindiff;
buyshort(1,1,marketr);
end
//这2个就是多空加仓的基准线
upx:up;
downx:down;
1.所有判断均是以收盘价为基准,比如最高价超过基准价格2*N,但是收盘价没突破,不开仓。
这个你可以自行修改下。但是考虑到图表回测都是采用K线结束时候的价格,我这里就用最终的收盘价作为突破,止损,移动止盈的判断依据了。
2.你逻辑里是没有初始开仓条件的。所以这里就只能用第一个K的H和L来计算最初的2个基准线了。
所有开仓,平仓位置 都会重新计算基准线,下次开多或者开空 都是以最近一次信号位置的基准线为准。
建议有一定编写基础后理解了思路再尝试进一步微调修改你的代码。上面代码只是提供思路范例。 |