//+------------------------------------------------------------------+ //| 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)]; }