Scopri come progettare un sistema di trading tramite OBV
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:
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:
- Controllo del prezzo di chiusura - se è alto o basso.
- Aggiungere il volume del giorno se c’è stato un aumento del prezzo al valore OBV precedente.
- Sottrarre il volume del giorno se c’è stato un ribasso del prezzo dal valore OBV precedente.
- 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.
Quindi, aggiungeremo il volume dei giorni positivi al valore OBV precedente e sottrarremo il volume dei giorni negativi dal valore OBV precedente.
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:
Dopo aver selezionato l'indicatore, si aprirà la seguente finestra dei parametri dell'indicatore:
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:
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:
- 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:
- 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:
- 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:
- 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:
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:
Se volessimo eseguirlo, faremo doppio clic sul file o lo trasciniamo e rilasciamo sul grafico, troveremo apparire la seguente finestra:
Dopo aver premuto "OK", troveremo l'expert advisor allegato al grafico come nell'immagine seguente:
Quindi, possiamo scoprire che il segnale generato appare lo stesso come il seguente test d’esempio:
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:
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:
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:
Facendo doppio clic sul file dell’expert apparirà la seguente finestra:
Dopo aver premuto "OK", l'esperto sarà allegato al grafico come segue:
I seguenti sono esempi di test per i segnali generati secondo questa strategia,
OBV crescente:
OBV calante:
- 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:
Quella che segue è la finestra dell'esperto dopo aver scelto il file da eseguire sulla MetaTrader 5:
Dopo aver premuto "OK", l'esperto sarà allegato al grafico come nella figura seguente:
I seguenti sono esempi di test per i segnali:
OBV forte:
OBV 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:
La finestra dell'esperto dopo aver scelto il file da eseguire su MetaTrader 5 sarà lo stesso come il seguente:
Dopo aver premuto "OK", l'esperto sarà allegato al grafico come nella figura seguente:
I seguenti sono esempi di test per i segnali,
Segnale con finestra dati per i dati correnti:
Segnale con finestra dati per i dati precedenti:
- 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:
Facendo doppio clic o trascinando e rilasciando il file sul grafico, apparirà la seguente finestra:
Premendo il pulsante "OK", l'esperto verrà allegato come nella seguente immagine:
Quello che segue è un esempio di segnali generati dai test,
Segnale con finestra dati corrente:
Segnale 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
- App di trading gratuite
- Oltre 8.000 segnali per il copy trading
- Notizie economiche per esplorare i mercati finanziari
Accetti la politica del sito e le condizioni d’uso