Ошибки, баги, вопросы - страница 3126

 
Nikolai Semko #:

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

Канвас сам по себе работает с графическим ресурсом (OBJ_BITMAP_LABEL/ OBJ_BITMAP). Так что остается сообщить имя ресурса в другое приложение и оно легко получит доступ к пикселям. Также нужно будет передать формат пикселя. И можно хоть читать пиксели хоть менять их с помощью другого CCanvas. В нем есть метод CCanvas::Attach для присоединение его к существующему ресурсу.

 
Nikolai Semko #:

А какие проблемы, Андрей?
Формируешь структуру данных или массив структур

Ни каких проблем! Просто лишние телодвижения, о них и говорю.

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

Например, у меня есть советник, который получает список запущенных индикаторов, а потом создает их на указанном списке инструментов/ТФ и потом собирает с них сигналы (и шлет в телеграм). Так вот любой буферный индикатор можно просто запустить на чарте, и он будет подхвачен автоматом. А канвас-индикатор придется подключать вручную, а потом и всю остальную работу вручную прописывать.

Нужно унифицировать работу с канвас-индикаторами. И, боюсь, что в результате такой унификации получатся ... буферные индикаторы ))

 
Nikolai Semko #:

А какие проблемы, Андрей?

короче не нашел и даже не искал

 
Andrey Khatimlianskii #:

Ни каких проблем! Просто лишние телодвижения, о них и говорю.

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

Например, у меня есть советник, который получает список запущенных индикаторов, а потом создает их на указанном списке инструментов/ТФ и потом собирает с них сигналы (и шлет в телеграм). Так вот любой буферный индикатор можно просто запустить на чарте, и он будет подхвачен автоматом. А канвас-индикатор придется подключать вручную, а потом и всю остальную работу вручную прописывать.

Нужно унифицировать работу с канвас-индикаторами. И, боюсь, что в результате такой унификации получатся ... буферные индикаторы ))

Я говорю о расширении возможностей, в том числе использования одних классов для визуализации, как в индикаторах, так и в экспертах. В индикаторах, конечно же, всегда остаётся буферный способ передачи и никто не запрещает его использовать в случае чистого канваса. 
И, кстати, я уже реализовывал гибридный способ передачи, когда в одном буфере передается массив структур через юнион. Хоть и нужна дополнительная надстройка на приемной стороне, но, во-первых, она не сложная, а во-вторых, это делает работу с данными другого индикатора для пользователя более простой и удобной благодаря структурам, а не массивам double. Пользователям это точно понравится.
 
Mihail Matkovskij #:

Канвас сам по себе работает с графическим ресурсом (OBJ_BITMAP_LABEL/ OBJ_BITMAP). Так что остается сообщить имя ресурса в другое приложение и оно легко получит доступ к пикселям. Также нужно будет передать формат пикселя. И можно хоть читать пиксели хоть менять их с помощью другого CCanvas. В нем есть метод CCanvas::Attach для присоединение его к существующему ресурсу.

Вряд ли будет стоять задача передачи графики, ведь она часто синхронизирована с барами и ценой другого окна, и является интегрированной с Event моделью.
Более того, я думаю что графический ресурс даже не будет сформирован если окна индикатора не существует или оно не активно.
Если окна с индикатором не существует, то только остаётся способ через iCustom с использованием буфера или буферов. Но, как я уже говорил, можно структуру или массив структур вкладывать в эти буферы.
 
Andrei Trukhanovich #:

короче не нашел и даже не искал

Спасибо, что доложился. 
Теперь мы в курсе, что Вы не в курсе 
 
Nikolai Semko #:
Более того, я думаю что графический ресурс даже не будет сформирован если окна индикатора не существует или оно не активно.

Интересно, в каких случаях если индикатор запущен а его окна не существует? А когда окно неактивно (пользователь переключился на другой чарт или свернул его), то что ресурс выгружается из памяти, попросту удаляется? 

Nikolai Semko #:
Но, как я уже говорил, можно структуру или массив структур вкладывать в эти буферы.

Здесь пожалуй соглашусь. Мне приходилось создавать мультизадачного робота. Первый экземпляр приложения создает задачи и создает чарты для них, затем применяет специальный шаблон с тем же роботом. Далее первый робот создает задачи, а роботы созданные автоматом их выполняют. Передача данных осуществляется через ресурсы. Туда передаются строки числа и структуры. Здесь на сайте есть пример передачи данных по http (если мне не изменяет память). Но там сначала идут данные о структурах, их размерах и типах, а потом сами данные. В своём эксперте я решил сделать проще, передал строки и числа через массив uchar-ов в виде строк, что в разы упростило чтение/запись. А вот в буферы индикаторов как-то не доводилось записывать байты и читать их оттуда. Но уже вижу один недостаток данного способа, это ограниченность байтов количеством баров индикатора. Хотя, в каждой ячейке массива по 8 байт. Может быть и не такой уж большой недостаток. Кто знает...

 
Mihail Matkovskij #:

Интересно, в каких случаях если индикатор запущен а его окна не существует? 

Имел ввиду использование iCustom

А когда окно неактивно (пользователь переключился на другой чарт или свернул его), то что ресурс выгружается из памяти, попросту удаляется? 

это было лишь мое предположение, так как особого смысла формирования изображений при свернутом окне нет. Как это реализовано в MT - не проверял, но сталкивался с чем-то подобным. Забыл нюансы.
Во всяком случае вряд ли ресурс удаляется, но и не обновляется со времением. Т.е. не работает CCanvas::Update

void CCanvas::Update(const bool redraw)
  {
//--- check
   if(m_rcname==NULL)
      return;
//--- update resource and redraw
   if(ResourceCreate(m_rcname,m_pixels,m_width,m_height,0,0,0,m_format) && redraw)
      ChartRedraw(this.m_chart_id);
  }
 
Nikolai Semko #:

Имел ввиду использование iCustom

Получается, через ресурс и буферы можно передавать значения, а через ресурс Канваса нет. Интересная задача получается, вызов индикатора с выводом на Канвас с помощью iCustom. Такого я не пробовал. Мне кажется в данном случае возможны шибки. А может быть, такой индикатор, загруженный через iCustom вообще не будет работать?...

Во всяком случае вряд ли ресурс удаляется, но и не обновляется со времением. Т.е. не работает CCanvas::Update

Думаю, ResourceCreate работает, но результат не выводится с помощью ChartRedraw. Обращения к функции идут, но система понимает, что чарт обновлять не надо пока он неактивен. Но если бы не работал ResourceCreate, то представьте, что индикатор обновил данные на произвольном тике в момент когда чарт неактивен, но ресурс Канваса не обновился. А потом пользователь решил активировать данный неактивный чарт и посмотреть на индикатор (на Канву). И получается такая ситуация, что тик был, а Канва осталась прежней, как была до момента смены чарта пользователем. А если в период неактивности било множество тиков?... То индикатор их бы обработал конечно, но не один результат не отобразился бы на Канве.

 
Mihail Matkovskij #:

Думаю, ResourceCreate работает, но результат не выводится с помощью ChartRedraw. 

Да, наверное, Вы правы. Скорей всего так и будет. 
И для экономии ресурсов правильно бы контролировать активность окна и не формировать битмап, если окно не активно.

Стоит проверить, а не строить предположений.

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