Gleitender Durchschnitt aus gleitendem Durchschnitt

 
Hallo. Bitte schlagen Sie einen Indikator vor, bei dem ein gleitender Durchschnitt aus einem anderen gleitenden Durchschnitt gebildet wird.
 

ähm... Sehen Sie den Sinn darin? d.h. ist der MA-Indikator auf einem anderen MA aufgebaut?

Wäre es nicht einfacher, den Zeitraum in den MA-Einstellungen zu verlängern?)))

 

Versuchen Sie den MACD.

 

MA von MA - Sie erhalten eine glattere Kurve...

das nachstehende Diagramm zeigt drei Kurven

gelb ist die Anfangsperiode der MA

blau ist MA von MA

und die rosa ist MA mit einer doppelt so langen Periode wie die ursprüngliche

dieser Indikator zeigt die Differenz von MA: MA[x]-MA[x+n] (ROC)

Sie können sehen, dass der doppelte MA eine glattere Kurve hat

 
FOREXMASTER >> :

ähm... Sehen Sie den Sinn darin? d.h. ist der MA-Indikator auf einem anderen MA aufgebaut?

Wäre es nicht einfacher, den Zeitraum in den MA-Einstellungen zu verlängern?)))

meine Gedanken...meine Gedanken)

 
forte928 >> :

MA von MA - Sie erhalten eine glattere Kurve...

Können Sie mir den Code zeigen? =)

 
Ich verwende meine eigenen Funktionen, die ich auf der Grundlage dieser Formeln geschrieben habe und die Glättung verwenden...
 
//-------------------------------------------------------------------------------------------------
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 >> :

>> Vielen Dank!

 

ja, auch SMAOnArray verwendet ein zyklisches Summierfeld, um Summierzyklen zu reduzieren

//--------------------------------- 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);
}
//-------------------------------------------------------------------------
 
Wenn man Tiefpassfilter kaskadiert, gerät man in eine Zwickmühle.
Grund der Beschwerde: