Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 1190

 
MakarFX:

Закрытие MetaQuotes Demo Server

MetaQuotes Software Corp.

4 марта 2009

5 апреля 2009 года сервер «demo.metaquotes.net» будет остановлен. При этом History Center с минутной историей продолжит работу.

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

Это какая-то древность (упоминается другой сервер). В этом году неоднократно, последний раз месяц назад на MetaQuotes-Demo был нормально создан новый демо-счет.

Кроме того, если сервер удален почему он показывается и пингуется в мастере открытия счета? Затык происходит только на последнем шаге.

 
Artyom Trishkin:

При первом обращении к историческим данным из индикатора, при условии недостаточности локальных данных, начинается подгрузка данных и функция возвращает ошибку.

Это я прекрасно понимаю. Если бы дело было в недостатке баров в истории, то обе функции вернули бы 0. А так одна возвращает 0, а вторая корректно возвращает количество баров в истории. При чем вызываются они одна за другой:

Loader(): symbol(Symbol()), timeframe(Period()) 
  {
    Print(__FUNCTION__ + " symbol: " + symbol + " timeframe: " + EnumToString(timeframe));
    ResetLastError();
    Print(__FUNCTION__ + " bars: " + (string)iBars(symbol, timeframe)); // Данный вызов iBars() даёт 0 при перезапуске терминала
    Print(__FUNCTION__ + " Error: " + (string)GetLastError());
    Print(__FUNCTION__ + " bars (2): " + (string)iBars(Symbol(), Period())); // Этот же вызов iBars() работает нормально
  }

Только данные берутся, в первом случае уже из готовых преременных-членов (symbol и timeframe) класса Loader (корректно проинициализированых), а во втором с функций Symbol() и Period() (которые дают точно такие же значения, как было записано в symbol и timeframe). Значения переменных идентичны значениям функций (я проверял). Но где косячит iBars(symbol, timeframe) с абсолютно корректными symbol и timeframe, мне не ясно. При том что iBars(Symbol(), Period()) не косячит. Вот я и решил, что где-то ошибка в самой работе терминала или неправильная компиляция исходника.

Документация по MQL5: Доступ к таймсериям и индикаторам / Bars
Документация по MQL5: Доступ к таймсериям и индикаторам / Bars
  • www.mql5.com
Если указаны параметры start_time и stop_time, то функция возвращает количество баров в диапазоне дат. Если эти параметры не указаны, то функция возвращает общее количество баров. Если данные для таймсерии с указанными параметрами при вызове функции Bars() еще не сформированы в терминале, или данные таймсерии в момент вызова функции не...
 
Mihail Matkovskij:

Это я прекрасно понимаю. Если бы дело было в недостатке баров в истории, то обе функции вернули бы 0. А так одна возвращает 0, а вторая корректно возвращает количество баров в истории. При чем вызываются они одна за другой:

Только данные берутся, в первом случае уже из готовых преременных-членов (symbol и timeframe) класса Loader (корректно проинициализированых), а во втором с функций Symbol() и Period() (которые дают точно такие же значения, как было записано в symbol и timeframe). Значения переменных идентичны значениям функций (я проверял). Но где косячит iBars(symbol, timeframe) с абсолютно корректными symbol и timeframe, мне не ясно. При том что iBars(Symbol(), Period()) не косячит. Вот я и решил, что где-то ошибка в самой работе терминала.

А теперь запишите вот так, как Игорь посоветовал:

Loader(): symbol(Symbol()), timeframe(Period()) 
  {
    Print(__FUNCTION__ + " symbol: " + symbol + " timeframe: " + EnumToString(timeframe));
    ResetLastError();
    Print(__FUNCTION__ + " bars: " + (string)iBars(Symbol(), Period())); // Данный вызов iBars() даёт 0 при перезапуске терминала
    Print(__FUNCTION__ + " Error: " + (string)GetLastError());
    Print(__FUNCTION__ + " bars (2): " + (string)iBars(symbol, timeframe)); // Этот же вызов iBars() работает нормально
  }
И не забывайте, что это конструктор класса, а он вызывается ещё до инициализации
 
Mihail Matkovskij:

Это я прекрасно понимаю. Если бы дело было в недостатке баров в истории, то обе функции вернули бы 0. А так одна возвращает 0, а вторая корректно возвращает количество баров в истории. При чем вызываются они одна за другой:

Вы придумали какую то историю

затем решили эту историю оформить в виде претензии и затем в вопрос

что пишет справка по ошибке 4401 ?

что я писал? 

Вы понимаете разницу между недостатком баров и неготовностью чарта?

у Вас же ситуация после перезагрузки терминала с запуском индикатора, причем данные Вы запрашиваете в глобальной инициализации MQL-программы (конструктор класса), которая будет выполнена до ОнИнит()


ушел, пишете быстрее чем читаете, поиском по форуму 4401 - все ответы 

 
MakarFX:

У меня лот высчитывается так

стоит в начале советника...и ставил в самый конец кода

#property link      "http://www.mql5.com"
input double CheckLots = 0.01;
input int    Persent   = 5;
   double Lots=NormalizeDouble(AccountBalance()*CheckLots/1000-0.005,2);  

Когда идет обращение в функции OnTick к переменной Lots, то советник находит и пересчитывает.

Не может быть такого. У вас идёт объявление и инициализация, переменной Lots присваивается выражение. 

NormalizeDouble(AccountBalance()*CheckLots/1000-0.005,2)

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

 
Seric29:

Не может быть такого. У вас идёт объявление и инициализация, переменной Lots присваивается выражение. 

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

Я проверял, при изменении баланса, лот тоже меняется
 
MakarFX:
Я проверял, при изменении баланса, лот тоже меняется

Ничего себе я проверю. Я знаю что можно инициализировать функциями переменные с элементами массивов не прокатывает но что оно автоматически меняется не знал, мне кажется в с++ тоже нет такого я проверю потом.

 
Artyom Trishkin:
И не забывайте, что это конструктор класса, а он вызывается ещё до инициализации

Это если объект автоматический. А я создаю его с помощью ключевого слова new (в OnInit()) и удаляю с помощью ключевого слова delete (в OnDeinit()). То есть, использую указатель на объект типа Loader. Но на счёт таких подробностей, думаю, вы в курсе... Поэтому, создаётся loader в OnInit() и тут не может быть ошибки.

Если вы имеете в виду, поменять функции местами, то пробовал я и так, результат всё тот же. Только сообщения идут в другой последовательности :) 

public:  
  Loader(): symbol(Symbol()), timeframe(Period()) 
  {
    Print(__FUNCTION__ + " symbol: " + symbol + " timeframe: " + EnumToString(timeframe));
    Print(__FUNCTION__ + " bars (2): " + (string)iBars(Symbol(), Period())); 
    ResetLastError();
    Print(__FUNCTION__ + " bars: " + (string)iBars(symbol, timeframe)); 
    Print(__FUNCTION__ + " Error: " + (string)GetLastError());
  }

Результат: 

2020.06.24 23:10:48.568 Loader::Loader symbol: EURUSD timeframe: PERIOD_H1

2020.06.24 23:10:48.568 Loader::Loader bars (2): 140435

2020.06.24 23:10:48.568 Loader::Loader bars: 0

2020.06.24 23:10:48.568 Loader::Loader Error: 4401

Обращаю ваше внимание, на то что это происходит именно при перезапуске терминала и только при нем! Так как при первом запуске терминала (после запуска Windows) пример отрабатывает корректно.
Запуск платформы - Для продвинутых пользователей - Справка по MetaTrader 5
Запуск платформы - Для продвинутых пользователей - Справка по MetaTrader 5
  • www.metatrader5.com
По завершении установки в меню "Пуск" создается группа программ торговой платформы, а на рабочем столе дополнительно помещается ярлык программы. Используйте их для запуска. Нельзя запускать одновременно две копии платформы из одной директории. Чтобы одновременно запустить несколько копий, установите соответствующее количество программ в разные...
 
Igor Makanu:

Вы придумали какую то историю

затем решили эту историю оформить в виде претензии 

Никаких претензий! И в чём же выдумка, если я предоставил исходник и даже расписал последовательность действий для тестирования его работы? Очевидно, Вы меня неправильно поняли...

Igor Makanu:

причем данные Вы запрашиваете в глобальной инициализации MQL-программы (конструктор класса), которая будет выполнена до ОнИнит()


ушел, пишете быстрее чем читаете, поиском по форуму 4401 - все ответы 


Не должна она выполняться до OnInit(), написал в предыдущем посте. Это Вы невнимательно читаете, как посты, так и код исходника, который я добавил для тестирования.

 
Stanislav Korotky:

Это какая-то древность (упоминается другой сервер). В этом году неоднократно, последний раз месяц назад на MetaQuotes-Demo был нормально создан новый демо-счет.

Кроме того, если сервер удален почему он показывается и пингуется в мастере открытия счета? Затык происходит только на последнем шаге.

Да, что то не идёт регистрация, даже в мобильном терминале. Раньше в этом году все регилось.