线性回归渠道 - 页 17

 

我愿意相信,许多功能可以通过加速计算来实现。比如从一个时期的末尾减去一个值,然后在开头加上一个新的值,没有循环。

特别是,这里有一个例子,你可以计算几种类型的过滤器,从简单的挥舞到线性回归,没有一个周期。

#property indicator_chart_window 
#property indicator_buffers 2 
#property indicator_plots   1  
#property indicator_type1   DRAW_COLOR_LINE 
#property indicator_color1  clrDeepSkyBlue,clrBisque 
#property indicator_width1  2 
//********************************************************************
input int    p = 24;
input double N = 3;
//********************************************************************
double ss[],col[];
double ci,sum1,sum2,c1,c2,mai,lwi,fxi;
 int w,fs;
//********************************************************************
int OnInit()
{
   SetIndexBuffer(0,ss,INDICATOR_DATA); 
   SetIndexBuffer(1,col,INDICATOR_COLOR_INDEX); 
   //------------------------------------------
   PlotIndexSetInteger(0,PLOT_LINE_COLOR,0,clrDeepSkyBlue);
   PlotIndexSetInteger(0,PLOT_LINE_COLOR,1,clrBisque);
   //------------------------------------------
   
   return(INIT_SUCCEEDED);
}
//********************************************************************
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[])
{
   //--------------------------------------------------------
   if (prev_calculated==rates_total) return(rates_total);
   int start=prev_calculated; 
   if (prev_calculated==0) 
   {
      start=p; 
      
      int k=0; w=0; sum1=0; sum2=0;
      for(int j=p-1; j>=0; j--)
      {
         k++;
         ci=open[start-j];
         sum1+=ci; 
         sum2+=k*ci; 
         w+=k; 
      }
      mai=sum2/w; ss[start]=mai; 
      ci=open[start]; 
      sum1-=ci; sum2-=ci*p;
      start++;
   }
   //--------------------------------------------------------
   for(int i=start; i<rates_total; i++)
   {
      c1=open[i-1];  
      c2=open[i-p]; 
      
      sum1+=c1-c2;
      sum2+=c1*p-c2-sum1;
         
      ci=open[i]; 
      
      lwi=(sum2+ci*p)/w;
      mai=(sum1+ci)/p;
      
      fxi=mai+(lwi-mai)*N;
      
      ss[i]=fxi;
      
      if (ss[i]>ss[i-1]) fs=0; else  
      if (ss[i]<ss[i-1]) fs=1; 
      
      if (fs==0) col[i]=0; else col[i]=1;   
   }
   //--------------------------------------------------------
   return(rates_total);
}
//********************************************************************

这里的N=0--正常SMA,N=1--线性加权,N=3--线性回归。而且你也可以得到中间值,因为N是小数。我也以类似的方式计算了RMS。我认为多项式回归也可以用同样的方式进行。这将是一种实际的需要。 至少,我还没有设法在盈利的专家顾问系统中使用多项式回归。EMA上的通道更简单,而且在实践中运作良好。

这里是一个略带矫揉造作的对mq4的线性回归的变体,其RMS没有周期。在启动时有一次循环,或者更准确地说,在计算第一组数值时有一次循环,仅此而已,--然后只有和和差。当然,它比使用周期要快得多。 一个微妙之处在于,周期是以小时为单位指定的,在切换时间框架时要重新计算。

#property strict
#property indicator_chart_window
#property indicator_buffers 6
#property indicator_color1 clrDodgerBlue
#property indicator_color2 clrOrangeRed
#property indicator_color3 clrLavender
#property indicator_color4 clrLavender
#property indicator_color5 clrMediumAquamarine
#property indicator_color6 clrMagenta
#property indicator_width1 2
#property indicator_width2 2
#property indicator_style5 2
#property indicator_type1 DRAW_LINE
#property indicator_type2 DRAW_LINE
#property indicator_type3 DRAW_LINE
#property indicator_type4 DRAW_LINE
#property indicator_type5 DRAW_LINE
#property indicator_type6 DRAW_LINE
//===========================
extern double hrLR = 12;
extern double ksq  = 1;
extern int    i0   = 1;
extern int    SPR  = 1;
//===========================
double ss[],ssL[],sH[],sL[],ma[],sU[];
double lri,sq,mai,ui,spr2;
int p,fs;
//******************************************************************
int init() 
{
   SetIndexBuffer(0,ss);
   SetIndexBuffer(1,ssL); SetIndexEmptyValue(1,0);
   SetIndexBuffer(2,sH);
   SetIndexBuffer(3,sL);
   SetIndexBuffer(4,ma);
   SetIndexBuffer(5,sU);
   //--------------------
   p=int(hrLR*60/Period()); if (p<3) p=3;
   if (SPR<0) spr2=-SPR*Point/2;
   
   return(0);
}
//******************************************************************
int start() 
{
   int cbi=Bars-IndicatorCounted()-1; if (cbi<0) return(-1);
   if (i0==1 && cbi==0) return(0); if (cbi==1) cbi=0;
   if (SPR>0) spr2=NormalizeDouble(Ask-Bid,Digits)/2;
   if (cbi>1)
   { 
      cbi=Bars-p-1; 
   
      af_LR0(0,cbi); ui=mai; 
   }
   //------------------------------
   for(int i=cbi; i>=0; i--) 
   { 
      lri=af_LR0(1,i);
      
      ss[i]=lri;
      sH[i]=lri+sq;
      sL[i]=lri-sq;
      ma[i]=mai;
      
      if (sL[i]>ui) ui=sL[i]; else if (sH[i]<ui) ui=sH[i];
      
      sU[i]=ui;
      
      if (ss[i]>ss[i+1]) fs=1;
      if (ss[i]<ss[i+1]) {if (fs==1) ssL[i+1]=ss[i+1]; fs=2;}
      if (fs==2) ssL[i]=ss[i]; else if (fs==1) ssL[i]=0.0; 
   }
   return(0);
}
//********************************************************************
double af_LR0(int index, int i)
{
   static double sx,syp,sxy,syyp,S;
   double ci=0,c1=0,cp=0,sy,syy,aa,bb;
   static int ti;
   
   if (index==1)
   {
      if (ti!=Time[i]) 
      {
         if (i0==0) {c1=Close[i+1]+spr2; cp=Close[i+p]+spr2;} else
         if (i0==1) {c1=Open[i+1]+spr2; cp=Open[i+p]+spr2;} else
         if (i0==2) {c1=(High[i+1]+Low[i+1])/2+spr2; cp=(High[i+p]+Low[i+p])/2+spr2;}
         
         sxy+=syp+c1-p*cp; 
         syp+=c1-cp;
         syyp+=c1*c1-cp*cp; 
         ti=int(Time[i]);
      }
   }
   else
   {
      int j;
      double sxx;
      
      sx=0.0; sxx=0.0; 
      for (j=0; j<p; j++) {sx+=j; sxx+=j*j;} 
      S=sx*sx-p*sxx;
      
      syp=0.0; sxy=0.0; syyp=0.0;
      for (j=1; j<p; j++) 
      {
         if (i0==0) ci=Close[i+j]+spr2; else
         if (i0==1) ci=Open[i+j]+spr2; else
         if (i0==2) ci=(High[i+j]+Low[i+j])/2+spr2;
         
         syp+=ci; 
         sxy+=j*ci;
         syyp+=ci*ci;
      }
      
      ti=int(Time[i]);
   }
   
   if (i0==0) ci=Close[i]+spr2; else
   if (i0==1) ci=Open[i]+spr2; else
   if (i0==2) ci=(High[i]+Low[i])/2+spr2;
         
   sy=syp+ci; 
   syy=syyp+ci*ci;
   
   aa=(sx*sy-p*sxy)/S; 
   bb=(sy-aa*sx)/p;
   
   sq = (syy - aa*sxy - bb*sy)/(p-2); 
   if (sq>=0) sq = MathSqrt(sq)*ksq;
   
   mai=sy/p;
      
   return(bb);
}
//********************************************************************

 
Yousufkhodja Sultonov:

为什么费多谢耶夫会自我离去,推理正确?

因为他的推理是不正确的。
阅读该主题。

 
"无环 "对你有什么作用?

它能在多大程度上加快代码执行速度?
 
danminin:
"无环 "对你有什么作用?它能使你的代码运行快多少?

事实上,有很多。我曾经用GetTickCount() 来测量它。但是,当你需要做大量的优化时,它就很明显了。一件事是当你必须在几个小时内计算大量的变体时,另一件事是当你必须在几十分钟或几单位的时间内完成。但这很少需要。这就是为什么你可能不会太在意它。
 
ANG3110:

我愿意相信,许多功能可以通过加速计算来实现。比如从一个时期的末尾减去一个数值,然后在开头加上一个新的数值,没有循环。

特别是,这里有一个例子,你可以计算几种类型的过滤器,从简单的挥舞到线性回归,没有循环。

这里的N=0--正常SMA,N=1--线性加权,N=3--线性回归。而且你也可以得到中间值,因为N是小数。我也以类似的方式计算了RMS。我认为多项式回归也可以用同样的方式进行。这将是一种实际的需要。至少,我还没有设法在盈利的专家顾问系统中使用多项式回归。 EMA上的通道更简单,而且在实践中运作良好。

这里是mq4中线性回归的一个稍加修改的变体,有RMS无循环。在启动时有一次循环,或者更准确地说,在计算第一个读数时有一次循环,就是这样--然后只有和与差。当然,它的计算速度比用周期计算快很多倍。

是的,这是正确的。这是线性回归中无周期RMS计算的一个真实例子。
的确,在算法的某个地方有一个小错误,导致所有三条线(通道的中心、上限和下限)都向上移动。


 
Nikolai Semko:

是的,这是正确的。这是线性回归中无周期RMS计算的一个真实例子。
的确,在算法的某个地方有一个小错误,导致所有三条线(通道的中心、上限和下限)都向上移动。


而这只是一半的价差加起来。我曾经这样做过,以测试一个交易专家顾问,使之与 "要价 "相对应。如果你设置SPR=0,就不会有偏移。它将纯粹以投标价格计算。
 
danminin:
这个 "无环 "对你有什么作用?

它能使你的代码运行快多少?

仅仅是有效值的计算就可以得到大约10到1000倍的增益,这取决于周期。

 
ANG3110:
而且还只是加入了一半的价差。我曾经这样做是为了测试一个交易专家顾问,以使其相对于 - Ask-Bid的对齐方式。如果我们设置SPR=0,就不会有偏移。它将纯粹以投标价格计算。

是的,没错。与我的线性回归 实现完全匹配。

[删除]  
Yousufkhodja Sultonov:


苏尔托诺夫指标表现如何?它是否已经打破了外汇的背面,还是正在进行中?
 
Vladimir Baskakov:
苏尔托诺夫指标表现如何?它是否已经打破了外汇的背面,或正在这样做?

该指标在UPU的1美分真实账户 上工作,在 "运行和忘记 "的基础上,存款为48美分。第二个月它一直在50左右徘徊,显然是在等待时机。在外汇市场上不可能每年获得超过10%的收益,稳定且无风险,前提是多年的利润再投资--这些是我对外汇市场骨干的结论。8年前的草率结论被市场的现实打碎了。强大的通用回归模型惨遭失败,产生了银行般的利润。除了市场因素,URM在所有技术、社会、采矿(从贫瘠的矿石中提取黄金)和其他过程方面都做得很好。结论是,回归模型从市场中提取利润的潜力有限。