//+------------------------------------------------------------------+ //| AR_Extrapolator_of_Price.mq5 | //| Copyright gpwr | //+------------------------------------------------------------------+ #property copyright "gpwr" #property version "1.00" #property description "Extrapolation of open prices by autoregressive (AR) model" #property indicator_chart_window #property indicator_buffers 2 #property indicator_plots 2 //--- future model outputs #property indicator_label1 "Modeled future" #property indicator_type1 DRAW_LINE #property indicator_color1 Red #property indicator_style1 STYLE_SOLID #property indicator_width1 1 //--- past model outputs #property indicator_label2 "Modeled past" #property indicator_type2 DRAW_LINE #property indicator_color2 Blue #property indicator_style2 STYLE_SOLID #property indicator_width2 1 //--- indicator inputs input bool UseDiff =false; // Use price difference input int Ncoef =150; // Model coefficients (model order) input int Nfut =100; // Future bars input double kPast =3; // Past bars in increments of Ncoef (must be >=1) //--- global variables int Npast,dN; //--- indicator buffers double ym[],xm[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ void OnInit() { //--- initialize global variables Npast=int(kPast*Ncoef); if(UseDiff) dN=1; else dN=0; //--- indicator buffers mapping ArraySetAsSeries(xm,true); ArraySetAsSeries(ym,true); SetIndexBuffer(0,ym,INDICATOR_DATA); SetIndexBuffer(1,xm,INDICATOR_DATA); IndicatorSetInteger(INDICATOR_DIGITS,_Digits); IndicatorSetString(INDICATOR_SHORTNAME,"AR("+string(Npast)+","+string(Ncoef)+")"); PlotIndexSetInteger(0,PLOT_SHIFT,Nfut); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ 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 &tick_volume[], const long &volume[], const int &spread[]) { //--- check for insufficient data if(rates_total 1.0) r= 1.0; if(r<-1.0) r=-1.0; } else { for(int i=k;i=k;i--) { tmp=df[i]; df[i]+=r*db[i-1]; db[i]=db[i-1]+r*tmp; } } } //+------------------------------------------------------------------+