Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 1248

 
jaffer wilson:

Artyom Trishkin Vladimir Pastushak

Ça ne marche pas dans mon cas. Je ne demande pas un nouveau poste. Je sais qu'il calcule et restitue la marge pour un type de transaction. Mais c'est inutile si une transaction est déjà ouverte et que je veux connaître la marge consommée par une transaction d'un symbole particulier.

Pouvez-vous m'aider ? Si vous ne comprenez pas ma situation, faites-le moi savoir.

Explication simple du scénario :

Vous voyez ce champ dans ToolBox :

Il s'agit de la marge pour les symboles : AUDJPY, EURUSD et EURTRY.

Je sais que je peux obtenir cette valeur avec AccountInfoDouble (ACCOUNT_MARGIN). Mais je n'arrive pas à obtenir la valeur d'un symbole spécifique. Par exemple, je veux savoir combien de marge l'EURUSD consomme. Que je ne peux remplir aucune fonction. Par conséquent, je veux savoir comment je peux le calculer.

J'espère que cette explication est suffisante pour avoir du sens.

//+------------------------------------------------------------------+
#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 Je vais essayer. Mais laissez-moi vous dire que ce n'est pas une solution viable. La valeur donnée par OrderCalcMargin () change à chaque fois. Mais la valeur de la marge ne change pas. Si je ferme une transaction, la valeur de la marge sera la même que lorsque j'ai ouvert la transaction. Mais lorsque j'utilise OrderCalcMargin (), la valeur que j'obtiens change et ne ressemble pas du tout à la valeur d'origine.

Veuillez me faire savoir si vous avez également essayé cela de votre côté. Je sais que ça ne marchera pas. Néanmoins, je vais l'utiliser comme vous l'avez demandé.

 
Vladimir Pastushak :

J'ai ouvert une transaction avec une taille de lot de 50 en EURUSD. Voyez ce que j'ai obtenu après avoir utilisé votre fonction :

(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 

Vous voyez, la marge est en constante évolution. Mais la valeur d'une transaction déjà ouverte ne change pas. Pouvez-vous me dire ce qu'il faut faire maintenant ?

 
jaffer wilson:

J'ai ouvert une transaction avec une taille de lot de 50 en EURUSD. Voyez ce que j'ai obtenu après avoir utilisé votre fonction :

Vous voyez, la marge est en constante évolution. Mais la valeur d'une transaction déjà ouverte ne change pas. Pouvez-vous me dire ce qu'il faut faire maintenant ?

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

J'ai essayé le code ci-dessus.

J'ai eu ça :

(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 

Mais la valeur attendue était la suivante :


 
Vladimir Pastushak :

Pour les autres symboles, la valeur de la marge change toujours. Par conséquent, OrderCalcMargin () n'est pas la solution. Tu l'as. Essayez d'abord sur votre côté, s'il vous plaît.

 
jaffer wilson:

Pour les autres symboles, la valeur de la marge change toujours. Par conséquent, OrderCalcMargin () n'est pas la solution. Tu l'as. Essayez d'abord sur votre côté, s'il vous plaît.

2 commandes 5891 * 2 = 11782 Si vous devez traiter le tableau symbole par symbole... Ce n'est pas un problème...

 
Vladimir Pastushak :

2 commandes 5891 * 2 = 11782 Si vous devez traiter un tableau caractère par caractère... Ce n'est pas un problème...

Mais je n'ai effectué qu'une seule transaction sur l'EURUSD. Et la fonction ne fonctionne pas correctement avec d'autres symboles.

 

Pouvez-vous me dire s'il existe un crochet pour l'indicateur mql5 ? Pour définir deux propriétés d'affichage.

#property indicator_separate_window
#property indicator_chart_window

Et d'une manière ou d'une autre, lier différentes sorties, chacune à sa propre propriété de mappage.

 
Roman:

Pouvez-vous me dire s'il existe un crochet pour l'indicateur mql5 ? Pour définir deux propriétés d'affichage.

Et d'une manière ou d'une autre, lier différentes sorties, chacune à sa propre propriété de mappage.

Il n'y a pas de tels crochets. Ni à droite, ni à gauche. Ni pour MQL5, ni pour MQL4.

Utilisez vos propres constructions sur le graphique principal à partir de la sous-fenêtre.

Raison: