OnChartEvent sets sparam to wrong object name!

 

Issue:

MQL programs don't get the correct name of a newly created object when OnChartEvent is triggered after the object name is changed via properties dialog shown after creation.

Steps to reproduce the issue:

  1. Enable "Show object properties after creation" in Tools>Options>Charts
  2. Create a new object
  3. Change the name of the newly created object via properties dialog
  4. Click OK.

Expectation:

  • CHARTEVENT_OBJECT_CHANGE should be triggered along with CHARTEVENT_OBJECT_CREATE and CHARTEVENT_OBJECT_DRAG (If dragged).
  • sparam should be set to changed object name when CHARTEVENT_OBJECT_CHANGE is triggered.

What happens:

  • CHARTEVENT_OBJECT_CREATE is triggered with MT generated object name.
  • CHARTEVENT_OBJECT_DRAG is triggered with MT generated object name and not the changed object name.
  • CHARTEVENT_OBJECT_CHANGE is not triggered.

** If programs tries to get properties of newly created object by passing sparam as object name, ObjectGetInteger/ObjectGetDouble/ObjectGetString functions return 4203 error and ObjectFind function returns 4202 error.


Here's the code to test:

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   ChartSetInteger(0, CHART_EVENT_OBJECT_CREATE, true);
   ChartSetInteger(0, CHART_EVENT_OBJECT_DELETE, true);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason) {}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick() {}
//+------------------------------------------------------------------+
int i=0;
void OnChartEvent(const int id, const long& lparam, const double& dparam, const string& sparam)
  {
   if(id == CHARTEVENT_OBJECT_CREATE)
     {
      PrintFormat("%s created. [%i] %s", sparam, i++, TimeToString(ObjectGetInteger(0,sparam,OBJPROP_CREATETIME),TIME_SECONDS));
     }
   else if(id == CHARTEVENT_OBJECT_DRAG)
     {
      long create_time=0;
      if(!ObjectGetInteger(0,sparam,OBJPROP_CREATETIME,0,create_time))
        {
         PrintFormat("sparam: %s, lparam: %lli, dparam: %g, Error: %i", sparam, lparam, dparam, GetLastError());
         int window=ObjectFind(0, sparam);
         PrintFormat("ObjWindow: %i, Error: %i", window, GetLastError());
        }
      PrintFormat("%s dragged. [%i] %s", sparam, i++, TimeToString(create_time,TIME_SECONDS));
     }
   else if(id == CHARTEVENT_OBJECT_CHANGE)
     {
      PrintFormat("%s changed. [%i] %s", sparam, i++, TimeToString(ObjectGetInteger(0,sparam,OBJPROP_CREATETIME),TIME_SECONDS));
     }
   else if(id == CHARTEVENT_OBJECT_DELETE)
     {
      PrintFormat("%s deleted. [%i] %s", sparam, i++, TimeToString(ObjectGetInteger(0,sparam,OBJPROP_CREATETIME),TIME_SECONDS));
     }
   else if(StringLen(sparam)>0)
     {
      PrintFormat("sparam: %s, lparam: %lli, dparam: %g", sparam, lparam, dparam);
     }
  }

Here's the result:

16:42:20.827	test-ObjectCreateEvent (EURUSD,D1)	Daily Trendline 5197 created. [0] 16:42:20
16:42:35.743	test-ObjectCreateEvent (EURUSD,D1)	sparam: Daily Trendline 5197, lparam: 0, dparam: 0, Error: 4203
16:42:35.743	test-ObjectCreateEvent (EURUSD,D1)	ObjWindow: -1, Error: 4202
16:42:35.743	test-ObjectCreateEvent (EURUSD,D1)	Daily Trendline 5197 dragged. [1] 00:00:00