Trading System con trailing stop su pullback

Viewing 7 posts - 1 through 7 (of 7 total)
  • Author
    Posts
  • #156446 quote
    mirco
    Participant
    New

    Buongiorno,
    scrivo per chiedere aiuto per quanto riguarda un codice (trovato su un libro) che sto cercando di implementare

    L’idea è questa:
    – l’allineamento di 3 medie mobili deve passare da discendente ad ascendente
    – la durata dell’inversione deve essere rapida (es. max 3 barre)
    – deve verificarsi un pullback ad una o più barre
    – acquistare sopra il massimo della barra di pullback
    – stop sotto al minimo della barra di pullback
    – nel caso (sperato) che i prezzi riprendano a salire e avvenga un nuovo pullback, spostare lo stop sotto al minimo del nuovo pullback

    Premessa: ho creato un indicatore, restituisce -1 se le medie sono allineate al ribasso, 0 se non sono allineate, 1 se sono allineate al rialzo.

    indicator = CALL "In Trend"[10, 0, 20, 1, 30, 1]
    inversione = indicator[3] = -1 AND indicator = 1
    pullback = high < high[1] AND low < low[1]
    
    IF inversione and pullback THEN
        BUY 1000 CASH AT MARKET
    ENDIF

     

    Il programmino sopra funziona ma non fa propriamente quello che voglio io:
    – mi trova le inversioni nelle ultime 3 barre e i pullback nell’ultima. Io voglio che trovi l’ultima inversione, che può essersi verificata anche 5 o 10 barre fa(basta che l’indicatore, da allora, rimanga sempre 1) e un pullback successivo.

    Ho provato scrivendo qualcosa del genere ma non sono giunto a nessuna conclusione

    //conta da quante barre il trend è positivo
    count = 0
    WHILE indicator[count] = 1 DO
        count = count + 1
    WEND
    
    //verifica che ci sia stata un'inversione in meno di 3 giorni
    inversione = indicator[count+3] = -1
    
    //cerca il pullback più vicino a noi e setta entry e stop
    IF (inversione) THEN
        i = 0
        indexBarPullback = -1
        WHILE (i < count AND indexBarPullback = -1) DO
            IF(high[i] < high[i+1] AND low[i] < low[i+1]) THEN
                indexBarPullback = i
                entry = high[i]
                stopLoss = low[i]
            ENDIF
            i = i + 1
        WEND
    ENDIF

    – L’entrata, da quanto ho letto, viene effettuata all’apertura della barra successiva…ma io voglio entrare quando il prezzo supera la mia “entry”! Come è possibile farlo?

    – Lo stop è possibile modificarlo una volta inserito? Perchè guardando la documentazione del trailing, propone solo metodi “automatici” in percentuale o valore assoluto, che seguono il prezzo. Ma io vorrei settare lo un nuovo stop al minimo del successivo pullback, seguendo così i prezzi. E’ possibile?

    Allego un’immagine di esempio

    So che sto chiedendo molto, praticamente tutto, ma non vi chiedo necessariamente la pappa pronta. Mi vanno bene anche codici di esempi simili o idee da sviscerare o piccoli input da seguire.

    Ogni commento è ben accetto, spero di essere stato chiaro e non aver dimenticato nulla.
    Grazie
    Mirco

    Strategia.png Strategia.png
    #156453 quote
    robertogozzi
    Moderator
    Master

    Cosa intendi per PULLBACK?

    Di quanto deve essere?

    #156454 quote
    mirco
    Participant
    New

    Grazie per l’interessamento Roberto.
    Per pullback intendo semplicemente che una barra ha un massimo ed un minimo inferiore alla precedente:

    high < high[1] AND low < low[1]

    Il mio problema è che i pullback non sono necessariamente ad una barra.
    Un pullback a due barre è definito come:

    (high < high[1] AND low < low[1]) AND (high[1] < high[2] AND low[1] < low[2])

    E così via per 3,4…barre
    Questo nei casi più semplici.
    Nei casi più complessi un pullback a più barre potrebbe essere composto da:
    – pullback ad 1 barra
    – una barra di “assestamento” (che non ha requisiti di un pullback e allo stesso tempo non mi consente di entrare a mercato perchè non supera il massimo della barra precedente)
    – un altro pullback
    (non so se mi sono spiegato)

    #156492 quote
    robertogozzi
    Moderator
    Master

    Ok, più tardi ci darò un’occhiata.

    #156549 quote
    robertogozzi
    Moderator
    Master

    Domanda “…ma io voglio entrare quando il prezzo supera la mia “entry”! Come è possibile farlo?

    Risposta  Con un ordine pendente (STOP o LIMIT), esempi:

    BUY 1 Contract AT Entry STOP  //se il prezzo d'entrata è peggiorativo
    BUY 1 Contract AT Entry LIMIT //se il prezzo d'entrata è migliorativo

    Per lo Stop Loss, puoi seguire il Pullback, metti lo stop loss in una variabile e lo aggiorni ad ogni nuovo pullback (facendo attenzione a che NON scenda sotto il valore precedente):

    IF MieCondizioni AND Not OnMarket THEN
       BUY 1 Contract AT Entry STOP
       SET TARGET pPROFIT 500        //500 pips fissi
       SLexit = lowest[3](low)       //Setta lo SL iniziale al minimo delle ultime 3 candele
       SET STOP   pLOSS   abs(Entry - SLexit) / pipsize
    ENDIF
    IF NextPullBack AND PositionPerf > 0 THEN //al prossimo PullBack (se in guadagno)
       SLexit = max(PositionPrice,max(SLexit,MinimoPullBack))
    ENDIF
    IF LongOnMarket THEN
       SELL AT SLexit STOP           //piazza l'ordine di StopLoss (in sostituzione dello SL iniziale)
    ENDIF

    In pratica setta uno SL ed un TP iniziale. Alle candele successive aggiorna lo SL, la prima volta mettendolo almeno in pareggio (PositionPrice, o anche TradePrice se non accumuli posizioni), poi aggiornandolo ad ogni nuovo PullBack, ma facendo in modo che NON scenda mai più sotto il pareggio).

    Le ultime 3 righe piazzano un ordine STOP pendente ad ogni nuova candela, se a mercato, perché gli ordini pendenti hanno validità per una sola candela. Alla prima candela NON sarà piazzato perché per sapere di essere entrato a mercato ProOrder ha necessità che passi un’intera candela dopo un ordine BUY/SELLSHORT/SELL/EXITSHORT, per questo è stato messo lo SL iniziale con SET STOP pLOSS per essere sicuri di non entrare a mercato senza uno stop loss.

    #156666 quote
    mirco
    Participant
    New

    Grazie roberto per l’aiuto.
    Intanto volevo chiederti…da quello che ho capito, suppongo che il prt “legga” il codice ad ogni nuova barra, è corretto?
    Le variabili della barra precedente restano in memoria? (es. ad una barra setto una variabile. Alla barra successiva, quando il programma viene ri-eseguito, la variabile resta settata?)
    Poi…qualcosa non mi torna:

    // Condizioni per entrare su posizioni long
    indicator = CALL "In Trend"[10, 0, 20, 1, 30, 1]
    
    //conta da quante barre il trend è positivo
    //count = indice prima barra dove non è in trend
    count = 0
    WHILE indicator[count] = 1 DO
        count = count + 1
    WEND
    
    //verifica che ci sia stata un'inversione in meno di 3 giorni
    inversione = indicator[count+2] = -1
    
    //-----------------------------------------------------------------//
    
    //cerca il pullback più vicino a noi e setta entry e stop
    IF (inversione = 1) THEN
        i = 0
        indexBarPullback = -1
        WHILE (i < count AND indexBarPullback = -1) DO
            IF(high[i] < high[i+1] AND low[i] < low[i+1]) THEN
                indexBarPullback = i
                entry = high[i]
                stopLoss = low[i]
            ENDIF
            i = i + 1
        WEND
    ENDIF

    Questa è la routine che fa. Ho provato a farlo disegnare come indicatore e dovrebbe funzionare. Mi disegna sul grafico le righe giuste ed i dati giusti.

    IF indicator = 1 AND indexBarPullback > 0 THEN
        DRAWARROWUP(barindex[indexBarPullback], low[indexBarPullback]-1) coloured(255,0,0,255)
        DrawText(entry,barindex[indexBarPullback],low[indexBarPullback]-2) coloured(255,0,0,255)
        DrawText(stopLoss,barindex[indexBarPullback],low[indexBarPullback]-3) coloured(255,0,0,255)
    ENDIF
    
    IF(close > entry AND indexBarPullback > 0) THEN
        DRAWARROW(barindex[indexBarPullback], entry) coloured(0,0,255,255)
        DrawText(entry,barindex[indexBarPullback],entry+1) coloured(0,0,255,255)
    ENDIF

    Se invece, anzichè disegnare, faccio fare gli acquisti, non compra niente.

    IF indicator = 1 AND indexBarPullback > 0 AND Not OnMarket THEN
        BUY 1 CONTRACTS AT entry STOP
        SET TARGET pPROFIT 500        //500 pips fissi
        SLexit = stopLoss       //Lo stop è quello calcolato con la routine
        SET STOP pLOSS abs(Entry - SLexit) / pipsize //Questa istruzione non ho ben capito cosa fa >.<
    ENDIF

    Non so se ho sbagliato qualcosa. Ho modificato il tuo codice e ho concettualmente ricontrollato quello che fa.
    Gli ordini li ho provati sia con BUY LIMIT che con BUY STOP, non funziona.

    P.S. Al controllo degli stop ancora non ci sono arrivato, se non compra nulla non posso testarli, però chiedo già.

    La condizione di modifica dello stop io la farei semplicemente così

    IF stopLoss > SLexit AND POSITIONPERF > 0 THEN
        SLexit = max(PositionPrice,stopLoss)
    ENDIF
    
    IF LongOnMarket THEN
        SELL AT SLexit STOP //piazza l'ordine di StopLoss (durata 1 candela)
    ENDIF

    “Le ultime 3 righe piazzano un ordine STOP pendente ad ogni nuova candela, se a mercato, perché gli ordini pendenti hanno validità per una sola candela.”
    Non si può ripiazzare uno stop “classico”?

    test.png test.png
    #156674 quote
    robertogozzi
    Moderator
    Master

    Le variabili restano in memoria con lo stesso valore finché non gliene assegni uno diverso.

    Ad ogni nuova candela PRT mantiene le stesse variabili ed inizialmente anche lo stesso valore assegnandogli il BarIndex della nuova candela. Se, durante l’esecuzione del codice, un valore cambia allora aggiorna la variabile da quel momento in poi.

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

Trading System con trailing stop su pullback


ProOrder: Trading Automatico & Backtesting

New Reply
Author
author-avatar
mirco @mirco-gnoli Participant
Summary

This topic contains 6 replies,
has 2 voices, and was last updated by robertogozzi
5 years, 1 month ago.

Topic Details
Forum: ProOrder: Trading Automatico & Backtesting
Language: Italian
Started: 01/05/2021
Status: Active
Attachments: 2 files
Logo Logo
Loading...