Этот форум переведен в режим чтения, просим обсуждать вопросы на форумах MQL4.community и MQL5.community

iHigh и ошибка 146


К списку тем  | 1 2
avatar
117
babybear 20.03.2009 01:36 

Такой вот код

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

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

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

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

avatar
3289
Rosh 20.03.2009 12:47 

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

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

Спасибо

avatar
117
babybear 31.03.2009 15:01 

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

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);
}
avatar
117
babybear 31.03.2009 16:43 

Вот нашел.

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

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

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

avatar
117
babybear 02.04.2009 15:19 

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

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

avatar
3289
Rosh 02.04.2009 22:09 
avatar
117
babybear 03.04.2009 02:25 

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

avatar
117
babybear 06.04.2009 18:27 

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

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

avatar
4464
Slawa 06.04.2009 19:13 
babybear :

Вот нашел.

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

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

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

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

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

avatar
117
babybear 06.04.2009 23:34 
Slawa :
babybear :

Вот нашел.

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

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

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

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

скопирую отсюда http://forum.mql4.com/ru/21127/page2 недавно совсем написал.

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

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

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

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

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

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

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

/

/

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

К списку тем   | 1 2  
Скачай MetaTrader 5 (300 Кб, веб-установщик) — новый терминал для финансовых рынков