iGator

Gator göstergesinin tanıtıcı değerine dönüş yapar. Bu osilatör, Alligator (timsah) göstergesinin mavi ve kırmızı çizgileri arasındaki farkı (üst histogram) ve kırmızı ve yeşil çizgileri arasındaki farkı (alt histogram) gösterir.

int  iGator(
   string              symbol,            // sembol ismi
   ENUM_TIMEFRAMES     period,            // periyot
   int                 jaw_period,        // çenelerin hesabı için periyot değeri
   int                 jaw_shift,         // çeneler için yatay kaydırma değeri
   int                 teeth_period,      // dişlerin hesaplanması için periyot
   int                 teeth_shift,       // dişler için yatay kaydırma değeri
   int                 lips_period,       // dudakların hesaplanması için periyot
   int                 lips_period,       // dudakların hesaplanması için periyot
   ENUM_MA_METHOD      ma_method,         // düzleştirme tipi
   ENUM_APPLIED_PRICE  applied_price      // fiyat veya işleyici tipi
   );

Parametreler

symbol

[in] Menkul değerin sembol ismi, gösterge hesabında kullanılması gereken veri. NULL değeri mevcut sembol anlamına gelir.

period

[in] Periyot değeri, ENUM_TIMEFRAMES değerlerinden biri olabilir, 0 mevcut zaman aralığını belirtir.

jaw_period

[in]  Mavi çizgi için ortalama periyodu (Timsahın çenesi).

jaw_shift

[in] fiyat çizelgesine göre mavi çizginin kaydırma değeri. Bu değer, göstergenin görsel kaydırma değeri ile doğrudan bağlantılı değildir.

teeth_period

[in]   Kırmızı çizgi için ortalama periyodu (Timsahın dişleri).

teeth_shift

[in] fiyat çizelgesine göre kırmızı çizginin kaydırma değeri. Bu değer, göstergenin görsel kaydırma değeri ile doğrudan bağlantılı değildir.

lips_period

[in]  Yeşil çizgi için ortalama periyodu (Timsahın dudakları).

lips_shift

[in] Fiyat çizelgesine göre yeşil çizginin kaydırma değeri. Bu değer, göstergenin görsel kaydırma değeri ile doğrudan bağlantılı değildir.

ma_method

[in]  Düzleştirme tipi. ENUM_MA_METHOD değerlerinden biri olabilir.

applied_price

[in]  Kullanılan fiyat. ENUM_APPLIED_PRICE sayımındaki fiyat sabitlerinden biri veya başka bir göstergenin tanıtıcı değeri olabilir.

Dönüş değeri

Belirtilen teknik göstergenin tanıtıcı değerine dönüş yapar, başarısızlık durumunda ise, INVALID_HANDLE değerine dönüş yapar. Bilgisayar belleği, kullanılmayan göstergelerden temizlenmelidir. Bunun için, göstergenin tanıtıcı değerinin parametre olarak geçirildiği IndicatorRelease() fonksiyonu kullanılır.

Not

Tampon numaraları: 0 - UPPER_HISTOGRAM, 1 - üst histogram için renk tamponu, 2 - LOWER_HISTOGRAM, 3 - alt histogram için renk tamponu.

Örnek:

//+------------------------------------------------------------------+
//|                                                  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("");
  }