last ...
This commit is contained in:
@@ -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 ...
|
||||
|
||||
|
||||
+242
-175
@@ -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;
|
||||
Reference in New Issue
Block a user