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
+298
View File
@@ -2681,3 +2681,301 @@
//////////////////////////////////////////////////////////////////////
//
int consolidationsCount = mTriggerCycleHelper.CountConsolidationZones();
result = IsValidSize(consolidationsCount);
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--)
{
//
XConsolidationZone iZone = consolidations[i];
//
// Check Supply or Demand Zone ...
hasSupply = iZone.HasSupplyZone(supplyZone);
hasDemand = iZone.HasDemandZone(demandZone);
//
result = hasSupply ||
hasDemand;
if (!result)
{
continue;
}
//
// Check Bid inside Zone ...
if (hasSupply)
{
//
result = bid < supplyZone.Upper() &&
bid > supplyZone.Lower();
}
else
{
//
result = bid < demandZone.Upper() &&
bid > demandZone.Lower();
}
//
if (result)
{
break;
}
}
if (!result)
{
//
conditions.Clean();
return result;
}
//
if (hasSupply)
{
//
supplyZone.To(cTime);
XCSupplyZoneObject *iSupplyZoneObj;
result = mPOIDrawer.CreateSupplyZone(
supplyZone,
iSupplyZoneObj //
);
if (!result)
{
//
conditions.Clean();
return result;
}
}
//
if (hasDemand)
{
//
demandZone.To(cTime);
XCDemandZoneObject *iDemandZoneObj;
result = mPOIDrawer.CreateDemandZone(
demandZone,
iDemandZoneObj //
);
if (!result)
{
//
conditions.Clean();
return result;
}
}
//
Print("BID Inside Zone ...");
//////////////////////////////////////////////////////////////////////////
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;
}
//
// Momentum Bars ...
XCMomentumBar *cBullishMomentum = NULL;
XCMomentumBar *cBearishMomentum = NULL;
XCMomentumBar *pBullishMomentum = NULL;
XCMomentumBar *pBearishMomentum = NULL;
int bullishMomentumBarsCount = conditions.triggerConditions.state
.CountBullishMomentumBars();
int bearishMomentumBarsCount = conditions.triggerConditions.state
.CountBearishMomentumBars();
if (IsValidSize(bullishMomentumBarsCount))
{
//
cBullishMomentum = conditions.triggerConditions.state.bullishMomentumBars[bullishMomentumBarsCount - 1];
pBullishMomentum = conditions.triggerConditions.state.bullishMomentumBars[bullishMomentumBarsCount - 2];
}
if (IsValidSize(bearishMomentumBarsCount))
{
//
cBearishMomentum = conditions.triggerConditions.state.bearishMomentumBars[bearishMomentumBarsCount - 1];
pBearishMomentum = conditions.triggerConditions.state.bearishMomentumBars[bearishMomentumBarsCount - 2];
}
//
// Rejection Bars ...
XCRejectionBar *cBullishRejection = NULL;
XCRejectionBar *cBearishRejection = NULL;
XCRejectionBar *pBullishRejection = NULL;
XCRejectionBar *pBearishRejection = NULL;
int bullishRejectionBarsCount = conditions.triggerConditions.state
.CountBullishRejectionBars();
int bearishRejectionBarsCount = conditions.triggerConditions.state
.CountBearishRejectionBars();
if (IsValidSize(bullishRejectionBarsCount))
{
//
cBullishRejection = conditions.triggerConditions.state.bullishRejectionBars[bullishRejectionBarsCount - 1];
pBullishRejection = conditions.triggerConditions.state.bullishRejectionBars[bullishRejectionBarsCount - 2];
}
if (IsValidSize(bearishRejectionBarsCount))
{
//
cBearishRejection = conditions.triggerConditions.state.bearishRejectionBars[bearishRejectionBarsCount - 1];
pBearishRejection = conditions.triggerConditions.state.bearishRejectionBars[bearishRejectionBarsCount - 2];
}
//
bool isBullish =
//
// pBar is Rejection and cBar is Momentum ...
// pBar is Momentum and cBar is Rejection ...
// cBar is Momentum and Rejection ...
//
pBullishMomentum != NULL &&
pBullishMomentum.IsValid() &&
//
cBullishMomentum != NULL &&
cBullishMomentum.IsValid() &&
//
//
pBullishRejection != NULL &&
pBullishRejection.IsValid() &&
//
cBullishRejection != NULL &&
cBullishRejection.IsValid() &&
//
(
//
(pBar.time == pBullishRejection.BarTime() &&
cBar.time == cBullishMomentum.BarTime())
//
||
//
(pBar.time == pBullishMomentum.BarTime() &&
cBar.time == cBullishRejection.BarTime())
//
||
//
(cBar.time == cBullishMomentum.BarTime() &&
cBar.time == cBullishRejection.BarTime())
//
)
//
;
//
bool isBearish =
//
// pBar is Rejection and cBar is Momentum ...
// pBar is Momentum and cBar is Rejection ...
// cBar is Momentum and Rejection ...
//
pBearishMomentum != NULL &&
pBearishMomentum.IsValid() &&
//
cBearishMomentum != NULL &&
cBearishMomentum.IsValid() &&
//
//
pBearishRejection != NULL &&
pBearishRejection.IsValid() &&
//
cBearishRejection != NULL &&
cBearishRejection.IsValid() &&
//
(
//
(pBar.time == pBearishRejection.BarTime() &&
cBar.time == cBearishMomentum.BarTime())
//
||
//
(pBar.time == pBearishMomentum.BarTime() &&
cBar.time == cBearishRejection.BarTime())
//
||
//
(cBar.time == cBearishMomentum.BarTime() &&
cBar.time == cBearishRejection.BarTime())
//
)
//
;
//
result = isBullish ||
isBearish;
if (!result)
{
return result;
}
//
dir =
isBullish
? X_DIRECTION_BULLISH
: X_DIRECTION_BEARISH;
//
return result;
}
/////////////////////////////////////////////////////////////////////////////////////
+25 -10
View File
@@ -683,14 +683,16 @@ class XCBarZone : public XCZone
return result;
}
ENUM_TIMEFRAMES GetPeriod() {
ENUM_TIMEFRAMES GetPeriod()
{
//
ENUM_TIMEFRAMES result = NULL;
//
XOHCL bar;
bool isFilled = FillBar(bar);
if (!isFilled) {
if (!isFilled)
{
return result;
}
@@ -741,6 +743,16 @@ class XCBarZone : public XCZone
mTo = value;
}
/**
* Retrieve Bar Time ...
*
* @return ( datetime )
*/
datetime BarTime()
{
return mBar.time;
}
//
// Overrides ...
@@ -1021,20 +1033,22 @@ class XCTwoBarZone : public XCZone
return result;
}
ENUM_TIMEFRAMES GetPeriod() {
ENUM_TIMEFRAMES GetPeriod()
{
//
ENUM_TIMEFRAMES result = NULL;
//
XOHCL bar;
bool isFilled = FillStartBar(bar);
if (!isFilled) {
if (!isFilled)
{
return result;
}
//
result = bar.period;
//
return result;
}
@@ -1238,21 +1252,23 @@ class XCSwing : public XCBasePOI
//
return result;
}
ENUM_TIMEFRAMES GetPeriod() {
ENUM_TIMEFRAMES GetPeriod()
{
//
ENUM_TIMEFRAMES result = NULL;
//
XOHCL bar;
bool isFilled = FillBar(bar);
if (!isFilled) {
if (!isFilled)
{
return result;
}
//
result = bar.period;
//
return result;
}
@@ -3667,7 +3683,6 @@ struct XPOIState
//
};
//
// Consolidation Zone ...
struct XConsolidationZone
@@ -31,6 +31,26 @@
//
// Implementations ...
enum ENUM_X_CYCLES
{
X_CYCLE_TRIGGER,
X_CYCLE_DECISION,
X_CYCLE_ANALYSE,
X_CYCLE_VERIFICATION,
X_CYCLE_CONSOLIDATION,
X_CYCLE_VISION,
};
enum ENUM_X_CYCLE_EVENTS
{
SAR_CHANGE_DETECTED,
NEW_PEAK_DETECTED,
NEW_VALE_DETECTED,
VWAP_ORDER_CHANGE_ETECTED,
VWAP_STATE_CHANGE_DETCTED,
CONSOLIDATION_BREAKED_DETECTED
};
class XC121SMCCycleHelper : public XCBase
{
//
@@ -46,6 +66,10 @@ class XC121SMCCycleHelper : public XCBase
// POI Detector ...
XCPOIDetector *mPOIDetector;
//
// Bar Analyser
XCBarAnalyser *mBarAnalyser;
//
// Constructor(s) ...
XC121SMCCycleHelper()
@@ -333,6 +357,7 @@ class XC121SMCCycleHelper : public XCBase
/**
* Retrieve Cycle Conditions ...
*
* @param events: ENUM_X_CYCLE_EVENTS member, Array ...
* @param conditions: X121SMCCycleConditions instance ...
* @param barIndex: Integer ...
* @param loopback: Integer ...
@@ -340,6 +365,7 @@ class XC121SMCCycleHelper : public XCBase
* @return ( bool )
*/
bool GetConditions(
ENUM_X_CYCLE_EVENTS &events[],
X121SMCCycleConditions &conditions,
int barIndex = 0,
int loopback = 7 //
@@ -390,6 +416,7 @@ class XC121SMCCycleHelper : public XCBase
//
Calculate(
barIndex,
events,
conditions //
);
}
@@ -928,13 +955,18 @@ class XC121SMCCycleHelper : public XCBase
* Calculate Requirements ...
*
* @param barIndex: Integer, Bar Index ...
* @param events: ENUM_X_CYCLE_EVENTS member, Array ...
* @param conditions: X121SMCCycleConditions instance ...
*/
void Calculate(
int barIndex,
ENUM_X_CYCLE_EVENTS &events[],
X121SMCCycleConditions &conditions //
)
{
//
Clean(events);
//
string symbol = GetSymbol();
ENUM_TIMEFRAMES period = GetPeriod();
@@ -986,7 +1018,14 @@ class XC121SMCCycleHelper : public XCBase
);
if (isInited)
{
//
isInited = AddSarChange(sarChanged);
//
Add(
SAR_CHANGE_DETECTED,
events //
);
}
}
@@ -1023,7 +1062,14 @@ class XC121SMCCycleHelper : public XCBase
);
if (isInited)
{
//
isInited = AddPeaksChange(peaksChanged);
//
Add(
NEW_PEAK_DETECTED,
events //
);
}
}
@@ -1060,7 +1106,14 @@ class XC121SMCCycleHelper : public XCBase
);
if (isInited)
{
//
isInited = AddValesChange(valesChanged);
//
Add(
NEW_VALE_DETECTED,
events //
);
}
}
@@ -1150,7 +1203,14 @@ class XC121SMCCycleHelper : public XCBase
);
if (isInited)
{
//
isInited = AddVWapOrderChange(vwapOrderChanged);
//
Add(
VWAP_ORDER_CHANGE_ETECTED,
events //
);
}
}
@@ -1238,7 +1298,14 @@ class XC121SMCCycleHelper : public XCBase
);
if (isInited)
{
//
isInited = AddVWapStateChange(vwapStateChanged);
//
Add(
VWAP_STATE_CHANGE_DETCTED,
events //
);
}
}
@@ -1311,7 +1378,10 @@ class XC121SMCCycleHelper : public XCBase
mActioveConsolidationZone.Clean();
//
Print("Breake ...");
Add(
CONSOLIDATION_BREAKED_DETECTED,
events //
);
}
}
}
@@ -1320,7 +1390,6 @@ class XC121SMCCycleHelper : public XCBase
private:
//
// Props ...
XCBarAnalyser *mBarAnalyser;
//
// Change Holders ...
@@ -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;
}