程序化之交易模型的编写
(2011-06-02 12:50:29)
标签:
空操作模型交易系统低值高值财经 |
分类: 对冲及程序化交易 |
1)如何把熟悉的技术指标转换成交易模型?
第一步:把 KDJ 指标公式 COPY 过来,或按“引入公式”按钮,引入
RSV:=(CLOSE-LLV(LOW,N))/(HHV(HIGH,N)-LLV(LOW,N))*100;//算出(收盘价-N周期内的最低价)/(N周期的最高价N周期内的最低价)*100 的值,用RSV 来表示。
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);//在:后加上=
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<REF(H,2) AND REF(H,1)<REF(H,2),REF(H,2),0);
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<LL2,1,0));
{最新值 与“高值”比:
若最新值比“高值”高,返回-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<CLOSE,OPEN,CLOSE);
//以上是在定义变量,转换成模型时直接引用
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<REF(H,2) AND
REF(H,1)<REF(H,2),REF(H,2),0);
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<LL2,1,0));
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<REF(H,2) AND REF(H,1)<REF(H,2),REF(H,2),0);
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<LL2,1,0));
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<REF(H,2) AND REF(H,1)<REF(H,2),REF(H,2),0);
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<LL2,1,0));
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); //开空操作
(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,以当时的对手价卖出全部持仓。
//结果:成交价根据行情决定。
//相当于----止损----条件单,当价格突破某个值时买平仓。
请各位来访的朋友点击我头像下面的“加关注”,谢谢!铭博财富国内理财联系邮箱:mbmoney@sina.com