Semplice codice SuperTrend per entrare sul ritracciamento

Viewing 15 posts - 1 through 15 (of 23 total)
  • Author
    Posts
  • #88532 quote
    othello
    Participant
    Senior

    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
    #88554 quote
    robertogozzi
    Moderator
    Master

    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.

    othello thanked this post
    x-3.jpg x-3.jpg
    #88559 quote
    othello
    Participant
    Senior

    Ora non sono davanti al mio PC. Appena rientro mi metto subito al lavoro. Grazie Roberto, buona giornata.

    🙂

    #88582 quote
    othello
    Participant
    Senior

    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ò.

    fig1.png fig1.png
    #88585 quote
    othello
    Participant
    Senior

    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ò.

    fig2.png fig2.png
    #88588 quote
    robertogozzi
    Moderator
    Master

    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.

    othello thanked this post
    #88624 quote
    othello
    Participant
    Senior

    Ottimo, comincio a capire un po’ meglio di come PRT interpreta ed esegue il codice.

    Ci continuo a ragionare su.

    Grazie mille Roberto, davvero.

    🙂

    #88706 quote
    othello
    Participant
    Senior
    // 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.

    fig1-1.png fig1-1.png
    #88709 quote
    othello
    Participant
    Senior

    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.

    fig2-1.png fig2-1.png
    #88729 quote
    robertogozzi
    Moderator
    Master

    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.

    #88765 quote
    othello
    Participant
    Senior

    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à.

    🙂

    #88822 quote
    othello
    Participant
    Senior

    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?

    fig1-2.png fig1-2.png fig2-2.png fig2-2.png
    #88835 quote
    robertogozzi
    Moderator
    Master

    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.

    #88863 quote
    othello
    Participant
    Senior

    Grazie lo stesso Roberto,

    farò come tu dici.

    Buonasera.

    #92192 quote
    Gaspare
    Participant
    Veteran

    ciao Othello, sono Gaspare

    vorrei testare il tuo TS ma non ho capito l’intervallo dei valori delle variabili RR e PERC

    grazie

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

Semplice codice SuperTrend per entrare sul ritracciamento


ProOrder: Trading Automatico & Backtesting

New Reply
Author
author-avatar
othello @othello Participant
Summary

This topic contains 22 replies,
has 3 voices, and was last updated by othello
6 years, 10 months ago.

Topic Details
Forum: ProOrder: Trading Automatico & Backtesting
Language: Italian
Started: 01/14/2019
Status: Active
Attachments: 7 files
Logo Logo
Loading...