R05Participant
Veteran
Salve a tutti, avrei la necessità, gentilmente, di sapere come fare per rendere valida una condizione ad esempio fino a un massimo di 5 candele.
Vi posto un esempio della strategia: prima condizione incrocio del macd ad 1 ora a rialzo, quindi, come seconda condizione io entro effettivamente a rialzo solo se supero il max degli ultimi 10 periodi. La condizione di entrata deve valere per un massimo di 5 candele successive, poi decade tutto e si aspetta un nuovo segnale.
Mi potete aiutare?
Prova questo, dovrebbe funzionare, se ho ben capito la tua richiesta:
DEFPARAM CumulateOrders = False
ONCE TradeOn = 0 //inizializzazione variabile
IF OnMarket THEN
TradeOn = 0 //una volta a mercato azzerare la variabile
ENDIF
MacdVal = MACD[14,26,9] //valore del MACD
IF MacdVal CROSSES OVER 0 THEN //se incrocia al rialzo....
TradeOn = 1 //...settare la variabile per tradare e...
TopHigh = highest[10](high) //...salvare il massimo delle ultime 10 candele.
ELSIF MacdVal CROSSES UNDER 0 THEN
TradeOn = 0 //Se il MACD torna sotto lo 0, annullare tutto
ENDIF
IF summation[5](MacdVal > 0) > 5 THEN //se il MACD è sopra lo 0 da oltre 5 candele...
TradeOn = 0 //...annullare e ripartire da zero.
ENDIF
IF close > TopHigh AND TradeOn THEN //Se condizioni soddisfatte aprire il trade
BUY 1 CONTRACT AT MARKET
ENDIF
R05Participant
Veteran
Gent.mo Roberto ti ringrazio della risposta. Tendenzialmente fa ciò che chiedo, solo che la prima cosa che ho notato è che in alcuni casi anche se le condizioni (macd + superamento ultimo massimo) sono soddisfatte, non mi fa entrare subito ma anche dopo 5 candele (immagine1); in altri casi non mi fa nemmeno entrare nonostante le condizioni (immagine2); mentre poi c’è un’entrata apparentemente senza setup (immagine1).
Vorrei premettere che ho modificato il tuo codice per fare anche lo short e per uscire dalla posizione long quando il macd incrocia a ribasso e viceversa per le operazioni short. Quindi, non so se modificando io qualcosa ho cambiato anche le basi del tuo codice. Comunque lo allego in modo da capire se ho fatto qualcosa di sbagliato. Ho sostituito per l’entrata at market con tophigh perchè, cosa che mi era sfuggita prima, l’entrata è al superamento del massimo/minimo a 10 candele.
DEFPARAM CumulateOrders = False
defparam flatbefore = 010000
defparam flatafter = 220000
ONCE TradeOn = 0 //inizializzazione variabile
IF OnMarket THEN
TradeOn = 0 //una volta a mercato azzerare la variabile
ENDIF
// Condizioni per entrare long
MacdVal = MACD[14,26,9] //valore del MACD
IF MacdVal CROSSES OVER 0 THEN //se incrocia al rialzo....
TradeOn = 1 //...settare la variabile per tradare e...
TopHigh = highest[10](high) //...salvare il massimo delle ultime 10 candele.
ELSIF MacdVal CROSSES UNDER 0 THEN
TradeOn = 0 //Se il MACD torna sotto lo 0, annullare tutto
ENDIF
IF summation[5](MacdVal > 0) > 5 THEN //se il MACD è sopra lo 0 da oltre 5 candele...
TradeOn = 0 //...annullare e ripartire da zero.
ENDIF
IF TradeOn THEN //Se condizioni soddisfatte aprire il trade
BUY 1 CONTRACT AT tophigh stop
ENDIF
// Condizioni per uscire da posizioni long
indicator3 = MACDline[12,26,9](close)
indicator4 = ExponentialAverage[9](indicator3)
c2 = (indicator3 CROSSES UNDER indicator4)
IF c2 THEN
SELL AT MARKET
ENDIF
// Condizioni per entrare short
MacdVal = MACD[14,26,9] //valore del MACD
IF MacdVal CROSSES UNDER 0 THEN //se incrocia al ribasso....
TradeOn = 1 //...settare la variabile per tradare e...
TopLow = lowest[10](low) //...salvare il minimo delle ultime 10 candele.
ELSIF MacdVal CROSSES OVER 0 THEN
TradeOn = 0 //Se il MACD torna sopra lo 0, annullare tutto
ENDIF
IF summation[5](MacdVal < 0) > 5 THEN //se il MACD è sotto lo 0 da oltre 5 candele...
TradeOn = 0 //...annullare e ripartire da zero.
ENDIF
IF TradeOn THEN //Se condizioni soddisfatte aprire il trade
SELLSHORT 1 CONTRACT AT toplow stop
ENDIF
// Condizioni per uscire da posizioni short
indicator7 = MACDline[12,26,9](close)
indicator8 = ExponentialAverage[9](indicator7)
c4 = (indicator7 CROSSES OVER indicator8)
IF c4 THEN
EXITSHORT AT MARKET
ENDIF
Ho trovato un errore di logica, sostituisci la riga 19 con:
IF summation[6](MacdVal > 0) = 6 THEN //dopo la 5a barra annullare
e la riga 44 con:
IF summation[6](MacdVal < 0) = 6 THEN //dopo la 5a barra annullare
poi fammi sapere.
R05Participant
Veteran
Grazie della risposta. Purtroppo il problema persiste. Riprendendo l’immagine 1 che ho postato prima, ad esempio quelle due operazioni le fa comunque fare.
Il problema logico era che usi sempre la stessa variabile, sia per i LONG che per gli SHORT, andava bene per i soli LONG, altrimenti va usata un’ulteriore variabile per differenziarli.
Ho aggiunto TradeOnL e MacdValL (dove L sta per LONG), il resto è invariato:
DEFPARAM CumulateOrders = False
defparam flatbefore = 010000
defparam flatafter = 220000
ONCE TradeOnL = 0 //inizializzazione variabile
ONCE TradeOn = 0 //inizializzazione variabile
IF OnMarket THEN
TradeOnL = 0 //una volta a mercato azzerare la variabile
TradeOn = 0 //una volta a mercato azzerare la variabile
ENDIF
// Condizioni per entrare long
MacdValL = MACD[14,26,9] //valore del MACD
IF MacdValL CROSSES OVER 0 THEN //se incrocia al rialzo....
TradeOnL = 1 //...settare la variabile per tradare e...
TopHigh = highest[10](high) //...salvare il massimo delle ultime 10 candele.
ELSIF MacdValL CROSSES UNDER 0 THEN
TradeOnL = 0 //Se il MACD torna sotto lo 0, annullare tutto
ENDIF
IF summation[6](MacdValL > 0) = 6 THEN //se il MACD è sopra lo 0 da oltre 5 candele...
TradeOnL = 0 //...annullare e ripartire da zero.
ENDIF
IF TradeOnL THEN //Se condizioni soddisfatte aprire il trade
BUY 1 CONTRACT AT tophigh stop
ENDIF
// Condizioni per uscire da posizioni long
indicator3 = MACDline[12,26,9](close)
indicator4 = ExponentialAverage[9](indicator3)
c2 = (indicator3 CROSSES UNDER indicator4)
IF c2 THEN
SELL AT MARKET
ENDIF
// Condizioni per entrare short
MacdVal = MACD[14,26,9] //valore del MACD
IF MacdVal CROSSES UNDER 0 THEN //se incrocia al ribasso....
TradeOn = 1 //...settare la variabile per tradare e...
TopLow = lowest[10](low) //...salvare il minimo delle ultime 10 candele.
ELSIF MacdVal CROSSES OVER 0 THEN
TradeOn = 0 //Se il MACD torna sopra lo 0, annullare tutto
ENDIF
IF summation[6](MacdVal < 0) = 6 THEN //se il MACD è sotto lo 0 da oltre 5 candele...
TradeOn = 0 //...annullare e ripartire da zero.
ENDIF
IF TradeOn THEN //Se condizioni soddisfatte aprire il trade
SELLSHORT 1 CONTRACT AT toplow stop
ENDIF
// Condizioni per uscire da posizioni short
indicator7 = MACDline[12,26,9](close)
indicator8 = ExponentialAverage[9](indicator7)
c4 = (indicator7 CROSSES OVER indicator8)
IF c4 THEN
EXITSHORT AT MARKET
ENDIF
Prova così, dovrebbe funzionare.
R05Participant
Veteran
Si grande tutto ok. Funziona perfettamente e fa quello che volevo. Grazie tantissimo. Gentilissimo.
R05Participant
Veteran
Gent.mo Roberto oggi ho notato che il sistema, montato sul DAX, si è interrotto automaticamente apparentemente senza motivo. Ti premetto che ho diversi sistemi che girano sul DAX stesso. Ho pensato, tra le possibili cause, che questo sistema si interrompe qualora ha il setup long ma è già aperta una posizione long con un altro sistema. Potrebbe essere? Mi aiuteresti a capire?
Immagino (e spero) sia sul demo.
Purtroppo non c’è molto da capire, è già capitato a me ed altri, anche lunedì e su ben 3 strategie. Sembra sia un problema relativo ai soli conti demo (ma certamente questa cosa non lascia molto tranquilli) in quanto IG e PRT fanno spesso prove magari con modifiche del loro software e può capitare che mandino in tilt il sistema.
Hanno assicurato, anche me via customer care, che in reale ciò non può accadere.
In pratica si tratta quasi sempre del fatto che un ordine, di entrata o di stop ecc… non riesca ad essere eseguito entro un certo lasso di tempo.
Probabilmente non è un grosso problema, se lo desisderi (ed è anche un modo per fargli presente il disguido) puoi chiedergli spiegazioni attraverso il customer care del broker.
R05Participant
Veteran
Ok grazie, comunque era in reale. Proverò a vedere cosa dicono. Grazie.