Ciao, a tutti.
Se cerco di inviare questo codice a ProOrder non me lo fa fare.
Il codice è il seguente :
// Definizione dei parametri del codice
DEFPARAM CumulateOrders = False // Posizioni cumulate disattivate
//DEFPARAM FLATBEFORE = 080000
//DEFPARAM FLATAFTER = 220000
//Contratti
c = 1
// Condizioni per entrare su posizioni long
indicator1 = MACD[12,26,9](close)
c1 = (indicator1 >= 0)
indicator2 = MACDline[12,26,9](close)
c2 = (indicator2 CROSSES OVER 3) //3
IF c1 AND c2 THEN
BUY c CONTRACT AT MARKET
ENDIF
// Condizioni per uscire da posizioni long
indicator3 = MACD[12,26,9](close)
c3 = (indicator3 <= -4) //-4
IF c3 THEN
SELL c CONTRACT AT MARKET
ENDIF
// Condizioni per entrare su posizioni Short
indicator4 = MACD[12,26,9](close)
c4 = (indicator4 <= 0)
indicator5 = MACDline[12,26,9](close)
c5 = (indicator5 CROSSES UNDER 9) //10
IF c4 AND c5 THEN
SELL c CONTRACT AT MARKET
ENDIF
// Condizioni per uscire da posizioni long
indicator6 = MACD[12,26,9](close)
c6 = (indicator6 >= 6) //6
IF c6 THEN
SELL c CONTRACT AT MARKET
ENDIF
// Loss, Profit
SET STOP LOSS 13*AverageTrueRange[8](close) //13 - 10
SET TARGET PROFIT 14*AverageTrueRange[13](close) //14 - 12
L’errore è quello indicato nell’immagine allegata.
Ti prego di utilizzare il pulsante “Insert PRT code” indicato con i simboli “<>” sulla barra grigia, in modo da facilitare la comprensione del codice.
Per quanto riguarda l’errore segnalato è piuttosto chiaro, NON si possono chiudere parzialmente ordini, quindi usa
SELL AT MARKET //corretto
//SELL c CONTRACT AT MARKET //errato, indipendentemente dal valore di c
vedi link https://www.prorealcode.com/documentation/sell/.
Roberto
Grazie per la soluzione e sorry per il link del mio codice.
Per curiosità, come potrebbe essere migliorato secondo la tua esperienza ?
Sono alle prime armi …
Posso darti consigli su come migliorare il codice, per il resto (indicatori, settaggi ecc…) devi provare a fare dei test seguendo qualche strategia che conosci o che trovi nel forum o sul web. Ad esempio, per evitare, nel MACD, di ripetere sempre 12,26,9 puoi creare tre variabili e chiamarle Macd1, macd2 e Macd3 con quei valori, così è più facile fare dei test cambiandoli di volta in volta all’inizio, senza doverli cambiare dappertutto, così:
// Definizione dei parametri del codice
DEFPARAM CumulateOrders = False // Posizioni cumulate disattivate
//DEFPARAM FLATBEFORE = 080000
//DEFPARAM FLATAFTER = 220000
ONCE Macd1 = 12 //12
ONCE Macd2 = 26 //26
ONCE Macd3 = 9 //9
//Contratti
c = 1
// Condizioni per entrare su posizioni long
indicator1 = MACD[Macd1,Macd2,Macd3](close)
c1 = (indicator1 >= 0)
indicator2 = MACDline[Macd1,Macd2,Macd3](close)
c2 = (indicator2 CROSSES OVER 3) //3
IF c1 AND c2 THEN
BUY c CONTRACT AT MARKET
ENDIF
// Condizioni per uscire da posizioni long
indicator3 = MACD[Macd1,Macd2,Macd3](close)
c3 = (indicator3 <= -4) //-4
IF c3 THEN
SELL c CONTRACT AT MARKET
ENDIF
// Condizioni per entrare su posizioni Short
indicator4 = MACD[Macd1,Macd1,Macd1](close)
c4 = (indicator4 <= 0)
indicator5 = MACDline[Macd1,Macd2,Macd3](close)
c5 = (indicator5 CROSSES UNDER 9) //10
IF c4 AND c5 THEN
SELL c CONTRACT AT MARKET
ENDIF
// Condizioni per uscire da posizioni long
indicator6 = MACD[Macd1,Macd2,Macd3](close)
c6 = (indicator6 >= 6) //6
IF c6 THEN
SELL c CONTRACT AT MARKET
ENDIF
// Loss, Profit
SET STOP LOSS 13*AverageTrueRange[8](close) //13 - 10
SET TARGET PROFIT 14*AverageTrueRange[13](close) //14 - 12
Alla stessa stregua nell’indicare il numero di contratti da acquistare con la variabile c 🙂
Quello che cercavo è un trailing che sia efficace al posto del target profit,così da seguire il movimento, ma allo stesso tempo definire un numero di punti per poter impostare anche un stop profit se in guadagno al posto dello stop loss fisso.
Può esistere un qualcosa del genere da applicare al mio codice ?
Grazie per la tua disponibilità 🙂
Ad ogni modo questa è la strategia come l’ho postata io sopra, a cui ho aggiunto il codice di Nicolas per il Trailing Stop:
// Definizione dei parametri del codice
DEFPARAM CumulateOrders = False // Posizioni cumulate disattivate
//DEFPARAM FLATBEFORE = 080000
//DEFPARAM FLATAFTER = 220000
ONCE Macd1 = 12 //12
ONCE Macd2 = 26 //26
ONCE Macd3 = 9 //9
//Contratti
c = 1
//************************************************************************
//trailing stop function
trailingstart = 20 //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
//************************************************************************
// Condizioni per entrare su posizioni long
indicator1 = MACD[Macd1,Macd2,Macd3](close)
c1 = (indicator1 >= 0)
indicator2 = MACDline[Macd1,Macd2,Macd3](close)
c2 = (indicator2 CROSSES OVER 3) //3
IF c1 AND c2 THEN
BUY c CONTRACT AT MARKET
ENDIF
// Condizioni per uscire da posizioni long
indicator3 = MACD[Macd1,Macd2,Macd3](close)
c3 = (indicator3 <= -4) //-4
IF c3 THEN
SELL c CONTRACT AT MARKET
ENDIF
// Condizioni per entrare su posizioni Short
indicator4 = MACD[Macd1,Macd1,Macd1](close)
c4 = (indicator4 <= 0)
indicator5 = MACDline[Macd1,Macd2,Macd3](close)
c5 = (indicator5 CROSSES UNDER 9) //10
IF c4 AND c5 THEN
SELL c CONTRACT AT MARKET
ENDIF
// Condizioni per uscire da posizioni long
indicator6 = MACD[Macd1,Macd2,Macd3](close)
c6 = (indicator6 >= 6) //6
IF c6 THEN
SELL c CONTRACT AT MARKET
ENDIF
// Loss, Profit
SET STOP LOSS 13*AverageTrueRange[8](close) //13 - 10
SET TARGET PROFIT 14*AverageTrueRange[13](close) //14 - 12
Con trailingstart indichi dopo quanti pips di profitto vuoi che parta il Trailing Stop (nell’esempio dopo 20 pips); se non raggiunge mai qual limite e torna indietro ti prenderà, ovviamente lo Stop Loss completo. Con trailingstep indichi ogni quanti pips di profitto il Trailing Stop deve essere aggiornato (nell’esempio sarà 20, 25, 30,…. di cinque in cinque). Tenere bene presente che essendo un codice che fa parte di una strategia sarà eseguito SOLO alla chiusura della candela, per cui se il prezzo ha raggiunto i 20 pips di profitto nel corso della candela, ma prima della chiusura è al di sotto, il Trailing Stop non partirà, per cui ti potrebbe capitare di arrivare a 19.9 pips di profitto, poi il prezzo gira e va a prenderti l’intero stop loss. Ovviamente questo problema può verificarsi maggiormente man mano che vai su timeframe più lunghi.
Ok, allora la domanda mi sorge spontanea.
Se arrivo ad avere, 19.9 di guadagno e il trailing non entra in funzione, non c’è un modo dove io possa indicare dopo quanti punti in guadagno lo stop, inizialmente inserito, si posizioni almeno alla pari all’ingresso, così da proteggersi da un possibile rintracciamento dei prezzi ?
non so se mi sono spiegato :))
Ti sei spiegato benissimo, intendi il breakeven della posizione. Prendi il codice indicato al secondo link del mio post https://www.prorealcode.com/topic/problem-invio-codice-proorder/#post-53320 sopra ed inseriscilo nella tua strategia. Tieni sempre presente che, anch’esso, essendo un codice, verrà eseguito SOLO dopo la chiusura della barra.
Perfetto proverò ad inserire il codice che mi hai indicato.
Grazie 🙂
Provando il mio codice, però, mi sono reso conto che per le posizioni long, si comporta abbastanza bene, mentre per le posizioni short, il codice non riesce a seguire il movimento.
Eppure le condizioni di ingresso per il long che per lo short sono identiche. Si, c’è qualche ottimizzazione, ma in linea di massima si dovrebbero comportare allo stesso modo.
Eppure così non è.
Quindi, anche qui la domanda sorge spontanea.
Finchè il mercato decide di salire, tutto bene. Ma nel momento in cui cambia direzione, sono rovinato.
Il dax a cui faccio riferimento per il mio trading è in un periodo di salita e il sottostante, per ora, non è stato violato.
Ma se cambiano direzione ? Perchè il mio codice non riesce a seguire almeno in parte lo short ?
Non dico che tute le tradate devono essere positive (altrimenti saremmo tutti ricchi), ma nemmeno tutte negative quando si tratta di scendere …
Grazie ancora per la tua disponibilità.
Probabilmente, essendo il DAX in fase di rialzo, necessita di settaggi diversi, anche per lo stesso indicatore, tra LONG e SHORT.
Magari prova con il Macd così com’è per i LONG e creane un altro con valori diversi per gli SHORT, lo stesso puoi fare con le medie, ecc…
Questo però potrebbe cambiare col tempo quando dovesse entrare, com’era a Giugno/Luglio/Agosto, in una fase ribassista.
Purtroppo nessuna strategia funziona come si vorrebbe, il mercato, nonostante sia ciclico, nel breve periodo è comunque imprevedibile. I timeframe bassi, ovviamente, comportano un maggiore numero di falsi segnali.
Solo col tempo e moltissime prove si possino affinare le strategie.
Ho inserito il codice che mi hai indicato, ma non mi sembra funzionare. Dove sto sbagliando ?
Grazie.
// Definizione dei parametri del codice
DEFPARAM CumulateOrders = False // Posizioni cumulate disattivate
//DEFPARAM FLATBEFORE = 080000
//DEFPARAM FLATAFTER = 220000
startBreakeven = 35 //how much pips/points in gain to activate the breakeven function?
PointsToKeep = 1 //how much pips/points to keep in profit above of below our entry price when the breakeven is activated (beware of spread)
//Definizione variabili MACD Long
ONCE Macd1 = 12 //12
ONCE Macd2 = 26 //26
ONCE Macd3 = 9 //9
//Definizione variabili MACD Short
ONCE Macd4 = 12 //12
ONCE Macd5 = 26 //26
ONCE Macd6 = 9 //9
//Cross OVER
ONCE crover = 3 //3
//Cross UNDER
ONCE crunder = 9 //9
//Exit Long
ONCE exlong = 4 //4
//Exit Short
ONCE exshort = 6 //6
//Stop Loss
ONCE stploss = 13 //13
ONCE avrtrangeloss = 8 //8
//Target Profit
ONCE tarprof = 14 //14
ONCE avrtrangeprofit = 13 //13
//Contratti
c = 1
//reset the breakevenLevel when no trade are on market
IF NOT ONMARKET THEN
breakevenLevel=0
ENDIF
// --- BUY SIDE ---
//test if the price have moved favourably of "startBreakeven" points already
IF LONGONMARKET AND close-tradeprice(1)>=startBreakeven*pipsize THEN
//calculate the breakevenLevel
breakevenLevel = tradeprice(1)+PointsToKeep*pipsize
ENDIF
//place the new stop orders on market at breakevenLevel
IF breakevenLevel>0 THEN
SELL AT breakevenLevel STOP
ENDIF
// --- end of BUY SIDE ---
// Condizioni per entrare su posizioni long
indicator1 = MACD[Macd1,Macd2,Macd3](close)
c1 = (indicator1 >= 0)
indicator2 = MACDline[Macd1,Macd2,Macd3](close)
c2 = (indicator2 CROSSES OVER crover) //3
IF c1 AND c2 THEN
BUY c CONTRACT AT MARKET
ENDIF
// Condizioni per uscire da posizioni long
indicator3 = MACD[Macd1,Macd2,Macd3](close)
c3 = (indicator3 <= -exlong) //-4
IF c3 THEN
SELL AT MARKET
ENDIF
// Condizioni per entrare su posizioni Short
indicator4 = MACD[Macd4,Macd5,Macd6](close)
c4 = (indicator4 <= 0)
indicator5 = MACDline[Macd4,Macd5,Macd6](close)
c5 = (indicator5 CROSSES UNDER crunder) //10
IF c4 AND c5 THEN
SELL AT MARKET
ENDIF
// Condizioni per uscire da posizioni long
indicator6 = MACD[Macd4,Macd5,Macd6](close)
c6 = (indicator6 >= exshort) //6
IF c6 THEN
SELL AT MARKET
ENDIF
// Loss, Profit
SET STOP LOSS stploss*AverageTrueRange[avrtrangeloss](close) //8
SET TARGET PROFIT tarprof*AverageTrueRange[avrtrangeprofit](close) //13
Come puoi notare dal codice, quello nel link è solo per i LONG, nella stessa pagina, poco sotto, c’è un’aggiunta fatta da EDUARDO per gli SHORT. Comunque ti allego la versione completa:
//******************************************************************************************************
startBreakeven = 30 //30 pips in gain to activate the breakeven function?
PointsToKeep = 5 //5 pips to keep in profit above/below entry price when the breakeven is activated
//
// test if the price have moved favourably of "startBreakeven" points already
//reset the breakevenLevel when no trade are on market
IF NOT ONMARKET THEN
breakevenLevel=0
ENDIF
//
// --- LONG side
IF LONGONMARKET AND (close - tradeprice(1)) >= (startBreakeven * pipsize) THEN
breakevenLevel = tradeprice(1) + (PointsToKeep * pipsize) //calculate the breakevenLevel
//place the new stop orders on market at breakevenLevel
IF breakevenLevel > 0 THEN
SELL AT breakevenLevel STOP
ENDIF
ENDIF
// --- SHORT side
IF SHORTONMARKET AND (tradeprice(1) - close) >= (startBreakeven * pipsize) THEN
breakevenLevel = tradeprice(1) + (PointsToKeep * pipsize) //calculate the breakevenLevel
//place the new stop orders on market at breakevenLevel
IF breakevenLevel > 0 THEN
EXITSHORT AT breakevenLevel STOP
ENDIF
ENDIF
//******************************************************************************************************
Mentre stavi scrivendo ho fatto una correzione.
Rifai il copia e incolla.