возвращает политику исполнения. - страница 2

 
Vladimir Karputov:

Пример из торгового класса CTrade. Сначала проверяется на 'SYMBOL_FILLING_FOK', затем на 'SYMBOL_FILLING_IOC'


Проверка производится при помощи 'Побитовая операция И'

Побитовая операция И

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


Пример:


Ещё о побитовых операциях.

Ну так по этому коду политика исполнения либо ioc либо fok либо ни одна из них, и получается, что две быть не может одновременно? Или я опять не понял?
 
Может две одновременно быть не может всё таки? что должна вернуть функция, чтобы были две одновременно?
 
Я просто не так понял ваш ответ наверно. Вы имели ввиду вообще, а не применительно к одному торговому счёту. Спасибо за помощь.
 
Ivan_Invanov:
Может две одновременно быть не может всё таки? что должна вернуть функция, чтобы были две одновременно?
Может быть и 2, тогда функция вернёт 3. НО¡¡¡¡¡ Это нетипичная ситуация. Учитывая что вариантов только 3, то может быть 1, 2 или сумма 1+2. Именно сумма, а не третий вариант. Поэтому проверка с помощью побитовой операции может дать ответ только на вопрос: Можно-ли применить ту или иную политику заполнения.
 
Ivan_Invanov:
Может две одновременно быть не может всё таки? что должна вернуть функция, чтобы были две одновременно?

Пример проверок для двух символов с сервера MetaQuotes-Demo:

2020.07.19 07:35:07.922 Info_FILLING (USDRUB,H1)        MetaQuotes-Demo
2020.07.19 07:35:07.922 Info_FILLING (USDRUB,H1)        Fill or Kill, SYMBOL_FILLING_FOK: false
2020.07.19 07:35:07.922 Info_FILLING (USDRUB,H1)        Immediate or Cancel, SYMBOL_FILLING_IOC: true
2020.07.19 07:35:07.922 Info_FILLING (USDRUB,H1)        Return: true
2020.07.19 07:35:07.922 Info_FILLING (USDRUB,H1)        Flags of allowed order filling modes: SYMBOL_TRADE_EXECUTION_INSTANT
2020.07.19 07:35:07.922 Info_FILLING (USDRUB,H1)        
2020.07.19 07:35:45.291 Info_FILLING (EURUSD,H1)        MetaQuotes-Demo
2020.07.19 07:35:45.291 Info_FILLING (EURUSD,H1)        Fill or Kill, SYMBOL_FILLING_FOK: true
2020.07.19 07:35:45.291 Info_FILLING (EURUSD,H1)        Immediate or Cancel, SYMBOL_FILLING_IOC: false
2020.07.19 07:35:45.291 Info_FILLING (EURUSD,H1)        Return: true
2020.07.19 07:35:45.291 Info_FILLING (EURUSD,H1)        Flags of allowed order filling modes: SYMBOL_TRADE_EXECUTION_INSTANT

Смотрим спецификации (заливку) по этим символам:

  


а вот более распространённый вариант: когда для символа доступны все заливки

2020.07.19 07:40:22.818 Info_FILLING (NZDUSD,H1)        MetaQuotes-Demo
2020.07.19 07:40:22.818 Info_FILLING (NZDUSD,H1)        Fill or Kill, SYMBOL_FILLING_FOK: true
2020.07.19 07:40:22.818 Info_FILLING (NZDUSD,H1)        Immediate or Cancel, SYMBOL_FILLING_IOC: true
2020.07.19 07:40:22.818 Info_FILLING (NZDUSD,H1)        Return: true
2020.07.19 07:40:22.818 Info_FILLING (NZDUSD,H1)        Flags of allowed order filling modes: SYMBOL_TRADE_EXECUTION_INSTANT

и спецификация


 
спасибо.
 
Alexey Viktorov:
Может быть и 2, тогда функция вернёт 3. НО¡¡¡¡¡ Это нетипичная ситуация. Учитывая что вариантов только 3, то может быть 1, 2 или сумма 1+2. Именно сумма, а не третий вариант. Поэтому проверка с помощью побитовой операции может дать ответ только на вопрос: Можно-ли применить ту или иную политику заполнения.
всё равно не понял, как одна переменная может вернуть два члена. А если она вернет одним членом значение 3, то побитовые операции не сработают. Я решил просто выбрать режим EXECUTION_INSTANT, и у меня всегда будет политика FOK.
 
Ivan_Invanov:
всё равно не понял, как одна переменная может вернуть два члена. А если она вернет одним членом значение 3, то побитовые операции не сработают. Я решил просто выбрать режим EXECUTION_INSTANT, и у меня всегда будет политика FOK.

Чтобы понять надо разобраться что такое флаги.

Каждое следующее значение флага есть значение предыдущего умноженное на 2. То-есть 1, 2, 4, 8, 16, 32……… Так вот если значение будет 33 это означает что в этом значении присутствуют только 1 и 32. Так-же если значение 18 можно составить только из 16 и 2. И уже затронутое 3 можно составить только из 1 и 2.

Так вот побитовые операции как раз проверяют присутствует-ли проверяемое значение в сумме флагов. Если вы будете проверять входит-ли произвольное число в 18 вы получите false за исключением проверки значений 2 и 16.

 
Alexey Viktorov:

Чтобы понять надо разобраться что такое флаги.

Каждое следующее значение флага есть значение предыдущего умноженное на 2. То-есть 1, 2, 4, 8, 16, 32……… Так вот если значение будет 33 это означает что в этом значении присутствуют только 1 и 32. Так-же если значение 18 можно составить только из 16 и 2. И уже затронутое 3 можно составить только из 1 и 2.

Так вот побитовые операции как раз проверяют присутствует-ли проверяемое значение в сумме флагов. Если вы будете проверять входит-ли произвольное число в 18 вы получите false за исключением проверки значений 2 и 16.

Да, я понимаю как работать с разрядами двоичной системы.

   uint filling=(uint)SymbolInfoInteger(symbol,SYMBOL_FILLING_MODE);
   if((filling&SYMBOL_FILLING_FOK)==SYMBOL_FILLING_FOK)
     {
      m_type_filling=ORDER_FILLING_FOK;

Из этого кода выходит, например функция вернула 3 . 

(11&1)==1 ; 11==01 нет, это ложь, не сработало.

Я сейчас это писал и подумал, может я неправильно понимаю операции.

& это значит, я перевожу десятичные значения в двоичные и делаю побитово конъюнкцию.

== истина, когда первый член равен второму члену. Всё так?

 
ААААА дошло наконец. Если в разряде значение, то это флаг истина, и тройка выставляет значение в оба разряда. Только а почему этот код тогда работает?
Причина обращения: