使用双均线的交叉来识别一波潜在的趋势,直到上升趋势或下降趋势确定后才发出买入或卖出信号。
系统通过设置在移动数目的K线内有效的买入/卖出条件单来确定趋势。
进场策略:
买入:移动快速均线上穿慢速均线,系统把最近12根K线的高点加上3%的位置设置为“买入突破线”,如果价格突破
“买入突破线”时则发出买入指令,突破指令在12根K线内有效,即如果12根K线内未突破则取消本次交易。
卖出:移动快速均线下穿慢速均线,系统把最近12根K线的低点减去3%的位置设置为“卖出突破线”,如果价格突破
“卖出突破线”时则发出卖出指令,突破指令在12根K线内有效,即如果12根K线内未突破则取消本次交易。
最近多少根K线的高点以及超过多少百分比作为策略参数输入,允许使用者灵活测试和优化。
出场策略:
反手出场:上述的买入或卖出指令也是反手指令,即:如果持有多头而触发了卖出指令,将先平掉多单头寸然后开立空头头寸,反之亦然。
周期出场:
持有多头头寸时,价格跌破最近8根K线的低点,多头平仓;
持有空头头寸时,价格跌破最近8根K线的高点,空头平仓。
再进场策略:
上述的出场策略有时会导致提前出场并导致系统措施大的利润,再进场策略可以在趋势继续是重建原来的头寸。多头出场后,记下出场时最近10根K线的高点,如果出场后15根K线内价格达到最近10根K线的高点重新做多;
空头出场后,记下出场时最近10根K线的低点,如果出场后15根K线内价格达到最近10根K线的低点重新做空。
INPUT : FastLen(9,1,200,2) ; //快速均线周期;
INPUT : SlowLen(18,10,300,2) ; //快速均线周期;
INPUT : T10(10,10,300,2) ;
INPUT : ChLen(12,1,100,2); //通道突破的周期;
INPUT : ExtraPercentage(300,1,500,2); //通道突破的幅度(万分比),如300=3%;
INPUT : T8(8,1,100,2); //多少根bar的最低价作为跟踪止损价;
INPUT : InitialLots(1,0,100,1); //初始进场头寸;
INPUT : ReBars(15,1,100,2); //再次进场必须在出场后多少根bar内;
INPUT : ReEntryChLen(10,1,100,2); //再次进场通道突破的周期数;
INPUT : ReEntryLots(1,0,100,1); //再次进场头寸;
FastMA:MA(CLOSE,FastLen),COLORRED;
SlowMA:MA(CLOSE,SlowLen),COLORYELLOW;
VARIABLE : LEntryPrice = 0 ; //开多的突破价格;
VARIABLE : SEntryPrice = 0 ; //开空的突破价格;
VARIABLE : TrailStopPrice = 0 ; //跟踪止损的止损价格
VARIABLE : ReEntryPrice = 0 ; //再进场突破开仓的价格
VARIABLE : LCount = 0 ; //均线金叉后记录Bar序号;
VARIABLE : SCount = 0 ; //均线死叉后记录Bar序号;
VARIABLE : ReEntryCOUNT = 0 ; //跟踪止损后记录Bar序号;
VARIABLE : CurrentBar = 0 ; //信号发生时Bar序号;
VARIABLE : POSITION=0 ; //仓位状态
VARIABLE : ChLenHI=CLOSE ;
VARIABLE : ChLenLO=CLOSE ;
VARIABLE : T12HI=CLOSE ;
VARIABLE : T12LO=CLOSE ;
VARIABLE : T10HI=CLOSE ;
VARIABLE : T10LO=CLOSE ;
VARIABLE : T8HI=CLOSE ;
VARIABLE : T8LO=CLOSE ;
//准备需要计算的变量
ChLenHI := REF(HHV(H,ChLen),1) ;
ChLenLO := REF(LLV(L,ChLen),1) ;
T12HI := REF(HHV(H,T12),1) ;
T12LO := REF(LLV(L,T12),1) ;
T10HI := REF(HHV(H,T10),1) ;
T10LO := REF(LLV(L,T10),1) ;
T8HI := REF(HHV(H,T8),1) ;
T8LO := REF(LLV(L,T8),1) ;
//交易条件
ConCrossOver := CROSS(FastMA , SlowMA); //金叉
ConCrossUnder := CROSS(SlowMA ,FastMA ); //死叉;
//开始执行时 初始化数据
IF BARPOS = 1 THEN BEGIN
POSITION := 0 ;
END //IF
//建立多头进场条件
IF POSITION = 0 AND ConCrossOver = 1 THEN BEGIN //开多条件进场判断
ReEntryCOUNT := 1;
CurrentBar :=1;
END
LCount := BARSLAST(CurrentBar=1); //记录Bar序号以控制只在金叉后ChLen根Bar内进场否则放弃本次交易
LEntryPrice := T12HI * (1+ ExtraPercentage * 0.0001);
//开仓
IF POSITION=0 AND ChLen > LCount AND VOL >0 AND H>L THEN BEGIN
IF HIGH >= LEntryPrice THEN BEGIN//
MYENTRYPRICE := IF(OPEN>LEntryPrice,OPEN,LEntryPrice);//进场价格计算;
BUY( 1,InitialLots,LIMITR,MYENTRYPRICE);//发初次开多单交易指令;
POSITION := 1 ;
LCount := -999;
END //IF
END
//判断趋势是否反转;
IF ConCrossUnder THEN BEGIN
ReEntryCOUNT := 1;
CurrentBar :=1;
END
SCount := ENTERBARS;//记录Bar序号以控制只在金叉后ChLen根Bar内进场否则放弃本次交易
IF SCount >= (ChLen - 1) THEN BEGIN
SEntryPrice := T12LO * (1- ExtraPercentage * 0.0001);
END
//反向突破
IF POSITION=1 AND SCount > 0 AND Chlen < SCount THEN BEGIN//
IF LOW <= SEntryPrice THEN BEGIN
MYEXITPRICE := IF(OPEN<SEntryPrice,OPEN,SEntryPrice);//进场价格计算;
SELL( 1 ,0,LIMITR,MYEXITPRICE);//平多单
POSITION := 0;
LCount := -999;
//反向开空仓
MYENTRYPRICE := IF(OPEN < SEntryPrice,OPEN,SEntryPrice);//进场价格计算;
BUYSHORT( _DEBUG,InitialLots,LIMITR,MYENTRYPRICE);//开空单;
POSITION := -1 ;
SCount := -999;
END
END //IF
//跟踪止损出场
//计算止损位
//STrailStopPrice := T8LO;
IF POSITION=1 AND ENTERBARS>0 THEN BEGIN
IF LOW < STrailStopPrice THEN BEGIN
MYEXITPRICE := IF(OPEN<STrailStopPrice ,OPEN,STrailStopPrice );
SELL( 1,0,LIMITR,MYEXITPRICE);
POSITION := 0 ;
LCount := -999;
ReEntryCount := 1;
END
END
ReEntryCOUNT := BARSLAST(EXITBARS);//记录Bar序号以控制只在金叉后ChLen根Bar内进场否则放弃本次交易
ReEntryPrice := T10HI;
//出场后在ReBar根bar内,价格突破再进场突破价格进场
IF POSITION = 0 AND ReEntryCOUNT > 0 AND ReEntryCOUNT < ReBars THEN BEGIN
IF HIGH > ReEntryPrice THEN BEGIN
MYENTRYPRICE := IF(OPEN>ReEntryPrice,OPEN,ReEntryPrice);//进场价格计算;
BUY( 1,ReEntryLots,LIMITR,MYENTRYPRICE);//发开多单交易指令;
POSITION := 1 ;
END
END
编译后没有信号,请问老师我自己编写的程序问题出在哪里了?如何解决?
另外如何记录信号发生后开始的K线数量,这个我还不是很理解,查函数表后用BARSLAST、EXITBARS和ENTERBARS不知道是否是这样用法,有没有更好的方法记录K线位置或者用什么函数更好?