//+------------------------------------------------------------------+
//| HL_Average.mq5 |
//| Copyright © 2007, KCBT |
//| http://www.kcbt.ru/forum/index.php? |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, KCBT"
#property link "http://www.kcbt.ru/forum/index.php?"
//---- íîìåð âåðñèè èíäèêàòîðà
#property version "2.00"
#property description "Ëèíèè ñîïðîòèâëåíèé è ïîääåðæêè ïî ôèêñèðîâàííîìó òàéìôðåéìó"
//---- îòðèñîâêà èíäèêàòîðà â ãëàâíîì îêíå
#property indicator_chart_window
//---- êîëè÷åñòâî èíäèêàòîðíûõ áóôåðîâ 7
#property indicator_buffers 7
//---- èñïîëüçîâàíî âñåãî ïÿòü ãðàôè÷åñêèõ ïîñòðîåíèé
#property indicator_plots 5
//+----------------------------------------------+
//| Îáúÿâëåíèå êîíñòàíò |
//+----------------------------------------------+
#define RESET 0 // êîíñòàíòà äëÿ âîçâðàòà òåðìèíàëó êîìàíäû íà ïåðåñ÷åò èíäèêàòîðà
//+----------------------------------------------+
//| Ïàðàìåòðû îòðèñîâêè èíäèêàòîðà 1 |
//+----------------------------------------------+
//---- îòðèñîâêà èíäèêàòîðà 1 â âèäå ëèíèè
#property indicator_type1 DRAW_LINE
//---- â êà÷åñòâå öâåòà èíäèêàòîðà èñïîëüçîâàí
#property indicator_color1 clrLimeGreen
//---- òîëùèíà ëèíèè èíäèêàòîðà 1 ðàâíà 2
#property indicator_width1 2
//---- îòîáðàæåíèå ìåòêè èíäèêàòîðà
#property indicator_label1 "HL Up"
//+----------------------------------------------+
//| Ïàðàìåòðû îòðèñîâêè èíäèêàòîðà 2 |
//+----------------------------------------------+
//---- îòðèñîâêà èíäèêàòîðà 2 â âèäå ëèíèè
#property indicator_type2 DRAW_LINE
//---- â êà÷åñòâå öâåòà èíäèêàòîðà èñïîëüçîâàí
#property indicator_color2 clrDodgerBlue
//---- òîëùèíà ëèíèè èíäèêàòîðà 2 ðàâíà 2
#property indicator_width2 2
//---- îòîáðàæåíèå ìåòêè èíäèêàòîðà
#property indicator_label2 "HL Pivot"
//+----------------------------------------------+
//| Ïàðàìåòðû îòðèñîâêè èíäèêàòîðà 3 |
//+----------------------------------------------+
//---- îòðèñîâêà èíäèêàòîðà 3 â âèäå ëèíèè
#property indicator_type3 DRAW_LINE
//---- â êà÷åñòâå öâåòà èíäèêàòîðà èñïîëüçîâàí
#property indicator_color3 clrMagenta
//---- òîëùèíà ëèíèè èíäèêàòîðà 2 ðàâíà 2
#property indicator_width3 2
//---- îòîáðàæåíèå ìåòêè èíäèêàòîðà
#property indicator_label3 "HL Down"
//+----------------------------------------------+
//| Ïàðàìåòðû îòðèñîâêè îáëàêà 1 |
//+----------------------------------------------+
//---- îòðèñîâêà èíäèêàòîðà 4 â âèäå îáëàêà
#property indicator_type4 DRAW_FILLING
//---- â êà÷åñòâå öâåòà èíäèêàòîðà èñïîëüçîâàí öâåò PaleTurquoise
#property indicator_color4 clrPaleTurquoise
//---- îòîáðàæåíèå ìåòêè èíäèêàòîðà
#property indicator_label4 "HL Up Cloud"
//+----------------------------------------------+
//| Ïàðàìåòðû îòðèñîâêè îáëàêà 2 |
//+----------------------------------------------+
//---- îòðèñîâêà èíäèêàòîðà 5 â âèäå îáëàêà
#property indicator_type5 DRAW_FILLING
//---- â êà÷åñòâå öâåòà èíäèêàòîðà èñïîëüçîâàí öâåò MistyRose
#property indicator_color5 clrMistyRose
//---- îòîáðàæåíèå ìåòêè èíäèêàòîðà
#property indicator_label5 "HL Down Cloud"
//+----------------------------------------------+
//| Âõîäíûå ïàðàìåòðû èíäèêàòîðà |
//+----------------------------------------------+
input ENUM_TIMEFRAMES TimeFrame=PERIOD_D1; // Ïåðèîä ãðàôèêà äëÿ ðàñ÷åòà óðîâíåé
input bool ShowComment=true; // Îòðèñîâêà êîììåíòàðèÿ
input int Shift=0; // Ñäâèã èíäèêàòîðà ïî ãîðèçîíòàëè â áàðàõ
//+----------------------------------------------+
//---- îáúÿâëåíèå äèíàìè÷åñêèõ ìàññèâîâ, êîòîðûå áóäóò â
//---- äàëüíåéøåì èñïîëüçîâàíû â êà÷åñòâå èíäèêàòîðíûõ áóôåðîâ
double Ind1Buffer[];
double Ind2Buffer[];
double Ind3Buffer[];
double Ind4Buffer[];
double Ind5Buffer[];
double Ind6Buffer[];
double Ind7Buffer[];
//---- îáúÿâëåíèå öåëî÷èñëåííûõ ïåðåìåííûõ íà÷àëà îòñ÷åòà äàííûõ
int min_rates_total;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---- ïðîâåðêà òàéìôðåéìà èíäèêàòîðà íà êîððåêòíîñòü
if(!TimeFramesCheck("HL",TimeFrame,Period())) return(INIT_FAILED);
//---- èíèöèàëèçàöèÿ ïåðåìåííûõ
min_rates_total=2;
//---- èíèöèàëèçàöèÿ èíäèêàòîðíûõ áóôåðîâ
BufInit(0,Ind1Buffer);
BufInit(1,Ind2Buffer);
BufInit(2,Ind3Buffer);
BufInit(3,Ind4Buffer);
BufInit(4,Ind5Buffer);
BufInit(5,Ind6Buffer);
BufInit(6,Ind7Buffer);
//----
IndInit(0,0.0,min_rates_total,Shift);
IndInit(1,0.0,min_rates_total,Shift);
IndInit(2,0.0,min_rates_total,Shift);
IndInit(3,EMPTY_VALUE,min_rates_total,Shift);
IndInit(4,EMPTY_VALUE,min_rates_total,Shift);
//---- ñîçäàíèå èìåíè äëÿ îòîáðàæåíèÿ â îòäåëüíîì ïîäîêíå è âî âñïëûâàþùåé ïîäñêàçêå
string shortname;
StringConcatenate(shortname,"HL(",EnumToString(TimeFrame),")");
//----
IndicatorSetString(INDICATOR_SHORTNAME,shortname);
//---- îïðåäåëåíèå òî÷íîñòè îòîáðàæåíèÿ çíà÷åíèé èíäèêàòîðà
IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
//---- çàâåðøåíèå èíèöèàëèçàöèè
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//----
Comment("");
//----
}
//+------------------------------------------------------------------+
//| Custom 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<min_rates_total) return(RESET);
//---- îáúÿâëåíèå öåëî÷èñëåííûõ ïåðåìåííûõ
int limit,bar;
//---- îáúÿâëåíèå ïåðåìåííûõ ñ ïëàâàþùåé òî÷êîé
double last_close,last_high,last_low,P=0.0,R=0.0,S=0.0;
datetime iTime[1];
static uint LastCountBar;
static double prev_low,prev_high;
//---- ðàñ÷åòû íåîáõîäèìîãî êîëè÷åñòâà êîïèðóåìûõ äàííûõ è
//---- ñòàðòîâîãî íîìåðà limit äëÿ öèêëà ïåðåñ÷åòà áàðîâ
if(prev_calculated>rates_total || prev_calculated<=0)// ïðîâåðêà íà ïåðâûé ñòàðò ðàñ÷åòà èíäèêàòîðà
{
limit=rates_total-min_rates_total-1; // ñòàðòîâûé íîìåð äëÿ ðàñ÷åòà âñåõ áàðîâ
LastCountBar=rates_total;
prev_low=999999999;
prev_high=0.0;
}
else limit=int(LastCountBar)+rates_total-prev_calculated; // ñòàðòîâûé íîìåð äëÿ ðàñ÷åòà íîâûõ áàðîâ
//---- èíäåêñàöèÿ ýëåìåíòîâ â ìàññèâàõ êàê â òàéìñåðèÿõ
ArraySetAsSeries(time,true);
ArraySetAsSeries(high,true);
ArraySetAsSeries(low,true);
ArraySetAsSeries(close,true);
//---- îñíîâíîé öèêë ðàñ÷åòà èíäèêàòîðà
for(bar=limit; bar>=0 && !IsStopped(); bar--)
{
Ind1Buffer[bar]=0.0;
Ind2Buffer[bar]=0.0;
Ind3Buffer[bar]=0.0;
Ind4Buffer[bar]=0.0;
Ind5Buffer[bar]=0.0;
Ind6Buffer[bar]=0.0;
Ind7Buffer[bar]=0.0;
//---- êîïèðóåì âíîâü ïîÿâèâøèåñÿ äàííûå â ìàññèâ
if(CopyTime(Symbol(),TimeFrame,time[bar],1,iTime)<=0) return(RESET);
//----
if(time[bar]>=iTime[0] && time[bar+1]<iTime[0])
{
LastCountBar=bar;
Ind1Buffer[bar+1]=0.0;
Ind2Buffer[bar+1]=0.0;
Ind3Buffer[bar+1]=0.0;
Ind4Buffer[bar+1]=0.0;
Ind5Buffer[bar+1]=0.0;
Ind6Buffer[bar+1]=0.0;
Ind7Buffer[bar+1]=0.0;
//----
last_close=close[bar+1];
last_high=prev_high;
last_low=prev_low;
P=(last_high+last_low )/2;
R=last_high;
S=last_low;
prev_high=high[bar];
prev_low=low[bar];
}
//----
prev_high=MathMax(prev_high,high[bar]);
prev_low=MathMin(prev_low,low[bar]);
//---- çàãðóçêà ïîëó÷åííûõ çíà÷åíèé â èíäèêàòîðíûå áóôåðû
Ind4Buffer[bar]=Ind1Buffer[bar]=R;
Ind6Buffer[bar]=Ind5Buffer[bar]=Ind2Buffer[bar]=P;
Ind7Buffer[bar]=Ind3Buffer[bar]=S;
}
//----
if(ShowComment)
{
Comment("Current H=",DoubleToString(R,_Digits),
", L=",DoubleToString(S,_Digits),
", HL/2=",DoubleToString(P,_Digits),
", H-L=",DoubleToString((R-S)/_Point,0));
}
//----
return(rates_total);
}
//+------------------------------------------------------------------+
//| Èíèöèàëèçàöèÿ èíäèêàòîðíîãî áóôåðà |
//+------------------------------------------------------------------+
void BufInit(int Number,double &Buffer[])
{
//---- ïðåâðàùåíèå äèíàìè÷åñêîãî ìàññèâà â èíäèêàòîðíûé áóôåð
SetIndexBuffer(Number,Buffer,INDICATOR_DATA);
//---- èíäåêñàöèÿ ýëåìåíòîâ â áóôåðå êàê â òàéìñåðèè
ArraySetAsSeries(Buffer,true);
//----
}
//+------------------------------------------------------------------+
//| Èíèöèàëèçàöèÿ èíäèêàòîðíîãî áóôåðà |
//+------------------------------------------------------------------+
void IndInit(int Number,double Empty_Value,int Draw_Begin,int nShift)
{
//---- îñóùåñòâëåíèå ñäâèãà íà÷àëà îòñ÷åòà îòðèñîâêè èíäèêàòîðà
PlotIndexSetInteger(Number,PLOT_DRAW_BEGIN,Draw_Begin);
//---- óñòàíîâêà çíà÷åíèé èíäèêàòîðà, êîòîðûå íå áóäóò âèäèìû íà ãðàôèêå
PlotIndexSetDouble(Number,PLOT_EMPTY_VALUE,Empty_Value);
//---- îñóùåñòâëåíèå ñäâèãà èíäèêàòîðà 2 ïî ãîðèçîíòàëè íà Shift
PlotIndexSetInteger(Number,PLOT_SHIFT,nShift);
//----
}
//+------------------------------------------------------------------+
//| TimeFramesCheck() |
//+------------------------------------------------------------------+
bool TimeFramesCheck(string IndName,
ENUM_TIMEFRAMES inTFrame, //Ïåðèîä ãðàôèêà ðàñ÷åòà èíäèêàòîðà
ENUM_TIMEFRAMES outTFrame)//Ïåðèîä ãðàôèêà èíäèêàòîðà
{
//---- ïðîâåðêà ïåðèîäîâ ãðàôèêîâ íà êîððåêòíîñòü
if(inTFrame<=outTFrame)
{
Print("Ïåðèîä ãðàôèêà äëÿ èíäèêàòîðà "+IndName+" íå ìîæåò áûòü ìåíüøå ",GetStringTimeframe(inTFrame));
return(RESET);
}
//----
return(true);
}
//+------------------------------------------------------------------+
//| Ïîëó÷åíèå òàéìôðåéìà â âèäå ñòðîêè |
//+------------------------------------------------------------------+
string GetStringTimeframe(ENUM_TIMEFRAMES timeframe)
{
//----
return(StringSubstr(EnumToString(timeframe),7,-1));
//----
}
//+------------------------------------------------------------------+
Comments