[金字塔教程七]金字塔的后台程式化交易
(2014-01-16 23:29:39)
标签:
金字塔程序化交易量化投资期货股票 |
分类: 金字塔决策交易系统 |
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>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个例子用到了程式化交易函数
所有上述模型仅供参考,据此交易风险自负。