
OBV göstergesine dayalı bir ticaret sistemi nasıl geliştirilir?
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:
- OBV göstergesinin tanımı
- OBV göstergesi stratejileri
- OBV göstergesine dayalı ticaret sisteminin planı
- OBV göstergesine dayalı ticaret sistemi
- 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:
- Kapanış fiyatını kontrol et - önceki kapanıştan daha yüksek veya daha düşük.
- Kapanış fiyatı önceki kapanış fiyatından daha yüksekse, hacmi önceki OBV değerine ekle.
- Kapanış fiyatı önceki kapanış fiyatından daha düşükse, hacmi önceki OBV değerinden çıkar.
- 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.
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.
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:
Gösterge seçildiğinde, aşağıdaki gösterge parametreleri penceresi açılacaktır:
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:
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.
- Birinci strateji: OBV hareketi
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
- İkinci strateji: OBV gücü
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
- Üçüncü strateji: OBV - Yükseliş trendi
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ü
- Üçüncü strateji: OBV - Düşüş trendi
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:
- Birinci strateji: OBV hareketi
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:
- İkinci strateji: OBV gücü
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:
- Üçüncü strateji: OBV - Yükseliş trendi
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:
- Üçüncü strateji: OBV - Düşüş trendi
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 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 fonksiyonunu kullanarak OBV değerleri için bir dizi oluşturuyoruz. double, kesir kısmı olan sayıları temsil eden reel sayı / kesirli sayı türüdür. Bilginiz olması adına, iki kesirli sayı türü vardır: double ve float. double türü, float türünün iki katı hassasiyete sahip sayıları temsil eder.
double OBVArray[];
- ArraySetAsSeries fonksiyonunu kullanarak OBV verilerini sıralıyoruz:
ArraySetAsSeries(OBVArray,true);
- OBVDef için int türü değişken oluşturduktan sonra iOBV fonksiyonunu kullanarak OBV'yi tanımlıyoruz. iOBV fonksiyonu, On Balance Volume göstergesinin tanıtıcısını geri döndürür. Parametreleri şunlardır: sembol, periyot, hacim.
int OBVDef =iOBV(_Symbol, _Period,VOLUME_TICK);
- Kopyalanan veri miktarını geri döndüren CopyBuffer fonksiyonunu kullanarak OBVArray dizisini OBVDef değerleriyle dolduruyoruz. Parametreleri şunlardır: gösterge tanıtıcısı, arabellek numarası, başlangıç zamanı, bitiş zamanı, arabellek.
CopyBuffer(OBVDef,0,0,3,OBVArray);
- OBVValue için double türü değişken oluşturduktan sonra mevcut OBV değerini hesaplıyoruz:
double OBVValue=OBVArray[0];
- comment fonksiyonunu kullanarak mevcut OBV değerini grafikte yorum olarak görüntülüyoruz:
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:
Programa çift tıklayarak veya onu grafiğe sürükleyerek başlatıyoruz. Devamında, aşağıdaki pencere açılacaktır:
Tamama tıkladıktan sonra, program aşağıdaki gibi grafiğe eklenecektir:
Böylece, gösterge mevcut OBV değerini grafik üzerinde yorum olarak görüntüleyecektir:
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:
Şimdi, ele aldığımız her strateji için bir program oluşturmaya başlayalım.
- Birinci strateji: OBV hareketi
Ö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); } } //+------------------------------------------------------------------+
- Bu koddaki farklılıklar şunlardır:
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:
Programa çift tıklayarak veya onu grafiğe sürükleyerek başlatıyoruz. Devamında, aşağıdaki pencere açılacaktır:
Tamama tıkladıktan sonra, program aşağıdaki gibi grafiğe eklenecektir:
Devamında program onun için belirlediğimiz koşullara uygun olarak yorumları görüntüleyecektir:
OBV yükseliyor:
OBV düşüyor:
- İkinci strateji: OBV gücü
Ö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); } } //+------------------------------------------------------------------+
- Bu koddaki farklılıklar şunlardır:
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:
Programa çift tıklayarak veya onu grafiğe sürükleyerek başlatıyoruz. Devamında, aşağıdaki pencere açılacaktır:
Tamama tıkladıktan sonra, program aşağıdaki gibi grafiğe eklenecektir:
Devamında program onun için belirlediğimiz koşullara uygun olarak yorumları görüntüleyecektir:
OBV güçlü:
OBV zayıf:
- Üçüncü strateji: OBV - Yükseliş trendi
Ö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:
Programa çift tıklayarak veya onu grafiğe sürükleyerek başlatıyoruz. Devamında, aşağıdaki pencere açılacaktır:
Tamama tıkladıktan sonra, program aşağıdaki gibi grafiğe eklenecektir:
Devamında program onun için belirlediğimiz koşullara uygun olarak yorumları görüntüleyecektir:
Mevcut verilerle Veri Penceresi ve sinyal:
Önceki verilerle Veri Penceresi ve sinyal:
- Üçüncü strateji: OBV - Düşüş trendi
Ö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); } //+------------------------------------------------------------------+
- Bu koddaki farklılıklar şunlardır:
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:
Programa çift tıklayarak veya onu grafiğe sürükleyerek başlatıyoruz. Devamında, aşağıdaki pencere açılacaktır:
Tamama tıkladıktan sonra, program aşağıdaki gibi grafiğe eklenecektir:
Devamında program onun için belirlediğimiz koşullara uygun olarak yorumları görüntüleyecektir:
Mevcut 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.
MetaQuotes Ltd tarafından İngilizceden çevrilmiştir.
Orijinal makale: https://www.mql5.com/en/articles/10961





- Ücretsiz ticaret uygulamaları
- 24 saat boyunca ücretsiz Forex VPS
- Ticaret kopyalama için 8.000'den fazla sinyal
- Finansal piyasaları keşfetmek için ekonomik haberler
Web sitesi politikasını ve kullanım şartlarını kabul edersiniz