forked from rosh/MQL5Book
133 lines
4.3 KiB
MQL5
133 lines
4.3 KiB
MQL5
//+------------------------------------------------------------------+
| |
//| ObjectGroupEdit.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 "Apply changes made in a single object properties dialog to all selected objects on current chart."
| |
| |
#property indicator_chart_window
| |
#property indicator_buffers 0
| |
#property indicator_plots 0
| |
| |
#include "..\..\Include\ObjectMonitor.mqh"
| |
| |
#define PUSH(A,V) (A[ArrayResize(A, ArraySize(A) + 1) - 1] = V)
| |
| |
int consts[2048];
| |
string selected[];
| |
ObjectMonitor *objects[];
| |
| |
//+------------------------------------------------------------------+
| |
//| Custom indicator initialization function |
| |
//+------------------------------------------------------------------+
| |
void OnInit()
| |
{
| |
for(int i = 0; i < ArraySize(consts); ++i)
| |
{
| |
consts[i] = i;
| |
}
| |
| |
EventSetTimer(1);
| |
}
| |
| |
//+------------------------------------------------------------------+
| |
//| Monitor properties of objects selected on the chart |
| |
//+------------------------------------------------------------------+
| |
void TrackSelectedObjects()
| |
{
| |
for(int j = 0; j < ArraySize(objects); ++j)
| |
{
| |
delete objects[j];
| |
}
| |
| |
ArrayResize(objects, 0, ArraySize(selected));
| |
| |
for(int i = 0; i < ArraySize(selected); ++i)
| |
{
| |
const string name = selected[i];
| |
PUSH(objects, new ObjectMonitor(name, consts)); // can make .backup() for undo
| |
}
| |
}
| |
| |
//+------------------------------------------------------------------+
| |
//| Timer event handler |
| |
//+------------------------------------------------------------------+
| |
void OnTimer()
| |
{
| |
// collect names of selected objects in the following array
| |
string updates[];
| |
const int n = ObjectsTotal(0);
| |
for(int i = 0; i < n; ++i)
| |
{
| |
const string name = ObjectName(0, i);
| |
if(ObjectGetInteger(0, name, OBJPROP_SELECTED))
| |
{
| |
PUSH(updates, name);
| |
}
| |
}
| |
| |
if(ArraySize(selected) != ArraySize(updates))
| |
{
| |
ArraySwap(selected, updates);
| |
Comment("Selected objects: ", ArraySize(selected));
| |
TrackSelectedObjects();
| |
}
| |
}
| |
| |
//+------------------------------------------------------------------+
| |
//| Custom indicator iteration function |
| |
//| (dummy here, required for indicator) |
| |
//+------------------------------------------------------------------+
| |
int OnCalculate(const int rates_total,
| |
const int prev_calculated,
| |
const int begin,
| |
const double &price[])
| |
{
| |
return rates_total;
| |
}
| |
| |
//+------------------------------------------------------------------+
| |
//| Chart event handler |
| |
//+------------------------------------------------------------------+
| |
void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam)
| |
{
| |
if(id == CHARTEVENT_OBJECT_CHANGE)
| |
{
| |
Print("Object changed: ", sparam);
| |
for(int i = 0; i < ArraySize(selected); ++i)
| |
{
| |
if(sparam == selected[i])
| |
{
| |
const int changes = objects[i].snapshot();
| |
if(changes > 0)
| |
{
| |
for(int j = 0; j < ArraySize(objects); ++j)
| |
{
| |
if(j != i)
| |
{
| |
objects[j].applyChanges(objects[i]);
| |
}
| |
}
| |
}
| |
ChartRedraw();
| |
return;
| |
}
| |
}
| |
}
| |
}
| |
| |
//+------------------------------------------------------------------+
| |
//| Finalization handler |
| |
//+------------------------------------------------------------------+
| |
void OnDeinit(const int)
| |
{
| |
for(int j = 0; j < ArraySize(objects); ++j)
| |
{
| |
delete objects[j];
| |
}
| |
Comment("");
| |
}
| |
//+------------------------------------------------------------------+
|