Bibliotecas: MT4Orders - página 43

 

Hola fxsaber

¡Mis mejores deseos para 2020!

¿Es una opción de diseño para no incluir un número mágico en la solicitud de comercio para la función MT4OrderClose?

Actualmente, DEAL_ENTRY_OUT de MT4OrderClose tendrá magic == 0.

Esto no hace mucha diferencia porque con el ID de posición puede rastrear el número mágico desde DEAL_ENTRY_IN, sin embargo para propósitos de análisis de historial tener una coincidencia DEAL_ENTRY_IN / DEAL_ENTRY_OUT probablemente daría más flexibilidad.


Hi fxsaber,

¡Mis mejores deseos para 2020!

¿Es una elección de diseño no incluir el número mágico en la solicitud de operación para la función MT4OrderClose?

Actualmente DEAL_ENTRY_OUT por MT4OrderClose tendrá magic == 0.

No es un gran problema porque con Position ID es posible rastrear el número mágico desde DEAL_ENTRY_IN, sin embargo para propósitos de análisis histórico tener DEAL_ENTRY_IN/DEAL_ENTRY_OUT coincidentes quizás daría más flexibilidad.

 
Enrique Dangeroux:

¿Es una decisión de diseño no incluir el número mágico en la solicitud de operación para la función MT4OrderClose?

Actualmente DEAL_ENTRY_OUT de MT4OrderClose tendrá magic == 0.

Esto no hace mucha diferencia porque con el ID de la posición usted puede rastrear el número mágico desde DEAL_ENTRY_IN, sin embargo para propósitos de análisis histórico tener una coincidencia DEAL_ENTRY_IN / DEAL_ENTRY_OUT probablemente daría más flexibilidad.

En OrderClose puede establecer el MagicNumber si lo desea.

En MT5, cuando se cierra parcialmente una posición, se puede cambiar el MagicNumber de la posición abierta, por lo que se le da una opción.

Por ejemplo, si tienes una posición abierta con MagicNumber = 5 y cierras la posición manualmente, entonces DEAL_ENTRY_OUT_MAGIC = 0. La librería seguirá devolviendo OrderMagicNumber() = 5.

 
// Lista de cambios:
// 12.01.2020
// Corrección: OrderTicketID() para transacciones de saldo ahora devuelve el valor correcto.
// Fix: Corregida la selección SELECT_BY_TICKET por OrderTicketID() (MT5-PositionID).
// Fix: Cambiado el nombre del método interno de la librería para una mejor compatibilidad con las macros.
 
No sé si es un bug o una característica, pero para futuros el beneficio y el precio de apertura no se calculan exactamente como se espera. Digamos que una posición se abre a las 12.00, a las 18.40 la posición se borra y se reabre automáticamente, y luego a las 20.00 la posición se cierra. GetHistoryPositionData para el ticket de la 4ª operación (salida de la posición) selecciona el beneficio como MT4ORDERS::Order.Profit = ::HistoryDealGetDouble(Ticket, DEAL_PROFIT); Lo que devolverá esencialmente la diferencia entre las operaciones 3-4 (compensación y salida). Pero devolverá el precio de apertura como MT4ORDERS::Order.OpenPrice = ::HistoryDealGetDouble(OpenTicket, DEAL_PRICE);. Es decir, devolverá el precio de apertura de la 1ª operación. En mi opinión, tiene sentido hacerlo uniforme, bien sacando todo de la primera operación (tanto el precio de apertura como el beneficio), o bien sacando todo de la última apertura (desde la 3ª operación hasta la compensación). ¿O esto es una característica, y debería ser así, y me estoy perdiendo algo?
 
traveller00:
No sé si es un bug o una característica, pero para futuros el beneficio y el precio de apertura no se calculan exactamente como se espera. Digamos que una posición se abre a las 12.00, a las 18.40 la posición se borra y se reabre automáticamente, y luego a las 20.00 la posición se cierra. GetHistoryPositionData para el ticket de la 4ª operación (salida de la posición) selecciona el beneficio como MT4ORDERS::Order.Profit = ::HistoryDealGetDouble(Ticket, DEAL_PROFIT); Lo que devolverá esencialmente la diferencia entre las operaciones 3-4 (compensación y salida). Pero devolverá el precio de apertura como MT4ORDERS::Order.OpenPrice = ::HistoryDealGetDouble(OpenTicket, DEAL_PRICE);. Es decir, devolverá el precio de apertura de la 1ª operación. En mi opinión, tiene sentido hacerlo uniforme, bien sacando todo de la primera operación (tanto el precio de apertura como el beneficio), o bien sacando todo de la última apertura (desde la 3ª operación hasta la compensación). ¿O esto es una característica, y debería ser así, y me estoy perdiendo algo?

Así que usted está analizando la historia en Netting a través de la biblioteca. Este es exactamente el caso planteado inicialmente, para el que la biblioteca no se ha completado. Y si lo estará es una gran incógnita. Porque hay mucho que hacer y en la práctica no es necesario.

En Netting sigo utilizando la misma biblioteca, pero evito trabajar con la historia.

 

https://www.mql5.com/ru/blogs/post/733393


Medición de la velocidad en una situación de una entrada de blog.

#include <MT4Orders.mqh>

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

void OnStart()
{
  BENCH(HistorySelectByPosition(270107))
  BENCH(HistorySelectByPosition(270107))

  BENCH(HistorySelect(0, INT_MAX))
  BENCH(HistorySelect(0, INT_MAX))

  BENCH(OrdersHistoryTotal())
  BENCH(OrdersHistoryTotal())

  BENCH(OrderSelect(270107, SELECT_BY_TICKET, MODE_HISTORY))
  BENCH(OrderPrint());

  BENCH(OrderSelect(1000, SELECT_BY_POS, MODE_HISTORY))
  BENCH(OrderPrint());
}


Resultado.

Time[HistorySelectByPosition(270107)] = 9232 // Arranque en frío.
Time[HistorySelectByPosition(270107)] = 8571 // Hot Launch.

Time[HistorySelect(0,INT_MAX)] = 152856 // Arranque en frío.
Time[HistorySelect(0,INT_MAX)] = 94924  // Hot Launch.

Time[OrdersHistoryTotal()] = 155735 // Arranque en frío.
Time[OrdersHistoryTotal()] = 6774   // Hot Launch.

Time[OrderSelect(270107,1,1)] = 23 // Gratis.
#85469 2020.02.05 22:32:12 buy 0.01 USDCNH 6.97767 0.00000 6.98533 2020.02.05 22:32:13 6.97533 0.00 0.00 -0.34 OrderSendTest_Position 0
Time[OrderPrint()] = 20 // Gratis.

Time[OrderSelect(1000,0,1)] = 11 // Gratis.
#10613 2020.02.06 02:34:32 buy 0.01 EURUSD 1.10049 0.00000 1.11046 2020.02.06 02:34:32 1.10046 0.00 0.00 -0.03 OrderSendTest_Position 0
Time[OrderPrint()] = 13 // Gratis.


Se puede ver claramente cuanto cuestan las funciones HistorySelect.

OrdersHistoryTotal en caliente, aunque es menor, pero aún se nota, por lo que siempre se recomendó intentar no llamarlo más de una vez por On-event.

OrderSelect por historia resultó ser gratis.

Особенности исполнения торговых приказов MT5
Особенности исполнения торговых приказов MT5
  • www.mql5.com
Анализировал с владельцем MT5-сервера тормоза торговых приказов. Запускался OrderSend-Test2.mq5 в том же месте, где MT5-сервер стоит. Т.е. нулевой пинг. Демо, все внутри. Изучались логи MT5-сервера (2170) и MT5-клиента (2280). Логи сервера не буду приводить, просто словами опишу. Думаю, результаты буду интерсны всем, т.к. это поможет раскрыть...
 

Puede recopilar estadísticas sobre el tiempo empleado en la ejecución de órdenes de mercado (incluyendo TP/SL).

//Estadística del tiempo empleado en la ejecución de órdenes de mercado (incluyendo TP/SL).
#property script_show_inputs

input datetime inFrom = 0;
input datetime inTo = INT_MAX;

struct ORDER
{
  ulong Ticket;
  
  ulong FillingTime;
  
  string ToString( void ) const
  {
    return((string)Ticket + ": " + ::TimeToString(this.FillingTime / 1000, TIME_SECONDS) +
                            "." + ::IntegerToString(this.FillingTime % 1000, 3, '0'));
  }
};

// Recoge datos sobre el tiempo dedicado a la ejecución de órdenes de mercado
int GetOrders( ORDER &Orders[], const datetime From = 0, const datetime To = INT_MAX )
{
  int Amount = 0;
  
  if (HistorySelect(From, To)) // Si hay registros en el historial
    for (int i = ArrayResize(Orders, HistoryOrdersTotal()) - 1; i >= 0; i--) // Recorrer la selección de pedidos
    {
      const ulong TicketOrder = HistoryOrderGetTicket(i); // Hemos seleccionado una orden
      
      if ((HistoryOrderGetInteger(TicketOrder, ORDER_TYPE) <= ORDER_TYPE_SELL) &&   // Si la orden de mercado
          (HistoryOrderGetInteger(TicketOrder, ORDER_STATE) == ORDER_STATE_FILLED)) // Si se ha ejecutado la orden
      {
        Orders[Amount].Ticket = TicketOrder;
        
        // Recordar el tiempo de ejecución.
        Orders[Amount++].FillingTime = HistoryOrderGetInteger(TicketOrder, ORDER_TIME_DONE_MSC) -
                                       HistoryOrderGetInteger(TicketOrder, ORDER_TIME_SETUP_MSC);
      }
      }
  
  return(ArrayResize(Orders, Amount));
}

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

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

void OnStart()
{
  ORDER Orders[];
  
  if (GetOrders(Orders, inFrom, inTo))
  {
    ArraySortStruct(Orders, FillingTime); // https://www.mql5.com/ru/forum/170952/page166#comment_15151387
    
    // Imprime las órdenes de mercado ejecutadas más largas.
    for (int i = ArraySize(Orders) - 1, k = 0; (i >= 0) && (k < 10); i--, k++)
    {
      Print((string)k + " - " + Orders[i].ToString());

    #ifdef __MT4ORDERS__
      if (OrderSelect(Orders[i].Ticket, SELECT_BY_TICKET))
      {
        OrderPrint();
        
        PRINT(OrderTicketID());
        PRINT(OrderTicketOpen());
  
        Print("-------------------");      
      }
    #endif // __MT4ORDERS__ 
    }
  }
}


Resultado.

0 - 348806: 00:01:57.311
1 - 348530: 00:01:39.027
2 - 348494: 00:01:15.259
3 - 348406: 00:01:07.671
4 - 348950: 00:01:04.869
5 - 348960: 00:01:02.888
6 - 348814: 00:01:00.654
7 - 348392: 00:01:00.642
8 - 348508: 00:00:54.515
9 - 348550: 00:00:54.467


Hasta dos minutos de ejecución en una cuenta en funcionamiento. Comparta sus estadísticas aquí. El script no utiliza ninguna librería, es apto para Netting/Hedge.

 

En MT4/5 es bastante desagradable depurar cuando se trabaja con el historial de operaciones. Tienes que usar varias soluciones de muletas.


En MT5 puede ver inmediatamente todos los campos de la orden seleccionada a través de MT4Orders. Para ello, tiene que añadir MT4ORDERS::Order a la observación MT4ORDERS::Order.


De esta manera usted puede ver todas las propiedades de la orden seleccionada.

 
fxsaber:

Comparte tus estadísticas aquí. El script no utiliza ninguna librería, apto para Netting/Hedge.

Así es como es el real:

2020.02.27 14:53:30.275 ExecutionSpeed (EURUSD,H1)      0 - 34487054: 00:00:06.768
2020.02.27 14:53:30.275 ExecutionSpeed (EURUSD,H1)      1 - 34487223: 00:00:06.166
2020.02.27 14:53:30.275 ExecutionSpeed (EURUSD,H1)      2 - 49869622: 00:00:03.656
2020.02.27 14:53:30.275 ExecutionSpeed (EURUSD,H1)      3 - 34486559: 00:00:02.833
2020.02.27 14:53:30.275 ExecutionSpeed (EURUSD,H1)      4 - 34486482: 00:00:02.051
2020.02.27 14:53:30.275 ExecutionSpeed (EURUSD,H1)      5 - 34486480: 00:00:02.023
2020.02.27 14:53:30.275 ExecutionSpeed (EURUSD,H1)      6 - 34486467: 00:00:01.983
2020.02.27 14:53:30.275 ExecutionSpeed (EURUSD,H1)      7 - 42624984: 00:00:01.589
2020.02.27 14:53:30.275 ExecutionSpeed (EURUSD,H1)      8 - 33738445: 00:00:01.088
2020.02.27 14:53:30.275 ExecutionSpeed (EURUSD,H1)      9 - 42625044: 00:00:00.932
 

Y una más:

2020.02.27 14:59:50.616 ExecutionSpeed (EURUSD,H1)      0 - 1532297: 00:00:14.989
2020.02.27 14:59:50.616 ExecutionSpeed (EURUSD,H1)      1 - 1528006: 00:00:04.983
2020.02.27 14:59:50.616 ExecutionSpeed (EURUSD,H1)      2 - 1527412: 00:00:03.543
2020.02.27 14:59:50.616 ExecutionSpeed (EURUSD,H1)      3 - 1528097: 00:00:01.812
2020.02.27 14:59:50.616 ExecutionSpeed (EURUSD,H1)      4 - 1478424: 00:00:01.502
2020.02.27 14:59:50.616 ExecutionSpeed (EURUSD,H1)      5 - 1478368: 00:00:01.502
2020.02.27 14:59:50.616 ExecutionSpeed (EURUSD,H1)      6 - 1478410: 00:00:01.502
2020.02.27 14:59:50.616 ExecutionSpeed (EURUSD,H1)      7 - 1478344: 00:00:01.501
2020.02.27 14:59:50.616 ExecutionSpeed (EURUSD,H1)      8 - 1733682: 00:00:01.480
2020.02.27 14:59:50.616 ExecutionSpeed (EURUSD,H1)      9 - 737378: 00:00:00.346