ProRealCode - Trading & Coding with ProRealTime™
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.
// Definizione dei parametri del codice
DEFPARAM CumulateOrders = False // Posizioni cumulate disattivate
St = Supertrend[3,10]
IF OnMarket THEN
PrezzoEntrata = 0
Rialzo = 0
Ribasso = 0
ENDIF
IF Not OnMarket Then
IF Rialzo THEN
BUY 1 CONTRACT AT PrezzoEntrata - RR Limit
ELSIF Ribasso THEN
SELLSHORT 1 CONTRACT AT PrezzoEntrata + RR LIMIT
ENDIF
ENDIF
// Condizioni per entrare su posizioni long
If (close > St) and (close[1] < St) and (Not (OnMarket)) then
PrezzoEntrata = CLOSE
BUY 1 CONTRACT AT PrezzoEntrata - RR LIMIT
Rialzo = 1
Ribasso = 0
ENDIF
// Condizioni per entrare su posizioni short
If (close < St) and (close[1] > St) and (Not (OnMarket)) then
PrezzoEntrata = CLOSE
SELLSHORT 1 CONTRACT AT PrezzoEntrata + RR LIMIT
Rialzo = 0
Ribasso = 1
ENDIF
// Stop e target
SET STOP pLOSS 10
SET TARGET pPROFIT 10
graph Rialzo
graph Ribasso
Sostituisci (close > St) and (close[1] < St) alla riga 21 con :
(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):
// Definizione dei parametri del codice
DEFPARAM CumulateOrders = False // Posizioni cumulate disattivate
ONCE RR = 15 * pipsize
St = Supertrend[3,10]
IF OnMarket THEN
PrezzoEntrata = 0
Rialzo = 0
Ribasso = 0
ENDIF
IF Not OnMarket Then
IF Rialzo THEN
BUY 1 CONTRACT AT PrezzoEntrata - RR Limit
ELSIF Ribasso THEN
SELLSHORT 1 CONTRACT AT PrezzoEntrata + RR LIMIT
ENDIF
ENDIF
// Condizioni per entrare su posizioni long
//If (close > St) and (close[1] < St) and (Not (OnMarket)) then
If (close CROSSES OVER St) and (Not (OnMarket)) then
PrezzoEntrata = CLOSE
BUY 1 CONTRACT AT PrezzoEntrata - RR LIMIT
Rialzo = 1
Ribasso = 0
ENDIF
// Condizioni per entrare su posizioni short
//If (close < St) and (close[1] > St) and (Not (OnMarket)) then
If (close CROSSES UNDER St) and (Not (OnMarket)) then
PrezzoEntrata = CLOSE
SELLSHORT 1 CONTRACT AT PrezzoEntrata + RR LIMIT
Rialzo = 0
Ribasso = 1
ENDIF
// Stop e target
SET STOP pLOSS 10
SET TARGET pPROFIT 10
graph Rialzo
graph Ribasso
graph RR
graph close
graph PrezzoEntrata
graph PrezzoEntrata - RR
Ti allego anche il codice di un indicatore che ti mostra quando l’incrocio è avvenuto:
St = Supertrend[3,10]
x = 0
IF close CROSSES OVER St THEN
x = 1
ELSIF close CROSSES UNDER ST THEN
x = -1
ENDIF
RETURN x,0
in modo che tu riesca, visivamente, ad identificare meglio quando avviene.
Ora non sono davanti al mio PC. Appena rientro mi metto subito al lavoro. Grazie Roberto, buona giornata.
🙂
Allora, 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ò.
Problema 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ò.
Problema 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:
IF OnMarket OR (StrategyProfit <> StrategyProfit[1]) THEN
PrezzoEntrata = 0
Rialzo = 0
Ribasso = 0
ENDIF
Se 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.
Ottimo, comincio a capire un po’ meglio di come PRT interpreta ed esegue il codice.
Ci continuo a ragionare su.
Grazie mille Roberto, davvero.
🙂
// Definizione dei parametri del codice
DEFPARAM CumulateOrders = False // Posizioni cumulate disattivate
Once BarraLong=1
Once BarraShort=1
St = Supertrend[3,10]
IF OnMarket OR (StrategyProfit <> StrategyProfit[1]) THEN
PrezzoEntrata = 0
Rialzo = 0
Ribasso = 0
ENDIF
IF Not OnMarket Then
IF Rialzo THEN
BUY 1 CONTRACT AT PrezzoEntrata - RR Limit
ELSIF Ribasso THEN
SELLSHORT 1 CONTRACT AT PrezzoEntrata + RR LIMIT
ENDIF
ENDIF
// Condizioni per entrare su posizioni long
If (close crosses over St) and (Not (OnMarket)) then
PrezzoEntrata = CLOSE
BUY 1 CONTRACT AT PrezzoEntrata - RR LIMIT
BarraLong=Barindex
Rischio=Close-Lowest[Barindex-BarraShort](Low)
Rialzo = 1
Ribasso = 0
ENDIF
// Condizioni per entrare su posizioni short
If (close crosses under St) and (Not (OnMarket)) then
PrezzoEntrata = CLOSE
SELLSHORT 1 CONTRACT AT PrezzoEntrata + RR LIMIT
BarraShort=Barindex
Rischio=Highest[Barindex-BarraLong](High)-Close
Rialzo = 0
Ribasso = 1
ENDIF
// Stop e target
SET STOP pLOSS (Rischio-RR)
SET TARGET pPROFIT Perc*(Rischio-RR)
c1=close crosses over St and ShortOnMarket
c2=close crosses under St and LongOnMarket
If c1 then
exitshort at market
endif
If c2 then
sell at market
endif
Un 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.
Ed 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.
Purtroppo 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.
Ciao 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à.
🙂
Allora, 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?
Non 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.
Grazie lo stesso Roberto,
farò come tu dici.
Buonasera.
ciao Othello, sono Gaspare
vorrei testare il tuo TS ma non ho capito l’intervallo dei valori delle variabili RR e PERC
grazie
Semplice codice SuperTrend per entrare sul ritracciamento
This topic contains 22 replies,
has 3 voices, and was last updated by othello
6 years, 10 months ago.
| Forum: | ProOrder: Trading Automatico & Backtesting |
| Language: | Italian |
| Started: | 01/14/2019 |
| Status: | Active |
| Attachments: | 7 files |
The information collected on this form is stored in a computer file by ProRealCode to create and access your ProRealCode profile. This data is kept in a secure database for the duration of the member's membership. They will be kept as long as you use our services and will be automatically deleted after 3 years of inactivity. Your personal data is used to create your private profile on ProRealCode. This data is maintained by SAS ProRealCode, 407 rue Freycinet, 59151 Arleux, France. If you subscribe to our newsletters, your email address is provided to our service provider "MailChimp" located in the United States, with whom we have signed a confidentiality agreement. This company is also compliant with the EU/Swiss Privacy Shield, and the GDPR. For any request for correction or deletion concerning your data, you can directly contact the ProRealCode team by email at privacy@prorealcode.com If you would like to lodge a complaint regarding the use of your personal data, you can contact your data protection supervisory authority.