OBJ_FIBOCHANNEL

Fibonacci Kanalı.

ObjFiboChannel

Not

Fibonacci 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, seviye çizgilerinin sayısını, değerlerini ve renklerini de belirtebilirsiniz.

Örnek

Aşağıdaki script, çizelge üzerinde Fibonacci Kanallarını oluşturur. 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, \"Fibonacci Kanalı\" grafiksel nesnesini çizer."
#property description "Tutturma (çapa) 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="FiboChannel";     // Kanal ismi
input int             InpDate1=20;               // 1-inci noktanın tarihi, %
input int             InpPrice1=10;              // 1-inci noktanın fiyatı, %
input int             InpDate2=60;               // 2-inci noktanın tarihi, %
input int             InpPrice2=30;              // 2-inci noktanın fiyatı, %
input int             InpDate3=20;               // 3-üncü noktanın tarihi, %
input int             InpPrice3=25;              // 3-üncü noktanın fiyatı, %
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            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 Fibonacci Kanalını oluştur                |
//+------------------------------------------------------------------+
bool FiboChannelCreate(const long            chart_ID=0,         // çizelge kimliği
                       const string          name="FiboChannel"// kanal ismi
                       const int             sub_window=0,       // alt-pencere indisi
                       datetime              time1=0,            // ilk noktanın zamanı
                       double                price1=0,           // ilk noktanın fiyatı
                       datetime              time2=0,            // ikinci noktanın zamanı
                       double                price2=0,           // ikinci noktanın fiyatı
                       datetime              time3=0,            // üçüncü nokta zamanı
                       double                price3=0,           // üçüncü nokta fiyatı
                       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            back=false,         // arka-planda
                       const bool            selection=true,     // taşımak 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 sakla
                       const long            z_order=0)          // fare tıklaması için öncelik
  {
//--- ayarlanmamışsa, tutturma noktası koordinatlarını ayarla
   ChangeFiboChannelEmptyPoints(time1,price1,time2,price2,time3,price3);
//--- hata değerini sıfırla
   ResetLastError();
//--- verilen koordinatlarda bir kanal oluştur
   if(!ObjectCreate(chart_ID,name,OBJ_FIBOCHANNEL,sub_window,time1,price1,time2,price2,time3,price3))
     {
      Print(__FUNCTION__,
            ": \"Fibonacci Kanalı\" oluşturulamadı! Hata kodu = ",GetLastError());
      return(false);
     }
//--- 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);
//--- ö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);
  }
//+------------------------------------------------------------------+
//| Seviyelerin parametrelerini ve sayılarını ayarla                 |
//+------------------------------------------------------------------+
bool FiboChannelLevelsSet(int             levels,             // seviye çizgilerinin sayısı
                          double          &values[],          // seviye çizgilerinin değerleri
                          color           &colors[],          // seviye çizgilerinin rengi
                          ENUM_LINE_STYLE &styles[],          // seviye çizgilerinin stili
                          int             &widths[],          // seviye çizgilerinin kalınlığı
                          const long      chart_ID=0,         // çizelge kimliği
                          const string    name="FiboChannel"// nesne ismi
  {
//--- dizi büyüklüklerini ayarla
   if(levels!=ArraySize(colors) || levels!=ArraySize(styles) ||
      levels!=ArraySize(widths) || levels!=ArraySize(widths))
     {
      Print(__FUNCTION__,": dizi uzunluğu seviyelerin sayısıyla örtüşmüyor, hata!");
      return(false);
     }
//--- seviyelerin sayısını ayarla
   ObjectSetInteger(chart_ID,name,OBJPROP_LEVELS,levels);
//--- seviyelerin özeliklerini döngü içinde ayarla
   for(int i=0;i<levels;i++)
     {
      //--- seviye değeri
      ObjectSetDouble(chart_ID,name,OBJPROP_LEVELVALUE,i,values[i]);
      //--- seviye rengi
      ObjectSetInteger(chart_ID,name,OBJPROP_LEVELCOLOR,i,colors[i]);
      //--- seviye stili
      ObjectSetInteger(chart_ID,name,OBJPROP_LEVELSTYLE,i,styles[i]);
      //--- seviye genişliği
      ObjectSetInteger(chart_ID,name,OBJPROP_LEVELWIDTH,i,widths[i]);
      //--- seviye açıklaması
      ObjectSetString(chart_ID,name,OBJPROP_LEVELTEXT,i,DoubleToString(100*values[i],1));
     }
//--- başarılı çalıştırma
   return(true);
  }
//+------------------------------------------------------------------+
//| Fibonacci Kanalının tutturma noktasını taşı                      |
//+------------------------------------------------------------------+
bool FiboChannelPointChange(const long   chart_ID=0,         // çizelge tanımlayıcısı
                            const string name="FiboChannel"// kanal ismi
                            const int    point_index=0,      // tutturma (çapa) noktası ismi
                            datetime     time=0,             // tutturma noktası zaman koordinatı
                            double       price=0)            // tutturma noktası fiyat koordinatı
  {
//--- noktanın pozisyonu belirlenmemişse, noktayı Bid (alış) fiyatı olan mevcut çubuğa taşı
   if(!time)
      time=TimeCurrent();
   if(!price)
      price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- hata değerini sıfırla
   ResetLastError();
//--- tutturma noktasını taşı
   if(!ObjectMove(chart_ID,name,point_index,time,price))
     {
      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ı sil                                                       |
//+------------------------------------------------------------------+
bool FiboChannelDelete(const long   chart_ID=0,         // çizelge kimliği
                       const string name="FiboChannel"// kanal ismi
  {
//--- hata değerini sıfırla
   ResetLastError();
//--- kanalı sil
   if(!ObjectDelete(chart_ID,name))
     {
      Print(__FUNCTION__,
            ": \"Fibonacci Kanalı\" silinemedi! Hata kodu = ",GetLastError());
      return(false);
     }
//--- başarılı çalıştırma
   return(true);
  }
//+------------------------------------------------------------------+
//| Fibonacci Kanalının tutturma noktası değerlerini kontrol et ve   |
//| varsayılan değerleri boş değerler için ayarla                    |
//+------------------------------------------------------------------+
void ChangeFiboChannelEmptyPoints(datetime &time1,double &price1,datetime &time2,
                                  double &price2,datetime &time3,double &price3)
  {
//--- İkinci noktanın (sağ) zamanı ayarlanmamışsa, ilk çubuk üzerinde olacak
   if(!time2)
      time2=TimeCurrent();
//--- İkinci noktanın fiyatı ayarlanmamışsa, Bid (alış) değerini alacak
   if(!price2)
      price2=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- İlk noktanın (sol) zamanı ayarlanmamışsa, ikinciden 9 çubuk sonra 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];
     }
//--- ilk noktanın fiyatı ayarlanmamışsa, ikincinin 300 puan üstüne taşı
   if(!price1)
      price1=price2+300*SymbolInfoDouble(Symbol(),SYMBOL_POINT);
//--- üçüncü noktanın zamanı ayarlanmamışsa, birinci noktanın üstüne gelsin
   if(!time3)
      time3=time1;
//--- üçüncü noktanın fiyatı ayarlanmamışsa, ikinci noktanın fiyatına eşittir
   if(!price3)
      price3=price2;
  }
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- giriş parametrelerinin doğruluğunu kontrol et
   if(InpDate1<0 || InpDate1>100 || InpPrice1<0 || InpPrice1>100 || 
      InpDate2<0 || InpDate2>100 || InpPrice2<0 || InpPrice2>100 || 
      InpDate3<0 || InpDate3>100 || InpPrice3<0 || InpPrice3>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;
   int d3=InpDate3*(bars-1)/100;
   int p1=InpPrice1*(accuracy-1)/100;
   int p2=InpPrice2*(accuracy-1)/100;
   int p3=InpPrice3*(accuracy-1)/100;
//--- Fibonacci Kanalını oluştur
   if(!FiboChannelCreate(0,InpName,0,date[d1],price[p1],date[d2],price[p2],date[d3],price[p3],
      InpColor,InpStyle,InpWidth,InpBack,InpSelection,InpRayLeft,InpRayRight,InpHidden,InpZOrder))
     {
      return;
     }
//--- çizelgeyi yenile ve 1 saniye bekle
   ChartRedraw();
   Sleep(1000);
//--- şimdi, kanalın tutturma noktalarını taşı
//--- döngü sayacı
   int h_steps=bars/10;
//--- ilk tutturma noktasını taşı
   for(int i=0;i<h_steps;i++)
     {
      //--- bir sonraki değeri kullan
      if(d1>1)
         d1-=1;
      //--- tutturma noktasını taşı
      if(!FiboChannelPointChange(0,InpName,0,date[d1],price[p1]))
         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ı
   int v_steps=accuracy/10;
//--- ikinci tutturma noktasını taşı
   for(int i=0;i<v_steps;i++)
     {
      //--- bir sonraki değeri kullan
      if(p2>1)
         p2-=1;
      //--- tutturma noktasını taşı
      if(!FiboChannelPointChange(0,InpName,1,date[d2],price[p2]))
         return;
      //--- script işlemi devre dışı bırakıldı mı kontrol et
      if(IsStopped())
         return;
      //--- çizelgeyi yenile
      ChartRedraw();
     }
//--- 1 saniyelik gecikme
   Sleep(1000);
//--- döngü sayacı
   v_steps=accuracy/15;
//--- üçüncü tutturma noktasını taşı
   for(int i=0;i<v_steps;i++)
     {
      //--- bir sonraki değeri kullan
      if(p3<accuracy-1)
         p3+=1;
      //--- tutturma noktasını taşı
      if(!FiboChannelPointChange(0,InpName,2,date[d3],price[p3]))
         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
   FiboChannelDelete(0,InpName);
   ChartRedraw();
//--- 1 saniyelik gecikme
   Sleep(1000);
//---
  }