Estoy tratando de suavizar un índice de fuerza de 13 períodos EMA Elder en c +, y nadie realmente describe esto como algo más que :
Force Index(1) = {Close (current period) - Close (prior period)} x Volume.
Force Index(13) = 13-period EMA of Force Index(1).
Debo estar un poco espeso, pero cuando usas una media móvil con un periodo, obtienes un promedio de ese periodo, y luego lo usas como referencia para MA's de días posteriores. He calculado SMA y Exp MA para conjuntos de datos exstentes antes, pero ¿cómo se supone que se calcula el Índice de Fuerza suavizado para un período de tiempo exstente?
void indicators::EMA(input* Close1, size_t Start, size_t Period) {
vector<double> CloseRe (Close1->Close.rbegin(), Close1->Close.rend());
vector<double> Xtemp;
for(size_t i = Start; i < Period; i++) {
Xtemp.push_back(CloseRe[i]);
}
// cout << Xtemp.size() << endl;
double InitXavg = (std::accumulate(Xtemp.begin(), Xtemp.end(), 0.0) / Xtemp.size());
ExpMA.push_back(InitXavg);
for(size_t j = Period; j < CloseRe.size(); j++) {
tmpEMA = ((CloseRe[j] - ExpMA[j-Period]) * (2.0 / (Period + 1.0))) + ExpMA[j-Period];
// cout << j << " is " << CloseRe[j] << endl;
ExpMA.push_back(tmpEMA);
tmpEMA = 0.0;
}
return;
}
Lo anterior calcula la media móvil exponencial, y lo que sigue se supone que calcula el índice de fuerza suavizado para un conjunto de datos extenso, con un período de 13 días. Pero no puedo decir que entienda realmente cómo se supone que funciona esto, ya que la EMA estándar sólo utiliza el precio de cierre y la media del día anterior y el multiplicador. ¿Cómo se supone que incorpora el volumen más allá del período original de 13 días?
void indicators::ForceIndexEMA(input* Close1, input* Volume1, size_t Start, size_t Period) {
vector<double> CloseRe (Close1->Close.rbegin(), Close1->Close.rend());
vector<double> VolumeRe(Volume1->Volume.rbegin(), Volume1->Volume.rend());
vector<double> FXtemp;
for(size_t i = Start; i < Period; i++) {
FXtemp.push_back((CloseRe[i+1] - CloseRe[i]) * VolumeRe[i]);
}
ForceXMA.push_back(std::accumulate(FXtemp.begin(), FXtemp.end(), 0.0) / FXtemp.size());
for(size_t j = Period; j < CloseRe.size(); j++) {
ForceXMA.push_back(((CloseRe[j] - ForceXMA[j-Period]) * (2.0 / (Period + 1.0))) + ForceXMA[j-Period]);
}
return;
}
Podría simplemente calcular el índice de fuerza día a día con un bucle, pero sigo viendo en todas partes cómo se supone que la media EMA suavizada da señales más fiables en ciertos escenarios. Así que mi pregunta sería lo que estoy haciendo mal aquí.... ? Entiendo que este no es un foro de programación, pero no dependo de que me lo expliquen como tal. Es que no he visto a nadie explicarlo bien del todo ? ¿Qué pasa con el volumen actual? Una EMA no funciona en general con el volumen, por lo que utilizando la forma estándar de calcular la EMA sería simplemente acercarse a los precios de cierre del día a medida que se hace un bucle a través del conjunto de datos ...
EDITAR : He conseguido hacer lo que veo como una "EMA" de los valores del índice de fuerza de 1 período aquí, pero ¿alguien podría corregirme si está mal?
void indicators::ForceIndex(input* Close1, input* Volume1, size_t Start, size_t Period) {
vector<double> CloseRe (Close1->Close.rbegin(), Close1->Close.rend());
vector<double> VolumeRe(Volume1->Volume.rbegin(), Volume1->Volume.rend());
vector<double> FXtemp;
for(size_t i = Start; i < Period; i++) {
FXtemp.push_back((CloseRe[i+1] - CloseRe[i]) * VolumeRe[i+1]);
}
ForceXMA.push_back(std::accumulate(FXtemp.begin(), FXtemp.end(), 0.0) / FXtemp.size());
for(size_t j = Period; j < CloseRe.size(); j++) {
double daily = ((CloseRe[j+1] - CloseRe[j]) * VolumeRe[j+1]);
ForceXMA.push_back(((daily - ForceXMA[j-Period]) * (2.0 / (Period + 1.0))) + ForceXMA[j-Period]);
daily = 0.0;
}
return;
}
Por lo que veo esto debería ponderar el volumen también, pero en cuanto a la lógica de la "media" del cálculo todavía estoy un poco inseguro...