OBV göstergesine dayalı bir ticaret sistemi nasıl geliştirilir?

Mohamed Abdelmaaboud | 29 Kasım, 2022

Giriş

Bu makalede, piyasada olup bitenlere farklı bir açıdan bakmamıza olanak tanıyacak, hacimle ilgilenen yeni bir teknik göstergeyi inceleyeceğiz: On Balance Volume (OBV). Ticarette lehimize nasıl kullanabileceğimizi öğrenmek adına onun hakkında ayrıntılı olarak konuşacağız. Aşağıda bu göstergeyi kapsayacak konular yer almaktadır:

  1. OBV göstergesinin tanımı
  2. OBV göstergesi stratejileri
  3. OBV göstergesine dayalı ticaret sisteminin planı
  4. OBV göstergesine dayalı ticaret sistemi
  5. Sonuç

“OBV göstergesinin tanımı” bölümünde, OBV göstergesi hakkında ayrıntılı bilgi edineceğiz: ne olduğunu, neyi ölçtüğünü, nasıl hesaplandığını öğreneceğiz ve hesaplanmasına ilişkin bir örnek göreceğiz. Burada göstergenin arkasındaki fikri görmüş olacağız ve bu sayede onu ticaretimizde bilgimize dayalı olarak daha iyi bir şekilde kullanabileceğiz. Ardından, "OBV göstergesi stratejileri" bölümünde, OBV göstergesine dayalı bazı basit stratejileri ele alacağız. Sonrasında, “OBV göstergesine dayalı ticaret sisteminin planı” bölümünde, ele aldığımız basit stratejilerin MQL5 kodunu yazmamızda bize yardımcı olacak bir plan hazırlayacağız. Bu plan, Uzman Danışman oluşturma sürecini adımlarla organize etmemize olanak sağlayacaktır. Planı tasarladıktan sonra, “OBV göstergesine dayalı ticaret sistemi” bölümünde MQL5 kodunu yazmaya geçebilir, ele aldığımız basit stratejilerin otomatik ve doğru bir şekilde yürütülmesi için MetaTrader 5'te kullanılabilecek bir Uzman Danışman oluşturabiliriz.

Bu makalede de Uzman Danışman oluşturmak için önceki makalelerimizde olduğu gibi MQL5 (MetaQuotes Language 5) dilini kullanacağız. Ortaya çıkan programı MetaTrader 5 işlem platformunda çalıştıracağız. MetaTrader 5 ile yerleşik olan MQL5'i kullanabilmek adına MetaTrader 5'in nasıl kurulacağı hakkında daha fazla bilgi edinmek istiyorsanız, önceki makalelerimden birinde yer alan "MetaEditor'da MQL5 kodu yazma" bölümünü okumanızı öneririm. Öğrendiklerinizde ustalaşmak istiyorsanız, okuduklarınızı kendi kendinize uygulamanızı tavsiye ederim, çünkü pratik yapmak, herhangi bir konuda ustalaşmak için çok önemli bir araçtır.

Sorumluluk reddi: Sağlanan tüm bilgiler 'olduğu gibi' yalnızca bilgilendirme amaçlıdır, ticaret tavsiyesi değildir. Bu bilgiler herhangi bir sonucu garanti etmemektedir. Bu materyalleri herhangi bir işlem hesabında kullanırsanız, ortaya çıkabilecek tüm riskler size ait olacaktır.

Şimdi, daha gelişmiş bir ticaret deneyimi için araç setimize ekleyeceğimiz bu göstergeyi keşfetmeye başlayalım.


OBV göstergesinin tanımı

Bu bölümde, On Balance Volume (OBV) göstergesi hakkında ayrıntılı bilgi edineceğiz. Ama öncesinde biraz hacimden bahsedelim çünkü OBV, bir hacim göstergesidir. Hacim, belirli bir süre boyunca işlem görmüş hisse veya sözleşme sayısıdır. Hacmin yüksek olması ticaret enstrümanının aktif olarak işlem gördüğü anlamına gelir ve tam tersi şekilde, hacmin düşük olması da ticaret enstrümanının aktif olarak işlem görmediği anlamına gelir.

Hacim kavramı çok önemlidir çünkü yüksek hacim eşliğinde ticaret enstrümanı yukarı veya aşağı yönlü hareket ediyorsa, bu hareket düşük hacim eşliğinde olduğundan daha güçlü olacaktır. Hacim trendle belirli bir ilişkiyle hareket etmelidir: yükseliş trendi varlığında, fiyat yükselirken hacim artmalı, fiyat düzeltme yaparken de hacim azalmalıdır ve düşüş trendi varlığında ise fiyat düşerken hacim artmalı, fiyat düzeltme yaparken de hacim azalmalıdır.

Hacim aynı zamanda kırılmaların gerçek mi yoksa sadece yanlış kırılmalar mı olduğunu da teyit eder: kırılma yüksek hacimle gerçekleştiğinde, bu, kırılmanın devam edeceğine dair bir sinyal görevi görebilir. 

Trendle hacim arasındaki yukarıda bahsettiğim ilişkinin aynı şekilde devam etmesi mevcut trendin güçlü kalacağının, değişmesi ise mevcut trendin zayıflayacağının bir işareti olacaktır. Trend hakkında daha fazla bilgi edinmek istiyorsanız, daha önce yayınladığım bir makalemde yer alan "Trendin tanımı" bölümünü okuyabilirsiniz.

On Balance Volume (OBV) göstergesi Joseph Granville tarafından geliştirilmiştir. Pozitif ve negatif hacim akışını ölçer. Şimdi göstergenin nasıl hesaplandığını görelim. Hesaplama adımları aşağıdaki gibidir:

  1. Kapanış fiyatını kontrol et - önceki kapanıştan daha yüksek veya daha düşük.
  2. Kapanış fiyatı önceki kapanış fiyatından daha yüksekse, hacmi önceki OBV değerine ekle.
  3. Kapanış fiyatı önceki kapanış fiyatından daha düşükse, hacmi önceki OBV değerinden çıkar.
  4. Kapanış fiyatı önceki kapanış fiyatına eşitse, OBV değeri önceki OBV değerine eşit olacaktır.

Bu adımların bir örneğini görelim ve OBV göstergesini hesaplayalım. Bir ticaret enstrümanı için aşağıdaki verilere sahip olduğumuzu varsayalım:

Gün Kapanış Hacim
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

Yukarıdaki verilere dayalı olarak OBV göstergesini hesaplamak için:

Kapanış fiyatlarını kontrol edip bir önceki kapanış fiyatından daha yüksek veya daha düşük olup olmadığına karar veriyoruz. Bir önceki kapanış fiyatından daha yüksekse, ilgili günün hareketinin yukarı yönlü olduğunu belirtmek için yanına Positive yazısı koyalım. Bir önceki kapanış fiyatından daha düşükse, ilgili günün hareketinin aşağı yönlü olduğunu belirtmek için yanına Negative yazısı koyalım.

OBV göstergesini hesaplama örneği

Ardından, pozitif günlerin hacmini bir önceki OBV değerine ekleyelim ve negatif günlerin hacmini de bir önceki OBV değerinden çıkaralım.

OBV göstergesini hesaplama örneği

Böylece OBV değerlerini hesaplamış olduk. Bu değerler grafikte pozitif ve negatif hacim akışını ölçen bir eğri şeklinde görüntülenir. Neyse ki, MetaTrader 5 platformuyla standart olarak gelen hazır bir gösterge bulunduğundan, OBV'yi manuel olarak hesaplamamıza gerek yoktur. Aşağıdaki görüntü bu göstergenin grafiğe nasıl ekleneceğini göstermektedir:

OBV göstergesini ekleme

Gösterge seçildiğinde, aşağıdaki gösterge parametreleri penceresi açılacaktır:

OBV göstergesi parametreleri

1 - Hacim türü.

2 - OBV eğrisinin rengi.

3 - OBV eğrisinin stili.

4 - OBV eğrisinin kalınlığı.

Gösterge için uygun parametreleri ayarladıktan sonra gösterge aşağıdaki gibi grafiğe eklenecektir:

Grafikte OBV göstergesi


OBV göstergesi stratejileri

Bu bölümde, OBV göstergesini konseptine uygun olarak nasıl kullanabileceğimizi göreceğiz. Bazı basit stratejilere göz atacağız. Ancak, bu stratejilerin herkes için uygun olmayabileceğini lütfen unutmayın. Bu nedenle, herhangi bir stratejiyi kullanmadan önce, sizin için yararlılığını değerlendirmek adına onu test etmelisiniz. Burada, OBV göstergesinin temellerini öğrenmek ve nasıl çalıştığını görmek amacıyla tüm bu stratejileri gözden geçiriyoruz.

Bu stratejiye göre, mevcut OBV değerini önceki OBV değeriyle karşılaştırarak OBV eğrisinin yönünü belirleyeceğiz. Mevcut OBV değeri önceki OBV değerinden daha büyükse, bu, OBV yükseliyor anlamına gelir. Tam tersi şekilde, eğer mevcut OBV değeri önceki OBV değerinden daha düşükse, bu da OBV düşüyor demektir.

Pratikte, mevcut OBV’nin karşılaştırmak için kullanılacağı veriye olan mesafesini değiştirebilirsiniz, ancak burada sadece göstergeyi nasıl kullanabileceğimiz ve bu kullanımı MQL5'te nasıl kodlayabileceğimiz fikrini paylaşıyoruz. Daha sonra tercihlerinize göre optimize edebilirsiniz.

Mevcut OBV > Önceki OBV --> OBV yükseliyor

Mevcut OBV < Önceki OBV --> OBV düşüyor

Bu stratejiye göre, mevcut OBV değerini önceki dört OBV değerinin ortalamasıyla karşılaştırarak mevcut OBV gücünü belirleyeceğiz. Mevcut OBV değeri önceki dört OBV değerinin ortalamasından daha büyükse, bu, OBV güçlü anlamına gelir ve tersi olarak, mevcut OBV değeri önceki dört OBV değerinin ortalamasından daha küçükse, bu da OBV zayıf anlamına gelir.

Yine aynı şekilde, pratikte, mevcut OBV’nin karşılaştırmak için kullanılacağı ortalama verisine olan mesafesini değiştirebilirsiniz, ancak buradaki amaç göstergenin nasıl kullanılacağını anlamaktır. Daha sonra tercihlerinize ve test sonuçlarınıza göre özelleştirebilirsiniz. 

Mevcut OBV > Önceki dört OBV değerinin ortalaması --> OBV güçlü

Mevcut OBV < Önceki dört OBV değerinin ortalaması --> OBV zayıf

Daha önce bahsettiğimiz gibi, trend sırasında hacmin trendle ilişkili olarak hareket etmesi iyidir. Dolayısıyla OBV, yukarı yönlü fiyat hareketiyle birlikte artmalıdır. Yani bu strateji, fiyat hareketinin güçlü olup olmadığının değerlendirilmesini sağlar. Mevcut OBV değerini önceki OBV değeriyle ve ayrıca mevcut yüksek değerini de önceki yüksek değeriyle karşılaştıracağız. Mevcut OBV değeri önceki OBV değerinden daha büyük olduğunda ve aynı zamanda mevcut yüksek değeri de önceki yüksek değerinden daha büyük olduğunda, bu, yükseliş trendi sırasında fiyat hareketi güçlü demektir.

Mevcut OBV > Önceki OBV değeri ve Mevcut yüksek > Önceki yüksek --> Yükseliş trendi sırasında fiyat hareketi güçlü

Bu sefer ise OBV, aşağı yönlü fiyat hareketiyle birlikte azalmalıdır. Bu, fiyat hareketinin güçlü olup olmadığının anlaşılmasını sağlar. Mevcut OBV değerini önceki OBV değeriyle ve ayrıca mevcut düşük değerini de önceki düşük değeriyle karşılaştıracağız. Mevcut OBV değeri önceki OBV değerinden daha düşük olduğunda ve aynı zamanda mevcut düşük değeri de önceki düşük değerinden daha düşük olduğunda, bu, düşüş trendi sırasında fiyat hareketi güçlü demektir.

Mevcut OBV < Önceki OBV değeri ve Mevcut düşük < Önceki düşük --> Düşüş trendi sırasında fiyat hareketi güçlü


OBV göstergesine dayalı ticaret sisteminin planı

Bu bölümde, stratejiler için bir plan hazırlayacağız. Bu plan, ele aldığımız her strateji için ticaret sisteminin nasıl tasarlanacağına dair adım adım net açıklamalar sağlayacaktır. Öncelikle, mevcut OBV değerini grafik üzerinde yorum olarak görüntüleyecek program için basit bir plan oluşturalım. İşte bu program için plan:

Mevcut OBV değerini grafik üzerinde yorum olarak görüntüleyecek programın planı

Bu stratejide, mevcut OBV değerini önceki OBV değeriyle karşılaştırarak OBV eğrisinin yönünü belirleyeceğiz. Dolayısıyla, her tikte mevcut OBV değerini ve önceki OBV değerini kontrol etmemiz gerekiyor. Mevcut OBV değeri önceki OBV değerinden daha büyük olduğunda, bu, OBV yükseliyor olacaktır ve tersi şekilde, mevcut OBV değeri önceki OBV değerinden daha düşük olduğunda da, bu, OBV düşüyor olacaktır.

Aşağıda, bu strateji için bir program geliştirmemize yardımcı olacak adım adım plan yer almaktadır:

OBV hareketi planı

Bu stratejide, mevcut OBV değerini önceki dört OBV değerinin ortalamasıyla karşılaştırarak mevcut OBV gücünü belirleyeceğiz. Mevcut OBV değeri önceki dört OBV değerinin ortalamasından daha büyükse, bu, OBV güçlü olacaktır ve tersi olarak, mevcut OBV değeri önceki dört OBV değerinin ortalamasından daha küçükse, bu da OBV zayıf olacaktır.

Aşağıda, bu strateji için bir program geliştirmemize yardımcı olacak adım adım plan bulunmaktadır:

OBV gücü planı

Bu stratejide, mevcut fiyat hareketini değerlendirmek için OBV hacim göstergesinden yararlanacağız. Yükseliş trendi sırasında, mevcut OBV değerini kontrol etmemiz ve önceki OBV değeriyle karşılaştırmamız gerekiyor. Eğer mevcut OBV değeri önceki OBV değerinden daha büyükse, mevcut yüksek değerini kontrol etmemiz ve önceki yüksek değeriyle karşılaştırmamız gerekiyor. Ve eğer mevcut yüksek değeri de önceki yüksek değerinden daha büyükse, bu, yükseliş trendi sırasında fiyat hareketi güçlü olacaktır.

İşte bu strateji için bir program geliştirmeye yardımcı olacak adım adım plan:

OBV - Yükseliş trendi planı

Düşüş trendi sırasında, mevcut OBV değerini kontrol etmemiz ve önceki OBV değeriyle karşılaştırmamız gerekiyor. Eğer mevcut OBV değeri önceki OBV değerinden daha düşükse, mevcut düşük değerini kontrol etmemiz ve önceki düşük değeriyle karşılaştırmamız gerekiyor. Ve eğer mevcut düşük değeri de önceki düşük değerinden daha düşükse, bu, düşüş trendi sırasında fiyat hareketi güçlü olacaktır.

İşte bu strateji için bir program geliştirmeye yardımcı olacak adım adım plan:

OBV - Düşüş trendi planı


OBV göstergesine dayalı ticaret sistemi

Bu bölümde, programlama ve MQL5’in avantajlarından yararlanmak adına ele aldığımız basit stratejiler için bir ticaret sisteminin nasıl oluşturulacağını inceleyeceğiz. Çünkü programlama, hayatımızı kolaylaştırmaya yardımcı olabilecek sihirli bir araçtır: istediğimiz algoritmayı otomatik olarak çalıştıracak bir sistem oluşturabiliriz. Böylece, ticaret işlemlerini manuel olarak gerçekleştirmekten kurtulmamızın yanı sıra, ticaret işlemlerinin daha hızlı ve daha hassas gerçekleştirilmesi gibi birçok fayda da elde ederiz.

Öncelikle, mevcut OBV değerini grafik üzerinde yorum olarak görüntüleyecek basit bir program oluşturalım.

double OBVArray[];
ArraySetAsSeries(OBVArray,true);

int OBVDef =iOBV(_Symbol, _Period,VOLUME_TICK);
CopyBuffer(OBVDef,0,0,3,OBVArray);
double OBVValue=OBVArray[0];
Comment("OBV Value is: ",OBVValue);

Mevcut OBV değerini grafikte yorum olarak görüntüleyen programın kodu aşağıdadır:

//+------------------------------------------------------------------+
//|                                                   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);  
  }
//+------------------------------------------------------------------+

Uzman Danışmanın kodunu derliyoruz, böylece onu MetaTrader 5 terminalinde Kılavuz penceresinde bulabiliriz:

Kılavuz - Simple OBV

Programa çift tıklayarak veya onu grafiğe sürükleyerek başlatıyoruz. Devamında, aşağıdaki pencere açılacaktır:

Simple OBV penceresi

Tamama tıkladıktan sonra, program aşağıdaki gibi grafiğe eklenecektir:

Grafiğe eklenmiş Simple OBV

Böylece, gösterge mevcut OBV değerini grafik üzerinde yorum olarak görüntüleyecektir:

Grafikte mevcut OBV değeri

Programımızdaki değerlerin MetaTrader 5'teki yerleşik On Balance Volume göstergesi tarafından görüntülenen değerlerle aynı olup olmadığını da kontrol edebiliriz. Bunu yapmak için, oluşturduğumuz Uzman Danışmanı standart On Balance Volume göstergesiyle beraber grafik üzerinde çalıştıralım. Bu durumda, her iki program da aşağıdaki ekran görüntüsünde gösterildiği gibi aynı değerleri görüntüleyecektir:

Simple OBV ile standart OBV aynı değeri görüntülemektedir

 Şimdi, ele aldığımız her strateji için bir program oluşturmaya başlayalım.

Öncesinde bahsettiğimiz gibi, bu stratejiye göre, iki değeri karşılaştırmamız gerekiyor: mevcut OBV değeri ve önceki OBV değeri. Devamında, mevcut OBV değerinin önceki OBV değerinden daha büyük veya daha küçük olup olmadığına karar vermemiz gerekiyor. Ve buna dayalı olarak, grafikte "OBV is rising" veya “OBV is declining” yazısını, mevcut OBV değerini ve önceki OBV değerini yorum olarak görüntülememiz gerekiyor. Bu stratejiye dayalı Uzman Danışmanın tam kodu aşağıda gösterilmektedir:

//+------------------------------------------------------------------+
//|                                          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);
     }

  }
//+------------------------------------------------------------------+
 OBV için iki dizi oluşturuyoruz:
double OBVArray1[];
double OBVArray2[];

Bu iki diziyi mevcut veriden sıralıyoruz:

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

Bu iki diziyi dolduruyoruz:

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

OBVCurrentValue ve OBVPrevValue için double türü değişken oluşturduktan sonra, önceden ayarlanmış hassasiyetle double türü değer geri döndüren NormalizeDouble fonksiyonunu kullanarak mevcut OBV değerini ve önceki OBV değerini alıyoruz. NormalizeDouble fonksiyonunun parametreleri şunlardır: değer ve basamak sayısı. Değer parametresi OBVArray olacaktır ve basamak sayısı parametresi de ondalık virgülünden sonraki basamak sayısı olan 5 olacaktır.

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

if fonksiyonunu kullanarak OBV yükseliyor ve OBV düşüyor koşullarını ayarlıyoruz:

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);
   }

Uzman Danışmanın kodunu derliyoruz, böylece onu MetaTrader 5 terminalinde Kılavuz penceresinde bulabiliriz:

Kılavuz - Simple OBV movement

Programa çift tıklayarak veya onu grafiğe sürükleyerek başlatıyoruz. Devamında, aşağıdaki pencere açılacaktır:

Simple OBV movement penceresi

Tamama tıkladıktan sonra, program aşağıdaki gibi grafiğe eklenecektir:

Grafiğe eklenmiş Simple OBV movement

Devamında program onun için belirlediğimiz koşullara uygun olarak yorumları görüntüleyecektir:

OBV yükseliyor:

Simple OBV movement - OBV yükseliyor

OBV düşüyor:

Simple OBV movement - OBV düşüyor

Öncesinde bahsettiğimiz gibi, bu stratejiye göre, iki değeri karşılaştırmamız gerekiyor: mevcut OBV değeri ve önceki dört OBV değerinin ortalaması. Devamında, mevcut OBV değerinin önceki dört OBV değerinin ortalamasından daha büyük veya daha küçük olup olmadığına karar vermemiz gerekiyor. Ve buna dayalı olarak, grafikte "OBV is strong" veya “OBV is weak” yazısını ve planda ifade ettiğimiz değerleri görüntülememiz gerekiyor. Bu stratejiye dayalı Uzman Danışmanın tam kodu aşağıda gösterilmektedir:

//+------------------------------------------------------------------+
//|                                          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);
   }
   
  }
//+------------------------------------------------------------------+

OBV değerleri için beş dizi oluşturuyoruz:

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

Oluşturulan bu dizileri mevcut veriden sıralıyoruz:

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

OBVDef ile dolduruyoruz:

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

Mevcut OBV değerini ve önceki dört OBV değerini alıyoruz:

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

OBVAVG için double türü değişken oluşturduktan sonra önceki dört OBV değerinin ortalamasını hesaplıyoruz:

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

if fonksiyonunu kullanarak OBV güçlü ve OBV zayıf koşullarını ayarlıyoruz:

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);
}

Uzman Danışmanın kodunu derliyoruz, böylece onu MetaTrader 5 terminalinde Kılavuz penceresinde bulabiliriz:

Kılavuz - Simple OBV Strength

Programa çift tıklayarak veya onu grafiğe sürükleyerek başlatıyoruz. Devamında, aşağıdaki pencere açılacaktır:

Simple OBV Strength penceresi

Tamama tıkladıktan sonra, program aşağıdaki gibi grafiğe eklenecektir:

Grafiğe eklenmiş Simple OBV Strength

Devamında program onun için belirlediğimiz koşullara uygun olarak yorumları görüntüleyecektir:

OBV güçlü:

Simple OBV Strength - OBV güçlü

OBV zayıf:

Simple OBV Strength - OBV zayıf

Öncesinde bahsettiğimiz gibi, bu stratejiye göre, yükseliş trendi sırasında, mevcut yüksek değerinin önceki yüksek değerinden daha yüksek olup olmadığını ve aynı zamanda mevcut OBV değerinin de önceki OBV değerinden daha yüksek olup olmadığını kontrol etmemiz gerekiyor. Her iki karşılaştırmada da mevcut değerler daha yüksekse grafikte “Strong move during uptrend” yazısını ve planda ifade ettiğimiz değerleri görüntülememiz gerekiyor. Bu stratejiye dayalı Uzman Danışmanın tam kodu aşağıda gösterilmektedir:

//+------------------------------------------------------------------+
//|                                         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);            
  }
//+------------------------------------------------------------------+

Bu koddaki farklılıklar şunlardır:

Sinyal metni için string türü değişken oluşturuyoruz:

string signal="";

double fonksiyonunu kullanarak OBV değerleri için iki dizi oluşturuyoruz. Ve ayrıca fiyatlar, hacim ve spread hakkında bilgi depolayan MqlRates fonksiyonunu kullanarak fiyatlar için de iki dizi oluşturuyoruz.

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

Bu dizileri mevcut veriden sıralıyoruz:

//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);

Her dizi için Data0 ve Data1 int türü değişkenler oluşturduktan sonra MqlRates yapısının verilerini alan CopyRates fonksiyonunu kullanarak fiyat dizilerini fiyat verileriyle dolduruyoruz:

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

OBV'yi tanımlıyoruz ve onunla iki OBVArray dizisini dolduruyoruz:

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

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

OBV ve yüksek değerlerini alıyoruz:

//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); 

Yükseliş trendi sırasında fiyat hareketi güçlü koşulunu ayarladıktan (yukarıda tam kodda gösterilmektedir) sonra, comment fonksiyonuyla sinyal yazısını ve planda ifade ettiğimiz değerleri grafikte görüntülüyoruz:

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

Uzman Danışmanın kodunu derliyoruz, böylece onu MetaTrader 5 terminalinde Kılavuz penceresinde bulabiliriz:

Kılavuz - Simple OBV Uptrend

Programa çift tıklayarak veya onu grafiğe sürükleyerek başlatıyoruz. Devamında, aşağıdaki pencere açılacaktır:

Simple OBV Uptrend penceresi

Tamama tıkladıktan sonra, program aşağıdaki gibi grafiğe eklenecektir:

Grafiğe eklenmiş Simple OBV Uptrend

Devamında program onun için belirlediğimiz koşullara uygun olarak yorumları görüntüleyecektir:

Mevcut verilerle Veri Penceresi ve sinyal:

Mevcut verilerle Veri Penceresi ve sinyal

Önceki verilerle Veri Penceresi ve sinyal:

Önceki verilerle Veri Penceresi ve sinyal

Öncesinde bahsettiğimiz gibi, bu stratejiye göre, düşüş trendi sırasında, mevcut düşük değerinin önceki düşük değerinden daha düşük olup olmadığını ve aynı zamanda mevcut OBV değerinin de önceki OBV değerinden daha düşük olup olmadığını kontrol etmemiz gerekiyor. Her iki karşılaştırmada da mevcut değerler daha düşükse grafikte “Strong move during downtrend” yazısını ve planda ifade ettiğimiz değerleri görüntülememiz gerekiyor. Bu stratejiye dayalı Uzman Danışmanın tam kodu aşağıda gösterilmektedir:


//+------------------------------------------------------------------+
//|                                       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);            
  }
//+------------------------------------------------------------------+

Düşüş trendi sırasında fiyat hareketi güçlü koşulunu ayarladıktan (yukarıda tam kodda gösterilmektedir) sonra, comment fonksiyonuyla sinyal yazısını ve planda ifade ettiğimiz değerleri grafikte görüntülüyoruz:

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

Uzman Danışmanın kodunu derliyoruz, böylece onu MetaTrader 5 terminalinde Kılavuz penceresinde bulabiliriz:

Kılavuz - Simple OBV Downtrend

Programa çift tıklayarak veya onu grafiğe sürükleyerek başlatıyoruz. Devamında, aşağıdaki pencere açılacaktır:

Simple OBV Downtrend penceresi

Tamama tıkladıktan sonra, program aşağıdaki gibi grafiğe eklenecektir:

Grafiğe eklenmiş Simple OBV Downtrend

Devamında program onun için belirlediğimiz koşullara uygun olarak yorumları görüntüleyecektir:

Mevcut verilerle Veri Penceresi ve sinyal:

Mevcut verilerle Veri Penceresi ve sinyal

Önceki verilerle Veri Penceresi ve sinyal:

Önceki verilerle Veri Penceresi ve sinyal


Sonuç

Böylece, bu makalede de başka bir teknik göstergeyi derinlemesine öğrenmiş olduk: hesaplamalarda hacmi kullanan On Balance Volume (OBV). Hacim verileri, grafiği farklı bir perspektiften görmemize olanak sağlar ve bu da daha iyi ticaret kararları vermemize yardımcı olur. Şimdi, makale boyunca neler gördüğümüzü bir gözden geçirelim. İlk olarak, göstergenin ne anlama geldiği, neyi ölçtüğü ve manuel olarak nasıl hesaplandığı hakkında konuştuk (aslında pratikte kendimiz hesaplamayacak olsak da göstergenin özünü anlamak için bu gereklidir). Devamında, göstergeyi ticaretimizde yararlı olabilecek, yeni fikirlere yol açabilecek şekilde nasıl kullanabileceğimizi gördük, bunu birkaç basit stratejiyi ele alarak yaptık. Sonrasında, ticaret sistemini oluştururken bize yardımcı olması adında bu stratejiler için bir plan hazırladık. Ve son olarak da ele aldığımız her strateji için, hazırladığımız plan çerçevesinde koşullara uygun olarak otomatik ve doğru bir şekilde sinyaller üretecek, MetaTrader 5 işlem platformunda çalıştırılabilen bir MQL5 Uzman Danışmanı oluşturduk.

Teknik analizin en kullanışlı yönlerinden birinin, bir finansal enstrümana birden fazla bakış açısından bakmamıza olanak sağlaması olduğunu belirtmek istiyorum. Ayrıca birden fazla aracı birbirleriyle kombine ederek de kullanabiliriz. Bu, finansal enstrümanın eksiksiz resmini görmemize ve daha net ve doğru ticaret kararları vermemize yardımcı olacaktır. Ticaret sistemleri konusunda da bu yaklaşımı kullanabiliriz. Herhangi bir bilgi okurken veya çalışırken bunu aklınızda bulundurun, hangi araçların birlikte kullanılabileceği hakkında yeni fikirler keşfedebilirsiniz.

Ek olarak, bu makalenin ve bu serideki diğer makalelerin yalnızca eğitim amaçlı olduğunu yinelemek istiyorum. Ana hedefleri, göstergeleri derinlemesine incelemek ve onları MQL5 dilinde programlayarak ticaretimizi daha üstün hale getirecek şekilde nasıl kullanabileceğimizi bize göstermektir. Sizin için uygun olup olmadıklarını değerlendirmek adına, ticarette kullanmadan önce tüm stratejileri kapsamlı olarak test ettiğinizden emin olmalısınız. Okuduğunuz her şeyi kendi başınıza tekrarlamanızı tavsiye ederim. Bu şekilde konuyu daha iyi anlayabilecek ve becerilerinizi daha hızlı geliştirebileceksiniz.

Umarım makale sizin için faydalı olur ve ticaret hedeflerinize ulaşmanıza yardım sağlar. Bu makaleyi beğendiyseniz ve buna benzer makaleler okumak istiyorsanız, popüler teknik göstergelere dayalı ticaret sistemlerinin nasıl geliştirileceğini öğrenme konulu bu serideki diğer makaleleri de okuyabilirsiniz. Bir sonraki makale de görüşmek üzere.