last ...
This commit is contained in:
@@ -37,6 +37,7 @@ const string X121SMCStrategyToken = "X121SMC";
|
|||||||
//
|
//
|
||||||
const string X121SMCXTestToken = "X121XTest";
|
const string X121SMCXTestToken = "X121XTest";
|
||||||
const string X121SMCXOBGPVToken = "X121XOBGPV";
|
const string X121SMCXOBGPVToken = "X121XOBGPV";
|
||||||
|
const string X121SMCXOBSPVToken = "X121XOBSPV";
|
||||||
|
|
||||||
//
|
//
|
||||||
// X121 SMC Providers ...
|
// X121 SMC Providers ...
|
||||||
@@ -46,6 +47,7 @@ enum ENUM_X_121_SMC_PROVIDERS
|
|||||||
X_121_SMC_PROVIDER_NONE,
|
X_121_SMC_PROVIDER_NONE,
|
||||||
X_121_SMC_PROVIDER_XTEST,
|
X_121_SMC_PROVIDER_XTEST,
|
||||||
X_121_SMC_PROVIDER_XOBGPV,
|
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:
|
case X_121_SMC_PROVIDER_XOBGPV:
|
||||||
result = X121SMCXOBGPVToken;
|
result = X121SMCXOBGPVToken;
|
||||||
break;
|
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;
|
result = X_121_SMC_PROVIDER_XOBGPV;
|
||||||
}
|
}
|
||||||
|
else if (Contains(X121SMCXOBSPVToken, value))
|
||||||
|
{
|
||||||
|
result = X_121_SMC_PROVIDER_XOBSPV;
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
return result;
|
return result;
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
//
|
//
|
||||||
// SaherElm IT Center MQL5 X121 SMC Signal Class
|
// SaherElm IT Center MQL5 X121 SMC Signal Class
|
||||||
// -------------------------------------------------
|
// -------------------------------------------------
|
||||||
// Name:
|
// Name: XOBGPV
|
||||||
// Description: provide all Signalling functions ...
|
// Description: provide all Signalling functions ...
|
||||||
//
|
//
|
||||||
//
|
//
|
||||||
@@ -184,6 +184,11 @@ struct X121SMCStrategyXOBGPVSignalConditions
|
|||||||
//
|
//
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//
|
||||||
|
// Signaller Data Sources ...
|
||||||
|
X121SMCStrategyXOBGPVSignalConditions mXOBGPVConditions;
|
||||||
|
X121SMCStrategyXOBGPVSignalConditions mXOBGPVConditionsCollection[];
|
||||||
|
|
||||||
//
|
//
|
||||||
// Extension Functions ...
|
// Extension Functions ...
|
||||||
|
|
||||||
|
|||||||
+231
-164
@@ -2,7 +2,7 @@
|
|||||||
//
|
//
|
||||||
// SaherElm IT Center MQL5 X121 SMC Signal Class
|
// SaherElm IT Center MQL5 X121 SMC Signal Class
|
||||||
// -------------------------------------------------
|
// -------------------------------------------------
|
||||||
// Name:
|
// Name: XOBSPV
|
||||||
// Description: provide all Signalling functions ...
|
// Description: provide all Signalling functions ...
|
||||||
//
|
//
|
||||||
//
|
//
|
||||||
@@ -26,7 +26,7 @@
|
|||||||
|
|
||||||
//
|
//
|
||||||
// Definitions ...
|
// Definitions ...
|
||||||
struct X121SMCStrategyXTWPVSignalConditions
|
struct X121SMCStrategyXOBSPVSignalConditions
|
||||||
{
|
{
|
||||||
//
|
//
|
||||||
// Props ...
|
// Props ...
|
||||||
@@ -49,11 +49,11 @@ struct X121SMCStrategyXTWPVSignalConditions
|
|||||||
datetime triggerTime;
|
datetime triggerTime;
|
||||||
|
|
||||||
//
|
//
|
||||||
XFVGOrderBlock fvgOB;
|
double pivot;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Constructor ...
|
// Constructor ...
|
||||||
X121SMCStrategyXTWPVSignalConditions()
|
X121SMCStrategyXOBSPVSignalConditions()
|
||||||
{
|
{
|
||||||
Clean();
|
Clean();
|
||||||
}
|
}
|
||||||
@@ -164,36 +164,29 @@ struct X121SMCStrategyXTWPVSignalConditions
|
|||||||
* Clean Additional Properties ...
|
* Clean Additional Properties ...
|
||||||
*/
|
*/
|
||||||
void ExtensionClean()
|
void ExtensionClean()
|
||||||
{
|
|
||||||
fvgOB.Clean();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Update Order Blocks Date ...
|
|
||||||
*/
|
|
||||||
void UpdateOrderBlocks()
|
|
||||||
{
|
{
|
||||||
//
|
//
|
||||||
datetime cTime = TimeCurrent();
|
pivot = 0;
|
||||||
|
|
||||||
//
|
|
||||||
fvgOB.orderBlock.To(cTime);
|
|
||||||
fvgOB.fairValueGap.To(cTime);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//
|
||||||
|
// Signaller Data Sources ...
|
||||||
|
X121SMCStrategyXOBSPVSignalConditions mXOBSPVConditions;
|
||||||
|
X121SMCStrategyXOBSPVSignalConditions mXOBSPVConditionsCollection[];
|
||||||
|
|
||||||
//
|
//
|
||||||
// Extension Functions ...
|
// Extension Functions ...
|
||||||
|
|
||||||
//
|
//
|
||||||
// Detect Setup Conditions ...
|
// Detect Setup Conditions ...
|
||||||
bool DetectX121SMCXTWPVSiganlSetup(
|
bool DetectX121SMCXOBSPVSiganlSetup(
|
||||||
string _symbol,
|
string _symbol,
|
||||||
ENUM_TIMEFRAMES _period,
|
ENUM_TIMEFRAMES _period,
|
||||||
//
|
//
|
||||||
X121SMCStrategyXTWPVSignalConditions &conditions,
|
X121SMCStrategyXOBSPVSignalConditions &conditions,
|
||||||
//
|
//
|
||||||
XC121SMCCycleHelper *triggerCycleHelper,
|
XC121SMCCycleHelper *triggerCycleHelper,
|
||||||
XC121SMCCycleHelper *decisionCycleHelper,
|
XC121SMCCycleHelper *decisionCycleHelper,
|
||||||
@@ -395,25 +388,191 @@ bool DetectX121SMCXTWPVSiganlSetup(
|
|||||||
// Setup Conditions ...
|
// Setup Conditions ...
|
||||||
|
|
||||||
//
|
//
|
||||||
ENUM_X_DIRECTION forDir;
|
// Waits for new Peak or Vale ...
|
||||||
XFVGOrderBlock bullishOrderBlocks[];
|
|
||||||
XFVGOrderBlock bearishOrderBlocks[];
|
//
|
||||||
bool isTested = DetectFVGOB(
|
// Reading Previous Conditions ...
|
||||||
forDir,
|
ENUM_XPOI_EVENTS consolidationPoiEventsPrev[];
|
||||||
bullishOrderBlocks,
|
ENUM_X_CYCLE_EVENTS consolidationCycleEventsPrev[];
|
||||||
bearishOrderBlocks,
|
X121SMCCycleConditions consolidationConditionsPrev;
|
||||||
consolidationState,
|
result = consolidationCycleHelper.GetConditions(
|
||||||
analyseState //
|
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 =
|
isBullish =
|
||||||
isTested &&
|
//
|
||||||
IsBullish(forDir);
|
isCNewValePrev &&
|
||||||
|
isCCBarPassedBullish
|
||||||
|
//
|
||||||
|
;
|
||||||
|
|
||||||
//
|
//
|
||||||
isBearish =
|
isBearish =
|
||||||
isTested &&
|
//
|
||||||
IsBearish(forDir);
|
isCNewPeakPrev &&
|
||||||
|
isCCBarPassedBearish
|
||||||
|
//
|
||||||
|
;
|
||||||
|
|
||||||
//
|
//
|
||||||
result = isBullish ||
|
result = isBullish ||
|
||||||
@@ -424,15 +583,10 @@ bool DetectX121SMCXTWPVSiganlSetup(
|
|||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
conditions.dir = forDir;
|
conditions.pivot =
|
||||||
if (isBullish)
|
isBullish
|
||||||
{
|
? conditionState.x121Conditions.valesBuffer[1]
|
||||||
conditions.fvgOB = bullishOrderBlocks[0];
|
: conditionState.x121Conditions.peaksBuffer[1];
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
conditions.fvgOB = bearishOrderBlocks[0];
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
//
|
||||||
conditions.setupTime = cTime;
|
conditions.setupTime = cTime;
|
||||||
@@ -447,9 +601,9 @@ bool DetectX121SMCXTWPVSiganlSetup(
|
|||||||
|
|
||||||
//
|
//
|
||||||
// Detect Trigger Conditions ...
|
// Detect Trigger Conditions ...
|
||||||
bool DetectX121SMCXTWPVSiganlTrigger(
|
bool DetectX121SMCXOBSPVSiganlTrigger(
|
||||||
//
|
//
|
||||||
X121SMCStrategyXTWPVSignalConditions &conditions,
|
X121SMCStrategyXOBSPVSignalConditions &conditions,
|
||||||
//
|
//
|
||||||
string _symbol,
|
string _symbol,
|
||||||
ENUM_TIMEFRAMES _period,
|
ENUM_TIMEFRAMES _period,
|
||||||
@@ -663,51 +817,15 @@ bool DetectX121SMCXTWPVSiganlTrigger(
|
|||||||
// Trigger Conditions ...
|
// Trigger Conditions ...
|
||||||
|
|
||||||
//
|
//
|
||||||
double decisionPeak = decisionConditions.x121Conditions.peaksBuffer[1];
|
// Looking for STR Direction Change ...
|
||||||
double isNewDecisionPeak = decisionConditions.x121Conditions.isNewPeak;
|
|
||||||
|
|
||||||
//
|
//
|
||||||
double decisionVale = decisionConditions.x121Conditions.valesBuffer[1];
|
bool isStrSwitchedToBullish = analyseConditions.x121Conditions.isStrSwitchedToBullish;
|
||||||
double isNewDecisionVale = decisionConditions.x121Conditions.isNewVale;
|
bool isStrSwitchedToBearish = analyseConditions.x121Conditions.isStrSwitchedToBearish;
|
||||||
|
|
||||||
//
|
//
|
||||||
bool isTriggerRSICrossedOverOverSold = triggerConditions.x121Conditions.isRSICrossedOverOverSold;
|
result = isStrSwitchedToBullish ||
|
||||||
bool isTriggerRSICrossedUnderOverBought = triggerConditions.x121Conditions.isRSICrossedUnderOverBought;
|
isStrSwitchedToBearish;
|
||||||
|
|
||||||
//
|
|
||||||
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;
|
|
||||||
if (!result)
|
if (!result)
|
||||||
{
|
{
|
||||||
return result;
|
return result;
|
||||||
@@ -716,23 +834,17 @@ bool DetectX121SMCXTWPVSiganlTrigger(
|
|||||||
//
|
//
|
||||||
// Detect Bullish Conditions ...
|
// Detect Bullish Conditions ...
|
||||||
isBullish =
|
isBullish =
|
||||||
isBullish &&
|
//
|
||||||
cBar.IsBullish() &&
|
false
|
||||||
decisionVale < fvgOBUpper &&
|
//
|
||||||
decisionVale > fvgOBLower
|
|
||||||
// &&
|
|
||||||
// isTriggerRSICrossedOverOverSold
|
|
||||||
;
|
;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Detect Bearish Conditions ...
|
// Detect Bearish Conditions ...
|
||||||
isBearish =
|
isBearish =
|
||||||
isBearish &&
|
//
|
||||||
cBar.IsBearish() &&
|
false
|
||||||
decisionPeak < fvgOBUpper &&
|
//
|
||||||
decisionPeak > fvgOBLower
|
|
||||||
// &&
|
|
||||||
// isTriggerRSICrossedUnderOverBought
|
|
||||||
;
|
;
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -791,22 +903,6 @@ bool DetectX121SMCXTWPVSiganlTrigger(
|
|||||||
double peak = triggerConditions.x121Conditions.peaksBuffer[1];
|
double peak = triggerConditions.x121Conditions.peaksBuffer[1];
|
||||||
double vale = triggerConditions.x121Conditions.valesBuffer[1];
|
double vale = triggerConditions.x121Conditions.valesBuffer[1];
|
||||||
|
|
||||||
//
|
|
||||||
if (conditions.fvgOB.IsValid())
|
|
||||||
{
|
|
||||||
//
|
|
||||||
Add(
|
|
||||||
fvgOBUpper,
|
|
||||||
sls //
|
|
||||||
);
|
|
||||||
|
|
||||||
//
|
|
||||||
Add(
|
|
||||||
fvgOBLower,
|
|
||||||
sls //
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
//
|
||||||
if (isBullish)
|
if (isBullish)
|
||||||
{
|
{
|
||||||
@@ -898,9 +994,9 @@ bool DetectX121SMCXTWPVSiganlTrigger(
|
|||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
int AddX121SMCXTWPVConditionsIfNotExists(
|
int AddX121SMCXOBSPVConditionsIfNotExists(
|
||||||
X121SMCStrategyXTWPVSignalConditions &item,
|
X121SMCStrategyXOBSPVSignalConditions &item,
|
||||||
X121SMCStrategyXTWPVSignalConditions &items[],
|
X121SMCStrategyXOBSPVSignalConditions &items[],
|
||||||
int maxAllowed = 10 //
|
int maxAllowed = 10 //
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
@@ -917,35 +1013,44 @@ int AddX121SMCXTWPVConditionsIfNotExists(
|
|||||||
|
|
||||||
//
|
//
|
||||||
int count = ArraySize(items);
|
int count = ArraySize(items);
|
||||||
bool canAdd = !IsValidSize(count);
|
if (IsValidSize(count))
|
||||||
if (!canAdd)
|
|
||||||
{
|
{
|
||||||
|
//
|
||||||
|
// Copy Original Items ...
|
||||||
|
X121SMCStrategyXOBSPVSignalConditions tmpItems[];
|
||||||
|
Copy(
|
||||||
|
items,
|
||||||
|
tmpItems //
|
||||||
|
);
|
||||||
|
|
||||||
//
|
//
|
||||||
// Prese Item Data ...
|
// Prese Item Data ...
|
||||||
bool isBullish = IsBullish(item.dir);
|
bool isBullish = IsBullish(item.dir);
|
||||||
|
|
||||||
//
|
//
|
||||||
bool hasSame = false;
|
|
||||||
for (int i = 0; i < count; i++)
|
for (int i = 0; i < count; i++)
|
||||||
{
|
{
|
||||||
//
|
//
|
||||||
X121SMCStrategyXTWPVSignalConditions iItem = items[i];
|
X121SMCStrategyXOBSPVSignalConditions iItem = tmpItems[i];
|
||||||
|
|
||||||
//
|
//
|
||||||
hasSame = iItem.fvgOB.IsSameAs(item.fvgOB);
|
bool canRemove = item.dir == iItem.dir &&
|
||||||
if (hasSame)
|
item.pivot == iItem.pivot;
|
||||||
|
if (canRemove)
|
||||||
{
|
{
|
||||||
break;
|
//
|
||||||
|
ArrayRemove(
|
||||||
|
items,
|
||||||
|
i,
|
||||||
|
1 //
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
canAdd = !hasSame;
|
Clean(tmpItems);
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
|
||||||
if (canAdd)
|
|
||||||
{
|
|
||||||
//
|
//
|
||||||
AddRef(
|
AddRef(
|
||||||
item,
|
item,
|
||||||
@@ -961,44 +1066,6 @@ int AddX121SMCXTWPVConditionsIfNotExists(
|
|||||||
|
|
||||||
//
|
//
|
||||||
result = ArraySize(items);
|
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);
|
|
||||||
|
|
||||||
//
|
//
|
||||||
return result;
|
return result;
|
||||||
@@ -29,6 +29,7 @@
|
|||||||
//
|
//
|
||||||
#include "../Signals/x-121.smc.test.signal.lib.mq5"
|
#include "../Signals/x-121.smc.test.signal.lib.mq5"
|
||||||
#include "../Signals/x-121.smc.xobgpv.signal.lib.mq5"
|
#include "../Signals/x-121.smc.xobgpv.signal.lib.mq5"
|
||||||
|
#include "../Signals/x-121.smc.xobspv.signal.lib.mq5"
|
||||||
|
|
||||||
//
|
//
|
||||||
// Definitions ...
|
// Definitions ...
|
||||||
@@ -184,11 +185,13 @@ class XCX121SMCStrategy : public XCX121SMCBaseStrategy
|
|||||||
|
|
||||||
//
|
//
|
||||||
bool useTestSignal = false;
|
bool useTestSignal = false;
|
||||||
bool useXOBGPVSignal = true;
|
bool useXOBGPVSignal = false;
|
||||||
|
bool useXOBSPVSignal = true;
|
||||||
|
|
||||||
//
|
//
|
||||||
bool hasTestSignal = false;
|
bool hasTestSignal = false;
|
||||||
bool hasXOBGPVSignal = false;
|
bool hasXOBGPVSignal = false;
|
||||||
|
bool hasXOBSPVSignal = false;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Test Signal ...
|
// Test Signal ...
|
||||||
@@ -208,6 +211,15 @@ class XCX121SMCStrategy : public XCX121SMCBaseStrategy
|
|||||||
hasSignal = hasXOBGPVSignal;
|
hasSignal = hasXOBGPVSignal;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// XOBSPV Signal ...
|
||||||
|
if (useXOBSPVSignal && !hasSignal)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
hasXOBSPVSignal = DetectXOBSPVSignal(conditions);
|
||||||
|
hasSignal = hasXOBSPVSignal;
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
result = hasSignal;
|
result = hasSignal;
|
||||||
if (!result)
|
if (!result)
|
||||||
@@ -477,8 +489,6 @@ class XCX121SMCStrategy : public XCX121SMCBaseStrategy
|
|||||||
|
|
||||||
//
|
//
|
||||||
// XOBGPV Signal ...
|
// XOBGPV Signal ...
|
||||||
X121SMCStrategyXOBGPVSignalConditions mXOBGPVConditions;
|
|
||||||
X121SMCStrategyXOBGPVSignalConditions mXOBGPVConditionsCollection[];
|
|
||||||
bool DetectXOBGPVSignal(
|
bool DetectXOBGPVSignal(
|
||||||
X121SMCStrategyConditions &conditions //
|
X121SMCStrategyConditions &conditions //
|
||||||
)
|
)
|
||||||
@@ -736,6 +746,265 @@ class XCX121SMCStrategy : public XCX121SMCBaseStrategy
|
|||||||
return result;
|
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 ...
|
||||||
private:
|
private:
|
||||||
@@ -813,14 +1082,14 @@ class XCX121SMCStrategy : public XCX121SMCBaseStrategy
|
|||||||
|
|
||||||
//
|
//
|
||||||
// XATR ...
|
// XATR ...
|
||||||
x121Inputs.xatrInputs.showATRUpper = false;
|
x121Inputs.xatrInputs.showATRUpper = true;
|
||||||
x121Inputs.xatrInputs.showATRLower = false;
|
x121Inputs.xatrInputs.showATRLower = true;
|
||||||
|
|
||||||
//
|
//
|
||||||
// XSTR ...
|
// XSTR ...
|
||||||
x121Inputs.xstrInputs.showStr = true;
|
x121Inputs.xstrInputs.showStr = true;
|
||||||
x121Inputs.xstrInputs.showStrUpper = false;
|
x121Inputs.xstrInputs.showStrUpper = true;
|
||||||
x121Inputs.xstrInputs.showStrLower = false;
|
x121Inputs.xstrInputs.showStrLower = true;
|
||||||
|
|
||||||
//
|
//
|
||||||
// XDON ...
|
// XDON ...
|
||||||
@@ -831,9 +1100,9 @@ class XCX121SMCStrategy : public XCX121SMCBaseStrategy
|
|||||||
|
|
||||||
//
|
//
|
||||||
// XVWAP ...
|
// XVWAP ...
|
||||||
x121Inputs.xvwapInputs.showVWapFast = false;
|
x121Inputs.xvwapInputs.showVWapFast = true;
|
||||||
x121Inputs.xvwapInputs.showVWapMedium = false;
|
x121Inputs.xvwapInputs.showVWapMedium = true;
|
||||||
x121Inputs.xvwapInputs.showVWapSlow = false;
|
x121Inputs.xvwapInputs.showVWapSlow = true;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Initialize Cycle Helpers ...
|
// Initialize Cycle Helpers ...
|
||||||
|
|||||||
Reference in New Issue
Block a user