FractFactory/Structures.mqh

386 lines
22 KiB
MQL5
Raw Permalink Normal View History

2025-05-30 14:56:16 +02:00
<EFBFBD><EFBFBD>//+------------------------------------------------------------------+
//| 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
{
// A8;L=K9 <0:A8<C<
double _strong_max;
int _s_max_Index;
datetime _s_max_Time;
bool _s_max_IsUp;
// A8;L=K9 <8=8<C<
double _strong_min;
int _s_min_Index;
datetime _s_min_Time;
bool _s_min_IsUp;
// A;01K9 <0:A8<C<
double _weak_max;
int _w_max_Index;
datetime _w_max_Time;
bool _w_max_IsUp;
// A;01K9 <8=8<C<
double _weak_min;
int _w_min_Index;
datetime _w_min_Time;
bool _w_min_IsUp;
bool _its_ch;
bool _its_bos1;
bool _its_bos2;
// =0?@02;5=85 B5=45=F89
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()
{
// =5H=89 A8;L=K9 <0:A8<C<
_strong_max = 0;
_s_max_Index = 0;
_s_max_Time = 0;
_s_max_IsUp = NULL;
// =5H=89 A8;L=K9 <8=8<C<
_strong_min = 0;
_s_min_Index = 0;
_s_min_Time = 0;
_s_min_IsUp = NULL;
// =5H=89 A;01K9 <0:A8<C<
_weak_max = 0;
_w_max_Index = 0;
_w_max_Time = 0;
_w_max_IsUp = NULL;
// =5H=89 A;01K9 <8=8<C<
_weak_min = 0;
_w_min_Index = 0;
_w_min_Time = 0;
_w_min_IsUp = NULL;
// >?@545;5=85 2>;= :>@@5:F8>==>3> 42865=8O
_its_ch = NULL;
_its_bos1 = NULL;
_its_bos2 = NULL;
// =0?@02;5=85 B5=45=F88
_tendention = -1;
_phase = -1;
// <5480=0 D0@:B0;L=KE >B@57:>2
_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){
//<O
_name = nName;
// =5H=89 A8;L=K9 <0:A8<C<
_strong_max = 0;
_s_max_Index = 0;
_s_max_Time = 0;
_s_max_IsUp = NULL;
// =5H=89 A8;L=K9 <8=8<C<
_strong_min = 0;
_s_min_Index = 0;
_s_min_Time = 0;
_s_min_IsUp = NULL;
// =5H=89 A;01K9 <0:A8<C<
_weak_max = 0;
_w_max_Index = 0;
_w_max_Time = 0;
_w_max_IsUp = NULL;
// =5H=89 A;01K9 <8=8<C<
_weak_min = 0;
_w_min_Index = 0;
_w_min_Time = 0;
_w_min_IsUp = NULL;
// >?@545;5=85 2>;= :>@@5:F8>==>3> 42865=8O
_its_ch = NULL;
_its_bos1 = NULL;
_its_bos2 = NULL;
// =0?@02;5=85 B5=45=F88
_tendention = -1;
_phase = -1;
// <5480=0 D0@:B0;L=KE >B@57:>2
_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!8;L=K9 <8=8<C< = ";
message += ::DoubleToString(_strong_min,digits);
message += "\n!;01K9 <0:A8<C< = ";
message += ::DoubleToString(_weak_max,digits);
}
else
{
message += "\nUP : CORRECTION";
message += "\n<?C;LA=K9 D@0:B0;L=K9 CG0AB>::";
message += "\n!8;L=K9 <8=8<C< = ";
message += ::DoubleToString(_strong_min,digits);
message += "\n!;01K9 <0:A8<C< = ";
message += ::DoubleToString(_weak_max,digits);
message += "\n>@@5:F8>==K9 D@0:B0;L=K9 CG0AB>::";
message += "\n!8;L=K9 <0:A8<C< = ";
message += ::DoubleToString(_strong_max,digits);
message += "\n!;01K9 <8=8<C< = ";
message += ::DoubleToString(_weak_min,digits);
}
}
else
{
if(_phase == LEVEL_PHASE_IMPULSE)
{
message += "\nDOWN : IMPULS ";
message += "\n!8;L=K9 <0:A8<C< = ";
message += ::DoubleToString(_strong_max,digits);
message += "\n!;01K9 <8=8<C< = ";
message += ::DoubleToString(_weak_min,digits);
}
else
{
message += "\nDOWN : CORRECTION";
message += "\n<?C;LA=K9 D@0:B0;L=K9 CG0AB>::";
message += "\n!8;L=K9 <0:A8<C< = ";
message += ::DoubleToString(_strong_max,digits);
message += "\n!;01K9 <8=8<C< = ";
message += ::DoubleToString(_weak_min,digits);
message += "\n>@@5:F8>==K9 D@0:B0;L=K9 CG0AB>::";
message += "\n!8;L=K9 <8=8<C< = ";
message += ::DoubleToString(_strong_min,digits);
message += "\n!;01K9 <0:A8<C< = ";
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 += ""5:CI89 D@0:B0;L=K9 >B@57>: =0?@02;5= ";
switch(_trend)
{
/*case NO_TENDENTION:
message += "2 =8:C40";
break;*/
case TENDENTION_UP:
message += "25@E\n";
message += "0G8=05BAO ?> F5=5 ";
message += DoubleToString(_start,digits);
message += " 2 ";
message += TimeToString(_startTime);
/*message += "\n0:0=G8205BAO ?> F5=5 ";
message += DoubleToString(_end,digits);
message += " 2 ";
message += TimeToString(_endTime);
message += "\n>=0 ?5@5;><0 B@5=40: ";
message += DoubleToString(_end,digits);
message += " - ";
message += DoubleToString(_broke,digits);*/
/*message += "\n>=0 ?>:C?>:: ";
message += DoubleToString(_start,digits);
message += " - ";
message += DoubleToString(_equator,digits);
message += "\n>=0 ?@>406: ";
message += DoubleToString(_equator,digits);
message += " - ";
message += DoubleToString(_end,digits);*/
break;
case TENDENTION_DOWN:
message += "=87\n";
message += "0G8=05BAO ?> F5=5 ";
message += DoubleToString(_start,digits);
message += " 2 ";
message += TimeToString(_startTime);
//message += "\n0:0=G8205BAO ?> F5=5 ";
//message += DoubleToString(_end,digits);
//message += " 2 ";
//message += TimeToString(_endTime);
//message += "\n>=0 ?5@5;><0 B@5=40: ";
//message += DoubleToString(_broke,digits);
//message += " - ";
//message += DoubleToString(_end,digits);
/*message += "\n>=0 ?>:C?>:: ";
message += DoubleToString(_end,digits);
message += " - ";
message += DoubleToString(_equator,digits);
message += "\n>=0 ?@>406: ";
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));
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+