iCustom() + ChartIndicatorAdd() + графические объекты.

 
Необходимо программно в советнике создать индикатор и добавить его на график, отличный от графика советника. Но графические объекты, создаваемые индикатором (в частности OBJ_VLINE), создаются на графике советника в момент вызова iCustom(). Как сделать, чтобы они создавались на графике, куда добавляется индикатор функцией ChartIndicatorAdd()?
 
Добавьте в индикатор входной.
input long inChartID = 0;

В iCustom в этот входной пропишите ChartID-графика, на который будет делаться  ChartIndicatorAdd.

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

 
Исходника индикатора нет к сожалению.
 
Попробовать в цикле пройтись по открытым графикам с помощью функций ChartFirst() и ChartNext(), считывая АйДи каждого графика. При совпадении нужного символа и таймфрейма для функции ChartIndicatorAdd() первым параметром указывать найденный ранее АйДи графика.
А лучше открыть график с помощью ChartOpen(). Автоматом получим АйДи графика. И тогда его использовать для ChartIndicatorAdd().
 
А почему именно  iCustom()? Через структуру параметров не пробовали?
 
Сейчас посмотрел, ни  iCustom, ни IndicatorCreate не имеют ID графика. Видимо никак не поставить на другой график… Или танцы с бубном помогут…
 
Ivan Titov:
Необходимо программно в советнике создать индикатор и добавить его на график, отличный от графика советника. Но графические объекты, создаваемые индикатором (в частности OBJ_VLINE), создаются на графике советника в момент вызова iCustom(). Как сделать, чтобы они создавались на графике, куда добавляется индикатор функцией ChartIndicatorAdd()?

на чужой график можно помолясь добавлять через ChartApplyTemplate. При условии что можете править шаблоны :-) То есть сохранить шаблон, прописать в него индикатор и загрузить шаблон.

 
Maxim Kuznetsov #:

на чужой график можно помолясь добавлять через ChartApplyTemplate. При условии что можете править шаблоны :-) То есть сохранить шаблон, прописать в него индикатор и загрузить шаблон.

Попробовал.

bool ChartIndicatorAdd2( const long  chart_id, const int sub_window,
                         const int indicator_handle, const bool Force = false )
{
  return(ChartIndicatorAdd(chart_id, sub_window, indicator_handle) &&
         (!Force || (IndicatorRelease(indicator_handle) &&
                     ChartSaveTemplate(chart_id, __FILE__) &&
                     ChartApplyTemplate(chart_id, __FILE__))));
}                         

Там такие баги вылезают при нажатии на Refresh чарта, что даже баг-репорт отпадает писать желание.

 
Спасибо всем за ответы. Видимо оптимальный в данном случае - вариант fxsaber с параметром графика в индикаторе (во всяком случае пока не доработают iCustom). Сказал заказчику, чтобы изменил индикатор.
 
Denis Kirichenko #:
И тогда его использовать для ChartIndicatorAdd()

Проблема в том, что до этого надо вызвать iCustom(), в которой уже зачем-то создаются объекты на графике советника. И там график для объектов не задашь.

 
fxsaber #:

Попробовал.

Там такие баги вылезают при нажатии на Refresh чарта, что даже баг-репорт отпадает писать желание.

Это что за бред, невыспанный что-ли ? или от ChatGPT сия фигня:

по шагам :

1. обеспечить возможность чтения/записи шаблона (или symlink на каталог шаблонов или использовать WinApi)

2. cохранить текущий шаблон нужного чарта, 

3. прописать в него (в его файл) нужный индикатор со всеми фичами, там можно кстати цвета задавать в отличии от iCustom

4. ChartApplyTemplate(..)

5 (опционально) найти и зацепить хендл загруженного индикатора для использования

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