Bibliotecas: MT4Orders - página 83

 
pcdeni #:

Aunque tienes razón, la biblioteca no consume esa cantidad de memoria, sin embargo sí la utiliza:

Según esta página:

https://www.mql5.com/es/articles/211

"El intento de manejar todo el historial de operaciones, en la mayoría de los casos, es erróneo. Cuando el número de operaciones/órdenes procesadas ronda los miles y decenas de miles, el trabajo del programa se ralentiza drásticamente."

En caso de que haya más de 1M de operaciones, tu librería las almacena todas en un array.

#define  MT4ORDERS_BYPASS_MAXTIME 1000000
#include <MT4Orders.mqh> // https://www.mql5.com/ru/code/16006

double GetSummaryCommissionMQL5()
{
  double Res = 0;
  
  if (HistorySelect(0, INT_MAX))
    for (uint i = HistoryDealsTotal(); (bool)i--; )
      Res += HistoryDealGetDouble(HistoryDealGetTicket(i), DEAL_COMMISSION);

  return(NormalizeDouble(Res, 2));
}

double GetSummaryCommissionMQL4()
{
  double Res = 0;
  
  for (uint i = OrdersHistoryTotal(); (bool)i--; )
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
      Res += OrderCommission();

  return(NormalizeDouble(Res, 2));
}

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

void OnStart()
{
  PRINT(MQLInfoInteger(MQL_MEMORY_USED));
  PRINT(TerminalInfoInteger(TERMINAL_MEMORY_USED));

  PRINT(GetSummaryCommissionMQL5());

  PRINT(MQLInfoInteger(MQL_MEMORY_USED));
  PRINT(TerminalInfoInteger(TERMINAL_MEMORY_USED));

  PRINT(GetSummaryCommissionMQL4());

  PRINT(MQLInfoInteger(MQL_MEMORY_USED));
  PRINT(TerminalInfoInteger(TERMINAL_MEMORY_USED));

  PRINT(HistoryDealsTotal());
  PRINT(HistoryOrdersTotal());
  PRINT(PositionsTotal());
}


Resultado.

MQLInfoInteger(MQL_MEMORY_USED) = 1
TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1203

GetSummaryCommissionMQL5() = -43568.97
MQLInfoInteger(MQL_MEMORY_USED) = 1
TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1404

GetSummaryCommissionMQL4() = -43568.97
MQLInfoInteger(MQL_MEMORY_USED) = 45
TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1424

HistoryDealsTotal() = 130330
HistoryOrdersTotal() = 190241
PositionsTotal() = 0


130K operaciones + 190K órdenes, el consumo de memoria del terminal aumenta en 20 MB (+10%).

Usted mismo puede medir el rendimiento. La documentación está obsoleta desde hace tiempo.

 
El uso de la biblioteca puede aumentar el consumo de memoria hasta un 10%.
 
fxsaber #:
El uso de la biblioteca puede aumentar el consumo de memoria hasta un 10%.

¿A qué se debe?

 
Vitaly Muzichenko #:

¿Qué tiene eso que ver?

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

Bibliotecas: MT4Orders

fxsaber, 2023.07.07 13:12

  • OrderSelect calcula absolutamente todos los datos de la orden seleccionada del historial (OrderPrint es gratis). Esta es una gran combinación de funciones HistoryOrderGet* y HistoryDealGet*, manejando cualquier complejidad de situaciones de mercado y un gran número de trampas. Echa un vistazo a MT4ORDERS::GetHistoryPositionData(). Se trata de una única función para el Terminal y para el Tester, pero está especialmente acelerada para el Tester, ya que muchos pitfalls del Terminal no están presentes en el Tester. Ejemplos de configuraciones: uno, dos, tres.
 
fxsaber #:
El uso de la biblioteca puede aumentar el consumo de memoria hasta un 10%.

Pensé que había una actualización de la biblioteca de ayer, pero no ponerse al día durante un año :)

Estaré pendiente, ¡gracias por el apoyo!

 

sub, ¿hasta qué punto es ventajoso utilizar const en la transferencia de funciones?

y al mismo tiempo, ¿es razonable crear un miembro de clase dentro de una función, o podemos hacerlo con global, 7 caracteres en un robot de comercio?

procesamiento en cada tick, a través del indicador espía.

procesamiento en cada tick, en el vacío por lo general, no captura anomalías, se trata de optimizar sus funciones preguntas...
 
// Lista de cambios:
// 21.07.2023
// Fix: Corregido OrderLotsOpen() para órdenes pendientes borradas.
// Añadir: Maneja la situación cuando una operación MT5 no tiene una orden MT5.
// Fix: Corregir la definición de OrderClosePriceRequest() cuando la orden SL/TP no tiene precio.
// Añadir: La macro MT4ORDERS_AUTO_VALIDATION le permite validar automáticamente Productos de Mercado.
// Añadir: La macro MT4ORDERS_ORDERS_SORT genera el histórico de órdenes de MT4 ordenadas por hora de cierre/borrado.
 

fxsaber #:

/ Añadir: La macro MT4ORDERS_ORDERS_SORT genera el histórico de órdenes de MT4 ordenadas por hora de cierre/borrado.

Descargada la actualización y comprobado, todo funciona bien ahora con órdenes limitadas, sin retrasos notados hasta ahora.

Gracias.

 
Vitaly Muzichenko #:

sin retrasos todavía.

Ahora se utiliza la variante frontal.

Aquí está el código que puede mostrar el tiempo de ejecución de una solución de este tipo después, si el historial de operaciones se actualizó entre las llamadas vecinas de OrdersHistoryTotal().

#include <fxsaber\Benchmark\Benchmark.mqh> // https://www.mql5.com/es/code/31279

ulong OrdersMQL5()
{
  ulong Res = 0;

  if (HistorySelect(0, INT_MAX))
  {
    const int Total = HistoryOrdersTotal();
    ulong Array[][2];
    
    ArrayResize(Array, Total);
    
    for (int i = 0; i < Total; i++)
    {
      const ulong Ticket = HistoryOrderGetTicket(i);

      Array[i][0] = HistoryOrderGetInteger(Ticket, ORDER_TIME_DONE_MSC);
      Array[i][1] = Ticket;
    }
          
    ArraySort(Array);      
    
    Res = Array[Total - 1][1];
  }
  
  return(Res);
}

void OnStart()
{
  OrdersMQL5(); // Calentamiento.
  
  for (int i = 0; i < 3; i++)
    _B(OrdersMQL5(), 1);
    
  Print(HistoryOrdersTotal());
}


Ejecute los resultados en algunas cuentas de trading. En la abscisa de HistorialOrdenesTotal().

X - HistorialPedidosTotal()

Se puede ver claramente que con 100K órdenes MT5, el lag será de 10 ms (el tiempo de ejecución de OrdersHistoryTotal si el histórico de operaciones se actualizó después de la ejecución anterior).

En el Probador no hay ningún lag. Sólo en el Terminal. Obviamente, es posible acelerarlo, pero no hasta ese punto.

 

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

Bibliotecas: MT4Orders

fxsaber, 2023.07.21 22:59

// Lista de cambios:
// 21.07.2023
// Añadir: macro MT4ORDERS_AUTO_VALIDATION позволяет автоматически проходить проверку Маркет-продуктов.


La idea detrás de esta macro es,

#define  MT4ORDERS_AUTO_VALIDATION // Las órdenes comerciales sólo se envían si se comprueba que son correctas
#include <MT4Orders.mqh> // https://www.mql5.com/es/code/16006

que usted no necesita hacer ninguna comprobación en su código. Esto hace que el código conciso e inmediatamente listo para pasar la validación automática en el Mercado.


Esto es en teoría, ya que nadie lo ha probado todavía. Si confirmas o desmientes el funcionamiento de este mecanismo, será bueno.