[Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Da nessuna parte senza di te - 4. - pagina 421

 

... continua...

Alla fine della sottosezione StringSubstr Function tra parentesi c'è la seguente frase: "separatamente dobbiamo notare che nel primo ciclo for (la mia nota: deve essere deinit() poiché non c'è altro modo di cancellare gli oggetti) non possiamo cancellare gli oggetti poiché dopo ogni cancellazione il numero di oggetti e la loro numerazione cambierà e alcuni nomi di oggetti saranno saltati". Ma nell'EA citato non c'è affatto un secondo ciclo for . Inoltre, la variabile Quant_Del definita nella funzione deinit() prima del ciclo for è inizializzata con zero, mentre la variabile i non è stata definita da nessuna parte prima del ciclo for.

   for(int k=0; k<=Quant_Del; i++)     // Удаляем объекты с именами,.. 
         ObjectDelete(Name_Del[i]);       // .. имеющимися в массиве

si scopre che l'esperto di cui sopra ha banalmente omesso diverse linee di programma.

Quindi la prima domanda è la seguente: si trattava davvero di una banale omissione di alcune righe o è un programma così complicato che un novizio non può afferrarne il significato senza un aiuto esterno?

Inoltre... Nello stesso capitolo della stessa sezione, c'è un link allo stesso Expert Advisor (nel file allegato) prima del testo citato che, se cliccato, apre lo stesso Expert Advisor in MetaElitor. Ma il testo di questo Expert Advisor è diverso: la funzione deinit()qui appare così

//--------------------------------------------------------------- 9 --
int deinit()                           // Спец. функция deinit()
  {
   string Name_Del[1];                 // Объявление массива
   int Quant_Del=0;                    // Количество удаляемых объекто
   int Quant_Objects=ObjectsTotal();   // Cтолько всего ВСЕХ объектов
   ArrayResize(Name_Del,Quant_Objects);// Необходимый размер массива
   for(int k=0; k<Quant_Objects; k++)  // По количеству объектов 
     {
      string Obj_Name=ObjectName(k);   // Запрашиваем имя объекта
      string Head=StringSubstr(Obj_Name,0,6);// Извлекаем первые 6 сим
      if (Head==Prefix)                // Найден объект, ..
        {                              // .. начинающийся с Paint_
         Quant_Del=Quant_Del+1;        // Колич имён к удалению
         Name_Del[Quant_Del-1]=Obj_Name;//Запоминаем имя удаляемого
        }
     }
   for(int i=0; i<=Quant_Del; i++)     // Удаляем объекты с именами,.. 
      ObjectDelete(Name_Del[i]);       // .. имеющимися в массиве
   return;                             // Выход из deinit()
  }
//-------------------------------------------------------------- 10 --

Poi, se "combinare" la frase "Separatamente, si noti che non è possibile eliminare gli oggetti nel primo ciclo for, perché in questo caso il numero totale di oggetti e la loro numerazione cambierà dopo ogni cancellazione, e alcuni nomi di oggetti saranno saltati come risultato" AND testo funzione deinit() dell'ultima variante, ho la 2a domanda:

Domanda. Perché non posso cancellare gli oggetti nel primo ciclo for mettendo la funzione ObjectDelete(Obj_Name) all'interno della dichiarazione if...? Qualcosa come:

int deinit()                           // Спец. функция deinit()
  {
   int Quant_Objects=ObjectsTotal();   // Cтолько всего ВСЕХ объектов
   for(int k=0; k<Quant_Objects; k++)  // По количеству объектов 
     {
      string Obj_Name=ObjectName(k);   // Запрашиваем имя объекта
      string Head=StringSubstr(Obj_Name,0,6);// Извлекаем первые 6 сим
      if (Head==Prefix)                // Если найден объект, …
        {                              // ... начинающийся с Paint_,
         ObjectDelete(Obj_Name);       // … то его и удаляем
        }                              //конец if
     }                                 //конец for
   return;                             // Выход из deinit()
  }                                    //конец deinit
//-------------------------------------------------------------- 10 --

Perché dopo ogni cancellazione "... Il numero totale di oggetti cambierà"...? Perché in questo caso, la variabile Quant_Objects, che determina il numero totale di oggetti, ottiene il suo valore uguale a ObjectsTotal(), AVANTI il ciclo for?

P.S. Grazie in anticipo per la risposta, per non sporcare il forum.

File:
strings_1.mq4  7 kb
 

Buon pomeriggio, ho fatto un blocco per calcolare le magiche posizioni aperte di acquisto, ma il problema è che se il blocco lavora su diverse coppie di valute, allora il blocco produce risultati solo per una coppia di valute (l'ultima posizione aperta). Come posso correggere il codice (senza cambiare la magia) in modo che il blocco dia risultati per ogni coppia di valute?

int OpenMagicOrderCount_buy() 
{
   int OpenBuyOrdersCount = 0;
   int OpenOrders = 0;
   int cnt = 0;
   OpenOrders=OrdersTotal();
   for(cnt=0;cnt<OpenOrders;cnt++)   // scan all orders and positions. ..
   {
     OrderSelect(cnt, SELECT_BY_POS);
          if (OrderSymbol()==Symbol() && OrderMagicNumber()==magic &&  OrderType() == OP_BUY )
          {                             
                  OpenBuyOrdersCount ++;
          }
   } 
   Print("+++++++++++++++++++++++OpenBuyOrdersCount: " + OpenBuyOrdersCount,"   OrderSymbol()= ", OrderSymbol());
   return(OpenBuyOrdersCount); 
}
 
int OpenMagicOrderCount_buy() 
{
   int OpenBuyOrdersCount = 0;
   int OpenOrders = 0;
   int cnt = 0;
   OpenOrders=OrdersTotal();
   for(cnt=0;cnt<OpenOrders;cnt++)   // scan all orders and positions. ..
   {
     OrderSelect(cnt, SELECT_BY_POS);
          if (OrderMagicNumber()==magic &&  OrderType() == OP_BUY )
          {                             
                  OpenBuyOrdersCount ++;
          }
   } 
   Print("+++++++++++++++++++++++OpenBuyOrdersCount: " + OpenBuyOrdersCount,"   OrderSymbol()= ", OrderSymbol());
   return(OpenBuyOrdersCount); 
}
так все " I maghi"OP_BUY" conteranno
 
7777877:

... continua...

Alla fine della sottosezione StringSubstr Function tra parentesi c'è la seguente frase: "separatamente dobbiamo notare che nel primo ciclo for (la mia nota: deve essere deinit() poiché non c'è altro modo di cancellare gli oggetti) non possiamo cancellare gli oggetti poiché dopo ogni cancellazione il numero totale di oggetti e la loro numerazione cambierà e alcuni nomi di oggetti saranno saltati". Ma nell'EA citato non c'è affatto un secondo ciclo for . Inoltre, la variabile Quant_Del definita nella funzione deinit() prima del ciclo for è inizializzata con zero, mentre la variabile i non è stata definita da nessuna parte prima del ciclo for.

si scopre che il codice di cui sopra omette solo banalmente diverse linee di programma.

Quindi la prima domanda è la seguente: si trattava davvero di una banale omissione di alcune righe o è un programma così complicato che un novizio non può afferrarne il significato senza un aiuto esterno?

Inoltre... Nello stesso capitolo della stessa sezione, c'è un link allo stesso Expert Advisor (nel file allegato) prima del testo citato che, se cliccato, apre lo stesso Expert Advisor in MetaElitor. Ma il testo di questo Expert Advisor è diverso: la funzione deinit() si presenta così

Poi, se "combinare" la frase "Separatamente, si noti che non è possibile eliminare gli oggetti nel primo ciclo for, perché in questo caso il numero totale di oggetti e la loro numerazione cambierà dopo ogni cancellazione, e alcuni nomi di oggetti saranno saltati come risultato" ANDtesto funzione deinit() dell'ultima variante, ho la 2a domanda:

Domanda. Perché non posso eliminare gli oggetti nel primo ciclo for mettendo la funzione ObjectDelete(Obj_Name) all'interno della dichiarazione if?

Perché dopo ogni cancellazione "... Il numero totale di oggetti cambierà"...? Perché in questo caso, la variabile Quant_Objects, che determina il numero totale di oggetti, ottiene il suo valore uguale a ObjectsTotal(), AVANTI il ciclo for?

P.S. Grazie in anticipo per la risposta, per non sporcare il forum.

Gira il ciclo all'indietro e cancella quanto vuoi
 
FAQ:
Espandere il ciclo all'indietro e cancellare il più possibile

Ho capito bene? Dovreste pensare alla funzione deinit (e al ciclo in particolare) come segue:

int deinit()                           // Спец. функция deinit()
  {
   int Quant_Objects=ObjectsTotal();   // Cтолько всего ВСЕХ объектов
   for(int k=Quant_Objects; k>=0; k--) // По количеству объектов 
     {
      string Obj_Name=ObjectName(k);   // Запрашиваем имя объекта
      string Head=StringSubstr(Obj_Name,0,6);// Извлекаем первые 6 сим
      if (Head==Prefix)                // Если найден объект, …
        {                              // ... начинающийся с Paint_,
         ObjectDelete(Obj_Name);       // … то его и удаляем
        }                              //конец if
     }                                 //конец for
   return;                             // Выход из deinit()
  }                                    //конец deinit
//-------------------------------------------------------------- 10 --
 
Elektronik:


Questi dati sono necessari per calcolare la differenza tra ordini di acquisto e di vendita.

supponiamo che siano stati aperti un ordine di acquisto con il volume di 0,09 lotti e due ordini di vendita con il volume totale di 0,11 lotti, la differenza tra loro sarà 0,09-0,11=-0,02, o se possibile la differenza tra i loro valori.


Allora la funzione OrderLots.
 
abeiks:

Buon pomeriggio, ho fatto un blocco per calcolare le magiche posizioni aperte di acquisto, ma il problema è che se il blocco lavora su diverse coppie di valute, allora il blocco produce risultati solo per una coppia di valute (l'ultima posizione aperta). Come posso correggere il codice (senza cambiare la magia) in modo che il blocco calcoli per tutte le coppie di valute?

Cambiare:

if (OrderSymbol()==Symbol() && OrderMagicNumber()==magic &&  OrderType() == OP_BUY )

A:

if (OrderMagicNumber()==magic &&  OrderType() == OP_BUY )
 
Come posso sostituire lo stop loss in pip nell'EA, con uno stop loss sopra l'ultima candela?
 
Neo777:
Come posso sostituire lo stop loss in pip nell'EA, con uno stop loss sopra l'ultima candela?
double x = ... // Задаем на сколько пипсов выше
double sl = NormalizeDouble(High[1] + x * Point, Digits); // Задаем значение стоплосс на x пипсов выше предпоследней свечи
 

Reshetov:спасибо
извиняюсь за то что не в SRC

come inserirlo qui

Motivazione: