Apesar do fato de que o resultado da negociação do script é idêntico em ambas as plataformas, o OrderSelect funciona de forma diferente. Daí os diferentes registros.
O script é especialmente sugado, e não posso recomendar esse estilo de escrever a lógica de negociação, pois está repleto de erros lógicos difíceis de ver em cada plataforma. E esse código deixa de ser 100% idêntico na execução.
É por isso que parece inconveniente corrigir a biblioteca para que essas raras curvas do MT4 sejam executadas no MT5 de forma absolutamente perfeita, como acontece com o código normal.
Se eu estiver errado sobre a curvatura e a raridade de tais construções de negociação no MT4, por favor, esclareça.
Se houver dúvidas de que a lentidão do MT5 é causada pelo uso de uma biblioteca de terceiros, aqueles que desejarem podem reescrever a lógica simples do MT4 deste EA em MQL5 à sua maneira e testar a hipótese.
Um script que mostra uma peculiaridade da implementação do OrderSelect no modo SELECT_BY_POS+MODE_TRADES
O script é especialmente ruim, e não posso recomendar esse estilo de escrever a lógica de negociação
Com outro estilo altamente não recomendado de escrever a lógica de negociação, você pode se deparar com outro recurso do OrderSelect, mas já no modo SELECT_BY_TICKET+MODE_HISTORY.
#include <MT4Orders.mqh>
#define Ask (::SymbolInfoDouble(_Symbol, SYMBOL_ASK))
voidOnTick()
{
staticbool FirstRun = true;
if (FirstRun && OrderSelect(OrderSend(_Symbol, OP_BUY, 1, Ask, 0, 0, 0), SELECT_BY_TICKET) &&
OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 0))
{
Print(OrderTicket()); // 2 - A posição OPEN estava com esse tíquetePrint(OrderSelect(OrderTicket(), SELECT_BY_TICKET, MODE_HISTORY)); // falso, потому что тикет ЗАКРЫТОЙ позиции равен тикету закрывающей сделки.Print(OrderSelect(OrderTicket() + 1, SELECT_BY_TICKET, MODE_HISTORY)); // verdadeiro, pelo motivo acima.
FirstRun = false;
}
}
Este é um Expert Advisor para um testador. Nos comentários está o motivo desse comportamento. E ele está correto devido a
O ticket de uma posição aberta (como regra) é igual ao ticket da ordem de abertura (não uma negociação). (termos do MT5).
Se uma posição for parcialmente fechada, os tíquetes das posições correspondentes fechadas não devem ser iguais ao tíquete da posição aberta para evitar ambiguidade (termos do MT5).
Ou seja, o próprio MT5 é feito de forma tão "torta" que é difícil pensar em outro comportamento para o MT4Orders. É claro que, se você fizer o SELECT_BY_POS pelo histórico primeiro, registrando todos os tíquetes, o SELECT_BY_TICKET funcionará sem problemas.
Em geral, se a lógica de negociação do MT4 estiver "mal escrita", poderá haver discrepâncias entre os resultados do MT5+MT4Orders e os resultados do MT4 que são incomuns para a compreensão do MT4. Se você seguir o estilo "correto" de escrita do MT4, não serão detectados problemas na biblioteca.
Se você usar outro estilo altamente não recomendado de escrever a lógica de negociação, poderá se deparar com outro recurso do OrderSelect, mas já no modo SELECT_BY_TICKET+MODE_HISTORY.
Em geral, se a lógica de negociação do MT4 for escrita de forma "incorreta", poderá haver discrepâncias incomuns para a compreensão do MT4 entre os resultados do MT5+MT4Orders e do MT4. Se você se ater ao estilo "correto" de escrita do MT4, não encontrará nenhum problema na biblioteca.
A biblioteca é incrível, muito obrigado :) Depois de adicionar a sincronização de histórico, ela se tornou indispensável. Funciona rapidamente, mesmo com estratégias de alta velocidade
// Lista de modificações:// 14.06.2017:// Adicionar: a implementação da detecção de SL/TP de posições fechadas (fechadas via OrderClose) está ativada.// Adição: MagicNumber agora é do tipo long - 8 bytes (anteriormente era int - 4 bytes).// Adicionar: se em OrderSend, OrderClose ou OrderModify o parâmetro de entrada de cor (o mais recente) for definido como INT_MAX, ele será gerado.// a solicitação de negociação MT5 correspondente (MT4ORDERS::LastTradeRequest), mas ela NÃO será enviada. Em vez disso, ela será verificada pelo MT5,// O resultado estará disponível em MT4ORDERS::LastTradeCheckResult.// Se o OrderModify e o OrderClose forem bem-sucedidos, eles retornarão true, caso contrário, retornarão false.// O OrderSend retornará 0 se for bem-sucedido, caso contrário, retornará -1.//// Se o parâmetro de entrada de cor correspondente for definido como INT_MIN, SOMENTE em caso de verificação bem-sucedida do MT5 do// solicitação de negociação (como no caso de INT_MAX), ela será enviada.// Adição: adicionados análogos assíncronos das funções de negociação MQL4: OrderSendAsync, OrderModifyAsync, OrderCloseAsync, OrderDeleteAsync.// Retornar o Result.request_id correspondente se for bem-sucedido; caso contrário, 0.
O modo INT_MIN permite que você se livre completamente do entupimento dos registros do testador - isso é especialmente importante durante a otimização, pois, devido à lógica de negociação errônea, a abundância de mensagens pode reduzir o desempenho da otimização muitas vezes e, consequentemente, aumentar não apenas o tempo, mas também os custos financeiros (nuvem).
Também é conveniente ao posições fechadas.
Talvez um dia essa funcionalidade se torne padrão para o MT5.
Exemplo de uso de funções MQL4 assíncronas
#property script_show_inputssinputint Amount = 5; // Número de testes OrderSend(Async)#include <MT4Orders2.mqh>
#define AskSymbolInfoDouble(_Symbol, SYMBOL_ASK)
#define PRINT(A) Print(#A + " = " + (string)(A));
voidOnStart()
{
// OrderSendAsync constulong StartTime1 = GetMicrosecondCount();
for (int i = 0; i < Amount; i++)
PRINT(OrderSendAsync(NULL, OP_BUY, 0.1, Ask, 100, 0, 0))
PRINT(GetMicrosecondCount() - StartTime1)
// OrderSendconstulong StartTime2 = GetMicrosecondCount();
for (int i = 0; i < Amount; i++)
{
PRINT(OrderSend(NULL, OP_BUY, 0.1, Ask, 100, 0, 0))
Print(MT4ORDERS::LastTradeResult.comment);
}
PRINT(GetMicrosecondCount() - StartTime2)
PRINT(TerminalInfoInteger(TERMINAL_PING_LAST))
}
Sinais de negociação para o MetaTrader 5 com execução automática em sua conta
LCHI2017
MetaTrader 5
Free
O Expert Advisor opera com instrumentos de ações.
Um script que mostra uma peculiaridade da implementação do OrderSelect no modo SELECT_BY_POS+MODE_TRADES
MT4
MT5
Apesar do fato de que o resultado da negociação do script é idêntico em ambas as plataformas, o OrderSelect funciona de forma diferente. Daí os diferentes registros.
O script é especialmente sugado, e não posso recomendar esse estilo de escrever a lógica de negociação, pois está repleto de erros lógicos difíceis de ver em cada plataforma. E esse código deixa de ser 100% idêntico na execução.
É por isso que parece inconveniente corrigir a biblioteca para que essas raras curvas do MT4 sejam executadas no MT5 de forma absolutamente perfeita, como acontece com o código normal.
Se eu estiver errado sobre a curvatura e a raridade de tais construções de negociação no MT4, por favor, esclareça.
A biblioteca passou perfeitamente em um teste simples de correção.
É engraçado o fato de estarmos desacelerando.
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 01:11 pm.
Se houver dúvidas de que a lentidão do MT5 é causada pelo uso de uma biblioteca de terceiros, aqueles que desejarem podem reescrever a lógica simples do MT4 deste EA em MQL5 à sua maneira e testar a hipótese.Um script que mostra uma peculiaridade da implementação do OrderSelect no modo SELECT_BY_POS+MODE_TRADES
O script é especialmente ruim, e não posso recomendar esse estilo de escrever a lógica de negociação
Com outro estilo altamente não recomendado de escrever a lógica de negociação, você pode se deparar com outro recurso do OrderSelect, mas já no modo SELECT_BY_TICKET+MODE_HISTORY.
Este é um Expert Advisor para um testador. Nos comentários está o motivo desse comportamento. E ele está correto devido a
Ou seja, o próprio MT5 é feito de forma tão "torta" que é difícil pensar em outro comportamento para o MT4Orders. É claro que, se você fizer o SELECT_BY_POS pelo histórico primeiro, registrando todos os tíquetes, o SELECT_BY_TICKET funcionará sem problemas.
Em geral, se a lógica de negociação do MT4 estiver "mal escrita", poderá haver discrepâncias entre os resultados do MT5+MT4Orders e os resultados do MT4 que são incomuns para a compreensão do MT4. Se você seguir o estilo "correto" de escrita do MT4, não serão detectados problemas na biblioteca.
Se você usar outro estilo altamente não recomendado de escrever a lógica de negociação, poderá se deparar com outro recurso do OrderSelect, mas já no modo SELECT_BY_TICKET+MODE_HISTORY.
Em geral, se a lógica de negociação do MT4 for escrita de forma "incorreta", poderá haver discrepâncias incomuns para a compreensão do MT4 entre os resultados do MT5+MT4Orders e do MT4. Se você se ater ao estilo "correto" de escrita do MT4, não encontrará nenhum problema na biblioteca.
A biblioteca é incrível, muito obrigado :) Depois de adicionar a sincronização de histórico, ela se tornou indispensável. Funciona rapidamente, mesmo com estratégias de alta velocidade
Eu a adicionaria à entrega padrão do MT5
Atualização
O modo INT_MIN permite que você se livre completamente do entupimento dos registros do testador - isso é especialmente importante durante a otimização, pois, devido à lógica de negociação errônea, a abundância de mensagens pode reduzir o desempenho da otimização muitas vezes e, consequentemente, aumentar não apenas o tempo, mas também os custos financeiros (nuvem).
Também é conveniente ao posições fechadas.
Talvez um dia essa funcionalidade se torne padrão para o MT5.
Exemplo de uso de funções MQL4 assíncronas
Resultado