Forex Dərsləri 10 : İlk İndiqatorumuz 2-ci Hissə
Keçən dərsdə yazdığımız kodlarda bəzi dəyişikilik edərək aşağıdakı şəkildə yenidən yazmağa çalışın.
Kod
İndisə yuxarıda yazılmış kodlara aydınlıq gətirək
Hər bir MQL4 proqramı #property adlı xüsusi parametrləri müəyyən etməyə imkan verir. Bu parametrlər terminalın açıq şəkildə işləməsinə ehtiyac duymayan proqramlara kömək edir. Bu əsasən göstəricilərin ( indiqatorların ) xarici parametrləri ilə bağlıdır.
#property indicator_separate_window - indiqatorların platformanın əsas pəncərəsində deyil alt pəncərəsində göstərilməsi üçündür.. Əgər indiqator əsas pəncərədə göstəriləcəksə o zaman #property indicator_main_window özəlliyindən istifadə edilir.
#property indicator_buffers 1 - bu özəllik yaddaş sahəsində ayrılacaq massivlərin sayını müəyən edir. Burada gördüyünüz kimi biz yaddaşdan 1 massiv ayrılmasını istəmişik. Bunun mənası odur ki biz cəmi bir xətt çəkəcəyik. Misal üçün Alligator indiqatorundan istifadə edərkən qrafikdə 3 xətdin ( Göy, Yaşıl və Qırmızı ) çəkildiyini görmüsünüz. Bu üç xətdi göstərmək üçün #property indicator_buffers 3 olaraq göstərilməlidir.
#property indicator_color1 clrRed - Bu özəllik indiqatorun rəngini göstərmək üçündür. Yəni yazdığımız indiqatorun ( buradakı xəttin ) rəngi Red yəni qırmızı olacaqdır.
double ExtMapBuffer1[] - Burada double tipində sonsuz sayda qiymətlər alacaq ExtMapBuffer adında bir massiv ( Array ) yaradırıq. Massiv yaradarkən Kvadrat mötərizələrdən istifadə edirik. Əgər mötərizələrin arasında bir ədəd olsaydı massiv o qədər sayda qiymət alacaqdı.
Onİnit() funksiyası daxildə yazılmış kodlar.
SetİndexStyle() funksiyası indiqator stili ilə əlaqədardır. Yəni indiqatorun növü , sitilini , rəngini və qalınlığını müəyyən edir.
SetİndexBuffer() - funksiyası massivlərin aldığı qiymətləri təyin edir.
İndicatorShortName () funksiyası adından da başa düşüldüyü kimi məlumat pəncərəsində indqatorun qısaldılmış adını yazmağa kömək edir.
OnCalculate() funksiyası daxilində yazılmış kodlar.
int limit = rates_total-prev_calculated . Burada tam ədəd tipində ( integer ) limit adlı bir dəyişən yaradırıq. Koddakı rates_totalı qrafikdəki müəyyən timeframe- də olan şamların sayının cəmi kimi başa düşə bilərsiniz. prev_calculated isə başlanğıcda sıfır olaraq dəyər alır və daha sonra rates_total-dan bir çıxılaraq hesablanır. Yəni cari şam nəzərə alınmır. Bu dəyişənlər OnCalculate funksiyasında müəyyənləşmiş dəyişən parametriləridir. Bunlardan istifadəsi etməklə işimizi yüngülləşdirmiş oluruq.
Şərt və dövr operatorlarını əvvəlki dərslərimizdə öyrənmişdik. Əgər xatırlamırsınızsa yenidən əvvəlki dərsləri təkrar gözdən keçirin.
Burada biz limit dəyişəninin sıfırdan böyük və ya kiçik olduğu şərtləri kontrol edir. Əgər limit sıfırdan kiçik olarsa heç bir hesablama yerinə yetirlmir və proqram icra edilmir.
Əgər limit sıfırdan böyük olarsa limiti hər səfərində ( qrafikdəki qiymət dəyişdikdə. Yuxarı və ya aşağı fərq etməz ) bir vahid azaldırıq ( limit -- ).
Və sonra double tipində üç dəyişən ( PriceHigh,PriceLow,PriceResult ) yaradırıq. Comment() Funksiyasınıda bilirsiniz ( Ekrana yazı yazdırmaq üçündür ).
Burada while dövr operatorunda əgər limit dəyişənin qiyməti sıfıra bərabərdirsə və ya sıfırdan böyük olarsa şərtini yazıb kod bloku daxilində olan əməliyyatların yerinə yetirilməsi istəyirik.
Burada olan High massivi qrafikdəki şamın ən yüksək yqiymətini bizə verir. Yəni High [0] yazırıqsa bizə hal-hazırda olan şamın ən yüksək qiymətini göstərir. High[1] olarsa bir öncəki ən yüksək qiyməti göstərir və s. bu şəkildə artaraq gedir.
Low isə şamın ən aşağı olan qiymətini əks etdirir.
PriceHigh dəyişninə müəyyən edilmiş şamın ( burada onu limit dəyişəni müəyyən edir ) ən yüksək qiymətini mənimsədirik. PriceLow dəyişəninə isə əksinə şamın ən aşağı qiymətini veririk.
Bu iki dəyişən arasındakı fərqi isə PriceResult dəyişəninə mənimsədirik və onu ExpMapBuffer massivinə bağlayırıq ( buda öz növbəsində bizə xətt vastəsilə qiyməti bizə əks etdirir ).
Bu indiqatorun gördüyü iş şamların ən yüksək qiyməti ilə ən kiçik qiyməti arasındakı fərqi bizə göstərir və bir xətt ilə qrafikdə çəkilir. Bu qədər sadə. İndisə yazdığınız kodları Compile edib platformada həmin indiqatorun adını tapıb qrafikə atın və nəticəsinə baxın. Bu şəkildə bir göstərici olmalıdır.
Sualınız olarsa Facebookda FOREX TƏHSİLİ qrupuna yaza bilərsiniz.
Uğurlar...
Kod
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//+------------------------------------------------------------------+ | |
//| Simple_Indicator.mq4 | | |
//| AFSHAR | | |
//| www.algotradingfx.blogspot.com | | |
//+------------------------------------------------------------------+ | |
#property copyright "AFSHAR" | |
#property link "www.algotradingfx.blogspot.com" | |
#property version "1.00" | |
#property strict | |
#property indicator_separate_window | |
#property indicator_buffers 1 | |
#property indicator_color1 clrRed | |
double ExtMapBuffer1[]; | |
//+------------------------------------------------------------------+ | |
//| Custom indicator initialization function | | |
//+------------------------------------------------------------------+ | |
int OnInit() | |
{ | |
//--- indicator buffers mapping | |
SetIndexStyle(0,DRAW_LINE); | |
SetIndexBuffer(0,ExtMapBuffer1); | |
string short_name="Your first indicator is running"; | |
IndicatorShortName(short_name); | |
//--- | |
return(INIT_SUCCEEDED); | |
} | |
//+------------------------------------------------------------------+ | |
//| Custom indicator iteration function | | |
//+------------------------------------------------------------------+ | |
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[]) | |
{ | |
//--- | |
int limit=rates_total-prev_calculated; | |
//--- check limit < 0 | |
if(limit<0) | |
{ | |
return(INIT_FAILED); | |
} | |
//--- limit limit > 0 | |
if(limit>0) | |
{ | |
limit --; | |
} | |
double PriceHigh,PriceLow,PriceResult; | |
Comment("Hi! I'm here"); | |
//--- main calculation loop | |
while(limit>=0) | |
{ | |
PriceHigh = High[limit]; | |
PriceLow = Low[limit]; | |
PriceResult=PriceHigh-PriceLow; | |
ExtMapBuffer1[limit]=PriceResult; | |
limit--; | |
} | |
//--- return value of prev_calculated for next call | |
return(rates_total); | |
} | |
//+------------------------------------------------------------------+ |
Hər bir MQL4 proqramı #property adlı xüsusi parametrləri müəyyən etməyə imkan verir. Bu parametrlər terminalın açıq şəkildə işləməsinə ehtiyac duymayan proqramlara kömək edir. Bu əsasən göstəricilərin ( indiqatorların ) xarici parametrləri ilə bağlıdır.
#property indicator_separate_window - indiqatorların platformanın əsas pəncərəsində deyil alt pəncərəsində göstərilməsi üçündür.. Əgər indiqator əsas pəncərədə göstəriləcəksə o zaman #property indicator_main_window özəlliyindən istifadə edilir.
#property indicator_buffers 1 - bu özəllik yaddaş sahəsində ayrılacaq massivlərin sayını müəyən edir. Burada gördüyünüz kimi biz yaddaşdan 1 massiv ayrılmasını istəmişik. Bunun mənası odur ki biz cəmi bir xətt çəkəcəyik. Misal üçün Alligator indiqatorundan istifadə edərkən qrafikdə 3 xətdin ( Göy, Yaşıl və Qırmızı ) çəkildiyini görmüsünüz. Bu üç xətdi göstərmək üçün #property indicator_buffers 3 olaraq göstərilməlidir.
#property indicator_color1 clrRed - Bu özəllik indiqatorun rəngini göstərmək üçündür. Yəni yazdığımız indiqatorun ( buradakı xəttin ) rəngi Red yəni qırmızı olacaqdır.
double ExtMapBuffer1[] - Burada double tipində sonsuz sayda qiymətlər alacaq ExtMapBuffer adında bir massiv ( Array ) yaradırıq. Massiv yaradarkən Kvadrat mötərizələrdən istifadə edirik. Əgər mötərizələrin arasında bir ədəd olsaydı massiv o qədər sayda qiymət alacaqdı.
Onİnit() funksiyası daxildə yazılmış kodlar.
SetİndexStyle() funksiyası indiqator stili ilə əlaqədardır. Yəni indiqatorun növü , sitilini , rəngini və qalınlığını müəyyən edir.
SetİndexBuffer() - funksiyası massivlərin aldığı qiymətləri təyin edir.
İndicatorShortName () funksiyası adından da başa düşüldüyü kimi məlumat pəncərəsində indqatorun qısaldılmış adını yazmağa kömək edir.
OnCalculate() funksiyası daxilində yazılmış kodlar.
int limit = rates_total-prev_calculated . Burada tam ədəd tipində ( integer ) limit adlı bir dəyişən yaradırıq. Koddakı rates_totalı qrafikdəki müəyyən timeframe- də olan şamların sayının cəmi kimi başa düşə bilərsiniz. prev_calculated isə başlanğıcda sıfır olaraq dəyər alır və daha sonra rates_total-dan bir çıxılaraq hesablanır. Yəni cari şam nəzərə alınmır. Bu dəyişənlər OnCalculate funksiyasında müəyyənləşmiş dəyişən parametriləridir. Bunlardan istifadəsi etməklə işimizi yüngülləşdirmiş oluruq.
Şərt və dövr operatorlarını əvvəlki dərslərimizdə öyrənmişdik. Əgər xatırlamırsınızsa yenidən əvvəlki dərsləri təkrar gözdən keçirin.
Burada biz limit dəyişəninin sıfırdan böyük və ya kiçik olduğu şərtləri kontrol edir. Əgər limit sıfırdan kiçik olarsa heç bir hesablama yerinə yetirlmir və proqram icra edilmir.
Əgər limit sıfırdan böyük olarsa limiti hər səfərində ( qrafikdəki qiymət dəyişdikdə. Yuxarı və ya aşağı fərq etməz ) bir vahid azaldırıq ( limit -- ).
Və sonra double tipində üç dəyişən ( PriceHigh,PriceLow,PriceResult ) yaradırıq. Comment() Funksiyasınıda bilirsiniz ( Ekrana yazı yazdırmaq üçündür ).
Burada while dövr operatorunda əgər limit dəyişənin qiyməti sıfıra bərabərdirsə və ya sıfırdan böyük olarsa şərtini yazıb kod bloku daxilində olan əməliyyatların yerinə yetirilməsi istəyirik.
Burada olan High massivi qrafikdəki şamın ən yüksək yqiymətini bizə verir. Yəni High [0] yazırıqsa bizə hal-hazırda olan şamın ən yüksək qiymətini göstərir. High[1] olarsa bir öncəki ən yüksək qiyməti göstərir və s. bu şəkildə artaraq gedir.
Low isə şamın ən aşağı olan qiymətini əks etdirir.
PriceHigh dəyişninə müəyyən edilmiş şamın ( burada onu limit dəyişəni müəyyən edir ) ən yüksək qiymətini mənimsədirik. PriceLow dəyişəninə isə əksinə şamın ən aşağı qiymətini veririk.
Bu iki dəyişən arasındakı fərqi isə PriceResult dəyişəninə mənimsədirik və onu ExpMapBuffer massivinə bağlayırıq ( buda öz növbəsində bizə xətt vastəsilə qiyməti bizə əks etdirir ).
Bu indiqatorun gördüyü iş şamların ən yüksək qiyməti ilə ən kiçik qiyməti arasındakı fərqi bizə göstərir və bir xətt ilə qrafikdə çəkilir. Bu qədər sadə. İndisə yazdığınız kodları Compile edib platformada həmin indiqatorun adını tapıb qrafikə atın və nəticəsinə baxın. Bu şəkildə bir göstərici olmalıdır.
Sualınız olarsa Facebookda FOREX TƏHSİLİ qrupuna yaza bilərsiniz.
Uğurlar...
Yorumlar
Yorum Gönder