Aiuto creazione strategia acquisto fine mese

Viewing 12 posts - 1 through 12 (of 12 total)
  • Author
    Posts
  • #98539 quote
    Stefano1234
    Participant
    Average

    Volevo testare una strategia molto semplice:

    • Acquisto a N giorni da fine mese.
    • Chiusura a fine mese.

    Chiedo se qualcuno può aiutarmi. Grazie

    Stefano

    #98541 quote
    robertogozzi
    Moderator
    Master

    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)?

    #98543 quote
    Stefano1234
    Participant
    Average

    giorni lavorativi

    #98559 quote
    Stefano1234
    Participant
    Average

    Non sono riuscito a trovare il codice per determinare la differenza.

    Qual’e il codice per dire  a 10 giorni lavorativi dal fine mese?

    #98560 quote
    robertogozzi
    Moderator
    Master

    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!

    #98561 quote
    Stefano1234
    Participant
    Average

    Ci proverò.

    Grazie

    #98567 quote
    Stefano1234
    Participant
    Average

    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.

    #98601 quote
    robertogozzi
    Moderator
    Master

    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).

    #98602 quote
    robertogozzi
    Moderator
    Master

    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).

    #98607 quote
    Stefano1234
    Participant
    Average

    Un grande ringraziamento, da solo non sarei mai riuscito.

    Stefano

    robertogozzi thanked this post
    #99577 quote
    Stefano1234
    Participant
    Average

    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
    
    #99581 quote
    robertogozzi
    Moderator
    Master

    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
Viewing 12 posts - 1 through 12 (of 12 total)
  • You must be logged in to reply to this topic.

Aiuto creazione strategia acquisto fine mese


ProOrder: Trading Automatico & Backtesting

New Reply
Author
Summary

This topic contains 11 replies,
has 2 voices, and was last updated by robertogozzi
6 years, 8 months ago.

Topic Details
Forum: ProOrder: Trading Automatico & Backtesting
Language: Italian
Started: 05/15/2019
Status: Active
Attachments: No files
Logo Logo
Loading...