【新手必看】公式系统常见问题汇总 看全部

一、函数
  1.1 图表策略 转 后台策略
  用图表显示交易信号的图表策略,图表的开多平多下单指令Buy/Sell函数,与后台程式化交易的开多平多下单指令TBuy/TSell函数,参数差异明显,不能简单的将Buy函数加T就直接后台交易。请您将鼠标放在TBuy函数上,逐字逐句地认真看看函数说明,再进行改写。

  1.2 函数
参数默认值的使用说明
  函数最后面的参数可省略不写,中间参数不能省略
  错误示例:后台程式化交易开多指令:tbuy(con,1,mkt,'003028',hy); 初学者容易犯的一个错误,认为使用了mkt市价指令后,价格就不需要填写了,这是典型的错误方法,几乎所有的编程语言函数缺省值都是中间不能空缺的,只能从后面空缺。  正确示例1:tbuy(con,1,mkt);可以从第4个参数开始,省略后面所有的参数,省略的参数金字塔将自行按默认处理。
  正确示例2:tbuy(con,1,lmt,c,0) ; 也可以从第5、或第6个参数开始,省略后面所有参数,后面的帐号和品种均按当前账号和当前品种默认处理。
  错误示例:tbuy(con,1,mkt,'003028','IF00'); 因为中间的两个委托价格没有填写,软件就将'003028','IF00'当做价格来处理,造成委托结果与您的预期不符。
  改写后正确示例3:tbuy(con,1,mkt,0,0,'003028','IF00') ; 将中间的两个价格参数填写上,就是正确的书写格式了。


  1.3 有关后台程式化交易使用的注意事项

  后台程式化交易由于用户无法直接在图表上看到信号的整个出现过程,故对用户的公式编写水平有一定的要求,用户需要对金字塔的后台交易系统工作机理有比较深的了解,并且要对自己的公式系统有清晰的认识,这样一旦遇到问题也能及时找到问题的原因。强烈建议用户,只有具有比较熟练的使用图表公式编写基础之后再来使用后台程式化交易!后台程式化交易的调试工作非常重要,请参考下面有关的专门介绍。
  如果你对金字塔的后台 程式化交易还不了解,那么建议用户仔细阅读:
  公式编写与程式化交易-初级教程   https://www.weistock.com/software/download/PyxBJRXLkvYRP6dY43Ep
  公式编写与程式化交易-高级教程   https://www.weistock.com/software/download/aQBp7rg6N9MeAkgy0VGA

  1.4 有关在图表程式化交易中使用DYNAINFO、THOLDING等常数函数的特别说明
  图表策略中,使用的都是序列函数。序列数值的函数,会在调用后返回一串连续的数据,像开盘价、收盘价等函数就都是序列函数。
  在图上使用DYNAINFO、THOLDING等常数函数,
请详看此贴 www.weistock.com/bbs/forum.php?mod=viewthread&tid=238&page=1&extra=#pid890

  1.5 当日K线数量
  由于金字塔不鼓励使用未来函数,所以文华的:

[PEL] 复制代码
NN1:=BARSLAST(DATE<>REFX(DATE,1));
NN:=MAX(NN1,1);

  在金字塔中用这一条指令替换
[PEL] 复制代码
NN:=barslast(DATE<>REF(DATE,1))+1;


  1.6 函数不能在控制语句之内被引用   https://www.weistock.com/bbs/forum.php?mod=viewthread&tid=240&page=1&extra=#pid898


  1.7 TIME 和 CURRENTTIME 的区别     很多用户需要在一个精确的时间内做某些下单动作,比如开盘后5分钟下单,收盘前1分钟平仓,这种时候不能使用TIME函数做时间点判断,因为TIME是取的周期时间,金字塔在生成每根K线时为了规范化时间,都将时间做了一定程度的修整,所以已经不是严格的成交时间。如果是9点开盘,1分钟周期的第一个K线就是090100,而5分钟则是090500。如果用户需要精确的时间做某些事情,必须使用(1)CURRENTTIME,取用户本地计算机时间;(2)DYNAINFO(207),取交易所行情时间来完成。如果用CURRENTTIME,为了保证时间准确可靠,请定期校正您的本地时间,方法可在工具->选项->基本设置->升级和时间 。
     注意:TIME是返回序列数据,而CURRENTTIME返回常数,故尽量不要在图表交易策略上使用CURRENTTIME 。

  1.8 对于最后一个周期才起作用的函数,如果使用了全局变量进行控制,千万记得加上islastbar控制条件
[PEL] 复制代码
variable:a=10;
debugout('a1=%.0f',a);
if a=10 then 
begin
debugout('a2=%.0f',a);
tbuy(1,1,mkt);
a:=6;
debugout('a3=%.0f',a);
end

debugout('a4=%.0f',a);

      上述公式将无法正常工作,因为variable声明的变量是在整个计算周期内的全局变量,对于tbuy和debugout函数,他们都是在公式的最后的一个周期才执行的函数,所以将导致最后一个周期到来时a实际已经等于6而不会去正确执行开仓语句。
      解决办法是 if a=10 and islastbar then begin 这样加上最后周期判断,或者去掉 variable 变量声明,让a变为一个周期之内的变量


  1.9 市场代码函数MarketLabel
对于公式中经常引用到的市场代码,比如上海证券市场是'SH',具体每个市场的代码在工具菜单->市场与板块中,查看市场的代号,设置和进行管理.

  1.10 文华模型转金字塔模型
   布林带BOLL  https://www.weistock.com/bbs/forum.php?mod=viewthread&tid=742&page=1&extra=#pid3480
   简易文华模型改金字塔方法 https://www.weistock.com/bbs/forum.php?mod=viewthread&tid=31&extra=page%3D3

1.11用VARIABLE定义的全局变量

   Variable定义的全局变量,使用场景如下:
      (1)图表程序化;
      (2)逐K线计算模式;   
        (3)  每根K线上只记录当根K线的最新值(不能记录一根K线上的历史各个状态值)。
   逐K线计算模式,从第1根K线开始,会从第一个周期逐个周期解析公式系统,每个周期都会解析整个公式系统一遍
   每解析一遍公式系统,就会在第1根K线上初始化一次。

   正确应用示例:完整的包括止损,移动止赢交易范例 www.weistock.com/bbs/forum.php?mod=viewthread&tid=2058&extra=page%3D1
   错误应用示例:Variable全局变量出问题 www.weistock.com/bbs/forum.php?mod=viewthread&tid=1958&page=1&extra=#pid10181

1.12 输出字符串函数:DRAWTEXT或DRAWTEXTEX    为什么输出的字符串是100000等数字
    金字塔下,字符串是以地址形式保存的,如果直接按照数字方式显示,直接显示出的是地址;因此字符串的输出必须是使用字符串显示函数进行,DRAWTEXT或者DRAWTEXTEX都可以正常显示出字符串变量中的值。

1.13 日内交易模型的开盘,最高价,结算价
    最高价:hhv(h,barslast(date<>ref(date,1))+1);
    开盘价:valuewhen(data<>ref(data,1),o);
    均价线:http://www.weistock.com/bbs/dispbbs.asp?boardid=4&Id=950

    在一分种周期取前一天最高价、最低价怎么取?
[PEL] 复制代码
N:=barslast(date<>ref(date,1))+1;
preDayHigh:ref(hhv(h,N),N); //昨日最高价
preDayLOW:ref(LLv(L,N),N);  //昨日最低价

    在一分种周期取前五分种最高价怎么取?
[PEL] 复制代码
N:=BARSLAST(DATE<>REF(DATE,1))+1;
HH:VALUEWHEN(TIME=090500,HHV(H,N));
LL:VALUEWHEN(TIME=090500,LLV(L,N));



    {今日结算价}
        ZQ:=IF(LLV(DAY,0)=HHV(DAY,0),0,BARSLAST(DAY<>REF(DAY,1))+1),LINETHICK0;
        结算价:IF(SUM(VOL,ZQ)=0,(HIGH+LOW+OPEN+CLOSE)/4,SUM((HIGH+LOW+OPEN+CLOSE)/4*VOL,ZQ)/SUM(VOL,ZQ)) ;

1.14

1.12






二、编写调试
  金字塔的公式调试有3种方法:
  (1)图表策略的公式调试。
  该方法可以直接将条件或变量(参与条件判断的项)输出到K线图上,查看各开平仓条件的变化,一般用于图表程序化交易。优点:直观、简单明了。


    //将以下代码添加到您图表策略的最后,双击K线图,移动十字光标,就可以查看各个变量的值。
[PEL] 复制代码
    ma5:ma(close,5),linethick0;// 双击k线图可移动十字光标查看5日均线值
    ma20:ma(close,20),linethick0;//查看20日均线值
    con:cross(ma5,ma20),linethick0;//查看是否5日均线是否与20日均线形成金叉

  图表调试详细步骤请参考:https://www.weistock.com/bbs/for ... =136&extra=page%3D1
  (2)后台策略的公式调试。该方法是通过记录txt日志方式的调试,一般用于后台程序化交易,更为灵活地记录各个变量的变化情况。

   供后台调试金字塔提供了两个函数 DEBUGOUT 和 DEBUGFILE

   后台调试详细步骤请参考:https://www.weistock.com/bbs/for ... =136&extra=page%3D1
  (3)公式调试器

  后台调试详细步骤请参考本贴2楼:https://www.weistock.com/bbs/for ... =136&extra=page%3D1
三、策略
  3.1有关平仓反手的模型

[PEL] 复制代码
input:man(26,2,200);
ma1:=ma(close,man);
ccm:=cross(close,ma1);
cmc:=cross(ma1,close);
//顺序必须主要需要根据仓位先平后开的原则
//平空开多
if ccm then
begin
sellshort(holding<0 and ccm,0);
buy(holding<=0,1);
end
//平多开空
if cmc then
begin
sell(holding>0 and cmc,0);
buyshort(holding>=0,1);
end

  如果是传统的ENTERLONG交易信号,同样需要先平后开的原则
[PEL] 复制代码
EXITLONG: cross(A2,AO) OR B2>0;
EXITSHORT: CROSS(AO,A2) OR B2>0;
ENTERLONG: cross(AO,A2) AND B1=1;
ENTERSHORT: CROSS(A2,AO) AND B1=1;

  如果用户帐户资金不足或者希望顺序成交,可以使用ORDERQUEUE指令
[PEL] 复制代码
EXITLONG: cross(A2,AO) OR B2>0,ORDERQUEUE;
EXITSHORT: CROSS(AO,A2) OR B2>0,ORDERQUEUE;
ENTERLONG: cross(AO,A2) AND B1=1,ORDERQUEUE;
ENTERSHORT: CROSS(A2,AO) AND B1=1,ORDERQUEUE;

  ORDERQUEUE指令适合所有交易指令,包括BUY,TBUY等

3.2 为什么我的交易系统有信号了但是没有委托或者成交,我们以图表交易为重点介绍,对于初学用户,总结原因一般有如下几点:
   1、用户需确认在出现交易信号之后金字塔是否有发出委托指令,用户可以在交易记录中查询到,如果有委托但未成交主要有两点,对于模拟交易,如果使用综合交易平台系统,由于目前并不完善,会经常造成即便市价下单也无法及时成交的情况。对于实盘交易,用户需要在报单策略上多仔细考虑尽量的发出对价单来保证其成交。
   2、如果有信号没有委托发出,请确认是否是下列几点造成
       1)金字塔会在打开一个品种的图表后自动补充历史数据,确认是否是因为自动补数据造成的在交易时没有信号出现,但是补数据后历史上出现交易信号,但是用户通过查询历史成交记录觉得对不上了。
      2)如果用户使用模拟交易,目前模拟交易得稳定性没有实盘交易好,所以如果盘中中断,那么会导致出现后错过时机。
      3)使用固定轮循模式执行指标交易,由于最后一个K线没有最终形成,信号出现后下单,但是信号又消失,造成历史信号与持仓不吻合,这时建议大家使用K线走完模式,保证信号稳定。
      4) 对于BUY,TBUY等高级的策略交易系统,切记要先平后开的下单原则。
      5) 对于无法发出平仓指令的情况,一般情况是因为开仓指令的委托单,没有及时成交,由于平仓信号发出时没有仓位,金字塔无法仓可平,等信号错过后,开仓单才成交,造成了看起来漏掉了一个平仓信号。
      6) 因为平仓反手不对称造成,最常见的是发出平仓信号后没有及时成交,但是反手单却提前成交了,造成了锁仓,导致金字塔判断仓位方向不确定会导致平仓单信号漏掉,对于反手情况,初学用户请尽量使用市价委托,并使用ORDERQUEUE指定顺序成交,否则就建议初学者尽量使用对价报单,尽量避免不成交的几率出现,否则初学用户就应该初期只使用单向交易,等日后能够熟练应用金字塔的追单功能后再使用挂单性质的反手交易手法。
      7) 如果使用固定时间间隔,间隔时间设置过大,造成信号在周期的末尾时出现,但正好在扫描的时间间隔之内,造成了出现信号金字塔没有及时的得知,对于此情况建议用户将间隔时间设为1秒
      8) 如果用秒线或者分笔周期,请务必选择“高频”选项,避免行情快速变化时由于固定轮循最小1秒间隔带来的信号漏单。
      9) 如果使用了ORDERQUEUE顺序下单指令,那么应该尽量的让其一次性成交,必要时请使用市价委托,因为一旦队列下单不成交撤单后,再次委托会将委托追单排到最后,导致后面的比如反手指令无法正确得到执行,造成信号漏单。
     10) 后台自动交易不要将THOLDING写在交易语句里比如TBUY(bk and THOLDING=0,1,MKT),详细解释请看问题3.4
     11) 图表交易里使用了后台自动交易的函数THOLDING2或者THOLDING或者使用了DYNAINFO等常数函数,由于图表交易不会在产生信号时立即发单,等再次检测时由于之前的发单成交THOLDING已经发生变化导致刚才出现的信号因为THOLDING的信号消失,所以产生了信号漏掉。
     12) 推荐用户仔细看看金字塔的调试技巧文章
      https://www.weistock.com/bbs/for ... =136&extra=page%3D1
    尤其是需要打开下单日志,这样便于在出现问题时,及时的查到问题的原因。
     13) 用户要确认自己的策略中没有使用跨周期数据引用或者BACKSET,REFX等未来函数,有些这些未来数据,或造成信号的反复消失及过往的K线突然出现信号,导致用户看起来错过的那跟K线没有下单
     14) 是否在模型中使用了小周期引用大周期的情况,同样属于未来数据的使用,会导致信号消失

3.3 为什么我的图表上的交易信号会出现白色箭头

      这种情况一般是因为用户在图表交易上使用了挂单指令或者STOP指令,委托的价格超过了本次K线上的最高最低价格,导致金字塔认为该笔委托属于无效委托导致。金字塔在执行程序化交易测评时,只会根据K线的委托的价位判断是否在高低价格之间做为测评是否属于委托成交的依据,因此挂单止损止赢的交易策略用户是不应该直接使用这种方式的,通常这种方式用在后台程序化交易中,因为后台不需要担负测评任务,更适合做此类的精细化控制。
     图表的出问题的代码范例:
[PEL] 复制代码
if holding>0 then Sell(true,1,limitr, AVGENTERPRICE+10);  // 超过入场价10点就止盈
if holding>0 then Sell(true,1,stopr, AVGENTERPRICE-5);   //跌破入场价5个点就止损

       这种写法在图表程序化中是会出现白色箭头的,也是没有办法进行有效历史评测的,我们应该改成下面的写法:
[PEL] 复制代码
if holding>0 then Sell(c>=AVGENTERPRICE+10,1,limitr,c );  // 超过入场价10点就止盈
if holding>0 then Sell(c<AVGENTERPRICE-5,1,limitr,c);   //跌破入场价5个点就止损

      通过平仓的条件语句,判断最新的K线价格超过了我们开仓的均价止赢止损点后,直接发出委托信号


3.4 有关后台自动交易THOLDING的使用
     初学者在使用后台自动交易时,通常认为将函数前简单加T就可以,但实际不行的,比如:
[PEL] 复制代码
tSELL(bp and THOLDING>0,0,LMT,C);
tSELLSHORT(sp and THOLDING<0,0,LMT,C);
tBUY(bk and THOLDING=0,1,LMT,C);
tBUYSHORT(sk and THOLDING=0, 1,LMT,C);

在图表交易系统上加 t 改过来的代码
    THOLDING与图表HOLDING最大的不同在于,THOLDING是与你真实持仓一致的函数,只有当我们的委托下单成交后才会有所变化,而HOLDING是虚拟持仓,BUY执行过后立即变化。

    由于我们前面的代码在执行了平仓操作后,THOLDING不会马上变成0,故会导致TBUY的THOLDING=0条件不被成立,导致没有反手信号。
    正确的反手写法
[PEL] 复制代码
if bp > 0 and THOLDING>0 then
begin
tSELL(1,0,MKT),ORDERQUEUE;
tBUYSHORT(1, 1,MKT),ORDERQUEUE;
end
if sp > 0 and THOLDING<0 then
begin
tSELLSHORT(1,0,MKT),ORDERQUEUE;
tBUY(1,1,MKT),ORDERQUEUE;//tbuy第一个1表示条件永远成立,后一个1表示开仓手数
end

     这段代码的关键是ORDERQUEUE。有了它之后,指令流就变成了阻塞式的了。所有报单放入队列中,按次序委托下单,成交一个委托下一个
     如果资金充足,不会出现因为未平仓而开不了仓的情况,可把ORDERQUEUE去掉,指令就会顺序提交,不需等待返回结果。

[PEL] 复制代码
if sp > 0 and THOLDING<0 then
begin
tSELLSHORT(1,0,MKT),ORDERQUEUE;
tBUY(1,1,MKT),ORDERQUEUE;//tbuy第一个1表示条件永远成立,后一个1表示开仓手数
end

      tbuy第一个1是有用意的,表示当有持仓,且满足平仓和开空条件时,连续执行两个交易操作,一气呵成。而不是先判断平仓条件是否满足进行平仓,再判断开空条件进行开空。

     请注意上述代码使用了市价委托,如在CTP接口上模拟交易,上期所品种不支持市价委托,请注意一定不要在上期所品种下进行交易。
     THOLING与THODING2的不同:THOLING会返回我们当前的可用持仓,发出平仓指令之后,即便没有成交,持仓也会被扣掉,故如果用THOLING做为开仓条件,会有前次平仓没有成交而马上开仓带来的资金不足情况,如果用户需要知道当前自己的实际持仓,那么请用THODING2,他不会因为你的挂单未成交而导致的实际持仓被扣情况。


3.5对于后台程式化交易指定品种下单时填写报单价格的注意事项
   例如如下代码:
[PEL] 复制代码
if TBUYHOLDINGEX('1000','dqc09' , 1)>0 and TSELLHOLDINGEX( '1000','dqm09', 1)>0 then begin
tsell(1,1,lmt,c-2*mindiff,0,'1000','dqc09');
tsellshort(1,1,lmt,c+2*mindiff,0,'1000','dqm09');
end

这是一段套利的代码,应该注意2点;
    1、代码中自己指定下单品种后,预警监控则就不可再次把这两个品种都添加进来,因为后台交易是轮询模式的,会将列进去的品种都监控执行一遍,如上的代码如果添加了两个品种进入预警监控后,会导致重复的开平仓。解决方法是这两个品种只添加任意一只即可。
    2、代码中指定的开仓价是c+2*mindiff,这样犯了致命错误,因为C是当前监控品种的最新价报价,但是下单时确是指定的另外一个品种,解决办法是使用DYNAINFO2函数,使用指定品种买卖盘价格报单。

3.6非主力合约移仓换月(开盘x分钟/秒后)--后台程序化
    系统自带的移仓换月,会在开盘的一瞬间发出,可能会引起较大波动,本例可以实现连续合约换月当天,开盘x分钟后再进行移仓换月。具体示例请参考以下链接:
https://www.weistock.com/bbs/forum.php?mod=viewthread&tid=8737&page=1&extra=#pid45697


3.7








....
四、公式测评

4.1 金字塔公式测试系统,没有测试结果的问题解决
(1)确认所测试品种的测试时间段的历史数据齐全,若不齐全可在测试前按照提醒补充数据。
(2)在第二步的测试时间段确保时间正确。
(3)确保在第一、步所选测试周期选择正确,公式系统该周期未被禁用。
(4)确保第四步交易费率设置合理,资金至少要能够进行必要的开仓条件。该资金设置同样在图表做交易系统测试显示时同样应该注意。
(5)如果不能双向交易,问题是:只有“交易系统”属性得公式支持双向交易测试,其他类型得公式只能单向测试,测试模型在第5步有选项。另外开打公式系统检查公式是否支持双向交易语句。


4.2图表和测评不一致
为什么我做出来的交易系统在图表上显示的信号与在程式化交易评测的结果不一致
主要有如下几点原因造成:
   1、图表上显示用的数据与测试时的数据长度不一致,这种情况请用户保证在评测时在第二步的测试时间段确保时间正确,在选项->维护选项卡中的图形显示和内存保留的数据数量是否一致。
   2、公式属性中的费率设置,主要用于图表上显示所使用,而交易评测里是采用单独设置的,请确保他们两者之间的费率设置一致。
   3、公式属性中的止赢止损设置与交易测评上的止赢止损不一致。
   4、测试设置中的 “复权”、交易坐标类型等基本设置是否与图表一致
   5、有些时候会出现图表上有信号,而测评里没有某些信号的情况,这基本是由于没有把平仓语句写到开仓语句前面而导致的。
小技巧:如果通过上述情况你无法检查到原因,你可以关掉测试报告窗口,然后鼠标右键选中图表上的策略公式名,在弹出的菜单上选择“公式测试”,这样测试的费率和品种等情况金字塔软件会自动帮你与图表上的设置进行对应,你可以直接点“开始”按钮进行测评。


123下一页