hi
i am looking for volume value area on each candle better than the one i have ,if there is no another one.can some one change this indicator to make it draw value area high and low only by drawing dash on the high and low and it would be better if the area between filled.
see below pic
i am looking for volume value area on each candle better than the one i have ,if there is no another one.can some one change this indicator to make it draw value area high and low only by drawing dash on the high and low and it would be better if the area between filled.
see below pic
QuoteDisliked//+------------------------------------------------------------------+
//| Futprint.mq4 |
//| Copyright 2018, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property strict
#property version "1.0"
#property copyright "Roman."
#property description "If you like the indicator, you can thank the author"
#property description "Webmoney: Z330494414179, R222585888867"
#property description " "
#property description "Thank you very much."
#property indicator_chart_window
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
enum PColor
{
C1=0,// Mono Color
C2=1,// Gauss Bell Color
C3=2 // Rate Color
};
input string KeyFix="Z"; //Key Change Fix 1:1
extern int iTimer = 150; //Timer in MilliSeconds
extern bool bUp = false; //Draw on Top
input string KeyTop="A"; //Key Change Draw Top/Back
extern bool ShowLabelReDraw = true;//Show/Hide Label "Re Draw"
extern PColor Color = C2; //Color Scheme
extern color MainClr = clrTomato; //Main/68 %/First Color
extern color Rate1 = clrYellow; //95 %/Second Color
extern color Rate2 = clrAqua; //5%/Third color
extern color Rate3 = clrGray; //Fourth color
input string KeyRoll="Q"; //Key Change Color Scheme
extern int RateDiv1 = 100; //First Rate Factor
extern int RateDiv2 = 200; //Second Rate Factor
extern int RateDiv3 = 300; //Third Rate Factor
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int OnInit()
{
//--- indicator buffers mapping
EventSetMillisecondTimer(iTimer);
Draw();
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void OnTimer()
{
if(ShowLabelReDraw)
{
ulong star =
GetMicrosecondCount();
Draw();
if(GetMicrosecondCount()-star>10000)
OutText("Redraw","Re Draw",
(int)ChartGetInteger(0,CHART_WIDTH_IN_PIXELS,0)/2,
(int)ChartGetInteger(0,CHART_HEIGHT_IN_PIXELS,0)/2,
clrTomato,23);
else
ObjectDelete(0,"Redraw");
}
else
Draw();
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int DrawHigh[], DrawLow[], DrawT[];
int IndexS[];
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void Draw()
{
double H[], L[], F[];
long V[];
int FVB = ChartFirstVisibleBar(), VB = ChartVisibleBars(), vB = FVB - VB, iArraySize = ArraySize(DrawHigh);
bool ReDraw = false;
if(iArraySize == 0)
ReDraw = true;
else
for(int i = 0; i < iArraySize; i ++)
{
int h,l,t;
ChartTimePriceToXY(0,0,Time[IndexS[i]],High[IndexS[i]],t,h);
ChartTimePriceToXY(0,0,Time[IndexS[i]],Low[IndexS[i]],t,l);
if((DrawHigh[i] != h || DrawLow[i] != l || t != DrawT[i]) && IndexS[i] != 0)
{
ReDraw = true;
break;
}
}
if(ReDraw)
{
ObjectsDeleteAll(0,"RectLabel");
ArrayFree(DrawT);
ArrayFree(DrawHigh);
ArrayFree(DrawLow);
ArrayFree(IndexS);
}
ulong star = GetMicrosecondCount(), ulong_ = iTimer*800;
int indexS = -1;
for(int index = vB; index <= FVB; index ++)
{
if(ulong_ < GetMicrosecondCount() - star)
return;
indexS++;
int x, y, w;
if(index < 0 ||
(indexS < ArraySize(DrawHigh) && index!=0)||
CopyTickVolume(_Symbol, PERIOD_M1, Time[index], Time[index] + PeriodSeconds() - 1, V) <= 0 ||
CopyHigh(_Symbol, PERIOD_M1, Time[index], Time[index] + PeriodSeconds() - 1, H) <= 0 ||
CopyLow(_Symbol, PERIOD_M1, Time[index], Time[index] + PeriodSeconds() - 1, L) <= 0)
continue;
ArrayFree(F);
ArrayResize(F,(int)((High[index]-Low[index])/Point)+1);
iArraySize = ArraySize(V);
int Size = ArraySize(F);
for(int j = 0; j < iArraySize; j ++)
{
int E = (int)
((L[j]-Low[index])/Point);
if(H[j]!=L[j])
{
double tmp = (H[j]-L[j])/Point, g = V[j]/tmp;
for(int k = 0; k < (int)tmp; k++)
{
if(E + k < Size && E + k >= 0)
F[E + k] += g;
}
}
else
F[E] += (double)V[j];
}
ChartTimePriceToXY(0,0,Time[index],High[index],x,y);
ChartTimePriceToXY(0,0,Time[index+1],High[index],w,y);
double MaxV = F[ArrayMaximum(F)];
if(MaxV<1)
continue;
MaxV = MathAbs(w-x) / MaxV;
iArraySize = ArraySize(F);
double PrevSumm = 0, SummValue = 0;
if(Color == C2)
for(int j = 0; j < iArraySize; j ++)
SummValue+=F[j];
for(int j = 0; j < iArraySize; j ++)
{
ChartTimePriceToXY(0, 0, Time[index], Low[index] + Point * j, x, y);
string name = "RectLabel" + IntegerToString(index) + "_" + IntegerToString(j);
ObjectCreate(name,OBJ_RECTANGLE_LABEL,0,0,0);
ObjectSetInteger(0,name,OBJPROP_XDISTANCE,x);
ObjectSetInteger(0,name,OBJPROP_YDISTANCE,y-3);
ObjectSetInteger(0,name,OBJPROP_XSIZE,(int)(MaxV * F[j]));
ObjectSetInteger(0,name,OBJPROP_YSIZE,3);
switch(Color)
{
case C1:
ObjectSetInteger(0,name,OBJPROP_BGCOLOR,MainClr);
break;
case C2:
PrevSumm += F[j];
if(PrevSumm / SummValue < 0.025f || PrevSumm / SummValue > 0.975f)
ObjectSetInteger(0,name,OBJPROP_BGCOLOR,Rate2);
else
{
if(PrevSumm / SummValue < 0.16f || PrevSumm / SummValue > 0.84f)
ObjectSetInteger(0,name,OBJPROP_BGCOLOR,Rate1);
else
ObjectSetInteger(0,name,OBJPROP_BGCOLOR,MainClr);
}
break;
case C3:
if(F[j]<RateDiv1)
{
ObjectSetInteger(0,name,OBJPROP_BGCOLOR,Rate3);
break;
}
if(F[j]<RateDiv2)
{
ObjectSetInteger(0,name,OBJPROP_BGCOLOR,Rate2);
break;
}
if(F[j]<RateDiv3)
{
ObjectSetInteger(0,name,OBJPROP_BGCOLOR,Rate1);
break;
}
ObjectSetInteger(0,name,OBJPROP_BGCOLOR,MainClr);
break;
}
ObjectSetInteger(0,name,OBJPROP_WIDTH,0);
ObjectSetInteger(0,name,OBJPROP_BACK,bUp);
}
ArrayResize(DrawHigh,ArraySize(DrawHigh)+1);
ArrayResize(DrawLow,ArraySize(DrawLow)+1);
ArrayResize(IndexS,ArraySize(IndexS)+1);
ArrayResize(DrawT,ArraySize(DrawT)+1);
ChartTimePriceToXY(0,0,Time[index],High[index],y,x);
ChartTimePriceToXY(0,0,Time[index],Low[index],y,w);
DrawT[ArraySize(DrawT)-1]=y;
DrawHigh[ArraySize(DrawHigh)-1]=x;
DrawLow[ArraySize(DrawLow)-1]=w;
IndexS[ArraySize(IndexS)-1]=index;
}
}
//+------------------------------------------------------------------+
//| 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[])
{
//--- return value of prev_calculated for next call
return(rates_total);
}
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
EventKillTimer();
ObjectsDeleteAll(0);
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| Функция получает номер первого видимого бара на графике. |
//| Индексация как в таймсерии, последние бары имеют меньшие индексы.|
//+------------------------------------------------------------------+
int ChartFirstVisibleBar(const long chart_ID=0)
{
//--- подготовим переменную для получения значения свойства
long result=-1;
//--- сбросим значение ошибки
ResetLastError();
//--- получим значение свойства
if(!ChartGetInteger(chart_ID,CHART_FIRST_VISIBLE_BAR,0,result))
{
//--- выведем сообщение об ошибке в журнал "Эксперты"
Print(__FUNCTION__+", Error Code = ",GetLastError());
}
//--- вернем значение свойства графика
return((int)result);
}
//+------------------------------------------------------------------+
//| Функция получает количество баров, которые отображаются (видимы )|
//| в окне графика. |
//+------------------------------------------------------------------+
int ChartVisibleBars(const long chart_ID=0)
{
//--- подготовим переменную для получения значения свойства
long result=-1;
//--- сбросим значение ошибки
ResetLastError();
//--- получим значение свойства
if(!ChartGetInteger(chart_ID,CHART_VISIBLE_BARS,0,result))
{
//--- выведем сообщение об ошибке в журнал "Эксперты"
Print(__FUNCTION__+", Error Code = ",GetLastError());
}
//--- вернем значение свойства графика
return((int)result);
}
//+------------------------------------------------------------------+
bool OutText(const string name="Label", // имя метки
const string text="Label", // текст
const int x=0, // координата по оси X
const int y=0, // координата по оси Y
const color clr=clrYellow, // цвет
const int font_size=12, // размер шрифта
const ENUM_BASE_CORNER corner=CORNER_LEFT_UPPER, // угол графика для привязки
const ENUM_ANCHOR_POINT anchor=ANCHOR_CENTER, // способ привязки
const string font="Arial", // шрифт
const double angle=0.0, // наклон текста
const bool back=false, // на заднем плане
const bool selection=false, // выделить для перемещений
const bool hidden=true, // скрыт в списке объектов
const long z_order=0,
const int sub_window=0, // номер подокна
const long chart_ID=0 // ID графика
) // приоритет на нажатие мышью
{
//--- сбросим значение ошибки
ResetLastError();
//--- создадим текстовую метку
if(ObjectFind(chart_ID,name)==-1)
{
if(!ObjectCreate(chart_ID,name,OBJ_LABEL,sub_window,0,0))
{
Print(__FUNCTION__, ": не удалось создать текстовую метку! Код ошибки = ",GetLastError());
// return(false);
}
}
//--- установим координаты метки
ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,x);
ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,y);
//--- установим угол графика, относительно которого будут определяться координаты точки
ObjectSetInteger(chart_ID,name,OBJPROP_CORNER,corner);
//--- установим текст
ObjectSetString(chart_ID,name,OBJPROP_TEXT,text);
//--- установим шрифт текста
ObjectSetString(chart_ID,name,OBJPROP_FONT,font);
//--- установим размер шрифта
ObjectSetInteger(chart_ID,name,OBJPROP_FONTSIZE,font_size);
//--- установим угол наклона текста
ObjectSetDouble(chart_ID,name,OBJPROP_ANGLE,angle);
//--- установим способ привязки
ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,anchor);
//--- установим цвет
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- отобразим на переднем (false) или заднем (true) плане
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- включим (true) или отключим (false) режим перемещения метки мышью
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- установим приоритет на получение события нажатия мыши на графике
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
const long &lparam,
const double &dparam,
const string &sparam)
{
//---
if(id==CHARTEVENT_KEYDOWN)
{
if((int)lparam==StringGetChar(KeyRoll,0))
{
switch(Color)
{
case C1:
Color = C2;
break;
case C2:
Color = C3;
break;
case C3:
Color = C1;
break;
};
ArrayFree(DrawT);
ArrayFree(DrawHigh);
ArrayFree(DrawLow);
ArrayFree(IndexS);
}
if((int)lparam==StringGetChar(KeyTop,0))
{
bUp=!bUp;
ArrayFree(DrawT);
ArrayFree(DrawHigh);
ArrayFree(DrawLow);
ArrayFree(IndexS);
}
if((int)lparam==StringGetChar(KeyFix,0))
{
bool tmp;
ChartScaleFix11Get(tmp);
ChartScaleFix11Set(!tmp);
ArrayFree(DrawT);
ArrayFree(DrawHigh);
ArrayFree(DrawLow);
ArrayFree(IndexS);
}
}
}
//+------------------------------------------------------------------+
bool ChartScaleFix11Get(bool &result,const long chart_ID=0)
{
//--- подготовим переменную для получения значения свойства
long value;
//--- сбросим значение ошибки
ResetLastError();
//--- получим значение свойства
if(!ChartGetInteger(chart_ID,CHART_SCALEFIX,0,value))
{
//--- выведем сообщение об ошибке в журнал "Эксперты"
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- запомним в переменную значение свойства графика
result=value;
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Функция включает/выключает режим масштаба "1:1" |
//+------------------------------------------------------------------+
bool ChartScaleFix11Set(const bool value,const long chart_ID=0)
{
//--- сбросим значение ошибки
ResetLastError();
//--- установим значение свойства
if(!ChartSetInteger(chart_ID,CHART_SCALEFIX,0,value))
{
//--- выведем сообщение об ошибке в журнал "Эксперты"
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
Attached Image