Как постоить индикатор с пользовательской функцией?

 
Привет всем!
Прошу помощи, никак не могу разобраться.

Как постоить индикатор с пользовательской функцией?
Допустим на примере Линейной регрессии, хотя мне это нужно для другой цели.

Нужно, чтобы задавая параметры Price=Close[i]; и допустим Period=21;
постоить индикатор, где все расчеты Линейной регрессии происходили бы в пользовательской функции.

Для примера привожу код постоения индикатора без пользовательской функции.



#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Blue
//-----------------------------
extern int p=21;
//------------------
double yx[];
double sx,sy,sxy,sx2,a,b;
//********************************************************************
int init() {
   SetIndexStyle(0,DRAW_LINE);
   SetIndexDrawBegin(0, p); 
   SetIndexBuffer(0,yx);
return(0); }
//********************************************************************
int start()  
    {
int cbi,i,n;
cbi=Bars-IndicatorCounted()-1;
//------------------------------ 
for(i=cbi; i>=0; i--) {
sx=0.0; sy=0.0; sxy=0.0; sx2=0.0; 
for (n=i; n<=i+p-1; n++) 
  {
    sx+=n; 
    sy+=Close[n]; 
    sxy+=(n)*Close[n]; 
    sx2+=MathPow(n,2); 
  }   
a=(sx*sy-p*sxy)/(MathPow(sx,2)-p*sx2);
b=(sy-a*sx)/p;
yx[i]=b+a*i; 
 }
//---------------------------------------------------
 return(0);  }



То есть нужно, чтобы участок после for(i=cbi; i>=0; i--) {
ситался бы в пользовательской функции, а результаты возвращались бы обратно в цикл.

Заранее благодарю - Александр.

 
объявляешь ВНЕ ф-ций init, deinit и start свою ф-цию, туда переносишь расчёты, результат возвращаешь =)
Примерно так (не проверял):
int start()  
    {
int cbi,i;
cbi=Bars-IndicatorCounted()-1;
//------------------------------ 
for(i=cbi; i>=0; i--)
{ yx[i]=MyFunc(i);  }
//---------------------------------------------------
 return(0);  }
double MyFunc( int i )
{
sx=0.0; sy=0.0; sxy=0.0; sx2=0.0; 
for (int n=i; n<=i+p-1; n++) 
  {
    sx+=n; 
    sy+=Close[n]; 
    sxy+=(n)*Close[n]; 
    sx2+=MathPow(n,2); 
  }   
a=(sx*sy-p*sxy)/(MathPow(sx,2)-p*sx2);
b=(sy-a*sx)/p;
return(b+a*i);
}
 
объявляешь ВНЕ ф-ций init, deinit и start свою ф-цию, туда переносишь расчёты, результат возвращаешь =)
Примерно так (не проверял):


Спасибо! А как теперь сделать MyFunc - библиолечной функцией и как ее вызвать в индикатор?

Заранее благодарю - Александр.
 
В сказке о Рыбаке и рыбке тоже начиналось все с корыта.
 
В сказке о Рыбаке и рыбке тоже начиналось все с корыта.

Подобрее пожалуйста, и если можете,- поменьше умничайте.

В Helpe я нашел, что можно использовать #include и #import, и очень сложный пример с stdlib.mq4
Насколько я понял МyFunc нужно поместить в какую-то папку, а потом вызвать.
Никак не могу разобраться, очень нало информации насчет этого.
Помогите пожалуйста разобраться. Если можно поподробней.
Я думаю это полезно не только мне, но и многим другим начинающим пользователям.

С уважением Александр.
 
объявляешь ВНЕ ф-ций init, deinit и start свою ф-цию, туда переносишь расчёты, результат возвращаешь =)
Примерно так (не проверял):


Спасибо за помощь, кажется разобрался.
Сделал так:

indicator
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Blue

//-----------------------------
extern int p=21;
//------------------
double yx[];
//********************************************************************
int init() {
   SetIndexStyle(0,DRAW_LINE);
   SetIndexDrawBegin(0, p); 
   SetIndexBuffer(0,yx);
return(0); }
//********************************************************************
int start()  
    {
int cbi,i;
cbi=Bars-IndicatorCounted()-1;
//------------------------------ 
for(i=cbi; i>=0; i--)
{ yx[i]=f_LR(i,p); }
//---------------------------------------------------
 return(0);  }
//------------------------
#import "f_LR.ex4"
double f_LR(int i,int p);



И пользовательская функция, которую положил в папку libraries:


#property library
//---------------------------------
double f_LR( int i,int p)

{ double sx,sy,sxy,sx2,a,b;

sx=0.0; sy=0.0; sxy=0.0; sx2=0.0; 
for (int n=i; n<=i+p-1; n++) 
  {
    sx+=n; 
    sy+=Close[n]; 
    sxy+=(n)*Close[n]; 
    sx2+=MathPow(n,2); 
  }   
a=(sx*sy-p*sxy)/(MathPow(sx,2)-p*sx2);
b=(sy-a*sx)/p;
return(b+a*i);
}
//---------------------------------



Все ли правильно сделал или можно было как-то лучше?

С уважением - Александр.

 
Я думаю это полезно не только мне, но и многим другим начинающим пользователям.

Никому это не полезно =) Потому что если бы было полезно, ты бы не спрашивал сейчас об этом - не раз уже обсуждалось...

По поводу ф-ции - лучше использовать include - он быстрее работает.
Единственное, чем может быть удобен import - это тем, что код там закрыт и можно типа продавать.
В остальном же инклуд - то же самое, только проще и удобнее.
Думаю, разберёшься.. Только не забудь #property library убрать ;)
 
Подскажите пожалуйта, как правильно сделать. А то совсем замучался.

Скажи, что ты пытался сделать (и почему), а я скажу что неправильно ;)
Только так можно чему-то научиться. По крайней мере, я так считаю...
 
Блин! Это я не Вам.

Никак не получается сделать чеpез include
все время вылезает:
'in_LR' - no any dll defined for imported function
Подскажите пожалуйта, как правильно сделать. А то совсем замучался.
Хотелось бы увидеть преимущество include.

C уважением Александр.
 
Стираю # property library, сохраняю в папке include,
вместо #import в индикаторе ставлю #include. Вроде все.
 
а справку по include почитать?)
во-первых, #include <f_LR.mq4>
во-вторых, в начале файла логичнее )
в-третьих, убрать из индикатора "double f_LR(int i,int p);"
Причина обращения: