Обсуждение статьи "Создание пользовательских индикаторов с использованием класса CCanvas" - страница 2

 
fxsaber:

Это приятная новость! А в чем идея? Вместо тиковой истории подставлять кастомный временной ряд?

Нет. Рядом с тиковой историей рисовать гистограмму тиковой скорости.

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

 
Dennis Kirichenko:

Хорошая тема. Спасибо автору, буду делать тиковый индикатор на холсте...

Приметил такое. 

Есть приватный член-данные m_canvas_name, а метода, задающая его значение - Name(), - публичная. Имхо, нарушается принцип инкапсуляции. Сделаю у себя этот метод приватным.

Может быть protected ? Т.к. все остальные наследуют CCanvasBase. И тогда в них нельзя будет использовать данный метод. Хотя я не знаю, может вы еще что-то в общей структуре поменяли.

 
Alexander Fedosov:

Может быть protected ? Т.к. все остальные наследуют CCanvasBase. И тогда в них нельзя будет использовать данный метод. Хотя я не знаю, может вы еще что-то в общей структуре поменяли.


Таки да, protected.

Потом вот тут:

bool CCanvasBase::DeleteCanvas()
  {
   return(ObjectDelete(0,m_canvas_name)?true:false);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   ind.Delete();
   ChartRedraw();
  }

Зачем так сложно в индикаторе? Имхо, нужно,чтобы сам холст за собой убирал. Я бы добавил ChartRedraw() в метод DeleteCanvas().

 
fxsaber:

Как будут наброски, скиньте скрины/видео. Сам выложил такой индикатор, но не пошел в народ. Хотя лучше так и не встретил. Интересно посмотреть другие решения на канвасе.


Я делаю для ФОРТСа. Сделал в обычном формате, но в Тестере работает через-пень колоду при вызове из тела советника. Весь код буду теперь переносить в советник...

 
Dennis Kirichenko:

Таки да, protected.

Потом вот тут:

Зачем так сложно в индикаторе? Имхо, нужно,чтобы сам холст за собой убирал. Я бы добавил ChartRedraw() в метод DeleteCanvas().

Да, так будет меньше лишних строк. Делаем холст аккуратным и отправляем туда перерисовку.

 

А вот это вообще-то не по феншую:

//+------------------------------------------------------------------+
//| Удаляет графический ресурс                                       |
//+------------------------------------------------------------------+
bool CCanvasBase::DeleteCanvas()
  {
   return(ObjectDelete(0,m_canvas_name)?true:false);
  }

Зачем тернарный оператор? - Если можно просто:

//+------------------------------------------------------------------+
//| Удаляет графический ресурс                                       |
//+------------------------------------------------------------------+
bool CCanvasBase::DeleteCanvas()
  {
   return ObjectDelete(0,m_canvas_name);
  }

Себе сделал так:

//+------------------------------------------------------------------+
//| Удаляет графический ресурс                                       |
//+------------------------------------------------------------------+
bool CCanvasBase::DeleteCanvas()
  {
   if(ObjectFind(0,m_canvas_name)>-1)
      if(ObjectDelete(0,m_canvas_name))
        {
         ChartRedraw();
         return true;
        }
   return false;
  }


Но вроде же как у канваса есть свой метод удаления CCanvas::Destroy().

Зачем что-то городить вдобавок? 

 

С вертикальным масштабированием проблема у меня.

Хочу сделать на RTS тиковый график, где максимум по оси Y равен 97784.0, а минимум - 97756.0.

В коде делаю так:

//--- обновить чарт
double min_y=NormalizeDouble(min_pr-0.2*diff,_Digits);
double max_y=NormalizeDouble(max_pr+0.2*diff,_Digits);
ticks_ind.YMin(min_y);
ticks_ind.YMax(max_y);
ticks_ind.SetArrayValue(prices);


Получаю такое:

https://www.mql5.com/ru/charts/7227612/rts-9-17-m1-ao-otkritie-broker

Минимум показывает правильно, потом свистопляска какая-то.

Видимо метод CLineGraph::VerticalScale() не так заточен, как мне кажется, или, что хуже, как нужно.

График RTS-9.17, M1, 2017.06.19 15:22 UTC, АО ''Открытие Брокер'', MetaTrader 5, Real
График RTS-9.17, M1, 2017.06.19 15:22 UTC, АО ''Открытие Брокер'', MetaTrader 5, Real
  • www.mql5.com
Символ: RTS-9.17. Период графика: M1. Брокер: АО ''Открытие Брокер''. Торговая платформа: MetaTrader 5. Режим торговли: Real. Дата: 2017.06.19 15:22 UTC.
 
Документация по MQL5: Стандартная библиотека / Научные графики / CGraphic
Документация по MQL5: Стандартная библиотека / Научные графики / CGraphic
  • www.mql5.com
Стандартная библиотека / Научные графики / CGraphic - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 

Анатолий, спасибо за наводку, буду использовать. Обидно, что идея выливается в недружественный код...

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