Ciao Roberto, se in certe situazioni da definire volessi aggiungere come filtro ad un TS sul 5 minuti (che opera long e short) la condizione extra multiday per cui non deve prendere soltanto per il primo long (se gli capita naturalmente, mentre per lo short può operare) il primo segnale rialzista finchè il prezzo è sopra il minimo di ieri e non torna sopra tale minimo sul timeframe inferiore di default, posso usare in qualche modo ONCE (e dove devo inserirlo) oppure la cosa è più complessa?
GRAZIE
timeframe (daily, updateOnClose)
previous DayHigh =Dhigh(0)
previousDayLow=Dlow(0)
timeframe (5 minute)
cExtraBuy=close[1]<previousDayLow and close>previousDayLow
Non sono riuscito a capire bene, per lo Short non occorre fare niente, in caso di segnale Long, invece, non deve prendere il primo?
Cerco di essere più preciso: in un Ts che opera long e short (sul timeframe a 5 minuti) vorrei, in certe circostanze (ancora da definire), aggiungere una condizione che riguarda il massimo\minimo del timeframe daily.
Nell’esempio del caso long: non voglio che il TS prenda un segnale long prima che il prezzo sia sceso sotto il minimo del giorno prima sul daily, e sia tornato, sul timeframe a 5 minuti, sopra tale minimo. [Per lo short, il TS può sempre operare in quanto non guarda questa condizione sul timeframe daily.]
Ora, per non farlo operare long fino a che il prezzo sia sceso sotto il minimo sul daily e sia tornato sopra tale minimo sul 5 minuti, va bene aggiungere alle altre condizioni long la condizione che ho scritto:
cExtraBuy=close[1]<previousDayLow and close>previousDayLow
quello che vorrei fare con ONCE è limitare tale condizione solo alla prima volta: se, dopo che il prezzo è sceso sotto il minimo daily e ritornato long sul 5 minuti, dovesse capitare nella giornata una seconda operazione long non voglio più che sia attiva questa condizione sul daily (per cui bisogna attendere una seconda volta che il prezzo scenda di nuovo sotto il minimo daily e risalga sopra tale minimo nel 5 minuti).
La domanda è: basta utilizzare ONCE (ed in tal caso in che posizione va inserito), oppure la formula va scritta in modo più complesso? GRAZIE
La logica dell’operazione è questa: mi aspetto che il mercato salga, ma “penso” che prima di salire in modo consistente debba andare a prendere (e poi “riassorbire” sul 5 minuti) i minimi di ieri, per cui non voglio prendere eventuali operazioni long fino a che, solo la prima volta, il mercato abbia preso i minimi di ieri.
La tua istruzione va benissimo, puoi scriverla anche:
cExtraBuy = close CROSSES OVER previousDayLow
ONCE non va bene da sola, serve senz’altro per iniziare una variabile, ma poi questa variabile (che in gergo si chiama FLAG in quanto segnala qualcosa) deve essere gestita.
Faccio un esempio con una variabile che chiamerò LongOK, che se avrà valore 0 (falso) non permetterà di tradare. Si tratta di assegnarli valore 1 iniziale e poi rimetterla ad 1 ad ogni nuovo giorno. Quando entri LONG, invece, la metterai a 0. Nelle tue condizioni per entrare Long dovrai anche aggiungerci AND LongOK:
DEFPARAM........
ONCE LongOK = 1 //LONG abilitati inizialmente
//--------------------------------------------------
// riabilitare i LONG ad inizio nuovo giorno
//
If IntraDayBarIndex = 0 THEN
LongOK = 1
ENDIF
//--------------------------------------------------
.
. // qui metterai il codice delle tua strategia
.
//--------------------------------------------------
// entrata LONG
//--------------------------------------------------
IF MieCondizioniLong AND LongOK THEN
BUY 1 CONTRACT AT MARKET
LongOK = 0 //disabilitare i LONG dopo la prima entrata
ENDIF
//--------------------------------------------------
//
.
. // qui metterai il resto del tuo codice
.
Ho provato, ma non mi funziona. Alcune considerazioni:
- il long deve essere disabilitato fino a che il prezzo non scende sotto il minimo daily, quindi non è che devo scrivere: longOk=0?
- once con più timeframes dà errore. Inserisco: Once… ed if intraday… dopo: timeframe (daily, updateOnClose) oppure dopo timeframe (5,minutes)?
- non è preferibile a questo punto creare un flag che al posto di uguale ad 1 sia uguale a : close CROSSES OVER previousDayLow?
LongOK non ha niente a che vedere con il prezzo.
Quello fa parte delle tue condizioni.
Ogni variabile deve essere definita e variata in un solo timeframe, anche se puoi leggerla dappertutto.
Si può scrivere solo con i FLAG senza ONCE?
Non capisco cosa tu intenda, comunque ONCE può anche non essere utilizzato, dipende da come scrivi il codice.
OK ci penso un pò, faccio delle prove e ti faccio sapere.
Mi “sembra” che l’esempio che hai riportato sopra:
IF MieCondizioniLong AND LongOK THEN
BUY 1 CONTRACT AT MARKET
LongOK = 0 //disabilitare i LONG dopo la prima entrata
ENDIF
non tenga conto del fatto che non posso disabilitare tutte le condizioni, in quanto il mio scopo è disabilitare solo una condizione di quelle presenti tra “mie condizioni”, ossia solo: cExtraBuy = close CROSSES OVER previousDayLow
disabilitarla dopo che la prima volta si è verificata, mentre le altre condizioni devono rimanere sempre attive
Dopo molte prove così sembra funzionare, puoi controllare? (il Ts deve inibire all’inizio di ogni giorno il primo long SOLO fino a che il prezzo non va sotto il minimo di ieri e poi risale. Futuri long della giornata devono funzionare normalmente senza più questa condizione).
- inizio con un flag = 0
- viene posto il flag = 1 solo al verificarsi della condizione desiderata
- non c’è bisogno di disabilitare il flag dopo il long altrimenti, dalle prove, non entra più in nessun caso durante la giornata
Vale sempre:
timeframe (daily, updateOnClose)
previous DayHigh =Dhigh(0)
previousDayLow=Dlow(0)
timeframe (3 minute)
previousDayLowReached=close[1]<previousDayLow and close>previousDayLow
//----------------------------------------------------------------------
timeframe(3 minutes)
ONCE previousDayLowReached = 0 //LONG inizialmente disabilitati nel flag: previousDayLowReached
If IntraDayBarIndex = 0 THEN
previousDayLowReached = 0
ENDIF
//----------------------------------------------------------------------------------
if close[1]<previousDayLow and close>previousDayLow then // definizione condizione Extra
previousDayLowReached=1 // condizione Extra posta come flag vero solo se si verifica
endif
//------------------------------------------------------------------------------
cLong = mie condizioni
IF (tradeAllowed=1 and cLong) THEN
BUY 1 CONTRACTS AT MARKET
//previousDayLowReached=0 // non serve riscrivere il flag in quanto la condizione Extra, se si verifica
ENDIF // deve essere valida solo la prima volta
//-----------------------------------------------------------------------------------
La riga 20 mi sembra contraddica quello che dici, vuoi che la condizione extra sia abilitata solo la prima volta, ma se non l’azzeri quando entri la prima volta resta valida anche per l’entrate successive, no?
Ciao Roberto, ho controllato, ma ti confermo che se abilito la riga 20 togliendo il rem il TS prende altre operazioni solo se il prezzo torna sotto il minimo del giorno prima. Mi sembra naturale in quanto se all’inizio il flag è uguale a 0 e diventa 1 solo se si presenta la condizione per cui il prezzo va sotto il minimo di ieri, se resetto il flag dopo il buy questo ritorna alla condizione iniziale del flag uguale a zero: ossia devo aspettare nuovamente che il prezzo ritorni sotto il minimo anche per il secondo, terzo … long.
Questo è un esempio che conferma la cosa: FLAG è il TS in basso con il rem, FLAG(1) è il TS in alto che pone il flag uguale a 0 dopo il buy della riga 19.
La linea orizzontale è il minimo del giorno prima: si vede che il primo long viene preso da entrambi in quanto il prezzo scende e risale sopra la linea, mentre il secondo long viene preso solo dal TS con il rem, mentre il secondo non lo prende in quanto aspetta NUOVAMENTE che il prezzo torni sotto la linea orizzontale in quanto azzerando il flag si comporta come la prima volta.
- Ti risulta corretta la cosa?
- Tra l’altro ho visto in altri esempio che nel lunedi viene calcolato come giorno anche la barra daily della domenica notte, anche se vengono esclusi i giorni 6 e 7. Ho scritto ed aggiunto questo (vd sotto) alle condizioni di acquisto/vendita, è corretto?
tradingDays = (OpenDayOfWeek >= 1 and OpenDayOfWeek <= 5). Se si, sai come posso escludere la barra daily della domenica?
(PS: ho riscritto anche ad Emanuele Dolce per l’errore delle 3 operazioni sullo stop&reverse che come vedi nell’immagine continua a presentarsi (operazione tra le 17 e le 18), mi ha detto che ci vuole ancora tempo, CIAO