Files
MQL5Data/XOM1EA/Libraries/xom1ea.lib.mq5
T
2025-08-28 13:34:24 +03:30

443 lines
8.0 KiB
Plaintext

///////////////////////////////////////////////////////
//
// SaherElm IT Center MQL5 Indicator
// -------------------------------------------------
// Name: XOM1EA Lib
// Description: Library for XOM1EA ...
//
//
// Maintainer:
// ------------
// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com)
//
//////////////////////////////////////////////////////
//
// Global Properties ...
#property library
#property copyright "Copyright 2023, SaherElm IT Center"
#property link "https://saherelm.ir"
#property version "1.00"
#property description "SaherElm Library for XOM1EA Signaller"
#property strict
//
// Imports ...
#include "../../Libraries/x-saherelm.common.lib.mq5"
#include "../../Libraries/x-saherelm.x-poi.lib.mq5"
//
// Definitions ...
//
// Zone Creation Reason ...
enum ENUM_XOM1_ZONE_REASON
{
X_OM1_ZONE_REASON_NONE,
X_OM1_ZONE_REASON_PEAK,
X_OM1_ZONE_REASON_VALE
};
/**
* Validate a Zone Creation Reason ...
*
* @param value: ENUM_XOM1_ZONE_REASON
*
* @return ( bool )
*/
bool IsXValid(ENUM_XOM1_ZONE_REASON value)
{
//
bool result = false;
//
result = value != X_OM1_ZONE_REASON_NONE;
//
return result;
}
/**
* Converts a Zone Reason to String ...
*
* @param value: ENUM_XOM1_ZONE_REASON
*
* @return ( string )
*/
string ToXString(ENUM_XOM1_ZONE_REASON value)
{
//
string result = NULL;
//
if (!IsXValid(value))
{
return result;
}
//
switch (value)
{
//
case X_OM1_ZONE_REASON_PEAK:
result = "PEAK";
break;
//
case X_OM1_ZONE_REASON_VALE:
result = "VALE";
break;
}
//
return result;
}
/**
* Converts a Zone Reason to String ...
*
* @param value: ENUM_XOM1_ZONE_REASON
*
* @return ( string )
*/
ENUM_XOM1_ZONE_REASON FromXString(string value)
{
//
ENUM_XOM1_ZONE_REASON result = X_OM1_ZONE_REASON_NONE;
//
if (!IsSpecifiedValid(value))
{
return result;
}
//
if (value == ToXString(X_OM1_ZONE_REASON_NONE))
{
result = X_OM1_ZONE_REASON_NONE;
}
else if (value == ToXString(X_OM1_ZONE_REASON_PEAK))
{
result = X_OM1_ZONE_REASON_PEAK;
}
else if (value == ToXString(X_OM1_ZONE_REASON_VALE))
{
result = X_OM1_ZONE_REASON_VALE;
}
//
return result;
}
//
// this is a Zone Which
// we start Looking for
// Signal Detecting ...
struct XOM1Zone
{
//
// Props ...
//
string symbol; // Symbol
ENUM_TIMEFRAMES period; // Period
string signaller; // Signaller Identifier
datetime from; // Detection Time
datetime to; // Lifetime
ENUM_X_DIRECTION dir; // Direction
ENUM_XOM1_ZONE_REASON reason; // Creation Reason
double upper; // Upper Level
double lower; // Lower Level
double price; // Reason Price
//
// Constructor ...
XOM1Zone()
{
Clean();
}
//
// Tools ...
/**
* Initialize ...
*
* @param _symbol: Symbol
* @param _period: Period
* @param _signaller: Signaller Identifier
* @param _upper: Upper Value (PEAK)
* @param _lower: Lower Value (VALE)
* @param _price: Price (Changed Peak or Vale)
* @param _dir: Direction
* @param _reason: Creation Reason
* @param _from: Detection Time
* @param _to: Lifetime Time
*
* @return ( bool )
*/
bool Init(
string _symbol,
ENUM_TIMEFRAMES _period,
string _signaller,
double _upper,
double _lower,
double _price,
ENUM_X_DIRECTION _dir,
ENUM_XOM1_ZONE_REASON _reason,
datetime _from,
datetime _to = NULL //
)
{
//
to = _from;
dir = _dir;
from = _from;
upper = _upper;
lower = _lower;
price = _price;
symbol = _symbol;
period = _period;
reason = _reason;
signaller = _signaller;
//
if (IsSpecifiedValid(_to))
{
to = _to;
}
//
bool result = IsValid();
if (!result)
{
Clean();
}
//
return result;
}
/**
* Update Lifetime by Data ...
*
* @param _to: datetime
*/
void UpdateByDate(datetime _to)
{
//
// Validate ...
bool isValid = IsValid() &&
IsSpecifiedValid(_to) &&
_to > to;
if (!isValid)
{
return;
}
//
to = _to;
}
/**
* Update Lifetime by BarIndex ...
*
* @param barIndex: int
*/
void UpdateByBarIndex(int barIndex)
{
//
// Normalize ...
if (barIndex <= 0)
{
barIndex = 0;
}
//
if (!IsValid())
{
return;
}
//
datetime _to = GetBarTime(
symbol,
period,
barIndex //
);
if (!IsSpecifiedValid(_to))
{
return;
}
//
UpdateByDate(_to);
}
/**
* Clean ...
*/
void Clean()
{
ZeroMemory(this);
}
/**
* Validate ...
*
* @return ( bool )
*/
bool IsValid()
{
//
bool result = false;
//
result =
//
IsSpecifiedValid(symbol) &&
IsSpecifiedValid(period) &&
IsSpecifiedValid(signaller) &&
IsSpecifiedValid(from) &&
IsSpecifiedValid(to) &&
to >= from &&
HasDirection(dir) &&
IsXValid(reason) &&
upper > 0 &&
lower > 0 &&
price > 0 &&
upper > lower &&
price <= upper &&
price >= lower
//
;
//
return result;
}
/**
* Calculate Lifetime Age ...
*
* @return ( int )
*/
int GetBarLife()
{
//
int result = 0;
//
if (!IsValid())
{
return result;
}
//
int fromIDX = GetBarIndex(
symbol,
period,
from //
);
int toIDX = GetBarIndex(
symbol,
period,
to //
);
bool isValid = IsValidIndex(fromIDX) && IsValidIndex(toIDX);
if (!isValid)
{
return result;
}
//
result = MathAbs(fromIDX - toIDX);
//
return result;
}
/**
* Check Zone is Bullish ...
*
* @return ( bool )
*/
bool IsBullish()
{
return IsValid() && IsSpecifiedBullish(dir);
}
/**
* Check Zone is Bearish ...
*
* @return ( bool )
*/
bool IsBearish()
{
return IsValid() && IsSpecifiedBearish(dir);
}
/**
* Converts to Box ...
*
* @param box: Dest
*
* @return ( bool )
*/
bool ToBox(XBoxZone &box)
{
//
bool result = false;
//
box.Clean();
result = IsValid();
if (!result)
{
return result;
}
//
box.to = to;
box.dir = dir;
box.from = from;
box.upper = upper;
box.lower = lower;
box.symbol = symbol;
box.period = period;
box.type = signaller;
//
result = box.IsValid();
if (!result)
{
box.Clean();
}
//
return result;
}
/**
* Unique Identifier ...
*
* @return ( string )
*/
string GetTag()
{
//
string result = NULL;
//
result = "XOM1Zone_" +
symbol + "_" +
ToXString(period) + "_" +
signaller + "_" +
ToXString(dir) + "_" +
ToXString(reason) + "_" +
ToXString(TimeToSeconds(from));
//
return result;
}
};
//