Что обновляет функция RefreshRates() - страница 4

 
Mikhail Nazarenko:
Ладно, спасибо всем разработчикам за внимание, пошел создавать костыли типа NewBar.))) Тема закрыта.

Да их создавать не надо. Я дал вам полностью рабочую функцию. Пользуйтесь.

 

Вот наступил новый час…


Значения один в один…

 
Mikhail Nazarenko:

Нет, лучше _Period. Так как мы будем принудительно ждать появления нулевой котировки от H1, а текущий период исправно обновляется. Надо чтобы данные были получены на первых секундах часа, а не когда час обновится.

if(NewBar(PERIOD_M5))
   {
    close_H1 = iClose(_Symbol, PERIOD_H1, 1);
    close_M1 = iClose(_Symbol, PERIOD_M1, 1);
    close_M5 = Close[1];
    
    
    if(close_H1 != close_M5)
      Print(close_H1, " H1 != M5 ", close_M5);
    if(close_M1 != close_M5)
      Print(close_M1, " M1 != M5 ", close_M5);

//...

Хочу добавить в пример и проверить


Я не понимаю, почему вы ожидаете увидеть одинаковую цену закрытия у абсолютно разных баров?

Когда появился новый бар на M5, на M1 тоже новый бар, а на H1 только в одном случае из 12 будет новый бар, а в остальных 11 - нет.

 
PapaYozh:

Я не понимаю, почему вы ожидаете увидеть одинаковую цену закрытия у абсолютно разных баров?


Тоже заметил, думал я не так понял.

 

Видимо я как-то плохо объясняю проблему, сорян. Запилил и опробовал обещанные костыли. Писал сюда потому что это должно быть реализовано в коде самого MQL4. Кому интересно берите. Тема закрыта.

//Функция отслеживания появления обновленных котировок по таймфрейму, где max_tf таймфрейм +1 до которого включительно будет требоваться обновление
bool isRefresh(int max_tf = 0,int min_sleep = 1000){
   
   //Массив с таймфреймами
   int tf[9] = {1,5,15,30,60,240,1440,10080,43200};
   
   //Если максимальное 0 то текущее значение
   max_tf = (max_tf <= 0) ? _Period : max_tf;
   
   //Текущее время
   datetime period,tc = TimeCurrent();
   
   for(int i = 0; i < 9; i++){
         
      period = tf[i]*60;
      
      if(iTime(_Symbol,tf[i],1) != (int(tc/period)-1)*period){
         Sleep(min_sleep);
         return false;   
      }
      if(max_tf < tf[i])//Если таймфрейм больше максимального и тоже обновлен то выходим
         break;
   }
   Sleep(min_sleep);
   RefreshRates();
   
   return true;
}
 
Mikhail Nazarenko:

Видимо я как-то плохо объясняю проблему, сорян. Запилил и опробовал обещанные костыли. Писал сюда потому что это должно быть реализовано в коде самого MQL4. Кому интересно берите. Тема закрыта.

1. Видимо, да.

2. Зачем спать секунду перед возвратом из функции, если на возвращаемый результат это никак не влияет?

 

Чтобы свечи с других периодов/символов генерировались вовремя, их нужно постоянно "дергать", иначе МТ их обновляет "как придется".
Это жеж прописные истины, это обсуждалось много раз на форуме)

пс. если код работает по таймеру и обращается к котировкам других периодов, только раз в час (или раз в день), тогда нужно делать отдельную функцию для обновления. Или ждать пару секунд после очередного  запроса.

 
PapaYozh:

1. Видимо, да.

2. Зачем спать секунду перед возвратом из функции, если на возвращаемый результат это никак не влияет?

Это все опытным путем. Если не веришь, переделай и не спи.) Колхоз дело добровольное.

 

Это ***в чистом виде.

Зачем спать в функции, если можно вернуться из неё и делать что-то полезное?

 
PapaYozh:

Это ***в чистом виде.

Зачем спать в функции, если можно вернуться из неё и делать что-то полезное?

Это ***в чистом виде. Скажи что тебе не понятно в моем предыдущем ответе? Еще раз. Не спи и делай что-то полезное.)))