English Русский 中文 Español Deutsch 日本語 Português 한국어 Français Türkçe
preview
Scopri come progettare un sistema di trading tramite OBV

Scopri come progettare un sistema di trading tramite OBV

MetaTrader 5Trading | 15 novembre 2022, 14:57
451 0
Mohamed Abdelmaaboud
Mohamed Abdelmaaboud

Introduzione

In questo nuovo articolo impareremo a conoscere un nuovo indicatore tecnico che può trattare i volumi così da aiutarci a vedere con una prospettiva diversa: parleremo nel dettaglio dell'indicatore On-Balance Volume (OBV), per cercare di coprire questo interessante argomento e imparare come utilizzare questo indicatore tecnico in nostro favore. I seguenti sono gli argomenti che tratteranno questo indicatore:

  1. Definizione OBV
  2. Strategia OBV
  3. Schema della strategia OBV
  4. Sistema di trading OBV
  5. Conclusioni

Attraverso l'argomento della definizione OBV, impareremo nel dettaglio l'indicatore OBV: identificheremo di cosa si tratta, come viene misurato e come possiamo calcolarlo, oltre a vedere un esempio del suo calcolo. Successivamente, possiamo identificare e conoscere a fondo questo indicatore per sapere come utilizzarlo correttamente. Impareremo come utilizzare l'indicatore OBV utilizzando semplici strategie basate sul concetto dell'indicatore – ciò lo faremo attraverso l'argomento della strategia OBV. Dopo aver individuato come utilizzarlo in base a strategie semplici, progetteremo uno schema che ci aiuterà a scrivere il codice MQL5 di queste strategie poiché questo schema ci aiuterà a stabilire e organizzare i nostri passaggi per creare l'Expert Advisor. Dopo aver progettato lo schema della strategia, saremo pronti per scrivere il nostro codice in MQL5 per creare un Expert Advisor e usarlo in MetaTrader 5 per eseguire le nostre strategie di trading in modo automatico e accurato come con le nostre azioni manuali.

Devo dire che in questo articolo utilizzeremo MQL5 (MetaQuotes Language) per scrivere e creare i nostri Expert Advisor. Quindi li eseguiremo nella piattaforma di trading MetaTrader 5. Se vuoi saperne di più su come installare MetaTrader 5, per poter usare MQL5 che è integrato con MetaTrader 5, puoi controllare questo argomento di scrittura del codice MQL5 nel MetaEditor dal mio precedente articolo. Ti consiglio di applicare ciò che leggi da solo se vuoi padroneggiare ciò che impari poiché la pratica è uno strumento molto importante per padroneggiare qualsiasi cosa.

Avvertenza: Tutte le informazioni sono fornite "così come sono" solo a scopo didattico e non sono preparate per scopi commerciali o di consulenza. Le informazioni non garantiscono alcun tipo di risultato. Se scegliete di utilizzare questi materiali su uno qualsiasi dei vostri conti di trading, lo farete a vostro rischio e pericolo e sarete gli unici responsabili.

Ora, approfondiamo questo articolo per imparare un nuovo strumento e aggiungerlo al nostro kit di strumenti per un'esperienza di trading migliorata.


Definizione OBV

In questa parte, impareremo più in dettaglio sull'indicatore On-balance Volume (OBV). Ma prima parliamo di volume poiché questo indicatore è uno degli indicatori di volume. Quindi, il volume è il numero di azioni o contratti scambiati durante un determinato periodo di tempo. Quando vediamo un volume alto significa che c'è un trading attivo su uno strumento e viceversa, se vediamo un volume basso significa che lo strumento non è stato scambiato attivamente.

Il concetto di volume è molto importante perché se c'è uno strumento che si muove su o giù accompagnato da un volume alto, sarà più forte che se questo movimento è accompagnato da un volume basso. Il volume deve muoversi con il trend. Quando abbiamo un trend rialzista, è meglio vedere il volume aumentare con un movimento verso l'alto e diminuire con le correzioni verso il basso e viceversa quando abbiamo un trend ribassista, potremmo scoprire che il volume aumenta con i movimenti al ribasso e diminuisce con correzioni verso l'alto.

Il volume conferma anche se i breakout sono reali o sono solo falsi breakout: quando i breakout vengono eseguiti con un volume alto, questo sarà un segnale che questi breakout continueranno. 

Se questo rapporto tra il trend e il volume continua come quello che ho citato sarà un segnale di forza del trend attuale e se cambia, questo sarà un segno di debolezza. Se non sai cos’è la tendenza, puoi leggere l'argomento della definizione di trend da un articolo precedente.

On-balance Volume(OBV) è stato sviluppato da Joseph Granville. Misura il flusso di volume positivo e negativo. Ora dobbiamo apprendere come possiamo calcolarlo. Le fasi di calcolo sono le seguenti:

  1. Controllo del prezzo di chiusura - se è alto o basso.
  2. Aggiungere il volume del giorno se c’è stato un aumento del prezzo al valore OBV precedente.
  3. Sottrarre il volume del giorno se c’è stato un ribasso del prezzo dal valore OBV precedente.
  4. Se la chiusura di oggi è uguale alla chiusura di ieri, il valore OBV di oggi sarà uguale al valore OBV di ieri.

Vediamo un esempio di questi passaggi e calcoliamo l'indicatore OBV. Supponiamo di avere i seguenti dati per uno strumento:

Giorno Close Volume
1 54
2 55 10000
3 60 15000
4 65 20000
5 60 10000
6 55 5000
7 60 7000
8 50 7500
9 48.75 8000
10 49 5000
11 48 6000
12 47.75 7500
13 48 9000
14 47.50 10000
15 48 7000
16 47 7500
17 46 6000
18 44 5000
19 45 15000

Per calcolare l'indicatore OBV dai dati precedenti:

Verificheremo i prezzi di chiusura e decideremo se è superiore al prezzo di chiusura precedente o meno. Se è superiore al giorno di chiusura precedente, aggiungeremo accanto ad esso "Positivo" per far riferimento che questo giorno si è avuto un movimento in rialzo. Se è inferiore al giorno di chiusura precedente, aggiungeremo accanto ad esso "Negativo" per far riferimento che questo giorno si è avuto un movimento al ribasso.

Calcolo OBV 1

Quindi, aggiungeremo il volume dei giorni positivi al valore OBV precedente e sottrarremo il volume dei giorni negativi dal valore OBV precedente.

Calcolo OBV 2

Quindi, ora abbiamo i valori OBV calcolati e appare come una curva per misurare il flusso di volume positivo e negativo. Fortunatamente, non è necessario calcolare questo indicatore manualmente poiché puoi trovarlo tra gli indicatori integrati nella MetaTrader 5. L'immagine seguente mostra come inserire questo indicatore sul grafico:

Inserimento OBV

Dopo aver selezionato l'indicatore, si aprirà la seguente finestra dei parametri dell'indicatore:

Inserimento OBV1

1 - il tipo di Volumi.

2 - il colore della curva OBV.

3 - lo stile della curva OBV.

4 - lo spessore della curva OBV.

Dopo aver impostato i parametri desiderati e aver fatto clic su OK, l'indicatore verrà allegato al grafico:

OBV allegato


Strategia OBV

In questa parte impareremo come utilizzare l'indicatore OBV in base al suo concetto. Daremo un'occhiata a semplici strategie. Tuttavia, tieni presente che queste strategie potrebbero non essere adatte a tutti. Pertanto, devi testare qualsiasi strategia prima di utilizzarla per sapere quanto ti potrà essere utile. Qui consideriamo tutte queste strategie con l'obiettivo principale di apprendere le basi dell'indicatore OBV e vedere come funziona.

  • Strategia uno: Movimento OBV semplice

Secondo questa strategia, dobbiamo identificare la direzione della curva OBV confrontando il valore OBV corrente con il valore OBV precedente e vedere se il valore attuale è maggiore del precedente, il che significa che OBV è in aumento. Viceversa, se il valore attuale è inferiore al precedente, l'OBV è in diminuzione.

Puoi modificare la lunghezza dei dati di cui hai bisogno per confrontare l'OBV corrente con altri dati precedenti, ma qui condividiamo solo l'idea di come possiamo utilizzare l'indicatore e come possiamo codificare questo utilizzo in MQL5. Successivamente, puoi ottimizzarlo in base alle tue preferenze.

OBV attuale > OBV precedente --> OBV in aumento

OBV attuale < OBV precedente --> OBV in calo

  • Strategia due: Forza OBV semplice

Secondo questa strategia, dobbiamo identificare la forza dell'attuale valore OBV confrontandolo con la media dei precedenti quattro valori OBV. Se il valore OBV corrente è maggiore della media dei quattro valori OBV precedenti, l'OBV è forte e viceversa, se il valore OBV corrente è inferiore alla media dei quattro valori OBV precedenti, l'OBV è debole.

Puoi anche aumentare la lunghezza della media da confrontare con i dati attuali, ma l'obiettivo qui è vedere come utilizzare l'indicatore. Quindi puoi regolare ciò che desideri in base alle tue preferenze e ai risultati dei test. 

OBV corrente > AVG dei quattro precedenti OBV --> OBV forte

OBV corrente < AVG dei quattro valori OBV precedenti --> OBV debole

  • Strategia tre: OBV semplice - trend rialzista

Durante il trend rialzista, come sappiamo, è meglio vedere il volume muoversi con il trend. Quindi l'OBV dovrebbe aumentare con il movimento rialzista. Quindi questa strategia permette di valutare se il movimento è forte o meno. Confronteremo il valore OBV corrente e quello precedente e confronteremo il massimo attuale e il massimo precedente. Quando il valore OBV corrente è maggiore del valore OBV precedente e il massimo attuale è maggiore del massimo precedente, il movimento al rialzo è forte durante il trend rialzista.

OBV attuale > OBV precedente e massimo attuale > massimo precedente --> Forte movimento durante il trend rialzista

  • Strategia quattro: OBV semplice - trend ribassista

Durante il trend ribassista, è meglio vedere il volume muoversi con il trend. L'OBV dovrebbe aumentare con il movimento ribassista. Questo permette di capire se il movimento è forte o meno. Confronteremo il valore OBV corrente e il valore OBV precedente e confronteremo allo stesso tempo il minimo corrente e il minimo precedente. Quando il valore OBV corrente è inferiore al valore OBV precedente e il minimo corrente è inferiore al minimo precedente, il movimento al ribasso è forte durante il trend ribassista.

OBV attuale < OBV precedente e minimo attuale < minimo precedente --> Forte movimento durante il trend ribassista


Schema della strategia OBV

In questa parte, progetteremo uno schema per ciascuna strategia. Fornirà una chiara descrizione passo dopo passo di come progettare un sistema di trading per ciascuna strategia menzionata. Innanzitutto, dobbiamo progettare un semplice OBV per presentare un commento sul grafico con il valore OBV corrente. Ecco lo schema per questo:

Schema OBV Semplice

  • Strategia uno: Movimento OBV semplice:

In questa strategia, dobbiamo conoscere la direzione della curva OBV in base al valore OBV corrente e al valore OBV precedente. Quindi, per ogni tick, dobbiamo controllare l'OBV corrente e il valore OBV precedente e quando il valore corrente è maggiore del precedente, questo sarà segno che l'OBV è in aumento e viceversa, quando il valore corrente è inferiore al precedente, questo sarà segno che l'OBV è in calo.

Quello che segue è uno schema passo dopo passo per questa strategia per aiutarci a progettare un sistema di trading per essa:

Schema Movimento OBV Semplice

  • Strategia due: Forza OBV Semplice:

In questa strategia, dobbiamo misurare la forza dell'OBV attuale confrontandolo con la media dei quattro valori precedenti. Se l'OBV corrente è maggiore della media dei quattro valori OBV precedenti, l'OBV è forte e viceversa se l'OBV corrente è inferiore alla media dei quattro valori OBV precedenti, l'OBV è debole.

Quello che segue è uno schema passo dopo passo per creare questo sistema di trading:

Schema Forza OBV Semplice

  • Strategia tre: OBV semplice - trend rialzista:

In questa strategia, dobbiamo sfruttare a nostro vantaggio uno degli indicatori di volume che è l'OBV per misurare l'attuale movimento dei prezzi. Quindi, durante il trend rialzista, dobbiamo controllare il valore OBV corrente e confrontarlo con il valore OBV precedente e se il valore attuale è maggiore del valore precedente quindi dobbiamo controllare il prezzo massimo attuale e confrontarlo con il prezzo massimo precedente e se il valore corrente è maggiore del valore precedente, questo sarà un segno che l'attuale movimento al rialzo è forte durante il trend rialzista perché abbiamo l'OBV corrente che è maggiore dell'OBV precedente e il massimo attuale è maggiore del massimo precedente.

Quello che segue è uno schema passo-passo per codificare questa strategia:

OBV semplice - Schema trend rialzista

  • Strategia quattro: OBV semplice - trend ribassista:

In questa strategia, durante il trend ribassista, dobbiamo controllare il valore OBV corrente e confrontarlo con il valore OBV precedente e se il valore corrente è inferiore al valore precedente e dobbiamo controllare il prezzo minimo corrente e confrontarlo con il prezzo minimo precedente e se il valore corrente è inferiore al valore precedente, questo sarà un segno che l'attuale movimento al ribasso è forte durante il trend ribassista perché abbiamo l'OBV corrente che è inferiore all'OBV precedente e l'attuale minimo è inferiore al minimo precedente .

Quello che segue è uno schema passo-passo per codificare questa strategia:

OBV semplice - Schema trend ribassista


Sistema di trading OBV

In questa parte interessante, impareremo come creare un sistema di trading per ciascuna strategia menzionata per avvantaggiarci con la programmazione MQL5, poiché la programmazione è uno strumento magico che può aiutarci ad alleggerire la nostra vita creando un sistema che può fare ciò che facciamo manualmente e questo non è l'unico vantaggio in quanto eseguirà e farà ciò di cui abbiamo bisogno in modo accurato e rapido e un sacco di altri vantaggi che possiamo trarre dalla programmazione.

Ora inizieremo a creare un sistema di trading per ogni strategia. Innanzitutto, creeremo un semplice sistema di trading OBV per generare un commento sul grafico con il valore OBV corrente.

  • Creando un array per OBV utilizzando la funzione "double", "double" è un tipo reale o un tipo a virgola mobile che rappresenta valori con una parte frazionaria. Per tua informazione, ci sono due tipi di virgola mobile e sono double e float. Il tipo "double" rappresenta i numeri con la doppia precisione del tipo float:
double OBVArray[];
  • Ordinamento dell'array OBV utilizzando la funzione "ArraySetAsSeries" che restituisce true o false:
ArraySetAsSeries(OBVArray,true);

  • Definire l'OBV utilizzando la funzione "iOBV" dopo aver creato una variabile intera per OBVDef, la funzione "iOBV" restituisce l'handle dell'indicatore On Balance Volume e i suoi parametri sono (simbolo, periodo, volume applicato):
int OBVDef =iOBV(_Symbol, _Period,VOLUME_TICK);
  • Riempimento di OBVArray con OBVDef utilizzando la funzione "CopyBuffer" che restituisce il conteggio dei dati copiati e i suoi parametri sono (handle dell'indicatore, numero del buffer, ora di inizio, ora di fine, buffer):
CopyBuffer(OBVDef,0,0,3,OBVArray);
  • Calcolo del valore OBV corrente dopo aver creato una variabile double per OBVValue:
double OBVValue=OBVArray[0];
  • Creazione di un commento utilizzando la funzione "comment" per visualizzare un commento sul grafico con il valore OBV corrente:
Comment("OBV Value is: ",OBVValue);

Quindi, il seguente è il codice completo per il sistema di trading precedente che fa comparire il valore OBV corrente come commento:

//+------------------------------------------------------------------+
//|                                                   Simple OBV.mq5 |
//|                                  Copyright 2022, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
void OnTick()
  {
   //creating an array for OBV
   double OBVArray[];
   
   //sorting the array from the current data
   ArraySetAsSeries(OBVArray,true);
   
   //defining OBV
   int OBVDef =iOBV(_Symbol, _Period,VOLUME_TICK);
   
   //defining EA, buffer, sorting in array
   CopyBuffer(OBVDef,0,0,3,OBVArray);
   
   //calculating current OBV value
   double OBVValue=OBVArray[0];
   
   //creating a comment with OBV value
   Comment("OBV Value is: ",OBVValue);  
  }
//+------------------------------------------------------------------+

Dopo aver compilato questo codice, possiamo trovarlo nel navigatore della Metatrader 5 come nell'immagine seguente:

OBV nav1

Se volessimo eseguirlo, faremo doppio clic sul file o lo trasciniamo e rilasciamo sul grafico, troveremo apparire la seguente finestra:

Finestra OBV semplice

Dopo aver premuto "OK", troveremo l'expert advisor allegato al grafico come nell'immagine seguente:

OBV semplice allegato

Quindi, possiamo scoprire che il segnale generato appare lo stesso come il seguente test d’esempio:

Test Segnale OBV Semplice

Se volessimo assicurarci di ottenere lo stesso valore dell'indicatore On Balance Volume integrato in Meta Trader 5, possiamo farlo inserendo l'indicatore On Balance Volume lo stesso che abbiamo menzionato prima, dopo aver allegato il nostro expert advisor appena creato , allora scopriremo che i valori saranno gli stessi e il seguente ne è un esempio:

OBV semplice stesso segnale dell'indicatore

 Ora, dobbiamo creare un sistema di trading per ciascuna strategia menzionata e quanto segue è come farlo.

  • Strategia uno: Movimento OBV semplice:

Secondo questa strategia, la stessa che ho menzionato, dobbiamo confrontare due valori e sono il valore OBV corrente con il valore OBV precedente, e decidere se il valore corrente è maggiore del valore precedente, abbiamo bisogno di un segnale che appaia come un commento sul grafico che dica "OBV in aumento", il valore OBV corrente e il valore OBV precedente. Di seguito è riportato il codice completo per creare questo tipo di strategia:

//+------------------------------------------------------------------+
//|                                          Simple OBV movement.mq5 |
//|                                  Copyright 2022, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
void OnTick()
  {
//creating an two arrays for OBV
   double OBVArray1[];
   double OBVArray2[];

//sorting the array from the current data
   ArraySetAsSeries(OBVArray1,true);
   ArraySetAsSeries(OBVArray2,true);

//defining OBV
   int OBVDef =iOBV(_Symbol, _Period,VOLUME_TICK);

//defining EA, buffer, sorting in array
   CopyBuffer(OBVDef,0,0,3,OBVArray1);
   CopyBuffer(OBVDef,0,0,3,OBVArray2);

//getting the value of current and previous OBV
   double OBVCurrentValue=NormalizeDouble(OBVArray1[0],5);
   double OBVPrevValue=NormalizeDouble(OBVArray2[1],5);

//creating conditions of rising and declining OBV based on its values   
   if(OBVCurrentValue>OBVPrevValue)
     {
      Comment("OBV is rising","\n","OBV current is ",OBVCurrentValue,"\n","OBV previous is ",OBVPrevValue);
     }

   if(OBVCurrentValue<OBVPrevValue)
     {
      Comment("OBV is declining","\n","OBV current is ",OBVCurrentValue,"\n","OBV previous is ",OBVPrevValue);
     }

  }
//+------------------------------------------------------------------+
  • Differenze in questo codice:
 Creazione di due array per l'OBV:
double OBVArray1[];
double OBVArray2[];

Ordinamento di questi due array partendo dai dati attuali:

ArraySetAsSeries(OBVArray1,true);
ArraySetAsSeries(OBVArray2,true);

Riempimento di questi due array:

CopyBuffer(OBVDef,0,0,3,OBVArray1);
CopyBuffer(OBVDef,0,0,3,OBVArray2);

Ottenimento dei valori dell'OBV corrente e precedente utilizzando la funzione "NormalizeDouble" che restituisce un valore di tipo double con precisione preimpostata dopo aver creato una variabile double per OBVCurrentValue e OBVPrevValue e i parametri di "NormalizeDouble" sono (valore e cifre), il valore sarà l'OBVArray e le cifre saranno 5 che è il numero di cifre dopo la virgola:

double OBVCurrentValue=NormalizeDouble(OBVArray1[0],5);
double OBVPrevValue=NormalizeDouble(OBVArray2[1],5);

Impostazione delle condizioni di aumento e diminuzione dell'OBV utilizzando la funzione "if":

if(OBVCurrentValue>OBVPrevValue)
   {
    Comment("OBV is rising","\n","OBV current is ",OBVCurrentValue,"\n","OBV previous is ",OBVPrevValue);
   }

if(OBVCurrentValue<OBVPrevValue)
   {
    Comment("OBV is declining","\n","OBV current is ",OBVCurrentValue,"\n","OBV previous is ",OBVPrevValue);
   }

Dopo la compilazione l'esperto apparirà nella finestra del navigatore tra quelli della cartella "Expert Advisors" nella piattaforma di trading MetaTrader 5 come alla seguente:

OBV nav2

Facendo doppio clic sul file dell’expert apparirà la seguente finestra:

 Finestra Movimento OBV semplice

Dopo aver premuto "OK", l'esperto sarà allegato al grafico come segue:

 Movimento OBV semplice allegato

I seguenti sono esempi di test per i segnali generati secondo questa strategia,

OBV crescente:

Segnale di aumento movimento OBV semplice

OBV calante:

Segnale decrescente movimento OBV semplice

  • Strategia due: Forza OBV Semplice:

Secondo questa strategia, la stessa che ho menzionato, dobbiamo confrontare due valori e sono il valore OBV corrente e il valore medio dei quattro valori OBV precedenti, dopo aver calcolato questa media decidere se il valore corrente è maggiore della media questo significa che "OBV è forte" e viceversa, se il valore corrente è inferiore alla media significa che "OBV è debole". Quello che segue è il codice completo per creare un sistema di trading per questa strategia:

//+------------------------------------------------------------------+
//|                                          Simple OBV Strength.mq5 |
//|                                  Copyright 2022, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
void OnTick()
  {
   //creating an six arrays for OBV
   double OBVArray0[];
   double OBVArray1[];
   double OBVArray2[];
   double OBVArray3[];
   double OBVArray4[];
   
   //sorting arrays from the current data
   ArraySetAsSeries(OBVArray0,true);   
   ArraySetAsSeries(OBVArray1,true);
   ArraySetAsSeries(OBVArray2,true);
   ArraySetAsSeries(OBVArray3,true);
   ArraySetAsSeries(OBVArray4,true);
   
   //defining OBV
   int OBVDef =iOBV(_Symbol, _Period,VOLUME_TICK);
   
   //defining EA, buffer, sorting in arrays
   CopyBuffer(OBVDef,0,0,5,OBVArray0);
   CopyBuffer(OBVDef,0,0,5,OBVArray1);
   CopyBuffer(OBVDef,0,0,5,OBVArray2);
   CopyBuffer(OBVDef,0,0,5,OBVArray3);
   CopyBuffer(OBVDef,0,0,5,OBVArray4);
   
   //getting the value of current OBV & previous 5 values
   double OBVCurrentValue=NormalizeDouble(OBVArray0[0],5);         
   double OBVPrevValue1=NormalizeDouble(OBVArray1[1],5);
   double OBVPrevValue2=NormalizeDouble(OBVArray2[2],5);
   double OBVPrevValue3=NormalizeDouble(OBVArray3[3],5);
   double OBVPrevValue4=NormalizeDouble(OBVArray4[4],5);
   
   //calculating average of previous OBV value
   double OBVAVG=((OBVPrevValue1+OBVPrevValue2+OBVPrevValue3+OBVPrevValue4)/4);
   
   if(OBVCurrentValue>OBVAVG)
   {
      Comment("OBV is strong","\n","OBV current is ",OBVCurrentValue,"\n","OBV Average is ",OBVAVG,"\n","Previous four OBV Values: ", 
      "\n", "1= ",OBVPrevValue1,"\n", "2= ",OBVPrevValue2,"\n", "3= ",OBVPrevValue3,"\n", "4= ",OBVPrevValue4);
   }
   
   if(OBVCurrentValue<OBVAVG)
   {
      Comment("OBV is weak","\n","OBV current is ",OBVCurrentValue,"\n","OBV Average is ",OBVAVG,"\n","Previous four OBV Values: ",
      "\n", "1= ",OBVPrevValue1,"\n", "2= ",OBVPrevValue2,"\n", "3= ",OBVPrevValue3,"\n", "4= ",OBVPrevValue4);
   }
   
  }
//+------------------------------------------------------------------+
  • Differenze in questo codice:

Creazione di cinque array per i valori OBV:

double OBVArray0[];
double OBVArray1[];
double OBVArray2[];
double OBVArray3[];
double OBVArray4[];

Ordinamento di questi array partendo dai dati attuali:

ArraySetAsSeries(OBVArray0,true);   
ArraySetAsSeries(OBVArray1,true);
ArraySetAsSeries(OBVArray2,true);
ArraySetAsSeries(OBVArray3,true);
ArraySetAsSeries(OBVArray4,true);

Riempimento con OBVDef definito:

CopyBuffer(OBVDef,0,0,5,OBVArray0);
CopyBuffer(OBVDef,0,0,5,OBVArray1);
CopyBuffer(OBVDef,0,0,5,OBVArray2);
CopyBuffer(OBVDef,0,0,5,OBVArray3);
CopyBuffer(OBVDef,0,0,5,OBVArray4);

Ottenimento dei valori dell'OBV corrente e dei quattro precedenti:

double OBVCurrentValue=NormalizeDouble(OBVArray0[0],5);         
double OBVPrevValue1=NormalizeDouble(OBVArray1[1],5);
double OBVPrevValue2=NormalizeDouble(OBVArray2[2],5);
double OBVPrevValue3=NormalizeDouble(OBVArray3[3],5);
double OBVPrevValue4=NormalizeDouble(OBVArray4[4],5);

Calcolo della media dei precedenti quattro valori OBV dopo aver creato una variabile di tipo double per OBVAVG:

double OBVAVG=((OBVPrevValue1+OBVPrevValue2+OBVPrevValue3+OBVPrevValue4)/4);

Impostazione delle condizioni di OBV forte e debole con il commento:

if(OBVCurrentValue>OBVAVG)
{
 Comment("OBV is strong","\n","OBV current is ",OBVCurrentValue,"\n","OBV Average is ",OBVAVG,"\n","Previous four OBV Values: ", 
  "\n", "1= ",OBVPrevValue1,"\n", "2= ",OBVPrevValue2,"\n", "3= ",OBVPrevValue3,"\n", "4= ",OBVPrevValue4);
}
   
if(OBVCurrentValue<OBVAVG)
{
 Comment("OBV is weak","\n","OBV current is ",OBVCurrentValue,"\n","OBV Average is ",OBVAVG,"\n","Previous four OBV Values: ",
  "\n", "1= ",OBVPrevValue1,"\n", "2= ",OBVPrevValue2,"\n", "3= ",OBVPrevValue3,"\n", "4= ",OBVPrevValue4);
}

Dopo la compilazione, troveremo l'esperto uguale al seguente nella finestra del navigatore:

OBV nav3

Quella che segue è la finestra dell'esperto dopo aver scelto il file da eseguire sulla MetaTrader 5:

Finestra Forza OBV semplice

Dopo aver premuto "OK", l'esperto sarà allegato al grafico come nella figura seguente:

 Forza OBV semplice allegata

I seguenti sono esempi di test per i segnali:

OBV forte:

 Segnale Forza OBV Semplice Forte

OBV debole:

Segnale Forza OBV Semplice Debole

  • Strategia tre: OBV semplice - trend rialzista:

Secondo questa strategia, durante il trend rialzista, dobbiamo verificare se abbiamo un nuovo prezzo massimo più alto e, allo stesso tempo, abbiamo un valore OBV più alto. Quindi, dobbiamo verificare se il valore OBV corrente è maggiore del valore OBV precedente e se il prezzo massimo attuale è maggiore del prezzo massimo precedente, allora abbiamo un segnale di "Forte movimento durante il trend rialzista". Di seguito è riportato il codice completo per creare questo tipo di strategia:

//+------------------------------------------------------------------+
//|                                         Simple OBV - Uptrend.mq5 |
//|                                  Copyright 2022, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
void OnTick()
  {
   //creating a string variable for signal
   string signal="";
   
   //creating two OBV arrays for OBV
   double OBVArray0[];
   double OBVArray1[];
   
   //creating two price arrays
   MqlRates PriceArray0[];
   MqlRates PriceArray1[];
   
   //sorting OBV arrays from the current data
   ArraySetAsSeries(OBVArray0,true);   
   ArraySetAsSeries(OBVArray1,true);   
   
   //sorting Price arrays from the current data
   ArraySetAsSeries(PriceArray0,true);
   ArraySetAsSeries(PriceArray1,true);     
      
   //fill arrays with price data
   int Data0=CopyRates(_Symbol,_Period,0,3,PriceArray0);
   int Data1=CopyRates(_Symbol,_Period,0,3,PriceArray1);
   
   //defining OBV
   int OBVDef =iOBV(_Symbol, _Period,VOLUME_TICK);

   //defining EA, buffer, sorting in arrays
   CopyBuffer(OBVDef,0,0,3,OBVArray0);
   CopyBuffer(OBVDef,0,0,3,OBVArray1);
            
   //getting the value of current & the previous OBV
   double OBVCurrentValue=NormalizeDouble(OBVArray0[0],5);         
   double OBVPrevValue=NormalizeDouble(OBVArray1[1],5);
    
   //getting the value of current high & the previous high
   double CurrentHighValue=NormalizeDouble(PriceArray0[0].high,5);         
   double PrevHighValue=NormalizeDouble(PriceArray1[1].high,5); 
      
   //strong move signal
   //if OBVCurrentValue>OBVPrevValue && current high> previous high
   if(OBVCurrentValue > OBVPrevValue && PriceArray0[0].high>PriceArray0[1].high)
   {
      signal="Strong move during uptrend";
   }

   //comment with the signal
   Comment("The signal is ",signal,"\n","OBVCurrentValue is :",OBVCurrentValue,
   "\n","OBVPrevValue is :", OBVPrevValue,"\n","Current high is :",CurrentHighValue,"\n","Previous high is :",PrevHighValue);            
  }
//+------------------------------------------------------------------+

Differenze in questo codice:

Creazione di una variabile di tipo stringa per "signal" utilizzando la funzione "string" che memorizza le stringhe di testo, assegnandola vuota visto che la calcoleremo in seguito:

string signal="";

Creazione di due array per OBV utilizzando la funzione "double" e due array per i prezzi utilizzando la funzione "MqlRates" che memorizza informazioni su prezzi, volume e spread:

//creating two OBV arrays for OBV
double OBVArray0[];
double OBVArray1[];
   
//creating two price arrays
MqlRates PriceArray0[];
MqlRates PriceArray1[];1[];

Ordinamento di questi array partendo dai dati correnti:

//sorting OBV arrays from the current data
ArraySetAsSeries(OBVArray0,true);   
ArraySetAsSeries(OBVArray1,true);   
   
//sorting Price arrays from the current data
ArraySetAsSeries(PriceArray0,true);
ArraySetAsSeries(PriceArray1,true);

Riempimento degli array dei prezzi con dati sui prezzi utilizzando la funzione "CopyRates" che ottiene i dati storici della struttura "MqlRates" dopo aver creato variabili di tipo intero per Data0 e Data1 per ogni array:

int Data0=CopyRates(_Symbol,_Period,0,3,PriceArray0);
int Data1=CopyRates(_Symbol,_Period,0,3,PriceArray1);

Definire l'OBV e riempire con esso i due OBVArray:

int OBVDef =iOBV(_Symbol, _Period,VOLUME_TICK);

CopyBuffer(OBVDef,0,0,3,OBVArray0);
CopyBuffer(OBVDef,0,0,3,OBVArray1);

Ottenere i valori di OBV e dei massimi:

//getting the value of current & the previous OBV
double OBVCurrentValue=NormalizeDouble(OBVArray0[0],5);         
double OBVPrevValue=NormalizeDouble(OBVArray1[1],5);
    
//getting the value of current high & the previous high
double CurrentHighValue=NormalizeDouble(PriceArray0[0].high,5);         
double PrevHighValue=NormalizeDouble(PriceArray1[1].high,5); 

Impostazione delle condizioni del “Forte movimento durante il trend rialzista" e del commento:

Comment("The signal is ",signal,"\n","OBVCurrentValue is :",OBVCurrentValue,
"\n","OBVPrevValue is :", OBVPrevValue,"\n","Current high is :",CurrentHighValue,"\n","Previous high is :",PrevHighValue); 

Se compiliamo il codice, troveremo l'esperto nella finestra del navigatore:

OBV nav4

La finestra dell'esperto dopo aver scelto il file da eseguire su MetaTrader 5 sarà lo stesso come il seguente:

Finestra OBV semplice - Trend rialzista.

Dopo aver premuto "OK", l'esperto sarà allegato al grafico come nella figura seguente:

OBV semplice - trend rialzista allegato

I seguenti sono esempi di test per i segnali,

Segnale con finestra dati per i dati correnti:

OBV semplice Segnale di trend rialzista con la finestra dati corrente

Segnale con finestra dati per i dati precedenti:

OBV semplice - Segnale di trend rialzista con finestra dei dati precedente

  • Strategia quattro: OBV semplice - trend ribassista:

Secondo questa strategia, sarà l'inverso della strategia semplice OBV - trend rialzista in quanto dobbiamo verificare se abbiamo un prezzo minimo più basso e, allo stesso tempo, abbiamo un valore più basso dell'OBV. Quindi, dobbiamo verificare se il valore OBV corrente è inferiore al valore OBV precedente e se il prezzo minimo corrente è inferiore al prezzo minimo precedente, allora avremo un segnale di "Forte movimento durante il trend ribassista". Di seguito è riportato il codice completo per creare questo tipo di strategia:


//+------------------------------------------------------------------+
//|                                       Simple OBV - Downtrend.mq5 |
//|                                  Copyright 2022, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
void OnTick()
  {
   //create a string variable for signal
   string signal="";
   
   //creating two OBV arrays
   double OBVArray0[];
   double OBVArray1[];
   
   //creating two price arrays
   MqlRates PriceArray0[];
   MqlRates PriceArray1[];
   
   //sorting OBV arrays from the current data
   ArraySetAsSeries(OBVArray0,true);   
   ArraySetAsSeries(OBVArray1,true);   
   
   //sorting Price arrays from the current data
   ArraySetAsSeries(PriceArray0,true);
   ArraySetAsSeries(PriceArray1,true);     
      
   //fill array with price data
   int Data0=CopyRates(_Symbol,_Period,0,3,PriceArray0);
   int Data1=CopyRates(_Symbol,_Period,0,3,PriceArray1);
   
   //defining OBV
   int OBVDef =iOBV(_Symbol, _Period,VOLUME_TICK);

   //defining EA, buffer, sorting in arrays
   CopyBuffer(OBVDef,0,0,3,OBVArray0);
   CopyBuffer(OBVDef,0,0,3,OBVArray1);
            
   //getting the value of current OBV & the previous value
   double OBVCurrentValue=NormalizeDouble(OBVArray0[0],5);         
   double OBVPrevValue=NormalizeDouble(OBVArray1[1],5);
    
   //getting the value of current OBV & the previous value
   double CurrentLowValue=NormalizeDouble(PriceArray0[0].low,5);         
   double PrevLowValue=NormalizeDouble(PriceArray1[1].low,5); 
       
   //strong move signal
   //if OBVCurrentValue>OBVPrevValue && current low> previous low
   if(OBVCurrentValue < OBVPrevValue && PriceArray0[0].low<PriceArray0[1].low)
   {
      signal="Strong move during downtrend";
   }

   //comment with the signal
   Comment("The signal is ",signal,"\n","OBVCurrentValue is :",OBVCurrentValue,
   "\n","OBVPrevValue is :", OBVPrevValue,"\n","Current low is :",CurrentLowValue,"\n","Previous low is :",PrevLowValue);            
  }
//+------------------------------------------------------------------+
  • Differenze in questo codice:

Condizione di impostazione del "Forte movimento durante il trend ribassista" è il commento:

Comment("The signal is ",signal,"\n","OBVCurrentValue is :",OBVCurrentValue,
"\n","OBVPrevValue is :", OBVPrevValue,"\n","Current low is :",CurrentLowValue,"\n","Previous low is :",PrevLowValue); 

Ora lo compileremo, quindi possiamo trovare l'esperto nella finestra del navigatore come segue:

OBV nav5

Facendo doppio clic o trascinando e rilasciando il file sul grafico, apparirà la seguente finestra:

OBV semplice - Finestra Trend ribassista

Premendo il pulsante "OK", l'esperto verrà allegato come nella seguente immagine:

OBV semplice - trend ribassista allegato

Quello che segue è un esempio di segnali generati dai test,

Segnale con finestra dati corrente:

OBV semplice - Segnale di trend ribassista con la finestra dati corrente

Segnale con la finestra dati precedenti:

OBV semplice - Segnale di trend ribassista con la finestra dati precedenti


Conclusioni

Alla conclusione di questo articolo, abbiamo appreso un altro nuovo indicatore tecnico che utilizza il volume nel suo calcolo per vedere un'altra prospettiva nel grafico per migliorare le nostre decisioni di trading. questo indicatore è l'On Balance Volume (OBV) e abbiamo appreso in dettaglio cos'è l'indicatore OBV, cosa misura e come possiamo calcolarlo manualmente per sapere cosa si nasconde oltre le sue basi. Abbiamo anche imparato come usarlo e abbiamo appreso alcune semplici strategie che possono essere utili o aiutarci a realizzare nuove idee che potrebbero essere redditizie e questo è l'obiettivo principale di questo articolo e di altri di questa serie. Abbiamo progettato uno schema per ciascuna strategia menzionata per aiutarci a scrivere il codice e creare un sistema di trading per ciascuna di loro. Successivamente, abbiamo creato un expert advisor per ciascuna strategia menzionata tramite MQL5 (MetaQuotes Language) per eseguirle nella piattaforma di trading MetaTrader 5 per generare segnali automaticamente e accuratamente in base alle condizioni e alle regole preimpostate per ciascuna di esse.

Voglio ricordare che una delle cose più vantaggiose nell'analisi tecnica è che possiamo vedere più di una prospettiva sullo strumento finanziario in base allo strumento che utilizziamo e possiamo anche combinare più di uno strumento o indicatore, soprattutto quando ne utilizziamo alcuni per visualizzare l'intero quadro per poter prendere la decisione adatta in modo chiaro e questo approccio ci aiuta a creare un sistema di trading affidabile. Quindi, mantieni questo approccio mentre leggi o impari qualsiasi cosa per essere in grado di realizzare quale strumento può essere utilizzato con un altro per darti intuizioni più chiare e risultati migliori.

Ho bisogno di confermare ancora una volta che questo articolo e altri di questa serie sono solo a scopo didattico e progettati solo per i principianti per imparare la radice delle cose e a realizzare cosa possiamo fare programmando, in particolare tramite MQL5, e quanto ci facilita e migliora la nostra attività di trading. Devi testare qualsiasi strategia prima di usarla poiché non c'è nulla che possa adattarsi a tutte le persone e devi fare il tuo lavoro per testare e convalidare qualsiasi cosa per vedere se è utile per te o meno. Ti consiglio di applicare tutto da solo per approfondire il tuo apprendimento e comprensione.

Spero che tu abbia trovato utile questo articolo e spero che tu abbia imparato qualcosa sull'argomento di questo articolo o su qualsiasi argomento correlato nel mondo del trading. Se hai trovato utile questo articolo e desideri leggerne simili, puoi leggere i miei articoli precedenti in questa serie per imparare a progettare un sistema di trading basato su indicatori tecnici popolari.

Tradotto dall’inglese da MetaQuotes Ltd.
Articolo originale: https://www.mql5.com/en/articles/10961

Impara come progettare un sistema di trading tramite Accumulazione/Distribuzione (AD) Impara come progettare un sistema di trading tramite Accumulazione/Distribuzione (AD)
Benvenuti nel nuovo articolo della nostra serie sull'apprendimento di come progettare sistemi di trading basati sugli indicatori tecnici più popolari. In questo articolo, impareremo a conoscere un nuovo indicatore tecnico chiamato Indicatore di Accumulazione/Distribuzione e scopriremo come progettare un sistema di trading MQL5 basato su semplici strategie con AD.
Sviluppare un Expert Advisor per il trading da zero (Parte 11): Sistema di ordini incrociati Sviluppare un Expert Advisor per il trading da zero (Parte 11): Sistema di ordini incrociati
In questo articolo creeremo un sistema di ordini incrociati. C'è un tipo di asset che rende la vita dei trader molto difficile — i contratti future. Ma perché rendono la vita difficile?
Operazioni con matrici e vettori in MQL5 Operazioni con matrici e vettori in MQL5
Le matrici e i vettori sono stati introdotti in MQL5 per un’operatività efficiente con soluzioni matematiche. I nuovi tipi offrono metodi integrati per creare codice conciso e comprensibile, vicino alla notazione matematica. Gli array offrono ampie possibilità, ma ci sono molti casi in cui le matrici sono molto più efficienti.
Sviluppare un Expert Advisor per il trading da zero (Parte 10): Accesso agli indicatori personalizzati Sviluppare un Expert Advisor per il trading da zero (Parte 10): Accesso agli indicatori personalizzati
Come accedere agli indicatori personalizzati direttamente in un Expert Advisor? Un EA per il trading può essere veramente utile solo se può utilizzare indicatori personalizzati; altrimenti, è solo un insieme di codici e istruzioni.