0
Views
0
Downloads
0
Favorites
dayextremumzones
//+------------------------------------------------------------------+
//| DayExtremumZones.mq5 |
//| Tapochun |
//| https://login.mql5.com/ru/users/tapochun |
//+------------------------------------------------------------------+
#property copyright "Tapochun"
#property link "https://login.mql5.com/ru/users/tapochun"
#property version "1.01"
#property indicator_chart_window
#property description "Èíäèêàòîð îòîáðàæàåò çîíû ìàêñèìóìîâ è ìèíèìóìîâ äíÿ â ïðîöåíòàõ îò äíåâíîãî äâèæåíèÿ."
#property description "Èñïîëüçóåò èíäèêàòîð DailySize https://www.mql5.com/ru/code/13323"
#property indicator_plots 2
#property indicator_buffers 4
//+------------------------------------------------------------------+
//| Ãëîáàëüíûå ïåðåìåííûå |
//+------------------------------------------------------------------+
double bufW[]; // Çíà÷åíèÿ ìàêñèìóìîâ äíåâíîãî äèàïàçîíà
double bufX[]; // Ãðàíèöà çîíû ìàêñèìóìîâ/çíà÷åíèÿ ìèíèìóìîâ äíåâíîãî äèàïàçîíà
double bufY[]; // Çíà÷åíèÿ ìèíèìóìîâ äíåâíîãî äèàïàçîíà
double bufZ[]; // Ãðàíèöà çîíû ìèíèìóìîâ
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
enum ENUM_DW_TYPE // Ïåðå÷èñëåíèå - äîñòóïíûå òèïû îòðèñîâêè
{
FILLING, // Çàëèâêà
HISTOGRAM2, // Ãèñòîãðàììà
LINE, // Ëèíèè
ARROW, // Ñòðåëêè
NONE // Íå îòðèñîâûâàåòñÿ
};
int globHandle; // Õýíäë èíäèêàòîðà äíåâíûõ äèàïàçîíîâ (DailySize)
//+------------------------------------------------------------------+
//| Âõîäíûå ïàðàìåòðû |
//+------------------------------------------------------------------+
input int inpUpZonePct = 15; // Ðàçìåð çîíû ìàêñèìóìîâ, % îò äíåâíîãî äâèæåíèÿ [0..50]
input int inpDnZonePct = 15; // Ðàçìåð çîíû ìèíèìóìîâ, % îò äíåâíîãî äâèæåíèÿ [0..50]
input ENUM_DW_TYPE inpDrawType=ARROW; // Òèï îòðèñîâêè
input bool inpDrawInternalZone= true; // Îòîáðàæàòü âíóòðåííþþ çîíó (äëÿ òèïîâ "Ëèíèÿ"/"Ñòðåëêè"/"Íå îòðèñîâûâàåòñÿ")
input bool inpShowData = false; // Îòîáðàæàòü çíà÷åíèÿ èíäèêàòîðà â îêíå äàííûõ
sinput string d1 = ""; // Îáùèå íàñòðîéêè îòðèñîâêè
input int inpUpWidth = 1; // Òîëùèíà îòðèñîâêè çîíû ìàêñèìóìîâ
input int inpDnWidth = 1; // Òîëùèíà îòðèñîâêè çîíû ìèíèìóìîâ
input color inpUpColor= clrLightBlue; // Öâåò îòðèñîâêè çîíû ìàêñèìóìîâ
input color inpDnColor = clrSpringGreen; // Öâåò îòðèñîâêè çîíû ìèíèìóìîâ
sinput string d2 = ""; // Íàñòðîéêè îòðèñîâêè òèïà "Ëèíèÿ"/"Ãèñòîãðàììà"
input ENUM_LINE_STYLE inpUpStyle = STYLE_DOT; // Ñòèëü ëèíèè/çîíû ìàêñèìóìîâ
input ENUM_LINE_STYLE inpDnStyle = STYLE_DOT; // Ñòèëü ëèíèè/çîíû ìèíèìóìîâ
sinput string d3 = ""; // Íàñòðîéêè îòðèñîâêè òèïà "Ñòðåëêè"
input int inpUpArrowCode = 158; // Êîä ñòðåëîê çîíû ìàêñèìóìîâ (äëÿ òèïà "Ñòðåëêè")
input int inpDnArrowCode = 158; // Êîä ñòðåëîê çîíû ìèíèìóìîâ (äëÿ òèïà "Ñòðåëêè")
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- Ïðîâåðêà ïðàâèëüíîñòè âõîäíûõ ïàðàìåòðîâ
if(inpUpZonePct<0 || inpUpZonePct>50 ||
inpDnZonePct<0 || inpDnZonePct>50)
{
Print(__FILE__,": ÎØÈÁÊÀ! Ðàçìåð çîí äîëæåí íàõîäèòüñÿ â äèàïàçîíå îò 0 äî 50%. Ïðîâåðüòå âõîäíûå ïàðàìåòðû!");
return( INIT_PARAMETERS_INCORRECT );
}
//---
if(_Period>PERIOD_H2)
{
Print(__FILE__,": ÎØÈÁÊÀ! Èíäèêàòîð ïðåäíàçíà÷åí äëÿ ðàáîòû íà ÒÔ íå âûøå H2!");
return( INIT_PARAMETERS_INCORRECT );
}
//---
if(( inpDrawType==FILLING || inpDrawType==HISTOGRAM2) &&
(inpUpZonePct==0 || inpDnZonePct==0))
{
Print(__FILE__,": ÎØÈÁÊÀ! Îòðèñîâêà ñòèëåì 'Çàëèâêà' èëè 'Ãèñòîãðàììà' äîñòóïíà òîëüêî ïðè ðàçìåðàõ çîí > 0. Ïðîâåðüòå âõîäíûå ïàðàìåòðû!");
return( INIT_PARAMETERS_INCORRECT );
}
//--- Èíèöèàëèçèðóåì èíäèêàòîðíûå áóôåðû
SetIndexBuffer(0,bufW,INDICATOR_DATA);
SetIndexBuffer(1,bufX,INDICATOR_DATA);
//---
SetIndexBuffer(2,bufY,INDICATOR_DATA);
SetIndexBuffer(3,bufZ,INDICATOR_DATA);
//--- Óñòàíàâëèâàåì ïàðàìåòðû îòðèñîâêè
switch(inpDrawType)
{
case FILLING:
PlotIndexSetInteger(0,PLOT_DRAW_TYPE,DRAW_FILLING);
PlotIndexSetInteger(1,PLOT_DRAW_TYPE,DRAW_FILLING);
//---
PlotIndexSetString(0,PLOT_LABEL,"dez: up;dez: upZone");
PlotIndexSetString(1,PLOT_LABEL,"dez: dn;dez: dnZone");
//---
PlotIndexSetInteger(0,PLOT_COLOR_INDEXES,2);
PlotIndexSetInteger(1,PLOT_COLOR_INDEXES,2);
//---
PlotIndexSetInteger(0,PLOT_LINE_COLOR,0,inpUpColor);
PlotIndexSetInteger(0,PLOT_LINE_COLOR,1,inpUpColor);
//---
PlotIndexSetInteger(1,PLOT_LINE_COLOR,0,inpDnColor);
PlotIndexSetInteger(1,PLOT_LINE_COLOR,1,inpDnColor);
break;
case HISTOGRAM2:
PlotIndexSetInteger(0,PLOT_DRAW_TYPE,DRAW_HISTOGRAM2);
PlotIndexSetInteger(1,PLOT_DRAW_TYPE,DRAW_HISTOGRAM2);
//---
PlotIndexSetString(0,PLOT_LABEL,"dez: up;dez: upZone");
PlotIndexSetString(1,PLOT_LABEL,"dez: dn;dez: dnZone");
//---
PlotIndexSetInteger(0,PLOT_LINE_STYLE,inpUpStyle);
PlotIndexSetInteger(1,PLOT_LINE_STYLE,inpDnStyle);
break;
case LINE:
PlotIndexSetInteger(0,PLOT_DRAW_TYPE,DRAW_LINE);
PlotIndexSetInteger(1,PLOT_DRAW_TYPE,DRAW_LINE);
//---
PlotIndexSetInteger(0,PLOT_LINE_STYLE,inpUpStyle);
PlotIndexSetInteger(1,PLOT_LINE_STYLE,inpDnStyle);
//---
PlotIndexSetString(0,PLOT_LABEL,"dez: up");
PlotIndexSetString(1,PLOT_LABEL,"dez: dn");
//---
PlotIndexSetInteger(0,PLOT_LINE_COLOR,inpUpColor);
PlotIndexSetInteger(1,PLOT_LINE_COLOR,inpDnColor);
break;
case ARROW:
PlotIndexSetInteger(0,PLOT_DRAW_TYPE,DRAW_ARROW);
PlotIndexSetInteger(1,PLOT_DRAW_TYPE,DRAW_ARROW);
//---
PlotIndexSetInteger(0,PLOT_ARROW,inpUpArrowCode);
PlotIndexSetInteger(1,PLOT_ARROW,inpDnArrowCode);
//---
PlotIndexSetString(0,PLOT_LABEL,"dez: up");
PlotIndexSetString(1,PLOT_LABEL,"dez: dn");
//---
PlotIndexSetInteger(0,PLOT_LINE_COLOR,inpUpColor);
PlotIndexSetInteger(1,PLOT_LINE_COLOR,inpDnColor);
break;
case NONE:
PlotIndexSetInteger(0,PLOT_DRAW_TYPE,DRAW_NONE);
PlotIndexSetInteger(1,PLOT_DRAW_TYPE,DRAW_NONE);
//---
PlotIndexSetString(0,PLOT_LABEL,"dez: up");
PlotIndexSetString(1,PLOT_LABEL,"dez: dn");
break;
default:
Print(__FUNCTION__,": ÎØÈÁÊÀ! Íåèçâåñòíûé òèï îòðèñîâêè: "+EnumToString(inpDrawType));
return( INIT_FAILED );
}
//--- Óñòàíàâëèâàåì òîëùèíó
PlotIndexSetInteger(0,PLOT_LINE_WIDTH,inpUpWidth);
PlotIndexSetInteger(1,PLOT_LINE_WIDTH,inpDnWidth);
//--- Óñòàíàâëèâàåì ïóñòûå çíà÷åíèÿ áóôåðîâ
PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,EMPTY_VALUE);
PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,EMPTY_VALUE);
//--- Óñòàíàâëèâàåì òî÷íîñòü çíà÷åíèé èíäèêàòîðà
IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
//--- Óñòàíàâëèâàåì âèäèìîñòü çíà÷åíèé â îêíå äàííûõ
PlotIndexSetInteger(0,PLOT_SHOW_DATA,inpShowData);
PlotIndexSetInteger(1,PLOT_SHOW_DATA,inpShowData);
//--- Ïîëó÷àåì õýíäëû èñïîëüçóåìûõ èíäèêàòîðîâ
bool answer=InitializeIndicatorHandle(globHandle);
if( !answer ) return( INIT_FAILED );
//---
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[])
{
//--- Ïðîâåðêà íàëè÷èÿ äàííûõ
if( rates_total <= 0 ) return( 0 );
//---
static int dNum; // Íîìåð ïðîâåðÿåìîãî äíÿ
static double dHigh = 0.0; // Ìàêñèìóì äíÿ
static double dLow = DBL_MAX; // Ìèíèìóì äíÿ
//---
bool answer; // Îòâåò ôóíêöèè ïîëó÷åíèÿ äàííûõ
int firstBar = rates_total-2; // Íîìåð ïåðâîãî àíàëèçèðóåìîãî áàðà
int firstInd = 0; // Íîìåð ïåðâîãî ýëåìåíòà â ìàññèâå çíà÷åíèé èíäèêàòîðà
double sizes[]; // Ìàññèâ - ïðèåìíèê ðàçìåðîâ äíåâíûõ äèàïàçîíîâ
//---
if(prev_calculated!=0) // Åñëè íå ïåðâûé çàïóñê
{
if(rates_total>prev_calculated) // Åñëè îáðàçîâàëàñü íîâàÿ ñâå÷à
{
//--- Èíèöèàëèçèðóåì èíäèêàòîðíûå áóôåðû íà÷àëüíûìè çíà÷åíèÿìè
const int n=rates_total-1; // Îáíóëÿåìûé èíäåêñ ìàññèâà
bufW[ n ] = EMPTY_VALUE;
bufX[ n ] = EMPTY_VALUE;
bufY[ n ] = EMPTY_VALUE;
bufZ[ n ] = EMPTY_VALUE;
//--- Ïîëó÷àåì äàííûå ïî èíäèêàòîðó ðàçìåðîâ äíåâíîãî äèàïàçîíà
answer=GetIndicatorData(globHandle,0,1,1,sizes,"DailySize");
if( !answer ) return( prev_calculated );
}
else return(prev_calculated); // Åñëè íå îáðàçîâàëàñü - âûõîäèì
}
else // Åñëè ïåðâûé çàïóñê
{
//--- Èíèöèàëèçèðóåì èíäèêàòîðíûå áóôåðû íà÷àëüíûìè çíà÷åíèÿìè
ArrayInitialize(bufW,EMPTY_VALUE);
ArrayInitialize(bufX,EMPTY_VALUE);
ArrayInitialize(bufY,EMPTY_VALUE);
ArrayInitialize(bufZ,EMPTY_VALUE);
//--- Îïðåäåëÿåì íîìåð áàðà ïåðâîãî ïîëíîñòüþ äîñòóïíîãî äíÿ
firstBar=GetFirstBar(time,rates_total,dNum);
if( firstBar == 0 ) return( prev_calculated );
//--- Ïåðâûé àíàëèçèðóåìûé ýëåìåíò â ìàññèâå äàííûõ èíäèêàòîðà äíåâíûõ äèàïàçîíîâ
firstInd=firstBar;
//--- Ïîëó÷àåì äàííûå ïî èíäèêàòîðó ðàçìåðîâ äíåâíîãî äèàïàçîíà
answer=GetIndicatorData(globHandle,0,0,rates_total,sizes,"DailySize");
if( !answer ) return( prev_calculated );
}
//---
int iNum; // Íîìåð äíÿ íà i áàðå
for(int i=firstBar,j=firstInd; i<rates_total-1; i++,j++)
{
iNum=GetDayNumber(time[i]); // Ïîëó÷àåì íîìåð äíÿ íà i áàðå
if(dNum!=iNum) // Åñëè ñ÷èòàåòñÿ íîâûé äåíü
{
//--- Ñáðàñûâàåì ïàðàìåòðû äíÿ
dNum = iNum; // Çàïîìèíàåì íîâûé íîìåð ïðîâåðÿåìîãî äíÿ
dHigh = high[ i ]; // Çàïîìèíàåì ìàêñèìóì i ñâå÷è
dLow= low[ i ]; // Çàïîìèíàåì ìèíèìóì i ñâå÷è
}
else // Åñëè ñ÷èòàåòñÿ òåêóùèé äåíü
{
//--- Ïðîâåðÿåì îáðàçîâàíèå íîâîãî ìèíèìóìà/ìàêñèìóìà äíÿ
if( high[ i ] > dHigh ) // Åñëè ìàêñèìóì íà i ñâå÷å áîëüøå ñîõðàíåííîãî
dHigh = high[ i ]; // Çàïîìèíàåì íîâîå çíà÷åíèå ìàêñèìóìà òåêóùåãî äíÿ
if( low[ i ] < dLow ) // Åñëè ìèíèìóì íà i ñâå÷å ìåíüøå ñîõðàíåííîãî
dLow = low[ i ]; // Çàïîìèíàåì íîâîå çíà÷åíèå ìèíèìóìà òåêóùåãî äíÿ
}
//---
switch(inpDrawType) // Â çàâèñèìîñòè îò òèïà îòðèñîâêè
{
case FILLING: // Òèï - çàëèâêà
case HISTOGRAM2: // Òèï - ãèñòîãðàììà
bufW[i]=dHigh; // Çíà÷åíèå ìàêñèìóìà
bufX[i]=bufW[i]-sizes[j]*inpUpZonePct/100*_Point; // Çíà÷åíèå çîíû ìàêñèìóìà
//---
bufY[ i ] = dLow; // Çíà÷åíèå ìèíèìóìà
bufZ[ i ] = bufY[ i ] + sizes[ j ]*inpDnZonePct/100*_Point; // Çíà÷åíèå çîíû ìèíèìóìà
break;
case LINE: // Òèï - ëèíèÿ
case ARROW: // Òèï - ñòðåëêè
case NONE: // Òèï - áåç îòîáðàæåíèÿ
if(inpDrawInternalZone) // Åñëè óñòàíîâëåíà íàñòðîéêà îòîáðàæåíèÿ âíóòðåííåé çîíû
{
bufW[ i ]= dHigh-sizes[ j ]*inpUpZonePct/100*_Point; // Çíà÷åíèå çîíû ìàêñèìóìà
bufX[ i ] = dLow+sizes[ j ]*inpDnZonePct/100*_Point; // Çíà÷åíèå çîíû ìèíèìóìà
}
else // Åñëè íàñòðîéêà íå óñòàíîâëåíà
{
bufW[ i ]= dHigh; // Çíà÷åíèå ìàêñèìóìà
bufX[ i ] = dLow; // Çíà÷åíèå ìèíèìóìà
}
break;
default:
Print(__FUNCTION__,": ÎØÈÁÊÀ! Íåèçâåñòíûé òèï îòðèñîâêè: "+EnumToString(inpDrawType));
return( rates_total );
}
}
//---
return( rates_total );
}
//+------------------------------------------------------------------+
//| Ïîëó÷àåì äàííûå èíäèêàòîðíîãî áóôåðà |
//+------------------------------------------------------------------+
bool GetIndicatorData(const int handle, // Õýíäë èíäèêàòîðà
const int bufferNum, // Íîìåð áóôåðà äëÿ êîïèðîâàíèÿ
const int startPos, // Ñòàðòîâàÿ ïîçèöèÿ äëÿ êîïèðîâàíèÿ
const int count, // Ñêîëüêî ýëåìåíòîâ êîïèðóåì
double &array[], // Ìàññèâ ïðèåìíèê (out)
string strIndName = "" // Èìÿ èíäèêàòîðà (äëÿ ñîîáùåíèÿ îá îøèáêå)
)
{
int num=CopyBuffer(handle,bufferNum,startPos,count,array); // Êîïèðóåì äàííûå
if(num==-1) // Åñëè ïðîèçîøëà îøèáêà êîïèðîâàíèÿ
{
Print(__FUNCTION__,": ÎØÈÁÊÀ #",GetLastError(),". Äàííûå èíäèêàòîðà "+strIndName+" íå ïîëó÷åíû. Ñêîïèðîâàíî ýëåìåíòîâ: ",num);
return(false); // Âîçâðàùàåì ëîæü
}
return(true); // Åñëè äàííûå ñêîïèðîâàíû - âîçâðàùàåì èñòèíó
}
//+------------------------------------------------------------------+
//| Ïîëó÷àåì íîìåð ïåðâîãî áàðà ïîëíîñòüþ äîñòóïíîãî äíÿ |
//+------------------------------------------------------------------+
int GetFirstBar(const datetime &time[], // Ìàññèâ âðåìåí îòêðûòèÿ áàðîâ ïî òåêóùåìó ÒÔ
const int rates_total, // Êîëè÷åñòâî ïðîñ÷èòàííûõ áàðîâ
int &dayNum // Íîìåð ïðîâåðÿåìîãî äíÿ (out)
)
{
int prev = GetDayNumber( time[ 0 ] ); // Íîìåð äíÿ íà ïðåäûäóùåì áàðå
int curr; // Íîìåð äíÿ íà òåêóùåì áàðå
for(int i=1; i<rates_total; i++) // Öèêë ïî ïðîñ÷èòàííûõ áàðàì
{
curr = GetDayNumber( time[ i ] ); // Îïðåäåëÿåì íîìåð äíÿ íà òåêóùåì áàðå
if( curr == prev) continue; // Åñëè íîìåðà ñîâïàäàþþò - ïåðåõîäèì ê ñëåä. áàðó
else // Åñëè íîìåðà íå ñîâïàäàþò
{
dayNum = curr; // Çàïîìèíàåì íîìåð ïåðâîãî ïðîâåðÿåìîãî äíÿ
return( i ); // Âîçâðàùàåì íîìåð áàðà ïåðâîãî ïîëíîãî äíÿ
}
}
//---
Print(__FUNCTION__,": Îæèäàåì áîëüøå äàííûõ..");
return(0); // Âîçâðàùàåì 0
}
//+------------------------------------------------------------------+
//| Îïðåäåëÿåì íîìåð äíÿ ïî âðåìåíè áàðà |
//+------------------------------------------------------------------+
int GetDayNumber(const datetime time) // Âðåìÿ áàðà
{
MqlDateTime tStr; // Ñòðóêòóðà âðåìåíè
TimeToStruct( time, tStr ); // Âðåìÿ â ñòðóêòóðó
return( tStr.day ); // Âîçâðàùàåì íîìåð òåêóùåãî äíÿ
}
//+------------------------------------------------------------------+
//| Èíèöèàëèçèðóåì õýíäë èíäèêàòîðà äíåâíûõ äèàïàçîíîâ |
//+------------------------------------------------------------------+
bool InitializeIndicatorHandle(int &handle) // Õýíäë èíäèêàòîðà (out)
{
handle=iCustom(_Symbol,_Period,"DailySize"); // Ïîïûòêà ïîëó÷åíèÿ õýíäëà..
if(handle==INVALID_HANDLE) // Åñëè õýíäë íå ïîëó÷åí
{
Print(__FUNCTION__,": ÎØÈÁÊÀ #",_LastError,". Õýíäë èíäèêàòîðà DailySize íå ïîëó÷åí!");
return(false); // Âûõîäèì ñ îøèáêîé
}
else return(true); // Åñëè õýíäë ïîëó÷åí - âîçâðàùàåì èñòèíó
}
//+------------------------------------------------------------------+
Comments
Markdown Formatting Guide
# H1
## H2
### H3
**bold text**
*italicized text*
[title](https://www.example.com)

`code`
```
code block
```
> blockquote
- Item 1
- Item 2
1. First item
2. Second item
---