//+------------------------------------------------------------------+ //| Demo_iGator.mq5 | //| Copyright 2000-2024, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2000-2024, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" #property description "Gösterge, iVolumes teknik göstergesi için tamponlardan" #property description "nasıl veri alınacağını göstermektedir." #property description "Göstergenin hesaplanmasında kullanılacak sembol ve periyot," #property description "symbol ve period parametreleri ile ayarlanır." #property description "İşleyicinin oluşturulması yöntemi 'type' parametresi ile ayarlanır (fonksiyon tipi)." #property description "diğer tüm parametreler, standart Gator Oscilator'da olduğu gibidir" #property indicator_separate_window #property indicator_buffers 4 #property indicator_plots 2 //--- GatorUp çizimi #property indicator_label1 "GatorUp" #property indicator_type1 DRAW_COLOR_HISTOGRAM #property indicator_color1 clrGreen, clrRed #property indicator_style1 STYLE_SOLID #property indicator_width1 1 //--- GatorDown çizimi #property indicator_label2 "GatorDown" #property indicator_type2 DRAW_COLOR_HISTOGRAM #property indicator_color2 clrGreen, clrRed #property indicator_style2 STYLE_SOLID #property indicator_width2 1 //+------------------------------------------------------------------+ //| İşleyici oluşturma yöntemleri için bir sayım | //+------------------------------------------------------------------+ enum Creation { Call_iGator, // iGator kullan Call_IndicatorCreate // IndicatorCreate kullan }; //--- giriş parametreleri input Creation type=Call_iGator; // fonksiyon tipi input string symbol=" "; // sembol input ENUM_TIMEFRAMES period=PERIOD_CURRENT; // zaman aralığı input int jaw_period=13; // Jaw (çene) çizgisinin periyodu input int jaw_shift=8; // Jaw çizgisinin kaydırma değeri input int teeth_period=8; // Teeth (diş) çizgisinin periyodu input int teeth_shift=5; // Teeth çizgisinin kaydırma değeri input int lips_period=5; // Lips (dudak) çizgisinin periyodu input int lips_shift=3; // Lips çizgisinin kaydırma değeri input ENUM_MA_METHOD MA_method=MODE_SMMA; // Alligator çizgilerinin ortalama yöntemi input ENUM_APPLIED_PRICE applied_price=PRICE_MEDIAN;// Alligator hesaplamasında kullanılan fiyat tipi //--- gösterge tamponları double GatorUpBuffer[]; double GatorUpColors[]; double GatorDownBuffer[]; double GatorDownColors[]; //--- iGator göstergesinin tanıtıcı değerini saklamak için bir değişken int handle; //--- kayıt için değişken string name=symbol; //--- çizelge üzerindeki gösterge ismi string short_name; //--- üst ve alt histogramlar için kaydırma değeri int shift; //--- Gator Oscillator göstergesindeki değerlerin sayısını koruyacağız int bars_calculated=0; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- dizilerin gösterge tamponlarına atanması SetIndexBuffer(0,GatorUpBuffer,INDICATOR_DATA); SetIndexBuffer(1,GatorUpColors,INDICATOR_COLOR_INDEX); SetIndexBuffer(2,GatorDownBuffer,INDICATOR_DATA); SetIndexBuffer(3,GatorDownColors,INDICATOR_COLOR_INDEX); /* Tüm bu kaydırma değerleri, Gator Oscilator göstergesi içinde, Alligator göstergesini temsil eden parametrelerde belirtilirler! Bu yüzden Gator göstergesini değil, Alligator çizgilerini kaydırırlar, sonra buradan elde edilen değerler Gator Oscillator göstergesinin hesaplanmasında kullanılır! */ //--- Şimdi, Jaw çizgisi ile Teeth çizgisi arasındaki farka eşit olan alt histogramın kaydırma değerini hesaplayalım shift=MathMin(jaw_shift,teeth_shift); PlotIndexSetInteger(0,PLOT_SHIFT,shift); //--- iki histogram bulunmasına rağmen, aynı kaydırma değeri kullanılır - bu, iGator göstergesinin uygulama şeklidir PlotIndexSetInteger(1,PLOT_SHIFT,shift); //--- göstergenin çizileceği sembolü ayarla name=symbol; //--- sağa ve sola doğru olan boşlukları sil StringTrimRight(name); StringTrimLeft(name); //--- sonuçta 'name' dizgisi sıfır uzunluğa sahipse if(StringLen(name)==0) { //--- göstergenin tutturulduğu çizelge sembolünü al name=_Symbol; } //--- göstergenin tanıtıcı değerini oluştur if(type==Call_iGator) handle=iGator(name,period,jaw_period,jaw_shift,teeth_period,teeth_shift, lips_period,lips_shift,MA_method,applied_price); else { //--- yapıyı gösterge parametreleriyle doldur MqlParam pars[8]; //--- Alligator çizgilerinin periyodları ve kaydırma değerleri pars[0].type=TYPE_INT; pars[0].integer_value=jaw_period; pars[1].type=TYPE_INT; pars[1].integer_value=jaw_shift; pars[2].type=TYPE_INT; pars[2].integer_value=teeth_period; pars[3].type=TYPE_INT; pars[3].integer_value=teeth_shift; pars[4].type=TYPE_INT; pars[4].integer_value=lips_period; pars[5].type=TYPE_INT; pars[5].integer_value=lips_shift; //--- düzleştirme tipi pars[6].type=TYPE_INT; pars[6].integer_value=MA_method; //--- fiyat tipi pars[7].type=TYPE_INT; pars[7].integer_value=applied_price; //--- işleyiciyi oluştur handle=IndicatorCreate(name,period,IND_GATOR,8,pars); } //--- işleyici oluşturulmadıysa if(handle==INVALID_HANDLE) { //--- hatayı belirt ve hata kodunu al PrintFormat("iGator göstergesinin tanıtıcı değeri, %s/%s sembolü için oluşturulamadı, hata kodu %d", name, EnumToString(period), GetLastError()); //--- gösterge erken durduruldu return(INIT_FAILED); } //--- Gator Oscillator göstergesinin hesaplandığı sembol ve zaman aralığı değerlerini göster short_name=StringFormat("iGator(%s/%s, %d, %d ,%d, %d, %d, %d)",name,EnumToString(period), jaw_period,jaw_shift,teeth_period,teeth_shift,lips_period,lips_shift); IndicatorSetString(INDICATOR_SHORTNAME,short_name); //--- göstergenin normal yolla başlatılması 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[]) { //--- iGator göstergesinden kopyalanan değerlerin sayısı int values_to_copy; //--- göstergede hesaplanan değerlerin sayısını belirle int calculated=BarsCalculated(handle); if(calculated<=0) { PrintFormat("BarsCalculated() %d dönüşü yaptı, hata kodu %d",calculated,GetLastError()); return(0); } //--- bu, gösterge değerlerinin ilk hesaplanması ise veya iGator göstergesinin değerleri değiştiyse //--- veya göstergeyi iki veya daha fazla çubuk için hesaplamak gerekiyorsa (yani fiyat geçmişi değiştiyse) if(prev_calculated==0 || calculated!=bars_calculated || rates_total>prev_calculated+1) { //--- verilen sembol ve periyot için GatorUpBuffer dizisinin büyüklüğü iGator göstergesinin değerlerinden fazlaysa, her şeyi kopyalamayacağız //--- Aksi durumda, gösterge tamponlarının büyüklüklerinden daha az kopyalama yaparız if(calculated>rates_total) values_to_copy=rates_total; else values_to_copy=calculated; } else { //--- Bu, gösterge değerlerinin daha önce hesaplandığı anlamına geliyor OnCalculate() fonksiyonu daha önce çağrılmış) //--- hesaplama için bir çubuktan fazlası eklenmeyecek values_to_copy=(rates_total-prev_calculated)+1; } //--- dizileri Gator Oscillator göstergesinin değerleriyle doldur //--- FillArraysFromBuffer fonksiyonu false dönüşü yaparsa, bilgi henüz kullanılabilir değildir, çık if(!FillArraysFromBuffers(GatorUpBuffer,GatorUpColors,GatorDownBuffer,GatorDownColors, shift,handle,values_to_copy)) return(0); //--- mesajı oluştur string comm=StringFormat("%s ==> göstergedeki gncellenen değer %s: %d", TimeToString(TimeCurrent(),TIME_DATE|TIME_SECONDS), short_name, values_to_copy); //--- servis mesajını çizelgede göster Comment(comm); //--- Gator Oscillator göstergesindeki değerlerin sayısını hatırla bars_calculated=calculated; //--- bir sonraki çağrı için prev_calculated değerine dönüş yap return(rates_total); } //+------------------------------------------------------------------+ //| iGator göstergesi ile, gösterge tamponlarının doldurulması | //+------------------------------------------------------------------+ bool FillArraysFromBuffers(double &ups_buffer[], // üst histogram için gösterge tamponu double &up_color_buffer[], // üst histogramın fiyat indisleri için gösterge tamponu double &downs_buffer[], // alt histogram için gösterge tamponu double &downs_color_buffer[], // alt histogramın fiyat indisleri için gösterge tamponu int u_shift, // alt ve üst histogramlar için kaydırma değeri int ind_handle, // iGator göstergesinin tanıtıcı değeri int amount // kopyalanmış değerlerin sayısı ) { //--- hata kodunu sıfırla ResetLastError(); //--- GatorUpBuffer dizisinin bir kısmını 0 indisli tamponun değerleriyle doldur if(CopyBuffer(ind_handle,0,-u_shift,amount,ups_buffer)<0) { //--- kopyalama başarısız ise hata kodu al PrintFormat("iGator göstergesinin verileri kopyalanamadı, hata kodu %d",GetLastError()); //--- sıfır sonuç ile çık - gösterge hesaplanmamış sayılacak return(false); } //--- GatorUpColors dizisinin bir kısmını 1 indisli tamponun değerleriyle doldur if(CopyBuffer(ind_handle,1,-u_shift,amount,up_color_buffer)<0) { //--- kopyalama başarısız ise hata kodu al PrintFormat("iGator göstergesinin verileri kopyalanamadı, hata kodu %d",GetLastError()); //--- sıfır sonuç ile çık - gösterge hesaplanmamış sayılacak return(false); } //--- GatorDownBuffer dizisinin bir kısmını 2 indisli tamponun değerleriyle doldur if(CopyBuffer(ind_handle,2,-u_shift,amount,downs_buffer)<0) { //--- kopyalama başarısız ise hata kodu al PrintFormat("iGator göstergesinin verileri kopyalanamadı, hata kodu %d",GetLastError()); //--- sıfır sonuç ile çık - gösterge hesaplanmamış sayılacak return(false); } //--- GatorDownColors dizisinin bir kısmını 3 indisli tamponun değerleriyle doldur if(CopyBuffer(ind_handle,3,-u_shift,amount,downs_color_buffer)<0) { //--- kopyalama başarısız ise hata kodu al PrintFormat("iGator göstergesinin verileri kopyalanamadı, hata kodu %d",GetLastError()); //--- sıfır sonuç ile çık - gösterge hesaplanmamış sayılacak return(false); } //--- herşey yolunda return(true); } //+------------------------------------------------------------------+ //| Indicator deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { if(handle!=INVALID_HANDLE) IndicatorRelease(handle); //--- göstergeyi sildikten sonra çizelgeyi temizle Comment(""); } |