refactor: double buffer

This commit is contained in:
Toh4iem9
2025-10-12 13:54:10 +02:00
parent b109f8ac37
commit a599a9a00d
+38 -22
View File
@@ -7,8 +7,6 @@
#include <MyIncludes\ATR_Calculator.mqh> // Re-use our robust ATR calculator #include <MyIncludes\ATR_Calculator.mqh> // Re-use our robust ATR calculator
//--- CORRECTED: The ENUM_ATR_SOURCE is now defined inside ATR_Calculator.mqh ---
//+==================================================================+ //+==================================================================+
//| | //| |
//| CLASS 1: CSupertrendCalculator (Base Class) | //| CLASS 1: CSupertrendCalculator (Base Class) |
@@ -19,9 +17,7 @@ class CSupertrendCalculator
protected: protected:
int m_atr_period; int m_atr_period;
double m_factor; double m_factor;
CATRCalculator *m_atr_calculator; CATRCalculator *m_atr_calculator;
double m_src_high[], m_src_low[], m_src_close[]; double m_src_high[], m_src_low[], m_src_close[];
virtual bool PrepareSourceData(int rates_total, const double &open[], const double &high[], const double &low[], const double &close[]); virtual bool PrepareSourceData(int rates_total, const double &open[], const double &high[], const double &low[], const double &close[]);
@@ -32,7 +28,7 @@ public:
bool Init(int atr_p, double factor, ENUM_ATR_SOURCE atr_src); bool Init(int atr_p, double factor, ENUM_ATR_SOURCE atr_src);
void Calculate(int rates_total, const double &open[], const double &high[], const double &low[], const double &close[], void Calculate(int rates_total, const double &open[], const double &high[], const double &low[], const double &close[],
double &st_buffer[], double &color_buffer[]); double &st_odd[], double &color_odd[], double &st_even[], double &color_even[]);
}; };
//+------------------------------------------------------------------+ //+------------------------------------------------------------------+
@@ -40,7 +36,7 @@ public:
//+------------------------------------------------------------------+ //+------------------------------------------------------------------+
CSupertrendCalculator::CSupertrendCalculator(void) CSupertrendCalculator::CSupertrendCalculator(void)
{ {
m_atr_calculator = NULL; // Initialize pointer to NULL m_atr_calculator = NULL;
} }
//+------------------------------------------------------------------+ //+------------------------------------------------------------------+
@@ -62,15 +58,10 @@ bool CSupertrendCalculator::Init(int atr_p, double factor, ENUM_ATR_SOURCE atr_s
if(CheckPointer(m_atr_calculator) != POINTER_INVALID) if(CheckPointer(m_atr_calculator) != POINTER_INVALID)
delete m_atr_calculator; delete m_atr_calculator;
if(atr_src == ATR_SOURCE_HEIKIN_ASHI) if(atr_src == ATR_SOURCE_HEIKIN_ASHI)
{
m_atr_calculator = new CATRCalculator_HA(); m_atr_calculator = new CATRCalculator_HA();
}
else else
{
m_atr_calculator = new CATRCalculator(); m_atr_calculator = new CATRCalculator();
}
if(CheckPointer(m_atr_calculator) == POINTER_INVALID) if(CheckPointer(m_atr_calculator) == POINTER_INVALID)
return false; return false;
@@ -81,7 +72,7 @@ bool CSupertrendCalculator::Init(int atr_p, double factor, ENUM_ATR_SOURCE atr_s
//| CSupertrendCalculator: Main Calculation Method (Shared Logic) | //| CSupertrendCalculator: Main Calculation Method (Shared Logic) |
//+------------------------------------------------------------------+ //+------------------------------------------------------------------+
void CSupertrendCalculator::Calculate(int rates_total, const double &open[], const double &high[], const double &low[], const double &close[], void CSupertrendCalculator::Calculate(int rates_total, const double &open[], const double &high[], const double &low[], const double &close[],
double &st_buffer[], double &color_buffer[]) double &st_odd[], double &color_odd[], double &st_even[], double &color_even[])
{ {
if(rates_total <= m_atr_period || CheckPointer(m_atr_calculator) == POINTER_INVALID) if(rates_total <= m_atr_period || CheckPointer(m_atr_calculator) == POINTER_INVALID)
return; return;
@@ -96,6 +87,8 @@ void CSupertrendCalculator::Calculate(int rates_total, const double &open[], con
m_atr_calculator.Calculate(rates_total, open, high, low, close, atr); m_atr_calculator.Calculate(rates_total, open, high, low, close, atr);
int trend_segment_index = 1;
for(int i = 1; i < rates_total; i++) for(int i = 1; i < rates_total; i++)
{ {
double hl2 = (m_src_high[i] + m_src_low[i]) / 2.0; double hl2 = (m_src_high[i] + m_src_low[i]) / 2.0;
@@ -128,19 +121,42 @@ void CSupertrendCalculator::Calculate(int rates_total, const double &open[], con
trend[i] = trend[i-1]; trend[i] = trend[i-1];
} }
if(trend[i] == 1) if(trend[i] != trend[i-1] && i > 1)
trend_segment_index++;
if(trend[i] == 1) // Uptrend
{ {
st_buffer[i] = lower[i]; if(trend_segment_index % 2 != 0) // Odd segment
color_buffer[i] = 0; {
if(trend[i-1] == -1) st_odd[i] = lower[i];
st_buffer[i-1] = lower[i]; color_odd[i] = 0;
st_even[i] = EMPTY_VALUE;
color_even[i] = 0;
}
else // Even segment
{
st_even[i] = lower[i];
color_even[i] = 0;
st_odd[i] = EMPTY_VALUE;
color_odd[i] = 0;
}
} }
else else // Downtrend
{ {
st_buffer[i] = upper[i]; if(trend_segment_index % 2 != 0) // Odd segment
color_buffer[i] = 1; {
if(trend[i-1] == 1) st_odd[i] = upper[i];
st_buffer[i-1] = upper[i]; color_odd[i] = 1;
st_even[i] = EMPTY_VALUE;
color_even[i] = 1;
}
else // Even segment
{
st_even[i] = upper[i];
color_even[i] = 1;
st_odd[i] = EMPTY_VALUE;
color_odd[i] = 1;
}
} }
} }
} }