【问题标题】:How to calculate the ATR like in Pine Script如何像在 Pine Script 中一样计算 ATR
【发布时间】:2019-04-01 15:45:02
【问题描述】:

我需要以与交易视图代码 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 是如何计算的,希望有一个例子。目前我使用了带有 alpha= 1 / ATR_Period 的 EMA,如文档中所示,但似乎不一样。 Bellow是新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);
  }
//+------------------------------------------------------------------+

【问题讨论】:

    标签: mql5 pine-script


    【解决方案1】:

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

    //@version=4
    myAtr = atr(14)
    

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

    【讨论】:

      【解决方案2】:

      这就是 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))
      

      【讨论】:

      • 感谢您的回复。在 Pine 文档上说 alpha = 1 / Y 这不是真的吗?另外,总和变量仅在开始时才为“零”,对吗?在接下来的迭代中等于前一个柱的平均真实范围对吗?我无法在 MQL5 中得到类似的结果。
      • 1) 没错,pine_rma 可以改写成下面的方式:stackoverflow.com/a/48960194/1910483,但结果是一样的。 2) sum 首先在每个柱上变为零,然后以下一种方式计算:sum := (x + (alpha - 1) * nz(sum[1])) / alpha,所以在第一次计算结束时sum 等于x。我们必须使用sum = 0.0 让编译器知道变量的类型是什么。
      • 非常感谢 Michel T。知道我与 MT5 中的结果差异较小。我真的尝试了不同类型的移动平均线,这是更相似的一种。我知道它永远不会相同,因为我在 Trading View 和 Metatrader 中都尝试了一个简单的移动平均线,它们相似但不完全一样。我认为不同之处在于价格数据和计算时的价差。无论如何,我真的很感谢你的帮助。我现在不能投票,看来我还小,哈哈。 :)
      【解决方案3】:

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

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

      其中n 表示句点。所以这意味着atr(periods) 表示tr 中的averagen 期间的每个条形中。 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))
      

      【讨论】:

        【解决方案4】:

        首先,对不起,我不是计算机程序员,虽然我有一点经验。

        在 TradingView Pine Editor 中,我有一个运行良好的 @version=4 脚本。由于我只能在 TradingView 中使用 5 个指标,因此该脚本允许我使用多个指标,但 TradingView 将其视为仅一个指标。

        我想为我已经在使用的脚本添加一个 ATR 值。

        上面,在另一篇文章中,写在 Pine 版本 4 上,我可以使用这个:

        //@version=4
        myAtr = atr(14)
        

        我已将该代码添加到我已经使用的脚本中,但它没有做任何事情。我想有些代码丢失了。

        上面建议了一个@version=3 ATR 脚本(在另一篇文章中),它可以工作,但我的问题是我已经拥有的脚本(我想在其中添加 ATR)是 @version=4。

        所以,我需要一个在 version=4 中工作的代码(将写入 ATR 值)。

        谢谢!

        【讨论】:

        • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
        猜你喜欢
        • 2022-12-09
        • 1970-01-01
        • 2019-10-17
        • 1970-01-01
        • 2021-11-08
        • 1970-01-01
        • 2021-05-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多