//----------------------------------------------------------------------//
// 策略说明:
//
本策略基于价格与均线建立了一套可变的支撑线阻力线系统, 通过价格与支撑线阻力线的关系进行交易
//
// 系统要素:
//
均线与价格组成的支撑线阻力线系统
//
1. 当价格死叉均线时, 上根k线的低点为支撑线初始化, 当价格金叉均线时, 上根k线的高点为阻力线初始化
//
2. 当价格低于均线时不断更新支撑线, 当价格高于均线时不断更新阻力线
//
3. 当价格金叉均线又死叉均线时记录上根阻力线作为做多的价格线, 当价格死叉均线又金叉均线时记录上根支撑线作为做空的价格线
// 入场条件:
//
1. 当价格高于做多的价格线时做多
//
2. 当价格低于做空的价格线时做空
// 出场条件:
//
1. 基于ATR的保护性止损
//
2. 基于ATR的跟踪止损
//
//
注: 当前策略仅为做多系统, 如需做空, 请参见CL_Moving_Average_Sup_and_Res_S
//----------------------------------------------------------------------//
Params
Numeric MALength(10);
//均线值
Numeric ATRLength(10);
//ATR的值
Numeric ProtectStopATRMulti(0.5);
//保护性止损的ATR乘数
Numeric TrailStopATRMulti(2.5);
//跟踪止损的ATR乘数
Vars
NumericSeries MA(0);
//均线
NumericSeries ATR(0);
//ATR
NumericSeries SupportLine(-9999999);
//支撑线
NumericSeries ResistanceLine(9999999);
//阻力线
BoolSeries CrossFlagForL(False);
//收盘价与均线交叉的状态记录L
BoolSeries CrossFlagForS(False);
//收盘价与均线交叉的状态记录S
BoolSeries SupportFlag(False);
//支撑线为真的标志
BoolSeries ResistanceFlag(False);
//阻力线为真的标志
NumericSeries EntryPriceL(0);
//开仓入场价
NumericSeries HighAfterEntry;
//持仓期间最高点的记录
NumericSeries ProtectStopL;
//基于ATR的保护性止损
Numeric TrailStopL;
//基于ATR的跟踪止损
NumericSeries MP;
//MarketPosition状态记录
Begin
// 集合竞价和小节休息过滤
If(!CallAuctionFilter()) Return;
//系统设置
//均线与ATR计算
MA = AverageFC(C,MALength);
ATR = AvgTrueRange(ATRLength);
//计算入场线
// 1. 当价格死叉均线时, 上根k线的低点为支撑线初始化, 当价格金叉均线时, 上根k线的高点为阻力线初始化
// 2. 当价格低于均线时不断更新支撑线, 当价格高于均线时不断更新阻力线
// 3. 当价格金叉均线又死叉均线时记录上根阻力线作为做多的价格线
CrossFlagForL = CrossUnder(C,MA);
CrossFlagForS = CrossOver(C,MA);
If(CrossFlagForL == True)
{
If(ResistanceFlag[1] == True)
{
EntryPriceL = ResistanceLine[1];
ResistanceFlag = False;
}
SupportFlag = True;
SupportLine = Low;
}
If(CrossFlagForS == True)
{
If(SupportFlag[1] == True)
{
SupportFlag = False;
}
ResistanceFlag = True;
ResistanceLine = High;
}
//PlotNumeric("MA",MA);
//PlotNumeric("EntryPriceL",EntryPriceL);
//更新支撑与阻力线
If( C > MA )
{
If(High > ResistanceLine[1]) ResistanceLine = High;
}
Else If(C < MA)
{
If(Low < SupportLine[1]) SupportLine = Low;
}
//PlotNumeric("ResistanceLine",ResistanceLine);
//PlotNumeric("SupportLine",SupportLine);
//系统入场
//当上根K线的收盘价格金叉多头入场价格线后, 在本根K线开盘价做多
If(MarketPosition <> 1 and EntryPriceL[1] <> 0 and EntryPriceL[2] <> 0)
{
If(Close[2] < EntryPriceL[2] and Close[1] >= EntryPriceL[1] And Vol > 0)
{
Buy(0,Open);
//基于ATR的保护性止损
ProtectStopL = Low[1] - ProtectStopATRMulti * ATR[1];
}
}
//系统出场
If(BarsSinceEntry == 0)
HighAfterEntry = High;
Else
HighAfterEntry = Max(HighAfterEntry[1],High);
//基于ATR的跟踪止损
TrailStopL = HighAfterEntry[1] - TrailStopATRMulti * ATR[1];
If(MarketPosition == 1 and mp[1] == 1 And Vol > 0)
{
//基于ATR的保护性止损
if(L <= ProtectStopL[1] and ProtectStopL[1] >= TrailStopL)
{
Sell(0,Min(Open, ProtectStopL[1]));
}
//基于ATR的跟踪止损
Else if(L<=TrailStopL)
{
Sell(0,Min(Open, TrailStopL));
}
}
//PlotNumeric("ProtectStopL",ProtectStopL);
//PlotNumeric("TrailStopL",TrailStopL);
MP = MarketPosition;
End