Problema con l'indicatore ZigZag

 

Salve,

Sto cercando di sviluppare un esperto che scavi i dati storici (picco e fondo) da utilizzare per il mio esperto principale. Ho deciso di usare l'indicatore zigzag perché è semplice e trova facilmente i massimi e i minimi.

Il mio problema è che quando chiamo il ZigZag.ex4 usando la funzione iCustom() non riesco ad ottenere i valori alti e bassi corretti. Al fine di evitare la ripresentazione, ho usato l'indice 20 dell'indicatore iCustom() come protezione di base per la ripresentazione.

Ci sono due buffer nel codice di ZigZag (usando la versione di metaquote https://www.mql5.com/en/code/7796 ). Potrei prendere i valori alti e bassi opposti ma non ha molta importanza al momento.

Alcuni dei valori corrispondono al codice altri no e nel Journal, posso vedere entrambi i valori alti e bassi nella stessa colonna, il che non può essere possibile.

ZigZag

Il mio codice è qui sotto:

//+------------------------------------------------------------------+
//|                                                 ZigZagDigger_02  |
//|                                                                  |
//|                                                                  |
//+------------------------------------------------------------------+
/* 

*/

#include <stderror.mqh>
#include <stdlib.mqh>
    
int cnt=0;
double Zig_high[1000];
double Zig_low[1000];

int init()
  {
   ArrayInitialize(Zig_high,0);
   ArrayInitialize(Zig_low,0);
   return(0);
 } 
   
int deinit()
{ 
   return(0);
}

void start()
  {
  
   static datetime tmp;
  

   //  On every tick
   if (tmp!= Time[0]) 
  
   {  tmp =  Time[0];
   
      double zh=iCustom(Symbol(),0,"ZigZag.ex4",6,5,3,1,20);
      double zl=iCustom(Symbol(),0,"ZigZag.ex4",6,5,3,0,20);

      Zig_high[cnt]=zh;
      Zig_low[cnt]=zl;
      cnt=cnt+1;
   
      Alert(" Zig   zh=",zh,"  zl=",zl,"  cnt=",cnt-1);
   
  } // Every tick loop
         
   
  }

Mi chiedo se sto usando male l'indicatore zig zag o se ho fatto un errore nel codice? Non sono riuscito a trovare il problema quindi chiedo gentilmente il vostro aiuto per identificare il mio problema.

Grazie

 
aed71:

Salve,

Sto cercando di sviluppare un esperto che scavi i dati storici (picco e fondo) da utilizzare per il mio esperto principale. Ho deciso di usare l'indicatore zigzag perché è semplice e trova facilmente i massimi e i minimi.

Il mio problema è che quando chiamo il ZigZag.ex4 usando la funzione iCustom() non riesco ad ottenere i valori alti e bassi corretti. Al fine di evitare la ripresentazione, ho usato l'indice 20 dell'indicatore iCustom() come protezione di base per la ripresentazione.

Ci sono due buffer nel codice di ZigZag (usando la versione di metaquote https://www.mql5.com/en/code/7796 ). Potrei prendere i valori alti e bassi opposti ma non ha molta importanza al momento.

Alcuni dei valori corrispondono al codice altri no e nel Journal, posso vedere entrambi i valori alti e bassi nella stessa colonna, il che non può essere possibile.

Il mio codice è qui sotto:

Mi chiedo se sto usando male l'indicatore zig zag o se ho fatto un errore nel codice? Non sono riuscito a trovare il problema quindi chiedo gentilmente il vostro aiuto per identificare il mio problema.

Grazie

Puoi dire leggendo il codice MACD Sample come funziona quell'EA?

Mi sembra che non hai mai provato ....

quello che hai scritto è come se facessi qualcosa ..... non so cosa succede Puoi dirmi cosa ho fatto?

Ogni tick loop che cosa è il tuo ogni tick loop ??

Questo?

   if (tmp!= Time[0]) 
  
   {  tmp =  Time[0];
   
      double zh=iCustom(Symbol(),0,"ZigZag.ex4",6,5,3,1,20);
      double zl=iCustom(Symbol(),0,"ZigZag.ex4",6,5,3,0,20);

      Zig_high[cnt]=zh;
      Zig_low[cnt]=zl;
      cnt=cnt+1;
   
      Alert(" Zig   zh=",zh,"  zl=",zl,"  cnt=",cnt-1);
   
  } // Every tick loop

Si', allora dov'e' il ciclo?

no allora spiega linea per linea cosa significa il tuo codice...

 
aed71: Mi chiedo se sto usando male l'indicatore zig zag o se ho fatto un errore nel codice?
  1. Se avessi cercato nel forum avresti trovato la tua risposta.
  2.  double zl=iCustom(Symbol(),0,"ZigZag.ex4",6,5,3,0,20);
    
    ZigZag non riempie ogni elemento del buffer (usa DRAW_SECTION.) Fai la tua chiamata in un ciclo finché non trovi lo shift che ha un valore non zero
 
WHRoeder:
  1. Se avessi cercato nel forum avresti trovato la tua risposta.
  2. ZigZag non riempie ogni elemento del buffer (usa DRAW_SECTION.) Fai la tua chiamata in un ciclo finché non trovi lo shift che ha un valore non zero


Sì, so che non riempirà ogni elemento del buffer. Voglio mettere tutti i dati in un array compresi gli zeri (se non ci sono alti e bassi) e anche i valori alti e bassi. Il motivo è che vorrei avere un altro processo all'interno di deinit() per calcolare la differenza di tick tra alti e bassi usando gli array. Voglio dire, per esempio, quanti tick sono passati tra 2 massimi e la differenza tra alti e bassi. Ma non posso ancora arrivare a questo stadio.

Perché restituisce contemporaneamente alti e bassi come immagino nell'immagine (parte del giornale con il segno ??? accanto?) E questi valori non corrispondono a nessun alto o basso... Questo è il mio problema principale...

Grazie

 
deVries:

Puoi dire leggendo il codice MACD Sample come funziona questo EA?

Mi sembra che tu non abbia mai provato ....

quello che hai scritto è come se facessi qualcosa ..... non so cosa succede Puoi dirmi cosa ho fatto?

Ogni tick loop che cosa è il tuo ogni tick loop ??

Questo?

Si', allora dov'e' il ciclo?

no allora spiega linea per linea cosa significa il tuo codice...

Non credo di avere problemi con il loop, il loop funziona e stampa i risultati. Controlla il timeframe (15M nel mio caso) e calcola i valori a zig zag e stampa. Si prega di controllare il rettangolo verde come funziona ogni 15 minuti. La funzione Start() stessa è un loop, vero?

Ogni 15M

 
aed71:

Non credo di avere problemi con il ciclo, il ciclo funziona e stampa i risultati. Controlla il timeframe (15M nel mio caso) e calcola i valori a zig zag e stampa. Si prega di controllare il rettangolo verde come funziona ogni 15 minuti. La funzione Start() stessa è un ciclo, vero?



Hai ragione che la funzione Start() stessa è un ciclo

ma dove inizia questo ciclo e dove finisce la funzione Start()?

è da qualche altra parte ...

i messaggi che hai stampato non si ripetono ogni tick ....

Quindi cosa stai facendo ......??

Prova a spiegare le linee del tuo codice ..... il più possibile

 
deVries:


Hai ragione che la funzione Start() stessa è un ciclo

ma dove inizia questo ciclo e dove finisce la funzione Start()?

è da qualche altra parte ...

i messaggi che hai stampato non sono ripetuti ogni tick ....

Quindi cosa stai facendo ......??

Cerca di spiegare le linee del tuo codice ..... più che puoi


Le mie scuse se non sono riuscito a spiegarmi bene.

Questo esperto deve essere usato per il backtest e il mio scopo è quello di trovare i massimi e i minimi storici nel grafico 15M. Poi rielaborerò i dati dei massimi e dei minimi per calcolare la fase e l'ampiezza del grafico.

Cosa ho fatto: ho usato due array per memorizzare il valore alto e basso e un contatore per contare i tick. La dimensione dell'array 1000 è più che sufficiente dato che lo sto facendo funzionare per 2 giorni al massimo (1440/15=96 tick al giorno)

int cnt=0;
double Zig_high[1000];
double Zig_low[1000];

nella funzione init() riempio gli array con zero.

nella funzione start() sto controllando se è scattato un nuovo tick con il seguente codice

 if (tmp!= Time[0]) 
  
   {  tmp =  Time[0];

   // the code here runs every 15M.

   }

Quindi la funzione start() ha un ciclo continuo fino al backtest (2 giorni) finalizzato.

Il mio problema principale è chiamare lo ZigZag credo. Sotto sto chiamando l'indicatore zigzag. Normalmente se c'è un massimo o un minimo dovrebbe ritornare con un valore diverso da zero. Ma nel mio caso a volte ritorna sia basso che alto con lo stesso valore, il che è impossibile.


  double zh=iCustom(Symbol(),0,"ZigZag.ex4",6,5,3,1,20);
  double zl=iCustom(Symbol(),0,"ZigZag.ex4",6,5,3,0,20);

  Zig_high[cnt]=zh;
  Zig_low[cnt]=zl;
  cnt=cnt+1;

Forse non ho capito gli array usati nell'indicatore zigzag Metaquotes originale (vedi sotto). La mia comprensione è che questi sono utilizzati per memorizzare i valori alti e bassi.

//---- indicator buffers
double ExtMapBuffer[];
double ExtMapBuffer2[];

Grazie

 

Prenditi un po' di tempo per leggere e imparare

Questo potrebbe aiutarvi anche un po

Spiegazione dettagliata di iCustom

 
Allego anche il mio codice...
File:
 
Cos'è la visualizzazione di Data Window?
 
deVries:
Cosa sta visualizzando Data Window?

Il grafico qui sotto mostra il valore minimo (sia il valore del punto del cursore, sia il valore della finestra dei dati e l'uscita è lo stesso)

1º

Quello sotto è 6 tick dopo la parte più alta del grafico. Sia la finestra dei dati che i punti del cursore sono gli stessi, tuttavia l'uscita non è la stessa e inoltre restituisce sia il valore basso che quello alto.

22º

Ho controllato che iCustom() carichi correttamente l'indicatore. Il valore basso è lo stesso ma il valore alto no. Potrebbe essere legato all'indicatore ZigZag?

Non riesco proprio a capire cosa sto facendo di sbagliato.

Motivazione: