馃搶 Hice un algoritmo para utilizar indicadores mediante programaci贸n orientada a objetos.
✅ Funcionamiento:Deben ejecutarlo en un sistema que se ejecute por cada apertura de vela una sola vez.
La forma de escribirlo es la siguiente:
CiMA MovAvg1(_Symbol, PERIOD_CURRENT, 9, 0, MODE_SMA, PRICE_CLOSE);
馃搶 La clase CiMA se aplica al objeto MovAvg1, pasando los argumentos iniciales de la media m贸vil.
馃敘 Para conocer el valor, se utiliza:
double maValue = MovAvg1.buffer(0, 0);
馃憠 En la funci贸n buffer, el primer valor indica el buffer y el segundo, la posici贸n de la vela (de derecha a izquierda, comenzando desde cero).
馃挕 Nota: Tendr谩n que crear una clase para cada indicador al final del c贸digo derivada de la clase CIndicator, con su constructor y par谩metros del indicador como argumentos iniciales del constructor para obtener el handle.
Ejemplo:
class CiMA : public CIndicator
{
public:
CiMA(string symbol, ENUM_TIMEFRAMES period, int ma_period, int ma_shift, ENUM_MA_METHOD ma_method, ENUM_APPLIED_PRICE applied_price)
{
handle = iMA(symbol, period, ma_period, ma_shift, ma_method, applied_price);
if (!IsHandleValid())
{
Print("Error: No se pudo crear el handle para iMA.");
}
}
};
馃攽 C贸digo base:
#property copyright "Copyright 2025, Fernando Javier De Mendon莽a."
#property link "https://www.algomercados.com"
#property version "1.00"
/
struct SBuffer
{
double values[];
};
class CIndicator
{
protected:
int handle;
SBuffer Buffers[10];
bool handleValid;
public:
double lastValidValue[10];
void Release() { IndicatorRelease(handle); handleValid = false; }
bool IsHandleValid(); // Verifica si el handle es v谩lido
CIndicator();
//
double buffer(int bufferIndex, int shift = 0);
};
// Constructor
CIndicator::CIndicator() : handle(-1), handleValid(false)
{
for (int i = 0; i < 10; i++)
{
ArraySetAsSeries(Buffers[i].values, true);
lastValidValue[i] = 0.0;
}
}
bool CIndicator::IsHandleValid()
{
return handle != INVALID_HANDLE;
}
double CIndicator::buffer(int bufferIndex, int shift)
{
if (!IsHandleValid())
{
Print("Advertencia: Handle inv谩lido. Usando 煤ltimo valor v谩lido conocido.");
return lastValidValue[bufferIndex];
}
if (CopyBuffer(handle, bufferIndex, shift, 1, Buffers[bufferIndex].values) < 0)
{
Print("Error al copiar el buffer. Usando 煤ltimo valor v谩lido conocido.");
return lastValidValue[bufferIndex];
}
lastValidValue[bufferIndex] = Buffers[bufferIndex].values[0];
return NormalizeDouble(lastValidValue[bufferIndex], _Digits);
}
❓ ¿Est谩s de acuerdo con pasar como argumentos iniciales para la inicializaci贸n del objeto los par谩metros del indicador? Acepto sugerencias.