
Relative Vigor Index göstergesine dayalı bir ticaret sistemi nasıl geliştirilir?
Giriş
Yeni teknik araçları detaylı bir şekilde öğrenme ve bu araçlarla basit ticaret sistemleri tasarlama konulu serimizin yeni makalesine hoş geldiniz. Bu kez Relative Vigor Index (RVI) göstergesine odaklanacağız ve onu aşağıdaki başlıklar üzerinden inceleyeceğiz:
- Relative Vigor Index göstergesinin tanımı
- Relative Vigor Index göstergesi stratejileri
- Relative Vigor Index göstergesine dayalı ticaret sisteminin planı
- Relative Vigor Index göstergesine dayalı ticaret sistemi
- Sonuç
Makale boyunca, kodlarımızı yazmak için MetaQuotes Language 5 (MQL5) programlama dilini ve MetaTrader 5 işlem platformunda yerleşik MetaEditor kod düzenleyicisini kullanacağız. Yeni başlayan biri olarak kodlama becerilerinizi geliştirmek istiyorsanız öğreneceklerinizi kendi başınıza uygulamaya çalışmanızı tavsiye ederim çünkü pratik yapmak çok önemlidir. MetaTrader 5’in nasıl kurulacağı ve MetaEditor’ın nasıl kullanılacağı hakkında daha fazla bilgi edinmek istiyorsanız, önceki makalelerimden birinde yer alan "MetaEditor’da MQL5 kodu yazma" bölümünü okuyabilirsiniz.
Bahsedilecek tüm stratejiler yalnızca eğitim amaçlıdır, bu nedenle optimizasyona ihtiyaç duyduklarını görebilirsiniz, ki bu normaldir, çünkü bu makalenin ve bu basit stratejilerin ana amacı göstergenin arkasındaki ana konsepti öğrenmektir. Dolayısıyla, bu stratejileri gerçek hesabınızda kullanmadan önce, ticaretinizde yararlı olacaklarından emin olmak için onları çok iyi bir şekilde test ettiğinizden emin olmalısınız.
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.
Relative Vigor Index göstergesinin tanımı
Bu bölümde, Relative Vigor Index (RVI) göstergesi nedir, bunu detaylı olarak konuşacağız. Bu bir momentum ve osilatör teknik göstergesidir. Bu gösterge, kapanış fiyatını açılış seviyesiyle karşılaştırarak trendin gücünü ölçer. Yükseliş trendinde kapanış fiyatı açılış fiyatının üzerinde kapanır, düşüş trendinde ise kapanış fiyatı açılış fiyatının altında kapanır. Buna ek olarak Simple Moving Average kullanılarak sonuçlar yumuşatılır. RVI göstergesi, doğası gereği trend olan piyasalarda yatay piyasalara göre daha iyi performans göstermektedir. RVI'ın hesaplanmasının Stochastic Oscillator’a benzer olduğunu ancak RVI'ın kapanış fiyatını açılış fiyatıyla karşılaştırdığını, Stochastic Oscillator’ın da kapanış fiyatını belirli bir periyottaki fiyat aralığıyla karşılaştırdığını görebiliriz. RVI'ı manuel olarak hesaplamak istiyorsak bunu aşağıdaki adımlarla yapabiliriz:
RVI = (CLOSE - OPEN) / (HIGH - LOW)
Tanımlamalar:
CLOSE = kapanış fiyatı
OPEN = açılış fiyatı
YÜKSEK = yüksek fiyatı
DÜŞÜK = düşük fiyatı
Ancak genellikle kullandığımız RVI, hesaplamada farklı bileşenlere sahip iki çizgi olarak görünür. Aşağıda onları nasıl hesaplayabileceğimiz anlatılmaktadır.
1- 1. çizginin hesaplanması:
- Payın hesaplanması:
MovAverage = (CLOSE - OPEN) + 2 * (CLOSE-1 - OPEN-1) + 2 * (CLOSE-2 - OPEN-2) + (CLOSE-3 - OPEN-3)
Tanımlamalar:
CLOSE = mevcut kapanış fiyatı
CLOSE 1, CLOSE 2, CLOSE 3 = 1,2 ve 3 periyot önceki kapanış fiyatları
OPEN = mevcut açılış fiyatı
OPEN 1, OPEN 2, OPEN 3 = 1,2 ve 3 periyot önceki açılış fiyatları
- Paydanın hesaplanması:
RangeAverage = (HIGH - LOW) + 2 * (HIGH-1 - LOW-1) + 2 * (HIGH-2 - LOW-2) + (HIGH-3 - LOW-3)
Tanımlamalar:
HIGH = mevcut yüksek fiyatı
HIGH, HIGH 2, HIGH 3 = 1, 2 ve 3 periyot önceki yüksek fiyatları
LOW = mevcut düşük fiyatı
LOW 1, LOW 2, LOW 3 = 1, 2 ve 3 periyot önceki düşük fiyatları
- Bu ortalamaların toplamını aşağıdaki şekilde hesaplarız:
2- 2. çizginin hesaplanması:
RVIsignal = (RVIaverage + 2 * RVIaverage-1 + 2 * RVIaverage-2 + RVIaverage-3) / 6
Bu şekilde, RVI göstergesini manuel olarak hesaplayabiliriz. Günümüzde, MetaTrader 5 platformuyla standart olarak gelen hazır bir gösterge bulunduğundan, RVI’ı manuel olarak hesaplamamıza gerek yoktur. Tek yapmamız gereken mevcut göstergeler arasından onu seçmektir:
MetaTrader 5'i açın --> Ekle sekmesine tıklayın --> Göstergeler --> Osilatörler --> Relative Vigor Index
Gösterge seçildiğinde, aşağıdaki gösterge parametreleri penceresi açılacaktır:
1 - periyodu ayarlamak için.
2- RVI çizgisinin rengini ayarlamak için.
3- RVI çizgisinin stilini ayarlamak için.
4- RVI çizgisinin kalınlığını ayarlamak için.
5- Sinyal çizgisinin rengini ayarlamak için.
6- Sinyal çizgisinin stilini ayarlamak için.
7- Sinyal çizgisinin kalınlığını ayarlamak için.
Gösterge için uygun parametreleri ayarladıktan sonra gösterge aşağıdaki gibi grafiğe eklenecektir:
Yukarıdaki görüntüden görebileceğimiz gibi, RVI göstergesi grafiğe eklenmiştir ve sıfır seviyesi etrafında salınan iki çizgiye sahiptir.
Relative Vigor Index göstergesi stratejileri
Bu bölümde, RVI göstergesini ana konseptine uygun olarak bazı basit stratejilerle nasıl kullanabileceğimizi göreceğiz. Burada şunu tekrar teyit etmem gerekiyor: herhangi bir stratejiyi gerçek hesabınızda kullanmadan önce, ticaretinize uygun ve kârlı olduğundan emin olmak için onu detaylıca test ettiğinizden emin olmalısınız, çünkü burada sunulan basit stratejiler yalnızca eğitim amaçlı olarak paylaşılmaktadır ve bu nedenle onların optimizasyona ihtiyaç duyabileceğini görmeniz normaldir.
- Birinci strateji: RVI - Çaprazlama - Yükseliş trendi:
Bu stratejiye dayanarak, yükseliş trendi sırasında belirli bir koşula göre alış ve kapanış sinyalleri alacağız. Mevcut RVI değeri ve mevcut RVI sinyal değeri sıfır seviyesinin üzerindeyse ve bununla birlikte mevcut RVI değeri mevcut RVI sinyal değerinden daha yüksekse, bu, alış sinyali olacaktır. Tersi şekilde, mevcut RVI değeri ve mevcut RVI sinyal değeri sıfır seviyesinin altındaysa ve bununla birlikte mevcut RVI değeri mevcut RVI sinyal değerinden daha düşükse, bu da kapanış sinyali olacaktır.
Daha basit ifadeyle,
Mevcut RVI > 0 ve Mevcut RVI sinyal > 0 ve Mevcut RVI > Mevcut RVI sinyal --> Alış
Mevcut RVI < 0 ve Mevcut RVI sinyal < 0 ve Mevcut RVI < Mevcut RVI sinyal --> Kapanış
- Birinci strateji: RVI - Çaprazlama - Düşüş trendi:
Bu stratejiye dayanarak, önceki RVI - Çaprazlama - Yükseliş trendi stratejisinin zıt sinyallerini alacağız: satış ve kapanış. Mevcut RVI değeri ve mevcut RVI sinyal değeri sıfır seviyesinin altındaysa ve bununla birlikte mevcut RVI değeri mevcut RVI sinyal değerinden daha düşükse, bu, satış sinyali olacaktır. Tersi şekilde, mevcut RVI değeri ve mevcut RVI sinyal değeri sıfır seviyesinin üzerindeyse ve bununla birlikte mevcut RVI değeri mevcut RVI sinyal değerinden daha yüksekse, bu da kapanış sinyali olacaktır.
Daha basit ifadeyle,
Mevcut RVI < 0 ve Mevcut RVI sinyal < 0 ve Mevcut RVI < Mevcut RVI sinyal --> Satış
Mevcut RVI > 0 ve Mevcut RVI sinyal > 0 ve Mevcut RVI > Mevcut RVI sinyal --> Kapanış
- İkinci strateji: RVI - MA çaprazlama:
Bu stratejiye dayanarak, belirli koşullara göre alış ve satış sinyalleri alacağız. Mevcut kapanış fiyatı 100 periyotluk hareketli ortalamanın üzerindeyse ve bununla birlikte mevcut RVI değeri mevcut RVI sinyal değerinden daha yüksekse, bu, alış sinyali olacaktır. Diğer senaryoda, mevcut kapanış fiyatı 100 periyotluk hareketli ortalamanın altındaysa ve bununla birlikte mevcut RVI değeri mevcut RVI sinyal değerinden daha düşükse, bu da satış sinyali olacaktır.
Daha basit ifadeyle,
Mevcut kapanış > 100 periyotluk hareketli ortalama ve Mevcut RVI > Mevcut RVI sinyal --> Alış
Mevcut kapanış < 100 periyotluk hareketli ortalama ve Mevcut RVI < Mevcut RVI sinyal --> Satış
Relative Vigor Index göstergesine dayalı ticaret sisteminin planı
Bu bölümde, ele aldığımız stratejiler için ticaret sistemini oluştururken bize yardımcı olması adına ilgili her strateji için olmak üzere adım adım ifadeler içeren bir plan hazırlayacağız.
- Birinci strateji: RVI - Çaprazlama - Yükseliş trendi:
Bu stratejiye göre, aşağıdaki değerleri sürekli olarak kontrol ederek yükseliş trendi sırasında alış ve kapanış sinyalleri veren bir ticaret sistemi oluşturmamız gerekiyor:
- Mevcut RVI değeri
- Mevcut RVI sinyal değeri
- RVI göstergesinin sıfır seviyesi
Mevcut RVI değeri ve mevcut RVI sinyal değeri sıfır seviyesinin üzerindeyse ve bununla birlikte mevcut RVI değeri mevcut RVI sinyal değerinden daha yüksekse, ticaret sistemi şu ifadeleri ayrı satırlar halinde grafik üzerinde yorum olarak görüntülemelidir:
- Alış sinyali
- Mevcut RVI değeri
- Mevcut RVI sinyal değeri
Tersi şekilde, mevcut RVI değeri ve mevcut RVI sinyal değeri sıfır seviyesinin altındaysa ve bununla birlikte mevcut RVI değeri mevcut RVI sinyal değerinden daha düşükse, bu kez de şu ifadeleri ayrı satırlar halinde grafik üzerinde yorum olarak görüntülemelidir:
- Kapanış sinyali
- Mevcut RVI değeri
- Mevcut RVI sinyal değeri
Aşağıda, bu strateji için bir program geliştirmemize yardımcı olacak adım adım plan yer almaktadır:
- Birinci strateji: RVI - Çaprazlama - Düşüş trendi:
Bu stratejiye göre, önceki stratejinin aynı değerlerini sürekli olarak kontrol ederek, düşüş trendi sırasında bize satış ve kapanış sinyalleri verebilecek bir ticaret sistemi oluşturmamız gerekiyor:
- Mevcut RVI değeri
- Mevcut RVI sinyal değeri
- RVI göstergesinin sıfır seviyesi
Ancak istenen sinyallere göre koşullar biraz farklı olacaktır. Mevcut RVI değeri ve mevcut RVI sinyal değeri sıfır seviyesinin altındaysa ve bununla birlikte mevcut RVI değeri mevcut RVI sinyal değerinden daha düşükse, ticaret sistemi şu ifadeleri ayrı satırlar halinde grafik üzerinde yorum olarak görüntülemelidir:
- Satış sinyali
- Mevcut RVI değeri
- Mevcut RVI sinyal değeri
Tersi şekilde, mevcut RVI değeri ve mevcut RVI sinyal değeri sıfır seviyesinin üzerindeyse ve bununla birlikte mevcut RVI değeri mevcut RVI sinyal değerinden daha yüksekse, bu kez de şu ifadeleri ayrı satırlar halinde grafik üzerinde yorum olarak görüntülemelidir:
- Kapanış sinyali
- Mevcut RVI değeri
- Mevcut RVI sinyal değeri
Aşağıda, bu strateji için bir program geliştirmemize yardımcı olacak adım adım plan yer almaktadır:
- İkinci strateji: RVI - MA çaprazlama:
Bu stratejiye göre, aşağıdaki değerleri sürekli olarak kontrol ederek alış ve satış sinyalleri veren bir ticaret sistemi oluşturmamız gerekiyor:
- Mevcut kapanış fiyatı
- 100 periyotluk hareketli ortalama
- Mevcut RVI değeri
- Mevcut RVI sinyal değeri
Mevcut kapanış fiyatı 100 periyotluk hareketli ortalamanın üzerindeyse ve bununla birlikte mevcut RVI değeri mevcut RVI sinyal değerinden daha yüksekse, ticaret sistemi şu ifadeleri ayrı satırlar halinde grafik üzerinde yorum olarak görüntülemelidir:
- Alış sinyali
- Mevcut kapanış fiyatı
- Mevcut MA değeri
- Mevcut RVI değeri
- Mevcut RVI sinyal değeri
Diğer senaryoda, mevcut kapanış fiyatı 100 periyotluk hareketli ortalamanın altındaysa ve bununla birlikte mevcut RVI değeri mevcut RVI sinyal değerinden daha düşükse, bu kez de şu ifadeleri ayrı satırlar halinde grafik üzerinde yorum olarak görüntülemelidir:
- Satış sinyali
- Mevcut kapanış fiyatı
- Mevcut MA değeri
- Mevcut RVI değeri
- Mevcut RVI sinyal değeri
Aşağıda, bu strateji için bir program geliştirmemize yardımcı olacak adım adım plan yer almaktadır:
Relative Vigor Index göstergesine dayalı ticaret sistemi
Bu bölümde, hazırladığımız plan çerçevesinde ele aldığımız stratejilere dayalı olarak bir ticaret sistemi oluşturacağız. İlk olarak, stratejilerimizin programlarına temel olması adına mevcut RVI ve mevcut RVI sinyal değerlerini grafik üzerinde yorum olarak görüntüleyecek basit bir program yazalım. Adım adım nasıl yapılacağını görelim:
double fonksiyonunu kullanarak RVI ve RVI sinyal için iki dizi oluşturalım:
double rviArray[]; double rviSignalArray[];
ArraySetAsSeries fonksiyonunu kullanarak dizileri mevcut veriden başlayarak sıralayalım - başarılı olması durumunda true, aksi takdirde false geri döner (bool türü):
ArraySetAsSeries(rviArray,true); ArraySetAsSeries(rviSignalArray,true);
rviDef için int türü değişken oluşturduktan sonra iRVI fonksiyonunu kullanarak RVI’ı tanımlayalım. iRVI fonksiyonu RVI göstergesinin tanıtıcısını geri döndürür. Parametreleri şunlardır:
- Sembol adı - Mevcut sembole uygulanmak üzere _Symbol kullanacağız.
- Zaman dilimi - Mevcut zaman dilimine uygulanmak üzere _Period kullanacağız.
- Moving Average periyodu - 10 ayarlayacağız.
int rviDef = iRVI(_Symbol,_Period,10);
CopyBuffer fonksiyonunu kullanarak oluşturduğumuz dizileri rviDef’in istediğimiz değerleriyle dolduralım. Parametreleri şunlardır:
- Gösterge tanıtıcısı - rviDef, rviDef gösterge tanımını kullanacağız.
- Gösterge arabellek numarası - 0, 1 ayarlayacağız.
- Başlangıç konumu - 0, 0 ayarlayacağız.
- Kopyalanacak veri miktarı - 3, 3 ayarlayacağız.
- Hedef dizi - rviArray, rviSignalArray ayarlayacağız.
CopyBuffer(rviDef,0,0,3,rviArray); CopyBuffer(rviDef,1,0,3,rviSignalArray);
rviVal ve rviSignalVal için double türü değişkenler oluşturduktan sonra, double türünde değer geri döndüren NormalizeDouble fonksiyonunu kullanarak mevcut RVI ve mevcut RVI sinyal değerlerini hesaplayalım. Parametreleri şunlardır:
- Normalleştirilmiş sayı - rviArray[0], rviSignalArray[0] kullanacağız.
- Ondalık basamak sayısı - 3, 3 ayarlayacağız.
double rviVal = NormalizeDouble(rviArray[0],3); double rviSignalVal = NormalizeDouble(rviSignalArray[0],3);
Comment fonksiyonunu kullanarak mevcut RVI ve mevcut RVI sinyal değerlerini grafikte yorum olarak görüntüleyelim:
Comment("Relative Vigor Index Value is ",rviVal,"\n", "RVI Signal Value is ",rviSignalVal);
Bu stratejiye dayalı Uzman Danışmanın tam kodu aşağıda gösterilmektedir:
//+------------------------------------------------------------------+ //| Simple RVI.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() { double rviArray[]; double rviSignalArray[]; ArraySetAsSeries(rviArray,true); ArraySetAsSeries(rviSignalArray,true); int rviDef = iRVI(_Symbol,_Period,10); CopyBuffer(rviDef,0,0,3,rviArray); CopyBuffer(rviDef,1,0,3,rviSignalArray); double rviVal = NormalizeDouble(rviArray[0],3); double rviSignalVal = NormalizeDouble(rviSignalArray[0],3); Comment("Relative Vigor Index Value is ",rviVal,"\n", "RVI Signal Value is ",rviSignalVal); } //+------------------------------------------------------------------+
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:
"Algoritmik ticarete izin ver" seçeneğini etkinleştirip Tamama tıkladıktan sonra, program aşağıdaki gibi grafiğe eklenecektir:
Gördüğümüz üzere, grafiğin sağ üst köşesinde Uzman Danışmanın grafik üzerinde çalıştığına dair bir ifade ortaya çıktı. Böylece, program mevcut RVI ve mevcut RVI sinyal değerlerini grafik üzerinde yorum olarak gösterecektir:
Yukarıdaki görüntüden görebileceğimiz gibi, Uzman Danışman mevcut RVI ve mevcut RVI sinyal değerlerini grafiğin sol üst köşesinde yorum olarak görüntülemektedir.
- Birinci strateji: RVI - Çaprazlama - Yükseliş trendi:
Bu stratejiye dayalı Uzman Danışmanın tam kodu aşağıda gösterilmektedir:
//+------------------------------------------------------------------+ //| RVI Crossover - 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() { double rviArray[]; double rviSignalArray[]; ArraySetAsSeries(rviArray,true); ArraySetAsSeries(rviSignalArray,true); int rviDef = iRVI(_Symbol,_Period,10); CopyBuffer(rviDef,0,0,3,rviArray); CopyBuffer(rviDef,1,0,3,rviSignalArray); double rviVal = NormalizeDouble(rviArray[0],3); double rviSignalVal = NormalizeDouble(rviSignalArray[0],3); if(rviVal>0 && rviSignalVal>0 && rviVal>rviSignalVal) { Comment("Buy Signal","\n", "Relative Vigor Index Value is ",rviVal,"\n", "RVI Signal Value is ",rviSignalVal); } if(rviVal<0 && rviSignalVal<0 && rviVal<rviSignalVal) { Comment("Close","\n", "Relative Vigor Index Value is ",rviVal,"\n", "RVI Signal Value is ",rviSignalVal); } } //+------------------------------------------------------------------+
Bu koddaki farklılıklar şunlardır:
Stratejinin koşulları:
Alış sinyali:
if(rviVal>0 && rviSignalVal>0 && rviVal>rviSignalVal) { Comment("Buy Signal","\n", "Relative Vigor Index Value is ",rviVal,"\n", "RVI Signal Value is ",rviSignalVal); }
Kapanış sinyali:
if(rviVal<0 && rviSignalVal<0 && rviVal<rviSignalVal) { Comment("Close","\n", "Relative Vigor Index Value is ",rviVal,"\n", "RVI Signal Value is ",rviSignalVal); }
Uzman Danışmanın kodunu derliyoruz ve grafiğe ekliyoruz:
Devamında program onun için belirlediğimiz koşullara uygun olarak yorumları gösterecektir:
Alış sinyali:
Yukarıdaki görüntüden görebileceğimiz gibi, program alış sinyali koşulunda aşağıdaki değerleri grafikte yorum olarak görüntülemektedir:
- Alış sinyali
- Mevcut RVI değeri
- Mevcut RVI sinyal değeri
Kapanış sinyali:
Yukarıdaki görüntüden görebileceğimiz gibi, program kapanış sinyali koşulunda aşağıdaki değerleri grafikte yorum olarak görüntülemektedir:
- Kapanış sinyali
- Mevcut RVI değeri
- Mevcut RVI sinyal değeri
- Birinci strateji: RVI - Çaprazlama - Düşüş trendi:
Bu stratejiye dayalı Uzman Danışmanın tam kodu aşağıda gösterilmektedir:
//+------------------------------------------------------------------+ //| RVI Crossover - 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() { double rviArray[]; double rviSignalArray[]; ArraySetAsSeries(rviArray,true); ArraySetAsSeries(rviSignalArray,true); int rviDef = iRVI(_Symbol,_Period,10); CopyBuffer(rviDef,0,0,3,rviArray); CopyBuffer(rviDef,1,0,3,rviSignalArray); double rviVal = NormalizeDouble(rviArray[0],3); double rviSignalVal = NormalizeDouble(rviSignalArray[0],3); if(rviVal<0 && rviSignalVal<0 && rviVal<rviSignalVal) { Comment("Short Signal","\n", "Relative Vigor Index Value is ",rviVal,"\n", "RVI Signal Value is ",rviSignalVal); } if(rviVal>0 && rviSignalVal>0 && rviVal>rviSignalVal) { Comment("Cover","\n", "Relative Vigor Index Value is ",rviVal,"\n", "RVI Signal Value is ",rviSignalVal); } } //+------------------------------------------------------------------+
Bu koddaki farklılıklar şunlardır:
Stratejinin koşulları:
Satış sinyali:
if(rviVal<0 && rviSignalVal<0 && rviVal<rviSignalVal) { Comment("Short Signal","\n", "Relative Vigor Index Value is ",rviVal,"\n", "RVI Signal Value is ",rviSignalVal); }
Kapanış sinyali:
if(rviVal>0 && rviSignalVal>0 && rviVal>rviSignalVal) { Comment("Cover","\n", "Relative Vigor Index Value is ",rviVal,"\n", "RVI Signal Value is ",rviSignalVal); }
Uzman Danışmanın kodunu derliyoruz ve grafiğe ekliyoruz:
Gördüğümüz üzere, grafiğin sağ üst köşesinde Uzman Danışmanın grafik üzerinde çalıştığına dair bir ifade ortaya çıktı. Devamında program onun için belirlediğimiz koşullara uygun olarak yorumları gösterecektir:
Satış sinyali:
Yukarıdaki görüntüden görebileceğimiz gibi, program satış sinyali koşulunda aşağıdaki değerleri grafikte yorum olarak görüntülemektedir:
- Satış sinyali
- Mevcut RVI değeri
- Mevcut RVI sinyal değeri
Kapanış sinyali:
Yukarıdaki görüntüden görebileceğimiz gibi, program kapanış sinyali koşulunda aşağıdaki değerleri grafikte yorum olarak görüntülemektedir:
- Kapanış sinyali
- Mevcut RVI değeri
- Mevcut RVI sinyal değeri
- İkinci strateji: RVI - MA çaprazlama:
Bu stratejiye dayalı Uzman Danışmanın tam kodu aşağıda gösterilmektedir:
//+------------------------------------------------------------------+ //| RVI & MA Crossover.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() { MqlRates pArray[]; double maArray[]; double rviArray[]; double rviSignalArray[]; int Data=CopyRates(_Symbol,_Period,0,1,pArray); ArraySetAsSeries(maArray,true); ArraySetAsSeries(rviArray,true); ArraySetAsSeries(rviSignalArray,true); int rviDef = iRVI(_Symbol,_Period,10); int maDef = iMA(_Symbol,_Period,100,0,MODE_EMA,PRICE_CLOSE); CopyBuffer(rviDef,0,0,3,rviArray); CopyBuffer(rviDef,1,0,3,rviSignalArray); CopyBuffer(maDef,0,0,3,maArray); double rviVal = NormalizeDouble(rviArray[0],3); double rviSignalVal = NormalizeDouble(rviSignalArray[0],3); double maVal = NormalizeDouble(maArray[0],3); if(pArray[0].close>maVal && rviVal>rviSignalVal) { Comment("Buy Signal","\n", "Closing price is ",pArray[0].close,"\n", "MA Value is ",maVal,"\n", "Relative Vigor Index Value is ",rviVal,"\n", "RVI Signal Value is ",rviSignalVal); } if(pArray[0].close<maVal && rviVal<rviSignalVal) { Comment("Sell Signal","\n", "Closing price is ",pArray[0].close,"\n", "MA Value is ",maVal,"\n", "Relative Vigor Index Value is ",rviVal,"\n", "RVI Signal Value is ",rviSignalVal); } } //+------------------------------------------------------------------+
Bu koddaki farklılıklar şunlardır:
Dört dizi oluşturuyoruz (pArray, maArray, rviArray ve rviSignalArray). pArray dışındaki diziler için double fonksiyonunu kullanacağız, pArray için ise fiyat, hacim ve makas bilgilerini depolayan MqlRates fonksiyonunu kullanacağız:
MqlRates pArray[]; double maArray[]; double rviArray[]; double rviSignalArray[];
ArraySetAsSeries fonksiyonunu kullanarak maArray, rviArray ve rviSignalArray dizilerini mevcut veriden başlayarak sıralıyoruz - başarılı olması durumunda true, aksi takdirde false geri döner (bool türü). pArray için MqlRates geçmiş verilerini almak adına CopyRates fonksiyonunu kullanacağız. CopyRates fonksiyonunun parametreleri şunlardır:
- Sembol adı - Mevcut sembole uygulanmak üzere _Symbol kullanacağız.
- Zaman dilimi - Mevcut zaman dilimine uygulanmak üzere _Period kullanacağız.
- Başlangıç konumu - 0 ayarlayacağız.
- Kopyalanacak veri miktarı - 1 ayarlayacağız.
- Hedef dizi - pArray ayarlayacağız.
int Data=CopyRates(_Symbol,_Period,0,1,pArray); ArraySetAsSeries(maArray,true); ArraySetAsSeries(rviArray,true); ArraySetAsSeries(rviSignalArray,true);
Öncesinde yaptığımız gibi iRVI fonksiyonunu kullanarak RVI'ı tanımlıyoruz ve ayrıca şimdi iMA fonksiyonunu kullanarak da MA’yı tanımlıyoruz. iMA fonksiyonunun parametreleri şunlardır:
- Sembol adı - Mevcut sembole uygulanmak üzere _Symbol kullanacağız.
- Zaman dilimi - Mevcut zaman dilimine uygulanmak üzere _Period kullanacağız.
- Moving Average periyodu - 100 ayarlayacağız.
- Moving Average kayma miktarı - 0 ayarlayacağız.
- Moving Average yöntemi - Exponential Moving Average (MODE_EMA) kullanacağız.
- Uygulanacak fiyat - Kapanış fiyatını (PRICE_CLOSE) kullanacağız.
int rviDef = iRVI(_Symbol,_Period,10); int maDef = iMA(_Symbol,_Period,100,0,MODE_EMA,PRICE_CLOSE);
CopyBuffer fonksiyonunu kullanarak oluşturduğumuz dizileri rviDef ve maDef değerleriyle dolduruyoruz:
CopyBuffer(rviDef,0,0,3,rviArray); CopyBuffer(rviDef,1,0,3,rviSignalArray); CopyBuffer(maDef,0,0,3,maArray);
NormalizeDouble fonksiyonunu kullanarak RVI, RVI sinyal ve MA değerlerini tanımlıyoruz:
double rviVal = NormalizeDouble(rviArray[0],3); double rviSignalVal = NormalizeDouble(rviSignalArray[0],3); double maVal = NormalizeDouble(maArray[0],3);
Stratejinin koşulları:
Alış sinyali:
if(pArray[0].close>maVal && rviVal>rviSignalVal) { Comment("Buy Signal","\n", "Closing price is ",pArray[0].close,"\n", "MA Value is ",maVal,"\n", "Relative Vigor Index Value is ",rviVal,"\n", "RVI Signal Value is ",rviSignalVal); }
Satış sinyali:
if(pArray[0].close<maVal && rviVal<rviSignalVal) { Comment("Sell Signal","\n", "Closing price is ",pArray[0].close,"\n", "MA Value is ",maVal,"\n", "Relative Vigor Index Value is ",rviVal,"\n", "RVI Signal Value is ",rviSignalVal); }
Uzman Danışmanın kodunu derliyoruz ve grafiğe ekliyoruz:
Devamında program onun için belirlediğimiz koşullara uygun olarak yorumları gösterecektir:
Alış sinyali:
Yukarıdaki görüntüden görebileceğimiz gibi, program alış sinyali koşulunda aşağıdaki değerleri grafikte yorum olarak görüntülemektedir:
- Alış sinyali
- Mevcut kapanış fiyatı
- Mevcut MA değeri
- Mevcut RVI değeri
- Mevcut RVI sinyal değeri
Satış sinyali:
Yukarıdaki görüntüden görebileceğimiz gibi, program satış sinyali koşulunda aşağıdaki değerleri grafikte yorum olarak görüntülemektedir:
- Satış sinyali
- Mevcut kapanış fiyatı
- Mevcut MA değeri
- Mevcut RVI değeri
- Mevcut RVI sinyal değeri
Sonuç
Bu makaledeki konuğumuz Relative Vigor Index göstergesiydi. İlk olarak, RVI göstergesinin ne olduğu, neyi ölçtüğü ve manuel olarak nasıl hesaplandığı hakkında konuştuk. Devamında, bazı basit stratejileri ele alarak onu ticaretimizde nasıl kullanabileceğimizi gördük. Bu basit stratejiler şunlardı:
- RVI - Çaprazlama - Yükseliş trendi: yükseliş trendi sırasında alış ve kapanış sinyalleri almak için.
- RVI - Çaprazlama - Düşüş trendi: düşüş trendi sırasında satış ve kapanış sinyalleri almak için.
- RVI - MA çaprazlama: belirli bir çaprazlama koşuluna dayalı olarak alış ve satış sinyalleri almak için.
Ardından, ele aldığımız stratejiler için ticaret sistemini oluştururken bize yardımcı olması adına ilgili her strateji için olmak üzere adım adım ifadeler içeren bir plan hazırladık. Son olarak da, makalenin en ilginç bölümüne geldik ve hazırladığımız plan çerçevesinde, MetaTrader 5 işlem platformunda kullanılmak üzere, ele aldığımız stratejilere dayalı olarak bir ticaret sistemi oluşturduk.
Bu makaledeki bilgilerden maksimum faydayı elde etmek ve programlama becerilerinizi geliştirmek adına öğrendiklerinizi kendi başınıza tekrarlı bir şekilde pratik etmeye çalışmalısınız. Umarım makale sizin için faydalı olur ve ticaret hedeflerinize ulaşmanıza, bu veya başka herhangi bir konuda yeni fikirler bulmanıza yardım sağlar. Bu makaleyi beğendiyseniz ve buna benzer makaleler okumak istiyorsanız, en popüler teknik göstergelere dayalı ticaret sistemlerinin nasıl geliştirileceğini öğrenme konulu bu serideki diğer makaleleri de okuyabilirsiniz. Bir sonraki makalede görüşünceye kadar hoşça kalın.
MetaQuotes Ltd tarafından İngilizceden çevrilmiştir.
Orijinal makale: https://www.mql5.com/en/articles/11425





- Ücretsiz alım-satım uygulamaları
- İşlem kopyalama için 8.000'den fazla sinyal
- Finansal piyasaları keşfetmek için ekonomik haberler
Gizlilik ve Veri Koruma Politikasını ve MQL5.com Kullanım Şartlarını kabul edersiniz