Problema con l'indicatore ZigZag - pagina 4

 
aed71:

OK Grazie FMIC.

In effetti il mio problema riguardava l'esperto che ho condiviso nel forum. Il tuo script funziona bene, molte grazie per questo, ma fondamentalmente ne ho bisogno sotto forma di esperto che possa lavorare anche in modalità quasi in tempo reale.

Le tue domande originali su questo thread erano:

  1. Come accedere correttamente ai dati dell'indicatore ZigZag attraverso l'uso della funzione "iCustom"?
  2. Come raccogliere ed elaborare i punti alti e bassi dello ZigZag per l'analisi statistica?

Il mio script ti ha fornito il codice di esempio e le conoscenze per rispondere ad entrambe queste domande, in modo che tu possa ora applicare queste conoscenze ad altri usi come un EA che desideri sviluppare. Tutto quello che devi fare è usare il mio codice per l'uso di iCustom() e il test dei punti alti e bassi a ZigZag e applicarlo al tuo codice EA.

Tuttavia, l'altra domanda, che hai menzionato più tardi, di come utilizzare i dati ZigZag in un EA specifico per le esigenze di ottimizzazione di una strategia che hai già in funzione in un altro EA, non è stato presentato o descritto in modo sufficientemente dettagliato qui su questo thread. Quindi, in sostanza, non sono in grado di darti consigli o aiutarti perché non so di cosa hai bisogno.

Se leggi l'articolo che accompagna il mio indicatore ZigZagZug nel codebase, vedrai che usare lo ZigZag nelle strategie e negli EA non è facile a causa della costante riverniciatura, e richiede un'attenta comprensione di come funziona e come può essere utilizzato in diverse strategie ed EA.

In altre parole, il matrimonio tra i dati di ZigZag e una strategia EA è complesso e deve essere ben definito. Quindi, senza sapere nulla della tua attuale strategia o di come deve essere ottimizzata, non posso offrirti altro aiuto o consiglio.

Poiché è comprensibile che tu non voglia essere più disponibile pubblicamente, ti ho anche offerto la possibilità di farlo in privato, e senza alcun costo. Sono uno sviluppatore di software e normalmente mi faccio pagare per questi servizi.

Oltre a quello che ti ho già offerto, non posso fare di più o offrirti altri consigli senza capire la natura del problema che vuoi risolvere.

 

Ciao,

Sono riuscito a correggere il mio codice. C'era un errore nella logica dei cicli, ora funziona bene per quanto ho testato.

Chi è interessato può usarlo. È progettato per essere utilizzato come esperto e utilizza l'indicatore ZigZag standard di metaquotes.

Cosa fa fondamentalmente trova i veri punti alti e bassi nell'indicatore zigzag. Può essere usato per trovare i punti bassi e alti nei dati storici anche per l'analisi del periodo e dell'ampiezza.

Non è in tempo reale! Va indietro agli ultimi valori alti e bassi, quindi a seconda dell'ultima lunghezza del trend, potrebbe tornare indietro e correggere i valori. Non usarlo prima di un test veloce in strategy tester.

FMIC, grazie per i tuoi sforzi e il tuo aiuto.

File:
 

Ciao aed71,

C'è ancora qualche bug logico nel tuo codice.

  1. Il tuo cosiddetto "tick loop", è in realtà una "New Bar Condition", poiché stai testando il "Time[0]" per un cambiamento nel tempo al fine di rilevare una nuova barra. Suggerisco di cambiare il commento in modo da non travisare il codice.
  2. Stai assegnando valori all'array prima di testare le condizioni e poi stai testando alcune variabili più volte senza bisogno di cancellarle di nuovo. Questo non farà altro che rallentare il tuo codice e rende anche difficile seguire la logica.
  3. Il tuo modo di trovare i punti di ridipintura non è corretto e non è per niente robusto. Dovresti davvero studiare come funziona lo ZigZag per trovare correttamente i punti di ridipintura. Leggi il suo codice o quello dello ZigZagZug (che è più facile da seguire per te) per capire la sua logica.
  4. Stai memorizzando valori nulli nell'array senza necessità. Perché continuare a incrementare il contatore e aggiungere all'array anche quando non c'è nessun punto ZigZag disponibile. State solo sprecando risorse preziose (RAM e cicli di CPU) senza bisogno. Rallenterà l'esecuzione del tuo codice. Usate piuttosto array cresciuti dinamicamente invece di quelli statici perché non potete garantire un certo requisito di dimensione in anticipo.
  5. Per analizzare i dati in seguito, come i periodi delle onde o le frequenze, dovrai anche tenere traccia dell'indice Time e/o dell'indice Bar Shift.

Cordiali saluti,
FMIC

 
FMIC:

Ciao aed71,

C'è ancora qualche bug logico nel tuo codice.

  1. Il tuo cosiddetto "tick loop", è in realtà una "New Bar Condition", poiché stai testando il "Time[0]" per un cambiamento nel tempo al fine di rilevare una nuova barra. Suggerisco di cambiare il commento in modo da non travisare il codice.
  2. Stai assegnando valori all'array prima di testare le condizioni e poi stai testando alcune variabili più volte senza bisogno di cancellarle di nuovo. Questo non farà altro che rallentare il tuo codice e rende anche difficile seguire la logica.
  3. Il tuo modo di trovare i punti di ridipintura non è corretto e non è per niente robusto. Dovresti davvero studiare come funziona lo ZigZag per trovare correttamente i punti di ridipintura. Leggi il suo codice o quello dello ZigZagZug (che è più facile da seguire per te) per capire la sua logica.
  4. Stai memorizzando valori nulli nell'array senza necessità. Perché continuare a incrementare il contatore e aggiungere all'array anche quando non c'è nessun punto ZigZag disponibile. State solo sprecando risorse preziose (RAM e cicli di CPU) senza bisogno. Rallenterà l'esecuzione del tuo codice. Usate piuttosto array cresciuti dinamicamente invece di quelli statici perché non potete garantire un certo requisito di dimensione in anticipo.
  5. Per analizzare i dati in seguito, come i periodi delle onde o le frequenze, dovrai anche tenere traccia dell'indice Time e/o dell'indice Bar Shift.

Cordiali saluti,
FMIC

Grazie ancora per i tuoi commenti;

Non sono un buon programmatore quindi il codice potrebbe non essere perfetto :-) Comunque lasciami provare a spiegare la mia logica;

1-) La parte del commento potrebbe essere cambiata in "ogni nuova barra".

2-) 4-) 5-) La logica dell'utilizzo di grandi array è che dopo con un nuovo processo conterò le barre con valore zero tra i massimi o tra i massimi e i minimi per trovare il periodo, l'ampiezza ecc. Quindi ho bisogno di inizializzare l'array prima di usarlo e non ho bisogno di occuparmi dell'indice temporale ecc. Solo più buffer che non è un grosso problema per il mio progetto attualmente.

3-) Ho tracciato lo zigzag e lo zigzagzug diverse volte. nello zigzag anche se hai dei veri alti e bassi alla fine, se metti quei valori in un array, vedrai che ci sono dei bassi o alti intermedi. Non è possibile evitarli e che si usi la combinazione mode0 e mode1/mode2. Ci sono sempre dei bassi e degli alti intermedi. In zigzagzug si possono vedere chiaramente questi punti. Oltre a questo vedo che ci sono casi in cui mode0 è zero ma mode1 o mode2 sono maggiori di zero, che sono punti errati. Così ho deciso di mettere del codice extra per evitare questi punti.

Come ho detto, questo potrebbe non essere il miglior codice per trovare i punti a zigzag, tuttavia il codice stesso funziona correttamente nei miei test. Ho testato diverse volte. Raccomando sempre a chi vuole usarlo di testarlo prima.

L'hai testato? Non dà i punti corretti. Quando dici che non è robusto o non è corretto, presumo che i tuoi test siano falliti, è così?

Grazie.

 
aed71:

Grazie ancora per i vostri commenti;

Non sono un buon programmatore quindi il codice potrebbe non essere perfetto :-) Comunque lasciatemi provare a spiegare la mia logica;

1-) La parte del commento potrebbe essere cambiata in "ogni nuova barra".

2-) 4-) 5-) La logica dell'utilizzo di grandi array è che dopo con un nuovo processo conterò le barre con valore zero tra i massimi o tra i massimi e i minimi per trovare il periodo, l'ampiezza ecc. Quindi ho bisogno di inizializzare l'array prima di usarlo e non ho bisogno di occuparmi dell'indice temporale ecc. Solo più buffer che non è un grosso problema per il mio progetto attualmente.

3-) Ho tracciato lo zigzag e lo zigzagzug diverse volte. nello zigzag anche se hai dei veri alti e bassi alla fine, se metti quei valori in un array, vedrai che ci sono dei bassi o alti intermedi. Non è possibile evitarli e che si usi la combinazione mode0 e mode1/mode2. Ci sono sempre dei bassi e degli alti intermedi. In zigzagzug si possono vedere chiaramente questi punti. Oltre a questo vedo che ci sono casi in cui mode0 è zero ma mode1 o mode2 sono maggiori di zero, che sono punti errati. Così ho deciso di mettere del codice extra per evitare questi punti.

Come ho detto, questo potrebbe non essere il miglior codice per trovare i punti a zigzag, tuttavia il codice stesso funziona correttamente nei miei test. Ho testato diverse volte. Raccomando sempre a chi vuole usarlo di testarlo prima.

L'hai testato? Non dà i punti corretti. Quando dici che non è robusto o non è corretto, presumo che i tuoi test siano falliti, è così?

Grazie.


Non hai capito il punto! Il codice che ho fornito ti mostra come identificare correttamente i punti di ZigZag Alto/Basso; eppure tu scegli di ignorarlo e di farlo a modo tuo che rende il codice più difficile da capire e più lento, oltre a usare più risorse del necessario. Perché?
 
Fernando Carreiro #:

Stai usando lo ZigZag in modo sbagliato nel tuo esempio iCustom. Lo ZigZag standard di MetQuotes ha TRE (non due) buffer (Mode o Line Index in iCustom)

  1. Mode = 0: Tiene entrambi i punti alti e bassi dello ZigZag.
  2. Mode = 1: Punti alti ma non necessariamente solo i punti ZigZag (dato che tiene anche i punti di riverniciatura).
  3. Mode = 2: Punti bassi ma non necessariamente solo punti ZigZag (poiché contiene anche punti di ridipintura).

Dovrai confrontare il primo buffer (Modo 0) con gli altri 2 buffer per decidere se è un Punto Alto o un Punto Basso (per esempio, se sia il Buffer 1 che il Buffer 3 hanno lo stesso valore, allora è un punto ZigZag Basso, e se sia il Buffer 1 che il Buffer 2 sono uguali, allora è un Punto Alto).

Inoltre, per capire meglio come funziona uno ZigZag e come si ridisegna, suggerisco di giocare con il mio indicatore ZigZagZug. Tuttavia, nel tuo codice usa lo ZigZag di MetaQuotes, perché è più veloce. La mia versione fa più elaborazione a causa delle caratteristiche extra ed è quindi più lenta.

PS! Se il Buffer 1 (Mode = 0) ha un valore di 0.0, ma gli altri buffer hanno valori non nulli, allora sono vecchi punti di ridipintura e NON punti ZigZag.

Nel tuo codice stai usando il Buffer Mode 0 come Low e il Buffer Mode 1 come High. Questo è totalmente scorretto.

Non crederete a quanto questo mi abbia aiutato, grazie mille
Motivazione: