Indicatore ZigZag – Prova codice

Forums ProRealTime forum Italiano Supporto ProBuilder Indicatore ZigZag – Prova codice

Viewing 12 posts - 1 through 12 (of 12 total)
  • #205922

    Salve a tutti. Non avendo trovato nel sito alcun codice relativo allo zigzag classico, pubblico questa versione scritta da me con l’ausilio degli array. L’ho confrontato con l’indicatore delle piattaforma e i risultati sono pressocchè identici sia nella modalità pips che in percentuale.

    Con la variabile “Tipo” si può commutare il funzionamento fra “Punti” e “Percentuale” (Nota: nel caso di ZZ in %, ho usato come base di calcolo il Day Close del giorno precedente per dare stabilità al riferimento; usando il close con valori % molto bassi, a volte il ricalcolo da origine ad artefatti grafici)
    Con la variabile “Segmenti” si decide quante coppie di segmenti up/down visualizzare sul grafico.

    #205928

    Mi sono accorto di un errore quando utilizzato con le valute.

    correggere le righe 22 e 24 con:

    DeltaY=max(2*pipsize,Punti*pipsize)

    DeltaY=max(0.001,Percentuale/100*Dclose(1)*pipsize)

    Ps: non è possibile correggere i post?

     

    #205963

    Grazie per averlo condiviso, sicuramente sarà di aiuto a molti trader.

    Puoi ripostare il codice corretto, se vuoi, altrimenti ognuno farà la modifica da solo.

     

    #205967

    Una domanda: usando gli array nel codice dello zigzag si supera il fenomeno del repaint o no? Io ricordo che lo zigzag viene assimilato al dpo per questo problema del repaint. Grazie e complimenti per il bel lavoro!

    #205977

    Come nello ZigZag della piattaforma, l’ultimo punto Top o Low valido (che ha quindi superato il DeltaY in pips o %) rimane “in progress”, nel senso che potrebbe venire aggiornato dalla candela in corso se chiude nella medesima direzione. Tutti i punti precedenti rimangono fissi e confermati.

    Per es, se l’ultimo punto valido era un Top a 11300 punti, e ZZ settato a 50pips, se il prezzo continua a salire, ad ogni chiusura di candela l’ultimo Top verrà aggiornato e rimarrà in progress.

    Se invece da 11300 il prezzo inizia a scendere, fino a 11251 (DeltaY non superato), viene tracciato un segmento tratteggiato e  l’ultimo punto valido sarà sempre il Top a 11300. Se si arriva a 11250, viene memorizzato un nuovo punto Low (che rimane in progress in quanto il prezzo potrebbe scendere ulteriormente), mentre il Top precedente diventa ora definitivo.

    Spero di essermi riuscito e spiegare 🙂

    No l’ho testato moltissimo, ma mi sembra che funzioni correttamente in entrambe le modalità.

    Ps. l’uso degli array è solo per semplificazione del codice quando si cambiano il n. dei segmenti da visualizzare e anche per poter utilizzare il comando DRAWONLASTBARONLY=TRUE, che consente di plottare l’ultimo segmento tratteggiato in fase di aggiornamento, come fa l’indicatore della piattaforma

    2 users thanked author for this post.
    #206100

    Buon pomeriggio.

    Purtroppo mi sono accorto che l’indicatore realizzato con gli array, così come compilato, dà dei problemi nella fase di commutazione da lastpoint 1/-1 durante la candela in corso di aggiornamento. Ho provato a capirne il motivo per una giornata intera, ma non sono riuscito a venir a capo di questa problematica che fa riempire gli array di valori sballati durante tutta la candela in progress.

    Al che ho fatto una marcia indietro, e ho rifatto tutto usando variabili fisse e non parametriche, ed ora funziona tutto perfettamente anche se il n. di segmenti visualizzati ora è fisso e modificabile solo nel codice (comunque sufficienti per l’utilizzo con una strategia 1-2-3)

    Peccato, ma non ho proprio idea su come risolvere il problema di cui sopra.

    Ps: Roberto, come si può fare il modo che un codice venga eseguito solo alla chiusura della candela (e non in modo continuo “live”)? Ho provato ad usare il comando “timeframe(<valore del timeframe>, udateonclose)” ma apperentemente non ha effetto sul ricalcolo

    #206474

    Il problema è che gli ARRAY non sono storicizzati come le normali variabili, ad esempio MiaVariabile[0] è il valore corrente di una variabile, MiaVariabile[1] è il valore che quella variabile aveva nella barra precedente.

    $MioElemento[0], in quanto elemento di un ARRAY, non viene storicizzato e non si può usare $MioElemento[0][1] per fare riferimento al suo valore precedente. Siccome un ARRAY può contenere un numero illimitato di elementi (solo la memoria disponibile è il suo limite fisico), dopo qualche migliaio di barre occorrerebbero centinaia di migliaia, se non milioni, di slot di memoria (ciascuno di vari bytes, forse 8, non so di che tipo numerico siano, penso FLOAT), quindi assolutamente IMPOSSIBLE da fare, per cui ogni elemento mantiene il valore corrente e non viene mai resettato al valore iniziale che ha avuto alla chiusura della barra precedente, ed assume un nuovo valore ad ogni tick.

    Ho provato ad usare due specifici elementi di una ARRAY che, combinati con la verifica dell’orario (che sia diverso dal precedente), sembrano funzionare. Provalo e fammi sapere:

    1 user thanked author for this post.
    #206539

    Come l’hai realizzato tu funziona perfettamente, anche se ancora non mi è completamente chiaro il motivo.
    Ho fatto anche un esperimento per fare eseguire la parte centrale del codice solo quando:
    Time <> Time[1]
    ma non è sufficiente, è proprio necessario anche il confronto fra:
    $myTime[0] <> $myTime[1]
    come hai fatto tu, e la relativa transizione a fine codice $myTime[1] = $myTime[0] anche se il contenuto di $myTime è sempre il valore Time (che teoricamente incrementa con passo >= 1 secondo essendo un valore HHMMSS).
    E’ un po difficile spiegarsi via messaggio 🙂
    Me lo studio ancora un po per riuscire a mettere bene a fuoco la tua modifica risolutiva.
    Per intanto ti ringrazio! Dai tuoi post imparo sempre qualcosa in più 😉
    Buone feste Roberto

    1 user thanked author for this post.
    #206540

    Il problema sta sia nel verificare l’orario diverso dal precedente, ma che anche che i due elementi siano diversi, in quanto quest’ultimi vengono aggiornati (e saranno identici) ad ogni tick successivo. Interessa fare in modo che siano diversi solo per il PRIMO tick.

    Se verifico le date, queste saranno sempre diverse rispetto alla barra precedente, in quanto sono dati storicizzati per ciascuna barra, mentre i due elementi del nuovo ARRAY no, per cui combinando insieme le due cose si riesce a risolvere il problema.

    Come vedi è passato del tempo prima che abbia potuto risponderti, perché trovare una soluzione è stato impegnativo; ho provato diverse soluzioni che non funzionavano ed ogni volta ho abbandonato temporaneamente per staccare la mente da quel problema… alla fine ce l’ho fatta.

    Buone Feste anche a te (e a tutti gli altri) 🙂

     

     

    1 user thanked author for this post.
    #206542

    Ci stavo riflettendo… ed effettivamente il problema si capisce meglio facendolo girare su un grafico a 1 tick. Come giustamente dicevi tu, il TIME in HHMMSS rimane uguale anche per diversi tick, mente ovviamente i valori del prezzo continuano a cambiare e quindi anche i relativi calcoli nel ciclo dell’indicatore.
    In alcune condizioni, il valore di LastPoint continua a commutare da 1 a -1 all’interno della stessa barra, facendo quindi aggionare i valori di X e Y di entrambi gli array $T e $L, che ad un certo punto si riempiono dello stesso prezzo e barindex.
    La tua (ottima) soluzione riesce ad ovviare a questo anomalo comportamento.
    Grazie ancora per il tempo speso, per me è stato molto utile!

    #206816

    Scusatemi ma perchè mi da questo errore?

    #206818

    Elimina la linea 3, ma se l’errore si sposta su rughe più in basso allora è un problema del copia e incolla.

    Fai la copia del codice utilizzando il pulsante indicato nella foto e premendo Ctrl+C (poi incollalo al posrto di quello errato).

     

     

Viewing 12 posts - 1 through 12 (of 12 total)

Create your free account now and post your request to benefit from the help of the community
Register or Login