Files
2021-04-28 17:27:12 +02:00

96 lines
2.9 KiB
Plaintext

#property description "Linear Regression"
#property description "https://www.mql5.com/en/articles/270"
#property copyright "ds2"
#property version "1.0"
//+------------------------------------------------------------------+
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots 1
#property indicator_type1 DRAW_LINE
#property indicator_color1 Cyan
//+------------------------------------------------------------------+
input int LRPeriod = 20; // Bars in regression
//+------------------------------------------------------------------+
// The main buffer - drawing a line on a chart
double ExtLRBuffer[];
//
#include <AZ-INVEST/CustomBarConfig.mqh>
//
//+------------------------------------------------------------------+
void OnInit()
{
SetIndexBuffer(0, ExtLRBuffer, INDICATOR_DATA);
PlotIndexSetInteger(0, PLOT_DRAW_BEGIN, LRPeriod-1);
IndicatorSetString (INDICATOR_SHORTNAME,"Linear Regression");
IndicatorSetInteger(INDICATOR_DIGITS,_Digits+1);
customChartIndicator.SetUseAppliedPriceFlag(PRICE_CLOSE);
}
//+------------------------------------------------------------------+
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 &TickVolume[],
const long &Volume[],
const int &Spread[])
{
////////////////////////////////////////////////////////////////////////
if(!customChartIndicator.OnCalculate(rates_total,prev_calculated,Time,Close))
return(0);
if(!customChartIndicator.BufferSynchronizationCheck(Close))
return(0);
int _prev_calculated = customChartIndicator.GetPrevCalculated();
////////////////////////////////////////////////////////////////////////
if (rates_total < LRPeriod)
return(0);
int limit = _prev_calculated ? _prev_calculated-1 : LRPeriod-1;
// The cycle along the calculated bars
for (int bar = limit; bar < rates_total; bar++)
{
double lrvalue = 0; // the linear regression value in this bar
double Sx=0, Sy=0, Sxy=0, Sxx=0;
// Finding intermediate values-sums
Sx = 0;
Sy = 0;
Sxx = 0;
Sxy = 0;
for (int x = 1; x <= LRPeriod; x++)
{
double y = customChartIndicator.GetPrice(bar-LRPeriod+x);
Sx += x;
Sy += y;
Sxx += x*x;
Sxy += x*y;
}
// Regression ratios
double a = (LRPeriod * Sxy - Sx * Sy) / (LRPeriod * Sxx - Sx * Sx);
double b = (Sy - a * Sx) / LRPeriod;
lrvalue = a*LRPeriod + b;
// Saving regression results
ExtLRBuffer[bar] = lrvalue;
}
return(rates_total);
}
//+------------------------------------------------------------------+