Странное условие какое-то в СБ

 

В стандартной библиотеке я увидел такой кусок кода:

//+------------------------------------------------------------------+
//| Checks and corrects type of filling policy                       |
//+------------------------------------------------------------------+
bool CTrade::FillingCheck(const string symbol) {
  //--- get execution mode of orders by symbol
  ENUM_SYMBOL_TRADE_EXECUTION exec = (ENUM_SYMBOL_TRADE_EXECUTION)SymbolInfoInteger(symbol, SYMBOL_TRADE_EXEMODE);
  //--- check execution mode
  if (exec == SYMBOL_TRADE_EXECUTION_REQUEST || exec == SYMBOL_TRADE_EXECUTION_INSTANT) {
    //--- neccessary filling type will be placed automatically
    return true;
  }
  //--- get possible filling policy types by symbol
  uint filling = (uint)SymbolInfoInteger(symbol, SYMBOL_FILLING_MODE);
  //--- check execution mode again
  if (exec == SYMBOL_TRADE_EXECUTION_MARKET) {
    //--- for the MARKET execution mode
    //--- analyze order
    if (m_request.action != TRADE_ACTION_PENDING) {
      //--- in case of instant execution order
      //--- if the required filling policy is supported, add it to the request
      if ((filling& SYMBOL_FILLING_FOK) == SYMBOL_FILLING_FOK) {
        m_type_filling = ORDER_FILLING_FOK;
        m_request.type_filling = m_type_filling;
        return true;
      }
      if ((filling& SYMBOL_FILLING_IOC) == SYMBOL_FILLING_IOC) {
        m_type_filling = ORDER_FILLING_IOC;
        m_request.type_filling = m_type_filling;
        return true;
      }
      //--- wrong filling policy, set error code
      m_result.retcode = TRADE_RETCODE_INVALID_FILL;
      return false;
    }
    return true;
  }

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

      if ((filling& SYMBOL_FILLING_FOK) == SYMBOL_FILLING_FOK)

Я понимаю, когда таким образом передают по ссылке переменные, а здесь..

 
 
Rashid Umarov:
Смотрите Побитовые операции

А в таком варианте что производительность выше или как?

Ведь есть вариант в плане читабельности по комфортнее:

  ENUM_ORDER_TYPE_FILLING filling = (ENUM_ORDER_TYPE_FILLING)SymbolInfoInteger(_Symbol, SYMBOL_FILLING_MODE);
  Print("filling = ", EnumToString(filling));
  if ((filling& SYMBOL_FILLING_FOK) == SYMBOL_FILLING_FOK)
    Print("_УСЛОВИЕ ВЫПОЛНЕНО");
  if (filling == SYMBOL_FILLING_FOK)
    Print("УСЛОВИЕ ВЫПОЛНЕНО");

Идентично... И там и там ТРУ..

 
Вы все-таки почитайте по ссылке.
 
Rashid Umarov:
Вы все-таки почитайте по ссылке.

Да я прочитал и понял, что там написано. Но битовые операции это, скажем так, на любителя. Не каждый любит их использовать, и, тем более, мысли ими. Поэтому мне и интересно, если резон делать так, или это по скорости тоже самое, что и у меня..

Единственное, так это я не верно привёл к типу. А почему названия перечисления SYMBOL_FILLING_FOK, SYMBOL_FILLING_IOC и БЕЗ ИДЕНТИФИКАТОРА нет? Если это enum, значит должно же быть название, по идее.
 

При отправке ордера можно указать политику заполнения заявленного в торговом приказе объема. Допустимые варианты исполнения ордера по объему для каждого символа указаны таблице. Для каждого инструмента может быть установлен не один режим, а несколько через комбинацию флагов. Комбинация флагов выражается операцией логического ИЛИ (|), например, SYMBOL_FILLING_FOK|SYMBOL_FILLING_IOC.  Чтобы проверить разрешенность конкретного режима для инструмента, необходимо результат логического И (&) сравнить с флагом режима.

https://www.mql5.com/ru/docs/constants/environment_state/marketinfoconstants#symbol_filling_mode

Документация по MQL5: Стандартные константы, перечисления и структуры / Состояние окружения / Информация об инструменте
Документация по MQL5: Стандартные константы, перечисления и структуры / Состояние окружения / Информация об инструменте
  • www.mql5.com
Для получения текущей рыночной информации служат функции SymbolInfoInteger(), SymbolInfoDouble() и SymbolInfoString(). В качестве второго параметра этих функций допустимо передавать один из идентификаторов из перечислений ENUM_SYMBOL_INFO_INTEGER, ENUM_SYMBOL_INFO_DOUBLE и ENUM_SYMBOL_INFO_STRING соответственно. Некоторые символы (как...
 
SeriousRacoon:

https://www.mql5.com/ru/docs/constants/environment_state/marketinfoconstants#symbol_filling_mode

Хотя да, здесь приведением не обойтись. Вопрос снят..)

Благодарю всех за наводку.
 

hoz, вот Вам простой пример.

Допустим, что разрешено брокером 2 режима одновременно (FOK и IOC), а такое часто бывает. И даже три (+RETURN)...

В нашем примере получим разрешённый составной режим в виде переменной mode3, объединяющий два обычных. Пусть для торговой операции нужен режим FOK (переменная mode1).

   uint  mode1=SYMBOL_FILLING_FOK; // 1,   bin: 0000 0001
   uint mode2=SYMBOL_FILLING_IOC;  // 2,   bin: 0000 0010
   uint mode3=mode1|mode2;         // 3,   bin: 0000 0011
//--- неправильное сравнение
   if(mode3!=SYMBOL_FILLING_FOK)
      Print("Режим FOK не разрешён!");
//--- правильное сравнение
   if((mode3  &SYMBOL_FILLING_FOK)==SYMBOL_FILLING_FOK)
      Print("Режим FOK разрешён.");

Если не использовать побитовую операцию, то окажется, что в чистом виде FOK не проходит сравнение...

Ещё Вы в своём примере намутили с режимом для ордера и для символа.

  ENUM_ORDER_TYPE_FILLING filling = (ENUM_ORDER_TYPE_FILLING)SymbolInfoInteger(_Symbol, SYMBOL_FILLING_MODE);
  Print("filling = ", EnumToString(filling));
  if ((filling& SYMBOL_FILLING_FOK) == SYMBOL_FILLING_FOK)
    Print("_УСЛОВИЕ ВЫПОЛНЕНО");
  if (filling == SYMBOL_FILLING_FOK)
    Print("УСЛОВИЕ ВЫПОЛНЕНО");


Дело в том, что тут есть такой нюанс ещё:

SYMBOL_FILLING_FOK; // 1,   bin: 0000 0001
ORDER_FILLING_FOK;  // 0,   bin: 0000 0000
----------------------------------------------
SYMBOL_FILLING_IOC; // 2,   bin: 0000 0010
ORDER_FILLING_IOC;  // 1,   bin: 0000 0001
Приводить тут типы опасно.
 
Dennis Kirichenko:

Если не использовать побитовую операцию, то окажется, что в чистом виде FOK не проходит сравнение...

Загадочно как-то. Сказано же, что мол:

Побитовая операция И двоичных представлений x и y. Значение выражения содержит 1 (ИСТИНА) во всех разрядах, в которых и x, и y содержат не ноль; и 0 (ЛОЖЬ) во всех остальных разрядах.

Не ноль т.е. 1 содержится в том случае, когда в каждой части выражения будет не ноль. Как-то запутано. Возьмём наш случай:

   uint  mode1=SYMBOL_FILLING_FOK; // 1,   bin: 0000 0001
   uint mode2=SYMBOL_FILLING_IOC;  // 2,   bin: 0000 0010
   uint mode3=mode1|mode2;         // 3,   bin: 0000 0011
//--- неправильное сравнение
   if(mode3!=SYMBOL_FILLING_FOK)
      Print("Режим FOK не разрешён!");
//--- правильное сравнение
   if((mode3  &SYMBOL_FILLING_FOK)==SYMBOL_FILLING_FOK)
      Print("Режим FOK разрешён.");

Проверяется что mode3 имеет значение какое-нибудь (любое) т.е. не равняется нулю (или NULL), а SYMBOL_FILLING_FOK тоже имеет какое-нибудь значение? Ну с чего вдруг мы можем быть уверены что SYMBOL_FILLING_FOK присутствует в mode3 .

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