Files
mql5_indicators_mt5_part1/CandleRange_HTF - indicator for MetaTrader 5/CandleRange.mq5
T

179 lines
17 KiB
Plaintext

//+---------------------------------------------------------------------+
//| CandleRange.mq5 |
//| Copyright © 2017, Nikolay Kositsin |
//| Khabarovsk, farria@mail.redcom.ru |
//+---------------------------------------------------------------------+
//| Для работы индикатора следует положить файл SmoothAlgorithms.mqh |
//| в папку (директорию): каталог_данных_терминала\\MQL5\Include |
//+---------------------------------------------------------------------+
#property copyright "Copyright © 2017, Nikolay Kositsin"
#property link "farria@mail.redcom.ru"
//---- номер версии индикатора
#property version "1.00"
//---- отрисовка индикатора в отдельном окне
#property indicator_separate_window
//---- количество индикаторных буферов
#property indicator_buffers 4
//---- использовано всего два графических построения
#property indicator_plots 2
//+-----------------------------------+
//| Параметры отрисовки индикатора |
//+-----------------------------------+
//---- отрисовка индикатора в виде многоцветной гистограммы
#property indicator_type1 DRAW_COLOR_HISTOGRAM
//---- в качестве цветов двухцветной гистограммы использованы
#property indicator_color1 clrLime,clrTeal
//---- гистограммы индикатора - непрерывная кривая
#property indicator_style1 STYLE_SOLID
//---- толщина линии индикатора равна 3
#property indicator_width1 3
//---- отображение метки индикатора
#property indicator_label1 "High"
//+-----------------------------------+
//| Параметры отрисовки индикатора |
//+-----------------------------------+
//---- отрисовка индикатора в виде многоцветной гистограммы
#property indicator_type2 DRAW_COLOR_HISTOGRAM
//---- в качестве цветов двухцветной гистограммы использованы
#property indicator_color2 clrMagenta,clrPurple
//---- гистограммы индикатора - непрерывная кривая
#property indicator_style2 STYLE_SOLID
//---- толщина линии индикатора равна 3
#property indicator_width2 3
//---- отображение метки индикатора
#property indicator_label2 "Low"
//+-----------------------------------+
//| Описание класса CXMA |
//+-----------------------------------+
#include <SmoothAlgorithms.mqh>
//+-----------------------------------+
//---- объявление переменных класса CXMA из файла SmoothAlgorithms.mqh
CXMA XMA1,XMA2;
//+-----------------------------------+
//| объявление перечислений |
//+-----------------------------------+
/*enum Smooth_Method - перечисление объявлено в файле SmoothAlgorithms.mqh
{
MODE_SMA_, //SMA
MODE_EMA_, //EMA
MODE_SMMA_, //SMMA
MODE_LWMA_, //LWMA
MODE_JJMA, //JJMA
MODE_JurX, //JurX
MODE_ParMA, //ParMA
MODE_T3, //T3
MODE_VIDYA, //VIDYA
MODE_AMA, //AMA
}; */
//+-----------------------------------+
//| ВХОДНЫЕ ПАРАМЕТРЫ ИНДИКАТОРА |
//+-----------------------------------+
input Smooth_Method MA_Method1=MODE_SMA_; //Метод усреднения индикатора
input uint Length1=7; //Глубина усреднения индикатора
input int Phase1=15; //Параметр усреднения индикатора,
//---- для JJMA изменяющийся в пределах -100 ... +100, влияет на качество переходного процесса;
//---- Для VIDIA это период CMO, для AMA это период медленной скользящей
input int Shift=0; // Сдвиг индикатора по горизонтали в барах
//+-----------------------------------+
//---- объявление динамических массивов, которые будут в дальнейшем использованы в качестве индикаторных буферов
double HIndBuffer[],ColorHIndBuffer[];
double LIndBuffer[],ColorLIndBuffer[];
//---- Объявление целых переменных начала отсчета данных
int min_rates_total;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
void OnInit()
{
//---- Инициализация переменных начала отсчета данных
min_rates_total=GetStartBars(MA_Method1, Length1, Phase1);
//---- превращение динамического массива в индикаторный буфер
SetIndexBuffer(0,HIndBuffer,INDICATOR_DATA);
//---- превращение динамического массива в цветовой, индексный буфер
SetIndexBuffer(1,ColorHIndBuffer,INDICATOR_COLOR_INDEX);
//---- осуществление сдвига индикатора 1 по горизонтали
PlotIndexSetInteger(0,PLOT_SHIFT,Shift);
//---- осуществление сдвига начала отсчета отрисовки индикатора
PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,min_rates_total);
//---- установка значений индикатора, которые не будут видимы на графике
PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,EMPTY_VALUE);
//---- превращение динамического массива в индикаторный буфер
SetIndexBuffer(2,LIndBuffer,INDICATOR_DATA);
//---- превращение динамического массива в цветовой, индексный буфер
SetIndexBuffer(3,ColorLIndBuffer,INDICATOR_COLOR_INDEX);
//---- осуществление сдвига индикатора 1 по горизонтали
PlotIndexSetInteger(1,PLOT_SHIFT,Shift);
//---- осуществление сдвига начала отсчета отрисовки индикатора
PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,min_rates_total);
//---- установка значений индикатора, которые не будут видимы на графике
PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,EMPTY_VALUE);
//---- инициализации переменной для короткого имени индикатора
string shortname;
string Smooth1=XMA1.GetString_MA_Method(MA_Method1);
StringConcatenate(shortname,"CandleRange(",Length1,", ",Smooth1,")");
//---- создание имени для отображения в отдельном подокне и во всплывающей подсказке
IndicatorSetString(INDICATOR_SHORTNAME,shortname);
//---- определение точности отображения значений индикатора
IndicatorSetInteger(INDICATOR_DIGITS,0);
//---- завершение инициализации
}
//+------------------------------------------------------------------+
//| 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(0);
//---- Объявление переменных с плавающей точкой
double ;
//---- Объявление целых переменных и получение уже посчитанных баров
int first,bar;
//---- расчет стартового номера first для цикла пересчета баров
if(prev_calculated>rates_total || prev_calculated<=0) // проверка на первый старт расчета индикатора
first=0; // стартовый номер для расчета всех баров
else first=prev_calculated-1; // стартовый номер для расчета новых баров
//---- Основной цикл расчета индикатора
for(bar=first; bar<rates_total && !IsStopped(); bar++)
{
HIndBuffer[bar]=XMA1.XMASeries(0,prev_calculated,rates_total,MA_Method1,Phase1,Length1,high[bar]-open[bar],bar,false);
HIndBuffer[bar]/=_Point;
LIndBuffer[bar]=XMA2.XMASeries(0,prev_calculated,rates_total,MA_Method1,Phase1,Length1,low[bar]-open[bar],bar,false);
LIndBuffer[bar]/=_Point;
}
//---- корректировка значения переменной first
if(prev_calculated>rates_total || prev_calculated<=0) // проверка на первый старт расчета индикатора
first=min_rates_total+1; // стартовый номер для расчета всех баров
//---- Основной цикл раскраски сигнальной линии
for(bar=first; bar<rates_total && !IsStopped(); bar++)
{
ColorHIndBuffer[bar]=ColorHIndBuffer[bar-1];
if(HIndBuffer[bar-1]<HIndBuffer[bar]) ColorHIndBuffer[bar]=0;
else if(HIndBuffer[bar-1]>HIndBuffer[bar]) ColorHIndBuffer[bar]=1;
//----
ColorLIndBuffer[bar]=ColorLIndBuffer[bar-1];
if(LIndBuffer[bar-1]>LIndBuffer[bar]) ColorLIndBuffer[bar]=0;
else if(LIndBuffer[bar-1]<LIndBuffer[bar]) ColorLIndBuffer[bar]=1;
}
//----
return(rates_total);
}
//+------------------------------------------------------------------+