ATR-平均真实波幅,这个指标我觉得用的人可能不会太多,但这个是我在看了《交易冠军》和《股票作手回忆录》后,发现他们都很注重真实波动振幅,杰西.利佛摩尔更是在他的操盘术里详细描述了如何基于波幅基础上操盘,结果如何,你懂的。我一般不会用它来操盘,用的最多的是拿来做止损点的判断,至于如何做,这也只是个人习惯而已。
计算公式如下:
ATR=∣最高价-最低价∣和∣最高价-昨收∣和∣昨收-最低价∣的最大值
真实波幅(ATR)=TR的N日简单移动平均
参数N设置为14日
好了,我们开始看TB系统是如何来写这个程序,这真是一个精妙的算法设计,我看着也觉得真简洁,不一步步分析,咋一看还真让人迷糊的。这里它写了四个函数,解析如下。
第一个函数TrueHigh,求真实高点(细看发现不需要参数的):
Vars
Numeric THighValue;//声明数值型变量THighValue。//
Begin
THighValue = Close[1];//语句1,直接让变量THighValue值=昨日收盘价。//
If(High >= Close[1])//语句2,假如当前最高价High>=昨日收盘价时。//
THighValue = High;//变量THighValue值=当前最高价。//
Return THighValue;//语句1和语句2是一个并列语句,哪个条件符合的,就用哪个语句的值,这可以先判断出最高价和昨收价哪个是最大值。//
End
第二个函数TrueLow,求真实低点:
Vars
Numeric TLowValue;//声明数值型变量TLowValue。//
Begin
TLowValue = Close[1];//语句1,变量TLowValue值=昨收价。//
If(Low <= Close[1])//语句2,假如当前最低价 <=昨收价。//
TLowValue = Low;//变量TLowValue值=当前低价了。//
Return TLowValue;//求出当前最低价与昨收价哪个为最小值,就用它了。//
End
第三个函数TrueRange,真实振幅范围(直接不写参数,变量):
Begin
If(CurrentBar == 0)//假如为第一根k。//
Return High - Low;//那振幅就是直接最高价减去最低价了。//
Else//第二根之后的振幅。//
Return TrueHigh - TrueLow;//就是函数TrueHigh值减去函数TrueLow值。//
End
第四个函数AvgTrueRange,求平均真实振幅:
Params
Numeric Length(10);//声明数值型参数Length,就是周期了,赋值给它10周期。//
Begin
Return Average(TrueRange,Length);//求出10个周期真实振幅平均值。//
End
第五个函数ATR,其实表达的意思跟第四个函数完全一样的,只是这里让它画出来而已:
Params
Numeric Length(14); //声明数值型参数Length,初值为14周期。//
Begin
PlotNumeric("ATR",AvgTrueRange(Length));//在k线图上画出ATR出来,它的值是14根k线的平均振幅值。//
End
这一步步下来,让我们看出了这ATR是如何求出来的,一般我都只用它来观察波幅集中区域,从周期日k逐步观察统计到你所用的周期,你心里就会知道,这个品种它一天大概集中振幅多大,当前的习惯周期振幅多大,我们的止损点是该根据日k的振幅来设吗?我也不当什么专家指导大家了,只能说这只是我的设置止损点的一个重要依据而已。
观察ATR的值,看上面代码可以知道,直接把参数14改成1就可以观察它每根k线的波幅了。下面是我时常观察的周期振幅图。
日k振幅:
4小时的振幅:
1小时振幅:
30分钟振幅:
3分钟振幅,这是我个人习惯用来做交易的周期图了:
看了这几幅价格振幅图,大家应理解我为什么喜欢用30了吧。这个做成程序化交易,我也没做过,现在既然写到了这个,也是顺便百度了一下,看到它的买卖依据,写出来,做个测试看看吧。
出入场规则:当价格比上一个交易日收盘价高2ATR时买入,当价格比上一个交易日收盘价低2ATR时卖出。
代码如下:
Params
Numeric Length(14);
Vars
NumericSeries atr;
Numeric upline;
Numeric downline;
Numeric myprice;
Begin
atr = Average(TrueRange,Length);
upline = Close[1] + 2 * atr;
downline = Close[1] -2 * atr;
PlotNumeric("k",upline);
PlotNumeric("h",downline);
If(MarketPosition!=1 && High>=upline )
{
myprice=Max(upline,Open);
Buy(1 ,myprice);
}
If(MarketPosition==1 And Low<=downline )
{
myprice = Min(downline,Open);
Sell(1,myprice);
}
If(MarketPosition!=-1 And Low<=downline )
{
myprice = Min(downline,Open);
SellShort(1,myprice);
}
If(MarketPosition==-1 && High>=upline )
{
myprice=Max(upline,Open);
BuyToCover (1 ,myprice);
}
End
看结果也很一般,照我个人习惯,给它添加一个限制条件看看,360的移动均线,反正也是顺手的事。代码如下:
Params
Numeric Length(14);
Numeric Length3(360);
Vars
NumericSeries atr;
Numeric upline;
Numeric downline;
Numeric myprice;
NumericSeries AvgValue3;
Begin
atr = Average(TrueRange,Length);
upline = Close[1] + 2 * atr;
downline = Close[1] -2 * atr;
PlotNumeric("k",upline);
PlotNumeric("h",downline);
AvgValue3 = AverageFC(Close ,Length3);
PlotNumeric("AvgValue3",AvgValue3);
If(MarketPosition!=1 && High>=upline and High>AvgValue3)
{
myprice=Max(upline,Open);
Buy(1 ,myprice);
}
If(MarketPosition==1 And Low<=downline )
{
myprice = Min(downline,Open);
Sell(1,myprice);
}
If(MarketPosition!=-1 And Low<=downline And Low < AvgValue3)
{
myprice = Min(downline,Open);
SellShort(1,myprice);
}
If(MarketPosition==-1 && High>=upline )
{
myprice=Max(upline,Open);
BuyToCover (1 ,myprice);
}
End
看着还行吧,我也是第一次测试这个,具体能不能当成程序化来操作也不知道的,要是再添加止盈止损条件,结果又如何呢?这个大家可以试试,就添加boll带后面那些代码,我在这也不再继续了,对这指标有兴趣的,可以自己测试一下的。