金字塔决策交易系统

标题: 【经验分享】阿火秘笈_编写技巧汇总 [打印本页]

作者: 技术003    时间: 2021-6-11 15:44
标题: 【经验分享】阿火秘笈_编写技巧汇总
//转自旧论坛版主阿火,感谢火哥对量化事业的付出与贡献,旧论坛原贴

陆续增加,目录如下:
1、“K线走完模式”转换成“固定轮询模式”或者“混合模式”的方法                    …………………………见 2楼
2、移动止损的编写方法                                                   …………………………见 3楼
3逐K线模式的模型,用免费版下单交易的方法                                      …………………………见 3楼
4日内满仓反手的写法                                                     …………………………见 4楼
5自行计算最大回撤的方法,放到逐K线模式的模型最后面即可                               …………………………见 5楼
6“后台下单模板”,可用于各种模型                                               …………………………见 6楼
7把各种模型组合成一个模型的方法,适用于所有模型                                       …………………………见 7楼
8提前N秒下单的方法,适用于各个周期                                         …………………………见 8楼
9通过飞信给自己发短信的VBA代码(现有版本可以直接给微信发送消息)                        …………………………见 9楼
10在小周期级别上引用无未来大周期指标的实际走势的方法                          …………………………见 10楼
11日内重新计算macd的方法,以避免跳空对指标造成的影响。                       …………………………见 10楼
12、突破模型信号也会消失的一个例子及其处理方法,大家小心。                    …………………………见 11楼
13、Andriod系统手机远程控制电脑的方法,随时随心随地监控交易                  …………………………见 12楼
14、K线未走完提前下单,次周期自动恢复持仓的写法                           …………………………见 13楼
15、史上最简明的后台下单模板,适用于满仓反手交易                            …………………………见 14楼
16、CTP账户的跟单VBA代码                                             …………………………见 15楼
17、后台持仓同步的写法                                               …………………………见 16楼
18、自己在模型里计算盈亏情况的一个简便方法                                   …………………………见 17楼
19、做参数优化时,优化特定指标的方法                                        …………………………见 18楼












作者: 技术003    时间: 2021-6-11 16:00
一,“K线走完模式”转换成“固定轮询模式”或者“混合模式”的方法

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


举例:
均线交叉模型
运行于图表走完K线模式
[PEL] 复制代码
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


怎么改动上面的均线交易模型让它在图表固定轮询模式下执行的效果和上部分代码应用在走完K线模式下完全一样

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

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


运行于图表固定轮询模式


[PEL] 复制代码
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;


那么,下单条件可以K线走完,但止盈止损要盘中实时怎么处理呢?

这种逻辑就是代码实现K线走完模式和盘中模式并存,如下写法,就是在“开盘价下单语句”后面加入注释“盘中实时下单”就行了


运用于图表固定轮询模式


[PEL] 复制代码
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












作者: 技术003    时间: 2021-6-11 16:22
二、移动止损的编写方法:


还是以之前的模型为例,希望加入移动止损。
例如:
开仓后的最高点回落10个点要盘中止损离场
加入一个全局变量 hl,记录开多后的最高点,开空后的最低点:

[PEL] 复制代码
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;  //开仓后的最高值赋给hl
end

if cc=0 and ma5<ma20 and entertime then begin
  cc:=-1;
  zs:=c+10;
  hl:=l;   //开仓后的最低值赋给hl
end
//创新高后,上移hl
if cc>0 and h>hl then begin
  hl:=h;
  zs:=hl-10;
end
//创新低后,下移hl
if cc<0 and l<hl then begin
hl:=l;
zs:=hl+10;
end

//收盘平仓
if time>=150000 then begin
  cc:=0;
end


三、逐K线模式的模型,用旧图表下单交易的方法


[PEL] 复制代码
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记录仓位,然后根据仓位的变化情况来确定下单信号



作者: 技术003    时间: 2021-6-11 16:45
四、日内满仓反手的写法


因为满仓的情况下,要等平仓单成交、保证金释放后,开仓下单才能成功。
用系统自带的orderqueue在平仓单没有第一时间成交的情况下有一定的局限性,可用如下的方法:
[PEL] 复制代码
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);

cond1:=cw+tholding2>=cw or not(islastbar); //平空成交后,"cw+tholding2>=cw "才会成立并开多
cond2:=cw-tholding2>=cw or not(islastbar); //平多成交后,"cw-tholding2>=cw "才会成立并开空


//此方法撤单和追单时间要控制在出信号的K线时间以内
if holding=0 and cc>0 and cond1 then buy(1,cw,limitr,o);        //cond1为控制新增开多条件
if holding=0 and cc<0 and cond2 then buyshort(1,cw,limitr,o);  //cond2位控制新增开空条件

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;




作者: 技术003    时间: 2021-6-11 16:47
、自行计算最大回撤的方法,放到逐K线模式的模型最后面即可


[PEL] 复制代码
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" 其实是全局变量,可不必声明。有重新赋值变量值才会改变



作者: 技术003    时间: 2021-6-23 14:30
六、“后台下单模板”,可用于各种模型。不会写后台模型的塔友,以后不用写了,复制此模板即可使用。

只要把此模板放在 模型的最后面,就可以使用后台全自动化交易了。此方法还有一个好处,即使用固定轮询模式,也不会漏单
注意:把800988替换成自己的账户,按ctrl+H 进行替换
有个性化需求的,也可在此模板上的基础上再行修改

[PEL] 复制代码
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;


图表转后台实例
实例1,图表K线走完模式
[PEL] 复制代码
Globalvariable:hold=drawnull;
cc800988:=holding;//这句放在信号稳定的地方

//此部分改为你自己的模型(K线走完模型)
buycond:=count(c>o,2)=2;
sellcond:=count(c<o,2)=2;
if holding>0 and sellcond then sell(1,1,thisclose);
if holding<0 and buycond then sellshort(1,1,thisclose);
if holding=0 and buycond then buy(1,1,thisclose);
if holding=0 and sellcond then buyshort(1,1,thisclose);

//
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 begin
      tsellshort(1,cang,mkt,0,0,'800988'),allowrepeat;
      debugfile('D:\800988.txt',numtostr(hold,0)+' '+numtostr(cc800988,0)+' 平空 %.0f',cang);
   end
   cang:=xiadan800988+min(hold,0);
   if cang>0 then begin
      tbuy(1,cang,mkt,0,0,'800988'),allowrepeat;
      debugfile('D:\800988.txt',numtostr(hold,0)+' '+numtostr(cc800988,0)+' 开多 %.0f',cang);
   end
end
if xiadan800988<-0.5 then begin
   cang:=min(abs(xiadan800988),abs(hold));
   if hold>0 then begin
      tsell(1,cang,mkt,0,0,'800988'),allowrepeat;
      debugfile('D:\800988.txt',numtostr(hold,0)+' '+numtostr(cc800988,0)+' 平多 %.0f',cang);
   end
   cang:=abs(xiadan800988)-max(hold,0);
   if cang>0 then begin
      tbuyshort(1,cang,mkt,0,0,'800988'),allowrepeat;
      debugfile('D:\800988.txt',numtostr(hold,0)+' '+numtostr(cc800988,0)+' 开空 %.0f',cang);
   end
end
hold:=cc800988;


实例2,即时下单模型,固定时间间隔
[PEL] 复制代码
Globalvariable:hold=drawnull;

//蓝色部分改为你自己的模型
buycond:=h>ref(hhv(h,10),1);
sellcond:=l<ref(llv(l,10),1);
if holding>0 and sellcond then sell(1,1,market);
if holding<0 and buycond then sellshort(1,1,market);
if holding=0 and buycond then buy(1,1,market);
if holding=0 and sellcond then buyshort(1,1,market);
cc800988:=holding;//这句放在信号稳定的地方


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 begin
  tsellshort(1,cang,mkt,0,0,'800988'),allowrepeat;
  debugfile('D:\800988.txt',numtostr(hold,0)+' '+numtostr(cc800988,0)+' 平空 %.0f',cang);
end
cang:=xiadan800988+min(hold,0);
if cang>0 then begin
  tbuy(1,cang,mkt,0,0,'800988'),allowrepeat;
  debugfile('D:\800988.txt',numtostr(hold,0)+' '+numtostr(cc800988,0)+' 开多 %.0f',cang);
end
end
if xiadan800988<-0.5 then begin
cang:=min(abs(xiadan800988),abs(hold));
if hold>0 then begin
  tsell(1,cang,mkt,0,0,'800988'),allowrepeat;
  debugfile('D:\800988.txt',numtostr(hold,0)+' '+numtostr(cc800988,0)+' 平多 %.0f',cang);
end
cang:=abs(xiadan800988)-max(hold,0);
if cang>0 then begin
  tbuyshort(1,cang,mkt,0,0,'800988'),allowrepeat;
  debugfile('D:\800988.txt',numtostr(hold,0)+' '+numtostr(cc800988,0)+' 开空 %.0f',cang);
end
end
hold:=cc800988;



Debugfile输出仅限使用于调试阶段

作者: 技术003    时间: 2021-6-23 14:52
七、把各种模型组合成一个模型的方法,适用于所有模型。

  方法原理:计算每个策略要下单的手数和方向,再根据Holding判断出要平仓和开仓的数量,然后再下单。
  看起来很多,其实很简单,最基本得模块就是代码中注释包含的部分。
[PEL] 复制代码
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线模式,那组合起来更方便
[PEL] 复制代码
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;//每个模型乘以各自的下单系数







作者: 技术003    时间: 2021-6-23 14:58
八、提前N秒下单的方法,适用于各个周期
[PEL] 复制代码
ma5:=ma(c,5);
ma10:=ma(c,10);
input:tq(5,3,60,1); //提前下单秒数,默认为5
abb:=(time0-timetot0(dynainfo(207))<=tq) or not(islastbar);

if abb then begin
  if holding>0 and ma5<ma10 then sell(1,1,thisclose);
  if holding<0 and ma5>ma10 then sellshort(1,1,thisclose);
  if holding=0 and ma5>ma10 then buy(1,1,thisclose);
  if holding=0 and ma5<ma10 then buyshort(1,1,thisclose);
end


作者: 技术003    时间: 2021-6-23 15:03
九、 通过飞信给自己发短信的VBA代码(飞信已停用,现有版本已经可以直接给微信发送消息)
[PEL] 复制代码

SENDPHONEMSG('出现大阳线',0);  //微信提示“出现大阳线”的消息.
SENDPHONEMSG('出现大阳线',1);//微信提示红色提示“出现大阳线”的消息。


注意: SENDPHONEMSG函数使用之前,应该启动手机监控功能,步骤: 工具菜单->异常监控,具体使用说明参考http://www.weistock.com/WeisoftHelp/ycjk.htm


作者: 技术003    时间: 2021-6-23 15:11
十、在小周期级别上记录无未来大周期指标的实际走势的方法
  这里以1分钟引用3分钟的MACD为例,常规方法只能在1分钟K线上显示3分钟K线的macd走势,这种小引大会存在未来函数,至于3分钟内部每根1分钟K线的macd走势不知道
  方法原理:获取上一根3分钟的diff、dea、macd,然后配合1分钟的CLOSE计算出实际的diff、dea、macd
[PEL] 复制代码
第一步、首先在macd指标里加入以下2句:
      
   ema12: ema(c,12),linethick0;
   ema26: ema(c,26),linethick0;

第二步、复制以下代码即可

runmode:1;
em1:=stkindi(stklabel,'macd.ema12',0,17,-1);
em2:=stkindi(stklabel,'macd.ema26',0,17,-1);
ema12:=em1*11/13+c*2/13;
ema26:=25/27* em2 +c*2/27;
diff:ema12-ema26;
dea1:=stkindi(stklabel,'macd.dea',0,17,-1);
dea:dea1*4/5+diff/5;


十一、日内重新计算指标(macd)的方法,以避免跳空对指标造成的影响


这里顺带介绍一下日内重新计算指标的方法,这样可以避免跳空对指标造成的影响。
比较难的是macd,kdj之类的,均线之类的简单
这里依然以macd为例
[PEL] 复制代码
runmode:0;
variable:ema12=c,ema26=c,dea=0;
if day<>ref(day,1) then begin
   ema12:=c;
   ema26:=c;
   dea:=0;
end
ema12:=ema12*11/13+c*2/13;
ema26:=ema26*25/27+c*2/27;
diff:ema12-ema26;
dea:=dea*4/5+diff/5;
dea1:dea;
macd:2*(diff-dea),colorstick;


作者: 技术003    时间: 2021-6-23 15:27
十二、突破模型信号也会消失的一个例子及其处理方法,大家小心。
比如,大家常用的四周法则,一般人都是这样写的
[PEL] 复制代码
//4周转向
hh:=ref(hhv(h,20),1);
ll:=ref(llv(l,20),1);
entertime:=time<=143000;
if h>hh then begin//突破高点,平空做多
sellshort(1,1,limitr,max(o,hh+0.2)+0.6);
buy(holding=0 and entertime,1,limitr,max(o,hh+0.2)+0.6);
end

if l<ll then begin
sell(1,1,limitr,min(o,ll-0.2)-0.6);//突破低点,平多做空
buyshort(holding=0 and entertime,1,limitr,min(o,ll-0.2)-0.6);
end

if time>=150000 then begin//收盘平仓
sell(1,1,limitr,o);
sellshort(1,1,limitr,o);
end

咋一看,没啥问题。其实信号也是会消失的,或者出现“才买入,又立马卖出”的情况

比如某根K线,h>hh 和 l<ll 同时成立的时候。而盘后静态来看,是看不出问题的。


一般模型遵循的写法是先平后开,且要同时注意做多条件和做空条件同时成立时的处理

以上模型,改写为如下,信号就不会闪烁:

[PEL] 复制代码
//4周转向

hh:=ref(hhv(h,20),1);
ll:=ref(llv(l,20),1);
entertime:=time<=143000;
If holding<0 and h>hh then begin
   sellshort(1,1,limitr,max(o,hh+0.2)+0.6);//先是平仓
   buy(1,1,limitr,max(o,hh+0.2)+0.6);
   goto skip@;
end

if holding>0 and l<ll then begin
   sell(1,1,limitr,min(o,ll-0.2)-0.6);//先是平仓
   buyshort(1,1,limitr,min(o,ll-0.2)-0.6);
end
skip@;

//注意做多条件和做空条件同时成立的处理方法,这里采用20周期均线向上才做多,向下才做空
if holding=0 and h>hh and ref(c,1)>ref(c,20) and entertime then buy(1,1,limitr,max(o,hh+0.2)+0.6);//后开仓
if holding=0 and l<ll  and ref(c,1)<ref(c,20) and entertime then buyshort(1,1,limitr,min(o,ll-0.2)-0.6);//后开仓
if time>=150000 then begin
  sell(1,1,limitr,o);
  sellshort(1,1,limitr,o);
end





作者: 技术003    时间: 2021-6-23 15:45
十三、手机远程控制电脑的方法,随时随心随地监控交易


现在很多程序化用户都想实现无人值守交易,但是又担心交易的服务器、PC出现异常故障。
这种情况下我们完全可以用通用的监控工具来远程查看、控制电脑,非常方便。
目前大家常用的远程控制软件为向日葵,免费使用。手机可以直接访问电脑,随身带手机即可操控电脑交易端。
1、电脑端下载非企业用户向日葵远程终端,地址https://sunlogin.oray.com/download
2、手机端去应用市场搜索向日葵,下载安装即可,支持安卓与苹果。

作者: 技术003    时间: 2021-6-23 15:52
十四、K线未走完提前下单,次周期自动回复持仓的写法(目前可以直接使用系统自带的持仓同步功能即可)


有2中情况,第一种,信号一出来就下单,此周期恢复持仓。第二种,提前N秒下单,次周期恢复持仓。当然,也有人次周期不恢复持仓的。哈哈
这里仅以第一种情况举个例子,供大家参考:
[PEL] 复制代码
runmode:0;
globalvariable:cc=0,att=0;
islast:=islastbar;
bb:=c>o+0.6;
ss:=c<o-0.6;
if cc>0 and ss then cc:=0;
if cc<0 and bb then cc:=0;
if cc=0 and bb then cc:=1;
if cc=0 and ss then cc:=-1;
lcc:=ref(cc,1);
if islast then att:=barpos;

if (lcc>0 and cc<=0) or (islast and cc<=0 and barpos>att and tbuyholding(1)>0) then begin
exitlong:1;
if lcc>0 and cc<=0 and islast then att:=barpos;
end
if (lcc<0 and cc>=0) or (islast and cc>=0 and barpos>att and tsellholding(1)>0) then begin
exitshort:1;
if lcc<0 and cc>=0 and islast then att:=barpos;
end
if (lcc<=0 and cc>0) or (islast and cc>0 and barpos>att and tbuyholding(1)=0) then begin
enterlong:1;
if lcc<=0 and cc>0 and islast then att:=barpos;
end
if (lcc>=0 and cc<0) or (islast and cc<0 and barpos>att and tsellholding(1)=0) then begin
entershort:1;
if lcc>=0 and cc<0 and islast then att:=barpos;
end



作者: 技术003    时间: 2021-6-23 15:58
十五、史上最简明的后台下单模板,适用于满仓反手交易(阿火原创)


使用软件自带的撤单追单功能,适合于一般大众需求,如有更加个性化的要求可另外定制。
说明:固定轮询1秒或者高频,逐K线模式,读取账户里的仓位,空单平仓完毕才能开多,多单平仓完毕才能开空。需要多个模型组合在一起的话,把各个模型组合在一起就行了。组合方法见上面的其他方法
[PEL] 复制代码
cc:=holding;//用于获取理论持仓,请放在信号稳定的位置
if holding>0 and c<ref(c,1) then sell(1,1,market);
if holding<0 and c>ref(c,1) then sellshort(1,1,market);
if holding=0 and c>ref(c,1) then buy(1,1,market);
if holding=0 and c<ref(c,1) then buyshort(1,1,market);
if not(islastbar) or workmode<>1 then exit;

ac:='800988';//把800988改成自己的下单账户
buyhold:=tbuyholdingex(ac,stklabel,1);
sellhold:=-tsellholdingex(ac,stklabel,1);
wt:=tremainqty(0,ac,stklabel);
if wt>0.5 then exit;
else goal:=if((buyhold+sellhold)*cc<-0.5,0,cc);
duo:=max(goal,0)-buyhold;
kon:=min(goal,0)-sellhold;
if duo>0.5 then tbuy(1,duo,mkt,0,0,ac);
if duo<-0.5 then tsell(1,duo,mkt,0,0,ac);
if kon<-0.5 then tbuyshort(1,kon,mkt,0,0,ac);
if kon>0.5 then tsellshort(1,kon,mkt,0,0,ac);



作者: 技术003    时间: 2021-6-23 15:59
十六、CTP账户的跟单VBA代码


B账户跟着A账户做单(前提是知道A账户的密码,在同一个金字塔同时登陆A账户和B账户)
[Visual Basic] 复制代码

Sub ORDER_OrderStatusEx2(OrderID, Status, Filled, Remaining, Price, Code, Market, OrderType, Aspect, Kaiping, Account, AccountType)
if Status="Tradeing" and filled>0 and Account="8000000000" then
  if aspect=0 then
   if kaiping=0 then order.Buy 1,filled,0,0,code,market,"800000",0
   if kaiping>0 then order.sellshort 1,filled,0,0,code,market,"800000",0
  end if
  if aspect=1 then
   if kaiping=0 then order.Buyshort 1,filled,0,0,code,market,"800000",0
   if kaiping>0 then order.sell 1,filled,0,0,code,market,"800000",0
  end if
end if
End Sub



作者: 技术003    时间: 2021-6-23 16:01
十七、后台持仓同步的写法


最近怎么老是有人求助 后台持仓同步 的写法
现贡献一下,有谁赚到钱了记得请吃饭送美女
[PEL] 复制代码
//注意:不勾选软件自带追单功能,此模型自带
//固定1秒轮询
cc:=holding;
if holding>0 and c<ref(c,1) then sell(1,1,market);
if holding<0 and c>ref(c,1) then sellshort(1,1,market);
if holding=0 and c>ref(c,1) then buy(1,1,market);
if holding=0 and c<ref(c,1) then buyshort(1,1,market);
if not(islastbar) or workmode<>1 then exit;
tm:=30;//撤单时间
ac:='800988';//下单账户
wt:=tremainqty(0,ac,stklabel);
buyhold:=tbuyholdingex(ac,stklabel,1);
sellhold:=tsellholdingex(ac,stklabel,1);
if wt>0.5 and tsubmit(0)>tm then tcancelex(1,0,ac,stklabel);//如果用软件自带的撤单功能,这句删除。
if wt<0.5 then begin
kc1:=max(cc,0)-buyhold;
kc2:=abs(min(cc,0))-sellhold;
if kc1<-0.5 then tsell(1,abs(kc1),mkt,0,0,ac),allowrepeat;
if kc2<-0.5 then tsellshort(1,abs(kc2),mkt,0,0,ac),allowrepeat;
if sellhold<0.5 and kc1>0.5 then tbuy(1,kc1,mkt,0,0,ac),allowrepeat;
if buyhold<0.5  and kc2>0.5 then tbuyshort(1,kc2,mkt,0,0,ac),allowrepeat;
end



作者: 技术003    时间: 2021-6-23 16:02
十八、 自己在模型里计算盈亏情况的一个简便方法。


从另外一个角度说明了金字塔的测试结果是正确的。
[PEL] 复制代码

//方法示例如下:(这里股指上的简单的均线系统为例)

variable:sumwealth=0;
ma10:=ma(c,5);
ma25:=ma(c,25);
sxf:=0.01/100;//手续费0.01%
if holding>0 and ma10<ma25 then begin
sell(1,1,thisclose);
sumwealth:=sumwealth+1*c*300*(1-sxf);//卖出时减去交易额
end
if holding<0 and ma10>ma25 then begin
sellshort(1,1,thisclose);
sumwealth:=sumwealth-1*c*300*(1+sxf);//买入时加上交易额
end
if holding=0 and ma10>ma25 then begin
buy(1,1,thisclose);
sumwealth:=sumwealth-1*c*300*(1+sxf);
end
if holding=0 and ma10<ma25 then begin
buyshort(1,1,thisclose);
sumwealth:=sumwealth+1*c*300*(1-sxf);
end

zichan:sumwealth+holding*c*300-abs(holding)*c*300*sxf,noaxis;



作者: 技术003    时间: 2021-6-23 16:06
十九、做参数优化时,优化特定指标的方法


大家都知道,参数优化时,金字塔自带的几点优化指标是:收益率,正确率,最大回撤,MAR比例等等
可是,有时候这些并不是我们评估模型的指标,怎么办


其实,我们可以输出自己想要的指标。这里随便举个例子,比如,我评估模型时,参考的是收益回撤比(收益/最大回撤)和单笔收益(收益/交易次数)
我们可以这样(参数y):
[PEL] 复制代码

if holding>0 and time>=150000 then sell(1,1,market);
if holding<0 and time>=150000 then sellshort(1,1,market);
if holding=0 and c>ref(c,y) and time<=100000 then buy(1,1,market);
if holding=0 and c<ref(c,y) and time<=100000 then buyshort(1,1,market);

zichan:asset,noaxis;
if barpos=1 then begin
MaxAsset:=zichan;
hc:=0;
end
if zichan>MaxAsset then MaxAsset:=zichan;
if MaxAsset-zichan>hc then hc:=MaxAsset-zichan;
cishu:=totaltrade,linethick0;

if islastbar then debugfile('c:\moxing.txt',numtostr(y,0)&' '&numtostr(zichan,0)&' '&numtostr(hc,0)&' '&numtostr((zichan-1000000)/cishu,0)&' %.1f',(zichan-1000000)/hc);


然后启动优化(要优化到最后一天的行情,如果不想优化这么长,注意相应地修改 if islastbar then 这个条件)

最后把C盘底下的moxing文本文件导入到excel,就可以进行排序、评估参数了。


补充:现有函数已支持自定义优化项,参考函数AddTestReport('资产',ASSET);表示在专业测试报告中添加'资产'这个自定义数据项.



作者: snky888    时间: 2021-9-20 19:58
技术003 发表于 2021-6-23 15:27
十二、突破模型信号也会消失的一个例子及其处理方法,大家小心。
比如,大家常用的四周法则,一般人都是这 ...

第6行和第17行,都有buy指令,不重复吗?
作者: 黄文    时间: 2021-9-22 11:09
技术003 发表于 2021-6-11 16:00
一,“K线走完模式”转换成“固定轮询模式”或者“混合模式”的方法

以便把各个模型放在同一个框架内进 ...

对“可采用这种方法,把holding用全局变量cc替换,然后加入注释部分代码,注释色部分代码要放在信号语句的前面。”这句话里面把holding用全局变量cc替换不是很理解,既然替换了,为何还会出现:if holding>0 and cc<=0 then sell(1,1,limitr,o);前面的holding>0代表有多头持仓,and cc<=0,请问这里的cc<=0是啥意思?谢谢
作者: 技术003    时间: 2021-10-18 13:18
snky888 发表于 2021-9-20 19:58
第6行和第17行,都有buy指令,不重复吗?

不重复的,可以多个buy
作者: 技术003    时间: 2021-10-18 13:19
黄文 发表于 2021-9-22 11:09
对“可采用这种方法,把holding用全局变量cc替换,然后加入注释部分代码,注释色部分代码要放在信号语句 ...

这里替换是为了2种模式混用,用CC替代上一周期的HOLDING




欢迎光临 金字塔决策交易系统 (https://www.weistock.com/bbs/) Powered by Discuz! X3.4