last ...
This commit is contained in:
@@ -0,0 +1,230 @@
|
|||||||
|
//
|
||||||
|
// Draw ...
|
||||||
|
//
|
||||||
|
|
||||||
|
//
|
||||||
|
XCBaseObject *drawnObjects[];
|
||||||
|
|
||||||
|
//
|
||||||
|
if (hasBullishOBs)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
for (int i = 0; i < bullishOBsCount; i++)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
XCOrderBlock *iOb = conditions.bullishOBs[i];
|
||||||
|
|
||||||
|
//
|
||||||
|
XCBullishOrderBlockObject *iObObj;
|
||||||
|
bool isCreated = visionCycleHelper
|
||||||
|
.mPOIDrawer
|
||||||
|
.CreateBullishOrderBlock(
|
||||||
|
iOb,
|
||||||
|
iObObj //
|
||||||
|
);
|
||||||
|
if (isCreated)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
Add(
|
||||||
|
(XCBaseObject *)iObObj,
|
||||||
|
drawnObjects //
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
if (hasBearishOBs)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
for (int i = 0; i < bearishOBsCount; i++)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
XCOrderBlock *iOb = conditions.bearishOBs[i];
|
||||||
|
|
||||||
|
//
|
||||||
|
XCBearishOrderBlockObject *iObObj;
|
||||||
|
bool isCreated = visionCycleHelper
|
||||||
|
.mPOIDrawer
|
||||||
|
.CreateBearishOrderBlock(
|
||||||
|
iOb,
|
||||||
|
iObObj //
|
||||||
|
);
|
||||||
|
if (isCreated)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
Add(
|
||||||
|
(XCBaseObject *)iObObj,
|
||||||
|
drawnObjects //
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
if (hasBullishFVGs)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
for (int i = 0; i < bullishFVGsCount; i++)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
XCFVG *iFVG = conditions.bullishFVGs[i];
|
||||||
|
|
||||||
|
//
|
||||||
|
XCBullishFairValueGapObject *iFVGObj;
|
||||||
|
bool isCreated = visionCycleHelper
|
||||||
|
.mPOIDrawer
|
||||||
|
.CreateBullishFairValueGap(
|
||||||
|
iFVG,
|
||||||
|
iFVGObj //
|
||||||
|
);
|
||||||
|
if (isCreated)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
Add(
|
||||||
|
(XCBaseObject *)iFVGObj,
|
||||||
|
drawnObjects //
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
if (hasBearishFVGs)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
for (int i = 0; i < bearishFVGsCount; i++)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
XCFVG *iFVG = conditions.bearishFVGs[i];
|
||||||
|
|
||||||
|
//
|
||||||
|
XCBearishFairValueGapObject *iFVGObj;
|
||||||
|
bool isCreated = visionCycleHelper
|
||||||
|
.mPOIDrawer
|
||||||
|
.CreateBearishFairValueGap(
|
||||||
|
iFVG,
|
||||||
|
iFVGObj //
|
||||||
|
);
|
||||||
|
if (isCreated)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
Add(
|
||||||
|
(XCBaseObject *)iFVGObj,
|
||||||
|
drawnObjects //
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
if (hasSupportZones)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
for (int i = 0; i < supportZonesCount; i++)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
XCSupportZoneObject *iObj;
|
||||||
|
bool isCreated = visionCycleHelper
|
||||||
|
.mPOIDrawer
|
||||||
|
.CreateSupportZone(
|
||||||
|
conditions.supportZones[i],
|
||||||
|
iObj //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
if (isCreated)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
Add(
|
||||||
|
(XCBaseObject *)iObj,
|
||||||
|
drawnObjects //
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
if (hasResistanceZones)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
for (int i = 0; i < resistanceZonesCount; i++)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
XCResistanceZoneObject *iObj;
|
||||||
|
bool isCreated = visionCycleHelper
|
||||||
|
.mPOIDrawer
|
||||||
|
.CreateResistanceZone(
|
||||||
|
conditions.resistanceZones[i],
|
||||||
|
iObj //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
if (isCreated)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
Add(
|
||||||
|
(XCBaseObject *)iObj,
|
||||||
|
drawnObjects //
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
if (hasDemandZones)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
for (int i = 0; i < demandZonesCount; i++)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
XCDemandZoneObject *iObj;
|
||||||
|
bool isCreated = visionCycleHelper
|
||||||
|
.mPOIDrawer
|
||||||
|
.CreateDemandZone(
|
||||||
|
conditions.demandZones[i],
|
||||||
|
iObj //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
if (isCreated)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
Add(
|
||||||
|
(XCBaseObject *)iObj,
|
||||||
|
drawnObjects //
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
if (hasSupplyZones)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
for (int i = 0; i < supplyZonesCount; i++)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
XCSupplyZoneObject *iObj;
|
||||||
|
bool isCreated = visionCycleHelper
|
||||||
|
.mPOIDrawer
|
||||||
|
.CreateSupplyZone(
|
||||||
|
conditions.supplyZones[i],
|
||||||
|
iObj //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
if (isCreated)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
Add(
|
||||||
|
(XCBaseObject *)iObj,
|
||||||
|
drawnObjects //
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
@@ -386,11 +386,11 @@ struct X121Conditions
|
|||||||
bool isRejectedDownRawHK;
|
bool isRejectedDownRawHK;
|
||||||
bool isRawHKBreakedUpSMHK;
|
bool isRawHKBreakedUpSMHK;
|
||||||
bool isRawHKClosedOverSMHK;
|
bool isRawHKClosedOverSMHK;
|
||||||
bool isSMHKSwitchedBearish;
|
|
||||||
bool isRawHKSwitchedBearish;
|
|
||||||
bool isRawHKClosedUnderSMHK;
|
bool isRawHKClosedUnderSMHK;
|
||||||
bool isRawHKBreakedDownSMHK;
|
bool isRawHKBreakedDownSMHK;
|
||||||
bool isSMHKSwitchedToBullish;
|
bool isSMHKSwitchedToBullish;
|
||||||
|
bool isSMHKSwitchedToBearish;
|
||||||
|
bool isRawHKSwitchedToBearish;
|
||||||
bool isRawHKSwitchedToBullish;
|
bool isRawHKSwitchedToBullish;
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -945,8 +945,8 @@ struct X121Conditions
|
|||||||
isRejectedDownRawHK = false;
|
isRejectedDownRawHK = false;
|
||||||
isRawHKBreakedUpSMHK = false;
|
isRawHKBreakedUpSMHK = false;
|
||||||
isRawHKClosedOverSMHK = false;
|
isRawHKClosedOverSMHK = false;
|
||||||
isSMHKSwitchedBearish = false;
|
isSMHKSwitchedToBearish = false;
|
||||||
isRawHKSwitchedBearish = false;
|
isRawHKSwitchedToBearish = false;
|
||||||
isRawHKClosedUnderSMHK = false;
|
isRawHKClosedUnderSMHK = false;
|
||||||
isRawHKBreakedDownSMHK = false;
|
isRawHKBreakedDownSMHK = false;
|
||||||
isSMHKSwitchedToBullish = false;
|
isSMHKSwitchedToBullish = false;
|
||||||
@@ -1321,8 +1321,8 @@ struct X121Conditions
|
|||||||
ToString("isRejectedDownRawHK", isRejectedDownRawHK, ignoreFalseConditions, separator) +
|
ToString("isRejectedDownRawHK", isRejectedDownRawHK, ignoreFalseConditions, separator) +
|
||||||
ToString("isRawHKBreakedUpSMHK", isRawHKBreakedUpSMHK, ignoreFalseConditions, separator) +
|
ToString("isRawHKBreakedUpSMHK", isRawHKBreakedUpSMHK, ignoreFalseConditions, separator) +
|
||||||
ToString("isRawHKClosedOverSMHK", isRawHKClosedOverSMHK, ignoreFalseConditions, separator) +
|
ToString("isRawHKClosedOverSMHK", isRawHKClosedOverSMHK, ignoreFalseConditions, separator) +
|
||||||
ToString("isSMHKSwitchedBearish", isSMHKSwitchedBearish, ignoreFalseConditions, separator) +
|
ToString("isSMHKSwitchedToBearish", isSMHKSwitchedToBearish, ignoreFalseConditions, separator) +
|
||||||
ToString("isRawHKSwitchedBearish", isRawHKSwitchedBearish, ignoreFalseConditions, separator) +
|
ToString("isRawHKSwitchedToBearish", isRawHKSwitchedToBearish, ignoreFalseConditions, separator) +
|
||||||
ToString("isRawHKClosedUnderSMHK", isRawHKClosedUnderSMHK, ignoreFalseConditions, separator) +
|
ToString("isRawHKClosedUnderSMHK", isRawHKClosedUnderSMHK, ignoreFalseConditions, separator) +
|
||||||
ToString("isRawHKBreakedDownSMHK", isRawHKBreakedDownSMHK, ignoreFalseConditions, separator) +
|
ToString("isRawHKBreakedDownSMHK", isRawHKBreakedDownSMHK, ignoreFalseConditions, separator) +
|
||||||
ToString("isSMHKSwitchedToBullish", isSMHKSwitchedToBullish, ignoreFalseConditions, separator) +
|
ToString("isSMHKSwitchedToBullish", isSMHKSwitchedToBullish, ignoreFalseConditions, separator) +
|
||||||
@@ -2206,8 +2206,8 @@ class XCX121Helper : public XCBase
|
|||||||
conditions.isRejectedDownRawHK = xhkConditions.isRejectedDownRawHK;
|
conditions.isRejectedDownRawHK = xhkConditions.isRejectedDownRawHK;
|
||||||
conditions.isRawHKBreakedUpSMHK = xhkConditions.isRawHKBreakedUpSMHK;
|
conditions.isRawHKBreakedUpSMHK = xhkConditions.isRawHKBreakedUpSMHK;
|
||||||
conditions.isRawHKClosedOverSMHK = xhkConditions.isRawHKClosedOverSMHK;
|
conditions.isRawHKClosedOverSMHK = xhkConditions.isRawHKClosedOverSMHK;
|
||||||
conditions.isSMHKSwitchedBearish = xhkConditions.isSMHKSwitchedBearish;
|
conditions.isSMHKSwitchedToBearish = xhkConditions.isSMHKSwitchedToBearish;
|
||||||
conditions.isRawHKSwitchedBearish = xhkConditions.isRawHKSwitchedBearish;
|
conditions.isRawHKSwitchedToBearish = xhkConditions.isRawHKSwitchedToBearish;
|
||||||
conditions.isRawHKClosedUnderSMHK = xhkConditions.isRawHKClosedUnderSMHK;
|
conditions.isRawHKClosedUnderSMHK = xhkConditions.isRawHKClosedUnderSMHK;
|
||||||
conditions.isRawHKBreakedDownSMHK = xhkConditions.isRawHKBreakedDownSMHK;
|
conditions.isRawHKBreakedDownSMHK = xhkConditions.isRawHKBreakedDownSMHK;
|
||||||
conditions.isSMHKSwitchedToBullish = xhkConditions.isSMHKSwitchedToBullish;
|
conditions.isSMHKSwitchedToBullish = xhkConditions.isSMHKSwitchedToBullish;
|
||||||
|
|||||||
@@ -163,8 +163,8 @@ struct X121XHKConditions
|
|||||||
//
|
//
|
||||||
bool isSMHKBearish;
|
bool isSMHKBearish;
|
||||||
bool isRawHKBearish;
|
bool isRawHKBearish;
|
||||||
bool isSMHKSwitchedBearish;
|
bool isSMHKSwitchedToBearish;
|
||||||
bool isRawHKSwitchedBearish;
|
bool isRawHKSwitchedToBearish;
|
||||||
|
|
||||||
//
|
//
|
||||||
bool isClosedOverSMHK;
|
bool isClosedOverSMHK;
|
||||||
@@ -246,8 +246,8 @@ struct X121XHKConditions
|
|||||||
//
|
//
|
||||||
isSMHKBearish = false;
|
isSMHKBearish = false;
|
||||||
isRawHKBearish = false;
|
isRawHKBearish = false;
|
||||||
isSMHKSwitchedBearish = false;
|
isSMHKSwitchedToBearish = false;
|
||||||
isRawHKSwitchedBearish = false;
|
isRawHKSwitchedToBearish = false;
|
||||||
|
|
||||||
//
|
//
|
||||||
isClosedOverSMHK = false;
|
isClosedOverSMHK = false;
|
||||||
@@ -350,8 +350,8 @@ struct X121XHKConditions
|
|||||||
ToString("isRawHKSwitchedToBullish", isRawHKSwitchedToBullish, ignoreFalseConditions, separator) +
|
ToString("isRawHKSwitchedToBullish", isRawHKSwitchedToBullish, ignoreFalseConditions, separator) +
|
||||||
ToString("isSMHKBearish", isSMHKBearish, ignoreFalseConditions, separator) +
|
ToString("isSMHKBearish", isSMHKBearish, ignoreFalseConditions, separator) +
|
||||||
ToString("isRawHKBearish", isRawHKBearish, ignoreFalseConditions, separator) +
|
ToString("isRawHKBearish", isRawHKBearish, ignoreFalseConditions, separator) +
|
||||||
ToString("isSMHKSwitchedBearish", isSMHKSwitchedBearish, ignoreFalseConditions, separator) +
|
ToString("isSMHKSwitchedToBearish", isSMHKSwitchedToBearish, ignoreFalseConditions, separator) +
|
||||||
ToString("isRawHKSwitchedBearish", isRawHKSwitchedBearish, ignoreFalseConditions, separator) +
|
ToString("isRawHKSwitchedToBearish", isRawHKSwitchedToBearish, ignoreFalseConditions, separator) +
|
||||||
ToString("isClosedOverSMHK", isClosedOverSMHK, ignoreFalseConditions, separator) +
|
ToString("isClosedOverSMHK", isClosedOverSMHK, ignoreFalseConditions, separator) +
|
||||||
ToString("isClosedUnderSMHK", isClosedUnderSMHK, ignoreFalseConditions, separator) +
|
ToString("isClosedUnderSMHK", isClosedUnderSMHK, ignoreFalseConditions, separator) +
|
||||||
ToString("isClosedOverRawHK", isClosedOverRawHK, ignoreFalseConditions, separator) +
|
ToString("isClosedOverRawHK", isClosedOverRawHK, ignoreFalseConditions, separator) +
|
||||||
@@ -1211,9 +1211,9 @@ class XCX121XHKHelper : public XCBaseHelper
|
|||||||
bool isRawHKBearishPrev = rawHKOpenPrev > rawHKClosePrev;
|
bool isRawHKBearishPrev = rawHKOpenPrev > rawHKClosePrev;
|
||||||
|
|
||||||
//
|
//
|
||||||
bool isSMHKSwitchedBearish = isSMHKBearish &&
|
bool isSMHKSwitchedToBearish = isSMHKBearish &&
|
||||||
!isSMHKBearishPrev;
|
!isSMHKBearishPrev;
|
||||||
bool isRawHKSwitchedBearish = isRawHKBearish &&
|
bool isRawHKSwitchedToBearish = isRawHKBearish &&
|
||||||
!isRawHKBearishPrev;
|
!isRawHKBearishPrev;
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -1297,8 +1297,8 @@ class XCX121XHKHelper : public XCBaseHelper
|
|||||||
conditions.isRawHKSwitchedToBullish = isRawHKSwitchedToBullish;
|
conditions.isRawHKSwitchedToBullish = isRawHKSwitchedToBullish;
|
||||||
conditions.isSMHKBearish = isSMHKBearish;
|
conditions.isSMHKBearish = isSMHKBearish;
|
||||||
conditions.isRawHKBearish = isRawHKBearish;
|
conditions.isRawHKBearish = isRawHKBearish;
|
||||||
conditions.isSMHKSwitchedBearish = isSMHKSwitchedBearish;
|
conditions.isSMHKSwitchedToBearish = isSMHKSwitchedToBearish;
|
||||||
conditions.isRawHKSwitchedBearish = isRawHKSwitchedBearish;
|
conditions.isRawHKSwitchedToBearish = isRawHKSwitchedToBearish;
|
||||||
conditions.isClosedOverSMHK = isClosedOverSMHK;
|
conditions.isClosedOverSMHK = isClosedOverSMHK;
|
||||||
conditions.isClosedUnderSMHK = isClosedUnderSMHK;
|
conditions.isClosedUnderSMHK = isClosedUnderSMHK;
|
||||||
conditions.isClosedOverRawHK = isClosedOverRawHK;
|
conditions.isClosedOverRawHK = isClosedOverRawHK;
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -572,7 +572,7 @@ class XC121SMCCycleHelper : public XCBase
|
|||||||
/**
|
/**
|
||||||
* Detect Order Blocks ...
|
* Detect Order Blocks ...
|
||||||
*
|
*
|
||||||
* @return ( int )
|
* @return ( bool )
|
||||||
*/
|
*/
|
||||||
bool DetectOrderBlocks(
|
bool DetectOrderBlocks(
|
||||||
XCOrderBlock *&bullishOrderBlocks[],
|
XCOrderBlock *&bullishOrderBlocks[],
|
||||||
@@ -597,14 +597,14 @@ class XC121SMCCycleHelper : public XCBase
|
|||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
int bullOBsCount = DetectDirectionOrderBlocks(
|
int bullOBsCount = DetectValidOrderBlocks(
|
||||||
X_DIRECTION_BULLISH,
|
X_DIRECTION_BULLISH,
|
||||||
state,
|
state,
|
||||||
bullishOrderBlocks //
|
bullishOrderBlocks //
|
||||||
);
|
);
|
||||||
|
|
||||||
//
|
//
|
||||||
int bearOBsCount = DetectDirectionOrderBlocks(
|
int bearOBsCount = DetectValidOrderBlocks(
|
||||||
X_DIRECTION_BEARISH,
|
X_DIRECTION_BEARISH,
|
||||||
state,
|
state,
|
||||||
bearishOrderBlocks //
|
bearishOrderBlocks //
|
||||||
@@ -618,6 +618,611 @@ class XC121SMCCycleHelper : public XCBase
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Detect Fair Value Gaps ...
|
||||||
|
*
|
||||||
|
* @return ( bool )
|
||||||
|
*/
|
||||||
|
bool DetectFairValueGaps(
|
||||||
|
XCFVG *&bullishFairValueGaps[],
|
||||||
|
XCFVG *&bearishFairValueGaps[] //
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
Clean(bullishFairValueGaps);
|
||||||
|
Clean(bearishFairValueGaps);
|
||||||
|
|
||||||
|
//
|
||||||
|
XPOIState state;
|
||||||
|
mPOIDetector.GetState(state);
|
||||||
|
bool isValid = state.IsValid() &&
|
||||||
|
state.HasChild();
|
||||||
|
if (!isValid)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
int bullFVGsCount = DetectValidFairValueGaps(
|
||||||
|
X_DIRECTION_BULLISH,
|
||||||
|
state,
|
||||||
|
bullishFairValueGaps //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
int bearFVGsCount = DetectValidFairValueGaps(
|
||||||
|
X_DIRECTION_BEARISH,
|
||||||
|
state,
|
||||||
|
bearishFairValueGaps //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
result = IsValidSize(bullFVGsCount +
|
||||||
|
bearFVGsCount);
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Detect Support Zones ...
|
||||||
|
*
|
||||||
|
* @return ( bool )
|
||||||
|
*/
|
||||||
|
bool DetectSupportZones(
|
||||||
|
XCOrderBlock *&bullishOrderBlocks[],
|
||||||
|
XCFVG *&bullishFairValueGaps[],
|
||||||
|
XCSupportZone *&supportZones[] //
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
Clean(supportZones);
|
||||||
|
|
||||||
|
//
|
||||||
|
int obsCount = ArraySize(bullishOrderBlocks);
|
||||||
|
int fvgsCount = ArraySize(bullishFairValueGaps);
|
||||||
|
|
||||||
|
//
|
||||||
|
XPOIState state;
|
||||||
|
mPOIDetector.GetState(state);
|
||||||
|
bool isValid = state.IsValid() &&
|
||||||
|
state.HasChild() &&
|
||||||
|
IsValidSize(obsCount + fvgsCount);
|
||||||
|
if (!isValid)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
int supportZonesCount = DetectValidSupportZones(
|
||||||
|
state,
|
||||||
|
bullishOrderBlocks,
|
||||||
|
bullishFairValueGaps,
|
||||||
|
supportZones //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
result = IsValidSize(supportZonesCount);
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Detect Resistance Zones ...
|
||||||
|
*
|
||||||
|
* @return ( bool )
|
||||||
|
*/
|
||||||
|
bool DetectResistanceZones(
|
||||||
|
XCOrderBlock *&bearishOrderBlocks[],
|
||||||
|
XCFVG *&bearishFairValueGaps[],
|
||||||
|
XCResistanceZone *&resistanceZones[] //
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
Clean(resistanceZones);
|
||||||
|
|
||||||
|
//
|
||||||
|
int obsCount = ArraySize(bearishOrderBlocks);
|
||||||
|
int fvgsCount = ArraySize(bearishFairValueGaps);
|
||||||
|
|
||||||
|
//
|
||||||
|
XPOIState state;
|
||||||
|
mPOIDetector.GetState(state);
|
||||||
|
bool isValid = state.IsValid() &&
|
||||||
|
state.HasChild() &&
|
||||||
|
IsValidSize(obsCount + fvgsCount);
|
||||||
|
if (!isValid)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
int resistanceZonesCount = DetectValidResistanceZones(
|
||||||
|
state,
|
||||||
|
bearishOrderBlocks,
|
||||||
|
bearishFairValueGaps,
|
||||||
|
resistanceZones //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
result = IsValidSize(resistanceZonesCount);
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Detect Demand Zones ...
|
||||||
|
*
|
||||||
|
* @return ( bool )
|
||||||
|
*/
|
||||||
|
bool DetectDemandZones(
|
||||||
|
XCOrderBlock *&bullishOrderBlocks[],
|
||||||
|
XCFVG *&bullishFairValueGaps[],
|
||||||
|
XCDemandZone *&demandZones[] //
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
Clean(demandZones);
|
||||||
|
|
||||||
|
//
|
||||||
|
int obsCount = ArraySize(bullishOrderBlocks);
|
||||||
|
int fvgsCount = ArraySize(bullishFairValueGaps);
|
||||||
|
|
||||||
|
//
|
||||||
|
XPOIState state;
|
||||||
|
mPOIDetector.GetState(state);
|
||||||
|
bool isValid = state.IsValid() &&
|
||||||
|
state.HasChild() &&
|
||||||
|
IsValidSize(obsCount + fvgsCount);
|
||||||
|
if (!isValid)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
int demandZonesCount = DetectValidDemandZones(
|
||||||
|
state,
|
||||||
|
bullishOrderBlocks,
|
||||||
|
bullishFairValueGaps,
|
||||||
|
demandZones //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
result = IsValidSize(demandZonesCount);
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Detect Supply Zones ...
|
||||||
|
*
|
||||||
|
* @return ( bool )
|
||||||
|
*/
|
||||||
|
bool DetectSupplyZones(
|
||||||
|
XCOrderBlock *&bearishOrderBlocks[],
|
||||||
|
XCFVG *&bearishFairValueGaps[],
|
||||||
|
XCSupplyZone *&supplyZones[] //
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
Clean(supplyZones);
|
||||||
|
|
||||||
|
//
|
||||||
|
int obsCount = ArraySize(bearishOrderBlocks);
|
||||||
|
int fvgsCount = ArraySize(bearishFairValueGaps);
|
||||||
|
|
||||||
|
//
|
||||||
|
XPOIState state;
|
||||||
|
mPOIDetector.GetState(state);
|
||||||
|
bool isValid = state.IsValid() &&
|
||||||
|
state.HasChild() &&
|
||||||
|
IsValidSize(obsCount + fvgsCount);
|
||||||
|
if (!isValid)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
int supplyZonesCount = DetectValidSupplyZones(
|
||||||
|
state,
|
||||||
|
bearishOrderBlocks,
|
||||||
|
bearishFairValueGaps,
|
||||||
|
supplyZones //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
result = IsValidSize(supplyZonesCount);
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Cycle State and Update it ...
|
||||||
|
*
|
||||||
|
* @param state: X121SMCCycleState instance Reference ...
|
||||||
|
*
|
||||||
|
* @return ( bool )
|
||||||
|
*/
|
||||||
|
bool GetCycleState(X121SMCCycleState &state)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
string symbol = GetSymbol();
|
||||||
|
ENUM_TIMEFRAMES period = GetPeriod();
|
||||||
|
|
||||||
|
//
|
||||||
|
state.symbol = symbol;
|
||||||
|
state.period = period;
|
||||||
|
|
||||||
|
//
|
||||||
|
datetime cTime = TimeCurrent();
|
||||||
|
|
||||||
|
//
|
||||||
|
// Detect Order Block ...
|
||||||
|
|
||||||
|
//
|
||||||
|
bool hasBullishOBs = state.HasBullishOBs();
|
||||||
|
int bullishOBsCount = state.CountBullishOBs();
|
||||||
|
|
||||||
|
//
|
||||||
|
bool hasBearishOBs = state.HasBearishOBs();
|
||||||
|
int bearishOBsCount = state.CountBearishOBs();
|
||||||
|
|
||||||
|
//
|
||||||
|
bool hasOBs = hasBullishOBs &&
|
||||||
|
hasBearishOBs;
|
||||||
|
if (!hasOBs)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
XCOrderBlock *bullishOBs[];
|
||||||
|
XCOrderBlock *bearishOBs[];
|
||||||
|
hasOBs = DetectOrderBlocks(
|
||||||
|
bullishOBs,
|
||||||
|
bearishOBs //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
if (hasOBs &&
|
||||||
|
!hasBullishOBs)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
Copy(
|
||||||
|
bullishOBs,
|
||||||
|
state.bullishOBs //
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
if (hasOBs &&
|
||||||
|
!hasBearishOBs)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
Copy(
|
||||||
|
bearishOBs,
|
||||||
|
state.bearishOBs //
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
hasBullishOBs = state.HasBullishOBs();
|
||||||
|
bullishOBsCount = state.CountBullishOBs();
|
||||||
|
|
||||||
|
//
|
||||||
|
hasBearishOBs = state.HasBearishOBs();
|
||||||
|
bearishOBsCount = state.CountBearishOBs();
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Update Order Blocks Time ...
|
||||||
|
if (hasOBs)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
if (hasBullishOBs)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
for (int i = 0; i < bullishOBsCount; i++)
|
||||||
|
{
|
||||||
|
state.bullishOBs[i].To(cTime);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
if (hasBearishOBs)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
for (int i = 0; i < bearishOBsCount; i++)
|
||||||
|
{
|
||||||
|
state.bearishOBs[i].To(cTime);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Detect Fair Value Gap ...
|
||||||
|
|
||||||
|
//
|
||||||
|
bool hasBullishFVGs = state.HasBullishFVGs();
|
||||||
|
int bullishFVGsCount = state.CountBullishFVGs();
|
||||||
|
|
||||||
|
//
|
||||||
|
bool hasBearishFVGs = state.HasBearishFVGs();
|
||||||
|
int bearishFVGsCount = state.CountBearishFVGs();
|
||||||
|
|
||||||
|
//
|
||||||
|
bool hasFVGs = hasBullishFVGs &&
|
||||||
|
hasBearishFVGs;
|
||||||
|
if (!hasFVGs)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
XCFVG *bullishFVGs[];
|
||||||
|
XCFVG *bearishFVGs[];
|
||||||
|
hasFVGs = DetectFairValueGaps(
|
||||||
|
bullishFVGs,
|
||||||
|
bearishFVGs //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
if (hasFVGs &&
|
||||||
|
!hasBullishFVGs)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
Copy(
|
||||||
|
bullishFVGs,
|
||||||
|
state.bullishFVGs //
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
if (hasFVGs &&
|
||||||
|
!hasBearishFVGs)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
Copy(
|
||||||
|
bearishFVGs,
|
||||||
|
state.bearishFVGs //
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
hasBullishFVGs = state.HasBullishFVGs();
|
||||||
|
bullishFVGsCount = state.CountBullishFVGs();
|
||||||
|
|
||||||
|
//
|
||||||
|
hasBearishFVGs = state.HasBearishFVGs();
|
||||||
|
bearishFVGsCount = state.CountBearishFVGs();
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Update Fair Value Gaps Time ...
|
||||||
|
if (hasFVGs)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
if (hasBullishFVGs)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
for (int i = 0; i < bullishFVGsCount; i++)
|
||||||
|
{
|
||||||
|
state.bullishFVGs[i].To(cTime);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
if (hasBearishFVGs)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
for (int i = 0; i < bearishFVGsCount; i++)
|
||||||
|
{
|
||||||
|
state.bearishFVGs[i].To(cTime);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Detect Support Zones ...
|
||||||
|
|
||||||
|
//
|
||||||
|
bool hasSupportZones = state.HasSupportZones();
|
||||||
|
int supportZonesCount = state.CountSupportZones();
|
||||||
|
|
||||||
|
//
|
||||||
|
if (!hasSupportZones)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
XCSupportZone *supportZones[];
|
||||||
|
hasSupportZones = DetectSupportZones(
|
||||||
|
state.bullishOBs,
|
||||||
|
state.bullishFVGs,
|
||||||
|
supportZones //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
if (hasSupportZones)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
Copy(
|
||||||
|
supportZones,
|
||||||
|
state.supportZones //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
supportZonesCount = state.CountSupportZones();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Update Support Zones Time ...
|
||||||
|
if (hasSupportZones)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
for (int i = 0; i < supportZonesCount; i++)
|
||||||
|
{
|
||||||
|
state.supportZones[i].To(cTime);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Detect Demand Zones ...
|
||||||
|
|
||||||
|
//
|
||||||
|
bool hasDemandZones = state.HasDemandZones();
|
||||||
|
int demandZonesCount = state.CountDemandZones();
|
||||||
|
|
||||||
|
//
|
||||||
|
if (!hasDemandZones)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
XCDemandZone *demandZones[];
|
||||||
|
hasDemandZones = DetectDemandZones(
|
||||||
|
state.bullishOBs,
|
||||||
|
state.bullishFVGs,
|
||||||
|
demandZones //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
if (hasDemandZones)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
Copy(
|
||||||
|
demandZones,
|
||||||
|
state.demandZones //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
demandZonesCount = state.CountDemandZones();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Update Support Zones Time ...
|
||||||
|
if (hasDemandZones)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
for (int i = 0; i < demandZonesCount; i++)
|
||||||
|
{
|
||||||
|
state.demandZones[i].To(cTime);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Detect Resistance Zones ...
|
||||||
|
|
||||||
|
//
|
||||||
|
bool hasResistanceZones = state.HasResistanceZones();
|
||||||
|
int resistanceZonesCount = state.CountResistanceZones();
|
||||||
|
|
||||||
|
//
|
||||||
|
if (!hasResistanceZones)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
XCResistanceZone *resistanceZones[];
|
||||||
|
hasResistanceZones = DetectResistanceZones(
|
||||||
|
state.bearishOBs,
|
||||||
|
state.bearishFVGs,
|
||||||
|
resistanceZones //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
if (hasResistanceZones)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
for (int i = 0; i < ArraySize(resistanceZones); i++)
|
||||||
|
{
|
||||||
|
resistanceZones[i].To(cTime);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
Copy(
|
||||||
|
resistanceZones,
|
||||||
|
state.resistanceZones //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
resistanceZonesCount = state.CountResistanceZones();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Update Resistance Zones Time ...
|
||||||
|
if (hasResistanceZones)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
for (int i = 0; i < resistanceZonesCount; i++)
|
||||||
|
{
|
||||||
|
state.resistanceZones[i].To(cTime);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Detect Supply Zones ...
|
||||||
|
|
||||||
|
//
|
||||||
|
bool hasSupplyZones = state.HasSupplyZones();
|
||||||
|
int supplyZonesCount = state.CountSupplyZones();
|
||||||
|
|
||||||
|
//
|
||||||
|
if (!hasSupplyZones)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
XCSupplyZone *supplyZones[];
|
||||||
|
hasSupplyZones = DetectSupplyZones(
|
||||||
|
state.bearishOBs,
|
||||||
|
state.bearishFVGs,
|
||||||
|
supplyZones //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
if (hasSupplyZones)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
Copy(
|
||||||
|
supplyZones,
|
||||||
|
state.supplyZones //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
supplyZonesCount = state.CountSupplyZones();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Update Resistance Zones Time ...
|
||||||
|
if (hasSupplyZones)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
for (int i = 0; i < supplyZonesCount; i++)
|
||||||
|
{
|
||||||
|
state.supplyZones[i].To(cTime);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
result = state.IsValid();
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Retrieve Cycle Conditions ...
|
* Retrieve Cycle Conditions ...
|
||||||
*
|
*
|
||||||
@@ -688,6 +1293,288 @@ class XC121SMCCycleHelper : public XCBase
|
|||||||
//
|
//
|
||||||
// Tools ...
|
// Tools ...
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Draw Cycle State ...
|
||||||
|
*
|
||||||
|
* @param state: X121SMCCyleState instance Reference ...
|
||||||
|
*
|
||||||
|
* @return ( int )
|
||||||
|
*/
|
||||||
|
int DrawCycleState(
|
||||||
|
X121SMCCycleState &state,
|
||||||
|
XCBaseObject *&drawnObjects[] //
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
int result = 0;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Order Blocks ...
|
||||||
|
|
||||||
|
//
|
||||||
|
// Bullish ...
|
||||||
|
bool hasBullishOBs = state.HasBullishOBs();
|
||||||
|
int bullishOBsCount = state.CountBullishOBs();
|
||||||
|
if (hasBullishOBs)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
for (int i = 0; i < bullishOBsCount; i++)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
XCOrderBlock *iOb = state.bullishOBs[i];
|
||||||
|
|
||||||
|
//
|
||||||
|
XCBullishOrderBlockObject *iObObj;
|
||||||
|
bool isCreated = mPOIDrawer
|
||||||
|
.CreateBullishOrderBlock(
|
||||||
|
iOb,
|
||||||
|
iObObj //
|
||||||
|
);
|
||||||
|
if (isCreated)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
Add(
|
||||||
|
(XCBaseObject *)iObObj,
|
||||||
|
drawnObjects //
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Bearish ...
|
||||||
|
bool hasBearishOBs = state.HasBearishOBs();
|
||||||
|
int bearishOBsCount = state.CountBearishOBs();
|
||||||
|
if (hasBearishOBs)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
for (int i = 0; i < bearishOBsCount; i++)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
XCOrderBlock *iOb = state.bearishOBs[i];
|
||||||
|
|
||||||
|
//
|
||||||
|
XCBearishOrderBlockObject *iObObj;
|
||||||
|
bool isCreated = mPOIDrawer
|
||||||
|
.CreateBearishOrderBlock(
|
||||||
|
iOb,
|
||||||
|
iObObj //
|
||||||
|
);
|
||||||
|
if (isCreated)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
Add(
|
||||||
|
(XCBaseObject *)iObObj,
|
||||||
|
drawnObjects //
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Fair Value Gaps ...
|
||||||
|
|
||||||
|
//
|
||||||
|
// Bullish ...
|
||||||
|
bool hasBullishFVGs = state.HasBullishFVGs();
|
||||||
|
int bullishFVGsCount = state.CountBullishFVGs();
|
||||||
|
if (hasBullishFVGs)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
for (int i = 0; i < bullishFVGsCount; i++)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
XCFVG *iFVG = state.bullishFVGs[i];
|
||||||
|
|
||||||
|
//
|
||||||
|
XCBullishFairValueGapObject *iFVGObj;
|
||||||
|
bool isCreated = mPOIDrawer
|
||||||
|
.CreateBullishFairValueGap(
|
||||||
|
iFVG,
|
||||||
|
iFVGObj //
|
||||||
|
);
|
||||||
|
if (isCreated)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
iFVGObj.ZoneColor(clrLime);
|
||||||
|
|
||||||
|
//
|
||||||
|
Add(
|
||||||
|
(XCBaseObject *)iFVGObj,
|
||||||
|
drawnObjects //
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Bearish ...
|
||||||
|
bool hasBearishFVGs = state.HasBearishFVGs();
|
||||||
|
int bearishFVGsCount = state.CountBearishFVGs();
|
||||||
|
if (hasBearishFVGs)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
for (int i = 0; i < bearishFVGsCount; i++)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
XCFVG *iFVG = state.bearishFVGs[i];
|
||||||
|
|
||||||
|
//
|
||||||
|
XCBearishFairValueGapObject *iFVGObj;
|
||||||
|
bool isCreated = mPOIDrawer
|
||||||
|
.CreateBearishFairValueGap(
|
||||||
|
iFVG,
|
||||||
|
iFVGObj //
|
||||||
|
);
|
||||||
|
if (isCreated)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
iFVGObj.ZoneColor(clrRed);
|
||||||
|
|
||||||
|
//
|
||||||
|
Add(
|
||||||
|
(XCBaseObject *)iFVGObj,
|
||||||
|
drawnObjects //
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Support Zones ...
|
||||||
|
bool hasSupportZones = state.HasSupportZones();
|
||||||
|
int supportZonesCount = state.CountSupportZones();
|
||||||
|
if (hasSupportZones)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
for (int i = 0; i < supportZonesCount; i++)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
XCSupportZoneObject *iObj;
|
||||||
|
bool isCreated = mPOIDrawer
|
||||||
|
.CreateSupportZone(
|
||||||
|
state.supportZones[i],
|
||||||
|
iObj //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
if (isCreated)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
iObj.ZoneColor(clrDarkSeaGreen);
|
||||||
|
|
||||||
|
//
|
||||||
|
Add(
|
||||||
|
(XCBaseObject *)iObj,
|
||||||
|
drawnObjects //
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Resistance Zones ...
|
||||||
|
bool hasResistanceZones = state.HasResistanceZones();
|
||||||
|
int resistanceZonesCount = state.CountResistanceZones();
|
||||||
|
if (hasResistanceZones)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
for (int i = 0; i < resistanceZonesCount; i++)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
XCResistanceZoneObject *iObj;
|
||||||
|
bool isCreated = mPOIDrawer
|
||||||
|
.CreateResistanceZone(
|
||||||
|
state.resistanceZones[i],
|
||||||
|
iObj //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
if (isCreated)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
iObj.ZoneColor(clrSaddleBrown);
|
||||||
|
|
||||||
|
//
|
||||||
|
Add(
|
||||||
|
(XCBaseObject *)iObj,
|
||||||
|
drawnObjects //
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Demand Zones ...
|
||||||
|
bool hasDemandZones = state.HasDemandZones();
|
||||||
|
int demandZonesCount = state.CountDemandZones();
|
||||||
|
if (hasDemandZones)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
for (int i = 0; i < demandZonesCount; i++)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
XCDemandZoneObject *iObj;
|
||||||
|
bool isCreated = mPOIDrawer
|
||||||
|
.CreateDemandZone(
|
||||||
|
state.demandZones[i],
|
||||||
|
iObj //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
if (isCreated)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
iObj.ZoneColor(clrDarkTurquoise);
|
||||||
|
|
||||||
|
//
|
||||||
|
Add(
|
||||||
|
(XCBaseObject *)iObj,
|
||||||
|
drawnObjects //
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Supply Zones ...
|
||||||
|
bool hasSupplyZones = state.HasSupplyZones();
|
||||||
|
int supplyZonesCount = state.CountSupplyZones();
|
||||||
|
if (hasSupplyZones)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
for (int i = 0; i < supplyZonesCount; i++)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
XCSupplyZoneObject *iObj;
|
||||||
|
bool isCreated = mPOIDrawer
|
||||||
|
.CreateSupplyZone(
|
||||||
|
state.supplyZones[i],
|
||||||
|
iObj //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
if (isCreated)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
iObj.ZoneColor(clrChocolate);
|
||||||
|
|
||||||
|
//
|
||||||
|
Add(
|
||||||
|
(XCBaseObject *)iObj,
|
||||||
|
drawnObjects //
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
result = ArraySize(drawnObjects);
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Virtuals ...
|
// Virtuals ...
|
||||||
|
|
||||||
|
|||||||
@@ -36,6 +36,7 @@ const string X121SMCStrategyToken = "X121SMC";
|
|||||||
|
|
||||||
//
|
//
|
||||||
const string X121SMCXToken = "X121X";
|
const string X121SMCXToken = "X121X";
|
||||||
|
const string X121SMCXHKPVToken = "X121XHKPV";
|
||||||
const string X121SMCXOBPVToken = "X121XOBPV";
|
const string X121SMCXOBPVToken = "X121XOBPV";
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -45,6 +46,7 @@ enum ENUM_X_121_SMC_PROVIDERS
|
|||||||
//
|
//
|
||||||
X_121_SMC_PROVIDER_NONE,
|
X_121_SMC_PROVIDER_NONE,
|
||||||
X_121_SMC_PROVIDER_X,
|
X_121_SMC_PROVIDER_X,
|
||||||
|
X_121_SMC_PROVIDER_XHKPV,
|
||||||
X_121_SMC_PROVIDER_XOBPV,
|
X_121_SMC_PROVIDER_XOBPV,
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -612,6 +614,365 @@ struct X121SMCGuard
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//
|
||||||
|
// Model Cycle State ...
|
||||||
|
struct X121SMCCycleState
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Props ...
|
||||||
|
string symbol;
|
||||||
|
ENUM_TIMEFRAMES period;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Bullish ...
|
||||||
|
XCFVG *bullishFVGs[];
|
||||||
|
XCOrderBlock *bullishOBs[];
|
||||||
|
XCDemandZone *demandZones[];
|
||||||
|
XCSupportZone *supportZones[];
|
||||||
|
|
||||||
|
//
|
||||||
|
// Bearish ...
|
||||||
|
XCFVG *bearishFVGs[];
|
||||||
|
XCOrderBlock *bearishOBs[];
|
||||||
|
XCSupplyZone *supplyZones[];
|
||||||
|
XCResistanceZone *resistanceZones[];
|
||||||
|
|
||||||
|
//
|
||||||
|
// Constructor ...
|
||||||
|
X121SMCCycleState()
|
||||||
|
{
|
||||||
|
Clean();
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Tools ...
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Cleanup Model ...
|
||||||
|
*/
|
||||||
|
void Clean()
|
||||||
|
{
|
||||||
|
//
|
||||||
|
symbol = NULL;
|
||||||
|
period = NULL;
|
||||||
|
|
||||||
|
//
|
||||||
|
Clean(bullishFVGs);
|
||||||
|
Clean(bullishOBs);
|
||||||
|
Clean(demandZones);
|
||||||
|
Clean(supportZones);
|
||||||
|
|
||||||
|
//
|
||||||
|
Clean(bearishFVGs);
|
||||||
|
Clean(bearishOBs);
|
||||||
|
Clean(supplyZones);
|
||||||
|
Clean(resistanceZones);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Validate Model ...
|
||||||
|
*
|
||||||
|
* @return ( bool )
|
||||||
|
*/
|
||||||
|
bool IsValid()
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
result =
|
||||||
|
//
|
||||||
|
IsValid(symbol) &&
|
||||||
|
IsValid(period) &&
|
||||||
|
(
|
||||||
|
//
|
||||||
|
(HasBullishOBs() &&
|
||||||
|
(HasBullishFVGs() ||
|
||||||
|
HasSupportZones() ||
|
||||||
|
HasDemandZones()))
|
||||||
|
//
|
||||||
|
||
|
||||||
|
(HasBearishOBs() &&
|
||||||
|
(HasSupplyZones() ||
|
||||||
|
HasBearishFVGs() ||
|
||||||
|
HasResistanceZones()))
|
||||||
|
//
|
||||||
|
)
|
||||||
|
//
|
||||||
|
;
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
int CountBullishOBs()
|
||||||
|
{
|
||||||
|
return ArraySize(bullishOBs);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
bool HasBullishOBs()
|
||||||
|
{
|
||||||
|
return IsValidSize(CountBullishOBs());
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
int CountBearishOBs()
|
||||||
|
{
|
||||||
|
return ArraySize(bearishOBs);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
bool HasBearishOBs()
|
||||||
|
{
|
||||||
|
return IsValidSize(CountBearishOBs());
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
int CountSupportZones()
|
||||||
|
{
|
||||||
|
return ArraySize(supportZones);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
bool HasSupportZones()
|
||||||
|
{
|
||||||
|
return IsValidSize(CountSupportZones());
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
int CountResistanceZones()
|
||||||
|
{
|
||||||
|
return ArraySize(resistanceZones);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
bool HasResistanceZones()
|
||||||
|
{
|
||||||
|
return IsValidSize(CountResistanceZones());
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
int CountDemandZones()
|
||||||
|
{
|
||||||
|
return ArraySize(demandZones);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
bool HasDemandZones()
|
||||||
|
{
|
||||||
|
return IsValidSize(CountDemandZones());
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
int CountSupplyZones()
|
||||||
|
{
|
||||||
|
return ArraySize(supplyZones);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
bool HasSupplyZones()
|
||||||
|
{
|
||||||
|
return IsValidSize(CountSupplyZones());
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
int CountBullishFVGs()
|
||||||
|
{
|
||||||
|
return ArraySize(bullishFVGs);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
bool HasBullishFVGs()
|
||||||
|
{
|
||||||
|
return IsValidSize(CountBullishFVGs());
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
int CountBearishFVGs()
|
||||||
|
{
|
||||||
|
return ArraySize(bearishFVGs);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
bool HasBearishFVGs()
|
||||||
|
{
|
||||||
|
return IsValidSize(CountBearishFVGs());
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
};
|
||||||
|
|
||||||
|
bool DetectPriceInsideBox(
|
||||||
|
XBoxZone &box,
|
||||||
|
X121Conditions &xConditions,
|
||||||
|
X121SMCCycleState &state //
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
box.Clean();
|
||||||
|
|
||||||
|
//
|
||||||
|
string symbol = state.symbol;
|
||||||
|
ENUM_TIMEFRAMES period = state.period;
|
||||||
|
|
||||||
|
//
|
||||||
|
box.symbol = symbol;
|
||||||
|
box.period = period;
|
||||||
|
|
||||||
|
//
|
||||||
|
result = state.IsValid();
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Detect Price Inside Order Block ...
|
||||||
|
|
||||||
|
//
|
||||||
|
bool hasBullishOBs = state.HasBullishOBs();
|
||||||
|
int bullishOBsCount = state.CountBullishOBs();
|
||||||
|
|
||||||
|
//
|
||||||
|
bool hasBearishOBs = state.HasBearishOBs();
|
||||||
|
int bearishOBsCount = state.CountBearishOBs();
|
||||||
|
|
||||||
|
//
|
||||||
|
bool hasOBs =
|
||||||
|
//
|
||||||
|
hasBullishOBs ||
|
||||||
|
hasBearishOBs
|
||||||
|
//
|
||||||
|
;
|
||||||
|
result = hasOBs;
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
bool hasPriceInsideOB = false;
|
||||||
|
XCOrderBlock *priceInsideOB = NULL;
|
||||||
|
ENUM_X_DIRECTION boxDir = X_DIRECTION_NONE;
|
||||||
|
|
||||||
|
//
|
||||||
|
if (hasBullishOBs &&
|
||||||
|
!hasPriceInsideOB)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
for (int i = 0; i < bullishOBsCount; i++)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
XCOrderBlock *iOb = state.bullishOBs[i];
|
||||||
|
|
||||||
|
//
|
||||||
|
bool isInside = IsPriceInsideZone(
|
||||||
|
xConditions.valesBuffer[1],
|
||||||
|
(XCZone *)iOb //
|
||||||
|
);
|
||||||
|
if (isInside)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
priceInsideOB = iOb;
|
||||||
|
hasPriceInsideOB = true;
|
||||||
|
boxDir = X_DIRECTION_BULLISH;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
if (hasBearishOBs &&
|
||||||
|
!hasPriceInsideOB)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
for (int i = 0; i < bearishOBsCount; i++)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
XCOrderBlock *iOb = state.bearishOBs[i];
|
||||||
|
|
||||||
|
//
|
||||||
|
bool isInside = IsPriceInsideZone(
|
||||||
|
xConditions.peaksBuffer[1],
|
||||||
|
(XCZone *)iOb //
|
||||||
|
);
|
||||||
|
if (isInside)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
priceInsideOB = iOb;
|
||||||
|
hasPriceInsideOB = true;
|
||||||
|
boxDir = X_DIRECTION_BEARISH;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
bool hasBullishFVG = state.HasBullishFVGs();
|
||||||
|
bool hasBearishFVG = state.HasBearishFVGs();
|
||||||
|
bool hasDemandZones = state.HasDemandZones();
|
||||||
|
bool hasSupplyZones = state.HasSupplyZones();
|
||||||
|
bool hasSupportZones = state.HasSupportZones();
|
||||||
|
bool hasResistanceZones = state.HasResistanceZones();
|
||||||
|
|
||||||
|
//
|
||||||
|
bool hasBullishZones =
|
||||||
|
//
|
||||||
|
hasBullishFVG ||
|
||||||
|
hasDemandZones ||
|
||||||
|
hasSupportZones
|
||||||
|
//
|
||||||
|
;
|
||||||
|
|
||||||
|
//
|
||||||
|
bool hasBearishZones =
|
||||||
|
//
|
||||||
|
hasBearishFVG ||
|
||||||
|
hasSupplyZones ||
|
||||||
|
hasResistanceZones
|
||||||
|
//
|
||||||
|
;
|
||||||
|
|
||||||
|
//
|
||||||
|
bool hasPropperZones =
|
||||||
|
//
|
||||||
|
IsBullish(boxDir)
|
||||||
|
? hasBullishZones
|
||||||
|
: IsBearish(boxDir)
|
||||||
|
? hasBearishZones
|
||||||
|
: false
|
||||||
|
//
|
||||||
|
;
|
||||||
|
|
||||||
|
//
|
||||||
|
if (!hasPropperZones &&
|
||||||
|
hasPriceInsideOB)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
box.to = priceInsideOB.To();
|
||||||
|
box.from = priceInsideOB.From();
|
||||||
|
box.upper = priceInsideOB.Upper();
|
||||||
|
box.lower = priceInsideOB.Lower();
|
||||||
|
}
|
||||||
|
else if (hasPropperZones &&
|
||||||
|
hasPriceInsideOB)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Detect Validate Zones ...
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
result = box.IsValid();
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add Guard to Collection ...
|
* Add Guard to Collection ...
|
||||||
*
|
*
|
||||||
@@ -704,6 +1065,11 @@ string ToString(ENUM_X_121_SMC_PROVIDERS value)
|
|||||||
result = X121SMCXToken;
|
result = X121SMCXToken;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
//
|
||||||
|
case X_121_SMC_PROVIDER_XHKPV:
|
||||||
|
result = X121SMCXHKPVToken;
|
||||||
|
break;
|
||||||
|
|
||||||
//
|
//
|
||||||
case X_121_SMC_PROVIDER_XOBPV:
|
case X_121_SMC_PROVIDER_XOBPV:
|
||||||
result = X121SMCXOBPVToken;
|
result = X121SMCXOBPVToken;
|
||||||
@@ -737,6 +1103,10 @@ ENUM_X_121_SMC_PROVIDERS ParseProvider(string value)
|
|||||||
{
|
{
|
||||||
result = X_121_SMC_PROVIDER_X;
|
result = X_121_SMC_PROVIDER_X;
|
||||||
}
|
}
|
||||||
|
else if (Contains(X121SMCXHKPVToken, value))
|
||||||
|
{
|
||||||
|
result = X_121_SMC_PROVIDER_XHKPV;
|
||||||
|
}
|
||||||
else if (Contains(X121SMCXOBPVToken, value))
|
else if (Contains(X121SMCXOBPVToken, value))
|
||||||
{
|
{
|
||||||
result = X_121_SMC_PROVIDER_XOBPV;
|
result = X_121_SMC_PROVIDER_XOBPV;
|
||||||
|
|||||||
@@ -900,7 +900,10 @@ bool DetectX121SMCXSignalSetup(
|
|||||||
forDir,
|
forDir,
|
||||||
priceInsideOB.GetSymbol(),
|
priceInsideOB.GetSymbol(),
|
||||||
priceInsideOB.GetPeriod(),
|
priceInsideOB.GetPeriod(),
|
||||||
(XCZone *)priceInsideOB //
|
priceInsideOB.Upper(),
|
||||||
|
priceInsideOB.Lower(),
|
||||||
|
priceInsideOB.From(),
|
||||||
|
priceInsideOB.To() //
|
||||||
);
|
);
|
||||||
if (hasBreakerBar)
|
if (hasBreakerBar)
|
||||||
{
|
{
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -23,8 +23,8 @@
|
|||||||
// Imports ...
|
// Imports ...
|
||||||
// #include "../../Libraries/x-trade.lib"
|
// #include "../../Libraries/x-trade.lib"
|
||||||
#include "../Classes/x-121.smc.market.cycle.helper.class.mq5"
|
#include "../Classes/x-121.smc.market.cycle.helper.class.mq5"
|
||||||
#include "../Libraries/x-121.smc.lib.mq5"
|
|
||||||
#include "../Libraries/x-121.smc.guard.lib.mq5"
|
#include "../Libraries/x-121.smc.guard.lib.mq5"
|
||||||
|
#include "../Libraries/x-121.smc.lib.mq5"
|
||||||
|
|
||||||
//
|
//
|
||||||
// Definitions ...
|
// Definitions ...
|
||||||
@@ -900,7 +900,10 @@ bool DetectX121SMCXOBPVSignalSetup(
|
|||||||
forDir,
|
forDir,
|
||||||
priceInsideOB.GetSymbol(),
|
priceInsideOB.GetSymbol(),
|
||||||
priceInsideOB.GetPeriod(),
|
priceInsideOB.GetPeriod(),
|
||||||
(XCZone *)priceInsideOB //
|
priceInsideOB.Upper(),
|
||||||
|
priceInsideOB.Lower(),
|
||||||
|
priceInsideOB.From(),
|
||||||
|
priceInsideOB.To() //
|
||||||
);
|
);
|
||||||
if (hasBreakerBar)
|
if (hasBreakerBar)
|
||||||
{
|
{
|
||||||
@@ -918,13 +921,204 @@ bool DetectX121SMCXOBPVSignalSetup(
|
|||||||
hasOBState = obState.IsValid();
|
hasOBState = obState.IsValid();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// DRAW ...
|
||||||
|
//
|
||||||
|
|
||||||
|
// //
|
||||||
|
// XCBaseObject *drawnObjects[];
|
||||||
|
|
||||||
|
// //
|
||||||
|
// if (hasBullishOrderBlocks)
|
||||||
|
// {
|
||||||
|
// //
|
||||||
|
// for (int i = 0; i < bullishOrderBlocksCount; i++)
|
||||||
|
// {
|
||||||
|
// //
|
||||||
|
// XCOrderBlock *iOb = conditions.bullishOBs[i];
|
||||||
|
|
||||||
|
// //
|
||||||
|
// XCBullishOrderBlockObject *iObObj;
|
||||||
|
// bool isCreated = visionCycleHelper
|
||||||
|
// .mPOIDrawer
|
||||||
|
// .CreateBullishOrderBlock(
|
||||||
|
// iOb,
|
||||||
|
// iObObj //
|
||||||
|
// );
|
||||||
|
// if (isCreated)
|
||||||
|
// {
|
||||||
|
// //
|
||||||
|
// Add(
|
||||||
|
// (XCBaseObject *)iObObj,
|
||||||
|
// drawnObjects //
|
||||||
|
// );
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
// //
|
||||||
|
// if (hasBearishOrderBlocks)
|
||||||
|
// {
|
||||||
|
// //
|
||||||
|
// for (int i = 0; i < bearishOrderBlocksCount; i++)
|
||||||
|
// {
|
||||||
|
// //
|
||||||
|
// XCOrderBlock *iOb = conditions.bearishOBs[i];
|
||||||
|
|
||||||
|
// //
|
||||||
|
// XCBearishOrderBlockObject *iObObj;
|
||||||
|
// bool isCreated = visionCycleHelper
|
||||||
|
// .mPOIDrawer
|
||||||
|
// .CreateBearishOrderBlock(
|
||||||
|
// iOb,
|
||||||
|
// iObObj //
|
||||||
|
// );
|
||||||
|
// if (isCreated)
|
||||||
|
// {
|
||||||
|
// //
|
||||||
|
// Add(
|
||||||
|
// (XCBaseObject *)iObObj,
|
||||||
|
// drawnObjects //
|
||||||
|
// );
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
// //
|
||||||
|
// if (hasPriceInsideOB)
|
||||||
|
// {
|
||||||
|
// //
|
||||||
|
// bool isBullish = priceInsideOB.IsBullish();
|
||||||
|
|
||||||
|
// //
|
||||||
|
// bool isCreated = false;
|
||||||
|
// XCBaseObject *priceInsideOBObj = NULL;
|
||||||
|
// if (isBullish)
|
||||||
|
// {
|
||||||
|
// //
|
||||||
|
// XCBullishOrderBlockObject *iObj;
|
||||||
|
// isCreated = visionCycleHelper
|
||||||
|
// .mPOIDrawer
|
||||||
|
// .CreateBullishOrderBlock(
|
||||||
|
// priceInsideOB,
|
||||||
|
// iObj //
|
||||||
|
// );
|
||||||
|
// if (isCreated)
|
||||||
|
// {
|
||||||
|
// //
|
||||||
|
// iObj.ZoneColor(clrYellow);
|
||||||
|
|
||||||
|
// //
|
||||||
|
// priceInsideOBObj = (XCBaseObject *)iObj;
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// else
|
||||||
|
// {
|
||||||
|
// //
|
||||||
|
// XCBearishOrderBlockObject *iObj;
|
||||||
|
// isCreated = visionCycleHelper
|
||||||
|
// .mPOIDrawer
|
||||||
|
// .CreateBearishOrderBlock(
|
||||||
|
// priceInsideOB,
|
||||||
|
// iObj //
|
||||||
|
// );
|
||||||
|
// if (isCreated)
|
||||||
|
// {
|
||||||
|
// //
|
||||||
|
// iObj.ZoneColor(clrOrange);
|
||||||
|
|
||||||
|
// //
|
||||||
|
// priceInsideOBObj = (XCBaseObject *)iObj;
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
// //
|
||||||
|
// if (isCreated)
|
||||||
|
// {
|
||||||
|
// //
|
||||||
|
// Add(
|
||||||
|
// priceInsideOBObj,
|
||||||
|
// drawnObjects //
|
||||||
|
// );
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
//
|
||||||
|
// if (hasOldestBullishOB)
|
||||||
|
// {
|
||||||
|
// //
|
||||||
|
// XCBullishOrderBlockObject *iObj;
|
||||||
|
// bool isCreated = visionCycleHelper
|
||||||
|
// .mPOIDrawer
|
||||||
|
// .CreateBullishOrderBlock(
|
||||||
|
// oldestBullishOB,
|
||||||
|
// iObj //
|
||||||
|
// );
|
||||||
|
// if (isCreated)
|
||||||
|
// {
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
// //
|
||||||
|
// if (hasYoungestBullishOB)
|
||||||
|
// {
|
||||||
|
// //
|
||||||
|
// XCBullishOrderBlockObject *iObj;
|
||||||
|
// bool isCreated = visionCycleHelper
|
||||||
|
// .mPOIDrawer
|
||||||
|
// .CreateBullishOrderBlock(
|
||||||
|
// youngestBullishOB,
|
||||||
|
// iObj //
|
||||||
|
// );
|
||||||
|
// if (isCreated)
|
||||||
|
// {
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
// //
|
||||||
|
// if (hasOldestBearishOB)
|
||||||
|
// {
|
||||||
|
// //
|
||||||
|
// XCBearishOrderBlockObject *iObj;
|
||||||
|
// bool isCreated = visionCycleHelper
|
||||||
|
// .mPOIDrawer
|
||||||
|
// .CreateBearishOrderBlock(
|
||||||
|
// oldestBearishOB,
|
||||||
|
// iObj //
|
||||||
|
// );
|
||||||
|
// if (isCreated)
|
||||||
|
// {
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
// //
|
||||||
|
// if (hasYoungestBearishOB)
|
||||||
|
// {
|
||||||
|
// //
|
||||||
|
// XCBearishOrderBlockObject *iObj;
|
||||||
|
// bool isCreated = visionCycleHelper
|
||||||
|
// .mPOIDrawer
|
||||||
|
// .CreateBearishOrderBlock(
|
||||||
|
// youngestBearishOB,
|
||||||
|
// iObj //
|
||||||
|
// );
|
||||||
|
// if (isCreated)
|
||||||
|
// {
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
|
||||||
//
|
//
|
||||||
bool isSameCyclesPeak =
|
bool isSameCyclesPeak =
|
||||||
//
|
//
|
||||||
triggerXOBPVConditions.peaksBuffer[1] == decisionXOBPVConditions.peaksBuffer[1] &&
|
triggerXOBPVConditions.peaksBuffer[1] == decisionXOBPVConditions.peaksBuffer[1] &&
|
||||||
decisionXOBPVConditions.peaksBuffer[1] == analyseXOBPVConditions.peaksBuffer[1] &&
|
decisionXOBPVConditions.peaksBuffer[1] == analyseXOBPVConditions.peaksBuffer[1] &&
|
||||||
analyseXOBPVConditions.peaksBuffer[1] == verificationXOBPVConditions.peaksBuffer[1] &&
|
analyseXOBPVConditions.peaksBuffer[1] == verificationXOBPVConditions.peaksBuffer[1]
|
||||||
verificationXOBPVConditions.peaksBuffer[1] == consolidationXOBPVConditions.peaksBuffer[1]
|
// &&
|
||||||
|
// verificationXOBPVConditions.peaksBuffer[1] == consolidationXOBPVConditions.peaksBuffer[1]
|
||||||
//
|
//
|
||||||
;
|
;
|
||||||
|
|
||||||
@@ -933,14 +1127,15 @@ bool DetectX121SMCXOBPVSignalSetup(
|
|||||||
//
|
//
|
||||||
triggerXOBPVConditions.valesBuffer[1] == decisionXOBPVConditions.valesBuffer[1] &&
|
triggerXOBPVConditions.valesBuffer[1] == decisionXOBPVConditions.valesBuffer[1] &&
|
||||||
decisionXOBPVConditions.valesBuffer[1] == analyseXOBPVConditions.valesBuffer[1] &&
|
decisionXOBPVConditions.valesBuffer[1] == analyseXOBPVConditions.valesBuffer[1] &&
|
||||||
analyseXOBPVConditions.valesBuffer[1] == verificationXOBPVConditions.valesBuffer[1] &&
|
analyseXOBPVConditions.valesBuffer[1] == verificationXOBPVConditions.valesBuffer[1]
|
||||||
verificationXOBPVConditions.valesBuffer[1] == consolidationXOBPVConditions.valesBuffer[1]
|
// &&
|
||||||
|
// verificationXOBPVConditions.valesBuffer[1] == consolidationXOBPVConditions.valesBuffer[1]
|
||||||
//
|
//
|
||||||
;
|
;
|
||||||
|
|
||||||
//
|
//
|
||||||
bool hasSameCyclesPV =
|
bool hasSameCyclesPV =
|
||||||
hasOBState &&
|
// hasOBState &&
|
||||||
hasPriceInsideOB &&
|
hasPriceInsideOB &&
|
||||||
(isSameCyclesPeak ||
|
(isSameCyclesPeak ||
|
||||||
isSameCyclesVale);
|
isSameCyclesVale);
|
||||||
@@ -1404,7 +1599,7 @@ bool DetectX121SMCXOBPVGuards(
|
|||||||
true, // TrailStop Guard ...
|
true, // TrailStop Guard ...
|
||||||
true, // TrailTarget Guard ...
|
true, // TrailTarget Guard ...
|
||||||
true // Hedge Guard ...
|
true // Hedge Guard ...
|
||||||
//
|
//
|
||||||
);
|
);
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -1491,34 +1686,3 @@ int AddX121SMCXOBPVConditionsIfNotExists(
|
|||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Draw Conditions ...
|
|
||||||
int DrawX121SMCXOBPVConditions(
|
|
||||||
X121SMCStrategyXOBPVSignalConditions &conditions,
|
|
||||||
XCBaseObject *&drawnObjects[],
|
|
||||||
XCPOIDrawer *drawer //
|
|
||||||
)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
int result = 0;
|
|
||||||
|
|
||||||
//
|
|
||||||
Clean(drawnObjects);
|
|
||||||
|
|
||||||
//
|
|
||||||
if (drawer == NULL)
|
|
||||||
{
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
bool isSetuped = conditions.IsSetuped();
|
|
||||||
if (!isSetuped)
|
|
||||||
{
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
|
|||||||
@@ -28,6 +28,7 @@
|
|||||||
|
|
||||||
//
|
//
|
||||||
#include "../Signals/x-121.smc.x.signal.lib.mq5"
|
#include "../Signals/x-121.smc.x.signal.lib.mq5"
|
||||||
|
#include "../Signals/x-121.smc.xhkpv.signal.lib.mq5"
|
||||||
#include "../Signals/x-121.smc.xobpv.signal.lib.mq5"
|
#include "../Signals/x-121.smc.xobpv.signal.lib.mq5"
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -43,6 +44,7 @@ class XCX121SMCStrategy : public XCX121SMCBaseStrategy
|
|||||||
//
|
//
|
||||||
// Props ...
|
// Props ...
|
||||||
bool useXSignal;
|
bool useXSignal;
|
||||||
|
bool useXHKPVSignal;
|
||||||
bool useXOBPVSignal;
|
bool useXOBPVSignal;
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -67,6 +69,7 @@ class XCX121SMCStrategy : public XCX121SMCBaseStrategy
|
|||||||
|
|
||||||
//
|
//
|
||||||
ArrayFree(mXConditionsCollection);
|
ArrayFree(mXConditionsCollection);
|
||||||
|
ArrayFree(mXHKPVConditionsCollection);
|
||||||
ArrayFree(mXOBPVConditionsCollection);
|
ArrayFree(mXOBPVConditionsCollection);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -194,6 +197,7 @@ class XCX121SMCStrategy : public XCX121SMCBaseStrategy
|
|||||||
|
|
||||||
//
|
//
|
||||||
bool hasXSignal = false;
|
bool hasXSignal = false;
|
||||||
|
bool hasXHKPVSignal = false;
|
||||||
bool hasXOBPVSignal = false;
|
bool hasXOBPVSignal = false;
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -205,6 +209,15 @@ class XCX121SMCStrategy : public XCX121SMCBaseStrategy
|
|||||||
hasSignal = hasXSignal;
|
hasSignal = hasXSignal;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// XHKPV Signal ...
|
||||||
|
if (useXHKPVSignal && !hasSignal)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
hasXHKPVSignal = DetectXHKPVSignal(conditions);
|
||||||
|
hasSignal = hasXHKPVSignal;
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// XOBPV Signal ...
|
// XOBPV Signal ...
|
||||||
if (useXOBPVSignal && !hasSignal)
|
if (useXOBPVSignal && !hasSignal)
|
||||||
@@ -386,6 +399,23 @@ class XCX121SMCStrategy : public XCX121SMCBaseStrategy
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// XHKPV Guard Detection ...
|
||||||
|
if (useXHKPVSignal)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool hasGuard = DetectX121SMCXHKPVGuards(
|
||||||
|
guards,
|
||||||
|
positions,
|
||||||
|
mTriggerCycleHelper,
|
||||||
|
mDecisionCycleHelper,
|
||||||
|
mAnalyseCycleHelper,
|
||||||
|
mVerificationCycleHelper,
|
||||||
|
mConsolidationCycleHelper,
|
||||||
|
mVisionCycleHelper //
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// XPZ Guard Detection ...
|
// XPZ Guard Detection ...
|
||||||
if (useXOBPVSignal)
|
if (useXOBPVSignal)
|
||||||
@@ -676,6 +706,224 @@ class XCX121SMCStrategy : public XCX121SMCBaseStrategy
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// XHKPV Signal ...
|
||||||
|
bool DetectXHKPVSignal(
|
||||||
|
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_XHKPV;
|
||||||
|
string providerStr = ToString(provider);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Detect Setup Conditions ...
|
||||||
|
datetime setupTime = mXHKPVConditions.setupTime;
|
||||||
|
bool isSetuped = mXHKPVConditions.IsSetuped();
|
||||||
|
ENUM_X_DIRECTION setupDir = mXHKPVConditions.dir;
|
||||||
|
if (!isSetuped)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Detect Signal Setup ...
|
||||||
|
isSetuped = DetectX121SMCXHKPVSignalSetup(
|
||||||
|
symbol,
|
||||||
|
period,
|
||||||
|
mXHKPVConditions,
|
||||||
|
mTriggerCycleHelper,
|
||||||
|
mDecisionCycleHelper,
|
||||||
|
mAnalyseCycleHelper,
|
||||||
|
mVerificationCycleHelper,
|
||||||
|
mConsolidationCycleHelper,
|
||||||
|
mVisionCycleHelper //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
setupDir = mXHKPVConditions.dir;
|
||||||
|
setupTime = mXHKPVConditions.setupTime;
|
||||||
|
|
||||||
|
//
|
||||||
|
if (isSetuped)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
int items = AddX121SMCXHKPVConditionsIfNotExists(
|
||||||
|
mXHKPVConditions,
|
||||||
|
mXHKPVConditionsCollection //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
mXHKPVConditions.Clean();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
int conditionsCount = ArraySize(mXHKPVConditionsCollection);
|
||||||
|
result = IsValidSize(conditionsCount);
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Looking For Conditions ...
|
||||||
|
int selectedIndex = 0;
|
||||||
|
X121SMCStrategyXHKPVSignalConditions mTmpConditions[];
|
||||||
|
Copy(
|
||||||
|
mXHKPVConditionsCollection,
|
||||||
|
mTmpConditions //
|
||||||
|
);
|
||||||
|
X121SMCStrategyXHKPVSignalConditions mConditions;
|
||||||
|
for (int i = 0; i < conditionsCount; i++)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Check Triggers ...
|
||||||
|
bool canTrigger = mTmpConditions[i].CanTrigger();
|
||||||
|
datetime triggerTime = mTmpConditions[i].triggerTime;
|
||||||
|
if (!canTrigger)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Detect Signal Trigger ...
|
||||||
|
canTrigger = DetectX121SMCXHKPVSignalTrigger(
|
||||||
|
mTmpConditions[i],
|
||||||
|
symbol,
|
||||||
|
period,
|
||||||
|
mTriggerCycleHelper,
|
||||||
|
mDecisionCycleHelper,
|
||||||
|
mAnalyseCycleHelper,
|
||||||
|
mVerificationCycleHelper,
|
||||||
|
mConsolidationCycleHelper,
|
||||||
|
mVisionCycleHelper //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
result = canTrigger;
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool isISetuped = mTmpConditions[i].IsSetuped();
|
||||||
|
if (!isISetuped)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
ArrayRemove(
|
||||||
|
mXHKPVConditionsCollection,
|
||||||
|
i,
|
||||||
|
1 //
|
||||||
|
);
|
||||||
|
}
|
||||||
|
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(
|
||||||
|
mXHKPVConditionsCollection,
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// XOBPV Signal ...
|
// XOBPV Signal ...
|
||||||
bool DetectXOBPVSignal(
|
bool DetectXOBPVSignal(
|
||||||
@@ -910,7 +1158,8 @@ class XCX121SMCStrategy : public XCX121SMCBaseStrategy
|
|||||||
{
|
{
|
||||||
//
|
//
|
||||||
useXSignal = false;
|
useXSignal = false;
|
||||||
useXOBPVSignal = true;
|
useXHKPVSignal = true;
|
||||||
|
useXOBPVSignal = false;
|
||||||
|
|
||||||
//
|
//
|
||||||
string symbol = GetSymbol();
|
string symbol = GetSymbol();
|
||||||
|
|||||||
Reference in New Issue
Block a user