This commit is contained in:
2025-01-10 18:48:58 +03:30
parent c7133ea3d7
commit c6cfd9b115
4 changed files with 538 additions and 186 deletions
+11
View File
@@ -37,6 +37,7 @@ const string X121SMCStrategyToken = "X121SMC";
//
const string X121SMCXTestToken = "X121XTest";
const string X121SMCXOBGPVToken = "X121XOBGPV";
const string X121SMCXOBSPVToken = "X121XOBSPV";
//
// X121 SMC Providers ...
@@ -46,6 +47,7 @@ enum ENUM_X_121_SMC_PROVIDERS
X_121_SMC_PROVIDER_NONE,
X_121_SMC_PROVIDER_XTEST,
X_121_SMC_PROVIDER_XOBGPV,
X_121_SMC_PROVIDER_XOBSPV,
};
//
@@ -677,6 +679,11 @@ string ToString(ENUM_X_121_SMC_PROVIDERS value)
case X_121_SMC_PROVIDER_XOBGPV:
result = X121SMCXOBGPVToken;
break;
//
case X_121_SMC_PROVIDER_XOBSPV:
result = X121SMCXOBSPVToken;
break;
}
//
@@ -710,6 +717,10 @@ ENUM_X_121_SMC_PROVIDERS ParseProvider(string value)
{
result = X_121_SMC_PROVIDER_XOBGPV;
}
else if (Contains(X121SMCXOBSPVToken, value))
{
result = X_121_SMC_PROVIDER_XOBSPV;
}
//
return result;
@@ -2,7 +2,7 @@
//
// SaherElm IT Center MQL5 X121 SMC Signal Class
// -------------------------------------------------
// Name:
// Name: XOBGPV
// Description: provide all Signalling functions ...
//
//
@@ -184,6 +184,11 @@ struct X121SMCStrategyXOBGPVSignalConditions
//
};
//
// Signaller Data Sources ...
X121SMCStrategyXOBGPVSignalConditions mXOBGPVConditions;
X121SMCStrategyXOBGPVSignalConditions mXOBGPVConditionsCollection[];
//
// Extension Functions ...
@@ -2,7 +2,7 @@
//
// SaherElm IT Center MQL5 X121 SMC Signal Class
// -------------------------------------------------
// Name:
// Name: XOBSPV
// Description: provide all Signalling functions ...
//
//
@@ -26,7 +26,7 @@
//
// Definitions ...
struct X121SMCStrategyXTWPVSignalConditions
struct X121SMCStrategyXOBSPVSignalConditions
{
//
// Props ...
@@ -49,11 +49,11 @@ struct X121SMCStrategyXTWPVSignalConditions
datetime triggerTime;
//
XFVGOrderBlock fvgOB;
double pivot;
//
// Constructor ...
X121SMCStrategyXTWPVSignalConditions()
X121SMCStrategyXOBSPVSignalConditions()
{
Clean();
}
@@ -164,36 +164,29 @@ struct X121SMCStrategyXTWPVSignalConditions
* Clean Additional Properties ...
*/
void ExtensionClean()
{
fvgOB.Clean();
}
/**
* Update Order Blocks Date ...
*/
void UpdateOrderBlocks()
{
//
datetime cTime = TimeCurrent();
//
fvgOB.orderBlock.To(cTime);
fvgOB.fairValueGap.To(cTime);
pivot = 0;
}
//
};
//
// Signaller Data Sources ...
X121SMCStrategyXOBSPVSignalConditions mXOBSPVConditions;
X121SMCStrategyXOBSPVSignalConditions mXOBSPVConditionsCollection[];
//
// Extension Functions ...
//
// Detect Setup Conditions ...
bool DetectX121SMCXTWPVSiganlSetup(
bool DetectX121SMCXOBSPVSiganlSetup(
string _symbol,
ENUM_TIMEFRAMES _period,
//
X121SMCStrategyXTWPVSignalConditions &conditions,
X121SMCStrategyXOBSPVSignalConditions &conditions,
//
XC121SMCCycleHelper *triggerCycleHelper,
XC121SMCCycleHelper *decisionCycleHelper,
@@ -395,25 +388,191 @@ bool DetectX121SMCXTWPVSiganlSetup(
// Setup Conditions ...
//
ENUM_X_DIRECTION forDir;
XFVGOrderBlock bullishOrderBlocks[];
XFVGOrderBlock bearishOrderBlocks[];
bool isTested = DetectFVGOB(
forDir,
bullishOrderBlocks,
bearishOrderBlocks,
consolidationState,
analyseState //
// Waits for new Peak or Vale ...
//
// Reading Previous Conditions ...
ENUM_XPOI_EVENTS consolidationPoiEventsPrev[];
ENUM_X_CYCLE_EVENTS consolidationCycleEventsPrev[];
X121SMCCycleConditions consolidationConditionsPrev;
result = consolidationCycleHelper.GetConditions(
consolidationCycleEventsPrev,
consolidationPoiEventsPrev,
consolidationConditionsPrev,
cIndex,
loopback //
);
if (!result)
{
return result;
}
//
bool isStrSwitchedToBullish = analyseConditions.x121Conditions.isStrSwitchedToBullish;
bool isStrSwitchedToBearish = analyseConditions.x121Conditions.isStrSwitchedToBearish;
//
if (isStrSwitchedToBullish ||
isStrSwitchedToBearish)
{
Print("Str State Changed ...");
}
//
X121SMCCycleConditions conditionState = consolidationConditions;
X121SMCCycleConditions conditionStatePrev = consolidationConditionsPrev;
//
XOHCL cCBar;
result = cCBar.Init(
conditionState.symbol,
conditionState.period,
cIndex //
);
if (!result)
{
return result;
}
//
XOHCL cPBar;
result = cCBar.GetPreviousBar(cPBar);
if (!result)
{
return result;
}
//
// Engulf ...
ENUM_X_DIRECTION cCBarEngulfDir;
bool isCCBarEngulfed = consolidationCycleHelper
.mBarAnalyser
.IsEngulfBar(
cCBar,
cCBarEngulfDir,
0 // Extended ...
);
bool isCCBarBullishEngulfed =
isCCBarEngulfed &&
IsBullish(cCBarEngulfDir);
bool isCCBarBearishEngulfed =
isCCBarEngulfed &&
IsBearish(cCBarEngulfDir);
//
// Momentum ...
ENUM_X_DIRECTION cCBarMomentumDir;
bool isCCBarMomentum = consolidationCycleHelper
.mBarAnalyser
.IsMomentumBar(
cCBar,
cCBarMomentumDir,
1 // Extended ...
);
bool isCCBarBullishMomentum =
isCCBarMomentum &&
IsBullish(cCBarMomentumDir);
bool isCCBarBearishMomentum =
isCCBarMomentum &&
IsBearish(cCBarMomentumDir);
//
// Reject ...
ENUM_X_DIRECTION cCBarRejectDir;
bool isCCBarRejected = consolidationCycleHelper
.mBarAnalyser
.IsRejectionBar(
cCBar,
cCBarRejectDir,
1 // Extended ...
);
bool isCCBarBullishRejected =
isCCBarRejected &&
IsBullish(cCBarRejectDir);
bool isCCBarBearishRejected =
isCCBarRejected &&
IsBearish(cCBarRejectDir);
//
// Bar Checking Summary ...
//
// Bullish ...
bool isCCBarPassedBullish =
//
isCCBarBullishEngulfed ||
isCCBarBullishMomentum ||
isCCBarBullishRejected
//
;
//
// Bearish ...
bool isCCBarPassedBearish =
//
isCCBarBearishEngulfed ||
isCCBarBearishMomentum ||
isCCBarBearishRejected
//
;
//
double cPeakPrev = conditionStatePrev.x121Conditions.peaksBuffer[0];
double cValePrev = conditionStatePrev.x121Conditions.valesBuffer[0];
//
double cPeak = conditionState.x121Conditions.peaksBuffer[1];
double cVale = conditionState.x121Conditions.valesBuffer[1];
//
bool isCPeakSame = cPeak == cPeakPrev;
bool isCValeSame = cVale == cValePrev;
//
bool isCNewPeakPrev = conditionStatePrev.x121Conditions.isNewPeak;
bool isCNewPeakOverLastPrev = conditionStatePrev.x121Conditions.isNewPeakOverLast;
bool isCNewPeakUnderLastPrev = conditionStatePrev.x121Conditions.isNewPeakUnderLast;
//
bool isCNewValePrev = conditionStatePrev.x121Conditions.isNewVale;
bool isCNewValeOverLastPrev = conditionStatePrev.x121Conditions.isNewValeOverLast;
bool isCNewValeUnderLastPrev = conditionStatePrev.x121Conditions.isNewValeUnderLast;
//
bool isCRSIOverSold = conditionState.x121Conditions.isRSIOverSold;
bool isCRSICrossedOverOverSold = conditionState.x121Conditions.isRSICrossedOverOverSold;
bool isCRSICrossedUnderOverSold = conditionState.x121Conditions.isRSICrossedUnderOverSold;
//
bool isCRSIOverBought = conditionState.x121Conditions.isRSIOverBought;
bool isCRSICrossedOverOverBought = conditionState.x121Conditions.isRSICrossedOverOverBought;
bool isCRSICrossedUnderOverBought = conditionState.x121Conditions.isRSICrossedUnderOverBought;
//
bool isCRSIOverSoldPrev = conditionStatePrev.x121Conditions.isRSIOverSold;
bool isCRSICrossedOverOverSoldPrev = conditionStatePrev.x121Conditions.isRSICrossedOverOverSold;
bool isCRSICrossedUnderOverSoldPrev = conditionStatePrev.x121Conditions.isRSICrossedUnderOverSold;
//
bool isCRSIOverBoughtPrev = conditionStatePrev.x121Conditions.isRSIOverBought;
bool isCRSICrossedOverOverBoughtPrev = conditionStatePrev.x121Conditions.isRSICrossedOverOverBought;
bool isCRSICrossedUnderOverBoughtPrev = conditionStatePrev.x121Conditions.isRSICrossedUnderOverBought;
//
isBullish =
isTested &&
IsBullish(forDir);
//
isCNewValePrev &&
isCCBarPassedBullish
//
;
//
isBearish =
isTested &&
IsBearish(forDir);
//
isCNewPeakPrev &&
isCCBarPassedBearish
//
;
//
result = isBullish ||
@@ -424,15 +583,10 @@ bool DetectX121SMCXTWPVSiganlSetup(
}
//
conditions.dir = forDir;
if (isBullish)
{
conditions.fvgOB = bullishOrderBlocks[0];
}
else
{
conditions.fvgOB = bearishOrderBlocks[0];
}
conditions.pivot =
isBullish
? conditionState.x121Conditions.valesBuffer[1]
: conditionState.x121Conditions.peaksBuffer[1];
//
conditions.setupTime = cTime;
@@ -447,9 +601,9 @@ bool DetectX121SMCXTWPVSiganlSetup(
//
// Detect Trigger Conditions ...
bool DetectX121SMCXTWPVSiganlTrigger(
bool DetectX121SMCXOBSPVSiganlTrigger(
//
X121SMCStrategyXTWPVSignalConditions &conditions,
X121SMCStrategyXOBSPVSignalConditions &conditions,
//
string _symbol,
ENUM_TIMEFRAMES _period,
@@ -663,51 +817,15 @@ bool DetectX121SMCXTWPVSiganlTrigger(
// Trigger Conditions ...
//
double decisionPeak = decisionConditions.x121Conditions.peaksBuffer[1];
double isNewDecisionPeak = decisionConditions.x121Conditions.isNewPeak;
// Looking for STR Direction Change ...
//
double decisionVale = decisionConditions.x121Conditions.valesBuffer[1];
double isNewDecisionVale = decisionConditions.x121Conditions.isNewVale;
bool isStrSwitchedToBullish = analyseConditions.x121Conditions.isStrSwitchedToBullish;
bool isStrSwitchedToBearish = analyseConditions.x121Conditions.isStrSwitchedToBearish;
//
bool isTriggerRSICrossedOverOverSold = triggerConditions.x121Conditions.isRSICrossedOverOverSold;
bool isTriggerRSICrossedUnderOverBought = triggerConditions.x121Conditions.isRSICrossedUnderOverBought;
//
bool isDecisionRSICrossedOverOverSold = decisionConditions.x121Conditions.isRSICrossedOverOverSold;
bool isDecisionRSICrossedUnderOverBought = decisionConditions.x121Conditions.isRSICrossedUnderOverBought;
//
// Waits For Price to Go Inside FVG ...
bool isPriceInsideOB = IsPriceInsideZone(
cBar,
conditions.fvgOB.orderBlock //
);
//
bool isPriceInsideFVG = IsPriceInsideZone(
cBar,
conditions.fvgOB.fairValueGap //
);
//
result = isPriceInsideOB &&
isPriceInsideFVG &&
conditions.fvgOB.IsValid();
if (!result)
{
return result;
}
//
double fvgOBUpper = 0;
double fvgOBLower = 0;
bool hasBoundary = conditions.fvgOB.GetBoundary(
fvgOBUpper,
fvgOBLower //
);
result = hasBoundary;
result = isStrSwitchedToBullish ||
isStrSwitchedToBearish;
if (!result)
{
return result;
@@ -716,23 +834,17 @@ bool DetectX121SMCXTWPVSiganlTrigger(
//
// Detect Bullish Conditions ...
isBullish =
isBullish &&
cBar.IsBullish() &&
decisionVale < fvgOBUpper &&
decisionVale > fvgOBLower
// &&
// isTriggerRSICrossedOverOverSold
//
false
//
;
//
// Detect Bearish Conditions ...
isBearish =
isBearish &&
cBar.IsBearish() &&
decisionPeak < fvgOBUpper &&
decisionPeak > fvgOBLower
// &&
// isTriggerRSICrossedUnderOverBought
//
false
//
;
//
@@ -791,22 +903,6 @@ bool DetectX121SMCXTWPVSiganlTrigger(
double peak = triggerConditions.x121Conditions.peaksBuffer[1];
double vale = triggerConditions.x121Conditions.valesBuffer[1];
//
if (conditions.fvgOB.IsValid())
{
//
Add(
fvgOBUpper,
sls //
);
//
Add(
fvgOBLower,
sls //
);
}
//
if (isBullish)
{
@@ -898,9 +994,9 @@ bool DetectX121SMCXTWPVSiganlTrigger(
}
//
int AddX121SMCXTWPVConditionsIfNotExists(
X121SMCStrategyXTWPVSignalConditions &item,
X121SMCStrategyXTWPVSignalConditions &items[],
int AddX121SMCXOBSPVConditionsIfNotExists(
X121SMCStrategyXOBSPVSignalConditions &item,
X121SMCStrategyXOBSPVSignalConditions &items[],
int maxAllowed = 10 //
)
{
@@ -917,88 +1013,59 @@ int AddX121SMCXTWPVConditionsIfNotExists(
//
int count = ArraySize(items);
bool canAdd = !IsValidSize(count);
if (!canAdd)
if (IsValidSize(count))
{
//
// Copy Original Items ...
X121SMCStrategyXOBSPVSignalConditions tmpItems[];
Copy(
items,
tmpItems //
);
//
// Prese Item Data ...
bool isBullish = IsBullish(item.dir);
//
bool hasSame = false;
for (int i = 0; i < count; i++)
{
//
X121SMCStrategyXTWPVSignalConditions iItem = items[i];
X121SMCStrategyXOBSPVSignalConditions iItem = tmpItems[i];
//
hasSame = iItem.fvgOB.IsSameAs(item.fvgOB);
if (hasSame)
bool canRemove = item.dir == iItem.dir &&
item.pivot == iItem.pivot;
if (canRemove)
{
break;
//
ArrayRemove(
items,
i,
1 //
);
}
}
//
canAdd = !hasSame;
Clean(tmpItems);
}
//
if (canAdd)
{
//
AddRef(
item,
items //
);
AddRef(
item,
items //
);
//
// Remove Olds ...
CleanupArray(
items,
maxAllowed //
);
//
// Remove Olds ...
CleanupArray(
items,
maxAllowed //
);
//
result = ArraySize(items);
}
//
return result;
}
//
// Draw Signal ...
int DrawX121SMCXTWPVSiganl(
X121SMCStrategyXTWPVSignalConditions &conditions,
XCBaseObject *&drawnObjects[],
XCPOIDrawer *drawer //
)
{
//
int result = 0;
//
Clean(drawnObjects);
//
if (drawer == NULL)
{
return result;
}
//
bool isSetuped = conditions.IsSetuped();
if (!isSetuped)
{
return result;
}
//
bool isBullish = IsBullish(conditions.dir);
//
result = ArraySize(drawnObjects);
result = ArraySize(items);
//
return result;
+279 -10
View File
@@ -29,6 +29,7 @@
//
#include "../Signals/x-121.smc.test.signal.lib.mq5"
#include "../Signals/x-121.smc.xobgpv.signal.lib.mq5"
#include "../Signals/x-121.smc.xobspv.signal.lib.mq5"
//
// Definitions ...
@@ -184,11 +185,13 @@ class XCX121SMCStrategy : public XCX121SMCBaseStrategy
//
bool useTestSignal = false;
bool useXOBGPVSignal = true;
bool useXOBGPVSignal = false;
bool useXOBSPVSignal = true;
//
bool hasTestSignal = false;
bool hasXOBGPVSignal = false;
bool hasXOBSPVSignal = false;
//
// Test Signal ...
@@ -208,6 +211,15 @@ class XCX121SMCStrategy : public XCX121SMCBaseStrategy
hasSignal = hasXOBGPVSignal;
}
//
// XOBSPV Signal ...
if (useXOBSPVSignal && !hasSignal)
{
//
hasXOBSPVSignal = DetectXOBSPVSignal(conditions);
hasSignal = hasXOBSPVSignal;
}
//
result = hasSignal;
if (!result)
@@ -477,8 +489,6 @@ class XCX121SMCStrategy : public XCX121SMCBaseStrategy
//
// XOBGPV Signal ...
X121SMCStrategyXOBGPVSignalConditions mXOBGPVConditions;
X121SMCStrategyXOBGPVSignalConditions mXOBGPVConditionsCollection[];
bool DetectXOBGPVSignal(
X121SMCStrategyConditions &conditions //
)
@@ -736,6 +746,265 @@ class XCX121SMCStrategy : public XCX121SMCBaseStrategy
return result;
}
//
// XOBSPV Signal ...
bool DetectXOBSPVSignal(
X121SMCStrategyConditions &conditions //
)
{
//
bool result = false;
//
bool isBullish = false;
bool isBearish = false;
//
int zIndex = 0;
int cIndex = zIndex + 1;
int pIndex = cIndex + 1;
int ppIndex = pIndex + 1;
//
string symbol = GetSymbol();
ENUM_TIMEFRAMES period = GetPeriod();
//
XOHCL zBar;
result = zBar.Init(
symbol,
period,
zIndex //
);
if (!result)
{
return result;
}
//
XOHCL cBar;
result = cBar.Init(
symbol,
period,
cIndex //
);
if (!result)
{
return result;
}
//
XOHCL pBar;
result = pBar.Init(
symbol,
period,
pIndex //
);
if (!result)
{
return result;
}
//
double cLL = cBar.FindLowest(7, MODE_LOW);
double cHH = cBar.FindHighest(7, MODE_HIGH);
//
datetime cTime = TimeCurrent();
//
ENUM_X_121_SMC_PROVIDERS provider = X_121_SMC_PROVIDER_XOBSPV;
string providerStr = ToString(provider);
//
// Detect Setup Conditions ...
datetime setupTime = mXOBSPVConditions.setupTime;
bool isSetuped = mXOBSPVConditions.IsSetuped();
ENUM_X_DIRECTION setupDir = mXOBSPVConditions.dir;
if (!isSetuped)
{
//
// Detect Signal Setup ...
isSetuped = DetectX121SMCXOBSPVSiganlSetup(
symbol,
period,
mXOBSPVConditions,
mTriggerCycleHelper,
mDecisionCycleHelper,
mAnalyseCycleHelper,
mVerificationCycleHelper,
mConsolidationCycleHelper,
mVisionCycleHelper //
);
//
setupDir = mXOBSPVConditions.dir;
setupTime = mXOBSPVConditions.setupTime;
//
if (isSetuped)
{
//
int items = AddX121SMCXOBSPVConditionsIfNotExists(
mXOBSPVConditions,
mXOBSPVConditionsCollection //
);
//
mXOBSPVConditions.Clean();
}
}
//
int conditionsCount = ArraySize(mXOBSPVConditionsCollection);
result = IsValidSize(conditionsCount);
if (!result)
{
return result;
}
//
// Looking For Conditions ...
int selectedIndex = 0;
X121SMCStrategyXOBSPVSignalConditions mTmpConditions[];
Copy(
mXOBSPVConditionsCollection,
mTmpConditions //
);
X121SMCStrategyXOBSPVSignalConditions mConditions;
for (int i = 0; i < conditionsCount; i++)
{
//
// Update Conditions ...
// mTmpConditions[i].UpdateOrderBlocks();
//
// Retrieve Required Data ...
// ENUM_X_DIRECTION iDir = mTmpConditions[i].dir;
// bool isIBullish = IsBullish(iDir);
// double iUpper = 0;
// double iLower = 0;
// bool iHasBoundary = mTmpConditions[i].fvgOB.GetBoundary(
// iUpper,
// iLower //
// );
// if (!iHasBoundary)
// {
// continue;
// }
//
// Draw Conditions ...
//
// XFVGOrderBlock iFVGOB = mTmpConditions[i].fvgOB;
// XCBaseObject *drawnObjects[];
// mPOIDrawer.DrawFVGOrderBlock(
// iFVGOB,
// drawnObjects //
// );
// AddObjectsIfNotExists(drawnObjects);
//
// Check Broken Order Blocks and Remove them ...
// bool isBreaked =
// isBullish
// ? (cBar.high < iLower ||
// pBar.high < iLower)
// : (cBar.low > iUpper ||
// cBar.low > iUpper);
// if (isBreaked)
// {
// //
// ArrayRemove(
// mXOBSPVConditionsCollection,
// i,
// 1 //
// );
// //
// continue;
// }
//
// Check Triggers ...
bool canTrigger = mTmpConditions[i].CanTrigger();
datetime triggerTime = mTmpConditions[i].triggerTime;
if (!canTrigger)
{
//
// Detect Signal Trigger ...
canTrigger = DetectX121SMCXOBSPVSiganlTrigger(
mTmpConditions[i],
symbol,
period,
mTriggerCycleHelper,
mDecisionCycleHelper,
mAnalyseCycleHelper,
mVerificationCycleHelper,
mConsolidationCycleHelper,
mVisionCycleHelper //
);
//
result = canTrigger;
if (!result)
{
continue;
}
//
triggerTime = mTmpConditions[i].triggerTime;
}
//
if (canTrigger)
{
//
selectedIndex = i;
mConditions = mTmpConditions[i];
break;
}
}
//
result = IsValid(mConditions.setupTime) &&
HasDirection(mConditions.dir);
if (!result)
{
return result;
}
//
// Remove Selected Index from Main Collection ...
ArrayRemove(
mXOBSPVConditionsCollection,
selectedIndex,
1 //
);
//
// Check Signal Direction ...
isBullish = IsBullish(mConditions.dir);
isBearish = IsBearish(mConditions.dir);
result = isBullish ||
isBearish;
if (!result)
{
return result;
}
//
// Issues Signal on Conditions ...
conditions.sl = mConditions.sl;
conditions.provider = providerStr;
conditions.signalDir = mConditions.dir;
conditions.target = mConditions.target;
//
return result;
}
//
// Private ...
private:
@@ -813,14 +1082,14 @@ class XCX121SMCStrategy : public XCX121SMCBaseStrategy
//
// XATR ...
x121Inputs.xatrInputs.showATRUpper = false;
x121Inputs.xatrInputs.showATRLower = false;
x121Inputs.xatrInputs.showATRUpper = true;
x121Inputs.xatrInputs.showATRLower = true;
//
// XSTR ...
x121Inputs.xstrInputs.showStr = true;
x121Inputs.xstrInputs.showStrUpper = false;
x121Inputs.xstrInputs.showStrLower = false;
x121Inputs.xstrInputs.showStrUpper = true;
x121Inputs.xstrInputs.showStrLower = true;
//
// XDON ...
@@ -831,9 +1100,9 @@ class XCX121SMCStrategy : public XCX121SMCBaseStrategy
//
// XVWAP ...
x121Inputs.xvwapInputs.showVWapFast = false;
x121Inputs.xvwapInputs.showVWapMedium = false;
x121Inputs.xvwapInputs.showVWapSlow = false;
x121Inputs.xvwapInputs.showVWapFast = true;
x121Inputs.xvwapInputs.showVWapMedium = true;
x121Inputs.xvwapInputs.showVWapSlow = true;
//
// Initialize Cycle Helpers ...