S1+S2海龟交易系统 (不加仓/不过滤)
【测试代码】
变量:N1 (0, 1, 0.4)
// 一、计算ATR
TR := MAX(MAX((HIGH-LOW),ABS(REF(CLOSE,1)-HIGH)),ABS(REF(CLOSE,1)-LOW));
ATR := MA(TR,20);
// 二、定义高低点
H20 := HV(H, 20); // 20日高点
L10 := LV(L, 10); // 10日低点
H55 := HV(H, 55); // 55日高点
L55 := LV(L, 55); // 55日低点
L20 := LV(L, 20); // 20日低点
H10 := HV(H, 10); // 10日高点
// 三、定义系统1、2开平仓信号
TPH20 := CROSSUP(C, H20); // 突破20日高点 1
TPH55 := CROSSUP(C, H55); // 突破55日高点 3
TPL55 := CROSSDOWN(C, L55);// 突破55日低点 4
DPL10 := CROSSDOWN(L, L10);// 跌破10日低点 1
DPL20 := CROSSDOWN(L, L20);// 跌破20日低点 3
TPL20 := CROSSDOWN(C, L20);// 突破20日低点 2
TPH10 := CROSSUP(H, H10); // 突破10日高点 2
TPHH20 := CROSSUP(H, H20); // 突破20日高点 4
// 四、定义首次开平仓
FTPH20:= TPH20 AND COUNT(TPH20, BARSLAST(DPL10))=1;//首次向上突破20日高点 (FRIST 突破 HIGH 20)= FTPH20
DRAWTEXT(FTPH20 ,H+20 ,'系统1_BK'), VALIGN2, FONTSIZE16, COLORWHITE;
FDPL10:= DPL10 AND COUNT(DPL10, BARSLAST(FTPH20))=1 ;
DRAWTEXT(FDPL10 ,L-20 ,'系统1_SP'), VALIGN2, FONTSIZE16, COLORWHITE;
FTPL20:= TPL20 AND COUNT(TPL20, BARSLAST(TPH10))=1;//首次向下突破20日低点
DRAWTEXT(FTPL20 ,L-20 ,'系统1_SK'), VALIGN2, FONTSIZE16, COLORWHITE;
FTPH10:= TPH10 AND COUNT(TPH10, BARSLAST(FTPL20))=1;
DRAWTEXT(FTPH10 ,H+20 ,'系统1_BP'), VALIGN2, FONTSIZE16, COLORWHITE;
FTPH55:= TPH55 AND COUNT(TPH55, BARSLAST(DPL20))=1;//首次向上突破55日高点
DRAWTEXT(FTPH55 ,H+40 ,'系统2_BK'), VALIGN2, FONTSIZE16, COLORYELLOW;
FDPL20:= DPL20 AND COUNT(DPL20, BARSLAST(FTPH55))=1;//
FTPL55:= TPL55 AND COUNT(TPL55, BARSLAST(TPHH20))=1;//首次向下突破55日低点
FTPHH20:= TPHH20 AND COUNT(TPHH20, BARSLAST(FTPL55))=1;
//DRAWTEXT(FTPL20 ,L-40 ,'系统1_SPK'), VALIGN2, FONTSIZE14, COLORYELLOW;
// 五、记录开仓(平仓)收盘价
//系统1做多数据记录
BKC20 := IF( FTPH20, C, REF(C, BARSLAST(FTPH20)) );//首次突破20日高点时的价格
SPC10 := IF( FDPL10, C, REF(C, BARSLAST(FDPL10)) );//首次跌破10日低点时的价格
BKC55 := IF( FTPH55, C, REF(C, BARSLAST(FTPH55)) );//首次突破55日高点时的价格
BKC55_ZS := BKC55 - 2 * ATR;//系统2止损位置
BKC20_ZS := BKC20 - 2 * ATR;//系统1止损位置
YK1 := IF( SPC10 - BKC20 > 0 , -1, -1);//多头头盈亏判断 (卖平-买开> 0 说明盈利,记1,反之则记-1)
//系统1做空数据记录
SKC20 := IF( FTPL20, C, REF(C, BARSLAST(FTPL20)) );//首次突破20日低点时的价格
BPC10 := IF( FTPH10, C, REF(C, BARSLAST(FTPH10)) );//首次突破10日高点时的价格
SKC55 := IF( FTPL55, C, REF(C, BARSLAST(FTPL55)) );//首次突破55日低点时的价格
SKC55_ZS := SKC55 + 2 * ATR;
SKC20_ZS := SKC20 + 2 * ATR;
YK2 := IF( BPC10 - SKC20 > 0, -1, -1);//空头盈亏判断 (买平-卖开> 0 说明亏损,记-1,反之则记-1)
//YK=盈亏 (用于判断是否满足亏损性突破)
YK : IF( BARSLAST(FTPH10) < BARSLAST(FDPL10), YK2, YK1);
// BARSLAST(FTPH10) < BARSLAST(FDPL10) 比对最近一次平仓是做多平仓,还是做空平仓
// YK2 记录多头盈亏信号
// YK1 记录空头盈亏信号
//六、交易手数计算
BKLOTS20:= (INTPART(MONEYTOT * N1 / BKC20 / 100)) * 100;//系统1做多手数
BKLOTS55:= (INTPART(MONEYTOT * N1 / BKC55 / 100)) * 100;//系统2做多手数
//SKLOTS20:= (INTPART(MONEYTOT * N2 / SKC20 / 100)) * 100;//系统1做空手数(股票不使用)
//SKLOTS55:= (INTPART(MONEYTOT * N2 / SKC55 / 100)) * 100;//系统2做空手数(股票不使用)
//固定开仓位置手数(不让手数随着k线变化)
LOTS20:= IF( FTPH20 AND REF(YK, 1)<0, BKLOTS20, REF(BKLOTS20, BARSLAST(FTPH20 && REF(YK, 1)<0)) );
LOTS55:= IF( FTPH55, BKLOTS55, REF(BKLOTS55, BARSLAST(FTPH55)) );
//七、开仓信号
FTPH20 AND REF(YK, 1)<0 AND FTPH55 AND BKVOL=0,BK(LOTS20+LOTS55);//系统1、2买入开仓(同时满足系统1、2条件)
FTPH20 AND REF(YK, 1)>0 AND FTPH55 AND BKVOL=0,BK(LOTS55);//系统2买入开仓(系统1信号被过滤)
FTPH20 AND REF(YK, 1)<0 AND BKVOL=0,BK(LOTS20);//系统1买入开仓(只满足系统1条件)
FTPH20 AND REF(YK, 1)<0 AND BKVOL=LOTS55,BK(LOTS20);//系统1买入开仓(系统2持仓)
FTPH55,BK(LOTS55);//系统2买入开仓
//八、平仓及止损信号
//系统1、2同时持仓时
BKVOL=(LOTS20+LOTS55) AND CROSSDOWN(C,BKC55_ZS) AND CROSSDOWN(C,BKC20_ZS) AND FDPL10 AND FDPL20, SP(BKVOL);//止损
BKVOL=(LOTS20+LOTS55) AND CROSSDOWN(C,BKC55_ZS) AND CROSSDOWN(C,BKC20_ZS), SP(BKVOL);//止损
BKVOL=(LOTS20+LOTS55) AND CROSSDOWN(C,BKC55_ZS) AND FDPL10, SP(BKVOL);//止损
BKVOL=(LOTS20+LOTS55) AND CROSSDOWN(C,BKC55_ZS) AND NOT(FDPL10) AND NOT(CROSSDOWN(C,BKC20_ZS)), SP(LOTS55);//系统2止损
BKVOL=(LOTS20+LOTS55) AND C<=BKC20_ZS AND FDPL20 AND NOT(CROSSDOWN(C,BKC55_ZS)), SP(BKVOL);//止损
BKVOL=(LOTS20+LOTS55) AND C<=BKC20_ZS AND NOT(FDPL20) AND NOT(CROSSDOWN(C,BKC55_ZS)), SP(LOTS20);//系统1止损
BKVOL=(LOTS20+LOTS55) AND FDPL20 AND FDPL10,SP(BKVOL);
BKVOL=(LOTS20+LOTS55) AND FDPL10,SP(LOTS20);
//系统2持仓时
BKVOL=LOTS55 AND CROSSDOWN(C,BKC55_ZS) AND CROSSDOWN(C,BKC20_ZS), SP(LOTS55);
BKVOL=LOTS55 AND CROSSDOWN(C,BKC55_ZS) AND FDPL10, SP(LOTS55);
BKVOL=LOTS55 AND CROSSDOWN(C,BKC55_ZS) AND NOT(FDPL10) AND NOT(CROSSDOWN(C,BKC20_ZS)), SP(LOTS55);
BKVOL=LOTS55 AND FDPL20 AND CROSSDOWN(C,BKC20_ZS) AND NOT(CROSSDOWN(C,BKC55_ZS)), SP(LOTS55);
BKVOL=LOTS55 AND COUNT(DPL20, BARSLAST(FTPH55))=1 AND FDPL20, SP(LOTS55);
//系统1持仓时
BKVOL=LOTS20 AND CROSSDOWN(C,BKC20_ZS) AND CROSSDOWN(C,BKC55_ZS), SP(LOTS20);
BKVOL=LOTS20 AND FDPL10 AND CROSSDOWN(C,BKC55_ZS), SP(LOTS20);
BKVOL=LOTS20 AND CROSSDOWN(C,BKC20_ZS) AND NOT(CROSSDOWN(C,BKC55_ZS)) AND FDPL20, SP(LOTS20);
BKVOL=LOTS20 AND CROSSDOWN(C,BKC20_ZS) AND NOT(CROSSDOWN(C,BKC55_ZS)) AND NOT(FDPL20), SP(LOTS20);
BKVOL=LOTS20 AND COUNT(FTPH20 && REF(YK, 1)<0, BARSLAST(FTPH20))=1 AND FDPL10, SP(LOTS20);
BKVOL=LOTS20 AND COUNT(DPL10, BARSLAST(FTPH20 AND REF(YK, 1)<0))=1 AND FDPL10, SP(LOTS20);
|