Новая версия платформы MetaTrader 5 build 3620: улучшения веб-терминала, поддержка ONNX и ускоренное умножение матриц в MQL5 - страница 14

 
Vladislav Boyko #:

Подскажите пожалуйста еще немного.

  1. Я запрашиваю данные баров чужого графика с помощью ArrayCopyRates()
  2. Приходит новый тик
  3. Я вызываю iCustom() для того-же чужого графика

Эти 3 пункта происходят в пределах одного и того-же исполнения OnTick().

В iCustom будет учтен этот пришедший тик? Или индикатор будет вычислен на тех-же данных, которые скопировала ArrayCopyRates()?

iCustom будет просчитан на тех данных, которые будут в главной базе терминала на этот момент.

Все процессы независимы/асинхронны и запрос ArrayCopy никак не связан с последующими операциями. То есть, ни терминал, ни среда исполнения MQL5 не "тормозят мир" во время OnXXXX обработчиков.

 

Просьба к разработчикам - ещё бы ко всем наворотам добавить штатные функции New Bar и Market Close, тогда вообще бы цены не было!

С уважением, Владимир.

 
MrBrooklin #:

Просьба к разработчикам - ещё бы ко всем наворотам добавить штатные функции New Bar и Market Close, тогда вообще бы цены не было!

С уважением, Владимир.

Владимир, NewBar в виде функции можно вообще не применять. Достаточно в теле OnTick() поставить условие…

А MarketCkose, достаточно встроить в функцию OrderCheck() возврат соответствующей ошибки. А пока эта ошибка возвращается только из OrderSend(). И об этом говорят уже так давно, что у меня есть сомнение, что когда-то это будет сделано.

 
Alexey Viktorov #:

Владимир, NewBar в виде функции можно вообще не применять. Достаточно в теле OnTick() поставить условие…

А MarketCkose, достаточно встроить в функцию OrderCheck() возврат соответствующей ошибки. А пока эта ошибка возвращается только из OrderSend(). И об этом говорят уже так давно, что у меня есть сомнение, что когда-то это будет сделано.

Привет, Алексей! Согласен с тобой, что можно всё сделать, но это была просьба, как мне кажется, не то, что созревшая, а уже давно перезревшая. Если скажут разработчики "НЕТ!", то на нет и суда нет...

С уважением, Владимир.

 
MrBrooklin #:

Привет, Алексей! Согласен с тобой, что можно всё сделать, но это была просьба, как мне кажется, не то, что созревшая, а уже давно перезревшая. Если скажут разработчики "НЕТ!", то на нет и суда нет...

С уважением, Владимир.

Поддерживаю Владимира. Так называемый "костыль" можно собрать практически всегда. Функции ArrayCopy(...) или ArrayMaximum(...), например, тоже можно заменить простым циклом. Но никто не призывает убрать их за ненадобностью. Функция NewBar тоже была бы полезна. Я бы предложил даже событие терминала NewBar с соответствующей функцией OnNewBar(). Но уважаемые эксперты форума почему то в большинстве случаев предлагают именно соорудить "костыль", вместо того чтобы поддержать идею улучшения языка MQL или исправления ошибок.

Уверен, что в большинстве случаев мы можем написать рабочий код и без предлагаемых нововведений и/или исправлений. Но цель наших постов, именно улучшение либо исправление ошибок языка MQL. А не просьба совета, как поступить. 

P.S. Я и сам недавно написал костыль, чтобы советник правильно работал, используя функцию OnTradeTransaction. Но всё же надеюсь, разработчики проверят эту ошибку и исправят. Функция должна работать согласно документации, а не как ей захочется.

Вопрос о функции OnTradeTransaction
Вопрос о функции OnTradeTransaction
  • 2023.03.18
  • www.mql5.com
Вот и вытекает вопрос: А для чего тогда нужна эта функция обработки события?
 
MrBrooklin #:

Привет, Алексей! Согласен с тобой, что можно всё сделать, но это была просьба, как мне кажется, не то, что созревшая, а уже давно перезревшая. Если скажут разработчики "НЕТ!", то на нет и суда нет...

С уважением, Владимир.

Да, не так давно я был удивлён новым функциям работы с массивами. Удалить строку или несколько строк, добавить строку в середину массива. А всё образовалось тогда, когда кто-то из разработчиков увидел давно используемый приём копирования массива  сам в себя.

Если когда-то добавят штатную функцию нового бара, я буду также удивлён и не более того. А вот если функция OrderCheck() будет возвращать ошибку [рынок закрыт], то благодарность будет от многих пользователей mql5 а не только от меня.

 
Alexey Viktorov #:

Да, не так давно я был удивлён новым функциям работы с массивами. Удалить строку или несколько строк, добавить строку в середину массива. А всё образовалось тогда, когда кто-то из разработчиков увидел давно используемый приём копирования массива  сам в себя.

Если когда-то добавят штатную функцию нового бара, я буду также удивлён и не более того. А вот если функция OrderCheck() будет возвращать ошибку [рынок закрыт], то благодарность будет от многих пользователей mql5 а не только от меня.

Не верное будет решение проверять статус MarketClosed через OrderChek().
Статус должен быть известен до любых вызовов OrderXXX.
Что-то наподобие флага в переменной _MarketClosed.
 
Alexey Viktorov #:

Да, не так давно я был удивлён новым функциям работы с массивами. Удалить строку или несколько строк, добавить строку в середину массива. А всё образовалось тогда, когда кто-то из разработчиков увидел давно используемый приём копирования массива  сам в себя.

Если когда-то добавят штатную функцию нового бара, я буду также удивлён и не более того. А вот если функция OrderCheck() будет возвращать ошибку [рынок закрыт], то благодарность будет от многих пользователей mql5 а не только от меня.

Что за приём? Можно подробнее?

 
Roman #:
Не верное будет решение проверять статус MarketClosed через OrderChek().
Статус должен быть известен до любых вызовов OrderXXX.
Что-то наподобие флага в переменной _MarketClosed.

Да.

Тем более, сталкивался с ситуацией, когда проверка OrderChek() не проходила, а ордер нормально выставлялся.

Это было в какой-то очень древней версии, но с тех пор OrderChek() не использую - уверенности в нём нет, экспериментировать на боевых роботах не хочется.

 
Andrey Kaunov #:

Что за приём? Можно подробнее?

ArrayCopy(array, array, 0, 1);

Таким образом нулевой индекс будет заполнен значением первого, и так далее, а последний можно будет заполнить свежим значением. Так-же можно наоборот

ArrayCopy(array, array, 1, 0, ArraySize(array)-1);

В этом случае значение нулевого индекса будет равно значению первого.

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