[金字塔教程五]新交易系统的函数
(2014-01-15 20:47:29)
标签:
金字塔教程程序化交易股票 |
分类: 金字塔决策交易系统 |
交易系统之开多操作,
用法:BUY(COND,V,Type,P);
表示当COND条件成立时,
买入V股(手)当前品种,TYPE表示买入类型,
P表示买入价格,所有参数均可以省略。
V:买入股(手)数或买入资金百分比(N%),省略表示100%;
TYPE:可以是本周期收盘(THISCLOSE),次周期开盘(MARKET),
次周期限价单(LIMIT),次周期停损单(STOP)等交易方式控制符;
P:对于限价单、停损单需要指定的买入价格
例如:BUY(C>O ,1000,THISCLOSE);表示收阳线则在本周期收盘价上买入1000股(手)。
BUY(C>0,50%,LIMIT,CLOSE-0.2);表示在次周期CLOSE-0.2元位置下买入限价单,
若价格达到或低于该价格则用50%资金买入。
交易系统之平多操作,
SELL(COND,V,Type,P); 用法同上
交易系统之开空操作,
BUYSHORT(COND,V,Type,P); 用法同上
交易系统之平空操作,
SELLSHORT(COND,V,Type,P); 用法同上
ASSET当前资产
户账户客的净自有资产=可用现金+占用保证金-融资(现金+品种市值-融资)
AVGENTERPRICE 持仓均价
当前持有品种的平均持仓成本——最近空仓以来计
BESTPERCENT 最大利润率
当前位置之前所有交易中利润率最大一次的利润率,其数值在0—1之间
BESTTRADE 最大盈利额
当前位置之前所有交易中盈利最大一次的利润额
CASH(N)
得到当前帐户的可用资金余额
用法:CASH(N),N表示投资方向 0多头 1空头
例如:CASH(0)表示取当前多头帐户的可用现金余额
ENTERBARS
返回上次开仓到当前的周期数,若之前没有开仓记录返回-1
ENTERPRICE
得到当前位置的上次开仓价
ENTERVOL
得到当前位置的上次开仓量
EXITBARS
返回上次平仓到当前的周期数,若之前没有开仓记录返回-1
EXITPRICE
得到当前位置的上次平仓价
EXITVOL
得到当前位置的上次平仓量
HOLDING
得到当前帐户持仓量,多仓返回正数空仓返回负数
LIMIT 限价交易
交易方式控制符:加入限价单,次周期达到限价即操作,否则放弃。处于图表交易时按照指定限价报单交易
LIMITR 限价交易
交易方式控制符:加入限价单,本周期达到限价即操作,否则放弃。处于图表交易时按照指定限价报单交易
Market
例如:buy(cond ,1000,market);
该控制符仅对交易评测时有效
MAXSEQLOSS
当前位置之前连续亏损交易的最大次数
MAXSEQWIN
当前位置之前连续盈利交易的最大次数
NUMLOSSTRADE
当前位置之前总共有多少次亏损的交易,注意每次卖出算一次交易,而买入不算
NUMSEQLOSS
当前位置之前连续有多少次亏损的交易,注意每次卖出算一次交易,而买入不算
NUMSEQWIN
当前位置之前连续有多少次盈利的交易,注意每次卖出算一次交易,而买入不算
NUMWINTRADE
当前位置之前总共有多少次盈利的交易,注意每次卖出算一次交易,而买入不算
OPENBAR 开仓历时
上一次仓位=0以来的周期数
OPENPROFIT
当前浮动盈亏(当前持仓市值与持仓成本之差)
PERCENTWIN
当前位置之前盈利交易占总交易次数的比例,其数值在0—1之间
SEQLOSS
当前位置之前连续亏损总额,注意每次卖出算一次交易,而买入不算
SEQWIN
当前位置之前连续盈利总额,注意每次卖出算一次交易,而买入不算
STATE
得到当前帐户状态,无仓输出0;有多头仓输出1;有空头仓输出-1
STOP
交易方式控制符:加入停损单,或又称突破交易,次周期达到设定价格即操作买入,否则放弃。
所谓停损就是交易价比设定的价格要差,具体说来对于买入或卖空就是高于设定价格,
对于卖出或买空就是低于设定价格
例如:BUY(COND ,1000,STOP,CLOSE-0.01);
该控制符仅对交易评测时有效
STOPR
为本周期的,其它同上
THISCLOSE
交易方式控制符,按照本周期收盘价操作
例如:BUY(COND ,1000,THISCLOSE);
该控制符仅对交易评测时有效
TOTALTRADE
当前位置之前总共有多少次交易,注意每次卖出算一次交易,而买入不算
TYPE(N)
得到当前位置之前上N次信号类型
输出:0、无信号1、开多2、平多3、开空;4、平空
TYPEBAR
得到当前位置之前上N次信号指定类型距当前周期
TYPEBAR(N,TYPE)N表示上次信号,
TYPE表示信号类型 0、无信号1、开多2、平多3、开空;4、平空
例如:TYPEBAR(2,1)表示:倒数第2个开多信号历时
WORSTPERCENT
当前位置之前所有交易中亏损率最大一次的利润率,其数值在0—1之间
WORSTTRADE
当前位置之前所有交易中亏损最大一次的亏损额
5.1快速入门
1)如何把熟悉的技术指标转换成交易模型?
第一步:把 KDJ 指标公式 COPY 过来,或按“引入公式”按钮,引入
RSV:=(CLOSE-LLV(LOW,N))/(HHV(HIGH,N)-LLV(LOW,N))*100;//算出(收盘价-N周期内的最低价)/(N周期的最高价N周期内的最低价)*100
K:SMA(RSV,M1,1),COLORWHITE;//RSV 的移动加权平均的值用K表示,并且画白色的线。
D:SMA(K,M2,1),COLORYELLOW;//K 的移动加权平均的值用D表示,并且画黄色的线。
J:3*K-2*D,COLORMAGENTA;//3倍的K减去2倍的D的值用J表示,并且画紫色的线。
第二步:原有公式主要是画线,所以稍作修改。如下:
RSV:=(CLOSE-LLV(LOW,N))/(HHV(HIGH,N)-LLV(LOW,N))*100;// 第一行不需要修改
K:=SMA(RSV,M1,1);//在:后加上= 变为只定义不用画线,把后面的颜色函数(COLORWHITE)也去掉
D:=SMA(K,M2,1);//同上
J:=3*K-2*D;//同上
第三步:把自己总结的交易条件写上,就可完成交易模型。如下:
RSV:=(CLOSE-LLV(LOW,N))/(HHV(HIGH,N)-LLV(LOW,N))*100;
K:=SMA(RSV,M1,1);
D:=SMA(K,M2,1);
J:=3*K-2*D;
{开多} ENTERLONG: CROSS(K,D),TFILTER; // K 向上穿越 D,发出开多操作
{平多} EXITLONG: CROSS(J,100),TFILTER; // J向上穿越100,发出平多操作
{开空} ENTERSHORT: CROSS(D,K),TFILTER; //K 向下穿越 D,发出开空操作
{平空} EXITSHORT: CROSS(0,J),TFILTER; //J向下穿越0,发出平空操作
图表交易模型就完成了,其仓位控制在第5页图中设置
对于新交易系统模型,可用下面4句代替
SELLSHORT(CROSS(0,J) and HOLDING<0, HOLDING,market); //J向下穿越0,发出平空操作
BUY(CROSS(K,D) and
SELL(CROSS(J,100) and HOLDING>0,HOLDING,market); // J向上穿越100,发出平多操作
BUYSHORT(CROSS(D,K) and HOLDING=0,30%,market); //K 向下穿越
D,发出开空操作
其中,HOLDING为持仓函数,30%表示按可用资金的30%交易,market表示交易类型为市价委托。后为文字说明,编写模型时不用写出。
2)如何把自编变色 K 线转换成交易模型
模型说明:第一根 K 线变红时买,第一根 K 线变蓝时卖
指标源码:
//如果最新值比满足条件的“高值”高,说明在上涨,红色K线
//如果最新值比满足条件的“低值”低,说明在下跌,绿色K线
//若最新值界于“高值”和“低值”之间,则与前一周期的颜色相同
HH1:=IF(H
LL1:=IF(L>REF(L,2) AND REF(L,1)>REF(L,2),REF(L,2),0);
HH2:=VALUEWHEN(HH1>0,HH1);
LL2:=VALUEWHEN(LL1>0,LL1);
K1:=IF(CLOSE>HH2,-3,IF(CLOSE
{最新值 与“高值”比:
若最新值比“高值”高,返回-3;
最新值与“低值”比
若最新值比“低值”低,返回1;
若最新值界于“高值”和“低值”之间---即中间值,返回0;}
K2:=VALUEWHEN(K1<>0,K1);//寻找第一个比“高值”高或者 比“低值”低的
G:=IF(K2=1,HH2,LL2); //若找到的第一个比“低值”低,返回当时的“高值”
若找到的第一个比“高值”高,返回当时的“低值”
G1:=VALUEWHEN(ISLASTBAR,G);
W1:=K2;
W2:=OPEN-CLOSE;
HT:=IF(OPEN>CLOSE,OPEN,CLOSE);
LT:=IF(OPEN
//以上是在定义变量,转换成模型时直接引用
STICKLINE(W1>0,OPEN,CLOSE,8,1),COLORCYAN;
STICKLINE(W1<=0,OPEN,CLOSE,8,1),COLORRED;
STICKLINE(W2>0 AND
W1<=0,OPEN,CLOSE,8,0),COLORRED;
STICKLINE(W2>0 AND W1>0,OPEN,CLOSE,8,0),COLORCYAN;
利用STICKLINE 里的条件W1,再加上交易指令即可改写为交易模型
修改为交易模型如下:
HH1:=IF(H
LL1:=IF(L>REF(L,2) AND REF(L,1)>REF(L,2),REF(L,2),0);
HH2:=VALUEWHEN(HH1>0,HH1);
LL2:=VALUEWHEN(LL1>0,LL1);
K1:=IF(CLOSE>HH2,-3,IF(CLOSE
K2:=VALUEWHEN(K1<>0,K1);
G:=IF(K2=1,HH2,LL2);
G1:=VALUEWHEN(ISLASTBAR,G);
W1:=K2;
W2:=OPEN-CLOSE;
图表交易模型就完成了,其仓位控制在第5页图中设置
对于新交易系统模型,可用下面4句代替
//交易系统之平空操作
SELLSHORT(CROSS(W1,0) OR (CROSS(W2,0) AND CROSS(W1,0)),HOLDING,market);
//交易系统之开多操作
BUY(CROSS(W1,0) OR (CROSS(W2,0) AND CROSS(W1,0)),30%,market);
//交易系统之平多操作
SELL(CROSS(0,W1) OR (CROSS(W2,0) AND CROSS(0,W1)),HOLDING,market);
//交易系统之开空操作
BUYSHORT(CROSS(0,W1) OR (CROSS(W2,0) AND CROSS(0,W1)),30%,market);
3)如何合并两个不同的交易模型?
在两个模型方向相同时才开仓,两个模型指令不同时就平仓
参数
N:最小值
0 最大值
源码:
模型A
X:=BARSLAST(HIGH=HHV(HIGH,N));
LL:=MIN(REF(LOW,X+3),MIN(REF(LOW,X+2),MIN(REF(LOW,X),REF(LOW,X+1))));
Y:=BARSLAST(LOW=LLV(LOW,N));
HH:=MAX(REF(HIGH,Y+3),MAX(REF(HIGH,Y+2),MAX(REF(HIGH,Y),REF(HIGH,Y+1))));
A:=BARSLAST(CLOSE>=HH);
B:=BARSLAST(CLOSE<=LL);
AB:=IF(A>B,HH,LL);
SELLSHORT(CROSS(CLOSE,AB) and HOLDING<0,HOLDING,market); //平空操作
BUY(CROSS(CLOSE,AB) and
SELL(CROSS(AB,CLOSE) and HOLDING>0,HOLDING,market); //平多操作
BUYSHORT(CROSS(AB,CLOSE) and HOLDING=0,30%,market); //开空操作
模型B
HH1:=IF(H
LL1:=IF(L>REF(L,2) AND REF(L,1)>REF(L,2),REF(L,2),0);
HH2:=VALUEWHEN(HH1>0,HH1);
LL2:=VALUEWHEN(LL1>0,LL1);
K1:=IF(CLOSE>HH2,-3,IF(CLOSE
K2:=VALUEWHEN(K1<>0,K1);
SELLSHORT(K2=-3 and HOLDING<0,HOLDING,market); //平空操作
BUY(K2=-3 and
SELL(K2=1 and HOLDING>0,HOLDING,market); //平多操作
BUYSHORT(K2=1 and HOLDING=0,30%,market); //开空操作
利用并且( AND )和或者( OR )这些逻辑语句,将A、B模型合并为模型C:
X:=BARSLAST(HIGH=HHV(HIGH,N));
LL:=MIN(REF(LOW,X+3),MIN(REF(LOW,X+2),MIN(REF(LOW,X),REF(LOW,X+1))));
Y:=BARSLAST(LOW=LLV(LOW,N));
HH:=MAX(REF(HIGH,Y+3),MAX(REF(HIGH,Y+2),MAX(REF(HIGH,Y),REF(HIGH,Y+1))));
A:=BARSLAST(CLOSE>=HH);
B:=BARSLAST(CLOSE<=LL);
AB:=IF(A>B,HH,LL);
HH1:=IF(H
LL1:=IF(L>REF(L,2) AND REF(L,1)>REF(L,2),REF(L,2),0);
HH2:=VALUEWHEN(HH1>0,HH1);
LL2:=VALUEWHEN(LL1>0,LL1);
K1:=IF(CLOSE>HH2,-3,IF(CLOSE
K2:=VALUEWHEN(K1<>0,K1);
SELLSHORT(CROSS(CLOSE,AB) OR K2=-3 and HOLDING<0,HOLDING,market); //平空操作
BUY(CROSS(CLOSE,AB) AND K2=-3 and
SELL(CROSS(AB,CLOSE) OR K2=1 and HOLDING>0,HOLDING,market); //平多操作
BUYSHORT(CROSS(AB,CLOSE) AND K2=1 and HOLDING=0,30%,market); //开空操作
5.2常见问题
(1)LIMIT和STOP指令的区别和联系
LIMIT------加入限价单,交易评测时按照次周期达到限价即操作,否则放弃;处于图表交易时按照指定限价报单交易。
所谓限价就是交易价优于设定的价格。具体说来对于买入或卖空就是低于设定价格,对于卖出或买空就是高于设定价格。
STOP------加入停损单,或又称突破交易,交易评测时按次周期达到设定价格即操作买入,否则放弃;处于图表交易时按照指定停损价格报单交易。
所谓停损就是交易价比设定的价格要差,(就是说和价格运动方向无关,只要比下的价格差,就下单,不管价格是由好到坏还是有坏到好。)具体说来对于买入或卖空就是高于设定价格,对于卖出或买空就是低于设定价格
BUY(holding=0, 1, LIMIT, 4000);
//如果无多头持仓,以4000挂单子
//结果:成交价≤4000
SELL(holding>0,0,LIMIT,4000);
//如果有多头持仓,以4000价格挂单子;
//结果:成交价≥4000
BUY(holding=0, 1, STOP, 4000);
//如果无多头持仓
//当最新价≥4000,以当时的对手价买一手单子
//结果:成交价根据行情而定
//相当于-----条件单,当价格突破某个值时,买开仓。
SELL(holding>0,0,STOP,4000);
//如果有多头持仓,4000是止损触发价(所能接受的最大损失的最低值)。
//当最新价≤4000,以当时的对手价卖出全部持仓。
//结果:成交价根据行情决定。
//相当于----止损----条件单,当价格下跌到某个值时,卖平仓。
BUYSHORT(holding=0, 1, STOP, 2020);
//如果无空头持仓
//当最新价≤2020时,以当时的对手价买一手单子
//结果:成交价根据行情而定
//相当于-----条件单,当价格下跌某个值时,卖开仓。
SELLSHORT(holding<0,0,STOP,2020);
//如果有空头持仓,2020是止损触发价(所能接受的最大损失的最高值)。
//当最新价≥2020,以当时的对手价卖出全部持仓。
//结果:成交价根据行情决定。
//相当于----止损----条件单,当价格突破某个值时买平仓。
(2)金字塔下的交易都支持哪些交易指令,有什么区别?
金字塔对于所有的可交易品种,均支持4种交易指令,即限价、市价、停损、限价停损。但是这几种交易指令是通过不同方式完成工作的,限价指令是所有平台都支持的,对于市价和停损单,下面几种交易平台如下:
CTP综合交易平台
IB(美国赢透)交易平台 这个平台支持所有限价、市价、停损、限价停损这个4个指令。在IB平台发出停损指令后会将指令单发送到IB的交易服务器上保存,等待触发。