// Lista de cambios:// 20.07.2022// Añadir: Añadido OrderLotsOpen() - posición completa/volumen de la orden antes de cerrar/borrar. Funciona correctamente sólo en ByPass-mode.
Ejemplo.
#define MT4ORDERS_BYPASS_MAXTIME 1000000// Tiempo máximo (en µs) de espera para la sincronización del entorno comercial#include <MT4Orders.mqh>
#define Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)
#define PRINT(A) Print(#A + " = " + (string)(A) + "\n")
voidOnStart()
{
constulong Ticket = OrderSend(_Symbol, OP_BUY, 1, Ask, 0, 0, 0); // Abierta una posición para un lote.for (int i = 1; i <= 4; i++)
if (OrderSelect(Ticket, SELECT_BY_TICKET) && !OrderCloseTime())
{
OrderClose(OrderTicket(), 0.1 * i, OrderClosePrice(), 0); // Cierra a 0.1, 0.2, 0.3, ... lotes.if (OrderSelect(OrdersHistoryTotal() - 1, SELECT_BY_POS, MODE_HISTORY))
{
OrderPrint();
PRINT(OrderLotsOpen()); // Volumen de la posición antes del cierre correspondiente. Se toma del historial de operaciones.
}
}
}
BuyLimit se ejecutó parcialmente por 0,4 lotes a las 12:00.
La posición de 0,4 lotes se cerró a las 13:00.
El resto de BuyLimit fue ejecutado - 0.6 lotes a las 14:00.
La posición de 0,6 lotes se cerró a las 15:00.
MT5 mostrará que hubo una posición que se abrió a las 12:00 y se cerró a las 15:00. Los precios de apertura/cierre de esta posición pueden ser muy extraños.
MT4Orders mostrará que había dos posiciones: una que se abrió a las 12:00 y se cerró a las 13:00, y otra que se abrió a las 14:00-15:00. Los precios de apertura/cierre de esta posición pueden ser muy extraños. Los precios de apertura/cierre serán adecuados.
Tenga en cuenta que en MT5 GetLastError() no devuelve errores de operación. Por lo tanto, si quieres hacer como en MT4, tienes que generar tu propio error correspondiente a través de SetUserError. Pero incluso allí ERR_USER_ERROR_FIRST no te dará la versión de MT4.
Gracias por la información, yo tampoco soy muy ducho en esto.
¿Entiendo bien que basta con sustituir
int er=GetLastError();
a
int er=MT4ORDERS::LastTradeResult.retcode_external;
y procesar ya los nuevos códigos de error?
Por cierto, no he encontrado análogos de errores para MT5, en MT4 son: 135, 145, 146 - ¿hay alguno?
Sí, es un logro. Sin embargo, la comprobación de errores de admisión de marquesinas no recrea todas las situaciones.
Por desgracia, sólo tengo ideas teóricas sobre el Mercado. No tengo práctica en pasar las comprobaciones.
¿Entiendo correctamente que basta con sustituir y procesar ya los nuevos códigos de error?
Correcto. Sólo retcode. El análogo de ResetLastError es el mismo esquema - asignación de cero.
Por cierto, no he encontrado análogos de errores para MT5, en MT4 son: 135, 145, 146 - ¿hay alguno?
No sé los tipos de errores en absoluto, ya que no los uso en asesores expertos de combate. Probablemente, usted debe tratar de reproducir cada error en MT4 y luego tener una idea clara de su naturaleza y compararlos con errores similares en MT5. Tal vez ya hay tablas de correspondencia en alguna parte. No es un hecho que todos los códigos tienen homónimos en otra plataforma.
Así es. Sólo retcode. Un análogo de ResetLastError en el mismo esquema - asignación de cero.
Entonces, ¿se puede integrar el restablecimiento de error en su clase de alguna manera? Porque la cuarta clase no lo necesitaba de alguna manera.
¿O es suficiente sólo para llamar a la información sobre el último error y luego restablecer inmediatamente, es decir, intercambiar las funciones que tiene en su ejemplo?
No conozco los tipos de errores en absoluto, ya que no los uso en combate Expert Advisors. Probablemente, deberías intentar reproducir cada error en MT4 y luego hacerte una idea clara de su naturaleza y compararlos con otros similares en MT5. Tal vez ya hay tablas de correspondencia en alguna parte. No es un hecho que todos los códigos tienen sus homónimos en otra plataforma.
Estuve buscando una tabla de este tipo y no la encontré. Los errores no siempre están en el código - hay problemas en el lado del centro de corretaje.
Entendí que si el problema es de cualquier tipo con el trabajo con las órdenes, entonces GetLastError(); devuelve el código 4756, que no está mal, si es así.
Entonces, ¿se puede integrar el restablecimiento de errores en su clase? La 4 no parecía necesitarlo.
¿O es suficiente con llamar a la información sobre el último error y luego restablecer de una vez, es decir, intercambiar las funciones que tiene en su ejemplo?
No veo la necesidad de reiniciarlo. Lo he dicho por compatibilidad adicional con la forma en que supongo que funciona MT4.
#property strict#ifdef __MQL5__#include <MQL4_To_MQL5.mqh> // https://www.mql5.com/es/code/16006#endif // __MQL5__#define GetLastError GetOrderError
// Debe estar presente no sólo en MT5 sino también en MT4.// https://www.mql5.com/ru/forum/93352/page19#comment_6730221#include <MT4Orders.mqh>
#define BUY 0#define SELL 1#define ALL -1#define LAST 0#define NOMODY -1bool LogInfo=true;//Imprimir en el registro de errores
/*
Aquí están las funciones de la clase para trabajar con pedidos
*/
Al final de mi clase añadí una función
//+-------------------------------------------------------------------------------------------------------------------+//|| Transformación de errores de MT5 a MT4//+-------------------------------------------------------------------------------------------------------------------+int GetOrderError()
{
//int error=MT4ORDERS::LastTradeResult.retcode_external; // Devuelve códigos personalizadosint error=(int)MT4ORDERS::LastTradeResult.retcode; // Devuelve los códigos de error después de enviar el pedido al servidorif(LogInfo==true)Print("error MT5=",error);
switch(error)
{
case10016:
error=130;//Pies equivocadosbreak;
case10018:
error=132;//Mercado cerradobreak;
case10020:
error=135;/El precio ha cambiadobreak;
case136:
error=136;//Sin precios - sin código en MT5break;
case10004:
error=138;//Nuevos preciosbreak;
case145:
error=145;//Modificación prohibida porque la orden está demasiado cerca del mercado - no hay código en MT5break;
case146:
error=146;//Subsistema de negociación ocupado - no hay código en MT5break;
default:
error=error;//Error no descrito
}
return (error);
}
#undef GetLastError
Foro sobre trading, sistemas automatizados de trading y testeo de estrategias de trading
Bibliotecas: MT4Orders
fxsaber, 2022.07.20 00:39
Ejemplo.
Resultado.
Peculiaridad de presentación de posiciones cerradas por la librería en comparación con MT5.
Situación comercial.
MT5 mostrará que hubo una posición que se abrió a las 12:00 y se cerró a las 15:00. Los precios de apertura/cierre de esta posición pueden ser muy extraños.
MT4Orders mostrará que había dos posiciones: una que se abrió a las 12:00 y se cerró a las 13:00, y otra que se abrió a las 14:00-15:00. Los precios de apertura/cierre de esta posición pueden ser muy extraños. Los precios de apertura/cierre serán adecuados.
Parte de MT5-Market está escrito a través de esta librería. La razón principal es la facilidad de uso.
Sí, es un logro. Sin embargo, la comprobación de errores en la aceptación del mercado no recrea todas las situaciones.
Sobre el tema de los errores.
MT5 propios códigos están aquí. Comparar con los códigos de MT4.
Tenga en cuenta que en MT5 GetLastError() no devuelve errores de operación. Por lo tanto, si quieres hacer como en MT4, tienes que generar tu propio error correspondiente a través de SetUserError. Pero incluso allí ERR_USER_ERROR_FIRST no te dará la versión de MT4.
Gracias por la información, yo tampoco soy muy ducho en esto.
¿Entiendo bien que basta con sustituir
a
y procesar ya los nuevos códigos de error?
Por cierto, no he encontrado análogos de errores para MT5, en MT4 son: 135, 145, 146 - ¿hay alguno?
Sí, es un logro. Sin embargo, la comprobación de errores de admisión de marquesinas no recrea todas las situaciones.
Por desgracia, sólo tengo ideas teóricas sobre el Mercado. No tengo práctica en pasar las comprobaciones.
¿Entiendo correctamente que basta con sustituir y procesar ya los nuevos códigos de error?
Correcto. Sólo retcode. El análogo de ResetLastError es el mismo esquema - asignación de cero.
Por cierto, no he encontrado análogos de errores para MT5, en MT4 son: 135, 145, 146 - ¿hay alguno?
No sé los tipos de errores en absoluto, ya que no los uso en asesores expertos de combate. Probablemente, usted debe tratar de reproducir cada error en MT4 y luego tener una idea clara de su naturaleza y compararlos con errores similares en MT5. Tal vez ya hay tablas de correspondencia en alguna parte. No es un hecho que todos los códigos tienen homónimos en otra plataforma.
Así es. Sólo retcode. Un análogo de ResetLastError en el mismo esquema - asignación de cero.
Entonces, ¿se puede integrar el restablecimiento de error en su clase de alguna manera? Porque la cuarta clase no lo necesitaba de alguna manera.
¿O es suficiente sólo para llamar a la información sobre el último error y luego restablecer inmediatamente, es decir, intercambiar las funciones que tiene en su ejemplo?
No conozco los tipos de errores en absoluto, ya que no los uso en combate Expert Advisors. Probablemente, deberías intentar reproducir cada error en MT4 y luego hacerte una idea clara de su naturaleza y compararlos con otros similares en MT5. Tal vez ya hay tablas de correspondencia en alguna parte. No es un hecho que todos los códigos tienen sus homónimos en otra plataforma.
Estuve buscando una tabla de este tipo y no la encontré. Los errores no siempre están en el código - hay problemas en el lado del centro de corretaje.
Entendí que si el problema es de cualquier tipo con el trabajo con las órdenes, entonces GetLastError(); devuelve el código 4756, que no está mal, si es así.
Entonces, ¿se puede integrar el restablecimiento de errores en su clase? La 4 no parecía necesitarlo.
¿O es suficiente con llamar a la información sobre el último error y luego restablecer de una vez, es decir, intercambiar las funciones que tiene en su ejemplo?
No veo la necesidad de reiniciarlo. Lo he dicho por compatibilidad adicional con la forma en que supongo que funciona MT4.
No veo la necesidad de reiniciar. Dicho para la compatibilidad adicional con la forma en que supongo que funciona MT4.
Todavía tengo que aclarar, ¿estos errores están por debajo del código llamado?
Porque cosas similares - lo que se necesita no entiendo - el mismo código de abajo devuelve errores de la estructura MqlTradeResult?
Sigo aclarando, ¿son estos errores lo que abajo se llama código?
Debido a que las cosas similares - lo que se necesita no entiendo - el mismo código de abajo devuelve errores de la estructura MqlTradeResult?
retcode - MT5 error. retcode_external - un campo que puede ser opcionalmente rellenado por el desarrollador de un puente de terceros.
retcode - error MT5. retcode_external - campo que puede rellenar opcionalmente el desarrollador de un puente de terceros.
Entendido, gracias. Creo que los estándar serán suficientes por ahora.
Hice este manejo de errores en mi clase
Al final de mi clase añadí una función