Рисование прерывистых линий.

 
Доброго времени суток. Начал изучать графику и в предоставленном ниже коде пытаюсь чтобы рисовались прерывистые линии от координаты открытия ордера до координаты текущей цены, но линия не рисуется... Подскажите пожалуйста в чем ошибка
void Lines()
{

ENUM_LINE_STYLE lineStyle=STYLE_DOT;
  canvas.Destroy();
  for(int j=PositionsTotal()-1; j>=0; j--)
     {
      if(m_position.SelectByIndex(j))
        {
         ulong tick = m_position.Ticket();
         if(m_position.PositionType() == POSITION_TYPE_BUY)
            {
            canvas.LineStyleSet(lineStyle);
            canvas.Line(m_position.Time(),m_position.PriceOpen(),iTime(_Symbol,PERIOD_CURRENT,0),Ask(_Symbol),clrBlue);
            }
         if(m_position.PositionType() == POSITION_TYPE_SELL)
            {
            canvas.LineStyleSet(lineStyle);
            canvas.Line(m_position.Time(),m_position.PriceOpen(),iTime(_Symbol,PERIOD_CURRENT,0),Ask(_Symbol),clrRed);
            }
        }
     }
}
 
Anton Novokhatskii:
Доброго времени суток. Начал изучать графику и в предоставленном ниже коде пытаюсь чтобы рисовались прерывистые линии от координаты открытия ордера до координаты текущей цены, но линия не рисуется... Подскажите пожалуйста в чем ошибка

Нужно смотреть, что там с объектом canvas: как он создается, как обновляется. В приведенном отрывке кода видно только то, что он уничтожается.

Для начала попробуйте рисовать линии при помощи обычных графических объектов (названия функций начинаются на "Object"). Когда отладите, то можно будет переделать на Canvas.

 
Ihor Herasko #:

Нужно смотреть, что там с объектом canvas: как он создается, как обновляется. В приведенном отрывке кода видно только то, что он уничтожается.

Для начала попробуйте рисовать линии при помощи объектов. Когда отладите, то можно будет переделать на Canvas.

Не согласен, Игорь. Пунктирные линии на объектах это жесть в плане производительности и алгоритма очищения, ибо будут множиться бесконтрольно. Сразу Canvas.
 
функция Lines() прогоняется каждый тик. Т.е. с наступлением нового тика, все линии удаляются, т.е.: canvas.Destroy(), а затем линии должны рисоваться заново, по координатам новой цены. Но дело в том, что даже если убрать canvas.Destroy(), линии все равно не рисуются. С Object намного проще сделать это, но функционал не такой гибкий, поэтому хочу использовать Canvas
 
Anton Novokhatskii #:
функция Lines() прогоняется каждый тик. Т.е. с наступлением нового тика, все линии удаляются, т.е.: canvas.Destroy(), а затем линии должны рисоваться заново, по координатам новой цены. Но дело в том, что даже если убрать canvas.Destroy(), линии все равно не рисуются. С Object намного проще сделать это, но функционал не такой гибкий, поэтому хочу использовать Canvas
Destroy убивает Canvas. Необходимо использовать Erase().
Рекомендую обратить внимание на мою библиотеку iCanvas. Особенно если Вы используете координаты цена-время(бар)
Easy Canvas
Easy Canvas
  • www.mql5.com
Данная библиотека и класс iCanvas упростит написание программ с применением Canvas.
 
Nikolai Semko #:
Не согласен, Игорь. Пунктирные линии на объектах это жесть в плане производительности и алгоритма очищения, ибо будут множиться бесконтрольно. Сразу Canvas.

Сейчас речь не о производительности, а о том, чтобы в принципе отобразилась линия.

 
Именно. На данный момент я пытаюсь понять почему  
 canvas.Line(m_position.Time(),m_position.PriceOpen(),iTime(_Symbol,PERIOD_CURRENT,0),Ask(_Symbol),clrBlue);

не работает. Даже если убрать дестрой и настройку стиля. Впринципе ничего не рисуется

 
Anton Novokhatskii #:
Именно. На данный момент я пытаюсь понять почему  

не работает. Даже если убрать дестрой и настройку стиля. Впринципе ничего не рисуется

ChartRedraw !!! без него ничего не отобразится.

 
Спасибо большое, почитаю как работает, и попробую применить)
 
Maxim Kuznetsov #:

ChartRedraw !!! без него ничего не отобразится.

Для Канвас лучше Update()
 
использовал оба варианта, ничего не рисуется)) еще почитаю что можно сделать
Причина обращения: