0
Views
0
Downloads
0
Favorites
DailyRange
//+------------------------------------------------------------------+
//| DailyRange.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_minimum 0
#property indicator_plots 1
#property indicator_buffers 1
#property indicator_type1 DRAW_HISTOGRAM
#property indicator_color1 clrRed
#property indicator_label1 "DailyRange"
//+------------------------------------------------------------------+
//| Ãëîáàëüíûå ïåðåìåííûå |
//+------------------------------------------------------------------+
double bufRange[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
// Âûïîëíÿåì ïðîâåðêó äîïóñòèìîãî ÒÔ
bool answer = CheckTimeframe();
if( !answer ) return( INIT_PARAMETERS_INCORRECT );
// Ïðèñâàèâàåì èíäåêñ èíäèêàòîðíîìó áóôåðó
SetIndexBuffer( 0, bufRange );
// Óñòàíàâëèâàåì òî÷íîñòü çíà÷åíèé èíäèêàòîðà
IndicatorSetInteger( INDICATOR_DIGITS, 0 );
// Óñòàíàâëèâàåì íà÷àëüíûå çíà÷åíèÿ èíäèêàòîðíîãî áóôåðà
PlotIndexSetDouble( 0, PLOT_EMPTY_VALUE, 0.0 );
//--- Áóôåð - íå òàéìñåðèÿ
ArraySetAsSeries( bufRange, false );
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 );
//--- Óñòàíàâêà èíäåêñàöèè ìàññèâîâ
ArraySetAsSeries( time, false );
ArraySetAsSeries( high, false );
ArraySetAsSeries( low, false );
static int dNum; // Íîìåð ïðîâåðÿåìîãî äíÿ
static double dHigh = 0.0; // Ìàêñèìóì ïðîâåðÿåìîãî äíÿ
static double dLow = DBL_MAX;// Ìèíèìóì ïðîâåðÿåìîãî äíÿ
if( prev_calculated != 0 ) // Åñëè íå ïåðâûé ðàñ÷åò
{
// Ðàññ÷èòûâàåì èíäèêàòîð íà ïåðâîé ñâå÷å
Calculation( rates_total-1, dNum, dHigh, dLow, rates_total, time, high, low );
}
else // Åñëè ïåðâûé ðàñ÷åò èíäèêàòîðà
{
// Èíèöèàëèçèðóåì èíäèêàòîðíûé áóôåð íà÷àëüíûìè çíà÷åíèÿìè
ArrayInitialize( bufRange, 0.0 );
// Îïðåäåëÿåì íîìåð áàðà ïåðâîãî ïîëíîñòüþ äîñòóïíîãî äíÿ
int firstBar = GetFirstBar( time, rates_total, dNum );
if( firstBar == 0 ) return( 0 );
// Ðàññ÷èòûâàåì èíäèêàòîð ñ áàðà firstBar
Calculation( firstBar, dNum, dHigh, dLow, rates_total, time, high, low );
}
return( rates_total );
}
//+------------------------------------------------------------------+
//| Ïðîâåðêà äîïóñòèìîñòè ðàçìåðà ÒÔ |
//+------------------------------------------------------------------+
bool CheckTimeframe()
{
if( _Period > PERIOD_D1 ) // Åñëè òåêóùèé ÒÔ áîëüøå Ä1
{
Print( __FUNCTION__,": Èíäèêàòîð ïðåäíàçíà÷åí äëÿ çàïóñêà íà ÒÔ äî D1. Óìåíüøèòå ÒÔ!" );
return( false ); // Âûõîäèì ñ îøèáêîé
}
else 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 ); // Âîçâðàùàåì íîìåð òåêóùåãî äíÿ
}
//+------------------------------------------------------------------+
//| Ôóíêöèÿ ðàñ÷åòà èíäèêàòîðà |
//+------------------------------------------------------------------+
void Calculation( const int firstBar, // Íîìåð ïåðâîãî áàðà äëÿ ðàñ÷åòà
int &dNum, // Íîìåð ïðîâåðÿåìîãî äíÿ (out)
double &dHigh, // Ìàêñèìóì ïðîâåðÿåìîãî äíÿ (out)
double &dLow, // Ìèíèìóì ïðîâåðÿåìîãî äíÿ (out)
const int rates_total, // Êîëè÷åñòâî ïðîñ÷èòàííûõ áàðîâ
const datetime &time[], // Ìàññèâ âðåìåí îòêðûòèÿ ïðîñ÷èòàííûõ áàðîâ
const double &high[], // Ìàññèâ ìàêñèìóìîâ ïðîñ÷èòàííûõ áàðîâ
const double &low[] // Ìàññèâ ìèíèìóìîâ ïðîñ÷èòàííûõ áàðîâ
)
{
int iNum; // Íîìåð äíÿ íà i áàðå
for( int i = firstBar; i < rates_total && !IsStopped(); i++ ) // Öèêë ñôîðìèðîâàííûì áàðàì
{
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 ]; // Çàïîìèíàåì íîâîå çíà÷åíèå ìèíèìóìà òåêóùåãî äíÿ
}
// Ðàññ÷èòûâàåì çíà÷åíèå èíäèêàòîðà - ðàçíîñòü ìàêñèìóìà è ìèíèìóìà òåêóùåãî äíÿ
bufRange[ i ] = MathRound( ( dHigh - dLow )/_Point );
}
}
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
---