Не получается передать индикаторный массив в статическую функцию класса

 

Пробую использовать библиотеку https://www.mql5.com/ru/code/11077

На глобальном уровне индикатора

#include <Math\Alglib\fasttransforms.mqh>

CFastFourierTransform ar;

в самом индикаторе передаю индикаторный буфер(ExtMapBuffer12) и количество N

ar.FFTC1D(ExtMapBuffer12,N);

 выходит ошибка 'ExtMapBuffer12' - parameter conversion not allowed


ALGLIB - библиотека численного анализа
ALGLIB - библиотека численного анализа
  • голосов: 32
  • 2013.12.18
  • MetaQuotes Software Corp.
  • www.mql5.com
Библиотека математических функций ALGLIB version 3.5.0, портированная на MQL4.
 
forexman77:

Пробую использовать библиотеку https://www.mql5.com/ru/code/11077

На глобальном уровне индикатора

в самом индикаторе передаю индикаторный буфер(ExtMapBuffer12) и количество N

 выходит ошибка 'ExtMapBuffer12' - parameter conversion not allowed



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

CFastFourierTransform* ar = new CFastFourierTransform;

// и потом не забыть удалить, если не нужен
delete ar;

**

 

Прочел в инструкции библиотеки, что:

INPUT PARAMETERS                                                     |
//|     A   -   array[0..N-1] - complex function to be transformed   |
//|     N   -   problem size 

сложная функция должна быть преобразована. Как это понимать?

 
Alexey Volchanskiy:

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

**


Сделал так. Та же ошибка. На сам индикатор не обращайте внимание он корректный, я там вызов класса косой чертой обозначил.

#include <MovingAverages.mqh>
#include <Math\Alglib\fasttransforms.mqh>
//+------------------------------------------------------------------+
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1  Yellow
#property indicator_level1 -25           // значение уровня #0 на вертикальной оси
#property indicator_level2 25            // значение уровня #1 на вертикальной оси
#property indicator_level3 0           
//--- input parameters
extern int       Period_MA_1=1;
extern int       p2_ =20;
extern int       p3_ =5;
extern int       p4_ =3;
extern int       N   =50;
//--- buffers
double ExtMapBuffer1[];
double ExtMapBuffer3[];
double ExtMapBuffer4[];
double ExtMapBuffer5[];
double ExtMapBuffer6[];
double ExtMapBuffer7[];
double ExtMapBuffer8[];
double ExtMapBuffer9[];
double ExtMapBuffer10[];
double ExtMapBuffer11[];
double ExtMapBuffer12[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   IndicatorBuffers(11);
   SetIndexBuffer(0,ExtMapBuffer1);
   SetIndexBuffer(1,ExtMapBuffer3);
   SetIndexBuffer(2,ExtMapBuffer4);
   SetIndexBuffer(3,ExtMapBuffer5);
   SetIndexBuffer(4,ExtMapBuffer6);
   SetIndexBuffer(5,ExtMapBuffer7);
   SetIndexBuffer(6,ExtMapBuffer8);
   SetIndexBuffer(7,ExtMapBuffer9); 
   SetIndexBuffer(8,ExtMapBuffer10);
   SetIndexBuffer(9,ExtMapBuffer11); 
   SetIndexBuffer(10,ExtMapBuffer12);
   ArraySetAsSeries(val,true); 
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   int i,limit,BEGUN;
   double max=0.0,min=0.0;
//--- если это первый вызов 
   BEGUN=1+p2_+p3_+p4_+Period_MA_1;
   if (prev_calculated==0)limit=rates_total-BEGUN;
   else
   limit=rates_total-prev_calculated;
   for(i=limit;i>=0;i--){ExtMapBuffer3[i]=0.0;max=high[i]-high[i+Period_MA_1];if (max>0.0){ExtMapBuffer3[i]=max;}}
   for(i=limit;i>=0;i--){ExtMapBuffer4[i]=0.0;min=-1*(low[i]-low[i+Period_MA_1]);if (min>0.0){ExtMapBuffer4[i]=min;}}
   for(i=limit;i>=0;i--)
   {
   ExtMapBuffer5[i]=ExtMapBuffer3[i]-ExtMapBuffer4[i];
   ExtMapBuffer6[i]=MathAbs(ExtMapBuffer5[i]);
   }
   ExponentialMAOnBuffer(rates_total,prev_calculated,BEGUN,p2_,ExtMapBuffer5,ExtMapBuffer7);
   ExponentialMAOnBuffer(rates_total,prev_calculated,BEGUN,p2_,ExtMapBuffer6,ExtMapBuffer8);
   ExponentialMAOnBuffer(rates_total,prev_calculated,BEGUN,p3_,ExtMapBuffer7,ExtMapBuffer9);
   ExponentialMAOnBuffer(rates_total,prev_calculated,BEGUN,p3_,ExtMapBuffer8,ExtMapBuffer10);
   ExponentialMAOnBuffer(rates_total,prev_calculated,BEGUN,p4_,ExtMapBuffer9,ExtMapBuffer11);
   ExponentialMAOnBuffer(rates_total,prev_calculated,BEGUN,p4_,ExtMapBuffer10,ExtMapBuffer12);

   for(i=limit;i>=0;i--){if(ExtMapBuffer12[i]!=0.0)ExtMapBuffer1[i]=100*ExtMapBuffer11[i]/ExtMapBuffer12[i];}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////

  CFastFourierTransform* ar = new CFastFourierTransform;      ar.FFTC1D(ExtMapBuffer1,N);      delete ar;   //--- return value of prev_calculated for next call    return(rates_total);   }
 
forexman77:

Пробую использовать библиотеку https://www.mql5.com/ru/code/11077

На глобальном уровне индикатора

в самом индикаторе передаю индикаторный буфер(ExtMapBuffer12) и количество N

 выходит ошибка 'ExtMapBuffer12' - parameter conversion not allowed


Так массив-то в фурье в функции FFTC1D типа complex! По типу подошел бы другой метод - FFTR1D, но не факт что это то, что требуется в прикладной задаче.

 
Stanislav Korotky:

Так массив-то в фурье в функции FFTC1D типа complex! По типу подошел бы другой метод - FFTR1D, но не факт что это то, что требуется в прикладной задаче.


Как его сделать complex? Первый раз начинаю работать с библиотеками, не совсем все там понятно. Это же обычные функции, в которые нужно передавать параметры?

 

Наверно другой метод надо использовать - FFTR1D().

Массив комплекс числе должно быть для результата используется. Или же как входные данные для обратного преобразования.

 
Dmitry Fedoseev:

Наверно другой метод надо использовать - FFTR1D().

Массив комплекс числе должно быть для результата используется. Или же как входные данные для обратного преобразования.


В функции FFTR1D(), если правильно понимаю передается массив для Фурье, количество элементов и массив для записи после преобразования.

Дополнительно сделал еще один индикаторный массив "F"  и пробую так:

ar.FFTR1D(ExtMapBuffer1,N,F);

все равно та же ошибка:

'F' - parameter conversion not allowed  HLM_Er_f.mq4    89      29

Чего-то не так наверное делаю?

 

FFTR1D(double &a[],const int n,complex &f[]);

массив a - double, массив f - complex

 
Dmitry Fedoseev:

FFTR1D(double &a[],const int n,complex &f[]);

массив a - double, массив f - complex


Как мне сделать массив F complex? Почитать про него найти даже не могу?)

 
forexman77:

Как мне сделать массив F complex? Почитать про него найти даже не могу?)


Структура описана в файле complex.mqh.

Объявлять так:

complex f[];

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