ProRealCode - Trading & Coding with ProRealTime™
Buongiorno,
ho assemblato alcuni screener per cercare di averne uno complessivo, anche grazie al suggerimento che mi avete fornito in un altro post (qui il link https://www.prorealcode.com/topic/scan-con-media-e-macd/). Singolarmente gli screener funzionano, ma credo di sbagliare qualcosa nell’assemblaggio.
Potreste darmi una mano a capire dove?
Allego qui il codice:
Grazie mille
// restituisce i seguenti vslori:
//
// Rialzo Ribasso inv.Rialz Inv.Ribas. Later.
// U D u d L
// 1 1 1 1 1
// Trend medie mobili
// 1 = Rialzo
// 2 = Ribasso
// 3 = Laterale
//
Sma5 = average[5,0](close)
Sma20 = average[20,0](close)
Rialzo = close > max(Sma5,Sma20)
Ribasso = close < min(Sma5,Sma20)
Laterale = ((close > Sma20) AND (close < Sma5)) OR ((close > Sma5) AND (close < Sma20))
UP = Rialzo
DN = Ribasso
Lat = Laterale
// Calcolo del MACD personalizzato
MyMACD = Average[12](close) - Average[26](close)
MySignal = Average[9](MyMACD)
// Calcolo del Parabolic SAR
Step = 0.02
Maximum = 0.2
SARValue = SAR[Step, Step, Maximum]
// Condizioni per il trend
MACDLong = MyMACD > MySignal
SARLong = close > SARValue
MACDShort = MyMACD < MySignal
SARShort = SARValue > High
//stocastico lento
Periodi = 10 // Numero di periodi per il calcolo del massimo e del minimo
Kp = 6 // Periodi per la media mobile di K
Dp = 3 // Periodi per la media mobile di D
AvgType = 0 // 0=sma (media mobile semplice)
IC = 75 // Soglia per l'ipercomprato
IV = 100 - IC // Soglia per l'ipervenduto (25 se IC è 75)
// Calcolo dei massimi e dei minimi
HH = HIGHEST[Periodi](HIGH)
LL = LOWEST[Periodi](LOW)
// Calcolo dell'oscillatore
osc = (CLOSE - LL) / (HH - LL) * 100
// Calcolo delle linee K e D
LineaK = AVERAGE[Kp, AvgType](osc)
LineaD = AVERAGE[Dp, AvgType](LineaK)
// Definizione dei segnali di incrocio in zone di ipercomprato e ipervenduto
IncrocioKSuD = LineaK CROSSES OVER LineaD
IncrocioDKSu = LineaD CROSSES OVER LineaK
CondL = IncrocioKSuD AND LineaK < IV // Segnale di acquisto quando K incrocia D verso l'alto in zona ipervenduto
CondS = IncrocioDKSu AND LineaK > IC // Segnale di vendita quando D incrocia K verso l'alto in zona ipercomprato
//bollinger rivisto
BBVal = 5 // 5 periodi per le Bande di Bollinger
BBdev = 1.8 // 1.8 deviazione standard per le Bande di Bollinger
BBavg = average[BBval,0](close) // Calcolo della linea mediana delle Bande di Bollinger
BollUP = BBavg + ((std[BBval](close)) * BBdev) // Calcolo della banda superiore delle Bande di Bollinger
BollDN = BBavg - ((std[BBval](close)) * BBdev) // Calcolo della banda inferiore delle Bande di Bollinger
Bullish = close > open // Condizione per identificare una candela rialzista
Bearish = close < open // Condizione per identificare una candela ribassista
Sma200 = average[200,0](close) // Calcolo della SMA a 200 periodi
TrendUP = close > Sma200 // Condizione per un trend rialzista
TrendDN = close < Sma200 // Condizione per un trend ribassista
// Condizioni per il segnale di acquisto
L1 = Bullish AND Bearish[1]
L2 = close[1] > BollDN
L3 = low[1] <= BollDN
CondL = TrendDN AND L1 AND L2 AND L3
// Condizioni per il segnale di vendita
S1 = Bearish AND Bullish[1]
S2 = close[1] < BollUP
S3 = high[1] >= BollUP
CondS = TrendUP AND S1 AND S2 AND S3
segnale = 0
//breakout
// Breakout Rialzista
BreakoutRialzista = (HIGH = highest[10](HIGH)) AND ((HIGH - LOW) = highest[5](HIGH - LOW)) AND (VOLUME > average[5](VOLUME)) AND (CLOSE > (HIGH - ((HIGH - LOW) / 4)))
// Breakout Ribassista
BreakoutRibassista = (LOW = lowest[10](LOW)) AND ((HIGH - LOW) = highest[5](HIGH - LOW)) AND (VOLUME > average[5](VOLUME)) AND (CLOSE < (LOW + ((HIGH - LOW) / 4)))
//volatilita breve e medio termine
// Calcolo della volatilità di breve/brevissimo termine e di medio termine
VolatilitaBreve5 = STD[5](log(close / close[1]))
VolatilitaBreve10 = STD[10](log(close / close[1]))
VolatilitaMedio100 = STD[100](log(close / close[1]))
// Verifica delle condizioni di compressione della volatilità
CompressioneVolatilita5 = (VolatilitaBreve5 / VolatilitaMedio100) < 0.50
CompressioneVolatilita10 = (VolatilitaBreve10 / VolatilitaMedio100) < 0.50
// Calcolo del range per la barra corrente
RangeCorrente = high - low
// Inizializzazione del MinRange6 al range di 6 giorni fa per iniziare il confronto
MinRange6 = high[6] - low[6]
// Confronto per trovare il minimo range
MinRange6 = MIN(MinRange6, high[5] - low[5])
MinRange6 = MIN(MinRange6, high[4] - low[4])
MinRange6 = MIN(MinRange6, high[3] - low[3])
MinRange6 = MIN(MinRange6, high[2] - low[2])
MinRange6 = MIN(MinRange6, high[1] - low[1])
// Boomer
boomerOK = low > low[1] AND high < high[1] AND high[1] < high[2] AND low[1] > low[2]
// Calcolo degli indicatori per il pattern doubleinside
indicator1 = high < High[2]
indicator2 = high[1] < high[12]
indicator3 = low > high[2]
indicator4 = low[1] > low[2]
// Verifica del pattern doubleinside
doubleinside = indicator1 AND indicator2 AND indicator3 AND indicator4
// Swing High
SwingHigh = (high < high[1]) AND (high[1] > high[2]) AND (close < open)
// Swing Low
SwingLow = (low > low[1]) AND (low[1] < low[2]) AND (close > open)
// Key Reversal High Bar
KeyReversalHigh = (open > close[1]) AND (high > high[1]) AND (close < low[1]) AND (volume > average[5](volume))
// Key Reversal Low Bar
KeyReversalLow = (open < close[1]) AND (low < low[1]) AND (close > high[1]) AND (volume > average[5](volume))
// Calcolo degli indicatori per il pattern shooting star
// Verifica se l'high corrente è il più alto degli ultimi 10 periodi
indicator1 = high = highest[10](high)
indicator2 = close < (low + ((high - low) / 3))
indicator3 = open < (low + ((high - low) / 3))
indicator4 = volume > average[5](volume)
indicator5 = abs(close - open) < ((high - low) / 3)
// Calcolo degli indicatori per il pattern hammer
indicator1 = low < lowest[10](low)
indicator2 = close > (high - ((high - low)/3))
indicator3 = open > (high - ((high - low)/3))
indicator4 = volume > average[5](volume)
indicator5 = abs(close - open) < ((high - low)/3)
Segnale = 900000000000000
IF UP THEN
Segnale = Segnale + 10000000000000
ELSIF DN THEN
Segnale = Segnale + 20000000000000
ELSIF Lat THEN
Segnale = Segnale + 30000000000000
ENDIF
IF MACDLong AND SARLong THEN
TrendResult = Segnale + 1000000000000 // Indica un trend rialzista
ELSIF MACDShort AND SARShort THEN
TrendResult = Segnale + 2000000000000 // Indica un trend ribassista
ENDIF
IF CondL THEN
Segnale = Segnale + 100000000000 // Segnale di acquisto
ELSIF CondS THEN
Segnale = Segnale + 200000000000 // Segnale di vendita
ENDIF
IF CondL THEN
Segnale = Segnale + 10000000000 // Segnale di acquisto
ELSIF CondS THEN
Segnale = Segnale + 20000000000 // Segnale di vendita
ENDIF
IF CondL THEN
Segnale = Segnale + 1000000000
ELSIF CondS THEN
Segnale = Segnale + 2000000000
ENDIF
IF BreakoutRialzista THEN
Segnale = Segnale + 100000000
ELSIF BreakoutRibassista THEN
Segnale = Segnale + 200000000
ENDIF
IF CompressioneVolatilita5 OR CompressioneVolatilita10 THEN
Segnale = Segnale + 10000000 // Compressione di volatilità identificata
ENDIF
IF RangeCorrente < MinRange6 THEN
Segnale = Segnale + 1000000 // Pattern NR7 identificato
ENDIF
IF boomerOK THEN
Segnale = Segnale + 100000 // Se il pattern di Boomer è identificato, assegna 1
ENDIF
IF doubleinside THEN
Segnale = Segnale + 10000 // Se il pattern doubleinside è identificato, assegna 1
ENDIF
IF SwingHigh THEN
Segnale = Segnale + 1000 // Swing High identificato
ELSIF SwingLow THEN
Segnale = Segnale + 2000 // Swing Low identificato
ENDIF
IF KeyReversalHigh THEN
Segnale = Segnale + 100 // Key Reversal High Bar identificata
ELSIF KeyReversalLow THEN
Segnale = Segnale + 200 // Key Reversal Low Bar identificata
ENDIF
IF indicator1 AND indicator2 AND indicator3 AND indicator4 AND indicator5 THEN
Segnale = Segnale + 10 // Se il pattern shooting star è identificato, assegna 1
ENDIF
IF indicator1 AND indicator2 AND indicator3 AND indicator4 AND indicator5 THEN
Segnale = Segnale + 1 // Se il pattern hammer è identificato, assegna 1
ENDIF
IF Segnale = 900000000000000 THEN
Segnale = 0
ENDIF
SCREENER(Segnale AS "- risultati")
Negli SCREENER non possono esserci variabili inutilizzate, quindi o le togli oppure le usi prima della fine del codice.
Io non posso farlo perché non so il motivo per il quale vuoi utilizzarle.
Ha ragione, sono riuscito a risolvere sfruttando tutte le variabili. Ora lo screener gira perfettamente ma ho un problema con la visione dei risultati. In pratica il sistema mi “accorcia” i numeri e invece di darmi il risultato completo, nasconde alcune cifre con le lettere che definiscono le migliaia (k) i milioni (M) etc.
E anche esportando il file in formato CSV, il risultato è accorciato.
Come posso fare per vedere tutte le cifre?
Qui il codice dello screener, in allegato metto anche il file di esportazione
//trend medie mobili
Sma5 = average[5,0](close)
Sma20 = average[20,0](close)
Rialzo = close > max(Sma5,Sma20)
Ribasso = close < min(Sma5,Sma20)
Laterale = ((close > Sma20) AND (close < Sma5)) OR ((close > Sma5) AND (close < Sma20))
// Calcolo del MACD personalizzato
MyMACD = Average[12](close) - Average[26](close)
MySignal = Average[9](MyMACD)
// Calcolo del Parabolic SAR
Step = 0.02
Maximum = 0.2
SARValue = SAR[Step, Step, Maximum]
// Condizioni per il trend
MACDLong = MyMACD > MySignal
SARLong = close > SARValue
MACDShort = MyMACD < MySignal
SARShort = SARValue > High
Periodi = 10 // Numero di periodi per il calcolo del massimo e del minimo
Kp = 6 // Periodi per la media mobile di K
Dp = 3 // Periodi per la media mobile di D
AvgType = 0 // 0=sma (media mobile semplice)
IC = 75 // Soglia per l'ipercomprato
IV = 100 - IC // Soglia per l'ipervenduto (25 se IC è 75)
// Calcolo dei massimi e dei minimi
HH = HIGHEST[Periodi](HIGH)
LL = LOWEST[Periodi](LOW)
// Calcolo dell'oscillatore
osc = (CLOSE - LL) / (HH - LL) * 100
// Calcolo delle linee K e D
LineaK = AVERAGE[Kp, AvgType](osc)
LineaD = AVERAGE[Dp, AvgType](LineaK)
// Definizione dei segnali di incrocio in zone di ipercomprato e ipervenduto
IncrocioKSuD = LineaK CROSSES OVER LineaD
IncrocioDKSu = LineaD CROSSES OVER LineaK
CondL = IncrocioKSuD AND LineaK < IV // Segnale di acquisto quando K incrocia D verso l'alto in zona ipervenduto
CondS = IncrocioDKSu AND LineaK > IC // Segnale di vendita quando D incrocia K verso l'alto in zona ipercomprato
BBVal = 5 // 5 periodi per le Bande di Bollinger
BBdev = 1.8 // 1.8 deviazione standard per le Bande di Bollinger
BBavg = average[BBval,0](close) // Calcolo della linea mediana delle Bande di Bollinger
BollUP = BBavg + ((std[BBval](close)) * BBdev) // Calcolo della banda superiore delle Bande di Bollinger
BollDN = BBavg - ((std[BBval](close)) * BBdev) // Calcolo della banda inferiore delle Bande di Bollinger
Bullish = close > open // Condizione per identificare una candela rialzista
Bearish = close < open // Condizione per identificare una candela ribassista
Sma200 = average[200,0](close) // Calcolo della SMA a 200 periodi
TrendUP = close > Sma200 // Condizione per un trend rialzista
TrendDN = close < Sma200 // Condizione per un trend ribassista
// Condizioni per il segnale di acquisto
L1 = Bullish AND Bearish[1]
L2 = close[1] > BollDN
L3 = low[1] <= BollDN
CondL = TrendDN AND L1 AND L2 AND L3
// Condizioni per il segnale di vendita
S1 = Bearish AND Bullish[1]
S2 = close[1] < BollUP
S3 = high[1] >= BollUP
CondS = TrendUP AND S1 AND S2 AND S3
// Breakout Rialzista
BreakoutRialzista = (HIGH = highest[10](HIGH)) AND ((HIGH - LOW) = highest[5](HIGH - LOW)) AND (VOLUME > average[5](VOLUME)) AND (CLOSE > (HIGH - ((HIGH - LOW) / 4)))
// Breakout Ribassista
BreakoutRibassista = (LOW = lowest[10](LOW)) AND ((HIGH - LOW) = highest[5](HIGH - LOW)) AND (VOLUME > average[5](VOLUME)) AND (CLOSE < (LOW + ((HIGH - LOW) / 4)))
// Calcolo della volatilità di breve/brevissimo termine e di medio termine
VolatilitaBreve5 = STD[5](log(close / close[1]))
VolatilitaBreve10 = STD[10](log(close / close[1]))
VolatilitaMedio100 = STD[100](log(close / close[1]))
// Verifica delle condizioni di compressione della volatilità
CompressioneVolatilita5 = (VolatilitaBreve5 / VolatilitaMedio100) < 0.50
CompressioneVolatilita10 = (VolatilitaBreve10 / VolatilitaMedio100) < 0.50
// Calcolo del range per la barra corrente
RangeCorrente = high - low
// Inizializzazione del MinRange6 al range di 6 giorni fa per iniziare il confronto
MinRange6 = high[6] - low[6]
// Confronto per trovare il minimo range
MinRange6 = MIN(MinRange6, high[5] - low[5])
MinRange6 = MIN(MinRange6, high[4] - low[4])
MinRange6 = MIN(MinRange6, high[3] - low[3])
MinRange6 = MIN(MinRange6, high[2] - low[2])
MinRange6 = MIN(MinRange6, high[1] - low[1])
// Boomer
boomerOK = low > low[1] AND high < high[1] AND high[1] < high[2] AND low[1] > low[2]
// Calcolo degli indicatori per il pattern doubleinside
indicator1 = high < High[2]
indicator2 = high[1] < high[12]
indicator3 = low > high[2]
indicator4 = low[1] > low[2]
// Verifica del pattern doubleinside
doubleinside = indicator1 AND indicator2 AND indicator3 AND indicator4
// Swing High
SwingHigh = (high < high[1]) AND (high[1] > high[2]) AND (close < open)
// Swing Low
SwingLow = (low > low[1]) AND (low[1] < low[2]) AND (close > open)
// Key Reversal High Bar
KeyReversalHigh = (open > close[1]) AND (high > high[1]) AND (close < low[1]) AND (volume > average[5](volume))
// Key Reversal Low Bar
KeyReversalLow = (open < close[1]) AND (low < low[1]) AND (close > high[1]) AND (volume > average[5](volume))
// Calcolo degli indicatori per il pattern shooting star
// Verifica se l'high corrente è il più alto degli ultimi 10 periodi
indicator1 = high = highest[10](high)
indicator2 = close < (low + ((high - low) / 3))
indicator3 = open < (low + ((high - low) / 3))
indicator4 = volume > average[5](volume)
indicator5 = abs(close - open) < ((high - low) / 3)
// Calcolo degli indicatori per il pattern hammer
indicator1 = low < lowest[10](low)
indicator2 = close > (high - ((high - low)/3))
indicator3 = open > (high - ((high - low)/3))
indicator4 = volume > average[5](volume)
indicator5 = abs(close - open) < ((high - low)/3)
Segnale = 90000000000000
IF Rialzo THEN
Segnale = Segnale + 1000000000000
ELSIF Ribasso THEN
Segnale = Segnale + 2000000000000
ELSIF Laterale THEN
Segnale = Segnale + 3000000000000
ENDIF
IF MACDLong AND SARLong THEN
Segnale = Segnale + 100000000000
// Indica un trend rialzista
ELSIF MACDShort AND SARShort THEN
Segnale = Segnale + 200000000000
// Indica un trend ribassista
ENDIF
IF CondL THEN
Segnale = Segnale + 10000000000 // Segnale di acquisto
ELSIF CondS THEN
Segnale = Segnale + 20000000000 // Segnale di vendita
ENDIF
IF CondL THEN
Segnale = Segnale + 1000000000
ELSIF CondS THEN
Segnale = Segnale + 2000000000
ENDIF
IF BreakoutRialzista THEN
Segnale = Segnale + 100000000
ELSIF BreakoutRibassista THEN
Segnale = Segnale + 200000000
ENDIF
IF CompressioneVolatilita5 OR CompressioneVolatilita10 THEN
Segnale = Segnale + 10000000 // Compressione di volatilità identificata
ENDIF
IF RangeCorrente < MinRange6 THEN
Segnale = Segnale + 1000000 // Pattern NR7 identificato
ENDIF
IF boomerOK THEN
Segnale = Segnale + 100000 // Se il pattern di Boomer è identificato, assegna 1
ENDIF
IF doubleinside THEN
Segnale = Segnale + 10000 // Se il pattern doubleinside è identificato, assegna 1
ENDIF
IF SwingHigh THEN
Segnale = Segnale + 1000 // Swing High identificato
ELSIF SwingLow THEN
Segnale = Segnale + 2000 // Swing Low identificato
ENDIF
IF KeyReversalHigh THEN
Segnale = Segnale + 100 // Key Reversal High Bar identificata
ELSIF KeyReversalLow THEN
Segnale = Segnale + 200 // Key Reversal Low Bar identificata
ENDIF
IF indicator1 AND indicator2 AND indicator3 AND indicator4 AND indicator5 THEN
Segnale = Segnale + 10 // Se il pattern shooting star è identificato, assegna 1
ENDIF
IF indicator1 AND indicator2 AND indicator3 AND indicator4 AND indicator5 THEN
Segnale = Segnale + 1 // Se il pattern hammer è identificato, assegna 1
ENDIF
IF Segnale = 900000000000 THEN
Segnale = 0
ENDIF
SCREENER[Segnale](Segnale AS "- risultati")
Sono numeri troppo grandi, li mette in notazione esponenziale. Succede anche per le date che le indica con 20M.
Devi per forza usare numeri di 5-6 cifre, non di più.
Grazie mille, ora ho diviso lo screener in tre e le cifre vengono fuori correttamente. L’unica cosa che non capisco è come la parte 1 funziona perfettamente e non screma nessun titolo ma gli assegna un numero maggiore di “0” se la condizione si verifica e lo “0” se non si verifica nessuna condizione. Le parti 2 e 3, pur replicandole esattamente (o almeno, così mi pare) alla prima, scremano i titoli.
Allego i due codici non funzionanti, davvero non riesco a capire dove sta l’errore
Intanto la riga 231 va scritta così:
IF indicator1 OR indicator2 OR indicator3 OR indicator4 OR indicator5 THEN
basta che uno qualsiasi sia verificato, invece con AND devono verificarsi TUTTI e non è possibile!
Per il resto vanno bene, sia la parte 2 che la parte 3.
Nella parte 3 ci sono gli indicatori da 1 a 5 ripetuti 3 volte; le prime due volte puoi anche commentarli o toglierli, non servono a niente perché la terza volta va a sovrascrivere qualunque valore avessero in precedenza.
Alla riga 42, dove non hai messo il dato tra parentesi tonde alla fine, quello su cui vengono fatti calcoli, automaticamente assume (close) per difetto.
Veramente, veramente grazie!
Errore in screener composito
This topic contains 6 replies,
has 2 voices, and was last updated by massininja
2 years ago.
| Forum: | ProScreener: Scansione Mercati & Screener |
| Language: | Italian |
| Started: | 02/21/2024 |
| Status: | Active |
| Attachments: | 8 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.