OBJ_GANNLINE

Gann Çizgisi.

ObjGannLine

Not

"Gann çizgilerinin" 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.

Ölçekli Gann açısının ve ikinci tutturma noktası koordinatlarının her ikisi de çizgi eğimini ayarlamak için kullanılabilir.

Örnek

Aşağıdaki script Gann Çizgisini ç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, \"Gann çizgisi\" 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="GannLine";        // Çizgi ismi
input int             InpDate1=20;               // 1-inci noktanın tarihi, %
input int             InpPrice1=75;              // 1-inci noktanın fiyatı, %
input int             InpDate2=80;               // 2-inci noktanın tarihi, %
input double          InpAngle=0.0;              // Gan Açısı
input double          InpScale=1.0;              // Ölçek
input color           InpColor=clrRed;           // Çizgi rengi
input ENUM_LINE_STYLE InpStyle=STYLE_DASHDOTDOT// Çizgi stili
input int             InpWidth=2;                // Çizgi stili
input bool            InpBack=false;             // Arka plan çizgisi
input bool            InpSelection=true;         // Taşımak için vurgula
input bool            InpRayLeft=false;          // Çizginin sola doğru sürekliliği
input bool            InpRayRight=true;          // Çizginin sağa doğru sürekliliği
input bool            InpHidden=true;            // Nesne listesinde gizle
input long            InpZOrder=0;               // Fare tıklaması için öncelik
//+------------------------------------------------------------------+
//| Gann Çizgisini; koordinatlar, açı ve ölçek ile oluştur           |
//+------------------------------------------------------------------+
bool GannLineCreate(const long            chart_ID=0,        // çizelge kimliği
                    const string          name="GannLine",   // çizgi ismi
                    const int             sub_window=0,      // alt pencere indisi
                    datetime              time1=0,           // ilk nokta zamanı
                    double                price1=0,          // ilk nokta fiyatı
                    datetime              time2=0,           // ikinci nokta zamanı
                    const double          angle=1.0,         // Gann açısı
                    const double          scale=1.0,         // ölçek
                    const color           clr=clrRed,        // çizgi rengi
                    const ENUM_LINE_STYLE style=STYLE_SOLID// çizgi stili
                    const int             width=1,           // çizgi kalınlığı
                    const bool            back=false,        // arka planda
                    const bool            selection=true,    // taşıma için vurgula
                    const bool            ray_left=false,    // çizginin sola doğru sürekliliği
                    const bool            ray_right=true,    // çizginin sağa doğru sürekliliği
                    const bool            hidden=true,       // nesneyi listede gizle
                    const long            z_order=0)         // fare tıklaması için öncelik
  {
//--- ayarlanmamışsa, tutturma noktası koordinatlarını ayarla
   ChangeGannLineEmptyPoints(time1,price1,time2);
//--- hata değerini sıfırla
   ResetLastError();
//--- verilen koordinatlarla bir Gann Çizgisi oluştur
//--- ikinci tutturma noktasının doğru koordinatları,
//--- Gann açısının ve/veya ölçeğin değişiminden sonra otomatik olarak yeniden tanımlanır,
   if(!ObjectCreate(chart_ID,name,OBJ_GANNLINE,sub_window,time1,price1,time2,0))
     {
      Print(__FUNCTION__,
            ": \"Gann Çizgisi oluşturulamadı\"! Hata kodu = ",GetLastError());
      return(false);
     }
//--- Gann açısını değiştir
   ObjectSetDouble(chart_ID,name,OBJPROP_ANGLE,angle);
//--- ölçeği değiştir (çubuk başına düşen pip olarak)
   ObjectSetDouble(chart_ID,name,OBJPROP_SCALE,scale);
//--- çizgi rengini ayarla
   ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- çizgi görünüm stilini ayarla
   ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//--- çizgi 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);
//--- çizginin 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);
//--- çizginin 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);
  }
//+------------------------------------------------------------------+
//| Gann çizgisi çapa noktasını taşı                                 |
//+------------------------------------------------------------------+
bool GannLinePointChange(const long   chart_ID=0,      // çizelge kimliği
                         const string name="GannLine"// çizgi ismi
                         const int    point_index=0,   // tutturma noktası indisi
                         datetime     time=0,          // çapa noktası zaman koordinatı
                         double       price=0)         // çapa 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();
//--- çizginin 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);
  }
//+------------------------------------------------------------------+
//| Gann açısını değiştir                                            |
//+------------------------------------------------------------------+
bool GannLineAngleChange(const long   chart_ID=0,      // çizelge kimliği
                         const string name="GannLine"// çizgi ismi
                         const double angle=1.0)       // Gann açısı
  {
//--- hata değerini sıfırla
   ResetLastError();
//--- Gann açısını değiştir
   if(!ObjectSetDouble(chart_ID,name,OBJPROP_ANGLE,angle))
     {
      Print(__FUNCTION__,
            ": Gann açısı değiştirilemedi! Hata kodu = ",GetLastError());
      return(false);
     }
//--- başarılı çalıştırma
   return(true);
  }
//+------------------------------------------------------------------+
//| Gann Çizgisinin ölçeğini değiştir                                |
//+------------------------------------------------------------------+
bool GannLineScaleChange(const long   chart_ID=0,      // çizelge kimliği
                         const string name="GannLine"// çizgi ismi
                         const double scale=1.0)       // ölçek
  {
//--- hata değerini sıfırla
   ResetLastError();
//--- ölçeği değiştir (çubuk başına düşen pip olarak)
   if(!ObjectSetDouble(chart_ID,name,OBJPROP_SCALE,scale))
     {
      Print(__FUNCTION__,
            ": ölçek değiştirilemedi! Hata kodu = ",GetLastError());
      return(false);
     }
//--- başarılı çalıştırma
   return(true);
  }
//+------------------------------------------------------------------+
//| Fonksiyon, Gann çizgisini çizelgeden siler                       |
//+------------------------------------------------------------------+
bool GannLineDelete(const long   chart_ID=0,      // çizelge kimliği
                    const string name="GannLine"// çizgi ismi
  {
//--- hata değerini sıfırla
   ResetLastError();
//--- Gann çizgisini sil
   if(!ObjectDelete(chart_ID,name))
     {
      Print(__FUNCTION__,
            ": \"Gann Çizgisi\" silinemedi! Hata kodu = ",GetLastError());
      return(false);
     }
//--- başarılı çalıştırma
   return(true);
  }
//+------------------------------------------------------------------+
//| Gann Çizgisinin tutturma noktası değerlerini kontrol et ve       |
//| boş olanlar için varsayılan değerleri kullan                     |
//+------------------------------------------------------------------+
void ChangeGannLineEmptyPoints(datetime &time1,double &price1,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];
     }
//--- ilk noktanın fiyatı ayarlanmamışsa mevcut Bid değerini alacak
   if(!price1)
      price1=SymbolInfoDouble(Symbol(),SYMBOL_BID);
  }
//+------------------------------------------------------------------+
//| 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)
     {
      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;
//--- Gan çizgisini çizmek için noktaları tanımla
   int d1=InpDate1*(bars-1)/100;
   int d2=InpDate2*(bars-1)/100;
   int p1=InpPrice1*(accuracy-1)/100;
//--- Gann Çizgisini oluştur
   if(!GannLineCreate(0,InpName,0,date[d1],price[p1],date[d2],InpAngle,InpScale,InpColor,
      InpStyle,InpWidth,InpBack,InpSelection,InpRayLeft,InpRayRight,InpHidden,InpZOrder))
     {
      return;
     }
//--- çizelgeyi yenile ve 1 saniye bekle
   ChartRedraw();
   Sleep(1000);
//--- şimdi, tutturma noktasını taşı ve açıyı değiştir
//--- döngü sayacı
   int v_steps=accuracy/2;
//--- ilk tutturma noktasını dikey olarak taşı
   for(int i=0;i<v_steps;i++)
     {
      //--- bir sonraki değeri kullan
      if(p1>1)
         p1-=1;
      //--- tutturma noktasını taşı
      if(!GannLinePointChange(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();
     }
//--- yarım saniyelik gecikme
   Sleep(500);
//--- Gan açısının (ilk tutturma noktasının taşınmasıyla değişen)
//--- mevcut değerini tanımla
   double curr_angle;
   if(!ObjectGetDouble(0,InpName,OBJPROP_ANGLE,0,curr_angle))
      return;
//--- döngü sayacı
   v_steps=accuracy/8;
//--- Gann açısını değiştir
   for(int i=0;i<v_steps;i++)
     {
      if(!GannLineAngleChange(0,InpName,curr_angle-0.05*i))
         return;
      //--- script işlemi devre dışı bırakıldı mı kontrol et
      if(IsStopped())
         return;
      //--- çizelgeyi yenile
      ChartRedraw();
     }
//--- 1 saniyelik gecikme
   Sleep(1000);
//--- çizgiyi çizelgeden sil
   GannLineDelete(0,InpName);
   ChartRedraw();
//--- 1 saniyelik gecikme
   Sleep(1000);
//---
  }