以文本方式查看主题

-  金字塔客服中心 - 专业程序化交易软件提供商  (http://www.weistock.com/bbs/index.asp)
--  交易策略发布专区  (http://www.weistock.com/bbs/list.asp?boardid=10)
----  阿火秘笈_编写技巧十九(12月5日更新_做参数优化时优化指定指标的方法)  (http://www.weistock.com/bbs/dispbbs.asp?boardid=10&id=9439)

--  作者:阿火
--  发布时间:2011/12/20 13:58:52
--  阿火秘笈_编写技巧十九(12月5日更新_做参数优化时优化指定指标的方法)

陆续增加,目录如下:

 

一,“K线走完模式”转换成“固定轮询模式”或者“混合模式”的方法           …………………………见 2楼

二、移动止损的编写方法                                                                         …………………………见 2楼

三、逐K线模式的模型,用免费版下单交易的方法                                         …………………………见 3楼

四、日内满仓反手的写法                                                                         …………………………见 4楼

五、自行计算最大回撤的方法,放到逐K线模式的模型最后面即可                    …………………………见 5楼

六、“后台下单模板”,可用于各种模型                                                    …………………………见 6楼

七、把各种模型组合成一个模型的方法,适用于所有模型                               …………………………见10楼

八、提前N秒下单的方法,适用于各个周期                                                  …………………………见13楼

九、 通过飞信给自己发短信的VBA代码                                                     …………………………见14楼

十、在小周期级别上记录大周期指标的实际走势的方法                                  …………………………见23楼

十一、日内重新计算macd的方法,以避免跳空对指标造成的影响。                 …………………………见23楼

十二、突破模型信号也会消失的一个例子及其处理方法,大家小心。                …………………………见30楼

十三、Andriod系统手机远程控制电脑的方法,随时随心随地监控交易             …………………………见33楼

十四、K线未走完提前下单,次周期自动恢复持仓的写法                                …………………………见38楼

十五、史上最简明的后台下单模板,适用于满仓反手交易                               …………………………见57楼

十六、CTP账户的跟单VBA代码                                                                     …………………………见68楼

十七、后台持仓同步的写法                                                                     …………………………见86楼

十八、 自己在模型里计算盈亏情况的一个简便方法                                      …………………………见89楼

十九、做参数优化时,优化特定指标的方法                                                 ........................................见101楼

[此贴子已经被作者于2012-12-5 12:56:14编辑过]

--  作者:阿火
--  发布时间:2011/12/20 14:13:08
--  

一,“K线走完模式”转换成“固定轮询模式”或者“混合模式”的方法

以便把各个模型放在同一个框架内进行图表程序化交易

举例:

均线交叉模型(K线走完模型):

runmode:0;

ma5:=ma(c,5);

ma20:=ma(c,20);

entertime:=time>100000 and time<144500;

if holding>0 and ma5<ma20 then sell(1,1,market);

if holding<0 and ma5>ma20 then sellshort(1,1,market);

if holding=0 and ma5>ma20 and entertime then buy(1,1,market);

if holding=0 and ma5<ma20 and entertime then buyshort(1,1,market);

if time>=150000 then begin

 sell(1,1,market);

 sellshort(1,1,market);

end

 

简单的改法,自然是把各个条件“过去化”,如:ma5 改为 ref(ma(c,5),1);但这种方法碰到大型的、复杂的模型时,容易出错

可采用这种方法,把holding用全局变量cc替换,然后加入红色部分代码,红色部分代码要放在信号语句的前面:

runmode:0;

variable:cc=0;

ma5:=ma(c,5);

ma20:=ma(c,20);

entertime:=time>100000 and time<144500;

if holding>0 and cc<=0 then sell(1,1,limitr,o);

if holding<0 and cc>=0 then sellshort(1,1,limitr,o);

if holding=0 and cc>0 then buy(1,1,limitr,o);

if holding=0 and cc<0 then buyshort(1,1,limitr,o);

if cc>0 and ma5<ma20 then cc:=0;

if cc<0 and ma5>ma20 then cc:=0;

if cc=0 and ma5>ma20 and entertime then cc:=1;

if cc=0 and ma5<ma20 and entertime then cc:=-1;

if time>=150000 then begin

 cc:=0;

end

 

那么,如果是 K线走完模式和盘中模式并存,怎么做呢?也简单,就是在“开盘价下单语句”后面加入蓝色部分的“盘中下单语句”就行了

如下:

runmode:0;

variable:zs=0,cc=0;

ma5:=ma(c,5);

ma20:=ma(c,20);

entertime:=time>100000 and time<144500;

if holding>0 and cc<=0 then sell(1,1,limitr,o);

if holding<0 and cc>=0 then sellshort(1,1,limitr,o);

if holding=0 and cc>0 then buy(1,1,limitr,o);

if holding=0 and cc<0 then buyshort(1,1,limitr,o);

if cc>0 and l<zs then begin

 sell(1,1,limitr,min(o,zs-0.6));

 cc:=0;

end

if cc<0 and h>zs then begin

 sellshort(1,1,limitr,max(o,zs+0.6));

 cc:=0;

end

if cc>0 and ma5<ma20 then cc:=0;

if cc<0 and ma5>ma20 then cc:=0;

if cc=0 and ma5>ma20 and entertime then begin

 cc:=1;

 zs:=c-10;

end

if cc=0 and ma5<ma20 and entertime then begin

 cc:=-1;

 zs:=c+10;

end

if time>=150000 then begin

 cc:=0;

end

 

 

二、移动止损的编写方法:

还是以之前的模型为例,希望加入移动止损,即:开仓后的最高点回落10个点要盘中止损离场

加入一个全局变量 hl,记录开多后的最高点,开空后的最低点:

runmode:0;

variable:zs=0,cc=0,hl=0;

ma5:=ma(c,5);

ma20:=ma(c,20);

entertime:=time>100000 and time<144500;

if holding>0 and cc<=0 then sell(1,1,limitr,o);

if holding<0 and cc>=0 then sellshort(1,1,limitr,o);

if holding=0 and cc>0 then buy(1,1,limitr,o);

if holding=0 and cc<0 then buyshort(1,1,limitr,o);

if cc>0 and l<zs then begin

 sell(1,1,limitr,min(o,zs-0.6));

 cc:=0;

end

if cc<0 and h>zs then begin

 sellshort(1,1,limitr,max(o,zs+0.6));

 cc:=0;

end

if cc>0 and ma5<ma20 then cc:=0;

if cc<0 and ma5>ma20 then cc:=0;

if cc=0 and ma5>ma20 and entertime then begin

 cc:=1;

 zs:=c-10;

 hl:=h;

end

if cc=0 and ma5<ma20 and entertime then begin

 cc:=-1;

 zs:=c+10;

 hl:=l;

end

if cc>0 and h>hl then begin//创新高后,上移hl

 hl:=h;

 zs:=hl-10;

end

if cc<0 and l<hl then begin//创新低后,下移hl

 hl:=l;

 zs:=hl+10;

end

if time>=150000 then begin

 cc:=0;

end

[此贴子已经被作者于2012-2-16 12:28:49编辑过]

--  作者:阿火
--  发布时间:2011/12/20 14:47:19
--  

 三、逐K线模式的模型,用免费版下单交易的方法

runmode:0;
variable:cc=0;
ma5:=ma(c,5);
ma20:=ma(c,20);
entertime:=time>100000 and time<144500;
exitlong:cc<>1,tfilter;
exitshort:cc<>-1,tfilter;
enterlong:ref(cc,1)<>1 and cc=1,tfilter;
entershort:ref(cc,1)<>-1 and cc=-1,tfilter;
if cc>0 and ma5<ma20 then cc:=0;
if cc<0 and ma5>ma20 then cc:=0;
if cc=0 and ma5>ma20 and entertime then cc:=1;
if cc=0 and ma5<ma20 and entertime then cc:=-1;
if time>=150000 then cc:=0;

 

原理是,用全局变量cc记录仓位,然后根据仓位的变化情况来确定下单信号

[此贴子已经被作者于2011-12-21 9:56:16编辑过]

--  作者:阿火
--  发布时间:2011/12/21 9:55:03
--  

四、日内满仓反手的写法

因为满仓的情况下,要等平仓单成交、保证金释放后,开仓下单才能成功。

用系统自带的orderqueue在平仓单没有第一时间成交的情况下有一定的局限性,可用如下的方法:

runmode:0;

input:cw(3,1,10,1);

variable:cc=0;

ma5:=ma(c,5);

ma20:=ma(c,20);

entertime:=time>100000 and time<144500;

if holding>0 and cc<=0 then sell(1,cw,limitr,o);

if holding<0 and cc>=0 then sellshort(1,cw,limitr,o);

//此方法撤单和追单时间要控制在出信号的K线时间以内

if holding=0 and cc>0 and cw+tholding2>=cw then buy(1,cw,limitr,o);//平空成交后,"cw+tholding2>=cw "才会成立并开多

if holding=0 and cc<0 and cw-tholding2>=cw then buyshort(1,cw,limitr,o);//平多成交后,"cw-tholding2>=cw "才会成立并开空

if cc>0 and ma5<ma20 then cc:=0;

if cc<0 and ma5>ma20 then cc:=0;

if cc=0 and ma5>ma20 and entertime then cc:=1;

if cc=0 and ma5<ma20 and entertime then cc:=-1;

if time>=150000 then begin

 cc:=0;

end

[此贴子已经被作者于2011-12-21 9:55:23编辑过]

--  作者:阿火
--  发布时间:2011/12/21 13:25:02
--  

五、自行计算最大回撤的方法,放到逐K线模式的模型最后面即可:

 

zichan:asset,noaxis;
if barpos=1 then begin
 MaxAsset:=zichan;

 Maxhc:=0; end
if zichan>MaxAsset then MaxAsset:=zichan;
if MaxAsset-zichan>Maxhc then Maxhc:=MaxAsset-zichan;
最大回撤:Maxhc,linethick0;
交易次数:totaltrade,linethick0;
正确率:percentwin,linethick0;

//这里的变量"MaxAsset”、"Maxhc" 其实是全局变量,可不必声明。有重新赋值变量值才会改变

[此贴子已经被作者于2011-12-21 13:37:09编辑过]

--  作者:阿火
--  发布时间:2011/12/21 13:53:07
--  

六、“后台下单模板”,可用于各种模型。不会写后台模型的塔友,以后不用写了,复制此模板即OK

只要把此模板放在 模型的最后面,就可以后台全自动化交易了。此方法还有一个好处,即使用固定轮询模式,也不会漏单

注意:把800988替换成自己的账户,按ctrl+H 进行替换

有个性化需求的,也可在此模板上的基础上定制。不会的可以找我

runmode:0;
Globalvariable:hold=drawnull;
……//这里添加上你自己的模型

……//这里添加上你自己的模型

cc800988:=holding;//这句放在信号稳定的地方,即时下单的,就放下单语句的后面,K线走完下单的就放下单语句的前面
drawtextex(1,1,800,0,\'虚拟持仓为:\'+numtostr(cc800988,0));//在图表上输出虚拟持仓以便监控
if not(islastbar) or workmode<>1 then exit;
xiadan800988:=cc800988-hold;
if xiadan800988>0.5 then begin
 cang:=min(xiadan800988,abs(hold));
 if hold<0 then tsellshort(1,cang,mkt,0,0,\'800988\'),allowrepeat;
 cang:=xiadan800988+min(hold,0);
 if cang>0 then tbuy(1,cang,mkt,0,0,\'800988\'),allowrepeat;
end
if xiadan800988<-0.5 then begin
 cang:=min(abs(xiadan800988),abs(hold));
 if hold>0 then tsell(1,cang,mkt,0,0,\'800988\'),allowrepeat;
 cang:=abs(xiadan800988)-max(hold,0);
 if cang>0 then tbuyshort(1,cang,mkt,0,0,\'800988\'),allowrepeat;
end
hold:=cc800988;

 

实例见此贴 http://www.weistock.com/bbs/dispbbs.asp?BoardID=10&ID=9112&replyID=&skin=1

 

[此贴子已经被作者于2012-1-5 16:56:52编辑过]

--  作者:sky
--  发布时间:2011/12/21 13:53:36
--  
阿火秘笈,给力!
--  作者:小麦熟了
--  发布时间:2011/12/21 17:46:45
--  
 很好很强大
--  作者:shy508
--  发布时间:2011/12/23 11:33:23
--  
好啊!好样的,阿火,真火!
--  作者:阿火
--  发布时间:2011/12/23 12:17:06
--  

七、把各种模型组合成一个模型的方法,适用于所有模型,即便是“即时下单模型”。

    对于信号在同一个点位的模型(比如都是开盘价),可以实盘图表化交易

     说明:因为图表交易同一根K线出现2个开多信号的话,只会开一次,另外一个无法执行,但是可以做历时回测

             组合起来的模型,加入后台下单语句,就可以用于后台下单,当然,后台下单用“后台下单模板”会更好用。

     方法原理:计算每个时点要下单的手数和方向,再根据holding判断出要平仓和开仓的数量,然后再下单。

看起来很多,其实很简单,最基本得模块就是蓝色部分

input:cang1(1,0,10,1),cang2(1,0,10,1);
variable:cc1=0,cc2=0;

/////////////////////////////////模型1——10周期反手
hi:=ref(hhv(h,10),1);
lo:=ref(llv(l,10),1);
if cc1>0 and l<lo then begin
 pc:=min(max(holding,0),cang1);
 kc:=cang1-pc;
 if pc>0 then sell(1,pc,limitr,min(o,lo-0.2)-0.6);
 if kc>0 then buyshort(1,kc,limitr,min(o,lo-0.2)-0.6);
 cc1:=0;
end
if cc1<0 and h>hi then begin
 pc:=min(abs(min(holding,0)),cang1);
 kc:=cang1-pc;
 if pc>0 then sellshort(1,pc,limitr,max(o,hi+0.2)+0.6);
 if kc>0 then buy(1,kc,limitr,max(o,hi+0.2)+0.6);
 cc1:=0;
end
if cc1=0 and h>hi then begin
 pc:=min(abs(min(holding,0)),cang1);
 kc:=cang1-pc;
 if pc>0 then sellshort(1,pc,limitr,max(o,hi+0.2)+0.6);
 if kc>0 then buy(1,kc,limitr,max(o,hi+0.2)+0.6);
 cc1:=1;
end
if cc1=0 and l<lo then begin
 pc:=min(max(holding,0),cang1);
 kc:=cang1-pc;
 if pc>0 then sell(1,pc,limitr,min(o,lo-0.2)-0.6);
 if kc>0 then buyshort(1,kc,limitr,min(o,lo-0.2)-0.6);
 cc1:=-1;
end

/////////////////////////////////以上是模型1

/////////////////////////////////模型2——20周期反手
hi:=ref(hhv(h,20),1);
lo:=ref(llv(l,20),1);
if cc2>0 and l<lo then begin
 pc:=min(max(holding,0),cang2);
 kc:=cang2-pc;
 if pc>0 then sell(1,pc,limitr,min(o,lo-0.2)-0.6);
 if kc>0 then buyshort(1,kc,limitr,min(o,lo-0.2)-0.6);
 cc2:=0;
end
if cc2<0 and h>hi then begin
 pc:=min(abs(min(holding,0)),cang2);
 kc:=cang2-pc;
 if pc>0 then sellshort(1,pc,limitr,max(o,hi+0.2)+0.6);
 if kc>0 then buy(1,kc,limitr,max(o,hi+0.2)+0.6);
 cc2:=0;
end
if cc2=0 and h>hi then begin
 pc:=min(abs(min(holding,0)),cang2);
 kc:=cang2-pc;
 if pc>0 then sellshort(1,pc,limitr,max(o,hi+0.2)+0.6);
 if kc>0 then buy(1,kc,limitr,max(o,hi+0.2)+0.6);
 cc2:=1;
end
if cc2=0 and l<lo then begin
 pc:=min(max(holding,0),cang2);
 kc:=cang2-pc;
 if pc>0 then sell(1,pc,limitr,min(o,lo-0.2)-0.6);
 if kc>0 then buyshort(1,kc,limitr,min(o,lo-0.2)-0.6);
 cc2:=-1;
end

/////////////////////////////////以上是模型2

//有更多的模型,往后面添加即可

 

 

 

 

如果各个模型都是K线走完模式的,可以这样组合更加方便

variable:lee=0;
kc1:=max(lee,0)-max(holding,0);
kc2:=min(lee,0)-min(holding,0);
if kc1<-0.5 then sell(1,abs(kc1),limitr,open);
if kc2>0.5 then sellshort(1,kc2,limitr,open);
if kc1>0.5 then buy(1,kc1,limitr,open);
if kc2<-0.5 then buyshort(1,abs(kc2),limitr,open);

//模型1
variable:cc1=0;
buycond1:=c>ref(c,1) and ref(c,1)>ref(c,2);
sellcond1:=c<ref(c,1) and ref(c,1)<ref(c,2);
if cc1>0 and sellcond1 then cc1:=0;
if cc1<0 and buycond1  then cc1:=0;
if cc1=0 and buycond1  then cc1:=1;
if cc1=0 and sellcond1 then cc1:=-1;

//模型2
variable:cc2=0;
buycond2:=ma(c,5)>ma(c,20);
sellcond2:=ma(c,5)<ma(c,20);
if cc2>0 and sellcond2 then cc2:=0;
if cc2<0 and buycond2  then cc2:=0;
if cc2=0 and buycond2  then cc2:=1;
if cc2=0 and sellcond2 then cc2:=-1;

//模型3
variable:cc3=0;
buycond3:=ma(c,10)>ma(c,30);
sellcond3:=ma(c,10)<ma(c,30);
if cc3>0 and sellcond3 then cc3:=0;
if cc3<0 and buycond3  then cc3:=0;
if cc3=0 and buycond3  then cc3:=1;
if cc3=0 and sellcond3 then cc3:=-1;

lee:=1*cc1+1*cc2+1*cc3;//每个模型乘以各自的下单系数

[此贴子已经被作者于2012-6-21 14:08:47编辑过]