last ...
This commit is contained in:
@@ -3332,9 +3332,9 @@ class XCPOIDrawer : public XCBase
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Draw Specified State Zone ...
|
* Draw Specified State Zone ...
|
||||||
*
|
*
|
||||||
* @param source: XStateZones instance Reference ...
|
* @param source: XStateZones instance Reference ...
|
||||||
*
|
*
|
||||||
* @return ( int )
|
* @return ( int )
|
||||||
*/
|
*/
|
||||||
int DrawStateZones(
|
int DrawStateZones(
|
||||||
@@ -4363,6 +4363,7 @@ class XCPOIDrawer : public XCBase
|
|||||||
XPVPivot &pivot,
|
XPVPivot &pivot,
|
||||||
XCBaseObject *&drawnObjects[],
|
XCBaseObject *&drawnObjects[],
|
||||||
bool drawState = false,
|
bool drawState = false,
|
||||||
|
bool drawStateAsBox = false,
|
||||||
bool drawTicksZone = false,
|
bool drawTicksZone = false,
|
||||||
bool ignoreSwingHighs = false,
|
bool ignoreSwingHighs = false,
|
||||||
bool ignoreSwingLows = false,
|
bool ignoreSwingLows = false,
|
||||||
@@ -4442,25 +4443,107 @@ class XCPOIDrawer : public XCBase
|
|||||||
|
|
||||||
//
|
//
|
||||||
XCBaseObject *stateObjects[];
|
XCBaseObject *stateObjects[];
|
||||||
int stateCount = DrawState(
|
int stateCount = 0;
|
||||||
pivot.state,
|
|
||||||
stateObjects,
|
//
|
||||||
drawTicksZone,
|
if (!drawStateAsBox)
|
||||||
ignoreSwingHighs,
|
{
|
||||||
ignoreSwingLows,
|
//
|
||||||
ignoreSupportZones,
|
stateCount = DrawState(
|
||||||
ignoreResistanceZones,
|
pivot.state,
|
||||||
ignoreSupplyZones,
|
stateObjects,
|
||||||
ignoreDemandZones,
|
drawTicksZone,
|
||||||
ignoreBullishOrderBlocks,
|
ignoreSwingHighs,
|
||||||
ignoreBearishOrderBlocks,
|
ignoreSwingLows,
|
||||||
ignoreBullishFairValueGaps,
|
ignoreSupportZones,
|
||||||
ignoreBearishFairValueGaps,
|
ignoreResistanceZones,
|
||||||
ignoreBullishRejectionBars,
|
ignoreSupplyZones,
|
||||||
ignoreBearishRejectionBars,
|
ignoreDemandZones,
|
||||||
ignoreBullishMomentumBars,
|
ignoreBullishOrderBlocks,
|
||||||
ignoreBearishMomentumBars //
|
ignoreBearishOrderBlocks,
|
||||||
);
|
ignoreBullishFairValueGaps,
|
||||||
|
ignoreBearishFairValueGaps,
|
||||||
|
ignoreBullishRejectionBars,
|
||||||
|
ignoreBearishRejectionBars,
|
||||||
|
ignoreBullishMomentumBars,
|
||||||
|
ignoreBearishMomentumBars //
|
||||||
|
);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//
|
||||||
|
double peakUpper = 0;
|
||||||
|
double peakLower = 0;
|
||||||
|
double valeUpper = 0;
|
||||||
|
double valeLower = 0;
|
||||||
|
|
||||||
|
//
|
||||||
|
datetime peakTo = NULL;
|
||||||
|
datetime valeTo = NULL;
|
||||||
|
datetime peakFrom = NULL;
|
||||||
|
datetime valeFrom = NULL;
|
||||||
|
|
||||||
|
//
|
||||||
|
bool hasBoxData = DetectPivotStateBoxData(
|
||||||
|
pivot,
|
||||||
|
peakUpper,
|
||||||
|
peakLower,
|
||||||
|
peakFrom,
|
||||||
|
peakTo,
|
||||||
|
valeUpper,
|
||||||
|
valeLower,
|
||||||
|
valeFrom,
|
||||||
|
valeTo //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
if (hasBoxData)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
XCBoxObject *peakBox;
|
||||||
|
bool isCreated = CreateBox(
|
||||||
|
peakBox,
|
||||||
|
peakUpper,
|
||||||
|
peakLower,
|
||||||
|
peakFrom,
|
||||||
|
peakTo,
|
||||||
|
clrMagenta,
|
||||||
|
1,
|
||||||
|
false,
|
||||||
|
STYLE_DASHDOT //
|
||||||
|
);
|
||||||
|
if (isCreated)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
Add(
|
||||||
|
(XCBaseObject *)peakBox,
|
||||||
|
stateObjects //
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
XCBoxObject *valeBox;
|
||||||
|
isCreated = CreateBox(
|
||||||
|
valeBox,
|
||||||
|
valeUpper,
|
||||||
|
valeLower,
|
||||||
|
valeFrom,
|
||||||
|
valeTo,
|
||||||
|
clrAqua,
|
||||||
|
1,
|
||||||
|
false,
|
||||||
|
STYLE_DASHDOT //
|
||||||
|
);
|
||||||
|
if (isCreated)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
Add(
|
||||||
|
(XCBaseObject *)valeBox,
|
||||||
|
stateObjects //
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
if (IsValidSize(stateCount))
|
if (IsValidSize(stateCount))
|
||||||
@@ -4471,6 +4554,9 @@ class XCPOIDrawer : public XCBase
|
|||||||
drawnObjects,
|
drawnObjects,
|
||||||
false // Doesn't Clean ...
|
false // Doesn't Clean ...
|
||||||
);
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
ArrayFree(stateObjects);
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -167,6 +167,7 @@ struct X121Conditions
|
|||||||
double lLLBuffer[];
|
double lLLBuffer[];
|
||||||
double hHHBuffer[];
|
double hHHBuffer[];
|
||||||
double hLLBuffer[];
|
double hLLBuffer[];
|
||||||
|
long volumeBuffer[];
|
||||||
double peaksBuffer[];
|
double peaksBuffer[];
|
||||||
double valesBuffer[];
|
double valesBuffer[];
|
||||||
double strUpBuffer[];
|
double strUpBuffer[];
|
||||||
@@ -198,6 +199,10 @@ struct X121Conditions
|
|||||||
double donCloseUpperBuffer[];
|
double donCloseUpperBuffer[];
|
||||||
double donCloseLowerBuffer[];
|
double donCloseLowerBuffer[];
|
||||||
|
|
||||||
|
//
|
||||||
|
bool bullishTrendBuffer[];
|
||||||
|
bool bearishTrendBuffer[];
|
||||||
|
|
||||||
//
|
//
|
||||||
double rsiSlope;
|
double rsiSlope;
|
||||||
double strSlope;
|
double strSlope;
|
||||||
@@ -292,11 +297,15 @@ struct X121Conditions
|
|||||||
bool isNewPeak;
|
bool isNewPeak;
|
||||||
bool isNewPeakOverLast;
|
bool isNewPeakOverLast;
|
||||||
bool isNewPeakUnderLast;
|
bool isNewPeakUnderLast;
|
||||||
|
bool isRejectedPrevPeak;
|
||||||
|
bool isBreakedUpPrevPeak;
|
||||||
|
|
||||||
//
|
//
|
||||||
bool isNewVale;
|
bool isNewVale;
|
||||||
bool isNewValeOverLast;
|
bool isNewValeOverLast;
|
||||||
bool isNewValeUnderLast;
|
bool isNewValeUnderLast;
|
||||||
|
bool isRejectedPrevVale;
|
||||||
|
bool isBreakedDownPrevVale;
|
||||||
|
|
||||||
//
|
//
|
||||||
bool isStrBullish;
|
bool isStrBullish;
|
||||||
@@ -488,6 +497,14 @@ struct X121Conditions
|
|||||||
bool isStrLowerCrossedOverDonLowLower;
|
bool isStrLowerCrossedOverDonLowLower;
|
||||||
bool isStrLowerCrossedUnderDonLowLower;
|
bool isStrLowerCrossedUnderDonLowLower;
|
||||||
|
|
||||||
|
//
|
||||||
|
bool isTrendBullish;
|
||||||
|
bool isTrendBearish;
|
||||||
|
|
||||||
|
//
|
||||||
|
bool isTrendSwirchedToBullish;
|
||||||
|
bool isTrendSwirchedToBearish;
|
||||||
|
|
||||||
//
|
//
|
||||||
bool isAtrUpperOverPeak;
|
bool isAtrUpperOverPeak;
|
||||||
bool isAtrUpperEqualsToPeak;
|
bool isAtrUpperEqualsToPeak;
|
||||||
@@ -546,6 +563,7 @@ struct X121Conditions
|
|||||||
Clean(peaksBuffer);
|
Clean(peaksBuffer);
|
||||||
Clean(valesBuffer);
|
Clean(valesBuffer);
|
||||||
Clean(strUpBuffer);
|
Clean(strUpBuffer);
|
||||||
|
Clean(volumeBuffer);
|
||||||
Clean(strDownBuffer);
|
Clean(strDownBuffer);
|
||||||
Clean(vwapMidBuffer);
|
Clean(vwapMidBuffer);
|
||||||
Clean(le1StartBuffer);
|
Clean(le1StartBuffer);
|
||||||
@@ -574,6 +592,10 @@ struct X121Conditions
|
|||||||
Clean(donCloseUpperBuffer);
|
Clean(donCloseUpperBuffer);
|
||||||
Clean(donCloseLowerBuffer);
|
Clean(donCloseLowerBuffer);
|
||||||
|
|
||||||
|
//
|
||||||
|
Clean(bullishTrendBuffer);
|
||||||
|
Clean(bearishTrendBuffer);
|
||||||
|
|
||||||
//
|
//
|
||||||
ArraySetAsSeries(rsiBuffer, true);
|
ArraySetAsSeries(rsiBuffer, true);
|
||||||
ArraySetAsSeries(atrBuffer, true);
|
ArraySetAsSeries(atrBuffer, true);
|
||||||
@@ -596,6 +618,7 @@ struct X121Conditions
|
|||||||
ArraySetAsSeries(peaksBuffer, true);
|
ArraySetAsSeries(peaksBuffer, true);
|
||||||
ArraySetAsSeries(valesBuffer, true);
|
ArraySetAsSeries(valesBuffer, true);
|
||||||
ArraySetAsSeries(strUpBuffer, true);
|
ArraySetAsSeries(strUpBuffer, true);
|
||||||
|
ArraySetAsSeries(volumeBuffer, true);
|
||||||
ArraySetAsSeries(strDownBuffer, true);
|
ArraySetAsSeries(strDownBuffer, true);
|
||||||
ArraySetAsSeries(vwapMidBuffer, true);
|
ArraySetAsSeries(vwapMidBuffer, true);
|
||||||
ArraySetAsSeries(le1StartBuffer, true);
|
ArraySetAsSeries(le1StartBuffer, true);
|
||||||
@@ -624,6 +647,10 @@ struct X121Conditions
|
|||||||
ArraySetAsSeries(donCloseUpperBuffer, true);
|
ArraySetAsSeries(donCloseUpperBuffer, true);
|
||||||
ArraySetAsSeries(donCloseLowerBuffer, true);
|
ArraySetAsSeries(donCloseLowerBuffer, true);
|
||||||
|
|
||||||
|
//
|
||||||
|
ArraySetAsSeries(bullishTrendBuffer, true);
|
||||||
|
ArraySetAsSeries(bearishTrendBuffer, true);
|
||||||
|
|
||||||
//
|
//
|
||||||
cheMin = 0;
|
cheMin = 0;
|
||||||
cheMax = 0;
|
cheMax = 0;
|
||||||
@@ -747,11 +774,15 @@ struct X121Conditions
|
|||||||
isNewPeak = false;
|
isNewPeak = false;
|
||||||
isNewPeakOverLast = false;
|
isNewPeakOverLast = false;
|
||||||
isNewPeakUnderLast = false;
|
isNewPeakUnderLast = false;
|
||||||
|
isRejectedPrevPeak = false;
|
||||||
|
isBreakedUpPrevPeak = false;
|
||||||
|
|
||||||
//
|
//
|
||||||
isNewVale = false;
|
isNewVale = false;
|
||||||
isNewValeOverLast = false;
|
isNewValeOverLast = false;
|
||||||
isNewValeUnderLast = false;
|
isNewValeUnderLast = false;
|
||||||
|
isRejectedPrevVale = false;
|
||||||
|
isBreakedDownPrevVale = false;
|
||||||
|
|
||||||
//
|
//
|
||||||
// STR ...
|
// STR ...
|
||||||
@@ -983,6 +1014,14 @@ struct X121Conditions
|
|||||||
//
|
//
|
||||||
isStrLowerCrossedOverDonLowLower = false;
|
isStrLowerCrossedOverDonLowLower = false;
|
||||||
isStrLowerCrossedUnderDonLowLower = false;
|
isStrLowerCrossedUnderDonLowLower = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
isTrendBullish = false;
|
||||||
|
isTrendBearish = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
isTrendSwirchedToBullish = false;
|
||||||
|
isTrendSwirchedToBearish = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -1074,9 +1113,13 @@ struct X121Conditions
|
|||||||
ToString("isNewPeak", isNewPeak, ignoreFalseConditions, separator) +
|
ToString("isNewPeak", isNewPeak, ignoreFalseConditions, separator) +
|
||||||
ToString("isNewPeakOverLast", isNewPeakOverLast, ignoreFalseConditions, separator) +
|
ToString("isNewPeakOverLast", isNewPeakOverLast, ignoreFalseConditions, separator) +
|
||||||
ToString("isNewPeakUnderLast", isNewPeakUnderLast, ignoreFalseConditions, separator) +
|
ToString("isNewPeakUnderLast", isNewPeakUnderLast, ignoreFalseConditions, separator) +
|
||||||
|
ToString("isRejectedPrevPeak", isRejectedPrevPeak, ignoreFalseConditions, separator) +
|
||||||
|
ToString("isBreakedUpPrevPeak", isBreakedUpPrevPeak, ignoreFalseConditions, separator) +
|
||||||
ToString("isNewVale", isNewVale, ignoreFalseConditions, separator) +
|
ToString("isNewVale", isNewVale, ignoreFalseConditions, separator) +
|
||||||
ToString("isNewValeOverLast", isNewValeOverLast, ignoreFalseConditions, separator) +
|
ToString("isNewValeOverLast", isNewValeOverLast, ignoreFalseConditions, separator) +
|
||||||
ToString("isNewValeUnderLast", isNewValeUnderLast, ignoreFalseConditions, separator) +
|
ToString("isNewValeUnderLast", isNewValeUnderLast, ignoreFalseConditions, separator) +
|
||||||
|
ToString("isRejectedPrevVale", isRejectedPrevVale, ignoreFalseConditions, separator) +
|
||||||
|
ToString("isBreakedDownPrevVale", isBreakedDownPrevVale, ignoreFalseConditions, separator) +
|
||||||
//
|
//
|
||||||
"-----------------------" + separator +
|
"-----------------------" + separator +
|
||||||
"> RSI ..." + separator +
|
"> RSI ..." + separator +
|
||||||
@@ -1188,6 +1231,10 @@ struct X121Conditions
|
|||||||
"-----------------------" + separator +
|
"-----------------------" + separator +
|
||||||
"Coplex ..." + separator +
|
"Coplex ..." + separator +
|
||||||
"-----------------------" + separator +
|
"-----------------------" + separator +
|
||||||
|
ToString("isTrendBullish", isTrendBullish, ignoreFalseConditions, separator) +
|
||||||
|
ToString("isTrendBearish", isTrendBearish, ignoreFalseConditions, separator) +
|
||||||
|
ToString("isTrendSwirchedToBullish", isTrendSwirchedToBullish, ignoreFalseConditions, separator) +
|
||||||
|
ToString("isTrendSwirchedToBearish", isTrendSwirchedToBearish, ignoreFalseConditions, separator) +
|
||||||
ToString("isSarIncreased", isSarIncreased, ignoreFalseConditions, separator) +
|
ToString("isSarIncreased", isSarIncreased, ignoreFalseConditions, separator) +
|
||||||
ToString("isSarDecreased", isSarDecreased, ignoreFalseConditions, separator) +
|
ToString("isSarDecreased", isSarDecreased, ignoreFalseConditions, separator) +
|
||||||
ToString("isSarEqualsToPeak", isSarEqualsToPeak, ignoreFalseConditions, separator) +
|
ToString("isSarEqualsToPeak", isSarEqualsToPeak, ignoreFalseConditions, separator) +
|
||||||
@@ -1786,6 +1833,25 @@ class XCX121Helper : public XCBase
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Fill Volume Buffer ...
|
||||||
|
for (int i = barIndex; i < barIndex + loopback; i++)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Reading Bar Valuem ...
|
||||||
|
long iVol = iVolume(
|
||||||
|
mSymbol,
|
||||||
|
mPeriod,
|
||||||
|
i //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
Add(
|
||||||
|
iVol,
|
||||||
|
conditions.volumeBuffer //
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Fill X121 Conditions Reference by Using
|
// Fill X121 Conditions Reference by Using
|
||||||
// Retrieved Conditions ...
|
// Retrieved Conditions ...
|
||||||
@@ -1878,6 +1944,18 @@ class XCX121Helper : public XCBase
|
|||||||
conditions.hLLBuffer //
|
conditions.hLLBuffer //
|
||||||
);
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
Copy(
|
||||||
|
xpvConditions.bullishTrendBuffer,
|
||||||
|
conditions.bullishTrendBuffer //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
Copy(
|
||||||
|
xpvConditions.bearishTrendBuffer,
|
||||||
|
conditions.bearishTrendBuffer //
|
||||||
|
);
|
||||||
|
|
||||||
//
|
//
|
||||||
// Conditions ...
|
// Conditions ...
|
||||||
|
|
||||||
@@ -1890,6 +1968,10 @@ class XCX121Helper : public XCBase
|
|||||||
conditions.isNewValeOverLast = xpvConditions.isNewValeOverLast;
|
conditions.isNewValeOverLast = xpvConditions.isNewValeOverLast;
|
||||||
conditions.isNewPeakUnderLast = xpvConditions.isNewPeakUnderLast;
|
conditions.isNewPeakUnderLast = xpvConditions.isNewPeakUnderLast;
|
||||||
conditions.isNewValeUnderLast = xpvConditions.isNewValeUnderLast;
|
conditions.isNewValeUnderLast = xpvConditions.isNewValeUnderLast;
|
||||||
|
conditions.isRejectedPrevVale = xpvConditions.isRejectedPrevVale;
|
||||||
|
conditions.isRejectedPrevPeak = xpvConditions.isRejectedPrevPeak;
|
||||||
|
conditions.isBreakedUpPrevPeak = xpvConditions.isBreakedUpPrevPeak;
|
||||||
|
conditions.isBreakedDownPrevVale = xpvConditions.isBreakedDownPrevVale;
|
||||||
conditions.isSarSwitchedToBullish = xpvConditions.isSarSwitchedToBullish;
|
conditions.isSarSwitchedToBullish = xpvConditions.isSarSwitchedToBullish;
|
||||||
conditions.isSarSwitchedToBearish = xpvConditions.isSarSwitchedToBearish;
|
conditions.isSarSwitchedToBearish = xpvConditions.isSarSwitchedToBearish;
|
||||||
|
|
||||||
@@ -2286,6 +2368,20 @@ class XCX121Helper : public XCBase
|
|||||||
//
|
//
|
||||||
// Complex Conditions ...
|
// Complex Conditions ...
|
||||||
|
|
||||||
|
//
|
||||||
|
bool isTrendBullish = conditions.bullishTrendBuffer[0];
|
||||||
|
bool isTrendBullishPrev = conditions.bullishTrendBuffer[1];
|
||||||
|
|
||||||
|
//
|
||||||
|
bool isTrendBearish = conditions.bearishTrendBuffer[0];
|
||||||
|
bool isTrendBearishPrev = conditions.bearishTrendBuffer[1];
|
||||||
|
|
||||||
|
//
|
||||||
|
bool isTrendSwirchedToBullish = isTrendBullish &&
|
||||||
|
!isTrendBullishPrev;
|
||||||
|
bool isTrendSwirchedToBearish = isTrendBearish &&
|
||||||
|
!isTrendBearishPrev;
|
||||||
|
|
||||||
//
|
//
|
||||||
double vwapFast = conditions.vwapFastBuffer[cIDX];
|
double vwapFast = conditions.vwapFastBuffer[cIDX];
|
||||||
double vwapMid = conditions.vwapMidBuffer[cIDX];
|
double vwapMid = conditions.vwapMidBuffer[cIDX];
|
||||||
@@ -2705,6 +2801,12 @@ class XCX121Helper : public XCBase
|
|||||||
conditions.vwapMin = vwapMin;
|
conditions.vwapMin = vwapMin;
|
||||||
conditions.vwapMax = vwapMax;
|
conditions.vwapMax = vwapMax;
|
||||||
|
|
||||||
|
//
|
||||||
|
conditions.isTrendBullish = isTrendBullish;
|
||||||
|
conditions.isTrendBearish = isTrendBearish;
|
||||||
|
conditions.isTrendSwirchedToBullish = isTrendSwirchedToBullish;
|
||||||
|
conditions.isTrendSwirchedToBearish = isTrendSwirchedToBearish;
|
||||||
|
|
||||||
//
|
//
|
||||||
conditions.isSarIncreased = isSarIncreased;
|
conditions.isSarIncreased = isSarIncreased;
|
||||||
conditions.isSarDecreased = isSarDecreased;
|
conditions.isSarDecreased = isSarDecreased;
|
||||||
|
|||||||
@@ -270,6 +270,10 @@ struct X121XPVConditions
|
|||||||
double hHHBuffer[];
|
double hHHBuffer[];
|
||||||
double hLLBuffer[];
|
double hLLBuffer[];
|
||||||
|
|
||||||
|
//
|
||||||
|
bool bullishTrendBuffer[];
|
||||||
|
bool bearishTrendBuffer[];
|
||||||
|
|
||||||
//
|
//
|
||||||
// Conditions ...
|
// Conditions ...
|
||||||
|
|
||||||
@@ -291,11 +295,15 @@ struct X121XPVConditions
|
|||||||
bool isNewPeak;
|
bool isNewPeak;
|
||||||
bool isNewPeakOverLast;
|
bool isNewPeakOverLast;
|
||||||
bool isNewPeakUnderLast;
|
bool isNewPeakUnderLast;
|
||||||
|
bool isRejectedPrevPeak;
|
||||||
|
bool isBreakedUpPrevPeak;
|
||||||
|
|
||||||
//
|
//
|
||||||
bool isNewVale;
|
bool isNewVale;
|
||||||
bool isNewValeOverLast;
|
bool isNewValeOverLast;
|
||||||
bool isNewValeUnderLast;
|
bool isNewValeUnderLast;
|
||||||
|
bool isRejectedPrevVale;
|
||||||
|
bool isBreakedDownPrevVale;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Constructor ...
|
// Constructor ...
|
||||||
@@ -336,6 +344,10 @@ struct X121XPVConditions
|
|||||||
Clean(hHHBuffer);
|
Clean(hHHBuffer);
|
||||||
Clean(hLLBuffer);
|
Clean(hLLBuffer);
|
||||||
|
|
||||||
|
//
|
||||||
|
Clean(bullishTrendBuffer);
|
||||||
|
Clean(bearishTrendBuffer);
|
||||||
|
|
||||||
//
|
//
|
||||||
ArraySetAsSeries(peaksBuffer, true);
|
ArraySetAsSeries(peaksBuffer, true);
|
||||||
ArraySetAsSeries(valesBuffer, true);
|
ArraySetAsSeries(valesBuffer, true);
|
||||||
@@ -351,6 +363,10 @@ struct X121XPVConditions
|
|||||||
ArraySetAsSeries(hHHBuffer, true);
|
ArraySetAsSeries(hHHBuffer, true);
|
||||||
ArraySetAsSeries(hLLBuffer, true);
|
ArraySetAsSeries(hLLBuffer, true);
|
||||||
|
|
||||||
|
//
|
||||||
|
ArraySetAsSeries(bullishTrendBuffer, true);
|
||||||
|
ArraySetAsSeries(bearishTrendBuffer, true);
|
||||||
|
|
||||||
//
|
//
|
||||||
// Conditions ...
|
// Conditions ...
|
||||||
|
|
||||||
@@ -366,11 +382,14 @@ struct X121XPVConditions
|
|||||||
isNewPeak = false;
|
isNewPeak = false;
|
||||||
isNewPeakOverLast = false;
|
isNewPeakOverLast = false;
|
||||||
isNewPeakUnderLast = false;
|
isNewPeakUnderLast = false;
|
||||||
|
isRejectedPrevPeak = false;
|
||||||
|
isBreakedUpPrevPeak = false;
|
||||||
//
|
//
|
||||||
isNewVale = false;
|
isNewVale = false;
|
||||||
isNewValeOverLast = false;
|
isNewValeOverLast = false;
|
||||||
isNewValeUnderLast = false;
|
isNewValeUnderLast = false;
|
||||||
|
isRejectedPrevVale = false;
|
||||||
|
isBreakedDownPrevVale = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -450,9 +469,13 @@ struct X121XPVConditions
|
|||||||
ToString("isNewPeak", isNewPeak, ignoreFalseConditions, separator) +
|
ToString("isNewPeak", isNewPeak, ignoreFalseConditions, separator) +
|
||||||
ToString("isNewPeakOverLast", isNewPeakOverLast, ignoreFalseConditions, separator) +
|
ToString("isNewPeakOverLast", isNewPeakOverLast, ignoreFalseConditions, separator) +
|
||||||
ToString("isNewPeakUnderLast", isNewPeakUnderLast, ignoreFalseConditions, separator) +
|
ToString("isNewPeakUnderLast", isNewPeakUnderLast, ignoreFalseConditions, separator) +
|
||||||
|
ToString("isRejectedPrevPeak", isRejectedPrevPeak, ignoreFalseConditions, separator) +
|
||||||
|
ToString("isBreakedUpPrevPeak", isBreakedUpPrevPeak, ignoreFalseConditions, separator) +
|
||||||
ToString("isNewVale", isNewVale, ignoreFalseConditions, separator) +
|
ToString("isNewVale", isNewVale, ignoreFalseConditions, separator) +
|
||||||
ToString("isNewValeOverLast", isNewValeOverLast, ignoreFalseConditions, separator) +
|
ToString("isNewValeOverLast", isNewValeOverLast, ignoreFalseConditions, separator) +
|
||||||
ToString("isNewValeUnderLast", isNewValeUnderLast, ignoreFalseConditions, separator) +
|
ToString("isNewValeUnderLast", isNewValeUnderLast, ignoreFalseConditions, separator) +
|
||||||
|
ToString("isRejectedPrevVale", isRejectedPrevVale, ignoreFalseConditions, separator) +
|
||||||
|
ToString("isBreakedDownPrevVale", isBreakedDownPrevVale, ignoreFalseConditions, separator) +
|
||||||
//
|
//
|
||||||
""
|
""
|
||||||
//
|
//
|
||||||
@@ -1589,6 +1612,107 @@ class XCX121XPVHelper : public XCBaseHelper
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Trends ...
|
||||||
|
|
||||||
|
// //
|
||||||
|
// bool GetBullishTrend(
|
||||||
|
// int barIndex // Bar Index
|
||||||
|
// )
|
||||||
|
// {
|
||||||
|
// //
|
||||||
|
// if (barIndex < 0)
|
||||||
|
// {
|
||||||
|
// barIndex = 0;
|
||||||
|
// }
|
||||||
|
|
||||||
|
// //
|
||||||
|
// Calculate();
|
||||||
|
|
||||||
|
// //
|
||||||
|
// int count = ArraySize(bullishTrendBuffer);
|
||||||
|
// if (barIndex >= count)
|
||||||
|
// {
|
||||||
|
// barIndex = count - 1;
|
||||||
|
// }
|
||||||
|
|
||||||
|
// //
|
||||||
|
// return bullishTrendBuffer[barIndex];
|
||||||
|
// }
|
||||||
|
|
||||||
|
// //
|
||||||
|
// int CopyBullishTrend(
|
||||||
|
// int start, // Start
|
||||||
|
// int count, // Number of Items for read
|
||||||
|
// bool &buffer[], // Dest Buffer
|
||||||
|
// bool forceClean = true // Force To Clean buffer
|
||||||
|
// )
|
||||||
|
// {
|
||||||
|
// //
|
||||||
|
// // Update Calculations ...
|
||||||
|
// Calculate();
|
||||||
|
|
||||||
|
// //
|
||||||
|
// // Copy Items ...
|
||||||
|
// return Copy(
|
||||||
|
// start,
|
||||||
|
// count,
|
||||||
|
// bullishTrendBuffer,
|
||||||
|
// buffer,
|
||||||
|
// forceClean
|
||||||
|
// //
|
||||||
|
// );
|
||||||
|
// }
|
||||||
|
|
||||||
|
// //
|
||||||
|
// bool GetBearishTrend(
|
||||||
|
// int barIndex // Bar Index
|
||||||
|
// )
|
||||||
|
// {
|
||||||
|
// //
|
||||||
|
// if (barIndex < 0)
|
||||||
|
// {
|
||||||
|
// barIndex = 0;
|
||||||
|
// }
|
||||||
|
|
||||||
|
// //
|
||||||
|
// Calculate();
|
||||||
|
|
||||||
|
// //
|
||||||
|
// int count = ArraySize(bearishTrendBuffer);
|
||||||
|
// if (barIndex >= count)
|
||||||
|
// {
|
||||||
|
// barIndex = count - 1;
|
||||||
|
// }
|
||||||
|
|
||||||
|
// //
|
||||||
|
// return bearishTrendBuffer[barIndex];
|
||||||
|
// }
|
||||||
|
|
||||||
|
// //
|
||||||
|
// int CopyBearishTrend(
|
||||||
|
// int start, // Start
|
||||||
|
// int count, // Number of Items for read
|
||||||
|
// bool &buffer[], // Dest Buffer
|
||||||
|
// bool forceClean = true // Force To Clean buffer
|
||||||
|
// )
|
||||||
|
// {
|
||||||
|
// //
|
||||||
|
// // Update Calculations ...
|
||||||
|
// Calculate();
|
||||||
|
|
||||||
|
// //
|
||||||
|
// // Copy Items ...
|
||||||
|
// return Copy(
|
||||||
|
// start,
|
||||||
|
// count,
|
||||||
|
// bearishTrendBuffer,
|
||||||
|
// buffer,
|
||||||
|
// forceClean
|
||||||
|
// //
|
||||||
|
// );
|
||||||
|
// }
|
||||||
|
|
||||||
//
|
//
|
||||||
// Tools Function ...
|
// Tools Function ...
|
||||||
|
|
||||||
@@ -1812,6 +1936,191 @@ class XCX121XPVHelper : public XCBaseHelper
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Detect Market Structure Method 2 ...
|
||||||
|
*
|
||||||
|
* @param model: XMarketStructure instance Reference ...
|
||||||
|
*
|
||||||
|
* @return ( bool )
|
||||||
|
*/
|
||||||
|
bool DetectMarketStructure(
|
||||||
|
ENUM_X_DIRECTION &dir,
|
||||||
|
int pivotsCount = 3 //
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
int barIndex = 0;
|
||||||
|
|
||||||
|
//
|
||||||
|
if (pivotsCount < 3)
|
||||||
|
{
|
||||||
|
pivotsCount = 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
dir = X_DIRECTION_NONE;
|
||||||
|
string symbol = GetSymbol();
|
||||||
|
ENUM_TIMEFRAMES period = GetPeriod();
|
||||||
|
|
||||||
|
//
|
||||||
|
int hpIndex = -1;
|
||||||
|
int hpIndexes[];
|
||||||
|
double hpValues[];
|
||||||
|
|
||||||
|
//
|
||||||
|
int lvIndex = -1;
|
||||||
|
int lvIndexes[];
|
||||||
|
double lvValues[];
|
||||||
|
|
||||||
|
//
|
||||||
|
for (int i = 0; i < pivotsCount; i++)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
hpIndex = barIndex;
|
||||||
|
lvIndex = barIndex;
|
||||||
|
|
||||||
|
//
|
||||||
|
double lastHP = 0;
|
||||||
|
double lastLV = 0;
|
||||||
|
|
||||||
|
//
|
||||||
|
int hpCount = ArraySize(hpIndexes);
|
||||||
|
int lvCount = ArraySize(lvIndexes);
|
||||||
|
|
||||||
|
//
|
||||||
|
if (IsValidSize(hpCount))
|
||||||
|
{
|
||||||
|
//
|
||||||
|
lastHP = hpValues[hpCount - 1];
|
||||||
|
hpIndex = hpIndexes[hpCount - 1];
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
if (IsValidSize(lvCount))
|
||||||
|
{
|
||||||
|
//
|
||||||
|
lastLV = lvValues[lvCount - 1];
|
||||||
|
lvIndex = lvIndexes[lvCount - 1];
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
if (lastHP == 0)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
lastHP = GetPeak(hpIndex);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
if (lastLV == 0)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
lastLV = GetVale(lvIndex);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
int highestPeakIndex = -1;
|
||||||
|
double highesrPeak =
|
||||||
|
GetHigherPeak(
|
||||||
|
highestPeakIndex,
|
||||||
|
lastHP,
|
||||||
|
hpIndex //
|
||||||
|
);
|
||||||
|
if (IsValidIndex(highestPeakIndex))
|
||||||
|
{
|
||||||
|
//
|
||||||
|
Add(
|
||||||
|
highestPeakIndex,
|
||||||
|
hpIndexes //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
Add(
|
||||||
|
highesrPeak,
|
||||||
|
hpValues //
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
int lowestValeIndex = -1;
|
||||||
|
double lowestVale =
|
||||||
|
GetLowerVale(
|
||||||
|
lowestValeIndex,
|
||||||
|
lastLV,
|
||||||
|
lvIndex //
|
||||||
|
);
|
||||||
|
if (IsValidIndex(lowestValeIndex))
|
||||||
|
{
|
||||||
|
//
|
||||||
|
Add(
|
||||||
|
lowestValeIndex,
|
||||||
|
lvIndexes //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
Add(
|
||||||
|
lowestVale,
|
||||||
|
lvValues //
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
bool canBreak = ArraySize(hpIndexes) >= pivotsCount ||
|
||||||
|
ArraySize(lvIndexes) >= pivotsCount;
|
||||||
|
if (canBreak)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
ArrayReverse(hpValues);
|
||||||
|
ArrayReverse(hpIndexes);
|
||||||
|
int countHPs = ArraySize(hpIndexes);
|
||||||
|
|
||||||
|
//
|
||||||
|
ArrayReverse(lvValues);
|
||||||
|
ArrayReverse(lvIndexes);
|
||||||
|
int countLVs = ArraySize(lvIndexes);
|
||||||
|
|
||||||
|
//
|
||||||
|
bool isValidHPs = countHPs >= pivotsCount;
|
||||||
|
bool isValidLVs = countLVs >= pivotsCount;
|
||||||
|
|
||||||
|
//
|
||||||
|
result = isValidHPs ||
|
||||||
|
isValidLVs;
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
if (isValidHPs && isValidLVs)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
hpIndex = hpIndexes[countHPs - 1];
|
||||||
|
lvIndex = lvIndexes[countLVs - 1];
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
dir =
|
||||||
|
!isValidHPs && isValidLVs
|
||||||
|
? X_DIRECTION_BULLISH
|
||||||
|
: !isValidLVs && isValidHPs
|
||||||
|
? X_DIRECTION_BEARISH
|
||||||
|
: hpIndex < lvIndex
|
||||||
|
? X_DIRECTION_BEARISH
|
||||||
|
: lvIndex < hpIndex
|
||||||
|
? X_DIRECTION_BULLISH
|
||||||
|
: X_DIRECTION_ALL;
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
bool GetConditions(
|
bool GetConditions(
|
||||||
X121XPVConditions &conditions, //
|
X121XPVConditions &conditions, //
|
||||||
@@ -1972,6 +2281,48 @@ class XCX121XPVHelper : public XCBaseHelper
|
|||||||
conditions.hLLBuffer //
|
conditions.hLLBuffer //
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// //
|
||||||
|
// CopyBullishTrend(
|
||||||
|
// zIndex,
|
||||||
|
// loopback,
|
||||||
|
// conditions.bullishTrendBuffer //
|
||||||
|
// );
|
||||||
|
|
||||||
|
// //
|
||||||
|
// CopyBearishTrend(
|
||||||
|
// zIndex,
|
||||||
|
// loopback,
|
||||||
|
// conditions.bearishTrendBuffer //
|
||||||
|
// );
|
||||||
|
|
||||||
|
//
|
||||||
|
for (int i = barIndex + 1; i < barIndex + 3; i++)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
ENUM_X_DIRECTION iDirection;
|
||||||
|
bool iHasDirection = DetectMarketStructure(iDirection);
|
||||||
|
|
||||||
|
//
|
||||||
|
bool iHasBullishTrend = iHasDirection &&
|
||||||
|
IsBullish(iDirection);
|
||||||
|
|
||||||
|
//
|
||||||
|
bool iHasBearishTrend = iHasDirection &&
|
||||||
|
IsBearish(iDirection);
|
||||||
|
|
||||||
|
//
|
||||||
|
Add(
|
||||||
|
iHasBullishTrend,
|
||||||
|
conditions.bullishTrendBuffer //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
Add(
|
||||||
|
iHasBearishTrend,
|
||||||
|
conditions.bearishTrendBuffer //
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Conditions ...
|
// Conditions ...
|
||||||
|
|
||||||
@@ -2005,6 +2356,16 @@ class XCX121XPVHelper : public XCBaseHelper
|
|||||||
conditions.peaksBuffer[cIDX] > conditions.peaksBuffer[pIDX];
|
conditions.peaksBuffer[cIDX] > conditions.peaksBuffer[pIDX];
|
||||||
bool isNewPeakUnderLast = isNewPeak &&
|
bool isNewPeakUnderLast = isNewPeak &&
|
||||||
conditions.peaksBuffer[cIDX] < conditions.peaksBuffer[pIDX];
|
conditions.peaksBuffer[cIDX] < conditions.peaksBuffer[pIDX];
|
||||||
|
bool isRejectedPrevPeak = IsBarReject(
|
||||||
|
conditions.peaksBuffer[pIDX],
|
||||||
|
X_DIRECTION_BEARISH,
|
||||||
|
cBar //
|
||||||
|
);
|
||||||
|
bool isBreakedUpPrevPeak = IsBarBreak(
|
||||||
|
conditions.peaksBuffer[pIDX],
|
||||||
|
X_DIRECTION_BULLISH,
|
||||||
|
cBar //
|
||||||
|
);
|
||||||
|
|
||||||
//
|
//
|
||||||
bool isNewVale = conditions.valesBuffer[cIDX] != conditions.valesBuffer[pIDX];
|
bool isNewVale = conditions.valesBuffer[cIDX] != conditions.valesBuffer[pIDX];
|
||||||
@@ -2012,6 +2373,16 @@ class XCX121XPVHelper : public XCBaseHelper
|
|||||||
conditions.valesBuffer[cIDX] > conditions.valesBuffer[pIDX];
|
conditions.valesBuffer[cIDX] > conditions.valesBuffer[pIDX];
|
||||||
bool isNewValeUnderLast = isNewVale &&
|
bool isNewValeUnderLast = isNewVale &&
|
||||||
conditions.valesBuffer[cIDX] < conditions.valesBuffer[pIDX];
|
conditions.valesBuffer[cIDX] < conditions.valesBuffer[pIDX];
|
||||||
|
bool isRejectedPrevVale = IsBarReject(
|
||||||
|
conditions.valesBuffer[pIDX],
|
||||||
|
X_DIRECTION_BULLISH,
|
||||||
|
cBar //
|
||||||
|
);
|
||||||
|
bool isBreakedDownPrevVale = IsBarBreak(
|
||||||
|
conditions.valesBuffer[pIDX],
|
||||||
|
X_DIRECTION_BEARISH,
|
||||||
|
cBar //
|
||||||
|
);
|
||||||
|
|
||||||
//
|
//
|
||||||
conditions.isSarBullish = isSarBullish;
|
conditions.isSarBullish = isSarBullish;
|
||||||
@@ -2021,9 +2392,18 @@ class XCX121XPVHelper : public XCBaseHelper
|
|||||||
conditions.isNewPeak = isNewPeak;
|
conditions.isNewPeak = isNewPeak;
|
||||||
conditions.isNewPeakOverLast = isNewPeakOverLast;
|
conditions.isNewPeakOverLast = isNewPeakOverLast;
|
||||||
conditions.isNewPeakUnderLast = isNewPeakUnderLast;
|
conditions.isNewPeakUnderLast = isNewPeakUnderLast;
|
||||||
|
conditions.isRejectedPrevPeak = isRejectedPrevPeak;
|
||||||
|
conditions.isBreakedUpPrevPeak = isBreakedUpPrevPeak;
|
||||||
conditions.isNewVale = isNewVale;
|
conditions.isNewVale = isNewVale;
|
||||||
conditions.isNewValeOverLast = isNewValeOverLast;
|
conditions.isNewValeOverLast = isNewValeOverLast;
|
||||||
conditions.isNewValeUnderLast = isNewValeUnderLast;
|
conditions.isNewValeUnderLast = isNewValeUnderLast;
|
||||||
|
conditions.isRejectedPrevVale = isRejectedPrevVale;
|
||||||
|
conditions.isBreakedDownPrevVale = isBreakedDownPrevVale;
|
||||||
|
|
||||||
|
// //
|
||||||
|
// if (isNewVale || isNewPeak) {
|
||||||
|
// CalculateTrend();
|
||||||
|
// }
|
||||||
|
|
||||||
//
|
//
|
||||||
return result;
|
return result;
|
||||||
@@ -2055,6 +2435,29 @@ class XCX121XPVHelper : public XCBaseHelper
|
|||||||
double hHHBuffer[];
|
double hHHBuffer[];
|
||||||
double hLLBuffer[];
|
double hLLBuffer[];
|
||||||
|
|
||||||
|
//
|
||||||
|
// bool bullishTrendBuffer[];
|
||||||
|
// bool bearishTrendBuffer[];
|
||||||
|
|
||||||
|
//
|
||||||
|
// void AddTrend(
|
||||||
|
// bool isBullish,
|
||||||
|
// bool isBearish //
|
||||||
|
// )
|
||||||
|
// {
|
||||||
|
// //
|
||||||
|
// Add(
|
||||||
|
// isBullish,
|
||||||
|
// bullishTrendBuffer //
|
||||||
|
// );
|
||||||
|
|
||||||
|
// //
|
||||||
|
// Add(
|
||||||
|
// isBearish,
|
||||||
|
// bearishTrendBuffer //
|
||||||
|
// );
|
||||||
|
// }
|
||||||
|
|
||||||
//
|
//
|
||||||
void Calculate()
|
void Calculate()
|
||||||
{
|
{
|
||||||
@@ -2229,6 +2632,28 @@ class XCX121XPVHelper : public XCBaseHelper
|
|||||||
//
|
//
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// void CalculateTrend()
|
||||||
|
// {
|
||||||
|
// //
|
||||||
|
// ENUM_X_DIRECTION iDirection;
|
||||||
|
// bool iHasDirection = DetectMarketStructure(iDirection);
|
||||||
|
|
||||||
|
// //
|
||||||
|
// bool iHasBullishTrend = iHasDirection &&
|
||||||
|
// IsBullish(iDirection);
|
||||||
|
|
||||||
|
// //
|
||||||
|
// bool iHasBearishTrend = iHasDirection &&
|
||||||
|
// IsBearish(iDirection);
|
||||||
|
|
||||||
|
// //
|
||||||
|
// AddTrend(
|
||||||
|
// iHasBullishTrend,
|
||||||
|
// iHasBearishTrend //
|
||||||
|
// );
|
||||||
|
// }
|
||||||
};
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -6471,9 +6471,9 @@ struct XFVGOrderBlock
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Check Model is same as another Istance ...
|
* Check Model is same as another Istance ...
|
||||||
*
|
*
|
||||||
* @param value: XFVGOrderBlock instance Reference ...
|
* @param value: XFVGOrderBlock instance Reference ...
|
||||||
*
|
*
|
||||||
* @return ( bool )
|
* @return ( bool )
|
||||||
*/
|
*/
|
||||||
bool IsSameAs(XFVGOrderBlock &value)
|
bool IsSameAs(XFVGOrderBlock &value)
|
||||||
@@ -6510,18 +6510,18 @@ struct XFVGOrderBlock
|
|||||||
result =
|
result =
|
||||||
//
|
//
|
||||||
dir == valueDir
|
dir == valueDir
|
||||||
//
|
//
|
||||||
&&
|
&&
|
||||||
//
|
//
|
||||||
orderBlock.From() == value.orderBlock.From() &&
|
orderBlock.From() == value.orderBlock.From() &&
|
||||||
orderBlock.Upper() == value.orderBlock.Upper() &&
|
orderBlock.Upper() == value.orderBlock.Upper() &&
|
||||||
orderBlock.Lower() == value.orderBlock.Lower()
|
orderBlock.Lower() == value.orderBlock.Lower()
|
||||||
//
|
//
|
||||||
&&
|
&&
|
||||||
//
|
//
|
||||||
fairValueGap.From() == value.fairValueGap.From() &&
|
fairValueGap.From() == value.fairValueGap.From() &&
|
||||||
fairValueGap.Upper() == value.fairValueGap.Upper() &&
|
fairValueGap.Upper() == value.fairValueGap.Upper() &&
|
||||||
fairValueGap.Lower() == value.fairValueGap.Lower()
|
fairValueGap.Lower() == value.fairValueGap.Lower()
|
||||||
//
|
//
|
||||||
;
|
;
|
||||||
|
|
||||||
@@ -7720,6 +7720,910 @@ void DetectPivotPOIs(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fill Pivot Tick Zone ...
|
||||||
|
*
|
||||||
|
* @param pivot: XPVPivot instance Reference ...
|
||||||
|
*/
|
||||||
|
void CalculatePivotTickZone(
|
||||||
|
XPVPivot &pivot,
|
||||||
|
int ticksLevels,
|
||||||
|
int ticksRange,
|
||||||
|
ENUM_TIMEFRAMES _period = NULL //
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
string symbol = pivot.symbol;
|
||||||
|
ENUM_TIMEFRAMES period = IsValid(_period)
|
||||||
|
? _period
|
||||||
|
: pivot.period;
|
||||||
|
|
||||||
|
//
|
||||||
|
bool isInited = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
datetime from = pivot.from;
|
||||||
|
XOHCL iFromBar;
|
||||||
|
int iFromBarIndex = iBarShift(
|
||||||
|
symbol,
|
||||||
|
period,
|
||||||
|
from //
|
||||||
|
);
|
||||||
|
isInited = iFromBar.Init(
|
||||||
|
symbol,
|
||||||
|
period,
|
||||||
|
iFromBarIndex //
|
||||||
|
);
|
||||||
|
if (!isInited)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
datetime to = pivot.to;
|
||||||
|
XOHCL iToBar;
|
||||||
|
int iToBarIndex = iBarShift(
|
||||||
|
symbol,
|
||||||
|
period,
|
||||||
|
to //
|
||||||
|
);
|
||||||
|
isInited = iToBar.Init(
|
||||||
|
symbol,
|
||||||
|
period,
|
||||||
|
iToBarIndex //
|
||||||
|
);
|
||||||
|
if (!isInited)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
if (iFromBarIndex <= iToBarIndex)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
XCTicksZone *iZone;
|
||||||
|
iZone = new XCTicksZone();
|
||||||
|
|
||||||
|
//
|
||||||
|
isInited = ticksLevels > 0 &&
|
||||||
|
ticksRange > 0;
|
||||||
|
if (!isInited)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
isInited = iZone.Init(
|
||||||
|
iFromBar,
|
||||||
|
iToBar //
|
||||||
|
);
|
||||||
|
if (!isInited)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
pivot.state.ticksZone = iZone;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Filter State based on Pivot ...
|
||||||
|
*
|
||||||
|
* @param pivot: XPVPivot instance Reference ...
|
||||||
|
* @param state: XPOIState instance Reference ...
|
||||||
|
*/
|
||||||
|
void FilterPivotState(
|
||||||
|
XPVPivot &pivot,
|
||||||
|
XPOIState &state //
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool isValid =
|
||||||
|
pivot.IsValid() &&
|
||||||
|
state.IsValid() &&
|
||||||
|
state.HasChild();
|
||||||
|
if (!isValid)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
int count = 0;
|
||||||
|
|
||||||
|
//
|
||||||
|
double upper = pivot.upper;
|
||||||
|
double lower = pivot.lower;
|
||||||
|
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
|
||||||
|
//
|
||||||
|
// Resistance ...
|
||||||
|
count = state.CountResistanceZones();
|
||||||
|
if (IsValidSize(count))
|
||||||
|
{
|
||||||
|
//
|
||||||
|
XCResistanceZone *tmp[];
|
||||||
|
Copy(
|
||||||
|
state.resistanceZones,
|
||||||
|
tmp //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
for (int i = 0; i < count; i++)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
XCResistanceZone *item = tmp[i];
|
||||||
|
|
||||||
|
//
|
||||||
|
bool isValid = IsPriceInsideZone(
|
||||||
|
upper,
|
||||||
|
item //
|
||||||
|
);
|
||||||
|
if (!isValid)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
ArrayRemove(
|
||||||
|
state.resistanceZones,
|
||||||
|
i,
|
||||||
|
1 //
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
ArrayFree(tmp);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Supply ...
|
||||||
|
count = state.CountSupplyZones();
|
||||||
|
if (IsValidSize(count))
|
||||||
|
{
|
||||||
|
//
|
||||||
|
XCSupplyZone *tmp[];
|
||||||
|
Copy(
|
||||||
|
state.supplyZones,
|
||||||
|
tmp //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
for (int i = 0; i < count; i++)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
XCSupplyZone *item = tmp[i];
|
||||||
|
|
||||||
|
//
|
||||||
|
bool isValid = IsPriceInsideZone(
|
||||||
|
upper,
|
||||||
|
item //
|
||||||
|
);
|
||||||
|
if (!isValid)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
ArrayRemove(
|
||||||
|
state.supplyZones,
|
||||||
|
i,
|
||||||
|
1 //
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
ArrayFree(tmp);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Bearish Order Block ...
|
||||||
|
count = state.CountBearishOrderBlocks();
|
||||||
|
if (IsValidSize(count))
|
||||||
|
{
|
||||||
|
//
|
||||||
|
XCOrderBlock *tmp[];
|
||||||
|
Copy(
|
||||||
|
state.bearishOrderBlocks,
|
||||||
|
tmp //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
for (int i = 0; i < count; i++)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
XCOrderBlock *item = tmp[i];
|
||||||
|
|
||||||
|
//
|
||||||
|
bool isValid = IsPriceInsideZone(
|
||||||
|
upper,
|
||||||
|
item //
|
||||||
|
);
|
||||||
|
if (!isValid)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
ArrayRemove(
|
||||||
|
state.bearishOrderBlocks,
|
||||||
|
i,
|
||||||
|
1 //
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
ArrayFree(tmp);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Bearish Fair Value Gap ...
|
||||||
|
count = state.CountBearishFairValueGaps();
|
||||||
|
if (IsValidSize(count))
|
||||||
|
{
|
||||||
|
//
|
||||||
|
XCFVG *tmp[];
|
||||||
|
Copy(
|
||||||
|
state.bearishFairValueGaps,
|
||||||
|
tmp //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
for (int i = 0; i < count; i++)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
XCFVG *item = tmp[i];
|
||||||
|
|
||||||
|
//
|
||||||
|
bool isValid = IsPriceInsideZone(
|
||||||
|
upper,
|
||||||
|
item //
|
||||||
|
);
|
||||||
|
if (!isValid)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
ArrayRemove(
|
||||||
|
state.bearishFairValueGaps,
|
||||||
|
i,
|
||||||
|
1 //
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
ArrayFree(tmp);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
|
||||||
|
//
|
||||||
|
// Support ...
|
||||||
|
count = state.CountSupportZones();
|
||||||
|
if (IsValidSize(count))
|
||||||
|
{
|
||||||
|
//
|
||||||
|
XCSupportZone *tmp[];
|
||||||
|
Copy(
|
||||||
|
state.supportZones,
|
||||||
|
tmp //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
for (int i = 0; i < count; i++)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
XCSupportZone *item = tmp[i];
|
||||||
|
|
||||||
|
//
|
||||||
|
bool isValid = IsPriceInsideZone(
|
||||||
|
lower,
|
||||||
|
item //
|
||||||
|
);
|
||||||
|
if (!isValid)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
ArrayRemove(
|
||||||
|
state.supportZones,
|
||||||
|
i,
|
||||||
|
1 //
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
ArrayFree(tmp);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Demand ...
|
||||||
|
count = state.CountDemandZones();
|
||||||
|
if (IsValidSize(count))
|
||||||
|
{
|
||||||
|
//
|
||||||
|
XCDemandZone *tmp[];
|
||||||
|
Copy(
|
||||||
|
state.demandZones,
|
||||||
|
tmp //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
for (int i = 0; i < count; i++)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
XCDemandZone *item = tmp[i];
|
||||||
|
|
||||||
|
//
|
||||||
|
bool isValid = IsPriceInsideZone(
|
||||||
|
lower,
|
||||||
|
item //
|
||||||
|
);
|
||||||
|
if (!isValid)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
ArrayRemove(
|
||||||
|
state.demandZones,
|
||||||
|
i,
|
||||||
|
1 //
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
ArrayFree(tmp);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Bullish Order Block ...
|
||||||
|
count = state.CountBullishOrderBlocks();
|
||||||
|
if (IsValidSize(count))
|
||||||
|
{
|
||||||
|
//
|
||||||
|
XCOrderBlock *tmp[];
|
||||||
|
Copy(
|
||||||
|
state.bullishOrderBlocks,
|
||||||
|
tmp //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
for (int i = 0; i < count; i++)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
XCOrderBlock *item = tmp[i];
|
||||||
|
|
||||||
|
//
|
||||||
|
bool isValid = IsPriceInsideZone(
|
||||||
|
lower,
|
||||||
|
item //
|
||||||
|
);
|
||||||
|
if (!isValid)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
ArrayRemove(
|
||||||
|
state.bullishOrderBlocks,
|
||||||
|
i,
|
||||||
|
1 //
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
ArrayFree(tmp);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Bullish Fair Value Gap ...
|
||||||
|
count = state.CountBullishFairValueGaps();
|
||||||
|
if (IsValidSize(count))
|
||||||
|
{
|
||||||
|
//
|
||||||
|
XCFVG *tmp[];
|
||||||
|
Copy(
|
||||||
|
state.bullishFairValueGaps,
|
||||||
|
tmp //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
for (int i = 0; i < count; i++)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
XCFVG *item = tmp[i];
|
||||||
|
|
||||||
|
//
|
||||||
|
bool isValid = IsPriceInsideZone(
|
||||||
|
lower,
|
||||||
|
item //
|
||||||
|
);
|
||||||
|
if (!isValid)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
ArrayRemove(
|
||||||
|
state.bullishFairValueGaps,
|
||||||
|
i,
|
||||||
|
1 //
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
ArrayFree(tmp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Detect Box Date of Specified Pivot ...
|
||||||
|
*/
|
||||||
|
bool DetectPivotStateBoxData(
|
||||||
|
XPVPivot &pivot,
|
||||||
|
double &peakUpper,
|
||||||
|
double &peakLower,
|
||||||
|
datetime &peakFrom,
|
||||||
|
datetime &peakTo,
|
||||||
|
double &valeUpper,
|
||||||
|
double &valeLower,
|
||||||
|
datetime &valeFrom,
|
||||||
|
datetime &valeTo //
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
peakUpper = 0;
|
||||||
|
peakLower = 0;
|
||||||
|
valeUpper = 0;
|
||||||
|
valeLower = 0;
|
||||||
|
|
||||||
|
//
|
||||||
|
peakFrom = NULL;
|
||||||
|
peakTo = NULL;
|
||||||
|
valeFrom = NULL;
|
||||||
|
valeTo = NULL;
|
||||||
|
|
||||||
|
//
|
||||||
|
result = pivot.IsValid();
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
int count = 0;
|
||||||
|
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
|
||||||
|
//
|
||||||
|
// Resistance ...
|
||||||
|
count = pivot.state.CountResistanceZones();
|
||||||
|
if (IsValidSize(count))
|
||||||
|
{
|
||||||
|
//
|
||||||
|
XCResistanceZone *tmp[];
|
||||||
|
Copy(
|
||||||
|
pivot.state.resistanceZones,
|
||||||
|
tmp //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
for (int i = 0; i < count; i++)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
XCResistanceZone *item = tmp[i];
|
||||||
|
|
||||||
|
//
|
||||||
|
if (peakUpper == 0 ||
|
||||||
|
peakUpper < item.Upper())
|
||||||
|
{
|
||||||
|
peakUpper = item.Upper();
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
if (peakLower == 0 ||
|
||||||
|
peakLower > item.Lower())
|
||||||
|
{
|
||||||
|
peakLower = item.Lower();
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
if (!IsValid(peakFrom) ||
|
||||||
|
peakFrom > item.From())
|
||||||
|
{
|
||||||
|
peakFrom = item.From();
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
if (!IsValid(peakTo) ||
|
||||||
|
peakTo < item.To())
|
||||||
|
{
|
||||||
|
peakTo = item.To();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
ArrayFree(tmp);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Supply ...
|
||||||
|
count = pivot.state.CountSupplyZones();
|
||||||
|
if (IsValidSize(count))
|
||||||
|
{
|
||||||
|
//
|
||||||
|
XCSupplyZone *tmp[];
|
||||||
|
Copy(
|
||||||
|
pivot.state.supplyZones,
|
||||||
|
tmp //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
for (int i = 0; i < count; i++)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
XCSupplyZone *item = tmp[i];
|
||||||
|
|
||||||
|
//
|
||||||
|
if (peakUpper == 0 ||
|
||||||
|
peakUpper < item.Upper())
|
||||||
|
{
|
||||||
|
peakUpper = item.Upper();
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
if (peakLower == 0 ||
|
||||||
|
peakLower > item.Lower())
|
||||||
|
{
|
||||||
|
peakLower = item.Lower();
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
if (!IsValid(peakFrom) ||
|
||||||
|
peakFrom > item.From())
|
||||||
|
{
|
||||||
|
peakFrom = item.From();
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
if (!IsValid(peakTo) ||
|
||||||
|
peakTo < item.To())
|
||||||
|
{
|
||||||
|
peakTo = item.To();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
ArrayFree(tmp);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Bearish Order Block ...
|
||||||
|
count = pivot.state.CountBearishOrderBlocks();
|
||||||
|
if (IsValidSize(count))
|
||||||
|
{
|
||||||
|
//
|
||||||
|
XCOrderBlock *tmp[];
|
||||||
|
Copy(
|
||||||
|
pivot.state.bearishOrderBlocks,
|
||||||
|
tmp //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
for (int i = 0; i < count; i++)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
XCOrderBlock *item = tmp[i];
|
||||||
|
|
||||||
|
//
|
||||||
|
if (peakUpper == 0 ||
|
||||||
|
peakUpper < item.Upper())
|
||||||
|
{
|
||||||
|
peakUpper = item.Upper();
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
if (peakLower == 0 ||
|
||||||
|
peakLower > item.Lower())
|
||||||
|
{
|
||||||
|
peakLower = item.Lower();
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
if (!IsValid(peakFrom) ||
|
||||||
|
peakFrom > item.From())
|
||||||
|
{
|
||||||
|
peakFrom = item.From();
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
if (!IsValid(peakTo) ||
|
||||||
|
peakTo < item.To())
|
||||||
|
{
|
||||||
|
peakTo = item.To();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
ArrayFree(tmp);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Bearish Fair Value Gap ...
|
||||||
|
count = pivot.state.CountBearishFairValueGaps();
|
||||||
|
if (IsValidSize(count))
|
||||||
|
{
|
||||||
|
//
|
||||||
|
XCFVG *tmp[];
|
||||||
|
Copy(
|
||||||
|
pivot.state.bearishFairValueGaps,
|
||||||
|
tmp //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
for (int i = 0; i < count; i++)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
XCFVG *item = tmp[i];
|
||||||
|
|
||||||
|
//
|
||||||
|
if (peakUpper == 0 ||
|
||||||
|
peakUpper < item.Upper())
|
||||||
|
{
|
||||||
|
peakUpper = item.Upper();
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
if (peakLower == 0 ||
|
||||||
|
peakLower > item.Lower())
|
||||||
|
{
|
||||||
|
peakLower = item.Lower();
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
if (!IsValid(peakFrom) ||
|
||||||
|
peakFrom > item.From())
|
||||||
|
{
|
||||||
|
peakFrom = item.From();
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
if (!IsValid(peakTo) ||
|
||||||
|
peakTo < item.To())
|
||||||
|
{
|
||||||
|
peakTo = item.To();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
ArrayFree(tmp);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
|
||||||
|
//
|
||||||
|
// Support ...
|
||||||
|
count = pivot.state.CountSupportZones();
|
||||||
|
if (IsValidSize(count))
|
||||||
|
{
|
||||||
|
//
|
||||||
|
XCSupportZone *tmp[];
|
||||||
|
Copy(
|
||||||
|
pivot.state.supportZones,
|
||||||
|
tmp //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
for (int i = 0; i < count; i++)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
XCSupportZone *item = tmp[i];
|
||||||
|
|
||||||
|
//
|
||||||
|
if (valeUpper == 0 ||
|
||||||
|
valeUpper < item.Upper())
|
||||||
|
{
|
||||||
|
valeUpper = item.Upper();
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
if (valeLower == 0 ||
|
||||||
|
valeLower > item.Lower())
|
||||||
|
{
|
||||||
|
valeLower = item.Lower();
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
if (!IsValid(valeFrom) ||
|
||||||
|
valeFrom > item.From())
|
||||||
|
{
|
||||||
|
valeFrom = item.From();
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
if (!IsValid(valeTo) ||
|
||||||
|
valeTo < item.To())
|
||||||
|
{
|
||||||
|
valeTo = item.To();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
ArrayFree(tmp);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Demand ...
|
||||||
|
count = pivot.state.CountDemandZones();
|
||||||
|
if (IsValidSize(count))
|
||||||
|
{
|
||||||
|
//
|
||||||
|
XCDemandZone *tmp[];
|
||||||
|
Copy(
|
||||||
|
pivot.state.demandZones,
|
||||||
|
tmp //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
for (int i = 0; i < count; i++)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
XCDemandZone *item = tmp[i];
|
||||||
|
|
||||||
|
//
|
||||||
|
if (valeUpper == 0 ||
|
||||||
|
valeUpper < item.Upper())
|
||||||
|
{
|
||||||
|
valeUpper = item.Upper();
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
if (valeLower == 0 ||
|
||||||
|
valeLower > item.Lower())
|
||||||
|
{
|
||||||
|
valeLower = item.Lower();
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
if (!IsValid(valeFrom) ||
|
||||||
|
valeFrom > item.From())
|
||||||
|
{
|
||||||
|
valeFrom = item.From();
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
if (!IsValid(valeTo) ||
|
||||||
|
valeTo < item.To())
|
||||||
|
{
|
||||||
|
valeTo = item.To();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
ArrayFree(tmp);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Bullish Order Block ...
|
||||||
|
count = pivot.state.CountBullishOrderBlocks();
|
||||||
|
if (IsValidSize(count))
|
||||||
|
{
|
||||||
|
//
|
||||||
|
XCOrderBlock *tmp[];
|
||||||
|
Copy(
|
||||||
|
pivot.state.bullishOrderBlocks,
|
||||||
|
tmp //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
for (int i = 0; i < count; i++)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
XCOrderBlock *item = tmp[i];
|
||||||
|
|
||||||
|
//
|
||||||
|
if (valeUpper == 0 ||
|
||||||
|
valeUpper < item.Upper())
|
||||||
|
{
|
||||||
|
valeUpper = item.Upper();
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
if (valeLower == 0 ||
|
||||||
|
valeLower > item.Lower())
|
||||||
|
{
|
||||||
|
valeLower = item.Lower();
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
if (!IsValid(valeFrom) ||
|
||||||
|
valeFrom > item.From())
|
||||||
|
{
|
||||||
|
valeFrom = item.From();
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
if (!IsValid(valeTo) ||
|
||||||
|
valeTo < item.To())
|
||||||
|
{
|
||||||
|
valeTo = item.To();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
ArrayFree(tmp);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Bullish Fair Value Gap ...
|
||||||
|
count = pivot.state.CountBullishFairValueGaps();
|
||||||
|
if (IsValidSize(count))
|
||||||
|
{
|
||||||
|
//
|
||||||
|
XCFVG *tmp[];
|
||||||
|
Copy(
|
||||||
|
pivot.state.bullishFairValueGaps,
|
||||||
|
tmp //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
for (int i = 0; i < count; i++)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
XCFVG *item = tmp[i];
|
||||||
|
|
||||||
|
//
|
||||||
|
if (valeUpper == 0 ||
|
||||||
|
valeUpper < item.Upper())
|
||||||
|
{
|
||||||
|
valeUpper = item.Upper();
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
if (valeLower == 0 ||
|
||||||
|
valeLower > item.Lower())
|
||||||
|
{
|
||||||
|
valeLower = item.Lower();
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
if (!IsValid(valeFrom) ||
|
||||||
|
valeFrom > item.From())
|
||||||
|
{
|
||||||
|
valeFrom = item.From();
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
if (!IsValid(valeTo) ||
|
||||||
|
valeTo < item.To())
|
||||||
|
{
|
||||||
|
valeTo = item.To();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
ArrayFree(tmp);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
result = peakUpper > 0 &&
|
||||||
|
peakLower > 0 &&
|
||||||
|
valeUpper > 0 &&
|
||||||
|
valeLower > 0 &&
|
||||||
|
IsValid(peakTo) &&
|
||||||
|
IsValid(valeTo) &&
|
||||||
|
IsValid(peakFrom) &&
|
||||||
|
IsValid(valeFrom) &&
|
||||||
|
peakTo > peakFrom &&
|
||||||
|
valeTo > valeFrom &&
|
||||||
|
peakUpper > peakLower &&
|
||||||
|
valeUpper > valeLower;
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Detect Price Inside Zones ...
|
* Detect Price Inside Zones ...
|
||||||
*
|
*
|
||||||
@@ -9745,14 +10649,14 @@ double CalculateTarget(
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Test Market for Detect Order Block FVG ...
|
* Test Market for Detect Order Block FVG ...
|
||||||
*
|
*
|
||||||
* @param forDir: Direction
|
* @param forDir: Direction
|
||||||
* @param bullishOrderBlocks: Detected Bullish Order Blocks ...
|
* @param bullishOrderBlocks: Detected Bullish Order Blocks ...
|
||||||
* @param bearishOrderBlocks: Detected Bearish Order Blocks ...
|
* @param bearishOrderBlocks: Detected Bearish Order Blocks ...
|
||||||
* @param orderBlockState: Order Block Detection POIState ...
|
* @param orderBlockState: Order Block Detection POIState ...
|
||||||
* @param fairValueGapState: Fair Value Gap Detection POIState ...
|
* @param fairValueGapState: Fair Value Gap Detection POIState ...
|
||||||
* @param barIndex: Bar Index ...
|
* @param barIndex: Bar Index ...
|
||||||
*
|
*
|
||||||
* @return ( bool )
|
* @return ( bool )
|
||||||
*/
|
*/
|
||||||
bool DetectFVGOB(
|
bool DetectFVGOB(
|
||||||
|
|||||||
@@ -426,656 +426,6 @@ class XC121SMCCycleHelper : public XCBase
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Detect Market Structure ...
|
|
||||||
*
|
|
||||||
* @param model: XMarketStructure instance Reference ...
|
|
||||||
*
|
|
||||||
* @return ( bool )
|
|
||||||
*/
|
|
||||||
bool DetectMarketStructure(
|
|
||||||
XMarketStructure &model //
|
|
||||||
)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
bool result = false;
|
|
||||||
|
|
||||||
//
|
|
||||||
model.Clean();
|
|
||||||
|
|
||||||
//
|
|
||||||
int barIndex = 0;
|
|
||||||
|
|
||||||
//
|
|
||||||
string symbol = GetSymbol();
|
|
||||||
ENUM_TIMEFRAMES period = GetPeriod();
|
|
||||||
|
|
||||||
//
|
|
||||||
model.symbol = symbol;
|
|
||||||
model.period = period;
|
|
||||||
|
|
||||||
//
|
|
||||||
int highestPeakIndex = -1;
|
|
||||||
double highestPeakVale = 0;
|
|
||||||
double highestPeak =
|
|
||||||
mX121Helper
|
|
||||||
.xpvHelper
|
|
||||||
.GetHighestPeak(
|
|
||||||
barIndex,
|
|
||||||
highestPeakIndex,
|
|
||||||
highestPeakVale //
|
|
||||||
);
|
|
||||||
|
|
||||||
//
|
|
||||||
int lowestValeIndex = -1;
|
|
||||||
double lowestValePeak = 0;
|
|
||||||
double lowestVale =
|
|
||||||
mX121Helper
|
|
||||||
.xpvHelper
|
|
||||||
.GetLowestVale(
|
|
||||||
barIndex,
|
|
||||||
lowestValeIndex,
|
|
||||||
lowestValePeak //
|
|
||||||
);
|
|
||||||
|
|
||||||
//
|
|
||||||
result = IsValidIndex(highestPeakIndex) &&
|
|
||||||
IsValidIndex(lowestValeIndex);
|
|
||||||
if (!result)
|
|
||||||
{
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
model.bias =
|
|
||||||
highestPeakIndex < lowestValeIndex
|
|
||||||
? X_DIRECTION_BEARISH
|
|
||||||
: highestPeakIndex > lowestValeIndex
|
|
||||||
? X_DIRECTION_BULLISH
|
|
||||||
: X_DIRECTION_NONE;
|
|
||||||
|
|
||||||
//
|
|
||||||
result = HasDirection(model.bias);
|
|
||||||
if (!result)
|
|
||||||
{
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
bool isBullish = IsBullish(model.bias);
|
|
||||||
|
|
||||||
//
|
|
||||||
// Looking for Change Of Character Proved ...
|
|
||||||
|
|
||||||
//
|
|
||||||
// Bullish Bias:
|
|
||||||
// - Price Must Break Up Lowst Vale's Peak;
|
|
||||||
// - Create a Vale Above Lowest Vale's Peak;
|
|
||||||
|
|
||||||
//
|
|
||||||
// Bearish Bias:
|
|
||||||
// - Price Must Breake Down HighestPeak's Vale;
|
|
||||||
// - Create a Peak Under Highest Peak's Vale;
|
|
||||||
|
|
||||||
//
|
|
||||||
// Checking Peak Breake Up ...
|
|
||||||
int lowestValePeakBreakeUpIndex = -1;
|
|
||||||
for (int i = lowestValeIndex; i >= barIndex; i--)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
XOHCL iBar;
|
|
||||||
result = GetBar(iBar, i);
|
|
||||||
if (!result)
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
bool isBreake = IsBarBreak(
|
|
||||||
lowestValePeak,
|
|
||||||
X_DIRECTION_BULLISH,
|
|
||||||
iBar //
|
|
||||||
);
|
|
||||||
if (isBreake)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
lowestValePeakBreakeUpIndex = i;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
bool isValidBreakeUpLowestValePeak = IsValidIndex(lowestValePeakBreakeUpIndex) &&
|
|
||||||
lowestValePeakBreakeUpIndex <= lowestValeIndex;
|
|
||||||
|
|
||||||
//
|
|
||||||
// Checking Vale Breake Down ...
|
|
||||||
int highestPeakValeBreakeDownIndex = -1;
|
|
||||||
for (int i = highestPeakIndex; i >= barIndex; i--)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
XOHCL iBar;
|
|
||||||
result = GetBar(iBar, i);
|
|
||||||
if (!result)
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
bool isBreake = IsBarBreak(
|
|
||||||
highestPeakVale,
|
|
||||||
X_DIRECTION_BEARISH,
|
|
||||||
iBar //
|
|
||||||
);
|
|
||||||
if (isBreake)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
highestPeakValeBreakeDownIndex = i;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
bool isValidBreakeDownHighestPeakVale = IsValidIndex(highestPeakValeBreakeDownIndex) &&
|
|
||||||
highestPeakValeBreakeDownIndex <= highestPeakIndex;
|
|
||||||
//
|
|
||||||
result = isBullish
|
|
||||||
? isValidBreakeUpLowestValePeak
|
|
||||||
: isValidBreakeDownHighestPeakVale;
|
|
||||||
if (!result)
|
|
||||||
{
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Checking Create a Vale above Peak ...
|
|
||||||
int valeAboveLowestValePeakIndex = -1;
|
|
||||||
double valeAboveLowestValePeakPeak = 0;
|
|
||||||
for (int i = lowestValePeakBreakeUpIndex; i >= barIndex; i--)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
double iVale = mX121Helper.xpvHelper.GetVale(i);
|
|
||||||
|
|
||||||
//
|
|
||||||
bool isValid =
|
|
||||||
iVale > 0 &&
|
|
||||||
iVale > lowestValePeak;
|
|
||||||
if (isValid)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
valeAboveLowestValePeakIndex = i;
|
|
||||||
valeAboveLowestValePeakPeak = mX121Helper.xpvHelper.GetPeak(i);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
bool isValidValeAboveLowestValePeak = IsValidIndex(valeAboveLowestValePeakIndex) &&
|
|
||||||
valeAboveLowestValePeakIndex < lowestValePeakBreakeUpIndex;
|
|
||||||
|
|
||||||
//
|
|
||||||
// Checking Create a Peak below Vale ...
|
|
||||||
int peakBelowHighestPeakValeIndex = -1;
|
|
||||||
double peakBelowHighestPeakValeVale = 0;
|
|
||||||
for (int i = highestPeakValeBreakeDownIndex; i >= barIndex; i--)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
double iPeak = mX121Helper.xpvHelper.GetPeak(i);
|
|
||||||
|
|
||||||
//
|
|
||||||
bool isValid =
|
|
||||||
iPeak > 0 &&
|
|
||||||
iPeak < highestPeakVale;
|
|
||||||
if (isValid)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
peakBelowHighestPeakValeIndex = i;
|
|
||||||
peakBelowHighestPeakValeVale = mX121Helper.xpvHelper.GetVale(i);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
bool isValidPeakBelowHighestPeakVale = IsValidIndex(peakBelowHighestPeakValeIndex) &&
|
|
||||||
peakBelowHighestPeakValeIndex < highestPeakValeBreakeDownIndex;
|
|
||||||
|
|
||||||
//
|
|
||||||
result = isBullish ? isValidValeAboveLowestValePeak
|
|
||||||
: isValidPeakBelowHighestPeakVale;
|
|
||||||
if (!result)
|
|
||||||
{
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Now we Have to Detect Valid Peaks and Valid Vales Here ...
|
|
||||||
// based on Detected Range ...
|
|
||||||
|
|
||||||
//
|
|
||||||
XPVPivotPoint iPeakPoint;
|
|
||||||
XPVPivotPoint iValePoint;
|
|
||||||
XPriceZones peakPriceZone;
|
|
||||||
XPriceZones valePriceZone;
|
|
||||||
|
|
||||||
//
|
|
||||||
XPOIState state;
|
|
||||||
mPOIDetector.GetState(
|
|
||||||
state //
|
|
||||||
);
|
|
||||||
|
|
||||||
//
|
|
||||||
int minRepetition = 5;
|
|
||||||
|
|
||||||
//
|
|
||||||
int from =
|
|
||||||
isBullish
|
|
||||||
? valeAboveLowestValePeakIndex
|
|
||||||
: peakBelowHighestPeakValeIndex;
|
|
||||||
for (int i = from; i >= barIndex; i--)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
XOHCL iBar;
|
|
||||||
bool isInited = GetBar(iBar, i);
|
|
||||||
|
|
||||||
//
|
|
||||||
double iPeak = mX121Helper.xpvHelper.GetPeak(i);
|
|
||||||
double iVale = mX121Helper.xpvHelper.GetVale(i);
|
|
||||||
|
|
||||||
//
|
|
||||||
bool hasPeakPriceInsideZone = CalculatePriceInsideZones(
|
|
||||||
peakPriceZone,
|
|
||||||
state,
|
|
||||||
iPeak //
|
|
||||||
);
|
|
||||||
bool hasValePriceInsideZone = CalculatePriceInsideZones(
|
|
||||||
valePriceZone,
|
|
||||||
state,
|
|
||||||
iVale //
|
|
||||||
);
|
|
||||||
|
|
||||||
//
|
|
||||||
if (hasPeakPriceInsideZone)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
// Peak ...
|
|
||||||
if (!iPeakPoint.IsValid())
|
|
||||||
{
|
|
||||||
//
|
|
||||||
// Initialization ...
|
|
||||||
iPeakPoint.value = iPeak;
|
|
||||||
iPeakPoint.repetition = 1;
|
|
||||||
iPeakPoint.type = XPV_PEAK;
|
|
||||||
iPeakPoint.time = iBar.time;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
//
|
|
||||||
if (iPeakPoint.value == iPeak)
|
|
||||||
{
|
|
||||||
iPeakPoint.repetition++;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
//
|
|
||||||
if (iPeakPoint.repetition > minRepetition)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
AddRef(
|
|
||||||
iPeakPoint,
|
|
||||||
model.peaks //
|
|
||||||
);
|
|
||||||
|
|
||||||
//
|
|
||||||
AddRef(
|
|
||||||
peakPriceZone,
|
|
||||||
model.peakPriceZones //
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
iPeakPoint.Clean();
|
|
||||||
peakPriceZone.Clean();
|
|
||||||
iPeakPoint.value = iPeak;
|
|
||||||
iPeakPoint.repetition = 1;
|
|
||||||
iPeakPoint.type = XPV_PEAK;
|
|
||||||
iPeakPoint.time = iBar.time;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
if (hasValePriceInsideZone)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
// Vale ...
|
|
||||||
if (!iValePoint.IsValid())
|
|
||||||
{
|
|
||||||
//
|
|
||||||
// Initialization ...
|
|
||||||
iValePoint.value = iVale;
|
|
||||||
iValePoint.repetition = 1;
|
|
||||||
iValePoint.type = XPV_VALE;
|
|
||||||
iValePoint.time = iBar.time;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
//
|
|
||||||
if (iValePoint.value == iVale)
|
|
||||||
{
|
|
||||||
iValePoint.repetition++;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
//
|
|
||||||
if (iValePoint.repetition > minRepetition)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
AddRef(
|
|
||||||
iValePoint,
|
|
||||||
model.vales //
|
|
||||||
);
|
|
||||||
|
|
||||||
//
|
|
||||||
AddRef(
|
|
||||||
valePriceZone,
|
|
||||||
model.valePriceZones //
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
iValePoint.Clean();
|
|
||||||
valePriceZone.Clean();
|
|
||||||
iValePoint.value = iVale;
|
|
||||||
iValePoint.repetition = 1;
|
|
||||||
iValePoint.type = XPV_VALE;
|
|
||||||
iValePoint.time = iBar.time;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// in Bullish Bias we Looking for Vales Oder ...
|
|
||||||
// in Bearish Bias we Looking for Peaks Oder ...
|
|
||||||
|
|
||||||
//
|
|
||||||
// Bullish Bias Drawn ...
|
|
||||||
if (isBullish)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
result = GetBar(
|
|
||||||
model.lowestValeBar,
|
|
||||||
lowestValeIndex //
|
|
||||||
);
|
|
||||||
if (!result)
|
|
||||||
{
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
if (isValidBreakeUpLowestValePeak)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
result = GetBar(
|
|
||||||
model.lowestValePeakBreakeUpBar,
|
|
||||||
lowestValePeakBreakeUpIndex //
|
|
||||||
);
|
|
||||||
if (!result)
|
|
||||||
{
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
if (isValidValeAboveLowestValePeak)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
result = GetBar(
|
|
||||||
model.valeAboveLowestValePeakBar,
|
|
||||||
valeAboveLowestValePeakIndex //
|
|
||||||
);
|
|
||||||
if (!result)
|
|
||||||
{
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Bearish Bias Drawn ...
|
|
||||||
if (!isBullish)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
result = GetBar(
|
|
||||||
model.highestPeakBar,
|
|
||||||
highestPeakIndex //
|
|
||||||
);
|
|
||||||
if (!result)
|
|
||||||
{
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
if (isValidBreakeDownHighestPeakVale)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
result = GetBar(
|
|
||||||
model.highestPeakValeBreakeDownBar,
|
|
||||||
highestPeakValeBreakeDownIndex //
|
|
||||||
);
|
|
||||||
if (!result)
|
|
||||||
{
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
if (isValidPeakBelowHighestPeakVale)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
result = GetBar(
|
|
||||||
model.peakBelowHighestPeakValeBar,
|
|
||||||
peakBelowHighestPeakValeIndex //
|
|
||||||
);
|
|
||||||
if (!result)
|
|
||||||
{
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
result = model.IsValid();
|
|
||||||
|
|
||||||
//
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Detect Market Structure Method 2 ...
|
|
||||||
*
|
|
||||||
* @param model: XMarketStructure instance Reference ...
|
|
||||||
*
|
|
||||||
* @return ( bool )
|
|
||||||
*/
|
|
||||||
bool DetectMarketStructure(
|
|
||||||
ENUM_X_DIRECTION &dir,
|
|
||||||
int pivotsCount = 3 //
|
|
||||||
)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
bool result = false;
|
|
||||||
|
|
||||||
//
|
|
||||||
int barIndex = 0;
|
|
||||||
|
|
||||||
//
|
|
||||||
if (pivotsCount < 3)
|
|
||||||
{
|
|
||||||
pivotsCount = 3;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
dir = X_DIRECTION_NONE;
|
|
||||||
string symbol = GetSymbol();
|
|
||||||
ENUM_TIMEFRAMES period = GetPeriod();
|
|
||||||
|
|
||||||
//
|
|
||||||
int hpIndex = -1;
|
|
||||||
int hpIndexes[];
|
|
||||||
double hpValues[];
|
|
||||||
|
|
||||||
//
|
|
||||||
int lvIndex = -1;
|
|
||||||
int lvIndexes[];
|
|
||||||
double lvValues[];
|
|
||||||
|
|
||||||
//
|
|
||||||
for (int i = 0; i < pivotsCount; i++)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
hpIndex = barIndex;
|
|
||||||
lvIndex = barIndex;
|
|
||||||
|
|
||||||
//
|
|
||||||
double lastHP = 0;
|
|
||||||
double lastLV = 0;
|
|
||||||
|
|
||||||
//
|
|
||||||
int hpCount = ArraySize(hpIndexes);
|
|
||||||
int lvCount = ArraySize(lvIndexes);
|
|
||||||
|
|
||||||
//
|
|
||||||
if (IsValidSize(hpCount))
|
|
||||||
{
|
|
||||||
//
|
|
||||||
lastHP = hpValues[hpCount - 1];
|
|
||||||
hpIndex = hpIndexes[hpCount - 1];
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
if (IsValidSize(lvCount))
|
|
||||||
{
|
|
||||||
//
|
|
||||||
lastLV = lvValues[lvCount - 1];
|
|
||||||
lvIndex = lvIndexes[lvCount - 1];
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
if (lastHP == 0)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
lastHP = mX121Helper
|
|
||||||
.xpvHelper
|
|
||||||
.GetPeak(hpIndex);
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
if (lastLV == 0)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
lastLV = mX121Helper
|
|
||||||
.xpvHelper
|
|
||||||
.GetVale(lvIndex);
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
int highestPeakIndex = -1;
|
|
||||||
double highesrPeak =
|
|
||||||
mX121Helper
|
|
||||||
.xpvHelper
|
|
||||||
.GetHigherPeak(
|
|
||||||
highestPeakIndex,
|
|
||||||
lastHP,
|
|
||||||
hpIndex //
|
|
||||||
);
|
|
||||||
if (IsValidIndex(highestPeakIndex))
|
|
||||||
{
|
|
||||||
//
|
|
||||||
Add(
|
|
||||||
highestPeakIndex,
|
|
||||||
hpIndexes //
|
|
||||||
);
|
|
||||||
|
|
||||||
//
|
|
||||||
Add(
|
|
||||||
highesrPeak,
|
|
||||||
hpValues //
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
int lowestValeIndex = -1;
|
|
||||||
double lowestVale =
|
|
||||||
mX121Helper
|
|
||||||
.xpvHelper
|
|
||||||
.GetLowerVale(
|
|
||||||
lowestValeIndex,
|
|
||||||
lastLV,
|
|
||||||
lvIndex //
|
|
||||||
);
|
|
||||||
if (IsValidIndex(lowestValeIndex))
|
|
||||||
{
|
|
||||||
//
|
|
||||||
Add(
|
|
||||||
lowestValeIndex,
|
|
||||||
lvIndexes //
|
|
||||||
);
|
|
||||||
|
|
||||||
//
|
|
||||||
Add(
|
|
||||||
lowestVale,
|
|
||||||
lvValues //
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
bool canBreak = ArraySize(hpIndexes) >= pivotsCount ||
|
|
||||||
ArraySize(lvIndexes) >= pivotsCount;
|
|
||||||
if (canBreak)
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
ArrayReverse(hpValues);
|
|
||||||
ArrayReverse(hpIndexes);
|
|
||||||
int countHPs = ArraySize(hpIndexes);
|
|
||||||
|
|
||||||
//
|
|
||||||
ArrayReverse(lvValues);
|
|
||||||
ArrayReverse(lvIndexes);
|
|
||||||
int countLVs = ArraySize(lvIndexes);
|
|
||||||
|
|
||||||
//
|
|
||||||
bool isValidHPs = countHPs >= pivotsCount;
|
|
||||||
bool isValidLVs = countLVs >= pivotsCount;
|
|
||||||
|
|
||||||
//
|
|
||||||
result = isValidHPs ||
|
|
||||||
isValidLVs;
|
|
||||||
if (!result)
|
|
||||||
{
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
if (isValidHPs && isValidLVs)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
hpIndex = hpIndexes[countHPs - 1];
|
|
||||||
lvIndex = lvIndexes[countLVs - 1];
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
dir =
|
|
||||||
!isValidHPs && isValidLVs
|
|
||||||
? X_DIRECTION_BULLISH
|
|
||||||
: !isValidLVs && isValidHPs
|
|
||||||
? X_DIRECTION_BEARISH
|
|
||||||
: hpIndex < lvIndex
|
|
||||||
? X_DIRECTION_BEARISH
|
|
||||||
: lvIndex < hpIndex
|
|
||||||
? X_DIRECTION_BULLISH
|
|
||||||
: X_DIRECTION_ALL;
|
|
||||||
|
|
||||||
//
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Tools ...
|
// Tools ...
|
||||||
|
|
||||||
@@ -1166,91 +516,5 @@ class XC121SMCCycleHelper : public XCBase
|
|||||||
ChartSetInteger(chartId, CHART_COLOR_VOLUME, mVolumesColor);
|
ChartSetInteger(chartId, CHART_COLOR_VOLUME, mVolumesColor);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Fill Pivot Tick Zone ...
|
|
||||||
*
|
|
||||||
* @param pivot: XPVPivot instance Reference ...
|
|
||||||
*/
|
|
||||||
void CalculatePivotTickZone(
|
|
||||||
XPVPivot &pivot //
|
|
||||||
)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
string symbol = GetSymbol();
|
|
||||||
ENUM_TIMEFRAMES period = GetPeriod();
|
|
||||||
|
|
||||||
//
|
|
||||||
bool isInited = false;
|
|
||||||
|
|
||||||
//
|
|
||||||
datetime from = pivot.from;
|
|
||||||
XOHCL iFromBar;
|
|
||||||
int iFromBarIndex = iBarShift(
|
|
||||||
symbol,
|
|
||||||
period,
|
|
||||||
from //
|
|
||||||
);
|
|
||||||
isInited = iFromBar.Init(
|
|
||||||
symbol,
|
|
||||||
period,
|
|
||||||
iFromBarIndex //
|
|
||||||
);
|
|
||||||
if (!isInited)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
datetime to = pivot.to;
|
|
||||||
XOHCL iToBar;
|
|
||||||
int iToBarIndex = iBarShift(
|
|
||||||
symbol,
|
|
||||||
period,
|
|
||||||
to //
|
|
||||||
);
|
|
||||||
isInited = iToBar.Init(
|
|
||||||
symbol,
|
|
||||||
period,
|
|
||||||
iToBarIndex //
|
|
||||||
);
|
|
||||||
if (!isInited)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
if (iFromBarIndex <= iToBarIndex)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
XCTicksZone *iZone;
|
|
||||||
iZone = new XCTicksZone();
|
|
||||||
|
|
||||||
//
|
|
||||||
int ticksLevels = mPOIDetector.TicksRangeZoneLevel();
|
|
||||||
int ticksRange = mPOIDetector.TicksRangeZoneRange();
|
|
||||||
isInited = ticksLevels > 0 &&
|
|
||||||
ticksRange > 0;
|
|
||||||
if (!isInited)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
isInited = iZone.Init(
|
|
||||||
iFromBar,
|
|
||||||
iToBar //
|
|
||||||
);
|
|
||||||
if (!isInited)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
pivot.state.ticksZone = iZone;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
//
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -984,7 +984,7 @@ class XC121SMCExpert : public XCBaseExpert
|
|||||||
|
|
||||||
//
|
//
|
||||||
signal.Clean();
|
signal.Clean();
|
||||||
conditions.Clean();
|
conditions.Clean();
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -2001,11 +2001,17 @@ class XC121SMCExpert : public XCBaseExpert
|
|||||||
//
|
//
|
||||||
string comment = "Guard Close All ...";
|
string comment = "Guard Close All ...";
|
||||||
string message = "Guard Close All (" + ToString(positionsCount) + ") Positions Successfully ...";
|
string message = "Guard Close All (" + ToString(positionsCount) + ") Positions Successfully ...";
|
||||||
mTradeHandler.ForceClose(
|
int forceClosed = mTradeHandler.ForceClose(
|
||||||
positions,
|
positions,
|
||||||
comment,
|
comment,
|
||||||
message //
|
message //
|
||||||
);
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
if (forceClosed)
|
||||||
|
{
|
||||||
|
RestEA(120 * 60);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2040,11 +2046,17 @@ class XC121SMCExpert : public XCBaseExpert
|
|||||||
//
|
//
|
||||||
string comment = "Guard Close Longs ...";
|
string comment = "Guard Close Longs ...";
|
||||||
string message = "Guard Close (" + ToString(longPositionsCount) + ") Long Positions Successfully ...";
|
string message = "Guard Close (" + ToString(longPositionsCount) + ") Long Positions Successfully ...";
|
||||||
mTradeHandler.ForceClose(
|
bool isClosed = mTradeHandler.ForceClose(
|
||||||
longPositions,
|
longPositions,
|
||||||
comment,
|
comment,
|
||||||
message //
|
message //
|
||||||
);
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
if (isClosed)
|
||||||
|
{
|
||||||
|
RestEA(120 * 60);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2079,11 +2091,17 @@ class XC121SMCExpert : public XCBaseExpert
|
|||||||
//
|
//
|
||||||
string comment = "Guard Close Shorts ...";
|
string comment = "Guard Close Shorts ...";
|
||||||
string message = "Guard Close (" + ToString(shortPositionsCount) + ") Short Positions Successfully ...";
|
string message = "Guard Close (" + ToString(shortPositionsCount) + ") Short Positions Successfully ...";
|
||||||
mTradeHandler.ForceClose(
|
bool isClosed = mTradeHandler.ForceClose(
|
||||||
shortPositions,
|
shortPositions,
|
||||||
comment,
|
comment,
|
||||||
message //
|
message //
|
||||||
);
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
if (isClosed)
|
||||||
|
{
|
||||||
|
RestEA(120 * 60);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2114,11 +2132,17 @@ class XC121SMCExpert : public XCBaseExpert
|
|||||||
//
|
//
|
||||||
string comment = "Guard Close ...";
|
string comment = "Guard Close ...";
|
||||||
string message = "Guard Close " + (isLong ? "Long" : "Short") + " Position: (" + ToString(iGuard.ticket) + ") Successfully ...";
|
string message = "Guard Close " + (isLong ? "Long" : "Short") + " Position: (" + ToString(iGuard.ticket) + ") Successfully ...";
|
||||||
mTradeHandler.ForceClose(
|
bool isClosed = mTradeHandler.ForceClose(
|
||||||
positions,
|
positions,
|
||||||
comment,
|
comment,
|
||||||
message //
|
message //
|
||||||
);
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
if (isClosed)
|
||||||
|
{
|
||||||
|
RestEA(120 * 60);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2181,6 +2205,9 @@ class XC121SMCExpert : public XCBaseExpert
|
|||||||
iPosition,
|
iPosition,
|
||||||
comment //
|
comment //
|
||||||
);
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
RestEA(120 * 60);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2238,11 +2265,17 @@ class XC121SMCExpert : public XCBaseExpert
|
|||||||
//
|
//
|
||||||
string comment = "Guard Hedge ...";
|
string comment = "Guard Hedge ...";
|
||||||
string message = "Guard Hedge (" + ToString(count) + ") Positions by: (" + ToString(profits) + ") Successfully ...";
|
string message = "Guard Hedge (" + ToString(count) + ") Positions by: (" + ToString(profits) + ") Successfully ...";
|
||||||
mTradeHandler.ForceClose(
|
bool isClosed = mTradeHandler.ForceClose(
|
||||||
positions,
|
positions,
|
||||||
comment,
|
comment,
|
||||||
message //
|
message //
|
||||||
);
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
if (isClosed)
|
||||||
|
{
|
||||||
|
RestEA(120 * 60);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2335,6 +2368,12 @@ class XC121SMCExpert : public XCBaseExpert
|
|||||||
ArrayFree(guards);
|
ArrayFree(guards);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
void RestEA(int seconds)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -309,35 +309,18 @@ bool DetectX121SMCGuards(
|
|||||||
|
|
||||||
//
|
//
|
||||||
// Trigger ...
|
// Trigger ...
|
||||||
ENUM_X_DIRECTION triggerMarketDir;
|
bool hasTriggerBullishTrend = triggerXConditions.bullishTrendBuffer[1];
|
||||||
bool hasTriggerMarketDir = triggerCycleHelper
|
bool hasTriggerBearishTrend = triggerXConditions.bearishTrendBuffer[1];
|
||||||
.DetectMarketStructure(triggerMarketDir);
|
|
||||||
|
|
||||||
//
|
|
||||||
bool hasTriggerBullishTrend =
|
|
||||||
hasTriggerMarketDir &&
|
|
||||||
IsBullish(triggerMarketDir);
|
|
||||||
|
|
||||||
//
|
|
||||||
bool hasTriggerBearishTrend =
|
|
||||||
hasTriggerMarketDir &&
|
|
||||||
IsBearish(triggerMarketDir);
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Decision ...
|
// Decision ...
|
||||||
ENUM_X_DIRECTION decisionMarketDir;
|
bool hasDecisionBullishTrend = decisionXConditions.bullishTrendBuffer[1];
|
||||||
bool hasDecisionMarketDir = decisionCycleHelper
|
bool hasDecisionBearishTrend = decisionXConditions.bearishTrendBuffer[1];
|
||||||
.DetectMarketStructure(decisionMarketDir);
|
|
||||||
|
|
||||||
//
|
//
|
||||||
bool hasDecisionBullishTrend =
|
// Analyse ...
|
||||||
hasDecisionMarketDir &&
|
bool hasAnalyseBullishTrend = analyseXConditions.bullishTrendBuffer[1];
|
||||||
IsBullish(decisionMarketDir);
|
bool hasAnalyseBearishTrend = analyseXConditions.bearishTrendBuffer[1];
|
||||||
|
|
||||||
//
|
|
||||||
bool hasDecisionBearishTrend =
|
|
||||||
hasDecisionMarketDir &&
|
|
||||||
IsBearish(decisionMarketDir);
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Consolidation Zone ...
|
// Consolidation Zone ...
|
||||||
@@ -884,6 +867,9 @@ bool DetectX121SMCGuards(
|
|||||||
iGuard.provider = provider;
|
iGuard.provider = provider;
|
||||||
iGuard.action = X_121_SMC_GUARD_ACTION_CLOSE;
|
iGuard.action = X_121_SMC_GUARD_ACTION_CLOSE;
|
||||||
|
|
||||||
|
//
|
||||||
|
iGuard.ticket = iPosition.ticket;
|
||||||
|
|
||||||
//
|
//
|
||||||
AddGuard(
|
AddGuard(
|
||||||
iGuard,
|
iGuard,
|
||||||
@@ -892,6 +878,92 @@ bool DetectX121SMCGuards(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
if (hasLongs)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool hasGuard = hasDecisionBearishTrend;
|
||||||
|
|
||||||
|
//
|
||||||
|
if (hasGuard)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
for (int i = 0; i < longsCount; i++)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
XPosition iPosition = ownLongPositions[i];
|
||||||
|
|
||||||
|
//
|
||||||
|
// Position must be in Draw Down ...
|
||||||
|
if (iPosition.profit > 0)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
X121SMCGuard iGuard;
|
||||||
|
|
||||||
|
//
|
||||||
|
iGuard.time = cTime;
|
||||||
|
iGuard.symbol = symbol;
|
||||||
|
iGuard.provider = provider;
|
||||||
|
iGuard.action = X_121_SMC_GUARD_ACTION_CLOSE;
|
||||||
|
|
||||||
|
//
|
||||||
|
iGuard.ticket = iPosition.ticket;
|
||||||
|
|
||||||
|
//
|
||||||
|
AddGuard(
|
||||||
|
iGuard,
|
||||||
|
guards //
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
if (hasShorts)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool hasGuard = hasDecisionBullishTrend;
|
||||||
|
|
||||||
|
//
|
||||||
|
if (hasGuard)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
for (int i = 0; i < shortsCount; i++)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
XPosition iPosition = ownShortPositions[i];
|
||||||
|
|
||||||
|
//
|
||||||
|
// Position must be in Draw Down ...
|
||||||
|
if (iPosition.profit > 0)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
X121SMCGuard iGuard;
|
||||||
|
|
||||||
|
//
|
||||||
|
iGuard.time = cTime;
|
||||||
|
iGuard.symbol = symbol;
|
||||||
|
iGuard.provider = provider;
|
||||||
|
iGuard.action = X_121_SMC_GUARD_ACTION_CLOSE;
|
||||||
|
|
||||||
|
//
|
||||||
|
iGuard.ticket = iPosition.ticket;
|
||||||
|
|
||||||
|
//
|
||||||
|
AddGuard(
|
||||||
|
iGuard,
|
||||||
|
guards //
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Close All ...
|
// Close All ...
|
||||||
|
|
||||||
@@ -931,6 +1003,7 @@ bool DetectX121SMCGuards(
|
|||||||
//
|
//
|
||||||
bool hasGuard =
|
bool hasGuard =
|
||||||
//
|
//
|
||||||
|
hasAnalyseBearishTrend &&
|
||||||
hasDecisionBearishTrend
|
hasDecisionBearishTrend
|
||||||
//
|
//
|
||||||
;
|
;
|
||||||
@@ -962,6 +1035,7 @@ bool DetectX121SMCGuards(
|
|||||||
//
|
//
|
||||||
bool hasGuard =
|
bool hasGuard =
|
||||||
//
|
//
|
||||||
|
hasAnalyseBullishTrend &&
|
||||||
hasDecisionBullishTrend
|
hasDecisionBullishTrend
|
||||||
//
|
//
|
||||||
;
|
;
|
||||||
@@ -998,20 +1072,6 @@ bool DetectX121SMCGuards(
|
|||||||
hasTriggerBearishTrend ||
|
hasTriggerBearishTrend ||
|
||||||
!hasDecisionBullishTrend
|
!hasDecisionBullishTrend
|
||||||
//
|
//
|
||||||
// (hasAnalysePriceZone &&
|
|
||||||
// isAnalysePriceZoneBearish &&
|
|
||||||
// isAnalysePriceZoneValidForPeak &&
|
|
||||||
// (isAnalysePriceZoneUpperRejected ||
|
|
||||||
// isAnalysePriceZoneLowerBreakedDown))
|
|
||||||
// //
|
|
||||||
// ||
|
|
||||||
// //
|
|
||||||
// (hasVerificationPriceZone &&
|
|
||||||
// isVerificationPriceZoneBearish &&
|
|
||||||
// isVerificationPriceZoneValidForPeak &&
|
|
||||||
// (isVerificationPriceZoneUpperRejected ||
|
|
||||||
// isVerificationPriceZoneLowerBreakedDown))
|
|
||||||
//
|
|
||||||
;
|
;
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -1054,20 +1114,6 @@ bool DetectX121SMCGuards(
|
|||||||
hasTriggerBullishTrend ||
|
hasTriggerBullishTrend ||
|
||||||
!hasDecisionBearishTrend
|
!hasDecisionBearishTrend
|
||||||
//
|
//
|
||||||
// (hasAnalysePriceZone &&
|
|
||||||
// isAnalysePriceZoneBullish &&
|
|
||||||
// isAnalysePriceZoneValidForVale &&
|
|
||||||
// (isAnalysePriceZoneLowerRejected ||
|
|
||||||
// isAnalysePriceZoneUpperBreakedUp))
|
|
||||||
// //
|
|
||||||
// ||
|
|
||||||
// //
|
|
||||||
// (hasVerificationPriceZone &&
|
|
||||||
// isVerificationPriceZoneBullish &&
|
|
||||||
// isVerificationPriceZoneValidForVale &&
|
|
||||||
// (isVerificationPriceZoneLowerRejected ||
|
|
||||||
// isVerificationPriceZoneUpperBreakedUp))
|
|
||||||
//
|
|
||||||
;
|
;
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -1107,6 +1153,9 @@ bool DetectX121SMCGuards(
|
|||||||
//
|
//
|
||||||
if (hasLongs)
|
if (hasLongs)
|
||||||
{
|
{
|
||||||
|
//
|
||||||
|
bool hasTrendGuard = hasDecisionBearishTrend;
|
||||||
|
|
||||||
//
|
//
|
||||||
bool hasConsolidationGuard =
|
bool hasConsolidationGuard =
|
||||||
(hasConsolidationZone &&
|
(hasConsolidationZone &&
|
||||||
@@ -1137,6 +1186,7 @@ bool DetectX121SMCGuards(
|
|||||||
//
|
//
|
||||||
bool hasGuard =
|
bool hasGuard =
|
||||||
//
|
//
|
||||||
|
hasTrendGuard ||
|
||||||
hasConsolidationGuard ||
|
hasConsolidationGuard ||
|
||||||
hasDecisionPriceZoneGuard ||
|
hasDecisionPriceZoneGuard ||
|
||||||
hasAnalysePriceZoneGuard ||
|
hasAnalysePriceZoneGuard ||
|
||||||
@@ -1172,6 +1222,12 @@ bool DetectX121SMCGuards(
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
if (hasTrendGuard)
|
||||||
|
{
|
||||||
|
guardStop = decisionXConditions.strBuffer[1] - decisionXConditions.atrBuffer[1];
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Price Must Greater than Zone Lower ...
|
// Price Must Greater than Zone Lower ...
|
||||||
if (iPosition.price < guardStop)
|
if (iPosition.price < guardStop)
|
||||||
@@ -1203,11 +1259,9 @@ bool DetectX121SMCGuards(
|
|||||||
iGuard.provider = provider;
|
iGuard.provider = provider;
|
||||||
iGuard.action = X_121_SMC_GUARD_ACTION_TRAIL_STOP;
|
iGuard.action = X_121_SMC_GUARD_ACTION_TRAIL_STOP;
|
||||||
|
|
||||||
//
|
|
||||||
iGuard.ticket = iPosition.ticket;
|
|
||||||
|
|
||||||
//
|
//
|
||||||
iGuard.sl = guardStop;
|
iGuard.sl = guardStop;
|
||||||
|
iGuard.ticket = iPosition.ticket;
|
||||||
|
|
||||||
//
|
//
|
||||||
AddGuard(
|
AddGuard(
|
||||||
@@ -1221,6 +1275,9 @@ bool DetectX121SMCGuards(
|
|||||||
//
|
//
|
||||||
if (hasShorts)
|
if (hasShorts)
|
||||||
{
|
{
|
||||||
|
//
|
||||||
|
bool hasTrendGuard = hasDecisionBullishTrend;
|
||||||
|
|
||||||
//
|
//
|
||||||
bool hasConsolidationGuard =
|
bool hasConsolidationGuard =
|
||||||
(hasConsolidationZone &&
|
(hasConsolidationZone &&
|
||||||
@@ -1251,6 +1308,7 @@ bool DetectX121SMCGuards(
|
|||||||
//
|
//
|
||||||
bool hasGuard =
|
bool hasGuard =
|
||||||
//
|
//
|
||||||
|
hasTrendGuard ||
|
||||||
hasConsolidationGuard ||
|
hasConsolidationGuard ||
|
||||||
hasDecisionPriceZoneGuard ||
|
hasDecisionPriceZoneGuard ||
|
||||||
hasAnalysePriceZoneGuard ||
|
hasAnalysePriceZoneGuard ||
|
||||||
@@ -1286,6 +1344,12 @@ bool DetectX121SMCGuards(
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
if (hasTrendGuard)
|
||||||
|
{
|
||||||
|
guardStop = decisionXConditions.strBuffer[1] + decisionXConditions.atrBuffer[1];
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Price Must Lesser than Zone Upper ...
|
// Price Must Lesser than Zone Upper ...
|
||||||
if (iPosition.price > guardStop)
|
if (iPosition.price > guardStop)
|
||||||
@@ -1317,11 +1381,9 @@ bool DetectX121SMCGuards(
|
|||||||
iGuard.provider = provider;
|
iGuard.provider = provider;
|
||||||
iGuard.action = X_121_SMC_GUARD_ACTION_TRAIL_STOP;
|
iGuard.action = X_121_SMC_GUARD_ACTION_TRAIL_STOP;
|
||||||
|
|
||||||
//
|
|
||||||
iGuard.ticket = iPosition.ticket;
|
|
||||||
|
|
||||||
//
|
//
|
||||||
iGuard.sl = guardStop;
|
iGuard.sl = guardStop;
|
||||||
|
iGuard.ticket = iPosition.ticket;
|
||||||
|
|
||||||
//
|
//
|
||||||
AddGuard(
|
AddGuard(
|
||||||
@@ -1397,11 +1459,9 @@ bool DetectX121SMCGuards(
|
|||||||
iGuard.provider = provider;
|
iGuard.provider = provider;
|
||||||
iGuard.action = X_121_SMC_GUARD_ACTION_TRAIL_TARGET;
|
iGuard.action = X_121_SMC_GUARD_ACTION_TRAIL_TARGET;
|
||||||
|
|
||||||
//
|
|
||||||
iGuard.ticket = iPosition.ticket;
|
|
||||||
|
|
||||||
//
|
//
|
||||||
iGuard.tp = guardTP;
|
iGuard.tp = guardTP;
|
||||||
|
iGuard.ticket = iPosition.ticket;
|
||||||
|
|
||||||
//
|
//
|
||||||
AddGuard(
|
AddGuard(
|
||||||
@@ -1474,11 +1534,9 @@ bool DetectX121SMCGuards(
|
|||||||
iGuard.provider = provider;
|
iGuard.provider = provider;
|
||||||
iGuard.action = X_121_SMC_GUARD_ACTION_TRAIL_TARGET;
|
iGuard.action = X_121_SMC_GUARD_ACTION_TRAIL_TARGET;
|
||||||
|
|
||||||
//
|
|
||||||
iGuard.ticket = iPosition.ticket;
|
|
||||||
|
|
||||||
//
|
//
|
||||||
iGuard.tp = guardTP;
|
iGuard.tp = guardTP;
|
||||||
|
iGuard.ticket = iPosition.ticket;
|
||||||
|
|
||||||
//
|
//
|
||||||
AddGuard(
|
AddGuard(
|
||||||
|
|||||||
@@ -414,67 +414,31 @@ bool DetectX121SMCXPZSiganlSetup(
|
|||||||
|
|
||||||
//
|
//
|
||||||
// Consolidation ...
|
// Consolidation ...
|
||||||
ENUM_X_DIRECTION consolidationMarketDir;
|
|
||||||
bool hasConsolidationMarketDir = consolidationCycleHelper
|
|
||||||
.DetectMarketStructure(consolidationMarketDir);
|
|
||||||
|
|
||||||
//
|
//
|
||||||
bool hasConsolidationBullishTrend =
|
if (decisionXConditions.isTrendSwirchedToBearish)
|
||||||
hasConsolidationMarketDir &&
|
{
|
||||||
IsBullish(consolidationMarketDir);
|
Print("Trend Switced To Bearish ...");
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
bool hasConsolidationBearishTrend =
|
bool hasConsolidationBullishTrend = consolidationXConditions.isTrendBullish;
|
||||||
hasConsolidationMarketDir &&
|
bool hasConsolidationBearishTrend = consolidationXConditions.isTrendBearish;
|
||||||
IsBearish(consolidationMarketDir);
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Verification ...
|
// Verification ...
|
||||||
ENUM_X_DIRECTION verificationMarketDir;
|
bool hasVerificationBullishTrend = verificationXConditions.isTrendBullish;
|
||||||
bool hasVerificationMarketDir = verificationCycleHelper
|
bool hasVerificationBearishTrend = verificationXConditions.isTrendBearish;
|
||||||
.DetectMarketStructure(verificationMarketDir);
|
|
||||||
|
|
||||||
//
|
|
||||||
bool hasVerificationBullishTrend =
|
|
||||||
hasVerificationMarketDir &&
|
|
||||||
IsBullish(verificationMarketDir);
|
|
||||||
|
|
||||||
//
|
|
||||||
bool hasVerificationBearishTrend =
|
|
||||||
hasVerificationMarketDir &&
|
|
||||||
IsBearish(verificationMarketDir);
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Analyse ...
|
// Analyse ...
|
||||||
ENUM_X_DIRECTION analyseMarketDir;
|
bool hasAnalyseBullishTrend = analyseXConditions.isTrendBullish;
|
||||||
bool hasAnalyseMarketDir = analyseCycleHelper
|
bool hasAnalyseBearishTrend = analyseXConditions.isTrendBearish;
|
||||||
.DetectMarketStructure(analyseMarketDir);
|
|
||||||
|
|
||||||
//
|
|
||||||
bool hasAnalyseBullishTrend =
|
|
||||||
hasAnalyseMarketDir &&
|
|
||||||
IsBullish(analyseMarketDir);
|
|
||||||
|
|
||||||
//
|
|
||||||
bool hasAnalyseBearishTrend =
|
|
||||||
hasAnalyseMarketDir &&
|
|
||||||
IsBearish(analyseMarketDir);
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Decision ...
|
// Decision ...
|
||||||
ENUM_X_DIRECTION decisionMarketDir;
|
bool hasDecisionBullishTrend = decisionXConditions.isTrendBullish;
|
||||||
bool hasDecisionMarketDir = decisionCycleHelper
|
bool hasDecisionBearishTrend = decisionXConditions.isTrendBearish;
|
||||||
.DetectMarketStructure(decisionMarketDir);
|
|
||||||
|
|
||||||
//
|
|
||||||
bool hasDecisionBullishTrend =
|
|
||||||
hasDecisionMarketDir &&
|
|
||||||
IsBullish(decisionMarketDir);
|
|
||||||
|
|
||||||
//
|
|
||||||
bool hasDecisionBearishTrend =
|
|
||||||
hasDecisionMarketDir &&
|
|
||||||
IsBearish(decisionMarketDir);
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Detect Bar State ...
|
// Detect Bar State ...
|
||||||
|
|||||||
@@ -33,7 +33,8 @@ enum ENUM_X121_SMC_XRSPVI_CONDITIONS
|
|||||||
X121_SMC_XRSPVI_CONDITION_1,
|
X121_SMC_XRSPVI_CONDITION_1,
|
||||||
X121_SMC_XRSPVI_CONDITION_2,
|
X121_SMC_XRSPVI_CONDITION_2,
|
||||||
X121_SMC_XRSPVI_CONDITION_3,
|
X121_SMC_XRSPVI_CONDITION_3,
|
||||||
X121_SMC_XRSPVI_CONDITION_4
|
X121_SMC_XRSPVI_CONDITION_4,
|
||||||
|
X121_SMC_XRSPVI_CONDITION_5,
|
||||||
};
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -70,6 +71,7 @@ struct X121SMCStrategyXRSPVISignalConditions
|
|||||||
bool isPriceZoneValidForVale;
|
bool isPriceZoneValidForVale;
|
||||||
|
|
||||||
//
|
//
|
||||||
|
XPVPivot pivotZone;
|
||||||
XConsolidationZone consolidationZone;
|
XConsolidationZone consolidationZone;
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -194,6 +196,7 @@ struct X121SMCStrategyXRSPVISignalConditions
|
|||||||
point = 0;
|
point = 0;
|
||||||
|
|
||||||
//
|
//
|
||||||
|
pivotZone.Clean();
|
||||||
priceZone.Clean();
|
priceZone.Clean();
|
||||||
consolidationZone.Clean();
|
consolidationZone.Clean();
|
||||||
isPriceZoneValidForPeak = false;
|
isPriceZoneValidForPeak = false;
|
||||||
@@ -214,6 +217,13 @@ X121SMCStrategyXRSPVISignalConditions mXRSPVIConditionsCollection[];
|
|||||||
//
|
//
|
||||||
// Extension Functions ...
|
// Extension Functions ...
|
||||||
|
|
||||||
|
//
|
||||||
|
double X121SMCXRSPVIPivotPeak;
|
||||||
|
double X121SMCXRSPVIPivotVale;
|
||||||
|
datetime X121SMCXRSPVIPivotEnd;
|
||||||
|
datetime X121SMCXRSPVIPivotStart;
|
||||||
|
ENUM_XPV_PIVOTS X121SMCXRSPVIPivotType = XPV_NONE;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Detect Setup Conditions ...
|
// Detect Setup Conditions ...
|
||||||
bool DetectX121SMCXRSPVISiganlSetup(
|
bool DetectX121SMCXRSPVISiganlSetup(
|
||||||
@@ -435,67 +445,25 @@ bool DetectX121SMCXRSPVISiganlSetup(
|
|||||||
|
|
||||||
//
|
//
|
||||||
// Consolidation ...
|
// Consolidation ...
|
||||||
ENUM_X_DIRECTION consolidationMarketDir;
|
|
||||||
bool hasConsolidationMarketDir = consolidationCycleHelper
|
|
||||||
.DetectMarketStructure(consolidationMarketDir);
|
|
||||||
|
|
||||||
//
|
//
|
||||||
bool hasConsolidationBullishTrend =
|
bool hasConsolidationBullishTrend = consolidationXConditions.isTrendBullish;
|
||||||
hasConsolidationMarketDir &&
|
bool hasConsolidationBearishTrend = consolidationXConditions.isTrendBearish;
|
||||||
IsBullish(consolidationMarketDir);
|
|
||||||
|
|
||||||
//
|
|
||||||
bool hasConsolidationBearishTrend =
|
|
||||||
hasConsolidationMarketDir &&
|
|
||||||
IsBearish(consolidationMarketDir);
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Verification ...
|
// Verification ...
|
||||||
ENUM_X_DIRECTION verificationMarketDir;
|
bool hasVerificationBullishTrend = verificationXConditions.isTrendBullish;
|
||||||
bool hasVerificationMarketDir = verificationCycleHelper
|
bool hasVerificationBearishTrend = verificationXConditions.isTrendBearish;
|
||||||
.DetectMarketStructure(verificationMarketDir);
|
|
||||||
|
|
||||||
//
|
|
||||||
bool hasVerificationBullishTrend =
|
|
||||||
hasVerificationMarketDir &&
|
|
||||||
IsBullish(verificationMarketDir);
|
|
||||||
|
|
||||||
//
|
|
||||||
bool hasVerificationBearishTrend =
|
|
||||||
hasVerificationMarketDir &&
|
|
||||||
IsBearish(verificationMarketDir);
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Analyse ...
|
// Analyse ...
|
||||||
ENUM_X_DIRECTION analyseMarketDir;
|
bool hasAnalyseBullishTrend = analyseXConditions.isTrendBullish;
|
||||||
bool hasAnalyseMarketDir = analyseCycleHelper
|
bool hasAnalyseBearishTrend = analyseXConditions.isTrendBearish;
|
||||||
.DetectMarketStructure(analyseMarketDir);
|
|
||||||
|
|
||||||
//
|
|
||||||
bool hasAnalyseBullishTrend =
|
|
||||||
hasAnalyseMarketDir &&
|
|
||||||
IsBullish(analyseMarketDir);
|
|
||||||
|
|
||||||
//
|
|
||||||
bool hasAnalyseBearishTrend =
|
|
||||||
hasAnalyseMarketDir &&
|
|
||||||
IsBearish(analyseMarketDir);
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Decision ...
|
// Decision ...
|
||||||
ENUM_X_DIRECTION decisionMarketDir;
|
bool hasDecisionBullishTrend = decisionXConditions.isTrendBullish;
|
||||||
bool hasDecisionMarketDir = decisionCycleHelper
|
bool hasDecisionBearishTrend = decisionXConditions.isTrendBearish;
|
||||||
.DetectMarketStructure(decisionMarketDir);
|
|
||||||
|
|
||||||
//
|
|
||||||
bool hasDecisionBullishTrend =
|
|
||||||
hasDecisionMarketDir &&
|
|
||||||
IsBullish(decisionMarketDir);
|
|
||||||
|
|
||||||
//
|
|
||||||
bool hasDecisionBearishTrend =
|
|
||||||
hasDecisionMarketDir &&
|
|
||||||
IsBearish(decisionMarketDir);
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Detect Bar State ...
|
// Detect Bar State ...
|
||||||
@@ -614,6 +582,8 @@ bool DetectX121SMCXRSPVISiganlSetup(
|
|||||||
bool isDecisionPriceZoneBearish = false;
|
bool isDecisionPriceZoneBearish = false;
|
||||||
bool isDecisionPriceZoneValidForPeak = false;
|
bool isDecisionPriceZoneValidForPeak = false;
|
||||||
bool isDecisionPriceZoneValidForVale = false;
|
bool isDecisionPriceZoneValidForVale = false;
|
||||||
|
|
||||||
|
//
|
||||||
if (hasDecisionPriceZone)
|
if (hasDecisionPriceZone)
|
||||||
{
|
{
|
||||||
//
|
//
|
||||||
@@ -660,6 +630,8 @@ bool DetectX121SMCXRSPVISiganlSetup(
|
|||||||
bool isAnalysePriceZoneBearish = false;
|
bool isAnalysePriceZoneBearish = false;
|
||||||
bool isAnalysePriceZoneValidForPeak = false;
|
bool isAnalysePriceZoneValidForPeak = false;
|
||||||
bool isAnalysePriceZoneValidForVale = false;
|
bool isAnalysePriceZoneValidForVale = false;
|
||||||
|
|
||||||
|
//
|
||||||
if (hasAnalysePriceZone)
|
if (hasAnalysePriceZone)
|
||||||
{
|
{
|
||||||
//
|
//
|
||||||
@@ -706,6 +678,8 @@ bool DetectX121SMCXRSPVISiganlSetup(
|
|||||||
bool isVerificationPriceZoneBearish = false;
|
bool isVerificationPriceZoneBearish = false;
|
||||||
bool isVerificationPriceZoneValidForPeak = false;
|
bool isVerificationPriceZoneValidForPeak = false;
|
||||||
bool isVerificationPriceZoneValidForVale = false;
|
bool isVerificationPriceZoneValidForVale = false;
|
||||||
|
|
||||||
|
//
|
||||||
if (hasVerificationPriceZone)
|
if (hasVerificationPriceZone)
|
||||||
{
|
{
|
||||||
//
|
//
|
||||||
@@ -890,6 +864,314 @@ bool DetectX121SMCXRSPVISiganlSetup(
|
|||||||
//
|
//
|
||||||
;
|
;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Detect PV Pivot ...
|
||||||
|
|
||||||
|
//
|
||||||
|
bool isPivotPeakZoneRejected = false;
|
||||||
|
bool isPivotPeakZoneBreakedUp = false;
|
||||||
|
bool isPivotPeakZoneBreakedDown = false;
|
||||||
|
bool isPivotValeZoneRejected = false;
|
||||||
|
bool isPivotValeZoneBreakedUp = false;
|
||||||
|
bool isPivotValeZoneBreakedDown = false;
|
||||||
|
bool hasPivot = conditions.pivotZone.IsValid();
|
||||||
|
if (!hasPivot)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
hasPivot = IsValid(X121SMCXRSPVIPivotStart);
|
||||||
|
if (!hasPivot)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool isNewVale = decisionXConditions.isNewVale;
|
||||||
|
bool isNewValeOverLast = decisionXConditions.isNewValeOverLast;
|
||||||
|
bool isNewValeUnderLast = decisionXConditions.isNewValeUnderLast;
|
||||||
|
bool isSameVales = decisionXConditions.valesBuffer[1] ==
|
||||||
|
decisionXConditions.valesBuffer[2] &&
|
||||||
|
decisionXConditions.valesBuffer[2] ==
|
||||||
|
decisionXConditions.valesBuffer[3];
|
||||||
|
bool isSameCycleVales = decisionXConditions.valesBuffer[1] ==
|
||||||
|
analyseXConditions.valesBuffer[1] &&
|
||||||
|
analyseXConditions.valesBuffer[1] ==
|
||||||
|
verificationXConditions.valesBuffer[1];
|
||||||
|
|
||||||
|
//
|
||||||
|
bool isNewPeak = decisionXConditions.isNewPeak;
|
||||||
|
bool isNewPeakOverLast = decisionXConditions.isNewPeakOverLast;
|
||||||
|
bool isNewPeakUnderLast = decisionXConditions.isNewPeakUnderLast;
|
||||||
|
bool isSamePeaks = decisionXConditions.peaksBuffer[1] ==
|
||||||
|
decisionXConditions.peaksBuffer[2] &&
|
||||||
|
decisionXConditions.peaksBuffer[2] ==
|
||||||
|
decisionXConditions.peaksBuffer[3];
|
||||||
|
bool isSameCyclePeaks = decisionXConditions.peaksBuffer[1] ==
|
||||||
|
analyseXConditions.peaksBuffer[1] &&
|
||||||
|
analyseXConditions.peaksBuffer[1] ==
|
||||||
|
verificationXConditions.peaksBuffer[1];
|
||||||
|
|
||||||
|
//
|
||||||
|
bool isValeStart =
|
||||||
|
// isSameVales;
|
||||||
|
isSameVales &&
|
||||||
|
isSameCycleVales;
|
||||||
|
bool isPeakStart =
|
||||||
|
// isSamePeaks;
|
||||||
|
isSamePeaks &&
|
||||||
|
isSameCyclePeaks;
|
||||||
|
|
||||||
|
//
|
||||||
|
bool isStart = isPeakStart ||
|
||||||
|
isValeStart;
|
||||||
|
if (isStart)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
X121SMCXRSPVIPivotStart = cTime;
|
||||||
|
X121SMCXRSPVIPivotType =
|
||||||
|
isPeakStart
|
||||||
|
? XPV_PEAK
|
||||||
|
: XPV_VALE;
|
||||||
|
|
||||||
|
//
|
||||||
|
X121SMCXRSPVIPivotPeak = decisionXConditions.peaksBuffer[1];
|
||||||
|
X121SMCXRSPVIPivotVale = decisionXConditions.valesBuffer[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
hasPivot = IsValid(X121SMCXRSPVIPivotStart);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Create XPVPivot instance ...
|
||||||
|
if (hasPivot)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
conditions.pivotZone.symbol = symbol;
|
||||||
|
conditions.pivotZone.period = period;
|
||||||
|
|
||||||
|
//
|
||||||
|
conditions.pivotZone.to = cTime;
|
||||||
|
conditions.pivotZone.repetition = 3;
|
||||||
|
|
||||||
|
//
|
||||||
|
conditions.pivotZone.upper = X121SMCXRSPVIPivotPeak;
|
||||||
|
conditions.pivotZone.lower = X121SMCXRSPVIPivotVale;
|
||||||
|
|
||||||
|
//
|
||||||
|
conditions.pivotZone.type = X121SMCXRSPVIPivotType;
|
||||||
|
conditions.pivotZone.from = X121SMCXRSPVIPivotStart;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
if (hasPivot)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool isBreaked = X121SMCXRSPVIPivotType == XPV_PEAK
|
||||||
|
? decisionXConditions.isBreakedUpPrevPeak
|
||||||
|
: decisionXConditions.isBreakedDownPrevVale;
|
||||||
|
|
||||||
|
//
|
||||||
|
if (!isBreaked)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
X121SMCXRSPVIPivotPeak = decisionXConditions.peaksBuffer[1];
|
||||||
|
X121SMCXRSPVIPivotVale = decisionXConditions.valesBuffer[1];
|
||||||
|
|
||||||
|
//
|
||||||
|
conditions.pivotZone.to = cTime;
|
||||||
|
conditions.pivotZone.repetition++;
|
||||||
|
conditions.pivotZone.upper = X121SMCXRSPVIPivotPeak;
|
||||||
|
conditions.pivotZone.lower = X121SMCXRSPVIPivotVale;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//
|
||||||
|
X121SMCXRSPVIPivotEnd = cTime;
|
||||||
|
conditions.pivotZone.to = cTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Fill Pivot State ...
|
||||||
|
|
||||||
|
//
|
||||||
|
XPOIState analysePivotState;
|
||||||
|
DetectPivotPOIs(
|
||||||
|
conditions.pivotZone,
|
||||||
|
analyseState,
|
||||||
|
analysePivotState //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
XPOIState decisionPivotState;
|
||||||
|
DetectPivotPOIs(
|
||||||
|
conditions.pivotZone,
|
||||||
|
decisionState,
|
||||||
|
decisionPivotState //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Combine two State ...
|
||||||
|
XPOIState combinedPivotState;
|
||||||
|
XPOIState iStates[];
|
||||||
|
AddRef(
|
||||||
|
analysePivotState,
|
||||||
|
iStates //
|
||||||
|
);
|
||||||
|
AddRef(
|
||||||
|
decisionPivotState,
|
||||||
|
iStates //
|
||||||
|
);
|
||||||
|
CombineStates(
|
||||||
|
combinedPivotState,
|
||||||
|
iStates //
|
||||||
|
);
|
||||||
|
combinedPivotState = decisionPivotState;
|
||||||
|
|
||||||
|
//
|
||||||
|
ArrayFree(iStates);
|
||||||
|
|
||||||
|
//
|
||||||
|
combinedPivotState.time = decisionPivotState.time;
|
||||||
|
combinedPivotState.symbol = decisionPivotState.symbol;
|
||||||
|
combinedPivotState.period = decisionPivotState.period;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Hold Only Areas Which on Upper or Lower bondary of Pivot Zone ...
|
||||||
|
FilterPivotState(
|
||||||
|
conditions.pivotZone,
|
||||||
|
combinedPivotState //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
conditions.pivotZone.state = combinedPivotState;
|
||||||
|
|
||||||
|
//
|
||||||
|
double peakUpper = 0;
|
||||||
|
double peakLower = 0;
|
||||||
|
double valeUpper = 0;
|
||||||
|
double valeLower = 0;
|
||||||
|
|
||||||
|
//
|
||||||
|
datetime peakTo = NULL;
|
||||||
|
datetime valeTo = NULL;
|
||||||
|
datetime peakFrom = NULL;
|
||||||
|
datetime valeFrom = NULL;
|
||||||
|
|
||||||
|
//
|
||||||
|
bool hasBoxData = DetectPivotStateBoxData(
|
||||||
|
conditions.pivotZone,
|
||||||
|
peakUpper,
|
||||||
|
peakLower,
|
||||||
|
peakFrom,
|
||||||
|
peakTo,
|
||||||
|
valeUpper,
|
||||||
|
valeLower,
|
||||||
|
valeFrom,
|
||||||
|
valeTo //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Calculate Pivot Tick Zones ...
|
||||||
|
|
||||||
|
//
|
||||||
|
int ticksLevels = decisionCycleHelper
|
||||||
|
.mPOIDetector
|
||||||
|
.TicksRangeZoneLevel();
|
||||||
|
int ticksRange = decisionCycleHelper
|
||||||
|
.mPOIDetector
|
||||||
|
.TicksRangeZoneRange();
|
||||||
|
|
||||||
|
//
|
||||||
|
CalculatePivotTickZone(
|
||||||
|
conditions.pivotZone,
|
||||||
|
ticksLevels,
|
||||||
|
ticksRange //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
isPivotPeakZoneRejected =
|
||||||
|
hasBoxData &&
|
||||||
|
(
|
||||||
|
//
|
||||||
|
IsBarReject(
|
||||||
|
peakLower,
|
||||||
|
X_DIRECTION_BEARISH,
|
||||||
|
cBar //
|
||||||
|
)
|
||||||
|
//
|
||||||
|
||
|
||||||
|
//
|
||||||
|
IsBarReject(
|
||||||
|
peakUpper,
|
||||||
|
X_DIRECTION_BEARISH,
|
||||||
|
cBar //
|
||||||
|
)
|
||||||
|
//
|
||||||
|
);
|
||||||
|
isPivotPeakZoneBreakedUp =
|
||||||
|
hasBoxData &&
|
||||||
|
IsBarBreak(
|
||||||
|
peakUpper,
|
||||||
|
X_DIRECTION_BULLISH,
|
||||||
|
cBar //
|
||||||
|
);
|
||||||
|
isPivotPeakZoneBreakedDown =
|
||||||
|
hasBoxData &&
|
||||||
|
IsBarBreak(
|
||||||
|
peakLower,
|
||||||
|
X_DIRECTION_BEARISH,
|
||||||
|
cBar //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
isPivotValeZoneRejected =
|
||||||
|
hasBoxData &&
|
||||||
|
(
|
||||||
|
//
|
||||||
|
IsBarReject(
|
||||||
|
valeLower,
|
||||||
|
X_DIRECTION_BULLISH,
|
||||||
|
cBar //
|
||||||
|
)
|
||||||
|
//
|
||||||
|
||
|
||||||
|
//
|
||||||
|
IsBarReject(
|
||||||
|
valeUpper,
|
||||||
|
X_DIRECTION_BULLISH,
|
||||||
|
cBar //
|
||||||
|
)
|
||||||
|
//
|
||||||
|
);
|
||||||
|
isPivotValeZoneBreakedUp =
|
||||||
|
hasBoxData &&
|
||||||
|
IsBarBreak(
|
||||||
|
valeUpper,
|
||||||
|
X_DIRECTION_BULLISH,
|
||||||
|
cBar //
|
||||||
|
);
|
||||||
|
isPivotValeZoneBreakedDown =
|
||||||
|
hasBoxData &&
|
||||||
|
IsBarBreak(
|
||||||
|
valeLower,
|
||||||
|
X_DIRECTION_BEARISH,
|
||||||
|
cBar //
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
bool isPivotEnded = IsValid(X121SMCXRSPVIPivotEnd);
|
||||||
|
if (isPivotEnded)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
X121SMCXRSPVIPivotPeak = 0;
|
||||||
|
X121SMCXRSPVIPivotVale = 0;
|
||||||
|
X121SMCXRSPVIPivotEnd = NULL;
|
||||||
|
X121SMCXRSPVIPivotStart = NULL;
|
||||||
|
X121SMCXRSPVIPivotType = XPV_NONE;
|
||||||
|
|
||||||
|
//
|
||||||
|
conditions.pivotZone.Clean();
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Summarize Conditions ...
|
// Summarize Conditions ...
|
||||||
|
|
||||||
@@ -1109,7 +1391,7 @@ bool DetectX121SMCXRSPVISiganlSetup(
|
|||||||
|
|
||||||
//
|
//
|
||||||
// Manipulate Conditions Pivot ...
|
// Manipulate Conditions Pivot ...
|
||||||
|
|
||||||
//
|
//
|
||||||
double pivot = decisionXConditions.sarBuffer[1];
|
double pivot = decisionXConditions.sarBuffer[1];
|
||||||
pivot = (decisionXConditions.sarBuffer[1] + decisionXConditions.strBuffer[1]) / 2;
|
pivot = (decisionXConditions.sarBuffer[1] + decisionXConditions.strBuffer[1]) / 2;
|
||||||
@@ -1191,19 +1473,45 @@ bool DetectX121SMCXRSPVISiganlSetup(
|
|||||||
: pzPeak;
|
: pzPeak;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
|
||||||
|
//
|
||||||
|
bool isCond5Bullish =
|
||||||
|
//
|
||||||
|
hasDecisionBullishTrend &&
|
||||||
|
isPivotValeZoneRejected
|
||||||
|
//
|
||||||
|
;
|
||||||
|
|
||||||
|
//
|
||||||
|
bool isCond5Bearish =
|
||||||
|
//
|
||||||
|
hasDecisionBearishTrend &&
|
||||||
|
isPivotPeakZoneRejected
|
||||||
|
//
|
||||||
|
;
|
||||||
|
|
||||||
|
//
|
||||||
|
bool hasCond5Conditions = isCond5Bullish ||
|
||||||
|
isCond5Bearish;
|
||||||
|
|
||||||
//
|
//
|
||||||
isBullish =
|
isBullish =
|
||||||
isCond1Bullish ||
|
isCond5Bullish &&
|
||||||
isCond2Bullish ||
|
(isCond1Bullish ||
|
||||||
isCond3Bullish ||
|
isCond2Bullish ||
|
||||||
isCond4Bullish;
|
isCond3Bullish ||
|
||||||
|
isCond4Bullish);
|
||||||
|
|
||||||
//
|
//
|
||||||
isBearish =
|
isBearish =
|
||||||
isCond1Bearish ||
|
isCond5Bearish &&
|
||||||
isCond2Bearish ||
|
(isCond1Bearish ||
|
||||||
isCond3Bearish ||
|
isCond2Bearish ||
|
||||||
isCond4Bearish;
|
isCond3Bearish ||
|
||||||
|
isCond4Bearish);
|
||||||
|
|
||||||
//
|
//
|
||||||
result = isBullish ||
|
result = isBullish ||
|
||||||
|
|||||||
@@ -412,68 +412,26 @@ bool DetectX121SMCXSTRPVSiganlSetup(
|
|||||||
|
|
||||||
//
|
//
|
||||||
// Consolidation ...
|
// Consolidation ...
|
||||||
ENUM_X_DIRECTION consolidationMarketDir;
|
|
||||||
bool hasConsolidationMarketDir = consolidationCycleHelper
|
|
||||||
.DetectMarketStructure(consolidationMarketDir);
|
|
||||||
|
|
||||||
//
|
//
|
||||||
bool hasConsolidationBullishTrend =
|
bool hasConsolidationBullishTrend = consolidationXConditions.isTrendBullish;
|
||||||
hasConsolidationMarketDir &&
|
bool hasConsolidationBearishTrend = consolidationXConditions.isTrendBearish;
|
||||||
IsBullish(consolidationMarketDir);
|
|
||||||
|
|
||||||
//
|
|
||||||
bool hasConsolidationBearishTrend =
|
|
||||||
hasConsolidationMarketDir &&
|
|
||||||
IsBearish(consolidationMarketDir);
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Verification ...
|
// Verification ...
|
||||||
ENUM_X_DIRECTION verificationMarketDir;
|
bool hasVerificationBullishTrend = verificationXConditions.isTrendBullish;
|
||||||
bool hasVerificationMarketDir = verificationCycleHelper
|
bool hasVerificationBearishTrend = verificationXConditions.isTrendBearish;
|
||||||
.DetectMarketStructure(verificationMarketDir);
|
|
||||||
|
|
||||||
//
|
|
||||||
bool hasVerificationBullishTrend =
|
|
||||||
hasVerificationMarketDir &&
|
|
||||||
IsBullish(verificationMarketDir);
|
|
||||||
|
|
||||||
//
|
|
||||||
bool hasVerificationBearishTrend =
|
|
||||||
hasVerificationMarketDir &&
|
|
||||||
IsBearish(verificationMarketDir);
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Analyse ...
|
// Analyse ...
|
||||||
ENUM_X_DIRECTION analyseMarketDir;
|
bool hasAnalyseBullishTrend = analyseXConditions.isTrendBullish;
|
||||||
bool hasAnalyseMarketDir = analyseCycleHelper
|
bool hasAnalyseBearishTrend = analyseXConditions.isTrendBearish;
|
||||||
.DetectMarketStructure(analyseMarketDir);
|
|
||||||
|
|
||||||
//
|
|
||||||
bool hasAnalyseBullishTrend =
|
|
||||||
hasAnalyseMarketDir &&
|
|
||||||
IsBullish(analyseMarketDir);
|
|
||||||
|
|
||||||
//
|
|
||||||
bool hasAnalyseBearishTrend =
|
|
||||||
hasAnalyseMarketDir &&
|
|
||||||
IsBearish(analyseMarketDir);
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Decision ...
|
// Decision ...
|
||||||
ENUM_X_DIRECTION decisionMarketDir;
|
bool hasDecisionBullishTrend = decisionXConditions.isTrendBullish;
|
||||||
bool hasDecisionMarketDir = decisionCycleHelper
|
bool hasDecisionBearishTrend = decisionXConditions.isTrendBearish;
|
||||||
.DetectMarketStructure(decisionMarketDir);
|
|
||||||
|
|
||||||
//
|
|
||||||
bool hasDecisionBullishTrend =
|
|
||||||
hasDecisionMarketDir &&
|
|
||||||
IsBullish(decisionMarketDir);
|
|
||||||
|
|
||||||
//
|
|
||||||
bool hasDecisionBearishTrend =
|
|
||||||
hasDecisionMarketDir &&
|
|
||||||
IsBearish(decisionMarketDir);
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Detect Bar State ...
|
// Detect Bar State ...
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user