//-------------------------------------------------------------------------------------------------------------- #property copyright "© mladen, 2024" #property link "mladenfx@gmail.com" //-------------------------------------------------------------------------------------------------------------- #property indicator_chart_window #property indicator_buffers 2 #property indicator_plots 1 #property indicator_label1 "Linear regression value" #property indicator_type1 DRAW_COLOR_LINE #property indicator_color1 clrDarkGray,clrMediumSeaGreen,clrDarkOrange #property indicator_width1 2 // // // input int inpPeriod = 25; // Period // // // double val[],valColor[]; //-------------------------------------------------------------------------------------------------------------- // //-------------------------------------------------------------------------------------------------------------- // // // int OnInit() { SetIndexBuffer(0,val ,INDICATOR_DATA); SetIndexBuffer(1,valColor,INDICATOR_COLOR_INDEX); // // // return(INIT_SUCCEEDED); } //-------------------------------------------------------------------------------------------------------------- // //-------------------------------------------------------------------------------------------------------------- // // // int OnCalculate(const int rates_total, const int prev_calculated, const int begin, const double& price[]) { int limit = (prev_calculated>0) ? prev_calculated-1 : 0; // // // for (int i=limit; i0) ? (val[i]>val[i-1]) ? 1 : (val[i]=m_work.period) { m_work.data[r].sumY = m_work.data[r-1].sumY + value - m_work.data[r-m_work.period].value; m_work.data[r].sumXY = m_work.data[r-1].sumXY + m_work.data[r].sumY - m_work.data[r-m_work.period].value*(m_work.period-1.0) - value; } else { m_work.data[r].sumY = value; m_work.data[r].sumXY = 0; // // // for (int k=1; k=k; k++) { m_work.data[r].sumY += m_work.data[r-k].value; m_work.data[r].sumXY += k*m_work.data[r-k].value; } } _slope = (m_work.period*m_work.data[r].sumXY - m_work.sumX * m_work.data[r].sumY) * m_work.divisor; _intercept = (m_work.data[r].sumY - _slope * m_work.sumX) / (double)m_work.period ; // // // return(_intercept + _slope*(m_work.period-1.0)); }