TB自带公式CL_trendscore_l(K线打分)
//------------------------------------------------------------------------// 简称: CL_TrendScore_L
// 名称: 基于收盘价与之前k线高低进行打分的交易系统多
// 类别: 公式应用
// 类型: 内建应用
//------------------------------------------------------------------------
//----------------------------------------------------------------------//
// 策略说明:
// 本策略基于当前收盘价与之前k线的高低进行打分, 并通过打分的均值与对应的收盘价均值进行交易
//
// 系统要素:
// 1. 当当前收盘价格大于之前LookBack根K线内某一根k线的收盘价时记+1分, 否则记-1分, 加总这些分数以获得当前K线的得分
// 2. 对k线的打分计算一条均线
// 3. 对k线的收盘计算一条均线
// 入场条件:
// 1. 当价格高于收盘价均线, 且打分也高于打分均线时的入场做多
// 2. 当价格低于收盘价均线, 且打分也低于打分均线时的入场做空
// 出场条件:
// 1. 基于ATR的保护性止损
// 2. 基于ATR的跟踪止损
// 3. 基于ATR的盈亏平衡止损
//
// 注: 当前策略仅为做多系统, 如需做空, 请参见CL_TrendScore_S
//----------------------------------------------------------------------//
Params
Numeric LookBack(10); //用于给当前K线打分的回溯根数
Numeric MALength(18); //均线值
Numeric ATRLength(10); //ATR的值
Numeric ProtectStopATRMulti(0.5); //保护性止损的ATR乘数
Numeric TrailStopATRMulti(3); //跟踪止损的ATR乘数
Numeric BreakEvenStopATRMulti(5); //盈亏平衡止损的ATR乘数
Vars
NumericSeries MA(0); //收盘价均线
NumericSeries TrendScore(0); //当前K线的打分
NumericSeries TrendScoreMA(0); //k线打分的均线
NumericSeries ATR(0); //ATR
Numeric i;
Numeric Temp;
NumericSeries HighAfterEntry; //持仓后的高点记录
NumericSeries ProtectStopL; //基于ATR的保护性止损
Numeric TrailStopL; //基于ATR的跟踪止损
Numeric BreakEvenStopL; //基于ATR的盈亏平衡止损
Numeric ExitLineL; //平仓线
NumericSeries MP; //MarketPosition状态记录
Begin
// 集合竞价和小节休息过滤
If(!CallAuctionFilter()) Return;
//系统设置
//K线打分 - 当当前收盘价格大于之前LookBack根K线内某一根k线的收盘价时记+1分, 否则记-1分, 加总这些分数以获得当前K线的得分
TrendScore = 0;
SetGlobalVar(1,0);
for i = LookBack DownTo 1 /*循环次数*/
{
If(i == LookBack)
{
Temp = 0;
}
Else
{
Temp = GetGlobalVar(1);
}
If(C>=C) Temp = Temp +1;
Else Temp = Temp - 1;
SetGlobalVar(1,Temp);
}
TrendScore = GetGlobalVar(1);
//PlotNumeric("TrendScore",TrendScore);
//均线和ATR计算
MA = AverageFC(C,MALength);
TrendScoreMA = AverageFC(TrendScore,MALength);
ATR = AvgTrueRange(ATRLength);
//PlotNumeric("TrendScoreMA",TrendScoreMA);
//PlotNumeric("MA",MA);
//系统入场
//当价格高于收盘价均线, 且打分也高于打分均线时的入场做多
If(MarketPosition <> 1 and MA <> 0)
{
If(Close >= MA and TrendScore >= TrendScoreMA And Vol > 0)
{
Buy(0,Open);
//基于ATR的保护性止损
ProtectStopL = Low - ProtectStopATRMulti * ATR;
}
}
//系统出场
If(BarsSinceEntry == 0)
HighAfterEntry = High;
Else
HighAfterEntry = Max(HighAfterEntry,High);
//基于ATR的跟踪止损
TrailStopL = HighAfterEntry - TrailStopATRMulti * ATR;
//基于ATR的盈亏平衡止损
BreakEvenStopL = LastEntryPrice;
If(MarketPosition == 1 and mp == 1) {
//出场线选择
If(HighAfterEntry >= BreakEvenStopL + BreakEvenStopATRMulti * ATR)
{
if(TrailStopL >= BreakEvenStopL) ExitLineL = TrailStopL;
Else ExitLineL = BreakEvenStopL;
}
Else
{
if(TrailStopL >= ProtectStopL) ExitLineL = TrailStopL;
Else ExitLineL = ProtectStopL;
}
//出场
if(L <= ExitLineL And Vol > 0)
{
Sell(0,Min(Open, ExitLineL));
}
}
//PlotNumeric("ProtectStopL",ProtectStopL);
//PlotNumeric("TrailStopL",TrailStopL);
//PlotNumeric("BreakEvenStopL",BreakEvenStopL);
//PlotNumeric("ExitLineL",ExitLineL);
MP = MarketPosition;
End
//------------------------------------------------------------------------
// 编译版本 GS2014.10.25
// 版权所有 TradeBlazer Software 2003-2014
// 更改声明 TradeBlazer Software保留对TradeBlazer平
// 台每一版本的TradeBlazer公式修改和重写的权利
//------------------------------------------------------------------------ 两个问题,
If(MarketPosition == 1 and mp == 1)
为什么要对前面一个持仓状态进行定义,都是开多的话,前一个持仓信号不也是多头吗?
第二
MP = MarketPosition;
对MP的定义放到了最后,我尝试放到前面就定义,效果差了很多。
请各位帮忙指点下小白。 yaqh273150622 发表于 2015-9-23 10:03 static/image/common/back.gif
两个问题,
If(MarketPosition == 1 and mp == 1)
为什么要对前面一个持仓状态进行定义,都是开多的 ...
软件自带的这些公式都是根据国外经典策略来编写的,这里为何要判断 mp==1 应该是与原著所提的需求的有关。有兴趣的建议去相关的原著策略思路来看看。。
MP = MARKETPOSITION如果放到代码前段,那如果当前bar有开平仓信号的,这个就不能真实记录当前bar的MP状态了。。所以得放到后面呀 小米 发表于 2015-9-23 11:01 static/image/common/back.gif
软件自带的这些公式都是根据国外经典策略来编写的,这里为何要判断 mp==1 应该是与原著所提的需求的有 ...
非常感谢!
页:
[1]