Discussão do artigo "Os Expert Advisors prontos a partir do Assistente MQL5 funcionam no MetaTrader 4"

 

Novo artigo Os Expert Advisors prontos a partir do Assistente MQL5 funcionam no MetaTrader 4 foi publicado:

No artigo, propõe-se um emulador simples do ambiente de negociação MetaTrader 5 para o MetaTrader 4. Com sua ajuda é possível transferir e adaptar as classes de negociação da biblioteca padrão. Como resultado, os EAs gerados no Assistente do MetaTrader 5 podem ser compilados e executados sem alterações no MetaTrader 4.

Executamos o Expert Advisor compilado - com configurações por padrão - no testador do MetaTrader 4.

Relatório de teste MetaTrader 4 para o Expert Advisor gerado no MetaTrader 5

Relatório de teste MetaTrader 4 para o Expert Advisor gerado no MetaTrader 5

Autor: Stanislav Korotky

 

Para o autor Obrigado!

Os usuários do MT4 instalarão o MT5 pelo menos por causa do Wizard - marketing inteligente? Apenas parcialmente.

Agora o artigo satisfaz a curiosidade dos programadores - como ele é implementado? Mas não dos usuários.

O marketing exige outro artigo de outro nível, no qual será descrito passo a passo o que pressionar para fazer o Wizard funcionar no MT4.

Então, os usuários começarão a compartilhar sua experiência nesse negócio com outros como eles. Ou eu não entendo nada de marketing.

 
fxsaber:

Para o autor Obrigado!

Os usuários do MT4 instalarão o MT5 pelo menos por causa do Wizard - marketing inteligente? Apenas parcialmente.

Agora o artigo satisfaz a curiosidade dos programadores - como ele é implementado? Mas não dos usuários.

O marketing exige outro artigo de outro nível, no qual será descrito passo a passo o que pressionar para fazer o Wizard funcionar no MT4.

Então, os usuários começarão a compartilhar sua experiência nesse negócio com outros como eles. Ou eu não entendo nada de marketing.

Escrever não é um problema. Mas é improvável que seja um artigo. De fato, essas informações já estão no artigo e ocupam alguns parágrafos.

Para fins de precisão, gostaria de salientar que o assistente NÃO funcionará no MT4; esse assistente está disponível apenas no MT5. Os Expert Advisors gerados devem funcionar, mas provavelmente não todos eles.

 

Para fins de comparação, sugiro fazer uma avaliação do Tick Data Suite (Compatível: MT4 build 940 - 1052).

No testador do MT5, selecione o modo "by real ticks" (por ticks reais). Salve-os e envie-os para o testador do MT4 via TDS.

Em seguida, as cotações em ambos os testadores coincidirão 100%, o que permitirá compará-las não apenas por negociações, mas também por velocidade.

Poderíamos então comparar a conversão/criação de EAs em ambas as direções.

 

Existe um fenômeno como a publicação de EAs no kodobase como resultado da conversão MT4 -> MT5 via SB.

Parece que o artigo pode ser usado por esses autores para autoverificação. Se a conversão estiver correta, uma conversão reversa via MT5Bridge deverá fornecer um resultado idêntico ao original do MT4.

 
fxsaber:

Existe um fenômeno como a publicação de EAs no kodobase como resultado da conversão MT4 -> MT5 via SB.

Parece que o artigo pode ser usado por esses autores para autoverificação. Se a conversão estiver correta, uma conversão reversa via MT5Bridge deverá fornecer um resultado idêntico ao original do MT4.

Fórum sobre negociação, sistemas de negociação automatizados e teste de estratégias de negociação

Testador MT4 VS Testador MT5

fxsaber, 2017.05.08 15:12

Converti seu código para MT4 via MT5Bridge. MT4build1072

EURUSD,M1: 1865415 tick events (7292 bars, 1865515 bar states) processed in 0:00:07.645 (total time 0:00:08.362)


Código original

EURUSD,M1: 1865415 tick events (7292 bars, 1865515 bar states) processed in 0:00:03.744 (total time 0:00:04.493)


Os resultados após a conversão são idênticos! A velocidade caiu pela metade.

 

Meu EA MT5 (gerado, mas com sua própria implementação do CExpertSignal em vez dos indicadores padrão) com suas inclusões foi compilado e testado no MT4 sem problemas, obrigado!

Mas agora enviei o Expert Advisor para a realidade e descobri que ele não está operando. Não há erros, nada aparece. Ele simplesmente não opera. Passei muito tempo pesquisando o código e encontrei o motivo - a função bool CTrade::FillingCheck(const string symbol) em Trade.mqh.

Essa verificação é acionada para ordens de mercado.

// obter possíveis tipos de política de preenchimento por símbolo
  uint filling = (uint)SymbolInfoInteger(symbol, SYMBOL_FILLING_MODE);
  // verificar novamente o modo de execução
  if(exec == SYMBOL_TRADE_EXECUTION_MARKET)
  {
    // para o modo de execução MARKET
    // analisar a ordem
    if(m_request.action != TRADE_ACTION_PENDING)
    {
      // no caso de uma ordem de execução instantânea
      // se a política de preenchimento necessária for compatível, adicione-a à solicitação
      if(m_type_filling == ORDER_FILLING_FOK && (filling & SYMBOL_FILLING_FOK) != 0)
      {
        m_request.type_filling = m_type_filling;
        return(true);
      }
      if(m_type_filling == ORDER_FILLING_IOC && (filling & SYMBOL_FILLING_IOC) != 0)
      {
        m_request.type_filling = m_type_filling;
        return(true);
      }
      // política de preenchimento incorreta, definir código de erro
      m_result.retcode = TRADE_RETCODE_INVALID_FILL;
      return(false);
    }
    return(true);
  }

No meu caso, tanto m_type_filling quanto filling são iguais a zero, portanto a função retorna false.
filling pela lógica do código não deve ser igual a zero, mas, de acordo com a ajuda, SymbolInfoInteger(symbol, SYMBOL_FILLING_MODE) não é compatível com o MT4. É por isso que, no testador, a verificação é aprovada por algum motivo e, talvez, em algumas corretoras, na negociação real também. Mas não funcionou para mim. Até agora, apenas alterei a função para ignorar todo o código e retornar true da função.

 
Dr. Trader:

Essa verificação funciona para ordens de mercado.

No meu caso, tanto m_type_filling quanto filling são iguais a zero, portanto a função retorna false.
filling pela lógica do código não deve ser igual a zero, mas, de acordo com a ajuda, SymbolInfoInteger(symbol, SYMBOL_FILLING_MODE) não é compatível com o MT4. É por isso que, no testador, a verificação é aprovada por algum motivo e, talvez, em algumas corretoras, na negociação real também. Mas não funcionou para mim. Até agora, apenas alterei a função para ignorar todo o código e retornar true da função.

Obrigado pela mensagem. Eu não tinha me deparado com isso. Esse método não foi alterado. Aparentemente, é necessário definir todas as variáveis de preenchimento como constantes específicas, dependendo do tipo de ordem e/ou instrumento (provavelmente, isso não pode ser obtido por meio da API de forma alguma, e o testador usa alguns padrões). Se alguém souber como o MT4 seleciona o preenchimento internamente, por favor, compartilhe.

 
Stanislav Korotky:

Se alguém souber como o MT4 seleciona internamente o preenchimento, compartilhe.

Fórum sobre negociação, sistemas de negociação automatizados e teste de estratégias de negociação

Peculiaridades da linguagem mql5, sutilezas e técnicas de trabalho

fxsaber, 2017.02.25 16:12

// Retorna o tipo de execução da ordem igual a Type se estiver disponível no Symb, caso contrário, está correto.
ENUM_ORDER_TYPE_FILLING GetFilling( const string Symb, const uint Type = ORDER_FILLING_FOK )
{
  const ENUM_SYMBOL_TRADE_EXECUTION ExeMode = (ENUM_SYMBOL_TRADE_EXECUTION)::SymbolInfoInteger(Symb, SYMBOL_TRADE_EXEMODE);
  const int FillingMode = (int)::SymbolInfoInteger(Symb, SYMBOL_FILLING_MODE);

  return((FillingMode == 0 || (Type >= ORDER_FILLING_RETURN) || ((FillingMode & (Type + 1)) != Type + 1)) ?
         (((ExeMode == SYMBOL_TRADE_EXECUTION_EXCHANGE) || (ExeMode == SYMBOL_TRADE_EXECUTION_INSTANT)) ?
           ORDER_FILLING_RETURN : ((FillingMode == SYMBOL_FILLING_IOC) ? ORDER_FILLING_IOC : ORDER_FILLING_FOK)) :
          (ENUM_ORDER_TYPE_FILLING)Type);
}
Aplicativo
Request.type_filling = GetFilling(Request.symbol);
Não verifiquei se o bug com ordens de parada foi corrigido.
 
fxsaber:

Obrigado, esse código pode ser ligeiramente modificado para obter um análogo de SymbolInfoInteger(symbol, SYMBOL_FILLING_MODE) para MT4. A função não deve retornar ENUM_ORDER_TYPE_FILLING, mas (SYMBOL_FILLING_FOK | SYMBOL_FILLING_IOC).

ORDER_FILLING_FOK = 0, ORDER_FILLING_IOC = 1, enquanto SYMBOL_FILLING_FOK = 1 e SYMBOL_FILLING_IOC = 2, portanto, você pode simplesmente incrementar o resultado em 1.

//função retorna o modo de preenchimento do símbolo, também conhecido como SymbolInfoInteger(symbol, SYMBOL_FILLING_MODE) para MT4.
//Parameter Type - tipo de preenchimento do pedido
uint GetSymbolFilling( const string Symb, const uint Type = ORDER_FILLING_FOK )
{
  const ENUM_SYMBOL_TRADE_EXECUTION ExeMode = (ENUM_SYMBOL_TRADE_EXECUTION)::SymbolInfoInteger(Symb, SYMBOL_TRADE_EXEMODE);
  const int FillingMode = (int)::SymbolInfoInteger(Symb, SYMBOL_FILLING_MODE);

  return ((FillingMode == 0 || (Type >= ORDER_FILLING_RETURN) || ((FillingMode & (Type + 1)) != Type + 1)) ?
         (((ExeMode == SYMBOL_TRADE_EXECUTION_EXCHANGE) || (ExeMode == SYMBOL_TRADE_EXECUTION_INSTANT)) ?
           ORDER_FILLING_RETURN : ((FillingMode == SYMBOL_FILLING_IOC) ? ORDER_FILLING_IOC : ORDER_FILLING_FOK)) :
          (ENUM_ORDER_TYPE_FILLING)Type) + 1;
}

E, em seguida, chamar o código na função bool CTrade::FillingCheck(const string symbol)

uint filling = GetSymbolFilling(symbol, m_type_filling);
//em vez de
//uint filling = (uint)SymbolInfoInteger(symbol, SYMBOL_FILLING_MODE);


Mas, na verdade, é apenas um ajuste de código para que funcione. É melhor não fazer isso e encontrar uma solução correta.

 

Bom dia, Sr. Stanislav Korotky, espero que esteja indo bem.

Achei seu artigo muito interessante e tentei seguir suas instruções sobre como fazer com que um EA MT5 pronto seja compatível para ser executado no MT4.

Mas estou recebendo o seguinte erro. Você poderia me orientar sobre como resolver o erro?

O que fiz depois de seguir suas instruções foi: Apenas copiei o arquivo de origem MQL5 e o programa MQL5 e depois colei no diretório principal da pasta Expert

e recebi muitos erros.

Você poderia me dizer como posso proceder para fazer com que o EA gerado pela MQL5 funcione no MT4?

Abaixo estão as imagens de erro anexadas.

Arquivos anexados:
Capture_1.PNG  52 kb
Capture_2.PNG  53 kb
Capture_3.PNG  56 kb
Capture_4.PNG  51 kb
Capture_5.PNG  59 kb
Capture_6.PNG  22 kb