Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 1248

 
jaffer wilson:

@ Artyom Trishkin @ Vladimir Pastushak

Não funciona no meu caso. Eu não estou pedindo um novo posto. Sei que ele calcula e devolve margem para um tipo de comércio. Mas é inútil se um comércio já está aberto e eu quero saber a margem consumida por um comércio de um determinado símbolo.

Você pode me ajudar, por favor? Se você não entender minha situação, me avise.

Explicação simples do cenário:

Você vê este campo em ToolBox:

Esta é a margem para os símbolos: AUDJPY, EURUSD e EURTRY.

Eu sei que posso obter este valor com AccountInfoDouble (ACCOUNT_MARGIN). Mas eu não consigo obter o valor de um símbolo específico. Por exemplo, quero saber qual a margem que a EURUSD está consumindo. Que eu não posso desempenhar nenhuma função. Portanto, quero saber como posso calculá-lo.

Espero que esta explicação seja suficiente para fazer 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 Eu vou tentar. Mas deixe-me dizer-lhe que não é uma solução exequível. O valor dado pela OrderCalcMargin () muda a cada vez. Mas o valor da margem não muda. Se eu fechar qualquer comércio, o valor da margem será o mesmo que era quando eu abri o comércio. Mas quando eu uso OrderCalcMargin (), o valor que eu recebo muda e não é nada parecido com o valor original.

Por favor, me avise se você também tentou isso do seu lado. Eu sei que não vai funcionar. No entanto, vou usá-la como você insiste.

 
Vladimir Pastushak :

Abri um comércio com um tamanho de lote de 50 em EURUSD. Veja o que eu recebi depois de usar sua função:

(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 

Veja, a margem está em constante mudança. Mas o valor de um comércio já aberto não muda. Você pode me dizer o que fazer agora?

 
jaffer wilson:

Abri um comércio com um tamanho de lote de 50 em EURUSD. Veja o que eu recebi depois de usar sua função:

Veja, a margem está em constante mudança. Mas o valor de um comércio já aberto não muda. Você pode me dizer o que fazer agora?

//+------------------------------------------------------------------+
#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 :

Eu tentei o código acima.

Eu recebi isto:

(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 

Mas o valor esperado era este:


 
Vladimir Pastushak :

Para outros símbolos, o valor da margem ainda muda. Portanto, a OrderCalcMargin () não é a solução. Você conseguiu. Experimente primeiro do seu lado, por favor.

 
jaffer wilson:

Para outros símbolos, o valor da margem ainda muda. Portanto, a OrderCalcMargin () não é a solução. Você conseguiu. Experimente primeiro do seu lado, por favor.

2 pedidos 5891 * 2 = 11782 Se você precisar processar a matriz símbolo por símbolo... Não é um problema...

 
Vladimir Pastushak :

2 pedidos 5891 * 2 = 11782 Se você precisar processar um array caracter por caracter... Não é um problema...

Mas eu fiz apenas uma negociação no EURUSD. E a função não funciona corretamente com outros símbolos.

 

Você pode me dizer se existe um gancho para o indicador mql5? Para definir duas propriedades de exibição.

#property indicator_separate_window
#property indicator_chart_window

E, de alguma forma, vincular diferentes resultados, cada um a sua própria propriedade de mapeamento.

 
Roman:

Você pode me dizer se existe um gancho para o indicador mql5? Para definir duas propriedades de exibição.

E, de alguma forma, ligam produções diferentes, cada uma a sua própria propriedade de exibição.

Não existem tais ganchos. Não à direita nem à esquerda. Nem para a MQL5, nem para a MQL4.

Use suas próprias construções na tabela principal da subjanela.