Files
mql5_indicators_mt5_part3/ShadeOpen - indicator for MetaTrader 5/shadeopen.mq5
T

367 lines
28 KiB
Plaintext

//+------------------------------------------------------------------+
//| ShadeOpen.mq5 |
//| Copyright © 2017, Nikolay Kositsin |
//| Khabarovsk, farria@mail.redcom.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2017, Nikolay Kositsin"
#property link "farria@mail.redcom.ru"
//--- номер версии индикатора
#property version "1.60"
#property description "Индикатор ночных ссесий в виде свечек."
//--- отрисовка индикатора в основном окне
#property indicator_chart_window
//--- количество индикаторных буферов 6
#property indicator_buffers 6
//--- использовано три графических построения
#property indicator_plots 3
//+----------------------------------------------+
//| объявление констант |
//+----------------------------------------------+
#define RESET 0 // Константа для возврата терминалу команды на пересчет индикатора
#define INDICATOR_NAME "ShadeOpen" // Константа для имени индикатора
#define EMPTYVALUE 0 // Константа для неотображаемых значений индикатора
//+----------------------------------------------+
//| Параметры отрисовки индикатора 1 |
//+----------------------------------------------+
//--- отрисовка индикатора в виде цветного облака
#property indicator_type1 DRAW_FILLING
//--- в качестве цвета индикатора использованы
#property indicator_color1 clrPaleGreen,clrYellow
//--- линия индикатора - непрерывная кривая
#property indicator_style1 STYLE_SOLID
//--- отображение метки индикатора
#property indicator_label1 "Upper Shade"
//+----------------------------------------------+
//| Параметры отрисовки индикатора 2 |
//+----------------------------------------------+
//--- отрисовка индикатора в виде цветного облака
#property indicator_type2 DRAW_FILLING
//--- в качестве цвета индикатора использованы
#property indicator_color2 clrLimeGreen,clrDarkOrange
//--- линия индикатора - непрерывная кривая
#property indicator_style2 STYLE_SOLID
//--- отображение метки индикатора
#property indicator_label2 "Body"
//+----------------------------------------------+
//| Параметры отрисовки индикатора 3 |
//+----------------------------------------------+
//--- отрисовка индикатора в виде цветного облака
#property indicator_type3 DRAW_FILLING
//--- в качестве цвета индикатора использован
#property indicator_color3 clrPaleGreen,clrYellow
//--- линия индикатора - непрерывная кривая
#property indicator_style3 STYLE_SOLID
//--- отображение метки индикатора
#property indicator_label3 "Lower Shade"
//+------------------------------------------------------------------+
//| Объявление перечисления часов суток |
//+------------------------------------------------------------------+
enum HOURS
{
ENUM_HOUR_0=0, //0
ENUM_HOUR_1, //1
ENUM_HOUR_2, //2
ENUM_HOUR_3, //3
ENUM_HOUR_4, //4
ENUM_HOUR_5, //5
ENUM_HOUR_6, //6
ENUM_HOUR_7, //7
ENUM_HOUR_8, //8
ENUM_HOUR_9, //9
ENUM_HOUR_10, //10
ENUM_HOUR_11, //11
ENUM_HOUR_12, //12
ENUM_HOUR_13, //13
ENUM_HOUR_14, //14
ENUM_HOUR_15, //15
ENUM_HOUR_16, //16
ENUM_HOUR_17, //17
ENUM_HOUR_18, //18
ENUM_HOUR_19, //19
ENUM_HOUR_20, //20
ENUM_HOUR_21, //21
ENUM_HOUR_22, //22
ENUM_HOUR_23 //23
};
//+------------------------------------------------------------------+
//| Объявление перечисления минут часов |
//+------------------------------------------------------------------+
enum MINUTS
{
ENUM_MINUT_0=0, //0
ENUM_MINUT_1, //1
ENUM_MINUT_2, //2
ENUM_MINUT_3, //3
ENUM_MINUT_4, //4
ENUM_MINUT_5, //5
ENUM_MINUT_6, //6
ENUM_MINUT_7, //7
ENUM_MINUT_8, //8
ENUM_MINUT_9, //9
ENUM_MINUT_10, //10
ENUM_MINUT_11, //11
ENUM_MINUT_12, //12
ENUM_MINUT_13, //13
ENUM_MINUT_14, //14
ENUM_MINUT_15, //15
ENUM_MINUT_16, //16
ENUM_MINUT_17, //17
ENUM_MINUT_18, //18
ENUM_MINUT_19, //19
ENUM_MINUT_20, //20
ENUM_MINUT_21, //21
ENUM_MINUT_22, //22
ENUM_MINUT_23, //23
ENUM_MINUT_24, //24
ENUM_MINUT_25, //25
ENUM_MINUT_26, //26
ENUM_MINUT_27, //27
ENUM_MINUT_28, //28
ENUM_MINUT_29, //29
ENUM_MINUT_30, //30
ENUM_MINUT_31, //31
ENUM_MINUT_32, //32
ENUM_MINUT_33, //33
ENUM_MINUT_34, //34
ENUM_MINUT_35, //35
ENUM_MINUT_36, //36
ENUM_MINUT_37, //37
ENUM_MINUT_38, //38
ENUM_MINUT_39, //39
ENUM_MINUT_40, //40
ENUM_MINUT_41, //41
ENUM_MINUT_42, //42
ENUM_MINUT_43, //43
ENUM_MINUT_44, //44
ENUM_MINUT_45, //45
ENUM_MINUT_46, //46
ENUM_MINUT_47, //47
ENUM_MINUT_48, //48
ENUM_MINUT_49, //49
ENUM_MINUT_50, //50
ENUM_MINUT_51, //51
ENUM_MINUT_52, //52
ENUM_MINUT_53, //53
ENUM_MINUT_54, //54
ENUM_MINUT_55, //55
ENUM_MINUT_56, //56
ENUM_MINUT_57, //57
ENUM_MINUT_58, //58
ENUM_MINUT_59 //59
};
//+----------------------------------------------+
//| Входные параметры индикатора |
//+----------------------------------------------+
input HOURS StartH=ENUM_HOUR_6; //Старт торговли (Часы)
input MINUTS StartM=ENUM_MINUT_30; //Старт торговли (Минуты)
input HOURS EndH=ENUM_HOUR_13; //Окончание торговли (Часы)
input MINUTS EndM=ENUM_MINUT_5; //Окончание торговли (Минуты)
input int Shift=0; //Сдвиг индикатора по горизонтали в барах
//+----------------------------------------------+
//--- объявление динамических массивов, которые в дальнейшем
//--- будут использованы в качестве индикаторных буферов
double ExtA1Buffer[];
double ExtB1Buffer[];
double ExtA2Buffer[];
double ExtB2Buffer[];
double ExtA3Buffer[];
double ExtB3Buffer[];
//--- объявление целочисленных переменных начала отсчета данных
int min_rates_total;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- проверка входных переменных
if(StartH>EndH || (StartH==EndH && StartM>=EndM))
{
Print("Неверные значения входных переменных старта и окончания торговли!");
return(INIT_PARAMETERS_INCORRECT);
}
//--- инициализация переменных
min_rates_total=2;
//--- превращение динамических массивов в индикаторные буферы
ArrayInit(0,ExtA1Buffer);
ArrayInit(1,ExtB1Buffer);
ArrayInit(2,ExtA2Buffer);
ArrayInit(3,ExtB2Buffer);
ArrayInit(4,ExtA3Buffer);
ArrayInit(5,ExtB3Buffer);
//--- инициализация индикаторов
PlotInit(0,2,Shift);
PlotInit(1,2,Shift);
PlotInit(2,2,Shift);
//--- создание имени для отображения в отдельном подокне и во всплывающей подсказке
IndicatorSetString(INDICATOR_SHORTNAME,INDICATOR_NAME);
//--- определение точности отображения значений индикатора
IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
//--- завершение инициализации
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<min_rates_total) return(RESET);
//---- объявления локальных переменных
int limit;
static int lshift=NULL;
double;
//---- расчёт стартового номера first для цикла пересчёта баров
if(prev_calculated>rates_total || prev_calculated<=0) // проверка на первый старт расчёта индикатора
limit=rates_total-min_rates_total-1; // стартовый номер для расчёта всех баров
else limit=rates_total-prev_calculated+lshift; // стартовый номер для расчёта новых баров
//---- индексация элементов в массивах как в таймсериях
ArraySetAsSeries(open,true);
ArraySetAsSeries(high,true);
ArraySetAsSeries(low,true);
ArraySetAsSeries(close,true);
ArraySetAsSeries(time,true);
//---- основной цикл расчёта индикатора
for(int bar=limit; bar>=0 && !IsStopped(); bar--)
{
if(!ShadeOpenCheck(time[bar]))
{
ExtA1Buffer[bar]=EMPTYVALUE;
ExtB1Buffer[bar]=EMPTYVALUE;
ExtA2Buffer[bar]=EMPTYVALUE;
ExtB2Buffer[bar]=EMPTYVALUE;
ExtA3Buffer[bar]=EMPTYVALUE;
ExtB3Buffer[bar]=EMPTYVALUE;
lshift=NULL;
continue;
}
else
{
datetime Start=GetShadeOpenStart(time[bar]);
datetime End=MathMin(GetShadeOpenEnd(time[bar]),time[0]);
double iOpen[1],iClose[1],iHigh[],iLow[];
//---- индексация элементов в массивах как в таймсериях
ArraySetAsSeries(iHigh,true);
ArraySetAsSeries(iLow,true);
//----
if(CopyOpen(Symbol(),PERIOD_CURRENT,Start,1,iOpen)<=0) return(RESET);
if(CopyHigh(Symbol(),PERIOD_CURRENT,Start,End,iHigh)<=0) return(RESET);
if(CopyLow(Symbol(),PERIOD_CURRENT,Start,End,iLow)<=0) return(RESET);
if(CopyClose(Symbol(),PERIOD_CURRENT,End,1,iClose)<=0) return(RESET);
//----
double ihigh=iHigh[ArrayMaximum(iHigh,0,WHOLE_ARRAY)];
double ilow=iLow[ArrayMinimum(iLow,0,WHOLE_ARRAY)];
//----
if(iClose[0]>=iOpen[0])
{
ExtA1Buffer[bar]=ihigh;
ExtB1Buffer[bar]=iClose[0];
ExtA2Buffer[bar]=iClose[0];
ExtB2Buffer[bar]=iOpen[0];
ExtA3Buffer[bar]=iOpen[0];
ExtB3Buffer[bar]=ilow;
}
else
{
ExtB1Buffer[bar]=ihigh;
ExtA1Buffer[bar]=iClose[0];
ExtA2Buffer[bar]=iClose[0];
ExtB2Buffer[bar]=iOpen[0];
ExtB3Buffer[bar]=iOpen[0];
ExtA3Buffer[bar]=ilow;
}
lshift=bar;
}
}
//----
return(rates_total);
}
//+------------------------------------------------------------------+
//| Определение сигналов для торговли в периоде |
//+------------------------------------------------------------------+
bool ShadeOpenCheck(datetime ChkTime)
{
//---- Объявление переменной для разрешения торговли
bool Trade=false;
MqlDateTime tm;
TimeToStruct(ChkTime,tm);
if(StartH<EndH)
{
if(tm.hour==StartH && tm.min>=StartM) Trade=true;
if(tm.hour>StartH && tm.hour<EndH) Trade=true;
if(tm.hour>StartH && tm.hour==EndH && tm.min<EndM) Trade=true;
}
if(StartH==EndH)
{
if(tm.hour==StartH && tm.min>=StartM && tm.min<EndM) Trade=true;
}
//----
return(Trade);
}
//+------------------------------------------------------------------+
//| Определение начала для торговли в периоде |
//+------------------------------------------------------------------+
datetime GetShadeOpenStart(datetime ChkTime)
{
//----
datetime Start,iTime[1];
if(CopyTime(Symbol(),PERIOD_D1,ChkTime,1,iTime)<=0) return(RESET);
Start=iTime[0]+StartH*60*60+StartM*60;
//----
return(Start);
}
//+------------------------------------------------------------------+
//| Определение конца для торговли в периоде |
//+------------------------------------------------------------------+
datetime GetShadeOpenEnd(datetime ChkTime)
{
//---- Объявление
datetime End,iTime[1];
if(CopyTime(Symbol(),PERIOD_D1,ChkTime,1,iTime)<=0) return(RESET);
End=iTime[0]+EndH*60*60+EndM*60;
//----
return(End);
}
//+------------------------------------------------------------------+
//| PlotInit() |
//+------------------------------------------------------------------+
void PlotInit(uint PlotNumber,
int DrawBegin,
int PlotShift)
{
//--- осуществление сдвига начала отсчета отрисовки индикатора
PlotIndexSetInteger(PlotNumber,PLOT_DRAW_BEGIN,DrawBegin);
//--- осуществление сдвига индикатора 1 по горизонтали на Shift
PlotIndexSetInteger(PlotNumber,PLOT_SHIFT,PlotShift);
//---
}
//+------------------------------------------------------------------+
//| ArrayInit() |
//+------------------------------------------------------------------+
void ArrayInit(uint ArrNumber,
double &Array[])
{
//--- превращение динамического массива в индикаторный буфер
SetIndexBuffer(ArrNumber,Array,INDICATOR_DATA);
//--- индексация элементов в буфере как в таймсерии
ArraySetAsSeries(Array,true);
//---
}
//+------------------------------------------------------------------+