Bibliotecas: MT4Orders - página 77

 

Foro sobre trading, sistemas automatizados de trading y testeo de estrategias de trading

Bibliotecas: MT4Orders

fxsaber, 2022.07.20 00:39

// 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")


void OnStart()
{
  const ulong 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.
      }
    }
}


Resultado.

#50167020751 2022.07.20 09:58:58.401 buy 0.10 EURUSD 1.02471 0.00000 0.00000 2022.07.20 09:58:58.457 1.02468 0.00 0.00 -0.29 0
OrderLotsOpen() = 1.0

#50167020753 2022.07.20 09:58:58.401 buy 0.20 EURUSD 1.02471 0.00000 0.00000 2022.07.20 09:58:58.512 1.02468 0.00 0.00 -0.59 0
OrderLotsOpen() = 0.9

#50167020754 2022.07.20 09:58:58.401 buy 0.30 EURUSD 1.02471 0.00000 0.00000 2022.07.20 09:58:58.567 1.02468 0.00 0.00 -0.88 0
OrderLotsOpen() = 0.7

#50167020755 2022.07.20 09:58:58.401 buy 0.40 EURUSD 1.02471 0.00000 0.00000 2022.07.20 09:58:58.622 1.02468 0.00 0.00 -1.17 0
OrderLotsOpen() = 0.4
 

Peculiaridad de presentación de posiciones cerradas por la librería en comparación con MT5.


Situación comercial.

  1. BuyLimit se abrió para 1 lote.
  2. BuyLimit se ejecutó parcialmente por 0,4 lotes a las 12:00.
  3. La posición de 0,4 lotes se cerró a las 13:00.
  4. El resto de BuyLimit fue ejecutado - 0.6 lotes a las 14:00.
  5. 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.

 
fxsaber #:

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.

fxsaber #:

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

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?

 
Aleksey Vyazmikin #:

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.

 
fxsaber #:

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?

fxsaber #:

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í.

 
Aleksey Vyazmikin #:

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.

 
fxsaber #:

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?

Print(MT4ORDERS::LastTradeResult.retcode); // Código de retorno de la operación

Porque cosas similares - lo que se necesita no entiendo - el mismo código de abajo devuelve errores de la estructura MqlTradeResult?

Print(MT4ORDERS::LastTradeResult.retcode_external); // Código de retorno de un sistema de negociación externo 
 
Aleksey Vyazmikin #:

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.

 
fxsaber #:

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

#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  -1
bool 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 personalizados
   int error=(int)MT4ORDERS::LastTradeResult.retcode; // Devuelve los códigos de error después de enviar el pedido al servidor
   if(LogInfo==true)Print("error MT5=",error);
   switch(error)
   {
   case 10016:
      error=130;//Pies equivocados
      break;
   case 10018:
      error=132;//Mercado cerrado
      break;
   case 10020:
      error=135;/El precio ha cambiado
      break;
   case 136:
      error=136;//Sin precios - sin código en MT5
      break;
   case 10004:
      error=138;//Nuevos precios
      break;
   case 145:
      error=145;//Modificación prohibida porque la orden está demasiado cerca del mercado - no hay código en MT5
      break;
   case 146:
      error=146;//Subsistema de negociación ocupado - no hay código en MT5
      break;
   default:
      error=error;//Error no descrito
   }
   return (error);
}
#undef GetLastError