856 lines
16 KiB
Plaintext
856 lines
16 KiB
Plaintext
///////////////////////////////////////////////////////
|
|
//
|
|
// SaherElm IT Center MQL5 Seriallize Library
|
|
// ---------------------------------------
|
|
// Name: X121SMCLib
|
|
// Description: All models related to X121SMC ...
|
|
//
|
|
//
|
|
// Maintainer:
|
|
// ------------
|
|
// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com)
|
|
//
|
|
//////////////////////////////////////////////////////
|
|
//
|
|
// Global Properties ...
|
|
#property library
|
|
#property copyright "Copyright 2023, SaherElm IT Center"
|
|
#property link "https://www.saherelm.ir"
|
|
#property version "1.00"
|
|
#property strict
|
|
|
|
//
|
|
// Imports ...
|
|
#include "../../Classes/x-saherelm.base.class.mq5"
|
|
#include "../../Libraries/x-saherelm.common.lib.mq5"
|
|
#include "../../Libraries/x-saherelm.x-poi.lib.mq5"
|
|
#include "../../Libraries/x-saherelm.xtrade.lib.mq5"
|
|
|
|
//
|
|
// Definitions ...
|
|
|
|
//
|
|
// Specific Identifier(s) of XStrategy ...
|
|
string X121SMCStrategyToken = "X121SMC";
|
|
string X121SMCOBStrategyToken = "X121SMCOB";
|
|
string X121SMCSUPDEMStrategyToken = "X121SMCSUPDEM";
|
|
string X121SMCConditionsToken = "X121SMCConditions";
|
|
string X121SMCMarketStructureToken = "X121SMCMarketStructure";
|
|
|
|
//
|
|
// Condition Structure ...
|
|
struct X121SMCStrategyConditions
|
|
{
|
|
//
|
|
// Props ...
|
|
|
|
//
|
|
// Common ...
|
|
string symbol;
|
|
ENUM_TIMEFRAMES period;
|
|
datetime time;
|
|
|
|
//
|
|
// Conditions ...
|
|
|
|
//
|
|
XOHCL swingHigh;
|
|
XZone supplyZone;
|
|
XZone bearishFVG;
|
|
XOHCL resistance;
|
|
XZone bearishOrderBlock;
|
|
XOHCL bullishMomentumBar;
|
|
XOHCL bullishRejectionBar;
|
|
|
|
//
|
|
XZone demandZones[];
|
|
XZone bearishFVGs[];
|
|
XZone bearishOrderBlocks[];
|
|
XOHCL swingHighs[];
|
|
XOHCL resistances[];
|
|
XOHCL bearishMomentumBars[];
|
|
XOHCL bearishRejectionBars[];
|
|
|
|
//
|
|
XOHCL support;
|
|
XOHCL swingLow;
|
|
XZone demandZone;
|
|
XZone bullishFVG;
|
|
XZone bullishOrderBlock;
|
|
XOHCL bearishMomentumBar;
|
|
XOHCL bearishRejectionBar;
|
|
|
|
//
|
|
XZone supplyZones[];
|
|
XZone bullishFVGs[];
|
|
XZone bullishOrderBlocks[];
|
|
XOHCL supports[];
|
|
XOHCL swingLows[];
|
|
XOHCL bullishMomentumBars[];
|
|
XOHCL bullishRejectionBars[];
|
|
|
|
//
|
|
// Constructor ...
|
|
void XStrategyConditions()
|
|
{
|
|
Clean();
|
|
}
|
|
|
|
//
|
|
// Tools ...
|
|
|
|
/**
|
|
* Cleanup ...
|
|
*/
|
|
void Clean()
|
|
{
|
|
//
|
|
symbol = NULL;
|
|
period = NULL;
|
|
time = NULL;
|
|
|
|
//
|
|
CleanDemand();
|
|
CleanSupply();
|
|
}
|
|
|
|
/**
|
|
* Cleanup Demand Related ...
|
|
*/
|
|
void CleanDemand()
|
|
{
|
|
//
|
|
support.Clean();
|
|
swingLow.Clean();
|
|
demandZone.Clean();
|
|
bullishFVG.Clean();
|
|
bullishOrderBlock.Clean();
|
|
bullishMomentumBar.Clean();
|
|
bullishRejectionBar.Clean();
|
|
|
|
//
|
|
Clean(supports);
|
|
Clean(swingLows);
|
|
Clean(supplyZones);
|
|
Clean(bullishFVGs);
|
|
Clean(bullishOrderBlocks);
|
|
Clean(bullishMomentumBars);
|
|
Clean(bullishRejectionBars);
|
|
}
|
|
|
|
/**
|
|
* Cleanup Supply Related ...
|
|
*/
|
|
void CleanSupply()
|
|
{
|
|
//
|
|
swingHigh.Clean();
|
|
supplyZone.Clean();
|
|
bearishFVG.Clean();
|
|
resistance.Clean();
|
|
bearishOrderBlock.Clean();
|
|
bearishMomentumBar.Clean();
|
|
bearishRejectionBar.Clean();
|
|
|
|
//
|
|
Clean(swingHighs);
|
|
Clean(demandZones);
|
|
Clean(bearishFVGs);
|
|
Clean(resistances);
|
|
Clean(bearishOrderBlocks);
|
|
Clean(bearishMomentumBars);
|
|
Clean(bearishRejectionBars);
|
|
}
|
|
|
|
/**
|
|
* Validate Demand ...
|
|
*
|
|
* @return ( bool )
|
|
*/
|
|
bool ValidateDemand()
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
result = IsValid();
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
result =
|
|
//
|
|
support.IsValid() &&
|
|
swingLow.IsValid() &&
|
|
demandZone.IsValid() &&
|
|
bullishFVG.IsValid() &&
|
|
bullishOrderBlock.IsValid() &&
|
|
bullishMomentumBar.IsValid() &&
|
|
bullishRejectionBar.IsValid() &&
|
|
//
|
|
(ArraySize(supports) > 0 ||
|
|
ArraySize(swingLows) > 0 ||
|
|
ArraySize(supplyZones) > 0 ||
|
|
ArraySize(bullishFVGs) > 0 ||
|
|
ArraySize(bullishOrderBlocks) > 0 ||
|
|
ArraySize(bullishMomentumBars) > 0 ||
|
|
ArraySize(bullishRejectionBars) > 0)
|
|
//
|
|
;
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* Validate Supply ...
|
|
*
|
|
* @return ( bool )
|
|
*/
|
|
bool ValidateSupply()
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
result = IsValid();
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
result =
|
|
//
|
|
swingHigh.IsValid() &&
|
|
supplyZone.IsValid() &&
|
|
bearishFVG.IsValid() &&
|
|
resistance.IsValid() &&
|
|
bearishOrderBlock.IsValid() &&
|
|
bearishMomentumBar.IsValid() &&
|
|
bearishRejectionBar.IsValid() &&
|
|
//
|
|
(ArraySize(swingHighs) > 0 ||
|
|
ArraySize(demandZones) > 0 ||
|
|
ArraySize(bearishFVGs) > 0 ||
|
|
ArraySize(resistances) > 0 ||
|
|
ArraySize(bearishOrderBlocks) > 0 ||
|
|
ArraySize(bearishMomentumBars) > 0 ||
|
|
ArraySize(bearishRejectionBars) > 0)
|
|
//
|
|
;
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Validate ...
|
|
bool IsValid()
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
result =
|
|
//
|
|
IsValid(time) &&
|
|
IsValid(symbol) &&
|
|
IsValid(period)
|
|
//
|
|
;
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Generate Provided Scores ...
|
|
void GenerateScore(
|
|
double &bullishScore,
|
|
double &bearishScore //
|
|
)
|
|
{
|
|
//
|
|
bullishScore = 0;
|
|
bearishScore = 0;
|
|
|
|
//
|
|
if (!IsValid())
|
|
{
|
|
return;
|
|
}
|
|
|
|
//
|
|
double bullScore = 0;
|
|
double bearScore = 0;
|
|
|
|
//
|
|
// Generate Helpers Conitions Scores ...
|
|
}
|
|
|
|
//
|
|
// Generate Summary ...
|
|
string GenerateSummary(
|
|
bool onlyCommons = false,
|
|
bool onlyConditions = false,
|
|
bool includeScores = true,
|
|
bool ignoreFalseConditions = true,
|
|
string separator = "\n" //
|
|
)
|
|
{
|
|
//
|
|
string result = NULL;
|
|
|
|
//
|
|
double bullishScore = 0;
|
|
double bearishScore = 0;
|
|
GenerateScore(
|
|
bullishScore,
|
|
bearishScore //
|
|
);
|
|
|
|
//
|
|
string commonStr = GenerateSpecifiedCommonSummary(
|
|
this,
|
|
separator,
|
|
includeScores,
|
|
true //
|
|
);
|
|
|
|
//
|
|
// Generate Helpers Conditions Strings ...
|
|
|
|
//
|
|
// Combine Helpers Conditions Strings ...
|
|
string conditionsStr =
|
|
//
|
|
"" + separator +
|
|
""
|
|
//
|
|
;
|
|
|
|
//
|
|
result =
|
|
//
|
|
"[" + GetTag() + "]" + separator +
|
|
"----------" + separator +
|
|
(onlyConditions
|
|
? ""
|
|
: commonStr) +
|
|
" " + separator +
|
|
(onlyCommons
|
|
? ""
|
|
: conditionsStr) +
|
|
""
|
|
//
|
|
;
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
string GetTag(
|
|
bool fullTag = false //
|
|
)
|
|
{
|
|
//
|
|
string result = NULL;
|
|
|
|
//
|
|
if (!IsValid())
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
if (fullTag)
|
|
{
|
|
//
|
|
result =
|
|
//
|
|
symbol + "," +
|
|
ToString(period) + "," +
|
|
ToFormatString(time) + "_" +
|
|
demandZone.GetTag() + "," +
|
|
supplyZone.GetTag() + "_" +
|
|
bullishOrderBlock.GetTag() + "," +
|
|
bearishOrderBlock.GetTag()
|
|
//
|
|
;
|
|
|
|
//
|
|
result = X121SMCConditionsToken + "_" + ToMD5(result);
|
|
}
|
|
else
|
|
{
|
|
result = X121SMCConditionsToken;
|
|
}
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
};
|
|
|
|
//
|
|
// Market Structure Models ...
|
|
struct X121SMCMarketStructure
|
|
{
|
|
//
|
|
XZone demandZone;
|
|
XZone supplyZone;
|
|
|
|
//
|
|
XZone bullishOrderBlock;
|
|
XZone bearishOrderBlock;
|
|
|
|
//
|
|
XZone demandZones[];
|
|
XZone supplyZones[];
|
|
|
|
//
|
|
XZone bearishOrderBlocks[];
|
|
XZone bearishFVGs[];
|
|
|
|
//
|
|
XOHCL swingHighs[];
|
|
XOHCL resistances[];
|
|
XOHCL bearishMomentumBars[];
|
|
XOHCL bearishRejectionBars[];
|
|
|
|
//
|
|
XZone bullishOrderBlocks[];
|
|
XZone bullishFVGs[];
|
|
|
|
//
|
|
XOHCL supports[];
|
|
XOHCL swingLows[];
|
|
XOHCL bullishMomentumBars[];
|
|
XOHCL bullishRejectionBars[];
|
|
|
|
//
|
|
void Clean()
|
|
{
|
|
//
|
|
demandZone.Clean();
|
|
supplyZone.Clean();
|
|
|
|
//
|
|
Clean(supports);
|
|
Clean(swingLows);
|
|
Clean(swingHighs);
|
|
Clean(demandZones);
|
|
Clean(supplyZones);
|
|
Clean(bearishFVGs);
|
|
Clean(resistances);
|
|
Clean(bullishFVGs);
|
|
Clean(bearishOrderBlocks);
|
|
Clean(bullishOrderBlocks);
|
|
Clean(bearishMomentumBars);
|
|
Clean(bearishRejectionBars);
|
|
Clean(bullishMomentumBars);
|
|
Clean(bullishRejectionBars);
|
|
}
|
|
|
|
//
|
|
string GetTag()
|
|
{
|
|
//
|
|
string result = NULL;
|
|
|
|
//
|
|
result =
|
|
//
|
|
demandZone.GetTag() + "," +
|
|
supplyZone.GetTag() + "_" +
|
|
bullishOrderBlock.GetTag() + "," +
|
|
bearishOrderBlock.GetTag()
|
|
//
|
|
;
|
|
result = X121SMCMarketStructureToken + "_" + ToMD5(X121SMCMarketStructureToken);
|
|
|
|
//
|
|
return result;
|
|
}
|
|
};
|
|
|
|
//
|
|
// On Signal Event Handler ...
|
|
typedef void (*TOnX121SMCSignal)(
|
|
XSignal &signal,
|
|
X121SMCStrategyConditions &conditions //
|
|
);
|
|
|
|
//
|
|
struct XRange
|
|
{
|
|
//
|
|
string symbol;
|
|
ENUM_TIMEFRAMES period;
|
|
|
|
//
|
|
double upper;
|
|
double lower;
|
|
|
|
//
|
|
datetime from;
|
|
datetime to;
|
|
|
|
//
|
|
void XRange()
|
|
{
|
|
Clean();
|
|
}
|
|
|
|
//
|
|
// Tools ...
|
|
|
|
/**
|
|
* Initial ...
|
|
*
|
|
* @param _symbol: String ...
|
|
* @param _period: ENUM_TIMEFRAMES member ...
|
|
* @param _upper: Double ...
|
|
* @param _lower: Double ...
|
|
* @param _from: DateTime ...
|
|
* @param _to: DateTime ...
|
|
*
|
|
* @return ( bool )
|
|
*/
|
|
bool Init(
|
|
string _symbol,
|
|
ENUM_TIMEFRAMES _period,
|
|
double _upper,
|
|
double _lower,
|
|
datetime _from,
|
|
datetime _to //
|
|
)
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
result =
|
|
//
|
|
IsValid(_symbol) &&
|
|
IsValid(_period) &&
|
|
IsValid(_from) &&
|
|
IsValid(_to) &&
|
|
_upper > 0 &&
|
|
_lower > 0 &&
|
|
_to > _from
|
|
//
|
|
;
|
|
|
|
//
|
|
symbol = _symbol;
|
|
period = _period;
|
|
|
|
//
|
|
upper = _upper;
|
|
lower = _lower;
|
|
|
|
//
|
|
from = _from;
|
|
to = _to;
|
|
|
|
//
|
|
result = IsValid();
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* Cleanup ...
|
|
*/
|
|
void Clean()
|
|
{
|
|
//
|
|
symbol = NULL;
|
|
period = NULL;
|
|
|
|
//
|
|
upper = 0;
|
|
lower = 0;
|
|
|
|
//
|
|
from = NULL;
|
|
to = NULL;
|
|
}
|
|
|
|
/**
|
|
* Validate ...
|
|
*
|
|
* @return ( bool )
|
|
*/
|
|
bool IsValid()
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
result =
|
|
//
|
|
IsValid(symbol) &&
|
|
IsValid(period) &&
|
|
IsValid(from) &&
|
|
IsValid(to) &&
|
|
upper > 0 &&
|
|
lower > 0 &&
|
|
to > from
|
|
//
|
|
;
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* Generate Unique Tag ...
|
|
*
|
|
* @return ( string )
|
|
*/
|
|
string GetTag()
|
|
{
|
|
//
|
|
string result = NULL;
|
|
|
|
//
|
|
string hash =
|
|
ToString(upper) + "," +
|
|
ToString(lower) +
|
|
ToFormatString(from);
|
|
hash = ToMD5(hash);
|
|
|
|
//
|
|
result =
|
|
//
|
|
"XRNG_" + symbol + "_" +
|
|
ToString(period) + "_" +
|
|
hash
|
|
//
|
|
;
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* Generate Tooltip ...
|
|
*
|
|
* @return ( string )
|
|
*/
|
|
string GetTooltip()
|
|
{
|
|
//
|
|
string result = NULL;
|
|
|
|
//
|
|
result =
|
|
//
|
|
"XRNG" + "\n" +
|
|
symbol + "\n" +
|
|
ToString(period) + "\n" +
|
|
ToString(from) + "\n" +
|
|
ToString(to)
|
|
//
|
|
;
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
};
|
|
|
|
//
|
|
struct XRangeStructure
|
|
{
|
|
//
|
|
XRange range;
|
|
|
|
//
|
|
XZone demandZones[];
|
|
XZone supplyZones[];
|
|
|
|
//
|
|
XZone bearishOrderBlocks[];
|
|
XZone bearishFVGs[];
|
|
|
|
//
|
|
XOHCL swingHighs[];
|
|
XOHCL resistances[];
|
|
XOHCL bearishMomentumBars[];
|
|
XOHCL bearishRejectionBars[];
|
|
|
|
//
|
|
XZone bullishOrderBlocks[];
|
|
XZone bullishFVGs[];
|
|
|
|
//
|
|
XOHCL supports[];
|
|
XOHCL swingLows[];
|
|
XOHCL bullishMomentumBars[];
|
|
XOHCL bullishRejectionBars[];
|
|
|
|
//
|
|
// Constructor ...
|
|
void XRangeStructure()
|
|
{
|
|
Clean();
|
|
}
|
|
|
|
//
|
|
// Tools ...
|
|
|
|
/**
|
|
* Cleanup ...
|
|
*/
|
|
void Clean()
|
|
{
|
|
//
|
|
range.Clean();
|
|
|
|
//
|
|
Clean(supports);
|
|
Clean(swingLows);
|
|
Clean(swingHighs);
|
|
Clean(demandZones);
|
|
Clean(supplyZones);
|
|
Clean(bearishFVGs);
|
|
Clean(resistances);
|
|
Clean(bullishFVGs);
|
|
Clean(bearishOrderBlocks);
|
|
Clean(bullishOrderBlocks);
|
|
Clean(bearishMomentumBars);
|
|
Clean(bearishRejectionBars);
|
|
Clean(bullishMomentumBars);
|
|
Clean(bullishRejectionBars);
|
|
}
|
|
|
|
/**
|
|
* Validate ...
|
|
*
|
|
* @return ( bool )
|
|
*/
|
|
bool IsValid()
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
result = range.IsValid();
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
result =
|
|
//
|
|
ArraySize(supports) > 0 ||
|
|
ArraySize(swingLows) > 0 ||
|
|
ArraySize(swingHighs) > 0 ||
|
|
ArraySize(demandZones) > 0 ||
|
|
ArraySize(supplyZones) > 0 ||
|
|
ArraySize(bearishFVGs) > 0 ||
|
|
ArraySize(resistances) > 0 ||
|
|
ArraySize(bullishFVGs) > 0 ||
|
|
ArraySize(bearishOrderBlocks) > 0 ||
|
|
ArraySize(bullishOrderBlocks) > 0 ||
|
|
ArraySize(bearishMomentumBars) > 0 ||
|
|
ArraySize(bearishRejectionBars) > 0 ||
|
|
ArraySize(bullishMomentumBars) > 0 ||
|
|
ArraySize(bullishRejectionBars) > 0
|
|
//
|
|
;
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* Generate Tag ...
|
|
*
|
|
* @return ( string )
|
|
*/
|
|
string GetTag()
|
|
{
|
|
//
|
|
string result = NULL;
|
|
|
|
//
|
|
string hash = range.GetTag();
|
|
hash = ToMD5(hash);
|
|
|
|
//
|
|
result = X121SMCMarketStructureToken + "_" + hash;
|
|
|
|
//
|
|
return result;
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Check a Zone is Between to other Zones ...
|
|
*
|
|
* @param source: XZone instance ...
|
|
* @param upper: XZone instance ...
|
|
* @param lower: XZone instance ...
|
|
*
|
|
* @return ( bool )
|
|
*/
|
|
bool IsBetween(
|
|
XZone &source,
|
|
XRange &range //
|
|
)
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
result = source.IsValid() &&
|
|
range.IsValid();
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
result = source.upper <= range.upper &&
|
|
source.lower >= range.lower;
|
|
|
|
//
|
|
return result;
|
|
}
|
|
bool IsBetween(
|
|
XOHCL &source,
|
|
XRange &range //
|
|
)
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
result = source.IsValid() &&
|
|
range.IsValid();
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
result = source.high <= range.upper &&
|
|
source.low >= range.lower;
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
// |