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