STRATEGIA SU DIVERGENZA TRA PREZZO E OSCILLATORE

Viewing 14 posts - 1 through 14 (of 14 total)
  • Author
    Posts
  • #225761 quote
    eddytrader
    Participant
    New
    Buongiorno,
    chiedo aiuto al forum per sapere se è già stata codificata una strategia di trading basata sulla divergenza tra presso e oscillatore (nel mio caso lo stocastico lento).
    Qualora non ci fosse, di seguito inserisco i parametri per il  trading system con ingressi long e short basati sulla divergenza tra prezzo e stocastico, più due filtri: uno è il MACD, il secondo la trend line.
    Preciso che la strategia la utilizzo per tradare indici principalmente su time frame a 5 e 15 minuti.
    Di seguito ho allegato una immagine con un esempio di operazione short che dovrebbe scattare in base alle seguenti condizioni. Il segnale short si attiva quando il prezzo ha generato un massimo crescente rispetto al precedente, mentre lo stocastico (che si deve trovare in zona IPERCOMPRATO) genera in corrispondenza del massimo di prezzo un picco di indicatore inferiore rispetto al precedente. In pratica l’oscillatore sta registrando una tendenza ribassista in divergenza con la tendenza rialzista del prezzo.
    Infine, il segnale si attiverebbe nel momento in cui il MACD ha incrociato al ribasso, evidenziando il primo istogramma negativo. Il secondo filtro, se si può inserire, si attiverebbe quando il prezzo rompe la trend line rialzista ancorata al minimo di swin che ha generato il trend rialzista in oggetto.
    Lo STOP va inserito 2 tick sopra l’ultimo massimo di prezzo che ha generato la divergenza, l’ENTRY scatta dopo che si verificano le condizioni dell’incrocio del MACD e la rottura al ribasso della trendline, mentre il TARGET sul livello di minimo che ha generato il trend rialzista da cui parte la trendline.
    Per le operazioni Long valgono tutti i parametri al contrario.
    Ringrazio in anticipo chiunque possa aiutarmi nella realizzazione del trading system.
    #226057 quote
    robertogozzi
    Moderator
    Master

    Intanto ho scritto questo:

    DEFPARAM CumulateOrders = False
    ONCE Segnale  = 0
    ONCE Macd1    = 12
    ONCE Macd2    = 26
    ONCE Macd3    = 9
    myMACD        = Average[Macd1,1](close) - Average[Macd2,1](close)
    mySignalLine  = Average[Macd3,1](myMACD)
    myHisto       = myMACD - mySignalLine
    //
    mySto         = Stochastic[14,3](close)
    //
    ONCE Barre    = 50
    ONCE Periodi  = 14
    ONCE ValoreK  = 3
    ONCE Validita = 1
    Divergenza    = CALL "Divergenza Stocastico"[Barre, Periodi, ValoreK, Validita](close)
    IF Divergenza THEN
       IF ((Divergenza > 0) AND (mySto <= 20)) OR ((Divergenza < 0) AND (mySto >= 80)) THEN
          Segnale = Divergenza
          HH = highest[50](high)
          LL = lowest[50](low)
       ENDIF
    ENDIF
    //
    IF Not LongOnmarket  AND (Segnale > 0) AND (myMACD CROSSES OVER mySignalLine) THEN
       BUY 1 Contract at Market
       SET STOP   PRICE LL - 2*PipSize
       SET TARGET PRICE HH
    ENDIF
    IF Not ShortOnMarket AND (Segnale < 0) AND (myMACD CROSSES UNDER mySignalLine) THEN
       SELL 1 Contract at Market
       SET STOP   PRICE HH + 2*PipSize
       SET TARGET PRICE LL
    ENDIF

    per quanto riguarda la Trend Line, la rottura deve avvenire contemporaneamente all’incrocio del MACD oppure dopo?

    #226078 quote
    Paolo.B
    Participant
    Average

    Grazie Roberto per questo parte di codice, ma purtroppo non è possibile testare il codice -Divergenza stocastico- non può essere trovata, ci vorrebbe il file itf

    #226081 quote
    robertogozzi
    Moderator
    Master

    Questo è il codice dell’indicatore, ma ho allegato anche il file ITF:

    DEFPARAM CalculateOnLastBars = 2000
    //NumeroBarre = 50                              //40
    //Periodi     = 14                              //14
    //ValoreK     = 3                               //3
    //Validita    = 1                               //1
    //Distanza    = 10 * pipsize                    //10 pips
    StoK          = Stochastic[Periodi,ValoreK](close)
    Divergenza    = 0
    // Divergenza RIALZISTA (minimi Prezzo decrescenti, minimi Stocastico crescenti)
    IF close = lowest[NumeroBarre](close) THEN
    Minimo     = close
    MinimoPrec = lowest[NumeroBarre](close[1])
    IF Minimo < MinimoPrec THEN
    MinStoPrec = lowest[NumeroBarre](StoK[1])
    IF StoK > MinstoPrec THEN
    MinSto = StoK
    FOR i = 1 TO NumeroBarre + 1
    IF close[i] = MinimoPrec THEN
    xTemp  = StoK[i - 1]
    IF lowest[Validita](xTemp) = MinStoPrec THEN
    IF MinSto > MinStoPrec THEN
    x = round(StoK)
    //DRAWTEXT("#x#", barindex, low-Distanza) coloured(0,128,0,255)
    Divergenza = 1
    ENDIF
    ENDIF
    BREAK
    ENDIF
    NEXT
    ENDIF
    ENDIF
    ENDIF
    // Divergenza RIBASSISTA (massimi Prezzo crescenti, massimi Stocastico decrescenti)
    IF close = highest[NumeroBarre](close) THEN
    Massimo     = close
    MassimoPrec = highest[NumeroBarre](close[1])
    IF Massimo > MassimoPrec THEN
    MaxStoPrec = highest[NumeroBarre](StoK[1])
    IF StoK < MaxStoPrec THEN
    MaxSto = StoK
    FOR i = 1 TO NumeroBarre + 1
    IF close[i] = MassimoPrec THEN
    xTemp  = StoK[i - 1]
    IF highest[Validita](xTemp) = MaxStoPrec THEN
    IF MaxSto < MaxStoPrec THEN
    x = round(StoK)
    //DRAWTEXT("#x#", barindex, high+Distanza) coloured(255,0,0,255)
    Divergenza = -1
    ENDIF
    ENDIF
    BREAK
    ENDIF
    NEXT
    ENDIF
    ENDIF
    ENDIF
    RETURN Divergenza
    #226157 quote
    eddytrader
    Participant
    New

    Infinitamente grato Roberto per il codice.

    Pero’ purtroppo se lancio il codice come strategia di trading automatico mi da errore (in allegato le immagine con i dettagli delle righe).

    Per quanto riguarda la Trend Line, la rottura deve avvenire dopo l’incrocio del MACD.

    Grazie in anticipo per qualunque ulteriore aiuto.

    #226167 quote
    robertogozzi
    Moderator
    Master

    Il codice, è un indicatore, non una strategia.

    La strategia è quella che avevo giàpostato. Quella è invariata.

    eddytrader thanked this post
    #226175 quote
    MaoRai54
    Participant
    Master

    ATTENZIONE CHE INVECE DI SELL BISOGNA SCRIVERE SELLSHORT

    eddytrader thanked this post
    #226189 quote
    robertogozzi
    Moderator
    Master

    MaoRai54 ha ragione, colpa mia!

    La line 31 va cambiata in:

    SELLSHORT 1 Contract at Market
    MaoRai54 thanked this post
    #226231 quote
    eddytrader
    Participant
    New

    Non mi stancherò mai di ringraziare Roberto per l’immenso supporto che offre. Un ringraziamento anche a MaoRai54 per l’importante segnalazione.

    Sarebbe possibile inserire anche gli altri due filtri che avevo indicato nella descrizione iniziale (vedi anche foto allegata).

    1. Il MACD incrocia evidenziando il primo istogramma negativo (per la divergenza ribassista) o positivo (per la divergenza rialzista).
    2. Dopo che si è verificato l’incrocio del MACD, il prezzo deve rompere la trend line rialzista/ribassista, che parte dal minimo che ha generato il trend in oggetto.

    Una domanda: nel codice è fissato un minimo e un massimo di barre che devono intercorrere nella formazione dei due massimi e due minimi?

    Grazie

    #227678 quote
    robertogozzi
    Moderator
    Master

    Questo è il codice con l’aggiunta dei filtri MACD.

    Per la TrendLine, come la vorresti tracciare, quali caratteristiche devono avere i due punti dove tracciarla?

    DEFPARAM CumulateOrders = False
    ONCE Segnale     = 0
    ONCE SegnaleMACD = 0
    ONCE macdHISTO   = 0
    ONCE Macd1       = 12
    ONCE Macd2       = 26
    ONCE Macd3       = 9
    myMACD           = Average[Macd1,1](close) - Average[Macd2,1](close)
    mySignalLine     = Average[Macd3,1](myMACD)
    myHisto          = myMACD - mySignalLine
    //
    mySto            = Stochastic[14,3](close)
    //
    ONCE Barre       = 50
    ONCE Periodi     = 14
    ONCE ValoreK     = 3
    ONCE Validita    = 1
    Divergenza    = CALL "Divergenza Stocastico"[Barre, Periodi, ValoreK, Validita](close)
    IF Divergenza THEN
    IF ((Divergenza > 0) AND (mySto <= 20)) OR ((Divergenza < 0) AND (mySto >= 80)) THEN
    Segnale = Divergenza
    HH = highest[50](high)
    LL = lowest[50](low)
    SegnaleMACD = 0
    macdHISTO   = 0
    ENDIF
    ENDIF
    //
    IF myMACD CROSSES OVER mySignalLine THEN
    SegnaleMACD = 1
    ELSIF myMACD CROSSES UNDER mySignalLine THEN
    SegnaleMACD = -1
    ENDIF
    //
    IF SegnaleMACD = 1 THEN
    IF myHisto CROSSES OVER 0 THEN
    macdHISTO   = 1
    ENDIF
    ELSIF SegnaleMACD = -1 THEN
    IF myHisto CROSSES UNDER 0 THEN
    macdHISTO   = -1
    ENDIF
    ENDIF
    //
    IF Not LongOnmarket  AND (Segnale > 0) AND (SegnaleMACD > 0) AND (macdHISTO > 0) THEN
    BUY 1 Contract at Market
    SET STOP   PRICE LL - 2*PipSize
    SET TARGET PRICE HH
    Segnale     = 0
    SegnaleMACD = 0
    macdHISTO   = 0
    ENDIF
    IF Not ShortOnMarket AND (Segnale < 0) AND (SegnaleMACD < 0) AND (macdHISTO < 0)THEN
    SELLSHORT 1 Contract at Market
    SET STOP   PRICE HH + 2*PipSize
    SET TARGET PRICE LL
    Segnale     = 0
    SegnaleMACD = 0
    macdHISTO   = 0
    ENDIF
    #228279 quote
    eddytrader
    Participant
    New

    Ciao Roberto. Grazie ancora per l’aggiunta del Macd.

    Per quanto riguarda la trend line, spero di riuscirmi a spiegare. Per una maggiore comprensione, rimando alla immagine che avevo allegato nel primo post per una divergenza ribassista.

    La trend line rialzista/ribassista dovrebbe essere ancorata (1 punto) al massimo/minimo dal quale è partito il trend che poi ha originato il pattern doppio minimo/massimo (dove cerchiamo la divergenza), mentre nel 2 punto la trend live va ancorata al massimo/minimo di swing tra i due massimi/minimi in questione.

    Spero di essermi spiegato.

    Grazie in anticipo.

    #229411 quote
    robertogozzi
    Moderator
    Master

    C’è voluto un pò a fare l’indicatore per tracciare le due trendline. Provalo per vedere se ti va bene (puoi cambiare i periodi iniziali come vuoi, io ho messo 50):

    defparam drawonlastbaronly = true
    ONCE P = 50
    HH1 = highest[P](high[P])
    HH2 = highest[P](high)
    LL1 = lowest[P](low[P])
    LL2 = lowest[P](low)
    bH1 = 0
    bH2 = 0
    bL1 = 0
    bL2 = 0
    //IF BarIndex > P THEN
    //IF (close > HHx[1]) THEN
    //drawtext("●",BarIndex,HHx[1] + range)
    //
    //ELSIF (close < LLx[1]) THEN
    //drawtext("●",BarIndex,LLx[1] - range)
    //ENDIF
    //ENDIF
    FOR i = 0 TO (p * 2)
    // trovare i Massimi e la relativa barra dove sono stati fatti
    IF bH2 = 0 THEN
    IF high[i] = HH2 THEN
    bH2     = BarIndex[i]
    ENDIF
    ELSIF bH1 = 0 THEN
    IF high[i] = HH1 THEN
    bH1     = BarIndex[i]
    ENDIF
    ENDIF
    // trovare i Minimi e la relativa barra dove sono stati fatti
    IF bL2 = 0 THEN
    IF low[i]  = LL2 THEN
    bL2     = BarIndex[i]
    ENDIF
    ELSIF bL1 = 0 THEN
    IF low[i]  = LL1 THEN
    bL1     = BarIndex[i]
    ENDIF
    ENDIF
    //
    IF bH2 > 0 AND bH1 > 0 AND bL1 > 0 AND bL2 > 0 THEN
    break
    ENDIF
    NEXT
    // calcolare la differenza tra i due valori, calcolandone il vaore medio di ogni barra
    diffH = HH2 - HH1
    diffL = LL2 - LL1
    barsH = bH2 - bH1
    barsL = bL2 - bL1
    futH  = (diffH / barsH) * ((BarIndex - bH2) + 1)
    futL  = (diffL / barsL) * ((BarIndex - bL2) + 1)
    HHx   = HH2 + futH//HH1 + (diffH * futH)
    LLx   = LL2 + futL//LL1 - (diffH * futH)
    DrawSegment(bH1,HH1,BarIndex + 1,HHx[1]) coloured("Blue")
    DrawSegment(bL1,LL1,BarIndex + 1,LLx[1]) coloured("Blue")
    //drawtext("HH1 #HH1# - bH1 #bH1#",bH1,HH1)
    //drawtext("LL1 #LL1# - bL1 #bL1#",bL1,LL1)
    //drawtext("HH2 #HH2# - bH2 #bH2#",bH2,HH2)
    //drawtext("LL2 #LL2# - bL2 #bL2#",bL2,LL2)
    //drawtext("barsH #barsH# - barsL #barsL#",Barindex + 15, high)
    return
    #231305 quote
    eddytrader
    Participant
    New

    Ciao Roberto,

    ti ringrazio per l’inserimento anche delle trend line.

    Però guardando l’immagine che hai allegato, credo ci sia una differenza tra il modo in cui il codice traccia la/le trend line e quello che servirebbe a me.

    Provo a riassumere il set-up operativo coadiuvato da un’altra immagine a corollario.

    Nell’ipotesi di un trade long (situazione allegata sul grafico), io cerco un doppio minimo nei prezzi (nell’immagine ho cerchiato i due minimi) in divergenza di stocastico (in corrispondenza dei minimi decrescenti lo stocastico genera minimi crescenti, anch’essi cerchiati nell’immagine). Una volta generato il doppio minimo in divergenza di stocastico, scattano i due filtri:

    1. Divergenza del MACD (in rialzo, come evidenziato nell’immagine)
    2. La rottura della trend line che va ancorata al massimo che ha generato l’impulso ribassista e al massimo di swing che genera il secondo minimo (nell’immagine ho evidenziato i livelli di prezzo dove va ancorata la trend line).

    Nel caso long, il segnale Buy scatta quando il prezzo rompe al rialzo la trend line.

    #236582 quote
    robertogozzi
    Moderator
    Master

    Scusami, ma avevo dimenticato il tuo post.

    Puoi allegare un immagine con solo le linee di trend che desideri, indicando il preché devono iniziare in un certo punto e terminare in un certo altro, in pratica quali caratteristiche devono avere in comune i due punti entro cui vanno tracciate, sia al rialzo che al ribasso.

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

STRATEGIA SU DIVERGENZA TRA PREZZO E OSCILLATORE


ProOrder: Trading Automatico & Backtesting

New Reply
Author
author-avatar
eddytrader @eddytrader Participant
Summary

This topic contains 13 replies,
has 4 voices, and was last updated by robertogozzi
1 year, 5 months ago.

Topic Details
Forum: ProOrder: Trading Automatico & Backtesting
Language: Italian
Started: 12/28/2023
Status: Active
Attachments: 7 files
Logo Logo
Loading...