Volevo testare una strategia molto semplice:
- Acquisto a N giorni da fine mese.
- Chiusura a fine mese.
Chiedo se qualcuno può aiutarmi. Grazie
Stefano
Occorre calcolare quanti giorni ha un mese e confrontarlo con il giorno corrente, se è <= N (che stabilirai tu) apri un trade.
Devi stabilire se per giorni del mese intendi i giorni di calendario o quelli di trading. Ad esempio, se vuoi entrare a mercato 10 giorni prima della fine di maggio, vuoi entrare il 21 (31 – 10) oppure il 17 (31 – 10 giorni lavorativi)?
Non sono riuscito a trovare il codice per determinare la differenza.
Qual’e il codice per dire a 10 giorni lavorativi dal fine mese?
Non c’è, devi calcolarli te.
Quando sei ad inizio mese (month<>month[1]) devi:
- calcolare di quanti giorni è il mese (tenendo conto dei possibili anni bisestili)
- fare un ciclo FOR…NEXT da 1 a fine mese e sommare i giorni che hanno OpenDayOfWeek >= 1 e <= 5 (tra lunedì e venerdì)
a questo punto hai il totale di dei giorni lavorativi, ogni giorno di trading decrementi il conteggio e quando arrivi al numero che vuoi, ad esempio 10, entri a mercato. Per verificare se sei in un giorno diverso, sul giornaliero non è un problema perché quando la strategia viene eseguita è trascorso un altro giorno, mentre sui time frame intraday lo determini quando IntraDayBarIndex = 0, questo è un indice delle barre intraday trascorse (BarIndex è il totale delle barre dal momento del lancio della strategia).
Non sarà mai preciso perché non puoi calcolare le giornate festive, magari all’estero, o i giorni di chiusura della borsa, ecc… però è il massimo che puoi ottenere!
Ho provato con il seguente codice
defparam cumulateorders = false
i = 0
FOR i = 1 to 31 do
gglav = summation[31](OpenDayOfWeeK >= 1 and OpenDayOfWeeK <=5)
Next
ggEntrata = gglav - 10
if month = 1 and day = ggEntrata then
buy 1 shares at market
endif
if month = 2 then
sell 1 shares at market
endif
if month = 3 and day = ggEntrata then
buy 1 shares at market
endif
if month = 4 then
sell 1 shares at market
endif
if month = 5 and day = ggEntrata then
buy 1 shares at market
endif
if month = 6 then
sell 1 shares at market
endif
if month = 7 and day = ggEntrata then
buy 1 shares at market
endif
if month = 8 then
sell 1 shares at market
endif
if month = 9 and day = ggEntrata then
buy 1 shares at market
endif
if month = 10 then
sell 1 shares at market
endif
if month = 11 and day = ggEntrata then
buy 1 shares at market
endif
if month = 12 then
sell 1 shares at market
endif
//Mesi con 30 gg
i = 0
FOR i = 1 to 30 do
gglav30 = summation[30](OpenDayOfWeeK >= 1 and OpenDayOfWeeK <=5)
Next
ggEntrata30 = gglav30 - 10
if month = 4 and day = ggEntrata30 then
buy 1 shares at market
endif
if month = 5 then
sell 1 shares at market
endif
if month = 6 and day = ggEntrata30 then
buy 1 shares at market
endif
if month = 7 then
sell 1 shares at market
endif
if month = 8 and day = ggEntrata30 then
buy 1 shares at market
endif
if month = 9 then
sell 1 shares at market
endif
if month = 10 and day = ggEntrata30 then
buy 1 shares at market
endif
if month = 11 then
sell 1 shares at market
endif
Per i mesi di gennaio e marzo funziona.
A giugno, agosto e ottobre entra a mercato ed esce il giono dopo.
In tutti gli altri mesi non indicati non genera nessuna operazione.
Non è proprio così, in particolare le righe 3-6, che calcolano sempre i 31 giorni precedenti, ripetendolo ad ogni barra.
Ecco il codice, l’ho provato sul DAX, sia 4 ore che 1 ora e Giornaliero (va solo LONG, tu metterai le tue condizioni per entrare in una direzione o nell’altra):
GiornoAcquisto = 10 //acquista quando mancano "n" giorni
Mese = Month
Anno = Year
IF Mese <> Mese[1] THEN //il calcolo si fa solo al cambio del mese
IF OnMarket THEN
SELL AT MARKET //sempre al cambio del mese chiudere le posizioni aperte,...
EXITSHORT AT MARKET //... LONG o SHORT che siano
ENDIF
Giorni = 31 //numero di giorni del mese (per la maggior parte ne hanno 31)
IF Mese = 4 OR Mese = 6 OR Mese = 9 OR Mese = 11 THEN
Giorni = 30 //in altri ne hanno 30
ELSIF Mese = 2 THEN
Giorni = 28 //a Febbraio, solitamente, 28 tranne quando è bisestile
IF Anno MOD 4 = 0 THEN
IF Anno MOD 100 = 0 THEN
IF Anno MOD 400 = 0 THEN
Giorni = 29
ENDIF
ELSE
Giorni = 29
ENDIF
ENDIF
ENDIF
// da qui inizia il calcolo dei giorni di trading
NumeroGiorni = 0
Oggi = OpenDayOfWeek
FOR i = 1 TO Giorni
IF Oggi >= 1 AND Oggi <= 5 THEN
NumeroGiorni = NumeroGiorni + 1
ENDIF
Oggi = Oggi + 1
IF Oggi > 7 THEN
Oggi = 1
ENDIF
NEXT
// fine del calcolo dei giorni, NUMEROGIORNI contiene i giorni lavorativi
ENDIF
IF Day <> Day[1] THEN
IF (OpenDayOfWeek >= 1 AND OpenDayOfWeek <= 5) THEN //al cambio di giorno,...
NumeroGiorni = NumeroGiorni - 1 //...se feriale, decrementa il contatore
IF NumeroGiorni < GiornoAcquisto AND Not OnMarket THEN
BUY 1 CONTRACT AT MARKET //Acquista quando mancano i giorni desiderati
SET STOP pLOSS 20
SET TARGET pPROFIT 50
ENDIF
ENDIF
ENDIF
//graph Mese
//graph Anno
//graph Giorni
//graph NumeroGiorni
//graph Oggi
Le ultime 5 righe possono servirti, togliendo i commenti all’inizio della riga, per osservare i valori di quelle variabili candela per candela nell’apposita finestra delle variabili che ProBacktest apre. Quando eseguirai la strategia con ProOrder vanno rimessi i commenti (oppure le togli).
C’è una precisazione da fare per la riga 32, ProOrder (per le strategie) considera la DOMENICA come valore 7, mentre ProBuilder (per gli indicatori) la considera come valore 0.
E’ stata fatta osservare questa discrepanza a PRT e, credo, prima o poi la risolverà. Se non la risolverà tutto rimarrà com’è adesso, se unificherà i due valori a 0 occorrerà cambiare la strategia, se li unificherà a 7 (ma è improbabile, direi, perché contraria al software di quasi tutto il mondo!) occorrerà cambiare gli indicatori (per chi che li ha fatti basandosi sul giorno della settimana).
Un grande ringraziamento, da solo non sarei mai riuscito.
Stefano
Volevo chiedere un’altra cosa.
Utilizzando la chiusura del mese precedente che hai fatto in (https://www.prorealcode.com/topic/dati-candela-mese-precedente/) ho fatto una modifica alla strategia.
Ho inserito la condizione: close[1] < ChiusuraP nella riga di acquisto.
La strategia prevede l’acquisto a “n” giorni dal fine mese.
Se la condizione close[1] < ChiusuraP si verifica ad un numero di giorni diverso da quello indicato come “n” viene aperta l’operazione al giorno diverso da “n”.
-Esempio:
n=10 // acquisto a 10 giorni da fine mese
la condizione (close[1] < ChiusuraP) si verifica a 5 giorni da fine mese. Viene aperta l’operazione a 5 giorni da fine mese: cose che non vorrei.
L’acquisto nel caso di n=10 deve essere fatto solo a 10 giorni da fine mese altrimenti si passa al mese successivo. Si può fare?
IF BarIndex = 0 THEN
//Minimo = low
//Massimo = high
//Apertura = open
Chiusura = close
//MinimoP = low
//MassimoP = high
//AperturaP = open
ChiusuraP = close
ENDIF
IF OpenMonth <> OpenMonth[1] THEN
//MinimoP = Minimo
//MassimoP = Massimo
//AperturaP = Apertura
ChiusuraP = Chiusura
//Apertura = open
//Chiusura = close
//Minimo = low
//Massimo = high
ELSE
//Minimo = min(Minimo,low)
//Massimo = max(Massimo,high)
Chiusura = close
ENDIF
GiornoAcquisto = 10 //acquista quando mancano "n" giorni
Mese = Month
Anno = Year
IF Mese <> Mese[1] THEN //il calcolo si fa solo al cambio del mese
IF OnMarket THEN
SELL AT MARKET //sempre al cambio del mese chiudere le posizioni aperte,...
EXITSHORT AT MARKET //... LONG o SHORT che siano
ENDIF
Giorni = 31 //numero di giorni del mese (per la maggior parte ne hanno 31)
IF Mese = 4 OR Mese = 6 OR Mese = 9 OR Mese = 11 THEN
Giorni = 30 //in altri ne hanno 30
ELSIF Mese = 2 THEN
Giorni = 28 //a Febbraio, solitamente, 28 tranne quando è bisestile
IF Anno MOD 4 = 0 THEN
IF Anno MOD 100 = 0 THEN
IF Anno MOD 400 = 0 THEN
Giorni = 29
ENDIF
ELSE
Giorni = 29
ENDIF
ENDIF
ENDIF
// da qui inizia il calcolo dei giorni di trading
NumeroGiorni = 0
Oggi = OpenDayOfWeek
FOR i = 1 TO Giorni
IF Oggi >= 1 AND Oggi <= 5 THEN
NumeroGiorni = NumeroGiorni + 1
ENDIF
Oggi = Oggi + 1
IF Oggi > 7 THEN
Oggi = 1
ENDIF
NEXT
// fine del calcolo dei giorni, NUMEROGIORNI contiene i giorni lavorativi
ENDIF
IF Day <> Day[1] THEN
IF (OpenDayOfWeek >= 1 AND OpenDayOfWeek <= 5) THEN //al cambio di giorno,...
NumeroGiorni = NumeroGiorni - 1 //...se feriale, decrementa il contatore
IF NumeroGiorni < GiornoAcquisto AND Not OnMarket and close[1]< chiusurap THEN
BUY 1 CONTRACT AT MARKET //Acquista quando mancano i giorni desiderati
SET STOP pLOSS 2000
SET TARGET pPROFIT 5000
ENDIF
ENDIF
ENDIF
//graph Mese
//graph Anno
//graph Giorni
//graph NumeroGiorni
//graph Oggi
graphonprice chiusuraP
Modificando la riga 66 così ti entra solo a 10 giorni dal fine mese (non 9 o 7, ecc…), però solo se close[1]< chiusurap:
IF NumeroGiorni = GiornoAcquisto AND Not OnMarket and close[1]< chiusurap THEN
Se, invece vuoi che entri in qualunque momento purché close[1]< chiusurap, oppure a 10 giorni da fine mese:
IF ((close[1]< chiusurap) OR (NumeroGiorni = GiornoAcquisto)) AND Not OnMarket THEN