cnblue的歌:决策交易系统公式编程8

来源:百度文库 编辑:偶看新闻 时间:2024/04/29 23:39:34

第八章 公式系统的编写调试

基于图表公式的调试

用户在编辑指标过程当中,避免不了进行中间调试,这涉及到遇到中间的变量在某个周期的数值等于多少。比较简单的处理方法是在公式中加以例如:

 A:B+C;

这种方式输出A变量的值在图表显示加以查看,但是有时刻意的将中间变量A输出到图表上显示会破坏图表显示格式,处理方法是在语句后加 ,LINETHICK0 控制符例如:

A:B+C,LINETHICK0;

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

 

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

    由于后台程式化交易和预警我们无法从前台图表上直接看到,因此金字塔提供了一些调试模式供用户使用,由于预警系统是只执行最后一个周期的信号,故这里只针对这个特点进行讨论。

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

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

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

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

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

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

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

比如:

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则表示不显示小数。

附录:  函数参考

金字塔决策交易系统的公式编写系统使用了多类的函数,以达到快速提取数据和提高运算能力,同时简化计算过程的要求。因此在不同类型的函数我们赋予了相当精确的含义,有的函数定义为行情数据提取函数,那么它的功能就是从静态历史上的行情数据或者动态的及时盘中数据提取我们所需要的数据以方便以后的分析和计算;有的函数定义为运算函数,是考虑到一些复杂的数学计算过程过于冗长,从而设计的简化运算的函数等等。在以下的几节中,我们将会分别介绍一共22类的函数。

(1)、函数的基本模型:

K(X1,X2,X3......)

1、K表示函数的名称;

2、X1,X2,X3......表示该函数的所有参数。

不同参数用逗号分隔并用括号将所有函数括起来列于函数名称之后;参数的取值可以是变量也可以是一个常量,具体取值和含义因函数不同而不同;

(2)、函数的引用周期:

应不同的使用者在分析周期习惯上的差异,金字塔决策交易系统特别设定了周期选择,这主要是针对在引用类函数在引用数据时锁定自己所需要的周期,例如在日线上,或者在周线上等等的要求。

如右图所示,一共可以从分笔到多日线等10类选择。

一、行情函数

行情函数是最基本的函数,首先,它为我们提供计算所需的函数,这些函数从存储的数据中取得我们所需要的各类数据,而其他多数函数所需的计算数据一般也是由通过引用行情函数产生的。

1、OPEN

含义:返回本周期的开盘价,简写“O”

参数:无

单位:无

阐释:如果您选定的分析周期为日线,那么“OPEN”就表示取得当天开盘价的数值。

2、HIGH

含义:本周期的最高价,简写“H”

参数:无

单位:无

阐释:如果您选定的分析周期为日线,那么“HIGH” 就表示取得当天最高价的数值。

3、LOW

含义:本周期的最低价,简写“L”

参数:无

单位:无

阐释:如果您选定的分析周期为日线,那么“LOW”就是表示取得当天最低价的数值。

4、CLOSE

含义:本周期的收盘价,简写“C”

参数:无

单位:无

阐释:如果您选定的分析周期为日线,那么“CLOSE”就表示取得当天收盘价的数值。

5、VOL

含义:本周期的成交量

参数:无

单位:无

阐释:如果您选定的分析周期为日线,那么“VOL”就表示取得当天成交量的数值。

6、AMOUNT

含义:本周期的成交额

参数:无

单位:无

阐释:如果您选定的分析周期为日线,那么“AMOUNT”就表示取得当天成交额的数值。

7、ADVANCE

含义:本周期对应大盘内个股上涨家数

参数:无

单位:无

阐释:如果您选定的分析周期为日线,那么“ADVANCE”

就表示取得当天大盘内个股上涨家数的数值。

8、DECLINE

含义:本周期对应大盘内个股下跌家数

参数:无

单位:无

阐释:如果您选定的分析周期为日线,那么“DECLINE”就表示取得当天大盘内个股下跌家数的数值。

9、BUYVOL

含义:主动性买盘成交量,取得本笔成交主动向买盘成交量。当本笔成交为主动性买盘时,其数值等于成交量,否者为0。

限制:仅在分笔成交分析周期中对个股分析时有效,否则为0

参数:无

单位:手

阐释:测试原理

10、BUYVOL

含义:主动性卖盘成交量,取得本笔成交主动性卖盘成交量。当本笔成交为主动性卖盘时,其数值等于成交量,否者为0。

限制:仅在分笔成交分析周期中对个股分析时有效,否则为0

参数:无

单位:手

11、ISBUYORDER

含义:测试是否以主动性买盘成交,取得本笔成交量是否为主动性买单,当本笔成交为主动性买盘时,返回1,否则为0

限制:仅在分笔成交分析周期中对个股分析时有效,否则为0

参数:无

 

省略…

 

注意:在公式编辑中,点击  [ << ] 可弹出函数列表,可按类查找需要的函数。公式中的蓝色字段为函数名,将鼠标放在未知的蓝色字段上,将看到该函数的描述和基本用法。

 

12、移动成本分布函数

成本分布原理:

投资者一般对股票平均成本感兴趣,移动平均MA、指数平滑移动平均EMA等算法都是计算股票平均成本的算法,但是这些算法没有考虑到成交量对平均成本的影响,例如,假设最近一段时间某股票在10-20元间波动,其平均价MA为15元,但观察其成交量发现在20元附近成交量巨大,而在10元附近成交量稀少,我们认为其平均成本显然应该比15元更高才合理,为此我们可以引入换手率移动平均概念;以当天的换手率作为平滑因子计算指数平滑移动平均,用公式来表示为:

Y:=(1-A)*Y’+A*C

A表示换手率,C表示收盘价,Y和Y’分别表示今日平均价和昨日平均价。

加权平均的计算方法是:Zax,其中x为待统计数值,a为x占总量的比例,当日的平均成本Y可以表示为两个部分,当日买入的和以前买入的,当日买入的成本为收盘价C,以前买入的成本为Y’,而当日买入的占总流通盘的比例为换手率A,而以前买入的则占1-A,因此今日的加权平均成本为(1-A)*Y’+A*C,因此,用这个公式更能反映股票的真实成本。

但现在还有两个问题需要解决,其一使用收盘价不能真实表示当日成本,其二是不能了解整个成本的分布情况,即我们只知道平均成本是多少,不知道整个持仓的成本分布情况,而这个分布情况有时是非常有用的。例如某股票的所有持仓成本均为10元,而另一个股票则由50%以5元买入,50%以15元买入,这两只股票均价都是10元,但其表现必然有很大差别。

移动成本分布

移动成本分布就是为解决以上问题提出来的,它将平均成本概念从一条平均线扩展为一个分布图,表示当前所有持仓量的成本分布情况,用等间距的水平线表示分布情况,水平线的垂直位置表示成本所处价位,长度表示相对比例,其中最长的线条占满显示区,其余按照相同比例显示。

成本分布的算法与前面以换手率作为平滑因子计算指数平滑移动平均的基本原理是一样的,主要差别就在于它计算的不是一个而是一组数值,即当日成本不是收盘价,而是从最低价到最高价之间的一组数据。

成本分布算法是基于以下假设计算的:

a)每天的成本平均地分布在最低价到最高价之间,画成移动成本图就是一个最低价到最高价的矩形,这个矩形我们称为当日成本;

b)每天的换手是等概率发生的,即不论买入时机如何,对于股票持有者不管是套牢还是获利,当日抛出的概率是相同的。

成本分布画法:

a)上市每一天的成本分布图就是当日成本,即最低价到最高价间的一个矩形。

b)其后每一天的成本分布图满足Y=(1-A)*Y’+A*B,A表示当日换手,B表示当日成本,Y、Y’分别表示当日和上一日的成本分布,注意,此处BYY’均表示一个分布情况,而不是一个数值。

 

COST(N)

表示当日N%获利盘的价格是多少,即有N%的持仓成本在该价格以下,其余(100-N)%的持仓成本在该价格以上,是套牢盘

限制:仅在日线分析周期有效

参数:N:常量,取值范围0-100

例:COST函数根据获利盘和套牢盘的比例得出其分界线,我们可以由此得到90%的成本集中在COST(5)-COST(95)之间,而70%的成本集中在COST(15)-COST(85)之间;COST(50)表示平均成本,因此COST(95)-COST(5)/COST(50)就表示90%成本分布于平均成本附近的某个范围之内,该数值描述了成本分布的密集程度。

 

WINNER(A)

获利盘比例:表示以A价格卖出时获利盘比例是多少,返回0,1表示10%获利盘。

限制:A:常量或变量

例:WINNER(10.5)表示10.5元价格的获利盘比例

WINNER(CLOSE)表示以当前收市价卖出获利盘的比例

WINNER与COST是正好相反的两个函数,前者由价格求获利盘比例,而后者由获利盘比例求得价格,灵活应用这两个函数,可以定量地进行成本分析计算。