English Русский 中文 Español Deutsch 日本語 Português 한국어 Français Italiano
Teknik Göstergeler ve Sayısal Filtreler

Teknik Göstergeler ve Sayısal Filtreler

MetaTrader 5Entegrasyon | 13 Ocak 2022, 16:44
90 0
GT788
[Silindi]

Giriş

Birkaç yıldır, Code Base çok sayıda gösterge biriktirmiştir. Bunlardan birçoğu, yalnızca küçük değişikliklerle birbirinin kopyalarıdır. Göstergelerin grafik üzerinde saatler süren görsel karşılaştırmasının ardından sormadan edemedik: "Karşılaştırmanın daha objektif ve verimli bir yolunu bulmak mümkün mü?" Aslında bu mümkün. Bir göstergenin bir sayısal filtre olduğunu kabul etmeliyiz. Hadi Wikipedia'ya bakalım.

Filtre (kimya), belirli nesneleri ve maddeleri fiziksel olarak bloke ederken diğerlerinin geçmesine olanak sağlayan bir araçtır (genellikle bir membran veya katman).

Göstergelerin bazı "gereksiz" nesneleri bloke etmeye ve kritik olanlara odaklanmaya olanak sağladığı fikrine katılıyor musunuz? Şimdi sayısal filtrenin ne olduğuna bakalım.

Elektronik, bilgisayar bilimi ve matematik alanında bir sayısal filtre, bir sinyalin belirli yönlerini güçlendirmek veya zayıflatmak için bir örneklendirilmiş, ayrık zamanlı sinyal üzerinde matematik işlemleri gerçekleştiren bir sistemdir.

Diğer bir deyişle, bir sayısal filtre, ayrık sinyalleri işleyen bir filtredir. Terminalde gördüğümüz fiyatlar, bunların değerlerinin sürekli olarak değil, belirli bir süre boyunca kaydedilmesinden dolayı ayrık sinyaller olarak ele alınabilir. Örneğin, fiyat değeri H1 grafiğinde saat başı kaydedilirken, M5'te her 5 dakikada bir kaydedilir. Birçok gösterge doğrusal filtreler olarak ele alınabilir. Bu, tam da bu makalede tartışılan gösterge türüdür. 

Şimdi sayısal filtreler ile ilgilendiğimizi öğrendiğimize göre, hangi parametrelerin karşılaştırılacağını belirlemek için teoriyi inceleyelim.


1. Frekanslar ve Periyotlar

İlk olarak, herhangi bir eğrinin sinüs dalgalarının toplamı ile temsil edilebileceğini belirtmeliyim.

Titreşim periyodu, bir öğenin aynı pozisyon aracılığıyla ve aynı yönde iki ardışık geçişi arasındaki zaman aralığıdır. Bu değer frekansın tam tersidir.

Bu tanım, en kolay bir sinüs dalgası kullanılarak anlaşılabilir. 10 sayıma eşit bir periyot düşünelim. Basitlik için çubuklarda hesaplama yapacağız.

Şekil 1 

 Şekil 1. Örnek periyodik sinyal

Gördüğümüz gibi, çizgi tüm döngüyü 10 sayım içinde tamamlarken, on birinci çubuk yeni döngünün ilk noktasıdır.

Sinüs dalgasının frekansı nedir? Tanım, periyodun frekansın tersi olan bir değer olduğunu belirtir. Bu durumda, periyot 10'a (çubuk) eşitse, frekans 1/10=0,1 (1/çubuk) olacaktır.

Fizikte, periyotlar (T) saniye (s) cinsinden ölçülürken frekanslar (f) Hertz (Hz) cinsinden ölçülür. Bir dakikalık zaman aralığı ile uğraşıyorsak, T=60*10=600 saniye, f=1/Т=1/600=0,001667 Hz olur. Herz ve saniye çoğunlukla analog filtrelerde kullanılır. Sayısal olanlarda genellikle sayımlar kullanılır (çubukları kullandığımız şekilde). Gerekirse bunlar gerekli saniye miktarıyla çarpılır.

Bunun sinüs dalgalarıyla ne ilgisi olduğunu merak edebilirsiniz. Sinüs dalgaları, filtrelerin fiziksel anlamını açıklamak ve frekanslara geçmek için sinüs dalgaları gereklidir, çünkü bu kavram uygun çalışmalarda kullanılır. Şimdi, 10'dan 70'e kadar periyotları ve 10 çubukluk bir adımı olan bir yerine 7 sinüs dalgası ele alalım. Şekil 2'nin üst alt penceresindeki çubuklar, sayımların sayısını görsel olarak tahmin etmek için bir kılavuz görevi görür.

Şekil 2 

 Şekil 2. 10, 20, ... 70 çubuk periyotlarıyla aynı genliğe sahip yedi sinüs dalgası.

Ölçek yeterince büyüktür, ama yine de kafanız karışabilir. Ve çok daha fazla sinüs dalgamız olsaydı, kafanızın karışması çok daha kolay olurdu.

Sinüs dalgalarının toplamı aşağıda gösterilmiştir:

Şekil 3  

Şekil 3. Yedi sinüs dalgasının toplamı Şekil 2'de gösterilmiştir.

Frekanslar aşağıdaki şekilde gösterilir:

 Şekil 4 

Şekil 4. Sinüs dalgalarının toplamının spektrumu (frekans cinsinden)

7 sinüs dalgasını görüntülemek için 7 sayım yeterlidir. Renklere dikkat edin, bunlar önceki şekle karşılık gelir. Yavaş sinüs dalgalarını hızlı olanlar takip eder. Mümkün olan en düşük frekans 0'ken (sabit bileşen) en yükseği 0,5'tir (1/çubuk). Periyotlar için durum tam tersi olacaktır.

 Şekil 5

 Şekil 5. Sinüs dalgalarının toplamının spektrumu (periyot cinsinden)

Frekansın 1/periyoda eşit olduğunu hatırlıyoruz. Bu yüzden, periyot, 2 ila sonsuzluk aralığında olmalıdır. Neden 0,5 ve 2? Bir sinüs dalgası, en az iki sayım ile açıklanabilir (bakınız, Nyquist–Shannon örnekleme teoremi). Analog (sürekli) sinyali geri yüklemek için, sinüs dalgası başına iki veya daha fazla sayıma ihtiyacımız var (0,5 1/2'den alınır).

Periyotlar ve frekanslara dair kafa karışıklığını önlemek için aşağıdaki tabloyu inceleyelim:

Periyot
  
 100     50
   16
  10
   4
   2
Sıklık
0
 0,01 
 0,02 
0,0625
  0,1 
 0,25 
  0,5 

 

Temel şeyler olduğu için periyot ve frekans kavramlarını inceledik. Diğer tüm bilgiler bu terimler ile ilişkilidir.

 

2. Sayısal Filtreler

Nihayet filtreleri tartışmaya hazırız. 50'den daha az olan periyoda sahip sinüs dalgalarını kaldırmamız gerektiğini varsayalım.

Şekil 6 

 Şekil 6. Sinüs dalgalarının toplamının yavaş (düşük frekanslı) bileşenleri (50, 60 ve 70 çubukluk periyotlar)

İlk bileşenleri bildiğimizde, her şey nispeten daha kolaydır. Ama ya sadece toplamı biliyorsak? Bu durumda, 1/45'lik (1/çubuk) kesme frekansı olan bir düşük geçirimli filtreye (LPF) ihtiyacımız vardır.

Filtreleme sonucu aşağıdaki şekilde görünecektir:

Şekil 7 

 Şekil 7. LPF kullanılarak sinüs dalgaları toplamının filtrelenmesinin (mavi çizgi) sonucu

Şimdi sadece 10, 20 ve 30 periyotlarına sahip sinüs dalgalarını bırakalım. Bunu yapmak için, 1/35'lik (1/çubuk) kesme frekansı olan bir yüksek geçirimli filtreye (HPF) ihtiyacımız vardır. 

Şekil 8 

 Şekil 8. Sinüs dalgalarının toplamının yüksek frekanslı bileşenleri (10, 20 ve 30 çubukluk periyotlar)

Şekil 9 

Şekil 9. HPF kullanılarak sinüs dalgaları toplamının filtrelenmesinin (mavi çizgi) sonucu

30, 40 ve 50 periyotlarını bırakmak için, 1/25 ve 1/55'lik (1/çubuk) kesme frekansı olan bir bant genişliği filtresine (BF) ihtiyacımız vardır. 

Şekil 10 

 Şekil 10. 30, 40 ve 50 çubukluk periyotlara sahip sinüs çizgileri

 

Şekil 11 

Şekil 11. Sinüs dalgalarının toplamının bant genişliği filtrelemesinin sonucu (30-50 çubuk)

30, 40 ve 50 periyotlarını kaldırmak istiyorsak, aynı kesme frekansları 1/25 ve 1/55 (1/çubuk) olan bir bant durdurma (red) filtresine ihtiyacımız vardır. 

Şekil 12 

Şekil 12. 10, 20, 60 ve 70 çubukluk periyotlara sahip sinüs dalgaları

 

Şekil 13 

Şekil 13. Sinüs dalgalarının toplamına göre reddetme filtresi işleminin sonucu (30-50 çubuk)

Ara sonuçları aşağıdaki resimde özetleyelim: 

Şekil 14
 

Şekil 14. İdeal filtrelerin frekans parametreleri şunlardır: düşük frekanslar (LPF), yüksek frekanslar (HPF), bant genişliği (BF) ve reddetme (RF).

Yukarıda incelenen filtreler idealleştirilmiştir. Gerçek çok daha farklıdır.

 Şekil 15 

Şekil 15. Filtrelerdeki geçiş bandı

Kabul ve zayıflama bantları arasında bir geçiş bandı bulunmaktadır. Bunun eğimi dB/oktav veya dB/dekad cinsinden ölçülür. Oktav, rastgele frekans değeri ile bunun çift değeri arasındaki bir segmenttir. Dekad ise, rastgele frekans değeri ile bunun on katının değeri arasındaki bir segmenttir. Geçiş bandı, biçimsel olarak, kesme frekansı ile zayıflama bandı arasında bulunur. Genel olarak baktığımızda, spektruma göre kesme frekansının çoğunlukla 3 dB seviyesi ile tanımlandığını söylemeliyim.

Dış bant reddi, desibel cinsinden ölçülen zayıflama bandındaki frekansların bastırılmasıdır.

Vuruşlar kabul bandında algılanır. Gerçek filtreler, diğer bir deyişle kabul bandındaki bozulmalar, ile uğraştığımız için büyüklüklerine göre bazı frekanslar daha yüksekken bazıları daha düşüktür. Değer desibel cinsinden ölçülür.

Aşağıdaki tablo, değeri dB cinsine çevirmenize yardımcı olabilir:

dB
Büyüklük oranı
0,5    
1,06
1
1,12
3
1,41
6 2
10
3,16
20 10
30 31,6
40
100
60  1000

 

Örneğin 60 dB için sonuç almak istiyorsak 20 ve 40 dB için değerleri bulup bunları çarpabiliriz.

Artık filtrenin temel parametrelerini bildiğimize göre, makalenin pratik kısmına geçelim.


3. Çekirdek Arama

Sayısal filtrenin tamamen dürtü yanıtı (çekirdek) ile tanımlandığını söyleyebiliriz. Dürtü yanıtı, bir filtrenin tek bir dürtüye verdiği yanıttır. Filtreler, IIR (sonsuz dürtü yanıtı, örneğin Üstel Hareketli Ortalama, EMA) ve FIR (sonlu dürtü yanıtı, örneğin Basit Hareketli Ortalama, SMA) türlerinde olabilir. 

Şimdi, dikkatimizi MetaEditor'a verebiliriz. İlk olarak, tek bir dürtü oluşturalım. Bu, bire eşit yalnızca bir sayım gösterecek çok basit bir gösterge olacak. MetaEditor'da Yeni seçeneğine tıklayın, "Özel Gösterge" seçeneğini seçin ve İleri seçeneğine tıklayın:

Şekil 16
 

Şekil 16. MQL5 Sihirbazında bir özel gösterge oluşturma

Ad olarak "Impulse" belirtin:

Şekil 17
 

Şekil 17. Göstergenin genel özellikleri

Olay işleyiciyi seçin:

Şekil 18
 

Şekil 18. Göstergenin olay işleyicileri

Şimdi ayrı bir pencerede gösterge satırını ve görüntülemesini eklemeliyiz. Her şey hazır!

 Şekil 19

Şekil 19. Göstergenin çizim özellikleri

Göstergenin kodu aşağıdaki şekilde görünür:

//+------------------------------------------------------------------+
//|                                                      Impulse.mq5 |
//|                        Copyright 2012, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2012, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Label1
#property indicator_label1  "Label1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- input parameters

//--- indicator buffers
double         Label1Buffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,Label1Buffer,INDICATOR_DATA);
   ArraySetAsSeries(Label1Buffer,true);
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
              const int prev_calculated,
              const int begin,
              const double &price[])
  {
//---
   ArrayInitialize(Label1Buffer,0.0);
   Label1Buffer[1023]=1.;
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

OnInit() fonksiyonuna aşağıdakini ekleyin:

ArraySetAsSeries(Label1Buffer,true);

böylece indisleme dizinin sonundan itibaren gerçekleştirilir.

OnCalculate() içinde:

ArrayInitialize(Label1Buffer,0.0);
Label1Buffer[1023]=1.;

Tüm değerleri sıfırlayalım ve 1 ila 1023. göstergenin dizi hücresini ekleyelim.

Derleyelim (F7) ve aşağıdaki sonucu elde edelim: 

Şekil 20 

 Şekil 20. Impulse göstergesi

Şimdi, bir gösterge uygularsak, dürtü yanıtını 1024 sayıma kadar görebiliriz (bakınız, Örnekler).

Elbette, filtrenin çekirdeğini görüntülemek harika, ancak daha fazla veri yalnızca frekans bölgesi gösteriminden elde edilebilir. Bunu yapmak için, bir spektrum analiz cihazı oluşturmamız veya çok çaba harcamadan hazır bir çözüm kullanmamız gerekiyor. İkinci seçeneği seçelim ve "Bir Spektrum Analiz Cihazı Oluşturma" makalesinde açıklanan SpecAnalyzer göstergesini kullanalım.

Gösterge aşağıda gösterilmiştir:

Şekil 21 

Şekil 21. SpecAnalyzer

Kullanım öncesinde bazı hazırlık çalışmaları gereklidir. Gerekli tüm adımlar aşağıda açıklanmıştır.


4. Spektrum Analiz Cihazı için Uyarlama

"Harici Veri" düğmesi, SAInpData göstergesinden verilerin kullanılmasına olanak sağlar.

Orijinal, filtrenin çekirdeğini temsil eden diziyi içerir. Dosyayı yeniden oluşturacağız, böylece herhangi bir grafik göstergesini spektrum analiz cihazına aktarmak mümkün olacaktır. Otomatik ve manuel modlar değiştirilmiş göstergede sağlanacaktır. Otomatik modda, bulunacak ilk grafik göstergesi kullanılır. Manuel modda ise, kullanıcılar bir alt pencere ve listeden gösterge indisi ayarlayabilir. Bu durumda Impulse göstergesi grafiğe manuel olarak eklenmelidir. Bunun ardından, çekirdeği almak için gerekli gösterge uygulanır.

Hadi başlayalım. Impulse ile aynı algoritmayı izleyerek yeni bir gösterge oluşturmalıyız. Giriş parametrelerini ekleyin:

input bool Automatic=true; // Autosearch
input int  Window=0;       // Subwindow index
input int  Indicator=0;    // Indicator index

Otomatik=true ise otomatik mod kullanılırken diğer giriş parametreleri yok sayılır. Otomatik=false ise alt pencereli ve gösterge indisli manuel mod kullanılır.

Daha sonra, işleyicileri saklamak için global düzeyde tamsayı türünde değişkenler eklemeliyiz.

int Impulse=0; // single impulse's handle
int Handle=0;  // required indicator's handle
int Kernel=0;  // filter kernel's handle

Impulse gösterge işleyici Impulse içinde saklanacaktır. Çekirdeğine spektrum analiz cihazında bakmak istediğimiz göstergenin işleyicisi Handle içinde saklanacaktır. Impulse göstergesine dayalı olarak oluşturulan hedef göstergenin işleyicisi veya diğer bir deyişle hedef göstergenin çekirdeği Kernel içinde saklanacaktır.

OnInit() fonksiyonu:

int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,DataBuffer,INDICATOR_DATA);

   Impulse=iCustom(NULL,0,"SpecAnalyzer\\Impulse");//get the single impulse handle
   if(Impulse==INVALID_HANDLE)
     {
      Alert("Impulse initialization failed"); 
       return(INIT_FAILED);
     }
//---
   return(0);
  }

Impulse göstergesi program çalışması sırasında değiştirilmediğinden, gösterge işleyicisi OnInit() fonksiyonunda alınmalıdır. Ayrıca, işleyici alma hatası kontrol edilmelidir. Arıza durumunda, "Impulse başlatma başarısız" mesajı görüntülenir ve göstergenin çalışması INIT_FAILED anahtarı tarafından kesilir.

OnDeinit() fonksiyonu:

void OnDeinit(const int reason)
  {
//--- delete the indicators
   IndicatorRelease(Impulse);
   IndicatorRelease(Handle);
   IndicatorRelease(Kernel);
  }

Kullanılan göstergeler OnDeinit() fonksiyonunda silinir.

OnCalculate() fonksiyonu:

static bool Flag=false;        //error flag
if(Flag) return(rates_total); //exit in case of the flag

Flag (bayrak) statik değişkeni fonksiyonun başına eklenir. Program yürütülmesi sırasında hatalar meydana gelirse Flag true değerine eşittir ve OnCalculate() fonksiyonlarının diğer tüm yinelemeleri en baştan kesilir.

Aşağıda, manuel kod ile ilişkili kod bloğu yer almaktadır:

   string Name;  //short name of the required indicator
   if(!Automatic)//in case of the manual mode
     {
      if(ChartIndicatorsTotal(0,Window)>0)//if an indicator is present
        {
         Name=ChartIndicatorName(0,Window,Indicator);//search for its name
         Handle=ChartIndicatorGet(0,Window,Name);//search for the handle
        }
      else//otherwise
        {
         Alert("No indicator");
         Flag=true;
         return(rates_total);
        }

      if(Handle==INVALID_HANDLE)//in case of a handle receiving error
        {
         Alert("No indicator");
         Flag=true;
         return(rates_total);
        }

      CopyBuffer(Handle,0,0,1024,DataBuffer);//display the kernel on the chart
      return(rates_total);
     }

Otomatik=false ise manuel mod başlatılır. Göstergenin varlığı kontrol edilir. Bunun başarılı olması durumunda, bir ad ve bir işleyici aramaya, işleyiciyi hatalar açısından kontrol etmeye, verileri göstergenin tamponuna kopyalamaya başlarız. Bunun başarısız olması durumunda, "Gösterge yok" mesajı görüntülenir, Flag true değerine geçer, OnCalculate() fonksiyonu yürütmesi kesilir.

Otomatik mod bloğu çok daha ilginçtir. Grafikte bir gösterge aramak ve bir çekirdek oluşturmaktan oluşur.

Öyleyse, bir gösterge aramayı değerlendirelim. Ana amaç bir işleyici almaktır.

   if(ChartIndicatorsTotal(0,0)>0)//if the indicator is in the main window
     {
      Name=ChartIndicatorName(0,0,0);//search for its name
      if(Name!="SpecAnalyzer")//if it is not SpecAnalyzer
         Handle=ChartIndicatorGet(0,0,Name);//look for a handle
      else
        {
         Alert("Indicator not found");
         Flag=true;
         return(rates_total);
        }
     }
   else//otherwise
   if(ChartIndicatorsTotal(0,1)>0)//if the indicator is in the first subwindow
     {
      Name=ChartIndicatorName(0,1,0);//search for its name
      if(Name!="SAInpData")//if it is not SAInpData
         Handle=ChartIndicatorGet(0,1,Name);//look for a handle
      else//otherwise
        {
         Alert("Indicator not found");
         Flag=true;
         return(rates_total);
        }
     }

   if(Handle==INVALID_HANDLE)//in case of a handle receiving error
     {
      Alert("No indicator");
      Flag=true;
      return(rates_total);
     }

İlk olarak göstergenin ana penceresinde bir gösterge arıyoruz ve bunun SpecAnalyzer olmadığından emin oluyoruz. Ana pencerede hiçbir gösterge bulunmamışsa, bunu sonraki alt pencerede (buradaSAInpData olabileceğini düşünerek) arıyoruz. Diğer tüm eylemler manuel moda benzerdir.

Hadi bir gösterge oluşturalım. Elde edilen göstergenin parametrelerini almalı ve Impulse temelli benzer bir gösterge oluşturmalıyız:

   ENUM_INDICATOR indicator_type;//obtained indicator's type
   MqlParam parameters[];      //parameters
   int parameters_cnt=0;      //number of parameters

//--- receive the indicator's type, parameter values and amount
   parameters_cnt=IndicatorParameters(Handle,indicator_type,parameters);
//--- define that a single impulse is to be sent to the indicator's input
   parameters[parameters_cnt-1].integer_value=Impulse;
//--- receive the indicator's handle from the single impulse - filter's kernel
   Kernel=IndicatorCreate(NULL,0,indicator_type,parameters_cnt,parameters);

   if(Kernel==INVALID_HANDLE)//in case of a handle receiving error
     {
      Alert("Kernel initialization failed");
      Flag=true;
      return(rates_total);
     }

   CopyBuffer(Kernel,0,0,1024,DataBuffer);//display the kernel on the chart

indicator_type - özel numaralandırılmış ENUM_INDICATOR türünde değişken. Değişken gösterge türünü almak için tasarlanmamıştır.

parameters[] - MqlParam türünde dizi, gösterge parametrelerini saklamaya ve aktarmaya yönelik özel yapı.

IndicatorParameters fonksiyonu grafik göstergesindeki verilerin alınmasına olanak sağlar. Daha sonra, parametre dizisinde ufak değişiklikler yapıyoruz. Impulse göstergesi işleyicisi, integer_value alanında zaman serisi adının (kapalı, düşük, işleyici vb.) saklandığı son hücreye dahil edilir. Ardından, aynı zamanda bir çekirdek olan yeni bir gösterge oluşturmak için IndicatorCreate fonksiyonunu kullanıyoruz. Şimdi işleyiciyi kontrol etmeli ve çekirdeği grafik üzerinde görüntülemeliyiz.

SpecAnalyzer göstergesi de biraz değiştirilmiştir. aşağıdaki giriş parametreleri eklenmiştir:

input bool Automatic=true; //Autosearch
input int Window=0;        //Subwindow index
input int Indicator=0;    //Indicator index

SAInpData çağrısı da değiştirilmiştir:

ExtHandle=iCustom(NULL,0,"SpecAnalyzer\\SAInpData",Automatoc,Window,Indicator);

SAInpData, dürtü yanıtını görüntülemek için tek başına kullanılabilir.

 

5. Örnekler

Bunların çalışması için, SpecAnalyzer klasörünü MetaTrader 5\MQL5\Indicators'a kopyalayın. MetaTrader 5'i başlatın, yeni bir EURUSD grafiği açın:

Şekil 22

Şekil 22. Yeni bir EURUSD grafiği açma

Şimdi gerekli göstergeyi, örneğin MA(16), uyguluyoruz:

Şekil 23

Şekil 23. EURUSD grafiğine Hareketli Ortalamayı Uygulama

SpecAnalyzer'ı başlatın:

Şekil 24

Şekil 24. SpecAnalyzer'ı Başlatma

Parametreler penceresi görünür:

Şekil 25

Şekil 25. SpecAnalyzer gösterge parametreleri

Otomatik mod için sadece Tamam seçeneğine tıklayın. Manuel modda, true false ile değiştirilmelidir ve gerekli göstergenin konumu belirtilmelidir.

Bu yüzden Tamam seçeneğine tıkladık. Yeni görüntülenen Spektrum Analiz Cihazı penceresinde "Harici Veriler" seçeneğine tıklayın:

Şekil 26

Şekil 26. SpecAnalyzer göstergesi için giriş verileri seçme

Şimdi manuel modda çalışmayı ele alalım. İlk olarak grafiğe Impulse göstergesi eklemeliyiz:

Şekil 27

Şekil 27. Impulse göstergesi ekleme

Ardından hedef göstergeyi oluşturmak için bu göstergeyi kullanmalıyız. Bunu yapmak için, göstergeyi fare ile Impulse penceresine sürüklemeli ve parametrelerin "Buna Uygulama" alanında önceki gösterge verilerini seçmeliyiz:

Şekil 28

Şekil 28. Impulse gösterge verilerini kullanarak Hareketli Ortalama göstergesi oluşturma

Aşağıdaki sonuç elde edilmelidir:

Şekil 29 

Şekil 29. Tek bir Impulse üzerinde Hareketli Ortalama göstergesinin sonucu

Şimdi, göstergeler listesini görüntülemek için sağ tıklayın:

Şekil 30

Şekil 30. Listedeki göstergeler

Göstergemiz alt pencere 1'de yer alır ve seri numarası 1'dir (indislemenin birden değil sıfırdan başladığını unutmayın). Şimdi SpecAnalyzer'ı başlatalım. false değerini 1 olarak ayarlayın, 1. "Harici Veriler" seçeneğine tıklayın.

Gösterge özellikleri anında değiştirilebilir. Gösterge listesini kullanarak periyodu değiştirmeyi deneyin ve Spektrum Analiz Cihazının nasıl tepki verdiğine bakın. 

Örneklere geçmeden önce SpecAnalyzer göstergesinin bir özelliğinden bahsetmek gerekiyor. Ölçeğindeki okumalar periyotlar değil, frekans ızgara işaretleridir. Spektrum analiz cihazı, 1024'e kadar okuma uzunluğuna sahip çekirdek ile çalışır. Bu, ızgara frekansının derecesinin 1/1024=0,0009765625'e eşit olduğu anlamına gelir. Dolayısıyla, ölçekteki 128 değeri 0,125 frekansına veya 8 periyoduna karşılık gelir.

Ölçek
Periyot
16   64
32   32
64   16
128
8
256
4
384
2,67
512
2

SMA (16)

 Şekil 31

Şekil 31. Basit Hareketli ortalama göstergesinin dürtü yanıtı (FIR filtre)

Şekil 32 

Şekil 32. Basit Hareketli ortalama göstergesinin frekans yanıtı

Düşük frekansların ağırlıklı olmasından dolayı bunun bir düşük geçirimli filtre olduğunu görebiliriz. Zayıflama bandındaki bastırma zayıftır.

  

EMA (16)

Şekil 33

Şekil 33. Üstel Hareketli Ortalama göstergesinin dürtü yanıtı(IIR filtre)

Şekil 34 

Şekil 34. Üstel Hareketli ortalama göstergesinin frekans yanıtı

Üstel Hareketli ortalama göstergesi de bir düşük geçirimli filtredir. Çizgi oldukça düzgündür, ancak önceki göstergenin aksine geçiş bandı daha geniştir. Bastırma yaklaşık olarak aynıdır.

Şimdi Evrensel sayısal filtre sonuçlarını inceleyelim.

Düşük geçirimli filtre

Şekil 35

Şekil 35. Düşük geçirimli filtrenin dürtü yanıtı (çekirdek)

Şekil 36

Şekil 36. Düşük geçirimli filtrenin frekans yanıtı

Yüksek geçirimli filtre

 Şekil 37 

Şekil 37. Yüksek geçirimli filtrenin dürtü yanıtı (çekirdek)

 

 Şekil 38 

Şekil 38. Yüksek geçirimli filtrenin frekans yanıtı

 

Bant geçirimli filtre

 Şekil 39 

Şekil 39. Bant geçirimli filtrenin dürtü yanıtı (çekirdek)

 

Şekil 40 

  Şekil 40. Bant geçirimli filtrenin frekans yanıtı


Sonuç

Sonuç olarak, filtre parametrelerinin güçlü bir şekilde birbirine bağlı olduğuna dikkat edilmelidir. Bunlardan bazılarının iyileştirilmesi, diğerlerinin bozulması anlamına gelebilir. Bu nedenle, parametreler elimizdeki işe göre seçilmelidir.

Örneğin, zayıflama bandındaki frekansların daha fazla bastırılmasını istiyorsanız, aşağı doğru eğrinin keskinliğinden feda etmeniz gerekir. Her iki parametrenin de iyi olması gerekiyorsa, bu durumda çekirdeğin uzunluğunu artırmamız gerekir, bu ise gösterge ile fiyat arasındaki boşluğu etkileyecek veya kabul bandındaki bozulmaları artıracaktır.


MetaQuotes Ltd tarafından Rusçadan çevrilmiştir.
Orijinal makale: https://www.mql5.com/ru/articles/736

Ekli dosyalar |
specanalyzer.zip (9.68 KB)
MQL5 Standart Kitaplığını Genişletme ve Kodu Yeniden Kullanma MQL5 Standart Kitaplığını Genişletme ve Kodu Yeniden Kullanma
MQL5 Standart Kitaplığı, bir geliştirici olarak hayatınızı kolaylaştırır. Ancak, dünyadaki bütün geliştiricilerin ihtiyaçlarını karşılamaz, bu yüzden daha özel bir şeye ihtiyacınız olduğunu düşünüyorsanız, bir adım daha ileri gidebilir ve bunu genişletebilirsiniz. Bu makale, size MetaQuotes'un Zig-Zag teknik göstergesini Standart Kitaplığa entegre etme konusunu anlatır. Amacımıza ulaşmak için MetaQuotes'un tasarım felsefesinden ilham aldık.
Doğrusal Alım Satım Sistemlerinizi Güçlendirin Doğrusal Alım Satım Sistemlerinizi Güçlendirin
Bugünün makalesi, orta düzeyde MQL5 programcılarının, üstünü alma tekniğinin kolayca uygulanması ile doğrusal alım satım sistemlerinden nasıl daha fazla kâr elde edebileceğini gösterir. Bunun nedeni, elde edilen öz varlık eğrisi büyümesinin geometrik veya üstel olması ve bir parabol şeklini almasıdır. Özellikle, Ralph Vince tarafından geliştirilen Sabit Kesirli pozisyon boyutlandırmasının pratik bir MQL5 varyantını uygulayacağız.
MQL5 Tarif Defteri Uzman Danışmanın Belirlenen Kriterlere Göre Optimizasyon Sonuçlarını Kaydetme MQL5 Tarif Defteri Uzman Danışmanın Belirlenen Kriterlere Göre Optimizasyon Sonuçlarını Kaydetme
MQL5 programlamasına dair makaleler serisine devam ediyoruz. Bu sefer, Uzman Danışman parametre optimizasyonu sırasında her bir optimizasyon doğru geçişinin sonucunun nasıl elde edileceğini göreceğiz. Uygulama, harici parametrelerde belirtilen koşulların sağlanması durumunda ilgili geçiş değerlerinin bir dosyaya yazılmasını sağlayacak şekilde yapılacaktır. Test değerlerine ek olarak, bu sonuçlara neden olan parametreleri de kaydedeceğiz.
Kullanılabilir Teknolojiler Kokteyli ile MQL5 Müşterilerinizi Büyüleyin! Kullanılabilir Teknolojiler Kokteyli ile MQL5 Müşterilerinizi Büyüleyin!
MQL5, programcılara MetaTrader ortamında istedikleri her şeyi yapabilecekleri eksiksiz bir fonksiyonlar ve nesne yönelimli API seti sağlar. Bununla birlikte, Web Teknolojisi günümüzde çok özel bir şey yapmanız gerektiğinde, müşterilerinizi farklı bir şeyle hayrete düşürmek istediğinizde veya basitçe MT5 Standart Kitaplığının belirli bir bölümünde ustalaşmak için yeterli zamanınız olmadığında imdadınıza yetişecek son derece çok yönlü bir araçtır. Bugünkü alıştırma, inanılmaz bir teknoloji kokteyli oluştururken aynı anda geliştirme zamanınızı nasıl yönetebileceğinize dair pratik bir örnek ile size yol gösterir.