Questions des débutants MQL5 MT5 MetaTrader 5 - page 741

 
fxsaber:
Vous avez demandé sans perversions. Et si vous l'avez fait, alors...
C'est pour ça que c'est comme ça.
double GetPositionCommission( void )
{
  double Commission = ::PositionGetDouble(POSITION_COMMISSION);

  // На случай, если POSITION_COMMISSION не работает
  if (Commission == 0)
  {
    const ulong Ticket = MT4ORDERS::GetPositionDealIn();

    if (Ticket > 0)
    {
      const double LotsIn = ::HistoryDealGetDouble(Ticket, DEAL_VOLUME);

      if (LotsIn > 0)
        Commission = ::HistoryDealGetDouble(Ticket, DEAL_COMMISSION) * ::PositionGetDouble(POSITION_VOLUME) / LotsIn;
    }
  }

  return(Commission);
}
Ou

Je sais que ce message est ancien, mais il vient de me frapper comme une écharde.

Ce bit ici n'est pas correct, la commission dans le forex peut être zéro.

// На случай, если POSITION_COMMISSION не работает
  if (Commission == 0)
 
Artyom Trishkin:
ObjectGetValueByShift() (MT4 uniquement), ObjectGetValueByTime() (MT4, MT5)

Merci.
 
Alexey Volchanskiy:

Je sais que ce message est ancien, mais il vient de me frapper comme une écharde.

Ce bit ici n'est pas correct, la commission dans le forex peut être zéro.


En quoi est-ce incorrect ?
 


Problème avec le constructeur de copie dans MQL5

Le tableau dynamique this.arr, dans le constructeur de copie, est vu par le débogueur comme unidimensionnel.

En conséquence, la taille de ob2.arr est égale à 0 dans la sortie.

Pourquoi ?

Le même fragment fonctionne correctement dans MQL4.

Éditeur MT5

MetaEditor 5.0 1578

Editeur MT4

MetaEditor 5.0 1562

class obj
  {
public:
   double            arr[][2];
                     obj(){}
                     obj(obj &o)
     {
      ArrayCopy(this.arr,o.arr);
     }
   obj operator=(obj &o)
     {
      ArrayCopy(this.arr,o.arr);
      return &this;
     }
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
obj Copy(obj &o)
  {
   return o;
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   obj ob1,ob2;
   ArrayResize(ob1.arr,3);
   ob2=Copy(ob1);
   bool stop=true;
  }


 
Klimenko_a_e:

Le résultat est que la taille ob2.arr est 0 dans la sortie.

Pourquoi ?

obj* Copy(obj &o)
  {
   return & o;
  };

Sinon, vous créez un nouvel objet.


   void operator=(obj &o)
     {
      ArrayCopy(this.arr,o.arr);
      return; // &this;
     }

Sinon, des choses inutiles se produisent.


Je doute que votre code fonctionne correctement dans MQL4.

 
Bonjour ! Pouvez-vous me dire comment ouvrir un ordre unique en attente?
Comment arrêter la boucle si je dois ouvrir un ordre en suspens alors que la baie est ouverte ???

Je peux en ouvrir un tas jusqu'à ce que le dépôt soit épuisé !

Je ne sais pas comment ouvrir un ordre en attente.

 
Akinak:
Bonjour ! Pouvez-vous me dire comment ouvrir un ordre unique en attente?
Comment arrêter la boucle si je dois ouvrir un ordre en suspens alors que la baie est ouverte ???

Je peux en ouvrir un tas jusqu'à ce que le dépôt soit épuisé !

Merci d'avance !


Vous devez d'abord découvrir "qui il est".

 
Vladislav Andruschenko:


D'abord, vous devez découvrir "qui il est".


Vladislav Andruschenko:


Vous devez d'abord découvrir "qui il est".


for(int i=0 ; i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS))
si(OrderSymbol()==Symbol())
si(OrderMagicNumber()==Magique)
si(b>0)
{
int tak=OrderSend(Symbol(),OP_SELLSTOP,Lots_work,SOPrase,Slip,0,0,",Magic,0,clrRed) ;
si(tak>0)
Print("SELLSTOP Ok") ;
sinon
Print("Erreur SELLSTOP") ;
}
si(s>0)
{
OrderSend(Symbol(),OP_BUYSTOP,Lots_work,BOPrase,Slip,0,0,",Magic,0,clrBlue) ;
si(tik>0)
Print("BUYSTOP Ok") ;
sinon
Print("Erreur BUYSTOP") ;
}

}


 

Eh bien, ce que vous faites dans le cycle est ceci :

vous ouvrez une position - vous ouvrez un ordre, le nombre de positions s'ajoute, le cycle se répète - à l'infini.

int OrderSTotal=OrdersTotal();
for(int i=0; i<OrderSTotal;i++)
  {
   if(OrderSelect(i,SELECT_BY_POS))
      if(OrderSymbol()==Symbol())
         if(OrderMagicNumber()==Magic)

           {
            if(b>0)
              {
               int tak=OrderSend(Symbol(),OP_SELLSTOP,Lots_work,SOPrase,Slip,0,0,"",Magic,0,clrRed);
               if(tak>0)
                  Print("SELLSTOP  Ok");
               else
                  Print("SELLSTOP  Error");
              }

            if(s>0)
              {
                int tik=OrderSend(Symbol(),OP_BUYSTOP,Lots_work,BOPrase,Slip,0,0,"",Magic,0,clrBlue);
               if(tik>0)
                  Print("BUYSTOP  Ok");
               else
                  Print("BUYSTOP  Error");
              }
           }
  }
//+------------------------------------------------------------------+


Tu dois savoir ce que sont b et s

 
fxsaber:

Sinon, vous créez un nouvel objet.


Sinon, des choses inutiles se produisent.


Je doute que votre code fonctionne correctement dans MQL4.

Dans le code réel - la fonction renvoie un objet.

Je pense que le constructeur de copie devrait créer une copie temporaire dans ce cas.

Le code fonctionne correctement dans MQL5 build 1545.

Dans la nouvelle version, le constructeur de copie ne peut même pas redimensionner un tableau unidimensionnel : erreur 4007.

Cela n'est pas correct à mon avis.