DEFPARAM CumulateOrders = false
DEFPARAM FLATBEFORE = 000000
DEFPARAM FLATAFTER = 000000
c5= adx[5]> 20
//**********************************************************************
// engulfing pattern rialzista (anche reversal day)
C1=range[0]>=range[1] AND close[1]<open[1] AND close[0]>open[0] AND open[0]<=close[1] AND close[0]>=open[1]AND range[0]>averagetruerange[ B ](close)*1
// engulfing pattern ribassista (anche reversal day)
C2=range[0]>=range[1] AND close[1]>open[1] AND close[0]<open[0] AND open[0]>=close[1] AND close[0]<=open[1]AND range[0]>averagetruerange[ C ](close)*1
//**********************************************************************
// hammer rialzista
C3 = close[1]<open[1] AND open[0]>low[0]+(range*0.66) AND close[0]>low[0]+(range*0.66) AND range[0]>abs(open-close)*4 AND low[0]<low[1] AND range[0]>averagetruerange[ D ](close)*1
// shooting star ribassista
C4 = close[1]>open[1] AND open[0]<high[0]-(range*0.66) AND close[0]<high[0]-(range*0.66) AND range[0]>abs(open-close)*4 AND high[0]>high[1] AND range[0]>averagetruerange[ E ](close)*1
//**********************************************************************
IF Not OnMarket [( C1 OR C3) AND C5] THEN
BUY 1 CONTRACT AT MARKET
ENDIF
IF Not OnMarket [( C2 OR C4) AND C5] THEN
SELLSHORT 1 CONTRACT AT MARKET
ENDIF
SET STOP pLOSS 50
SET TARGET pPROFIT 100
Ciao Roberto, per favore potresti scoprire cosa non va? Il sistema gira, ma non apre e non chiude posizioni.
Se invece lo divido in due parti, C1 e C2,— C3 e C4, allora vanno entrambi, con TF h1 su 1k
Grazie e perdona la mia ridotta conoscenza di programmazione
Innanzitutto rimuovi (o commenta) le righe 2 e 3, dal momento che non indichi un orario è meglio non mettere niente, anche perché FLATAFTER=000000 dovrebbe impedire qualunque operatività (non l’ho provato), in quanto qualsiasi orario è > di 000000.
La linea 16 contiene due errori:
- manca AND dopo OnMarket
- NON devi usare le parentesi quadre, ma semplicemente altre tonde, per le espressioni, in quanto con le quadre servono come indice di OnMarket e produrrebbero condizioni sballate, scrivi quella riga (ma anche la 20), così:
IF Not OnMarket AND (( C1 OR C3) AND C5) THEN
Ciao Roberto
vorrei chiederti se su questo sistema si puo’ cambiare qualcosa?
magari scriverlo in forma piu’ corretta o altro?
TF usato h1 su uno storico di 1k candele, cioè 3 mesi
è gia’ live da inizio mese e ogni mese lo vorrei aggiornare per eventuali cambio di valori delle variabili.
Cosa ne pensi? Grazie
DEFPARAM CumulateOrders = false
c7= adx[5]> A
//**********************************************************************
// engulfing pattern rialzista (anche reversal day)
C1=range[0]>=range[1] AND close[1]<open[1] AND close[0]>open[0] AND open[0]<=close[1] AND close[0]>=open[1]AND range[0]>averagetruerange[ B ](close)*1
// engulfing pattern ribassista (anche reversal day)
C2=range[0]>=range[1] AND close[1]>open[1] AND close[0]<open[0] AND open[0]>=close[1] AND close[0]<=open[1]AND range[0]>averagetruerange[ B ](close)*1
//**********************************************************************
// hammer rialzista
C3 = close[1]<open[1] AND open[0]>low[0]+(range*0.66) AND close[0]>low[0]+(range*0.66) AND range[0]>abs(open-close)*4 AND low[0]<low[1] AND range[0]>averagetruerange[ C ](close)*1
// shooting star ribassista
C4 = close[1]>open[1] AND open[0]<high[0]-(range*0.66) AND close[0]<high[0]-(range*0.66) AND range[0]>abs(open-close)*4 AND high[0]>high[1] AND range[0]>averagetruerange[ C ](close)*1
//**********************************************************************
// swing point low + one white soldier (rialzista)
C5 = close[2]<open[2] AND low[2]>low[1] AND low[0]>low[1] AND close[0]>open[0] AND close[0]>high[1] AND high[2]>high[1] AND high[0]>high[1] AND high[0]>high[2] AND close[0]>open[2] AND close[0]>=low[0]+(range[1]*0.50) AND range[0]>averagetruerange[ D ](close)*1
// swing point high + one white soldier (ribassista)
C6 = close[2]>open[2] AND high[2]<high[1] AND high[0]<high[1] AND close[0]<open[0] AND close[0]<low[1] AND low[2]<low[1] AND low[0]<low[1] AND low[0]<low[2] AND close[0]<open[2] AND close[0]<=high[0]-(range[1]*0.50) AND range[0]>averagetruerange[ D ](close)*1
//**********************************************************************
IF Not OnMarket AND (( C1 OR C3 OR C5 ) AND C7) THEN
BUY 1 CONTRACT AT MARKET
ENDIF
IF Not OnMarket AND (( C2 OR C4 OR C6 ) AND C7) THEN
SELLSHORT 1 CONTRACT AT MARKET
ENDIF
SET STOP pLOSS S
SET TARGET pPROFIT S
Se è profittevole va bene, non entro nel merito. Direi che va bene che tu lo aggiorni con una certa frequenza, specialmente con un backtest così limitato.
Quando fai i backtest ti consiglio di farli su 200K barre (o almeno 100K), 1K è davvero poco!
Quanto al codice direi che in generale è abbastanza chiaro, però per il mio modo di programmare (ed anche per rendere l’esecuzione più efficiente) eviterei di mettere tutte quelle condizioni su una sola riga, oltre a rendere il codice più lento ed inefficiente sono anche difficili da individuare chiaramente e, di conseguenza, è più difficile farci eventuali modifiche. A me piace mettere le singole condizioni separatamente e poi, alla fine, farne il riepilogo in una condizione più generale, esempio:
c1 = ....
c2 = ....
c3 = ....
c4 = ....
Cond = c1 AND ((c2 OR c3) AND c4)