177 lines
No EOL
5.4 KiB
MQL5
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)];
|
|
} |