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

 

¡Que os vaya bien a todos!

Tengo una pregunta sobre la función ResultDeal() en la clase CTrade.

El caso es que en el Probador de Estrategias esta función devuelve el ticket de la operación sin ningún problema, pero al lanzar el EA en el Gráfico siempre devuelve "cero", a pesar de que la función ResultRetcode() siempre devuelve "TRADE_RETCODE_DONE".

Ejemplo de código:

/////////////////////////////////////////////////////////////////////
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>
/////////////////////////////////////////////////////////////////////
CTrade Trade;
CSymbolInfo SymbolInfo;

uint Retcode;
ulong TicketDeal;
bool first_calc;
bool second_calc;
bool third_calc;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
//---
   TicketDeal = 9999999;
   
   first_calc = true;
   second_calc = false;
   third_calc = false;   
//---
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
//---
   if(first_calc)
   {
      first_calc = false;
      second_calc = true;
      
      SymbolInfo.Name(Symbol());
      SymbolInfo.RefreshRates();
      Trade.Buy(1.0, Symbol(), SymbolInfo.Ask(), 0.0, 0.0, "BUY");
//---
      Retcode = Trade.ResultRetcode();
      if(Retcode == TRADE_RETCODE_DONE) TicketDeal = Trade.ResultDeal();
      
      Print("first_calc ////////////////////////////////////");
      Print("PositionsTotal(): ", PositionsTotal());
      Print("Retcode: ", Retcode, "; TicketDeal: ", TicketDeal);
   }
   else
   {
      if(second_calc)
      {
         second_calc = false;
         third_calc = true;
//---
         Retcode = Trade.ResultRetcode();
         if(Retcode == TRADE_RETCODE_DONE) TicketDeal = Trade.ResultDeal();
         
         Print("second_calc ////////////////////////////////////");
         Print("PositionsTotal(): ", PositionsTotal());
         Print("Retcode: ", Retcode, "; TicketDeal: ", TicketDeal);
      }
      else
      {
         if(third_calc)
         {
            third_calc = false;
//---
            Retcode = Trade.ResultRetcode();
            if(Retcode == TRADE_RETCODE_DONE) TicketDeal = Trade.ResultDeal();
            
            Print("third_calc ////////////////////////////////////");
            Print("PositionsTotal(): ", PositionsTotal());
            Print("Retcode: ", Retcode, "; TicketDeal: ", TicketDeal);
         }
         else
         {
            //Print("TicketDeal: ", Trade.ResultDeal());
         }
      }
   }   
}
//+------------------------------------------------------------------+

Registro de ejecución en el Probador:

2020.11.25 18:08:54.225 Core 1  2020.11.23 00:05:00   first_calc ////////////////////////////////////
2020.11.25 18:08:54.225 Core 1  2020.11.23 00:05:00   PositionsTotal(): 1
2020.11.25 18:08:54.225 Core 1  2020.11.23 00:05:00   Retcode: 10009; TicketDeal: 2
2020.11.25 18:08:54.225 Core 1  2020.11.23 00:05:02   second_calc ////////////////////////////////////
2020.11.25 18:08:54.225 Core 1  2020.11.23 00:05:02   PositionsTotal(): 1
2020.11.25 18:08:54.225 Core 1  2020.11.23 00:05:02   Retcode: 10009; TicketDeal: 2
2020.11.25 18:08:54.225 Core 1  2020.11.23 00:05:05   third_calc ////////////////////////////////////
2020.11.25 18:08:54.225 Core 1  2020.11.23 00:05:05   PositionsTotal(): 1
2020.11.25 18:08:54.225 Core 1  2020.11.23 00:05:05   Retcode: 10009; TicketDeal: 2

Registro de ejecución en la Carta:

2020.11.25 18:08:13.991 _TestSelect (EURUSD,M1) first_calc ////////////////////////////////////
2020.11.25 18:08:13.991 _TestSelect (EURUSD,M1) PositionsTotal(): 0
2020.11.25 18:08:13.991 _TestSelect (EURUSD,M1) Retcode: 10009; TicketDeal: 0
2020.11.25 18:08:14.026 _TestSelect (EURUSD,M1) second_calc ////////////////////////////////////
2020.11.25 18:08:14.027 _TestSelect (EURUSD,M1) PositionsTotal(): 1
2020.11.25 18:08:14.027 _TestSelect (EURUSD,M1) Retcode: 10009; TicketDeal: 0
2020.11.25 18:08:14.260 _TestSelect (EURUSD,M1) third_calc ////////////////////////////////////
2020.11.25 18:08:14.260 _TestSelect (EURUSD,M1) PositionsTotal(): 1
2020.11.25 18:08:14.260 _TestSelect (EURUSD,M1) Retcode: 10009; TicketDeal: 0


¿Qué estoy haciendo mal? ¿Cómo puedo obtener un billete de comercio en tiempo real?

Y la segunda pregunta (de menor importancia), ¿por qué inmediatamente después de la ejecución de una operación la función PositionsTotal() devuelve "cero"? Y muestra datos fiables con el siguiente tick. ¿Es posible obtener esta información de inmediato?


Archivos adjuntos:
 
ZAKST:

¡Que os vaya bien a todos!

Tengo una pregunta sobre la función ResultDeal() en la clase CTrade.

El caso es que en el Probador de Estrategias esta función devuelve el ticket de la operación sin ningún problema, pero al lanzar el EA en el Gráfico siempre devuelve "cero", a pesar de que la función ResultRetcode() siempre devuelve "TRADE_RETCODE_DONE".

Ejemplo de código:

Registro de ejecución en el Probador:

Registro de ejecución en la Carta:


¿Qué estoy haciendo mal? ¿Cómo puedo obtener un billete de comercio en tiempo real?

Y la segunda pregunta (de menor importancia), ¿por qué inmediatamente después de la ejecución de una operación la función PositionsTotal() devuelve "cero"? Y muestra datos fiables con el siguiente tick. ¿Es posible obtener esta información de inmediato?


Hmm... De repente los datos que necesito en tiempo real son devueltos por la función ResultOrder() de la misma claseCTrade, aunque no he utilizado órdenes pendientes...

Mi pregunta es la misma: ¿Qué estoy haciendo mal?

 

Hay una macro como esta.

#define  Warning if(ComentWarnig)LogWarnig.Write(__FILE__":"+IntegerToString(__LINE__,4,'0')+" ",

Yo lo uso así.

Warning"Warnig  сработал. ");

Pregunta: ¿Qué hay que corregir en la definición de la macro para poder utilizarla así?

Warning("Warnig  сработал. ");

es decir, con un paréntesis entre Warning y "Warnig worked. "Intento de utilizar un paréntesis en la definición de la macro

#define  Warning( if(ComentWarnig)LogWarnig.Write(__FILE__":"+IntegerToString(__LINE__,4,'0')+" ",

pero el compilador no me deja usar un paréntesis.

 
ZAKST:

Hmm... De repente, la función ResultOrder() de la misma claseCTrade devuelve los datos que necesito en tiempo real, aunque no he utilizado órdenes pendientes...

La pregunta es la misma: ¿Qué estoy haciendo mal?

Sólo hay que entender el sistema de órdenes de MT5, orden - operación - posición.

ResultOrder es la orden de apertura. La posición será con POSITION_IDENTIFIER igual al ticket de esta orden.

Todas las operaciones se pueden encontrar en el historial por el identificador de posición. No hay que confundir con el billete de la posición, puede cambiar, y el identificador es constante.

s.s. El probador se diferencia en que no hay retraso en la ejecución de la orden y la operación se crea inmediatamente. En la vida real, el tiempo pasa y en el momento de la creación exitosa de una orden todavía no hay ningún acuerdo, tiene que ser capturado en los eventos OnTrade
Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства позиций
Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства позиций
  • www.mql5.com
Тикет позиции. Уникальное число, которое присваивается каждой вновь открытой позиции. Как правило, соответствует тикету ордера, в результате которого она была открыта, за исключением случаев изменения тикета в результате служебных операций на сервере. Например, начисления свопов переоткрытием позиции. Для нахождения ордера, которым была открыта...
 
pivomoe:

Hay una macro como esta.

Yo lo uso así.

Pregunta: ¿Qué hay que corregir en la definición de la macro para poder utilizarla así?

es decir, con un paréntesis entre Warning y "Warnig worked. "Intento de utilizar un paréntesis en la definición de la macro

pero el compilador no te deja usar un paréntesis.

quiere utilizar una forma paramétrica, pero ha especificado una forma no paramétrica. debería ser así

#define  Warning(CUSTOM) (if(ComentWarnig)LogWarnig.Write(__FILE__":"+IntegerToString(__LINE__,4,'0')+"",string(CUSTOM)))


Warning("Warnig  сработал. ");
 

No lo he explicado bien. Empecemos por el principio. Ahora estoy usando la macro así:

Warning,"Warnig  сработал. i=",i);

Aquí está la macro en sí:

#define  Warning if(LogWarnig)MoiLoggerWarnig.Write(__FILE__":"+IntegerToString(__LINE__,4,'0')

En la llamada a la macro entre "Aviso" y ");" Un número arbitrario de parámetros de tipos arbitrarios. Todo esto se consigue recargando repetidamente la función deescritura.

Pregunta. Qué debo corregir en la macro para poder llamarla así:

Warning("Warnig  сработал. i=",i);
 
pivomoe:

No lo he explicado bien. Empecemos por el principio. Ahora estoy usando la macro así:

Aquí está la macro en sí:

En la llamada a la macro entre "Aviso" y ");" Un número arbitrario de parámetros de tipos arbitrarios. Todo esto se consigue recargando repetidamente la función deescritura.

Pregunta. Qué debería corregirse en la macro para permitir su llamada así:

Respuesta: también recargar repetidamente la macro)

Pero es mejor usar el operador + para cadenas y convertir todo en cadenas, entonces no necesitas una versión de función (y macro) con muchos parámetros

 
Aleksey Mavrin:

Sólo hay que entender el sistema de órdenes de MT5, orden - operación - posición.

ResultOrder es la orden de apertura. La posición será con POSITION_IDENTIFIER igual al ticket de esta orden.

Todas las operaciones se pueden encontrar en el historial por el identificador de posición. No hay que confundir con el billete de la posición, puede cambiar, y el identificador es constante.

s.s. El probador es diferente en cuanto a que no hay retraso en la ejecución de la orden e inmediatamente nace una operación. En el comercio real el tiempo pasa y en el momento de la creación de la orden con éxito no hay ningún acuerdo todavía, tiene que ser capturado en los eventos OnTrade.
Gracias por su respuesta. Me ocuparé de ello))
 
¿Cómo puedo acceder a las propiedades de un indicador desde un EA? Por ejemplo, quiero cambiar el color de una línea de un EA conociendo el mango del indicador. He buscado en la ayuda, no he encontrado nada, ¿quizás no estoy buscando lo suficiente?
 
Tango_X:
¿Cómo puedo acceder a las propiedades de los indicadores desde un EA? Por ejemplo, quiero cambiar el color de la línea de un EA si conozco el mango del indicador. Lo he buscado y no lo he encontrado, ¿quizás estoy buscando demasiado?

Un indicador para esto debe tener un parámetro de color de entrada. Es decir, debe ser un indicador personalizado.