Errore in screener composito

Viewing 7 posts - 1 through 7 (of 7 total)
  • Author
    Posts
  • #228503 quote
    massininja
    Participant
    New

    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")
    
    #228526 quote
    robertogozzi
    Moderator
    Master

    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.

    #228604 quote
    massininja
    Participant
    New

    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")
    
    ProScreener-SCREENER-DEFINITIVO-part-1.csv
    #228618 quote
    robertogozzi
    Moderator
    Master

    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ù.

    #228632 quote
    massininja
    Participant
    New

    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

    
    
    SCREENER-DEFINITIVO-part-2.itf SCREENER-DEFINITIVO-part-3.itf
    #228653 quote
    robertogozzi
    Moderator
    Master

    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.

    Parte2.jpg Parte2.jpg Part3.jpg Part3.jpg Riga231.jpg Riga231.jpg Indicatori-Ripetuti.jpg Indicatori-Ripetuti.jpg Indicatori-Commentati.jpg Indicatori-Commentati.jpg
    #228662 quote
    massininja
    Participant
    New

    Veramente, veramente grazie!

Viewing 7 posts - 1 through 7 (of 7 total)
  • You must be logged in to reply to this topic.

Errore in screener composito


ProScreener: Scansione Mercati & Screener

New Reply
Author
author-avatar
massininja @massininja Participant
Summary

This topic contains 6 replies,
has 2 voices, and was last updated by massininja
2 years ago.

Topic Details
Forum: ProScreener: Scansione Mercati & Screener
Language: Italian
Started: 02/21/2024
Status: Active
Attachments: 8 files
Logo Logo
Loading...