簡體   English   中英

MQL4 TEMA 指標。 當我限制指標正在處理的柱線數量時,指標線變得混亂

[英]MQL4 TEMA indicator. Indicator line gets messed up when I limit the amount of bars the indicator is processing

我有這個運行良好的 TEMA 指標。 我添加了一段代碼以限制要處理的柱線數量,但指標線以異常方式在后面弄亂了,當我將要處理的柱線數量限制為 500 等小值時,指標不會根本不能正確顯示它只是上下拋出線。

這是我使用的修改后的代碼。

有人可以幫我解釋一下。

如果我限制一個簡單的移動平均代碼的條形,我就不會遇到上面提到的這些問題。

我認為它與代碼中的 IMAOnArray() 部分有關。 我還附上了一張圖片來顯示問題。

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 DarkBlue
#property  indicator_width1  2
//---- input parameters

extern int       EMA_period=14;
//code added to limit amount of bars.
extern int       BarsBack=1500;
//---- buffers
double TemaBuffer[];
double Ema[];
double EmaOfEma[];
double EmaOfEmaOfEma[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   IndicatorBuffers(4);
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,TemaBuffer);
   SetIndexBuffer(1,Ema);
   SetIndexBuffer(2,EmaOfEma);
   SetIndexBuffer(3,EmaOfEmaOfEma);
   SetIndexDrawBegin(0, Bars - BarsBack);
   IndicatorShortName("TEMA("+EMA_period+")");

//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----

//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int i,limit,limit2,limit3,counted_bars=IndicatorCounted();
//---++

      //coded added to limit bars
      if(Bars>BarsBack)
      {
      limit=BarsBack;
      }
      else     
      {
      limit=Bars-counted_bars-1;
      }
      limit2=limit;
      limit3=limit2;

   for (i=limit;i>=0;i--) Ema[i]=iMA(NULL,0,EMA_period,0,MODE_EMA,PRICE_CLOSE,i);
   for (i=limit2;i>=0;i--) EmaOfEma[i]=iMAOnArray(Ema,0,EMA_period,0,MODE_EMA,i);
   for (i=limit3;i>=0;i--) EmaOfEmaOfEma[i]=iMAOnArray(EmaOfEma,0,EMA_period,0,MODE_EMA,i);
   for (i=limit3;i>=0;i--) TemaBuffer[i]=3*Ema[i]-3*EmaOfEma[i]+EmaOfEmaOfEma[i];
//----
   return(0);
  }
//+------------------------------------------------------------------+

在此處輸入圖片說明

有人可以幫我解釋一下嗎?

三重指數移動平均線由帕特里克·穆洛伊 (Patrick Mulloy) 創建,並首次發表於 1994 年 2 月發行的《股票和商品技術分析》雜志 – 用更少的滯后平滑數據。

您不應通過減少輸入數據窗口的深度來“限制TEMA -三重“自”卷積的深度,因為它會導致處理損壞的值,您應該說CustomIndicator -code,它需要多長時間采取“穩定”最左邊緣的 TEMA 值,在它的左邊緣計算值開始有意義之前:

SetIndexDrawBegin
設置繪制給定指標線必須從其開始的柱線編號(從數據開始)。

void  SetIndexDrawBegin(
   int     index,       // line index
   int     begin        // position
   );

參數 :

index     [in]  Line index. Must lie between 0 and 7.
begin     [in]  First drawing bar position number.

返回值:無。
筆記:
指標從左到右繪制。 給定柱線左側的指標數組值不會顯示在圖表或數據窗口中。 0 將被設置為默認值,並且將繪制所有數據。

您修改后的 TEMA 代碼簡單地忽略所有( Bars - BarsBack )蠟燭並開始綠地計算,但BarsBack (它產生所有三重自卷積偽影發生在“靠近”熱端當前條 [0] )。

刪除這部分代碼並檢查您所有的IndicatorBuffer{ 0 | 1 | 2 | 3 } IndicatorBuffer{ 0 | 1 | 2 | 3 } IndicatorBuffer{ 0 | 1 | 2 | 3 }最左邊緣的行,它們“合並”它們的值有多快,並且只有在目視檢查之后,才設置:

 SetIndexDrawBegin( { 0 | 1 | ... | 3 }, <_N_bars_To_Converge_STABLE_> );

或者可以保持計算避免代碼就位,
但需要增加BarsBack >> <_N_bars_To_Converge_STABLE_>


迭代計算值的代碼效率可能會得到提高:

雖然 MQL4(截至 2020 年第一季度)缺乏對向量化數學的支持,但這里仍有性能改進的空間:

/*
for ( i = limit;  i >= 0; i-- )           Ema[i] = iMA(            NULL, 0, EMA_period, 0, MODE_EMA, PRICE_CLOSE, i );
for ( i = limit2; i >= 0; i-- )      EmaOfEma[i] = iMAOnArray(      Ema, 0, EMA_period, 0, MODE_EMA,              i );
for ( i = limit3; i >= 0; i-- ) EmaOfEmaOfEma[i] = iMAOnArray( EmaOfEma, 0, EMA_period, 0, MODE_EMA,              i );
for ( i = limit3; i >= 0; i-- )    TemaBuffer[i] = EmaOfEmaOfEma[i]
                                                 +         3*Ema[i]
                                                 -    3*EmaOfEma[i];
 */
////////////////////////////////////////////////////////////////////
// 25% MORE EFFICIENT PROCESSING:
//     PROGRESSIVE BUILDUP, AVOIDS DOUBLE limit3-DEEP RE-ITERATIONS:
////////////////////////////////////////////////////////////////////
for ( i = limit;  i >= 0; i-- ) {           Ema[i] = iMA(            NULL, 0, EMA_period, 0, MODE_EMA, PRICE_CLOSE, i ); TemaBuffer[i]  =           Ema[i]; }
for ( i = limit2; i >= 0; i-- ) {      EmaOfEma[i] = iMAOnArray(      Ema, 0, EMA_period, 0, MODE_EMA,              i ); TemaBuffer[i] -=      EmaOfEma[i]; TemaBuffer[i] *= 3; }
for ( i = limit3; i >= 0; i-- ) { EmaOfEmaOfEma[i] = iMAOnArray( EmaOfEma, 0, EMA_period, 0, MODE_EMA,              i ); TemaBuffer[i] += EmaOfEmaOfEma[i]; }

最后但並非最不重要的一點是,這里存在更高效的TEMA計算策略,可進一步減少納秒延遲:o)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM