Вопросы по доступу к буферам индикатора по указателю.

 

Пишу что-то типа универсального "расшаривателя данных", который можно было бы легко цеплять к любому индикатору. В общем, нужен доступ к буферам. Ищу вариант как сделать:

1. Рассматриваю вариант создание объекта CArrayDouble через new  в качестве буфера. Но как я понимаю, SetIndexBuffer принимает только явно объявленные массивы даблов. Или можно ли как-то привязывать к буферу индикатора массив созданный через new?

2. "Регистрировать" имеющиеся буферы по ссылкам. В принципе годный вариант, только уточнить хотел бы. Можно ли как-то эти ссылки хранить внутри объекта, в который их передали? Желательно без DLL.

 
Al_key:

...Но как я понимаю, SetIndexBuffer принимает только явно объявленные массивы даблов...

Массив для индикаторного буфера может быть публичным членом класса или структуры.
 
Dmitry Fedoseev:
Массив для индикаторного буфера может быть публичным членом класса или структуры.

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

#include <Arrays/ArrayDouble.mqh>

CArrayDouble * check;
//--- input parameters
input int      Input1;
//--- indicator buffers
double         Label1Buffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   check = new CArrayDouble();
   SetIndexBuffer(0,check,INDICATOR_DATA);
   
//---
   return(INIT_SUCCEEDED);
  }
 
Al_key:

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

Вроде понял: нужно примерно так это делать. Не знаю, правда, всплывут ли подводные камни от таких финтов.

class DynaMicDoubleByf
  {
public:
    double m_data[];
                     DynaMicDoubleByf(void){};
                    ~DynaMicDoubleByf(void);
  };


CArrayDouble * check;
DynaMicDoubleByf *test;
//--- input parameters
input int      Input1;
//--- indicator buffers
double         Label1Buffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   check = new CArrayDouble();
   test = new DynaMicDoubleByf();
   SetIndexBuffer(0, test.m_data,INDICATOR_DATA);
   
//---
   return(INIT_SUCCEEDED);
  }
 
Al_key:

Вроде понял: нужно примерно так это делать. Не знаю, правда, всплывут ли подводные камни от таких финтов.

Не всплывают. Несколько раз использовал такие конструкции, всё работает.
 
Sergei Vladimirov:
Не всплывают. Несколько раз использовал такие конструкции, всё работает.
Спасибо!