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


金字塔客服中心 - 专业程序化交易软件提供商金字塔软件公式模型编写问题提交 → 公式系统常见问题汇总

   

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


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

主题:公式系统常见问题汇总

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


加好友 发短信
等级:管理员 帖子:7302 积分:32559 威望:1000 精华:45 注册:2003/12/30 16:34:32
公式系统常见问题汇总  发帖心情 Post By:2009/12/1 11:07:37    Post IP:116.231.125.199[显示全部帖子]

贴子已被锁定

 

 

1、用以图表显示的交易系统和后台程式化交易的交易指令函数,参数有明显的不同,用户不能简单的将BUY函数加个T就可以直接后台交易,使用前应该将鼠标放在TBUY函数上认真看看函数说明。

=====================================================

 

2、有关公式函数参数默认值的使用说明

拿后台程式化交易开多指令比如:tbuy(zd,1,mkt,'003028',hy); 初学者容易犯这样一个错误,以为只要使用了mkt指令后,价格就不需要填写了,这是错误的方法,几乎所有的编程语言函数缺省值都是中间不能空缺的,只能从后面空缺。

tbuy(zd,1,mkt)这样是没问题的,后面的参数金字塔将自行按默认处理。

tbuy(zd,1,lmt,c,0) 也是没问题的,后面的帐号和品种均按默认处理。

tbuy(zd,1,mkt,'003028',hy) 但是这样就不行,因为中间的两个委托价格没有填写,金字塔会吧'003028',hy当做价格来处理,势必造成委托结果与你希望的不符。

tbuy(zd,1,mkt,0,0,'003028',hy) ; 这样经过改写,就没问题了。

 

=====================================================

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

后台程式化交易由于用户无法直接在图表上看到信号的整个出现过程,故对用户的公式编写水平有一定的要求,用户需要对金字塔的后台交易系统工作机理有比较深的了解,并且要对自己的公式系统有清晰的认识,这样一旦遇到问题也能及时找到问题的原因。强烈建议用户,只有具有比较熟练的使用图表公式编写基础之后再来使用后台程式化交易!后台程式化交易的调试工作非常重要,请参考下面有关的专门介绍。

如果你对金字塔的后台 程式化交易还不了解,那么建议用户仔细阅读

http://www.weistock.com/bbs/dispbbs.asp?boardid=2&Id=370  金字塔公式编写与程式化交易设计指南

http://www.weistock.com/bbs/dispbbs.asp?boardid=2&Id=124  金字塔程式化交易简要教程

=====================================================

 

4、金字塔公式编写调试

http://www.weistock.com/bbs/dispbbs.asp?boardid=4&id=1246&page=1&star=1

 

=====================================================

 

5、有关平仓反手的模型

 

input:man(26,2,200);

ma1:=ma(close,man);
ccm:=cross(close,ma1);
cmc:=cross(ma1,close);

资产:ASSET,LINETHICK0;
可用现金:CASH(0),LINETHICK0;
持仓:HOLDING,LINETHICK0;

//顺序必须主要需要根据仓位先平后开的原则

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交易信号,同样需要先平后开的原则

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指令

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等

==================================================

 

6、有关在图表程式化交易中使用DYNAINFO、THOLDING等常数函数的特别说明

http://www.weistock.com/bbs/dispbbs.asp?boardid=4&Id=1907 

 

==================================================

 

7、由于金字塔不鼓励使用未来函数,所以

文华的:

NN1:=BARSLAST(DATE<>REFX(DATE,1));
NN:=MAX(NN1,1);

 

在金字塔中用这一条指令替换

NN:=barslast(DATE<>REF(DATE,1))+1;

 

=======================================

 

8、关于函数不能在控制语句之内被引用的问题

答:请参阅专贴介绍 http://www.weistock.com/bbs/dispbbs.asp?boardid=4&Id=130

 

==================================================

 

9、TIME 和 CURRENTTIME 的区别

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

 

===================================================

10、对于最后一个周期才起作用的函数,如果使用了全局变量进行控制,千万记得加上islastbar控制条件

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变为一个周期之内的变量

 

===============================================

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

 

=================================================

12、金字塔公式测试系统,没有测试结果的问题解决

1、确认所测试品种的测试时间段的历史数据齐全,若不起请在工具菜单-》补充数据上补齐。

2、在第二步的测试时间段确保时间正确。

3、确保在第一、步所选测试周期选择正确,公式系统该周期未被禁用。

4、确保第四步交易费率设置合理,资金至少要能够进行必要的开仓条件。该资金设置同样在图表做交易系统测试显示时同样应该注意。

5、如果不能双向交易,问题是:只有“交易系统”属性得公式支持双向交易测试,其他类型得公式只能单向测试,测试模型在第5步有选项。另外开打公式系统检查公式是否支持双向交易语句。

=========================================

 

13、为什么我的交易系统有信号了但是没有委托或者成交,我们以图表交易为重点介绍,对于初学用户,总结原因一般有如下几点:

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),详细解释请看问题15

  11) 图表交易里使用了后台自动交易的函数THOLDING2或者THOLDING或者使用了DYNAINFO等常数函数,由于图表交易不会在产生信号时立即发单,等再次检测时由于之前的发单成交THOLDING已经发生变化导致刚才出现的信号因为THOLDING的信号消失,所以产生了信号漏掉。

  12) 推荐用户仔细看看金字塔的调试技巧文章

http://www.weistock.com/bbs/dispbbs.asp?boardid=4&id=1246&page=1&star=1

    尤其是需要打开下单日志,这样便于在出现问题时,及时的查到问题的原因。

  13)用户要确认自己的策略中没有使用跨周期数据引用或者BACKSET,REFX等未来函数,有些这些未来数据,或造成信号的反复消失及过往的K线突然出现信号,导致用户看起来错过的那跟K线没有下单

  14)是否在模型中使用了小周期引用大周期的情况,同样属于未来数据的使用,会导致信号消失

 

====================================================

14、文华模型转金字塔模型

http://www.weistock.com/bbs/dispbbs.asp?boardid=10&id=25480&page=1&star=1


====================================================

15、有关后台自动交易THOLDING的使用

初学者在使用后台自动交易时,通常认为将函数前简单加T就可以,但实际不行的,比如:

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);
在图表交易系统上这样改过来的代码

 

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

由于我们前面的代码在执行了平仓操作后,THOLDING不会马上变成0,故会导致TBUY的THOLDING=0条件不被成立,导致没有反手信号。

正确的反手写法

 

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;

end

 

有关这部分的用户详细讨论,详见http://www.weistock.com/bbs/dispbbs.asp?boardid=2&Id=2775

 

清注意上述代码使用了市价委托,如在CTP接口上模拟交易,请注意一定要在上期所品种下进行

 

THOLING与THODING2的不同:THOLING会返回我们当前的可用持仓,发出平仓指令之后,即便没有成交,持仓也会被扣掉,故如果用THOLING做为开仓条件,会有前次平仓没有成交而马上开仓带来的资金不足情况,如果用户需要知道当前自己的实际持仓,那么请用THODING2,他不会因为你的挂单未成交而导致的实际持仓被扣情况。

 

=====================================================================

16、用VARIABLE定义的变量和直接赋值定义的变量有何不同?

http://www.weistock.com/bbs/dispbbs.asp?BoardID=2&ID=2501

http://www.weistock.com/bbs/dispbbs.asp?boardid=4&Id=3611

 

======================================================

17、引用指定周期品种数据,指定指标数据的注意事项

在使用"INDIE.VAR"(P1,P2)或者"000001$CLOSE"或者使用CALLSTOCK,STKINDI函数引用其他周期的指标数据时,一些初学者容易犯的一个错误就是认为当前的品种数据全了以后被引用品种的数据也全的,导致在使用引用数据指标时编写的公式无法正常工作。金字塔的在用户翻看一个品种时是可以自动补数据的,但是无法自动补被引用品种的或者该品种不同周期的数据,再首次使用金字塔或者在不确定被引用数据是否齐全时,请手工进行数据补充工作,手工补充数据方法:http://www.weistock.com/download/receivedata.jpg

 

====================================================================

18、为何输出的字符串是100000等数字的

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

 

=====================================================================

问题19以下的帖子,请看二楼

[此贴子已经被作者于2013-1-14 11:21:31编辑过]

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


加好友 发短信
等级:管理员 帖子:7302 积分:32559 威望:1000 精华:45 注册:2003/12/30 16:34:32
  发帖心情 Post By:2010/12/17 17:59:44    Post IP:180.169.30.6[显示全部帖子]

19、得到日内交易模型的开盘,最高价,结算价

最高价: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

 

在一分种周期取前一天最高价、最低价怎么取?

N:=barslast(date<>ref(date,1))+1;
preDayHigh:ref(hhv(h,N),N); //昨日最高价
preDayLOW:ref(LLv(L,N),N);  //昨日最低价

 

在一分种周期取前五分种最高价怎么取?

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)) ;

 

========================================================

20、对于后台程式化交易指定品种下单时填写报单价格的注意事项

例如如下代码:

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函数,使用指定品种买卖盘价格报单。

 

============================================

21、为什么我做出来的交易系统在图表上显示的信号与在程式化交易评测的结果不一致

主要有如下几点原因造成:

   1、图表上显示用的数据与测试时的数据长度不一致,这种情况请用户保证在评测时在第二步的测试时间段确保时间正确,在选项->维护选项卡中的图形显示和内存保留的数据数量是否一致。

   2、公式属性中的费率设置,主要用于图表上显示所使用,而交易评测里是采用单独设置的,请确保他们两者之间的费率设置一致。

   3、公式属性中的止赢止损设置与交易测评上的止赢止损不一致。

   4、有些时候会出现图表上有信号,而测评里没有某些信号的情况,这基本是由于没有把平仓语句写到开仓语句前面而导致的。

 

==============================================

22、如何在后台程序化交易里一个品种的多个策略的交易

 后台程序化函数例如THOLDING返回的是当前我们实际的持仓,故多策略同品种会出现因为持仓和资金相互干扰的现象。解决方案是使用图表的HOLING的虚拟持仓和资金与后台的TBUY,TSELL等混用的方案,每个策略里的持仓和资金都是自己独立的,这样就完全可以避免这种共振现象,但是推荐高级用户使用。

  参考此贴 http://www.weistock.com/bbs/dispbbs.asp?boardid=17&Id=173706

 

================================================

23、程序化系统测试那个最大回撤幅度是如何计算的

  参考专贴讨论 http://www.weistock.com/bbs/dispbbs.asp?boardid=2&id=5078

 

=============================================================

24、交易下单日志怎么启用,选项在哪里

选择“交易”菜单->下单设置->程式化交易->将“记录下单日志”打勾。

在图表交易和后台自动交易的甚至手工下单的过程中,金字塔会将与交易有关的动作记录在内,便于用户查找和分析问题原因。

 

=============================================================

25、如何实现利用指令价入场进行策略的评估?

参考 http://www.weistock.com/bbs/dispbbs.asp?boardid=9&Id=13685

 

=============================================================

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

这种情况一般是因为用户在图表交易上使用了挂单指令或者STOP指令,委托的价格超过了本次K线上的最高最低价格,导致金字塔认为该笔委托属于无效委托导致。金字塔在执行程序化交易测评时,只会根据K线的委托的价位判断是否在高低价格之间做为测评是否属于委托成交的依据,因此挂单止损止赢的交易策略用户是不应该直接使用这种方式的,通常这种方式用在后台程序化交易中,因为后台不需要担负测评任务,因此更适合做此类的精细化控制。

图表的出问题的代码范例:

if holding>0 then Sell(true,1,limitr, AvGENTERPRICE+10);  // 超过入场价10点就止盈

if holding>0 then Sell(true,1,stopr, AvGENTERPRICE-5);   //跌破入场价5个点就止损

 

这种写法在图表程序化中是会出现白色箭头的,也是没有办法进行有效历史评测的,我们应该改成下面的写法:

 

if holding>0 then Sell(c>=AvGENTERPRICE+10,1,limitr,c );  // 超过入场价10点就止盈

if holding>0 then Sell(c<AvGENTERPRICE-5,1,thisclose );   //跌破入场价5个点就止损

 

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

 

[此贴子已经被作者于2019/12/25 11:15:44编辑过]

 回到顶部