Проблему удалось решить самостоятельно
Вот правильный код:
Вот правильный код:
//maximal deviation
ln_maxDev = 0;
double deviation;
double dvalue = 0;
for (i = 0; i < n; i++)
{
dvalue = a + b * (i - 1);
deviation = MathAbs(Close[beginBar + i] - dvalue);
if (deviation >= ln_maxDev) ln_maxDev = deviation;
}
Обращаюсь с просьбой - помогите написать индикатор линейной регресии
Был у меня в МТ3 вот бюсь и не могу найти ошибку:
Был у меня в МТ3 вот бюсь и не могу найти ошибку:
//+------------------------------------------------------------------+
//| KVNLinearRegression.mq4 |
//| Copyright © 2008, MetaQuotes Software Corp. |
//| http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2008, MetaQuotes Software Corp."
#property link "http://www.metaquotes.net"
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 MediumBlue
//---- input parameters
extern int nn=21;
//---- buffers
double LR1[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
//---- indicators
SetIndexStyle(0,DRAW_LINE);
//SetIndexBuffer(0,ExtMapBuffer1);
SetIndexBuffer(0,LR1);
//----
return(0);
}
//+------------------------------------------------------------------+
//| пользовательский индикатор |
//+------------------------------------------------------------------+
int start()
{
int n,n1,n2;
double ssm1,ssm2,ssm3,ssm4,a,b,LR;
ssm1=0;
ssm2=0;
ssm3=0;
ssm4=0;
// for(n=0;n<=Bars;n++)
for(n=0;n<=100;n++)
{
for(n1=1;n1<=nn;n1++)
{
n2=n+n1-1;
ssm1=ssm1+n1*Close[n2];
ssm2=ssm2+n1;
ssm3=ssm3+Close[n2];
ssm4=ssm4+n1*n1;
}
//Индикатор строится по формуле:LR = at+b
//где LR - прогнозируемая "средняя" цена закрытия,
//t - момент времени,Pt - цены закрытия за n последних периодов.
//a = (n*СУММА (t*Pt) - СУММА(t)*CУММА(Pt))/(n*СУММА(t^2) - (СУММА(t))^2) - тангенс угла наклона линии регрессии,
//b = 1/n*(СУММА(Pt) - a*СУММА(t)), - смещение по горизонтали}
a=(nn*ssm1-ssm2*ssm3)/(nn*ssm4-ssm2*ssm2);
b=(1/nn)*(ssm3-a*ssm2);
LR=a*nn+b;
ssm1=0;
ssm2=0;
ssm3=0;
ssm4=0;
LR1[n]=LR;
}
//----
return(0);
}
//+------------------------------------------------------------------+
и ещё гиперболическая регрессия(тоже не могу найти ошибку)
//+------------------------------------------------------------------+
//| гиперболическая регрессия.mq4 |
//| Copyright © 2008, MetaQuotes Software Corp. |
//| http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2008, MetaQuotes Software Corp."
#property link "http://www.metaquotes.net"
//#property indicator_chart_window
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Red
//---- input parameters
extern int nn=21;
//---- buffers
double ExtMapBuffer1[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
//---- indicators
SetIndexStyle(0,DRAW_LINE);
SetIndexBuffer(0,ExtMapBuffer1);
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
int counted_bars=IndicatorCounted();
//----
double barr, as, bs,cs,ds,e, f,k,LR,ExtMapBuffer1[];
int n,n1;
// Индикатор Гиперболической Регресии
for (barr=0;barr<=100;barr++){
for (n=1;n<=nn;n++){
n1=barr+n-1;
as=as+1/n;
bs=bs+1/(n*n);
cs=cs+Close[n1];
ds=ds+Close[n1]/n;
}
e=nn*bs-as*as;
f=cs*bs-ds*as;
k=nn*ds-as*cs;
f=f/e;
k=k/e;
LR = f+k/nn;
as=0;
bs=0;
cs=0;
ds=0;
ExtMapBuffer1[n]=LR;
}
//----
return(0);
}
//+------------------------------------------------------------------+
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Использую найденный здесь код, однако границы с графическим инструментом не совпадают:
Вот здесь "Вопрос к разработчикам по поводу "Канала линейной регрессии"" ANG3110 писал об ошибке расчета границ, но его пример кода тоже не работает.
Используемый код:
void linreg(int beginBar, int endBar) { int n = endBar - beginBar + 1; // calculate price values double value = Close[beginBar]; double a, b, c; double sumy = value; double sumx = 0.0; double sumxy = 0.0; double sumx2 = 0.0; for (int i = 1; i < n; i++) { value = Close[beginBar + i]; sumy += value; sumxy += value * i; sumx += i; sumx2 += i * i; } c = sumx2 * n - sumx * sumx; if (c == 0.0) return; b = (sumxy * n - sumx * sumy) / c; a = (sumy - sumx * b) / n; ln_endValue = a; ln_beginValue = a + b * (n - 1); //maximal deviation ln_maxDev = 0; double deviation; double dvalue = a; for (i = 0; i < n; i++) { dvalue += b; deviation = MathAbs(Close[beginBar + i] - dvalue); if (deviation >= ln_maxDev) ln_maxDev = deviation; } }