Про билд 2980 Войдите в моё положение... - страница 3

 
Andrei Trukhanovich:

вставить сравнение с нулем было в разы быстрее (и правильнее изначально) чем писать этот ваш пост

От struct и struct[] такого не требуется еще. И это правильно.

void OnTick() 
{
  MqlTick Tick;
  
  // Если текущий тик не с нулевыми ценами (при запуске Тестере, например).
  if (SymbolInfoTick(_Symbol, Tick) && Tick.bid && Tick.ask) // OK
  {
    // Делаем
  }
}


void OnTick()
{
  MqlTick Tick[1];
  
  // Если текущий исторический тик не с нулевыми ценами (при запуске Тестере, например).
  if (CopyTicks(_Symbol, Tick, COPY_TICKS_ALL, 0, 1) && Tick[0].bid && Tick[0].ask) // OK
  {
    // Делаем
  }
}


Однако, стоит написать без struct - ругается.

void OnTick()
{
  double bid[1], ask[1];

  if (bid[0] && ask[0]) // expression not boolean
  {
    // Делаем
  }
}
 

Тема - хорошая иллюстрация последствий неряшливого кода. 

Вот та же инициализации структуры как ={0} - это что за ерунда ?  Даже в простой структуре могут быть, например, перечисления, в которых нет значений "нуль", а в сложных - может быть все вплоть до объектов. Структура инициализируется каждым отдельным полем, и даже применение функций типа обнуления выделенной памяти - это плохая практика, фактически, являющаяся "костылями". 

Или предупреждение вроде сравнение с нулем в длинном условии - совершенно верно компилятор делает предупреждение. Это потенциальное место ошибки, в сложных условиях запросто можно ошибиться. 

Код должен быть прост, очевиден и прозрачен. Именно поэтому я не люблю оператор "вопросик" - слишком сложная конструкция, в которой легко можно ошибиться. А ведь некоторые используют по нескольку этих самых "вопросиков" в одной строке, типа "круто". 


Разговоры про "...вместо того, чтобы продолжить работу с кодом" - и вовсе странные... Продолжай, устраняй неопределенности, типа приравнивания структуры к нулю ! Это что, не "продолжение работы с кодом" ??? 

 
Maxim Kuznetsov:

Вы настолько в этом уверены ?? :-) 

Ну так я и написал , мало ли что компилятору в голову стрельнет . А вообще это по ссылке выше описание булевых данных (https://www.mql5.com/ru/docs/basis/types/integer/boolconst)

Документация по MQL5: Основы языка / Типы данных / Целые типы / Тип bool
Документация по MQL5: Основы языка / Типы данных / Целые типы / Тип bool
  • www.mql5.com
Тип bool - Целые типы - Типы данных - Основы языка - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
fxsaber:

Однако, стоит написать без struct - ругается.

 double bid[1]={1}, ask[1]={0};

  if (bid[0] && ask[0])
  {
    // Делаем
  }

Скомпилировал в 4 (bild 1335) и 5 (bild 2361). Ругательства (Errors || Warnings) отсутствуют. Где взяли bild 2980 ?

 
Konstantin Erin:

Скомпилировал в 4 (bild 1335) и 5 (bild 2361). Ругательства (Errors || Warnings) отсутствуют. Где взяли bild 2980 ?

В секретных запасниках :))

2980 это build MT5

 
Georgiy Merts:

Тема - хорошая иллюстрация последствий неряшливого кода. 

Вот та же инициализации структуры как ={0} - это что за ерунда ?  Даже в простой структуре могут быть, например, перечисления, в которых нет значений "нуль", а в сложных - может быть все вплоть до объектов. Структура инициализируется каждым отдельным полем, и даже применение функций типа обнуления выделенной памяти - это плохая практика, фактически, являющаяся "костылями". 

Или предупреждение вроде сравнение с нулем в длинном условии - совершенно верно компилятор делает предупреждение. Это потенциальное место ошибки, в сложных условиях запросто можно ошибиться. 

Код должен быть прост, очевиден и прозрачен. Именно поэтому я не люблю оператор "вопросик" - слишком сложная конструкция, в которой легко можно ошибиться. А ведь некоторые используют по нескольку этих самых "вопросиков" в одной строке, типа "круто". 


Разговоры про "...вместо того, чтобы продолжить работу с кодом" - и вовсе странные... Продолжай, устраняй неопределенности, типа приравнивания структуры к нулю ! Это что, не "продолжение работы с кодом" ??? 

Почти во всём согласен. Но только почти… Что касается оператора ?: не могу согласиться. Конечно наворачивать десяток таких операторов в одну строку негоже, но заменить if else в некоторых случаях, лучше не придумаешь.

Было время когда я применял этот оператор для определения цены, ask или bid, в зависимости от типа ордера\позиции. Но ведь к этому нужно определять ещё и стопы… Получалось 3 строки ?: подряд с одним условием… Пришлось отказаться, дешевле под одним условием назначить всё и сразу…

 

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

у меня он всегда первый по счету, какой не поставь

   if(spy_Handles[number]!=INVALID_HANDLE && Handle01[number]!=INVALID_HANDLE && Handle02[number]!=INVALID_HANDLE && Handle03[number]!=INVALID_HANDLE)
 
void OnStart()
{
  double bid[], ask[]; 
  
  bool Res1 = bid[0] && ask[0];               // Идеально.
  bool Res2 = (bool)bid[0] && (bool)ask[0];   // Занудство.
  bool Res3 = (bid[0] != 0) && (ask[0] != 0); // Ограничение скорости 30 - еду всегда 30.
  bool Res4 = !!bid[0] && !!ask[0];           // Сложно.
}
Georgiy Merts:

Код должен быть прост, очевиден и прозрачен. Именно поэтому я не люблю оператор "вопросик" - слишком сложная конструкция, в которой легко можно ошибиться. А ведь некоторые используют по нескольку этих самых "вопросиков" в одной строке, типа "круто". 

class TRADE
{
public:
  const string Symb;
  
  TRADE( const string sSymb = NULL ) : Symb((sSymb == NULL) ? _Symbol : sSymb)
  {
  }
};

Необходимость, а не крутость.


ЗЫ Такая штука не является альтернативой.

class TRADE
{
public:
  const string Symb;
  
  TRADE( const string sSymb ) : Symb(sSymb) {}

  TRADE( void ) : Symb(_Symbol) {}
};
 
Konstantin Erin:

Скомпилировал в 4 (bild 1335) и 5 (bild 2361). Ругательства (Errors || Warnings) отсутствуют. Где взяли bild 2980 ?

Alexey Viktorov:

В секретных запасниках :))

2980 это build MT5

Купите очки. Написал же 5 (bild 2361), а  4 (bild 1335). Терминалы все время включены. Где взяли bild 2980 ?

 
a007:

Купите очки. Написал же 5 (bild 2361), а  4 (bild 1335). Терминалы все время включены. Где взяли bild 2980 ?

2980 доступен только тем, у кого стоит 64-битная Windows.