等级: 管理员
- 注册:
- 2021-5-18
- 曾用名:
|
做为一款专业为程序化投资者服务的一款软件,仅仅只提供强大的程序化语言支持是不够的,随着用户的经验增长以及对程序化的功能要求增多,程序化的编写难度将变得越来越大,因此我们有必要认真的学习一下本教程所介绍的金字塔各种调试技巧与方法,让您的程序化之路走的更加顺畅。
金字塔的调试基本分3种方法:
1、基于图表的公式调试:该方法用于图表程序化交易,通过十字光标直接在K线图上查看数据;
2、基于后台预警和程式化交易的调试:该方法用于后台程序化交易,通过记录日志方式调试输出变量值;
3、金字塔的公式调试器。
1、基于图表公式的调试
(1)通过十字光标直接在图形公式数据输出区查看数据
顾名思义,该方法就是在图形上通过十字光标定位K线的周期位置,通过反馈回来的变量判断当时公式运行状态。
例如下面的公式
[PEL] 复制代码
ma5:ma(c,5); //5日均线
ma20:ma(c,20);//20日均线
buycon:=cross(ma5,ma20); //5日均线上穿20日均线,开多
sellcon:=cross(ma20,ma5);//5日均线下破20日均线,平多
//开平仓语句:金叉开多、死叉平多
if buycon then buy(holding=0,1,market);
if sellcon then sell(holding>0,1,market);
上面的模型是一个5日均线穿越20日均线的模型,如果我们编写完毕后,需要看在图形上效果,只要点“应用于图”即可
通过双击主图,移动十字光标,然后在窗格上方看到变量的输出结果如下图:
如果假设某一天我们认为是应该是5日均线上穿20日均线,但是实际上他确未能达到目的,这时我们则需要对模型加以有调试功能了:双击主图打开十字光标,比如我们看看为什么在2021年5月25号那天没有信号,打开十字光标,然后移动到这一天
如图所示,我们看到了,当根K线上指标值并不存在下破平仓的条件,所以没有信号出现。
通过这种方式调试我们的公式语句编写,首先要注意的就是语句的执行中,如果有很多条件,要多用中间变量隔开,例如:
[PEL] 复制代码 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;
上述的公式VR把多个表达合并在一起,这样做法不利于我们的调试,因为上述的任何的一个小环节出问题都会导致整个VR的输出环节异常,而仅凭肉眼将很难找出问题的原因,比较好的方法是将上述的公式行拆分,通过中间变量隔开,这样我们就可以通过调试来具体的找出具体哪个环节出的问题。
我们将上面的VR语句更改为:
[PEL] 复制代码 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 := TM1 / TM2 * 100;
通过上述改动,将原来写在一行的代码拆分为3行,提高了代码的可读性,但是上述的代码改动由于TM1等变量为内部中间变量,并不会在窗格上方显示变量数据,当然解决方法是将中间变量修改为画线语句,这样就可以显示了。有时刻意的将中间变量输出到图表上显示会破坏图表显示格式,处理方法是在语句后加 ,LINETHICK0 控制符例如:
A:B+C,LINETHICK0;
强制只做变量在图表输出,但不做画线显示,然后用户在主图双击鼠标打开十字光标,查看A变量在指定周期的数值,进行调试。
(2)通过公式运行变量查看器调试
金字塔提供了专为调试而设立的窗口,只要打开十字光标后,按Shift+Q即可打开鼠标所在窗格内的公式所在十字光标所在周期的全部变量数据,注意是鼠标所在窗格,如果是主图的公式那么鼠标就应该在主图上,副图公式就应该副图的窗格区域。
如图:
因为他可以查看所有的变量(包括中间变量),所以我们也不用加LINETHICK0了。由于只会记录Shift+Q这一次的变量情况,所以之后的鼠标移动也不会对查看结果造成影响。通过该变量查看器,使我们更加方便的调试我们的公式模型了。
由上面的简单公式调试,我们例举了在图表做自动交易调试的一般性做法,对于复杂的公式编写,该方法同样非常的实用有效,所以能够熟练掌握并领会本教程所讲的调试方法,对用户日后编写金字塔的交易模型,至关重要!
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补充。
DEBUGOUT函数示例:
[PEL] 复制代码 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则表示不显示小数。
DEBUGFILE可详细监控记录运行过程中的每个阶段的条件、变量等信息的详细情况。后台程序化多用Debugfile来跟踪调试,调试输出日志适用于图表、后台等。
DebugFile函数示例:
[PEL] 复制代码
//中间变量
ma5:ma(close,5);
ma20:ma(close,20);
//开仓语句
con1:=cross(ma5,ma20); //金叉
con2:=cross(ma20,ma5); //死叉
debugfile('d:\tholding.txt'+stklabel,stklabel +' 持仓量:%.0f',tholding);
if con1 and tholding=0 then
begin
tbuy(1, 1, mkt);
debugfile('d:\tholding.txt'+stklabel,stklabel +' [开仓条件='+numtostr(con1 and tholding=0,0) +']'
+' 各项条件:[开多条件1='+numtostr(con1,0)+' 持仓手数='+ numtostr(tholding,0)+']',0);
end
if con2 and tholding=0 then
begin
tsell(1, 1, mkt);
debugfile('d:\tholding.txt'+stklabel,stklabel +' [平仓条件='+numtostr(con1 and tholding=0,0) +']'
+' 各项条件:[平仓条件1='+numtostr(con2,0)+' 持仓手数='+ numtostr(tholding,0)+']',0);
end
应用释意:(1)debugfile('d:\tholding.txt'+stklabel,stklabel +' 持仓量:%.0f',tholding);
本句是debugfile函数的简单应用,将会在D盘生成以包含下单交易品种的文件,将当前的持仓进行输出。
(2)debugfile('d:\tholding.txt'+stklabel,stklabel +' [开仓条件='+numtostr(con1 and tholding=0,0) +']'
+' 各项条件:[开多条件1='+numtostr(con1,0)+' 持仓手数='+ numtostr(tholding,0)+']',0);
本句是debugfile函数的变型应用,将会输出更多的变量值,满足开仓条件进行开仓操作时,输出时的开仓条件、开多条件、持仓手数。
以下单监控品种IF06为例,将会在D盘生成一个tholding.TXTIF06的文件,在开仓前后,输出的具体内容如下:
2021-06-01 10:35:11.967 IF06 持仓量:0
2021-06-01 10:35:12.978 IF06 持仓量:0
...............................................................................
2021-06-01 10:36:11.967 IF06 持仓量:0
2021-06-01 10:36:12.978 IF06 持仓量:0
2021-06-01 10:36:13.984 IF06 持仓量:0
2021-06-01 10:36:15.003 IF06 [开仓条件=1] 各项条件:[开多条件1=1 持仓手数=0]
2021-06-01 10:36:15.003 IF06 持仓量:0
2021-06-01 10:36:15.971 IF06 持仓量:1
2021-06-01 10:36:16.965 IF06 持仓量:1
2021-06-01 10:36:17.969 IF06 持仓量:1
2021-06-01 10:36:18.963 IF06 持仓量:1
此外金字塔提供的另一个MSGOUT函数,通过在消息窗口自行输出字符串信息,也可以起到很好的调试作用。
日志记录功能
选择“交易”菜单->下单设置->交易设置/场规->将“记录下单日志”打勾。
在图表交易和后台自动交易的甚至手工下单的过程中,金字塔会将与交易有关的动作记录在内,便于用户查找和分析问题原因。
日志格式为:【下单】品种+价格+手数+类型+开平+账户+公式
(1)买卖:买0,卖1
(2)类型:限0,市1 停损2
(3)开平:开0,平1,平今2
应用释意:下单日志中若出现下面一句,说明触发了下单预警:
【下单】CU06 价80900.000000 量1 买卖1 类型0 开平1 账户*****1 Formula 1
品种:CU06 价格:80900 手数:1手 买卖:卖1 类型:限价0 开平:平1 账户:*****1 公式:Formula 1
公式Formula 1以限价80900委托了一手CU06的卖平仓的单子
分享参考
使用金字塔后台程式化交易的几点心得
https://www.weistock.com/bbs/for ... age=1&extra=#pid767
|
|