Глюки в работе индикатора(системы),недокументированное поведение или моя ошибка? Помогите разобраться.

 

Имеется индикатор в функции start() которого вызывается функция из подключаемой внешней DLL(код индикатора и файлы индикатора, и DLL прилагаются):

//+------------------------------------------------------------------+
//| test_ind_1.mq4 |
//| Copyright © 2010, Alex Mel |
//| wgann@bk.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2010, Alex Mel"
#property link "wgann@bk.ru"
#property indicator_chart_window

#import "testdll1.dll"

bool fnLoadLibrary();
int fnCalculateShortSwings(double rates[][6],int,double ShortTerm[][3],int);
#import

// Открытие индикаторных массивов
double ShortTermBuf[],ShortTerm[2][3];
//

bool first_time;//флаг того,что функция старт запускается первый раз и соответственно посчитанных баров 0

//функция заполнения индикаторного буфера и отрисовки линий
int PaintShortSwings(int j)
{
int arr_idx=0;
while(j>=1)
{
if(j==ShortTerm[arr_idx][0])
{
ShortTermBuf[j]=ShortTerm[arr_idx][2];
Print(DoubleToStr(ShortTerm[arr_idx][2],5));//заполнен ли массив
arr_idx++;
}
j--;
}

return;
}
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
//проверка на загрузку библиотеки
if(fnLoadLibrary())
Print("The library testdll1.dll is successfully loaded");
else
Print("The library testdll1.dll is not loaded");

//---- indicators
SetIndexBuffer(0,ShortTermBuf); // Назначение массива буферу
SetIndexStyle (0,DRAW_SECTION,STYLE_SOLID,2);// Стиль линии

//----
first_time=false;
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----

//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
int i,total_short_swings,counted_bars;
double rates[][6];
//----
ArrayResize(ShortTerm,Bars);
counted_bars=IndicatorCounted();
ArrayCopyRates(rates);

if(first_time)
{
i=Bars-counted_bars;
total_short_swings=fnCalculateShortSwings(rates,Bars,ShortTerm,i);//возвращается кол-во вычисленных значений
if(total_short_swings>0)
{
Print("total_short_swings ",total_short_swings);
Print("ShortTerm[0][2] ",DoubleToStr(ShortTerm[0][2],5));
PaintShortSwings(i);
}
}
else if(!first_time)
{
i=Bars-counted_bars-1;
total_short_swings=fnCalculateShortSwings(rates,Bars,ShortTerm,i);
if(total_short_swings>0)
{
Print("total_short_swings ",total_short_swings);
Print("ShortTerm[0][0] ",ShortTerm[0][0]);
Print("ShortTerm[0][1] ",ShortTerm[0][1]);
Print("ShortTerm[0][2] ",DoubleToStr(ShortTerm[0][2],5));
PaintShortSwings(i);
first_time=true;
}
}
//----
return(0);
}
//+------------------------------------------------------------------+


 Непонятное поведение заключается в том,что при запуске индикатора как есть срабатывает сперва тот Print, который расположен в функции PaintShortSwings, при этом он выводит НЕ пустые значения массива ShortTerm, а это в свою очередь означает, что вызов DLL тоже срабатывает иначе откуда взяться значениям в этом массиве, но вызовы Print которые расположены в Init() и в Start() но ДО PaintShortSwings почему-то не срабатывают.

Если же за комментировать вызов PaintShortSwings, то все срабатывает в то порядке в каком по идее и должно.

 

В чем проблема или мое непонимание работы пока не разобрался.

Файлы:
 

что это за объявления - типы есть а переменных нет ?

int fnCalculateShortSwings(double rates[][6],int,double ShortTerm[][3],int);

 
keekkenen:

что это за объявления - типы есть а переменных нет ?

int fnCalculateShortSwings(double rates[][6],int,double ShortTerm[][3],int);



Да дело к сожалению не в этом абсолютно.

Если хотите посмотрите пример в папке Метатрейдера  C:\Program Files\MetaTrader - Alpari\experts\samples\include\ sampledll.mqh

У Вас путь может быть другой. 

 

не знаю что у вас срабатывает, а у меня выдает

2010.07.21 23:14:31 test_ind_1 EURJPY,M15: cannot load library 'testdll1.dll' (error 126)

 
keekkenen:

не знаю что у вас срабатывает, а у меня выдает

2010.07.21 23:14:31 test_ind_1 EURJPY,M15: cannot load library 'testdll1.dll' (error 126)

У Вас скорее всего не разрешены DLL в настройках терминала.

Проверьте.

И еще проверьте где лежит DLL. Она должна лежать в C:\Program Files\MetaTrader - Alpari\experts\libraries. 

Хотя последнее и необязательно,просто сперва она ищется средой именно там. 

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