Allora ad occhio credo ci sia ancora qualcosa che non torna, immagine allegata
Si vede bene che il pattern a sinistra è identificato correttamente, il conteggio ed il limite di barre funzionano, c’è quindi l’entry come da regole ma l’uscita è prematura. E secondo me ho anche capito perchè. Esce alla identificazione di un pattern uguale successivo (immagine con numerino 2 sulla candela) invece di rispettare la rule di exit che dovrebbe invece portare il trade fino al tocco del livello della open della candela 1.
Possibile che questo apparente accavallarsi di pattern non ben filtrati poi impedisca al sistema di andare short?
Sembrerebbe inoltre che il “Conto” nelle opportunità short non “funzionerebbe” a dovere
Altra immagine; “MyProfitShort” segnala l’identificazione del pattern (candela 1) ma poi il Conto fallisce (piu di 7 barre non conteggiate e nessuna apertura trade con target che punta alla open della candela verde num 1 – “MyProfitShort”)
No, il pattern 2 non è uguale al pattern 1, ma contrario.
Quando è uguale è chiaro che cambia il prezzo ed il conteggio riparte.
Quando ci sono due pattern diversi che deve fare, tenere due conteggi di barre separati, oppure al secondo pattern trovato deve azzerare il primo?
Tenere 2 conteggi di barre separati sarebbe meglio, cosi per entrambi se le condizioni sono rispettate possono essere aperti i 2 trade (in momenti successivi) a patto però che ci sia comunque un cumulateorder = false.
Tuttavia è necessario che i takeprofit vengano rispettati, sia che ci sia sovrapposizione di pattern identici sia opposti. Una volta entrato in posizione i livelli MyProfit sono gli unici che possono chiudere il trade.
Prova queste modifiche:
DEFPARAM Cumulateorders=False
ONCE ContoL = 0
ONCE ContoS = 0
ONCE MaxBarre = 7
Bullish = close > open
Bearish = open > close
Body = (abs(open - close) > 0.5 * pipsize)
UpperSHGreen = High > Close
LowerSHRed = Low < Close
//------ Trading Periods Parameters
If Not OnMarket AND OnMarket[1] Then
ContoL = 0
ContoS = 0
MyProfitLong = 0
MyProfitShort = 0
Endif
If (Time >=153000 AND Time <=154000) OR (Time < 091500 OR Time > 210000)OR (Month = 12 AND Day > 15) OR (Month = 8 AND Day >10) THEN
NoPattern = 1
ContoL = 0
ContoS = 0
MyProfitLong = 0
MyProfitShort = 0
ELSE
NoPattern = 0
ENDIF
//----- Counter Bars per apertura posizione
// verificare che, se il Conto è già iniziato, non abbia superato la soglia o che il prezzo non abbia toccato MyTarget
IF ContoL > 0 Then
ContoL = ContoL + 1
IF Not OnMarket Then
If ContoL > MaxBarre Or high >= MyProfitLong Then
ContoL = 0
MyProfitLong = 0
Endif
Endif
Endif
IF ContoS > 0 Then
ContoS = ContoS + 1
IF Not OnMarket Then
If ContoS > MaxBarre Or high >= MyProfitShort Then
ContoS = 0
MyProfitShort = 0
Endif
Endif
Endif
// ----- ombra assente sull'Apertura - identificazione PATTERN
IF Bullish[1] and Bearish and (Open=High) and (Body[1]) AND LowerSHRed AND (NoPattern=0) THEN
//RedNSH=1
MyProfitLong=Open
ContoL = 1
//ELSE
//RedNSH=0
ENDIF
IF Bearish[1] and Bullish and (Open=Low) and (Body[1]) AND UpperSHGreen AND (NoPattern=0)THEN
//GreenNSH=1
MyProfitShort=Open
ContoS = 1
//ELSE
//GreenNSH=0
ENDIF
// una volta a mercato azzerare il conteggio e azzerare MyProfitLong/MyProfitShort
If OnMarket Then
ContoL = 0
ContoS = 0
//MyProfitLong = 0
//MyProfitShort = 0
Endif
// quando si verificano le condizioni settare MyProfitLOng/MyProfitShort ed iniziare il conteggio
//If (GreenNSH=1) then
//MyProfitShort = Open[0]
//ContoL = 1
//ELSIF (RedNSH=1) then
//MyProfitLong = Open[0]
//ContoL = 1
//Endif
// entrare a mercato se già non lo si è, se il conteggio è pari alla soglia e se MyProfitLong/MYProfitShort non sono stati toccati
IF Not OnMarket THEN
If MyProfitLong > 0 AND ContoL = MaxBarre Then
Buy 1 Contracts at market
ENDIF
IF MyProfitShort > 0 AND ContoS = MaxBarre Then
SellShort 1 Contracts at market
ENDIF
ENDIF
//----- Trade Closing Conditions
IF LONGONMARKET THEN
SELL AT MyProfitLong Limit
ELSIF SHORTONMARKET THEN
EXITSHORT AT MyProfitShort Limit
ENDIF
IF ONMARKET AND (BarIndex - TradeIndex >= 40) then
EXITSHORT AT MARKET
SELL AT MARKET
ENDIF
graph NoPattern
graphonprice MyProfitLong coloured(0,0,255,255)
graphonprice MyProfitShort coloured(0,255,0,255)
graph ContoL
graph ContoS
graph MaxBarre
graph OnMarket
se ricontri problemi fammi sapere in quale candela (orario e giorno) l’hai riscontrato.
Slve Roberto
Anzitutto un sentito ringraziamento per l’aiuto.
Allora la buona notizia è che ho risolto il problema della mancanza dei trade short. C’era un “high” al posto di un “low” in riga 49 e adesso il sistema apre anche short.
Tuttavia, se ho ben capito la logica di impostazione dello script, il codice (se le condizioni di orario e giorni/mesi sono rispettate) deve iniziare il Conto S o L ogni qualvolta ci sia l’identificazione di un pattern. Eventualmente poi, se il MyProfitShort o Long non vengono toccati entro le successive MaxBars, si apre il trade.
Adesso, mi corregga se sbaglio, ma io vedo che il codice continua a identificare correttamente tutti i pattern ma che a volte (non sempre) fa partire il “Conto” ma poi lo arresta immediatamente alla barra successiva (anche se le condizioni rimangono valide). Un esempio è quello in allegato. In particolare sull’esatta identificazione del secondo pattern in blu, è chiaro come in quel caso il MyProfitLong (che è pari alla Open della candela come da riga 59 del codice) non venga violato successivamente e le altre condizioni di orario/giorni sono già rispettate.
Ho malinterpretato io oppure c’è ancora qualcosa da sistemare?
Comunque sia ho ripensato al discorso del conteggio separato e credo sia inutile perchè poi lo script non può andare a controllare oltre le 7 barre se un pattern è invalidato. Quindi io le chiederei in ultimo di fare cosi:
Analisi pattern–>se identificato iniziare il conteggio per ContoL/S e maxbars ed eventualmente entrare in posizione se MyProfitLong/Short non viene violato entro 7 barre. Ciò che accade in termini di ulteriori pattern durante il conteggio delle 7 barre non ci interessa. Ricominciare invece a conteggiare dopo l’uscita dal trade.
Con questo non la disturberò piu, credo di aver imparato abbastanza 🙂
Ecco una cosa da precisare, una volta che il conteggio è iniziato, se viene trovato un pattern uguale si riparte dal nuovo pattern o si ignora e si aspetta che termini il conteggio?
Come l’ho scritto adesso riparte dal nuovo pattern.
Perfetto allora aspettare il termine del conteggio mi pare piu razionale e in linea con quello che poi devo modificare successivamente (tutto ciò è parte integrante di un sistema un pò piu lungo che sto costruendo)
Pertanto si parte col conteggio in base al parametro maxbars e se ci sono le condizioni (livelli “myprofit” non violati entro il numero specificato in “maxbars”) si apre il trade. Una volta invece che vengono violati i livelli “myprofit” oppure dopo che si chiude il trade, il sistema ricomincia il conteggio.
Chiedo scusa per l’incomprensione
Bene, questo è il codice con la modifica per cui si ignorano i nuovi pattern fino a che il precedente è valido (le istruzioni GRAPH/GRAPHONPRICE alla fine puoi toglierle o commentarle se non ti servono più):
DEFPARAM Cumulateorders=False
ONCE ContoL = 0
ONCE ContoS = 0
ONCE MaxBarre = 7
Bullish = close > open
Bearish = open > close
Body = (abs(open - close) > 0.5 * pipsize)
UpperSHGreen = High > Close
LowerSHRed = Low < Close
//------ Trading Periods Parameters
If Not OnMarket AND OnMarket[1] Then
ContoL = 0
ContoS = 0
MyProfitLong = 0
MyProfitShort = 0
Endif
If (Time >=153000 AND Time <=154000) OR (Time < 091500 OR Time > 210000)OR (Month = 12 AND Day > 15) OR (Month = 8 AND Day >10) THEN
NoPattern = 1
ContoL = 0
ContoS = 0
MyProfitLong = 0
MyProfitShort = 0
ELSE
NoPattern = 0
ENDIF
//----- Counter Bars per apertura posizione
// verificare che, se il Conto è già iniziato, non abbia superato la soglia o che il prezzo non abbia toccato MyTarget
IF ContoL > 0 Then
ContoL = ContoL + 1
IF Not OnMarket Then
If ContoL > MaxBarre Or high >= MyProfitLong Then
ContoL = 0
MyProfitLong = 0
Endif
Endif
Endif
IF ContoS > 0 Then
ContoS = ContoS + 1
IF Not OnMarket Then
If ContoS > MaxBarre Or high >= MyProfitShort Then
ContoS = 0
MyProfitShort = 0
Endif
Endif
Endif
// ----- ombra assente sull'Apertura - identificazione PATTERN
IF Bullish[1] and Bearish and (Open=High) and (Body[1]) AND LowerSHRed AND (NoPattern=0) AND MyProfitLong = 0 THEN
//RedNSH=1
MyProfitLong=Open
ContoL = 1
//ELSE
//RedNSH=0
ENDIF
IF Bearish[1] and Bullish and (Open=Low) and (Body[1]) AND UpperSHGreen AND (NoPattern=0)AND MyProfitShort = 0 THEN
//GreenNSH=1
MyProfitShort=Open
ContoS = 1
//ELSE
//GreenNSH=0
ENDIF
// una volta a mercato azzerare il conteggio e azzerare MyProfitLong/MyProfitShort
If OnMarket Then
ContoL = 0
ContoS = 0
//MyProfitLong = 0
//MyProfitShort = 0
Endif
// quando si verificano le condizioni settare MyProfitLOng/MyProfitShort ed iniziare il conteggio
//If (GreenNSH=1) then
//MyProfitShort = Open[0]
//ContoL = 1
//ELSIF (RedNSH=1) then
//MyProfitLong = Open[0]
//ContoL = 1
//Endif
// entrare a mercato se già non lo si è, se il conteggio è pari alla soglia e se MyProfitLong/MYProfitShort non sono stati toccati
IF Not OnMarket THEN
If MyProfitLong > 0 AND ContoL = MaxBarre Then
Buy 1 Contracts at market
ENDIF
IF MyProfitShort > 0 AND ContoS = MaxBarre Then
SellShort 1 Contracts at market
ENDIF
ENDIF
//----- Trade Closing Conditions
IF LONGONMARKET THEN
SELL AT MyProfitLong Limit
ELSIF SHORTONMARKET THEN
EXITSHORT AT MyProfitShort Limit
ENDIF
IF ONMARKET AND (BarIndex - TradeIndex >= 40) then
EXITSHORT AT MARKET
SELL AT MARKET
ENDIF
graph NoPattern
graphonprice MyProfitLong coloured(0,0,255,255)
graphonprice MyProfitShort coloured(0,255,0,255)
graph ContoL
graph ContoS
graph MaxBarre
graph OnMarket
Ho scritto un indicatore per vedere chiaramente sul grafico quando i pattern si verificano in modo da controllare se la strategia apre correttamente le operazioni (vedi schermata con evidenziato in basso l’indicatore dove ho mi sono impostato le proprietà come istogramma do due colori), ti allego il file per l’importazione.