Новая версия платформы MetaTrader 5 build 2007: Экономический календарь, MQL5-программы в виде сервисов - страница 54

 
fxsaber:

Результатом побитовой операции является число.

конечно число, в данном случае 0 или 1 (ложь или истина), только я говорю о реакции компилятора, код исполняется верно

 
Konstantin:

конечно число, в данном случае 0 или 1 (ложь или истина), только я говорю о реакции компилятора, код исполняется верно

if(a_ticks[i].flags & TICK_FLAG_BUY) {...}

TICK_FLAG_BUY равен 32

Print("TICK_FLAG_BUY & TICK_FLAG_BUY=",(TICK_FLAG_BUY & TICK_FLAG_BUY));
 
Artyom Trishkin:

TICK_FLAG_BUY равен 32

вы вообще о чем?


Идет ведь сравнение не числа, а бита, я же написал вначале, что логика работает нормально, но в отличии от других компиляторов, компилятор mql дает предупреждение !!! что излишне.

Для проверки скомпилируйте код с этим условием любым компилятором (с++, .net), предупреждений не будет, т.к. синтаксис языков именно и подразумевает поведение сравнение битов.

Просто кастовать в стиле Си уже как то архаично выглядит в данном варианте.

 
Konstantin:

вы вообще о чем?

О том, что & - побитовая операция, а не логическая. Ее результат не является булевым. Вот компилятор и подсказывает. Это правильно. В тех случаях, когда вместо знака == по ошибке ставится = в логических операциях такое предупреждение очень помогает. Тут та же самая ситуация.

Идет ведь сравнение не числа, а бита,

Нет там сравнения, только побитовая операция. Если утрировать, то в коде написано следующее:

if (a_ticks[i].flags * TICK_FLAG_BUY)

то есть не хватает логической операции. В данном случае наиболее правильное решение приведено тут.

 
Konstantin:

вы вообще о чем?


Идет ведь сравнение не числа, а бита, я же написал вначале, что логика работает нормально, но в отличии от других компиляторов, компилятор mql дает предупреждение !!! что излишне.

Для проверки скомпилируйте код с этим условием любым компилятором (с++, .net), предупреждений не будет, т.к. синтаксис языков именно и подразумевает поведение сравнение битов.

Просто кастовать в стиле Си уже как то архаично выглядит в данном варианте.

Я упростил до нельзя то, что вы 32 сравниваете с 1 или 0 без знака сравнения
 
Ihor Herasko:

О том, что & - побитовая операция, а не логическая. Ее результат не является булевым. Вот компилятор и подсказывает. Это правильно. В тех случаях, когда вместо знака == по ошибке ставится = в логических операциях такое предупреждение очень помогает. Тут та же самая ситуация.

Нет там сравнения, только побитовая операция. Если утрировать, то в коде написано следующее:

то есть не хватает логической операции. В данном случае наиболее правильное решение приведено тут.

& в побитовых операциях это логическое И, конечно в синтаксисе языка это побитовая операция с результатом ложь либо истина, поведение компилятора связанного с предупреждением не логично


Ps. спорить не хочу, я лишь подсказал разработчикам, что в подобных ситуациях компиляторы с++ и C# не дают предупреждений

Artyom Trishkin:
Я упростил до нельзя то, что вы 32 сравниваете с 1 или 0 без знака сравнения
читайте выше, дальнейшее обсуждение с теми кто не в теме бесполезно, вы дальше mql похоже не смотрите
 

В индикаторах перестала работать функция ObjectsDeleteAll:

#property indicator_chart_window 


int OnInit()
{
   ObjectCreate(0, "MyObject", OBJ_VLINE, 0, iTime(NULL, 0, 2), 0.0);

   return(INIT_SUCCEEDED);
}
void OnDeinit(const int reason)
{
   ObjectsDeleteAll(0);
   ChartRedraw();
}
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
{
   return(rates_total);
}

Пробовал как с префиксом, так и без. Результат один и тот же.

Билд 2025, Win7x64 SP1

UPD. После более глубоких проверок оказалось, что причина в функции ObjectsTotal. Она всегда возвращает 0 при любом количестве объектов на графике. Через ObjectDelete при прямом указании имени объекта удаление происходит.
 
int  UninitializeReason();

в МТ5 2007 если вызывать в OnInit() функцию UninitializeReason(), она всегда возвращает 0?

в МТ4 можно было отследить ТФ сменили еще чего...

 
pivalexander:

в МТ5 2007 если вызывать в OnInit() функцию UninitializeReason(), она всегда возвращает 0?

Только в индикаторах. В советниках работает.

Дело в том, что в МТ5 принцип работы индикаторов изменен. При переключении ТФ текущая копия полностью удаляется. Затем к графику присоединяется абсолютно новая копия, которая знать ничего не знает о предыдущей копии. 

 
Ihor Herasko:

В индикаторах перестала работать функция ObjectsDeleteAll:

Было где-то уже... Заплатку предложили: если перед ней сделать вызов ObjectsTotal(), то срабатывает. MQ сказали, что поправили.

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