English Русский 中文 Español Deutsch 日本語 Português 한국어 Français Türkçe
preview
Indicatore CCI. Aggiornamento e nuove funzionalità

Indicatore CCI. Aggiornamento e nuove funzionalità

MetaTrader 5Esempi | 9 febbraio 2023, 16:50
636 0
Aleksej Poljakov
Aleksej Poljakov

Breve storia

Commodity Channel Index (CCI) è noto a tutti i trader. È stato sviluppato da Donald Lambert e pubblicato per la prima volta nel 1980 sulla rivista Commodities (ora Modern Trader). Da allora, questo indicatore ha guadagnato una meritata fama ed è diventato molto popolare tra i trader. È presente nel kit della piattaforma di trading MetaTrader ed è utilizzato sia nel trading manuale sia come parte di sistemi di trading automatici.


Algoritmo di calcolo

Il calcolo dell'indicatore è abbastanza semplice e chiaro. L'indicatore mostra quanto il prezzo si è discostato dal valore medio in relazione alla deviazione media assoluta. L'algoritmo di calcolo può essere rappresentato come segue. Lasciamo che il periodo dell'indicatore sia N letture di prezzi. Quindi:

  • Calcolare la media 

media

  • Trovare la deviazione media assoluta

MAD

  • Calcolo del valore dell'indicatore

CCI

Nell'indicatore originale, il fattore di correzione k = 0,015. Viene selezionato in modo tale che la deviazione del prezzo di 1,5*MAD sia uguale a 100 unità dell'indicatore. In questo caso, la deviazione di 3*MAD è di 200 unità. (È interessante notare che se la divisione viene sostituita dalla moltiplicazione, il valore del coefficiente di normalizzazione k è 66,6).


Possibili modifiche all'algoritmo

La caratteristica principale dell'indicatore è l'utilizzo della deviazione media assoluta. Questo approccio era completamente giustificato agli albori della tecnologia informatica, poiché il calcolo della deviazione assoluta richiedeva meno risorse di calcolo rispetto al calcolo della più appropriata deviazione standard. I computer moderni possono gestire la quadratura e le radici in un tempo ragionevole. Pertanto, l'algoritmo di calcolo può apparire come segue.

  • Trovare la somma di numeri:

sumS

  • Trovare la somma dei quadrati:

sumQ

  • Calcolare il valore dell'indicatore:

CCI

Questo algoritmo è più preciso, ma non è ancora perfetto. Il problema principale è che la stima dei valori medi e quadrati medi richiede un numero sufficientemente elevato di letture dei prezzi (non meno di trenta). Tuttavia, anche i periodi brevi possono essere utilizzati per il trading. Ad esempio, nella versione classica del CCI, si raccomanda un periodo di 14 campioni.

Tali situazioni richiedono metodi statistici robusti. Esse consentono di ottenere stime dei parametri abbastanza stabili e affidabili anche in situazioni molto estreme, che sono così abbondanti nei mercati finanziari.

Diamo un’occhiata a come funzionano i metodi robusti e confrontiamoli con quelli classici. Per esempio, prendiamo una serie temporale di tre valori: p[0] = 1, p[1] = 3, p[2] = 8.

L'approccio classico si riduce quindi ai seguenti calcoli:

  • Media (1 + 3 + 8) / 3 = 4
  • Deviazione assoluta (abs(1 - 4) + abs(3 - 4) + abs(8 - 4)) /3 = 2.67
  • Limiti inferiori e superiori del canale 1,33 - 6,67 

Ora calcoliamo usando la deviazione standard:

  • Media (1 + 3 + 8) / 3 = 4
  • Deviazione Standard sqrt(((1 – 4)^2 + (3 – 4)^2 + (8 – 4)^2) / 3) = 2.94
  • Limiti inferiori e superiori del canale 1,06 - 6,94

Stime robuste sono più costose nei calcoli. Utilizziamo il metodo Theil-Sen per stimare la media. A tal fine, occorre innanzitutto trovare tutte le semisomme dei valori delle serie temporali prese a coppie. Il numero di queste coppie si può ottenere con l'equazione: num=(N*(N-1)) / 2.

In questo caso, la media stabile è uguale alla mediana di queste semisomme. Per trovare la mediana, dobbiamo prima ordinare l'array in ordine crescente. La mediana corrisponderà al valore al centro dell’array. Per trovare il valore mediano, abbiamo bisogno dell'indice dell'elemento centrale se la dimensione dell'array è un numero dispari e l'indice dei due elementi centrali se la dimensione dell'array è un numero pari. Allora la mediana è uguale alla media di questi due elementi.

Le equazioni per il calcolo degli indici in entrambi i casi ("dimensione" è il numero di elementi dell'array):

  • dimensione numero dispari

Indice = dimensione / 2

  • dimensione numero pari

Indice1 = dimensione / 2 - 1; Indice2 = dimensione / 2

Nel caso del nostro esempio, sarà il seguente:

hs1 = (1 + 3) / 2 = 2

hs2 = (1 + 8) / 2 = 4,5

hs3 = (3 + 8) / 2 = 5,5

Ordinamento 2, 4.5, 5.5

  • Media = 4.5

Passiamo ora alla deviazione. Dobbiamo trovare la mediana tra i valori assoluti della serie temporale originale e la sua media.

d1 = abs(1 - 4,5) = 3.5

d2 = abs(3 - 4,5) = 1.5

d3 = abs(8 - 4,5) = 3.5

Ordinamento 3.5, 1.5, 3.5

  • Deviazione = 3.5
  • Limiti inferiori e superiori del canale 1 - 8


Confronto tra le versioni classica e aggiornata dell'indicatore

Confrontiamo questi approcci. Con i calcoli normali, i valori minimi e massimi della serie temporale andavano oltre la deviazione media +/- . Nel caso di una stima robusta, tutti i valori della serie originale rientrano in questi confini. La differenza tra i tre approcci è evidente, ma solo nel nostro esempio. Vediamo ora come si comportano i diversi metodi di calcolo su dati reali. Implementiamo tutti e tre gli algoritmi come indicatori separati. Questo ci permetterà anche di conoscere le caratteristiche del calcolo di ciascuna opzione.

L'aspetto dell'indicatore dipende in larga misura da due variabili - la costante del prezzo applicato e il suo periodo. In MQL5, la costante del prezzo può essere impostata quando si definiscono le proprietà dell'indicatore.

#property indicator_applied_price PRICE_TYPICAL

In MQL4, utilizzerò una funzione separata.

Il periodo dell'indicatore mostra il numero di letture dei prezzi utilizzate nei calcoli.

input ushort iPeriod=14;//indicator period

Il valore della variabile deve essere almeno tre. Tenere presente che in caso di periodi piccoli è possibile ottenere valori errati (troppo grandi).

Il calcolo della versione classica del CCI su ogni i esima barra viene eseguito come segue. In primo luogo, trovare il valore della media nel campione.

double mean=0;                //sample mean
for(int j=0; j<iPeriod; j++)
   {
    mean=mean+price[i+j];     //sum up price values
   }
mean=mean/iPeriod;            //sample mean for the period

Ora è il momento di calcolare la deviazione media assoluta.

double mad=0;                          //mean absolute deviation
for(int j=0; j<iPeriod; j++)
   {
    mad=mad+MathAbs(price[i+j]-mean);  //sum up absolute difference values
   }

Se il valore della deviazione media assoluta è maggiore di zero, l'indicatore è uguale a:

res=(price[i]-mean)*iPeriod/mad;

La versione dell'indicatore che utilizza la deviazione standard è calcolata come segue. Per prima cosa, dobbiamo trovare le somme dei prezzi e i loro quadrati.

double sumS=0,//sum of prices
       sumQ=0;//sum of price squares
for(int j=0; j<iPeriod; j++)
   {
    sumS=sumS+price[i+j];
    sumQ=sumQ+price[i+j]*price[i+j];
   }

Ora dobbiamo trovare il denominatore necessario per calcolare l'indicatore.

double denom=MathSqrt(iPeriod*sumQ-sumS*sumS);

Se il denominatore è maggiore di zero, il risultato è il seguente:

res=(iPeriod*price[i]-sumS)/denom;

Infine, consideriamo i calcoli con i metodi robusti. Per prima cosa, dobbiamo preparare due array per memorizzare i risultati intermedi. Un array serve a memorizzare i valori delle semisomme, mentre un altro serve a memorizzare le differenze assolute.

double halfsums[],diff[];

Per prima cosa, preparare l'array halfsums per un successivo utilizzo. Per farlo, definiamo le sue dimensioni.

int size=iPeriod*(iPeriod-1)/2; //halfsums array size
ArrayResize(halfsums,size);     //set the array size

Ora troviamo gli indici degli elementi centrali degli array. Per motivi di versatilità, utilizzerò due indici. Se la dimensione è dispari, gli indici corrisponderanno tra loro, mentre in caso contrario saranno diversi.

indx10=size/2;
indx11=indx10;
if(MathMod(size,2)==0)
   indx11=indx10-1;

Successivamente, preparare l'array diff. La sua dimensione coincide con il periodo dell'indicatore. Gli indici degli elementi sono gli stessi del caso precedente.

ArrayResize(diff,iPeriod);
indx20=iPeriod/2;
indx21=indx20;
if(MathMod(iPeriod,2)==0)
   indx21=indx20-1;

Ora è il momento di iniziare a calcolare i valori degli indicatori. Abbiamo bisogno di un contatore aggiuntivo per riempire l'array con le semisomme.

int cnt=0; //counter of array elements
for(int j=iPeriod-2; j>=0; j--)
   {
    for(int k=iPeriod-1; k>j; k--)
       {
        halfsums[cnt]=(price[i+j]+price[i+k])/2; //half sum value
        cnt++;                                   //increase the counter
       }
   }

Dopo aver riempito l'array, questo deve essere ordinato. I valori del centro dell’array devono essere utilizzati come stima della media.

ArraySort(halfsums);                               //sort the array
double mean=(halfsums[indx10]+halfsums[indx11])/2; //robust mean

Nella fase successiva, troviamo una stima robusta della deviazione standard.

for(int j=0; j<iPeriod; j++)
   {
    diff[j]=MathAbs(price[i+j]-mean);
   }
    
ArraySort(diff);
double sd=(diff[indx20]+diff[indx21])/2; //robust standard deviation

Se la deviazione standard è maggiore di zero, allora il valore dell'indicatore sarà:

res=(price[i]-mean)/sd;

Ora possiamo confrontare il comportamento delle differenti versioni dell'indicatore. In alcuni casi, gli indicatori sembrano molto simili.


Ma ci sono anche aree in cui la differenza è piuttosto evidente.



Un piccolo Expert Advisor per confrontare gli indicatori

I confronti visivi sono soggettivi e possono portare a conclusioni errate. Abbiamo bisogno di basi più affidabili per le nostre conclusioni. Per valutare tutte le versioni degli indicatori, scriviamo un semplice Expert Advisor. Assegniamogli le stesse regole per l'apertura e la chiusura delle posizioni e confrontiamo i risultati. Utilizzerò le seguenti regole: l’attraversamento di un determinato livello apre una posizione in una direzione e chiude le posizioni nella direzione opposta (se presenti).

Parametri EA:

  • TypeInd - tipo di indicatore (Classico, Quadrato, Moderno)
  • iPeriod - periodo dell’indicatore
  • iPrice - prezzo dell’indicatore
  • Level - livello il cui attraversamento deve essere tracciato. Il suo valore di 150 corrisponde al livello di 100 del CCI classico.

Per velocizzare il test, l'algoritmo di calcolo dell'indicatore è stato spostato all'interno dell'EA. I valori dell'indicatore vengono calcolati all'apertura di una nuova barra. Una posizione Buy viene aperta se il valore dell'indicatore attraversa il valore del livello negativo verso l'alto. Allo stesso tempo, le posizioni Sell vengono chiuse. Le posizioni Sell vengono aperte (e le posizioni Buy vengono chiuse) se il valore dell'indicatore attraversa il valore del livello positivo verso il basso.

Parametri del test:

Coppia EURUSD

Timeframe H1

intervallo di tempo - l'anno 2021

iPeriodo = 14

iPrezzo = PRICE_TYPICAL

Livello = 150

Di seguito vengono presentate le curve del Bilancio delle opzioni di tutti e tre i casi.

TipoInd = Classico

tester1

TipoInd = Quadrato

tester2

Come si può notare, l'applicazione della deviazione standard ha portato a una diminuzione del numero di operazioni, seguita da una diminuzione di perdite elevate.

TipoInd = Moderno

tester3

L'uso di stime robuste ha aumentato il numero di operazioni, mentre il numero di perdite elevate è stato ulteriormente ridotto. Questo è un grande vantaggio per una versione di indicatore di questo tipo.

Comunque, le regole per l'apertura e la chiusura delle posizioni devono essere seriamente migliorate in tutti i casi.


    Modifica dell'indicatore per la stima di un trend

    Osservando attentamente l'indicatore CCI (in tutte le sue versioni), ho fatto una scoperta sensazionale - può assumere valori sia positivi che negativi. Non so se questo valga il premio Nobel, ma MetaQuotes Ltd dovrebbe istituire un proprio premio. Me lo merito sicuramente. Ma basta scherzare.

    I valori positivi dell'indicatore sono associati a un trend al rialzo, mentre quelli negativi a un trend al ribasso. Soffermiamoci su questo aspetto in modo più dettagliato. L'idea generale del nuovo indicatore è la seguente: sommiamo i valori dell'indicatore CCI dal momento in cui inizia un trend fino alla sua fine. Naturalmente, confronteremo questo movimento con i valori medi. In questo modo, saremo in grado di valutare la durata del movimento dei trend e la loro forza.

    La versione dei calcoli con stime robuste deve essere utilizzata come base. L'unica differenza è che accumuleremo la somma dei valori dell'indicatore CCI dopo il superamento del livello zero. Il valore di questo importo accumulato verrà utilizzato come output. Gli importi medi per i trend al rialzo e al ribasso saranno calcolati separatamente per poterli confrontare. Il quadro generale di questo indicatore è il seguente.


    Con questo indicatore possiamo valutare l'inizio di un trend, la sua fine e la sua forza. La strategia più semplice per questo indicatore può essere la seguente: al termine del trend, se il trend era superiore alla media (l'indicatore ha attraversato il livello corrispondente), possiamo aspettarci che il prezzo si muova nella direzione opposta.

    Conclusioni

    Come possiamo vedere, un cambio di look agli indicatori tecnici può essere molto utile. Non un singolo indicatore è la versione definitiva - c'è sempre la possibilità di perfezionarlo e modificarlo per strategie specifiche. File allegati:

    • mCCI - indicatore con le tre versioni CCI
    • EA CCI - EA di trading per confrontare le diverse versioni di CCI
    • tCCI - indicatore che calcola gli importi accumulati del trend.

    Tradotto dal russo da MetaQuotes Ltd.
    Articolo originale: https://www.mql5.com/ru/articles/11126

    File allegati |
    mCCI.mq5 (3.84 KB)
    EA_CCI.mq5 (7.46 KB)
    tCCI.mq5 (4.55 KB)
    mCCI.mq4 (5.25 KB)
    EA_CCI.mq4 (6.26 KB)
    tCCI.mq4 (4.54 KB)
    Scienza dei dati e apprendimento automatico (Parte 06): Discesa del Gradiente Scienza dei dati e apprendimento automatico (Parte 06): Discesa del Gradiente
    La discesa del gradiente gioca un ruolo significativo nell'addestramento delle reti neurali e di molti algoritmi di apprendimento automatico. È un algoritmo veloce e intelligente, nonostante il suo lavoro impressionante, è ancora frainteso da molti data scientist, vediamo di cosa si tratta.
    Scopri come progettare un sistema di trading tramite Williams PR Scopri come progettare un sistema di trading tramite Williams PR
    Un nuovo articolo della nostra serie sull'imparare a progettare un sistema di trading con gli indicatori tecnici più popolari tramite MQL5 per poterli utilizzare in MetaTrader 5. In questo articolo impareremo come progettare un sistema di trading tramite l'indicatore Williams %R.
    Sviluppare un Expert Advisor per il trading da zero (Parte 16): Accesso ai dati sul web (II) Sviluppare un Expert Advisor per il trading da zero (Parte 16): Accesso ai dati sul web (II)
    Conoscere come inserire dati dal Web in un Expert Advisor non è così scontato. Non è così facile farlo, senza comprendere tutte le possibilità offerte da MetaTrader 5.
    Scopri come progettare un sistema di trading tramite Ichimoku Scopri come progettare un sistema di trading tramite Ichimoku
    Ecco un nuovo articolo della nostra serie su come progettare un sistema di trading con gli indicatori più comuni, parleremo in dettaglio dell'indicatore Ichimoku e di come progettare un sistema di trading con questo indicatore.