Два бага MT5

 

1. При сохранении темплейта с именем "default", и последующем открытии нового графика на графике также активно отображение объема Tick Volumes. Хотя я его специально отключал для отображения.


2. При вызове функции ExpertRemove() выполняется функция OnDeinit(), которая в моем случае удаляет все графические объекты, но после ее выполнения выполняются события OnChartEvent() которые создают эти объекты заново и уже после этого советник удаляется с чата, графические объекты остаются.

(Код выложить не могу, т.к. это мой продукт для маркета) Т.е. это либо что-то с потоками или функция OnDeinit() не имеет высшего приоритета на выполнение. В МТ4 такого нет.

P.S. Решение в виде костылей не предлагать их уже и так выше крыши.

Документация по MQL5: Графические объекты / ObjectsDeleteAll
Документация по MQL5: Графические объекты / ObjectsDeleteAll
  • www.mql5.com
ObjectsDeleteAll - Графические объекты - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Fedor Arkhipov:

1. При сохранении темплейта с именем "default", и последующем открытии нового графика на графике также активно отображение объема Tick Volumes. Хотя я его специально отключал для отображения.

Не воспроизводится (клик):

Возможно, проблемы с правами доступа к папке профилей.

2. При вызове функции ExpertRemove() выполняется функция OnDeinit(), которая в моем случае удаляет все графические объекты, но после ее выполнения выполняются события OnChartEvent() которые создают эти объекты заново и уже после этого советник удаляется с чата, графические объекты остаются.

Не воспроизводится:

int OnInit()
{
   if (ObjectFind(0, "MyObj") < 0)
      ObjectCreate(0, "MyObj", OBJ_VLINE, 0, iTime(NULL, PERIOD_CURRENT, 0), 0.0);   

   return(INIT_SUCCEEDED);
}
void OnDeinit(const int reason)
{
   Print(__FUNCTION__);
   ObjectDelete(0, "MyObj");   
}
void OnTick()
{
   static int nCnt = 0;
   ++nCnt;
   
   if (nCnt > 10)
      ExpertRemove();   
}
void OnChartEvent(const int id,const long& lparam,const double& dparam,const string& sparam)
{
   Print(__FUNCTION__);

   if (ObjectFind(0, "MyObj") < 0)
      ObjectCreate(0, "MyObj", OBJ_VLINE, 0, iTime(NULL, PERIOD_CURRENT, 0), 0.0);   
}

После удаления эксперта вертикальная линия удаляется с графика.

Скорее всего, какие-то проблемы в коде. Попробуйте выхолостить код так, чтобы проблема не проявлялась. Так и найдете ее причину.

 
Ihor Herasko #:

Не воспроизводится (клик):

Возможно, проблемы с правами доступа к папке профилей.

Не воспроизводится:

После удаления эксперта вертикальная линия удаляется с графика.

Скорее всего, какие-то проблемы в коде. Попробуйте выхолостить код так, чтобы проблема не проявлялась. Так и найдете ее причину.

Поверьте, в коде проблем нет, я все проверил. Да и какая проблема может быть если OnDeinit() выполняется. У меня код более 10 000 строк (панель для торговли в 1 клик) На простом коде все работает, на большом, когда много событий - нет.

Стало проявляться, только после добавления дополнительных событий для CHARTEVENT_MOUSE_MOVE. А в МТ4 версии все работает как положено.

 
Fedor Arkhipov #:

Поверьте, в коде проблем нет, я все проверил. Да и какая проблема может быть если OnDeinit() выполняется. У меня код более 10 000 строк (панель для торговли в 1 клик) На простом коде все работает, на большом, когда много событий - нет.

Стало проявляться, только после добавления дополнительных событий для CHARTEVENT_MOUSE_MOVE. А в МТ4 версии все работает как положено.

1. в OnDeinit добавьте ChartRedraw . Опционально паузу

2. не удаляйте объекты если их придётся снова пересоздавать (при смене таймфрейма например)

3. никогда не создавайте объекты в OnInit и вообще до первого OnChartEvent

вы напихали в чарт команд по самый небалуй, а он работает па-ра-лель-но с советником и его OnDeinit/OnInit. OnDeinit прошёл, OnChartEvent тем более, а c сообщениями чарт всё ещё разбирается

 
Maxim Kuznetsov #:

1. в OnDeinit добавьте ChartRedraw . Опционально паузу

2. не удаляйте объекты если их придётся снова пересоздавать (при смене таймфрейма например)

3. никогда не создавайте объекты в OnInit и вообще до первого OnChartEvent

вы напихали в чарт команд по самый небалуй, а он работает па-ра-лель-но с советником и его OnDeinit/OnInit. OnDeinit прошёл, OnChartEvent тем более, а c сообщениями чарт всё ещё разбирается

Но это опять костыли. В МТ4 все работает без них. Делать костыли я тоже умею. Это все увеличивает время разработки.
 
Fedor Arkhipov #:
Но это опять костыли. В МТ4 все работает без них. Делать костыли я тоже умею. Это все увеличивает время разработки.

придите в чувство и сначала изучите механику софта под который пишите.

 
Maxim Kuznetsov #:

придите в чувство и сначала изучите механику софта под который пишите.

Уже изучил. Я не просил советов. А написал разработчикам MQL5.