Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 2667

 
Alexey Viktorov #:

А никого не смущает эта строка?


Это уже после ищет в массиве по индексу  -1. 

 
Vladislav Boyko #:
либо найти индекс бара самостоятельно в предварительно скопированном массиве котировок

Такая ситуация возникает при первом включении на недавно открытом графике, после не возникают. 

Может быть там котировки еще не прогрузились?

 
Vladislav Boyko #:
либо предусмотреть в коде ситуацию, когда не удалось получить индекс бара (и корректно среагировать на нее)

Когда-то  я делал робот, и делал в ините проверку таких функций на возврат корректных значений, и в случае не корректных включал таймер на 0.3 секунды, чего хватало. 

Но тут индикатор, в котором таймер не работает, по этому пошел на форум.

 
Andrei Sokolov #:

Когда-то  я делал робот, и делал в ините проверку таких функций на возврат корректных значений, и в случае не корректных включал таймер на 0.3 секунды, чего хватало. 

Но тут индикатор, в котором таймер не работает, по этому пошел на форум.

Лучше в индикаторе обходиться без iФункций.

Если без iФункций никак не обойтись.

В индикаторе есть  return 0 и попытка получить  iBarShift на следующем тике.

А если выходной, то ChartSetSymbolPeriod в помощь.

Типа так.

int priv = 0;
//+------------------------------------------------------------------+
int OnInit()
  {
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
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)
     {
      if(priv == 0)
         EventSetTimer(1);
      priv = 1;
     }

   if(iBarShift(_Symbol, PERIOD_CURRENT, time[rates_total - 10]) < 0)
      return 0;

   priv = rates_total;
   return(rates_total);
  }
//+------------------------------------------------------------------+
void OnTimer()
  {
   if(priv <= 1) //если выходные и нет новых тиков
      ChartSetSymbolPeriod(0, _Symbol, PERIOD_CURRENT);
   else
     {
      EventKillTimer();
      priv = 0;
     } 
  }
//+------------------------------------------------------------------+

ЗЫ. Логичнее сделать так.

   if(prev_calculated <= 0)
     {
      if(priv == 0)
         EventSetTimer(1);
      priv = 1;

      if(iBarShift(_Symbol, PERIOD_CURRENT, time[rates_total - 10]) < 0)
         return 0;
     }

Написать запрос любой  iBarShift и не переходить к основному расчёту индикатора, пока не получим , что то не равное -1.

 
Andrei Sokolov #:

Такая ситуация возникает при первом включении на недавно открытом графике, после не возникают. 

Может быть там котировки еще не прогрузились?

Пробовали true?

iBarShift(symbol, tf, time, exact); // exact=true/false
 
Andrei Sokolov #:
Но тут индикатор,

А, так вообще без проблем, вы ведь текущий таймфрейм запрашиваете. Просто найдите самостоятельно нужный бар в массиве time[] - это сильно проще, чем пытаться обрабатывать ошибки iXXX.

Как уже было сказано выше, использовать iXXX в индиткаторе (не мультитаймфрейм) - очень плохая идея.

 
Vitaly Muzichenko #:

Пробовали true?

Нет, но поставлю, чтоб в случае ошибки она явно была видна.
 
Vladislav Boyko #:

А, так вообще без проблем, вы ведь текущий таймфрейм запрашиваете. Просто найдите самостоятельно нужный бар в массиве time[] - это сильно проще, чем пытаться обрабатывать ошибки iXXX.

Как уже было сказано выше, использовать iXXX в индиткаторе (не мультитаймфрейм) - очень плохая идея.

Нужна возможность использовать разные тф, по этому так.
 
Aleksandr Slavskii #:
  if(iBarShift(_Symbol, PERIOD_CURRENT, time[rates_total - 10]) < 0)       return 0;

С этим вообще дичь какая-то.  В начале OnCalculate сделал проверку разных свечей, с начала, с конца, с середины

   if(iBarShift(NULL, 0, time[rates_total - 10]) < 0)
   {
        Comment("1 if(iBarShift(NULL, 0, time[rates_total - 10]) < 0)");
        return 0;
   }
   if(iBarShift(NULL, 0, time[10]) < 0)
   {
        Comment("2 if(iBarShift(NULL, 0, time[10]) < 0)");
        return 0;
   }
   if(iBarShift(NULL, 0, time[(int)(rates_total/2)]) < 0)
   {
        Comment("3 if(iBarShift(NULL, 0, time[(int)(rates_total/2)]) < 0)");
        return 0;
   }

но они все проходили, а потом поиск индекса какого-то нужного бара выдавал -1.


В общем, тк индикатор в основном используется на открытом тф, пока сделал костыль если тф графика - то ищет по time[], если нет, то по iBarShift, и если -1 то выдает сообщение об ошибке данных.

 
Офи..ть. Aleksandr Slavskii  в бане. Кто же его так достал?
Aleksandr Slavskii - s22aa - Профиль трейдера
Aleksandr Slavskii - s22aa - Профиль трейдера
  • 2025.09.16
  • www.mql5.com
Профиль трейдера