FractFactory/Structures.mqh
super.admin 74d076ce2a convert
2025-05-30 14:56:16 +02:00

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