Discussão sobre a implementação dos conselheiros. - página 2

 
Georgiy Merts:

Além disso, o próprio forumista, ao fazer a pergunta, disse que não se lembra mais, apenas que este código já foi testado muitas vezes e pode ser confiado.

Bem, se eu conseguir substituir essas estúpidas "perguntas" por declarações reais, eu vou descobrir... Por enquanto...

A propósito, hoje, dei uma olhada nesse horror.

Eis o que isso significa:

ENUM_ORDER_TYPE_FILLING otfMyRes  = WRONG_VALUE;   

if(iFillingMode == 0 || (otfFilingType >= ORDER_FILLING_RETURN) || ((iFillingMode & (otfFilingType + 1)) != otfFilingType + 1))
	{
        if(steExeMode == SYMBOL_TRADE_EXECUTION_EXCHANGE || steExeMode == SYMBOL_TRADE_EXECUTION_INSTANT)
                otfMyRes = ORDER_FILLING_RETURN;
        else   
                if(iFillingMode == SYMBOL_FILLING_IOC)
                        otfMyRes = ORDER_FILLING_IOC;
                else
                        otfMyRes = ORDER_FILLING_FOK;
        }
   else      
        otfMyRes = otfFilingType;

return(otfMyRes);  

Na minha opinião, é muito mais claro sem estas "perguntas", através de "se" e com recuo. Embora a eficiência do código seja absolutamente a mesma.

A propósito, você pode ver imediatamente que o autor se prendeu aos valores numéricos do iFillingMode e do otfilingType, o que, na minha opinião, não é uma boa prática.

 
Georgiy Merts:

A propósito, hoje, dei uma olhada nesse horror.

Eis o que isso significa:

Na minha opinião, é muito mais claro sem estas "perguntas", através de "se" e com travessões. Embora a eficiência do código seja absolutamente a mesma.

A propósito, você pode ver imediatamente que o autor se prendeu aos valores numéricos do iFillingMode e do otfilingType, o que, na minha opinião, não é uma boa prática.

Na minha liberdade é assim:

#ifdef __MQL5__
   ENUM_ORDER_TYPE_FILLING COrder::GetFilling(ENUM_FILLING_MODE mFilling){
      if (!_fillingMode) return ORDER_FILLING_RETURN;
      else if (mFilling==FILLING_AUTO||mFilling==FILLING_FOK) return !(_fillingMode&SYMBOL_FILLING_FOK)?ORDER_FILLING_IOC:ORDER_FILLING_FOK;
      else return  !(_fillingMode&SYMBOL_FILLING_IOC)?ORDER_FILLING_FOK:ORDER_FILLING_IOC;}
#endif

O modo de preenchimento é uma macro que se expande para o desreferenciamento deste campo.

fillingMode=(int)SymbolInfoInteger(symbol,SYMBOL_FILLING_MODE);
 
Georgiy Merts:

Isso é outra coisa.

Pensando bem, às vezes eu olho para meu próprio código e não entendo porque ele está escrito neste lugar em particular. É por isso que eu tento comentar tais lugares em grandes detalhes, tentando mencionar todos os detalhes. Mas ainda vejo regularmente que não tenho considerado algumas coisas.

Além disso, utilizo o seguinte código (para determinar o tipo de execução), que foi escrito por um usuário muito autoritário do fórum:

Além disso, o próprio forumista disse quando lhe perguntaram que não se lembra mais, é que este código já foi testado muitas vezes e pode ser confiável .

Bem, se eu conseguir substituir essas estúpidas "perguntas" por declarações reais, eu vou descobrir... Por enquanto...

Amarelo - muito estranho que uma pessoa não possa compreender imediatamente o código trivial que ela mesma escreveu.

Vermelho - Eu não estava muito preguiçoso e verifiquei novamente, ao executar no mercado, eu não posso ORDER_FILLING_RETURN, é apenas para estoque (há um erro nas docas), e isto é o que o respeitado dono do fórum retornou))))

 
Vladimir Simakov:

Amarelo - é muito estranho que uma pessoa não consiga entender um código trivial, que ela mesma escreveu.

Vermelho - Eu não me senti preguiçoso e verifiquei novamente, ao executar no mercado, você não pode ORDER_FILLING_RETURN, é apenas para troca (há um erro nas docas), e é isso que o respeitado membro do fórum retorna)))

Eu não sei, eu não sei. como este código é "trivial" em tal entrada. Demorei pelo menos 15 minutos para descobrir sua lógica, e somente escrevendo o "se" fez sentido para mim.

E sobre "há um erro nos documentos" - você pode explicar melhor isso?

 
Georgiy Merts:

Não sei, não sei quão "trivial" este código é em um posto como este. Levei pelo menos 15 minutos para entender a lógica de seu trabalho, e só escrevendo os "se" é que isso se tornou claro para mim.

E sobre "em erro nas docas" - você pode me dizer mais sobre isso?

Na execução da troca

SymbolInfoInteger(symbol,SYMBOL_FILLING_MODE)

retorna 0, mas no mercado (eu verifiquei na Alpari)

SYMBOL_FILLING_IOC | SYMBOL_FILLING_FOK

Eu verifiquei com a Alpari e ela retorna 0x3. Se você tentar desta forma

MqlTradeRequest::filling_mode=ORDER_FILLING_RETURN

Se você tentar, ela não abrirá.

 
Vladimir Simakov:

então não abrirá.

Verifiquei a função original.

#include <MT4Orders.mqh>

#define  Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

void OnTick()
{
  if (!OrdersTotal())
  {
    OrderSend(_Symbol, OP_BUY, 0.1, Ask, ORDER_FILLING_FOK, 0, 0);    
    OrderSend(_Symbol, OP_BUY, 0.1, Ask, ORDER_FILLING_IOC, 0, 0);    
    OrderSend(_Symbol, OP_BUY, 0.1, Ask, ORDER_FILLING_RETURN, 0, 0);    
  }  
}

Funciona.

 
fxsaber:

Verifiquei a função original.

Funciona.

Tente na execução do mercado e não na execução de câmbio)

UPD: correção, na execução imediata, daquela que

SÍMBOLO_COMÉRCIO_EXECUÇÃO_INSTANTE

 
Vladimir Simakov:

Tentar a execução no mercado em vez da execução de câmbio)

UPD: correção, na execução imediata, daquela que

SÍMBOLO_COMÉRCIO_EXECUÇÃO_INSTANTE

Teste EA acima. Experimente.

 
Vladimir Simakov:

Tentar a execução no mercado em vez da execução de câmbio)

UPD: correção, na execução imediata, daquela que

SÍMBOLO_COMÉRCIO_EXECUÇÃO_INSTANTE

Estas são, por exemplo, contas tipo padrão no A-ri, certo?

E os corretores que negociam sempre têm esse tipo de execução, certo?

Apenas para esclarecer.

 

Por que se preocupar?

Use classes padrão e não precisa preencher nenhuma estrutura(MqlTradeRequest) e não precisa conhecer nenhum preenchimento e instantâneos:


#include<Trade\SymbolInfo.mqh>
#include<Trade\AccountInfo.mqh>
#include<Trade\Trade.mqh>

CTrade  
CAccountInfo 
CPositionInfo 
Razão: