
Teknik Göstergeler ve Sayısal Filtreler
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. Ö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. 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. Yedi sinüs dalgasının toplamı Şekil 2'de gösterilmiştir.
Frekanslar aşağıdaki şekilde gösterilir:
Ş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. 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. 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. 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. Sinüs dalgalarının toplamının yüksek frekanslı bileşenleri (10, 20 ve 30 çubukluk periyotlar)
Ş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. 30, 40 ve 50 çubukluk periyotlara sahip sinüs çizgileri
Ş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. 10, 20, 60 ve 70 çubukluk periyotlara sahip sinüs dalgaları
Ş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. İ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. 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. MQL5 Sihirbazında bir özel gösterge oluşturma
Ad olarak "Impulse" belirtin:
Şekil 17. Göstergenin genel özellikleri
Olay işleyiciyi seçin:
Ş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. 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. 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. 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. Yeni bir EURUSD grafiği açma
Şimdi gerekli göstergeyi, örneğin MA(16), uyguluyoruz:
Şekil 23. EURUSD grafiğine Hareketli Ortalamayı Uygulama
SpecAnalyzer'ı başlatın:
Şekil 24. SpecAnalyzer'ı Başlatma
Parametreler penceresi görünür:
Ş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. 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. 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. Impulse gösterge verilerini kullanarak Hareketli Ortalama göstergesi oluşturma
Aşağıdaki sonuç elde edilmelidir:
Ş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. 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. Basit Hareketli ortalama göstergesinin dürtü yanıtı (FIR filtre)
Ş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. Üstel Hareketli Ortalama göstergesinin dürtü yanıtı(IIR filtre)
Ş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. Düşük geçirimli filtrenin dürtü yanıtı (çekirdek)
Şekil 36. Düşük geçirimli filtrenin frekans yanıtı
Yüksek geçirimli filtre
Şekil 37. Yüksek geçirimli filtrenin dürtü yanıtı (çekirdek)
Şekil 38. Yüksek geçirimli filtrenin frekans yanıtı
Bant geçirimli filtre
Şekil 39. Bant geçirimli filtrenin dürtü yanıtı (çekirdek)
Ş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





- Ü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