SP :=TIME>=145500 OR (CLOSE
SK :=TIME>=090000 AND TIME<145500 AND CLOSE
对于新交易系统模型,可用下面4句代替
SELLSHORT(BP and HOLDING<0,HOLDING,market); //交易系统之平空操作 BUY(BK and HOLDING=0,30%,market);//交易系统之开多操作 SELL(SP and HOLDING>0,HOLDING,market); //交易系统之平多操作 BUYSHORT(SK and HOLDING=0,30%,market); //交易系统之开空操作 注:加入BARSLAST函数过滤,避免短时间段内频繁交易。
6.4常见问题
1) AND 与 OR关系书写不完整明确,使得语句执行的结果与实际想要表达的内容不符。如:MACD 数值为正时,5 日线金叉 10 日线或者 10 日线金叉 30 日线时进行交易的条件语句不可直接写作: MACD>0 AND CROSS(MA5,MA10) OR CROSS(MA10,MA30); 而应该使用括号将后面的均线条件括起来:
MACD>0 AND (CROSS(MA5,MA10) OR CROSS(MA10,MA30));
注:不要吝啬使用 () ,只有准确的书写了语句才能达到想要的结果。
2) 编写时掉入逻辑思维的陷阱,在考虑模型条件时,不需要考虑什么条件下不进行交易,而是正向的去考虑一定要达到何种条件时才会进行交易,这样在编写语句的时候,只需将要求的各个条件逐个罗列出来,使用操作符连接即可。 例如,均线与 MACD 结合编写模型时,要求均线金叉时,MACD 数值不得为负 值,那么正向考虑,均线金叉时MACD 的数值应该大于等于0,直接编写为: MACD>0 AND CROSS(MA5,MA30)
3) 买卖方向容易混淆,比如平多单对应的是 SP 而不是 BP;
如示例,这样就不是一个完整的开平仓。BP 是指平空单,而不是平多单。 A:=VALUEWHEN(TIME=091500,HIGH); B:=VALUEWHEN(TIME=091500,LOW);
BK :=TIME>091500 AND CROSS(CLOSE,B) AND TIME<145000; BP :=TIME>145000; 正确书写:
A:=VALUEWHEN(TIME=091500,HIGH); B:=VALUEWHEN(TIME=091500,LOW);
BK :=TIME>091500 AND CROSS(CLOSE,B) AND TIME<145000; SP :=TIME>145000;
36
4) 模型存在过滤机制的前提下,BARSLAST函数求的是上次满足条件到当前的周期数,可能取到的只是满足条件处,而非实际执行指令位置,在求开仓位置时,要合理使用此函数。如: A:=VALUEWHEN(TIME=091500,HIGH); B:=VALUEWHEN(TIME=091500,LOW); BK :CROSS(CLOSE,B); SP :=CROSS(A,CLOSE);
如果你想求开仓位置的最高价,写为 N:=BARSLAST(CROSS(CLOSE,B)) HH:REF(HIGH,N);
是不对的。由于开仓后曾多次满足此条件,但是相应持仓并未平掉,所以此指令被自动过滤。这样写求的可能是上次满足开仓条件的位置,而非实际开仓位置。
5)进行日内交易时注意时间函数的使用,不仅平仓条件中需要使用时间函数控制,开仓条件也需要使用时间函数来进行控制。另外如果采取了 当前 K线走完后发出交易指令 的交易策略,更加要注意时间轴刻度与语句执行时间的关系。 如:
MAN:=MA(CLOSE,15);
BK :=TIME>=091500 AND TIME<145500 AND CLOSE>MAN; SP :=TIME>=145500 OR CLOSE SK :=TIME>=090000 AND TIME<145500 AND CLOSE SELLSHORT(BP and HOLDING<0,HOLDING,market); //交易系统之平空操作 BUY(BK and HOLDING=0,30%,market);//交易系统之开多操作 SELL(SP and HOLDING>0,HOLDING,market); //交易系统之平多操作 BUYSHORT(SK and HOLDING=0,30%,market); //交易系统之开空操作 说明:5 分钟周期,09:15 之后进行日内交易,14:55 进行平仓,不仅需要在平仓条件中写入时间 145500,还需要写入开仓条件,否则可能会在 145500 平仓后,继续开仓进行交易。 另外如果勾选当 K 先走完发出交易指令,该机制是出现指令的下一根 K 线开盘时发委托,由于尾盘平仓是在 145500 是最后一根 K 线,所以今天不会发指令,而是在明天第一根开盘时发委托,一定要注意掌握使用。 8)追踪止赢功能(按点数) input:NS(10,1,100,1);{高点或低点回来10点} {可自设开平仓条件} 持仓: holding; tt0:=time<145000; tt2:=time>145700;//收盘时间 SELLSHORT(tt0 and BP and 持仓<0,持仓,market); SELLSHORT(tt0 and 持仓<0,持仓,Stopr,LLV(L,ENTERBARS)+NS); BUY(tt0 and BK and 持仓=0,20%,market); SELL(tt0 and SP and 持仓>0,持仓,market); SELL(tt0 and 持仓>0,持仓,Stopr,HHV(H,ENTERBARS)-NS); BUYSHORT(tt0 and SK and 持仓=0,20%,market); 37 9)追踪止赢功能(按回调比例) input:NS(5,1,100,1);{ 回调比例} 持仓: holding; tt0:=time<145000; tt2:=time>145700;//收盘时间 SELLSHORT(tt0 and BP and 持仓<0,持仓,market); SELLSHORT(tt0 and 持仓<0,持仓,Stopr, LLV(L,ENTERBARS)*(1+NS/100)); BUY(tt0 and BK and 持仓=0,20%,market); SELL(tt0 and SP and 持仓>0,持仓,market); SELL(tt0 and 持仓>0,持仓,Stopr, HHV(H,ENTERBARS)*(1-NS/100)); BUYSHORT(tt0 and SK and 持仓=0,20%,market); 其中,条件 and 持仓=0为单方向只开一次仓,即不连续开仓 上述模型仅供参考,据此交易风险自负。 第七章 金字塔的后台程式化交易 金字塔提供功能性和扩展性更为强大的基于后台预警模式的程式化交易模式,可以在不影响用户前台图形操作情况下,可以高效与预警系统一起工作来实现自动交易,由于后台程式化交易是金字塔在后台进行,不需要图表打开不占用过多的资源,由于只只需要最后一个周期的信号,所以原则上公式不要多余计算,故效率高,便于对多个品种同一个策略进行轮循监控.用户前期编写的自动交易策略是需要先在图表上和程式化交易评测上通过后才可以放到后台去执行程式化交易。为了让用户更快的编写和熟悉金字塔的后台程式化交易,金字塔的程式化交易函数,前面都在交易系统函数名称前加 T 字母,比如BUY改为TBUY, 使用方法大致相同.户仔细注意查看函数的使用说明。与图表显示的交易系统函数不同的是,后台程式化交易的函数都使用的实际的用户持仓和资金。 金字塔的后台程式化交易只能在专业版及其以上版本使用,他可以运行在序列和逐K线两种模式,但是推荐序列模式运行,这样可以极大提高后台执行的效率。 用以显示再图表做测试的后台程式化交易不能使用图表交易功能,且图表交易和后台交易的函数不能混用,即后台交易系统中不允许使用ENTERLONG等交易信号,传统的ENTERLONG交易信号里也不允许出现后台程式化交易系统的函数。 此外,后台程式化交易由于用户无法直接在图表上看到信号的整个出现过程,故对用户的公式编写水平有一定的要求,用户需要对金字塔的后台交易系统工作机理有比较深的了解,并且要对自己的公式系统有清晰的认识,这样一旦遇到问题也能及时找到问题的原因。后台交易过程中,一旦遇到问题,建议用户仔细阅读后面第八章的有关后台程式化交易的调试部分。 本章主要讲述交易测试系统函数、程序化交易系统函数,更具体的程序交易环节暨流程请同时参阅“金字塔程式化交易设计指南”。 7.1程式化交易系统的函数 将前面用在显示图表的交易的公式改为实盘后台的交易的公式如下: MA3:MA(C,3); MA5:MA(C,5); TBUY(CROSS(MA3,MA5),1,LMT,C); //按照最新价限价开多 38 TSELL(CROSS(MA5,MA3),0,LMT,C);//按照最新价限价平多,0表示平掉全部持仓 请注意TBUY和TSELL函数的参数出现了变化,真正的下单时,需要指定下单类型和价格的,否则系统会按照市价进行交易。 用以模拟交易的函数和真实交易的函数,大部分只是有了前面T字母差别,大部分的用以交易评测的交易系统,只要将交易函数部分前面加T字母即可解决,唯一区别最大的就是TBUY,TSELL,TBUYSHORT,TSELLSHORT 这4个函数与模拟交易用的函数区别较大,请仔细辨别。 请注意交易控制符 THISCLOSE 在真实交易中被 LMT 等真实交易控制符所取代,金字塔的模拟交易控制符和真实交易控制符两者不能通用。金字塔的真实下单函数只支持LMT限价 MKT市价 STP止损 STPLMT限价止损 这4个交易控制符。 真实下单交易函数,下单数量不再支持百分比模式。 程式化交易的函数介绍: 程式化交易系统之开多操作: 用法:TBUY(COND,V,[Type,P1,P2,AC,STOCK]);表示当COND条件成立时, 买入V股(手)当前品种, TYPE表示开仓类型,LMT限价 MKT市价 STP止损 STPLMT限价止损 P1表示开仓价格,当TYPE为LMT和STP,STPLMT时为指定限价和止损价格,其他情况填0 P2为止损限价,当TYPE为STPLMT时,必须指定P2的止损限价,其他情况填0,当P1止损价触发时按照P2价格止损操作. 当TYPE参数省略时,为市价开仓。AC为帐户ID,为空时为系统默认帐户,否则将下单到指定帐户中 STOCK为品种代码,比如'SH600215',为空或者不填时为当前品种 例如:TBUY(C>O ,1000,LMT,C);表示收阳线则在本周期收盘价上买入1000股(手)。 TBUY(C>0,1000,STP,CLOSE+0.2);表示收阳线则在本周期收盘价高于0.2元下1000股(手)止损单,当盘中价格到了触发价时按市价开仓止损. TBUY(C>0,1000,STPLMT,CLOSE+0.2,CLOSE);表示收阳线则在本周期收盘价高于0.2元下1000股(手)止损单,当盘中价格到了触发价时按CLOSE价格开仓止损。 程式化交易系统之平多操作: TSELL(COND,V,[Type,P1,P2,AC,STOCK]); 用法同上 程式化交易系统之开空操作: TBUYSHORT(COND,V,[Type,P1,P2,AC,STOCK]); 用法同上 程式化交易系统之平空操作: TSELLSHORT(COND,V,[Type,P1,P2,AC,STOCK]); 用法同上 注意:程式化交易系统的函数中交易类型Type与交易测试系统的差别 唐奇安通道模型 input:N(20,5,100,1),NS(10,0,60,1); 资产:asset,noaxis,colorgreen; 持仓:HOLDING,LINETHICK0; 总次数: TOTALTRADE,LINETHICK0; 39 盈利:NUMWINTRADE,LINETHICK0; 胜率:ROUNDS(100*PERCENTWIN,1),LINETHICK0; 连亏:MAXSEQLOSS,LINETHICK0; 连盈:MAXSEQWIN,LINETHICK0; BPK:=CROSS(H, hhv(ref(h,1),N)); SPK:=CROSS(llv(ref(l,1), N),L); Price:=AVGENTERPRICE;//持仓价位 SELLSHORT(BPK and 持仓<0,持仓,market); SELLSHORT(持仓<0,持仓,Stopr,Price+NS); //止损 BUY(BPK and 持仓=0,30%,market); SELL(SPK and 持仓>0,持仓,market); SELL(持仓>0,持仓,Stopr,Price-NS);//止损 BUYSHORT(SPK and 持仓=0,30%,market); 将交易模型转换成程式化交易系统,主要是涉及交易系统函数的转化,即在交易系统函数前加“t”,以及交易类型的改动;并且程式化交易函数都是在后台运行,不能在图表中显示;交易数量不能用30%的写法,只能用具体数量。 因此,唐奇安通道模型转化为可程式化交易的系统: input:N(20,0,60,1) ,NS(30,0,100,1); 持仓:=tHOLDING,LINETHICK0; KCS:= intpart(tasset*0.3/(close*multiplier));//也表示30%的开仓数 BUY1:=hhv(ref(h,1),N); SELL1:=llv(ref(l,1),N); BPK:=CROSS(H,BUY1); SPK:=CROSS(SELL1,L); Price:=tAVGENTERPRICE; //持仓价位 tSELLSHORT(BPK and 持仓<0,t持仓,mkt); tSELLSHORT(持仓<0,持仓,Stp,Price+NS); tBUY(BPK and 持仓=0, KCS,mkt); tSELL(SPK and 持仓>0,持仓,mkt); tSELL(持仓>0,持仓,Stp,Price-NS); tBUYSHORT(SPK and 持仓=0, KCS,mkt); 若想与交易模型完全一样,后6句则需这样写: tSELLSHORT(ref(BPK,1) and 持仓<0,t持仓,mkt); tSELLSHORT(持仓<0,持仓,Stp,Price+NS); tBUY(ref(BPK,1) and 持仓=0, KCS,mkt); 40