OBJ_ARROWED_LINE

Oklu çizgi.

ObjArrowedLine

Örnek

Aşağıdaki script, bir oklu çizgi oluşturur ve onu çizelge üzerinde 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, \"Oklu çizgi\" 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="ArrowedLine"// Çizgi ismi
input int             InpDate1=35;           // 1-inci noktanın tarihi, %
input int             InpPrice1=60;          // 1-inci noktanın fiyatı, %
input int             InpDate2=65;           // 2-inci noktanın tarihi, %
input int             InpPrice2=40;          // 1-inci noktanın fiyatı, %
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;         // Arka-plan çizgisi
input bool            InpSelection=true;     // Taşıma için vurgula
input bool            InpHidden=true;        // Nesne listesinde gizle
input long            InpZOrder=0;           // Fare tıklama önceliği
//+------------------------------------------------------------------+
//| Verilen koordinatlarda bir oklu çizgi oluştur                      |
//+------------------------------------------------------------------+
bool ArrowedLineCreate(const long            chart_ID=0,         // çizelge kimliği
                       const string          name="ArrowedLine"// çizgi 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ı
                       const color           clr=clrRed,         // çizgi rengi
                       const ENUM_LINE_STYLE style=STYLE_SOLID,  // çizgi stili
                       const int             width=1,            // çizgi genişliği
                       const bool            back=false,         // arka-planda
                       const bool            selection=true,     // taşımak için vurgula
                       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
   ChangeArrowedLineEmptyPoints(time1,price1,time2,price2);
//--- hata değerini sıfırla
   ResetLastError();
//--- verilen koordinatlarla bir oklu çizgi oluştur
   if(!ObjectCreate(chart_ID,name,OBJ_ARROWED_LINE,sub_window,time1,price1,time2,price2))
     {
      Print(__FUNCTION__,
            ": oklu çizgi oluşturulması başarısız oldu! Hata kodu = ",GetLastError());
      return(false);
     }
//--- ç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);
//--- ç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);
//--- 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);
  }
//+------------------------------------------------------------------+
//| Oklu çizginin çapa noktasını taşı                                |
//+------------------------------------------------------------------+
bool ArrowedLinePointChange(const long   chart_ID=0,         // çizelge kimliği
                            const string name="ArrowedLine"// çizgi 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();
//--- ç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);
  }
//+------------------------------------------------------------------+
//| Fonksiyon, oklu çizgiyi çizelgeden siler                         |
//+------------------------------------------------------------------+
bool ArrowedLineDelete(const long   chart_ID=0,         // çizelge tanımlayıcısı
                       const string name="ArrowedLine"// çizgi ismi
  {
//--- hata değerini sıfırla
   ResetLastError();
//--- bir oklu çizgiyi sil
   if(!ObjectDelete(chart_ID,name))
     {
      Print(__FUNCTION__,
            ": oklu çizgi oluşturulması başarısız oldu! Hata kodu = ",GetLastError());
      return(false);
     }
//--- başarılı çalıştırma
   return(true);
  }
//+------------------------------------------------------------------+
//| tutturma noktalarını kontrol et ve                               |
//| boş olanlar için varsayılan değerleri ayarla                     |
//+------------------------------------------------------------------+
void ChangeArrowedLineEmptyPoints(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 noktanın zamanı ayarlanmamışsa, ilkinin 9 çubuk sonrasına konumlandırılır
   if(!time2)
     {
      //--- son 10 çubuğun açılış zamanını alacak bir dizi
      datetime temp[10];
      CopyTime(Symbol(),Period(),time1,10,temp);
      //--- ikinci noktayı birincisinden 9 çubuk ileri ayarla
      time2=temp[0];
     }
//--- ikinci noktanın fiyatı ayarlanmamışsa birinciye eşit olur
   if(!price2)
      price2=price1;
  }
//+------------------------------------------------------------------+
//| 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)
     {
      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 d2=InpDate2*(bars-1)/100;
   int p1=InpPrice1*(accuracy-1)/100;
   int p2=InpPrice2*(accuracy-1)/100;
//--- bir oklu çizgi oluştur
   if(!ArrowedLineCreate(0,InpName,0,date[d1],price[p1],date[d2],price[p2],
      InpColor,InpStyle,InpWidth,InpBack,InpSelection,InpHidden,InpZOrder))
     {
      return;
     }
//--- çizelgeyi yenile ve 1 saniye bekle
   ChartRedraw();
   Sleep(1000);
//--- şimdi, çizginin tutturma noktasını taşı
//--- döngü sayacı
   int v_steps=accuracy/5;
//--- ikinci tutturma noktasını dikey olarak taşı
   for(int i=0;i<v_steps;i++)
     {
      //--- bir sonraki değeri kullan
      if(p2<accuracy-1)
         p2+=1;
      //--- tutturma noktasını taşı
      if(!ArrowedLinePointChange(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();
     }
//--- 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(!ArrowedLinePointChange(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);
//--- döngü sayacı
   int h_steps=bars/2;
//--- iki tutturma noktasını aynı anda taşı
   for(int i=0;i<h_steps;i++)
     {
      //--- şu değerleri kullan
      if(d1<bars-1)
         d1+=1;
      if(d2>1)
         d2-=1;
      //--- noktaları kaydır
      if(!ArrowedLinePointChange(0,InpName,0,date[d1],price[p1]))
         return;
      if(!ArrowedLinePointChange(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();
      // 0.03 saniyelik gecikme
      Sleep(30);
     }
//--- 1 saniyelik gecikme
   Sleep(1000);
//--- bir oklu çizgiyi sil
   ArrowedLineDelete(0,InpName);
   ChartRedraw();
//--- 1 saniyelik gecikme
   Sleep(1000);
//---
  }