線形回帰チャネル - ページ 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が分数であるため、中間値も得ることができます。また、同様の方法で実効値も計算してみました。多項式回帰も同じようにできると思います。現実的に必要なことでしょう。 少なくとも、私はまだ、収益性の高いExpert Advisorで多項式回帰を使用することはできていない。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が分数であるため、中間値も得ることができます。また、同様の方法で実効値も計算してみました。多項式回帰も同じようにできると思います。現実的に必要なことでしょう。少なくとも、私はまだ、収益性の高いExpert Advisorで多項式回帰を使用することはできていません。 EMA上のチャネルはよりシンプルで、実際にうまく機能する。

ここでは、mq4の線形回帰の少し複雑な変形を、ループのないRMSで説明します。開始時、正確には最初の読み取りを計算するときに一度だけサイクルがあり、その後は合計と差分のみとなります。もちろん、サイクルに比べて何倍もの速さで計算されます。

はい、その通りです。これは、線形回帰におけるサイクルフリー実効値計算の実例である。
確かに、アルゴリズムのどこかに小さな誤差があり、3本の線(チャンネルの中心、上限、下限)すべてが上にずれています。


 
Nikolai Semko:

はい、その通りです。これは、線形回帰におけるサイクルフリー実効値計算の実例である。
確かに、アルゴリズムのどこかに小さな誤差があり、3本の線(チャンネルの中心、上限、下限)すべてが上にずれています。


しかも、見開きの半分を足しただけです。私はかつて、取引用Expert Advisorをテストするために、Ask-Bidに相対するアライメントを持つようにしたことがあります。SPR=0 に設定すると、オフセットはありません。純粋に入札価格だけでカウントされます。
 
danminin:
この「ループしない」というのは、どんな効果があるのでしょうか?

コードの実行速度がどれくらい速くなるのか?

実効値計算だけで、周期にもよりますが、10倍から1000倍程度のゲインが得られます。

 
ANG3110:
しかも、見開きの半分が加わっているだけです。私は一度取引Expert Advisorをテストするために、アスク-ビッドに相対するアライメントを持つためにこれを行いました。SPR=0とすると、オフセットは発生しない。純粋に入札価格だけでカウントされます。

はい、その通りです。私の線形回帰の 実装と完全に一致します。

 
Yousufkhodja Sultonov:


スルトノフ指標はどうなっているのか?もうFXの背骨は折れたのか、それとも進行中なのか。
 
Vladimir Baskakov:
スルトノフ指標はどうなっているのか?すでにFXの背骨を折ったのか、それともその最中なのか?

このインジケータは、UPUの1セントリアル口座で、48c.u.の入金で「実行し忘れる」ベースで動作します。2ヶ月目は50前後で推移しており、どうやらその時を待っているようです。FXで年率10%以上の利益を安定的にリスクなく得ることは不可能であり、長年にわたり利益を再投資することが条件である - これがFXのバックボーンに関する私の結論である。8年前の性急な結論は、市場の現実に打ち砕かれた。強力な万能回帰モデルは、銀行的な利益を生み出し、惨憺たる結果に終わった。URMは、技術的、社会的、採掘(貧鉱から金を抽出すること)、その他のプロセスなど、市場要素を除くすべての要素について素晴らしい仕事をしています。結論は、回帰モデルは市場から利益を引き出す可能性が限定的であるということである。

理由: