385 lines
22 KiB
MQL5
385 lines
22 KiB
MQL5
//+------------------------------------------------------------------+
|
|
//| 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));
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
|
|
//+------------------------------------------------------------------+
|