mirror of
https://github.com/softwaredevelop/mql5.git
synced 2026-08-03 23:57:44 +00:00
refactor: calculate the signal line
This commit is contained in:
@@ -157,43 +157,53 @@ int OnCalculate(const int rates_total,
|
||||
}
|
||||
|
||||
//--- STEP 3: Calculate the signal line (MA of Cutler's RSI)
|
||||
// --- FIX: Correct starting position for the MA calculation ---
|
||||
int ma_start_pos = g_ExtPeriodRSI + g_ExtPeriodMA - 1;
|
||||
for(int i = ma_start_pos; i < rates_total; i++)
|
||||
{
|
||||
// --- FIX: Full, robust switch block for all MA types ---
|
||||
switch(InpMethodMA)
|
||||
{
|
||||
case MODE_EMA:
|
||||
if(i == ma_start_pos)
|
||||
{
|
||||
double sum = 0;
|
||||
for(int j = 0; j < g_ExtPeriodMA; j++)
|
||||
sum += BufferCutlerRSI[i - j];
|
||||
BufferCutlerRSI_MA[i] = sum / g_ExtPeriodMA;
|
||||
}
|
||||
else
|
||||
{
|
||||
double pr = 2.0 / (g_ExtPeriodMA + 1.0);
|
||||
BufferCutlerRSI_MA[i] = BufferCutlerRSI[i] * pr + BufferCutlerRSI_MA[i-1] * (1.0 - pr);
|
||||
}
|
||||
break;
|
||||
case MODE_SMMA:
|
||||
if(i == ma_start_pos)
|
||||
{
|
||||
double sum = 0;
|
||||
for(int j = 0; j < g_ExtPeriodMA; j++)
|
||||
sum += BufferCutlerRSI[i - j];
|
||||
BufferCutlerRSI_MA[i] = sum / g_ExtPeriodMA;
|
||||
double sum=0;
|
||||
for(int j=0; j<g_ExtPeriodMA; j++)
|
||||
sum+=BufferCutlerRSI[i-j];
|
||||
BufferCutlerRSI_MA[i] = sum/g_ExtPeriodMA;
|
||||
}
|
||||
else
|
||||
BufferCutlerRSI_MA[i] = (BufferCutlerRSI_MA[i-1] * (g_ExtPeriodMA - 1) + BufferCutlerRSI[i]) / g_ExtPeriodMA;
|
||||
{
|
||||
if(InpMethodMA == MODE_EMA)
|
||||
{
|
||||
double pr=2.0/(g_ExtPeriodMA+1.0);
|
||||
BufferCutlerRSI_MA[i] = BufferCutlerRSI[i]*pr + BufferCutlerRSI_MA[i-1]*(1.0-pr);
|
||||
}
|
||||
else
|
||||
BufferCutlerRSI_MA[i] = (BufferCutlerRSI_MA[i-1]*(g_ExtPeriodMA-1)+BufferCutlerRSI[i])/g_ExtPeriodMA;
|
||||
}
|
||||
break;
|
||||
case MODE_LWMA:
|
||||
BufferCutlerRSI_MA[i] = LinearWeightedMA(i, g_ExtPeriodMA, BufferCutlerRSI);
|
||||
break;
|
||||
{
|
||||
double lwma_sum=0, weight_sum=0;
|
||||
for(int j=0; j<g_ExtPeriodMA; j++)
|
||||
{
|
||||
int weight=g_ExtPeriodMA-j;
|
||||
lwma_sum+=BufferCutlerRSI[i-j]*weight;
|
||||
weight_sum+=weight;
|
||||
}
|
||||
if(weight_sum>0)
|
||||
BufferCutlerRSI_MA[i]=lwma_sum/weight_sum;
|
||||
}
|
||||
break;
|
||||
default: // MODE_SMA
|
||||
BufferCutlerRSI_MA[i] = SimpleMA(i, g_ExtPeriodMA, BufferCutlerRSI);
|
||||
break;
|
||||
{
|
||||
double sum=0;
|
||||
for(int j=0; j<g_ExtPeriodMA; j++)
|
||||
sum+=BufferCutlerRSI[i-j];
|
||||
BufferCutlerRSI_MA[i] = sum/g_ExtPeriodMA;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user