realizzazione di un codice di una strategia basata sul supertrend

Viewing 15 posts - 1 through 15 (of 21 total)
  • Author
    Posts
  • #49875 quote
    REVENTON
    Participant
    Average

    Buonasera a tutti, avrei bisogno di un aiuto per la realizzazione di un codice di una strategia basata sul supertrend. A prescindere dallo strumento e dal time frame utilizzato, ho notato che il supertrend fornisce spesso falsi segnali, anche se integro la strategia con indicatori come adx, atr, ecc, non riesco a eliminarli. Altresì ho notato una circostanza che eliminerebbe parte dei falsi segnali, e mi piacerebbe riuscire ad automatizzare il tutto per verificare se funziona davvero o meno. Sostanzialmente la strategia dovrebbe comprare e vendere all’incrocio del prezzo col supertrend ma il segnale derivante dall’incrocio deve essere considerato valido se e solo se nelle candele successive viene superato di x pips il massimo o il minimo della candela che ha dato vita al segnale all’incrocio. Quindi, se il prezzo incrocia al rialzo il supertrend, il segnale di acquisto sarà valido se entro le successive barre, prima del successivo incrocio del supertrend,  viene superato di x pips il massimo della barra che ha fatto scattare il supertrend, se si entra in posizione, la chiusura non avviene all’incrocio al ribasso del supertrend ma se dopo l’incrocio una delle successive candele supera il minimo della candela che ha fatto scattare il supertrend di y pips.  Stessa cosa per la vendita. Qualcuno può darmi una mano?? Grazie anticipatamente.

    Andrea thanked this post
    #49932 quote
    robertogozzi
    Moderator
    Master

    Ho provato a buttare giù una strategia, ma non ho messo il Take Profit (o Target). Dove lo vuoi mettere, ad un certo prezzo, dopo n candele o magari ad un numero fisso di Pips, oppure pari alla distanza tra Minimo e Massimo? Fammi sapere.

    Roberto

    #49934 quote
    REVENTON
    Participant
    Average

    Ciao Roberto, innanzitutto grazie, per quanto riguarda il take profit, proverei con l’inversione del segnale del supertrend, sempre con l’avvenuta convalida ovvero con il superamento della candela che lo ha fatto scattare. grazie ancora

    marco

    #49937 quote
    robertogozzi
    Moderator
    Master

    Cioè se siamo LONG si aspetta che il SuperTrend venga in crociato al ribasso ed alla chiusura si chiude la Posizione. se ho ben capito.

    Provo e cerco di postare la strategia nel corso del pomeriggio.

    #49959 quote
    REVENTON
    Participant
    Average

    Ciao Roberto, in realtà quello che ho in mente è diverso, mi spiego meglio, se siamo long e il supertrend incrocia al ribasso, il segnale di chiusura è valido solo se nelle candele successive all’incrocio, il prezzo scende sotto il minimo della candela che ha generato l’incrocio, se al contrario il prezzo risale sino a far scattare nuovamente l’incrocio, si mantiene la posizione long e il segnale è nullo.

    Sostanzialmente ogni incrocio diventa un potenziale segnale solo se nelle candele successive viene superato di x pips il massimo o il minimo della candela che ha generato l’incrocio.

    ciao,

    marco

    #49971 quote
    robertogozzi
    Moderator
    Master

    Prova questa strategia e fammi sapere, io l’ho testata poco:

    DEFPARAM CumulateOrders = false
    
    ONCE nLots              = 1                   //Numero di lotti da acquistare/vendere
    ONCE BarID              = 0                   //Numero della barra dove avviene l'incrocio
    ONCE Minimo             = 0                   //Minimo  della candela dove è avvenuto l'incrocio
    ONCE Massimo            = 0                   //Massimo della candela dove è avvenuto l'incrocio
    ONCE MaxPips            = 0                   //Numero di Pips oltre Minimo/Massimo per entrare in rottura
    ONCE MaxBars            = 9999                //9999 =numero barre max. da attendere dopo l'incrocio
    
    IF IntraDayBarIndex = 0 OR OnMarket OR ((BarIndex - BarID) > MaxBars) THEN //Ad inizio nuovo giorno...
       ONCE BarID           = 0                                                //... o ad operazione in corso...
       ONCE Minimo          = 0                                                //... o dopo MaxBars occorre
       ONCE Massimo         = 0                                                //... resettare le  variabili
    ENDIF
    
    St                      = SuperTrend[3,10]    //3, 10
    
    IF NOT OnMarket AND ((close CROSSES OVER St) OR (close CROSSES UNDER St)) THEN
       BarID                = BarIndex            //Salvare i valori necessari in caso d'incrocio
       Minimo               = low
       Massimo              = high
    ENDIF
    
    IF LongOnMarket AND (close CROSSES UNDER St) THEN //Settare il Minimo  raggiunto il quale si chiude la posizione
       Minimo               = low
    ENDIF
    IF ShortOnMarket AND (close CROSSES OVER St) THEN //Settare il Massimo raggiunto il quale si chiude la posizione
       Massimo              = high
    ENDIF
    
    IF LongOnMarket THEN                         //Chiudere l'operazione LONG se il prezzo rompe il minimo
       IF close <= Minimo THEN
          SELL AT MARKET
       ENDIF
    ENDIF
    
    IF ShortOnMarket THEN                        //Chiudere l'operazione SHORT se il prezzo rompe il massimo
       IF close >= Massimo THEN
          EXITSHORT AT MARKET
       ENDIF
    ENDIF
    
    IF BarID THEN
       BUY        nLots CONTRACTS AT Massimo + (MaxPips * pipsize) LIMIT //Comprate n Pips oltre il Massimo
       SELLSHORT  nLots CONTRACTS AT Minimo  - (MaxPips * pipsize) LIMIT //Vendere  n Pips sotto il Minimo
    ENDIF
    

    Roberto

    #49973 quote
    REVENTON
    Participant
    Average

    Ciao Roberto,

    innanzitutto grazie, da solo non ci sarei mai arrivato, c’é però ancora qualcosa da modificare, le operazioni vengono aperte e chiuse per la maggior parte sulla stessa candela, anche se il supertrend non accenna a nessun incrocio, credo che non memorizzi i massimi e i minimi della candela che ha fatto scattare il supertrend, ma quelli di ogni singola candela…

    #49975 quote
    robertogozzi
    Moderator
    Master

    Farò ulteriori prove e domani ti farò sapere.

    #49976 quote
    REVENTON
    Participant
    Average

    ok, grazie, buona serata

    #50038 quote
    robertogozzi
    Moderator
    Master

    Ho cambiato varie cose, in modo particolare gli ordini pendenti (limit) perché venivano spesso eseguiti, anche in modo contrario, su una stessa candela oraria.

    Mi sembra adesso funzioni meglio, non so se è (o si avvicina) alla tua idea. Fai delle prove e fammi sapere.

    Io l’ho provato su Eur/Usd TF 1 ora, i valori del SuperTrend li ho ottimizzati per avere un risultato positivo.

    Ti allego la schermata della mia prova. Fai attenzione perché alcune operazioni durano moltissime barre e la performance potrebbe essere vanificata dal Rollover (che nel backtest non si può indicare) per le posizioni aperte in multiday.

    DEFPARAM CumulateOrders = false
    DEFPARAM PreLoadBars    = 2000
    
    ONCE nLots              = 1                   //Numero di lotti da acquistare/vendere
    ONCE BarID              = 0                   //Numero della barra dove avviene l'incrocio
    ONCE Minimo             = 0                   //Minimo  della candela dove è avvenuto l'incrocio
    ONCE Massimo            = 0                   //Massimo della candela dove è avvenuto l'incrocio
    ONCE MaxPips            = 0                   //Numero di Pips oltre Minimo/Massimo per entrare in rottura
    ONCE MaxBars            = 9999                //9999 =numero barre max. da attendere dopo l'incrocio
    
    IF IntraDayBarIndex = 0 OR ((BarIndex - BarID) > MaxBars) THEN             //Ad inizio nuovo giorno...
       ONCE BarID           = 0
       ONCE Minimo          = 0                                                //... o dopo MaxBars occorre
       ONCE Massimo         = 0                                                //... resettare le  variabili
    ENDIF
    
    St                      = SuperTrend[10,24]   //10, 24
    
    IF (close CROSSES OVER St) OR (close CROSSES UNDER St) THEN
       BarID                = BarIndex            //Salvare i valori necessari in caso d'incrocio
       Minimo               = low
       Massimo              = high
    ENDIF
    
    IF LongOnMarket THEN                         //Chiudere l'operazione LONG se il prezzo rompe il minimo
       IF close <= Minimo THEN
          SELL AT MARKET
       ENDIF
    ENDIF
    
    IF ShortOnMarket THEN                        //Chiudere l'operazione SHORT se il prezzo rompe il massimo
       IF close >= Massimo THEN
          EXITSHORT AT MARKET
       ENDIF
    ENDIF
    
    IF BarID AND (NOT OnMarket) THEN
       IF close > (Massimo + (MaxPips * pipsize)) THEN //Entrare LONG  a mercato
          BUY nLots CONTRACT AT MARKET
       ENDIF
       IF close < (Minimo - (MaxPips * pipsize))  THEN //Entrare SHORT a mercato
          SELLSHORT nLots CONTRACT AT MARKET
       ENDIF
       //BUY        nLots CONTRACTS AT Massimo + (MaxPips * pipsize) LIMIT //Comprate n Pips oltre il Massimo
       //SELLSHORT  nLots CONTRACTS AT Minimo  - (MaxPips * pipsize) LIMIT //Vendere  n Pips sotto il Minimo
    ENDIF
    //GRAPH BarID
    //GRAPH Massimo
    //GRAPH Minimo
    //GRAPH close

    Gli ordini pendenti li ho lasciati su due righe, ma li ho commentati con la doppia barra in modo che restino come memoria senza essere parte della strategia. Lo stesso ho fatto per le ultime righe dove c’è GRAPH, servono per il debugging e si possono togliere o lasciare commentate, nel caso sia poi necessario rifare del debugging.

    Roberto

    Andrea thanked this post
    #50358 quote
    REVENTON
    Participant
    Average

    Buongiorno Roberto, scusa il ritardo, ti ringrazio molto per il sistema realizzato, ma purtroppo non si comporta come avevo in mente, provo a spiegarmi meglio:

    per quanto riguarda le posizioni long, se il prezzo incrocia al rialzo il supertrend, il sistema dovrebbe ritenere valido il segnale solo se nelle candele successive a quella che ha incrociato, viene superato di x punti il massimo della candela che ha incrociato, se si si entra, se no il segnale viene considerato nullo. Allo stesso modo, una volta entrati long si uscirà, ovvero se il prezzo incrocia al ribasso il supertrend si esce solo se una delle candele successive all’incrocio al ribasso supera di x punti il minimo della candela che ha generato l’incrocio.

    Ti sarei davvero grato se riuscissi a darmi una mano.

    Grazie e buona giornata,

    marco

    #50373 quote
    robertogozzi
    Moderator
    Master

    Per la validità del segnale basta che vari il numero alla riga 9, indicando dopo quante candele il segnale deve essere annullato, io ho messo un valore altissimo, per rendere il segnale sempre valido, se tu lo imposti a2 dopo due candele il segnale sarà considerato nullo.

    Ho aggiunto solo una riga dopo il BUY ed una dopo il SELLSHORT per azzerare il segnale che era stato attivato dopo l’incrocio, viso che siamo entrati.

    Ho anche tolto ONCE sul reset delle variabili (dove c’è IF IntraDayBarIndex = 0…..), perché questo poteva creare errori.

    Per il resto mi sembra vada tutto bene, ti allego una schermata di EurUsd h1 per farti vedere la candela delle ore 14 del 7 Settembre dove si è verificato l’incrocio, per evidenziare il minimo ed il massimo ho tracciato due linee orizzontali colore viola e tratteggiate; ti ho evidenziato in arancio le due candele, di entrata LONG al superamento del massimo e di uscita SHORT (in Stop Loss) al superamento del minimo.

    Se vuoi cambiare qualcosa nella strategia dimmi, ma, pur non avendola testata molto, mi sembra si comporti correttamente. Semmai se c’è qualche anomalia cerca di allegare un’immagine con la schermata del grafico dove si è verificato.

    Chiaramente, avendo scelto di operare alla chiusura delle candele, anziché con gli ordini pendenti, può capitare che un prezzo superi il massimo/minimo e poi ritracci prima della chiusura. In tal caso il segnale di entrata/uscita verrebbe perso. Però questo non si può ovviare al momento, dovremo attendere la prossima versione che, a quanto riportato non ufficialmente, avrà un ProOrder multitimeframe, cioè sganciato dalla gabbia temporale del timeframe, quindi, per chi opera anche su timeframe lunghi i segnali potranno essere attivati anche a candela in corso.

    Allego la nuova versione con l’aggiunta delle variazioni di cui sopra.

    DEFPARAM CumulateOrders = false
    DEFPARAM PreLoadBars    = 2000
    
    ONCE nLots              = 1                   //Numero di lotti da acquistare/vendere
    ONCE BarID              = 0                   //Numero della barra dove avviene l'incrocio
    ONCE Minimo             = 0                   //Minimo  della candela dove è avvenuto l'incrocio
    ONCE Massimo            = 0                   //Massimo della candela dove è avvenuto l'incrocio
    ONCE MaxPips            = 0                   //Numero di Pips oltre Minimo/Massimo per entrare in rottura
    ONCE MaxBars            = 9999                //9999 =numero barre max. da attendere dopo l'incrocio
    ////************************************************************************
    //
    IF IntraDayBarIndex = 0 OR ((BarIndex - BarID) > MaxBars) THEN        //Ad inizio nuovo giorno...
       BarID                = 0
       Minimo               = 0                                           //... o dopo MaxBars occorre
       Massimo              = 0                                           //... resettare le  variabili
    ENDIF
    
    St                      = SuperTrend[10,24]   //10, 24
    
    IF (close CROSSES OVER St) OR (close CROSSES UNDER St) THEN
       BarID                = BarIndex            //Salvare i valori necessari in caso d'incrocio
       Minimo               = low
       Massimo              = high
    ENDIF
    
    IF LongOnMarket THEN                         //Chiudere l'operazione LONG se il prezzo rompe il minimo
       IF close <= Minimo THEN
          SELL AT MARKET
       ENDIF
    ENDIF
    
    IF ShortOnMarket THEN                        //Chiudere l'operazione SHORT se il prezzo rompe il massimo
       IF close >= Massimo THEN
          EXITSHORT AT MARKET
       ENDIF
    ENDIF
    
    IF BarID AND (NOT OnMarket) THEN
       IF close > (Massimo + (MaxPips * pipsize)) THEN //Entrare LONG  a mercato
          BUY nLots CONTRACT AT MARKET
          BarID = 0
       ENDIF
       IF close < (Minimo - (MaxPips * pipsize))  THEN //Entrare SHORT a mercato
          SELLSHORT nLots CONTRACT AT MARKET
          BarID = 0
       ENDIF
       //BUY        nLots CONTRACTS AT Massimo + (MaxPips * pipsize) LIMIT //Comprate n Pips oltre il Massimo
       //SELLSHORT  nLots CONTRACTS AT Minimo  - (MaxPips * pipsize) LIMIT //Vendere  n Pips sotto il Minimo
    ENDIF
    #50536 quote
    REVENTON
    Participant
    Average

    Ciao Roberto,

    ho testato il sistema ma non fa ciò che avevo in mente. Per me è difficile metterci mano perché non sono evidentemente molto padrone del linguaggio prorealcode. Ti allego un’immagine dell’Italy 40 di oggi, di proposito con time frame 5 minuti ed un supertrend strettissimo, di 1,10, in modo da avere più incroci possibili. Nell’immagine si vede come si comporta la strategia testata e sotto ho inserito delle note su come vorrei si comportasse. Se potessi darci un’occhiata te ne sarei molto grato.

    Ciao,

    marco

    #50590 quote
    robertogozzi
    Moderator
    Master

    Credo di essere riuscito, se non a fare esattamente (anche per i limiti imposti dalla valutazione delle candele, che avviene solo alla chiusura), ho rimesso gli ordini STOP (non sono LIMIT, in quanto acquisti/vendi ad un prezzo svantaggioso), con alcune altre piccole modifiche nella logica:

    DEFPARAM CumulateOrders = false
    DEFPARAM PreLoadBars    = 2000
     
    ONCE nLots              = 1                   //Numero di lotti da acquistare/vendere
    ONCE Minimo             = 0                   //Minimo  della candela dove è avvenuto l'incrocio
    ONCE Massimo            = 999999              //Massimo della candela dove è avvenuto l'incrocio
    ONCE MaxPips            = 0                   //Numero di Pips oltre Minimo/Massimo per entrare in rottura
    ONCE ExitPips           = 10                  //Numero di Pips oltre Minimo/Massimo per uscire dalle posizioni
    //
    IF IntraDayBarIndex = 0 THEN                 //Ad inizio nuovo giorno resettare le variabili
       Minimo               = 0
       Massimo              = 999999
    ENDIF
     
    St                      = SuperTrend[1,10]   //1, 10
     
    IF close CROSSES OVER St THEN
       Minimo               = 0                  //Se incrocio al rialzo azzerare il Minimo e...
       Massimo              = high               //... impostare il Massimo a cui entrare
    ENDIF
    
    IF close CROSSES UNDER St THEN
       Minimo               = low                //Se incrocio al ribasso impostare il Minimo a cui entrare e...
       Massimo              = 999999             //... azzerare il Massimo
    ENDIF
     
    IF LongOnMarket THEN
       IF close <= (Minimo - (ExitPips * pipsize)) THEN
          SELL                      AT MARKET            //Chiudere l'operazione LONG se il prezzo rompe il minimo e...
          SELLSHORT nLots CONTRACTS AT MARKET            //... rientrare SHORT
       ENDIF
    ENDIF
     
    IF ShortOnMarket THEN
       IF close >= (Massimo + (ExitPips * pipsize)) THEN
          EXITSHORT                 AT MARKET            //Chiudere l'operazione SHORT se il prezzo rompe il massimo e...
          BUY nLots CONTRACTS       AT MARKET            //... rientrare LONG
       ENDIF
    ENDIF
     
    IF NOT OnMarket THEN                                                   //Se non siamo ancora a mercato...
       IF Massimo < 999999 THEN
          BUY        nLots CONTRACTS AT Massimo + (MaxPips * pipsize) STOP //... comprare n Pips oltre il Massimo
       ENDIF
       IF Minimo > 0 THEN
          SELLSHORT  nLots CONTRACTS AT Minimo  - (MaxPips * pipsize) STOP //... vendere  n Pips sotto il Minimo
       ENDIF
    ENDIF

    Ovviamente l’uscita ed il rientro sono a mercato, quindi con qualche differenza nel prezzo, dovuta all’attesa per la chiusura della candela.

    Ho provato a farne una versione dove anche l’uscita ed il rientro sono LIMIT/STOP, vedi te come ti sembra (per me non va bene, meglio quella di sopra):

    DEFPARAM CumulateOrders = false
    DEFPARAM PreLoadBars    = 2000
     
    ONCE nLots              = 1                   //Numero di lotti da acquistare/vendere
    ONCE Minimo             = 0                   //Minimo  della candela dove è avvenuto l'incrocio
    ONCE Massimo            = 999999              //Massimo della candela dove è avvenuto l'incrocio
    ONCE MaxPips            = 0                   //Numero di Pips oltre Minimo/Massimo per entrare in rottura
    ONCE ExitPips           = 10                  //Numero di Pips oltre Minimo/Massimo per uscire dalle posizioni
    //
    IF IntraDayBarIndex = 0 THEN                 //Ad inizio nuovo giorno resettare le variabili
       Minimo               = 0
       Massimo              = 999999
    ENDIF
     
    St                      = SuperTrend[1,10]    //1, 10
     
    IF close CROSSES OVER St THEN
       Minimo               = 0
       Massimo              = high
    ENDIF
    
    IF close CROSSES UNDER St THEN
       Minimo               = low
       Massimo              = 999999
    ENDIF
     
    IF LongOnMarket THEN                         //Chiudere l'operazione LONG se il prezzo rompe il minimo
       SELL                      AT (Minimo - (ExitPips * pipsize)) STOP   //Uscire    LONG
       SELLSHORT nLots CONTRACTS AT (Minimo - (ExitPips * pipsize)) LIMIT  //Rientrare SHORT
    ENDIF
     
    IF ShortOnMarket THEN                        //Chiudere l'operazione SHORT se il prezzo rompe il massimo
       EXITSHORT           AT (Massimo + (ExitPips * pipsize)) STOP        //Uscire SHORT
       BUY nLots CONTRACTS AT (Massimo + (ExitPips * pipsize)) LIMIT       //Rientrare LONG
    ENDIF
     
    IF NOT OnMarket THEN
       IF Massimo < 999999 THEN
          BUY        nLots CONTRACTS AT Massimo + (MaxPips * pipsize) STOP //Comprate n Pips oltre il Massimo
       ENDIF
       IF Minimo > 0 THEN
          SELLSHORT  nLots CONTRACTS AT Minimo  - (MaxPips * pipsize) STOP //Vendere  n Pips sotto il Minimo
       ENDIF
    ENDIF
    #50596 quote
    REVENTON
    Participant
    Average

    Ciao Roberto, innanzitutto grazie, le ho provate entrambe sullo stesso grafico di ieri, in effetti la prima si comporta molto meglio, la seconda ad ogni incrocio compra o vende, a prescindere dal prezzo.

    Leggendo il codice della seconda strategia, alla riga 28 leggo chiaramente sell at minimo + exitpips, ma sul grafico si comporta in maniera diversa…da cosa può dipendere??

    grazie,

    marco

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

realizzazione di un codice di una strategia basata sul supertrend


ProOrder: Trading Automatico & Backtesting

New Reply
Author
author-avatar
REVENTON @reventon Participant
Summary

This topic contains 20 replies,
has 2 voices, and was last updated by REVENTON
8 years, 3 months ago.

Topic Details
Forum: ProOrder: Trading Automatico & Backtesting
Language: Italian
Started: 10/18/2017
Status: Active
Attachments: 4 files
Logo Logo
Loading...