OBJ_STDDEVCHANNEL

Standart Sapma Kanalı.

ObjStdDevChannel

Not

Standart Sapma Kanalının, sağa ve/veya sola doğru olan sürekliliklerinin (sırasıyla OBJPROP_RAY_RIGHT ve OBJPROP_RAY_LEFT özelliklerinin) belirtilmesi mümkündür. Ayrıca, kanalın renk ile doldurulması modu da ayarlanabilir durumdadır.

OBJPROP_DEVIATION özelliği, kanalın sapma değerini değiştirmek için kullanılır.

Örnek

Aşağıdaki script, Standart Sapma Kanalını çizelge üzerinde oluşturur ve taşır. Grafiksel nesne özelliklerini oluşturmak ve değiştirmek için özel fonksiyonlar geliştirilmiştir. Bu fonksiyonları kendi uygulamalarınızda da "aynı şekilde" kullanabilirsiniz.

 

//--- açıklama
#property description "Script, \"Standart Sapma Kanalı\" grafiksel nesnesini oluşturur."
#property description "Tutturma noktası koordinatları, çizelge penceresi"
#property description "boyutunun yüzdesi şeklinde ayarlanır."
//--- betiğin çalıştırılması sırasında giriş parametreleri penceresini göster
#property script_show_inputs
//--- betiğin giriş parametreleri
input string          InpName="StdDevChannel";   // Kanal ismi
input int             InpDate1=10;               // 1-inci noktanın tarihi, %
input int             InpDate2=40;               // 2-inci noktanın tarihi, %
input double          InpDeviation=1.0;          // Sapma
input color           InpColor=clrRed;           // Kanal rengi
input ENUM_LINE_STYLE InpStyle=STYLE_DASHDOTDOT// Kanal çizgilerinin stili
input int             InpWidth=2;                // Kanal çizgilerinin genişliği
input bool            InpFill=false;             // Kanalın renk ile doldurulması
input bool            InpBack=false;             // Arkaplan kanalı
input bool            InpSelection=true;         // Taşımak için vurgula
input bool            InpRayLeft=false;          // Kanalın sola sürekliliği
input bool            InpRayRight=false;         // Kanalın sağa sürekliliği
input bool            InpHidden=true;            // Nesne listesinde gizle
input long            InpZOrder=0;               // Fare tıklaması için öncelik
//+------------------------------------------------------------------+
//| Verilen koordinatlarda standart sapma kanalını oluştur           |
//+------------------------------------------------------------------+
bool StdDevChannelCreate(const long            chart_ID=0,        // çizelge kimliğ
                         const string          name="Channel",    // kanal ismi
                         const int             sub_window=0,      // alt-pencere indisi 
                         datetime              time1=0,           // ilk noktanın zamanı
                         datetime              time2=0,           // ikinci noktanın zamanı
                         const double          deviation=1.0,     // sapma
                         const color           clr=clrRed,        // kanal rengi
                         const ENUM_LINE_STYLE style=STYLE_SOLID// kanal çizgilerinin stili
                         const int             width=1,           // kanal çizgilerinin genişliği
                         const bool            fill=false,        // kanalın renk ile doldurulması
                         const bool            back=false,        // arkaplanda
                         const bool            selection=true,    // taşıma için vurgula
                         const bool            ray_left=false,    // kanalın sola doğru sürekliliği
                         const bool            ray_right=false,   // kanalın sağa doğru sürekliliği
                         const bool            hidden=true,       // nesne listesinde gizle
                         const long            z_order=0)         // fare tıklaması için öncelik
  {
//--- ayarlanmamışsa, tutturma noktası koordinatlarını ayarla
   ChangeChannelEmptyPoints(time1,time2);
//--- hata değerini sıfırla
   ResetLastError();
//--- verilen koordinatlarda bir kanal oluştur
   if(!ObjectCreate(chart_ID,name,OBJ_STDDEVCHANNEL,sub_window,time1,0,time2,0))
     {
      Print(__FUNCTION__,
            ": standart sapma kanalı oluşturulamadı! Hata kodu = ",GetLastError());
      return(false);
     }
//--- standart sapma değeri kanalın genişliğini etkiler
   ObjectSetDouble(chart_ID,name,OBJPROP_DEVIATION,deviation);
//--- kanal rengini ayarla
   ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- kanal çizgilerinin stilini ayarla
   ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//--- kanal çizgilerinin genişliğini ayarla
   ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//--- kanal doldurma modunu etkinleştir (true) veya devre dışı bırak (false)
   ObjectSetInteger(chart_ID,name,OBJPROP_FILL,fill);
//--- ön-planda (false) veya arkaplanda (true) göster
   ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- taşıma için vurgulama modunu etkinleştir (true) veya devre dışı bırak (false)
//--- ObjectCreate fonksiyonu ile bir nesne oluşturulurken,
//--- nesne ön tanımlı olarak vurgulanamaz veya taşınamaz. Bu yöntemin içinde, parametre için ön tanımlı olarak 'true' değerinin
//--- seçilmesi, nesnenin vurgulanmasını ve taşınmasını mümkün kılar
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- kanalın sola doğru sürekli gösterimi modunu etkinleştir (true) veya devre dışı bırak (false)
   ObjectSetInteger(chart_ID,name,OBJPROP_RAY_LEFT,ray_left);
//--- kanalın sağa doğru sürekli gösterimi modunu etkinleştir (true) veya devre dışı bırak (false)
   ObjectSetInteger(chart_ID,name,OBJPROP_RAY_RIGHT,ray_right);
//--- nesne listesinde grafiksel nesnenin adını sakla (true) veya göster (false)
   ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- çizelge üzerinde fare tıklaması olayının alınması için özellik ayarla
   ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- başarılı çalıştırma
   return(true);
  }
//+------------------------------------------------------------------+
//| Kanalın tutturma noktasını taşı                                  |
//+------------------------------------------------------------------+
bool StdDevChannelPointChange(const long   chart_ID=0,     // çizelge kimliği
                              const string name="Channel"// kanal ismi
                              const int    point_index=0,  // tutturma noktası indisi
                              datetime     time=0)         // tutturma noktası zaman koordinatı
  {
//--- eğer noktanın zamanı ayarlanmamışsa, noktayı şimdiki çubuğa taşı
   if(!time)
      time=TimeCurrent();
//--- hata değerini sıfırla
   ResetLastError();
//--- tutturma noktasını taşı
   if(!ObjectMove(chart_ID,name,point_index,time,0))
     {
      Print(__FUNCTION__,
            ": tutturma noktasının taşınması başarısız! Hata kodu = ",GetLastError());
      return(false);
     }
//--- başarılı çalıştırma
   return(true);
  }
//+------------------------------------------------------------------+
//| Kanalın sapma değerini değiştir                                  |
//+------------------------------------------------------------------+
bool StdDevChannelDeviationChange(const long   chart_ID=0,     // çizelge kimliği
                                  const string name="Channel"// kanalın ismi
                                  const double deviation=1.0)  // sapma
  {
//--- hata değerini sıfırla
   ResetLastError();
//--- trend çizgisinin eğim açısını değiştir
   if(!ObjectSetDouble(chart_ID,name,OBJPROP_DEVIATION,deviation))
     {
      Print(__FUNCTION__,
            ": kanalın sapma değeri değiştirilemedi! Hata kodu = ",GetLastError());
      return(false);
     }
//--- başarılı çalıştırma
   return(true);
  }
//+------------------------------------------------------------------+
//| Kanalı sil                                                       |
//+------------------------------------------------------------------+
bool StdDevChannelDelete(const long   chart_ID=0,     // çizelge kimliği
                         const string name="Channel"// kanal ismi
  {
//--- hata değerini sıfırla
   ResetLastError();
//--- kanalı sil
   if(!ObjectDelete(chart_ID,name))
     {
      Print(__FUNCTION__,
            ": kanalın silinmesi başarısız oldu! Hata kodu = ",GetLastError());
      return(false);
     }
//--- başarılı çalıştırma
   return(true);
  }
//+-------------------------------------------------------------------------+
//| Kanalın tutturma noktası değerlerini kontrol et ve varsayılan değerleri |
//| boş değerler için ayarla                                                |
//+-------------------------------------------------------------------------+
void ChangeChannelEmptyPoints(datetime &time1,datetime &time2)
  {
//--- ikinci noktanın zamanı ayarlanmamışsa, mevcut çubuğun üstünde olacak
   if(!time2)
      time2=TimeCurrent();
//--- ilk noktanın zamanı ayarlanmamışsa, ikinci noktanın 9 çubuk solunda olacak
   if(!time1)
     {
      //--- son 10 çubuğun açılış zamanını alacak bir dizi
      datetime temp[10];
      CopyTime(Symbol(),Period(),time2,10,temp);
      //--- ilk noktayı ikinciden 9 çubuk sonraya ayarla
      time1=temp[0];
     }
  }
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- giriş parametrelerinin doğruluğunu kontrol et
   if(InpDate1<0 || InpDate1>100 || 
      InpDate2<0 || InpDate2>100)
     {
      Print("Hata! Hatalı giriş parametresi değerleri!");
      return;
     }
//--- çizelge penceresindeki görünür çubukların sayısı
   int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//--- fiyat dizisi büyüklüğü
   int accuracy=1000;
//--- nesnenin tutturma noktası konumunu değiştirmek için kullanılacak
//--- tarih ve fiyat değerlerinin saklanacağı diziler
   datetime date[];
   double   price[];
//--- bellek tahsisi
   ArrayResize(date,bars);
   ArrayResize(price,accuracy);
//--- tarih dizisini doldur
   ResetLastError();
   if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
     {
      Print("Zaman değerlerinin kopyalanması başarısız oldu! Hata kodu = ",GetLastError());
      return;
     }
//--- fiyat dizisini değerlerle doldur
//--- çizelgedeki en yüksek ve en düşük değerleri bul
   double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
   double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//--- fiyatlar için bir değişim birimini tanımla ve diziyi doldur
   double step=(max_price-min_price)/accuracy;
   for(int i=0;i<accuracy;i++)
      price[i]=min_price+i*step;
//--- kanalın çizileceği noktaları tanımla
   int d1=InpDate1*(bars-1)/100;
   int d2=InpDate2*(bars-1)/100;
//--- standart sapma kanalını oluştur
   if(!StdDevChannelCreate(0,InpName,0,date[d1],date[d2],InpDeviation,InpColor,InpStyle,
      InpWidth,InpFill,InpBack,InpSelection,InpRayLeft,InpRayRight,InpHidden,InpZOrder))
     {
      return;
     }
//--- çizelgeyi yenile ve 1 saniye bekle
   ChartRedraw();
   Sleep(1000);
//--- şimdi, yatay olarak sağa doğru genişlet
//--- döngü sayacı
   int h_steps=bars/2;
//--- kanalı taşı
   for(int i=0;i<h_steps;i++)
     {
      //--- şu değerleri kullan
      if(d1<bars-1)
         d1+=1;
      if(d2<bars-1)
         d2+=1;
      //--- tutturma noktalarını taşı
      if(!StdDevChannelPointChange(0,InpName,0,date[d1]))
         return;
      if(!StdDevChannelPointChange(0,InpName,1,date[d2]))
         return;
      //--- script işlemi devre dışı bırakıldı mı kontrol et
      if(IsStopped())
         return;
      //--- çizelgeyi yenile
      ChartRedraw();
      // 0.05 saniyelik gecikme
      Sleep(50);
     }
//--- 1 saniyelik gecikme
   Sleep(1000);
//--- döngü sayacı
   double v_steps=InpDeviation*2;
//--- kanalı genişlet
   for(double i=InpDeviation;i<v_steps;i+=10.0/accuracy)
     {
      if(!StdDevChannelDeviationChange(0,InpName,i))
         return;
      //--- script işlemi devre dışı bırakıldı mı kontrol et
      if(IsStopped())
         return;
      //--- çizelgeyi yenile
      ChartRedraw();
     }
//--- 1 saniyelik gecikme
   Sleep(1000);
//--- kanalı çizelgeden sil
   StdDevChannelDelete(0,InpName);
   ChartRedraw();
//--- 1 saniyelik gecikme
   Sleep(1000);
//---
  }