Buongiorno a tutti,
avrei bisogno del vs. aiuto per implementare il tool allegato per garantire la chiusura del trade ogni sera alle 22.00 su timeframe 2 ore. Inoltre vi chiedo come si legge la funzione c1 = (close[1] > DClose(24)[1]) e se il time frame viene definito in base a quello in cui si fa il backtest.
// Definizione dei parametri del codice
DEFPARAM CumulateOrders = False // Posizioni cumulate disattivate
// Il sistema cancellerà tutti gli ordini in attesa e chiuderà tutte le posizioni a 0:00. Dopo l’orario “Flat Before” non saranno piazzati nuovi ordini o posizioni.
DEFPARAM FLATBEFORE = 170000
// Cancellare tutti gli ordini in attesa e chiudere tutte le posizioni all’orario “Flat After”
DEFPARAM FLATAFTER = 230000
// Impedisce al sistema di tradare in giorni specifici della settimana
daysForbiddenEntry = OpenDayOfWeek = 6 OR OpenDayOfWeek = 0
// Condition to limit only one trade per day
firstbar = barindex – intradaybarindex
if tradeindex(1) < firstbar then
nottraded = 1
elsif tradeindex(1) >= firstbar then
traded = 0
endif
// Condizioni per entrare su posizioni long
c1 = (close[1] > DClose(24)[1])
IF c1 AND not daysForbiddenEntry THEN
BUY 1 CONTRACT AT MARKET
ENDIF
SET STOP pLOSS 180
SET TARGET pROFIT 180
c1 = (close[1] > DClose(24)[1]) significa che la variabile c1 avrà valore logico VERO, cioè 1, quando il prezzo di chiusura della barra precedente (close[1]) è > del prezzo di chiusura giornaliero del 24esimo giorno precedente ( DClose(24)) aggiornato alla barra precedente ([1] alla fine).
Cioè se sei su un timeframe orario e sono le ore 120000, c1 sarà VERA se (close[1]) (prezzo di chiusura della barra delle 110000) è > del prezzo di chiusura giornaliero del 24esimo giorno precedente ( DClose(24)) aggiornato alle 110000.
Per quanto rigarda le 220000, DEFPARAM FLATAFTER vuole un orario in cui la candela chiuda, per essere preciso; siccome la candela a 2ore inizia alle 21 e chiude alle 23, ecco che chiude alle 23.
Devi usare le tue condizioni sempre sul timeframe a 2 ore, però devi usare sul grafico un timeframe che abbia la candela che chiude alle 22 (può essere 1 ora, 15 minuti, ecc…).
Ecco il codice modificato con il timeframe a 2 ore che io ho provato sul Timeframe orario:
// Definizione dei parametri del codice
DEFPARAM CumulateOrders = False // Posizioni cumulate disattivate
// Il sistema cancellerà tutti gli ordini in attesa e chiuderà tutte le posizioni a 0:00. Dopo l'orario "Flat Before" non saranno piazzati nuovi ordini o posizioni.
DEFPARAM FLATBEFORE = 170000
// Cancellare tutti gli ordini in attesa e chiudere tutte le posizioni all'orario "Flat After"
DEFPARAM FLATAFTER = 220000
//
Timeframe(2h,UpDateOnClose)
// Impedisce al sistema di tradare in giorni specifici della settimana
daysForbiddenEntry = OpenDayOfWeek = 6 OR OpenDayOfWeek = 0
// Condition to limit only one trade per day
firstbar = barindex - intradaybarindex
if tradeindex(1) < firstbar then
nottraded = 1
elsif tradeindex(1) >= firstbar then
traded = 0
endif
// Condizioni per entrare su posizioni long
c1 = (close[1] > DClose(24)[1])
IF c1 AND not daysForbiddenEntry THEN
BUY 1 CONTRACT AT MARKET
ENDIF
//
SET STOP pLOSS 180
SET TARGET pROFIT 180
Grazie.
Mi scuso invece per la scarsa conoscenza.
Chiedo per cortesia di verificare il motivo per cui è disattesa la regola che apra 1 solo trade al giorno.
Oggi ha aperto alle 17.00, ha preso lo stop loss alle 19.30 e poi alle 20.00 ha riaperto un’altra posizione.
Grazie anticpatamente
Devi aggiungere la condizione che verifica se è già stata effettuate un’operazione alla riga 20.
Ho aggiunto la variabile OTD per evitare d’entrare più di una volta al giorno:
// Definizione dei parametri del codice
DEFPARAM CumulateOrders = False // Posizioni cumulate disattivate
// Il sistema cancellerà tutti gli ordini in attesa e chiuderà tutte le posizioni a 0:00. Dopo l'orario "Flat Before" non saranno piazzati nuovi ordini o posizioni.
DEFPARAM FLATBEFORE = 170000
// Cancellare tutti gli ordini in attesa e chiudere tutte le posizioni all'orario "Flat After"
DEFPARAM FLATAFTER = 220000
//
Timeframe(2h,UpDateOnClose)
// Impedisce al sistema di tradare in giorni specifici della settimana
daysForbiddenEntry = OpenDayOfWeek = 6 OR OpenDayOfWeek = 0
// Condition to limit only one trade per day
OTD = (Barindex - TradeIndex(1) > IntradayBarIndex) // IntradayBarIndex < (Barindex - TradeIndex(1)) limits the (opening) trades till 1 per day (OTD One Trade per Day)
// Condizioni per entrare su posizioni long
c1 = (close[1] > DClose(24)[1])
IF c1 AND not daysForbiddenEntry AND OTD THEN
BUY 1 CONTRACT AT MARKET
ENDIF
//
SET STOP pLOSS 180
SET TARGET pROFIT 180
Grazie, eseguendo backtest su TF1H i risultati sono completamente diversi, quasi non entra mai.
Prova a sostituire UpdateOnClose con default.
Non cambia tanto.
Ho in mente una strategia che avrei piacere automatizzare se possibile.
TIME FRAME 1 ORA
Condizioni LONG
RSI a 10 periodi esce dall’ipervenduto e contemporaneamente il prezzo di chiusura della candela verde è superiore del prezzo di chiusura di quella precedente ed anche il volume è superiore della candela precedente; stop loss al valore minimo della candela precedente e take profit a 3 volte la potenziale perdita.
Condizioni SHORT
RSI a 10 periodi esce dall’ipercomprato e contemporaneamente il prezzo di chiusura della candela rossa è inferiore del prezzo di quella precedente ed anche il volume è maggiore della candela precedente; stop loss al minimo della candela precedente e take profit a 3 volte la perdita.
E’ possibile scriverlo in linguaggio prorealtime?
Grazie
Quando hai scritto nelle condizioni SHORT “stop loss al minimo della candela precedente“, immagino tu intendessi “stop loss al massimo della candela precedente“.
Eccolo:
ONCE IC = 70 //IperComprato
ONCE IV = 100 - IC //IperVenduto (per differenza)
mioRSI = Rsi[10](close)
// LONG
L1 = mioRSI CROSSES OVER IV
L2 = close > open
L3 = close > close[1]
L4 = Volume > Volume[1]
L5 = Not OnMarket
CondL = L1 AND L2 AND L3 AND L4 AND L5
IF CondL THEN
BUY 1 CONTRACT AT MARKET
SL = abs(low[1] - close)
TP = SL * 3
SET STOP LOSS SL
SET TARGET PROFIT TP
ENDIF
// SHORT
S1 = mioRSI CROSSES UNDER IC
S2 = close < open
S3 = close < close[1]
S4 = Volume > Volume[1]
S5 = Not OnMarket
CondS = S1 AND S2 AND S3 AND S4 AND S5
IF CondS THEN
SELLSHORT 1 CONTRACT AT MARKET
SL = abs(high[1] - close)
TP = SL * 3
SET STOP LOSS SL
SET TARGET PROFIT TP
ENDIF
Grazie,
l’ho testato ma ha dato esito negativo
Eh significa che ho eseguito un backtest ed i rusultati non sono in linea con le attese.
Comunque grazie sempre per il tuo generoso supporto.
Se invece hai qualche idea per integrare la strategia ancora meglio.
Ciao
Generalmente se una strategia non funziona, c’è poco da fare, difficilmente con qualche aggiustamento potrà funzionare.
Ad ogni modo ho modificato il codice aggiungendo le condizioni L6 ed S6, che impongono che prima dell’incrocio dell’RSI con IC e IV, ci siano state almeno 5 barre sotto o sopra. Questo per evitare che più volte RSI entra ed esca da IV o da IC e ci rientri subito creando segnali più inconsistenti:
ONCE IC = 70 //IperComprato
ONCE IV = 100 - IC //IperVenduto (per differenza)
mioRSI = Rsi[10](close)
// LONG
L1 = mioRSI CROSSES OVER IV
L2 = close > open
L3 = close > close[1]
L4 = Volume > Volume[1]
L5 = Not OnMarket
L6 = (summation[5](mioRSI < IV) = 5)
CondL = L1 AND L2 AND L3 AND L4 AND L5 AND L6[1]
IF CondL THEN
BUY 1 CONTRACT AT MARKET
SL = abs(low[1] - close)
TP = SL * 4.5
SET STOP LOSS SL
SET TARGET PROFIT TP
ENDIF
// SHORT
S1 = mioRSI CROSSES UNDER IC
S2 = close < open
S3 = close < close[1]
S4 = Volume > Volume[1]
S5 = Not OnMarket
S6 = (summation[5](mioRSI > IC) = 5)
CondS = S1 AND S2 AND S3 AND S4 AND S5 AND S6[1]
IF CondS THEN
SELLSHORT 1 CONTRACT AT MARKET
SL = abs(high[1] - close)
TP = SL * 4.5
SET STOP LOSS SL
SET TARGET PROFIT TP
ENDIF