ProRealCode - Trading & Coding with ProRealTime™
ok, grazie…scritto in altro forum!
Questo è il codice dell’indicatore (vedi foto per il risultato):
ONCE p = 50 //50 periodi di storico
Cond = 0
MyRsi = Rsi[14](close)
HH = highest[p](MyRsi)
ONCE Max1 = 0
ONCE Max2 = 0
ONCE Minimo = 0
ONCE Bar1 = 0
ONCE Bar2 = 0
ONCE BarMin = 0
Max2 = HH
FOR i = 0 TO (p - 1)
IF (MyRsi[i] = Max2) THEN
Bar2 = BarIndex[i]
Minimo = Max2
Max1 = 0
FOR j = i DOWNTO 0
IF MyRsi[j] <> Max2 THEN
IF MyRsi[j] < Minimo THEN
Minimo = MyRsi[j]
BarMin = BarIndex[j]
Max1 = 0
ELSIF (MyRsi[j] > Minimo) AND (MyRsi[j] < Max2) THEN
IF (MyRsi[j] > Max1) THEN
Max1 = MyRsi[j]
Bar1 = BarIndex[j]
Cond = 1
Break
ENDIF
ENDIF
ENDIF
NEXT
Break
ENDIF
NEXT
IF Cond THEN
DrawText("◉",Bar1,Max1 + 2,dialog,bold,12) coloured(255,215,0,255)
DrawText("●",Bar2,Max2 + 2,dialog,bold,10) coloured(0,0,255,150)
DrawText("●",BarMin,Minimo - 2,dialog,bold,10) coloured(0,0,255,150)
Max1 = 0
Max2 = 0
Minimo = 0
Bar1 = 0
Bar2 = 0
BarMin = 0
ENDIF
RETURN
e questo è lo screener:
ONCE p = 50 //50 periodi di storico
Cond = 0
MyRsi = Rsi[14](close)
HH = highest[p](MyRsi)
ONCE Max1 = 0
ONCE Max2 = 0
ONCE Minimo = 0
Max2 = HH
x = 0
IF Not (Cond[1] AND (HH = HH[1])) THEN
FOR i = 0 TO (p - 1)
IF (MyRsi[i] = Max2) THEN
Max1 = 0
FOR j = i DOWNTO 0
IF MyRsi[j] <> Max2 THEN
IF MyRsi[j] < Minimo THEN
Minimo = MyRsi[j]
Max1 = 0
ELSIF (MyRsi[j] > Minimo) AND (MyRsi[j] < Max2) THEN
IF (MyRsi[j] > Max1) THEN
Max1 = MyRsi[j]
Cond = 1
Break
ENDIF
ENDIF
ENDIF
NEXT
Break
ENDIF
NEXT
x = Cond
ENDIF
IF Cond THEN
Max1 = 0
Max2 = 0
Minimo = 0
IF Cond[1] THEN
x = 0
ENDIF
ENDIF
SCREENER[x]
Questa è un’altra soluzione che mi sembra dia risultati più vicini a quello che vuoi.
Indicatore:
ONCE p = 50 //50 periodi di storico
Cond = 0
MyRsi = Rsi[14](close)
Max1 = MyRsi
Bar1 = BarIndex
Max2 = highest[p](MyRsi)
Minimo = lowest[p](MyRsi)
FOR i = 0 TO (p - 1)
IF MyRsi[i] = Minimo THEN
BarMin = BarIndex[i]
ELSIF MyRsi[i] = Max2 THEN
Bar2 = BarIndex[i]
ELSIF MyRsi[i] > Max1 THEN
Max1 = MyRsi[i]
Bar1 = BarIndex[i]
ENDIF
NEXT
IF (Max2 > Max1) AND (Max1 > Minimo) THEN
IF (Bar2 < BarMin) AND (BarMin < Bar1) THEN
Cond = 1
ENDIF
ENDIF
IF Cond THEN
DrawText("◉",Bar1,Max1 + 2,dialog,bold,12) coloured(255,215,0,255)
DrawText("●",Bar2,Max2 + 2,dialog,bold,10) coloured(0,0,255,150)
DrawText("●",BarMin,Minimo - 2,dialog,bold,10) coloured(0,0,255,150)
ENDIF
RETURN MyRsi AS "Rsi"
Screener:
ONCE p = 50 //50 periodi di storico
Cond = 0
MyRsi = Rsi[14](close)
Max1 = MyRsi
Bar1 = BarIndex
Max2 = highest[p](MyRsi)
Minimo = lowest[p](MyRsi)
FOR i = 0 TO (p - 1)
IF MyRsi[i] = Minimo THEN
BarMin = BarIndex[i]
ELSIF MyRsi[i] = Max2 THEN
Bar2 = BarIndex[i]
ELSIF MyRsi[i] > Max1 THEN
Max1 = MyRsi[i]
Bar1 = BarIndex[i]
ENDIF
NEXT
IF (Max2 > Max1) AND (Max1 > Minimo) THEN
IF (Bar2 < BarMin) AND (BarMin < Bar1) THEN
Cond = 1
ENDIF
ENDIF
SCREENER[Cond]
Dalle foto si può vedere che a volte ci sono più punti blù o gialli l’uno vicino all’altro. E’ dovuto al fatto che in un periodo (ad esempio di 50 barre), il pattern può essere verificato sia sulla 39esima e 37esima (numeri a caso a titolo di esempio).
Si può notare anche che viene verificato se c’è un pattern nelle ultima 50 candele, ma può anche non essere sull’ultima a destra (quella corrente). Per averlo su quella corrente, basta sostituire la linea 20 dello screener con questa:
Cond = (Bar1 = BarIndex)
C’è anche una caso (Pic3) in cui c’è un punto che non è né BLU, né GIALLO. E’ dovuto al fatto che per un precedente pattern era GIALLO, mentre per quello corrente lo stesso punto era BLU, per cui si sono sovrapposti dando origine ad un colore imprevisto.
Io le verifiche dei vari punti l’ho fatta SOLO sull’Rsi, non sui prezzi.
Si può anche fare sui prezzi, però dovrei sapere se devono essere sulole stesse candele, oppure anche un pò sfalzati. Si può anche fare SOLO ui prezzi, senza considerare l’Rsi.
Ciao, molte grazie anche della seconda soluzione che, a prima vista, sembra effettivamente migliore.
Purtroppo, come temevo, questo indicatore fornisce tanti…direi troppi casi che c’entrano poco o nulla. Sarebbe necessario forse un ulteriore filtro, per chiederti il quale prendo ad esempio l’immagine “RSI-1.png” allegata.
Da tale immagine, si capisce come il Proscreener abbia assolutamente fatto “il suo” per quel che riguarda l’indicatore RSI…ma ciò non è sufficiente a trovare un titolo che abbia effettivamente creato un doppio minimo … mentre infatti i punti 1a ed 1b corrispondono ai desiderata..altrettanto non si può dire dei punti 1 e 2, inerenti il prezzo (vd. immagine “RSI-2.png”…Da questa immagine si vede tra i 2 minimi 1 e 2 esservi un gap di quasi il 15%).
Visto ciò..a questo punto ti chiedo se possibile AGGIUNGERE un ulteriore filtro, questa volta inerente il prezzo: tra i 2 punti 1 e 2 (a prescindere essi siano i 2 minimi di un doppio minimo o i 2 massimi di un doppio massimo) NON vi deve essere una “distanza” superiore al 3%. Se quest’ultimo valore (3%) si potesse modificare manualmente, sarebbe ancora meglio.
Grazie ciao
Si, sia i periodi LookBack, che la percentuale, che RSI puoi cambiarli tu nel codice, come vuoi.
Indicatore:
ONCE p = 50 //50 periodi di storico
ONCE PerCent= 3 //3% max. differenza tra i due MASSIMI
Cond = 0
MyRsi = Rsi[14](close)
Max1 = MyRsi
Bar1 = BarIndex
Max2 = highest[p](MyRsi)
Minimo = lowest[p](MyRsi)
FOR i = 0 TO (p - 1)
IF MyRsi[i] = Minimo THEN
BarMin = BarIndex[i]
ELSIF MyRsi[i] = Max2 THEN
Bar2 = BarIndex[i]
ELSIF MyRsi[i] > Max1 THEN
Max1 = MyRsi[i]
Bar1 = BarIndex[i]
ENDIF
NEXT
IF (Max2 > Max1) AND (Max1 > Minimo) THEN
IF (Bar2 < BarMin) AND (BarMin < Bar1) THEN
Gap = Max2 - Max1
Diff = abs(Gap * 100 / Max2) <= PerCent
IF Diff THEN
Cond = 1
ENDIF
ENDIF
ENDIF
IF Cond THEN
DrawText("◉",Bar1,Max1 + 2,dialog,bold,12) coloured(255,215,0,255)
DrawText("●",Bar2,Max2 + 2,dialog,bold,10) coloured(0,0,255,150)
DrawText("●",BarMin,Minimo - 2,dialog,bold,10) coloured(0,0,255,150)
ENDIF
RETURN MyRsi AS "Rsi"
Screener:
ONCE p = 50 //50 periodi di storico
ONCE PerCent= 3 //3% max. differenza tra i due MASSIMI
Cond = 0
MyRsi = Rsi[14](close)
Max1 = MyRsi
Bar1 = BarIndex
Max2 = highest[p](MyRsi)
Minimo = lowest[p](MyRsi)
FOR i = 0 TO (p - 1)
IF MyRsi[i] = Minimo THEN
BarMin = BarIndex[i]
ELSIF MyRsi[i] = Max2 THEN
Bar2 = BarIndex[i]
ELSIF MyRsi[i] > Max1 THEN
Max1 = MyRsi[i]
Bar1 = BarIndex[i]
ENDIF
NEXT
IF (Max2 > Max1) AND (Max1 > Minimo) THEN
IF (Bar2 < BarMin) AND (BarMin < Bar1) THEN
Gap = Max2 - Max1
Diff = abs(Gap * 100 / Max2) <= PerCent
IF Diff THEN
//Cond = 1 //restituisce l'Ultimo trovato (anche se vecchio)
Cond = (Bar1 = BarIndex) //restituisce solo quelli rilevati sulla candela corrente
ENDIF
ENDIF
ENDIF
SCREENER[Cond]
Ciao, grazie dell’ultimo messaggio.
Ti allego un esempio di un titolo trovato tramite l’ultimo ProScreener che mi hai inviato, nel file CATTURA.PNG.
Sicuramente l’ultimo filtro ha migliorato le cose…tuttavia c’è ancora qualcosa che non capisco.
Nel mio messaggio del 08/05/2021 at 12:44 PM, ti avevo chiesto di aggiungere un ulteriore filtro per evitare venissero “scelti” titoli “sbagliati” e avevo scritto ciò:
“Chiedo allora di modificare il Proscreener nel seguente modo (aggiungo le 2 condizioni in grassetto maiuscole):
Vorrei un Proscreener che mi permetta di filtrare i titoli il cui RSI, negli ultimi N periodi (questo N sia un valore che io possa modificare), abbia raggiunto:
OPPURE (cerco entrambi i casi)
_____________________________________________________________________________________
A tale scopo ho allegato nuovamente i files “Doppio-minimo.jpg” e “Doppio-massimo.jpg” in cui avevo inserito i punti 1,2,3,4,5,6 appositi per chiarire.
Si potrebbe aggiungere tale “filtro” ?
Molte grazie! 🙂
Che significa “UNA VOLTA RAGGIUNTO TALE PUNTO 3, IL VALORE DELL’RSI DEVE RIMANERE COMPRESO TRA I VALORI DEI PUNTI 1 E 2“? Quando viene restituito (o visualizzato) un segnale è finita li. Quello che accade dalla barra successiva riguarda un eventuale prossimo segnale.
L’unica cosa da fare è stabilire che i periodi vadano di 50 in 50 in modo fisso, per cui dopo avere esaminato 50 barre, non esamino anche la successiva, ma solo dopo che ne siano passate altre 50. Non so se è questo che vuoi.
Non capisco a cosa servono i punti 4, 5, ecc… per fare quello che vuoi servono 1, 2 e 3 poi si ricomincia da capo.
Cerca di spiegare con il testo (senza immagini) cosa vuoi.
Allora..circa la frase “UNA VOLTA RAGGIUNTO TALE PUNTO 3, IL VALORE DELL’RSI DEVE RIMANERE COMPRESO TRA I VALORI DEI PUNTI 1 E 2“…cerco di spiegarmi e cioè: io ovviamente con il ProScreener sarei interessato a trovare dei doppi massimi / minimi ancora “in vigore”, appena formatisi per poter sfruttare il movimento che ne deriva, quindi cerco figure in cui il prezzo ancora non sia “scappato” superando il vertice del triangolo formato.
Quindi, considerando il DOPPIO MASSIMO come un triangolo costituito da una base che unisce i 2 MASSIMI ed un vertice in basso (costituito dal minimo) (ovviamente il DOPPIO MINIMO il contrario e cioè un triangolo costituito da una base che unisce i 2 MINIMI ed un vertice in alto (costituito dal massimo), io vorrei aggiungere alla regola scritta finora un ulteriore filtro che permetta di selezionare solo i titoli in cui (oltre ad aver visto la formazione della figura a 3 vertici per l’RSI) il prezzo sia (ancora) compreso tra i 2 minimi (o massimi) ed il vertice stesso della figura…il tutto per evitare i titoli per i quali, ormai, il vero movimento rialzista / ribassista sia già, in buona parte, “consumato”..
Se non mi fossi spiegato a sufficienza, dimmi… grazie
Ecco il nuovo screener, verifica che il prezzo sia tra quello del minimo e del massimo (più basso):
ONCE p = 50 //50 periodi di storico
ONCE PerCent= 3 //3% max. differenza tra i due MASSIMI
Cond = 0
MyRsi = Rsi[14](close)
Max1 = MyRsi
Bar1 = BarIndex
Max2 = highest[p](MyRsi)
Minimo = lowest[p](MyRsi)
FOR i = 0 TO (p - 1)
IF MyRsi[i] = Minimo THEN
BarMin = BarIndex[i]
PrezzoMin= close[i]
ELSIF MyRsi[i] = Max2 THEN
Bar2 = BarIndex[i]
Prezzo2 = close[i]
ELSIF MyRsi[i] > Max1 THEN
Max1 = MyRsi[i]
Bar1 = BarIndex[i]
Prezzo1 = close[i]
ENDIF
NEXT
IF (Max2 > Max1) AND (Max1 > Minimo) THEN
IF (Bar2 < BarMin) AND (BarMin < Bar1) THEN
Gap = Max2 - Max1
Diff = abs(Gap * 100 / Max2) <= PerCent
IF Diff THEN
IF (close <= Prezzo1) AND (close >= PrezzoMin) THEN
//Cond = 1 //restituisce l'Ultimo trovato (anche se vecchio)
Cond = (Bar1 = BarIndex) //restituisce solo quelli rilevati sulla candela corrente
ENDIF
ENDIF
ENDIF
ENDIF
SCREENER[Cond]
Se il confronto vuoi farlo tra il prezzo Minimo ed il prezzo Massimo più alto, basta che alla riga 27 sostituisci Prezzo1 con Prezzo2.
Ringrazio ma compare il messaggio di errore che allego. Devo modificare qualcosa?
P.S. forse correlato con l’errore ma non capisco purtroppo le tue 2 frasi “verifica che il prezzo sia tra quello del minimo e del massimo (più basso)” e “Se il confronto vuoi farlo tra il prezzo Minimo ed il prezzo Massimo più alto, basta che alla riga 27 sostituisci Prezzo1 con Prezzo2.”
Intendi dire che, se voglio cercare doppi massimi, devo lasciare scritto “Prezzo1” e, se al contrario voglio cercare Doppi minimi devo scrivere “Prezzo 2”? Non capisco quale sia ilo “confronto” a cui ti riferisci….
Scusa, mi sono dinenticato di commentare la linea 15. Commentala.
Se vuoi usare Prezzo2 devi sostituire Prezzo1 come ti avevo detto e togliere il commento dalla riga 15 e metterlo alla riga 19.
purtroppo non riesco a far funzionare questo proscreener…ho aggiunto un commetno alla linea 15 ma compare l’errore ERRORE DI SINTASSI: UTILIZZA LA VARIABILE PREZZO2.
Ti aggiungo, sinceramente..non aver minimamente capito cosa siano le 2 grandezze prezzo 1 e 2..io sapevo dover inserire le 3 grandezze
Puoi gentilmente spiegare (a me e a coloro che leggeranno la pagina) a cosa corrispondano le grandezze PREZZO 1 e PREZZO 2? Ci sono due prezzi?? Devo inserirle queste grandezze..oltre alle 3 che ho elencato? Cosa rappresentano?? ti chiedo gentilmente di chiarirmi..altrimenti non riuscirò, purtroppo, ad utilizzare tale ProScreener!
Grazie
Siccome l’indicatore è basato sull’RSI, i prezzi erano ignorati. Dal momento che hai chiesto che i prezzi restino nel range tra il Minimo assoluto del periodo ed il Massimo inferiore, ho dovuto usare 3 variabili, Prezzo2 (quello in corrispondenza del’RSI più alto), PrezzoMin che è il prezzo in corrispondenza dell’RSI più basso e Prezzo1 che è il prezzo in corrispondenza dell’RSI maggiore del minimo (ma inferiore al massimo) ed è quello più a destra sullo schermo.
Non devi inserirli tu, se li trova da solo. Tu devi solo variare (se lo vuoi) p, i periodi entro i quali verificare i massimi ed il minimo (deve essereci un periodo, che sia 10, 50 o 100 barre) e PerCent, la percentuale massima d’incremento.
Questo è l’indicatore ulteriormente modificato, perché la differenza di percentuale l’avevo calcolata sull’RSI invece che sul PREZZO:
ONCE p = 50 //50 periodi di storico
ONCE PerCent= 3 //3% max. differenza tra i due MASSIMI
Cond = 0
MyRsi = Rsi[14](close)
Max1 = MyRsi
Bar1 = BarIndex
Max2 = highest[p](MyRsi)
Minimo = lowest[p](MyRsi)
FOR i = 0 TO (p - 1)
IF MyRsi[i] = Minimo THEN
BarMin = BarIndex[i]
PrezzoMin= close[i]
ELSIF MyRsi[i] = Max2 THEN
Bar2 = BarIndex[i]
Prezzo2 = close[i]
ELSIF MyRsi[i] > Max1 THEN
Max1 = MyRsi[i]
Bar1 = BarIndex[i]
Prezzo1 = close[i]
ENDIF
NEXT
IF (Max2 > Max1) AND (Max1 > Minimo) AND (Prezzo2 > Prezzo1) THEN
IF (Bar2 < BarMin) AND (BarMin < Bar1) THEN
Gap = Prezzo2 - Prezzo1
Diff = abs(Gap * 100 / Prezzo2) <= PerCent
IF Diff THEN
IF (close <= Prezzo1) AND (close >= PrezzoMin) THEN
//Cond = 1 //restituisce l'Ultimo trovato (anche se vecchio)
Cond = (Bar1 = BarIndex) //restituisce solo quelli rilevati sulla candela corrente
ENDIF
ENDIF
ENDIF
ENDIF
IF Cond THEN
DrawText("◉",Bar1,Max1 + 2,dialog,bold,12) coloured(255,215,0,255)
DrawText("●",Bar2,Max2 + 2,dialog,bold,10) coloured(0,0,255,150)
DrawText("●",BarMin,Minimo - 2,dialog,bold,10) coloured(0,0,255,150)
ENDIF
RETURN MyRsi AS "Rsi"
e questo è lo screener, predisposto per Prezzo1, ovvero il primo massimo (quello più basso tra i due) partendo da destra, perché il codice deve sempre partire dalla candela corrente ed effettuare le ricerche all’indietro:
ONCE p = 50 //50 periodi di storico
ONCE PerCent= 3 //3% max. differenza tra i due MASSIMI
Cond = 0
MyRsi = Rsi[14](close)
Max1 = MyRsi
Bar1 = BarIndex
Max2 = highest[p](MyRsi)
Minimo = lowest[p](MyRsi)
FOR i = 0 TO (p - 1)
IF MyRsi[i] = Minimo THEN
BarMin = BarIndex[i]
PrezzoMin= close[i]
ELSIF MyRsi[i] = Max2 THEN
Bar2 = BarIndex[i]
Prezzo2 = close[i]
ELSIF MyRsi[i] > Max1 THEN
Max1 = MyRsi[i]
Bar1 = BarIndex[i]
Prezzo1 = close[i]
ENDIF
NEXT
IF Prezzo1 OR Prezzo2 OR PrezzoMin THEN
ENDIF
IF (Max2 > Max1) AND (Max1 > Minimo) AND (Prezzo2 > Prezzo1) THEN
IF (Bar2 < BarMin) AND (BarMin < Bar1) THEN
Gap = Prezzo2 - Prezzo1
Diff = abs(Gap * 100 / Prezzo2) <= PerCent
IF Diff THEN
IF (close <= Prezzo1) AND (close >= PrezzoMin) THEN
//Cond = 1 //restituisce l'Ultimo trovato (anche se vecchio)
Cond = (Bar1 = BarIndex) //restituisce solo quelli rilevati sulla candela corrente
ENDIF
ENDIF
ENDIF
ENDIF
SCREENER[Cond]
Se, invece del Prezzo1 (che è il Massimo minore, quello più a destra), vuoi fare riferimento all’altro, devi solo variare la riga 29 (non è più la stessa di prima perché ho aggiunto due righe) e sostituirlo con Prezzo2.
Doppi minimi e massimi
This topic contains 37 replies,
has 3 voices, and was last updated by
robertogozzi
2 years, 8 months ago.
| Forum: | ProScreener: Scansione Mercati & Screener |
| Language: | Italian |
| Started: | 07/26/2021 |
| Status: | Active |
| Attachments: | 20 files |
The information collected on this form is stored in a computer file by ProRealCode to create and access your ProRealCode profile. This data is kept in a secure database for the duration of the member's membership. They will be kept as long as you use our services and will be automatically deleted after 3 years of inactivity. Your personal data is used to create your private profile on ProRealCode. This data is maintained by SAS ProRealCode, 407 rue Freycinet, 59151 Arleux, France. If you subscribe to our newsletters, your email address is provided to our service provider "MailChimp" located in the United States, with whom we have signed a confidentiality agreement. This company is also compliant with the EU/Swiss Privacy Shield, and the GDPR. For any request for correction or deletion concerning your data, you can directly contact the ProRealCode team by email at privacy@prorealcode.com If you would like to lodge a complaint regarding the use of your personal data, you can contact your data protection supervisory authority.