Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 1248

 
jaffer wilson:

@ Artyom Trishkin @ Vladimir Pastushak

En mi caso no funciona. No estoy pidiendo un nuevo puesto. Sé que calcula y devuelve el margen para un tipo de comercio. Pero es inútil si una operación ya está abierta y quiero saber el margen consumido por una operación de un determinado símbolo.

¿Puede ayudarme, por favor? Si no entiendes mi situación, házmelo saber.

Explicación sencilla del escenario:

Este campo se ve en ToolBox:

Este es el margen para los símbolos: AUDJPY, EURUSD y EURTRY.

Sé que puedo obtener este valor con AccountInfoDouble (ACCOUNT_MARGIN). Pero no puedo obtener el valor de un símbolo específico. Por ejemplo, quiero saber cuánto margen está consumiendo el EURUSD. Que no puedo realizar ninguna función. Por lo tanto, quiero saber cómo puedo calcularlo.

Espero que esta explicación sea suficiente para que tenga sentido.

//+------------------------------------------------------------------+
#include <Trade\PositionInfo.mqh> CPositionInfo     m_position;
//+------------------------------------------------------------------+
struct str__
  {
   string            symbol;
   double            margin;
  };
str__ symb[];
//+------------------------------------------------------------------+
void OnTick()
  {

   int total = PositionsTotal(), c = 0;

   ArrayResize(symb, total);

   for(int k = total - 1; k >= 0; k--)
      if(m_position.SelectByIndex(k))
        {
         symb[c].symbol = m_position.Symbol();

         if(m_position.PositionType() == POSITION_TYPE_BUY)
            symb[c].margin = SymbolMargin(symb[c].symbol, ORDER_TYPE_BUY, m_position.Volume());

         if(m_position.PositionType() == POSITION_TYPE_SELL)
            symb[c].margin = SymbolMargin(symb[c].symbol, ORDER_TYPE_SELL, m_position.Volume());

         c++;
        }
        
        ArrayPrint(symb,2);
  }
//+------------------------------------------------------------------+
double  SymbolMargin(string aSymbol, ENUM_ORDER_TYPE aType, double aLot = 1.0)
  {

   double margin = 0;

   MqlTick m_tick;
   if(SymbolInfoTick(aSymbol, m_tick))
     {
      if(m_tick.ask != 0.0)
         if(OrderCalcMargin(aType, aSymbol, aLot, m_tick.ask, margin))
            return (margin * aLot);
      if(m_tick.bid != 0.0)
         if(OrderCalcMargin(aType, aSymbol, aLot, m_tick.bid, margin))
            return (margin * aLot);
     }

   return -1;
  }
//+------------------------------------------------------------------+
 
Vladimir Pastushak :

@Vladimir Pastushak Lo intentaré. Pero déjame decirte que no es una solución viable. El valor dado por OrderCalcMargin () cambia cada vez. Pero el valor del margen no cambia. Si cierro alguna operación, el valor del margen será el mismo que cuando abrí la operación. Pero cuando uso OrderCalcMargin (), el valor que obtengo cambia y no se parece en nada al valor original.

Por favor, dígame si usted también ha probado esto en su lado. Sé que no funcionará. No obstante, lo utilizaré como usted insiste.

 
Vladimir Pastushak :

Abrí una operación con un tamaño de lote de 50 en EURUSD. Mira lo que obtuve después de usar tu función:

(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589500.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589505.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589495.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589490.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589485.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589490.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589485.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589480.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589475.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589470.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589465.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589455.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589450.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589450.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589450.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589450.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589450.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589450.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589460.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589465.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589460.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589455.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589450.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589445.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589450.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589445.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589450.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589445.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589445.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589445.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589445.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589450.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589445.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589440.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589440.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589440.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589445.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589450.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589445.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589445.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589450.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589445.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589450.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589460.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589465.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589460.00 

Verás, el margen cambia constantemente. Pero el valor de una operación ya abierta no cambia. ¿Puede decirme qué hacer ahora?

 
jaffer wilson:

Abrí una operación con un tamaño de lote de 50 en EURUSD. Mira lo que obtuve después de usar tu función:

Verás, el margen cambia constantemente. Pero el valor de una operación ya abierta no cambia. ¿Puede decirme qué hacer ahora?

//+------------------------------------------------------------------+
#include <Trade\PositionInfo.mqh> CPositionInfo     m_position;
//+------------------------------------------------------------------+
struct str__
  {
   string            symbol;
   double            margin;
  };
str__ symb[];
//+------------------------------------------------------------------+
void OnTick()
  {

   int total = PositionsTotal(), c = 0;

   ArrayResize(symb, total);

   for(int k = total - 1; k >= 0; k--)
      if(m_position.SelectByIndex(k))
        {
         symb[c].symbol = m_position.Symbol();

         if(m_position.PositionType() == POSITION_TYPE_BUY)
            symb[c].margin = SymbolMargin(symb[c].symbol, ORDER_TYPE_BUY, m_position.Volume(), m_position.PriceOpen());

         if(m_position.PositionType() == POSITION_TYPE_SELL)
            symb[c].margin = SymbolMargin(symb[c].symbol, ORDER_TYPE_SELL, m_position.Volume(), m_position.PriceOpen());

         c++;
        }

   ArrayPrint(symb, 2);
  }
//+------------------------------------------------------------------+
double  SymbolMargin(string aSymbol, ENUM_ORDER_TYPE aType, double aLot = 1.0, double aOpenPrice = 0)
  {

   double margin = 0;


   if(aOpenPrice != 0.0)
      if(OrderCalcMargin(aType, aSymbol, aLot, aOpenPrice, margin))
         return (margin * aLot);
   if(aOpenPrice != 0.0)
      if(OrderCalcMargin(aType, aSymbol, aLot, aOpenPrice, margin))
         return (margin * aLot);


   return -1;
  }
//+------------------------------------------------------------------+
 
Vladimir Pastushak :

He probado el código anterior.

Tengo esto:

(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589100.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589100.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589100.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589100.00 

Pero el valor esperado era así:


 
Vladimir Pastushak :

Para otros símbolos, el valor del margen sigue cambiando. Por lo tanto, OrderCalcMargin () no es la solución. Lo tienes. Pruébalo primero en tu lado, por favor.

 
jaffer wilson:

Para otros símbolos, el valor del margen sigue cambiando. Por lo tanto, OrderCalcMargin () no es la solución. Lo tienes. Pruébalo primero en tu lado, por favor.

2 órdenes 5891 * 2 = 11782 Si necesitas procesar el array símbolo por símbolo... No es un problema...

 
Vladimir Pastushak :

2 pedidos 5891 * 2 = 11782 Si necesitas procesar un array carácter por carácter... No es un problema...

Pero sólo hice una operación con el EURUSD. Y la función no funciona correctamente con otros símbolos.

 

¿Puedes decirme si hay un gancho para el indicador mql5? Para establecer dos propiedades de visualización.

#property indicator_separate_window
#property indicator_chart_window

Y de alguna manera enlazar diferentes salidas, cada una a su propia propiedad de mapeo.

 
Roman:

¿Puedes decirme si hay un gancho para el indicador mql5? Para establecer dos propiedades de visualización.

Y de alguna manera vincular la salida diferente, cada uno a su propia propiedad de mapeo.

No hay tales ganchos. Ni a la derecha ni a la izquierda. Ni para MQL5, ni para MQL4.

Utilice sus propias construcciones en el gráfico principal de la subventana.

Razón de la queja: