//+------------------------------------------------------------------+ //| DirectionStruct.mqh | //| Copyright 2024, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2024, MetaQuotes Ltd." #property link "https://www.mql5.com" enum ENUM_TENDENTION { TENDENTION_UP = 0, TENDENTION_DOWN }; enum ENUM_LEVEL_PHASE { LEVEL_PHASE_IMPULSE = 0, LEVEL_PHASE_CORRECTION }; enum ENUM_MARKET_PHASE { MARKET_PHASE_IMPULSE = 0, MARKET_PHASE_CORRECTION }; struct SLevels { // сильный максимум double _strong_max; int _s_max_Index; datetime _s_max_Time; bool _s_max_IsUp; // сильный минимум double _strong_min; int _s_min_Index; datetime _s_min_Time; bool _s_min_IsUp; // слабый максимум double _weak_max; int _w_max_Index; datetime _w_max_Time; bool _w_max_IsUp; // слабый минимум double _weak_min; int _w_min_Index; datetime _w_min_Time; bool _w_min_IsUp; bool _its_ch; bool _its_bos1; bool _its_bos2; // направление тенденций ENUM_TENDENTION _tendention; ENUM_LEVEL_PHASE _phase; double _equator; double _BackUpFractal; int _b_up_Index; datetime _b_up_Time; double _BackDownFractal; int _b_down_Index; datetime _b_down_Time; string _name; SLevels(); SLevels(string); void Print(const ENUM_TIMEFRAMES,const int,const double); double SetEquator(const double,const double); }; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ SLevels::SLevels() { // Внешний сильный максимум _strong_max = 0; _s_max_Index = 0; _s_max_Time = 0; _s_max_IsUp = NULL; // Внешний сильный минимум _strong_min = 0; _s_min_Index = 0; _s_min_Time = 0; _s_min_IsUp = NULL; // Внешний слабый максимум _weak_max = 0; _w_max_Index = 0; _w_max_Time = 0; _w_max_IsUp = NULL; // Внешний слабый минимум _weak_min = 0; _w_min_Index = 0; _w_min_Time = 0; _w_min_IsUp = NULL; // определение волн коррекционного движения _its_ch = NULL; _its_bos1 = NULL; _its_bos2 = NULL; // направление тенденции _tendention = -1; _phase = -1; // медиана фарктальных отрезков _equator = 0; _BackUpFractal = 0; _b_up_Index = 0; _b_up_Time = 0; _name = NULL; _BackDownFractal = 0; _b_down_Index = 0; _b_down_Time = 0; } //+------------------------------------------------------------------+ SLevels::SLevels(string nName){ //Имя _name = nName; // Внешний сильный максимум _strong_max = 0; _s_max_Index = 0; _s_max_Time = 0; _s_max_IsUp = NULL; // Внешний сильный минимум _strong_min = 0; _s_min_Index = 0; _s_min_Time = 0; _s_min_IsUp = NULL; // Внешний слабый максимум _weak_max = 0; _w_max_Index = 0; _w_max_Time = 0; _w_max_IsUp = NULL; // Внешний слабый минимум _weak_min = 0; _w_min_Index = 0; _w_min_Time = 0; _w_min_IsUp = NULL; // определение волн коррекционного движения _its_ch = NULL; _its_bos1 = NULL; _its_bos2 = NULL; // направление тенденции _tendention = -1; _phase = -1; // медиана фарктальных отрезков _equator = 0; _BackUpFractal = 0; _b_up_Index = 0; _b_up_Time = 0; _name = NULL; _BackDownFractal = 0; _b_down_Index = 0; _b_down_Time = 0; } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void SLevels ::Print(const ENUM_TIMEFRAMES tf,const int digits = 5, const double point = 0.00001) { string message; if(_tendention == TENDENTION_UP) { if(_phase == LEVEL_PHASE_IMPULSE) { message += "\nUP : IMPULS"; message += "\nСильный минимум = "; message += ::DoubleToString(_strong_min,digits); message += "\nСлабый максимум = "; message += ::DoubleToString(_weak_max,digits); } else { message += "\nUP : CORRECTION"; message += "\nИмпульсный фрактальный участок:"; message += "\nСильный минимум = "; message += ::DoubleToString(_strong_min,digits); message += "\nСлабый максимум = "; message += ::DoubleToString(_weak_max,digits); message += "\nКоррекционный фрактальный участок:"; message += "\nСильный максимум = "; message += ::DoubleToString(_strong_max,digits); message += "\nСлабый минимум = "; message += ::DoubleToString(_weak_min,digits); } } else { if(_phase == LEVEL_PHASE_IMPULSE) { message += "\nDOWN : IMPULS "; message += "\nСильный максимум = "; message += ::DoubleToString(_strong_max,digits); message += "\nСлабый минимум = "; message += ::DoubleToString(_weak_min,digits); } else { message += "\nDOWN : CORRECTION"; message += "\nИмпульсный фрактальный участок:"; message += "\nСильный максимум = "; message += ::DoubleToString(_strong_max,digits); message += "\nСлабый минимум = "; message += ::DoubleToString(_weak_min,digits); message += "\nКоррекционный фрактальный участок:"; message += "\nСильный минимум = "; message += ::DoubleToString(_strong_min,digits); message += "\nСлабый максимум = "; message += ::DoubleToString(_weak_max,digits); } } ::Print(message); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ double SLevels::SetEquator(const double a,const double b) { return ::MathAbs((a + b) / 2); } struct SDirection { double _start; double _end; ENUM_TENDENTION _trend; ENUM_MARKET_PHASE _market_phase; int _startIndex; int _endIndex; datetime _startTime; datetime _endTime; bool _first_wave; //double _equator; //double _broke; SDirection(); void Print(int); //void SetEquator(); }; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ SDirection::SDirection(void) { _start = 0.0; _end = 0.0; _trend = -1; _market_phase = -1; _startIndex = 0; _endIndex = 0; _startTime = NULL; _endTime = NULL; _first_wave = true; //_equator = 0.0; //_broke = 0.0; } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void SDirection::Print(int digits = 5) { string message; message += "Текущий фрактальный отрезок направлен "; switch(_trend) { /*case NO_TENDENTION: message += "в никуда"; break;*/ case TENDENTION_UP: message += "Вверх\n"; message += "Начинается по цене "; message += DoubleToString(_start,digits); message += " в "; message += TimeToString(_startTime); /*message += "\nЗаканчивается по цене "; message += DoubleToString(_end,digits); message += " в "; message += TimeToString(_endTime); message += "\nЗона перелома тренда: "; message += DoubleToString(_end,digits); message += " - "; message += DoubleToString(_broke,digits);*/ /*message += "\nЗона покупок: "; message += DoubleToString(_start,digits); message += " - "; message += DoubleToString(_equator,digits); message += "\nЗона продаж: "; message += DoubleToString(_equator,digits); message += " - "; message += DoubleToString(_end,digits);*/ break; case TENDENTION_DOWN: message += "Вниз\n"; message += "Начинается по цене "; message += DoubleToString(_start,digits); message += " в "; message += TimeToString(_startTime); //message += "\nЗаканчивается по цене "; //message += DoubleToString(_end,digits); //message += " в "; //message += TimeToString(_endTime); //message += "\nЗона перелома тренда: "; //message += DoubleToString(_broke,digits); //message += " - "; //message += DoubleToString(_end,digits); /*message += "\nЗона покупок: "; message += DoubleToString(_end,digits); message += " - "; message += DoubleToString(_equator,digits); message += "\nЗона продаж: "; message += DoubleToString(_equator,digits); message += " - "; message += DoubleToString(_start,digits);*/ break; } ::Print(message); } /*void SDirection::SetEquator(void) { if(_trend != NO_TENDENTION) _equator = (_start + _end) / 2; }*/ //+------------------------------------------------------------------+ struct SFractal { datetime _time; int _index; double _value; bool _isUp; void SFractal(); }; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void SFractal::SFractal(void) { _time = 0; _index = 0; _value = 0.0; _isUp = NULL; } //+------------------------------------------------------------------+ int DistPrices(double priceA, double priceB, string symbol = NULL) { return (int)(MathAbs(priceA - priceB) / SymbolInfoDouble(symbol,SYMBOL_POINT)); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+