Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 434

 
WinProject:

Per favore, ditemi come cancellare un oggetto grafico. Ci sono linee verticali i cui nomi sono costruiti dai valori delle variabili.

string name=="test1"; string Vertline="line_"+name; ObjectCreate(0,VertLine,OBJ_VLINE,0,time,cena); Come posso cancellare solo le linee verticali con il nome test1?


Potreste trovare questa funzione utile:

Elimina tutti gli oggetti del tipo specificato dal prefisso del nome in una sottofinestra.

intObjectsDeleteAll(
longchart_id,// ID del grafico
const stringprefix,// prefisso del nome dell'oggetto
intsub_window=EMPTY,// indice della finestra
intobject_type=EMPTY//tipo di oggetto da cancellare
);

 
Vladislav Andruschenko:


potreste trovare utile questa funzione:

Cancella tutti gli oggetti del tipo specificato dal prefisso del nome nella sottofinestra del grafico.

intObjectsDeleteAll(
longchart_id,//identificatore grafico
const stringprefix,// prefixnome dell'oggetto
intsub_window=EMPTY,// indice della finestra
intobject_type=EMPTY// tipo di oggetto da rimuovere
);


Grazie, per quanto ho capito questa funzione capisce il prefisso come la prima sottostringa nel nome dell'oggetto, ma come cancellare dalla seconda sottostringa nel nome dell'oggetto? C'è un modo per usare StringSubstr e StringFind al nome dell'oggetto per questo scopo?

 
WinProject:

Grazie, per quanto ho capito, per prefisso questa funzione capisce la prima sottostringa nel nome dell'oggetto, ma come cancellare per la seconda sottostringa nel nome dell'oggetto? C'è un modo per usare StringSubstr e StringFind al nome dell'oggetto per questo scopo?


aspettare,

Avete specificato il codice:

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


Dove avete il prefisso.

È quello che fanno tutti.

Ecco perché vi ho suggerito la funzione per cancellare gli oggetti per prefisso.


"линия_"

Se hai bisogno di cancellare una riga per suffisso, puoiusare StringFind per cercare tutti gli oggetti

per esempio:

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

Grazie Vladislav, tutto funziona, con un tale aiuto da parte dei membri del forum, MQL è molto più interessante. Hai un sito interessante, grazie!

 

Salve. Per favore, aiutatemi a scoprire perché smette di pescare dopo l'apparizione delle posizioni.

Il punto è questo: aprire due posizioni 1, 2. ad un prezzo la prima viene chiusa con il trawl, il secondo trawl viene attivato a condizione che al prezzo di apertura della posizione, la posizione sia uno.

Tutto funziona bene, la posizione 1 è chiusa, la posizione 2 viene pescata, ma quando si aprono altre due posizioni 3 e 4 a prezzi diversi, la pesca a strascico non passa alla posizione 2.

Perché si ferma la pesca a strascico?

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:

Salve. Per favore, aiutatemi a scoprire perché smette di pescare dopo l'apparizione delle posizioni.

Il punto è questo: aprire due posizioni 1, 2. ad un prezzo la prima viene chiusa con il trawl, il secondo trawl viene attivato a condizione che al prezzo di apertura della posizione, la posizione sia uno.

Tutto funziona bene, la posizione 1 è chiusa, la posizione 2 viene pescata, ma quando si aprono altre due posizioni 3 e 4 a prezzi diversi, la pesca a strascico non passa alla posizione 2.

Perché si ferma la pesca a strascico?


Vorrei solo far notare un errore grossolano.

   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)


Si passa attraverso gli ordini e poi si esegue la funzione contando il numero di posizioni, selezionando così un'altra posizione nella funzioneNumPosByPrice

quindi l'ulteriore costruzione

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


non funzionerà correttamente.


Ci sono molti modi per risolvere questo problema.

Per esempio:

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))


Anche se questo è fondamentalmente sbagliato, servirà per una rapida comprensione.

dopo:


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

aggiungere :

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


Faccio solo notare l'errore grossolano.

Ci sono molti modi per risolvere questo problema.

Grazie, vedo, trawl)

 

Potete dirmi per favore come riaprire la finestra degli avvisi in mt4? Avevo uno script che creava un falso segnale e apriva la finestra degli avvisi, ora dopo aver reinstallato il sistema non riesco a trovarlo su internet. Forse qualcuno ne ha uno?

 
amenrazp:

Potete dirmi per favore come riaprire la finestra degli avvisi in mt4? Avevo uno script che creava un falso segnale e apriva la finestra degli avvisi, ora dopo aver reinstallato il sistema non riesco a trovarlo su internet. Forse qualcuno ne ha uno?

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

Sembra che sia così. Hai un modo per allegarlo qui?