[ARCHIVIO]Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Non posso andare da nessuna parte senza di te - 5. - pagina 29

 
hoz:

Puoi dirmi come disegnare i valori di un indicatore a zig-zag? Come viene attuato in generale? Cioè se voglio prendere un certo estremo, non solo l'ultimo.

Per esempio, ora voglio attaccare questo zigzag al mio Expert Advisor:

Capisco che ho bisogno di usare la funzioneiCustom come si usa di solito per indirizzare un indicatore personalizzato, ma la domanda è come collegare i nodi...

Il buffer cerca il valore NEUTRAL(EMPTY_VALUE) secondo il principio:

//+-------------------------------------------------------------------------------------+
//| Поиск последнего элемента ZZBuf с непустым значением                                |
//+-------------------------------------------------------------------------------------+
int GetLastIndexNoEmptyValue(int index)
{
   while (ZZBuf[index] == EMPTY_VALUE && index < Bars)// Поиск по графику справа налево
      index++;                                     // Пока не будет найден экстремум или
                                                   // ..пока не достигнем конца истории
   return(index);                                  // Индекс бара с непустым значением..
                                                   // ..зиг-зага
}
e l'accesso al buffer dell'indicatore tramite iCustom().
 
TarasBY:

Il buffer cerca un valore EMPTY_VALUE secondo il principio:

//+-------------------------------------------------------------------------------------+
//| Поиск последнего элемента ZZBuf с непустым значением                                |
//+-------------------------------------------------------------------------------------+
int GetLastIndexNoEmptyValue(int index)
{
   while (ZZBuf[index] == EMPTY_VALUE && index < Bars)// Поиск по графику справа налево
      index++;                                     // Пока не будет найден экстремум или
                                                   // ..пока не достигнем конца истории
   return(index);                                  // Индекс бара с непустым значением..
                                                   // ..зиг-зага
}

e si accede al buffer dell'indicatore tramite iCustom().


Ha senso. Ma si cercherà in questo modo finché non si troverà un valore non vuoto. E se, per esempio, io, e, infatti, voglio non l'ultimo valore non vuoto, cioè non l'ultimo estremo, ma un altro... Per esempio, qui nello screenshot:

 
hoz:


Ha senso. Ma in questo modo la ricerca sarà fino a quando non troveremo un valore non vuoto. E se, per esempio, io, e, in effetti, voglio non l'ultimo valore non vuoto, cioè non l'ultimo estremo, ma un altro... Per esempio, qui nello screenshot:

Si dovrebbe introdurre il contatore degli estremi nel ciclo e interrompere il ciclo per il numero dell'estremo (valore non vuoto in una riga).
 
TarasBY:
Inserite un contatore di estremi nel ciclo e al numero di estremi (valore non vuoto in una riga), interrompete il ciclo.

Capito. Grazie. Ora dobbiamo applicare tutto questo nella pratica. Ho capito il succo, ma la mia mente è piena di filtri che mi fanno bollire il cervello...
 
hoz:

Capito. Grazie. Ora dobbiamo applicarlo nella pratica. Ho l'idea, ma ci sono così tanti filtri nella mia mente che il mio cervello sta bollendo...

double get_extrem(int n) {

   for(int i=1;;i++) {

      double ind=iCustom(Symbol(),0,"indicator_name",0,i);

      if(n>1)  

         if(ind!=0) n--;

         else

         if(ind!=0) return(ind);

      }

   }


Se avete bisogno del numero di barra del picco, cambiate il tipo di funzione in int e invece di return(ind); scrivete return(i);

Notate anche che se usate i nel vostro codice, specialmente nelle ricerche (come nel tutorial) allora cambiate i in questa funzione con qualsiasi altra variabile, per esempio k.

E assicuratevi di configurare iCustom all'interno della funzione per il vostro indicatore.

 
keep87:

double get_extrem(int n) {

   for(int i=1;;i++) {

      double ind=iCustom(Symbol(),0,"indicator_name",0,i);

      if(n>1)  

         if(ind!=0) n--;

         else

         if(ind!=0) return(ind);

      }

   }


Se avete bisogno del numero di barra del picco, cambiate il tipo di funzione in int e invece di return(ind); scrivete return(i);

Notate anche che se usate i nel vostro codice, specialmente nelle ricerche (come nel tutorial) allora cambiate i in questa funzione con qualsiasi altra variabile, per esempio k.

E assicuratevi di configurare iCustom all'interno della funzione per il vostro indicatore.

Nikolai, è interessante, naturalmente, che tu abbia scritto la condizione. Lo guardo e penso...

if(ind!=0) n--;

else

if(ind!=0) return(ind);

Si scopre che se il buffer dell 'indicatore personalizzato restituisce il valore zero, allora n--, e se ilbuffer dell'indicatore personalizzato restituisce il valore zero, allora ... restituiamo il valore del buffer dell'indicatore.

Ma le condizioni sono le stesse. E lì e così se non zero...

 
hoz:

Nikolai, è interessante, certo, hai la condizione scritta. Mentre lo guardo, penso...

Si scopre che se il buffer indicatore personalizzato restituisce un valore di zero, allora n--, e se ilbuffer indicatore personalizzato restituisce un valore di zero, allora ... restituiamo il valore del buffer dell'indicatore.

Ma le condizioni sono le stesse. E lì e così se non zero...

Le parentesi sono cadute mentre cercavo di inserire il codice correttamente:

double get_extrem(int n) {

   for(int i=1;;i++) {

      double ind=iCustom(Symbol(),0,"indicator_name",0,i);

      if(n>1) {

         if(ind!=0) n--;

         }else{

         if(ind!=0) return(ind);

         } 

      }

   }

Se n>1 {

se il buffer non è vuoto, allora sottrarre 1 da n

il contrario{

se il buffer non è vuoto, restituisce il suo valore

}

 

double get_extrem(int n) {

   for(int i=1;;i++) {

      double ind=iCustom(Symbol(),0,"indicator_name",0,i);

      if(ind!=0) {

         if(n>1) n--; else return(ind);

         }

      }

   }


o come questo, che è più succinto. Sono ossessionato dalla velocità e dalla bellezza del codice, non badate a me )
 
keep87:

double get_extrem(int n) {

   for(int i=1;;i++) {

      double ind=iCustom(Symbol(),0,"indicator_name",0,i);

      if(ind!=0) {

         if(n>1) n--; else return(ind);

         }

      }

   }


o come questo, che è più succinto. Sono ossessionato dalla velocità e dalla bellezza del codice, non fateci caso).


In generale, tutto va bene in entrambi i modi. Sono solo abituato a scrivere il codice in modo un po' diverso, è più facile da leggere in questo modo mentre il tuo è diverso. La prima parentesi in ogni vostro codice non si sposta. L'ho messo nel mio EDITOR e tutto è al suo posto così:

double get_extrem(int n)
{
   for(int i=1;;i++)
   {
     double ind=iCustom(Symbol(),0,"indicator_name",0,i);
       if(n>1)
        {
          if(ind!=0) n--;
        }
        else
        {
          if(ind!=0) return(ind);
        } 
   }
}
 
hoz:


Fondamentalmente, tutto va bene in entrambi i modi. Sono solo abituato a scrivere il codice in un modo diverso: è più facile da leggere in questo modo, mentre il tuo codice è diverso. La prima parentesi in ogni vostro codice non si sposta. L'ho messo in Editor e ogni cosa è al suo posto in questa forma:


quando il codice supera le 1000 linee, si inizia a scrivere in modo compatto).

anche in MT4 le prestazioni soffrono, soprattutto quando si eseguono i test. La versione laconica è più veloce.