This commit is contained in:
2024-12-11 17:50:57 +03:30
parent db5144b1ef
commit 4516229d36
4 changed files with 889 additions and 81 deletions
@@ -271,11 +271,27 @@ class XCX121SMCTestStrategy : public XCX121SMCBaseStrategy
ENUM_X_DIRECTION mOrderFlowDir;
//
ENUM_X_CYCLE_EVENTS mTriggerCycleEvents[];
XC121SMCCycleHelper *mTriggerCycleHelper;
//
ENUM_X_CYCLE_EVENTS mDecisionCycleEvents[];
XC121SMCCycleHelper *mDecisionCycleHelper;
//
ENUM_X_CYCLE_EVENTS mAnalyseCycleEvents[];
XC121SMCCycleHelper *mAnalyseCycleHelper;
//
ENUM_X_CYCLE_EVENTS mVerificationCycleEvents[];
XC121SMCCycleHelper *mVerificationCycleHelper;
//
ENUM_X_CYCLE_EVENTS mConsolidationCycleEvents[];
XC121SMCCycleHelper *mConsolidationCycleHelper;
//
ENUM_X_CYCLE_EVENTS mVisionCycleEvents[];
XC121SMCCycleHelper *mVisionCycleHelper;
//
@@ -322,6 +338,7 @@ class XCX121SMCTestStrategy : public XCX121SMCBaseStrategy
//
// Trigger ...
result = mTriggerCycleHelper.GetConditions(
mTriggerCycleEvents,
conditions.triggerConditions,
zIndex,
conditionsLoopback //
@@ -337,6 +354,7 @@ class XCX121SMCTestStrategy : public XCX121SMCBaseStrategy
//
// Decision ...
result = mDecisionCycleHelper.GetConditions(
mDecisionCycleEvents,
conditions.decisionConditions,
zIndex,
conditionsLoopback //
@@ -352,6 +370,7 @@ class XCX121SMCTestStrategy : public XCX121SMCBaseStrategy
//
// Analyse ...
result = mAnalyseCycleHelper.GetConditions(
mAnalyseCycleEvents,
conditions.analyseConditions,
zIndex,
conditionsLoopback //
@@ -367,6 +386,7 @@ class XCX121SMCTestStrategy : public XCX121SMCBaseStrategy
//
// Verification ...
result = mVerificationCycleHelper.GetConditions(
mVerificationCycleEvents,
conditions.verificationConditions,
zIndex,
conditionsLoopback //
@@ -382,6 +402,7 @@ class XCX121SMCTestStrategy : public XCX121SMCBaseStrategy
//
// Consolidation ...
result = mConsolidationCycleHelper.GetConditions(
mConsolidationCycleEvents,
conditions.consolidationConditions,
zIndex,
conditionsLoopback //
@@ -397,6 +418,7 @@ class XCX121SMCTestStrategy : public XCX121SMCBaseStrategy
//
// Vision ...
result = mVisionCycleHelper.GetConditions(
mVisionCycleEvents,
conditions.visionConditions,
zIndex,
conditionsLoopback //
@@ -469,118 +491,522 @@ class XCX121SMCTestStrategy : public XCX121SMCBaseStrategy
datetime cTime = TimeCurrent();
//
int consolidationsCount = mTriggerCycleHelper.CountConsolidationZones();
result = IsValidSize(consolidationsCount);
// Here We Select Cycles For Conditions Check ...
ENUM_X_CYCLES cycles[5] = {
X_CYCLE_TRIGGER,
X_CYCLE_DECISION,
X_CYCLE_ANALYSE,
X_CYCLE_VERIFICATION,
X_CYCLE_CONSOLIDATION //
};
bool hasSamePeaks = DetectSamePeaks(
cycles,
conditions //
);
bool hasSameVales = DetectSameVales(
cycles,
conditions //
);
result =
hasSamePeaks ||
hasSameVales;
if (!result)
{
//
conditions.Clean();
return result;
}
XConsolidationZone consolidations[];
mTriggerCycleHelper.FillConsolidationZones(consolidations);
//
// Detect Bid inside Of Zones ...
bool hasSupply = false;
bool hasDemand = false;
XCSupplyZone *supplyZone;
XCDemandZone *demandZone;
bool isBidInsideZone = false;
XConsolidationZone bidContainsConsolidationZone;
for (int i = consolidationsCount - 1; i >= 0; i--)
// Check Sar State ...
ENUM_X_DIRECTION sarDir;
result = DetectSarState(
sarDir,
conditions //
);
if (!result)
{
//
XConsolidationZone iZone = consolidations[i];
conditions.Clean();
return result;
}
//
// Check VWAP State ...
ENUM_X_DIRECTION vwapDir;
result = DetectVWapState(
vwapDir,
conditions //
);
if (!result)
{
//
conditions.Clean();
return result;
}
//
// Check Candlestic State ...
ENUM_X_DIRECTION candlesticDir;
result = DetectCandlestic(
candlesticDir,
conditions //
);
if (!result)
{
//
conditions.Clean();
return result;
}
//
Print("Has Same Peaks or Vales ...");
//
if (!result)
{
//
conditions.Clean();
return result;
}
//
return result;
}
/**
* Detect Where Cycles has Same Peaks ...
*
* @param cycles: ENUM_X_CYCLES members, Array ...
* @param conditions: X121SMCStrategyConditions instance, Reference ...
*
* @return ( bool )
*/
bool DetectSamePeaks(
ENUM_X_CYCLES &cycles[],
X121SMCStrategyConditions &conditions //
)
{
//
bool result = false;
//
int count = ArraySize(cycles);
result = IsValidSize(count);
if (!result)
{
return result;
}
//
double value = -1;
for (int i = 0; i < count; i++)
{
//
ENUM_X_CYCLES iCycle = cycles[i];
//
// Check Supply or Demand Zone ...
hasSupply = iZone.HasSupplyZone(supplyZone);
hasDemand = iZone.HasDemandZone(demandZone);
double iValue = -1;
switch (iCycle)
{
//
case X_CYCLE_TRIGGER:
iValue = conditions.triggerConditions.x121Conditions.peaksBuffer[0];
break;
//
result = hasSupply ||
hasDemand;
if (!result)
{
continue;
}
case X_CYCLE_DECISION:
iValue = conditions.decisionConditions.x121Conditions.peaksBuffer[0];
break;
//
// Check Bid inside Zone ...
if (hasSupply)
{
//
result = bid < supplyZone.Upper() &&
bid > supplyZone.Lower();
}
else
{
//
result = bid < demandZone.Upper() &&
bid > demandZone.Lower();
}
case X_CYCLE_ANALYSE:
iValue = conditions.analyseConditions.x121Conditions.peaksBuffer[0];
break;
//
if (result)
{
case X_CYCLE_VERIFICATION:
iValue = conditions.verificationConditions.x121Conditions.peaksBuffer[0];
break;
//
case X_CYCLE_CONSOLIDATION:
iValue = conditions.consolidationConditions.x121Conditions.peaksBuffer[0];
break;
//
case X_CYCLE_VISION:
iValue = conditions.visionConditions.x121Conditions.peaksBuffer[0];
break;
}
}
if (!result)
{
//
conditions.Clean();
return result;
}
//
if (hasSupply)
{
//
supplyZone.To(cTime);
XCSupplyZoneObject *iSupplyZoneObj;
result = mPOIDrawer.CreateSupplyZone(
supplyZone,
iSupplyZoneObj //
);
if (!result)
if (iValue > 0)
{
//
conditions.Clean();
return result;
if (value <= 0)
{
value = iValue;
}
//
result = value == iValue;
if (!result)
{
break;
}
}
}
//
if (hasDemand)
return result;
}
/**
* Detect Where Cycles has Same Vales ...
*
* @param cycles: ENUM_X_CYCLES members, Array ...
* @param conditions: X121SMCStrategyConditions instance, Reference ...
*
* @return ( bool )
*/
bool DetectSameVales(
ENUM_X_CYCLES &cycles[],
X121SMCStrategyConditions &conditions //
)
{
//
bool result = false;
//
int count = ArraySize(cycles);
result = IsValidSize(count);
if (!result)
{
return result;
}
//
double value = -1;
for (int i = 0; i < count; i++)
{
//
demandZone.To(cTime);
XCDemandZoneObject *iDemandZoneObj;
result = mPOIDrawer.CreateDemandZone(
demandZone,
iDemandZoneObj //
);
if (!result)
ENUM_X_CYCLES iCycle = cycles[i];
//
double iValue = -1;
switch (iCycle)
{
//
case X_CYCLE_TRIGGER:
iValue = conditions.triggerConditions.x121Conditions.valesBuffer[0];
break;
//
case X_CYCLE_DECISION:
iValue = conditions.decisionConditions.x121Conditions.valesBuffer[0];
break;
//
case X_CYCLE_ANALYSE:
iValue = conditions.analyseConditions.x121Conditions.valesBuffer[0];
break;
//
case X_CYCLE_VERIFICATION:
iValue = conditions.verificationConditions.x121Conditions.valesBuffer[0];
break;
//
case X_CYCLE_CONSOLIDATION:
iValue = conditions.consolidationConditions.x121Conditions.valesBuffer[0];
break;
//
case X_CYCLE_VISION:
iValue = conditions.visionConditions.x121Conditions.valesBuffer[0];
break;
}
//
if (iValue > 0)
{
//
conditions.Clean();
return result;
if (value <= 0)
{
value = iValue;
}
//
result = value == iValue;
if (!result)
{
break;
}
}
}
//
Print("BID Inside Zone ...");
return result;
}
/**
* Detect Sar State for Signalling ...
*
* @param dir: ENUM_X_DIRECTION member Reference ...
* @param conditions: X121SMCStrategyConditions instance, Reference ...
*
* @return ( bool )
*/
bool DetectSarState(
ENUM_X_DIRECTION &dir,
X121SMCStrategyConditions &conditions //
)
{
//
bool result = false;
//
dir = X_DIRECTION_NONE;
//
bool isBullish =
//
// Check One of Verification or Consolidation Cycles Must be Sar Bullish ...
(conditions.verificationConditions.x121Conditions.isSarBullish ||
conditions.consolidationConditions.x121Conditions.isSarBullish)
//
&&
//
// Decision and Analyse Cycles Must be Bullish ...
(conditions.decisionConditions.x121Conditions.isSarBullish &&
conditions.analyseConditions.x121Conditions.isSarBullish)
//
&&
//
// Trigger State Must be Bearish ...
conditions.triggerConditions.x121Conditions.isSarBearish
//
;
//
bool isBearish =
//
// Check One of Verification or Consolidation Cycles Must be Sar Bearish ...
(conditions.verificationConditions.x121Conditions.isSarBearish ||
conditions.consolidationConditions.x121Conditions.isSarBearish)
//
&&
//
// Decision and Analyse Cycles Must be Bearish ...
(conditions.decisionConditions.x121Conditions.isSarBearish &&
conditions.analyseConditions.x121Conditions.isSarBearish)
//
&&
//
// Trigger State Must be Bullish ...
conditions.triggerConditions.x121Conditions.isSarBullish
//
;
//
result = isBullish ||
isBearish;
if (!result)
{
//
conditions.Clean();
return result;
}
//
dir =
isBullish
? X_DIRECTION_BULLISH
: X_DIRECTION_BEARISH;
//
return result;
}
/**
* Detect Sar State for Signalling ...
*
* @param dir: ENUM_X_DIRECTION member Reference ...
* @param conditions: X121SMCStrategyConditions instance, Reference ...
*
* @return ( bool )
*/
bool DetectVWapState(
ENUM_X_DIRECTION &dir,
X121SMCStrategyConditions &conditions //
)
{
//
bool result = false;
//
dir = X_DIRECTION_NONE;
//
bool isBullish =
//
// Trigger, Decision and Analyse Cycles Must be in Direction Order and State ...
//
// Orders ...
(conditions.triggerConditions.x121Conditions.isVWapBullishOrdered &&
conditions.decisionConditions.x121Conditions.isVWapBullishOrdered &&
conditions.analyseConditions.x121Conditions.isVWapBullishOrdered)
//
&&
//
// State ...
(conditions.triggerConditions.x121Conditions.isVWapBullishState &&
conditions.decisionConditions.x121Conditions.isVWapBullishState &&
conditions.analyseConditions.x121Conditions.isVWapBullishState)
//
&&
//
// One of Verification and Consolidation must Be in Direction State ...
(conditions.verificationConditions.x121Conditions.isVWapBullishState ||
conditions.consolidationConditions.x121Conditions.isVWapBullishState)
//
;
//
bool isBearish =
//
// Trigger, Decision and Analyse Cycles Must be in Direction Order and State ...
//
// Orders ...
(conditions.triggerConditions.x121Conditions.isVWapBearishOrdered &&
conditions.decisionConditions.x121Conditions.isVWapBearishOrdered &&
conditions.analyseConditions.x121Conditions.isVWapBearishOrdered)
//
&&
//
// State ...
(conditions.triggerConditions.x121Conditions.isVWapBearishState &&
conditions.decisionConditions.x121Conditions.isVWapBearishState &&
conditions.analyseConditions.x121Conditions.isVWapBearishState)
//
&&
//
// One of Verification and Consolidation must Be in Direction State ...
(conditions.verificationConditions.x121Conditions.isVWapBearishState ||
conditions.consolidationConditions.x121Conditions.isVWapBearishState)
//
;
//
result = isBullish ||
isBearish;
if (!result)
{
return result;
}
//
dir =
isBullish
? X_DIRECTION_BULLISH
: X_DIRECTION_BEARISH;
//
return result;
}
bool DetectCandlestic(
ENUM_X_DIRECTION &dir,
X121SMCStrategyConditions &conditions //
)
{
//
bool result = false;
//
dir = X_DIRECTION_NONE;
//
string symbol = GetSymbol();
ENUM_TIMEFRAMES period = GetPeriod();
//
int cIndex = 1;
int pIndex = cIndex + 1;
//
XOHCL cBar;
result = cBar.Init(
symbol,
period,
cIndex //
);
if (!result)
{
return result;
}
//
XOHCL pBar;
result = pBar.Init(
symbol,
period,
pIndex //
);
if (!result)
{
return result;
}
//
ENUM_X_DIRECTION cBarMomentumDir;
bool isCBarMomentum = mTriggerCycleHelper.mBarAnalyser.
IsMomentumBar(
cBar,
cBarMomentumDir //
);
//
ENUM_X_DIRECTION cBarRejectionDir;
bool isCBarRejection = mTriggerCycleHelper.mBarAnalyser.
IsRejectionBar(
cBar,
cBarRejectionDir //
);
//
bool isBullish =
//
// pBar is Rejection and cBar is Momentum ...
// pBar is Momentum and cBar is Rejection ...
// cBar is Momentum and Rejection ...
//
//
;
//
bool isBearish =
//
// pBar is Rejection and cBar is Momentum ...
// pBar is Momentum and cBar is Rejection ...
// cBar is Momentum and Rejection ...
//
//
;
//
result = isBullish ||
isBearish;
if (!result)
{
return result;
}
//
dir =
isBullish
? X_DIRECTION_BULLISH
: X_DIRECTION_BEARISH;
//
return result;
}