0
Views
0
Downloads
0
Favorites
candlesizes
//+------------------------------------------------------------------+
//| ÑandleSizes.mq5 |
//| Tapochun |
//| https://login.mql5.com/ru/users/tapochun |
//+------------------------------------------------------------------+
#property copyright "Tapochun"
#property link "https://login.mql5.com/ru/users/tapochun"
#property version "1.00"
#property indicator_separate_window
//---
#property indicator_plots 2
#property indicator_buffers 3
#property indicator_minimum 0
//---
#property indicator_type1 DRAW_COLOR_HISTOGRAM
#property indicator_label1 "CandleSize"
//---
#property indicator_type2 DRAW_LINE
#property indicator_label2 "csAverage"
//+------------------------------------------------------------------+
//| Ãëîáàëüíûå ïåðåìåííûå |
//+------------------------------------------------------------------+
double bufSize[]; // Áóôåð çíà÷åíèé
double bufSizeClr[]; // Áóôåð öâåòà
double bufAverage[]; // Áóôåð ñðåäíèõ çíà÷åíèé
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
enum ENUM_CONSTRUCTION_TYPE // Òèï ïîñòðîåíèÿ
{
upper_shadows, // Âåðõíèå òåíè
lower_shadows, // Íèæíèå òåíè
bodies // Òåëà
};
//+------------------------------------------------------------------+
//| Âõîäíûå ïàðàìåòðû |
//+------------------------------------------------------------------+
input ENUM_CONSTRUCTION_TYPE inpType = upper_shadows; // Òèï ïîñòðîåíèÿ èíäèêàòîðà
input color inpClr = clrLime; // Öâåò ïîñòðîåíèÿ
input color inpNeutralClr=clrGray; // Íåéòðàëüíûé öâåò
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- ÒÔ ä.á. íå áîëüøå Í2
if(_Period>PERIOD_H2) // Åñëè ÒÔ > Í2
{
Print(__FUNCTION__,": ÂÍÈÌÀÍÈÅ! Èíäèêàòîð ïðåäíàçíà÷åí äëÿ ðàáîòû íà ÒÔ íèæå Í2");
return(INIT_FAILED); // Âûõîäèì ñ îøèáêîé
}
//--- Óñòàíàâëèâàåì ïàðàìåòðû èíäèêàòîðà
SetIndicatorParameters(inpType,inpClr,inpNeutralClr);
//---
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 int dCount = 0; // Êîëè÷åñòâî îáðàçîâàííûõ ñâå÷åé çà òåêóùèé äåíü
static int dSum=0; // Ñóììà ñîîòâåòñòâóþùèõ ðàçìåðîâ ñâå÷åé çà òåêóùèé äåíü
//---
if(prev_calculated!=0) // Åñëè íå ïåðâûé çàïóñê
{
int n; // Íîìåð ïðîâåðÿåìîé ñâå÷è
if(rates_total>prev_calculated) // Åñëè îáðàçîâàëñÿ íîâûé áàð
{
//--- Ñáðàñûâàåì çíà÷åíèå íà íóëåâîì áàðå
bufSize[rates_total-1]=0.0;
bufAverage[rates_total-1]=bufAverage[rates_total-2];
//---
n=rates_total-2; // Íîìåð ñôîðìèðîâàííîé ñâå÷è
//--- Ðàñ÷åò èíäèêàòîðà íà ñôîðìèðîâàâøåéñÿ ñâå÷å
Calculation_bar(inpType,n,dCount,dSum,time,high,low,open,close);
//--- Ïðîâåðÿåì îáðàçîâàíèå íîâîãî äíÿ
CheckNewDay(time[n+1],dNum,dCount,dSum);
}
else // Åñëè òåêóùèé áàð
{
n=rates_total-1; // Íîìåð òåêóùåé ñâå÷è
//--- Ðàññ÷èòûâàåì èíäèêàòîð íà òåêóùåé ñâå÷å
Calculation(inpType,n,dCount+1,dSum,time[n],high[n],low[n],open[n],close[n]);
}
}
else // Åñëè ïåðâûé çàïóñê
{
//--- Èíèöèàëèçèðóåì èíäèêàòîðíûå áóôåðû íà÷àëüíûìè çíà÷åíèÿìè
ArrayInitialize(bufSize,0.0);
ArrayInitialize(bufAverage,0.0);
//--- Îïðåäåëÿåì íîìåð áàðà ïåðâîãî ïîëíîñòüþ äîñòóïíîãî äíÿ
int first = GetFirstBar( time, rates_total, dNum );
if( first == 0 ) return( 0 );
//--- Ðàñ÷åò èíäèêàòîðà íà èñòîðèè
for(int i=first; i<rates_total-1; i++)
{
//--- Ðàñ÷åò çíà÷åíèé (ïî áàðàì)
Calculation_bar(inpType,i,dCount,dSum,time,high,low,open,close);
//--- Ïðîâåðÿåì îáðàçîâàíèå íîâîãî äíÿ
CheckNewDay(time[i+1],dNum,dCount,dSum);
}
}
//---
return( rates_total );
}
//+------------------------------------------------------------------+
//| Îïðåäåëÿåì òèï ñâå÷è |
//+------------------------------------------------------------------+
int GetCandleType(const double open, // Öåíà îòêðûòèÿ ñâå÷è
const double close) // Öåíà çàêðûòèÿ ñâå÷è
{
if( open > close ) return( 1 ); // Åñëè öåíà îòêðûòèÿ âûøå öåíû çàêðûòèÿ - íèñõîäÿùàÿ
else return( 0 ); // Åñëè íàîáîðîò - âîñõîäÿùàÿ
}
//+------------------------------------------------------------------+
//| Óñòàíàâëèâàåì ïàðàìåòðû èíäèêàòîðà |
//+------------------------------------------------------------------+
bool SetIndicatorParameters(const ENUM_CONSTRUCTION_TYPE type, // Òèï ïîñòðîåíèÿ
const color clr, // Öâåò ýëåìåíòîâ
const color neutralClr) // Íåéòðàëüíûé öâåò
{
//--- Ïðèñâàèâàåì èíäåêñû èíäèêàòîðíûì áóôåðàì
SetIndexBuffer(0,bufSize);
SetIndexBuffer(1,bufSizeClr,INDICATOR_COLOR_INDEX);
SetIndexBuffer(2,bufAverage);
//--- Óñòàíàâëèâàåì òî÷íîñòü çíà÷åíèé èíäèêàòîðà
IndicatorSetInteger(INDICATOR_DIGITS,0);
//--- Óñòàíàâëèâàåì ïóñòûå çíà÷åíèÿ ãðàôè÷åñêèõ ñåðèé
PlotIndexSetDouble( 0, PLOT_EMPTY_VALUE, EMPTY_VALUE ); // Ãèñòîãðàììû
PlotIndexSetDouble( 1, PLOT_EMPTY_VALUE, EMPTY_VALUE ); // Ñðåäíåé ëèíèè
//--- Óñòàíàâëèâàåì öâåòà èíäèêàòîðà
PlotIndexSetInteger( 0, PLOT_COLOR_INDEXES, 2 ); // Êîëè÷åñòâî öâåòîâ ãèñòîãðàììû
PlotIndexSetInteger( 0, PLOT_LINE_COLOR, 0, neutralClr ); // Öâåò íåéòðàëüíîãî ñòîëáöà
PlotIndexSetInteger( 0, PLOT_LINE_COLOR, 1, clr ); // Öâåò ïðåâûøàþùåãî ñòîëáöà
PlotIndexSetInteger( 1, PLOT_LINE_COLOR, 0, clr ); // Öâåò ñðåäíåé ëèíèè
//--- Óñòàíàâëèâàåì èìÿ â ïîäîêíå
string name="CandleSizes ("+GetConstructionStringType(type)+")";
IndicatorSetString(INDICATOR_SHORTNAME,name);
//---
return( true );
}
//+------------------------------------------------------------------+
//| Ïîëó÷àåì ñòðîêîâûé òèï ïîñòðîåíèÿ èíäèêàòîðà |
//+------------------------------------------------------------------+
string GetConstructionStringType(const ENUM_CONSTRUCTION_TYPE type) // Òèï ïîñòðîåíèÿ
{
switch(type)
{
case upper_shadows: return( "upper" );
case lower_shadows: return( "lower" );
case bodies: return( "bodies" );
default:
Print(__FUNCTION__,": ÎØÈÁÊÀ! Íåèçâåñòíûé òèï ïîñòðîåíèÿ "+EnumToString(type));
return( "" );
}
}
//+------------------------------------------------------------------+
//| Ïîëó÷àåì íîìåð ïåðâîãî áàðà ïîëíîñòüþ äîñòóïíîãî äíÿ |
//+------------------------------------------------------------------+
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); // Âîçâðàùàåì íîìåð òåêóùåãî äíÿ
}
//+------------------------------------------------------------------+
//| Ôóíêöèÿ ðàñ÷åòà èíäèêàòîðà íà òåêóùåé ñâå÷å |
//+------------------------------------------------------------------+
void Calculation(const ENUM_CONSTRUCTION_TYPE type, // Òèï ïîñòðîåíèÿ
const int num, // Íîìåð òåêóùåãî áàðà
const int dCount, // Êîëè÷åñòâî îáðàçîâàâøèõñÿ áàðîâ çà äåíü (ñ ó÷åòîì òåêóùåãî)
const int dSum, // Ñóììà ñîîòâåòñòâóþùèõ çíà÷åíèé çà äåíü (íà ïðåäûäóùåì áàðå)
const datetime time, // Ìàññèâ âðåìåí îòêðûòèÿ ïðîñ÷èòàííûõ áàðîâ
const double high, // Ìàññèâ ìàêñèìóìîâ ïðîñ÷èòàííûõ áàðîâ
const double low, // Ìàññèâ ìèíèìóìîâ ïðîñ÷èòàííûõ áàðîâ
const double open, // Ìàññèâ öåí îòêðûòèÿ
const double close) // Ìàññèâ öåí çàêðûòèÿ
{
//--- Îïðåäåëÿåì ðàçìåð ýëåìåíòà íà òåêóùåì áàðå
int cdlType = GetCandleType( open, close ); // Òèï òåêóùåé ñâå÷è
int size = GetElementSize( type, cdlType, open, high, low, close ); // Ðàçìåð ýëåìåíòà
if( size == 0 ) return;
//--- Çàïîìèíàåì ïàðàìåòðû â áóôåð
bufSize[ num ] = size; // Ðàçìåð
bufSizeClr[ num ] = 0; // Öâåò
//--- Îïðåäåëÿåì ñðåäíåå çíà÷åíèå çà äåíü
bufAverage[num]=int(MathRound(( dSum+size)/dCount));
//--- Ïðîâåðÿåì ïðåâûøåíèå ðàçìåðà ýëåìåíòà ñðåäíåå çíà÷åíèå íà òåêóùåì áàðå
if(bufSize[num]>bufAverage[num]) // Åñëè çíà÷åíèå ïðåâûøåíî
bufSizeClr[num]=1; // Ìåíÿåì öâåò ñòîëáèêà ãèñòîãðàììû
}
//+------------------------------------------------------------------+
//| Ðàñ÷åò çíà÷åíèé èíäèêàòîðà íà íîâîé ñâå÷å |
//+------------------------------------------------------------------+
void Calculation_bar(const ENUM_CONSTRUCTION_TYPE type, // Òèï ïîñòðîåíèÿ
const int num, // Íîìåð ñôîðìèðîâàííîãî
int &dCount, // Êîëè÷åñòâî ñôîðìèðîâàííûõ áàðîâ çà äåíü (out)
int &dSum, // Ñóììà ñîîòâåòñòâóþùèõ çíà÷åíèé çà äåíü (out)
const datetime &time[], // Ìàññèâ âðåìåí îòêðûòèÿ ïðîñ÷èòàííûõ áàðîâ
const double &high[], // Ìàññèâ ìàêñèìóìîâ ïðîñ÷èòàííûõ áàðîâ
const double &low[], // Ìàññèâ ìèíèìóìîâ ïðîñ÷èòàííûõ áàðîâ
const double &open[], // Ìàññèâ öåí îòêðûòèÿ
const double &close[]) // Ìàññèâ öåí çàêðûòèÿ
{
//--- Óâåëè÷èâàåì ñ÷åò÷èê ñôîðìèðîâàííûõ áàðîâ
dCount++;
//--- Îïðåäåëÿåì ðàçìåð íà ïðåäûäóùåé ñâå÷å
int cdlType = GetCandleType( open[ num ],close[ num ] ); // Òèï ïðåäûäóùåé ñâå÷è
int size = GetElementSize( type, cdlType, open[ num ], high[ num ], low[ num ], close[ num ] ); // Ðàçìåð ýëåìåíòà
if( size == -1 ) return;
//--- Äîáàâëÿåì ðàçìåð ê ñóììå
dSum+=size;
//--- Îáíîâëÿåì çíà÷åíèå ñòîëáöà ãèñòîãðàììû
bufSize[num]=size;
//--- Îáíîâëÿåì ñðåäíåå çíà÷åíèå
bufAverage[num]=int(MathRound(dSum/dCount));
//--- Ïðîâåðêà ðàçìåðà ýëåìåíòà òåíè
if(bufSize[num]>bufAverage[num]) // Åñëè ýëåìåíò áîëüøå ñðåäíåãî çíà÷åíèÿ
bufSizeClr[num]=1; // Ïîäñâåòêà ñòîëáöà ãèñòîãðàììû
else // Åñëè çíà÷åíèå íå áîëüøå ñðåäíåãî
bufSizeClr[num]=0; // Ñòîëáåö áåç ïîäñâåòêè
}
//+------------------------------------------------------------------+
//| Ïîëó÷àåì ðàçìåð ýëåìåíòà òèïà type |
//+------------------------------------------------------------------+
int GetElementSize(const ENUM_CONSTRUCTION_TYPE type, // Òèï ïîñòðîåíèÿ
const int cdlType, // Òèï ñâå÷è
const double open, // Öåíà îòêðûòèÿ
const double high, // Öåíà ìàêñèìóìà
const double low, // Öåíà ìèíèìóìà
const double close) // Öåíà çàêðûòèÿ
{
switch(type) // Â çàâèñèìîñòè îò òèïà ïîñòðîåíèÿ
{
case upper_shadows: // Âåðõíèå òåíè
if( cdlType == 0 ) return( int( NormalizeDouble( high - close, _Digits )/_Point ) ); // Âîñõîäÿùàÿ ñâå÷à
else return( int( NormalizeDouble( high - open, _Digits )/_Point ) ); // Íèñõîäÿùàÿ ñâå÷à
break;
case lower_shadows: // Íèæíèå òåíè
if( cdlType == 0 ) return( int( NormalizeDouble( open - low, _Digits )/_Point ) ); // Âîñõîäÿùàÿ ñâå÷à
else return( int( NormalizeDouble( close - low, _Digits )/_Point ) ); // Íèñõîäÿùàÿ ñâå÷à
break;
case bodies: // Òåëà ñâå÷åé
if( cdlType == 0 ) return( int( NormalizeDouble( close - open, _Digits )/_Point ) ); // Âîñõîäÿùàÿ ñâå÷à
else return( int( NormalizeDouble( open - close, _Digits )/_Point ) ); // Íèñõîäÿùàÿ ñâå÷à
break;
default: // Íåèçâåñòíûé òèï
Print(__FUNCTION__,": ÎØÈÁÊÀ! Íåèçâåñòíûé òèï ïîñòðîåíèÿ: "+EnumToString(type));
return(-1); // Âûõîä ñ îøèáêîé
}
}
//+------------------------------------------------------------------+
//| Ôóíêöèÿ ïðîâåðêè îáðàçîâàíèÿ íîâîãî äíÿ + ñáðîñ ñòàòè÷. ïàðàì-â |
//+------------------------------------------------------------------+
void CheckNewDay(const datetime time, // Âðåìÿ îòêðûòèÿ áàðà
int &dNum, // Íîìåð ïðîâåðÿåìîãî äíÿ (out)
int &dCount, // Êîëè÷åñòâî îáðàçîâàííûõ ñâå÷åé çà òåêóùèé äåíü (out)
int &dSum) // Ñóììà ñîîòâåòñòâóþùèõ ðàçìåðîâ ñâå÷åé çà òåêóùèé äåíü (out)
{
int currDayNum=GetDayNumber(time); // Íîìåð òåêóùåãî äíÿ
if(currDayNum!=dNum) // Åñëè íîìåð íå ñîâïàäàåò ñ ñîõðàíåííûì
{
//--- Ñáðàñûâàåì ïàðàìåòðû ñòàòè÷åñêèõ ïåðåìåííûõ
dNum= currDayNum; // Íîìåð äíÿ
dCount = 0; // Êîëè÷åñòâî áàðîâ òåêóùåãî äíÿ
dSum= 0; // Ñóììà çíà÷åíèé íà ñôîðìèðîâàâøèõñÿ áàðàõ
}
}
//+------------------------------------------------------------------+
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
---