Не работает в тестере OBJPROP_ANCHOR для OBJ_BITMAP

 

Написал индикатор, значки рисовал на канвасе, в терминале рисует всё как надо,

а в тестере точка привязки встаёт в левый верхний угол объекта и не хочет меняться функцией

ObjectSetInteger(chart_ID, name, OBJPROP_ANCHOR, ANCHOR_UPPER);
или
ObjectSetInteger(chart_ID, name, OBJPROP_ANCHOR, ANCHOR_LOWER);

Слева терминал, справа тестер.


Вот код в котором можно в тестере увидеть ошибку.  Может в коде ошибка, подскажите.

#property indicator_chart_window
#property indicator_plots 0

#include <Canvas\Canvas.mqh>
CCanvas canvas[];

int n;
int _width = 30, _height = 40;
//+------------------------------------------------------------------+
int OnInit()
  {
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   int limit = 0;
   if(prev_calculated <= 0)
     {
      limit = rates_total - 1000;
      n = 0;
     }
   else
      limit = prev_calculated;

   for(int i = limit; i < rates_total; i++)
     {
      if(i % 10 == 0)
        {
         string name = "test" + "_" + (string)i + "_" + TimeToString(time[i]);
         ArrayResize(canvas, n + 1);
         if(open[i] > close[i])
           {
            canvas[n].CreateBitmap(0, 0, name, time[i], low[i], _width, _height, COLOR_FORMAT_ARGB_NORMALIZE);
            canvas[n].Erase();
            ObjectSetInteger(0, name, OBJPROP_ANCHOR, ANCHOR_UPPER);
            int X[] = {0, _width / 2, _width, _width, 0};
            int Y[] = {_height - _height / 3 * 2, 0, _height - _height / 3 * 2, _height, _height};
            canvas[n].FillPolygon(X, Y, ColorToARGB(clrGreen, 150));
           }
         else
           {
            canvas[n].CreateBitmap(0, 0, name, time[i], high[i], _width, _height, COLOR_FORMAT_ARGB_NORMALIZE);
            canvas[n].Erase();
            ObjectSetInteger(0, name, OBJPROP_ANCHOR, ANCHOR_LOWER);
            int X[] = {0, _width, _width, _width / 2, 0};
            int Y[] = {0, 0, _height / 3 * 2, _height, _height / 3 * 2};
            canvas[n].FillPolygon(X, Y, ColorToARGB(clrRed, 150));
           }
         canvas[n].Update(true);
         n++;
        }
     }
   return(rates_total);
  }
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   for(int i = ArraySize(canvas) - 1; i >= 0; i--)
      canvas[i].Destroy();
   ObjectsDeleteAll(0, -1, OBJ_BITMAP);
  }
//+------------------------------------------------------------------+
 
Aleksandr Slavskii:

Написал индикатор, значки рисовал на канвасе, в терминале рисует всё как надо,

а в тестере точка привязки встаёт в левый верхний угол объекта и не хочет меняться функцией

Слева терминал, справа тестер.


Вот код в котором можно в тестере увидеть ошибку.  Может в коде ошибка, подскажите.

Скорей всего в тестере не работает должным образом Anchor.
Поэтому существует два решения:
  • Пытаться достучаться до MQ, чтоб исправили
  • Использовать один канвас на весь экран и перерисовывать его каждый раз при событии изменения чарта.
Я понимаю, что второй вариант вам не понравится. Но он более производительный, особенно при большом колличестве объектов, а Вы обязательно нарвётесь на лаги из-за бесконтрольного множественного создания объектов. Хотя в таком случае будет заметно небольшое отставание канваса от чарта, что немного режет глаз. 
Реализация второго варианта намного сложнее Вашего, но если использовать мой iCanvas, то реализация будет проще(короче) Вашей.
 
Nikolai Semko #:
Скорей всего в тестере не работает должным образом Anchor.
Поэтому существует два решения:
  • Пытаться достучаться до MQ, чтоб исправили
  • Использовать один канвас на весь экран и перерисовывать его каждый раз при событии изменения чарта.
Я понимаю, что второй вариант вам не понравится. Но он более производительный, особенно при большом колличестве объектов, а Вы обязательно нарвётесь на лаги из-за бесконтрольного множественного создания объектов. Хотя в таком случае будет заметно небольшое отставание канваса от чарта, что немного режет глаз. 
Реализация второго варианта намного сложнее Вашего, но если использовать мой iCanvas, то реализация будет проще(короче) Вашей.

Спасибо за ответ.

Достучаться до MQ, это из области фантастики, имхо.

//---

Прочитал всю ветку "Canvas - это круто!", скажу вам - да, у вас это круто!!!

У заказчика было условие не использовать сторонние библиотеки, поэтому iCanvas нельзя.

 
Aleksandr Slavskii #:

Спасибо за ответ.

Достучаться до MQ, это из области фантастики, имхо.

//---

Прочитал всю ветку "Canvas - это круто!", скажу вам - да, у вас это круто!!!

У заказчика было условие не использовать сторонние библиотеки, поэтому iCanvas нельзя.

Спасибо! Приятно.
Есть ещё способ: для тестера вводить сдвижку привязки с учётом этого косяка и горизонтального масштаба баров.
Но предупреждаю ещё раз, если будет создано примерно более 1000 объектов, то клиент начнет разговаривать нецензурно.

 
Nikolai Semko #:
Спасибо! Приятно.
Есть ещё способ: для тестера вводить сдвижку привязки с учётом этого косяка и горизонтального масштаба баров.
Но предупреждаю ещё раз, если будет создано примерно более 1000 объектов, то клиент начнет разговаривать нецензурно.

Изначально сдвиг я делал не с помощью ObjectSetInteger, а рассчитывал точки.

Но увы координата времени рассчитывается нормально, а вот с ценой проблема, получаются абсолютно разные коэффициенты если их считать например 10, 100, 1000 пунктов и высота графика px /на количество пунктов.

Но даже если брать  высота графика px /на количество пунктов, то всё равно рисует не правильно. И эта не правильность на разных масштабах разная, где то пункт, где то пять.

Значки с точкой привязки верх по центру рисуются нормально, а вот те у которых точка привязки низ по центру, ну ни как не хотят рисоваться там где должны. Хз почему так.


"  то клиент начнет разговаривать нецензурно."

Клиент сам запросил флажочки, точнее вымпелы с циферками. Пусть наслаждается)))

А вообще там не должно быть сильно много объектов, предположительно максимум сотня, хотя наверное стоит прописать в коде ограничение, на всякий случай. Спасибо.

 
Aleksandr Slavskii #:

Изначально сдвиг я делал не с помощью ObjectSetInteger, а рассчитывал точки.

Но увы координата времени рассчитывается нормально, а вот с ценой проблема, получаются абсолютно разные коэффициенты если их считать например 10, 100, 1000 пунктов и высота графика px /на количество пунктов.

Но даже если брать  высота графика px /на количество пунктов, то всё равно рисует не правильно. И эта не правильность на разных масштабах разная, где то пункт, где то пять.

Значки с точкой привязки верх по центру рисуются нормально, а вот те у которых точка привязки низ по центру, ну ни как не хотят рисоваться там где должны. Хз почему так.


"  то клиент начнет разговаривать нецензурно."

Клиент сам запросил флажочки, точнее вымпелы с циферками. Пусть наслаждается)))

А вообще там не должно быть сильно много объектов, предположительно максимум сотня, хотя наверное стоит прописать в коде ограничение, на всякий случай. Спасибо.

В моей библиотеке нет таких проблем. Для этого и создавалась, чтобы с высокой производительностью и точностью пересчитывать пиксельные координаты в координаты время(бары) - цена и обратно. Чтобы программисты не проходили весь мой путь и сэкономили себе время и нервы.
Многие переделывают эту библиотеку под себя и используют активно. 
Ценность исполнителя перед заказчиком главным образом заключается в применении им  разумной инициативы, когда исправляются неразумные с технической точки зрения хотелки.
Даже если в одном канвас объекте будет 10000 подобных флажочков с цифрами, то лагов не будет.

 
Nikolai Semko #:
В моей библиотеке нет таких проблем. Для этого и создавалась, чтобы с высокой производительностью и точностью пересчитывать пиксельные координаты в координаты время(бары) - цена и обратно. Чтобы программисты не проходили весь мой путь и сэкономили себе время и нервы.
Многие переделывают эту библиотеку под себя и используют активно. 
Ценность исполнителя перед заказчиком главным образом заключается в применении им  разумной инициативы, когда исправляются неразумные с технической точки зрения хотелки.
Даже если в одном канвас объекте будет 10000 подобных флажочков с цифрами, то лагов не будет.

Да. Вы меня натолкнули на хорошую мысль)

Я понимаю, что один объект с  10000 флажочков это всё равно ОДИН объект.

А 10000 флажочков это  10000 объектов и это уже совсем другая нагрузка на терминал.

При прокрутке графика, мы тыщу раз перерисовываем этот один объект. 

Так зачем я рисую  10000 объектов, если пользователь в данный момент видит только то, что на экране, ну максимум 10-30 флажочков.

Ну и буду ему отрисовывать то, что видно на экране. Их даже пересоздавать не надо, просто перетащить и нарисовать другой текст)))

Спасибо. Пойду экспериментировать.

 
Nikolai Semko #:
В моей библиотеке нет таких проблем.

К моему большому сожалению, в вашей библиотеке есть одна мааааленькая, но весьма существенная для меня проблема.

Я не шарю в ООП. Я попытался воспользоваться вашей библой, но увы даже после того как перевёл все комменты, ничего не понял :(

Возможно когда нибудь доберусь и изучу ООП, а пока ...

Canvas тоже вроде как ООП, но там почему то всё понятно.

 
Aleksandr Slavskii #:

К моему большому сожалению, в вашей библиотеке есть одна мааааленькая, но весьма существенная для меня проблема.

Я не шарю в ООП. Я попытался воспользоваться вашей библой, но увы даже после того как перевёл все комменты, ничего не понял :(

Возможно когда нибудь доберусь и изучу ООП, а пока ...

Canvas тоже вроде как ООП, но там почему то всё понятно.

Если есть в планах продолжать кодить, то без ООП никуда. Тем более ничего сложного и достаточно 1 дня теории и 100 часов практики, чтобы полностью въехать заплесневелому функциональщику. 
На самом деле мой iCanvas написан ужасно. Ещё до того, как 4 года учился на программиста. Классический говнокод. Надо бы переписать, но понимаю, что на производительность и функциональность это не повлияет, и поэтому откладываю в долгий ящик ))
 

Переделал. Всё равно получилась какашка, но немного получше чем было изначально.

Клиент доволен.


Лайвхак. Сначала делаем очень плохо, потом переделываем в плохо. 

Все счастливы)))

 
Aleksandr Slavskii #:

Переделал. Всё равно получилась какашка, но немного получше чем было изначально.

Клиент доволен.


Лайвхак. Сначала делаем очень плохо, потом переделываем в плохо. 

Все счастливы)))

https://www.mql5.com/ru/forum/277867/page7#comment_15005208
Это учитывали?
Причина обращения: