iHigh и ошибка 146

 

Такой вот код

   ret = iHigh( NULL, PERIOD_D1, 2);
   check = GetLastError();
   if( check != ERR_NO_ERROR) Print( "xoxo(). Ошибка 1: ", check);

печатает ошибку 146.

1. Эта ошибка сгенерирована функцией iHigh ?

2. Может ли ret получить неверное значение в этом случае?

 

Существует внутрення переменная, которая содержит код последней ошибки. Содержимое этой ошибки очищается после вызова функции GetLastError(). Таким образом, в приведенном примере ошибка 146 могла быть получена значительно раньше вызова функции iHigh(). Поэтому, что быть точно уверенным,нужно этот момент прописать так:

   GetLastError();
   ret = iHigh( NULL, PERIOD_D1, 2);
   check = GetLastError();
   if( check != ERR_NO_ERROR) Print( "xoxo(). Ошибка 1: ", check);
 

Спасибо

 

Я всё еще мучаюсь с подгрузкой данных.

build 220

сервер FIBO-FIBO Group MT4 Demo Server

з.ы. на Альпари - та же фигня. только что проверил

План эксперимента.

1. Не открываем график eurcad

2. запускаем скрипт на любом другом графике. Например eurusd

3. смотрим лог. и лично я вижу, что функции возвращают данные из старых свечей, а код ошибки 0

например так

2009.03.31 14:47:52 test_fibo_usdcad EURUSD,H1: i=4 ret=1.6637 MODE_OPEN time=2009.03.31 08:53:00 period=1 check=0

4. при повторном запуске скрипт вполне может работать правильно.

как проверить правильное ли значение возвращается?

//+------------------------------------------------------------------+
//|                                             test_fibo_usdcad.mq4 |
//|                                © 2009, BabyBear Software Incorp. |
//+------------------------------------------------------------------+
#property copyright "© 2009, BabyBear Software Incorp."

#include <stderror.mqh>

int start()
{
   string stSymbol = "EURCAD";
   
   double dh;
   dh = GetValue( stSymbol, PERIOD_M1, 0, MODE_OPEN);
   dh = GetValue( stSymbol, PERIOD_H1, 0, MODE_LOW);
   dh = GetValue( stSymbol, PERIOD_D1, 0, MODE_HIGH);

   
   return(0);
}

double GetValue( string symbol, int period, int shift, int mode)
{
   // 4066 ERR_HISTORY_WILL_UPDATED
   double ret;
   string text;
   datetime dt;
   int check;
   GetLastError();
   for( int i=0; i<5; i++)
   {
      switch ( mode)
      {
         case MODE_HIGH:
            ret = iHigh( symbol, period, shift);
            text="MODE_HIGH";
            break;
         case MODE_LOW:
            ret = iLow( symbol, period, shift);
            text="MODE_LOW";
            break;
         case MODE_CLOSE:
            ret = iClose( symbol, period, shift);
            text="MODE_CLOSE";
            break;
         case MODE_OPEN:
            ret = iOpen( symbol, period, shift);
            text="MODE_OPEN";
            break;
         default:
            Print("GetValue(). Wrong Parameter.");

      }
      
      check = GetLastError();
      dt = iTime( symbol, period, shift);
      Print( "i=", i, " ret=", ret, " ", text, " time=", TimeToStr( dt, TIME_DATE | TIME_SECONDS ), " period=", period, " check=", check);
//      if( check == ERR_NO_ERROR)
//         break;
   }
   return (ret);
}
 

Вот нашел.

SlawaSlawa 16.06.2005 15:36
автоматически грузит. однако, есть один нюанс. если Вы предварительно откроете график днёвки, то данные по днёвкам подкачаются гораздо раньше, чем это потребуется эксперту. если график не был предварительно открыт, то после первого обращения из эксперта пойдёт запрос на обновление данных и в этом случае Вы сначала получите старые данные. для новых данных Вам надо будет повторно обращаться. чтобы определить что Вы получили старые данные, анализируйте последнюю ошибку на равенство 4066. этот код сигнализирует о том, что был отправлен запрос на обновление данных

И делать то что? при повторном запросе, я не получу ошибку 4066. Видимо, единственный способ - сравнить время. Допустим, по TimeCurrent() я вычислю время, которое мне нужно - время начала часа, и сдвиг какой-нибудь я не забуду вставить. А с чем сравнивать то? Гарантирует ли совпадение iTime(0) то, что iHigh(0) вернет правильное значение?

А что делать с iCustom(), если он вернул 4066?

 

Уважаемые разработчики.

Если я плохо сформулировал вопрос, скажите. Когда вы разрабатывали МТ4, вы предполагали какую-то "стандартную" технологию получения клиентом котировок из закрытых графиков. Опишите её, пожалуйста.

 

Спасибо за ответ, а что я там должен найти? В MarketWatch символ у меня есть.

 

Разработчики. Ответьте, пожалуйста, на вопрос. Как проверить, что данные получены от сервера?

Когда вы разрабатывали МТ4, вы предполагали какую-то "стандартную" технологию получения клиентом котировок из закрытых графиков. Опишите её, пожалуйста.

 
babybear :

Вот нашел.

SlawaSlawa 16.06.2005 15:36
автоматически грузит. однако, есть один нюанс. если Вы предварительно откроете график днёвки, то данные по днёвкам подкачаются гораздо раньше, чем это потребуется эксперту. если график не был предварительно открыт, то после первого обращения из эксперта пойдёт запрос на обновление данных и в этом случае Вы сначала получите старые данные. для новых данных Вам надо будет повторно обращаться. чтобы определить что Вы получили старые данные, анализируйте последнюю ошибку на равенство 4066. этот код сигнализирует о том, что был отправлен запрос на обновление данных

И делать то что? при повторном запросе, я не получу ошибку 4066. Видимо, единственный способ - сравнить время. Допустим, по TimeCurrent() я вычислю время, которое мне нужно - время начала часа, и сдвиг какой-нибудь я не забуду вставить. А с чем сравнивать то? Гарантирует ли совпадение iTime(0) то, что iHigh(0) вернет правильное значение?

А что делать с iCustom(), если он вернул 4066?

Чем Вас не устраивает наш пример по обработке ошибки 4066? https://docs.mql4.com/ru/array/arraycopyseries

Массивы Time и High не ходят по отдельности. Исторические данные скомпонованы в структуру Rates, что очень хошо видео в скрипте PeriodConverter

 
Slawa :
babybear :

Вот нашел.

И делать то что? при повторном запросе, я не получу ошибку 4066. Видимо, единственный способ - сравнить время. Допустим, по TimeCurrent() я вычислю время, которое мне нужно - время начала часа, и сдвиг какой-нибудь я не забуду вставить. А с чем сравнивать то? Гарантирует ли совпадение iTime(0) то, что iHigh(0) вернет правильное значение?

А что делать с iCustom(), если он вернул 4066?

Чем Вас не устраивает наш пример по обработке ошибки 4066? https://docs.mql4.com/ru/array/arraycopyseries

Массивы Time и High не ходят по отдельности. Исторические данные скомпонованы в структуру Rates, что очень хошо видео в скрипте PeriodConverter

скопирую отсюда https://www.mql5.com/ru/forum/116126/page2 недавно совсем написал.

1. для минуток не гарантируется соответствие TimeCurrent() iTime(). особенно, когда речь идет о мультивалютной торговле.

2. Загрузка нулевой свечи не гарантирует загрузки всех свечей.

3, отсутствие 4066 в строке if(error==4066) вообще ни о чем не говорит. Ведь нигде не написано, когда два последущих вызова

ArrayCopySeries(daytimes,MODE_TIME,Symbol(),PERIOD_D1);
вернут 4066 оба

4. на минутках не все свечи гарантированно есть. То есть нельзя проверять время свечи.

Очень надеюсь, что Вы поняли, что я написал. Если нет - готов поподробнее написать.

Понимаете, я хочу написать инит, который гарантирует что все загрузки, о начале которых говорит 4066 закончены. И всего делов. А потом, я уже понял, нужно вызывать на каждом тике iHigh(), или еще что-нибудь. Кстати, что лучше вызывать, есть разница?

/

/

про time и high понял. вопрос про соответствие времени и данных снят :)

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