金字塔决策交易系统

 找回密码
 

微信登录

微信扫一扫,快速登录

搜索
查看: 12403|回复: 2

【详解】金字塔公式系统的编写调试

[复制链接]

14

主题

223

帖子

308

积分

Rank: 9Rank: 9Rank: 9

等级: 管理员

注册:
2021-5-18
曾用名:
发表于 2021-5-31 11:05 | 显示全部楼层 |阅读模式
  做为一款专业为程序化投资者服务的一款软件,仅仅只提供强大的程序化语言支持是不够的,随着用户的经验增长以及对程序化的功能要求增多,程序化的编写难度将变得越来越大,因此我们有必要认真的学习一下本教程所介绍的金字塔各种调试技巧与方法,让您的程序化之路走的更加顺畅。
  金字塔的调试基本分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日均线的模型,如果我们编写完毕后,需要看在图形上效果,只要点“应用于图”即可
应用于图.png    

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

  如果假设某一天我们认为是应该是5日均线上穿20日均线,但是实际上他确未能达到目的,这时我们则需要对模型加以有调试功能了:双击主图打开十字光标,比如我们看看为什么在2021年5月25号那天没有信号,打开十字光标,然后移动到这一天
截图202105311532532629..png

  如图所示,我们看到了,当根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即可打开鼠标所在窗格内的公式所在十字光标所在周期的全部变量数据,注意是鼠标所在窗格,如果是主图的公式那么鼠标就应该在主图上,副图公式就应该副图的窗格区域。
  如图: 截图202106021502194091..png


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

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

2、基于后台预警和程式化交易的调试
  后台程式化交易是金字塔为专业版的专业用户所提供的功能,由于用户无法直接在图表上看到信号的整个出现过程,故对用户的公式编写水平有一定的要求,用户需要对金字塔的后台交易系统工作机理有比较深的了解,并且要对自己的公式系统有清晰的认识,这样一旦遇到问题也能及时找到问题的原因,因此本教程所讲解的后台自动交易的调试内容,是每个后台自动交易编写用户所必须掌握的基本的能力要求,只要用户掌握了调试技巧,才能在金字塔的平台上做出有效而又符合要求的后台自动化交易模型。
  供后台调试金字塔提供了两个函数 DEBUGOUT 和 DEBUGFILE,其中DEBUGOUT是只针对程式化交易使用,在Ctrl+A预警设置窗口点击“监控”按钮后的程式化交易监控窗口,将显示出当前每个品种的监控过程以及下单动作
截图202106011037404794..png

   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
金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

14

主题

223

帖子

308

积分

Rank: 9Rank: 9Rank: 9

等级: 管理员

注册:
2021-5-18
曾用名:
 楼主| 发表于 2021-6-2 14:57 | 显示全部楼层
3、金字塔的公式调试器      我们前面谈到通过十字光标的调试方法虽然可以解决大部分的调试问题,但是对于IF THEN ,FOR循环等控制语句的调试确十分有限,因为我们无法精确的跟踪到控制语句的内部执行流程,金字塔从2.7版以后增加一项重量级的功能,也就是公式调试器。这对程式化交易平台也许是件划时代的意义,也是一款专业的程序化交易软件与非专业粗糙的程序化交易软件的最根本的区别所在。
(1)断点单步跟踪
      涉及到调试器,我们将有2个概念需要介绍给大家,分别是 断点、单步跟踪.
      断点的作用就是我们可以在我们的代码行的设定一个断点,当程序执行到该断点行后会自动停下,并告知当前最新的变量执行结果,等待我们的下一步动作。例如我们在代码编辑器上光标所在行按F9插入一个断点:
029.jpg

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

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

031.jpg

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

      (2)启动调试功能开始调试
       在我们介绍完了金字塔的调试器后,下面介绍如何来启动我们的公式调试器,让他开始为我们工作。
       第一个方法是在公式中设置断点,被设置断点的公式会在任何被执行的情况下遇到断点后自动打开公式编辑器并启动调试状态,包括在图表和后台的程序化交易过程中。
       第二个方法是点“调试”菜单,选择“开始调试”或按F5,然后自行选择一个品种周期开始从第一行开始执行。

金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

4

主题

132

帖子

143

积分

Rank: 9Rank: 9Rank: 9

等级: 管理员

注册:
2021-5-10
曾用名:
发表于 2022-5-6 17:34 | 显示全部楼层
为解决图表和后台程序化下使用DEBUGFILE的麻烦,从6.3版后金字塔提供自带的监控日志输出功能,可以更好更方便的为公式程序化的运行调试提供帮助,详情请见:
https://www.weistock.com/docs/HELP/notes/%E7%A8%8B%E5%BA%8F%E5%8C%96%E4%BA%A4%E6%98%93/%E5%8F%98%E9%87%8F%E8%B7%9F%E8%B8%AA.html
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 微信登录

本版积分规则

手机版|小黑屋|上海金之塔信息技术有限公司 ( 沪ICP备13035422号 )

GMT+8, 2024-12-22 09:47 , Processed in 0.226306 second(s), 24 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表