移動平均から移動平均

 
こんにちは。移動平均を 他の移動平均から構築するようなインジケータを提案してください。
 

其のMAインジケータは、別のMAをベースに作られているのでしょうか?

MA設定で周期を長くするのが簡単ではないでしょうか)))

 
 

MAからMA-より滑らかな曲線が得られる...

下のグラフは3つのカーブを表しています。

黄色はMAの初期期間

ブルーはMAからMA

であり、ピンクのものは初期の2倍の周期を持つMAである

MA[x]-MA[x+n](ROC)の差分を表示するインディケータです。

ダブルMAがより滑らかなカーブを描いていることがわかります。

 
FOREXMASTER >> :

其のMAインジケータは、別のMAをベースに作られているのでしょうか?

MA設定で周期を長くするのが簡単ではないでしょうか)))

拙意)

 
forte928 >> :

MAからMA-より滑らかな曲線が得られる...

コードを見せてもらえますか?=)

 
そのスムージングを使った数式を元に自分で書いた関数を使っているのですが...。
 
//-------------------------------------------------------------------------------------------------
void EMAOnArray(double aySource[],double& ayResult[],int iPeriod,int iCount)
{
double iMuver=2/( iPeriod*1.0+1);
ayResult[ iCount-1]=0;
   for(int Ex= iCount-2; Ex>=0; Ex--) {
   ayResult[ Ex]= ayResult[ Ex+1]+ iMuver*( aySource[ Ex]- ayResult[ Ex+1]);
   }
return;
}
//--------------------------------- LagMAArrayShiftToCalc -----------------------------------
// Average square-law deviation
int SMAOnArray(double aySrcAk[],double& ayResult[],int iPeriod,int iCount)
{
double aySimple[];
ArrayResize( aySimple, iPeriod);
ArrayInitialize( aySimple,0.0);
double SMAValue=0;
int SMAIndex=0;
for (int Kx= iCount-1; Kx>=0; Kx--)
{
SMAValue= SMAValue- aySimple[ SMAIndex];
aySimple[ SMAIndex]=( aySrcAk[ Kx]);
SMAValue= SMAValue+ aySimple[ SMAIndex];
SMAIndex= MathCyclePrext( SMAIndex,1, iPeriod-1,0);
ayResult[ Kx]=( SMAValue/ iPeriod);
}
return;
}
//-------------------------------------------------------------------------------------------------
void ElasticMAOnArray(double aySource[],double& ayResult[],double iWeight,int iCount)
{
ayResult[ iCount-1]= aySource[ iCount-1];
ayResult[ iCount-2]= aySource[ iCount-2];
   for(int Ex= iCount-2; Ex>=0; Ex--) {
ayResult[ Ex]=(1- iWeight)*(2.* ayResult[ Ex+1]- ayResult[ Ex+2])+ iWeight* aySource[ Ex];
   }
return;
}
//------------------------------------------ PackToCalcLMAOnArray --------------------------
// MA_Method=3: LWMA - Linear Weighted Moving Average 
void LWMAOnArray(double aySource[],double& ayResult[],int iPeriod,int iCount)
{
for (int Ax= iCount-1; Ax>=0; Ax--){
double Sum = 0;
double Weight = 0;
for (int Px = 0; Px < iPeriod; Px++){ 
Weight= Weight+ ( iPeriod - Px);
Sum = Sum+ aySource[ Ax+ Px]*( iPeriod - Px);
}
if( Weight>0) ayResult[ Ax] = Sum/ Weight;
else ayResult[ Ax] = 0; 
}
return;
} 
//--------------------------------- LagMAArrayShiftToCalc -----------------------------------
// MA_Method=4: SineWMA - Sine Weighted Moving Average
void SineWMAOnArray(double aySource[],double& ayResult[],int iPeriod,int iCount)
{
double pi = 3.1415926535;
//double del = 0.5*pi/per;
for (int Ax= iCount-1; Ax>=0; Ax--){
double Sum = 0;
double Weight = 0;
for (int Px = 0; Px < iPeriod; Px++){ 
Weight= Weight+  MathSin( pi*( Px+1)/( iPeriod+1));
Sum = Sum+ aySource[ Ax+ Px]*MathSin( pi*( Px+1)/( iPeriod+1)); 
}
if( Weight>0) ayResult[ Ax] = Sum/ Weight;
else ayResult[ Ax] = 0; 
}
return;
}
void HMA_LWMAOnArray(double aySource[],double& ayResult[],int iPeriod,int iCount)
{
LWMAOnArray( aySource, ayTemp1,MathFloor( iPeriod/2), iCount);
LWMAOnArray( aySource, ayTemp2, iPeriod, iCount);
for (int Ax= iCount-1; Ax>=0; Ax--) ayTemp1[ Ax]=2.0* ayTemp1[ Ax]- ayTemp2[ Ax];
LWMAOnArray( ayTemp1, ayResult,MathFloor(MathSqrt( iPeriod)), iCount);
return;
}
 
forte928 >> :

>> ありがとうございました

 

SMAOnArrayも巡回型加算配列を使用することで、加算サイクルを減らすことができます。

//--------------------------------- MathCyclePrext -----------------------------------
// Cycle Countter to Prev or Next
int MathCyclePrext(int Index,int iIncrease,int iMaxIndex,int iMinIndex)
{
Index= Index+ iIncrease;
while ( Index< iMinIndex) Index= iMaxIndex-( iMinIndex- Index)+1;
while ( Index> iMaxIndex) Index= iMinIndex+( Index- iMaxIndex)-1;
return( Index);
}
//-------------------------------------------------------------------------
 
ローパスフィルターをカスケード接続し続ければ