欢迎使用金字塔普通技术服务论坛,您可以在相关区域发表技术支持贴。
我司技术服务人员将优先处理 VIP客服论坛 服务贴,普通区问题处理速度慢,请耐心等待。谢谢您对我们的支持与理解。


金字塔客服中心 - 专业程序化交易软件提供商金字塔软件交易策略发布专区 → 阿火秘笈_编写技巧十九(12月5日更新_做参数优化时优化指定指标的方法)

   

欢迎使用金字塔普通技术服务论坛,您可以在相关区域发表技术支持贴。
我司技术服务人员将优先处理 VIP客服论坛 服务贴,普通区问题处理速度慢,请耐心等待。谢谢您对我们的支持与理解。    


  共有198680人关注过本帖树形打印复制链接

主题:阿火秘笈_编写技巧十九(12月5日更新_做参数优化时优化指定指标的方法)

帅哥哟,离线,有人找我吗?
阿火
  1楼 | QQ | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 原leevolvo
等级:版主 帖子:2160 积分:10563 威望:0 精华:11 注册:2010/11/3 11:21:19
阿火秘笈_编写技巧十九(12月5日更新_做参数优化时优化指定指标的方法)  发帖心情 Post By:2011/12/20 13:58:52 [只看该作者]

陆续增加,目录如下:

 

一,“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编辑过]

[本帖被加为精华]
 回到顶部
帅哥哟,离线,有人找我吗?
阿火
  2楼 | QQ | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 原leevolvo
等级:版主 帖子:2160 积分:10563 威望:0 精华:11 注册:2010/11/3 11:21:19
  发帖心情 Post By: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编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
阿火
  3楼 | QQ | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 原leevolvo
等级:版主 帖子:2160 积分:10563 威望:0 精华:11 注册:2010/11/3 11:21:19
  发帖心情 Post By: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编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
阿火
  4楼 | QQ | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 原leevolvo
等级:版主 帖子:2160 积分:10563 威望:0 精华:11 注册:2010/11/3 11:21:19
  发帖心情 Post By: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编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
阿火
  5楼 | QQ | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 原leevolvo
等级:版主 帖子:2160 积分:10563 威望:0 精华:11 注册:2010/11/3 11:21:19
  发帖心情 Post By: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编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
阿火
  6楼 | QQ | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 原leevolvo
等级:版主 帖子:2160 积分:10563 威望:0 精华:11 注册:2010/11/3 11:21:19
  发帖心情 Post By: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
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:新手上路 帖子:13 积分:85 威望:0 精华:0 注册:2011/7/15 13:22:07
  发帖心情 Post By:2011/12/21 13:53:36 [只看该作者]

阿火秘笈,给力!

 回到顶部
帅哥哟,离线,有人找我吗?
小麦熟了
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:新手上路 帖子:16 积分:133 威望:0 精华:0 注册:2010/5/20 23:58:19
  发帖心情 Post By:2011/12/21 17:46:45 [只看该作者]

 很好很强大

 回到顶部
帅哥哟,离线,有人找我吗?
shy508
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:新手上路 帖子:86 积分:427 威望:0 精华:0 注册:2010/5/5 10:39:30
  发帖心情 Post By:2011/12/23 11:33:23 [只看该作者]

好啊!好样的,阿火,真火!

 回到顶部
帅哥哟,离线,有人找我吗?
阿火
  10楼 | QQ | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 原leevolvo
等级:版主 帖子:2160 积分:10563 威望:0 精华:11 注册:2010/11/3 11:21:19
  发帖心情 Post By: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编辑过]

 回到顶部
总数 146 1 2 3 4 5 6 7 8 9 10 下一页 ..15