135 lines
4.9 KiB
MQL5
135 lines
4.9 KiB
MQL5
|
//+------------------------------------------------------------------+
|
||
|
//| ObjectChart.mq5 |
|
||
|
//| Copyright 2021, MetaQuotes Ltd. |
|
||
|
//| https://www.mql5.com |
|
||
|
//+------------------------------------------------------------------+
|
||
|
#property copyright "Copyright 2021, MetaQuotes Ltd."
|
||
|
#property link "https://www.mql5.com"
|
||
|
#property version "1.0"
|
||
|
#property description "Create 2 micro-chart objects in a subwindow to show higher and lower timeframes."
|
||
|
|
||
|
#define SUBCHART_HEIGHT 150
|
||
|
#define SUBCHART_WIDTH 200
|
||
|
|
||
|
// bufferless indicator in a subwindow
|
||
|
#property indicator_separate_window
|
||
|
#property indicator_height SUBCHART_HEIGHT
|
||
|
#property indicator_buffers 0
|
||
|
#property indicator_plots 0
|
||
|
// without exact range below indicator title is not shown in the subwindow
|
||
|
#property indicator_maximum 1.0
|
||
|
#property indicator_minimum 0.0
|
||
|
|
||
|
#include "..\..\Include\Periods.mqh"
|
||
|
|
||
|
#define PeriodUp(P) PeriodRelative(P, +1)
|
||
|
#define PeriodDown(P) PeriodRelative(P, -1)
|
||
|
|
||
|
const string Prefix = "ObjectChart-";
|
||
|
|
||
|
//+------------------------------------------------------------------+
|
||
|
//| Find higher or lower timeframe against specified one |
|
||
|
//+------------------------------------------------------------------+
|
||
|
ENUM_TIMEFRAMES PeriodRelative(const ENUM_TIMEFRAMES tf, const int step)
|
||
|
{
|
||
|
static const ENUM_TIMEFRAMES stdtfs[] =
|
||
|
{
|
||
|
PERIOD_M1, // =1 (1)
|
||
|
PERIOD_M2, // =2 (2)
|
||
|
PERIOD_M3, // =3 (3)
|
||
|
PERIOD_M4, // =4 (4)
|
||
|
PERIOD_M5, // =5 (5)
|
||
|
PERIOD_M6, // =6 (6)
|
||
|
PERIOD_M10, // =10 (A)
|
||
|
PERIOD_M12, // =12 (C)
|
||
|
PERIOD_M15, // =15 (F)
|
||
|
PERIOD_M20, // =20 (14)
|
||
|
PERIOD_M30, // =30 (1E)
|
||
|
PERIOD_H1, // =16385 (4001)
|
||
|
PERIOD_H2, // =16386 (4002)
|
||
|
PERIOD_H3, // =16387 (4003)
|
||
|
PERIOD_H4, // =16388 (4004)
|
||
|
PERIOD_H6, // =16390 (4006)
|
||
|
PERIOD_H8, // =16392 (4008)
|
||
|
PERIOD_H12, // =16396 (400C)
|
||
|
PERIOD_D1, // =16408 (4018)
|
||
|
PERIOD_W1, // =32769 (8001)
|
||
|
PERIOD_MN1, // =49153 (C001)
|
||
|
};
|
||
|
const int x = ArrayBsearch(stdtfs, tf == PERIOD_CURRENT ? _Period : tf);
|
||
|
const int needle = x + step;
|
||
|
if(needle >= 0 && needle < ArraySize(stdtfs))
|
||
|
{
|
||
|
return stdtfs[needle];
|
||
|
}
|
||
|
return tf;
|
||
|
}
|
||
|
|
||
|
//+------------------------------------------------------------------+
|
||
|
//| Create and setup a single bitmap label |
|
||
|
//+------------------------------------------------------------------+
|
||
|
long SetupSubChart(const int n, const int dx, const int dy,
|
||
|
ENUM_TIMEFRAMES tf = PERIOD_CURRENT, const string symbol = NULL)
|
||
|
{
|
||
|
// create an object in the subwindow
|
||
|
const string name = Prefix + "Chart-"
|
||
|
+ (symbol == NULL ? _Symbol : symbol) + PeriodToString(tf);
|
||
|
ObjectCreate(0, name, OBJ_CHART, ChartWindowFind(), 0, 0);
|
||
|
|
||
|
// binding to the corner
|
||
|
ObjectSetInteger(0, name, OBJPROP_CORNER, CORNER_RIGHT_UPPER);
|
||
|
|
||
|
// position and size
|
||
|
ObjectSetInteger(0, name, OBJPROP_XSIZE, dx);
|
||
|
ObjectSetInteger(0, name, OBJPROP_YSIZE, dy);
|
||
|
ObjectSetInteger(0, name, OBJPROP_XDISTANCE, (n + 1) * dx);
|
||
|
ObjectSetInteger(0, name, OBJPROP_YDISTANCE, 0);
|
||
|
|
||
|
// specific chart settings
|
||
|
if(symbol != NULL)
|
||
|
{
|
||
|
ObjectSetString(0, name, OBJPROP_SYMBOL, symbol);
|
||
|
}
|
||
|
|
||
|
if(tf != PERIOD_CURRENT)
|
||
|
{
|
||
|
ObjectSetInteger(0, name, OBJPROP_PERIOD, tf);
|
||
|
}
|
||
|
|
||
|
ObjectSetInteger(0, name, OBJPROP_DATE_SCALE, false);
|
||
|
ObjectSetInteger(0, name, OBJPROP_PRICE_SCALE, false);
|
||
|
|
||
|
const long id = ObjectGetInteger(0, name, OBJPROP_CHART_ID);
|
||
|
ChartIndicatorAdd(id, 0, iMA(NULL, tf, 10, 0, MODE_EMA, PRICE_CLOSE));
|
||
|
return id;
|
||
|
}
|
||
|
|
||
|
//+------------------------------------------------------------------+
|
||
|
//| Custom indicator initialization function |
|
||
|
//+------------------------------------------------------------------+
|
||
|
void OnInit()
|
||
|
{
|
||
|
Print(SetupSubChart(0, SUBCHART_WIDTH, SUBCHART_HEIGHT, PeriodUp(_Period)));
|
||
|
Print(SetupSubChart(1, SUBCHART_WIDTH, SUBCHART_HEIGHT, PeriodDown(_Period)));
|
||
|
}
|
||
|
|
||
|
//+------------------------------------------------------------------+
|
||
|
//| Custom indicator iteration function (dummy here) |
|
||
|
//+------------------------------------------------------------------+
|
||
|
int OnCalculate(const int rates_total,
|
||
|
const int prev_calculated,
|
||
|
const int begin,
|
||
|
const double &price[])
|
||
|
{
|
||
|
return rates_total;
|
||
|
}
|
||
|
|
||
|
//+------------------------------------------------------------------+
|
||
|
//| Finalization handler |
|
||
|
//+------------------------------------------------------------------+
|
||
|
void OnDeinit(const int)
|
||
|
{
|
||
|
ObjectsDeleteAll(0, Prefix);
|
||
|
}
|
||
|
//+------------------------------------------------------------------+
|