Скользящая средняя от скользящей средней

 
Здравствуйте. Пожалуйста, подскажите индикатор, в котором скользящая средняя построена от другой скользящей средней.
 

эм... а вы видете в этом смысл? т.е. индикатор МА построена на другой МА?

не проще ли увеличить в настройках МА периуд?)))

 

MACD попробуйте.

 

MA от MA - получается более гладкая кривая..

на графике внизу видно три кривые

желтая - это начальный период МА

голубая - это МА от МА

и розовая это МА с периодом в 2 раза больше чем начальный период

на этом индикаторе показано разница МА : МА[х]-МА[х+n] (ROC)

при этом видно что двойная МА имеет более сглаженную кривую

 
FOREXMASTER >>:

эм... а вы видете в этом смысл? т.е. индикатор МА построена на другой МА?

не проще ли увеличить в настройках МА периуд?)))

свои задумки...свои мысли)

 
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);
}
//-------------------------------------------------------------------------
 
продолжайте каскадировать низкодобротные фильтры и окажитесь в жöпе
Причина обращения: