
MQL5’i kullanarak özel bir True Strength Index göstergesi nasıl oluşturulur?
Giriş
Teknik göstergeler doğru kullanıldığında çok faydalı olabilir çünkü sadece fiyat hareketlerini gözlemleyerek keşfedilmesi zor olan ek bilgiler sağlayabilirler. Kullanabileceğimiz birçok hazır teknik gösterge vardır, ancak bazen bize belirli bilgiler vermesi için onları özelleştirmemiz veya kazanç sağlayan fikirlerimize dayanarak yeni bir gösterge oluşturmamız gerekir. MQL5'te bu tür özelleştirilmiş göstergeler oluşturmanın ve bunları MetaTrader 5 işlem platformunda kullanmanın bir yolu vardır. Bu makalede, sıfırdan bir True Strength Index göstergesinin nasıl oluşturulacağını göstereceğim. Bu göstergenin özelliklerini inceleyeceğiz ve kodumuzda nasıl hesaplanacağını göreceğiz. Ayrıca bir Uzman Danışman oluşturarak bu özel göstergeyi bir alım-satım sisteminde nasıl kullanabileceğimizi de öğreneceğiz. Tüm bunlar aşağıdaki bölümlerde ele alınacaktır:
- True Strength Index (TSI) göstergesinin tanımı
- Özel bir basit TSI göstergesi
- Özel bir TSI Uzman Danışmanı
- TSI System Uzman Danışmanı
- Sonuç
Bu konuları anladıktan sonra, True Strength Index göstergesini kullanabilecek ve yorumlayabilecek, ayrıca MetaTrader 5'te kullanılmak üzere MQL5 dilinde özel bir gösterge olarak hesaplayabilecek ve kodlayabileceğiz. Ayrıca göstergeyi diğer alım-satım sistemlerinde veya Uzman Danışmanlarda da uygulayabileceksiniz. Programlama becerilerinizi geliştirmek istiyorsanız, kodları kendiniz yazmanızı tavsiye ederim, çünkü bu alıştırma herhangi bir öğrenme sürecindeki çok önemli bir adımdır. MQL5 kodlarımızı yazmak üzere MetaTrader 5 işlem platformunda yerleşik olan MetaEditor’ı kullanacağız. 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.
True Strength Index (TSI) göstergesinin tanımı
Bu bölümde, True Strength Index (TSI) teknik göstergesine detaylı bir şekilde göz atacağız. William Blau tarafından geliştirilmiştir. Gösterge, fiyat hareketinin momentumunu, yani enstrümanın gücünü ölçer. Sıfır çizgisi etrafında salınır, bu nedenle bir momentum osilatörüdür. Göstergeye bir sinyal çizgisi ekleyebilir, böylece çizgilerin kesişmesine bağlı olarak ek alış veya satış sinyalleri alabiliriz. Ancak, yalnızca TSI çizgisine dayalı sinyaller alabiliriz - sıfır çizgisiyle kesişmesine bağlı olarak. Sıfır çizgisinin üzerindeyse yükseliş momentumu, altındaysa düşüş momentumu anlamına gelir. Gösterge, aşırı alış ve aşırı satış alanlarının yanı sıra yükseliş ve düşüş ıraksamalarını tespit etmek için kullanılabilir. Kanıtların değerini artırmak için sinyallerini teyit etmemiz gerektiğini bildiğimizden, daha iyi bir içgörü elde etmek amacıyla fiyat hareketiyle aynı bağlamda kullanabileceğimiz diğer teknik araçlarla birlikte kullanmak daha iyidir.
Şimdi bu göstergenin nasıl hesaplanacağını görelim. Hesaplama birkaç aşamada gerçekleştirilir:
İki kez yumuşatılmış momentumun hesaplanması:
- Mevcut fiyattan önceki fiyatın çıkarılmasıyla momentumun (fiyat değişimi) hesaplanması
- Hesaplanan momentumun 25 periyotluk EMA'sının elde edilmesiyle ilk yumuşatmanın hesaplanması
- İlk yumuşatmanın 13 periyotluk EMA'sının elde edilmesiyle ikinci yumuşatmanın hesaplanması
İki kez yumuşatılmış mutlak momentumun hesaplanması:
- Mutlak mevcut fiyattan mutlak önceki fiyatın çıkarılmasıyla mutlak momentumun hesaplanması
- Hesaplanan mutlak momentumun 25 periyotluk EMA'sının elde edilmesiyle ilk yumuşatmanın hesaplanması
- İlk yumuşatmanın 13 periyotluk EMA'sının elde edilmesiyle ikinci yumuşatmanın hesaplanması
TSI = 100 * (İki kez yumuşatılmış momentum / İki kez yumuşatılmış mutlak momentum)
Bu hesaplamanın sonucu, fiyat hareketinin momentumunu ölçen ve aşırı alış ve aşırı satış alanlarını tespit eden sıfır etrafında dalgalanan bir çizgi olacaktır.
Özel bir basit TSI göstergesi
MQL5 programlama dili önceden tanımlanmış birçok teknik göstergeye sahiptir ve bunları önceden tanımlanmış fonksiyonları kullanarak sistemlerimizde kullanabiliriz. Bir alım-satım sistemini nasıl geliştirebileceğimizi tartıştığımız serinin önceki makalelerinde bu tür birçok göstergeden bahsetmiştik. Önceki makalelere göz atabilir ve faydalı şeyler bulabilirsiniz. Şimdi soru şu: Standart platform paketinde mevcut değilse bir göstergeyi nasıl oluşturabiliriz ve mevcut olsa bile, istediğimiz sinyalleri veya tetikleyicileri üretmek için özelleşmiş bir göstergeyi nasıl oluşturabiliriz? Kısa cevap, ana programlama dilini kullanarak özel bir gösterge oluşturmaktır. Burada yapacağımız şey budur.
MQL5’i kullanarak özel bir True Strength Index göstergesinin nasıl oluşturulacağını öğreneceğiz. Daha sonra özelliklerini diğer sistemlerde veya Uzman Danışmanlarda kullanacağız. Aşağıdaki adımlar bu özel göstergeyi oluşturmak içindir.
#property kullanarak ek parametreler oluşturarak, yanında tanımlayıcının değerini belirtiriz. Aşağıdaki parametreleri belirtmemiz gerekiyor:
- (indicator_separate_window) - Göstergeyi ayrı bir pencerede göstermek için.
- (indicator_buffers) - Göstergenin arabellek sayısı. (8) belirteceğiz.
- (indicator_plots) - Göstergenin grafik serisi sayısı. (1) belirteceğiz.
- (indicator_label1) - Grafik serisi numarası için etiket. (TSI) belirteceğiz.
- (indicator_type1) - ENUM_DRAW_TYPE değerlerinden bir değer olarak grafik çizim türü. (DRAW_LINE) belirteceğiz.
- (indicator_color1) - Görüntülenen gösterge çizgisinin rengi. (clrBlue) belirteceğiz.
- (indicator_style1) - Gösterge çizgisinin stili. (STYLE_SOLID) belirteceğiz.
- (indicator_width1) - Gösterge çizgisinin kalınlığı. (3) belirteceğiz.
#property indicator_separate_window #property indicator_buffers 8 #property indicator_plots 1 #property indicator_label1 "TSI" #property indicator_type1 DRAW_LINE #property indicator_color1 clrBlue #property indicator_style1 STYLE_SOLID #property indicator_width1 3
Bileşenini hesaplamalarımızda kullanmak için MovingAverage.mqh dosyasını dahil etmemiz gerekir. Bu dosya #include komutu kullanılarak Include klasöründen dahil edilir. Dosya adlarının eşleştiğinden emin olun.
#include <MovingAverages.mqh>
Göstergeyi hesaplarken kullanacağımız iki yumuşatma periyodunu, kullanıcının programda belirtilen varsayılan değerleri güncellemesi gerekiyorsa bu değerleri girmesi için input sınıfını kullanarak ayarlamamız gerekir. İşaretsiz tamsayı olan uint kullanarak bildirmemiz gereken değişkenlerin (InpSmPeriod1, InpSmPeriod2) veri türünü tanımlayacağız. Daha sonra varsayılan değerler olarak InpSmPeriod1 için (25) ve InpSmPeriod2 için (13) değerlerini atayacağız.
input uint InpSmPeriod1 = 25; // Smoothing period 1 input uint InpSmPeriod2 = 13; // Smoothing period 2
Yumuşatma periyotları için iki tamsayı değişken oluşturacağız (smperiod1, smperiod2).
int smperiod1; int smperiod2;
Gösterge arabellekleri için yedi dizi oluşturacağız.
double indBuff[]; double momBuff[]; double momSmBuff1[]; double momSmBuff2[]; double absMomBuff[]; double absMomSmBuff1[]; double absMomSmBuff2[];
OnInit() fonksiyonu içinde aşağıdaki adımları uygulayacağız:
InpSmPeriod1 ve InpSmPeriod2’nin kullanıcı girdisi 2'den küçükse 2 değerini geri döndüren veya aksi takdirde InpSmPeriod1 ve InpSmPeriod2 değerlerini geri döndüren (smperiod1, smperiod2) değişkenlerini bildireceğiz.
smperiod1=int(InpSmPeriod1<2 ? 2 : InpSmPeriod1); smperiod2=int(InpSmPeriod2<2 ? 2 : InpSmPeriod2);
Gösterge arabelleklerini “SetIndexBuffer” fonksiyonunu kullanarak dizilere bağlayacağız. Parametreleri şunlardır:
index - Gösterge arabelleğinin numarası. Programımızda 0'dan 7'ye kadar olan sayılar.
buffer[] - Özel göstergede bildirilen dizi.
data_type - Gösterge dizisinde depolanan veri türü.
SetIndexBuffer(0,indBuff,INDICATOR_DATA); SetIndexBuffer(2,momBuff,INDICATOR_CALCULATIONS); SetIndexBuffer(3,momSmBuff1,INDICATOR_CALCULATIONS); SetIndexBuffer(4,momSmBuff2,INDICATOR_CALCULATIONS); SetIndexBuffer(5,absMomBuff,INDICATOR_CALCULATIONS); SetIndexBuffer(6,absMomSmBuff1,INDICATOR_CALCULATIONS); SetIndexBuffer(7,absMomSmBuff2,INDICATOR_CALCULATIONS);
İlgili gösterge özelliğinin değerini ayarlayacağız. Bu gösterge özelliği, yalnızca özellik tanımlayıcısını belirten çağrı varyantı ile “IndicatorSetString” fonksiyonu kullanılarak dizge türünde olmalıdır. Bu adım, gösterge penceresinin sol üst kısmında görüntülenecek göstergenin kısa adını ve periyotları ayarlamak içindir. Parametreleri şunlardır:
- prop_id - (ENUM_CUSTOMIND_PROPERTY_STRING) numaralandırmasından bir değer olacak gösterge özelliğinin tanımlayıcısı. Programımızda (INDICATOR_SHORTNAME) olacaktır.
- prop_value - bir dizge veri türü olacak özelliğin değeri. "True Strength Index ("+(string)smperiod1+","+(string)smperiod2+")" olacaktır.
IndicatorSetString(INDICATOR_SHORTNAME,"True Strength Index ("+(string)smperiod1+","+(string)smperiod2+")");
Yalnızca özellik tanımlayıcısını belirten çağrı varyantı ile “IndicatorSetInteger” fonksiyonunu kullanarak gösterge değerini ondalık basamak sayısına göre normalleştirmek için tamsayı veri türünde bir gösterge özelliği değeri daha ayarlayacağız. Parametreleri şunlardır:
- prop_id - (ENUM_CUSTOMIND_PROPERTY_INTEGER) numaralandırmasından bir değer olacak gösterge özelliğinin tanımlayıcısı. Programımızda (INDICATOR_DIGITS) olacaktır.
- prop_value - bir tamsayı veri türü olacak özelliğin değeri. Digits() olacaktır.
IndicatorSetInteger(INDICATOR_DIGITS,Digits());
“ArraySetAsSeries” fonksiyonunu kullanarak dizi için AS_SERIES bayrağını ayarlayacağız.
ArraySetAsSeries(indBuff,true); ArraySetAsSeries(momBuff,true); ArraySetAsSeries(momSmBuff1,true); ArraySetAsSeries(momSmBuff2,true); ArraySetAsSeries(absMomBuff,true); ArraySetAsSeries(absMomSmBuff1,true); ArraySetAsSeries(absMomSmBuff2,true);
OnCalculate() fonksiyonundan sonra,
- OnCalculate kısmından close dizisi için AS_SERIES bayrağını ayarlayacağız ve ardından rates_total 2'den küçükse 0 geri döndürmek için kontrol yapacağız.
- (rates_total - prev_calculated) değerine eşit limit adında bir tamsayı değişken oluşturacağız.
- limit değişkeninin 1'den büyük olup olmadığını kontrol edeceğiz. Eğer öyleyse, aşağıdaki adımları gerçekleştirmemiz gerekir:
- limit değişkenini (rates_total - 2) sonucuyla güncelleriz.
- “ArrayInitialize” fonksiyonunu kullanarak double türündeki sayısal dizileri öntanımlı değerle başlatırız. Parametreleri, başlatılacak sayısal diziyi belirtmek için array[] ve ayarlanacak yeni değeri belirtmek için value'dur.
ArraySetAsSeries(close,true); if(rates_total<2) return 0; int limit=rates_total-prev_calculated; if(limit>1) { limit=rates_total-2; ArrayInitialize(indBuff,EMPTY_VALUE); ArrayInitialize(momBuff,0); ArrayInitialize(momSmBuff1,0); ArrayInitialize(momSmBuff2,0); ArrayInitialize(absMomBuff,0); ArrayInitialize(absMomSmBuff1,0); ArrayInitialize(absMomSmBuff2,0); }
momBuff[i] ve absMomBuff[i] değerlerini güncellemek için bir döngü oluşturacağız. Bu adımda kullanılan yeni fonksiyonlar:
- Üç ifade ve yürütülebilir bir operatör içeren “for” döngüsü.
- MQL5 programının zorla kapatılıp kapatılmadığını kontrol etmek için “IsStopped()”.
- Mutlak değeri geri döndürmek için “MathAbs()”. Aynı sonuç için “febs()” fonksiyonunu da kullanabiliriz.
for(int i=limit; i>=0 && !IsStopped(); i--) { momBuff[i]=close[i]-close[i+1]; absMomBuff[i]=MathAbs(momBuff[i]); }
(MovingAverage) Include dosyasındaki “ExponentialMAOnBuffer” fonksiyonunu kullanarak aşağıdaki kontrolleri yapacağız.
if(ExponentialMAOnBuffer(rates_total,prev_calculated,0,smperiod1,momBuff,momSmBuff1)==0) return 0; if(ExponentialMAOnBuffer(rates_total,prev_calculated,0,smperiod1,absMomBuff,absMomSmBuff1)==0) return 0; if(ExponentialMAOnBuffer(rates_total,prev_calculated,smperiod1,smperiod2,momSmBuff1,momSmBuff2)==0) return 0; if(ExponentialMAOnBuffer(rates_total,prev_calculated,smperiod1,smperiod2,absMomSmBuff1,absMomSmBuff2)==0) return 0;
“for” fonksiyonunu kullanarak indBuff[i] değişkenini güncellemek için başka bir döngü oluşturacağız.
for(int i=limit; i>=0 && !IsStopped(); i--) indBuff[i]=(absMomSmBuff2[i]!=0 ? 100.0*momSmBuff2[i]/absMomSmBuff2[i] : 0);
Programın sonunda, return (rates_total) fonksiyonu yer alır.
return(rates_total);
Böylece, özel TSI göstergemizi oluşturmak için kodu tamamladık ve daha fazla özelleştirme elde etmek için kodunuzdaki tercihlerinizi de düzenleyebilirsiniz. Göstergenin tam kodu şu şekildedir:
//+------------------------------------------------------------------+ //| simple TSI.mq5 | //| Copyright 2023, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2023, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" #property indicator_separate_window #property indicator_buffers 8 #property indicator_plots 1 #property indicator_label1 "TSI" #property indicator_type1 DRAW_LINE #property indicator_color1 clrBlue #property indicator_style1 STYLE_SOLID #property indicator_width1 3 #include <MovingAverages.mqh> input uint InpSmPeriod1 = 25; // Smoothing period 1 input uint InpSmPeriod2 = 13; // Smoothing period 2 int smperiod1; int smperiod2; double indBuff[]; double momBuff[]; double momSmBuff1[]; double momSmBuff2[]; double absMomBuff[]; double absMomSmBuff1[]; double absMomSmBuff2[]; int OnInit() { smperiod1=int(InpSmPeriod1<2 ? 2 : InpSmPeriod1); smperiod2=int(InpSmPeriod2<2 ? 2 : InpSmPeriod2); SetIndexBuffer(0,indBuff,INDICATOR_DATA); SetIndexBuffer(2,momBuff,INDICATOR_CALCULATIONS); SetIndexBuffer(3,momSmBuff1,INDICATOR_CALCULATIONS); SetIndexBuffer(4,momSmBuff2,INDICATOR_CALCULATIONS); SetIndexBuffer(5,absMomBuff,INDICATOR_CALCULATIONS); SetIndexBuffer(6,absMomSmBuff1,INDICATOR_CALCULATIONS); SetIndexBuffer(7,absMomSmBuff2,INDICATOR_CALCULATIONS); IndicatorSetString(INDICATOR_SHORTNAME,"True Strength Index ("+(string)smperiod1+","+(string)smperiod2+")"); IndicatorSetInteger(INDICATOR_DIGITS,Digits()); ArraySetAsSeries(indBuff,true); ArraySetAsSeries(momBuff,true); ArraySetAsSeries(momSmBuff1,true); ArraySetAsSeries(momSmBuff2,true); ArraySetAsSeries(absMomBuff,true); ArraySetAsSeries(absMomSmBuff1,true); ArraySetAsSeries(absMomSmBuff2,true); return(INIT_SUCCEEDED); } int OnCalculate(const int rates_total, const int prev_calculated, const datetime &time[], const double &open[], const double &high[], const double &low[], const double &close[], const long &tick_volume[], const long &volume[], const int &spread[]) { ArraySetAsSeries(close,true); if(rates_total<2) return 0; int limit=rates_total-prev_calculated; if(limit>1) { limit=rates_total-2; ArrayInitialize(indBuff,EMPTY_VALUE); ArrayInitialize(momBuff,0); ArrayInitialize(momSmBuff1,0); ArrayInitialize(momSmBuff2,0); ArrayInitialize(absMomBuff,0); ArrayInitialize(absMomSmBuff1,0); ArrayInitialize(absMomSmBuff2,0); } for(int i=limit; i>=0 && !IsStopped(); i--) { momBuff[i]=close[i]-close[i+1]; absMomBuff[i]=MathAbs(momBuff[i]); } if(ExponentialMAOnBuffer(rates_total,prev_calculated,0,smperiod1,momBuff,momSmBuff1)==0) return 0; if(ExponentialMAOnBuffer(rates_total,prev_calculated,0,smperiod1,absMomBuff,absMomSmBuff1)==0) return 0; if(ExponentialMAOnBuffer(rates_total,prev_calculated,smperiod1,smperiod2,momSmBuff1,momSmBuff2)==0) return 0; if(ExponentialMAOnBuffer(rates_total,prev_calculated,smperiod1,smperiod2,absMomSmBuff1,absMomSmBuff2)==0) return 0; for(int i=limit; i>=0 && !IsStopped(); i--) indBuff[i]=(absMomSmBuff2[i]!=0 ? 100.0*momSmBuff2[i]/absMomSmBuff2[i] : 0); return(rates_total); }
Bu kodu hatasız bir şekilde derledikten sonra, göstergeyi Kılavuzun “Göstergeler” menüsü altında mevcut olanlar arasında bulacağız. İstediğiniz grafiğe sürükleyin, devamında gösterge parametreleri penceresi açılacaktır:
Gördüğümüz üzere, kullanıcının tanımlayabileceği iki girdi parametremiz vardır ve varsayılan değerler yumuşatma periyodu 1 için 25 ve yumuşatma periyodu 2 için 13'tür. Ancak yine de, belirttiğimiz gibi, kullanıcı bunları tercihlerine göre düzenleyebilir.
Bu sekmede, kullanıcının TSI çizgisinin rengini, genişliğini ve stilini seçebileceğini görüyoruz. Göstergenin girdilerini ve görünümünü ayarladıktan sonra, şu şekilde görünecektir:
Yukarıdaki grafikte görebileceğimiz gibi, TSI gösterge çizgisi fiyatların altında ayrı bir pencerede yer alır ve sıfır etrafında dalgalanır. Ve gösterge etiketine, yumuşatma periyotlarına ve gösterge değerine sahibiz.
Özel bir TSI Uzman Danışmanı
Bu bölümde, otomatik bir sistemde özel bir göstergenin nasıl çok basit bir şekilde kullanılacağını göreceğiz, böylece belirli bir koşul tetiklendiğinde belirli bir sinyal veya eylem üretebilir. Mevcut TSI değeriyle grafik üzerinde bir yorum oluşturan çok basit bir Uzman Danışman oluşturarak başlayacağız ve ardından daha karmaşık talimatlar gerçekleştiren bir Uzman Danışman geliştireceğiz.
Uzman Danışmanımızı oluşturmak için gereken adımlar aşağıdadır:
- TSI adında bir tamsayı değişken oluşturalım.
- Gösterge tanıtıcısını geri döndürmek için “iCustom” fonksiyonunu kullanarak TSI değişkenini tanımlayalım. Parametreleri şunlardır:
- symbol - Sembol adı. Mevcut sembole uygulanmak üzere (_Symbol) kullanacağız.
- timeframe - Zaman dilimi. Mevcut zaman dilimine uygulanmak üzere (_Period) kullanacağız.
- name - Özel göstergenin yolu.
- OnDeinit(const int reason) içinde Uzman Danışman kaldırıldıktan sonra “TSI System Removed” metnini yazdıralım.
- Bir tsiVal[] dizisi oluşturalım.
- “CopyBuffer” fonksiyonunu kullanarak TSI göstergesi arabellek verilerini, başlangıç konumu ve gerekli eleman sayısına göre çağrı varyantı ile alalım. Parametreleri şunlardır:
- indicator_handle - Gösterge tarafından geri döndürülen gösterge tanıtıcısı. (TSI) kullanacağız.
- buffer_num - Gösterge arabellek numarası. (0) ayarlayacağız.
- start_pos - Kopyalamanın başlayacağı konum. (0) ayarlayacağız.
- count - Kopyalanacak veri miktarı. (1) ayarlayacağız.
- buffer[] - Verilerin kopyalanacağı dizi. (tsiVal) kullanacağız.
- “Comment” fonksiyonunu kullanarak mevcut TSI değerini grafik üzerinde yorum olarak gösterelim. Burada, double türündeki mevcut TSI değerini “DoubleToString” fonksiyonunu kullanarak string formuna dönüştürüyoruz. Fonksiyonun parametreleri: string formuna dönüştürülecek double türündeki değer ve ayarlanacak ondalık basamak sayısı (Biz _Digits kullanacağız).
Bu sistem için tam kod aşağıdaki gibi olacaktır:
//+------------------------------------------------------------------+ //| customSimpleTSI-EA.mq5 | //| Copyright 2023, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2023, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" int TSI; int OnInit() { TSI=iCustom(_Symbol,_Period,"My Files\\TSI\\simpleTSI"); return(INIT_SUCCEEDED); } void OnDeinit(const int reason) { Print("TSI System Removed"); } void OnTick() { double tsiVal[]; CopyBuffer(TSI,0,0,1,tsiVal); Comment("TSI Value ",DoubleToString(tsiVal[0],_Digits)); }
Kodu derleyelim ve çalıştıralım. Gösterge mevcut TSI değerini grafik üzerinde yorum olarak görüntüleyecektir:
Gördüğümüz gibi, grafiğin sol üst köşesinde yorum olarak mevcut TSI değeri vardır. Göstergeye dayalı değerin bizimkiyle aynı olduğundan emin olmak istiyorsak, Uzman Danışmanın yanına göstergeyi de ekleyebiliriz. Her şeyin çalıştığından emin olalım:
Sağ üst köşede görebileceğimiz gibi, grafiğe ekli bir Uzman Danışmanımız var ve sol üst köşede mevcut TSI değerini gösteriyor. Aynı zamanda, TSI göstergesini de grafiğe ekledik ve fiyatların altında ayrı bir pencere olarak görünüyor. Göstergenin sol üst köşesindeki değeri Uzman Danışmanın sinyaliyle eşleşiyor.
TSI System Uzman Danışmanı
Bu bölümde, belirli bir stratejiye dayalı sinyaller üretmek için özel olarak oluşturulmuş bir TSI göstergesine dayalı bir Uzman Danışman geliştireceğiz. Lütfen bahsedeceğimiz stratejinin yalnızca eğitim amaçlı olduğunu unutmayın. Her durumda, tıpkı diğer stratejiler gibi optimizasyonlara ihtiyaç duyacaktır. Bu nedenle, sizin için yararlı olup olmadığını görmek için gerçek bir hesapta kullanmadan önce detaylı bir şekilde test etmelisiniz.
Belirli bir stratejiye dayalı olarak alış ve satış sinyalleri almak için özel TSI göstergesini iki hareketli ortalama ile birlikte kullanacağız:
Özel TSI göstergemize ek olarak, iki basit hareketli ortalama (MA) kullanacağız: biri 10 periyotlu hızlı ve diğeri 20 periyotlu yavaş. Önceki hızlı MA değeri önceki yavaş MA'dan daha küçükse ve aynı zamanda mevcut hızlı MA değeri mevcut yavaş MA'dan daha büyükse, bu bir boğa tipi MA çaprazlamasına sahip olduğumuz anlamına gelir. Ardından mevcut TSI değerinin sıfırdan büyük olup olmadığını kontrol edeceğiz. Eğer öyleyse, grafikte yorum olarak bir alış sinyali göstereceğiz. Tersi durumda, önceki hızlı MA değeri önceki yavaş MA'dan daha büyükse ve aynı zamanda mevcut hızlı MA değeri mevcut yavaş MA'dan daha küçükse, bu da bir ayı tipi MA çaprazlamasına sahip olduğumuz anlamına gelir. Devamında mevcut TSI değerinin sıfırdan küçük olup olmadığını kontrol edeceğiz. Eğer öyleyse, grafikte yorum olarak bir satış sinyali göstereceğiz.
Daha basit ifadeyle,
fastMA[1]>slowMA[1] && fastMA[0]<slowMA[0] && tsiVal[0]<0 ==> Satış sinyali
Programın tam kodu şu şekildedir:
//+------------------------------------------------------------------+ //| TSI System EA.mq5 | //| Copyright 2023, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2023, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" input ENUM_MA_METHOD inpMAType = MODE_SMA; //Moving Average Type input ENUM_APPLIED_PRICE inpPriceType = PRICE_CLOSE; //Price type input int inpFastMAPeriod = 10; // Fast moving average period input int inpSlowMAPeriod = 20; //Slow moving average period int tsi; double fastMAarray[], slowMAarray[]; int OnInit() { tsi=iCustom(_Symbol,_Period,"My Files\\TSI\\simpleTSI"); return(INIT_SUCCEEDED); } void OnDeinit(const int reason) { Print("TSI System Removed"); } void OnTick() { double tsiVal[]; CopyBuffer(tsi,0,0,1,tsiVal); int fastMA =iMA(_Symbol,_Period,inpFastMAPeriod,0,inpMAType,inpPriceType); int slowMA =iMA(_Symbol,_Period,inpSlowMAPeriod,0,inpMAType,inpPriceType); ArraySetAsSeries(fastMAarray,true); ArraySetAsSeries(slowMAarray,true); CopyBuffer(fastMA,0,0,3,fastMAarray); CopyBuffer(slowMA,0,0,3,slowMAarray); if(fastMAarray[1]<slowMAarray[1]&&fastMAarray[0]>slowMAarray[0]) { if(tsiVal[0]>0) { Comment("Buy Signal", "\nTSI Value ",DoubleToString(tsiVal[0],_Digits), "\nfastMA ",DoubleToString(fastMAarray[0],_Digits), "\nslowMA ",DoubleToString(slowMAarray[0],_Digits)); } } if(fastMAarray[1]>slowMAarray[1]&&fastMAarray[0]<slowMAarray[0]&&tsiVal[0]<0) { if(tsiVal[0]<0) { Comment("Sell Signal", "\nTSI Value ",DoubleToString(tsiVal[0],_Digits), "\nfastMA ",DoubleToString(fastMAarray[0],_Digits), "\nslowMA ",DoubleToString(slowMAarray[0],_Digits)); } } }
Bu koddaki farklılıklar şunlardır:
Hareketli ortalama türü, uygulanan fiyat türü, hızlı MA periyodu ve yavaş MA periyodu için dört kullanıcı girdi parametresi oluşturuyoruz ve bunlara varsayılan değerler atıyoruz.
input ENUM_MA_METHOD inpMAType = MODE_SMA; //Moving Average Type input ENUM_APPLIED_PRICE inpPriceType = PRICE_CLOSE; //Price type input int inpFastMAPeriod = 10; // Fast moving average period input int inpSlowMAPeriod = 20; //Slow moving average period
Hızlı MA ve yavaş MA için iki dizi oluşturuyoruz.
double fastMAarray[], slowMAarray[];
Hareketli ortalama tanıtıcısını geri döndürmek için önceden tanımlanmış “iMA” fonksiyonunu kullanarak iki hareketli ortalama tanımlıyoruz. Parametreleri şunlardır:
- symbol - Sembol adı. Mevcut sembol için (_Symbol) kullanacağız.
- period - Zaman dilimi. Mevcut zaman dilimi için (_Period) kullanacağız.
- ma_period - Hareketli ortalama periyodu. Kullanıcı girdilerini kullanacağız.
- ma_shift - Göstergenin kayma miktarı. Gerek olmadığı için (0) kullanacağız.
- ma_method - Hareketli ortalama türü. Kullanıcı girdisini kullanacağız.
- applied_price - Hesaplamada kullanılacak fiyat türü. Kullanıcı girdisini kullanacağız.
int fastMA =iMA(_Symbol,_Period,inpFastMAPeriod,0,inpMAType,inpPriceType); int slowMA =iMA(_Symbol,_Period,inpSlowMAPeriod,0,inpMAType,inpPriceType);
Yavaş ve hızlı MA'lar için “ArraySetAsSeries” fonksiyonunu kullanarak AS_SERIES bayrağını ayarlıyoruz.
ArraySetAsSeries(fastMAarray,true); ArraySetAsSeries(slowMAarray,true);
“CopyBuffer” fonksiyonunu kullanarak iki hareketli ortalamanın arabelleğinden verileri alıyoruz.
CopyBuffer(fastMA,0,0,3,fastMAarray); CopyBuffer(slowMA,0,0,3,slowMAarray);
Stratejinin koşullarını tanımlıyoruz:
Alış sinyali:
Önceki hızlı MA değeri önceki yavaş MA'dan daha küçükse ve mevcut hızlı MA değeri mevcut yavaş MA'dan daha büyükse ve aynı zamanda mevcut TSI değeri sıfırdan büyükse, Uzman Danışmanın aşağıdaki sırayla grafikte yorum olarak bir alış sinyali geri döndürmesine ihtiyacımız vardır:
- Alış sinyali
- Mevcut TSI değeri
- Hızlı MA değeri
- Yavaş MA değeri
if(fastMAarray[1]<slowMAarray[1]&&fastMAarray[0]>slowMAarray[0]) { if(tsiVal[0]>0) { Comment("Buy Signal", "\nTSI Value ",DoubleToString(tsiVal[0],_Digits), "\nfastMA ",DoubleToString(fastMAarray[0],_Digits), "\nslowMA ",DoubleToString(slowMAarray[0],_Digits)); } }
Satış sinyali:
Önceki hızlı MA değeri önceki yavaş MA'dan daha büyükse ve mevcut hızlı MA değeri mevcut yavaş MA'dan daha küçükse ve aynı zamanda mevcut TSI değeri sıfırdan küçükse, Uzman Danışmanın aşağıdaki sırayla grafikte yorum olarak bir satış sinyali geri döndürmesine ihtiyacımız vardır:
- Satış sinyali
- Mevcut TSI değeri
- Hızlı MA değeri
- Yavaş MA değeri
if(fastMAarray[1]>slowMAarray[1]&&fastMAarray[0]<slowMAarray[0]&&tsiVal[0]<0) { if(tsiVal[0]<0) { Comment("Sell Signal", "\nTSI Value ",DoubleToString(tsiVal[0],_Digits), "\nfastMA ",DoubleToString(fastMAarray[0],_Digits), "\nslowMA ",DoubleToString(slowMAarray[0],_Digits)); } }
Bu kodu hatasız bir şekilde derledikten ve grafiğe sürükledikten sonra girdi parametreleri penceresi açılacaktır:
Gördüğümüz gibi, dört girdi parametresine sahibiz: MA türü, fiyat türü, hızlı MA periyodu ve yavaş MA periyodu. Tercihlerimizi ayarladıktan ve Tamama tıkladıktan sonra, Uzman Danışman grafikte başlatılır ve sinyalleri aşağıdaki gibi olacaktır:
Alış sinyali durumunda
Grafikte gördüğümüz üzere, stratejimizin şartlarına göre aşağıda belirtildiği gibi sol üst köşede yorum şeklinde bir alış sinyaline sahibiz:
- Alış sinyali
- Mevcut TSI değeri
- Hızlı MA değeri
- Yavaş MA değeri
Satış sinyali:
Grafikte gördüğümüz üzere, stratejimizin şartlarına göre aşağıda belirtildiği gibi sol üst köşede yorum şeklinde bir satış sinyaline sahibiz:
- Satış sinyali
- Mevcut TSI değeri
- Hızlı MA değeri
- Yavaş MA değeri
Sonuç
Bu makalede, belirli ayarlar ve tercihlerle kendi True Strength Index teknik göstergemizi nasıl oluşturacağımızı öğrendik. Bu göstergenin alım-satımda çok faydalı olabilecek hangi bilgileri sağladığını gördük. Ayrıca, mevcut TSI göstergesi değerini grafikte bir yorum olarak oluşturmak için bu özel göstergeyi basit bir alım-satım sisteminde nasıl kullanabileceğimizi öğrendik. Ek olarak, TSI verisini bizim durumumuzda hareketli ortalama olan başka bir teknik araçla birlikte kullanan bir Uzman Danışman geliştirerek göstergenin otomatik bir alım-satım sisteminde nasıl kullanılacağını gördük. Özel TSI ve iki hareketli ortalamanın bu kombinasyonu, TSI System Uzman Danışmanı bölümünde ayrıntılı olarak ele aldığımız belirli bir stratejiye dayalı olarak alış ve satış sinyalleri üretir.
Umarım bu makale alım-satım ve programlama öğrenme süreciniz için faydalı olur. Göstergelerle ilgili diğer makaleleri okumak ve en popüler teknik göstergelere dayalı alım-satım sistemlerinin nasıl oluşturulacağını öğrenmek istiyorsanız, Moving Average, Bollinger Bands, RSI, MACD, Stochastic Oscillator, Parabolic SAR, ATR vb. popüler göstergelerden bahsettiğim önceki makalelerimi okuyabilirsiniz.
MetaQuotes Ltd tarafından İngilizceden çevrilmiştir.
Orijinal makale: https://www.mql5.com/en/articles/12570
Uyarı: Bu materyallerin tüm hakları MetaQuotes Ltd.'a aittir. Bu materyallerin tamamen veya kısmen kopyalanması veya yeniden yazdırılması yasaktır.
Bu makale sitenin bir kullanıcısı tarafından yazılmıştır ve kendi kişisel görüşlerini yansıtmaktadır. MetaQuotes Ltd, sunulan bilgilerin doğruluğundan veya açıklanan çözümlerin, stratejilerin veya tavsiyelerin kullanımından kaynaklanan herhangi bir sonuçtan sorumlu değildir.





- Ü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
Öncelikle makale için teşekkürler.
Yanılıyorsam lütfen düzeltin, yalnızca 7 gösterge tamponunun oluşturulduğunu görebiliyordum, ancak 8 tane beyan edildi
Yanlış mı hesapladın?
Merhaba, harika bir gazete,
neden alttaki 2 fonksiyonda smperiod 1'i dolduruyorsunuz da 0'ı doldurmuyorsunuz.