Errores típicos y cómo afrontarlos en el entorno comercial - página 9

 
Algotrader18:

¡Buenas tardes!

Tengo una pregunta similar para todos y especialmente para fxsaber.
Parece una pregunta primitiva, pero no encuentro la respuesta.
Aquí https://www.mql5.com/ru/forum/6343/page939 me dijeron "Intenta buscarlo. fxsaber ha estado trabajando en este problema durante un tiempo. Lo que funcionó, no lo sé, no me interesa". Así que decidí preguntarle.

La cuestión es la siguiente. He abierto una posición y quiero imprimir el contenido de MqlTradeResult:

retcode, order y volume se imprimen, pero deal y price son siempre ceros.
Por favor, díganme qué estoy haciendo mal y cómo puedo acceder (al menos, imprimirlo primero) al contenido de la estructura de resultados.

¿Qué te parece esto?

//+------------------------------------------------------------------+
   MqlTradeRequest request={0};
   MqlTradeResult  result={0};
//---
   request.action   = TRADE_ACTION_DEAL;    // type of trade operation
   request.symbol   = Pair1;                // symbol
   request.volume   = lots;                 // volume of lot
   request.type     = oper;                 // order type
   request.price    = priceOpen;            // price for opening
   request.deviation= Slippage;             // allowed deviation from the price
   request.magic    = magic;   
//---
   if(OrderSend(request,result))
     {
      Print ("retcode = " +IntegerToString (result.retcode) + "; ");        
      Print ("deal = " +IntegerToString (result.deal) + "; ");
      Print ("order = " +IntegerToString (result.order) + "; "); 
      Print ("volume = " +DoubleToString (result.volume) + "; ");  
      Print ("price = " +DoubleToString (result.price) + "; ");
     }
   else
     {
      // Здесь действия при ошибке открытия
     }
//+------------------------------------------------------------------+
 
Algotrader18:

Abro una posición y quiero imprimir el contenido de MqlTradeResult así:

retcode, order y volume se imprimen pero deal y price son siempre ceros.
Por favor, indíqueme qué estoy haciendo mal y cómo puedo acceder (al menos imprimirlo primero) al contenido de la estructura de resultados.

Los ceros se escriben en el resultado.

 
Artyom Trishkin:

¿Qué te parece esto?

Gracias, pero el resultado es el mismo...
 
fxsaber:

Los ceros y se prescriben en el resultado.

Pues entonces no está nada claro, pensaba que estaba haciendo algo mal, y si hay ceros ahí, ¿para qué sirve el resultado?
Veo una orden abierta, obtengo result.retcode 10009 y result.price = 0 ?
¿Puede explicar el significado de resultado si no contiene un resultado?
 
Algotrader18:
Por favor, explique qué sentido tiene si no contiene el resultado.

Esta es una característica de MT5 en la que el resultado es sólo una orden (ticket y sin precio) pero no una operación. Tienes varias opciones

  1. Averigua por ti mismo cómo funcionan las cosas.
  2. Utiliza desarrollos de nivel superior ya preparados (el nivel inferior está oculto) en los que se saltan casi todos los escollos.
 
fxsaber:

Esta es una característica de MT5 en la que el resultado es sólo una orden (ticket y sin precio) pero no una operación. Tienes varias opciones

  1. Averigua por ti mismo cómo funcionan las cosas.
  2. Utilice desarrollos de nivel superior ya preparados (el nivel inferior está oculto) en los que se saltan casi todos los escollos.
Gracias.

En MQL4 no había una estructura de resultados y recibíamos un ticket y seleccionábamos la orden adecuada y solicitábamos los datos necesarios. MQL5 tiene la estructura de resultados que contiene muchos datos necesarios, y sería ilógico no utilizarla.

1. Antes de hacer una pregunta en el foro, traté de "averiguar por mí mismo cómo funciona todo" y lo que veo - en la estructura de resultados:

struct MqlTradeResult
  {
   uint     retcode;          // Operation return code
   ulong    deal;             // Deal ticket, if it is performed
   ulong    order;            // Order ticket, if it is placed
   double   volume;           // Deal volume, confirmed by broker
   double   price;            // Deal price, confirmed by broker
   double   bid;              // Current Bid price
   double   ask;              // Current Ask price
   string   comment;          // Broker comment to operation (by default it is filled by description of trade server return code)
   uint     request_id;       // Request ID set by the terminal during the dispatch
   uint     retcode_external; // Return code of an external trading system
  };


present double price; // Precio de la transacción, confirmado por el corredor.

En el código de ejemplo del desarrollador

//--- send the request
   if(!OrderSend(request,result))
      PrintFormat("OrderSend error %d",GetLastError());     // if unable to send the request, output the error code
//--- information about the operation
   PrintFormat("retcode=%u  deal=%I64u  order=%I64u",result.retcode,result.deal,result.order);
sale result.deal, es decir, se supone que tiene sentido y no siempre se representa por cero en la estructura de resultados. Se podrían dar otros ejemplos que indiquen que tanto result.price como result.deal se pueden obtener de MqlTradeResul, que es lo que he intentado hacer.


En ningún lugar he visto información de que "Esta es una característica de MT5 donde el resultado es sólo una orden (ticket y sin precio), pero no una operación". ¿Podría decirme en qué información se basa para llegar a esta conclusión?

2. Si conoces algún "desarrollo de nivel superior ya preparado (el nivel inferior está oculto)", que permita obtener los parámetros de una posición inmediatamente después de su apertura (aparece el código 10009), sin necesidad de selección previa por ticket, por favor, ponme un ejemplo o dame un enlace a él.

 
Algotrader18:
Gracias.

En MQL4 no existía una estructura de resultados y seleccionábamos la orden adecuada y solicitábamos los datos necesarios. MQL5 tiene la estructura de resultados con muchos datos necesarios y sería ilógico no utilizarla.

1. Antes de hacer una pregunta en el foro, he intentado "averiguar por mí mismo cómo funciona todo" y lo que he visto es que el resultado de la estructura:


Hay un precio doble; // Precio de la transacción, confirmado por el corredor.

En el código de ejemplo del desarrollador

sale result.deal, es decir, se supone que tiene sentido y no siempre se representa por cero en la estructura de resultados. Hay otros ejemplos que indican que tanto result.price como result.deal se pueden obtener de MqlTradeResul, que es lo que he intentado hacer.


En ningún sitio he visto información de que "se trata de una característica de MT5 en la que el resultado es sólo una orden (ticket y sin precio) pero no una operación". ¿Podría decirme en qué información se basa para llegar a esta conclusión?

2. Si conoce algún "desarrollo de nivel superior listo (el nivel inferior está oculto)" que permita obtener los parámetros de una posición inmediatamente después de abrirla (aparece el código 10009), sin necesidad de una selección previa por ticket, por favor, ponga un ejemplo o dé un enlace a él.

Una solicitud de negociación da lugar a un rechazo o a una orden de mercado. Esto no es una operación, ni una posición generada por una operación.

  1. Se envía al servidor una orden de apertura de una posición (orden = orden)
  2. Si la orden es aceptada, se devuelve el resultado de aceptar la orden y ponerla en la cola.
  3. Si la orden se ha ejecutado, aparece la operación, el resultado de la ejecución de la orden.
  4. La operación dará lugar a una nueva posición, o a un aumento/disminución del tamaño de la posición existente, o al cierre de la posición, o a una refinanciación. O una nueva posición (en una cuenta de cobertura).
 
Artyom Trishkin:

Una solicitud de negociación tiene como resultado un rechazo o una orden de mercado. Esto no es una operación, ni una posición generada por una operación.

  1. Se envía al servidor una orden de apertura de una posición (orden = orden)
  2. Si la orden es aceptada, se devuelve el resultado de aceptar la orden y ponerla en la cola.
  3. Si la orden se ha ejecutado, aparecerá una operación como resultado de la ejecución de la orden.
  4. El resultado de una operación será una nueva posición, o un aumento/disminución del tamaño de una posición existente, o el cierre de una posición, o una refinanciación. O una nueva posición (en caso de una cuenta de cobertura)
Gracias - por favor, dígame:
- ¿Después de qué paso crees que aparece la estructura de resultado de la solicitud de comercio (MqlTradeResult), de los que has enumerado?

- Según la descripción de MQL5:
" Estructura del resultado de la solicitud de negociación (MqlTradeResult)
Como respuesta a una solicitud de comercio, el servidor de comercio devuelve datos que contienen el resultado del procesamiento de la solicitud de comercio como una estructura especial predefinida MqlTradeResult". y "10009 TRADE_RETCODE_DONE Orden ejecutada".

Es decir, el código de retorno del servidor de comercio 10009 significa que la solicitud de OrderSend se ejecutó con éxito, es decir, si solicito datos de MqlTradeResult, después de recibir el código 10009, ¿cómo puedo explicar que result.price = 0?
 
Algotrader18:
Gracias:
- ¿Después de qué paso, de los enumerados por usted, aparece la estructura del resultado de la solicitud de comercio (MqlTradeResult)?

- Según la descripción de MQL5:
" Estructura del resultado de la solicitud de negociación (MqlTradeResult)
Como respuesta a una solicitud de comercio, el servidor de comercio devuelve datos que contienen el resultado del procesamiento de la solicitud de comercio como una estructura especial predefinida MqlTradeResult". y "10009 TRADE_RETCODE_DONE Orden ejecutada".

Por lo tanto, el código de retorno del servidor de comercio 10009 significa que la solicitud OrderSend se ejecutó con éxito, es decir, si solicito datos de MqlTradeResult, después de recibir el código 10009, ¿cómo puedo explicar que result.price = 0?

10009 TRADE_RETCODE_DONE - usted mismo lo ha descrito - la orden se ejecuta. Esto es simplemente el hecho de que la orden se ha puesto en cola en el servidor para su ejecución.

Además, si esta orden se ejecuta (después de todo, puede ser rechazada por el servidor), entonces hay una operación - este es el resultado de la operación con el precio de apertura.

Leer sobre

OnTradeTransaction

Se llama en los Asesores Expertos cuando se produce un evento TradeTransaction. La función está destinada a procesar los resultados de la ejecución de las solicitudes de operaciones.

voidOnTradeTransaction( )
const MqlTradeTransaction&trans,// estructura de una transacción comercial
const MqlTradeRequest&request,// estructura de la solicitud
const MqlTradeResult& result// estructura de la respuesta
);

Документация по MQL5: Обработка событий / OnTradeTransaction
Документация по MQL5: Обработка событий / OnTradeTransaction
  • www.mql5.com
При обрабокте транзакций типа TRADE_TRANSACTION_REQUEST для получения дополнительной информации необходимо анализировать второй и третий параметры функции OnTradeTransaction() – Отправка торгового запроса на покупку приводит к цепи торговых транзакций, которые совершаются на торговом счете: 1) запрос  принимается на обработку, 2) далее для...
 
Algotrader18:

En ningún lugar he visto la información de que "Esta es una característica de MT5 donde el resultado es sólo una orden (ticket y sin precio) pero no una operación". Por favor, dígame en base a qué información ha llegado a esta conclusión.

Experiencia propia.

2. Si conoce algún "desarrollo de nivel superior ya preparado (el nivel inferior está oculto)", que permita obtener los parámetros de una posición inmediatamente después de su apertura (aparece el código 10009), sin necesidad de selección previa por ticket, por favor, ponga un ejemplo o dé un enlace a él.

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

#define Bid SymbolInfoDouble(_Symbol, SYMBOL_BID)
#define Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

void Variant1()
{
  if (OrderSelect(OrderSend(_Symbol, OP_BUY, 0.1, Ask, 100, 0, 0), SELECT_BY_TICKET))
    OrderPrint();
}

void Variant2()
{
  OrderSend(_Symbol, OP_SELL, 0.1, Bid, 100, 0, 0);
  MqlTradeResult result = MT4ORDERS::LastTradeResult;
  
  Print ("retcode = " +IntegerToString (result.retcode) + "; ");        
  Print ("deal = " +IntegerToString (result.deal) + "; ");
  Print ("order = " +IntegerToString (result.order) + "; "); 
  Print ("volume = " +DoubleToString (result.volume) + "; ");  
  Print ("price = " +DoubleToString (result.price) + "; ");
}

void OnStart()
{
  Variant1();
  Variant2();
}
#2212868739 2018.11.02 21:09:33 buy 0.10 EURUSD 1.13895 0.00000 0.00000 1.13892 -0.18 0.00 -0.26 0
retcode = 10009; 
deal = 2210317244; 
order = 2212868740; 
volume = 0.10000000; 
price = 1.13892000; 


Hay otra opción, pero es "avanzada".

Razón de la queja: