#property description "Gösterge önceki ayın verisini inceleyerek, küçük ve büyük tik hacimli tüm" #property description "mumları boyar. Tik hacmi dizisi böyle mumları tanımlamak için sıralanır." #property description "Dizi elemanlarının ilk InpSmallVolume yüzdesini kapsayan hacme sahip" #property description "mumlar küçük farz edilir. Dizi elemanlarının son InpBigVolume yüzdesini" #property description "kapsayan hacme sahip mumlar ise büyük farz edilir." //--- gösterge ayarları #property indicator_chart_window #property indicator_buffers 5 #property indicator_plots 1 //--- grafik #property indicator_label1 "VolumeFactor" #property indicator_type1 DRAW_COLOR_CANDLES #property indicator_color1 clrDodgerBlue,clrOrange #property indicator_style1 STYLE_SOLID #property indicator_width1 2 //--- ön tanımlı sabitler #define INDICATOR_EMPTY_VALUE 0.0 //--- giriş parametreleri input int InpSmallVolume=15; // Küçük hacimlerin yüzdelik değeri (<50) input int InpBigVolume=20; // Büyük hacimlerin yüzdelik değeri (<50) //--- analiz başlangıç zamanı (kaydırılacak) datetime ExtStartTime; //--- gösterge tamponları double ExtOpenBuff[]; double ExtHighBuff[]; double ExtLowBuff[]; double ExtCloseBuff[]; double ExtColorBuff[]; //--- mumların gösterilmesi için sınır hacim değerleri long ExtLeftBorder=0; long ExtRightBorder=0; //+------------------------------------------------------------------+ //| Tik hacimleri için sınır değerlerini al | //+------------------------------------------------------------------+ bool GetVolumeBorders(void) { //--- değişkenler datetime stop_time; // kopyalama durdurma zamanı long buff[]; // kopyalama tamponu //--- durdurma zamanı şu anki zaman olsun stop_time=TimeCurrent(); //--- başlangıç zamanı şimdikinden bir ay önceki olsun ExtStartTime=GetStartTime(stop_time); //--- tik hacmi değerlerini al ResetLastError(); if(CopyTickVolume(Symbol(),Period(),ExtStartTime,stop_time,buff)==-1) { //--- verinin alınması başarısız oldu, yeniden hesaplama komutu için false dönüşü yap PrintFormat("Tik hacmi değerlerinin alınması başarısız oldu. Hata kodu = %d",GetLastError()); return(false); } //--- dizi büyüklüğünü hesapla int size=ArraySize(buff); //--- diziyi sırala ArraySort(buff); //--- tik hacimleri için sağ ve sol sınırları tanımla ExtLeftBorder=buff[size*InpSmallVolume/100]; ExtRightBorder=buff[(size-1)*(100-InpBigVolume)/100]; //--- başarılı çalıştırma return(true); } //+------------------------------------------------------------------+ //| Bir ay önceki verinin alınması | //+------------------------------------------------------------------+ datetime GetStartTime(const datetime stop_time) { //--- durdurma zamanını MqlDateTime tipli yapı değişkenine dönüştür MqlDateTime temp; TimeToStruct(stop_time,temp); //--- bir ay önceki veriyi al if(temp.mon>1) temp.mon-=1; // mevcut ay, yılın ilk ayı değil. Bu yüzden, bir öncekinin numarası bir eksik olacak else { temp.mon=12; // mevcut ay, yılın ilk ayı. Bu yüzden, bir öncekinin numarası 12 olacak, temp.year-=1; // yıl numarası bir küçükse } //--- gün numarası 28'i aşamaz if(temp.day>28) temp.day=28; //--- elde edilen tarih değerine dönüş yap return(StructToTime(temp)); } //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- giriş parametreleri koşulları sağlıyor mu kontrol et if(InpSmallVolume<0 || InpSmallVolume>=50 || InpBigVolume<0 || InpBigVolume>=50) { Print("Hatalı giriş parametreleri"); return(INIT_PARAMETERS_INCORRECT); } //--- gösterge tamponlarının eşlenmesi SetIndexBuffer(0,ExtOpenBuff); SetIndexBuffer(1,ExtHighBuff); SetIndexBuffer(2,ExtLowBuff); SetIndexBuffer(3,ExtCloseBuff); SetIndexBuffer(4,ExtColorBuff,INDICATOR_COLOR_INDEX); //--- gösterilmeyecek olan değeri ayarla PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,INDICATOR_EMPTY_VALUE); //--- gösterge tamponlarının etiketlerini ayarla PlotIndexSetString(0,PLOT_LABEL,"Open;High;Low;Close"); //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int OnCalculate(const int rates_total, const int prev_calculated, const datetime &time[], const double &open[], const double &high[], const double &low[], const double &close[], const long &tick_volume[], const long &volume[], const int &spread[]) { //--- hala işlenmeyen çubuklar var mı kontrol et if(prev_calculated<rates_total) { //--- sağ ve sol hacim sınırları için yeni değerler al if(!GetVolumeBorders()) return(0); } //--- çubuk hesaplama için değişkeni başlat int start=prev_calculated; //--- gösterge değerleri bir önceki tik ile zaten hesaplanmışsa son çubukta çalış if(start>0) start--; //--- zaman serilerindeki doğrudan indislemeyi ayarla ArraySetAsSeries(time,false); ArraySetAsSeries(open,false); ArraySetAsSeries(high,false); ArraySetAsSeries(low,false); ArraySetAsSeries(close,false); ArraySetAsSeries(tick_volume,false); //--- gösterge değerlerini hesaplayan döngü for(int i=start;i<rates_total;i++) { //--- başlangıç tarihinden başlayarak mumları doldur if(ExtStartTime<=time[i]) { //--- değer sağ sınırdan küçük değilse, mumu doldur if(tick_volume[i]>=ExtRightBorder) { //--- mumu çizmek için veri al ExtOpenBuff[i]=open[i]; ExtHighBuff[i]=high[i]; ExtLowBuff[i]=low[i]; ExtCloseBuff[i]=close[i]; //--- DodgerBlue (parlak gök mavisi) renk ExtColorBuff[i]=0; //--- döngüye devam et continue; } //--- değer, sol sınırı aşmamışsa, mumu doldur if(tick_volume[i]<=ExtLeftBorder) { //--- mumu çizmek için veri al ExtOpenBuff[i]=open[i]; ExtHighBuff[i]=high[i]; ExtLowBuff[i]=low[i]; ExtCloseBuff[i]=close[i]; //--- Orange (turuncu) renk ExtColorBuff[i]=1; //--- döngüye devam et continue; } } //--- hesaplamaya katılmayan boş değerli çubukları ayarla ExtOpenBuff[i]=INDICATOR_EMPTY_VALUE; ExtHighBuff[i]=INDICATOR_EMPTY_VALUE; ExtLowBuff[i]=INDICATOR_EMPTY_VALUE; ExtCloseBuff[i]=INDICATOR_EMPTY_VALUE; } //--- bir sonraki çağrı için prev_calculated değerine dönüş yap return(rates_total); } |