A pesar de que el resultado de trading del script es idéntico en ambas plataformas, OrderSelect funciona de forma diferente. De ahí los diferentes registros.
El script está especialmente escrito, y no puedo recomendar este estilo de escribir lógica de trading, ya que está plagado de errores lógicos difíciles de ver en cada plataforma. Y tal código deja de ser 100% idéntico en la ejecución.
Por eso no parece conveniente corregir la librería para que esas curvas raras de MT4 se ejecuten en MT5 de forma absolutamente perfecta, como ocurre con el código normal.
Si estoy equivocado en cuanto a la curvatura y rareza de tales construcciones de trading en MT4, por favor, acláremelo.
Si hay dudas de que la ralentización de MT5 se deba al uso de una librería de terceros, quien lo desee puede reescribir la lógica simple de MT4 de este EA en MQL5 a su gusto y probar la hipótesis.
Un script que muestra una peculiaridad de la implementación de OrderSelect en modo SELECT_BY_POS+MODE_TRADES
El script está especialmente chupado, y no puedo recomendar este estilo de escribir lógica de trading
Con otro estilo muy poco recomendable de escribir la lógica de trading, te puedes encontrar con otra característica de OrderSelect, pero ya en 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 - posición ABIERTA fue con este billetePrint(OrderSelect(OrderTicket(), SELECT_BY_TICKET, MODE_HISTORY)); // falso, потому что тикет ЗАКРЫТОЙ позиции равен тикету закрывающей сделки.Print(OrderSelect(OrderTicket() + 1, SELECT_BY_TICKET, MODE_HISTORY)); // verdadero, por la razón anterior.
FirstRun = false;
}
}
Este es un Asesor Experto para un probador. En los comentarios está la razón de este comportamiento. Y es correcto debido a
El ticket de una posición abierta (por regla general) es igual al ticket de la orden de apertura (no de una operación). (Términos MT5).
Si una posición se cierra parcialmente, los tickets de las posiciones correspondientes cerradas no deben ser iguales al ticket de la posición abierta para evitar ambigüedades. (Términos MT5).
Es decir, la propia MT5 está hecha tan "torticeramente" que es difícil pensar en otro comportamiento para MT4Orders. Por supuesto, si haces SELECT_BY_POS por historial primero, registrando todos los tickets, entonces SELECT_BY_TICKET funcionará sin problemas.
En general, si la lógica de trading de MT4 está escrita "mal", puede haber discrepancias entre MT5+MT4Orders y los resultados de MT4, que son inusuales para la comprensión de MT4. Si se sigue el estilo de escritura "correcto" de MT4, no se habrán detectado problemas en la librería.
Si utiliza otro estilo muy poco recomendable de escribir la lógica de operación, puede encontrarse con otra característica de OrderSelect, pero ya en modo SELECT_BY_TICKET+MODE_HISTORY.
En general, si la lógica de trading de MT4 está escrita "mal", puede haber discrepancias no acostumbradas para MT4 entre MT5+MT4Orders y los resultados de MT4. Si te ciñes al estilo de escritura "correcto" de MT4, no encontrarás ningún problema en la librería.
La librería es impresionante, muchas gracias :) Después de añadir la sincronización de la historia es indispensable. Funciona rápido incluso para estrategias hft
// Lista de cambios:// 14.06.2017:// Añadir: Se habilita la implementación de la detección SL/TP de posiciones cerradas (cerradas mediante OrderClose).// Añadir: MagicNumber es ahora de tipo long - 8 bytes (antes era int - 4 bytes).// Añadir: Si en OrderSend, OrderClose o OrderModify el parámetro de entrada de color (el más reciente) se establece igual a INT_MAX, se generará.// la solicitud de operación MT5 correspondiente (MT4ORDERS::LastTradeRequest), pero NO se enviará. En su lugar, se comprobará MT5,// cuyo resultado estará disponible en MT4ORDERS::LastTradeCheckResult.// Si OrderModify y OrderClose tienen éxito, devolverán true, en caso contrario devolverán false.// OrderSend devolverá 0 si tiene éxito, en caso contrario -1.//// Si el parámetro de entrada de color correspondiente se establece como INT_MIN, SÓLO en caso de que MT5 compruebe con éxito el valor generado// solicitud comercial (como en el caso de INT_MAX) se enviará.// Añadir: Añadidos análogos asíncronos de las funciones de trading de MQL4: OrderSendAsync, OrderModifyAsync, OrderCloseAsync, OrderDeleteAsync.// Devuelve el Result.request_id correspondiente si tiene éxito, en caso contrario 0.
El modo INT_MIN le permite deshacerse por completo de la saturación de los registros del comprobador - es especialmente crítico durante la optimización, porque debido a una lógica comercial errónea, los mensajes abundantes pueden reducir el rendimiento de la optimización muchas veces y, en consecuencia, aumentar no sólo el tiempo sino también los costes monetarios (Nube).
También es conveniente a la hora de posiciones cerradas.
Quizás algún día esta funcionalidad se convierta en estándar para MT5.
Ejemplo de uso de funciones asíncronas MQL4
#property script_show_inputssinputint Amount = 5; // Número de prueba 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))
}
Para iniciar sesión y usar el sitio web MQL5.com es necesario permitir el uso de Сookies.
Por favor, active este ajuste en su navegador, de lo contrario, no podrá iniciar sesión.
Ha iniciado sesión. La autenticación de dos factores se ha desactivado. Vuelva a configurarla y escanee un nuevo código QR, o continúe con la autenticación de dos factores desactivada.
Señales comerciales para MetaTrader 5 con ejecución automática en su cuenta
LCHI2017
MetaTrader 5
Gratis
El Asesor Experto opera con instrumentos bursátiles.
Un script que muestra una peculiaridad de la implementación de OrderSelect en el modo SELECT_BY_POS+MODE_TRADES
MT4
MT5
A pesar de que el resultado de trading del script es idéntico en ambas plataformas, OrderSelect funciona de forma diferente. De ahí los diferentes registros.
El script está especialmente escrito, y no puedo recomendar este estilo de escribir lógica de trading, ya que está plagado de errores lógicos difíciles de ver en cada plataforma. Y tal código deja de ser 100% idéntico en la ejecución.
Por eso no parece conveniente corregir la librería para que esas curvas raras de MT4 se ejecuten en MT5 de forma absolutamente perfecta, como ocurre con el código normal.
Si estoy equivocado en cuanto a la curvatura y rareza de tales construcciones de trading en MT4, por favor, acláremelo.
La biblioteca ha pasado perfectamente una sencilla prueba de corrección.
Es curioso lo de la ralentización.
Foro sobre trading, sistemas automatizados de trading y testeo de estrategias de trading.
MT4-Tester VS MT5-Tester
fxsaber, 2017.05.08 01:11 pm.
Si hay dudas de que la ralentización de MT5 se deba al uso de una librería de terceros, quien lo desee puede reescribir la lógica simple de MT4 de este EA en MQL5 a su gusto y probar la hipótesis.Un script que muestra una peculiaridad de la implementación de OrderSelect en modo SELECT_BY_POS+MODE_TRADES
El script está especialmente chupado, y no puedo recomendar este estilo de escribir lógica de trading
Con otro estilo muy poco recomendable de escribir la lógica de trading, te puedes encontrar con otra característica de OrderSelect, pero ya en modo SELECT_BY_TICKET+MODE_HISTORY.
Este es un Asesor Experto para un probador. En los comentarios está la razón de este comportamiento. Y es correcto debido a
Es decir, la propia MT5 está hecha tan "torticeramente" que es difícil pensar en otro comportamiento para MT4Orders. Por supuesto, si haces SELECT_BY_POS por historial primero, registrando todos los tickets, entonces SELECT_BY_TICKET funcionará sin problemas.
En general, si la lógica de trading de MT4 está escrita "mal", puede haber discrepancias entre MT5+MT4Orders y los resultados de MT4, que son inusuales para la comprensión de MT4. Si se sigue el estilo de escritura "correcto" de MT4, no se habrán detectado problemas en la librería.
Si utiliza otro estilo muy poco recomendable de escribir la lógica de operación, puede encontrarse con otra característica de OrderSelect, pero ya en modo SELECT_BY_TICKET+MODE_HISTORY.
En general, si la lógica de trading de MT4 está escrita "mal", puede haber discrepancias no acostumbradas para MT4 entre MT5+MT4Orders y los resultados de MT4. Si te ciñes al estilo de escritura "correcto" de MT4, no encontrarás ningún problema en la librería.
La librería es impresionante, muchas gracias :) Después de añadir la sincronización de la historia es indispensable. Funciona rápido incluso para estrategias hft
Yo lo añadiría a la entrega estándar de mt5
Actualización
El modo INT_MIN le permite deshacerse por completo de la saturación de los registros del comprobador - es especialmente crítico durante la optimización, porque debido a una lógica comercial errónea, los mensajes abundantes pueden reducir el rendimiento de la optimización muchas veces y, en consecuencia, aumentar no sólo el tiempo sino también los costes monetarios (Nube).
También es conveniente a la hora de posiciones cerradas.
Quizás algún día esta funcionalidad se convierta en estándar para MT5.
Ejemplo de uso de funciones asíncronas MQL4
Resultado