Creazione Graph Equity Line con slippage

Viewing 14 posts - 1 through 14 (of 14 total)
  • Author
    Posts
  • #168097 quote
    MauroPro
    Participant
    Veteran

    Ciao Roberto, e’ possibile creare un graph che indichi il profitto netto di un Ts depurato dallo slippage?

    Sarebbe da calcolare il numero di eseguiti del Ts, moltiplicarli per i pips di slippage (diversi da strumento a strumento ed orario, ma questo ora è secondario), il tutto da sottrarre al profitto della strategia (strategyProfit).

    Il problema principale che ho è come determinare il numero di eseguiti complessivi, anche perchè alcuni derivano da ordini a mercato, altri da ordini pendenti.

    Riesci a creare questo graph? Grazie

    #168101 quote
    MauroPro
    Participant
    Veteran

    Se è utile per semplificare il calcolo gli ordini pendenti individuati dalle funzioni SET STOP… si potrebbero anche eliminare e riscrivere nelle condizioni di entrata in forma equivalente.

    Es.. al posto di: set stop %loss 0.7, si potrebbe scrivere dopo le mie condizioni:

    stopLoss =close*0.993

    buy 1 contract at market

    sell at stopLoss STOP

    endif

    #168106 quote
    robertogozzi
    Moderator
    Master

    Lo slippage non si può sapere, quindi non è possibile tenerne conto.

    STRATEGYPROFIT è il risultato, aggiornato all’ultima operazione chiusa, del totale dei profitti/perdite di ogni operazione, a mercato o pendente che sia.

    Se vuoi puoi aggiungerci, ogni barra, il profitto temporaneo dato da:

    // Pips (per posizione)  = PositionPerf * PositionPrice / PipSize
    // Pips (totali)         = PositionPerf * PositionPrice / PipSize * abs(CountOfPosition)
    //
    // Money (per posizione) = PositionPerf * PositionPrice / PipSize * pipvalue / abs(CountOfPosition)
    // Money (totale)        = PositionPerf * PositionPrice / PipSize * pipvalue

    è più precisa, poi puoi farci una media, oppure una percentuale di variazione tra la barra corrente e N barre precedenti, ecc…

    #168108 quote
    MauroPro
    Participant
    Veteran

    Lo so che lo slippage preciso non si può sapere, ma a me basta una cifra indicativa. Es, se sul Nasdaq c’è un punto di spread (che corrisponde a 10 pips), mi basta togliere 10 pips ad eseguito. Poi sottrarre da strategyProfit il numero di operazioni per questa cifra indicativa di slippage.

    Non si avrà un equityLine perfetta, ma abbastanza indicativa (del resto anche gli stop, se non garantiti possono essere diversi….).

    E’ fattibile in questo modo creare una formula non troppo complessa?

    #168110 quote
    robertogozzi
    Moderator
    Master

    Se  vuoi puoi usare una media puoi farlo. La formula è:

    Slippage = X * Y * PipValue

    dove:

    • X è il numero di pips per operazione
    • Y è il numero di operazioni eseguite

    Calcolare Y non è sempre perfetto; questo metodo è il più preciso che sia riuscito a codificare:

    If not OnMarket then
       Y = 0
    Else
       Temp = abs(Countofposition) - abs(Countofposition[1])
       If Temp = 0 then
          If StrategyProfit <> StrategyProfit[1] then
             Temp = 1
          Endif
       Endif
       Y = Y + max(0,Temp)
    Endif
    #168120 quote
    MauroPro
    Participant
    Veteran

    Non funziona il contatore di operazioni Y. Se lo si visualizza con un graph si vede che non si sommano le posizioni di un certo periodo di backTest. Inoltre anche all’interno dei singoli giorni non funziona correttamente (non somma le operazioni).

    #168121 quote
    robertogozzi
    Moderator
    Master

    Ho capito, ho sbagliato ad azzerare Y.

    Sostituisci la riga 2 con:

    ONCE Y = 0

    Verrà eseguita una sola volta.

    #168126 quote
    MauroPro
    Participant
    Veteran

    Ho modificato un pò il codice per renderlo più flessibile e trasparente. Controlla se va bene. Grazie

    onePipValue = 0.10    //(es. cfd Nasdaq)                   // valore in euro di 1 pip
    pipsPointRatio = 10   //(es. cfd Nasdaq)                   // numero di pips che compongono 1 punto
    nContracts = 1                                            // numero di contratti utilizzati dal TS
    onePointValue = onePipValue*pipsPointRatio
    
    If not OnMarket then
    ONCE A = 0                                               // A = numero di operazioni
    Else
    Temp = abs(Countofposition) - abs(Countofposition[1])
    If Temp = 0 then
    If StrategyProfit <> StrategyProfit[1] then
    Temp = 1
    Endif
    Endif
    A = A + max(0,Temp)
    B = 2 * A                                                 // B = numero di eseguiti
    C = 2 * A * nContracts * onePointValue                    // C = numero di eseguiti * numero di contratti
    Endif
    
    netEquity=strategyProfit-(C*pointValue)

    Ecco i due graph:

    graph strategyProfit                            //profitto lordo
    graph netEquity coloured(0,191,255)             //profitto netto con slippage incorporato
    Image-001-1.jpg Image-001-1.jpg
    #168128 quote
    MauroPro
    Participant
    Veteran

    Se riesci probabilmente è meglio rendere più trasparente l’inserimento dello slippage all’inizio del codice.  Nel caso sopra riportato ho messo 1 punto (= 10 pips) ad eseguito.

    #168129 quote
    robertogozzi
    Moderator
    Master

    Il calcolo va bene, non penso possa essere migliorato. Il problema dell’assoluta precisione c’è, perché se tu sei a mercato con 4 posizioni e ad un certo punto 1 esce e ne entrano altre due (tutto sulla stessa barra), lo vedrai come un’operazione in più mentre in realtà sono due in più. Però questo NON può essere corretto perché non si sa quante sono le operazioni chiuse e quelle aperte. Forse si potrebbe SEMPRE aggiungere 1 quando STRATEGYPROFIT è <> dal precedente, invece che metterlo solo quando la differenza delle operazioni è zero. Si, credo questa variazione possa rendere quasi preciso al 100% il conteggio (ho spostato anche ONCE), resterebbero fuori solo doppie/triple posizioni chiuse, cioè se ne chiudono 2 e ne entrano 3 te ne segnala due e non tre (ma credo sia rarissimo):

    ONCE Y = 0
    If OnMarket then
       Temp = abs(Countofposition) - abs(Countofposition[1])
       Y = Y + max(0,Temp)
       If StrategyProfit <> StrategyProfit[1] then
          Y = Y + 1
       Endif
    Endif

    E’ ovvio che è un valore medio, non può essere preciso ma credo possa darti un’idea concreta.

    L’Equity Curve è quasi identica, si discosta leggermente sempre di più prioprio a causa dello slippage calcolato.

    Su una cosa ho un dubbio, ma lo slippage influisce davvero?  Se gestisci te, con ordini pendenti, sia lo SL che il TP allora si perché tu metti un ordine Stop e Limit ad un certo prezzo e se l’entrata è diversa ottieni uno Stop maggiore ed un TP minore, però se usi SET STOP LOSS X e SET TARGET PROFIT Y, non cambia niente con lo slippage, perché se hai messo 100 punti di SL e TP, che entri a mercato a 20000 o 20002 non fa differenza, avrai sempre X e Y punti di perdita o profitto alla fine in quanto è ProOrder che li gestisce automaticamente.

    #168131 quote
    MauroPro
    Participant
    Veteran

    Sono d’accordo che con SET STOP LOSS e SET TARGET PROFIT cambia poco per quanto riguarda lo slippage.

    Forse è più utile utilizzare la formula per calcolare soprattutto l’impatto dello spread sulla equityLine (come ho fatto involontariamente nel mio esempio in cui ho messo uno slippage  predeterminato ad ogni operazione).

    Questo (lo spread) è noto, ma SEMPRE largamente sottostimato nella equityLine fino a che non si calcola precisamente!

    Se la curva del proBackTest venisse depurata dallo spread, da qualche slippage, e si tenesse conto dell’impatto del capital gain (considerato poi il regime dichiarativo, altrimenti l’impatto dell’amministrato è anche esso nettamente sottostimato) curve molto belle cambierebbero aspetto!

    #168161 quote
    MauroPro
    Participant
    Veteran

    Alla fine penso di utilizare il tuo codice per visualizzare un equityLine senza spread (lo slippage come dicevi è poco influente e non si conosce mai). Per me è un codice utile.

    Ho sistemato le due formule, guarda se vanno bene nel caso le volesse utilizzare qualche utente . CIAO

    A)
    
    onePipValue = 0.10    //(es. cfd Nasdaq)                                           // valore in euro di 1 pip
    nPipsSpread = 10      //(es. cfd Nasdaq)                                           //inserire lo spread dello strumento tradato
    nContracts = 1                                                                     // inserire il numero dei contratti utilizzati dal TS
    spread=onePipValue*nPipsSpread
    
    If not OnMarket then
    ONCE A = 0                                                                           // A = numero di operazioni
    else
    Temp = abs(Countofposition) - abs(Countofposition[1])
    if Temp = 0 then
    If StrategyProfit <> StrategyProfit[1] then
    Temp = 1
    endif
    endif
    A = A + max(0,Temp)
    B = 2 * A                                                                              // B = numero di eseguiti
    C = nContracts * B * spread                                                            // C = numero di eseguiti * numero di contratti * spread medio
    Endif
    
    netEquity=strategyProfit-(C*pointValue)                                                 // equityLine netta depurata dallo spread medio
    
    //-------------------------------------------
    graph strategyProfit                                                                   //profitto lordo
    graph netEquity coloured(0,191,255)                                                   //profitto netto con slippage incorporato
    
    // ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    
    
    B) “Forse si potrebbe SEMPRE aggiungere 1 quando STRATEGYPROFIT è <> dal precedente, invece che metterlo solo quando la differenza delle operazioni è zero. 
    Si, credo questa variazione possa rendere quasi preciso al 100% il conteggio (ho spostato anche ONCE), resterebbero fuori solo doppie/triple posizioni chiuse, cioè se ne chiudono 2 e ne entrano 3 te ne segnala due e non tre (ma credo sia rarissimo)” (Roberto Gozzi)
     
    
    onePipValue = 0.10    //(es. cfd Nasdaq)                                             // valore in euro di 1 pip
    nPipsSpread = 10      //(es. cfd Nasdaq)                                             //inserire lo spread dello strumento tradato
    nContracts = 1                                                                       // inserire il numero dei contratti utilizzati dal TS
    spread=onePipValue*nPipsSpread
    
    ONCE A = 0                                                                             // A = numero di operazioni
    If OnMarket then
    Temp = abs(Countofposition) - abs(Countofposition[1])
    A = A + max(0,Temp)
    If StrategyProfit <> StrategyProfit[1] then
    A = A + 1
    B = 2 * A                                                                              // B = numero di eseguiti
    C = nContracts * B * spread                                                            // C = numero di eseguiti * numero di contratti * spread medio
    Endif
    Endif
    
    netEquity=strategyProfit-(C*pointValue)                                                // equityLine netta depurata dallo spread medio
    
    //---------------------------------------------
    graph strategyProfit                                                                   //profitto lordo
    graph netEquity coloured(0,191,255)                                                    //profitto netto con slippage incorporato
    
    //-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    #168162 quote
    MauroPro
    Participant
    Veteran

    in fondo nel graph va scritto: ” profitto netto con spread incorporato”

    #168207 quote
    robertogozzi
    Moderator
    Master

    Perfetto, in un test le due equity erano identiche, in un altro con più accumuli, entrate ed uscite, la equity line nera era uguale, mentre quella celeste leggermente peggiore (ma di poco più di 100 euro).

    Bene, credo sia molto utile per tutti.

    Grazie per l’idea e per avere pubblicato un codice “chiavi in mano” che ognuno può aggiungere al proprio senza modificare niente (a parte i due valori iniziali)!

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

Creazione Graph Equity Line con slippage


ProOrder: Trading Automatico & Backtesting

New Reply
Author
author-avatar
MauroPro @mauropro Participant
Summary

This topic contains 13 replies,
has 2 voices, and was last updated by robertogozzi
4 years, 9 months ago.

Topic Details
Forum: ProOrder: Trading Automatico & Backtesting
Language: Italian
Started: 04/26/2021
Status: Active
Attachments: 1 files
Logo Logo
Loading...