Preguntas de los principiantes MQL5 MT5 MetaTrader 5 - página 854

 
Estoy trasteando con CTrade::PositionClose(const ulong ticket,const ulong deviation=ULONG_MAX) y me doy cuenta de que no está exactamente organizado por dentro. Se trata de 2 códigos de retorno - bool y ResultRetcode(). RetCode no siempre se pone a cero internamente antes de devolver false, por lo que si PositionClose da false, RetCode puede devolver TRADE_RETCODE_DONE. Sería bueno que los desarrolladores sincronizaran estos 2 valores de retorno.
 
. ... Rick D. ... .:
Estoy trasteando con CTrade::PositionClose(const ulong ticket,const ulong deviation=ULONG_MAX) y me doy cuenta de que no está exactamente organizado por dentro. Se trata de 2 códigos de retorno - bool y ResultRetcode(). RetCode no siempre se pone a cero internamente antes de devolver false, por lo que si PositionClose da false, RetCode puede devolver TRADE_RETCODE_DONE. Sería bueno que los desarrolladores sincronizaran estos 2 valores de retorno.

Código + ejemplo + registros.

 
He encontrado un extraño error. Tal vez sea sólo para mí.

COrderInfo::OrderType() siempre devuelve 0.

Para comprobarlo, puede colocar manualmente cualquier orden pendiente (BuyStop, SellStop, ...),
y luego introducirlo en el script.
#include <Trade\Trade.mqh>

COrderInfo m_order;

void OnStart()
{
  ulong ticket = 250262937; //здесь ваш тикет
  
  if (!m_order.Select(ticket))
  {
    PrintFormat("COrderInfo::Select(#%I64u) failed", ticket);
    return;
  }
  
  PrintFormat("OrderType= %d", m_order.Type());
}

¿Tal vez algo con la tabla de funciones virtuales? En la depuración, sólo llego al int virtual CObject::Type()

PS. Ya me lo he imaginado. COrderInfo tiene 2 métodos similares: Type() y OrderType().

 
Vladimir Karputov:

Código + ejemplo + registros.

Vea a qué situación me refiero.

#include <Trade\Trade.mqh>

CTrade m_trade;

void OnStart()
{ 
  int LErr;
  bool bRC;
  double price;

  ResetLastError();
  
  price = 0.0;
  bRC = m_trade.Buy(0.1, "EURUSD", price, 0.0, 0.0);

  LErr = GetLastError();

  PrintFormat("! Buy:  (bRC= %s)(RetCode= %u: %s)(LErr= %d)",
    ticket,
    (string)bRC, 
    m_trade.ResultRetcode(), 
    m_trade.ResultComment(), 
    LErr
  );
  
  //В m_trade.ResultRetcode() теперь TRADE_RETCODE_DONE
  
  //---

  ulong ticket = 1; //Позиции с таким тикетом нет
  
  ResetLastError();

  bRC = m_trade.PositionClose(ticket);  

  LErr = GetLastError();
  
  PrintFormat("! Close #%I64u:  (bRC= %s)(RetCode= %u: %s)(LErr= %d)",
    ticket,
    (string)bRC, 
    m_trade.ResultRetcode(), 
    m_trade.ResultComment(), 
    LErr
  );
  
  //В m_trade.ResultRetcode() все еще TRADE_RETCODE_DONE
}

No veo ningún método SetResultRetcode y SetResultComment en CTrade para restablecerlos antes de cada nueva operación.

Tengo que heredar mi clase, donde añado un único método


class CTradeEx : public CTrade
{
public:
  void SetResult(MqlTradeResult& result)
  {
    m_result = result;
  }  
};
 
. ... Rick D. ... .:

Vea a qué situación me refiero.

No veo ningún método SetResultRetcode y SetResultComment en CTrade para restablecerlos antes de cada nueva operación.

¿Para qué? Funciones completamente innecesarias.

Primero: disparas al aire - envías una orden comercial sin comprobar primero - sin comprobar lo que la operación devolvió. Mira la referencia:PositionClose es de tipo bool.

En segundo lugar, veamos la cadena de cierre de la posición: cuando la posición no se encuentra (no puede ser seleccionada por la entrada especificada), se devuelve "false".

//+------------------------------------------------------------------+
//| Close specified opened position                                  |
//+------------------------------------------------------------------+
bool CTrade::PositionClose(const ulong ticket,const ulong deviation)
  {
//--- check stopped
   if(IsStopped(__FUNCTION__))
      return(false);
//--- check position existence
   if(!PositionSelectByTicket(ticket))
      return(false);
   string symbol=PositionGetString(POSITION_SYMBOL);
//--- clean

En ese momento, las estructuras no se borran en ninguna parte - porque no tiene sentido - después de todo, la posición no pudo ser seleccionada antes, por lo tanto no hay información en las estructuras.

 
Vladimir Karputov:

¿Qué sentido tiene? Funciones completamente innecesarias.

Primero: disparas al aire - envías una orden comercial sin comprobar primero - sin comprobar lo que la operación devolvió. Veamos la referencia:PositionClose es de tipo bool.

En segundo lugar, veamos la cadena de cierre de la posición: cuando la posición no se encuentra (no puede ser seleccionada por la entrada especificada), se devuelve "false".

Al mismo tiempo, las estructuras no se borran en ninguna parte, ya que no tiene sentido - después de todo, la posición no pudo ser seleccionada antes, por lo tanto no hay información en las estructuras.

1) También podemos decir que ResetLastError() es una función absolutamente innecesaria.

2) Hay una comprobación del resultado devuelto. Imagine, por analogía, que llama a alguna función WinAPI, ésta devuelve un error, y GetLastError() (análogo de ResultRetcode) devuelve cualquier último código.

Si añado alguna comprobación antes de llamar a PositionClose (que lo haré), no anula ninguna otra comprobación antes de otras llamadas, cuando el RetCode no cambiará.

Mi Asesor Experto escribe información en el registro. Todo lo que necesito es escribir en el log ResultRetcode y ResultComment si alguna llamada devuelve false.

 
. ... Rick D. ... .:

1) También podríamos decir que ResetLastError() es completamente innecesario.

2) Hay una comprobación del resultado de la devolución. Imagine, por analogía, que llama a alguna función WinAPI, ésta devuelve un error, y GetLastError() (análogo de ResultRetcode) devuelve cualquier último código.

Si añado alguna comprobación antes de llamar a PositionClose (que lo haré), no anula ninguna otra comprobación antes de otras llamadas cuando el RetCode no cambia.

Mi Asesor Experto escribe información en el registro. Todo lo que necesito hacer es escribir ResultRetcode y ResultComment sanos en el registro si alguna llamada devuelve false.

Lea en la ayuda de la clase CTrade cuando necesitecomprobar el resultado de la ejecución de la solicitud de comercio (código de retorno del servidor de comercio) llamando al métodoResultRetcode().

 
Vladimir Karputov:

Leer en la ayuda de la clase CTrade cuandocomprobar el resultado de la ejecución de la solicitud de comercio (código de retorno del servidor de comercio) llamando al métodoResultRetcode().

Puedes afirmarlo.

1) ¿Si PositionClose devuelve false, entonces el Retcode nunca se llena?

2) ¿Si PositionClose devuelve true, entonces el Retcode se rellena siempre?

 
Vladimir Karputov:

Orden -> operación -> posición. Toma el precio de apertura de la posición.

Puede mostrar una imagen de cómo esta Orden -> comercio -> posición, está por debajo de donde se escriben las operaciones por lo que no permite copiar allí


 
Seric29:

Puedes mostrar una imagen de cómo esta Orden -> operación -> posición, es en la parte inferior donde se escriben las operaciones por lo que no te deja copiar.


Por favor, reescriba su pregunta o ponga signos de puntuación, o mejor aún, añada en una imagen qué, dónde y quién. De lo contrario, resulta que veo letras conocidas, pero no puedo entender el significado y su punto.