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

 
EVGENII SHELIPOV #:

Bonne journée ! !!

Veuillez m'aider à écrire un code pour fermer les ordres min et max dans un EA de grille lorsqu'un certain niveau de drawdown est atteint.

J'ai écrit deux fonctions pour calculer le profit des ordres max et min.

J'ai également écrit une fonction qui calcule le montant de ces commandes. Il ne semble pas y avoir de problème ici.

La question est de savoir comment fermer uniquement ces deux ordres. J'ai trouvé la fonction ClosseAll().

La question est de savoir comment modifier la fonction OrderTicket() qui ferme tous les ordres.

pour attacher les variables max_ticket et min_ticket qui déterminent les tickets de seulement les commandes min et max dans la grille

Ou est-ce que VOUS avez VOTRE solution à ce problème

void ClosseAll()
{
  int slip = MarketInfo(_Symbol,MODE_SPREAD)*2;
  for(int i = OrdersTotal()-1; i>=0; i--)
  {
     if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
     {
      if (OrderClose(max_ticket , OrderLots(), Bid, slip)&&OrderClose(min_ticket , OrderLots(), Bid, slip))
            Print("OK");
      else
            Print("Не удалось закрыть ордер! ",GetLastError());
     }
  }
}

et le réparer.

if(OrderTicket() > max_ticket) max_ticket = OrderTicket();
 
makssub #:

Désolé, je l'ai encore mal écrit. Laissez-moi essayer à nouveau)

Il existe une grille d'ordres ouverts. Je dois trouver le prix d'ouverture (OrderOpenPrice) de l'ordre le plus proche du prix actuel. Afin de continuer à construire la grille, mais mes commandes sont construites de façon presque chaotique.

Je comprends comment écrire le dépassement, mais je suis incapable de l'exprimer correctement dans la langue (je suis comme un chien, je comprends tout)).

Si vous avez des exemples ou des liens vers des exemples, publiez-les, s'il vous plaît. MQL4

dans une boucle :

if (MathAbs(OrderOpenPrice()-Bid)<previous_value)
   {
   previous_value=MathAbs(OrderOpenPrice()-Bid);
   nearest_order=OrderTicket();
   }

avant la boucle initialiser previous_value=DBL_MAX a nearest_order=0

 
PapaYozh #:

En quoi est-elle différente, d'ailleurs, hormis le fait qu'elle est appelée implicitement lors de la création de l'objet ?

et en plus quand vous l'appelez dans le constructeur, aucune mémoire n'est encore allouée, ça ne compile pas :

class A
{
public:
   int               val;
                     A() {}
};
//+------------------------------------------------------------------ +
class B
{
public:
   A                 a;
                     B():a(),a.val(10) {} //
};

mais dans le corps du constructeur, pas de problème :

class A
{
public:
   int               val;
                     A() {}
};
//+------------------------------------------------------------------ +
class B
{
public:
   A                 a;
                     B():a() {a.val=10;}
};



à propos des constructeurs de classes de base - ils peuvent être appelés explicitement:

class A
{
public:
   int               val;
                     A(const int v): val(v) {}
                     A() {}
};
//+------------------------------------------------------------------ +
class B: public A
{
public:
                     B(): A(100) {}
};
 
MakarFX #:

Réparez ça aussi.

Au sujet du glissement que j'ai déjà au début du conseiller

MakarFX #:

et réparer ça.

MakarFX #:

fixer ce point

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int init() 
{
   Spread = MarketInfo(Symbol(), MODE_SPREAD) * Point;
   MinLot = MarketInfo(Symbol(),MODE_MINLOT);
   return (0);
}

Seuls les ordres maximaux sont fermés selon les résultats de fermeture


 
Taras Slobodyanik #:

dans la boucle :

initialiser previous_value=DBL_MAX a nearest_order=0 avant la boucle

MakarFX #:

et corrigez ceci

MakarFX #:

et réparer ça.

Pour les erreurs dans le journal


 
Bonjour Est-ce que quelqu'un a entendu parler de MirachLtd-Real. Est-ce que quelqu'un a des commentaires ?

 
EVGENII SHELIPOV #:

A propos du slippage que j'ai déjà au début de l'EA

Ce slippage est exactement pour cette fonction... ainsi vous n'avez pas besoin de passer par BUY ou SELL.

//--- global parameters
int max_ticket = 0;
int min_ticket = INT_MAX;
//+----------------------------------------------------------------------------+
void ClosseAll()
{
  int slipp = MarketInfo(_Symbol,MODE_SPREAD)*2;
  for(int i = OrdersTotal()-1; i>=0; i--)
  {
     if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
     {
      if (OrderClose(max_ticket , OrderLots(), Bid, slipp)&&OrderClose(min_ticket , OrderLots(), Bid, slipp))
            Print("OK");
      else
            Print("Не удалось закрыть ордер! ",GetLastError());
     }
  }
}
//+----------------------------------------------------------------------------+
//| Расчет профита максимального ордера в сетке                                |
//+----------------------------------------------------------------------------+
double GetProfitMaxOrder()
{
   double max_ticket_profit = 0 ;
      {
      for (int cnt = OrdersTotal() - 1; cnt >= 0; cnt--) 
         {
         if(OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES))
            {
            if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
               {
               if(OrderType() == OP_BUY || OrderType() == OP_SELL)
                  {
                  if(OrderTicket() > max_ticket) 
                     {
                     max_ticket = OrderTicket();
                     max_ticket_profit =  OrderProfit();
                     }
                  }
               }
            }
         }
      }
   return( max_ticket_profit);
}
//+----------------------------------------------------------------------------+
//| Расчет профита минимального ордера в сетке                                 |
//+----------------------------------------------------------------------------+
double GetProfitMinOrder()
{
   double min_ticket_profit = 0;
      {
      for (int cnt = OrdersTotal() - 1; cnt >= 0; cnt--) 
         {
         if(OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES))
            {
            if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic) 
               {
               if (OrderType() == OP_BUY || OrderType() == OP_SELL)
                  {
                  if(OrderTicket() < min_ticket)
                     {
                     min_ticket = OrderTicket();
                     min_ticket_profit = OrderProfit(); 
                     }
                  }
               }
            }
         }
      }
   return(min_ticket_profit);
 
Comment mieux créer un objet de classe: après la description de la classe ou localement, par exemple dans OnTick() ? La deuxième option n'est probablement pas très économique : charge du CPU et de la RAM.
 
MakarFX #:

Ce glissement est juste pour cette fonction... ainsi vous n'avez pas besoin de passer par BUY ou SELL.

int slipp = MarketInfo(_Symbol,MODE_SPREAD)*2;

Vous n'avez pas besoin de multiplier par un point ici.

perte possible de données due à la conversion de type NEVALASHKA.mq4 376 13

J'obtiens un avertissement au moment de la compilation


 
EVGENII SHELIPOV #:

Il n'est pas nécessaire de multiplier par un point

perte possible de données due à la conversion de type NEVALASHKA.mq4 376 13

J'obtiens un avertissement au moment de la compilation


Ne pas multiplier MODE_SPREAD - Écart en pips

vous pouvez vérifier

   Print(MarketInfo(_Symbol,MODE_SPREAD)," / ",MarketInfo(_Symbol,MODE_SPREAD)*Point);

et faire comme ceci

int slipp = (int) MarketInfo(_Symbol,MODE_SPREAD)*2;