OBJ_TRENDBYANGLE

Açılı Trend Çizgisi.

ObjTrendByAngle

Not

Açılı Trend Çizgisinin, 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.

Açının ve ikinci tutturma noktasının koordinatlarının her ikisi de çizgi eğimini ayarlamak için kullanılabilir.

Örnek

Aşağıdaki script Trend Ç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 \"Açılı Trend Çizgisi\" grafiksel nesnesini çizer."
#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="Trend";     // Çizgi ismi
input int             InpDate1=50;         // 1-inci noktanın tarihi, %
input int             InpPrice1=75;        // 1-inci noktanın fiyatı, %
input int             InpAngle=0;          // Çizginin eğim açısı
input color           InpColor=clrRed;     // Çizgi rengi
input ENUM_LINE_STYLE InpStyle=STYLE_DASH// Çizgi stili
input int             InpWidth=2;          // Çizgi genişliği
input bool            InpBack=false;       // Arkaplan nesnesi
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ı önceliği
//+------------------------------------------------------------------+
//| Açı kullanarak trend çizgisi oluştur                             |
//+------------------------------------------------------------------+
bool TrendByAngleCreate(const long            chart_ID=0,        // çizelge kimliği
                        const string          name="TrendLine",  // çizgi ismi/t7>
                        const int             sub_window=0,      // alt-pencere numarası index
                        datetime              time=0,            // noktanın zamanı
                        double                price=0,           // noktanın fiyatı
                        const double          angle=45.0,        // eğim açısı
                        const color           clr=clrRed,        // çizgi rengi
                        const ENUM_LINE_STYLE style=STYLE_SOLID// çizi stili
                        const int             width=1,           // çizgi genişliği
                        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,       // nesne listesinde gizle
                        const long            z_order=0)         // fare tıklaması için öncelik
  {
//--- trend çizgisinin fare ile taşınmasına imkan sağlamak için ikinci noktayı oluştur
   datetime time2=0;
   double   price2=0;
//--- ayarlanmamışsa, tutturma noktası koordinatlarını ayarla
   ChangeTrendEmptyPoints(time,price,time2,price2);
//--- hata değerini sıfırla
   ResetLastError();
//--- 2 nokta kullanarak bir trend çizgisi oluştur
   if(!ObjectCreate(chart_ID,name,OBJ_TRENDBYANGLE,sub_window,time,price,time2,price2))
     {
      Print(__FUNCTION__,
            ": trend çizgisinin oluşturulması başarısız oldu! Hata kodu = ",GetLastError());
      return(false);
     }
//--- trend çizgisinin eğim açısını değiştir; açıyı değiştirirken, çizginin ikinci noktasının
//--- koordinatları, açının yeni değerine göre otomatik olarak yeniden tanımlanır
   ObjectSetDouble(chart_ID,name,OBJPROP_ANGLE,angle);
//--- çizgi rengini ayarla
   ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- çizgi 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);
//--- çizgiyi fare ile taşıma 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);
  }
//+------------------------------------------------------------------+
//| Trend çizgisinin tutturma noktası koordinatlarını değiştir       |
//+------------------------------------------------------------------+
bool TrendPointChange(const long   chart_ID=0,       // çizelge kimliği
                      const string name="TrendLine"// çizgi ismi
                      datetime     time=0,           // tutturma noktasının zaman koordinatı
                      double       price=0)          // tutturma noktasının zaman 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();
//--- trend çizgisinin tutturma noktasını taşı
   if(!ObjectMove(chart_ID,name,0,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);
  }
//+------------------------------------------------------------------+
//| Trend çizgisinin eğim açısını değiştir                           |
//+------------------------------------------------------------------+
bool TrendAngleChange(const long   chart_ID=0,       // çizelge kimliği
                      const string name="TrendLine"// trend çizgisi ismi
                      const double angle=45)         // trend çizgisi eğim açısı
  {
//--- hata değerini sıfırla
   ResetLastError();
//--- trend çizgisinin eğim açısını değiştir
   if(!ObjectSetDouble(chart_ID,name,OBJPROP_ANGLE,angle))
     {
      Print(__FUNCTION__,
            ": çizginin eğim açısı değiştirilemedi! Hata kodu = ",GetLastError());
      return(false);
     }
//--- başarılı çalıştırma
   return(true);
  }
//+------------------------------------------------------------------+
//| Trend çizgisini sil                                              |
//+------------------------------------------------------------------+
bool TrendDelete(const long   chart_ID=0,       // çizelge kimliği
                 const string name="TrendLine"// çizgi ismi
  {
//--- hata değerini sıfırla
   ResetLastError();
//--- trend çizgisini sil
   if(!ObjectDelete(chart_ID,name))
     {
      Print(__FUNCTION__,
            ": trend çizgisi silinemedi! Hata kodu = ",GetLastError());
      return(false);
     }
//--- başarılı çalıştırma
   return(true);
  }
//+------------------------------------------------------------------+
//| Trend çizgisinin tutturma noktası değerlerini kontrol et ve      |
//| boş olanlar için varsayılan değerleri kullan                     |
//+------------------------------------------------------------------+
void ChangeTrendEmptyPoints(datetime &time1,double &price1,
                            datetime &time2,double &price2)
  {
//--- ilk noktanın zamanı ayarlanmamışsa mevcut çubuk üzerinde olacak
   if(!time1)
      time1=TimeCurrent();
//--- ilk noktanın fiyatı ayarlanmamışsa mevcut Bid değerini alacak
   if(!price1)
      price1=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- ikinci, yardımcı nokta için koordinatları ayarla,
//--- ikinci nokta 9 çubuk solda ve aynı fiyatta olacak
   datetime second_point_time[10];
   CopyTime(Symbol(),Period(),time1,10,second_point_time);
   time2=second_point_time[0];
   price2=price1;
  }
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- giriş parametrelerinin doğruluğunu kontrol et
   if(InpDate1<0 || InpDate1>100 || InpPrice1<0 || InpPrice1>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;
//--- çizgiyi çizmek için noktaları tanımla
   int d1=InpDate1*(bars-1)/100;
   int p1=InpPrice1*(accuracy-1)/100;
//--- bir trend çizgisi oluştur
   if(!TrendByAngleCreate(0,InpName,0,date[d1],price[p1],InpAngle,InpColor,InpStyle,
      InpWidth,InpBack,InpSelection,InpRayLeft,InpRayRight,InpHidden,InpZOrder))
     {
      return;
     }
//--- çizelgeyi yenile ve 1 saniye bekle
   ChartRedraw();
   Sleep(1000);
//--- şimdi, çizgiyi taşı
//--- döngü sayacı
   int v_steps=accuracy/2;
//--- tutturma noktasını taşı ve çizginin eğim açısını değiştir
   for(int i=0;i<v_steps;i++)
     {
      //--- bir sonraki değeri kullan
      if(p1>1)
         p1-=1;
      //--- tutturma noktasını taşı
      if(!TrendPointChange(0,InpName,date[d1],price[p1]))
         return;
      if(!TrendAngleChange(0,InpName,18*(i+1)))
         return;
      //--- script işlemi devre dışı bırakıldı mı kontrol et
      if(IsStopped())
         return;
      //--- çizelgeyi yenile
      ChartRedraw();
     }
//--- 1 saniyelik gecikme
   Sleep(1000);
//--- çizelgeden sil
   TrendDelete(0,InpName);
   ChartRedraw();
//--- 1 saniyelik gecikme
   Sleep(1000);
//---
  }