Как узнать имя последнего созданного объекта? - страница 2

 
Tango_X:
Спасибо за отклик и желание помочь!
Я вам ничем не помог - не за что. Я не у компьютера сейчас , так что написать вам функцию или предложить решение смогу не раньше, чем буду у компьютера. А это не менее 4-х часов.
 

Зачем x>y и т.д.. По сути сами пытаетесь отслеживать событие.

Ловите событие CHARTEVENT_OBJECT_CREATE , вам же уже посоветовали, вот это и будет последний объект.

В значение параметра sparam будет имя созданного объекта.

 
Igor Volodin:

Зачем x>y и т.д.. По сути сами пытаетесь отслеживать событие.

Ловите событие CHARTEVENT_OBJECT_CREATE , вам же уже посоветовали, вот это и будет последний объект.

В значение параметра sparam будет имя созданного объекта.

Это работает когда я сам создаю объекты на графике, а у меня объекты создает индикатор.
 
Artyom Trishkin:
Я вам ничем не помог - не за что. Я не у компьютера сейчас , так что написать вам функцию или предложить решение смогу не раньше, чем буду у компьютера. А это не менее 4-х часов.
Я подожду...уже несколько дней мучаюсь)))
 
Tango_X:
Это работает когда я сам создаю объекты на графике, а у меня объекты создает индикатор.
Нет. Это работает всегда когда на чарте создаются объекты функцией ObjectCreate. Даже другими скриптами и индикаторами. Вот, запустите. И смотрите в лог, что создает ваш индикатор.


#property copyright ""
#property link      ""
#property version   "1.00"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   ChartSetInteger(0,CHART_EVENT_OBJECT_CREATE, true);
  
//---
   return(INIT_SUCCEEDED);
  }

//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
        if (id == CHARTEVENT_OBJECT_CREATE) {
                Print(sparam);
        }
  }
//+------------------------------------------------------------------+
 
Если бы узнать зачем? Тогда бы можно было что-то придумать.
 
Tango_X:
Обьекты я не создаю... их создает индикатор - мне их надо как-то отлавливать.. Пришла мысль попробовать использовать время создания объекта (OBJPROP_CREATETIME), но в любом случае на каждом новом объекте нужно будет пересматривать весь массив объектов! а если их тысячи.....
Если объекты создаются пулом - скорее всего у них время создания объекта будет одинаковым
 
Igor Volodin:
Нет. Это работает всегда когда на чарте создаются объекты функцией ObjectCreate. Даже другими скриптами и индикаторами. Вот, запустите. И смотрите в лог, что создает ваш индикатор.


#property copyright ""
#property link      ""
#property version   "1.00"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   ChartSetInteger(0,CHART_EVENT_OBJECT_CREATE, true);
  
//---
   return(INIT_SUCCEEDED);
  }

//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
        if (id == CHARTEVENT_OBJECT_CREATE) {
                Print(sparam);
        }
  }
//+------------------------------------------------------------------+
Вот здесь действительно работает!!! Спасибо огромное! Но работает когда накидываешь индикатор на график, тогда обьекты подхватывает а если вызываешь пользовательский индикатор через свой индикатор через iCustom - то обьекты не видит...может не правильно вызываю...буду разбираться.. Спасибо еще раз!!!!
 
Tango_X:

Общее кол-во обьектов не совпадает с индексом последнего добавленного объекта на графике,(MQL их сортирует по своему!) 

Немного разобраться в логике индексирования может помочь этот советник
void OnInit()
{
  ChartSetInteger(0, CHART_EVENT_OBJECT_CREATE, true);
  ChartSetInteger(0, CHART_EVENT_OBJECT_DELETE, true);
}

string ObjectsToString( const int Type = -1, const long chartID = 0, const int SubWindow = -1 )
{
  const int Total = ObjectsTotal(chartID, SubWindow, Type);

  string Str = "Objects " + ((Type == -1) ? "Any" : EnumToString((ENUM_OBJECT)Type)) + " type:";
  
  for (int i = 0; i < Total; i++)
  {
    const string Name = ObjectName(chartID, i, SubWindow, Type);
    
    Str += "\n" + (string)i + " " + Name + " " + EnumToString((ENUM_OBJECT)ObjectGetInteger(chartID, Name, OBJPROP_TYPE)) +
           " " + (string)(datetime)ObjectGetInteger(chartID, Name, OBJPROP_CREATETIME);
  }
  
  return(Str);
}

void OnChartEvent( const int id, const long &lparam, const double &dparam, const string &sparam )
{
  if ((id == CHARTEVENT_OBJECT_CREATE) || (id == CHARTEVENT_OBJECT_DELETE))
    Comment(ObjectsToString() + ((id == CHARTEVENT_OBJECT_CREATE) ? "\n\n" + ObjectsToString((int)ObjectGetInteger(0, sparam, OBJPROP_TYPE)): ""));
}
Понаблюдайте за результатом, добавляя и удаляя объекты вручную.
 
Tango_X:
Я подожду...уже несколько дней мучаюсь)))
Поставить в таймер проверку общего количества объектов. Как только что-то изменилось пересматриваем последние n-объектов.
Причина обращения: