Questions des débutants MQL4 MT4 MetaTrader 4 - page 116

 
novichok2018:

Merci. La pause semble avoir aidé. Voyons ce qui se passe ensuite.

Non, ça n'a pas vraiment aidé. Il ne fonctionne que si un seul type de position est ouvert. Si, par exemple, une position de vente est ouverte et n'est pas encore fermée, et que simultanément une position d'achat est ouverte et fermée, la position de vente ne voit pas les conditions pour être fermée avant qu'une autre position de vente s'ouvre et se ferme (selon ses conditions). Et si BAY ouvre et ferme à nouveau, il manque à nouveau ses conditions de fermeture. J'ai essayé de déterminer la présence depositions ouvertes après la fermeture de BAY en utilisant la fonction ExistPositions() de I.Kim, mais je ne comprends pas où l'insérer et où placer Print pour contrôler l'exécution. Un indice.

 
novichok2018:

Non, ça n'a pas vraiment aidé. Cela ne fonctionne que si le même type de position est ouvert. Si, par exemple, une position de vente est d'abord ouverte et pas encore fermée, et qu'au même moment une position d'achat est ouverte et fermée, alors la position de vente ne voit pas ses conditions de fermeture jusqu'à ce qu'une autre position de vente s'ouvre et se ferme (selon ses conditions). Et si BAY ouvre et ferme à nouveau, il manque à nouveau ses conditions de fermeture. J'ai essayé de déterminer la présence depositions ouvertes après la fermeture de BAY en utilisant la fonction ExistPositions() de I.Kim, mais je ne comprends pas où l'insérer et où placer Print pour contrôler l'exécution. Pouvez-vous me donner un indice ?

Personne ne connaît la solution ? Je ne le fais pas.

 
novichok2018: Personne ne connaît la solution ? Je ne le fais pas.

Je me suis connecté au forum - je vois que vous vous parlez à vous-même... Où commence votre conversation et quel en est le sujet - difficile à comprendre. Pour déboguer un programme, il est beaucoup plus pratique d'utiliser Alert au lieu de Print - il s'affiche à l'écran en une seule fois. Ces alertes sont placées avant la vérification de la condition if. Une autre méthode de débogage avec un crayon : parcourez le programme tel qu'il devrait être exécuté et notez les valeurs des variables. Lorsqu'elle change, rayez l'ancienne valeur et écrivez la nouvelle. C'est comme ça que ça se passait avant. MetaEditor dispose maintenant d'un débogueur, où vous pouvez suivre les valeurs des variables. Les constructions les plus simples doivent être vérifiées séparément en écrivant un script

 
novichok2018:

Personne ne connaît la solution ? Je ne le fais pas.

Essayez de cette façon :

//+------------------------------------------------------------------+
void OnTick()
  {
   int total=OrdersTotal();
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(TimeCurrent()>OrderOpenTime()+100)
           {
            switch(OrderType())
              {
               //_______________________________________________________________________
               case OP_BUY:
                 {
                  if(OrderMagicNumber()==101 && MathAbs(WPR1)<5)
                    {
                     ClosePosBySelect(slippage,Yellow);
                     break;
                    }
                  if(OrderMagicNumber()==111 && MathAbs(WPR1)<20)
                    {
                     ClosePosBySelect(slippage,Yellow);
                     break;
                    }
                  break;
                 }
               //_______________________________________________________________________                 
               case OP_SELL:
                 {
                  if(OrderMagicNumber()==222 && MathAbs(WPR1)>97.55)
                    {
                     ClosePosBySelect(slippage,Yellow);
                     break;
                    }
                  if(OrderMagicNumber()==201 && MathAbs(WPR1)>96)
                    {
                     ClosePosBySelect(slippage,Yellow);
                     break;
                    }
                  break;
                 }
              }
           }
        }
     }
  }
//_______________________________________________________________________
void ClosePosBySelect(int slip,color col) 
  {
   RefreshRates();
   if(OrderType()==OP_BUY)  OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), slip, col);
   if(OrderType()==OP_SELL) OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), slip, col);
  }
//_______________________________________________________________________
 
d'où iCustom tire-t-il ses données ?
 
Igor Makanu:

Essayez comme ça :

Merci, j'ai essayé - il ne ferme aucune position même après quelques ajustements, donc le compilateur ne jure pas.

 
STARIJ:

Je me suis connecté sur le forum - je vous vois parler tout seul... Il est difficile de comprendre où vous avez commencé et ce dont vous parlez. Pour le débogage d'un programme, il est plus pratique d'utiliser Alert au lieu de Print - il s'affiche à l'écran en une seule fois. Ces alertes sont placées avant la vérification de la condition if. Une autre méthode de débogage avec un crayon : parcourez le programme tel qu'il devrait être exécuté et notez les valeurs des variables. Lorsqu'elle change, rayez l'ancienne valeur et écrivez la nouvelle. C'est comme ça que ça se passait avant. MetaEditor dispose désormais d'un débogueur, qui vous permet de surveiller les valeurs des variables. Les constructions les plus simples doivent être vérifiées séparément en écrivant un script

Merci pour les recommandations, mais pour ma situation, elles ne sont pas tout à fait correctes. Juste pour clarifier, voici le code d'une fonction de fermeture personnalisée

 

Il ne fonctionne pas correctement - lafermeture des positionsse produit dans les conditions de la première position ouverte. En d'autres termes, si une position d'achat ou de vente a d'abord été ouverte avec la condition 1 et qu'une deuxième position a ensuite été ouverte avec la condition 2, la condition de fermeture est ignorée et la deuxième position est également fermée avec la condition 1 malgré un numéro magique différent.

J'ai appliqué la rupture après la clôture de l'ordre mais la solution a été tiède :seulement si une position du même type est ouverte. Si, par exemple, une position BOY a été ouverte en premier et n'a pas encore été fermée, alors qu'une position BAY est ouverte et fermée, la position BAY ne voit pas de conditions pour être fermée tant qu'une autre position BAY s'ouvre et se ferme (conformément à ses conditions). Et si BAY ouvre et ferme à nouveau, il manque à nouveau ses conditions de fermeture. Alors, que faire ?

void ClosePoz()
  { RefreshRates();
         double WPR0 = iWPR(NULL,0,bars,0);
         double WPR1 = iWPR(NULL,0,bars,1);
         bool rez = false;
           
  int total=OrdersTotal();
      for(int i=OrdersTotal()-1;i>=0;i--)
      {
        if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         {
              if(TimeCurrent()>OrderOpenTime()+300)
               {
               if(OrderMagicNumber==101 || OrderMagicNumber==102 || OrderMagicNumber==103 || OrderMagicNumber==104)
                 {
                 if(MathAbs(WPR1)<5)
                 rez =  OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_BID),int(MarketInfo(OrderSymbol(),MODE_DIGITS))),slippage,Yellow);
                 break; 
                 }
               if(OrderMagicNumber==111)
                 {
                  if(MathAbs(WPR1)<17) 
                  rez =  OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_BID),int(MarketInfo(OrderSymbol(),MODE_DIGITS))),slippage,Yellow);
                  break;
                 }
               if(OrderMagicNumber==222)
                 {
                  if(MathAbs(WPR1)>96)
                  rez =  OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_ASK),int(MarketInfo(OrderSymbol(),MODE_DIGITS))),slippage,Yellow);
                  break; 
                 }
               if(OrderMagicNumber==201)
                 {
                  if(MathAbs(WPR1)>97)
                  rez =  OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_ASK),int(MarketInfo(OrderSymbol(),MODE_DIGITS))),slippage,Yellow);
                  break;
                 }
               if(OrderMagicNumber==202)
                 {
                  if(MathAbs(WPR1)>96)
                  rez =  OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_ASK),int(MarketInfo(OrderSymbol(),MODE_DIGITS))),slippage,Yellow);
                  break;
                 }
                
                } 
              }
       break;  
      }
  }
 
Mickey Moose:
d'où iCustom tire-t-il ses données ?

à partir des tampons de l'indicateur personnalisé, pratique, par exemple sur la MA

novichok2018:

J'ai appliqué la rupture après la fermeture d'un ordre mais la solution est à mi-chemin :seulement si une position du même type est ouverte. Si, par exemple, une position BOY est ouverte et n'a pas encore été fermée, alors qu'une position BAY est ouverte et fermée, la position BAY ne voit aucune condition pour être fermée jusqu'à ce qu'une autre position BAY soit ouverte et fermée (à ses propres conditions). Et si BAY ouvre et ferme à nouveau, il manque à nouveau ses conditions de fermeture. Alors, que faire ?

essayez de remplacer break par continue

c'est étrange que mon exemple de code ne ferme rien, peut-être que c'est à propos de la normalisation des prix

 
Igor Makanu:


essayez de remplacer break par continue


Remplacé. Maudite erreur 138(requotes). Puis j'ai rendu la pause, et c'est encore 138. C'est étrange, peut-être que je ne l'avais pas remarqué avant.

 
Igor Makanu:

à partir des tampons de l'indicateur personnalisé, pratiquez avec le MA, par exemple


Est-ce que cela provient du champ qui apparaît dans la fenêtre de données du terminal ?
Raison: