last ...
This commit is contained in:
@@ -0,0 +1,373 @@
|
||||
///////////////////////////////////////////////////////
|
||||
//
|
||||
// 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"
|
||||
|
||||
//
|
||||
// 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
|
||||
*
|
||||
* @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 //
|
||||
)
|
||||
{
|
||||
//
|
||||
to = _from;
|
||||
dir = _dir;
|
||||
from = _from;
|
||||
upper = _upper;
|
||||
lower = _lower;
|
||||
price = _price;
|
||||
symbol = _symbol;
|
||||
period = _period;
|
||||
reason = _reason;
|
||||
signaller = _signaller;
|
||||
|
||||
//
|
||||
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;
|
||||
}
|
||||
|
||||
/**
|
||||
* Unique Identifier ...
|
||||
*
|
||||
* @return ( string )
|
||||
*/
|
||||
string GetTag()
|
||||
{
|
||||
//
|
||||
string result = NULL;
|
||||
|
||||
//
|
||||
result = "XOM1Zone_" +
|
||||
symbol + "_" +
|
||||
ToXString(period) + "_" +
|
||||
signaller + "_" +
|
||||
ToXString(dir) + "_" +
|
||||
ToXString(reason) + "_" +
|
||||
ToXString(TimeToSeconds(from));
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
};
|
||||
|
||||
//
|
||||
Reference in New Issue
Block a user