R05Participant
Veteran
Gent.mi, nell’implementare la strategia tortle soup, vorrei prendere in considerazione un precedente minimo e massimo ad esempio a 20 periodi ma che sia esso stesso un massimo ad esempio a 10 candele (cioè una volta considerato il massimo precedente a 20 periodi questo deve essere il massimo delle sue 10 sue candele precedenti). Vi allego un esempio (file esempio).
Di seguito anche un trading system che ho scritto il quale però, come si vede nell’esempio 2, mi prende tutti i max e min precedenti a 20 periodi senza tener conto se questi a loro volta siano dei max o min a ulteriori 10 periodi.
DEFPARAM CumulateOrders = False
n = 1
// Condizioni per aprire una posizione long
c1 = low < lowest[20](low)[1]
ctime = time > 060000 and time < 220000
IF c1 AND ctime THEN
BUY n CONTRACT AT lowest[20](low)[1] + 1 stop
ENDIF
// Condizioni per uscire da una posizione long
c2 = low < lowest[5](low)[1]
IF c2 THEN
sell AT MARKET
ENDIF
// Condizioni per aprire una posizione short
c1 = high > highest[20](high)[1]
ctime = time > 060000 and time < 220000
IF c1 AND ctime THEN
SELLSHORT n CONTRACT AT highest[20](high)[1] - 1 stop
ENDIF
// Condizioni per uscire da una posizione di vendita
c3 = high > highest[5](high)[1]
IF c3 THEN
exitshort AT MARKET
ENDIF
// Stop e target
IF close > open THEN //LONG
MinLow = low
StopLoss = low - 2 //2 pips sotto il minimo
ELSE //SHORT
MaxHigh = high
StopLoss = high + 2 //2 pips sopra il massimo
ENDIF
SET STOP PLOSS StopLoss
IF LongOnMarket THEN //per i LONG
IF low > MinLow THEN //verificare che sia un MINIMO più alto
MinLow = Low //aggiornare la variabile
ENDIF
SELL AT MinLow - 2 STOP //aggiornare l'ordine di STOP ad ogni candela
ENDIF
IF ShortOnMarket THEN //per gli SHORT
IF high < MaxHigh THEN //verificare che sia un MASSIMO più basso
MaxHigh = high //aggiornare la variabile
ENDIF
EXITSHORT AT MaxHigh + 2 STOP //aggiornare l'ordine di STOP ad ogni candela
ENDIF
Devi mettere, dopo la riga 6 e la riga 22 un ciclo FOR…NEXT che vada indietro a vedere se prima di quel minimo/massimo ce n’erano altri.
Puoi sostituire la riga 6 con queste:
Minimo = lowest[20](low)[1]
c1 = low < Minimo
FOR i = 1 TO 20
IF low[i] = Minimo THEN
FOR j = i + 1 TO i + 11
IF Minimo <= low[j] THEN
c1 = 0
ENDIF
NEXT
Break
ENDIF
NEXT
e la riga 22 con queste:
Massimo = highest[20](high)[1]
c1 = high < Massimo
FOR i = 1 TO 20
IF high[i] = Massimo THEN
FOR j = i + 1 TO i + 11
IF Massimo >= high[j] THEN
c1 = 0
ENDIF
NEXT
Break
ENDIF
NEXT
non l’ho provato.
R05Participant
Veteran
Ok grazie Roberto, ho provato ad aggiungere le seguenti righe, ma nulla. Non riesco a risolvere.
newlowest=0
FOR a = 0 TO 10 DO
IF low[a]>Newlowest or Newlowest=0 THEN
Newlowest = low[a]
ENDIF
NEXT
R05Participant
Veteran
scusa Roberto ho scritto dopo io senza aver visto il tuo ultimo messaggio. Ora lo provo
R05Participant
Veteran
Si Roberto l’ho provato ma mi riduce di molto le operazioni e non fa quello che vorrei.
I Massimi/Minimi ad almeno 10 candele di distanza li ha trovati?
R05Participant
Veteran
Il sistema mi deve trovare il max/min a 20 periodi, e questo è ok. Però, questo max/min deve essere a sua volta il max/min delle 10 candele precedenti, e questo non lo fa: per fare un esempio sul daily: il 10 novembre ho un massimo degli ultimi 20 giorni ad esempio sul dax 13150 punti, prima condizione; poi, prima del 10 novembre per 10 giorni nessun massimo deve essere superiore ai 13150: allora le due condizioni sono rispettate. Se ad esempio il 5 novembre avessi avuto un massimo pari a 13160 superiore a quello del 10 novembre, la condizione non sarebbe più rispettata, quindi non si fa nulla.
C’è un errore logico nei due esempi miei, la riga 6 del primo sostituiscila con:
IF low[j] <= Minimo THEN
e la riga 6 del secondo sostituiscila con:
IF high[j] >= Massimo THEN
prova adesso.
R05Participant
Veteran
No Roberto ancora non fa quello che vorrei. Comunque dato che non capisco la logica che c’è dietro il codice “for …..next” ho provato a fare questo trading system, togliendo il lato long e concentrandomi solo sullo short, se non altro perchè è più facile lavorarci su.
DEFPARAM CumulateOrders = False
n = 1
// Condizioni per aprire una posizione short
ctime = time > 060000 and time < 220000
a=highest[20]
if high>a then
if a>high[21] and a>high[22] and a>high[23] and a>high[24] and a>high[25] and a>high[26] then
if ctime then
SELLSHORT n CONTRACT AT market
ENDIF
endif
endif
// Condizioni per uscire da una posizione di vendita
c4 = high > highest[5](high)[1]
IF c4 THEN
exitshort AT MARKET
ENDIF
// Stop e target
IF close > open THEN //LONG
MinLow = low
StopLoss = low - 2 //2 pips sotto il minimo
ELSE //SHORT
MaxHigh = high
StopLoss = high + 2 //2 pips sopra il massimo
ENDIF
SET STOP PLOSS StopLoss
IF LongOnMarket THEN //per i LONG
IF low > MinLow THEN //verificare che sia un MINIMO più alto
MinLow = Low //aggiornare la variabile
ENDIF
SELL AT MinLow - 2 STOP //aggiornare l'ordine di STOP ad ogni candela
ENDIF
IF ShortOnMarket THEN //per gli SHORT
IF high < MaxHigh THEN //verificare che sia un MASSIMO più basso
MaxHigh = high //aggiornare la variabile
ENDIF
EXITSHORT AT MaxHigh + 2 STOP //aggiornare l'ordine di STOP ad ogni candela
ENDIF
Ho aggiunto questa stringa
a=highest[20]
if high>a then
if a>high[21] and a>high[22] and a>high[23] and a>high[24] and a>high[25] and a>high[26] then
if ctime then
SELLSHORT n CONTRACT AT market
ENDIF
endif
endif
La logica che ho usato è questa:
- ammettiamo che a sia il massimo degli ultimi periodi
- se a (che può essere la candela 12 o la 15 o la 17 ecc.) è > del massimo della candela di 21 periodi fa, e anche del massimo delle candele di 22, 23, 24, 25 e 26 periodi fa allora è praticamente ok
- se high attuale è quindi maggiore di a (che ha rispettato a questo punto le due condizioni cioè essere il massimo a 20 periodi e anche lui stesso il massimo di altri periodi precedenti) allora mi apri lo short
Ora, sembrerebbe che sia riuscito a risolvere il problema, a prima vista, però sono sopraggiunti due problemi che allego:
- nell’esempio 1, ma vale per tutti gli ingressi, l’entrata avviene 2 candele dopo il massimo attuale
- nell’esempio 2, onestamente non so cosa abbia fatto, perchè le entrate sono completamente sballate
Io ho provato sui MINIMI (tanto sul massimo è lo stesso, basta cambiare certi valori) con questo indicatore e funziona:
Minimo = lowest[20](low)[1]
c1 = low < Minimo
FOR i = 1 TO 20
IF low[i] = Minimo THEN
FOR j = i + 1 TO i + 11
IF low[j] <= Minimo THEN
c1 = 0
ENDIF
NEXT
Break
ENDIF
NEXT
IF c1 > 0 THEN
DRAWSEGMENT(barindex - 30,Minimo,barindex,Minimo)
DRAWARROWUP(barindex[i],Minimo - 10 * pipsize) coloured(0,255,0,255)
ENDIF
RETURN
Il tuo codice può anche funzionare, ma è un caso, non puoi sapere in quale candela “a” è il massimo.
L’unica cosa è il ciclo FOR…NEXT. La logica che c’è dietro mi sembra intuitiva, ripete tutte le istruzioni che ci sono tra la riga FOR e la riga NEXT per il numero di volte specificato, ad esempio 1 TO 20 ripete 20 volte tutte quelle istruzioni, anche 17 TO 36 le ripete 20 volte, il numero di partenza lo decidi tu in base alle tue esigenze. Se devi cercare tra 20 candele partendo dalla candela precedente 1 TO 20 è quello che devi usare, se vuoi cercare indietro, ad esempio 20 candele indietro partendo dalla 17 allora devi usare 17 TO 36. La variabile “i” è il contatore che, partendo dal valore iniziale, ti dice in quale punto del ciclo sei e viene automaticamente incrementato finché non raggiunge il massimo da te indicato. Quindi usandolo come indice tra parentesi quadre ti permette di fare riferimento ad un valore di quella specifica candela, se i vale 13, CLOSE[i] farà riferimento al prezzo di chiusuyra della 13esima candela precedente a quella corrente.
R05Participant
Veteran
Si Roberto ho inserito il tuo codice ma accanto a DRAWSEGMENT e DRAWARROWUP mi da errore. Ti allego il file.
R05Participant
Veteran
No scusa Roberto ho rimesso il tuo codice precedente nel seguente trading system e sembra ok. Ora faccio altre prove e ti dico. Ho sicuramente sbagliato io, perchè mi sono accorto che avevo invertito, cioè la parte col minimo l’ho messo in sellshort e non in long e viceversa.
DEFPARAM CumulateOrders = False
n = 1
// Condizioni per aprire una posizione long
ctime = time > 060000 and time < 220000
Minimo = lowest[20](low)[1]
c1 = low < Minimo
FOR i = 1 TO 20
IF low[i] = Minimo THEN
FOR j = i + 1 TO i + 11
IF low[j] <= Minimo THEN
c1 = 0
ENDIF
NEXT
Break
ENDIF
NEXT
IF c1 AND ctime THEN
buy n CONTRACT AT market
ENDIF
// Condizioni per aprire una posizione lshort
ctime = time > 060000 and time < 220000
Massimo = highest[20](high)[1]
c2 = high < Massimo
FOR i = 1 TO 20
IF high[i] = Massimo THEN
FOR j = i + 1 TO i + 11
IF high[j] <= Massimo THEN
c2 = 0
ENDIF
NEXT
Break
ENDIF
NEXT
IF c2 AND ctime THEN
sellshort n CONTRACT AT market
ENDIF
// Stop e target
IF close > open THEN //LONG
MinLow = low
StopLoss = low - 2 //2 pips sotto il minimo
ELSE //SHORT
MaxHigh = high
StopLoss = high + 2 //2 pips sopra il massimo
ENDIF
SET STOP PLOSS StopLoss
IF LongOnMarket THEN //per i LONG
IF low > MinLow THEN //verificare che sia un MINIMO più alto
MinLow = Low //aggiornare la variabile
ENDIF
SELL AT MinLow - 2 STOP //aggiornare l'ordine di STOP ad ogni candela
ENDIF
IF ShortOnMarket THEN //per gli SHORT
IF high < MaxHigh THEN //verificare che sia un MASSIMO più basso
MaxHigh = high //aggiornare la variabile
ENDIF
EXITSHORT AT MaxHigh + 2 STOP //aggiornare l'ordine di STOP ad ogni candela
ENDIF
Ora provo un altro pò.