Discusión sobre el artículo "Órdenes, Posiciones y Transacciones en MetaTrader 5" - página 4

 

Por favor, dígame, si la función OrderSend devolvió true y result.order tiene un ticket de orden (result.order!=0), ¿garantiza que la orden es aceptada por el broker y está en la pestaña de operaciones o en esta etapa la solicitud es aceptada sólo por el servidor del broker pero no por la bolsa?

Y la segunda pregunta, ¿puede haber una situación cuando OrderSend devuelve true y result.order==0 ?

 
Aleksey Gunin:

¿Puede decirme, por favor, si la función OrderSend devuelve true y result.order tiene un ticket de orden (result.order!=0), garantiza que la orden es aceptada por el broker y está en la pestaña de negociación o en esta etapa la solicitud es aceptada sólo por el servidor del broker pero no por la bolsa?

Garantizado.

Y la segunda pregunta, ¿puede haber una situación en la que OrderSend devuelva true y result.order==0 ?

No.

 
fxsaber:

Garantías.

No.

El otro día añadieron una aclaración para la función OrderSend, consulte la ayuda en línea.

 
Rashid Umarov:

El otro día añadieron una aclaración para la función OrderSend, consulte la ayuda en línea.

¿Se aplica esto a las órdenes de mercado?

Cada orden aceptada se almacena en el servidor de operaciones a la espera de ser procesada hasta que se produzca una de las condiciones para su ejecución:

  • caducidad,
  • la aparición de una contraorden,
  • la activación de la orden tras la recepción del precio de ejecución,
  • recepción de una solicitud de anulación de la orden.
No está especificado que el propio Terminal llame siempre a OrderCheck antes que a OrderSendAsync, y OrderSend es un complemento sobre OrderSendAsync

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

Errores típicos y formas de eliminarlos al trabajar con el entorno de negociación

fxsaber, 2018.02.20 12:23 pm.

Esquema condicional de implementación del OrderSend estándar (sin timeout).
static MqlTradeResult LastResult = {0};

void OnTradeTransaction( const MqlTradeTransaction&, const MqlTradeRequest&, const MqlTradeResult &Result )
{ 
  LastResult = Result;
}

// Algoritmo condicional para implementar el OrderSend estándar
bool OrderSend( const MqlTradeRequest &Request, MqlTradeResult &Result )
{  
  bool Res = OrderSendAsync(Request, Result);
  
  if (Res)
  {
    while (LastResult.request_id != Result.request_id)
      OnTradeTransaction(); // llamada esquemática
          
    Result = LastResult;    
    Res = (Result.retcode == TRADE_RETCODE_PLACED) ||
          (Result.retcode == TRADE_RETCODE_DONE) ||
          (Result.retcode == TRADE_RETCODE_DONE_PARTIAL);

    LastResult.request_id = 0;
  }
    
  return(Res);
}


De este esquema podemos ver claramente que al colocar una orden de mercado vía OrderSendAsync en el mismo MetaQuotes-Demo, es imposible garantizar la captura del evento de colocación de la orden correspondiente hasta que la orden sea ejecutada o rechazada. Es decir, MT5 no dispone de mecanismos sencillos para evaluar los resultados intermedios de su OrderSendAsync.


OrderSend se ejecuta hasta que Result.request_id es igual al mismo valor de OrderSendAsync en OnTradeTransaction. O se termina por tiempo de espera. Por lo tanto, el resultado de OrderSend depende sólo del tipo de mensaje en OnTradeTransaction con el request_id correspondiente.

Sería útil conocer la formación del propio request_id. Si he entendido bien, se trata de un contador de órdenes enviadas al servidor comercial desde el momento de lanzamiento/conexión del Terminal/Cuenta. El propio Terminal analiza los mensajes entrantes del servidor de comercio y, o bien asigna el request_id requerido a uno solo (lo cual es dudoso), o bien restablece el request_id a un determinado mensaje (lo más probable). Este comportamiento hizo posible hace algún tiempo que el Historial de Ofertas coincidiera con la salida de OrderSend. Pero como sólo un mensaje en OnTradeTransaction es visible con el request_id correcto, se produce la desagradable situación asíncrona de la cita anterior.

 

Buenas tardes, he encontrado inconsistencias para MqlTradeResult.deal y MqlTradeResult.order

1) Descripción (Manual de Referencia MQL5)


2) Trading en tiempo real

Coloco ordenes de mercado (TRADE_ACTION_DEAL). Doy salida a los valores MqlTradeResult usando la función Print:


y la operación aparece en el registro:

Intenté "dormirme" con la función Sleep durante un par de segundos y volver a emitir los datos (cuando la operación ya está exactamente realizada y la posición está abierta), el número de la operación no apareció.


3) Probador de Estrategias

Aquí se rellenan todos los campos:



¿Cuál es la causa de estas diferencias?

 
Konstantin Kulikov:

Buenas tardes, he encontrado incoherencias para MqlTradeResult.deal y MqlTradeResult.order




https://www.mql5.com/es/docs/trading/ordersend

Al enviar una orden de mercado (MqlTradeRequest.action=TRADE_ACTION_DEAL), el resultado exitoso de la función OrderSend() no significa que la orden fue ejecutada (las operaciones correspondientes fueron ejecutadas): true en este caso significa solamente que la orden fue colocada exitosamente en el sistema de negociación para su posterior ejecución. El servidor de operaciones puede rellenar los valores de los campos de operación u orden en la estructura de resultados devuelta , si estos datos le son conocidos en el momento de formar la respuesta a la llamada OrderSend(). En general, el evento o eventos de ejecución de operaciones correspondientes a la orden pueden ocurrir después del envío de la respuesta a la llamada OrderSend(). Por lo tanto, para cualquier tipo de solicitud de negociación, al recibir el resultado de la ejecución de OrderSend(), es necesario comprobar en primer lugar el código de retorno del servidor de negociación retcode y el código de respuesta del sistema de negociación externo retcode_external (si es necesario), que están disponibles en la estructura de resultados devuelta.


Документация по MQL5: Торговые функции / OrderSend
Документация по MQL5: Торговые функции / OrderSend
  • www.mql5.com
Торговый запрос проходит несколько стадий проверок на торговом сервере. В первую очередь проверяется корректность заполнения всех необходимых полей параметра , и при отсутствии ошибок сервер принимает ордер для дальнейшей обработки. При успешном принятии ордера торговым сервером функция OrderSend() возвращает значение true. Рекомендуется...
 

Gracias por un artículo tan informativo. @MetaQuotes

Pregunta: ¿Cómo puedo hacer un bucle colectivo a través de ambos: órdenes abiertas y posiciones abiertas en un solo bucle for() (de manera similar a como hacemos un bucle con todas las órdenes en MQL4 y luego comprobar si una orden ya está ejecutada o es una orden pendiente)?

 
Rahul Dhangar :

Gracias por un artículo tan informativo. @MetaQuotes

Pregunta: ¿Cómo puedo hacer un bucle colectivo a través de ambos: órdenes abiertas y posiciones abiertas en un solo bucle for() (de manera similar a como hacemos un bucle con todas las órdenes en MQL4 y luego comprobar si una orden ya está ejecutada o es una orden pendiente)?

Para calcular POSICIONES y ORDENES PENDIENTES hay que utilizar dos ciclos independientes. Un ciclo enumera las POSICIONES, y el segundo ciclo enumera las ORDENES PENDIENTES. Ejemplo: Calcular Posiciones y Órdenes Pendientes

How to start with MQL5
How to start with MQL5
  • 2020.12.19
  • www.mql5.com
This thread discusses MQL5 code examples. There will be examples of how to get data from indicators, how to program advisors...
 

Sé que no eres de los que se preocupan por los que empiezan en el lenguaje mql5, dada la fuerte comunidad que tienes, a pesar de las muchas críticas, aquí va una más:

La traducción y la propia redacción del texto dificultan la comprensión...he sudado, he tenido que ir muy lejos para encontrar quien debe ir primero, ya que la propia documentación se contradice, en el texto:

  • Historial de pedidos

    Para obtener información sobre un pedido del historial, primero hay que crear la caché del historial de pedidos mediante una de estas tres funciones: HistorySelect(inicio, fin), HistorySelectByPosition() o HistoryOrderSelect(ticket). Si la ejecución tiene éxito, la caché almacenará el número de pedidos, devuelto por la funciónHistoryOrdersTotal(). El acceso a las propiedades de estos pedidos se realiza por cada uno de los elementos del ticket, utilizando la función adecuada:

    1. HistoryOrderGetDouble(ticket_order, type_property)
    2. HistoryOrderGetInteger(ticket_order, tipo_propiedad)
    3. HistoryOrderGetString(ticket_order, tipo_propiedad)


En contraste con: https: //www.mql5.com/pt/docs/trading/historyorderstotal transcrito a continuación.



HistorialPedidosTotal

Devuelve el número de órdenes del histórico. Antes de llamar a HistoryOrdersTotal(), primero debe recibir el historial de operaciones y órdenes utilizando la funciónHistorySelect() o la funciónHistorySelectByPosition().

int TotalOrdenesHistoria();

Valor devuelto

Valor de tipodouble.

Nota

No confunda las órdenes de un historial de operaciones conlas órdenes pendientes que aparecen en la pestaña "Operaciones" de la barra de herramientas. La lista deórdenes que han sido canceladas o que han dado lugar a una operación puede verse en la pestaña "Historial" de la caja de herramientas del terminal cliente.

Véase también


El primer pasaje se contradice a sí mismo, no necesita ayuda, pero llega el segundo y termina de complicar las cosas....: después de todo, ¿quién va primero, HistoryOrdersTotal o una de las tres funciones HistorySelect (start, end) HistorySelectByPosition() o HistoryOrderSelect(ticket), o incluso HistorySelectByPosition(), mencionadas en el segundo texto.

Ha sido difícil, podría haber sido más fácil... pero creo que lo primero que se me ocurre es una de las tres HistorySelect(start, end) HistorySelectByPosition () o HistoryOrderSelect(ticket), o incluso HistorySelectByPosition(), mencionadas en el segundo texto...

Documentação sobre MQL5: Funções de Negociação / HistoryOrdersTotal
Documentação sobre MQL5: Funções de Negociação / HistoryOrdersTotal
  • www.mql5.com
HistoryOrdersTotal - Funções de Negociação - Referência MQL5 - Referência sobre algorítimo/automatização de negociação na linguagem para MetaTrader 5
 

Buenas tardes,
pregunta a los desarrolladores: ¿podéis darme una información aproximada, de cuanta memoria ocupa la caché del historial? aproximadamente kbytes para una operación y un pedido.

He ejecutado el script en un terminal con un historial pequeño y he obtenido este resultado:

void OnStart()
  {
   Print("TerminalInfoInteger(TERMINAL_MEMORY_USED) = ", TerminalInfoInteger(TERMINAL_MEMORY_USED));
   if(HistorySelect(0, INT_MAX))
     {
      Print("TerminalInfoInteger(TERMINAL_MEMORY_USED) = ", TerminalInfoInteger(TERMINAL_MEMORY_USED));
      Print("HistoryDealsTotal  = ", HistoryDealsTotal());
      Print("HistoryOrdersTotal = ", HistoryOrdersTotal());
     }
  }

2021.05.14 14:46:41.265	TestCashSize (Si-6.21,H1)	TerminalInfoInteger(TERMINAL_MEMORY_USED) = 488
2021.05.14 14:46:41.285	TestCashSize (Si-6.21,H1)	TerminalInfoInteger(TERMINAL_MEMORY_USED) = 489
2021.05.14 14:46:41.285	TestCashSize (Si-6.21,H1)	HistoryDealsTotal  = 1928
2021.05.14 14:46:41.285	TestCashSize (Si-6.21,H1)	HistoryOrdersTotal = 1116

Esto significa que con un histórico de un par de millones de operaciones y un millón de órdenes, la caché ocupará aproximadamente un gigabyte?

¿Y así para cada programa mql?