429 lines
8.0 KiB
Plaintext
429 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, // NONE
|
|
X_OM1_ZONE_REASON_PEAK, // PEAK
|
|
X_OM1_ZONE_REASON_VALE, // VALE
|
|
X_OM1_ZONE_REASON_FCOS, // FCOS
|
|
X_OM1_ZONE_REASON_FCUS, // FCUS
|
|
};
|
|
|
|
/**
|
|
* 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)
|
|
{
|
|
return EnumToString(value);
|
|
}
|
|
|
|
/**
|
|
* 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;
|
|
}
|
|
else if (value == ToXString(X_OM1_ZONE_REASON_FCOS))
|
|
{
|
|
result = X_OM1_ZONE_REASON_FCOS;
|
|
}
|
|
else if (value == ToXString(X_OM1_ZONE_REASON_FCUS))
|
|
{
|
|
result = X_OM1_ZONE_REASON_FCUS;
|
|
}
|
|
|
|
//
|
|
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;
|
|
}
|
|
};
|
|
|
|
// |