新浪博客

[金字塔教程七]金字塔的后台程式化交易

2014-01-16 23:29阅读:
金字塔提供功能性和扩展性更为强大的基于后台预警模式的程式化交易模式,可以在不影响用户前台图形操作情况下,可以高效与预警系统一起工作来实现自动交易,由于后台程式化交易是金字塔在后台进行,不需要图表打开不占用过多的资源,由于只只需要最后一个周期的信号,所以原则上公式不要多余计算,故效率高,便于对多个品种同一个策略进行轮循监控.用户前期编写的自动交易策略是需要先在图表上和程式化交易评测上通过后才可以放到后台去执行程式化交易。为了让用户更快的编写和熟悉金字塔的后台程式化交易,金字塔的程式化交易函数,前面都在交易系统函数名称前加 T 字母,比如BUY改为TBUY, 使用方法大致相同.户仔细注意查看函数的使用说明。与图表显示的交易系统函数不同的是,后台程式化交易的函数都使用的实际的用户持仓和资金。
金字塔的后台程式化交易只能在专业版及其以上版本使用,他可以运行在序列和逐K线两种模式,但是推荐序列模式运行,这样可以极大提高后台执行的效率。
用以显示再图表做测试的后台程式化交易不能使用图表交易功能,且图表交易和后台交易的函数不能混用,即后台交易系统中不允许使用ENTERLONG等交易信号,传统的ENTERLONG交易信号里也不允许出现后台程式化交易系统的函数。
此外,后台程式化交易由于用户无法直接在图表上看到信号的整个出现过程,故对用户的公式编写水平有一定的要求,用户需要对金字塔的后台交易系统工作机理有比较深的了解,并且要对自己的公式系统有清晰的认识,这样一旦遇到问题也能及时找到问题的原因。后台交易过程中,一旦遇到问题,建议用户仔细阅读后面第八章的有关后台程式化交易的调试部分。
本章主要讲述交易测试系统函数、程序化交易系统函数,更具体的程序交易环节暨流程请同时参阅“金字塔程式化交易设计指南”。

7.1程式化交易系统的函数

将前面用在显示图表的交易的公式改为实盘后台的交易的公式如下:
MA3:MA(C,3);
MA5
:MA(C,5);

TBUY(CROSS(MA3,MA5),1,LMT,C); //按照最新价限价开多
TSELL(CROSS(MA5,MA3),0,LMT,C);//按照最新价限价平多,0表示平掉全部持仓

请注意TBUY和TSELL函数的参数出现了变化,真正的下单时,需要指定下单类型和价格的,否则系统会按照市价进行交易。

用以模拟交易的函数和真实交易的函数,大部分只是有了前面T字母差别,大部分的用以交易评测的交易系统,只要将交易函数部分前面加T字母即可解决,唯一区别最大的就是TBUY,TSELL,TBUYSHORT,TSELLSHORT 这4个函数与模拟交易用的函数区别较大,请仔细辨别。

请注意交易控制符 THISCLOSE 在真实交易中被 LMT 等真实交易控制符所取代,金字塔的模拟交易控制符和真实交易控制符两者不能通用。金字塔的真实下单函数只支持LMT限价 MKT市价 STP止损 STPLMT限价止损 这4个交易控制符。
真实下单交易函数,下单数量不再支持百分比模式。

程式化交易的函数介绍:
程式化交易系统之开多操作:
用法:TBUY(COND,V,[Type,P1,P2,AC,STOCK]);表示当COND条件成立时,
买入V股(手)当前品种,
TYPE表示开仓类型,LMT限价 MKT市价 STP止损 STPLMT限价止损
P1表示开仓价格,当TYPE为LMT和STP,STPLMT时为指定限价和止损价格,其他情况填0
P2为止损限价,当TYPE为STPLMT时,必须指定P2的止损限价,其他情况填0,当P1止损价触发时按照P2价格止损操作.
当TYPE参数省略时,为市价开仓。AC为帐户ID,为空时为系统默认帐户,否则将下单到指定帐户中
STOCK为品种代码,比如'SH600215',为空或者不填时为当前品种
例如:TBUY(C>O ,1000,LMT,C);表示收阳线则在本周期收盘价上买入1000股(手)。
TBUY(C>0,1000,STP,CLOSE+0.2);表示收阳线则在本周期收盘价高于0.2元下1000股(手)止损单,当盘中价格到了触发价时按市价开仓止损.
TBUY(C>0,1000,STPLMT,CLOSE+0.2,CLOSE);表示收阳线则在本周期收盘价高于0.2元下1000股(手)止损单,当盘中价格到了触发价时按CLOSE价格开仓止损。

程式化交易系统之平多操作:
TSELL(COND,V,[Type,P1,P2,AC,STOCK]); 用法同上

程式化交易系统之开空操作:
TBUYSHORT(COND,V,[Type,P1,P2,AC,STOCK]); 用法同上

程式化交易系统之平空操作:
TSELLSHORT(COND,V,[Type,P1,P2,AC,STOCK]); 用法同上

注意:程式化交易系统的函数中交易类型Type与交易测试系统的差别

唐奇安通道模型
input:N(20,5,100,1),NS(10,0,60,1);
资产:asset,noaxis,colorgreen;
持仓:HOLDING,LINETHICK0;
总次数: TOTALTRADE,LINETHICK0;
盈利:NUMWINTRADE,LINETHICK0;
胜率:ROUNDS(100*PERCENTWIN,1),LINETHICK0;
连亏:MAXSEQLOSS,LINETHICK0;
连盈:MAXSEQWIN,LINETHICK0;

BPK:=CROSS(H, hhv(ref(h,1),N));
SPK:=CROSS(llv(ref(l,1), N),L);
Price:=AVGENTERPRICE;//持仓价位

SELLSHORT(BPK and 持仓<0,持仓,market);
SELLSHORT(持仓<0,持仓,Stopr,Price+NS); //止损
BUY(BPK and 持仓=0,30%,market);

SELL(SPK and 持仓>0,持仓,market);
SELL(持仓>0,持仓,Stopr,Price-NS);//止损
BUYSHORT(SPK and 持仓=0,30%,market);

将交易模型转换成程式化交易系统,主要是涉及交易系统函数的转化,即在交易系统函数前加“t”,以及交易类型的改动;并且程式化交易函数都是在后台运行,不能在图表中显示;交易数量不能用30%的写法,只能用具体数量。

因此,唐奇安通道模型转化为可程式化交易的系统:
input:N(20,0,60,1) ,NS(30,0,100,1);

持仓:=tHOLDING,LINETHICK0;
KCS:= intpart(tasset*0.3/(close*multiplier));//也表示30%的开仓数

BUY1:=hhv(ref(h,1),N);
SELL1:=llv(ref(l,1),N);
BPK:=CROSS(H,BUY1);
SPK:=CROSS(SELL1,L);
Price:=tAVGENTERPRICE; //持仓价位

tSELLSHORT(BPK and 持仓<0,t持仓,mkt);
tSELLSHORT(持仓<0,持仓,Stp,Price+NS);
tBUY(BPK and 持仓=0, KCS,mkt);

tSELL(SPK and 持仓>0,持仓,mkt);
tSELL(持仓>0,持仓,Stp,Price-NS);
tBUYSHORT(SPK and 持仓=0, KCS,mkt);

若想与交易模型完全一样,后6句则需这样写:
tSELLSHORT(ref(BPK,1) and 持仓<0,t持仓,mkt);
tSELLSHORT(持仓<0,持仓,Stp,Price+NS);
tBUY(ref(BPK,1) and 持仓=0, KCS,mkt);

tSELL(ref(SPK,1) and 持仓>0,t持仓,mkt);
tSELL(持仓>0,持仓,Stp,Price-NS);
tBUYSHORT(ref(SPK,1) and 持仓=0, KCS,mkt);

7.2程式化交易函数

程式化交易函数共有41个,主要适于实际程式化交易,在后台运行,而不会在图表中显示。
大部分是在测试交易系统函数后加“T”,如:
程式化交易系统之开多操作,
用法:TBUY(COND,V,[Type,P1,P2,AC,STOCK]);表示当COND条件成立时,
买入V股(手)当前品种,
TYPE表示开仓类型,LMT限价 MKT市价 STP止损 STPLMT限价止损
P1表示开仓价格,当TYPE为LMT和STP,STPLMT时为指定限价和止损价格,其他情况填0
P2为止损限价,当TYPE为STPLMT时,必须指定P2的止损限价,其他情况填0,当P1止损价触发时按照P2价格止损操作.
当TYPE参数省略时,为市价开仓。
AC为帐户ID,为空时为系统默认帐户,否则将下单到指定帐户中
STOCK为品种代码,比如'SH600215',为空或者不填时为当前品种
例如:TBUY(C>O ,1000,LMT,C);表示收阳线则在本周期收盘价上买入1000股(手)。
TBUY(C>0,1000,STP,CLOSE+0.2);表示收阳线则在本周期收盘价高于0.2元下1000股(手)止损单,当盘中价格到了触发价时按市价开仓止损.
TBUY(C>0,1000,STPLMT,CLOSE+0.2,CLOSE);表示收阳线则在本周期收盘价高于0.2元下1000股(手)止损单,当盘中价格到了触发价时按CLOSE价格开仓止损

程式化交易系统之平多操作,
TSELL(COND,V,[Type,P1,P2,AC,STOCK]); 用法同上

程式化交易系统之开空操作,
TBUYSHORT(COND,V,[Type,P1,P2,AC,STOCK]); 用法同上

程式化交易系统之平空操作,
TSELLSHORT(COND,V,[Type,P1,P2,AC,STOCK]); 用法同上
注意:程式化交易系统的函数中交易类型Type与交易测试系统的差别

DEBUGOUT(STR,NUM) 调试输出
用户可以在程式化交易中通过输出指定的字符串来实现调试的目的,可以借助这个功能来完成监控程式化交易的各种细节参数,因为在后台执行程式化交易时,用户在前台的图表上是看不到内部数据的。
用法:DEBUGOUT(STR,NUM),STR为用户指定输出的一个行文字,NUM为用户指定的一个监控数字.
例如:DEBUGOUT('当前资产为%.2f',1234),将在程式化交易的监控部分打印出来 '当前资产为1234.00'
'%.2f'为一个打印的控制符号,系统会将他替换为指定的一个数字输出,%.2f为显示两位小数,%.0f则表示不显示小数.
该函数仅在做程式化交易时有效

SLEEP(D) 延时
当位于最后一个周期时,延时指定数量时间后再执行下条语句。
用法:SLEEP(D),D为延时的设置时间,单位为毫秒(1秒钟等于1000毫秒)。
例如:SLEEP(1000)表示等待1秒后再执行下行语句。

TODAYHOLDING 今持仓量
得到当前帐户的今日持仓量,多仓返回正数空仓返回负用法:TODAYHOLDING


TSUBMIT(N) 委托单历时
用法:TSUBMIT(N)仍未成交时,函数返回未成交历时的秒数,有效值范围为(1-1000);成交函数返回0.
N为委托方向.0所有方向;1开多;2平多;3开空;4平空;
便于控制未成交交易,采取其他补救措施

TTOTALDAYTRADE 日内交易次数
当前位置之前总共有多少次当日的交易,注意每次卖出算一次交易,而买入不算
用法:TTOTALDAYTRADE

其它的程式化交易函数,类似,请自己依次查看
注意:在公式编辑中,点击 [ << ] 可弹出函数列表,可按类查找需要的函数,如果需要可直接也双击改函数即可引入。公式中的蓝色字段为函数名,将鼠标放在未知的蓝色字段上,将看到该函数的描述和基本用法。

7.3程式化交易执行语句常用的其它函数

MINDIFF 最小变动价位
返回当前品种最小变动价位(可在交易—合约信息设置中设置)。
若市场分类小数点为2时最小变动价位则为0.01
注意:该函数返回常数

VOLUNIT 每手单位
返回每手单位(可在市场管理中设置),注意:该函数返回常数

MULTIPLIER 乘数
当前品种的乘数或单位
用法:MULTIPLIER

OPENTIME(N) 开盘时间
返回交易所的指定时段的开盘时间
用法:OPENTIME(N),N表示对应市场分类中交易所交易时间设置的节数(自上而下)1表示第一个
函数返回有效值范围为(000000-235959),此函数返回常数,对于日线及更长周期此函数无效.

CLOSETIME(N) 收盘时间
返回交易所的指定时段的收盘时间
用法:CLOSETIME(N),N表示对应市场分类中交易所交易时间设置的节数(自上而下),特设0表示最后一节的节数(即日收盘的节数)
函数返回有效值范围为(000000-235959),此函数返回常数,对于日线及更长周期此函数无效.

PLAYSOUND 播放声音文件
播放一首指定位置的一个声音文件,可以是MP3或者WAV等格式.
用法:PLAYSOUND(COND,PATH),当最后一个周期得COND条件成立时,播放指定位置PATH的一个声音文件
声音文件可以是绝对路径,也可以只是一个声音文件,只有一个文件名时用户需要将它安放在DOCUMENT目录.
例如:PLAYSOUND(CLOSE>OPEN,'D:\ONTIFY.MP3'),当最后一个周期为阳线时播放D:\ONTIFY.MP3位置的声音文件.

SENDMAIL 发送邮件
发送一封邮件到指定的邮箱.
用法:SENDMAIL(COND,MAILTO,SUB,CON),当最后一个周期得COND条件成立时,发送到MAILTO用户,标题为SUB,内容为CON
例如:SENDMAIL(CLOSE>OPEN,'ABC@SINA.COM;XYZ@WEISTOCK.COM','警报','大阳线'),
表示当最后一个周期为阳线时,往ABC@SINA.COM和XYZ@WEISTOCK.COM这两个邮箱发送邮件,标题是'警报',内容是'大阳线'.
用户使用该功能之前,需要预先设置邮件发送的SMTP信息,具体操作位置在工具->网络->邮件发送设置里,并需要勾选'允许程式化交易'选项.
DYNAINFO(4) 取得最新动态行情: 今开

DYNAINFO(5) 取得最新动态行情: 最高

DYNAINFO(6) 取得最新动态行情: 最低

DYNAINFO(7) 取得最新动态行情: 最新

DYNAINFO(28) 取得最新动态行情: 买一价

DYNAINFO(34) 取得最新动态行情: 卖一价

DYNAINFO(54) 取得最新动态行情: 涨停

DYNAINFO(55) 取得最新动态行情: 跌停


7.4账户函数介绍

为了方便交易员编写资金管理程序,金字塔增加了账户函数(43个),今后还将扩充更多头寸管理函数。

TACCOUNT(1); 交易帐户: 返回当前交易帐户ID(该函数返回字符串类型数值)

TACCOUNT(2); 帐户类型: 返回当前交易帐户类型(0 盈透;1 CTP)

TACCOUNT(3); 现金余额: 返回当前交易帐户中的现金余额

TACCOUNT(4); 浮动盈亏: 返回当前交易帐户中的浮动盈亏

TACCOUNT(6); 平仓净值: 返回当前交易帐户中的平仓净值

TACCOUNT(19); 当前可用资金: 返回当前交易帐户中的当前可用资金

TACCOUNT(20); 当前流动资产: 返回当前交易帐户中的当前流动资产

TACCOUNT(26); 上次结算准备金: 返回当前交易帐户中的上次结算准备金(CTP专有)

TACCOUNT(27); 结算准备金: 返回当前交易帐户中的期货结算准备金(CTP专有)

TACCOUNT(28); 占用保证金: 返回当前交易帐户中的占用保证金(CTP专有)

TACCOUNT(29); 可取资金: 返回当前交易帐户中的可取资金数量(CTP专有)

TACCOUNT(30); 平仓盈亏: 返回当前交易帐户中的平仓盈亏数额(CTP专有)

TACCOUNT(31); 手续费: 返回当前交易帐户中的手续费(CTP专有)

TACCOUNT(32); 入金金额: 返回当前交易帐户中的入金金额(CTP专有)

TACCOUNT(33); 出金金额: 返回当前交易帐户中的出金金额(CTP专有)

TACCOUNT(34); 上次信用额度: 返回当前交易帐户中的上次信用额度(CTP专有)

TACCOUNT(35); 上次质压: 返回当前交易帐户中的上次质压(CTP专有)

TACCOUNT(36); 质压金额: 返回当前交易帐户中的质压金额(CTP专有)

TACCOUNT(36); 信用额度: 返回当前交易帐户中的信用额度(CTP专有)

。。。
TACCOUNT(43)
其它的账户函数,请自己依次查看

注意:在公式编辑中,点击 [ << ] 可弹出函数列表,可按类查找需要的函数,双击该函数将直接引入公式。公式中的蓝色字段为函数名,将鼠标放在未知的蓝色字段上,将看到该函数的描述和基本用法。
1如何编制简单价差类型的套利模型
CLOSE 为两个品种的价差。
当价差小于 300 时,买入开仓前一品种RB05,卖出开仓后一品种RB03
当价差大于500时,卖出平仓前一品种,买入平仓后一品种
当价差大于 600 时,卖出开仓前一品种,买入开仓后一品种
当价差小于400时,买入平仓前一品种,卖出平仓后一品种
由于涉及到需要同时下单到不同的品种,这里直接使用后台程式化交易系统编写。
C1:= “RB05$close”-“RB03$close”;
TBUY(CROSS(300,C1),10, mkt,0,0,'','SQRB05');//开多
TBUYSHORT(CROSS(300,C1),10,mkt, 0,0,'','SQRB03'); //开空

TSELL(CROSS(C1,500),10,mkt, 0,0,'', 'SQRB05'); //平多
TSELLSHORT(CROSS (C1,500),10,mkt, 0,0, '', 'SQRB03'); //平空

TBUYSHORT(CROSS(C1,600),10,mkt, 0,0, '','SQRB05'); //开空
TBUY(CROSS(C1,600),10, mkt, 0,0,'', 'SQRB03');//开多

TSELLSHORT(CROSS (400,C1),10,mkt, 0,0, '', 'SQRB05'); //平空
TSELL(CROSS (400,C1),10,mkt, 0,0, '', 'SQRB03'); //平多
注意在后台程式化交易监控中,用户至少需要监控RB05或者RB03其中的一个。

2如何编制技术指标的套利模型:
C1:= “RB05$close”-“RB03$close”;
DIFF := EMA(C1,12) - EMA(C1,26);
DEA := EMA(DIFF,9);
MACD:=2*(DIFF-DEA);
BKSK :=MACD>0;
SPBP :=MACD<0;
TSELLSHORT(SPBP,10, mkt, 0,0, '', 'SQRB03'); //平空
TBUY(BKSK,10,mkt, 0,0,'', 'SQRB05');//开多
TSELL(SPBP,10, mkt, 0,0,'', 'SQRB05'); //平多
TBUYSHORT(BKSK,10,mkt, 0,0, '', 'SQRB03'); //开空

3如何编制技术指标的多账户模型:
账户1:16801
账户2:16802
DIFF := EMA(C,12) - EMA(C,26);
DEA := EMA(DIFF,9);
MACD:=2*(DIFF-DEA);
IF THOLDING<0 THEN
BEGIN
TSELLSHORT(MACD>0 and THOLDING<0, THOLDING, mkt, 0,0,'16801'); //平空
TSELLSHORT(MACD>0,10, mkt, 0,0, '16802'); //平空
END
IF THOLDING=0 THEN
BEGIN
TBUY(MACD>0 and THOLDING=0,10,mkt, 0,0, '16801');//开多
TBUY(MACD>0,10,mkt, 0,0, '16802');//开多
END
IF THOLDING>0 THEN
BEGIN
TSELL(MACD<0 and THOLDING>0, THOLDING,10, mkt, 0,0,'16801'); //平多
TSELL(MACD<0,10, mkt, 0,0,'16802'); //平多
END
IF THOLDING=0 THEN
BEGIN
TBUYSHORT(MACD<0 and THOLDING=0,10,mkt, 0,0,'16801'); //开空
TBUYSHORT(MACD<0,10,mkt, 0,0, '16802'); //开空
END

上面3个例子用到了程式化交易函数
所有上述模型仅供参考,据此交易风险自负。

我的更多文章

下载客户端阅读体验更佳

APP专享