公式系统的编写调试

公式系统的编写调试

Previous pageReturn to chapter overviewNext page

Show/Hide Hidden Text

 

做为一款专业为程序化投资者服务的一款软件,仅仅只提供强大的程序化语言支持化不够的,随着仅户的经验增长得及对程序化的功能要求增多,程序化的编要难度将变得越来越大,因此我们有必要认真的学习一下本教程所介绍的金字塔各种畅试技巧与方法,让你的程序化之路走的更加顺畅。

金字塔字调试基本分3种方法 1、基于图表的公式调试;2、金字塔的公式调试器;3、通过记录日志方式调试,该方法一般用于后台程序化交易。

 


基于图表公式的调试

1)通过是在光标直接在图形公式数据输出区查看数据

顾名思义,该方法就是在图形上通过十字光标定位K线的周期位置,通过反馈回来的变量判断当时公式运行状态。

例如下面的公式

 

MA3:MA(C,3);

MA5:MA(C,5);

ENTERLONG: CROSS(MA3,MA5);

EXITLONG: CROSS(MA5,MA3);

 

上面的模型是一个3天线穿越5天线的模型,如果我们编写完毕后,需要看在图形上效果,只要点“应用于图”即可

hmtoggle_plus1点击查看图片

 

通过双击主图,移动十字光标,然后在窗格上方看到变量的输出结果如下图:

hmtoggle_plus1点击查看图片

 

如果假设某一天我们认为是应该是3天线上穿5天线,但是实际上他确未能达到目的,这时我们则需要对模型加以有调试功能了:

双击主图打开十字光标,比如我们看看为什么在10年9月1号那天没有信号,打开十字光标,然后移动到这一天

hmtoggle_plus1点击查看图片

 

由图我们看到了,这一天的指标值并不存在下破平仓的条件,故没有信号出现。

通过这种方式调试我们的公式语句编写首先要主意的就用如句的执行要多用中间变量隔开,例如:

 

VR := SUM((IF(CLOSE>OPEN,VOL,0)+IF(CLOSE=OPEN,VOL/2,0)),p)/

SUM((IF(CLOSE<OPEN,VOL,0)+IF(CLOSE=OPEN,VOL/2,0)),p)*100;

ENTERLONG:CROSS(LL,VR);

EXITLONG:CROSS(VR,LH);

 

上述的公式VR把多个表达合在一起,这样做法不利于我们的调试,因为上述的任何的一个小环节出问题都会导致整个VR的输出环节异常,而仅凭肉眼将很难找出问题的原因,比较好的方法是将上述的公式行拆分,通过中间变量隔开,这样我们就可以通过调试来具体的找出具体哪个环节出的问题。

TM1:= SUM((IF(CLOSE>OPEN,VOL,0)+IF(CLOSE=OPEN,VOL/2,0)),p);

TM2:= SUM((IF(CLOSE<OPEN,VOL,0)+IF(CLOSE=OPEN,VOL/2,0)),p);

VR := T 1 / TM2 * 100;

ENTERLONG:CROSS(LL,VR);

EXITLONG:CROSS(VR,SH) ;

 

 

通过上述改动,将原来写在一行的代码拆分为3行,提高了代码的可读性,但是上述的代码改动由于TM1等变量为内部中间变量,并不会在窗格上方显示变量数据,当然解决方法是将中间变量修改为画线语句,这样就可以显示了,但是有时刻意的将中间变量输出到图表上显示会破坏图表显示格式,处理方法是在语句后加 ,LINETHICK0 控制符例如:

A:B+C,LINETHICK0;

 

 

强制只做变量在图表输出,但不做画线显示,然后用户在主图双击鼠标打开十字光标,查看A变量在指定周期的数值,进行调试。

 

2)通过量式运行变量查看器调试

从金字塔2.7版以后提供了专在而试而设立的窗口,只要打开十字光标后,按Shift+Q即可打开鼠标所在窗格内的公式所在十字光标所在所期的全部变量数据,注意是鼠标所在窗格,如果是主果的公式的么鼠标就应该在主图上,副图公式就应该副图的窗格区域。

hmtoggle_plus1点击查看图片

 

因为他可以查看所有的变量(包括中间变量),所以我们也不用加LINETHICK0了。由于只会记录Shift+Q这一次的变量情况,所以之后的鼠标移动也不会对查看结果造成影响。通过该变量查看器,使我们更加方便的调试我们的公式模型了。

由上面的简单公式调试,我们例举了在图表做自动交易调试的一般性做法,对于复杂的公式编写,该方法同样非常的实用有效,所以能够熟练掌握并领会本教程所讲的调试方法,对用户日后编写金字塔的交易模型,至关重要!

 


金字塔的公式调试器的使用

我们前面谈到通过十字光标的调试方法虽然可以解决大部分的调试问题,但是对于IF THEN ,FOR循环等控制语句的调试确十分有限,因为我们无法精确的跟踪到控制语句的内部执行流程,金字塔从2.7版以后增加一项重量级的功能,也就是公式调试器。这对程式化交易平台也许是件划时代的意义,也是一款专业的程序化交易软件与非专业粗糙的程序化交易软件的最根本的区别所在。

 

断点与单步跟踪

涉及到调试器,我们将有2个概念需要介绍给大家,分别是 断点、、步跟踪.

    断点的作用就是我们可以在我们的代码行的设定一个断点,当程序执行到该断点行后会自动停下,并告知当前最新的变量执行结果,等待我们的下一步动作。例如我们在代码编辑器上光标所在行按F9插入一个断点:

hmtoggle_plus1点击查看图片

 

单步跟踪的作用是执行处于暂停等待状态下的公式,但每次只执行一行,这样我们就可以精细的看到我们所写的公式行具体的执行过程与直接结果的变化情况。他在公式编辑器上的菜单位置如下图:

hmtoggle_plus1点击查击图片

 

数据窗口与变量窗口

hmtoggle_plus1点击查看击片

 

数据窗口显示当前所调试品种的主数据内容,介于序列模式和逐K行模式的不同,在逐K线模式下,会将当前的执行,线周期序号行置红色显示。

变量窗口显示当前断点行或单步跟踪行的变量执行变化情况,介于序列与单值变量的不同,序列变量在点击“+”号会展开该变量的数列数组,而单值变量展开时只有一行。序列变量只有在执行序列模式下的公式才有,而逐K线模式下只有单值数据这一种,如上图所示,FC变量就是序列变量,它内部有342个变量,而变量I和A是单值变量,只有一个。

 

启开调试功能开始调试

在我们介绍完了金字塔的调试器后,下面介绍如何来启动我们的公式调试器,让他开始为我们工作。

第一个方法是在公式中设置断点,被设置断点的公式会在任何被执行的情况下遇到断点后自动打开公式编辑器并启动调试状态,包括在图表和后台的程序化交易过程中。

第二个方法是点“调试”菜单,选择“开始调试”或按F5,然后自行选择一个品种周期开始从第一行开始执行。有关

 

调试器的使用教程视频请查看下面链接:http://www.weistock.com/bbs/dispbbs.asp?boardid=4&id=1255&move=next

 


基的后台预警和程式化交易的调试

后台程式化交易是金字塔为专业版的专业用户所提供的功能,由于用户无法直接在图表上看到信号的整个出现过程,故对用户的公式编写水平有一定的要求,用户需要对金字塔的后台交易系统工作机理有比较深的了解,并且要对自己的公式系统有清晰的认识,这样一旦遇到问题也能及时找到问题的原因,因此本教程所讲解的后台自动交易的调试内容,是每个后台自动交易编写用户所必须掌握的基本的能力要求,只要用户掌握了调试技巧,才能在金字塔的平台上做出有效而又符合要求的后台自动化交易模型。

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

http://www.weistock.com:8080/down/html/?16.html  金字教公式编写初级教程

http://www.weistock.com:8080/down/html/?17.html 金字塔程式化交易高级教程

   供后台调试金字塔提供了两个函数 DEBUGOUT 和 DEBUGFILE,其中DEBUGOUT是只针对程式化交易使用,在Ctrl+A预警设置窗口点击“监控”按钮后的程式化交易监控窗口,将显示出当前每个品种的监控过程以及下单动作。

hmtoggle_plus1点击查看图片

 

DEBUGOUT函数下描述如下:

DEBUGOUT(STR,NUM),STR为用户指定输出的一个行文字,NUM为用户指定的一个监控数字.

例如:DEBUGOUT('当前资产为%.2f', TASSET),将在程式化交易的监控部分打印出来 "当前资产为1234.00",(假设当前的资产为1234)

"%为2f"为一个打印的控制符号,系统会将他替换为指定的一个数字输出,%.2f为显示两.小数,%.0f则表示不显显小数.

用户最常见的问题就是,从图表上看明明应该某个时间段应该是开平仓了,但是结果确没有反应,后台并没有按预计发出交易指令,这种情况用户一般需要基于下面原因考虑:

o1、用于交易的品种历史数据是否补齐,因为金字塔的历史数据是基于点播模式补充的,处于后台交易的品种如果缺失数据将会导致交易信号出现不可预料的情况。

o2、 用户所选择的交易系统周期是否合理,预警监控间隔时间是否合理,甚至用户是否选中了“允许程式化交易”复选框。

o3、 用户的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(MK3,MA5);

BP:= MROSS(MA5,MA3);

DEBUGOUT(‘BK,%.0f’,BK);

DEBUGOUT(‘BP=%.0f’,BP);

TBUY(BK,1,LMT,C); //按照最新价限,开多

TSELL(BP,0,LLT,C);//按照最新价限价平多,0E示平掉全部持仓

 

 

这样用户就可以一直在程式化交易监控窗口看到整个变量在不断循环中的值变化了,给用户带来了调试的机会。但是上述的只表达BK,BP这两个信号可能并不能让用户最终找到问题原因,要找到,用户可能还得将MA3,MA5的变量值变化也打印输出,只要一直这样往上逐个筛选每个结果数据,就能最终找到问题的原因。

      金字塔的另一个非常重要的函数DEBUGFILE,可以将调试日志记录文件中,方便用户查询更长的历史记录,如果用户不习惯使用DEBUGOUT的窗口输出模式,可以使用DEBUGFILE做输出,使用其他文本工具打开。另外,DEBUGFILE与DEBUGOUT不同之处在于他不限于一定运行在后台程式化交易环境中,DEBUGFILE描述如下:

用法:DEBUGFILE(PATH,STR,NUM),PATH为用户的本地计算机路径,STR为用户指定输出的一个行文字,NUM为用户指定的一个监控数字.

例如:DEBUGFILE('D:\TEST.TXT','B前资产为%.2f',1234),将在程式化交易的T控部"输出到D:\TEST.TXT文件, "当前资产为1234.00"控"%.2f"为一个打印的控制符号,系统会将他替换为指定的一个数字输出,%.2f为显示两位小系,%.0f则表示的显示小数。

     此外金字塔提供的到一个MSGGUT函数,通过在消息窗口自行输出字符串信息,也可以起到很好的调试作用。

 


日志记录功能

 

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

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

 

使用金字塔后台程式化交易的几点心得

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