Индикатор MQL4 TEMA. Строка индикатора запутывается, когда я ограничиваю количество баров, которые обрабатывает индикатор - PullRequest
2 голосов
/ 10 января 2020

У меня есть индикатор 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);
  }
//+------------------------------------------------------------------+

enter image description here

1 Ответ

1 голос
/ 10 января 2020

Q : Может ли кто-нибудь помочь мне пролить свет на это?

Тройная экспонента Скользящее среднее было создано Патриком Маллой и впервые опубликовано в февральском выпуске журнала "Технический анализ акций и товаров" за февраль 1994 года - Сглаживание данных с меньшими задержками.

Вы не будете " limit"глубина TEMA - triple-" self "-convolution за счет уменьшения глубины окна ввода данных, поскольку это приводит к обработке поврежденных значений, вы, скорее, должны сказать CustomIndicator -код, сколько времени требуется, чтобы «стабилизировать» значения 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.

Возвращаемое значение: Нет ne.
Примечание:
Индикаторы отображаются слева направо. Значения массива индикаторов, которые находятся слева от данного бара, не будут показаны на графике или в окне данных. По умолчанию будет установлено значение 0, и все данные будут отрисованы.

Ваш измененный код TEMA просто игнорирует все свечи ( Bars - BarsBack ) и запускает вычисления в зеленом поле, но для BarsBack (который генерирует все артефакты тройной самосвертки, которые происходят "рядом" с текущей полосой горячего конца [0]).

Удалите эту часть кода и проверьте все свои IndicatorBuffer{ 0 | 1 | 2 | 3 } -линии на в дальнем левом крае, как быстро они «консолидируют» свои значения и только после этой визуальной проверки задайте:

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

Или можете оставить на месте код для предотвращения вычислений,
, но нужно увеличить BarsBack >> <_N_bars_To_Converge_STABLE_>


Эффективность кода с помощью итеративных вычислений может быть улучшена:

В то время как MQL4 (по состоянию на 2020-Q1) не имеет поддержки для векторизованной математики здесь есть место для улучшения производительности:

/*
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 вычислительные стратегии существуют здесь для дальнейшего снижения задержки на наносекунды: о)

...