Discussão do artigo "Os Expert Advisors prontos a partir do Assistente MQL5 funcionam no MetaTrader 4"
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.
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.
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
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)
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.
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.
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
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);
}
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.
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Você concorda com a política do site e com os termos de uso
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
Autor: Stanislav Korotky