Bibliotecas: MT4Orders - página 23

 
Sergey Likho:

Al mismo tiempo, el registro también muestra un mensaje de que todo es normal.

Hay varios enlaces en esta página sobre este tema. En resumen, se puede ver un Result.deal nulo en el log. Se puede ver en el log (no nulo Request.position) que se hizo un OrderClose, que supuestamente se completó con éxito (código de retorno Result.code), pero al mismo tiempo durante un segundo (la biblioteca estaba esperando) en el terminal no había ningún registro (transacción DEAL_ENTRY_OUT) al respecto. Esto indica dos escenarios:

  1. Una orden de operación MT5 fue enviada con éxito, pero la operación MT5 no pasó.
  2. La operación fue aprobada, pero no apareció en el historial de operaciones.

Ambos escenarios no son siempre buenos para MT5 (ver el enlace anterior para una discusión detallada). La biblioteca funcionó claramente, por desgracia. Todos estos matices se analizaron en su momento con detenimiento y, en consecuencia, la biblioteca desarrolló reacciones razonables ante ellos.

 
Sergey Likho:

Si utilizo el broker demo fhtm para hacer pruebas, la función OrderSend abre una operación, pero devuelve un error.

Lo he reproducido y he descubierto que ha sido culpa mía. Gracias por el mensaje, interesante comportamiento de MT5 en este servidor de trading.

Arreglado. Si lo necesitas, te lo puedo enviar a tu PM. Y así, para no molestar a los moderadores, lo publicaré en KB, cuando los desarrolladores solucionen DEAL_SL/TP en las nuevas builds.

 
fxsaber:

Reproducido y encontró que era mi culpa. Gracias por tu mensaje, interesante comportamiento de MT5 en este servidor de comercio resultó.

Arreglado. Si lo necesita, puedo enviarlo a su PM. Y asi, para no molestar a los moderadores, lo publicare en KB, cuando los desarrolladores solucionen DEAL_SL/TP en las nuevas builds.

Sí, por favor, envíelo a PM

 
Sergey Likho:

Sí, por favor envíeme un PM

Enviados.

Raramente, pero puede ocurrir este tipo de Alertas

Alert: OrderSend(2210958493) - BUG!
Alert: Please send the logs to the author - https://www.mql5.com/en/users/fxsaber
::AccountInfoString(ACCOUNT_SERVER) = ForexTimeFXTM-Demo01
(bool)::TerminalInfoInteger(TERMINAL_CONNECTED) = true
::TerminalInfoInteger(TERMINAL_PING_LAST) = 66676
::TerminalInfoDouble(TERMINAL_RETRANSMISSION) = 13.63636363636363
::TerminalInfoInteger(TERMINAL_BUILD) = 1861
(bool)::TerminalInfoInteger(TERMINAL_X64) = true
MT4ORDERS::IsHedging = true
Res = true
MT4ORDERS::OrderSendBug = 1
Request.action = TRADE_ACTION_DEAL (1)
Request.magic = 0
Request.order = 0
Request.symbol = EURUSD
Request.volume = 1.0
Request.price = 1.15758
Request.stoplimit = 0.0
Request.sl = 0.0
Request.tp = 0.0
Request.deviation = 0
Request.type = ORDER_TYPE_SELL (1)
Request.type_filling = ORDER_FILLING_FOK (0)
Request.type_time = ORDER_TIME_GTC (0)
Request.expiration = 1970.01.01 00:00:00
Request.comment = 
Request.position = 0
Request.position_by = 0
Result.retcode = 10009
Result.deal = 2208425527
Result.order = 2210958493
Result.volume = 1.0
Result.price = 0.0
Result.bid = 0.0
Result.ask = 0.0
Result.comment = Request executed 180.441 + 9.521 (1) ms.
Result.request_id = 153
Result.retcode_external = 0

Esta es una alerta puramente informativa (no afecta al trading) de que MT5-OrderSend está trabajando con un error. Este error se discute en detalle aquí. Sin embargo, los desarrolladores aún no creen que este sea un comportamiento incorrecto de MT5...


ZY Una sutileza de MT5 ha sido revelada. Las órdenes fantasma no se producirán cuando se opere a través de la librería.

 
Andrey Khatimlianskii:

¡Trabajar con una larga historia ahora sólo vuela!

Algunos resultados inesperados. El script calcula la hora de apertura/cierre de la última "posición".

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

OrderCloseTime Asesor Experto MQL5

fxsaber, 2018.07.06 00:49

#include <MT4Orders.mqh> // https://www.mql5.com/en/code/16006

void LastTimeMQL4( datetime &OpenTime, datetime &CloseTime )
{
  if (OrderSelect(OrdersHistoryTotal() - 1, SELECT_BY_POS, MODE_HISTORY))
  {
    OpenTime = OrderOpenTime();
    CloseTime = OrderCloseTime();
  }
}

void LastTimeMQL5( datetime &OpenTime, datetime &CloseTime )
{
  if (HistorySelect(0, INT_MAX))
  {
    for (int i = HistoryDealsTotal() - 1; i >= 0; i--)
    {
      const ulong Ticket = HistoryDealGetTicket(i);
  
      if (HistoryDealGetInteger(Ticket, DEAL_ENTRY) == DEAL_ENTRY_OUT)
      {
        CloseTime = (datetime)HistoryDealGetInteger(Ticket, DEAL_TIME);

        if (HistorySelectByPosition(HistoryDealGetInteger(Ticket, DEAL_POSITION_ID)))
          OpenTime = (datetime)HistoryDealGetInteger(HistoryDealGetTicket(0), DEAL_TIME);
          
        break;
      }
    }
  }
}

typedef void (*GetLastTime)( datetime&, datetime& );

void Bench( GetLastTime LastTime, const int Amount = 10000 )
{
  datetime OpenTime, CloseTime;
  datetime Tmp = 0;

  for (int i = 0; i < Amount; i++)
  {
    LastTime(OpenTime, CloseTime);
    
    Tmp += CloseTime - OpenTime;        
  }
  
  Print(Tmp);
}

#define  BENCH(A)                                                              \
{                                                                             \
  const ulong StartTime = GetMicrosecondCount();                              \
  A;                                                                          \
  Print("Time[" + #A + "] = " + (string)(GetMicrosecondCount() - StartTime)); \
}

#define  PRINT(A) Print(#A + " = " + (string)(A))

void OnStart()
{  
  if (HistorySelect(0, INT_MAX))
    PRINT(HistoryDealsTotal());

  BENCH(Bench(LastTimeMQL4))
  BENCH(Bench(LastTimeMQL5))  
}


Resultado

HistoryDealsTotal() = 343
1970.01.01 00:00:00
Time[Bench(LastTimeMQL4)] = 88705
1970.01.01 00:00:00
Time[Bench(LastTimeMQL5)] = 749410

No he analizado por qué el rendimiento de la librería es tan superior al MQL5 puro. Supongo que HistorySelect se ralentiza en tiempo real. No lo he comprobado en el Tester.


Sí, HistorySelect se ralentiza.

 

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

Bibliotecas: MT4Orders

fxsaber, 2017.09.03 18:52

// Lista de cambios:
// 03.09.2017:
// Añadir: Añadido OrderTicketOpen() - MT5-ticket de la transacción de apertura de posición
// OrderOpenReason() - motivo de la operación de apertura de MT5 (motivo de la apertura de una posición)
// OrderCloseReason() - причина проведения MT5-сделки закрытия (причина закрытия позиции)


Impresión de todas las posiciones cerradas por SL

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

Cómo averiguar el precio de cierre cuando la posición corrió en stop loss?

fxsaber, 2018.07.10 11:46

#include <MT4Orders.mqh> // https://www.mql5.com/en/code/16006

void OnStart()
{
  const int Total = OrdersHistoryTotal();
  
  for (int i = 0; i < Total; i++)
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) && (OrderCloseReason() == DEAL_REASON_SL))
      OrderPrint();  
}
 
fxsaber:

Un resultado algo inesperado. El script calcula la hora de apertura/cierre de la última "posición".

No he analizado por qué el rendimiento de la librería es mucho mejor que MQL5 puro. Supongo que HistorySelect se ralentiza en tiempo real. No lo he comprobado en el Tester.

Sí, HistorySelect se ralentiza.

¿Es esta la última versión de la librería?

 
Vitaly Muzichenko:

¿Es ésta la última versión de la biblioteca?

Sí.

 

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

Bibliotecas: MT4Orders

fxsaber, 2017.02.16 15:16

Pude encontrar problemas de ejecución en MT5 con este script. Te recomiendo que compruebes tu conexión Terminal+Trading Server y, en caso de problemas, informes a Service Desk.


Script actualizado en la aplicación. Encuentra rápidamente, por ejemplo, este tipo de problemas

2018.07.24 10:24:19.177 Trades  '35247942': market buy 0.01 USDHKD
2018.07.24 10:24:19.246 Trades  '35247942': failed market buy 0.01 USDHKD [No prices]
2018.07.24 10:24:19.246 Trades  '35247942': buy limit 0.01 USDHKD at 7.83618
2018.07.24 10:24:19.315 Trades  '35247942': failed buy limit 0.01 USDHKD at 7.83618 [No prices]
2018.07.24 10:24:19.316 Trades  '35247942': buy stop 0.01 USDHKD at 7.85618
2018.07.24 10:24:19.384 Trades  '35247942': failed buy stop 0.01 USDHKD at 7.85618 [No prices]
Archivos adjuntos:
 

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

Bibliotecas: MT4Orders

Andrey Khatimlianskii, 2018.06.06 01:53 pm.

// 30.05.2018
// Añadir: Trabajo acelerado con el historial comercial, seleccionada una media dorada de realizaciones entre rendimiento y
// consumo de memoria - importante para VPS. Se utiliza la biblioteca Generic estándar.
// Si no desea utilizar la librería Generic, está disponible el modo antiguo de trabajar con el historial.
// Para ello, es necesario escribir la siguiente línea en la MT4Orders-library ANTES de la MT4Orders-library
//
// #define MT4ORDERS_FASTHISTORY_OFF // Desactiva la implementación rápida del historial de operaciones - no uses la librería Generic.

¡Trabajar con la historia larga ahora sólo vuela!

Comprobación de las ganancias genéricas en números
#define  MT4ORDERS_FASTHISTORY_OFF // Desactiva la implementación rápida del historial comercial - no uses la librería Generic.
#include <MT4Orders.mqh>

double HistoryToDouble( void )
{
  double Res = 0;

  for (int i = OrdersHistoryTotal() - 1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
      Res += OrderCloseTimeMsc() - OrderOpenTimeMsc() + OrderProfit() + OrderTicket() - OrderTicketOpen();
    
  return(Res);
}

#define  BENCH(A)                                                              \
{                                                                             \
  const ulong StartTime = GetMicrosecondCount();                              \
  A;                                                                          \
  Print("Time[" + #A + "] = " + (string)(GetMicrosecondCount() - StartTime)); \
}

#define  PRINT(A) Print(#A + " = " + (string)(A))

void OnStart()
{  
  if (HistorySelect(0, INT_MAX))
  {
    PRINT(HistoryDealsTotal());
    PRINT(HistoryOrdersTotal());
  }

  for (int i = 0; i < 3; i++)
  {
    PRINT(i);
    BENCH(Print(HistoryToDouble()))    
  }
}


Resultado sin Generic

HistoryDealsTotal() = 10063
HistoryOrdersTotal() = 20296
i = 0
1195028482.07
Time[Print(HistoryToDouble())] = 829525
i = 1
1195028482.07
Time[Print(HistoryToDouble())] = 885207
i = 2
1195028482.07
Time[Print(HistoryToDouble())] = 918911


Resultado con Genérico

HistoryDealsTotal() = 10063
HistoryOrdersTotal() = 20296
i = 0
1195028482.07
Time[Print(HistoryToDouble())] = 52603
i = 1
1195028482.07
Time[Print(HistoryToDouble())] = 39051
i = 2
1195028482.07
Time[Print(HistoryToDouble())] = 34409


En un historial con 10.000 operaciones y 20.000 órdenes, la variante Genérica es ~30 veces más rápida. Cuanto mayor es el historial de operaciones, más notable es la aceleración.