Author: Tapochun
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 supported. Formatting help

Markdown Formatting Guide

Element Markdown Syntax
Heading # H1
## H2
### H3
Bold **bold text**
Italic *italicized text*
Link [title](https://www.example.com)
Image ![alt text](image.jpg)
Code `code`
Code Block ```
code block
```
Quote > blockquote
Unordered List - Item 1
- Item 2
Ordered List 1. First item
2. Second item
Horizontal Rule ---