网站首页 >> 交易开拓者程序化平台介绍 >> 第六章 TB公式应用 >> 二、TB公式交易策略类

3、编写思路

交易,有买有卖方可形成交易。所以一次完整的交易,必须要有开仓以及平仓的动作。

首先,理顺思路,将交易规则转化为相关的条件语句表达式,确立策略中的交易头寸及要采用的参数和变量;

然后,确定需要使用的交易命令;

最后,在公式中进行相应的定义,完成策略实现代码。

【案例讲解】

案例:按照如下交易规则实现策略。(DualMA双均线系统)

l  如果短期均线上穿长期均线,做多,如原来持有空单,则先平空单,再建多仓

l  如果短期均线下穿长期均线,做空,如原来持有多单,则先平多单,再建空单

l  短周期:10

l  长周期:20

l  交易头寸默认1

分析:

l  交易规则“短期均线上、下穿长期均线”转化为条件语句,使用条件表达式比较两个变量的大小

l  定义相关的变量:短周期、长周期和交易头寸分别设置为参数,这样比较灵活,如果需要修改,可以直接在公式属性参数中改变其值,而无需修改公式,重新编译;设置两个序列变量,分别保存长短周期的均线值,设置为序列变量方便比较;

l  根据交易规则,需要使用分支语句,根据不同的条件进行不同的操作;

l  根据交易规则,确定采用buysellshort交易函数。

流程图(图9-14):

图9-14.          DualMA双均线系统流程图

代码:

Params    

         Numeric Length1(10);

         Numeric Length2(20);

         Numeric Lots(1); 

Vars 

         NumericSeries MA1;

         NumericSeries MA2;

Begin

         MA1 = AverageFC(Close,Length1); 

         MA2 = AverageFC(Close,Length2);

         PlotNumeric("MA1",MA1);

         PlotNumeric("MA2",MA2);

         If (MA1[1] > MA2[1])

         {

                   Buy(Lots,Open);

         }

         If (MA1[1] < MA2[1])

         {

                   SellShort(lots,Open);

         }  

End

【知识点详解】

策略的头寸

n  直接指定交易头寸

n  使用参数(如上述DualMA双均线案例)

n  使用默认头寸,实际交易的数量在“全局交易设置…”里进行设置

Buy(0,price);   //第一个数值0,表示买入默认手数

设置方法:

方法一、在超级图表中已调用的交易策略名称上单击鼠标右键,在弹出菜单中选择“全局交易设置…”菜单项,打开“全局交易设置”对话框(图9-15),在“默认数量”中可以按固定合约数、资金比例及固定资金这三种方法进行设置;

方法二、在图表上单击鼠标右键,在弹出菜单中选择“公式应用设置”菜单项,打开公式应用设置窗口,在其中找到“全局交易设置”按钮,单击打开“全局交易设置”对话框(图9-15),然后进行具体设置。

                    

图9-15.          “全局交易设置”对话框

其中资金比例是参照初始资金的设置来计算的,所以注意设置一个合理的、符合实际情况的初始资金数。

n  根据资产具体情况以及交易要求计算得出

定义变量,通过对资产、行情等条件的计算以及其它的判断条件确定交易的数量。

例:交易开拓者软件的系统公式里自带的“海龟交易系统”

AvgTR = XAverage(TrueRange,ATRLength);

N = AvgTR[1]; 

TotalEquity = Portfolio_CurrentCapital() + Portfolio_UsedMargin();

TurtleUnits = (TotalEquity*RiskRatio/100) /(N * ContractUnit()*BigPointValue());

TurtleUnits = IntPart(TurtleUnits); // 对小数取整

计算公式:

头寸规模 = 账户净值的1%/价值量波动性

账户净值 = 可用资金 + 持仓保证金(全局交易里设置)

价值量波动性 = N*每点价值量

N = 真实波动幅度的20周期指数移动平均值(XAverage

通过一系列的计算,在不同的行情与资金状态下,计算得出的开仓数量也不尽相同。

程序调试

公式代码编写完毕,单击编译保存按钮对公式进行编译。简单语法错误,可以根据编译提示信息进行修改,如果出现逻辑错误,导致公式不能得到所需的运行结果,则需要在代码中添加调试语句,检查出错的原因。常用的调试语句有CommentaryFileAppend

n  Commentary

Commentary ----在超级图表当前Bar添加一行注释信息。

该函数无返回值,作为系统调试的辅助工具,双击超级图表出现十字光标后,在工具栏选择“显示提示框”,这样便可以看到任意Bar上的注释信息了。

例:

         If(close>open)

        Commentary("收阳="+Text(close));    //  在收阳的K线上显示收盘价

图9-16.          超级图表中阳线阴线注释信息显示情况

9-16左图显示,在信息提示窗口里可以看到Commentary语句里显示的注释内容。上例所写的是条件下输出,只有在满足if()语句内的条件Bar上方可显示此内容,不满足条件的Bar上则不会有注释信息的输出,如9-16右图所示。

当然,如果没有条件语句来约束 Commentary,则在图表上的每个Bar上都输出注释信息。采用这种方式可以方便交易者观察图表上的数据情况,对公式策略进行适当的调试。

例如: Commentary(“开仓价格”+(symbol)+=+text(entryprice));

       Commentary(“满足多头开仓”);

 Commentary显示的注释信息仅在图表中标识,如果需要生成记录文件,则要使用函数FileAppend

n  FileAppend

FileAppend ----在指定文件中追加一行字符串,返回值为布尔型。执行成功返回True,执行失败返回False

    语法:Bool FileAppend(String strPath,String strText)

    参数:strPath 指定文件的路径,请使用全路径表示,并使用 \\ 做路径分割符,否则会执行失败;strText 输出的字符串内容。

FileAppend 的调试信息不会在图表上标识,而是写入一个文件中。每一次执行到这个语句,便会在文件中写入一条调试信息,方便交易者查找调试。

例如: FileAppend("C:\\Formula.log" , "Date = " +Text(Date)+ "Time = " + Text(Time)+ "Close = " +Text(Close));

图9-17.          FileAppend输出文件示例

上述语句,没有添加任何条件直接输出,实时行情中因为每个Tick程序都会运行一次,所以同一个Bar上会输出多条调试语句的结果。用户可以通过查看这些结果找到自己所需要的信息。

如果在条件语句下输出FileAppend,则条件满足之后才会有调试语句写入文件。

编译错误

基本编译错误

错误代码

错误描述

C0001

程序体不存在

C0017

参数声明的数据类型和初始值的数据类型不一致

C0018

变量声明的数据类型和初始值的数据类型不一致

 

语法语义错误

错误代码

错误描述

C0102

变量被重复定义

C0103

函数被重复定义

C0107

变量声明的数据类型错误

C0108

参数声明的数据类型错误

C0109

公式返回的数据类型错误

C0110

命名的第一个字符不能是$

C0111

向前引用指示必须是数值型变量或常量

C0112

赋值语句左右值必须使用同类数据类型

C0114

赋值语句左边必须是变量而不能为常量

C0115

赋值语句左边变量不可使用向前引用

C0116

逻辑运算语句的左右值的数据类型必须属于Bool

C0117

算术运算语句的左右值的数据类型必须属于Numeric

C0118

If条件表达式数据类型必须属于Bool

C0119

While条件表达式数据类型必须属于Bool

C0120

For语句起步和终止条件表达式数据类型必须属于Numeric

C0121

For语句的循环变量不能为NumericRef类型

C0122

Return语句的返回值类型与公式定义的返回值类型不符

C0126

关系运算语句的左右值的数据类型必须相同

C0127

参数缺少初始值

C0128

引用参数不应含初始值

C0133

赋值语句的左值只能为变量或者为引用类型的参数

C0135

本参数无初始值,则要求公式体内的前几个参数也不能有初始值

 

公式调用错误

错误代码

错误描述

L0003

函数实现的参数列表和预声明的参数列表不符合

L0004

函数调用时的参数数目与声明时不符合(太少的调用参数)

L0005

函数调用时的参数数目与声明时不符合(太多的调用参数)

L0006

被调用函数的序列参数不能使用默认值

L0007

被调用函数的引用参数不能使用默认值

L0008

只有序列变量和参数才能使用回溯值

L0013

函数的第一个参数必须是字符常量

L0014

被调用公式要求引用参数时,该参数只能以普通变量或引用参数方式传入

 

公式警告

W0201

FOR,WHILE,IF,ELSE中包含序列函数,可能存在潜在的逻辑错误,请确认代码无误

 

除上述描述的错误码之外,还会有类似以下字样的错误提示:

fatal error C1001:
最终目标文件编译错误

这类错误是TB无法识别的、VC返回的错误提示。除了C1001,还有可能是其它的代码。遇到此类问题,可参考以下思路查找错误:

l  查看公式简称及公式正文中是否存在中文字符等非法字符;

l  公式中参数变量的命名是否与已有函数、C语言关键字有冲突;

l  是否有严重的逻辑错误或公式管理器中未通过编译且存在错误的公式;

l  必须为管理员权限进入电脑操作系统,操作系统帐户名称不可以为中文;

l  交易开拓者软件的安装路径必须为英文等等。