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

 
iClose: ноль - ошибка. Ошибки функция не выдает. Выдает устаревшее на данный момент значение.
 
Я тут прочитал что " iClose() получает значение с сервера брокера(ДЦ)" Если данные этих функций формируют честные брокеры, тогда все становится на свои места.))) Выходит верить можно только текущему тику.
 
Artyom Trishkin:
Нет, не так. В справке про функцию что написано о возвращаемом значении?
iClose

Возвращаемое значение

Значение цены закрытия бара (указанного параметром shift) соответствующего графика или 0 в случае ошибки. Для получения дополнительной информации об ошибке необходимо вызвать функцию GetLastError().

Выходит, что если не 0, значит ошибки нет. Но и значение не изменяется…, значит не обновляется без RefreshRates();, что и удивило меня.
 
Mikhail Nazarenko:

 А если сменить таймфейм на отличный от текущего данные перестанут вовремя обновляться даже с RefreshRates(). Выходит фундаментальные функции iClose и тп. в MT4 выдают  неактуальную туфту. Уверен что 80% инфопродуктов не учитывают эти уникальные особенности MT4. Как жить дальше?)))

Смена тф ничего не даст. Текущее значение iClose равно значению Bid независимо от периода графика.
 
Alexey Viktorov:
Смена тф ничего не даст. Текущее значение iClose равно значению Bid независимо от периода графика.

Я сделал советник и запустил на M5 на сутки. В момент смены часа он рисует горизонтальные линии по каждому из значений: iClose(symbol,PERIOD_H1,1),iClose(symbol, PERIOD_ M5,1), iClose(symbol, PERIOD_ M1,1 ),Close[1],Bid

  1.  iClose(symbol, PERIOD_ M5,1 ),Close[1] - показывали точно, как на графике
  2.  Bid был близко, это следующий тик 
  3. iClose(symbol,PERIOD_H1,1),iClose(symbol, PERIOD_ M1,1) - иногда совпадали, а иногда, особенно в вечерние часы показывали полную хрень, даже после подключения RefreshRates() .

Вопрос к разработчикам. Зачем в MQL4 нужны функции iClose и тп, если они дают не достоверную информацию и обновить их данные ни как не возможно?

 
Mikhail Nazarenko:

Я сделал советник и запустил на M5 на сутки. В момент смены часа он рисует горизонтальные линии по каждому из значений: iClose(symbol,PERIOD_H1,1),iClose(symbol, PERIOD_ M5,1), iClose(symbol, PERIOD_ M1,1 ),Close[1],Bid

  1.  iClose(symbol, PERIOD_ M5,1 ),Close[1] - показывали точно, как на графике
  2.  Bid был близко, это следующий тик 
  3. iClose(symbol,PERIOD_H1,1),iClose(symbol, PERIOD_ M1,1) - иногда совпадали, а иногда, особенно в вечерние часы показывали полную хрень, даже после подключения RefreshRates() .

Вопрос к разработчикам. Зачем в MQL4 нужны функции iClose и тп, если они дают не достоверную информацию и обновить их данные ни как не возможно?

Чушь какая-то. Вызывать RefreshRates() обязательно только в том случае, если по какой либо причине произошла задержка выполнения. Такие случаи как длительный цикл или просто обновление цен в момент отправки приказа на открытие ордера. В вашем варианте никаких проблем быть не должно. Лучше выложите пример кода который так неправильно получает значения цен.

Я сейчас запустил такой код

double close_H1,
       close_M1;

/*******************Expert initialization function*******************/
int OnInit()
 {
  return(INIT_SUCCEEDED);
 }/*******************************************************************/

/************************Expert tick function************************/
void OnTick()
 {
  if(NewBar(PERIOD_M5))
   {
    close_H1 = iClose(_Symbol, PERIOD_M5, 1);
    close_M1 = iClose(_Symbol, PERIOD_M1, 1);
    if(close_H1 != close_M1)
      Print(close_H1, " != ", close_M1);
   }
  Comment(close_H1, "\n",
          close_M1, "\n"
         );
 }/******************************************************************/

/**********************Expert OnDeinit function**********************/
void OnDeinit(const int reason)
 {
  Comment("");
 }/******************************************************************/

bool NewBar(ENUM_TIMEFRAMES tf)
  {
   static datetime nt = 0;
   datetime tm = iTime(_Symbol, tf, 0);
   if(tm == 0)
      return false;
   if(tm != nt)
     {
      nt = tm;
      return true;
     }
   return false;
 }/******************************************************************/
по сути закрытие минутки должно совпадать с любым старшим периодом графика. Позже посмотрю будет-ли что-то написано в логе.
 
Mikhail Nazarenko:

 А если сменить таймфейм на отличный от текущего данные перестанут вовремя обновляться даже с RefreshRates().

Есть тестовый код, подтверждающий это утверждение? У себя такого не замечал. При переключении ТФ просто ждем подкачки истории и тогда работаем.


Выходит фундаментальные функции iClose и тп. в MT4 выдают  неактуальную туфту.

Слишком громкое утверждение. В некоторых случаях такое возможно, но для этого и существуют коды ошибок. Если их не проверять, то никогда не понять, можно ли использовать полученный результат.


Уверен что 80% инфопродуктов не учитывают эти уникальные особенности MT4. Как жить дальше?)))

Скажу больше: почти все программы чего-то не учитывают. Для этого и выходят их новые версии. Как только прекращается поддержка продукта, он оказывается недееспособным.

Документация по MQL5: Константы, перечисления и структуры / Коды ошибок и предупреждений
Документация по MQL5: Константы, перечисления и структуры / Коды ошибок и предупреждений
  • www.mql5.com
Коды ошибок и предупреждений - Константы, перечисления и структуры - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Alexey Viktorov:

Чушь какая-то. Вызывать RefreshRates() обязательно только в том случае, если по какой либо причине произошла задержка выполнения. Такие случаи как длительный цикл или просто обновление цен в момент отправки приказа на открытие ордера. В вашем варианте никаких проблем быть не должно. Лучше выложите пример кода который так неправильно получает значения цен.

Я сейчас запустил такой код

по сути закрытие минутки должно совпадать с любым старшим периодом графика. Позже посмотрю будет-ли что-то написано в логе.

Код у меня похожий. Ошибка в OnTick 

close_H1 = iClose(_Symbol, PERIOD_M5, 1);

надо

close_H1 = iClose(_Symbol, PERIOD_H1, 1);
close_M5 = Close[1];
if(close_H1 != close_M5)
	Print(close_H1, " != ", close_M5);
if(close_M1 != close_M5)
	Print(close_M1, " != ", close_M5);


Если у нас текущий таймфрейм M5 cравнивать надо М5 c H1 и M1

Текущий таймфрейм а именно M5 у меня отображался корректно. Проблема была с H1 и M1. 

Я проверял на Альпари реал EURCHF M5 только вместо Print рисовал горизонтальные отрезки на каждом из уровней.

 
Ihor Herasko:

Есть тестовый код, подтверждающий это утверждение? У себя такого не замечал. При переключении ТФ просто ждем подкачки истории и тогда работаем.


Слишком громкое утверждение. В некоторых случаях такое возможно, но для этого и существуют коды ошибок. Если их не проверять, то никогда не понять, можно ли использовать полученный результат.


Скажу больше: почти все программы чего-то не учитывают. Для этого и выходят их новые версии. Как только прекращается поддержка продукта, он оказывается недееспособным.

Вот код, поставь и проверь. У меня не соответствие на каждой свече. Альпари реал EURCHF M5.

double close_H1,close_M5,
       close_M1;

/*******************Expert initialization function*******************/
int OnInit()
 {
  return(INIT_SUCCEEDED);
 }/*******************************************************************/

/************************Expert tick function************************/
void OnTick()
 {
  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);
   
     Comment(
               close_H1, " H1\n",
               close_M1, " M1\n",
               close_M5, " M5\n"
            );
         
  }       
 }/******************************************************************/

/**********************Expert OnDeinit function**********************/
void OnDeinit(const int reason)
 {
  Comment("");
 }/******************************************************************/

bool NewBar(ENUM_TIMEFRAMES tf)
  {
   static datetime nt = 0;
   datetime tm = iTime(_Symbol, tf, 0);
   if(tm == 0)
      return false;
   if(tm != nt)
     {
      nt = tm;
      return true;
     }
   return false;
 }/******************************************************************/

 
Mikhail Nazarenko:
iClose: ноль - ошибка. Ошибки функция не выдает. Выдает устаревшее на данный момент значение.

Если подозреваете ошибки в функциях iXXXXX, используйте функции SymbolInfoXXXX

Причина обращения: