#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);
}
|