如何像Pine Script中那样计算ATR

时间:2019-04-01 15:45:03

标签: mql5 pine-script

我需要以与交易视图代码Pine Script中相同的方式计算ATR。我说的是股票或外汇技术分析中的平均真实区间指标。 在Pine Script的文档中说的是这样计算的:

plot(rma(close, 15))

// same on pine, but much less efficient
pine_rma(x, y) =>
    alpha = y
    sum = 0.0
    sum := (x + (alpha - 1) * nz(sum[1])) / alpha
plot(pine_rma(close, 15))
RETURNS
Exponential moving average of x with alpha = 1 / y.

我尝试了与MQL5文档中相同的方法,并且该策略的结果根本不相似,ATR出了点问题。计算真实范围很简单,我知道问题在于如何计算此RMA(滚动平均线?)。它说的是按照原始RSI指标计算的。有人可以更好地解释一下如何在Pine Script中计算ATR,希望有一个例子。目前,与文档中一样,我将EMA与alpha = 1 / ATR_Period一起使用,但似乎并不相同。 贝娄是新ATR的代码,基本上与MT5中的默认代码相同,我只更改了最后一部分,即计算出的位置。 谢谢您的帮助!

//--- the main loop of calculations
   for(i=limit;i<rates_total && !IsStopped();i++)
     {
      ExtTRBuffer[i]=MathMax(high[i],close[i-1])-MathMin(low[i],close[i-1]);
      ExtATRBuffer[i]=(ExtTRBuffer[i] - ExtATRBuffer[i-1]) * (1 / ATR_Period) +ExtATRBuffer[i-1] ; // Here I calculated the EMA of the True Range
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

3 个答案:

答案 0 :(得分:0)

这是Pine Script中的ATR实现

//@version=3
study(title="Average True Range", shorttitle="ATR", overlay=false)

pine_rma(x, y) =>
    alpha = y
    sum = 0.0
    sum := (x + (alpha - 1) * nz(sum[1])) / alpha

true_range() =>
    max(high - low, max(abs(high - close[1]), abs(low - close[1])))

plot(pine_rma(true_range(), 14), color=red)
//plot(atr(14))

答案 1 :(得分:0)

在Pine版本4上,您可以使用:

{{1}}

https://www.tradingview.com/pine-script-reference/#fun_atr

答案 2 :(得分:0)

引用迈克尔的话,我才意识到实施意味着实践

<块引用>

(tr1+tr2+...tr_n)/n

其中 n 表示回溯期。所以这意味着 atr(periods) 表示 averagetr 在每个条形中沿着 n 周期。 Michal 在 pinescript 中这样做,因为 pinescripte 中的所有内容都是一个系列,需要递归破解过去的总和。

看看重构后的相同代码,你就会明白我在说什么:

/@version=3
study(title="Average True Range", shorttitle="ATR", overlay=false)
averageTrueRange(tr, periods) =>
    sum = 0.0
    sum := (tr + (periods - 1) * nz(sum[1])) / periods

currentTrueRange() =>
    max(high - low, max(abs(high - close[1]), abs(low - close[1])))

plot(averageTrueRange(currentTrueRange(), 15))