codice con trailing tp e contatore

Viewing 5 posts - 1 through 5 (of 5 total)
  • Author
    Posts
  • #220097 quote
    alessiopippo
    Participant
    Junior

    Buongiorno, avrei bisogno di aiuto per un codice che sto cercando di scrivere, il sistema al verificarsi della condizione “acquisto” dovrebbe:

    comprare due contratti al massimo della candela dove si è verificata la condizione

    l’ordine deve rimanere valido per 5 candele

    lo stop loss deve essere al minimo della candela di 2 periodi antecedenti il verificarsi della condizione.

    poi il sistema dovrebbe uscire con un contratto al raggiungimento del tp1(prezzo di acquisro piu 10 punti),

    il restante contratto deve venire gestito con un trailing che parte al prezzo di vendita del primo contratto e uno stop loss di 5 punti sempre dal prezzo di vendita del primo contratto.

    ho provato a scrivere il codice ma non fa quello che vorrei, qualcuno può aiutarmi cosi da capire cosa e come modificare il codice?

    DEFPARAM CumulateOrders = false  
    
    // Impedisce al sistema di tradare in giorni specifici della settimana
    daysForbiddenEntry = OpenDayOfWeek = 6 OR OpenDayOfWeek = 0
    
    // Condizioni per entrare su posizioni long
    once count=0
    count=count+1
    a = adx[14]>=20 
    b= high[1]<high 
    acquisto= a and b
    if acquisto then
    count=0
    prezzoacquisto=high 
    perdita = low[2]  
    endif
    IF count<5 and not daysForbiddenEntry then  // barindex-mybar<5 AND not daysForbiddenEntry  THEN
     
    BUY 2 CONTRACT AT prezzoacquisto stop
    ENDIF
    tp1=24
    prezzovendita=prezzoacquisto+tp1*pointsize
    if countofposition=2 and longonmarket then
    sell 1 contract at prezzovendita limit
    set stop price perdita
    endif
    
    if countofposition=1  then 
    perditaseconda=prezzovendita-5*pointsize
    set stop price perditaseconda
    //trailing stop function
    trailingstart = 15 //trailing will start @trailinstart points profit
    trailingstep = 5 //trailing step to move the "stoploss"
    
    //reset the stoploss value
    IF NOT ONMARKET THEN
    newSL=0
    ENDIF
    
    //manage long positions
    IF LONGONMARKET THEN
    //first move (breakeven)
    IF newSL=0 AND close-tradeprice(1)>=trailingstart*pipsize THEN
    newSL = tradeprice(1)+trailingstep*pipsize
    ENDIF
    //next moves
    IF newSL>0 AND close-newSL>=trailingstep*pipsize THEN
    newSL = newSL+trailingstep*pipsize
    ENDIF
    ENDIF
    
    //manage short positions
    IF SHORTONMARKET THEN
    //first move (breakeven)
    IF newSL=0 AND tradeprice(1)-close>=trailingstart*pipsize THEN
    newSL = tradeprice(1)-trailingstep*pipsize
    ENDIF
    //next moves
    IF newSL>0 AND newSL-close>=trailingstep*pipsize THEN
    newSL = newSL-trailingstep*pipsize
    ENDIF
    ENDIF
    
    //stop order to exit the positions
    IF newSL>0 THEN
    SELL AT newSL STOP
    EXITSHORT AT newSL STOP
    ENDIF
    endif
    //************************************************************************
    
    GRAPHonprice prezzovendita
    graphonprice perditaseconda
     
    //graph  count //barindex-mybar
     
    
    #220110 quote
    robertogozzi
    Moderator
    Master

    Preciso questi punti:

    1. set stop price perdita è bene che venga messo al BUY iniziale, non all’uscita parziale
    2. le uscite parziali ProRealTime le accetta, quindi nel backtest funzionano, però IG non le ammette, quindi devi procedere con un’uscita a mercato (quindi solo DOPO che il prezzo ha superato prezzovendita)
    3. BUY 2 CONTRACT AT prezzoacquisto stop non è detto che si comporti correttamente LIVE (in backtest va bene), perché tra il prezzo corrente e l’entrata potrebbe non esserci la distanza minima richiesta dal broker, nel caso la richieda per quel determinato strumento
    4. dove c’è il primo BUY, dovresti aggiungere come condizione AND Not OnMarket, per evitare che comunque il codice venga eseguito, anche se non entra più a mercato dopo la prima volta, e che ti cambi lo STOP che hai messo nel trailing stop
    5. usi stop diversi, questo potrebbe creare conflitti LIVE, in quanto usi set stop price perditaseconda e, più sotto, SELL AT newSL STOP.
    6. nel trailing stop è opportuno usare una variabile FLAG per fare in modo che le righe perditaseconda=prezzovendita-5*pointsize e set stop price perditaseconda siano eseguite solo la prima volta, questo dovrebbe aiutare anche ad evitare conflitti tra i vari stop di uscita
    7. la riga if acquisto then va modificata in if acquisto and Not Onmarket then, altrimenti la variabili all’interno di IF…ENDIF le modifica anche quando sei già a mercato.

    Questo è come l’ho modificato, fai le verifiche e fammi sapere:

    DEFPARAM CumulateOrders = false
    
    // Impedisce al sistema di tradare in giorni specifici della settimana
    daysForbiddenEntry = OpenDayOfWeek = 6 OR OpenDayOfWeek = 0
    
    // Condizioni per entrare su posizioni long
    once count=0
    count=count+1
    a = adx[14]>=20
    b= high[1]<high
    acquisto= a and b
    if acquisto then
    count=0
    prezzoacquisto=high
    perdita = low[2]
    endif
    IF count<5 and not daysForbiddenEntry and Not OnMarket then  // barindex-mybar<5 AND not daysForbiddenEntry  THEN
    BUY 2 CONTRACT AT prezzoacquisto stop
    set stop price perdita
    flag = 0
    ENDIF
    tp1=24
    prezzovendita=prezzoacquisto+tp1*pointsize
    if countofposition=2 and longonmarket then
    if close >= prezzovendita then
    sell 1 contract at market
    flag = 1
    endif
    endif
    if countofposition=1  then
    if flag = 1 then
    perditaseconda=prezzovendita-5*pointsize
    set stop price perditaseconda
    flag = 0
    endif
    //trailing stop function
    trailingstart = 15 //trailing will start @trailinstart points profit
    trailingstep  = 5 //trailing step to move the "stoploss"
    //reset the stoploss value
    IF NOT ONMARKET THEN
    newSL=0
    ENDIF
    //manage long positions
    IF LONGONMARKET THEN
    //first move (breakeven)
    IF newSL=0 AND close-tradeprice(1)>=trailingstart*pipsize THEN
    newSL = tradeprice(1)+trailingstep*pipsize
    ENDIF
    //next moves
    IF newSL>0 AND close-newSL>=trailingstep*pipsize THEN
    newSL = newSL+trailingstep*pipsize
    ENDIF
    ENDIF
    //manage short positions
    IF SHORTONMARKET THEN
    //first move (breakeven)
    IF newSL=0 AND tradeprice(1)-close>=trailingstart*pipsize THEN
    newSL = tradeprice(1)-trailingstep*pipsize
    ENDIF
    //next moves
    IF newSL>0 AND newSL-close>=trailingstep*pipsize THEN
    newSL = newSL-trailingstep*pipsize
    ENDIF
    ENDIF
    //stop order to exit the positions
    IF newSL>0 THEN
    SELL      AT newSL STOP
    EXITSHORT AT newSL STOP
    ENDIF
    endif
    //************************************************************************
    GRAPHonprice prezzovendita  coloured("Fuchsia")
    graphonprice perditaseconda coloured("LawnGreen")
    graphonprice NewSL          coloured("Red")
    //graph  count //barindex-mybar
    #220133 quote
    alessiopippo
    Participant
    Junior

    Grazie mille Roberto, il codice funziona.

    per quanto riguarda il punto 3

    BUY 2 CONTRACT AT prezzoacquisto stop non è detto che si comporti correttamente LIVE (in backtest va bene), perché tra il prezzo corrente e l’entrata potrebbe non esserci la distanza minima richiesta dal broker, nel caso la richieda per quel determinato strumento

    Devo includere la distanza minima in prezzoacquisto?

    esempio: distanza minima 4 punti allora prezzoacquisto=high diventa prezzoacquisto=high+4*pipsize? oppure bisogna fare una verifica prima per vedere se la distanza minima è già rispettata?

    se si come si codifica?

    grazie ancora

    #220135 quote
    robertogozzi
    Moderator
    Master

    Io preferisco fare sempre una verifica sui possibli 3 casi (esempio LONG: prezzo Maggiore dell’entrata + distanza ed entro in LIMIT, prezzo Minore dell’entrata – distanza ed entro STOP, oppure è a rischio perché non c’è la distanza e tralascio fino alla prossima candela oppure entro a Mercato):

    Distanza = 6 * pipsize    //distanza usuale per il DAX
    IF count<5 and not daysForbiddenEntry then  // barindex-mybar<5 AND not daysForbiddenEntry  THEN
       IF close >= (prezzoacquisto + Distanza) THEN
          BUY 2 CONTRACT AT prezzoacquisto LIMIT
       ELSIF close <= (prezzoacquisto - Distanza) THEN
          BUY 2 CONTRACT AT prezzoacquisto STOP
       ELSE
          //BUY 2 CONTRACT at Market
       ENDIF
    ENDIF

    nell’entrata a Mercato ho messo i commenti, così non entra ed aspetta la prossima candela, nel caso ci siano ancora le condizioni ed il prezzo non sia così vicino. Se vuoi entrare basta che togli le due barre iniziali della riga.

    Generalmente per il DAX sono 6 pip di distanza minima, ma durante il giorno può cambiare secondo la volatilità e non si può conoscere il valore. Io di solito metto tra 8 e 10 pips per cercare di essere sicuro. Chiaramente su un timeframe alto, 1 ora o più, 3-4 pip in più non fanno la differenza, mentre su timeframe piccoli possono farla.

    La decisione spetta a te.

    #220198 quote
    alessiopippo
    Participant
    Junior

    Grazie mille Roberto, funziona tutto e ho capito quello che mi hai spiegato sulla distanza, appena avro finito il codice lo posto completo cosi potete commentarlo dare consigli e se va bene anche usarlo

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

codice con trailing tp e contatore


Supporto ProOrder

New Reply
Author
Summary

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

Topic Details
Forum: Supporto ProOrder
Language: Italian
Started: 08/30/2023
Status: Active
Attachments: No files
Logo Logo
Loading...