Buongiorno,
chiedo aiuto al forum per sapere se è già stata codificata una strategia di trading basata sulla divergenza tra presso e oscillatore (nel mio caso lo stocastico lento).
Qualora non ci fosse, di seguito inserisco i parametri per il trading system con ingressi long e short basati sulla divergenza tra prezzo e stocastico, più due filtri: uno è il MACD, il secondo la trend line.
Preciso che la strategia la utilizzo per tradare indici principalmente su time frame a 5 e 15 minuti.
Di seguito ho allegato una immagine con un esempio di operazione short che dovrebbe scattare in base alle seguenti condizioni. Il segnale short si attiva quando il prezzo ha generato un massimo crescente rispetto al precedente, mentre lo stocastico (che si deve trovare in zona IPERCOMPRATO) genera in corrispondenza del massimo di prezzo un picco di indicatore inferiore rispetto al precedente. In pratica l’oscillatore sta registrando una tendenza ribassista in divergenza con la tendenza rialzista del prezzo.
Infine, il segnale si attiverebbe nel momento in cui il MACD ha incrociato al ribasso, evidenziando il primo istogramma negativo. Il secondo filtro, se si può inserire, si attiverebbe quando il prezzo rompe la trend line rialzista ancorata al minimo di swin che ha generato il trend rialzista in oggetto.
Lo STOP va inserito 2 tick sopra l’ultimo massimo di prezzo che ha generato la divergenza, l’ENTRY scatta dopo che si verificano le condizioni dell’incrocio del MACD e la rottura al ribasso della trendline, mentre il TARGET sul livello di minimo che ha generato il trend rialzista da cui parte la trendline.
Per le operazioni Long valgono tutti i parametri al contrario.
Ringrazio in anticipo chiunque possa aiutarmi nella realizzazione del trading system.
Intanto ho scritto questo:
DEFPARAM CumulateOrders = False
ONCE Segnale = 0
ONCE Macd1 = 12
ONCE Macd2 = 26
ONCE Macd3 = 9
myMACD = Average[Macd1,1](close) - Average[Macd2,1](close)
mySignalLine = Average[Macd3,1](myMACD)
myHisto = myMACD - mySignalLine
//
mySto = Stochastic[14,3](close)
//
ONCE Barre = 50
ONCE Periodi = 14
ONCE ValoreK = 3
ONCE Validita = 1
Divergenza = CALL "Divergenza Stocastico"[Barre, Periodi, ValoreK, Validita](close)
IF Divergenza THEN
IF ((Divergenza > 0) AND (mySto <= 20)) OR ((Divergenza < 0) AND (mySto >= 80)) THEN
Segnale = Divergenza
HH = highest[50](high)
LL = lowest[50](low)
ENDIF
ENDIF
//
IF Not LongOnmarket AND (Segnale > 0) AND (myMACD CROSSES OVER mySignalLine) THEN
BUY 1 Contract at Market
SET STOP PRICE LL - 2*PipSize
SET TARGET PRICE HH
ENDIF
IF Not ShortOnMarket AND (Segnale < 0) AND (myMACD CROSSES UNDER mySignalLine) THEN
SELL 1 Contract at Market
SET STOP PRICE HH + 2*PipSize
SET TARGET PRICE LL
ENDIF
per quanto riguarda la Trend Line, la rottura deve avvenire contemporaneamente all’incrocio del MACD oppure dopo?
Grazie Roberto per questo parte di codice, ma purtroppo non è possibile testare il codice -Divergenza stocastico- non può essere trovata, ci vorrebbe il file itf
Questo è il codice dell’indicatore, ma ho allegato anche il file ITF:
DEFPARAM CalculateOnLastBars = 2000
//NumeroBarre = 50 //40
//Periodi = 14 //14
//ValoreK = 3 //3
//Validita = 1 //1
//Distanza = 10 * pipsize //10 pips
StoK = Stochastic[Periodi,ValoreK](close)
Divergenza = 0
// Divergenza RIALZISTA (minimi Prezzo decrescenti, minimi Stocastico crescenti)
IF close = lowest[NumeroBarre](close) THEN
Minimo = close
MinimoPrec = lowest[NumeroBarre](close[1])
IF Minimo < MinimoPrec THEN
MinStoPrec = lowest[NumeroBarre](StoK[1])
IF StoK > MinstoPrec THEN
MinSto = StoK
FOR i = 1 TO NumeroBarre + 1
IF close[i] = MinimoPrec THEN
xTemp = StoK[i - 1]
IF lowest[Validita](xTemp) = MinStoPrec THEN
IF MinSto > MinStoPrec THEN
x = round(StoK)
//DRAWTEXT("#x#", barindex, low-Distanza) coloured(0,128,0,255)
Divergenza = 1
ENDIF
ENDIF
BREAK
ENDIF
NEXT
ENDIF
ENDIF
ENDIF
// Divergenza RIBASSISTA (massimi Prezzo crescenti, massimi Stocastico decrescenti)
IF close = highest[NumeroBarre](close) THEN
Massimo = close
MassimoPrec = highest[NumeroBarre](close[1])
IF Massimo > MassimoPrec THEN
MaxStoPrec = highest[NumeroBarre](StoK[1])
IF StoK < MaxStoPrec THEN
MaxSto = StoK
FOR i = 1 TO NumeroBarre + 1
IF close[i] = MassimoPrec THEN
xTemp = StoK[i - 1]
IF highest[Validita](xTemp) = MaxStoPrec THEN
IF MaxSto < MaxStoPrec THEN
x = round(StoK)
//DRAWTEXT("#x#", barindex, high+Distanza) coloured(255,0,0,255)
Divergenza = -1
ENDIF
ENDIF
BREAK
ENDIF
NEXT
ENDIF
ENDIF
ENDIF
RETURN Divergenza
Infinitamente grato Roberto per il codice.
Pero’ purtroppo se lancio il codice come strategia di trading automatico mi da errore (in allegato le immagine con i dettagli delle righe).
Per quanto riguarda la Trend Line, la rottura deve avvenire dopo l’incrocio del MACD.
Grazie in anticipo per qualunque ulteriore aiuto.
Il codice, è un indicatore, non una strategia.
La strategia è quella che avevo giàpostato. Quella è invariata.
ATTENZIONE CHE INVECE DI SELL BISOGNA SCRIVERE SELLSHORT
MaoRai54 ha ragione, colpa mia!
La line 31 va cambiata in:
SELLSHORT 1 Contract at Market
Non mi stancherò mai di ringraziare Roberto per l’immenso supporto che offre. Un ringraziamento anche a MaoRai54 per l’importante segnalazione.
Sarebbe possibile inserire anche gli altri due filtri che avevo indicato nella descrizione iniziale (vedi anche foto allegata).
- Il MACD incrocia evidenziando il primo istogramma negativo (per la divergenza ribassista) o positivo (per la divergenza rialzista).
- Dopo che si è verificato l’incrocio del MACD, il prezzo deve rompere la trend line rialzista/ribassista, che parte dal minimo che ha generato il trend in oggetto.
Una domanda: nel codice è fissato un minimo e un massimo di barre che devono intercorrere nella formazione dei due massimi e due minimi?
Grazie
Questo è il codice con l’aggiunta dei filtri MACD.
Per la TrendLine, come la vorresti tracciare, quali caratteristiche devono avere i due punti dove tracciarla?
DEFPARAM CumulateOrders = False
ONCE Segnale = 0
ONCE SegnaleMACD = 0
ONCE macdHISTO = 0
ONCE Macd1 = 12
ONCE Macd2 = 26
ONCE Macd3 = 9
myMACD = Average[Macd1,1](close) - Average[Macd2,1](close)
mySignalLine = Average[Macd3,1](myMACD)
myHisto = myMACD - mySignalLine
//
mySto = Stochastic[14,3](close)
//
ONCE Barre = 50
ONCE Periodi = 14
ONCE ValoreK = 3
ONCE Validita = 1
Divergenza = CALL "Divergenza Stocastico"[Barre, Periodi, ValoreK, Validita](close)
IF Divergenza THEN
IF ((Divergenza > 0) AND (mySto <= 20)) OR ((Divergenza < 0) AND (mySto >= 80)) THEN
Segnale = Divergenza
HH = highest[50](high)
LL = lowest[50](low)
SegnaleMACD = 0
macdHISTO = 0
ENDIF
ENDIF
//
IF myMACD CROSSES OVER mySignalLine THEN
SegnaleMACD = 1
ELSIF myMACD CROSSES UNDER mySignalLine THEN
SegnaleMACD = -1
ENDIF
//
IF SegnaleMACD = 1 THEN
IF myHisto CROSSES OVER 0 THEN
macdHISTO = 1
ENDIF
ELSIF SegnaleMACD = -1 THEN
IF myHisto CROSSES UNDER 0 THEN
macdHISTO = -1
ENDIF
ENDIF
//
IF Not LongOnmarket AND (Segnale > 0) AND (SegnaleMACD > 0) AND (macdHISTO > 0) THEN
BUY 1 Contract at Market
SET STOP PRICE LL - 2*PipSize
SET TARGET PRICE HH
Segnale = 0
SegnaleMACD = 0
macdHISTO = 0
ENDIF
IF Not ShortOnMarket AND (Segnale < 0) AND (SegnaleMACD < 0) AND (macdHISTO < 0)THEN
SELLSHORT 1 Contract at Market
SET STOP PRICE HH + 2*PipSize
SET TARGET PRICE LL
Segnale = 0
SegnaleMACD = 0
macdHISTO = 0
ENDIF
Ciao Roberto. Grazie ancora per l’aggiunta del Macd.
Per quanto riguarda la trend line, spero di riuscirmi a spiegare. Per una maggiore comprensione, rimando alla immagine che avevo allegato nel primo post per una divergenza ribassista.
La trend line rialzista/ribassista dovrebbe essere ancorata (1 punto) al massimo/minimo dal quale è partito il trend che poi ha originato il pattern doppio minimo/massimo (dove cerchiamo la divergenza), mentre nel 2 punto la trend live va ancorata al massimo/minimo di swing tra i due massimi/minimi in questione.
Spero di essermi spiegato.
Grazie in anticipo.
C’è voluto un pò a fare l’indicatore per tracciare le due trendline. Provalo per vedere se ti va bene (puoi cambiare i periodi iniziali come vuoi, io ho messo 50):
defparam drawonlastbaronly = true
ONCE P = 50
HH1 = highest[P](high[P])
HH2 = highest[P](high)
LL1 = lowest[P](low[P])
LL2 = lowest[P](low)
bH1 = 0
bH2 = 0
bL1 = 0
bL2 = 0
//IF BarIndex > P THEN
//IF (close > HHx[1]) THEN
//drawtext("●",BarIndex,HHx[1] + range)
//
//ELSIF (close < LLx[1]) THEN
//drawtext("●",BarIndex,LLx[1] - range)
//ENDIF
//ENDIF
FOR i = 0 TO (p * 2)
// trovare i Massimi e la relativa barra dove sono stati fatti
IF bH2 = 0 THEN
IF high[i] = HH2 THEN
bH2 = BarIndex[i]
ENDIF
ELSIF bH1 = 0 THEN
IF high[i] = HH1 THEN
bH1 = BarIndex[i]
ENDIF
ENDIF
// trovare i Minimi e la relativa barra dove sono stati fatti
IF bL2 = 0 THEN
IF low[i] = LL2 THEN
bL2 = BarIndex[i]
ENDIF
ELSIF bL1 = 0 THEN
IF low[i] = LL1 THEN
bL1 = BarIndex[i]
ENDIF
ENDIF
//
IF bH2 > 0 AND bH1 > 0 AND bL1 > 0 AND bL2 > 0 THEN
break
ENDIF
NEXT
// calcolare la differenza tra i due valori, calcolandone il vaore medio di ogni barra
diffH = HH2 - HH1
diffL = LL2 - LL1
barsH = bH2 - bH1
barsL = bL2 - bL1
futH = (diffH / barsH) * ((BarIndex - bH2) + 1)
futL = (diffL / barsL) * ((BarIndex - bL2) + 1)
HHx = HH2 + futH//HH1 + (diffH * futH)
LLx = LL2 + futL//LL1 - (diffH * futH)
DrawSegment(bH1,HH1,BarIndex + 1,HHx[1]) coloured("Blue")
DrawSegment(bL1,LL1,BarIndex + 1,LLx[1]) coloured("Blue")
//drawtext("HH1 #HH1# - bH1 #bH1#",bH1,HH1)
//drawtext("LL1 #LL1# - bL1 #bL1#",bL1,LL1)
//drawtext("HH2 #HH2# - bH2 #bH2#",bH2,HH2)
//drawtext("LL2 #LL2# - bL2 #bL2#",bL2,LL2)
//drawtext("barsH #barsH# - barsL #barsL#",Barindex + 15, high)
return
Ciao Roberto,
ti ringrazio per l’inserimento anche delle trend line.
Però guardando l’immagine che hai allegato, credo ci sia una differenza tra il modo in cui il codice traccia la/le trend line e quello che servirebbe a me.
Provo a riassumere il set-up operativo coadiuvato da un’altra immagine a corollario.
Nell’ipotesi di un trade long (situazione allegata sul grafico), io cerco un doppio minimo nei prezzi (nell’immagine ho cerchiato i due minimi) in divergenza di stocastico (in corrispondenza dei minimi decrescenti lo stocastico genera minimi crescenti, anch’essi cerchiati nell’immagine). Una volta generato il doppio minimo in divergenza di stocastico, scattano i due filtri:
- Divergenza del MACD (in rialzo, come evidenziato nell’immagine)
- La rottura della trend line che va ancorata al massimo che ha generato l’impulso ribassista e al massimo di swing che genera il secondo minimo (nell’immagine ho evidenziato i livelli di prezzo dove va ancorata la trend line).
Nel caso long, il segnale Buy scatta quando il prezzo rompe al rialzo la trend line.
Scusami, ma avevo dimenticato il tuo post.
Puoi allegare un immagine con solo le linee di trend che desideri, indicando il preché devono iniziare in un certo punto e terminare in un certo altro, in pratica quali caratteristiche devono avere in comune i due punti entro cui vanno tracciate, sia al rialzo che al ribasso.