Ошибки, баги, вопросы - страница 2997

 
Alexey Viktorov:

Может лыжи плохие?


и ещё RTS-6.21


Это уже кое-что. У вас от какого брокера и какая версия MT5.

 
Alexey Viktorov:

Может лыжи плохие?


и ещё RTS-6.21


Спасибо за помощь. Разобрался. Подключались разные версии индикаторов с разных папок.

 
Francuz:

Да, пробовал. Результат не изменился.

не верю. 
еще раз попробуйте

datetime a = D'2021.04.08 10:00:00';
   int      handle;
   double   Buffer[];
   

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
{

   handle = iCustom(_Symbol, PERIOD_CURRENT, "Examples\\ATR.ex5", 14);
   ::Print(__FUNCTION__ + "| PERIOD_CURRENT = ", EnumToString(_Period));

   return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
{

   if(prev_calculated>0 && handle != INVALID_HANDLE)
   {
      ::CopyBuffer(handle, 0, a, 1, Buffer);
      
      double BS = ::NormalizeDouble(Buffer[0], _Digits);
      
      ::Print(__FUNCTION__ + "| a = ", a);
      ::Print(__FUNCTION__ + "| BS ", BS);
      
      handle = INVALID_HANDLE;
   }
   
   // return value of prev_calculated for next call
   return(rates_total);
}
 
Nikolai Semko:

не верю. 
еще раз попробуйте

Я разобрался. Проблема была в том что подключались два разных файла ATR из разных папок. По этому было расхождение значений.

Благодарю за помощь.
 
Nikolai Semko:

не верю. 
еще раз попробуйте

Николай, у него другая проблема была. Я тоже не сразу понял вопрос, думал надо получить значения с другого ТФ. Лыжи смазал и всё поехало.
 
Alexey Viktorov:
Николай, у него другая проблема была. Я тоже не сразу понял вопрос, думал надо получить значения с другого ТФ. Лыжи смазал и всё поехало.

Странно, ничего не понял. 
Я воспроизвел его проблему у себя именно так, как он описывал.  
Она происходила именно потому, что единственное выполнение CopyBuffer происходило при первом заходе в  OnCalculate, когда prev_calculated == 0 и не было гарантии, что бары уже сформированы.
Решение было в том, чтобы игнорировать этот первый заход, а запускать единственный CopyBuffer только когда prev_calculated>0.
Причем здесь "два разных файла ATR из разных папок " -  не понял.

 
Nikolai Semko:

Странно, ничего не понял. 
Я воспроизвел его проблему у себя именно так, как он описывал.  
Она происходила именно потому, что единственное выполнение CopyBuffer происходило при первом заходе в  OnCalculate, когда prev_calculated == 0 и не было гарантии, что бары уже сформированы.
Решение было в том, чтобы игнорировать этот первый заход, а запускать единственный CopyBuffer только когда prev_calculated>0.
Причем здесь "два разных файла ATR из разных папок " -  не понял.

Ну так если открыт график и создаётся индикатор по текущему ТФ, то данные уже должны быть готовы при открытии графика. Разве нет?

 
Alexey Viktorov:

Ну так если открыт график и создаётся индикатор по текущему ТФ, то данные уже должны быть готовы при открытии графика. Разве нет?

О, сколько нам открытий чудных готовит ... дальшесампродолж

 
Alexey Viktorov:

Ну так если открыт график и создаётся индикатор по текущему ТФ, то данные уже должны быть готовы при открытии графика. Разве нет?

не совсем правильно выразился. Бары да - скорей всего готовы. Но нет гарантии, что индикатор пересчитался для всех этих баров в первый заход в OnCalculate, когда prev_calculated == 0.
Можно запустить такой индикатор, чтобы в этом убедиться. 
Только нужно это делать, когда идут котировки. Если рынок закрыт, то рассогласования не увидите.
Поэтому сейчас на выходных это лучше пробовать на криптовалюте, которая в движухе.
Если Size of Buffer array = -1, то значит буфер индикатора еще не пересчитан и значение BS будет не верным.

   datetime a = D'2021.04.08 10:00:00';
   int      handle;
   double   Buffer[];
   

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
{

   handle = iCustom(_Symbol, PERIOD_CURRENT, "Examples\\ATR.ex5", 14);
   ::Print(__FUNCTION__ + "| PERIOD_CURRENT = ", EnumToString(_Period));

   return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
{

   if(handle != INVALID_HANDLE)
   {
      ::CopyBuffer(handle, 0, a, 1, Buffer);
      
      double BS = ::NormalizeDouble(Buffer[0], _Digits);
      
      ::Print(__FUNCTION__ + "| a = ", a);
      ::Print(__FUNCTION__ + "| BS ", BS);
      int total_bars = iBars(NULL,PERIOD_CURRENT);
      int size = CopyBuffer(handle, 0, 0, total_bars, Buffer);
      Print("Total Bars = " + string(total_bars) + ", Size of Buffer array = " + string(size));
      
      handle = INVALID_HANDLE;
   }
   
   // return value of prev_calculated for next call
   return(rates_total);
}


если это делать на следующем заходе в OnCalculate (когда prev_calculated>0) то такой проблемы уже не будет. 

ЗЫ в коде была ошибка - исправил

 
Artyom Trishkin:

О, сколько нам открытий чудных готовит ... дальшесампродолж

Я имел ввиду данные для расчёта индикатора. Не ёрничай))))