Чудеса терминала МТ4. - страница 2

 
Как скажете. 
 

Code Base

Init_Sync

fxsaber, 2017.04.17 11:44

Библиотека делает синхронизированными Init/Deinit индикаторов

 
Andrey Khatimlianskii:

Наверное, эта библиотека полезная. Но у меня несколько другой случай. Хотя, спасибо за ссылку. Возможно, там какие-то идеи найду.

 
Eugeni Neumoin:

Там более 50 000 строк. 

Я, кажется, немного начинаю понимать, где собака порылась. Удаление объекта, возможно, связано с вот этим:

Потихоньку продумываю, как поаккуратнее эту функцию применять.

если OnChartEvent перерисовывает удаленные объекты, то нужно вводить глобальный флаг, при котором OnChartEvent будет игнорировать удаление.
и в деините включать этот флаг.

 
Taras Slobodyanik:

если OnChartEvent перерисовывает удаленные объекты, то нужно вводить глобальный флаг, при котором OnChartEvent будет игнорировать удаление.
и в деините включать этот флаг.

Это понятно. Поэтому и написал, что аккуратнее с этим флагом надо обходиться. Когда был один экземпляр индикатора на графике, над этим флагом можно было не заморачиваться. А вот когда несколько экземпляров, то уже возникают проблемы.

=======================

Частично решается проблема с ошибкой 4200 следующим образом.

В теле функции в месте , где возникает ошибка, удаления объекта почему-то не происходит.

   // Выводим "!"
   if (ObjectFind(name_znak)) ObjectDelete(name_znak);
   ButtonCreate(0,name_znak,0,0,14,38,28,CORNER_LEFT_UPPER,"!","Arial",12,propWave[conf.countLevelWave].colorWave,ChartBackColorGet(0),border_clr,false,false,false,true,10,__LINE__);

Функция 

if (ObjectFind(name_znak))

объект не видит.

До вызова функции создания графической панели в месте возникновения ошибки включаю флаг разрешения удаления конкретного объекта.

               yes_panel=true;
               panel(true);  // выводим панель
               yes_panel=false;

И удаление объекта помещаю непосредственно в тело функции  ButtonCreate(...)

//--------------------------------------------------------
// Создание кнопки. Начало.
//--------------------------------------------------------
bool ButtonCreate(const long              chart_ID=0,               // ID графика 
                  const string            name="Button",            // имя кнопки 
                  const int               sub_window=0,             // номер подокна 
                  const int               x=0,                      // координата по оси X 
                  const int               y=0,                      // координата по оси Y 
                  const int               width=50,                 // ширина кнопки 
                  const int               height=18,                // высота кнопки 
                  const ENUM_BASE_CORNER  corner=CORNER_LEFT_UPPER, // угол графика для привязки 
                  const string            text="Button",            // текст 
                  const string            font="Arial",             // шрифт 
                  const int               font_size=10,             // размер шрифта 
                  const color             clr=clrBlack,             // цвет текста 
                  const color             back_clr=C'236,233,216',  // цвет фона 
                  const color             border_clr=clrNONE,       // цвет границы 
                  const bool              state=false,              // нажата/отжата 
                  const bool              back=false,               // на заднем плане 
                  const bool              selection=false,          // выделить для перемещений 
                  const bool              hidden=true,              // скрыт в списке объектов 
                  const long              z_order=0,                // приоритет на нажатие мышью 
                  const int               Line_error=0)             // определяем строку с ошибкой
  { 
//--- сбросим значение ошибки 
   ResetLastError(); 
//--- создадим кнопку 
   if (yes_panel) ObjectDelete(name_znak);
   if(!ObjectCreate(chart_ID,name,OBJ_BUTTON,sub_window,0,0)) 
     { 
      Print(__LINE__,"  ",__FUNCTION__, 
            ": не удалось создать кнопку! Код ошибки = ",GetLastError(),"   В строке:  ",Line_error,"  ExtSet = ",ExtSet); 
      return(false); 
     } 

То есть процесс удаления объекта происходит непосредственно перед созданием кнопки. Не теряется время на передачу в стэк параметров функции.

Костыль. Помогает частично.

 
Eugeni Neumoin:

Это понятно. Поэтому и написал, что аккуратнее с этим флагом надо обходиться. Когда был один экземпляр индикатора на графике, над этим флагом можно было не заморачиваться. А вот когда несколько экземпляров, то уже возникают проблемы.

=======================

Частично решается проблема с ошибкой 4200 следующим образом.

В теле функции в месте , где возникает ошибка, удаления объекта почему-то не происходит.

Функция 

объект не видит.

До вызова функции создания графической панели в месте возникновения ошибки включаю флаг разрешения удаления конкретного объекта.

И удаление объекта помещаю непосредственно в тело функции  ButtonCreate(...)

То есть процесс удаления объекта происходит непосредственно перед созданием кнопки. Не теряется время на передачу в стэк параметров функции.

Костыль. Помогает частично.

Скажите, а что возвращает функция ObjectFind()? Или вы считаете что можно писать как попало и ждать положительного результата?
 
Alexey Viktorov:
Скажите, а что возвращает функция ObjectFind()? Или вы считаете что можно писать как попало и ждать положительного результата?

Возвращает - false

Насчет "писать как попало" оставляю на вашей совести...

Не люблю форумы. Много пустых сообщений...

 
Eugeni Neumoin:

Выводит - false/

Насчет "писать как попало" оставляю на вашей совести...

Не люблю форумы. Много пустых сообщений...

А может проще почитать документацию? Наверное я задал вопрос не совсем корректно, но я имел ввиду что должна возвращать функция ObjectFind()

Разве не зная что функция должна возвращать это не написание «как попало»?

Вы хотите на форуме получить готовое решение без попытки напрячь мозги?

 
Alexey Viktorov:

А может проще почитать документацию? Наверное я задал вопрос не совсем корректно, но я имел ввиду что должна возвращать функция ObjectFind()

Разве не зная что функция должна возвращать это не написание «как попало»?

Вы хотите на форуме получить готовое решение без попытки напрячь мозги?

Не понимаю, зачем Вы это пишите?

К сведению. Программа разрабатывается с 2005 года. В ней на текущий момент 53835 строк. Ее через маркет купили несколько десятков человек. Кстати, меня Рашид попросил разместить ее в маркете. Ранее она была просто в свободном доступе. И не было цели ее продавать. Программой пользуются несколько десятков тысяч человек по всему миру.

==

Прошу далее не раздражать  пустыми сообщениями.

====

Возвращает при нахождении объекта:

2021.05.11 12:15:37.271 ZUP GBPUSD,H1: 19584  ObjectFind(name_znak)) = true

Все происходит в окне номер 0. Поэтому возврат значения любого номера окна будет означать true. И в случае ненахождения объекта будет возврат false.

Вариант написания if (ObjectFind(name_znak)==0) дает аналогичный результат с ошибкой.

 
Eugeni Neumoin:

Не понимаю, зачем Вы это пишите?

К сведению. Программа разрабатывается с 2005 года. В ней на текущий момент 53835 строк. Ее через маркет купили несколько десятков человек. Кстати, меня Рашид попросил разместить ее в маркете. Ранее она была просто в свободном доступе. И не было цели ее продавать. Программой пользуются несколько десятков тысяч человек по всему миру.

==

Прошу далее не раздражать  пустыми сообщениями.

====

Возвращает при нахождении объекта:

Все происходит в окне номер 0. Поэтому возврат значения любого номера окна будет означать true. И в случае ненахождения объекта будет возврат false.

Вариант написания if (ObjectFind(name_znak)==0) дает аналогичный результат с ошибкой.

ObjectFind

Возвращаемое значение

Функция возвращает индекс окна, которому принадлежит искомый объект. В случае неудачи функция вернет -1.

Причина обращения: