Salve a tutti, ho un problema quando provo a far funzionare uno screener con condizioni prese in contemporanea da un indicatore personalizzato e dal grafico dei prezzi.
Faccio un esempio, se faccio girare lo screener che deve soddisfare 2 condizioni entrambe prese da 3 valori dell’indicatore personalizzato, funziona:
indicator1, indicator2, indicator3 = CALL "mioindicatore"
c1 = (indicator1 > indicator2)
c2 = (indicator2 > indicator3)
SCREENER[c1 and c2] ((close/DClose(1)-1)*100 AS "% Var ieri")
Se invece aggiungo una condizione presa dal grafico dei prezzi (esempio prezzo maggiore di MM 200 barre) mi da sempre zero risultati:
indicator1, indicator2, indicator3 = CALL "mioindicatore"
c1 = (indicator1 > indicator2)
c2 = (indicator2 > indicator3)
MM200 = Average[200](close)
c3= (close > MM200)
SCREENER[c1 and c2 and c3] ((close/DClose(1)-1)*100 AS "% Var ieri")
Cosa sbaglio? Grazie in anticipo
Matteo
Non posso testarlo perché non so cosa sia quell’indicatore. Posta il codice o un link dove reperirlo.
Il codice sembra vada bene.
Probabilmente la condizione C3 è incompatibile con le altre due, non saprei cos’altro dirti.
Tieni presente che ProScreener non accetta periodi oltre 254, quindi:
- average[254] va bene
- average[255] è errata perché eccede il massimo consentito
- average[250](rsi[14](close)) è errata perché 250+14 fa 264 che eccede il massimo consentito
Ciao Roberto, l’indicatore restituisce il barindex di un certo evento, quindi un numero intero. Nello specifico sono restituiti 3 risultati X, A e B.
Ti copio qui il codice.
c1=low<lowest[30](low)[1]
IF c1 then
myindexX=barindex
endif
Xindex=barindex-myindexX
c2=high>highest[Xindex+1](high)[1]
if c2 then
myindexA=barindex
endif
Aindex=barindex-myindexA
c3=low<lowest[Aindex+1](low)[1]
if c3 then
myindexB=barindex
endif
Bindex=barindex-myindexB
return Xindex+1 as "X", Aindex+1 as "A", Bindex+1 as "B"
Probabilmente in alcuni casi il numero supera 254 barre.
Non posso verificarlo fino a lunedì.
Si effettivamente può essere perchè finchè la condizione non è soddisfatta il conteggio delle barre continua, infatti l’indicatore su certi titoli da errore se carico 15 o 10k barre, mentre praticamente mai se ne visualizzo 200.
E’ possibile limitare l’indicatore agli ultimi 6 mesi per esempio?
Si, devi dichiarare una variabile per la data di partenza (ad esempio DataInizio) ed usarla per fare in modo che l’indicatore parta solo da quella data in poi (devi aggiungerla te nell’indicatore, io la metto fissa):
IF barindex = 0 THEN
Xindex = 0
Aindex = 0
Bindex = 0
ENDIF
IF date >= DataInizio THEN
c1=low<lowest[30](low)[1]
IF c1 then
myindexX=barindex
endif
Xindex=barindex-myindexX
c2=high>highest[Xindex+1](high)[1]
if c2 then
myindexA=barindex
endif
Aindex=barindex-myindexA
c3=low<lowest[Aindex+1](low)[1]
if c3 then
myindexB=barindex
endif
Bindex=barindex-myindexB
ENDIF
return Xindex+1 as "X", Aindex+1 as "A", Bindex+1 as "B"
dopodiché richiamerai l’indicatore usando sempre CALL, ma in più dovrai passargli la data che desideri (puoi inserirla in una variabile, anziché passarla come costante):
indicator1, indicator2, indicator3 = CALL "mioindicatore" [20190701](close)
Grazie Roberto, ora l’indicatore funziona sempre e si limita agli ultimi mesi. Come output ho aggiunto i 3 prezzi relativi ai 3 punti X A e B.
IF barindex = 0 THEN
Xindex = 0
Aindex = 0
Bindex = 0
ENDIF
IF date >= DataInizio THEN
c1=low<lowest[30](low)[1]
IF c1 then
myindexX=barindex
endif
Xindex=barindex-myindexX
c2=high>highest[Xindex+1](high)[1]
if c2 then
myindexA=barindex
endif
Aindex=barindex-myindexA
c3=low<lowest[Aindex+1](low)[1]
if c3 then
myindexB=barindex
endif
Bindex=barindex-myindexB
ENDIF
Xprice = lowest[Xindex+1](low)[1]
Aprice = highest[Xindex+1](high)[1]
Bprice = lowest[Aindex+1](low)[1]
return Xindex+1 as "X", Xprice as "Xp", Aindex+1 as "A", Aprice as "Ap", Bindex+1 as "B", Bprice as "Bp"
Però se provo a fare lo screener che richiama l’indicatore, finchè metto 3 condizioni ovvero 2 relative ai bar index ed una al prezzo funziona. Quando ne aggiungo una quarta relativa al prezzo non gira più… non capisco come mai. Qui sotto i due codici, il primo funzionante ed il secondo no se mi volessi dare una mano.
X, Xp, A, Ap, B, ignored = CALL "mioindicatore"[20190101]
c1 = (X > A)
c2 = (A > B)
c3 = (Xp < Ap)
SCREENER[c1 AND c2 AND c3] ((close/DClose(1)-1)*100 AS "% Var ieri")
X, Xp, A, Ap, B, Bp = CALL "mioindicatore"[20190101]
c1 = (X > A)
c2 = (A > B)
c3 = (Xp < Ap)
c4 = (Ap > Bp)
SCREENER[c1 AND c2 AND c3 AND c4] ((close/DClose(1)-1)*100 AS "% Var ieri")
Grazie mille in ogni caso
Dovresti verificare sul grafico se Aprice > Bprice, cioè AP > BP.
Se non lo è significa che quella condizione non si verifica.
Prova a scrivere la riga 6 così:
c4 = (Ap < Bp)