realizzazione di un codice di una strategia basata sul supertrend
Forums › ProRealTime forum Italiano › Supporto ProOrder › realizzazione di un codice di una strategia basata sul supertrend
- This topic has 20 replies, 2 voices, and was last updated 7 years ago by REVENTON.
-
-
10/18/2017 at 7:16 PM #49875
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.
1 user thanked author for this post.
10/19/2017 at 11:59 AM #49932Ho 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
10/19/2017 at 12:04 PM #49934Ciao 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
10/19/2017 at 12:22 PM #49937Cioè 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.
10/19/2017 at 2:46 PM #49959Ciao 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
10/19/2017 at 3:38 PM #49971Prova questa strategia e fammi sapere, io l’ho testata poco:
Incroci SuperTrend12345678910111213141516171819202122232425262728293031323334353637383940414243444546DEFPARAM CumulateOrders = falseONCE nLots = 1 //Numero di lotti da acquistare/vendereONCE BarID = 0 //Numero della barra dove avviene l'incrocioONCE Minimo = 0 //Minimo della candela dove è avvenuto l'incrocioONCE Massimo = 0 //Massimo della candela dove è avvenuto l'incrocioONCE MaxPips = 0 //Numero di Pips oltre Minimo/Massimo per entrare in rotturaONCE MaxBars = 9999 //9999 =numero barre max. da attendere dopo l'incrocioIF 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 occorreONCE Massimo = 0 //... resettare le variabiliENDIFSt = SuperTrend[3,10] //3, 10IF NOT OnMarket AND ((close CROSSES OVER St) OR (close CROSSES UNDER St)) THENBarID = BarIndex //Salvare i valori necessari in caso d'incrocioMinimo = lowMassimo = highENDIFIF LongOnMarket AND (close CROSSES UNDER St) THEN //Settare il Minimo raggiunto il quale si chiude la posizioneMinimo = lowENDIFIF ShortOnMarket AND (close CROSSES OVER St) THEN //Settare il Massimo raggiunto il quale si chiude la posizioneMassimo = highENDIFIF LongOnMarket THEN //Chiudere l'operazione LONG se il prezzo rompe il minimoIF close <= Minimo THENSELL AT MARKETENDIFENDIFIF ShortOnMarket THEN //Chiudere l'operazione SHORT se il prezzo rompe il massimoIF close >= Massimo THENEXITSHORT AT MARKETENDIFENDIFIF BarID THENBUY nLots CONTRACTS AT Massimo + (MaxPips * pipsize) LIMIT //Comprate n Pips oltre il MassimoSELLSHORT nLots CONTRACTS AT Minimo - (MaxPips * pipsize) LIMIT //Vendere n Pips sotto il MinimoENDIFRoberto
10/19/2017 at 3:54 PM #49973Ciao 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…
10/19/2017 at 4:21 PM #49975Farò ulteriori prove e domani ti farò sapere.
10/19/2017 at 4:25 PM #4997610/20/2017 at 10:13 AM #50038Ho 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.
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950DEFPARAM CumulateOrders = falseDEFPARAM PreLoadBars = 2000ONCE nLots = 1 //Numero di lotti da acquistare/vendereONCE BarID = 0 //Numero della barra dove avviene l'incrocioONCE Minimo = 0 //Minimo della candela dove è avvenuto l'incrocioONCE Massimo = 0 //Massimo della candela dove è avvenuto l'incrocioONCE MaxPips = 0 //Numero di Pips oltre Minimo/Massimo per entrare in rotturaONCE MaxBars = 9999 //9999 =numero barre max. da attendere dopo l'incrocioIF IntraDayBarIndex = 0 OR ((BarIndex - BarID) > MaxBars) THEN //Ad inizio nuovo giorno...ONCE BarID = 0ONCE Minimo = 0 //... o dopo MaxBars occorreONCE Massimo = 0 //... resettare le variabiliENDIFSt = SuperTrend[10,24] //10, 24IF (close CROSSES OVER St) OR (close CROSSES UNDER St) THENBarID = BarIndex //Salvare i valori necessari in caso d'incrocioMinimo = lowMassimo = highENDIFIF LongOnMarket THEN //Chiudere l'operazione LONG se il prezzo rompe il minimoIF close <= Minimo THENSELL AT MARKETENDIFENDIFIF ShortOnMarket THEN //Chiudere l'operazione SHORT se il prezzo rompe il massimoIF close >= Massimo THENEXITSHORT AT MARKETENDIFENDIFIF BarID AND (NOT OnMarket) THENIF close > (Massimo + (MaxPips * pipsize)) THEN //Entrare LONG a mercatoBUY nLots CONTRACT AT MARKETENDIFIF close < (Minimo - (MaxPips * pipsize)) THEN //Entrare SHORT a mercatoSELLSHORT nLots CONTRACT AT MARKETENDIF//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 MinimoENDIF//GRAPH BarID//GRAPH Massimo//GRAPH Minimo//GRAPH closeGli 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
1 user thanked author for this post.
10/24/2017 at 9:23 AM #50358Buongiorno 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
10/24/2017 at 11:36 AM #50373Per 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.
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849DEFPARAM CumulateOrders = falseDEFPARAM PreLoadBars = 2000ONCE nLots = 1 //Numero di lotti da acquistare/vendereONCE BarID = 0 //Numero della barra dove avviene l'incrocioONCE Minimo = 0 //Minimo della candela dove è avvenuto l'incrocioONCE Massimo = 0 //Massimo della candela dove è avvenuto l'incrocioONCE MaxPips = 0 //Numero di Pips oltre Minimo/Massimo per entrare in rotturaONCE MaxBars = 9999 //9999 =numero barre max. da attendere dopo l'incrocio////************************************************************************//IF IntraDayBarIndex = 0 OR ((BarIndex - BarID) > MaxBars) THEN //Ad inizio nuovo giorno...BarID = 0Minimo = 0 //... o dopo MaxBars occorreMassimo = 0 //... resettare le variabiliENDIFSt = SuperTrend[10,24] //10, 24IF (close CROSSES OVER St) OR (close CROSSES UNDER St) THENBarID = BarIndex //Salvare i valori necessari in caso d'incrocioMinimo = lowMassimo = highENDIFIF LongOnMarket THEN //Chiudere l'operazione LONG se il prezzo rompe il minimoIF close <= Minimo THENSELL AT MARKETENDIFENDIFIF ShortOnMarket THEN //Chiudere l'operazione SHORT se il prezzo rompe il massimoIF close >= Massimo THENEXITSHORT AT MARKETENDIFENDIFIF BarID AND (NOT OnMarket) THENIF close > (Massimo + (MaxPips * pipsize)) THEN //Entrare LONG a mercatoBUY nLots CONTRACT AT MARKETBarID = 0ENDIFIF close < (Minimo - (MaxPips * pipsize)) THEN //Entrare SHORT a mercatoSELLSHORT nLots CONTRACT AT MARKETBarID = 0ENDIF//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 MinimoENDIF10/25/2017 at 9:23 PM #50536Ciao 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
10/26/2017 at 10:31 AM #50590Credo 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:
con EXIT a mercato123456789101112131415161718192021222324252627282930313233343536373839404142434445464748DEFPARAM CumulateOrders = falseDEFPARAM PreLoadBars = 2000ONCE nLots = 1 //Numero di lotti da acquistare/vendereONCE Minimo = 0 //Minimo della candela dove è avvenuto l'incrocioONCE Massimo = 999999 //Massimo della candela dove è avvenuto l'incrocioONCE MaxPips = 0 //Numero di Pips oltre Minimo/Massimo per entrare in rotturaONCE ExitPips = 10 //Numero di Pips oltre Minimo/Massimo per uscire dalle posizioni//IF IntraDayBarIndex = 0 THEN //Ad inizio nuovo giorno resettare le variabiliMinimo = 0Massimo = 999999ENDIFSt = SuperTrend[1,10] //1, 10IF close CROSSES OVER St THENMinimo = 0 //Se incrocio al rialzo azzerare il Minimo e...Massimo = high //... impostare il Massimo a cui entrareENDIFIF close CROSSES UNDER St THENMinimo = low //Se incrocio al ribasso impostare il Minimo a cui entrare e...Massimo = 999999 //... azzerare il MassimoENDIFIF LongOnMarket THENIF close <= (Minimo - (ExitPips * pipsize)) THENSELL AT MARKET //Chiudere l'operazione LONG se il prezzo rompe il minimo e...SELLSHORT nLots CONTRACTS AT MARKET //... rientrare SHORTENDIFENDIFIF ShortOnMarket THENIF close >= (Massimo + (ExitPips * pipsize)) THENEXITSHORT AT MARKET //Chiudere l'operazione SHORT se il prezzo rompe il massimo e...BUY nLots CONTRACTS AT MARKET //... rientrare LONGENDIFENDIFIF NOT OnMarket THEN //Se non siamo ancora a mercato...IF Massimo < 999999 THENBUY nLots CONTRACTS AT Massimo + (MaxPips * pipsize) STOP //... comprare n Pips oltre il MassimoENDIFIF Minimo > 0 THENSELLSHORT nLots CONTRACTS AT Minimo - (MaxPips * pipsize) STOP //... vendere n Pips sotto il MinimoENDIFENDIFOvviamente 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):
uscita e rintro LIMIT/STOP1234567891011121314151617181920212223242526272829303132333435363738394041424344DEFPARAM CumulateOrders = falseDEFPARAM PreLoadBars = 2000ONCE nLots = 1 //Numero di lotti da acquistare/vendereONCE Minimo = 0 //Minimo della candela dove è avvenuto l'incrocioONCE Massimo = 999999 //Massimo della candela dove è avvenuto l'incrocioONCE MaxPips = 0 //Numero di Pips oltre Minimo/Massimo per entrare in rotturaONCE ExitPips = 10 //Numero di Pips oltre Minimo/Massimo per uscire dalle posizioni//IF IntraDayBarIndex = 0 THEN //Ad inizio nuovo giorno resettare le variabiliMinimo = 0Massimo = 999999ENDIFSt = SuperTrend[1,10] //1, 10IF close CROSSES OVER St THENMinimo = 0Massimo = highENDIFIF close CROSSES UNDER St THENMinimo = lowMassimo = 999999ENDIFIF LongOnMarket THEN //Chiudere l'operazione LONG se il prezzo rompe il minimoSELL AT (Minimo - (ExitPips * pipsize)) STOP //Uscire LONGSELLSHORT nLots CONTRACTS AT (Minimo - (ExitPips * pipsize)) LIMIT //Rientrare SHORTENDIFIF ShortOnMarket THEN //Chiudere l'operazione SHORT se il prezzo rompe il massimoEXITSHORT AT (Massimo + (ExitPips * pipsize)) STOP //Uscire SHORTBUY nLots CONTRACTS AT (Massimo + (ExitPips * pipsize)) LIMIT //Rientrare LONGENDIFIF NOT OnMarket THENIF Massimo < 999999 THENBUY nLots CONTRACTS AT Massimo + (MaxPips * pipsize) STOP //Comprate n Pips oltre il MassimoENDIFIF Minimo > 0 THENSELLSHORT nLots CONTRACTS AT Minimo - (MaxPips * pipsize) STOP //Vendere n Pips sotto il MinimoENDIFENDIF10/26/2017 at 11:26 AM #50596Ciao 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
-
AuthorPosts
Find exclusive trading pro-tools on