Price Data Components
Miscellaneous
0
Views
0
Downloads
0
Favorites
iPeriodClose_
//+------------------------------------------------------------------+
//| iPeriodClose.mq4 |
//| Copyright © 2010, komposter |
//| http://www.komposter.me |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2010, komposter"
#property link "SEVER11"
//Äëÿ êîððåêòíîé ðàáîòû èíäèêàòîðà ïàðàìåòðû êîíöà ïðîìåæóòêîâ íåîáõîäèìî óêàçûâàòü â àìåðèêàíñêîì ôîðìàòå:
//" ãîä, êâàðòàë - ÌÌ.ÄÄ ××:00 (íàïðèìåð, 12.31 23:00, òî åñòü 31 äåêàáðÿ 23:00);
//" ÷àñ - ××:00;
//" åñëè îãðàíè÷åíèÿ íå óêàçûâàòü (îñòàâèòü ïîëå ïóñòûì), ñîâåòíèê áóäåò ðàáîòàòü êàê ðàíüøå.
//Ó÷òèòå, ÷òî äëÿ óêàçàííîãî âðåìåíè, ñêàæåì 31 äåêàáðÿ 23:00, ñ÷èòàåòñÿ, ÷òî çàêðûòèå ïåðèîäà íàñòóïàåò 31 äåêàáðÿ â 22:59:59.
//Ñðàçó îãîâîðþñü íàñ÷åò îãðàíè÷åíèé íîâîé âåðñèè.
//Ïðåäûäóùàÿ âåðñèÿ èíäèêàòîðà èñïîëüçîâàëà ïîñëåäíåå èçâåñòíîå âðåìÿ ïåðèîäà âíå çàâèñèìîñòè îò òîãî, íà êàêîì òô îíà áûëà çàïóùåíà, òåêóùàÿ âåðñèÿ íàõîäèò êîíåö ïåðèîäà àíàëîãè÷íûì îáðàçîì, íî îáðåçàåò åãî ïî óêàçàííîìó â íàñòðîéêàõ âðåìåíè, èñïîëüçóÿ äàííûå ÷àñîâûõ ñâå÷åé. Ýòî ñäåëàíî äëÿ òîãî, ÷òîáû ïîëó÷èòü òî÷íîå âðåìÿ çàêðûòèÿ.
//Ïðîáëåìà çàêëþ÷àåòñÿ â òîì, ÷òî ÷àñîâîé èñòîðèè ìîæåò áûòü íåäîñòàòî÷íî. Äëÿ ãîäà åå ñêîðåå âñåãî âîîáùå íå õâàòèò (òàêèì îáðàçîì ãîä íå áóäåò îòîáðàæåí) èëè æå õâàòèò ìàêñèìóì íà ïåðåõîä 2008-2009, 2009-2010. Àíàëîãè÷íàÿ ïðîáëåìà âîçíèêàåò è ñ äàííûìè ïî êâàðòàëàì. Íà äíåâíûõ áàðàõ èñòîðèè îùóòèìî áîëüøå, íî ãðàôèê òîæå ìîæåò áûòü îãðàíè÷åí.
#property indicator_chart_window
#property indicator_buffers 6
#property indicator_color1 Red
#property indicator_color2 Magenta
#property indicator_color3 Yellow
#property indicator_color4 Lime
#property indicator_color5 LemonChiffon
#property indicator_color6 DodgerBlue
#property indicator_style1 STYLE_SOLID
#property indicator_style2 STYLE_SOLID
#property indicator_style3 STYLE_SOLID
#property indicator_style4 STYLE_SOLID
#property indicator_style5 STYLE_SOLID
#property indicator_style6 STYLE_SOLID
#property indicator_width1 2
#property indicator_width2 2
#property indicator_width3 2
#property indicator_width4 2
#property indicator_width5 2
#property indicator_width6 2
//--íàñòðîéêè èíäèêàòîðà.
extern bool AllowAlert = true;
extern int IndexSize = 8;
extern string YEAR = "----YEAR----";
extern bool _Year = false; //--true - ðèñîâàòü ëèíèþ íà ãðàôèêå, false - íåò.
extern string _YEnds = "12.31 18:00"; //--óêàçûâàòü â ôîðìàòå MM.YY HH:00
extern color YColor = Red;
extern int YWidth = 2;
extern int YStyle = STYLE_SOLID;
extern string QUARTER = "----QUARTER----";
extern bool _Quarter = false;
extern string _QI = "03.30 23:00"; //--óêàçûâàòü â ôîðìàòå MM.YY HH:00
extern string _QII = "06.29 23:00"; //--óêàçûâàòü â ôîðìàòå MM.YY HH:00
extern string _QIII = "09.29 23:00"; //--óêàçûâàòü â ôîðìàòå MM.YY HH:00
extern string _QIV = "12.30 23:00"; //--óêàçûâàòü â ôîðìàòå MM.YY HH:00
extern color QColor = Magenta;
extern int QWidth = 2;
extern int QStyle = STYLE_SOLID;
extern string MONTH = "----MONTH----";
extern bool _Month = false;
extern color MColor = Yellow;
extern int MWidth = 2;
extern int MStyle = STYLE_SOLID;
extern string WEEK = "----WEEK----";
extern bool _Week = false;
extern color WColor = Lime;
extern int WWidth = 2;
extern int WStyle = STYLE_SOLID;
extern string DAY = "----DAY----";
extern bool _Day = true;
extern string _DEnds = "24:00"; //--óêàçûâàòü â ôîðìàòå HH:00
extern color DColor = LemonChiffon;
extern int DWidth = 2;
extern int DStyle = STYLE_SOLID;
extern string HOUR = "----HOUR----";
extern bool _Hour = false;
extern color HColor = DodgerBlue;
extern int HWidth = 2;
extern int HStyle = STYLE_SOLID;
//--îáùèå ïåðåìåííûå
string symbol = "";
int period = 0;
datetime counted_bar = 0;
string prefix = "!!#@_";
datetime YLS, QLS, MLS, WLS, DLS, HLS;
//--áóôåðû èíäèêàòîðà äëÿ îòîáðàæåíèÿ
double Y []; //--ãîä.
double Q []; //--êâàðòàë.
double M []; //--ìåñÿö.
double W []; //--íåäåëÿ.
double D []; //--äåíü.
double H []; //--÷àñ.
int init()
{
symbol = Symbol(); //--òåêóùàÿ âàëþòíàÿ ïàðà (ñèìâîë ãðàôèêà).
period = Period(); //--ðàáî÷èé ïåðèîä.
//--êàê ñóäíî íàçîâåòå, òàê îíî è ïîïëûâåò.
IndicatorShortName( "iPeriodClose" );
SetIndexBuffer ( 0, Y );
SetIndexEmptyValue( 0, 0.0 );
SetIndexLabel ( 0, "Ãîä" );
SetIndexEmptyValue( 0, 0.0 );
SetIndexStyle ( 0, DRAW_SECTION, YStyle, YWidth, YColor );
SetIndexBuffer ( 1, Q );
SetIndexEmptyValue( 1, 0.0 );
SetIndexLabel ( 1, "Êâàðòàë" );
SetIndexEmptyValue( 1, 0.0 );
SetIndexStyle ( 1, DRAW_SECTION, QStyle, QWidth, QColor );
SetIndexBuffer ( 2, M );
SetIndexEmptyValue( 2, 0.0 );
SetIndexLabel ( 2, "Ìåñÿö" );
SetIndexEmptyValue( 2, 0.0 );
SetIndexStyle ( 2, DRAW_SECTION, MStyle, MWidth, MColor );
SetIndexBuffer ( 3, W );
SetIndexEmptyValue( 3, 0.0 );
SetIndexLabel ( 3, "Íåäåëÿ" );
SetIndexEmptyValue( 3, 0.0 );
SetIndexStyle ( 3, DRAW_SECTION, WStyle, WWidth, WColor );
SetIndexBuffer ( 4, D );
SetIndexEmptyValue( 4, 0.0 );
SetIndexLabel ( 4, "Äåíü" );
SetIndexEmptyValue( 4, 0.0 );
SetIndexStyle ( 4, DRAW_SECTION, DStyle, DWidth, DColor );
SetIndexBuffer ( 5, H );
SetIndexEmptyValue( 5, 0.0 );
SetIndexLabel ( 5, "×àñ" );
SetIndexEmptyValue( 5, 0.0 );
SetIndexStyle ( 5, DRAW_SECTION, HStyle, HWidth, HColor );
counted_bar = 0;
return(0);
}
int deinit()
{
obj_delete();
return(0);
}
int start()
{
if ( AllowAlert )
{
//--ïðîâåðÿåì ïðîáèòèå íà êàæäîì òèêå
if ( _Year && Y[0] > Point ) { YLS = CheckCross( Y, YLS, "ãîäîâîé" ); }
if ( _Quarter && Q[0] > Point ) { QLS = CheckCross( Q, QLS, "êâàðòàëüíûé" ); }
if ( _Month && M[0] > Point ) { MLS = CheckCross( M, MLS, "ìåñÿ÷íûé" ); }
if ( _Week && W[0] > Point ) { WLS = CheckCross( W, WLS, "íåäåëüíûé" ); }
if ( _Day && D[0] > Point ) { DLS = CheckCross( D, DLS, "äíåâíîé" ); }
if ( _Hour && H[0] > Point ) { HLS = CheckCross( H, HLS, "÷àñîâîé" ); }
}
//--èíäèêàòîð ðàáîòàåò îäèí ðàç â áàð
if ( iTime( symbol, period, 0 ) <= counted_bar ) { return(0); }
counted_bar = iTime( symbol, period, 0 );
//--íà âñåõ áàðàõ â òåêóùåì îêíå
int bars = iBars( symbol, period ) - 1;
//--ïåðåìåííûå âðåìåíè
datetime time_prev,
time_next;
//--öåíà çàêðûòèÿ ïåðèîäà
double close_price, changed_close_price;
int indx;
//--ñáðîñèì ìàññèâû
ArrayInitialize( Y, 0.0 );
ArrayInitialize( Q, 0.0 );
ArrayInitialize( M, 0.0 );
ArrayInitialize( W, 0.0 );
ArrayInitialize( D, 0.0 );
ArrayInitialize( H, 0.0 );
//--ïðîñìîòðèì âñå áàðû è îòìåòèì ÷òî?/ãäå?/êîãäà?
for ( int i = 0; i < bars; i ++ )
{
indx = 0;
time_prev = iTime ( symbol, period, i ); //--âðåìÿ áàðà, êîòîðûé àíàëèçèðóåì
time_next = iTime ( symbol, period, i + 1 ); //--âðåìÿ áàðà íà îäèí äàëüøå â èñòîðèè
close_price = iClose( symbol, period, i + 1 ); //--öåíà çàêðûòèÿ
changed_close_price = 0;
//--Ãîä.
//--Åñëè ãîä òåêóùåé ñâå÷è íå ðàâåí ãîäó ïðåäûäóùåé,
//--çíà÷èò íàñòàë íîâûé ãîä è íîâûé êâàðòàë.
if ( TimeYear(time_prev) != TimeYear(time_next) )
{
if ( _Year )
{
//--åñëè âðåìÿ íå óêàçàíî, ðàáîòàåì ïî ñòàðîé ñõåìå
if ( _YEnds == "" ) { Y[i+1] = close_price; }
else
{
indx = ReturnCandleIndex( PERIOD_H1, StrToTime( DoubleToStr( TimeYear(time_next), 0 ) + "." + _YEnds ) );
if ( indx >= 0 )
{
changed_close_price = iClose( symbol, PERIOD_H1, indx );
indx = ReturnCandleIndex( period, StrToTime( DoubleToStr( TimeYear(time_next), 0 ) + "." + _YEnds ) );
if ( indx >= 0 ) { Y[indx] = changed_close_price; }
}
}
}
if ( _Quarter )
{
if ( _QI == "" || _QII == "" || _QIII == "" || _QIV == "" ) { Q[i+1] = close_price; }
else
{
indx = ReturnCandleIndex( PERIOD_H1, StrToTime( DoubleToStr( TimeYear(time_next), 0 ) + "." + _QIV ) );
if ( indx >= 0 )
{
changed_close_price = iClose( symbol, PERIOD_H1, indx );
indx = ReturnCandleIndex( period, StrToTime( DoubleToStr( TimeYear(time_next), 0 ) + "." + _QIV ) );
if ( indx >= 0 ) { Q[indx] = changed_close_price; }
}
}
}
}
//--Êâàðòàë.
if ( _Quarter )
{
if ( TimeMonth(time_prev) > 3 && TimeMonth(time_next) <= 3 )
{
if ( _QI == "" || _QII == "" || _QIII == "" || _QIV == "" ) { Q[i+1] = close_price; }
else
{
indx = ReturnCandleIndex( PERIOD_H1, StrToTime( DoubleToStr( TimeYear(time_next), 0 ) + "." + _QI ) );
if ( indx >= 0 )
{
changed_close_price = iClose( symbol, PERIOD_H1, indx );
indx = ReturnCandleIndex( period, StrToTime( DoubleToStr( TimeYear(time_next), 0 ) + "." + _QI ) );
if ( indx >= 0 ) { Q[indx] = changed_close_price; }
}
}
}
if ( TimeMonth(time_prev) > 6 && TimeMonth(time_next) <= 6 )
{
if ( _QI == "" || _QII == "" || _QIII == "" || _QIV == "" ) { Q[i+1] = close_price; }
else
{
indx = ReturnCandleIndex( PERIOD_H1, StrToTime( DoubleToStr( TimeYear(time_next), 0 ) + "." + _QII ) );
if ( indx >= 0 )
{
changed_close_price = iClose( symbol, PERIOD_H1, indx );
indx = ReturnCandleIndex( period, StrToTime( DoubleToStr( TimeYear(time_next), 0 ) + "." + _QII ) );
if ( indx >= 0 ) { Q[indx] = changed_close_price; }
}
}
}
if ( TimeMonth(time_prev) > 9 && TimeMonth(time_next) <= 9 )
{
if ( _QI == "" || _QII == "" || _QIII == "" || _QIV == "" ) { Q[i+1] = close_price; }
else
{
indx = ReturnCandleIndex( PERIOD_H1, StrToTime( DoubleToStr( TimeYear(time_next), 0 ) + "." + _QIII ) );
if ( indx >= 0 )
{
changed_close_price = iClose( symbol, PERIOD_H1, indx );
indx = ReturnCandleIndex( period, StrToTime( DoubleToStr( TimeYear(time_next), 0 ) + "." + _QIII ) );
if ( indx >= 0 ) { Q[indx] = changed_close_price; }
}
}
}
}
//--Ìåñÿö.
if ( _Month ) { if ( TimeMonth(time_prev) != TimeMonth(time_next) ) { M[i+1] = close_price; } }
//--Íåäåëÿ.
if ( _Week && period <= PERIOD_W1 )
{
if ( TimeDayOfWeek(time_prev) < TimeDayOfWeek(time_next) ) { W[i+1] = close_price; }
else { if ( time_prev - time_next >= PERIOD_D1*420 ) { W[i+1] = close_price; } }
}
//--Äåíü.
if ( _Day && period <= PERIOD_D1 )
{
if ( TimeDay(time_prev) != TimeDay(time_next) )
{
//--åñëè êîíåö äíÿ íå óêàçàí èëè óêàçàí êàê ïîëíî÷ü, ðàáîòàåì ïî ñòàðîé ñõåìå
if ( _DEnds == "" || _DEnds == "00:00" ) { D[i+1] = close_price; }
else
{
//--èíà÷å íàõîäèì èíäåêñ ÷àñîâîãî áàðà ñ íóæíûì âðåìåíåì
indx = ReturnCandleIndex( PERIOD_H1, StrToTime( TimeToStr( time_prev, TIME_DATE ) + " " + _DEnds ) );
//--åñëè òàêîé ñóùåñòâóåò
if ( indx >= 0 )
{
//--çàïîìèíàåì åãî öåíó çàêðûòèÿ
changed_close_price = iClose( symbol, PERIOD_H1, indx );
//--íàõîäèì èíäåêñ áàðà íà òåêùåì ãðàôèêå ñ íóæíûì âðåìåíåì
indx = ReturnCandleIndex( period, StrToTime( TimeToStr( time_prev, TIME_DATE ) + " " + _DEnds ) );
//--åñëè ýòîò áàð âèäèìûé, ðèñóåì
if ( indx >= 0 ) { D[indx] = changed_close_price; }
}
}
}
}
//--×àñ.
if ( _Hour && period <= PERIOD_H1 ) { if ( TimeHour(time_prev) != TimeHour(time_next) ) { H[i+1] = close_price; } }
}
//--ðèñóåì ïðîãíîçû
if ( _Year )
{
Y[0] = getPrice( Y );
if ( Y[0] > Point ) { DrawLineIndex( "Y1", "Y1", Y[0], iTime( symbol, period, 0 ) + period*60, YColor ); }
}
if ( _Quarter )
{
Q[0] = getPrice( Q );
if ( Q[0] > Point ) { DrawLineIndex( "Q1", "Q1", Q[0], iTime( symbol, period, 0 ) + period*60, QColor ); }
}
if ( _Month )
{
M[0] = getPrice( M );
if ( M[0] > Point ) { DrawLineIndex( "MN1", "MN1", M[0], iTime( symbol, period, 0 ) + period*60, MColor ); }
}
if ( _Week && period <= PERIOD_W1 )
{
W[0] = getPrice( W );
if ( W[0] > Point ) { DrawLineIndex( "W1", "W1", W[0], iTime( symbol, period, 0 ) + period*60, WColor ); }
}
if ( _Day && period <= PERIOD_D1 )
{
D[0] = getPrice( D );
if ( D[0] > Point ) { DrawLineIndex( "D1", "D1", D[0], iTime( symbol, period, 0 ) + period*60, DColor ); }
}
if ( _Hour && period <= PERIOD_H1 )
{
H[0] = getPrice( H );
if ( H[0] > Point ) { DrawLineIndex( "H1", "H1", H[0], iTime( symbol, period, 0 ) + period*60, HColor ); }
}
return(0);
}
double getPrice( double array[], datetime time = 0 )
{
double X[2];
datetime Y[2];
double res = 0;
double k, b;
X[0] = 0;
X[1] = 0;
Y[0] = 0;
Y[1] = 0;
int index = 1;
while ( array[index] < Point/2.0 )
{
index ++;
if ( index > Bars - 1 ) { return(0); }
}
X[0] = array[index];
Y[0] = iTime( symbol, period, index );
index ++;
while ( array[index] < Point/2.0 )
{
index ++;
if ( index > Bars - 1 ) { return(0); }
}
X[1] = array[index];
Y[1] = iTime( symbol, period, index );
if ( time < 1 ) { time = iTime( symbol, period, 0 ); }
//y = kx + b
k = X[0] - X[1];
k = k / (Y[0] - Y[1]);
b = NormalizeDouble( k*Y[0], 8 );
b = X[0] - b;
res = k*time + b;
return(NormalizeDouble(res, Digits));
}
datetime CheckCross( double array[], datetime last_signal, string str )
{
double curO = iOpen( symbol, period, 0 );
double curH = iHigh( symbol, period, 0 );
double curL = iLow ( symbol, period, 0 );
if ( curO - array[0] > Point/2.0 && array[0] - curL > Point/2.0 )
{
if ( last_signal < iTime( symbol, period, 0 ) )
{
Alert( Symbol(), ": öåíà ïåðåñåêëà ", str, " òðåíä âíèç!" );
return( iTime( symbol, period, 0 ) );
}
return(last_signal);
}
if ( array[0] - curO > Point/2.0 && curH - array[0] > Point/2.0 )
{
if ( last_signal < iTime( symbol, period, 0 ) )
{
Alert( Symbol(), ": öåíà ïåðåñåêëà ", str, " òðåíä ââåðõ!" );
return( iTime( symbol, period, 0 ) );
}
return(last_signal);
}
}
void DrawLineIndex( string name, string text, double price, datetime time, color clr )
{
if ( IndexSize < 1 )
{
obj_delete();
return;
}
name = prefix + name + "_indxlabel";
bool success = false;
if ( ObjectFind(name) < 0 ) { success = ObjectCreate( name, OBJ_TEXT, 0, time, price ); }
else { success = true; }
if ( success )
{
ObjectSet( name, OBJPROP_TIME1, time );
ObjectSet( name, OBJPROP_PRICE1, price );
ObjectSetText( name, text, IndexSize, "Arial", clr );
WindowRedraw();
}
}
void obj_delete()
{
int total = ObjectsTotal() - 1;
string name = "";
for ( int i = total; i >= 0; i -- )
{
name = ObjectName(i);
if ( ObjectFind(name) < 0 ) { continue; }
if ( StringFind( name, prefix ) >= 0 ) { ObjectDelete(name); }
}
}
int ReturnCandleIndex( int PERIOD, datetime date )
{
int bar_index = iBarShift( symbol, PERIOD, date );
int total_bars = iBars( symbol, PERIOD ) - 1;
if ( bar_index >= total_bars || bar_index < 0 ) { return(-1); }
while ( iTime( symbol, PERIOD, bar_index ) >= date )
{
bar_index ++;
if ( bar_index >= total_bars ) { return(-1); }
}
return(bar_index);
}
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
---