金字塔各类问题解答大全.docx
- 文档编号:13480827
- 上传时间:2023-06-14
- 格式:DOCX
- 页数:41
- 大小:2.26MB
金字塔各类问题解答大全.docx
《金字塔各类问题解答大全.docx》由会员分享,可在线阅读,更多相关《金字塔各类问题解答大全.docx(41页珍藏版)》请在冰点文库上搜索。
金字塔各类问题解答大全
金字塔各类问题解答大全
按键CTRL+F查找关键字搜索相关问题
此文档将不定期进行更新
一、公式问题汇总
1.1DYNAINFO动态行情等常数函数的特别说明
很多初学者搞不清楚常数与序列数值的区别,这里给大家介绍一下,常数函数不同于序列数值的函数,序列数值的函数,会在调用后返回一串连续的数据,而常数只会返回一个数字,对于DYNAINFO则会返回动态显示牌上的行情报价,即永远都是最新的报价,用户只要在公式系统做个简单的测试公式就能明显看出区别:
AA:
CLOSE;//显示序列数值的收盘
BB:
DYNAINFO(7);//返回常数的最新价
由图上就看到了序列数值是在图形上有个连续的曲线,而常数只是一个横线,他永远都是最新价;
因为常数函数尤其是DYNAINFO的特殊性,初学用户往往会在图表上的交易系统上使用他获取最新报价,这是不行的,因为图表上的交易系统需要有连续的交易信号往往才能正确工作,而使用DYNAINFO函数就会破坏历史的信号生成,造成图表上的交易系统无法计算出正确的结果。
DYNAINFO往往都是在后台自动交易中使用的,因为后台自动交易通常只关心最后一个周期的信号,所以DYNAINFO不会对历史的计算结果产生过多的影响,但并不表明绝对没有影响,如果后台自动交易系统中使用DYNAINFO来计算比如MA等均价,也是无法正常工作的,所以用户必须要搞清楚常数和序列数值的区别,才能更好运用金字塔进行程式化公式的编写。
1.2跨周期调用3小时前的数据如何处理
这里有两种设置方法:
方法一:
需要做以下两步设置:
1、Ctrl+O弹出选项对话框,常规选项卡-》多小时线填3;
2、在所写公式中使用函数STKINDI:
例如:
STKINDI('','KDJ.K(9,3,3)',0,13);
方法二:
完全使用STKINDI函数来实现
例如:
STKINDI('','KDJ.K(9,3,3)',0,13,3);
以上两种方法都是代表“按照交易日坐标调用当前品种三小时前的KDJ中K值”,在图表的划线显示上其实就是把3小时前的K值划线到本周期位置,同理4小时前的K值划线到上一周期位置,依次类推。
1.3公式测试,没有测试结果的问题原因及解决方法
(1)、确认所测试品种的测试时间段的历史数据齐全,若不起请在工具菜单-》补充数据上补齐。
(2)、在第二步的测试时间段确保时间正确。
(3)、确保在第一步所选测试周期选择正确,公式系统该周期未被禁用。
(4)、确保第四步交易费率设置合理,资金至少要能够进行必要的开仓条件。
该资金设置同样在图表做交易系统测试显示时同样应该注意。
(5)、如果不能双向交易,问题是:
只有“交易系统”属性得公式支持双向交易测试,其他类型得公式只能单向测试,测试模型在第5步有选项。
另外开打公式系统检查公式是否支持双向交易语句。
1.4如何使用全局变量variable和extgbdata
在公式中声明的变量不论是否在循环语句中,当每次执行一次循环检测时,都会被初始化一次,如果需要变量只初始化一次,那么需要使用全局变量数据库保存变量状态,请参考:
“EXTGBDATA”,“EXTGBDATASET”两个函数的使用。
关于全局变量,全局变量有两种:
(1)一种是在公式里的,每次执行都被初始化一次的,这里的每次执行指的是每次金字塔执行公式系统的运行,即从1周期到BARCOUNT的过程。
比如一个变量这样声明:
variable:
maxprofit=0;
它只会在第一个周期被初始化赋值为0,其他周期均不会对此变量进行赋值,比如:
variable:
maxprofit=0;
IFBARPOS=2THEN
MAXPROFIT:
=10;
IFBARPOS=10THEN
MAXPROFIT:
=30;
AA:
MAXPROFIT;
通过AA的显示曲线,用户应该会明白全局变量的用法和赋值规律。
另外请注意:
对于最后一个周期(图表上看就是最新的那个周期)才起作用的函数,如果使用了全局变量进行控制,千万记得加上islastbar控制条件,比如下面例子:
variable:
a=10;
debugout('a1=%.0f',a);
ifa=10thenbegin
debugout('a2=%.0f',a);
tbuy(1,1,mkt);
a:
=6;
debugout('a3=%.0f',a);
end;
debugout('a4=%.0f',a);
上面这个例子将无法得到下单买入的目的,因为当程序运行后,在第一周期TBUY并不执行,因为不是最新的周期,而此时a即被赋值为6,那么当程序一遍遍扫描运行到最新周期后,IF语句检测到a=6就不执行买操作了,所以您永远都不会有下单触发。
上述公式将无法正常工作,是因为variable声明的变量是在整个计算周期内的全局变量,对于tbuy和debugout函数,他们都是在公式的最后的一个周期(最新周期的数据才能用于下单或者输入调试结果)才执行的函数,所以将导致最后一个周期到来时a实际已经等于6而不会去正确执行开仓语句。
解决办法是:
ifa=10andislastbarthenbegin这样加上最后周期判断,以避免a被过早赋新值,或者去掉 variable 变量声明,让a变为一个周期之内的变量即可。
(2)金字塔的另一种全局变量,可以保存数据到全局变量数据库中,具体参考“EXTGBDATASET”和“ EXTGBDATA”函数的调用,例如:
IFISLASTBARTHEN
BEGIN
IFCURRENTTIME=090100THEN
BEGIN
DATE1:
=EXTGBDATA('THISOPEN');
IFDATE1<>DATETHEN
BEGIN
SENDMAIL(1,'ABC@SINA.COM;XYZ@WEISTOCK.COM','警报','开盘了');
EXTGBDATASET('THISOPEN',DATE);
END
END
IFCURRENTTIME=145000THEN
BEGIN
DATE2:
=EXTGBDATA('THISCLOSE');
IFDATE2<>DATETHEN
BEGIN
SENDMAIL(1,'ABC@SINA.COM;XYZ@WEISTOCK.COM','警报','收盘了');
EXTGBDATASET('THISCLOSE',DATE);
END
END
END
本代码加全局变量数据库控制,出现警报后置今日的标志位,然后判断标志位控制当天在开盘和收盘时只发一次邮件预警。
1.5如何手工设置EXTGBDATA全局变量初始化值
工具-》数据-》全局变量,然后手工设置数字初始值,另外,第一次使用的全局变量,系统会自动默认为0。
1.6如何让指标中的关键字竖排
如图:
只需在每个字之后加上\n即可,比如上图的实现代码为:
DRAWTEXT(CLOSE/OPEN>1.01,LOW,'你\n们\n好\n');
1.7图表交易系统与后台交易系统的代码转换注意
用以图表显示的交易系统和后台程式化交易的交易指令函数,参数有明显的不同,用户不能简单的将BUY函数加个T就可以直接后台交易,使用前应该将鼠标放在TBUY函数上认真看看函数说明。
1.8关于未来函数的使用
由于金字塔不鼓励使用未来函数,所以
文华的:
NN1:
=BARSLAST(DATE<>REFX(DATE,1));
NN:
=MAX(NN1,1);
在金字塔中用这一条指令替换:
NN:
=barslast(DATE<>REF(DATE,1))+1;
1.9函数不能在IF控制语句中被引用的原理和解决方案
简单说来就是具有统计性质的函数不可以在IF语句中后面的begin…end中不可以使用,可以在IF的判断过程中使用,但不可以在IF的执行过程中使用。
金字塔的公式系统由于支持IF语句的变量运行,所以像例如REF,MA等带有统计性质的函数无法直接使用在IF语句之中,因为带变量判断的IF语句会在某些周期无法调用这些统计函数而导致计算结果出现错误。
解决办法是将这些函数放到IF语句之外去执行。
目前有下列函数受此限制:
"RET","LOD","HOD","VALUEWHEN","MD","LAST","ANY","SETVAL","FILTERX","BARSCOUNT","BARSLAST","BARSSINCE","COUNT","HHV","HHVBARS","LLV","LLVBARS",
"MA","DMA","EMA","FILTER","REF","WMA","TMA","SMA","SUM","SUMBARS","CROSS","LONGCROSS","AVEDEV","DEVSQ","FORCAST","SLOPE","STD","STDP","VAR","VARP","SAR","BETA","COVAR","ALL",
"BACKSET","REFX","PARTLINE","SFILTER","RELATE","ALIKE","FILLRGN","NEWHBARS","NEWLBARS"
例如:
input:
atrn1(1,1,10),atrn2(5,2,20);
ifatrn1
begin
TR1:
=MAX(MAX((HIGH-LOW),ABS(REF(CLOSE,1)-HIGH)),ABS(REF(CLOSE,1)-LOW));
ATRn_1:
= MA(TR1,atrn1);
ATRn_2:
= MA(TR1,atrn2);
end;
上述公式语句由于将REF和MA函数放在了IF语句之中,所以该公式无法正常编译。
解决办法是将他们放到IF语句之外去执行:
input:
atrn1(1,1,10),atrn2(5,2,20);
A1:
=REF(CLOSE,1);
MA1:
=MA(TR1,atrn1);
MA2:
=MA(TR1,atrn2);
ifatrn1
begin
TR1:
=MAX(MAX((HIGH-LOW),ABS(A1-HIGH)),ABS(A1-LOW));
ATRn_1:
=MA1;
ATRn_2:
=MA2;
end;
这样经过修正的公式就可以正常编译了,此外公式还将两次REF语句引用合并到一个语句中,这样做还可以提高公式系统的运行效率,因为REF统计语句只执行了一次。
1.10有关公式函数参数默认值的使用说明
拿后台程式化交易开多指令比如:
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);这样经过改写,就没问题了。
1.11金字塔公式系统的编写调试DEBUGOUT和DEBUGFILE
(1)基于图表公式的调试
用户在编辑指标过程当中,避免不了进行中间调试,这涉及到遇到中间的变量在某个周期的数值等于多少。
比较简单的处理方法是在公式中加以例如:
A:
B+C;
这种方式输出A变量的值在图表显示加以查看,但是有时刻意的将中间变量A输出到图表上显示会破坏图表显示格式,处理方法是在语句后加,LINETHICK0控制符例如:
A:
B+C,LINETHICK0;
强制只做变量在图表输出,但不做画线显示,然后用户在主图双击鼠标打开十字光标,查看A变量在指定周期的数值,进行调试。
(2)基于后台预警和程式化交易的调试
后台程式化交易由于用户无法直接在图表上看到信号的整个出现过程,故对用户的公式编写水平有一定的要求,用户需要对金字塔的后台交易系统工作机理有比较深的了解,并且要对自己的公式系统有清晰的认识,这样一旦遇到问题也能及时找到问题的原因。
如果你对金字塔的后台程式化交易还不了解,那么建议用户仔细阅读
金字塔公式编写与程式化交易设计指南
金字塔程式化交易简要教程
供后台调试金字塔提供了两个函数DEBUGOUT和DEBUGFILE,其中DEBUGOUT是只针对程式化交易使用,在Ctrl+A预警设置窗口点击“监控”按钮后的程式化交易监控窗口,将显示出当前每个品种的监控过程以及下单动作,DEBUGOUT函数的描述如下:
DEBUGOUT(STR,NUM),STR为用户指定输出的一个行文字,NUM为用户指定的一个监控数字.
例如:
DEBUGOUT('当前资产为%.2f',TASSET),将在程式化交易的监控部分打印出来"当前资产为1234.00",(假设当前的资产为1234)
"%.2f"为一个打印的控制符号,系统会将他替换为指定的一个数字输出,%.2f为显示两位小数,%.0f则表示不显示小数.
用户最常见的问题就是,从图表上看明明应该某个时间段应该是开平仓了,但是结果确没有反应,后台并没有按预计发出交易指令,这种情况用户一般需要基于下面原因考虑:
1、用于交易的品种历史数据是否补齐,因为金字塔的历史数据是基于点播模式补充的,处于后台交易的品种如果缺失数据将会导致交易信号出现不可预料的情况。
2、用户所选择的交易系统周期是否合理,预警监控间隔时间是否合理,甚至用户是否选中了“允许程式化交易”复选框。
3、用户的TBUY等交易指令在多帐户交易时,市价委托是否指定了交易价格,常见错误是用户认为指定MKT指令后就不用填写价格了,应该填0补充。
比如:
MA3:
MA(C,3);
MA5:
MA(C,5);
BK:
=CROSS(MA3,MA5);
BP:
=CROSS(MA5,MA3);
TBUY(BK,1,LMT,C);//按照最新价限价开多
TSELL(BP,0,LMT,C);//按照最新价限价平多,0表示平掉全部持仓
这样一个简单的公式,是否出现交易信号,完全取觉于BK和BP这两个变量的计算结果,只要这样
MA3:
MA(C,3);
MA5:
MA(C,5);
BK:
=CROSS(MA3,MA5);
BP:
=CROSS(MA5,MA3);
DEBUGOUT(‘BK=%.0f’,BK);
DEBUGOUT(‘BP=%.0f’,BP);
TBUY(BK,1,LMT,C);//按照最新价限价开多
TSELL(BP,0,LMT,C);//按照最新价限价平多,0表示平掉全部持仓
这样用户就可以一直在程式化交易监控窗口看到整个变量在不断循环中的值变化了,给用户带来了调试的机会。
但是上述的只表达BK,BP这两个信号可能并不能让用户最终找到问题原因,要找到,用户可能还得将MA3,MA5的变量值变化也打印输出,只要一直这样往上逐个筛选每个结果数据,就能最终找到问题的原因。
金字塔的另一个函数DEBUGFILE,可以将调试日志记录文件中,方便用户查询更长的历史记录,如果用户不习惯使用DEBUGOUT的窗口输出模式,可以使用DEBUGFILE做输出,使用其他文本工具打开。
另外,DEBUGFILE与DEBUGOUT不同之处在于他不限于一定运行在后台程式化交易环境中,DEBUGFILE描述如下:
用法:
DEBUGFILE(PATH,STR,NUM),PATH为用户的本地计算机路径,STR为用户指定输出的一个行文字,NUM为用户指定的一个监控数字.
例如:
DEBUGFILE('D:
\TEST.TXT','当前资产为%.2f',1234),将在程式化交易的监控部分输出到D:
\TEST.TXT文件,"当前资产为1234.00","%.2f"为一个打印的控制符号,系统会将他替换为指定的一个数字输出,%.2f为显示两位小数,%.0f则表示不显示小数。
1.12有关平仓反手的模型的介绍
input:
man(26,2,200);
ma1:
=ma(close,man);
ccm:
=cross(close,ma1);
cmc:
=cross(ma1,close);
资产:
ASSET,LINETHICK0;
可用现金:
CASH(0),LINETHICK0;
持仓:
HOLDING,LINETHICK0;
//顺序必须主要需要根据仓位先平后开的原则
ifccmthen
begin
//平空开多
sellshort(holding<0andccm,0);
buy(holding<=0,1);
end
ifcmcthen
begin
//平多开空
sell(holding>0andcmc,0);
buyshort(holding>=0,1);
end
如果是传统的ENTERLONG交易信号,同样需要先平后开的原则
EXITLONG:
cross(A2,AO)ORB2>0;
EXITSHORT:
CROSS(AO,A2)ORB2>0;
ENTERLONG:
cross(AO,A2)ANDB1=1;
ENTERSHORT:
CROSS(A2,AO)ANDB1=1;
如果用户帐户资金不足或者希望顺序成交,可以使用ORDERQUEUE指令
EXITLONG:
cross(A2,AO)ORB2>0,ORDERQUEUE;
EXITSHORT:
CROSS(AO,A2)ORB2>0,ORDERQUEUE;
ENTERLONG:
cross(AO,A2)ANDB1=1,ORDERQUEUE;
ENTERSHORT:
CROSS(A2,AO)ANDB1=1,ORDERQUEUE;
ORDERQUEUE指令适合所有交易指令,包括BUY,TBUY等
1.13TIME和CURRENTTIME的区别
很多用户需要在一个精确的时间内做某些下单动作,比如开盘后5分钟下单,收盘前1分钟平仓,这种时候不能使用TIME函数做时间点判断,因为TIME是取的周期时间,金字塔在生成每根K线时为了规范化时间,都将时间做了一定程度的修整,所以已经不是严格的成交时间。
如果用户需要精确的时间做某些事情,那么必须使用CURRENTTIME,取用户本地计算机时间来完成。
为了保证时间准确可靠,用户应该定期的校正您的本地时间,方法可在工具->选项->升级和时间。
1.14为什么我的交易系统有信号但没有委托或成交
为什么我的交易系统有信号了但是没有委托或者成交,我们以图表交易为重点介绍,对于初学用户,总结原因一般有如下几点:
1、用户需确认在出现交易信号之后金字塔是否有发出委托指令,用户可以在交易记录中查询到,如果有委托但未成交主要有两点,对于模拟交易,如果使用综合交易平台系统,由于目前并不完善,会经常造成即便市价下单也无法及时成交的情况。
对于实盘交易,用户需要在报单策略上多仔细考虑尽量的发出对价单来保证其成交。
2、如果有信号没有委托发出,请确认是否是下列几点造成
1)金字塔会在打开一个品种的图表后自动补充历史数据,确认是否是因为自动补数据造成的在交易时没有信号出现,但是补数据后历史上出现交易信号,但是用户通过查询历史成交记录觉得对不上了。
2)如果用户使用模拟交易,目前模拟交易得稳定性没有实盘交易好,所以如果盘中中断,那么会导致出现后错过时机。
3)对于无法发出平仓指令的情况,一般情况是因为开仓指令的委托单,没有及时成交,由于平仓信号发出时没有仓位,金字塔无法仓可平,等信号错过后,开仓单才成交,造成了看起来漏掉了一个平仓信号。
4)因为平仓反手不对称造成,最常见的是发出平仓信号后没有及时成交,但是反手单却提前成交了,造成了锁仓,导致金字塔判断仓位方向不确定会导致平仓单信号漏掉,对于反手情况,初学用户请尽量使用市价委托,并使用ORDERQUEUE指定顺序成交,否则就建议初学者尽量使用对价报单,尽量避免不成交的几率出现,否则初学用户就应该初期只使用单向交易,等日后能够熟练应用金字塔的追单功能后再使用挂单性质的反手交易手法。
5)如果使用固定时间间隔,间隔时间设置过大,造成信号在周期的末尾时出现,但正好在扫描的时间间隔之内,造成了出现信号金字塔没有及时的得知,对于此情况建议用户将间隔时间设为1秒
6)如果用秒线或者分笔周期,请务必选择“高频”选项,避免行情快速变化时由于固定轮循最小1秒间隔带来的信号漏单。
7)如果使用了ORDERQUEUE顺序下单指令,那么应该尽量的让其一次性成交,必要时请使用市价委托,因为一旦队列下单不成交撤单后,再次委托会将委托追单排到最后,导致后面的比如反手指令无法正确得到执行,造成信号漏单。
8)后台自动交易不要将THOLDING写在交易语句里比如TBUY(bkandTHOLDING=0,1,MKT)。
9)使用固定轮循模式执行指标交易,由于最后一个K线没有最终形成,信号出现后下单,但是信号又消失,造成历史信号与持仓不吻合,这时建议大家使用K线走完模式,保证信号稳定。
1.15有关后台自动交易THOLDING的使用
初学者在使用后台自动交易时,通常认为将函数前简单加T就可以,但实际不行的,比如:
tSELL(bpandTHOLDING>0,0,LMT,C);
tSELLSHORT(spandTHOLDING<0,0,LMT,C);
tBUY(bkandTHOLDING=0,1,LMT,C);
tBUYSHORT(skandTHOLDING=0,1,LMT,C);
在图表交易系统上这样改过来的代码
THOLDING与图表HOLDING最大的不同在于,THOLDING是与你真实持仓一致的函数,只有当我们的委托下单成交后才会有所变化,而HOLDING是虚拟持仓,BUY执行过后立即变化。
由于我们前面的代码在执行了平仓操作后,THOLDING不会马上变成0,故会导致TBUY的THOLDING=0条件不被成立,导致没有反手信号。
正确的反手写法
ifbp>0andTHOLDING>0then
begin
tSELL(1,0,MKT),ORDERQUEUE;
tBUYSHORT(1,1,MKT),ORDERQUEUE;
end
ifsp>0andTHOLDING<0then
begin
tSELLSHORT(1,0,MKT),ORDERQUEUE;
tBUY(1,1,MKT),ORDERQUEUE;
end
清注意上述代码使用了市价委托,如在CTP接口上模拟交易,请注意一定要在上期所品种下进行
二、软件设置问题
1.16如何可以看到多日分时线?
金字塔默认情况下关闭多日分时,这是基于效率方面的考虑,同时
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 金字塔 各类 问题解答 大全