iOpen и iClose "не работает".

 

Есть такой код

int trend()                         
{
int t;

if (iClose(Symbol(),1440,0)>iOpen(Symbol(),1440,0)) t=0;
else t=1;

return(t);
}

С его помощью я определяю направление дневной свечи - от этого глобально зависят действия эксперта.

Проблема возникает в том, что iOpen и iClose постоянно выдают "0".

Сам эксперт работает на М5, соответственно, если я не ошибаюсь, данные на Д1 просто не обновляются.

Поиск по форуму понятной информации не дал.

В учебнике нюансов и примеров правильного использования этих функций не описано.

Подскажите как заставить эти функции нормально работать.

 
Вы уверены, что у Вас есть история котировок для периода 1440 (дневки)?
 

Print("Вывод ",iClose(Symbol(),1440,0)," ",iOpen(Symbol(),1440,0));

Только что в пустом советнике запустил эту строчку, всё нормально работает!!!

 
Rosh:
Вы уверены, что у Вас есть история котировок для периода 1440 (дневки)?

Не уверен. Я к нему "в ручную" ни разу не обращался.

Дело в том, что терминал с экспертом стоят на ноуте, который всю сознательную свою жизнь проводит под столом, чтобы не мозолить глаза. Эксперт стоит на ТФ М5. Но если я правильно понимаю, то пока не откроешь нужный ТФ данные на нём не обновятся. А открывать его регулярно некому. И собственно получается вопрос - как программно обновлять данные на нужном ТФ?

 
А каким образом Вам удалось узнать, что вышеприведенная функция выдает ноль? Ведь ноутбук всегда под столом...
 
Rosh:
А каким образом Вам удалось узнать, что вышеприведенная функция выдает ноль? Ведь ноутбук всегда под столом...

У меня включен к нему терминальный доступ и в логи функция Print (которая не указана в коде выше) выводит данные. :)

З.Ы. Я чайник, но не совсем.

 

Живой пример:

2008.05.15 20:00:22 ХХХ_ AUDUSD,M5: Open - 0.93410 Close - 0.93340 Trend - 1 ------- AUDUSD

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

З.Ы. Это получается как я посмотрел состояние графика в районе часа ночи на Д1, так с этими данными эксперт и работает при обращении к функциям типа iClose.

 

Ваш ноутбук не лежит под моим столом, и у меня нет к нему даже терминального доступа, тем более я не знаю, что означает приведенная Вами строка:

2008.05.15 20:00:22 ХХХ_ AUDUSD,M5: Open - 0.93410 Close - 0.93340 Trend - 1 ------- AUDUSD

Объясните какая связь между этой строкой и куском кода, приведенном в первом сообщении.


Но если я правильно понимаю, то пока не откроешь нужный ТФ данные на нём не обновятся.

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


//+------------------------------------------------------------------+
//|                                                     GetiOpen.mq4 |
//|                      Copyright © 2007, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"
 
//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start()
  {
//----
   int i=0;
   int err=0;
   while (i<10)
      {
      Print("iOpen(Symbol(),PERIOD_H1,0)=",iOpen(Symbol(),PERIOD_H1,0),"  iClose(Symbol(),PERIOD_H1,0)=",iClose(Symbol(),PERIOD_H1,0));
      err=GetLastError();
      if (err!=0) Print("ошибка ",err);
      i++;
      Sleep(1000);
      }
         
//----
   return(0);
  }
//+------------------------------------------------------------------+

На видео видно, что истории по часовкам на AUDUSD на момент первого обращения нет, но потом она подкачивается.


 

Извините за не подробность, просто для МЕНЯ это было очевидным.

Первоначальный код, преведённый в начале темы, со вчерашней ночи выглядит так:

int trend()
{
int t;

if (iClose(Symbol(),1440,0)>iOpen(Symbol(),1440,0)) t=0;
else t=1;
Print("Open - ",DoubleToStr(iOpen(Symbol(),1440,0),5)," Close - ",DoubleToStr(iClose(Symbol(),1440,0),5)," Trend - ",t,"  -------  ",Symbol());

return(t);
}

Эта строчка

2008.05.15 20:00:22 ХХХ_ AUDUSD,M5: Open - 0.93410 Close - 0.93340 Trend - 1 ------- AUDUSD

взята из вкладки "эксперты", т.е. из лога куда печатает эксперт.

 

Только что провёл эксперемент.

Вставил в пустого эксперта строчку Print("Open - ",DoubleToStr(iOpen(Symbol(),1440,0),5)," Close - ",DoubleToStr(iClose(Symbol(),1440,0),5)," ------- ",Symbol());

Открыл в терминале график еврофунта - в начале недели я им пользовался, но потом закрыл, т.е. данные на нём были, но уже на некоторое время просрочены по всем ТФ. Открылся естественно ТФ Н1. Выждал около минуты. После этого повесил на него эксперта.

После запуска он выдал в лог две строчки подряд.

2008.05.15 23:34:48 Void EURGBP,H1: Open - 0.79520 Close - 0.79360 ------- EURGBP
2008.05.15 23:34:24 Void EURGBP,H1: Open - 0.78370 Close - 0.78110 ------- EURGBP

Когда вы последний раз видели, чтобы еврофунт за 24 секунды проходил 125 пунктов?

При этом реально на графике прошло два тика.

З.Ы. Open/Close - 0.7837/0.7811 - это свеча за 02/05/08 (последний раз когда я на еврофунте открывал ТФ Д1).

З.Ы.Ы. Обращение к функции trend() у меня происходит один раз в день. Получается, что если на выходные выключать ноут, а соответственно и терминал, то в понедельник я всегда буду получать неверный результат.

 

Кажется нашёл проблему.

Когда истории нет, то iOpen действительно выдаёт ошибку и нули.

Но если файл с историей есть, но устаревший, то функция выдаёт последние имеющиеся данные, не проверяя за какое они число.

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