pine 脚本 - 引用局部变量的先前值

问题描述 投票:0回答:1

我有这个函数,但我无法理解 _f[1],_f[2],... 值。 _f 是函数的局部变量,所以我的问题是 _f[1] 是否引用了之前运行的函数中 _f 的值?或者其他什么。

f_filt9x (_a, _s, _i) => 
    int _m2 = 0, int _m3 = 0, int _m4 = 0, int _m5 = 0, int _m6 = 0, 
    int _m7 = 0, int _m8 = 0, int _m9 = 0, float _f = .0, _x = (1 - _a)
  
    // Weights. 
    // Initial weight _m1 is a pole number and equal to _i
    _m2 := _i == 9 ? 36  : _i == 8 ? 28 : _i == 7 ? 21 : _i == 6 ? 15 : _i == 5 ? 10 : _i == 4 ? 6 : _i == 3 ? 3 : _i == 2 ? 1 : 0
    _m3 := _i == 9 ? 84  : _i == 8 ? 56 : _i == 7 ? 35 : _i == 6 ? 20 : _i == 5 ? 10 : _i == 4 ? 4 : _i == 3 ? 1 : 0
    _m4 := _i == 9 ? 126 : _i == 8 ? 70 : _i == 7 ? 35 : _i == 6 ? 15 : _i == 5 ? 5  : _i == 4 ? 1 : 0
    _m5 := _i == 9 ? 126 : _i == 8 ? 56 : _i == 7 ? 21 : _i == 6 ? 6  : _i == 5 ? 1  : 0 
    _m6 := _i == 9 ? 84  : _i == 8 ? 28 : _i == 7 ? 7  : _i == 6 ? 1  : 0 
    _m7 := _i == 9 ? 36  : _i == 8 ? 8  : _i == 7 ? 1  : 0 
    _m8 := _i == 9 ? 9   : _i == 8 ? 1  : 0 
    _m9 := _i == 9 ? 1   : 0
    // filter
    _f :=   pow(_a, _i) * nz(_s) + 
      _i  *     _x      * nz(_f[1])      - (_i >= 2 ? 
      _m2 * pow(_x, 2)  * nz(_f[2]) : 0) + (_i >= 3 ? 
      _m3 * pow(_x, 3)  * nz(_f[3]) : 0) - (_i >= 4 ? 
      _m4 * pow(_x, 4)  * nz(_f[4]) : 0) + (_i >= 5 ? 
      _m5 * pow(_x, 5)  * nz(_f[5]) : 0) - (_i >= 6 ? 
      _m6 * pow(_x, 6)  * nz(_f[6]) : 0) + (_i >= 7 ? 
      _m7 * pow(_x, 7)  * nz(_f[7]) : 0) - (_i >= 8 ? 
      _m8 * pow(_x, 8)  * nz(_f[8]) : 0) + (_i == 9 ? 
      _m9 * pow(_x, 9)  * nz(_f[9]) : 0)

我为 mql5 编写此函数,而不是使用 _f 作为局部变量,而是将其用作全局缓冲区,但结果并不相同。 这是我写的 mql5 函数:

//f_filt9x
double f_filt9x(double _a, double _s, int _i, int i)
{
   int _m2, _m3, _m4, _m5, _m6, _m7, _m8, _m9;
   _m2 = 0;
   _m3 = 0;
   _m4 = 0;
   _m5 = 0;
   _m6 = 0;
   _m7 = 0;
   _m8 = 0;
   _m9 = 0;
   
   double _x = (1.0 - _a);
   //Weights
   // Initial weight _m1 is a pole number and equal to _i
   _m2 = (_i==9) ? 36   : (_i==8) ? 28 : (_i==7) ? 21 : (_i==6) ? 15 : (_i==5) ? 10 : (_i==4) ? 6  :  (_i==3) ? 3 : (_i==2) ? 1  : 0;
   _m3 = (_i==9) ? 84   : (_i==8) ? 56 : (_i==7) ? 35 : (_i==6) ? 20 : (_i==5) ? 10 : (_i==4) ? 4  :  (_i==3) ? 1 : 0;
   _m4 = (_i==9) ? 126  : (_i==8) ? 70 : (_i==7) ? 35 : (_i==6) ? 15 : (_i==5) ? 5  : (_i==4) ? 1  : 0;
   _m5 = (_i==9) ? 126  : (_i==8) ? 56 : (_i==7) ? 21 : (_i==6) ? 6  : (_i==5) ? 1  : 0;
   _m6 = (_i==9) ? 84   : (_i==8) ? 28 : (_i==7) ? 7  : (_i==6) ? 1  : 0;
   _m7 = (_i==9) ? 36   : (_i==8) ? 8  : (_i==7) ? 1  : 0; 
   _m8 = (_i==9) ? 9    : (_i==8) ? 1  :  0;
   _m9 = (_i==9) ? 1    : 0;
   //filter
   _f[i] = (MathPow(_a,_i) * _s)  + _i  *  _x  * _f[i-1]    
                                   -( (_i>=2) ?_m2   * MathPow(_x,2)*  _f[i-2] : 0)
                                   +( (_i>=3) ?_m3   * MathPow(_x,3)*  _f[i-3] : 0)
                                   -( (_i>=4) ?_m4   * MathPow(_x,4)*  _f[i-4] : 0)  
                                   +( (_i>=5) ?_m5   * MathPow(_x,5)*  _f[i-5] : 0)  
                                   -( (_i>=6) ?_m6   * MathPow(_x,6)*  _f[i-6] : 0)  
                                   +( (_i>=7) ?_m7   * MathPow(_x,7)*  _f[i-7] : 0)  
                                   -( (_i>=8) ?_m8   * MathPow(_x,8)*  _f[i-8] : 0)  
                                   +( (_i>=9) ?_m9   * MathPow(_x,9)*  _f[i-9] : 0) ;

  return _f[i]; 

}
pine-script pine-script-v5 mql5
1个回答
0
投票

正如 Gu5tavo71 所评论的,_f[1] 引用了之前运行该函数时 _f 的值。 mql5 中的等效函数是正确的,但我发现函数返回值不同的原因是,在整个主 mql5 代码中,函数使用不同的 _s 值调用了多次,因此 _f 的先前值变得混乱。 我通过复制函数解决这个问题,并为每个 _s 使用不同的 _f 数组。

© www.soinside.com 2019 - 2024. All rights reserved.