А в таком варианте что производительность выше или как?
Ведь есть вариант в плане читабельности по комфортнее:
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, SYMBOL_FILLING_IOC и БЕЗ ИДЕНТИФИКАТОРА нет? Если это enum, значит должно же быть название, по идее.При отправке ордера можно указать политику заполнения заявленного в торговом приказе объема. Допустимые варианты исполнения ордера по объему для каждого символа указаны таблице. Для каждого инструмента может быть установлен не один режим, а несколько через комбинацию флагов. Комбинация флагов выражается операцией логического ИЛИ (|), например, SYMBOL_FILLING_FOK|SYMBOL_FILLING_IOC. Чтобы проверить разрешенность конкретного режима для инструмента, необходимо результат логического И (&) сравнить с флагом режима.
https://www.mql5.com/ru/docs/constants/environment_state/marketinfoconstants#symbol_filling_mode
- www.mql5.com
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Приводить тут типы опасно.
Если не использовать побитовую операцию, то окажется, что в чистом виде 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 .
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
В стандартной библиотеке я увидел такой кусок кода:
Возник вопрос, зачем используется & в подобных местах?
Я понимаю, когда таким образом передают по ссылке переменные, а здесь..