ProRealCode - Trading & Coding with ProRealTime™
Buongiorno stavo testando una strategia sui cinque minuti e vorrei inserire uno stop loss e un take profit con l’aiuto dell’ATR (7 periodi) più precisamente vorrei che lo stop loss ad esempio fosse la metà o anche un terzo del’atr (dato che nel timeframe 5 minuti comunque risulta molto grande) e che il take profit fosse 3 volte lo stop loss, ho visto molti codici in giro ma alcuni erano anche molto complessi e non rispecchiavano le mie condizioni qualcuno mi potrebbe aiutare? Grazie
Eccolo:
IF MieCondizioniLong THEN
BUY 1 CONTRACT AT MARKET
SL = AverageTrueRange[7](close) / 3
TP = SL * 3
SET TARGET PROFIT TP
SET STOP LOSS SL
ENDIF
// Definizione dei parametri del codice
DEFPARAM CumulateOrders = True // Posizioni cumulate disattivate
// Il sistema cancellerà tutti gli ordini in attesa e chiuderà tutte le posizioni a 0:00. Dopo l’orario "Flat Before" non saranno piazzati nuovi ordini o posizioni.
DEFPARAM FLATBEFORE = 000000
// Cancellare tutti gli ordini in attesa e chiudere tutte le posizioni all’orario "Flat After"
DEFPARAM FLATAFTER = 235900
//
TIMEFRAME(default)
// Impedisce al sistema di tradare in giorni specifici della settimana
daysForbiddenEntry = OpenDayOfWeek = 6 OR OpenDayOfWeek = 0
// Condizioni per entrare su posizioni long
indicator1 = Average[3](Stochastic[5,3](close))
c1 = (indicator1 CROSSES OVER 20)
//
TIMEFRAME(1 hour,default)
indicator2 = ExponentialAverage[9](close)
indicator3 = ExponentialAverage[21](close)
c2 = (indicator2[1] > indicator3[1])
//
TIMEFRAME(default)
IF (c1 AND c2) AND not daysForbiddenEntry THEN
BUY 1 SHARES AT MARKET
ENDIF
// Condizioni per entrare su posizioni short
indicator4 = Average[3](Stochastic[5,3](close))
c3 = (indicator4 CROSSES UNDER 80)
//
TIMEFRAME(1 hour,default)
indicator5 = ExponentialAverage[9](close)
indicator6 = ExponentialAverage[21](close)
c4 = (indicator5[1] < indicator6[1])
//
TIMEFRAME(default)
IF (c3 AND c4) AND not daysForbiddenEntry THEN
SELLSHORT 1 SHARES AT MARKET
ENDIF
TIMEFRAME (5minute,upDateOnClose)
//************************************************************************
//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
//************************************************************************
// Stop e target
IF (c1 AND c2)And not OnMarket THEN
BUY 1 CONTRACT AT MARKET
SL = AverageTrueRange[7](close) / 3
TP = SL * 3
SET TARGET PROFIT TP
SET STOP LOSS SL
ENDIF
Credo ci sia qualche problema, riscrivo le condizioni della strategia per fare in modo che sia più chiaro possibile, Si svolge su due timeframe h1 dove ci sono le due medie mobili esponenziali a 9 e 21 periodi e al timeframe 5 minuti dove c’è lo stocastico, vorrei che le posizioni siano cumulative cioè anche se una già è aperta ne deve aprire altre, le condizioni di ingresso long che la media 9 periodi si trovi sopra alla media a 21 periodi nel time frame h1 ( però deve considerare le chiusura nel time frame a 5 minuti sennò mi apre posizioni dal verso sbagliato anche se al termine della candela oraria non si è verificato l’incrocio)e che lo stocastico incroci al rialzo il valore 20 mentre entrata short che la media a 9 periodi sia al di sotto della media a 21 periodi e che lo stocastico incroci al ribasso il valore 80, per chiudere le posizioni si deve considerare il valore numerico dell’atr ( a 7 periodi)all’apertura della posizione e vorrei che quel valore fosse diviso per 5 per lo stop loss, per quanto riguarda il take profit vorrei che fosse 3 volte lo stop loss, l’atr non mi deve seguire la posizione ma deve solo darmi il valore numerico in quel momento per decidere stop loss e take profit, grazie per chi mi aiuterà.
Questo dovrebbe andare:
// Definizione dei parametri del codice
DEFPARAM CumulateOrders = True // Posizioni cumulate disattivate
// Il sistema cancellerà tutti gli ordini in attesa e chiuderà tutte le posizioni a 0:00. Dopo l’orario "Flat Before" non saranno piazzati nuovi ordini o posizioni.
DEFPARAM FLATBEFORE = 000000
// Cancellare tutti gli ordini in attesa e chiudere tutte le posizioni all’orario "Flat After"
DEFPARAM FLATAFTER = 235900
//
TIMEFRAME(default)
// Impedisce al sistema di tradare in giorni specifici della settimana
daysForbiddenEntry = OpenDayOfWeek = 6 OR OpenDayOfWeek = 0
IF Not OnMarket THEN
SL = 0
TP = 0
ENDIF
// Condizioni per entrare su posizioni long
indicator1 = Average[3](Stochastic[5,3](close))
c1 = (indicator1 CROSSES OVER 20)
//
TIMEFRAME(1 hour,default)
indicator2 = ExponentialAverage[9](close)
indicator3 = ExponentialAverage[21](close)
c2 = (indicator2[1] > indicator3[1])
//
TIMEFRAME(default)
IF (c1 AND c2) AND not daysForbiddenEntry THEN
IF SL = 0 OR ShortOnMarket THEN
SL = AverageTrueRange[7](close) / 3
TP = SL * 3
ENDIF
BUY 1 SHARES AT MARKET
SET TARGET PROFIT TP
SET STOP LOSS SL
ENDIF
// Condizioni per entrare su posizioni short
indicator4 = Average[3](Stochastic[5,3](close))
c3 = (indicator4 CROSSES UNDER 80)
//
TIMEFRAME(1 hour,default)
indicator5 = ExponentialAverage[9](close)
indicator6 = ExponentialAverage[21](close)
c4 = (indicator5[1] < indicator6[1])
//
TIMEFRAME(default)
IF (c3 AND c4) AND not daysForbiddenEntry THEN
IF SL = 0 OR LongOnMarket THEN
SL = AverageTrueRange[7](close) / 3
TP = SL * 3
ENDIF
SELLSHORT 1 SHARES AT MARKET
SET TARGET PROFIT TP
SET STOP LOSS SL
ENDIF
TIMEFRAME (5minute,upDateOnClose)
//************************************************************************
//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
Se riscontri errori, indica:
in modo che possa replicare le operazioni.
// Definizione dei parametri del codice
DEFPARAM CumulateOrders = True // Posizioni cumulate attivate
// Il sistema cancellerà tutti gli ordini in attesa e chiuderà tutte le posizioni a 0:00. Dopo l’orario "Flat Before" non saranno piazzati nuovi ordini o posizioni.
DEFPARAM FLATBEFORE = 000000
// Cancellare tutti gli ordini in attesa e chiudere tutte le posizioni all’orario "Flat After"
DEFPARAM FLATAFTER = 235900
//
TIMEFRAME(default)
// Impedisce al sistema di tradare in giorni specifici della settimana
daysForbiddenEntry = OpenDayOfWeek = 6 OR OpenDayOfWeek = 0
IF Not OnMarket THEN
SL = 0
TP = 0
ENDIF
// Condizioni per entrare su posizioni long
indicator1 = Average[3](Stochastic[5,3](close))
c1 = (indicator1 CROSSES OVER 20)
//
TIMEFRAME(1 hour,default)
indicator2 = ExponentialAverage[9](close)
indicator3 = ExponentialAverage[21](close)
c2 = (indicator2[1] > indicator3[1])
//
TIMEFRAME(default)
IF (c1 AND c2) AND not daysForbiddenEntry THEN
IF SL = 0 OR ShortOnMarket THEN
SL = AverageTrueRange[7](close) / 6
TP = SL * 3
ENDIF
BUY 1 SHARES AT MARKET
SET TARGET PROFIT TP
SET STOP LOSS SL
ENDIF
// Condizioni per entrare su posizioni short
indicator4 = Average[3](Stochastic[5,3](close))
c3 = (indicator4 CROSSES UNDER 80)
//
TIMEFRAME(1 hour,default)
indicator5 = ExponentialAverage[9](close)
indicator6 = ExponentialAverage[21](close)
c4 = (indicator5[1] < indicator6[1])
//
TIMEFRAME(default)
IF (c3 AND c4) AND not daysForbiddenEntry THEN
IF SL = 0 OR LongOnMarket THEN
SL = AverageTrueRange[7](close) / 6
TP = SL * 3
ENDIF
SELLSHORT 1 SHARES AT MARKET
SET TARGET PROFIT TP
SET STOP LOSS SL
ENDIF
TIMEFRAME (5minute,upDateOnClose)
//************************************************************************
//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
Strumento:Eur/usd
errore nella candela martedi 25 agosto 0:35
Ho cambiato lo stop loss ho messo atr/6, da quanto vedo lo stop loss dovrebbe essere 19/6=3.2 pips e quindi take profit 9.6 ma apre e chiude la posizione nello stesso momento e l ho notato sempre su eur/usd quella dopo alle 02:00 che nonostante i 4.2 pips me l’apre e chiude nella stessa candela sbagliando
Basta che aggiungi, alla fine del codice:
Graph TP coloured(0,0,255,255)
Graph SL coloured(255,0,0,255)
per vedere, nel riquadro delle variabili del backtest, i loro valori candela per candela.
Credo tu stia utilizzando valori troppo piccoli, verifica i requisiti minimi, sia dello stop che del take profit, col broker.
SAi dove posso trovare questi requisiti,ho cercato sul broker ig e anche sulle domande ma non ho trovato niente
La cosa migliore è provare ad inserire un ordine di vendita ed anche uno di acquisto dalla piattaforma IG, SENZA dare la conferma.
Vedi foto allegata, sul DAX € 25, lo SL minimo richisto è 5 punti, mentre il TP sembra non abbia limiti minimi.
Tieni sempre presente che i limiti (SL, TP e Margini) generalmente cambiano:
Si ho controllato e su eur/Usd è di 2 punti quindi 2 pips, e il mio stop loss anche quelle che abbiamo controllato non va mai sono i 2 pips, quindi non è quello
Quale TF hai usato?
Quello a 5 minuti
Secondo me il problema sta nel atr prima quando mettevo stop e profit fissi andava bene,ma non so potrebbe mettere le istruzioni del atr solo periodo e valore da prendere?tralasciando il resto?
Ti avevo suggerito di aggiungere quelle due righe per le verifiche, ma forse non l’hai fatto o le hai interpretate male.
Come vedi dalla foto lo SL è di 1,2 pips. In alcuni casi addirittura 0,9. Ricorda che il prezzo standard delle valute (tipo EurUsd) viene espresso con 4 decimali, dove l’ultimo decimale rappresenta 1 pip (1/10000esimo). Mentre ormai da molti anni è stata aggiunta la 5a cifra decimale che vale 1/10mo di pip.
Quindi se tu vedi 12, non sono 12 pips, bensì 1,2.
Forse è più chiaro se quelle due righe le scrivi così:
Graph TP/pipsize coloured(0,0,255,255)
Graph SL/pipsize coloured(255,0,0,255)
// Definizione dei parametri del codice
DEFPARAM CumulateOrders = True // Posizioni cumulate attivate
// Il sistema cancellerà tutti gli ordini in attesa e chiuderà tutte le posizioni a 0:00. Dopo l’orario "Flat Before" non saranno piazzati nuovi ordini o posizioni.
DEFPARAM FLATBEFORE = 000000
// Cancellare tutti gli ordini in attesa e chiudere tutte le posizioni all’orario "Flat After"
DEFPARAM FLATAFTER = 235900
//
TIMEFRAME(default)
// Impedisce al sistema di tradare in giorni specifici della settimana
daysForbiddenEntry = OpenDayOfWeek = 6 OR OpenDayOfWeek = 0
IF Not OnMarket THEN
SL = 0
TP = 0
ENDIF
// Condizioni per entrare su posizioni long
indicator1 = Average[3](Stochastic[5,3](close))
c1 = (indicator1 CROSSES OVER 20)
//
TIMEFRAME(1 hour,default)
indicator2 = ExponentialAverage[9](close)
indicator3 = ExponentialAverage[21](close)
c2 = (indicator2[1] > indicator3[1])
//
TIMEFRAME(default)
IF (c1 AND c2) AND not daysForbiddenEntry THEN
IF SL = 0 OR ShortOnMarket THEN
SL = AverageTrueRange[7](close)*30
TP = SL * 3
ENDIF
BUY 1 SHARES AT MARKET
SET TARGET PROFIT TP
SET STOP LOSS SL
ENDIF
// Condizioni per entrare su posizioni short
indicator4 = Average[3](Stochastic[5,3](close))
c3 = (indicator4 CROSSES UNDER 80)
//
TIMEFRAME(1 hour,default)
indicator5 = ExponentialAverage[9](close)
indicator6 = ExponentialAverage[21](close)
c4 = (indicator5[1] < indicator6[1])
//
TIMEFRAME(default)
IF (c3 AND c4) AND not daysForbiddenEntry THEN
IF SL = 0 OR LongOnMarket THEN
SL = AverageTrueRange[7](close) / 6
TP = SL * 3
ENDIF
SELLSHORT 1 SHARES AT MARKET
SET TARGET PROFIT TP
SET STOP LOSS SL
ENDIF
TIMEFRAME (5minute,upDateOnClose)
//************************************************************************
//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
Graph TP/pipsize coloured(0,0,255,255)
Graph SL/pipsize coloured(255,0,0,255)
Ho capito solo ora cosa intendessi infatti ho subito cambiato i valori dell’atr e invece di dividere l ho moltiplicato per esempio a 30,ma sulla foto che ho messo vedo che comunque lo stop loss di quella candela è rimasto fermo a 1.5 sai spiegarmi il motivo in teoria dovrebbe essere circa 2.8
Il problema è DEFPARAM CumulateOrders = True, in quanto cumuli più posizioni e in quel caso lo SL ed il TP sono calcolati sulla media dei prezzi, in quanto ogni posizione ha un suo prezzo, mentre ProOrder può tenere solo un unico SL e TP.
Secondo me ti conviene fare tutti i test mettendo DEFPARAM CumulateOrders = False. Una volta completati i test di correttezza rimetti TRUE.
ATR stop loss e take profit
This topic contains 16 replies,
has 2 voices, and was last updated by
robertogozzi
5 years, 5 months ago.
| Forum: | ProOrder: Trading Automatico & Backtesting |
| Language: | Italian |
| Started: | 08/24/2020 |
| Status: | Active |
| Attachments: | 3 files |
The information collected on this form is stored in a computer file by ProRealCode to create and access your ProRealCode profile. This data is kept in a secure database for the duration of the member's membership. They will be kept as long as you use our services and will be automatically deleted after 3 years of inactivity. Your personal data is used to create your private profile on ProRealCode. This data is maintained by SAS ProRealCode, 407 rue Freycinet, 59151 Arleux, France. If you subscribe to our newsletters, your email address is provided to our service provider "MailChimp" located in the United States, with whom we have signed a confidentiality agreement. This company is also compliant with the EU/Swiss Privacy Shield, and the GDPR. For any request for correction or deletion concerning your data, you can directly contact the ProRealCode team by email at privacy@prorealcode.com If you would like to lodge a complaint regarding the use of your personal data, you can contact your data protection supervisory authority.