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

 
WinProject:

Veuillez me dire comment supprimer un objet graphique. Il existe des lignes verticales dont les noms sont construits à partir des valeurs des variables.

string name=="test1" ; string Vertline="ligne_"+name ; ObjectCreate(0,VertLine,OBJ_VLINE,0,time,cena) ; Comment puis-je supprimer uniquement les lignes verticales portant le nom test1 ?


Cette fonction peut vous être utile :

Supprime tous les objets du type spécifié par le préfixe du nom dans la sous-fenêtre.

intObjectsDeleteAll(
longchart_id,// ID du graphique
const stringprefix,// préfixe du nom de l'objet
intsub_window=EMPTY,// indice de la fenêtre
intobject_type=EMPTY//type d'objet à supprimer
) ;

 
Vladislav Andruschenko:


vous trouverez peut-être cette fonction utile :

Supprime tous les objets du type spécifié par le préfixe du nom dans la sous-fenêtre du graphique.

intObjectsDeleteAll(
longchart_id,//identifiant de la carte
const stringprefix,// préfixenom de l'objet
intsub_window=EMPTY,// indice de la fenêtre
intobject_type=EMPTY// type d'objet à supprimer
) ;


Merci, d'après ce que j'ai compris cette fonction comprend le préfixe comme la première sous-chaîne dans le nom de l'objet, mais comment supprimer par la deuxième sous-chaîne dans le nom de l'objet ? Existe-t-il un moyen d'utiliser StringSubstr et StringFind sur le nom de l'objet à cette fin ?

 
WinProject:

Merci, pour autant que je comprenne, par préfixe cette fonction comprend la première sous-chaîne dans le nom de l'objet, mais comment supprimer par la deuxième sous-chaîne dans le nom de l'objet ? Existe-t-il un moyen d'utiliser StringSubstr et StringFind sur le nom de l'objet à cette fin ?


attendre,

Vous avez spécifié le code :

string Vertline="линия_"+name; 


Où vous avez le préfixe.

C'est ce que tout le monde fait.

C'est pourquoi je vous ai proposé la fonction de suppression des objets par préfixe.


"линия_"

Si vous devez supprimer une ligne par suffixe, vous pouvezutiliser StringFind pour rechercher tous les objets

par exemple :

void ObjectsDelete()
  {
string NameEA="суффикс";
   for(int i=ObjectsTotal();i>=0;i--)
     {
      if(StringFind(ObjectName(i),NameEA)!=-1)ObjectDelete(ObjectName(i));
     }
  }
 

Merci Vladislav, tout fonctionne, avec une telle aide des membres du forum, MQL est beaucoup plus intéressant. Votre site est intéressant, merci !

 

Bonjour. Veuillez m'aider à trouver la raison pour laquelle il cesse de traîner après l'apparition des positions.

Le point est le suivant : ouvrez deux positions 1, 2. A un prix, la première est fermée par un chalut, la seconde est activée à la condition qu'au prix d'ouverture de la position, la position soit une.

Tout fonctionne bien, la position 1 est fermée, la position 2 est chalutée, mais lorsque deux autres positions 3 et 4 s'ouvrent à des prix différents, le chalut ne passe pas à la position 2.

Pourquoi arrête-t-elle le chalutage ?

void Tral_SL_one(int _TrailingStop=0,int _TrailingStep=0)
  {
   if(_TrailingStop<=0)
      return;
   for(int i=0; i<OrdersTotal(); i++)
     {
      if(!(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)))
         continue;
      if(OrderSymbol()!=Symbol())
         continue;
      if(OrderMagicNumber()!=_MagicNumber)
         continue;
      if(OrderType()==OP_BUY)
        {
         if(NumPosByPrice(Symbol(),OP_BUY,OrderOpenPrice(),_MagicNumber)==1)
           {
            if(NormalizeDouble(Bid-OrderOpenPrice(),Digits)>NormalizeDouble(_TrailingStop *Point,Digits))
              {
               if(NormalizeDouble(OrderStopLoss(),Digits)<NormalizeDouble(Bid -(_TrailingStop+_TrailingStep-1)*Point,Digits) || OrderStopLoss()==0)
                 {
                  if(OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Bid-_TrailingStop*Point,Digits),OrderTakeProfit(),OrderExpiration()));
                   
                 }
              }
           }
        }

      if(OrderType()==OP_SELL)
        {

         if(NumPosByPrice(Symbol(),OP_SELL,OrderOpenPrice(),_MagicNumber)==1)
           {
            if(NormalizeDouble(OrderOpenPrice()-Ask,Digits)>NormalizeDouble(_TrailingStop *Point,Digits))
              {
               if(NormalizeDouble(OrderStopLoss(),Digits)>NormalizeDouble(Ask+(_TrailingStop+_TrailingStep-1)*Point,Digits) || OrderStopLoss()==0)
                 {
                  if(OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Ask+_TrailingStop*Point,Digits),OrderTakeProfit(),OrderExpiration()));
                    
                 }
              }
           }
        }
     }
  }
//===
int NumPosByPrice(string sy="",int op=-1,double pp=0,int mn=-1) 
  {
   double px,py;
   int    d,i,k=OrdersTotal(),num=0;

   if(sy=="0") sy=Symbol();
   for(i=0; i<k; i++) 
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) 
        {
         if((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) 
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL) 
              {
               if(mn<0 || OrderMagicNumber()==mn) 
                 {
                  d=MarketInfo(OrderSymbol(),MODE_DIGITS);
                  px=NormalizeDouble(pp, d);
                  py=NormalizeDouble(OrderOpenPrice(), d);
                  if(pp<=0 || px==py) num++;
                 }
              }
           }
        }
     }
   return(num);
  }
 
mila.com:

Bonjour. Veuillez m'aider à comprendre pourquoi il cesse de traîner après l'apparition des positions.

Le point est le suivant : ouvrez deux positions 1, 2. A un prix, la première est fermée par un chalut, la seconde est activée à la condition qu'au prix d'ouverture de la position, la position soit une.

Tout fonctionne bien, la position 1 est fermée, la position 2 est chalutée, mais lorsque deux autres positions 3 et 4 s'ouvrent à des prix différents, le chalut ne passe pas à la position 2.

Pourquoi arrête-t-elle le chalutage ?


Je ne fais que signaler une erreur grossière.

   for(int i=0; i<OrdersTotal(); i++)
     {
      if(!(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)))
         continue;
      if(OrderSymbol()!=Symbol())
         continue;
      if(OrderMagicNumber()!=_MagicNumber)
         continue;
      if(OrderType()==OP_BUY)
        {
         if(NumPosByPrice(Symbol(),OP_BUY,OrderOpenPrice(),_MagicNumber)==1)


Vous parcourez les ordres et exécutez ensuite la fonction qui compte le nombre de positions, sélectionnant ainsi une autre position dans la fonctionNumPosByPrice.

donc la suite de la construction

 if(NormalizeDouble(Bid-OrderOpenPrice(),Digits)>NormalizeDouble(_TrailingStop *Point,Digits))


ne fonctionnera pas correctement.


il existe de nombreuses façons de résoudre ce problème.

Par exemple :

void Tral_SL_one(int _TrailingStop=0,int _TrailingStep=0)
  {
   if(_TrailingStop<=0)
      return;
   for(int i=0; i<OrdersTotal(); i++)
     {
      if(!(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)))
         continue;
      if(OrderSymbol()!=Symbol())
         continue;
      if(OrderMagicNumber()!=_MagicNumber)
         continue;
      if(OrderType()==OP_BUY)
        {
         if(NumPosByPrice(Symbol(),OP_BUY,OrderOpenPrice(),_MagicNumber)==1)
           {
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
            if(NormalizeDouble(Bid-OrderOpenPrice(),Digits)>NormalizeDouble(_TrailingStop *Point,Digits))


Bien que cela soit fondamentalement faux, cela suffit pour une compréhension rapide.

après :


if(NumPosByPrice(Symbol(),OP_BUY,OrderOpenPrice(),_MagicNumber)==1)

ajouter :

OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
 
Vladislav Andruschenko:


Je vais juste souligner l'erreur grossière.

Il existe de nombreuses façons de résoudre ce problème.

Merci, je vois, trawl)

 

J'avais un script qui créait un faux signal et ouvrait la fenêtre des alertes, maintenant après avoir réinstallé le système je ne peux pas le trouver sur internet. Peut-être que quelqu'un en a un ?

 
amenrazp:

J'avais un script qui créait un faux signal et ouvrait la fenêtre des alertes, maintenant après avoir réinstallé le système je ne peux pas le trouver sur internet. Peut-être que quelqu'un en a un ?

Alert("") ; un tel script ?
 
Vladislav Andruschenko:
Alert("") ; un tel script ?

On dirait bien. Avez-vous un moyen de l'attacher ici ?