Buongiorno a tutti,
allego una strategia su petrolio realizzata mixando parte di alcuni codici trovati sul forum per cui ringrazio molto gli autori.
La strategia gira su timeframe 10 minuti, ma vorrei fare delle prove per l’ottimizzazione del trailing stop a 1 minuto, ma su 1 minuto ottengo pochissime entrate a mercato e completamente diverse dal timeframe a 10 minuti.
Come mai? Il codice non dovrebbe dare esattamente gli stessi segnali di entrata e poi eventualmente gestire diversamente le uscite in base al trailing stop su 10M o 1M?
Ringrazio anticipatamente per i chiarimenti e per eventuali implementazioni per migliorare il sistema.
//-------------------------------------------------------------------------
// Codice principale : 2023 USCrude10M-1m CrossAver V2
//-------------------------------------------------------------------------
//-------------------------------------------------------------------------
DEFPARAM cumulateOrders = False // Cumulating positions deactivate
defparam preloadbars=1000
ONCE enc2 = 28.0
ONCE enc3 = 22.0
ONCE slL = 190.0
ONCE slS = 310.0
ONCE stp2 = 60.0
ONCE stp3 = 90.0
ONCE ts = 30.0
ONCE tsp = 2.0
timeframe(10 minutes, updateonclose)
once StartE = 5000 //start time for opening positions
once StartL = 203000 //ending time for opening positions (only trading in the morning)
once N = 1 // number of contracts
once Period = 15 //period1 // // set fixed to limit possible combinations of optimisations
once Period2 = 15 // period2 second set of 69 averages // // set fixed to limit possible combinations of optimisations
//once r2= 50
Series = (open+high+low+Close)/4 // kind of close of a bar
Seriesv2 = (open+high+low+Close)/4 // kind of close of a bar
OTD = Barindex - TradeIndex(3) > IntradayBarIndex
//---------------------------------------
AFR = -0.02232324*Series[0]+0.02268676*Series[1]+0.08389067*Series[2]+0.14630380*Series[3]+0.19282649*Series[4]+0.21002638*Series[5]+0.19282649*Series[6]+0.14630380*Series[7]+0.08389067*Series[8]+0.02268676*Series[9]-0.02232324*Series[10]-0.04296564*Series[11]-0.03980614*Series[12]-0.02082171*Series[13]+0.00243636*Series[14]+0.01950580*Series[15]+0.02460929*Series[16]+0.01799295*Series[17]+0.00470540*Series[18]-0.00831985*Series[19]-0.01544722*Series[20]-0.01456262*Series[21]-0.00733980*Series[22]+0.00201852*Series[23]+0.00902504*Series[24]+0.01093067*Series[25]+0.00766099*Series[26]+0.00145478*Series[27]-0.00447175*Series[28]-0.00750446*Series[29]-0.00671646*Series[30]-0.00304016*Series[31]+0.00143433*Series[32]+0.00457475*Series[33]+0.00517589*Series[34]+0.00336708*Series[35]+0.00034406*Series[36]-0.00233637*Series[37]-0.00352280*Series[38]-0.00293522*Series[39]-0.00114249*Series[40]+0.00083536*Series[41]+0.00215524*Series[42]+0.00604133*Series[43]-0.00013046*Series[44]
//-----------------------------------------------
Period2 = MAX(Period2, 1)
NumBars = 4
LR = LinearRegression[NumBars](Seriesv2)
AFRV2 = ExponentialAverage[Period2](LR)
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
LongFilter = ((dclose(1)<(dclose(2)-dclose(2)*0.5*0.01))) and ((Dopen(0)-dlow(0))>((dopen(1)-dlow(1))*3))=0
ShortFilter= abs(dopen(5)-dclose(1))>0.5*(Dhigh(5)-dlow(1)) and (dclose(1)<dclose(2) and dclose(2)<dclose(3) and dopen(0)<dclose(1))=0
/////////////////////////////////////
wAFR = exponentialaverage[30](AFR) ///for smoothing the AFR, to reduce market noice
wAFRv2 = exponentialaverage[30](AFRv2) ///for smoothing the AFRv2, to reduce market noice
RsiLong = Rsi[14](close) < 47
RsiShort = Rsi[14](close) > 24
if time >= StartE And time <= StartL and OTD and longfilter then //and not onmarket then
IF wAFR > wAFRv2 and wAFR[1] < wAFRv2[1] And RsiLong then
buy 1 contract AT MARKET
SET STOP PLOSS sll//180
elsif wAFR < wAFRv2 and wAFR[1] > wAFRv2[1] And RsiShort and Shortfilter then
sellshort 1 contract at market
SET STOP PLOSS sls//300
endif
endif
//_________________________________________________________________________________________________________________________________
timeframe (default)
IF TS<>0 THEN
//trailing stop function
IF NOT ONMARKET THEN
TrailingStart = TS //20 trailing will start @trailinstart points profit
TrailingStep = tsp //5 trailing step to move the "stoploss"
Distance = 50 //7 pips Distance from caurrent price (if required by the broker)
PointsToKeep = 1 //1 pips to be gained when breakeven is set
newSL = 0 //reset the stoploss value
Step2 = stp2//60
Encr2 = Enc2//15
Step3 = Stp3//90
Encr3 = Enc3//10
ELSE
Pips = PositionPerf * PositionPrice / PipSize
IF (Pips >= Step2) THEN //15 punti di step dopo 60 di profitto
TrailingStep = Encr2
ENDIF
IF (Pips >= step3) THEN //30 punti di step dopo 120 di profitto
TrailingStep = Encr3
ENDIF
ENDIF
IF (BarIndex - TradeIndex) >= 0 THEN //0
//manage long positions
IF LONGONMARKET THEN
//first move (breakeven)
IF newSL=0 AND high-TradePrice(1)>=(TrailingStart*PipSize+PointsToKeep*PipSize) THEN
newSL = TradePrice(1)+TrailingStep*PipSize+PointsToKeep*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)-low>=(TrailingStart*PipSize+PointsToKeep*PipSize) THEN
newSL = TradePrice(1)-TrailingStep*PipSize+PointsToKeep*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
IF LongOnMarket THEN
IF (close + Distance) > newSL THEN
SELL AT newSL STOP
ELSIF (close - Distance) < newSL THEN
SELL AT newSL LIMIT
ELSE
SELL AT Market
ENDIF
ELSIF ShortOnmarket THEN
IF (close + Distance) < newSL THEN
EXITSHORT AT newSL STOP
ELSIF (close - Distance) > newSL THEN
EXITSHORT AT newSL LIMIT
ELSE
EXITSHORT AT Market
ENDIF
ENDIF
ENDIF
ENDIF
//**************************************
ENDIF
Dalle tue foto non si capisce bene quale siano i TF usati, le unità ed il periodo di backtest.
Ad ogni modo, ciascun timeframe produce risultati diversi, indipendentemente che all’interno tu abbia codificato le condizioni sullo stesso TF (10 minuti), per i seguenti motivi:
ogni TF ha uno storico diverso, 10K unità di 10 minuti sono diverse da 10K unità di 1 minuto, ecc…
Il trailing stop su TF più bassi fa in modo che alcune operazioni escano prima che su un TF più alto, per cui possono essere aperte posizioni diverse in quanto su quello più alto ci può essere un’operazione in corso, mentre su quello basso, venendo chiusa prima un’operazione, la strategia ha il tempo per aprirne un’altra, se ci sono le condizioni.
Inoltre il TS se l’hai ottimizzato per il 10 minuti, su 1 minuto darà risultati diversi, e viceversa.
Inoltre utilizzi Dclose, Dhigh ecc… che fanno riferimento ai dati giornalieri passati, una barra giornaliera necessita di 1440 barre di 1 minuto, oppure 288 di 5 minuti o 144 da 10 minuti.
Non è possibile fare confronti efficaci.
Grazie Roberto per la celerissima risposta, allego nuove immagini per chiarire meglio.
Nelle immagini ho utilizzato 200 K barre a 1 minuto che partono da luglio 2022 e lo stesso periodo di partenza per le barre a 10 minuti.
Non mi spiego come nel grafico delle barre a 1 minuto, dove teoroicamente ci dovrebbero essere più operazioni, ce ne sono molto meno e in alcuni mesi non entra a mercato.
Grazie
Devi mettere entrambi i grafici, sia del 10 minuti che di 1 minuto, fare i backtest su ciascuno (dalle stesse date, iniziale e finale) e verificare se le condizioni di entrata sono valide in entrambi i grafici nello stesso momento.
Roberto scusa se ti stolkerizzo, ho fatto esattamente come dici tu. Ho eseguito il backtest su 2 grafici che iniziano e finiscono nelle stesse date (inizio 18 Luglio 2022 fine a ultima data), le condizioni di entrata del grafico a 1 minuto dovrebbero essere esattamente quelle del 10 minuti, non avendo variato nulla nel codice e in particolare nella parte di codice relativa al timeframe 10 minuti dove sono inserite. Cosa mi sfugge? Cosa impedisce al sistema di aprire le posizioni eseguendone solo 4 al posto di 80?
Grazie
Spostala riga 26 (dove c’è OTD) immediatamente PRIMA della 15 (dopo tutti le righe con ONCE) in modo che sia all’interno del timeframe di default. Una curiosità, perché per OTD usi (3) invece di niente, oppure di (1)?
C’è anche, secondo me, da spostare ENDIF della riga 77 alla riga immediatamante successiva alla 121.
La riga 78 funziona anche così, se c’è 0, ma sarebbe meglio spostarla tra la la 69 e la 70.
Grande Roberto!!
Il problema era OTD = Barindex – TradeIndex(3) > IntradayBarIndex impostato a 3, codice copiato che limitava a 3 operazioni al giorno ma che aveva probabilmente senso su altri timeframes.
Ho spostato e impostato la linea di codice otd con TradeIndex(0) e ora funziona correttamente!
Ho spostato anche l’endif.
Grazie mille, hai visto subito il problema, sei un mago.