ForexTheFirst/CandleTools.mqh
super.admin 6d249e3e27 convert
2025-05-30 14:55:54 +02:00

177 lines
No EOL
5.4 KiB
MQL5

//+------------------------------------------------------------------+
//| CandleTools.mqh |
//| Marino Bantli |
//| maban.ch |
//+------------------------------------------------------------------+
class CandleTools
{
private:
public:
static double GetAverageBarSize(MqlRates& series[], int lookback);
static bool IsDoji(MqlRates& series[], uint barIndex, double pipVal, double bodyToWickProportions);
static double GetBodySize(MqlRates& series[], uint index, double pipVal);
static double GetUpperWickSize(MqlRates& series[], uint index, double pipVal);
static double GetLowerWickSize(MqlRates& series[], uint barIndex, double pipVal);
static double GetLowestLow(MqlRates& series[], uint barIndex);
static double GetHighestHigh(MqlRates& series[], uint barIndex);
static double GetLowestLowWick(MqlRates& series[], uint barIndex);
static double GetHighestHighWick(MqlRates& series[], uint barIndex);
CandleTools();
~CandleTools();
};
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
CandleTools::CandleTools()
{
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
CandleTools::~CandleTools()
{
}
//+------------------------------------------------------------------+
static double CandleTools::GetAverageBarSize(MqlRates& series[], int lookback)
{
double totalSizes = 0;
for(uint i = series.Size() - lookback - 1; i < series.Size() - 1; i++)
{
double barSize = MathAbs(series[i].open - series[i].close);
totalSizes += barSize;
}
return (totalSizes / lookback);
}
static bool CandleTools::IsDoji(MqlRates& series[], uint barIndex, double pipVal, double bodyToWickProportions)
{
double bodySize = GetBodySize(series, barIndex, pipVal);
double upperWick = GetUpperWickSize(series, barIndex, pipVal);
double lowerWick = GetLowerWickSize(series, barIndex, pipVal);
double totalWickSize = upperWick + lowerWick;
if(bodySize == 0) { return true; }
if((totalWickSize / bodySize) > bodyToWickProportions) { return true; }
return false;
}
static double CandleTools::GetBodySize(MqlRates& series[], uint barIndex, double pipVal)
{
double bodySize = 0;
if(series[barIndex].open < series[barIndex].close)
{
bodySize = ((series[barIndex].close - series[barIndex].open) / pipVal);
}
if(bars[barIndex].open > bars[barIndex].close)
{
bodySize = ((series[barIndex].open - series[barIndex].close) / pipVal);
}
return bodySize;
}
static double CandleTools::GetUpperWickSize(MqlRates& series[], uint barIndex, double pipVal)
{
double upperWick = 0;
if(series[barIndex].open < series[barIndex].close)
{
upperWick = ((series[barIndex].high - series[barIndex].close) / pipVal);
}
if(bars[barIndex].open > bars[barIndex].close)
{
upperWick = ((series[barIndex].high - series[barIndex].open) / pipVal);
}
return upperWick;
}
static double CandleTools::GetLowerWickSize(MqlRates& series[], uint barIndex, double pipVal)
{
double lowerWick = 0;
if(series[barIndex].open < series[barIndex].close)
{
lowerWick = ((series[barIndex].open - series[barIndex].low) / pipVal);
}
if(series[barIndex].open > series[barIndex].close)
{
lowerWick = ((series[barIndex].close - series[barIndex].low) / pipVal);
}
return lowerWick;
}
static double CandleTools::GetHighestHigh(MqlRates& series[], uint barIndex)
{
double values[];
for(uint i = series.Size() - barIndex - 1; i < series.Size() - 1; i++)
{
ArrayResize(values, values.Size() + 2);
values[values.Size() - 1] = series[i].open;
values[values.Size() - 2] = series[i].close;
}
return values[ArrayMaximum(values, 0, WHOLE_ARRAY)];
}
static double CandleTools::GetHighestHighWick(MqlRates& series[], uint barIndex)
{
double values[];
for(uint i = series.Size() - barIndex - 1; i < series.Size() - 1; i++)
{
ArrayResize(values, values.Size() + 1);
values[values.Size() - 1] = series[i].high;
}
return values[ArrayMaximum(values, 0, WHOLE_ARRAY)];
}
static double CandleTools::GetLowestLow(MqlRates& series[], uint barIndex)
{
double values[];
for(uint i = series.Size() - barIndex - 1; i < series.Size() - 1; i++)
{
ArrayResize(values, values.Size() + 2);
values[values.Size() - 1] = series[i].open;
values[values.Size() - 2] = series[i].close;
}
return values[ArrayMinimum(values, 0, WHOLE_ARRAY)];
}
static double CandleTools::GetLowestLowWick(MqlRates& series[], uint barIndex)
{
double values[];
for(uint i = series.Size() - barIndex - 1; i < series.Size() - 1; i++)
{
ArrayResize(values, values.Size() + 1);
values[values.Size() - 1] = series[i].low;
}
return values[ArrayMinimum(values, 0, WHOLE_ARRAY)];
}