Article-13277-MQL5-Template.../TestWilliamsFractals.mq5

210 lines
19 KiB
MQL5

//+------------------------------------------------------------------+
//| TestWilliamsFractals.mq5 |
//| Copyright 2023, MetaQuotes Ltd. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2023, MetaQuotes Ltd."
#property link "https://www.mql5.com"
#property version "1.00"
//--- includes
#include "Dashboard.mqh"
//--- global variables
int handle=INVALID_HANDLE; // Хэндл индикатора
int ind_digits=0; // Количество знаков после запятой в значении индикатора
string ind_title; // Описание индикатора
//--- переменные для панели
int mouse_bar_index; // Индекс бара, с которого берутся данные
CDashboard *panel=NULL; // Указатель на объект панели
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- create timer
EventSetTimer(60);
//--- Индикатор
//--- Устанавливаем наименование индикатора и количество знаков после запятой
ind_title="Fractals";
ind_digits=Digits();
//--- Создаём хэндл индикатора
ResetLastError();
handle=iFractals(Symbol(),PERIOD_CURRENT);
if(handle==INVALID_HANDLE)
{
PrintFormat("%s: Failed to create indicator handle %s. Error %ld",__FUNCTION__,ind_title,GetLastError());
return INIT_FAILED;
}
//--- Панель
//--- Создаёи панель
panel=new CDashboard(1,20,20,199,225);
if(panel==NULL)
{
Print("Error. Failed to create panel object");
return INIT_FAILED;
}
//--- Устанавливаем параметры шрифта
panel.SetFontParams("Calibri",9);
//--- Отображаем панель с текстом в заголовке "Символ, Описание таймфрейма"
panel.View(Symbol()+", "+StringSubstr(EnumToString(Period()),7));
//--- Создаём таблицу с идентификатором 0 для отображения в ней данных бара
panel.CreateNewTable(0);
//--- Рисуем таблицу с идентификатором 0 на фоне панели
panel.DrawGrid(0,2,20,6,2,18,97);
//--- Создаём таблицу с идентификатором 1 для отображения в ней данных индикатора
panel.CreateNewTable(1);
//--- Получаем координату Y2 таблицы с идентификатором 0 и
//--- устанавливаем координату Y1 для таблицы с идентификатором 1
int y1=panel.TableY2(0)+22;
//--- Рисуем таблицу с идентификатором 1 на фоне панели
panel.DrawGrid(1,2,y1,3,2,18,97);
//--- Выводим в журнал табличные данные
panel.GridPrint(0,2);
panel.GridPrint(1,2);
//--- Инициализируем переменную с индексом бара указателя мышки
mouse_bar_index=0;
//--- Выводим на панель данные текущего бара
DrawData(mouse_bar_index,TimeCurrent());
//--- Успешная инициализация
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//--- destroy timer
EventKillTimer();
//--- Освобождаем хэндл индикатора
ResetLastError();
if(!IndicatorRelease(handle))
PrintFormat("%s: IndicatorRelease failed. Error %ld",__FUNCTION__,GetLastError());
//--- Очищаем все комментарии на графике
Comment("");
//--- Если объект панели существует - удаляем его
if(panel!=NULL)
delete panel;
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//---
}
//+------------------------------------------------------------------+
//| Timer function |
//+------------------------------------------------------------------+
void OnTimer()
{
//---
}
//+------------------------------------------------------------------+
//| ChartEvent function |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
const long &lparam,
const double &dparam,
const string &sparam)
{
//--- Работа с панелью
//--- Вызываем обработчик событий панели
panel.OnChartEvent(id,lparam,dparam,sparam);
//--- Если курсор перемещается или щелчок по графику
if(id==CHARTEVENT_MOUSE_MOVE || id==CHARTEVENT_CLICK)
{
//--- Объявляем переменные для записи в них координат времени и цены
datetime time=0;
double price=0;
int wnd=0;
//--- Если координаты курсора преобразованы в дату и время
if(ChartXYToTimePrice(ChartID(),(int)lparam,(int)dparam,wnd,time,price))
{
//--- записываем индекс бара, где расположен курсор в глобальную переменную
mouse_bar_index=iBarShift(Symbol(),PERIOD_CURRENT,time);
//--- Выводим данные бара под курсором на панель
DrawData(mouse_bar_index,time);
}
}
//--- Если получили пользовательское событие - выводим об этом сообщение в журнал
if(id>CHARTEVENT_CUSTOM)
{
//--- Здесь может быть обработка щелчка по кнопке закрытия на панели
PrintFormat("%s: Event id=%ld, object id (lparam): %lu, event message (sparam): %s",__FUNCTION__,id,lparam,sparam);
}
}
//+------------------------------------------------------------------+
//| Возвращает данные индикатора на указанном баре |
//+------------------------------------------------------------------+
double IndicatorValue(const int ind_handle,const int index,const int buffer_num)
{
double array[1]={0};
ResetLastError();
if(CopyBuffer(ind_handle,buffer_num,index,1,array)!=1)
{
PrintFormat("%s: CopyBuffer failed. Error %ld",__FUNCTION__,GetLastError());
return EMPTY_VALUE;
}
return array[0];
}
//+------------------------------------------------------------------+
//| Выводит данные с указанного индекса таймсерии на панель |
//+------------------------------------------------------------------+
void DrawData(const int index,const datetime time)
{
//--- Объявляем переменные для получения в них данных
MqlTick tick={0};
MqlRates rates[1];
//--- Если текущие цены получить не удалось - уходим
if(!SymbolInfoTick(Symbol(),tick))
return;
//--- Если данные бара по указанному индексу получить не удалось - уходим
if(CopyRates(Symbol(),PERIOD_CURRENT,index,1,rates)!=1)
return;
//--- Устанавливаем параметры шрифта для заголовков данных бара и индикатора
int size=0;
uint flags=0;
uint angle=0;
string name=panel.FontParams(size,flags,angle);
panel.SetFontParams(name,9,FW_BOLD);
panel.DrawText("Bar data ["+(string)index+"]",3,panel.TableY1(0)-16,clrMaroon,panel.Width()-6);
panel.DrawText("Indicator data ["+(string)index+"]",3,panel.TableY1(1)-16,clrGreen,panel.Width()-6);
//--- Устанавливаем параметры шрифта для данных бара и индикатора
panel.SetFontParams(name,9);
//--- Выводим на панель данные указанного бара в таблицу 0
panel.DrawText("Date", panel.CellX(0,0,0)+2, panel.CellY(0,0,0)+2); panel.DrawText(TimeToString( rates[0].time,TIME_DATE), panel.CellX(0,0,1)+2, panel.CellY(0,0,1)+2,clrNONE,90);
panel.DrawText("Time", panel.CellX(0,1,0)+2, panel.CellY(0,1,0)+2); panel.DrawText(TimeToString( rates[0].time,TIME_MINUTES), panel.CellX(0,1,1)+2, panel.CellY(0,1,1)+2,clrNONE,90);
panel.DrawText("Open", panel.CellX(0,2,0)+2, panel.CellY(0,2,0)+2); panel.DrawText(DoubleToString(rates[0].open,Digits()), panel.CellX(0,2,1)+2, panel.CellY(0,2,1)+2,clrNONE,90);
panel.DrawText("High", panel.CellX(0,3,0)+2, panel.CellY(0,3,0)+2); panel.DrawText(DoubleToString(rates[0].high,Digits()), panel.CellX(0,3,1)+2, panel.CellY(0,3,1)+2,clrNONE,90);
panel.DrawText("Low", panel.CellX(0,4,0)+2, panel.CellY(0,4,0)+2); panel.DrawText(DoubleToString(rates[0].low,Digits()), panel.CellX(0,4,1)+2, panel.CellY(0,4,1)+2,clrNONE,90);
panel.DrawText("Close", panel.CellX(0,5,0)+2, panel.CellY(0,5,0)+2); panel.DrawText(DoubleToString(rates[0].close,Digits()), panel.CellX(0,5,1)+2, panel.CellY(0,5,1)+2,clrNONE,90);
//--- Выводим на панель данные индикатора с указанного бара в таблицу 1 (верхний фрактал)
panel.DrawText(ind_title+" Up", panel.CellX(1,0,0)+2, panel.CellY(1,0,0)+2);
double value0=IndicatorValue(handle,index,UPPER_LINE);
string value_str0=(value0!=EMPTY_VALUE ? DoubleToString(value0,ind_digits) : " ");
panel.DrawText(value_str0,panel.CellX(1,0,1)+2,panel.CellY(1,0,1)+2,clrNONE,90);
//--- Выводим на панель данные индикатора с указанного бара в таблицу 1 (нижний фрактал)
panel.DrawText(ind_title+" Down", panel.CellX(1,1,0)+2, panel.CellY(1,1,0)+2);
double value1=IndicatorValue(handle,index,LOWER_LINE);
string value_str1=(value1!=EMPTY_VALUE ? DoubleToString(value1,ind_digits) : " ");
panel.DrawText(value_str1,panel.CellX(1,1,1)+2,panel.CellY(1,1,1)+2,clrNONE,90);
//--- Перерисовываем график для немедленного отображения всех изменений на панели
ChartRedraw(ChartID());
}
//+------------------------------------------------------------------+