金字塔公式 金字塔模型策略源码:runmode:0;
input:unitoftime(15,5,15,5),length(4,1,6,1);
input:initialstop(2,2,6,1),trailingstop(4,2,6,1);
input:startdate(1110104,1,9999999,1),intraday(1,0,1,1);
input:money(0,0,10,1);
input:slippage(0,0,2,1);
input:debug(2,0,2,1);
variable:costprice=0,stopline=0;
variable:myasset=50000,mycurve=0;
if initialstop>trailingstop then exit;
if startdate>1 and date<startdate then exit;
database(\'provider=microsoft.jet.oledb.4.0;data source=e:\\Trade\\Report\\Report.mdb\');
begin
if stricmp(marketlabel,\'sq\')=0 then
label:=strleft(stklabel,2);
if stricmp(marketlabel,\'dq\')=0 then
label:=strleft(stklabel,1);
if stricmp(marketlabel,\'zq\')=0 then
label:=strleft(stklabel,2);
if stricmp(marketlabel,\'zj\')=0 then
label:=strleft(stklabel,2);
if stricmp(label,\'cf\')=0 then begin
marginratio:=0.17;
commission:=12;
tradeable:=true;
end
if stricmp(label,\'sr\')=0 then begin
marginratio:=0.16;
commission:=6;
tradeable:=true;
end
if not(tradeable) then exit;
end
begin
entertime1:=t0totime(timetot0(opentime(1))+60*(unitoftime+2));
entertime2:=t0totime(timetot0(closetime(0))-60);
exittime1:=t0totime(timetot0(closetime(0)));
entertime:=time>=entertime1 and time<=entertime2;
exittime:=time>=exittime1;
cond:=day<>ref(day,1) or barpos=1;
n:=barpos-valuewhen(cond,barpos)+1;
settlementprice:=trimprice(sum(amount,n)/sum(vol,n)/multiplier);
period:=unitoftime*length;
atr:=trimprice(ref(ma(tr,unitoftime),1)+mindiff);
initialstopnum:=atr*initialstop;
trailingstopnum:=atr*trailingstop;
slippagenum:=slippage*mindiff;
topband:=ref(hhv(high,period),1)+mindiff;
botband:=ref(llv(low,period),1)-mindiff;
longcond:=barpos>=period and entertime and high>=topband;
longprice:=max(topband,open);
shortcond:=barpos>=period and entertime and low<=botband;
shortprice:=min(botband,open);
enterhour:=ref(hour,enterbars);
enterminute:=ref(minute,enterbars);
end
if debug=1 and ((startdate=1 and barpos=1) or date=startdate) then begin
dbexecute(\'drop table 设置\');
dbexecute(\'drop table 权益\');
dbexecute(\'drop table 交易明细\');
dbexecute(\'drop table 账户\');
dbexecute(\'create table 设置(品种 text,周期 text,时间 text,初始资金 number,保证金率 number,佣金滑点 text)\');
dbexecute(\'create table 权益(日期 datetime,权益 number,平仓盈亏 number,累计盈亏 number)\');
dbexecute(\'create table 交易明细(开仓日期 datetime,合约名称 text,开仓时间 datetime,开仓价格 number,交易类型 text,平仓时间 datetime,平仓价格 number,盈亏点数 number,交易手数 number,总手续费 number,平仓盈亏 number)\');
if commission>1 then
comm:=numtostr(commission,0);
else
comm:=numtostr(commission*10000,2)+\'%%\';
dwdate:=date[datacount];
nyear:=intpart(dwdate/10000+1900);
nmonth:=intpart(dwdate/100%100);
nday:=intpart(dwdate%100);
ndate:=numtostr(year,0)+\'/\'+numtostr(month,0)+\'/\'+numtostr(day,0)+\'-\'+numtostr(nyear,0)+\'/\'+numtostr(nmonth,0)+\'/\'+numtostr(nday,0);
dbexecute(\'insert into 设置(品种,周期,时间,初始资金,保证金率,佣金滑点) values("\'+stkname+\'","1分钟","\'+ndate+\'",500000,\'+numtostr(marginratio,2)+\',"\'+comm+\' & \'+numtostr(slippage,0)+\'")\');
end
if holding=0 then begin
costprice:=0;
stopline:=0;
end
if holding=0 then begin
price:=0;
lots:=0;
if longcond then
price:=longprice;
if price>0 then begin
mycash:=cash(0);
lots1:=intpart(mycash/(price*multiplier*marginratio));
if money=0 then begin
lots:=lots1;
end else begin
lots2:=intpart(mycash*0.01*money/(initialstopnum*multiplier));
lots:=min(lots1,lots2);
end
end
if lots>=1 then
buy(1,lots,limitr,price+slippagenum);
end
if holding=0 then begin
price:=0;
lots:=0;
if shortcond then
price:=shortprice;
if price>0 then begin
mycash:=cash(0);
lots1:=intpart(mycash/(price*multiplier*marginratio));
if money=0 then begin
lots:=lots1;
end else begin
lots2:=intpart(mycash*0.01*money/(initialstopnum*multiplier));
lots:=min(lots1,lots2);
end
end
if lots>=1 then
buyshort(1,lots,limitr,price-slippagenum);
end
if holding>0 then begin
price:=0;
lots:=holding;
if exittime then begin
if intraday=0 then begin
price:=open;
end else begin
if costprice<settlementprice and settlementprice<stopline then
exit;
else
price:=close;
end
end
begin
if stopline>0 and low<=stopline then
price:=min(stopline,open);
if stopline=0 then begin
if commission>1 then
costprice:=trimprice(enterprice+2*commission/multiplier)+mindiff;
else
costprice:=trimprice(enterprice*(1+commission)/(1-commission))+mindiff;
stopline:=costprice-initialstopnum;
end
if stopline<costprice and high-initialstopnum>=costprice then
stopline:=costprice;
if stopline>=costprice and high-trailingstopnum>stopline then
stopline:=high-trailingstopnum;
end
if price>0 then begin
sell(1,lots,limitr,price-slippagenum);
if debug=1 then begin
if commission>1 then
commission:=2*commission*lots;
else
commission:=(enterprice+exitprice)*multiplier*commission*lots;
sql:=\'insert into 交易明细(开仓日期,合约名称,开仓时间,开仓价格,交易类型,平仓时间,平仓价格,盈亏点数,交易手数,总手续费,平仓盈亏) values("\'+
numtostr(year,0)+\'-\'+numtostr(month,0)+\'-\'+numtostr(day,0)+\'","\'+stklabel+\'","\'+
numtostr(enterhour,0)+\':\'+numtostr(enterminute,0)+\'",\'+numtostr(enterprice,2)+\',"Buy","\'+
numtostr(hour,0)+\':\'+numtostr(minute,0)+\'",\'+numtostr(exitprice,2)+\',\'+
numtostr(exitprice-enterprice,2)+\',\'+numtostr(lots,0)+\',\'+numtostr(commission,0)+\',\'+
numtostr((exitprice-enterprice)*multiplier*lots,2)+\')\';
dbexecute(sql);
end
end
end
if holding<0 then begin
price:=0;
lots:=-holding;
if exittime then begin
if intraday=0 then begin
price:=open;
end else begin
if costprice>settlementprice and settlementprice>stopline then
exit;
else
price:=close;
end
end
begin
if stopline>0 and high>=stopline then
price:=max(stopline,open);
if stopline=0 then begin
if commission>1 then
costprice:=trimprice(enterprice-2*commission/multiplier)-mindiff;
else
costprice:=trimprice(enterprice*(1-commission)/(1+commission))-mindiff;
stopline:=costprice+initialstopnum;
end
if stopline>costprice and low+initialstopnum<=costprice then
stopline:=costprice;
if stopline<=costprice and low+trailingstopnum<stopline then
stopline:=low+trailingstopnum;
end
if price>0 then begin
sellshort(1,lots,limitr,price+slippagenum);
if debug=1 then begin
if commission>1 then
commission:=2*commission*lots;
else
commission:=(enterprice+exitprice)*multiplier*commission*lots;
sql:=\'insert into 交易明细(开仓日期,合约名称,开仓时间,开仓价格,交易类型,平仓时间,平仓价格,盈亏点数,交易手数,总手续费,平仓盈亏) values("\'+
numtostr(year,0)+\'-\'+numtostr(month,0)+\'-\'+numtostr(day,0)+\'","\'+stklabel+\'","\'+
numtostr(enterhour,0)+\':\'+numtostr(enterminute,0)+\'",\'+numtostr(enterprice,2)+\',"Sell","\'+
numtostr(hour,0)+\':\'+numtostr(minute,0)+\'",\'+numtostr(exitprice,2)+\',\'+
numtostr(enterprice-exitprice,2)+\',\'+numtostr(lots,0)+\',\'+numtostr(commission,0)+\',\'+
numtostr((enterprice-exitprice)*multiplier*lots,2)+\')\';
dbexecute(sql);
end
end
end
if exittime then begin
closeprofit:=asset-myasset;
myasset:=asset;
mycurve:=mycurve+closeprofit;
if debug=1 then begin
sql:=\'insert into 权益(日期,权益,平仓盈亏,累计盈亏) values("\'+numtostr(year,0)+\'-\'+numtostr(month,0)+\'-\'+numtostr(day,0)+\'",\'+numtostr(myasset,2)+\',\'+numtostr(closeprofit,2)+\',\'+numtostr(mycurve,2)+\')\';
dbexecute(sql);
end
end
if holding>0 then begin
drawicon(stopline<costprice,stopline,11);
drawicon(stopline=costprice,stopline,12);
drawicon(stopline>costprice,stopline,10);
end
if holding<0 then begin
drawicon(stopline>costprice,stopline,11);
drawicon(stopline=costprice,stopline,12);
drawicon(stopline<costprice,stopline,10);
end
if debug=2 then begin
盈亏:mycurve,noaxis,colormagenta;
收益:(myasset-50000)/50000,linethick0;
次数:totaltrade,linethick0;
胜率:percentwin,linethick0;
连亏:maxseqloss,linethick0;
连赢:maxseqwin,linethick0;
end
复制上述代码粘贴到到公式管理器