Ограниченное время работы индикатора.

 

Всем доброго времени суток!

Индикатор стал писать предупреждение о глобальной переменной.

И не могу сделать так, чтобы индикатор к примеру работал до определённой даты, а дальше просто переставал.

Может быть есть универсальный кусочек кода, в котором этот момент можно прописать?

Файлы:
Krasilka.mq4  12 kb
 
Andrey Sayapin:


И не могу сделать так, чтобы индикатор к примеру работал до определённой даты, а дальше просто переставал.

Может быть есть универсальный кусочек кода, в котором этот момент можно прописать?

Ну а что тут думать?

if (TimeCurrent() >= D'<date>')
   return 0;

Вставить в начало OnCalculate().

 
Andrey Sayapin:


Индикатор стал писать предупреждение о глобальной переменной.

Вот так сделайте:

double iNoLagMa(double &_alpha[], double &price[], int forvalue, int length, int i, int r)
{
   int forValue = forvalue-1;
   if (length<3) return(price[r]);
   
   //
   //
   //
   //
   //
   
   if (ArrayRange(values,0)<(forValue+1) || values[forValue][_length] != length)
   {
      double Cycle = 4.0;
      double Coeff = 3.0*Pi;
      int    Phase = length-1;
      
      if (ArrayRange(values,0)<forValue+1) ArrayResize(values,forValue+1);

         values[forValue][_length] = length;
         values[forValue][_len]    = length*4 + Phase;  
         values[forValue][_weight] = 0;  
         ArrayResize(_alpha,values[forValue][_len]);

         for (int k=0; k<values[forValue][_len]-1; k++)
         {
            if (k<=Phase-1) 
                 double t = 1.0 * k/(Phase-1);
            else        t = 1.0 + (k-Phase+1)*(2.0*Cycle-1.0)/(Cycle*length-1.0); 
            double beta = MathCos(Pi*t);
            double g = 1.0/(Coeff*t+1); if (t <= 0.5 ) g = 1;
      
            _alpha[k]                   = g * beta;
            values[forValue][_weight] += _alpha[k];
         }
   }
   
   //
   //
   //
   //
   //
   
   if (values[forValue][_weight]>0)
   {
      int    len = values[forValue][_len];
      double sum = 0;
           for (k=0; k < len-1; k++) sum += _alpha[k]*price[r-k];      
           return( sum / values[forValue][_weight]);
   }
   else return(0);           
}
 

Про альфу спасибо! Пропала ошибка.

Но про время не совсем понял.

OnCalculate такого нет в индикаторе и как правильно дату указать, чтобы в этот день перестал работать?

if (TimeCurrent() >= D'<date>')
   return 0;

разве назначать переменную DATE не надо?

Вас не затруднит в том индикаторе этот момент прописать?

 
Andrey Sayapin #:

Про альфу спасибо! Пропала ошибка.

Но про время не совсем понял.

OnCalculate такого нет в индикаторе и как правильно дату указать, чтобы в этот день перестал работать?

В показанном коде функция называется start. Это устаревшее название. Эту функцию нужно заменить на событие OnCalculate

разве назначать переменную DATE не надо?

<date> - это дата, которую хотите использовать. Например:

if (TimeCurrent() >= D'2022.05.01 13:48')
   return 0;
 

А как правильно писать?

год/месяц/день...так идет порядок?

в вашем примере 1 мая к примеру индикатор не будет работать?

а как можно добавить сообщение ещё? помню только что через print делается.

 
Andrey Sayapin #:

А как правильно писать?

год/месяц/день...так идет порядок?

Да, порядок: YYYY.MM.DD HH:MM:SS.



в вашем примере 1 мая к примеру индикатор не будет работать?

Заметьте, что не просто с 1-го мая, а именно с 13:48 по времени сервера.

а как можно добавить сообщение ещё? помню только что через print делается.

Еще через Alert и Comment можно. Но для вывода сообщения придется запомнить факт его выдачи. Иначе сообщение будет отображаться на каждом тике, спамя таким образом.

 
Чтобы в момент остановки работы, вылезало сообщение, Индикатор не работает и все.
 
Поменял start на  OnCalculate и теперь ошибка.
Файлы:
2.png  36 kb
 
Andrey Sayapin #:
Чтобы в момент остановки работы, вылезало сообщение, Индикатор не работает и все.

Если в момент присоединения к графику, то указанные строки нужно в OnInit внести:

if (TimeCurrent() >= D'2022.05.01 13:48')
   return INIT_FAILED;
 
Andrey Sayapin #:
Поменял start на  OnCalculate и теперь ошибка.

У OnCalculate есть свой синтаксис:

int OnCalculate (const int rates_total,      // размер входных таймсерий
                 const int prev_calculated,  // обработано баров на предыдущем вызове
                 const datetime& time[],     // Time
                 const double& open[],       // Open
                 const double& high[],       // High
                 const double& low[],        // Low
                 const double& close[],      // Close
                 const long& tick_volume[],  // Tick Volume
                 const long& volume[],       // Real Volume
                 const int& spread[]         // Spread
                )
Причина обращения: