Sistema heikin ashi

Viewing 14 posts - 1 through 14 (of 14 total)
  • Author
    Posts
  • #97607 quote
    R05
    Participant
    Veteran

    Gent.mi, vorrei entrare in posizione, ad esempio long, quando si è avuto il minimo di giornata a partire dalle 8 e l’effettiva entrata si ha quando l’heikin ashi diventa verde (quindi si entrerà alla barra successiva). E uscirà dalla posizione al cambio opposto di colore dell’heikin ashi. Fin qui il codice l’ho ottenuto ed è quello che vi ho allegato sotto.

    defparam flatbefore = 090000
    defparam flatafter = 173000
    
    xClose = (Open+High+Low+Close)/4
    
    c10 = (close >= DLow(0))
    c20 = (close <= DHigh(0))
    
    if(barindex>2) then
    xOpen = (xOpen[1] + xClose[1])/2
    endif
     
    c1 = xClose>xOpen AND xClose[1]<xOpen[1]
    c2 = xClose<xOpen AND xClose[1]>xOpen[1]
     
    if c1 AND Not LongOnMarket and c10 then
    BUY 1 SHARE AT MARKET
    endif
    if c2 then
    sell 1 share at market
    endif
    
     
    if c2 AND Not ShortOnMarket and c20 then
    SELLSHORT 1 SHARE AT MARKET
    endif
    if c1 then
    exitshort 1 share at market
    endif

    Vorrei però che ad ogni minimo o massimo mi facesse una sola entrata e non ogni qual volta mi cambia colore l’heikin ashi. Vi allego per meglio chiarirmi un file.

    Alle 11 abbiamo avuto il massimo di giornata e alle 11:20 l’heikin ashi è diventata rossa, entrerò alla barra successiva short e poi  il sistema mi farà uscire correttamente quando l’heikin ashi diventa verde. Il problema è che alle 11.50 l’hiekin ashi mi ridiventa di nuovo rossa e mi fa aprire un’altra posizioni short: qui il sistema non deve aprire la posizione, ma aprirà nell’eventualità un altro short solo se si formerà un nuovo massimo di giornata.

    Spero di essere stato chiaro. Vi ringrazio.

    Cattura.jpg Cattura.jpg
    #97617 quote
    robertogozzi
    Moderator
    Master

    Alla riga 3 scrivi:

    ONCE Attivo = 1   //1=trading attivo  0=trading disattivato

    Alle righe 16 e 24 aggiungi, alle condizioni già presenti:

    AND Attivo

    Tra le righe 17 e 18 e tra le righe 25 e 26 aggiungi questa:

    Attivo = 0
    #97618 quote
    robertogozzi
    Moderator
    Master

    Fatto questo il Trading è disattivato, puoi riattivarlo quando vuoi, dopo un certo numero di barre usando un contatore.

    Puoi riattivarlo alla prima candela di ogni nuovo giorno (così non potrai fare più di un’operazione al giorno) con:

    IF IntraDayBarIndex = 0 THEN
       Attivo = 1
    ENDIF

    Oppure puoi riattivarlo, sempre assegnandogli 1, quando si verifica una condizione di tua scelta.

    #97620 quote
    R05
    Participant
    Veteran

    Grazie Roberto, gentilissimo. Ho fatto le modifiche che mi hai detto solo che ora non mi fa aprire nessuna operazione.

    defparam flatbefore = 090000
    defparam flatafter = 173000
    ONCE Attivo = 1   //1=trading attivo  0=trading disattivato
    
    xClose = (Open+High+Low+Close)/4
    
    c10 = (close >= DLow(0))
    c20 = (close <= DHigh(0))
    
    if(barindex>2) then
    xOpen = (xOpen[1] + xClose[1])/2
    endif
     
    c1 = xClose>xOpen AND xClose[1]<xOpen[1]
    c2 = xClose<xOpen AND xClose[1]>xOpen[1]
     
    if c1 AND Not LongOnMarket and c10 AND Attivo then
    BUY 1 SHARE AT MARKET
    Attivo = 0
    endif
    if c2 then
    sell 1 share at market
    endif
    
     
    if c2 AND Not ShortOnMarket and c20 AND Attivo then
    SELLSHORT 1 SHARE AT MARKET
    Attivo = 0
    endif
    if c1 then
    exitshort 1 share at market
    endif
    
    #97623 quote
    robertogozzi
    Moderator
    Master

    E’ veramente strano, però ho trovato il modo di farlo funzionare.

    Togli le righe 19 e 28, poi aggiungi queste subito dopo la riga 3:

    IF IntraDayBarIndex = 0 THEN
       Attivo = 1
    endif
    if OnMarket THEN
       Attivo = 0
    endif

    In pratica invece di disattivare il trading quando esegue BUY o SELLSHORT lo fa disattivare quando rileva di essere a mercato (OnMarket).

    Lo riabilita ad inizio giornata (altrimenti fa solo un’operazione), ma questo puoi deciderlo tu cambiando le istruzioni.

    E’ un comportamento insolito, che non mi era mai capitato, in pratica fin dalla prima barra eseguiva le righe 19 e 28, ma non le righe 18 e 27!

    #97624 quote
    R05
    Participant
    Veteran

    Grazie Roberto funziona. Come mi scrivevi tu fa solo un’operazione al giorno, la prima. Non so, però, come cambiare le istruzioni per fargli fare tutte le operazioni che mi occorrono. Vorrei che a ogni nuovo massimo quando l’heikin ashi diventa rossa mi apre lo short e viceversa per il long ad ogni nuovo minimo. Come faccio a riattivare il sistema quando si verifica una condizione da me scelta?

    #97629 quote
    robertogozzi
    Moderator
    Master

    Puoi scrivere:

    If  xClose > Massimo then
        NuovoMassimo = 1
        Massimo      = xClose
    Else
        NuovoMassimo = 0
    Endif
    If NuovoMassimo[1] and xOpen > xClose then
       Attivo = 1
    Endif
    #97756 quote
    R05
    Participant
    Veteran

    Grazie Roberto. Ho provato a fare il sistema seguente ma non riesco proprio a capire come combinare le condizioni.

    defparam flatbefore = 090000
    defparam flatafter = 173000
    ONCE Attivo = 1   //1=trading attivo  0=trading disattivato
    
    xClose = (Open+High+Low+Close)/4
    
    Massimo = dhigh(0)
    
    If  xClose > Massimo then
    NuovoMassimo = 1
    Massimo      = xClose
    Else
    NuovoMassimo = 0
    Endif
    If NuovoMassimo[1] and xOpen > xClose then
    Attivo = 1
    Endif
    
    if(barindex>2) then
    xOpen = (xOpen[1] + xClose[1])/2
    endif
     
    c1 = xClose>xOpen AND xClose[1]<xOpen[1]
    c2 = xClose<xOpen AND xClose[1]>xOpen[1]
     
    if c1 AND Not LongOnMarket AND Attivo then
    BUY 1 SHARE AT MARKET
    endif
    if c2 then
    sell 1 share at market
    endif
    
     
    if c2 AND Not ShortOnMarket then
    SELLSHORT 1 SHARE AT MARKET
    endif
    if c1 then
    exitshort 1 share at market
    endif
    
    #97809 quote
    R05
    Participant
    Veteran

    Gent.mo Roberto, alla fine, dopo varie prove, sembra che il codice seguente riesca a fare quello che vorrei io, anche se un pò forzato.

    defparam flatbefore = 090000
    defparam flatafter = 173000
    
    xClose = (Open+High+Low+Close)/4
    
    timeframe(30 minutes,updateonclose)
    c20 = min(low,close)
    c21 = min(low[1],close[1])
    c22 = min(low[2],close[2])
    c23 = min(low[3],close[3])
    c24 = min(low[4],close[4])
    c25 = min(low[5],close[5])
    c26 = min(low[6],close[6])
    c27 = min(low[7],close[7])
    c28 = min(low[8],close[8])
    c29 = min(low[9],close[9])
    
    c50 = c20<c21 and c20<c22 and c20<c23 and c20<c24 and c20<c25 and c20<c26 and c20<c27 and c20<c28 and c20<c29
    
    c30 = max(high,close)
    c31 = max(high[1],close[1])
    c32 = max(high[2],close[2])
    c33 = max(high[3],close[3])
    c34 = max(high[4],close[4])
    c35 = max(high[5],close[5])
    c36 = max(high[6],close[6])
    c37 = max(high[7],close[7])
    c38 = max(high[8],close[8])
    c39 = max(high[9],close[9])
    
    c60 = c30>c31 and c30>c32 and c30>c33 and c30>c34 and c30>c35 and c30>c36 and c30>c37 and c30>c38 and c30>c39
     
    //"default" timeframe (the timeframe you will launch the strategy on)
    timeframe(default)
    
    if(barindex>2) then
    xOpen = (xOpen[1] + xClose[1])/2
    endif
     
    c1 = xClose>xOpen AND xClose[1]<xOpen[1]
    c2 = xClose<xOpen AND xClose[1]>xOpen[1]
    
    if c1 AND Not LongOnMarket and c50 then
    BUY 1 SHARE AT MARKET
    endif
    if c2 then
    sell 1 share at market
    endif
    
     
    if c2 AND Not ShortOnMarket and c60 then
    SELLSHORT 1 SHARE AT MARKET
    endif
    if c1 then
    exitshort 1 share at market
    endif
    
    #97898 quote
    robertogozzi
    Moderator
    Master

    A che servono le condizioni da C20 a C39?

    E’ ovvio che

    min(low,close)

    restituirà SEMPRE il valore di Low, come fa Close ad essere < Low, al massimo può essere = Low. Quindi MIN() ti restituirà sempre il valore di Low, che sia inferiore o uguale!

    Lo stesso vale per High.

    Che intendi fare con quelle condizioni, che valore vuoi cercare?

    #97923 quote
    R05
    Participant
    Veteran

    Si Roberto ho visto la formula per creare le candele heikin ashi in cui il minimo dell’heikin ashi è dato dal valore più basso tra il minimo della candela in corso e l’apertura e chiusura della heikin ashi della barra precedente.

    Ti riporto la formula:

    Tale peculiarità deriva dal particolare metodo di costruzione delle candele Heiken Ashi (HA):

    1. Il dato di chiusura della candela HA è costituito da una sorta di media della candela corrente
      ChiusuraHA = (Apertura + Massimo + Minimo + Chiusura) / 4.
    2. L’apertura della HA corrisponde alla media del body (corpo) della candela precedente
      AperturaHA = (AperturaHA[1] + ChiusuraHA[1]) / 2.
    3. Il massimo della HA è il valore più alto tra il massimo della candela corrente, l’apertura e la chiusura sempre della candela corrente calcolata con il metodo HA visto ai precedenti punti 1 e 2
      MassimoHA = Max (Massimo, AperturaHA, ChiusuraHA).
    4. Il minimo della HA è il valore più basso tra il minimo della candela corrente, l’apertura e la chiusura sempre della candela corrente calcolata con il metodo HA visto ai precedenti punti 1 e 2
      MinimoHA = Min (Minimo, AperturaHA, ChiusuraHA).

    Quindi credevo che facendo in quel modo mi dava il valore inferiore proprio della candela heikin ashi. Ma ti dico, è tutto un pò forzato. Non so se faccio correttamente.

    #97929 quote
    robertogozzi
    Moderator
    Master

    A parte che è uguale sia per le candele giapponesi che per quelle HA, il minimo è per forza minore (o al massimo uguale) alla chiusura e viceversa per il massimo, ma tu non fai riferimento alle candele HA ma a quelle giapponesi normali.

    Perché la riga 4 non la sposti alla 35, che sarebbe più chiaro, pur trattandosi dello stesso TF?

    Nel TF a 30 minuti ti riferisci alle candele normali, non alle giapponesi.

    Francamente non capisco cosa tu voglia fare.

    #97948 quote
    R05
    Participant
    Veteran

    Praticamente, dato che non si riusciva, per me in modo semplice, a poter entrare in posizione, ad esempio short al cambio di colore della candela heikin ashi, quando c’era un massimo di giornata e ogni qual volta si verificasse un nuovo massimo (con conseguente cambio di colore sempre dell’heikin ashi); allora, ho cercato di superare questo ostacolo aiutandomi con il multitimeframe: in pratica, il seguente codice, mi dovrebbe riuscire a far in modo che, se sul 30 minuti il minimo della candela è più basso delle precedenti 9 candele, si presume che in quel momento sia il minimo di giornata (andando indietro di 9 candele di 30 minuti, salvo particolari eccezioni, dovrebbe essere il minimo di giornata o comunque a partire dalle 8) e se sul time frame di riferimento l’heikin ashi mi diventa verde entro long. Poi, ad un nuovo minimo sul 30 minuti che sia il minimo delle ultime 9 candele, essendo ovviamente a questo punto un nuovo minimo di giornata, allora rientrerò long sul time frame di riferimento al cambio colore dell’heikin ashi. E così via.

    In effetti rivedendo min(low,close) non è molto chiaro; però il risultato finale, seppur in modo forzato, credo di averlo ottenuto. Infatti, in questo modo, il sistema non mi fa fare sempre operazioni ad ogni cambio di colore dell’heikin ashi, ma solo quando avviene dopo che si è formato un nuovo minimo sul 30 minuti. Non solo, ma il sistema non si ferma alla sola prima operazione di giornata ma prosegue ovviamente alla formazione di ogni minimo.

    Spero, Roberto, di averti chiarito quello che ho fatto ma soprattutto quello che vorrei fare. Certo è un metodo abbastanza semplice, ciò non toglie che si possono aggiungere ulteriori condizioni per filtrare eventuali falsi segnali.

    c20 = min(low,close)
    c21 = min(low[1],close[1])
    c22 = min(low[2],close[2])
    c23 = min(low[3],close[3])
    c24 = min(low[4],close[4])
    c25 = min(low[5],close[5])
    c26 = min(low[6],close[6])
    c27 = min(low[7],close[7])
    c28 = min(low[8],close[8])
    c29 = min(low[9],close[9])
     
    c50 = c20<c21 and c20<c22 and c20<c23 and c20<c24 and c20<c25 and c20<c26 and c20<c27 and c20<c28 and c20<c29
    #98593 quote
    robertogozzi
    Moderator
    Master

    Scusami, se cerchi il LOW (minimo) più basso, perché usi CLOSE (chiusura)?

    Per cercare un minimo di qualunque cosa per le ultime “x” barre scrivere:

    Minimo = lowest[x](...)

    dove X sarà un numero che tu vuoi (magari 9 come nel tuo caso) ed i puntini dovrai sostituirli con quello che tu vuoi trovare, LOW se cerchi il più basso tra i minimi, HIGH se cerchi il più basso tra i massimi, CLOSE se cerchi il più basso tra i CLOSE, una media se cerchi il valore più basso della media, ecc…

    Per il cambio di colore di una candela giapponese si scrive:

    Colore = close > open   //va bene anche "Colore = close < open" se non t'interessa in quale direzione ma ti basta che ci sia stato un cambio
    IF Colore <> Colore[1] THEN
     .
     .
    ENDIF

    per le candele HA basta che ad OPEN e CLOSE anteponga la x.

    R05 thanked this post
Viewing 14 posts - 1 through 14 (of 14 total)
  • You must be logged in to reply to this topic.

Sistema heikin ashi


ProOrder: Trading Automatico & Backtesting

New Reply
Author
author-avatar
R05 @r05 Participant
Summary

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

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