devolve a política de execução. - página 2

 
Vladimir Karputov:

Exemplo da classe de comércio CTrade. Primeiro é verificado para'SYMBOL_FILLING_FOK', depois para'SYMBOL_FILLING_IOC'.


A verificação é feita utilizandoa operação 'AND bitwise'.

Bitwise E operação

O bitwise AND operação das representações binárias x e y. O valor da expressão contém 1 (VERDADEIRO) em todos os bits onde tanto x como y contêm não-zero; e 0 (FALSO) em todos os outros bits.


Exemplo:


Mais sobre as operações bitwise.

Então por este código a política de execução é ioc ou fok ou nenhuma das duas, então acontece que não pode haver duas ao mesmo tempo? Ou eu entendi errado novamente?
 
Afinal, não pode haver dois ao mesmo tempo? O que a função tem que retornar para que haja dois ao mesmo tempo?
 
Devo ter entendido mal sua resposta. Você quis dizer em geral, não em relação a uma conta comercial. Obrigado por sua ajuda.
 
Ivan_Invanov:
Afinal não pode haver dois ao mesmo tempo? O que a função deve retornar para que haja dois ao mesmo tempo?
Pode ser 2, então a função retornará 3. MAS¡¡¡¡¡ Esta é uma situação atípica. Considerando que existem apenas 3 opções, poderia ser 1, 2 ou a soma de 1+2. É a soma, não a terceira opção. Portanto, a verificação com uma operação um pouco mais simples só pode responder à pergunta: Pode esta ou aquela política de preenchimento ser aplicada.
 
Ivan_Invanov:
Afinal não pode haver dois ao mesmo tempo? O que a função deve retornar para que haja dois ao mesmo tempo?

Exemplo de verificações de dois caracteres do servidor 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

Veja as especificações (preenchimento) para estes símbolos:



e aqui está uma variante mais comum: quando todos os preenchimentos estão disponíveis para um símbolo

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

e especificação


 
Obrigado.
 
Alexey Viktorov:
Poderia ser 2, então a função retornará 3. MAS¡¡¡¡¡ Esta é uma situação atípica. Considerando que existem apenas 3 opções, poderia ser 1, 2 ou a soma de 1+2. É a soma, não a terceira opção. Portanto, a verificação com uma operação um pouco mais simples só pode responder à pergunta: Pode esta ou aquela política de preenchimento ser aplicada.
ainda não entendem como uma variável pode retornar dois termos. E se devolver um valor de 3 como um membro, as operações bitwise não funcionarão. Decidi apenas escolher o modo EXECUTION_INSTANT e sempre terei uma política FOK .
 
Ivan_Invanov:
Eu ainda não entendo como uma variável pode retornar dois membros. E se ele devolver um membro como 3, então as operações bitwise não funcionarão. Decidi apenas escolher o modo EXECUTION_INSTANT e sempre terei uma política FOK .

Para entender isso, é preciso entender o que são bandeiras.

Cada valor seguinte de uma bandeira é o valor da bandeira anterior multiplicado por 2. Isto é, 1, 2, 4, 8, 16, 32......... Portanto, se o valor for 33, significa que este valor contém apenas 1 e 32. Da mesma forma, se o valor for 18, ele só pode ser composto de 16 e 2. E o valor 3 só pode ser composto de 1 e 2.

Portanto, as operações bitwise estão apenas verificando se o valor verificado está presente na soma das bandeiras. Se você verificar se um número arbitrário está incluído em 18, você recebe um número falso, exceto para verificar os valores 2 e 16.

 
Alexey Viktorov:

Para entender isso, é preciso entender o que são bandeiras.

Cada valor seguinte de uma bandeira é o valor da bandeira anterior multiplicado por 2. Isto é, 1, 2, 4, 8, 16, 32......... Portanto, se o valor for 33, significa que este valor contém apenas 1 e 32. Da mesma forma, se o valor for 18, ele só pode ser composto de 16 e 2. E o valor 3 só pode ser composto de 1 e 2.

Portanto, as operações bitwise estão apenas verificando se o valor verificado está presente na soma das bandeiras. Se você verificar se um número arbitrário está incluído em 18, você receberá um número falso, exceto para verificar os valores 2 e 16.

Sim, eu entendo como trabalhar com dígitos binários.

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

A partir deste código, por exemplo, a função retorna 3 .

(11&1)==1 ; 11===01 não, isso é falso, não funcionou.

Eu estava apenas escrevendo isto e pensei que talvez eu tivesse entendido mal as operações.

e isso significa que converto valores decimais em binários e faço uma pequena conjunção.

== verdadeiro quando o primeiro termo é igual ao segundo termo. Isto é correto?

 
Ahhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh, finalmente está chegando lá. Se há um valor em um dígito, é uma bandeira verdadeira e o trigêmeo coloca o valor em ambos os dígitos. Somente por que este código funciona então?
Razão: