//+------------------------------------------------------------------+
//| Test_ChartSaveTemplate.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 script_show_inputs
//--- giriş parametreleri
input string symbol="GBPUSD"; // Yeni çizelgenin sembolü
input ENUM_TIMEFRAMES period=PERIOD_H3; // Yeni çizelgenin zaman aralığı
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- Önce göstergeleri çizelgeye ekle
int handle;
//--- Göstergeyi kullanım için hazırla
if(!PrepareZigzag(NULL,0,handle)) return; // Başarısız, o yüzden çık
//--- Göstergeyi mevcut çizelgeye, ayrı pencerede tuttur.
if(!ChartIndicatorAdd(0,1,handle))
{
PrintFormat("Çizelge %s/%s için %d tanıtıcı değere sahip göstergenin eklenmesi başarısız oldu. Hata kodu %d",
_Symbol,
EnumToString(_Period),
handle,
GetLastError());
//--- Program işlemini sonlandır
return;
}
//--- Göstergeyi görmek için çizelgeyi yenile
ChartRedraw();
//--- Zigzagın son iki kırığını bul
double two_values[];
datetime two_times[];
if(!GetLastTwoFractures(two_values,two_times,handle))
{
PrintFormat("Zigzagın son iki kırığı bulunamadı!");
//--- Program işlemini sonlandır
return;
}
//--- Şimdi bir standart sapma kanalı ekle
string channel="StdDeviation Channel";
if(!ObjectCreate(0,channel,OBJ_STDDEVCHANNEL,0,two_times[1],0))
{
PrintFormat("%s nesnesinin oluşturulması başarısız. Hata kodu %d",
EnumToString(OBJ_STDDEVCHANNEL),GetLastError());
return;
}
else
{
//--- Kanal oluşturuldu, ikinci noktayı tanımla
ObjectSetInteger(0,channel,OBJPROP_TIME,1,two_times[0]);
//--- Kanal için bir araç ipucu ayarla
ObjectSetString(0,channel,OBJPROP_TOOLTIP,"Demo from MQL5 Help");
//--- Çizelgeyi yenile
ChartRedraw();
}
//--- Sonucu bir şablona kaydet
ChartSaveTemplate(0,"StdDevChannelOnZigzag");
//--- Yeni bir çizelge aç ve kaydedilen şablonu buna uygula
long new_chart=ChartOpen(symbol,period);
//--- Araç ipuçlarını, grafiksel nesneler için aktif hale getir
ChartSetInteger(new_chart,CHART_SHOW_OBJECT_DESCR,true);
if(new_chart!=0)
{
//--- Kaydedilen şablonu bir çizelgeye uygula
ChartApplyTemplate(new_chart,"StdDevChannelOnZigzag");
}
Sleep(10000);
}
//+----------------------------------------------------------------------+
//| Bir zigzag işleyicisi oluşturur ve verisinin hazır olduğunu temin eder |
//+----------------------------------------------------------------------+
bool PrepareZigzag(string sym,ENUM_TIMEFRAMES tf,int &h)
{
ResetLastError();
//--- Zigzag göstergesi terminal_veri_klasörü\MQL5\Examples konumuna yerleştirilmiş olmalıdır
h=iCustom(sym,tf,"Examples\\Zigzag");
if(h==INVALID_HANDLE)
{
PrintFormat("%s: Zigzag işleyicisinin oluşturulması başarısız oldu. Hata kodu %d",
__FUNCTION__,GetLastError());
return false;
}
//--- Bir gösterge tanıtıcı değeri oluşturulurken, verilerin hesaplanması zaman alacaktır
int k=0; // Gösterge hesabı için bekleme denemelerinin sayısı
//--- Döngü hesabı için bekle, hesaplama hazır değilse 50 milisaniye dur
while(BarsCalculated(h)<=0)
{
k++;
//--- Deneme sayısını göster
PrintFormat("%s: k=%d",__FUNCTION__,k);
//--- Gösterge hesaplanana kadar 50 milisaniye bekle
Sleep(50);
//--- yüzden fazla deneme varsa, o halde bir şeyler yanlış
if(k>100)
{
//--- Bir problemi bildir
PrintFormat("Göstergenin hesaplanması %d denemede başarısız oldu!");
//--- Program işlemini durdur
return false;
}
}
//--- Her şey hazır, gösterge oluşturuldı ve değerler hesaplandı
return true;
}
//+------------------------------------------------------------------+
//| Son iki zigzag kırığını arar ve dizilere yerleştirir |
//+------------------------------------------------------------------+
bool GetLastTwoFractures(double &get_values[],datetime &get_times[],int handle)
{
double values[]; // Zigzag değerleri için bir dizi
datetime times[]; // Zamanı almak için bir dizi
int size=100; // Dizi büyüklüğü
ResetLastError();
//--- Göstergenin son 100 değerini kopyala
int copied=CopyBuffer(handle,0,0,size,values);
//--- Kopyalanan değerlerin sayısını kontrol et
if(copied<100)
{
PrintFormat("%s: %d tanıtıcı değerine sahip göstergenin %d değerinin alınması başarısız. Hata kodu %d",
__FUNCTION__,handle,size,GetLastError());
return false;
}
//--- Diziye erişimi zaman serilerindeki gibi tanımla
ArraySetAsSeries(values,true);
//--- Kırılmaların bulunduğu çubukların numaralarını buraya yaz
int positions[];
//--- Dizi büyüklüğünü ayarla
ArrayResize(get_values,3); ArrayResize(get_times,3); ArrayResize(positions,3);
//--- Sayaçlar
int i=0,k=0;
//--- Kırılmaları aramaya başla
while(i<100)
{
double v=values[i];
//--- Boş değerler ile ilgilenmiyoruz
if(v!=0.0)
{
//--- Çubuk numarasını hatırla
positions[k]=i;
//--- Kırılma anındaki zigzag değerini hatırla
get_values[k]=values[i];
PrintFormat("%s: Zigzag[%d]=%G",__FUNCTION__,i,values[i]);
//--- Sayacı artır
k++;
//--- Eğer iki kırık bulunduysa döngüyü sonlandır
if(k>2) break;
}
i++;
}
//--- Dizilere erişimi zaman serilerindeki gibi tanımla
ArraySetAsSeries(times,true); ArraySetAsSeries(get_times,true);
if(CopyTime(_Symbol,_Period,0,size,times)<=0)
{
PrintFormat("%s: %d değeri CopyTime()'dan kopyalama başarısız. Hata kodu %d",
__FUNCTION__,size,GetLastError());
return false;
}
//--- Son iki kırığın gerçekleştiği çubukların açılış zamanını al
get_times[0]=times[positions[1]];// Ilk kırılma olarak, son değer yazılacak
get_times[1]=times[positions[2]];// Sondan üçüncü değer ikinci kırılma olacak
PrintFormat("%s: first=%s, second=%s",__FUNCTION__,TimeToString(get_times[1]),TimeToString(get_times[0]));
//--- Başarılı
return true;
}
|