Semplice codice SuperTrend per entrare sul ritracciamento
Forums › ProRealTime forum Italiano › Supporto ProOrder › Semplice codice SuperTrend per entrare sul ritracciamento
- This topic has 22 replies, 3 voices, and was last updated 5 years ago by othello.
-
-
01/14/2019 at 11:10 AM #88532
Salve.
Ho scritto il codice di un ProOrder che utilizza il SuperTrend per entrare in posizione. L’idea è quella di entrare su un ritracciamento di RR punti (dove RR è una variabile sottoposta poi ad ottimizzazione).
Il problema è che non funziona correttamente. Ho anche usato l’istruzione graph per capire dove può essere l’errore, ma non riesco proprio a trovarlo.
Ho anche provato a mettere tra parentesi le condizioni in AND ma, anche in questo caso, senza fortuna.
Dove sbaglio?
Grazie.
1234567891011121314151617181920212223242526272829303132333435363738394041// Definizione dei parametri del codiceDEFPARAM CumulateOrders = False // Posizioni cumulate disattivateSt = Supertrend[3,10]IF OnMarket THENPrezzoEntrata = 0Rialzo = 0Ribasso = 0ENDIFIF Not OnMarket ThenIF Rialzo THENBUY 1 CONTRACT AT PrezzoEntrata - RR LimitELSIF Ribasso THENSELLSHORT 1 CONTRACT AT PrezzoEntrata + RR LIMITENDIFENDIF// Condizioni per entrare su posizioni longIf (close > St) and (close[1] < St) and (Not (OnMarket)) thenPrezzoEntrata = CLOSEBUY 1 CONTRACT AT PrezzoEntrata - RR LIMITRialzo = 1Ribasso = 0ENDIF// Condizioni per entrare su posizioni shortIf (close < St) and (close[1] > St) and (Not (OnMarket)) thenPrezzoEntrata = CLOSESELLSHORT 1 CONTRACT AT PrezzoEntrata + RR LIMITRialzo = 0Ribasso = 1ENDIF// Stop e targetSET STOP pLOSS 10SET TARGET pPROFIT 10graph Rialzograph Ribasso01/14/2019 at 12:22 PM #88554Sostituisci (close > St) and (close[1] < St) alla riga 21 con :
1(close CROSSES OVER St)lo stesso con CROSSES UNDER alla riga 29, perché se adesso deve essere superiore mentre prima doveva essere inferiore significa che c’è stato un incrocio.
Ti allego il codice modificato (con anche più istruzioni GRAPH):
ST crossover/under1234567891011121314151617181920212223242526272829303132333435363738394041// Definizione dei parametri del codiceDEFPARAM CumulateOrders = False // Posizioni cumulate disattivateONCE RR = 15 * pipsizeSt = Supertrend[3,10]IF OnMarket THENPrezzoEntrata = 0Rialzo = 0Ribasso = 0ENDIFIF Not OnMarket ThenIF Rialzo THENBUY 1 CONTRACT AT PrezzoEntrata - RR LimitELSIF Ribasso THENSELLSHORT 1 CONTRACT AT PrezzoEntrata + RR LIMITENDIFENDIF// Condizioni per entrare su posizioni long//If (close > St) and (close[1] < St) and (Not (OnMarket)) thenIf (close CROSSES OVER St) and (Not (OnMarket)) thenPrezzoEntrata = CLOSEBUY 1 CONTRACT AT PrezzoEntrata - RR LIMITRialzo = 1Ribasso = 0ENDIF// Condizioni per entrare su posizioni short//If (close < St) and (close[1] > St) and (Not (OnMarket)) thenIf (close CROSSES UNDER St) and (Not (OnMarket)) thenPrezzoEntrata = CLOSESELLSHORT 1 CONTRACT AT PrezzoEntrata + RR LIMITRialzo = 0Ribasso = 1ENDIF// Stop e targetSET STOP pLOSS 10SET TARGET pPROFIT 10graph Rialzograph Ribassograph RRgraph closegraph PrezzoEntratagraph PrezzoEntrata - RRTi allego anche il codice di un indicatore che ti mostra quando l’incrocio è avvenuto:
ST crossingover/under12345678St = Supertrend[3,10]x = 0IF close CROSSES OVER St THENx = 1ELSIF close CROSSES UNDER ST THENx = -1ENDIFRETURN x,0in modo che tu riesca, visivamente, ad identificare meglio quando avviene.
1 user thanked author for this post.
01/14/2019 at 12:53 PM #8855901/14/2019 at 4:50 PM #88582Allora, ho provato il codice e, nella “sostanza”, funziona. Ci sono però un paio di problemini con i quali mi sto confrontando.
Problema numero 1.
Allego un’immagine per chiarire meglio il mio pensiero. Diciamo subito che il time frame è a 5 minuti, la giornata è quella del 2 gennaio scorso e lo strumento finanziario è il Dax30 future (broker IB).
In candela 1, chiusura 10.513, si attiva il setup Short. E fin qui è tutto corretto. L’ordine di vendita, con un RR=9, non ha modo di essere eseguito per le successive 14 barre.
Finalmente, in candela 2, viene eseguito l’ordine di vendita a 10.522. Corretto!
Stoppato poi in candela 3 a 10.532. Corretto anche qui.
Dove sta il problema? Il problema è che in candela 2 scatta il setup Long e non dovrebbe essere eseguito l’ordine di vendita relativo al precedente setup Short.
Probabilmente il sistema PRT ragiona in questo modo:
– verifica se nel corso della candela ci sono le condizioni per l’eseguito e, se ci sono, applica l’eseguito;
– e poi, al termine di questa, riesegue il codice e, se del caso, fa scattare il successivo Setup.
Provo a ragionarci su per capire se, e come, è possibile modificare il codice per evitare ciò.
01/14/2019 at 5:06 PM #88585Problema numero 2.
Anche qui allego un’immagine per le medesime ragioni. Il contesto è sempre lo stesso: time frame a 5 minuti, giornata del 4 gennaio scorso e strumento finanziario Dax30 future, RR=9.
In candela 1, chiusura 10.570,50, si attiva il setup Short. E fin qui è tutto corretto. L’ordine di vendita, a 10579,50, viene eseguito all’interno della candela successiva (la 2).
Poi accade una cosa “strana”. Dal momento che l’ordine di stop loss viene eseguito all’interno della medesima candela 2, il sistema PRT non ha modo di porre le variabili Rialzo e Ribasso a zero. Ciò in quanto, al termine della stessa candela, il sistema “non” è a mercato.
Per lo stesso motivo il sistema entra e viene stoppato in candela 3 e in candela 4. Poi, finalmente, il sistema esegue l’ultimo ordine, in candela 5. Perchè l’ultimo? Perchè poi vi è almeno una successiva candela in cui il sistema “è” a mercato ed il codice, questa volta, ha modo di azzerare le variabili Rialzo e Ribasso.
Anche qui, provo a ragionarci su per capire se, e come, è possibile modificare il codice per evitare ciò.
01/14/2019 at 5:37 PM #88588Problema 1: gli ordini pendenti vengono eseguiti al raggiungimento di un certo prezzo stabilito nella barra precedente (ad ogni barra gli ordini pendenti vanno reimmessi perché scadono) e ProOrder conosce che c’è stato un CROSS OVER solo alla chiusura della barra, quando ormai l’ordine è partito. L’unica soluzione è utilizzare TF più corti, perché, specialmente col il DAX, in una candela di 5 minuti altro che 10 pips può fare! Oppure, in alternativa, non usare ordini pendenti ma attendere la chiusura della candela per piazzare un ordine a mercato.
Problema 2: vale lo stesso discorso fatto per il numero 1, solo che qui possiamo trovare una soluzione indiretta per bypassare ProOrder che, come correttamente hai rilevato, “NON si accorge” che c’è stata un’entrata a mercato. Si può risolvere facendo una verifica sulla performance della strategia mediante STRATEGYPROFIT, perché se c’è stata un’operazione questa è stata positiva o negativa, mai in pari perché non usi un breakeven, Quindi basta confrontare STRATEGYPROFIT con STRATEGYPROFIT[1] cioè alla candela precedente, se sono diversi si presume ci sia stata un’operazione e si azzerano le variabili, quindi sostituisci le righe 5-9 con:
12345IF OnMarket OR (StrategyProfit <> StrategyProfit[1]) THENPrezzoEntrata = 0Rialzo = 0Ribasso = 0ENDIFSe un’operazione dura più di una barra non hai da preoccuparti perché, comunque, STRATEGYPROFIT viene aggiornato solo ad operazione conclusa.
Non l’ho provato, provalo tu.
1 user thanked author for this post.
01/14/2019 at 11:05 PM #8862401/15/2019 at 5:05 PM #887061234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556// Definizione dei parametri del codiceDEFPARAM CumulateOrders = False // Posizioni cumulate disattivateOnce BarraLong=1Once BarraShort=1St = Supertrend[3,10]IF OnMarket OR (StrategyProfit <> StrategyProfit[1]) THENPrezzoEntrata = 0Rialzo = 0Ribasso = 0ENDIFIF Not OnMarket ThenIF Rialzo THENBUY 1 CONTRACT AT PrezzoEntrata - RR LimitELSIF Ribasso THENSELLSHORT 1 CONTRACT AT PrezzoEntrata + RR LIMITENDIFENDIF// Condizioni per entrare su posizioni longIf (close crosses over St) and (Not (OnMarket)) thenPrezzoEntrata = CLOSEBUY 1 CONTRACT AT PrezzoEntrata - RR LIMITBarraLong=BarindexRischio=Close-Lowest[Barindex-BarraShort](Low)Rialzo = 1Ribasso = 0ENDIF// Condizioni per entrare su posizioni shortIf (close crosses under St) and (Not (OnMarket)) thenPrezzoEntrata = CLOSESELLSHORT 1 CONTRACT AT PrezzoEntrata + RR LIMITBarraShort=BarindexRischio=Highest[Barindex-BarraLong](High)-CloseRialzo = 0Ribasso = 1ENDIF// Stop e targetSET STOP pLOSS (Rischio-RR)SET TARGET pPROFIT Perc*(Rischio-RR)c1=close crosses over St and ShortOnMarketc2=close crosses under St and LongOnMarketIf c1 thenexitshort at marketendifIf c2 thensell at marketendifUn aggiornamento sul codice che sto portando avanti ed una richiesta di chiarimento.
Innanzitutto ho inserito quelle righe di codice suggerite da Roberto (post #88588) a proposito della possibilità di usare la funzione di sistema “StrategyProfit” per le ragioni indicate nel post medesimo (riga 9 di codice).
Ho poi inserito uno stoploss sulla base dello swing precedente l’attivazione del setup determinata dal supertrend. Mi spiego meglio con un’immagine. In candela 2 ho il segnale di Short mostrato dall’indicatore supertrend.
A quel punto considero, quale rischio dell’operazione, la differenza tra il prezzo di entrata Short e l’ultimo swing high precedente a tale setup. Questo swing high è rappresentato dal massimo della candela 3.
Questo massimo me lo trovo con la funzione Highest. Ma quale dominio indico a tale funzione? In questo caso indicherò 36, ovvero il numero delle barre che intercorre tra questo setup ed il precedente (le righe di codice 27 e 37 servono per salvare la barra in cui avviene il setup long o short che sia).
Tale rischio, poi, lo utilizzo per calcolare un take profit quale percentuale del rischio medesimo.
Leggendo il codice, forse, si dovrebbe capire meglio, almeno spero! E spero possa essere una buona idea anche per altri.
01/15/2019 at 5:29 PM #88709Ed ora vengo alla richiesta di chiarimento.
La figura mostra uno dei casi (non è l’unico) in cui accade il fenomeno di cui chiedo spiegazione.
Allora, in candela 1 si ha il setup long (prezzo di chiusura = 11.531,50). L’ordine (pendente) viene eseguito in candela successiva con un RR di 11 punti (in questo caso) a 11.520,50. Ora, vediamo il rischio dell’operazione calcolato così come spiegato nel post precedente. Nella figura non è visibile però, il minimo precedente, era a 11.383. Quindi:
Rischio = 11.520,50 – 11.383 = 137,5 punti
La variabile Perc (in questo caso) era posta uguale a 0,5. Quindi, si avrebbe un take profit a:
Profit = 11.520,50 + 137,5*0,5 = 11.589,50 (arrotondato al tick più vicino).
Ora, come si vede dalla figura, PRT effettivamente esegue la vendita a 11.589,50. Il problema, però, è che in quella barra (barra 3) tale prezzo non è mai esistito. I prezzi che costituiscono l’escursione di quella candela, infatti, sono tutti al di sopra di tale livello di prezzo.
Cosa, a mio avviso, avrebbe dovuto fare PRT? Avrebbe dovuto eseguire la vendita in apertura (11.626,50) essendo questo un prezzo compatibile con le direttive dell’ordine (vendere a non meno di 11.589,50).
Grazie.
01/15/2019 at 11:50 PM #88729Purtroppo non avendo indicato il TF usato e la data delle candele non posso fare verifiche.
Una volta saputi i dati posso replicare quello che è successo.
Tieni presente, viso che dovrebbe esserci un GAP, che IG permette di tradare il Dax anche al di fuori degli orari ufficiali, per cui se tu hai impostato l’orario dalle 8 alle 22, ti visdualizza un GAP, ma per IG non c’è stato, o almeno era più piccolo, per cui magari ti ha chiuso la posizione mentre tu pensavi non accadesse niente.
Se hai personalizzato gli orari di trading tieni presente che hanno solo un effetto visivo, le operazioni aperte seguono il loro corso secondo gli orari del broker.
Comunque, attendo i dati per il test.
01/16/2019 at 11:34 AM #88765Ciao Roberto,
leggo solo ora la tua risposta ed eccomi qui.
Allora, il time frame utilizzato è il 5 minuti e la piattaforma è quella di Prorealtime alimentata con i dati ufficiali di mercato del future Dax (che presumo siano quelli del broker IB ma, di questo, non ne sono certo).
Non dovrei aver personalizzato gli orari del trading (uso il condizionale perchè il sistema è sul mio PC di casa ed ora sono fuori). Appena torno a casa lo verifico e, non solo, ma ti dico anche quali sono i giorni e gli orari esatti in cui si verifica tale anomalia.
Grazie come sempre per la tua disponibilità.
🙂
01/16/2019 at 4:02 PM #88822Allora, eccomi qui.
Allego anche alcune immagini per chiarire meglio.
In questa prima figura abbiamo il Dax 30 future, scadenza marzo 2019, con time frame a 5 minuti. L’intervallo temporale tra le candele 1 e 3 definiscono il dominio della funzione Lowest per il calcolo dello Swing Low. Il minimo trovato in questo arco di tempo è quello fatto registrare dalla candela 2: 11.145,50.
In chiusura di candela 3 si attiva il setup Long al prezzo di 11.262,00. Il rischio, corretto del fattore RR (in questo caso pari a 7), diviene:
Rischio = 11.262,00 – 11.145,50 – 7 = 109,5
La variabile Perc, che identifica la percentuale di tale rischio che poi determina il livello di profit per l’uscita, vale 0,66. Quindi:
Profitto = 109,50 * 0,66 = 72,27
L’entrata avviene in candela 4, con ordine pendente, a:
Entry = 11.262,00 – 7 = 11.255,00
Che, come mostrato dalla figura, risulta il livello effettivo di entrata effettuato dal ProOrder.
A quel punto il livello di uscita dovrebbe essere:
11.255,00 + 72,27 = 11.327,27
arrotondato poi a 11.327,50. Ed anche questo livello di uscita è correttamente mostrato dal ProOrder.
Ora, la candela in cui si verifica l’eseguito di vendita, è quella delle ore 8:00 del 30/10/2018. Candela che mostra un’apertura del future in gap up con un minimo a 11.332,00 ed un’apertura a 11.336,00.
E’ quindi a tale livello, 11.336,00, che il ProOrder avrebbe dovuto eseguire la vendita!
La seconda immagine mostra l’impostazione dell’orario di visualizzazione: gli orari impostati sono quelli ufficiali di mercato.
Grazie.
P.S.: mentre stao scrivendo il post ho pensato ad una cosa: non potrebbe trattarsi di un problema di rettifica della serie storica che PRT effettua al termine di ogni scadenza future?
01/16/2019 at 4:39 PM #88835Non saprei davvero cosa risponderti, meglio che tu prema CTRL+M dalla piattaforma e chiedi a PRT.
Io uso IG con i CFD e li sono aperti anche alcune ore della notte, quindi i gap sono inferiori.
Mi spiace.
01/17/2019 at 12:19 AM #8886302/24/2019 at 3:17 PM #92192 -
AuthorPosts
Find exclusive trading pro-tools on