Как использовать DLL в индикаторе?

 

Доброго времени суток.
Как использовать DLL в индикаторе? Если в индикаторе создаю массив, передаю его в DLL, возвращаю результат, всё OK.
Если пробую передать константные переменные, то возвращается что-то другое.
DLL:

extern "C" __declspec(dllexport) double Sum(const int rates_total, const double *close){
        return close[0] + close[1];
}

Индикатор:

#import "testDLL.dll"
double Sum(
    const int rates_total,
    const double &close[]
);
#import

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[]) {

   double sum = Sum(rates_total, close);
   Print(sum);
    

   return(rates_total);
}

Результат:

testDLL #Bitcoin,M1: 1.722472325793063e-314
 

Слушайте, я ни разу не пытался работать с .dll и то понимаю, что если в .dll функция работы с массивом, то и подавать в неё надо массив.

А если вам нужно обработать константное значение, то в .dll должна быть соответствующая функция…

 
fxCoder123:

Доброго времени суток.
Как использовать DLL в индикаторе? Если в индикаторе создаю массив, передаю его в DLL, возвращаю результат, всё OK.
Если пробую передать константные переменные, то возвращается что-то другое.
DLL:

Индикатор:

Результат:

напечатайте рядом 

PrintFormat("%f + %f = %f",close[0],close[1],close[0]+close[1]);

всё должно встать на свои места ;-)

PS/ индексация массива - не как в таймсерии, close[0] - самое-самое старое значение. Там вообще может быть EMPTY_VALUE или прочий мусор

 

В DLL передается ведь не ссылка на массив, а указатель. Значит, и работать с ним нужно как с указателем:

extern "C" __declspec(dllexport) double Sum(const int rates_total, const double *close)
{
   double *pfClose0 = close;
   double *pfClose1 = ++close;
   return *pfClose0 + *pfClose1;
}

Правда, не уверен насчет разыменования указателя. Возможно, все-таки const нужно убрать.

 
Ihor Herasko #:

В DLL передается ведь не ссылка на массив, а указатель. Значит, и работать с ним нужно как с указателем:

Правда, не уверен насчет разыменования указателя. Возможно, все-таки const нужно убрать.

в С можно по всякому..можно как с массивом, можно как с указателем. получил адрес и вертись как хочешь :-)

можно даже так: 

return 0[close]+1[close]; // ога, так можно