lunes, 13 de enero de 2025

Indicadores (Programación orientada a objetos) MQL5



📌 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.

Indicadores (Programación orientada a objetos) MQL5

📌 Hice un algoritmo para utilizar indicadores mediante programación orientada a objetos. ✅ Funcionamiento: Deben ejecutarlo en un sistema q...