Особенности языка mql5, тонкости и приёмы работы - страница 203

 
Комментарии, не относящиеся к этой теме, были перенесены в "Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам".
 

Мы расширяем инициализирующие последовательности "{ ... }", в ближайшем билде будет разрешено использовать любое выражение, а не только константное.

Вместо с этим изменением, появится и граничение на использование констант для перечислений (как для обычного выражения): если константа не входит в перечисление, то будет выдана соответствующая ошибка.

Анализ существующих кодов показал, что часто неправильно используется последовательность из одного нуля - "{0}"

Например так:

MqlTradeRequest request={0};


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

Для приведённой выше строки кода, по новым правилам, будет выдана ошибка, т.к. первое поле имеет тип ENUM_TRADE_REQUEST_ACTIONS, перечисление, в котором отсутствует значение "0"

cannot convert 0 to enum 'ENUM_TRADE_REQUEST_ACTIONS'


Правильно будет так:

MqlTradeRequest request={};
 
Ilyas:

Правильно будет так:

MqlTradeRequest request={};

И чему тогда будет равно request.action?

 
mktr8591:

И чему тогда будет равно request.action?

Нолю конечно, как если бы для объекта этой структуры вызвали ZeroMemory

 

О синхронизации таймсерий и индикаторов на них построенных:

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Ошибки, баги, вопросы

Slava, 2021.05.29 18:16

Хочу напомнить.

1. Для каждого символа, для которого открыт хоть один график, работает отдельный поток для обработки пришедших тиков. Может быть открыто несколько графиков по какому-то символу, но поток будет всё равно один.

2. Поток символа обрабатывает не графики, а таймсерии. То есть, те самые массивы данных, которые отдаются на запрос CopyRates

3. Бесполезно спрашивать у своего символа в OnTick или OnCalculate, синхронизирован ли он. Конечно, да!

4. Все таймсерии обрабатываются по порядку, от младшей к старшей. Сначала применение тика, потом расчёт всех индикаторов, созданных на данной таймсерии. Если вы из индикатора, работающего на M1, спрашиваете данные для этого же символа H1, то вы никогда не получите данных с применённым тиком. Данные всегда будут на один тик назад, какие бы ухищрения вы не применяли. Потому что один поток на символ с последовательной обработкой таймфреймов.

5. Предыдущее утверждение не касается экспертов и скриптов, потому что эксперты и скрипты работают каждый в своём отдельном потоке.


 
Andrey Khatimlianskii:

О синхронизации таймсерий и индикаторов на них построенных:

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Ошибки, баги, вопросы

Slava, 2021.06.01 06:34

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

После неудачного запроса просто пошлите своему графику команду на обновление и тут же завершайте работу OnCalculate. Гарантированно будет вызвана OnCalculate и гарантированно нужные таймсерии к этому моменту будут подготовлены

 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Особенности языка mql5, тонкости и приёмы работы

fxsaber, 2017.11.30 09:48

Памятка

Действие/тип программы Смена ТФ или символа Смена счета
Индикатор Запуск OnDeinit и OnInit, объект глобального класса меняется (полная перезагрузка). Ничего не происходит, кроме обнуления prev_calculated.
Советник Запуск OnDeinit и OnInit, объект глобального класса не меняется. Запуск OnDeinit и OnInit, объект глобального класса меняется (полная перезагрузка).
Выделенное поведение индикаторов изменилось. Теперь оно совпадает с советником.
 
fxsaber:
Выделенное поведение индикаторов изменилось. Теперь оно совпадает с советником.

Суть в другом - может это недосмотр, а не осознанное изменение поведения? Узнавали?

 
Artyom Trishkin:

Суть в другом - может это недосмотр, а не осознанное изменение поведения? Узнавали?

Не узнавал. Обратная связь почти никакая. Однако, вот такая особенность, о которой только узнал.

const bool Init = EventSetMillisecondTimer(1);
const long Account = AccountInfoInteger(ACCOUNT_LOGIN);

#define TOSTRING(A) #A + " = " + (string)(A) + " "

void OnTimer()
{
  if (Account != AccountInfoInteger(ACCOUNT_LOGIN))
    Alert(TOSTRING(Account) + TOSTRING(AccountInfoInteger(ACCOUNT_LOGIN)));
}

Этот советник алертит при переключении между счетами. Казалось бы, он не должен этого делать, согласно правилу

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Особенности языка mql5, тонкости и приёмы работы

fxsaber, 2017.11.30 09:48

Памятка

Действие/тип программы Смена ТФ или символа Смена счета
Индикатор Запуск OnDeinit и OnInit, объект глобального класса меняется (полная перезагрузка). Ничего не происходит, кроме обнуления prev_calculated.
Советник Запуск OnDeinit и OnInit, объект глобального класса не меняется. Запуск OnDeinit и OnInit, объект глобального класса меняется (полная перезагрузка).
Однако, это происходит из-за таймера.
 
fxsaber:

Этот советник алертит при переключении между счетами. Казалось бы, он не должен этого делать, согласно правилу

Однако, это происходит из-за таймера.

Никто не гарантировал, что будут прерваны (или не будут запущены) другие обработчики событий.

После алерта же происходит и деинит и инит, правда?

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