期货软件TB系统源代码解读系列7-ATR

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振幅:

期货软件TB系统源代码解读系列7-ATR_第1张图片

4小时的振幅:

期货软件TB系统源代码解读系列7-ATR_第2张图片

1小时振幅:

期货软件TB系统源代码解读系列7-ATR_第3张图片

30分钟振幅:

期货软件TB系统源代码解读系列7-ATR_第4张图片

3分钟振幅,这是我个人习惯用来做交易的周期图了:

期货软件TB系统源代码解读系列7-ATR_第5张图片

看了这几幅价格振幅图,大家应理解我为什么喜欢用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

期货软件TB系统源代码解读系列7-ATR_第6张图片

看结果也很一般,照我个人习惯,给它添加一个限制条件看看,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

期货软件TB系统源代码解读系列7-ATR_第7张图片

看着还行吧,我也是第一次测试这个,具体能不能当成程序化来操作也不知道的,要是再添加止盈止损条件,结果又如何呢?这个大家可以试试,就添加boll带后面那些代码,我在这也不再继续了,对这指标有兴趣的,可以自己测试一下的。

你可能感兴趣的:(期货软件TB系统源代码解读系列7-ATR)