last ...
This commit is contained in:
@@ -2782,10 +2782,7 @@ class XCPOIDrawer : public XCBase
|
|||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
if (!IsValid(to))
|
to = NormalizeTime(to);
|
||||||
{
|
|
||||||
to = bar.time + PeriodSeconds(bar.period);
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
//
|
||||||
string prefix = Prefix();
|
string prefix = Prefix();
|
||||||
|
|||||||
@@ -0,0 +1,530 @@
|
|||||||
|
//////////////////////////////////////////////////////////////////////////////////
|
||||||
|
////// Detect Price Zones :
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
//
|
||||||
|
XPriceZones priceZone;
|
||||||
|
bool isPriceZoneValidForPeak;
|
||||||
|
bool isPriceZoneValidForVale;
|
||||||
|
|
||||||
|
//
|
||||||
|
priceZone.Clean();
|
||||||
|
isPriceZoneValidForPeak = false;
|
||||||
|
isPriceZoneValidForVale = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Detect Price Zone ...
|
||||||
|
|
||||||
|
//
|
||||||
|
double pzPeak = decisionXConditions.peaksBuffer[1];
|
||||||
|
double pzVale = decisionXConditions.valesBuffer[1];
|
||||||
|
|
||||||
|
//
|
||||||
|
// Detecting Decision Price ones ...
|
||||||
|
XPriceZones decisionPriceZone;
|
||||||
|
bool hasDecisionPriceZone = CalculatePriceInsideZones(
|
||||||
|
decisionPriceZone,
|
||||||
|
decisionState,
|
||||||
|
cBar //
|
||||||
|
);
|
||||||
|
double decisionPriceZoneUpper = 0;
|
||||||
|
double decisionPriceZoneLower = 0;
|
||||||
|
bool isDecisionPriceZoneValidForPeak = false;
|
||||||
|
bool isDecisionPriceZoneValidForVale = false;
|
||||||
|
if (hasDecisionPriceZone)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool hasBoundary = decisionPriceZone.GetBoundary(
|
||||||
|
X_DIRECTION_ALL,
|
||||||
|
decisionPriceZoneUpper,
|
||||||
|
decisionPriceZoneLower //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
isDecisionPriceZoneValidForPeak =
|
||||||
|
hasBoundary &&
|
||||||
|
pzPeak <= decisionPriceZoneUpper &&
|
||||||
|
pzPeak >= decisionPriceZoneLower;
|
||||||
|
|
||||||
|
//
|
||||||
|
isDecisionPriceZoneValidForVale =
|
||||||
|
hasBoundary &&
|
||||||
|
pzVale <= decisionPriceZoneUpper &&
|
||||||
|
pzVale >= decisionPriceZoneLower;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Detecting Analyse Price ones ...
|
||||||
|
XPriceZones analysePriceZone;
|
||||||
|
bool hasAnalysePriceZone = CalculatePriceInsideZones(
|
||||||
|
analysePriceZone,
|
||||||
|
analyseState,
|
||||||
|
cBar //
|
||||||
|
);
|
||||||
|
double analysePriceZoneUpper = 0;
|
||||||
|
double analysePriceZoneLower = 0;
|
||||||
|
bool isAnalysePriceZoneValidForPeak = false;
|
||||||
|
bool isAnalysePriceZoneValidForVale = false;
|
||||||
|
if (hasAnalysePriceZone)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool hasBoundary = analysePriceZone.GetBoundary(
|
||||||
|
X_DIRECTION_ALL,
|
||||||
|
analysePriceZoneUpper,
|
||||||
|
analysePriceZoneLower //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
isAnalysePriceZoneValidForPeak =
|
||||||
|
hasBoundary &&
|
||||||
|
pzPeak <= analysePriceZoneUpper &&
|
||||||
|
pzPeak >= analysePriceZoneLower;
|
||||||
|
|
||||||
|
//
|
||||||
|
isAnalysePriceZoneValidForVale =
|
||||||
|
hasBoundary &&
|
||||||
|
pzVale <= analysePriceZoneUpper &&
|
||||||
|
pzVale >= analysePriceZoneLower;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Detecting Verification Price ones ...
|
||||||
|
XPriceZones verificationPriceZone;
|
||||||
|
bool hasVerificationPriceZone = CalculatePriceInsideZones(
|
||||||
|
verificationPriceZone,
|
||||||
|
verificationState,
|
||||||
|
cBar //
|
||||||
|
);
|
||||||
|
double verificationPriceZoneUpper = 0;
|
||||||
|
double verificationPriceZoneLower = 0;
|
||||||
|
bool isVerificationPriceZoneValidForPeak = false;
|
||||||
|
bool isVerificationPriceZoneValidForVale = false;
|
||||||
|
if (hasVerificationPriceZone)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool hasBoundary = verificationPriceZone.GetBoundary(
|
||||||
|
X_DIRECTION_ALL,
|
||||||
|
verificationPriceZoneUpper,
|
||||||
|
verificationPriceZoneLower //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
isVerificationPriceZoneValidForPeak =
|
||||||
|
hasBoundary &&
|
||||||
|
pzPeak <= verificationPriceZoneUpper &&
|
||||||
|
pzPeak >= verificationPriceZoneLower;
|
||||||
|
|
||||||
|
//
|
||||||
|
isVerificationPriceZoneValidForVale =
|
||||||
|
hasBoundary &&
|
||||||
|
pzVale <= verificationPriceZoneUpper &&
|
||||||
|
pzVale >= verificationPriceZoneLower;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////////////
|
||||||
|
////// Detect Pivot Zones :
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
//
|
||||||
|
double X121SMCXPivotPeak;
|
||||||
|
double X121SMCXPivotVale;
|
||||||
|
datetime X121SMCXPivotEnd;
|
||||||
|
datetime X121SMCXPivotStart;
|
||||||
|
ENUM_XPV_PIVOTS X121SMCXPivotType = XPV_NONE;
|
||||||
|
|
||||||
|
//
|
||||||
|
// 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(X121SMCXPivotStart);
|
||||||
|
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 &&
|
||||||
|
isSameCycleVales;
|
||||||
|
bool isPeakStart =
|
||||||
|
isSamePeaks &&
|
||||||
|
isSameCyclePeaks;
|
||||||
|
|
||||||
|
//
|
||||||
|
bool isStart = isPeakStart ||
|
||||||
|
isValeStart;
|
||||||
|
if (isStart)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
X121SMCXPivotStart = cTime;
|
||||||
|
X121SMCXPivotType =
|
||||||
|
isPeakStart
|
||||||
|
? XPV_PEAK
|
||||||
|
: XPV_VALE;
|
||||||
|
|
||||||
|
//
|
||||||
|
X121SMCXPivotPeak = decisionXConditions.peaksBuffer[1];
|
||||||
|
X121SMCXPivotVale = decisionXConditions.valesBuffer[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
hasPivot = IsValid(X121SMCXPivotStart);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Create XPVPivot instance ...
|
||||||
|
if (hasPivot)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
conditions.pivotZone.symbol = symbol;
|
||||||
|
conditions.pivotZone.period = period;
|
||||||
|
|
||||||
|
//
|
||||||
|
conditions.pivotZone.to = cTime;
|
||||||
|
conditions.pivotZone.repetition = 3;
|
||||||
|
|
||||||
|
//
|
||||||
|
conditions.pivotZone.upper = X121SMCXPivotPeak;
|
||||||
|
conditions.pivotZone.lower = X121SMCXPivotVale;
|
||||||
|
|
||||||
|
//
|
||||||
|
conditions.pivotZone.type = X121SMCXPivotType;
|
||||||
|
conditions.pivotZone.from = X121SMCXPivotStart;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
if (hasPivot)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool isBreaked = X121SMCXPivotType == XPV_PEAK
|
||||||
|
? decisionXConditions.isBreakedUpPrevPeak
|
||||||
|
: decisionXConditions.isBreakedDownPrevVale;
|
||||||
|
|
||||||
|
//
|
||||||
|
if (!isBreaked)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
X121SMCXPivotPeak = decisionXConditions.peaksBuffer[1];
|
||||||
|
X121SMCXPivotVale = decisionXConditions.valesBuffer[1];
|
||||||
|
|
||||||
|
//
|
||||||
|
conditions.pivotZone.to = cTime;
|
||||||
|
conditions.pivotZone.repetition++;
|
||||||
|
conditions.pivotZone.upper = X121SMCXPivotPeak;
|
||||||
|
conditions.pivotZone.lower = X121SMCXPivotVale;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//
|
||||||
|
X121SMCXPivotEnd = 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(X121SMCXPivotEnd);
|
||||||
|
if (isPivotEnded)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
X121SMCXPivotPeak = 0;
|
||||||
|
X121SMCXPivotVale = 0;
|
||||||
|
X121SMCXPivotEnd = NULL;
|
||||||
|
X121SMCXPivotStart = NULL;
|
||||||
|
X121SMCXPivotType = XPV_NONE;
|
||||||
|
|
||||||
|
//
|
||||||
|
conditions.pivotZone.Clean();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////////////
|
||||||
|
////// Detect Pivot Zones :
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
//
|
||||||
|
bool isCondition1Bullish =
|
||||||
|
//
|
||||||
|
hasPivot &&
|
||||||
|
//
|
||||||
|
isCBarBullishFormed &&
|
||||||
|
isCBarBullishPullbacked &&
|
||||||
|
//
|
||||||
|
hasAnalyseBullishTrend &&
|
||||||
|
hasDecisionBullishTrend &&
|
||||||
|
hasVerificationBullishTrend &&
|
||||||
|
//
|
||||||
|
decisionXConditions.isSarBullish &&
|
||||||
|
analyseXConditions.isSarBullish &&
|
||||||
|
verificationXConditions.isSarBullish &&
|
||||||
|
//
|
||||||
|
false
|
||||||
|
//
|
||||||
|
;
|
||||||
|
|
||||||
|
//
|
||||||
|
bool isCondition1Bearish =
|
||||||
|
//
|
||||||
|
hasPivot &&
|
||||||
|
//
|
||||||
|
isCBarBearishFormed &&
|
||||||
|
isCBarBearishPullbacked &&
|
||||||
|
//
|
||||||
|
hasAnalyseBearishTrend &&
|
||||||
|
hasDecisionBearishTrend &&
|
||||||
|
hasVerificationBearishTrend &&
|
||||||
|
//
|
||||||
|
decisionXConditions.isSarBearish &&
|
||||||
|
analyseXConditions.isSarBearish &&
|
||||||
|
verificationXConditions.isSarBearish &&
|
||||||
|
//
|
||||||
|
false
|
||||||
|
//
|
||||||
|
;
|
||||||
|
|
||||||
|
//
|
||||||
|
bool hasCondition1 = isCondition1Bullish ||
|
||||||
|
isCondition1Bearish;
|
||||||
|
if (hasCondition1)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
ENUM_X_DIRECTION pzDir =
|
||||||
|
isCondition1Bullish
|
||||||
|
? X_DIRECTION_BULLISH
|
||||||
|
: X_DIRECTION_BEARISH;
|
||||||
|
|
||||||
|
//
|
||||||
|
conditions.priceZone = analysePriceZone;
|
||||||
|
conditions.isPriceZoneValidForPeak = isAnalysePriceZoneValidForPeak;
|
||||||
|
conditions.isPriceZoneValidForVale = isAnalysePriceZoneValidForVale;
|
||||||
|
|
||||||
|
//
|
||||||
|
pzPeak = analysePriceZoneUpper;
|
||||||
|
pzVale = analysePriceZoneLower;
|
||||||
|
|
||||||
|
//
|
||||||
|
double point = GetEntry(
|
||||||
|
conditions.symbol,
|
||||||
|
pzDir //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Manipulate Conditions Point ...
|
||||||
|
|
||||||
|
//
|
||||||
|
// point =
|
||||||
|
// isCondition1Bullish ? pzPeak
|
||||||
|
// : pzVale;
|
||||||
|
conditions.point = point;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Manipulate Conditions Pivot ...
|
||||||
|
|
||||||
|
//
|
||||||
|
conditions.pivot =
|
||||||
|
isCondition1Bullish
|
||||||
|
? pzVale
|
||||||
|
: pzPeak;
|
||||||
|
}
|
||||||
@@ -335,3 +335,41 @@ int DrawX121SMCStrategyConditions(
|
|||||||
//
|
//
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////
|
||||||
|
|
||||||
|
// //
|
||||||
|
// isCBarBearishFormed &&
|
||||||
|
// (isPivotToDownRejected ||
|
||||||
|
// isPivotToDownBreaked) &&
|
||||||
|
// conditions.pivotZone.IsVale() &&
|
||||||
|
// //
|
||||||
|
// // SAR ...
|
||||||
|
// isSarBearishFormed &&
|
||||||
|
// // //
|
||||||
|
// // // STR ...
|
||||||
|
// // !(decisionXConditions.isStrBullish) &&
|
||||||
|
// // //
|
||||||
|
// // // VWAP ...
|
||||||
|
// // !(decisionXConditions.isVWapBullishState ||
|
||||||
|
// // decisionXConditions.isVWapBullishOrdered) &&
|
||||||
|
// //
|
||||||
|
|
||||||
|
|
||||||
|
// //
|
||||||
|
// isCBarBullishFormed &&
|
||||||
|
// (isPivotToUpRejected ||
|
||||||
|
// isPivotToUpBreaked) &&
|
||||||
|
// conditions.pivotZone.IsPeak() &&
|
||||||
|
// //
|
||||||
|
// // SAR ...
|
||||||
|
// isSarBullishFormed &&
|
||||||
|
// // //
|
||||||
|
// // // STR ...
|
||||||
|
// // !(decisionXConditions.isStrBearish) &&
|
||||||
|
// // //
|
||||||
|
// // // VWAP ...
|
||||||
|
// // !(decisionXConditions.isVWapBearishState ||
|
||||||
|
// // decisionXConditions.isVWapBearishOrdered) &&
|
||||||
|
// //
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -65,7 +65,7 @@ input string eaCloseAllTradesAt = ""; // Enable Close All Trades on Signals on T
|
|||||||
//
|
//
|
||||||
// Risk Management ...
|
// Risk Management ...
|
||||||
input group "Risk Management";
|
input group "Risk Management";
|
||||||
input double eaR2R = 3; // Signallers Risk to Reward Ratio
|
input double eaR2R = 2; // Signallers Risk to Reward Ratio
|
||||||
input double eaVolume = 0.05; // Static Volume
|
input double eaVolume = 0.05; // Static Volume
|
||||||
input double eaRiskPercentPerBalance = 0; // Risk Percent Per Balance in Each Trade
|
input double eaRiskPercentPerBalance = 0; // Risk Percent Per Balance in Each Trade
|
||||||
input bool eaDynamicRiskManagement = false; // Dynamic Risk Management
|
input bool eaDynamicRiskManagement = false; // Dynamic Risk Management
|
||||||
@@ -80,9 +80,9 @@ input int eaPauseSignallingAfterReachesMaxAllowedSLInSecconds = 7200; // Pause S
|
|||||||
// Protection ...
|
// Protection ...
|
||||||
input group "Protection";
|
input group "Protection";
|
||||||
input bool eaAllowHedging = true; // Allow Hedge Positions
|
input bool eaAllowHedging = true; // Allow Hedge Positions
|
||||||
input int eaMinOpenTradesFroHedging = 5; // Minimum Open Positions for Hedging
|
input int eaMinOpenTradesFroHedging = 4; // Minimum Open Positions for Hedging
|
||||||
input double eaHedgingMinVolumeStep = 0.01; // Minimum Volume Step for Hedging
|
input double eaHedgingMinVolumeStep = 0.01; // Minimum Volume Step for Hedging
|
||||||
input double eaHedgeingMinRequiredProfitPerVolumeStep = 1.5; // Minimum Required Profit Per Volume Step for Hedging
|
input double eaHedgeingMinRequiredProfitPerVolumeStep = 2.0; // Minimum Required Profit Per Volume Step for Hedging
|
||||||
|
|
||||||
//
|
//
|
||||||
// Alert ...
|
// Alert ...
|
||||||
|
|||||||
@@ -199,10 +199,6 @@ struct X121Conditions
|
|||||||
double donCloseUpperBuffer[];
|
double donCloseUpperBuffer[];
|
||||||
double donCloseLowerBuffer[];
|
double donCloseLowerBuffer[];
|
||||||
|
|
||||||
//
|
|
||||||
bool bullishTrendBuffer[];
|
|
||||||
bool bearishTrendBuffer[];
|
|
||||||
|
|
||||||
//
|
//
|
||||||
double rsiSlope;
|
double rsiSlope;
|
||||||
double strSlope;
|
double strSlope;
|
||||||
@@ -497,14 +493,6 @@ 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;
|
||||||
@@ -592,10 +580,6 @@ 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);
|
||||||
@@ -647,10 +631,6 @@ 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;
|
||||||
@@ -1014,14 +994,6 @@ struct X121Conditions
|
|||||||
//
|
//
|
||||||
isStrLowerCrossedOverDonLowLower = false;
|
isStrLowerCrossedOverDonLowLower = false;
|
||||||
isStrLowerCrossedUnderDonLowLower = false;
|
isStrLowerCrossedUnderDonLowLower = false;
|
||||||
|
|
||||||
//
|
|
||||||
isTrendBullish = false;
|
|
||||||
isTrendBearish = false;
|
|
||||||
|
|
||||||
//
|
|
||||||
isTrendSwirchedToBullish = false;
|
|
||||||
isTrendSwirchedToBearish = false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -1231,10 +1203,6 @@ 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) +
|
||||||
@@ -1944,18 +1912,6 @@ class XCX121Helper : public XCBase
|
|||||||
conditions.hLLBuffer //
|
conditions.hLLBuffer //
|
||||||
);
|
);
|
||||||
|
|
||||||
//
|
|
||||||
Copy(
|
|
||||||
xpvConditions.bullishTrendBuffer,
|
|
||||||
conditions.bullishTrendBuffer //
|
|
||||||
);
|
|
||||||
|
|
||||||
//
|
|
||||||
Copy(
|
|
||||||
xpvConditions.bearishTrendBuffer,
|
|
||||||
conditions.bearishTrendBuffer //
|
|
||||||
);
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Conditions ...
|
// Conditions ...
|
||||||
|
|
||||||
@@ -2368,20 +2324,6 @@ 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];
|
||||||
@@ -2801,12 +2743,6 @@ 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,10 +270,6 @@ struct X121XPVConditions
|
|||||||
double hHHBuffer[];
|
double hHHBuffer[];
|
||||||
double hLLBuffer[];
|
double hLLBuffer[];
|
||||||
|
|
||||||
//
|
|
||||||
bool bullishTrendBuffer[];
|
|
||||||
bool bearishTrendBuffer[];
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Conditions ...
|
// Conditions ...
|
||||||
|
|
||||||
@@ -345,8 +341,8 @@ struct X121XPVConditions
|
|||||||
Clean(hLLBuffer);
|
Clean(hLLBuffer);
|
||||||
|
|
||||||
//
|
//
|
||||||
Clean(bullishTrendBuffer);
|
// Clean(bullishTrendBuffer);
|
||||||
Clean(bearishTrendBuffer);
|
// Clean(bearishTrendBuffer);
|
||||||
|
|
||||||
//
|
//
|
||||||
ArraySetAsSeries(peaksBuffer, true);
|
ArraySetAsSeries(peaksBuffer, true);
|
||||||
@@ -363,10 +359,6 @@ struct X121XPVConditions
|
|||||||
ArraySetAsSeries(hHHBuffer, true);
|
ArraySetAsSeries(hHHBuffer, true);
|
||||||
ArraySetAsSeries(hLLBuffer, true);
|
ArraySetAsSeries(hLLBuffer, true);
|
||||||
|
|
||||||
//
|
|
||||||
ArraySetAsSeries(bullishTrendBuffer, true);
|
|
||||||
ArraySetAsSeries(bearishTrendBuffer, true);
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Conditions ...
|
// Conditions ...
|
||||||
|
|
||||||
@@ -1612,107 +1604,6 @@ 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 ...
|
||||||
|
|
||||||
@@ -1936,191 +1827,6 @@ 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, //
|
||||||
@@ -2281,48 +1987,6 @@ 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 ...
|
||||||
|
|
||||||
@@ -2400,11 +2064,6 @@ class XCX121XPVHelper : public XCBaseHelper
|
|||||||
conditions.isRejectedPrevVale = isRejectedPrevVale;
|
conditions.isRejectedPrevVale = isRejectedPrevVale;
|
||||||
conditions.isBreakedDownPrevVale = isBreakedDownPrevVale;
|
conditions.isBreakedDownPrevVale = isBreakedDownPrevVale;
|
||||||
|
|
||||||
// //
|
|
||||||
// if (isNewVale || isNewPeak) {
|
|
||||||
// CalculateTrend();
|
|
||||||
// }
|
|
||||||
|
|
||||||
//
|
//
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@@ -2435,29 +2094,6 @@ 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()
|
||||||
{
|
{
|
||||||
@@ -2632,28 +2268,6 @@ 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 //
|
|
||||||
// );
|
|
||||||
// }
|
|
||||||
};
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -359,6 +359,199 @@ class XC121SMCCycleHelper : public XCBase
|
|||||||
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 = 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;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Retrieve Cycle Conditions ...
|
* Retrieve Cycle Conditions ...
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -309,18 +309,48 @@ bool DetectX121SMCGuards(
|
|||||||
|
|
||||||
//
|
//
|
||||||
// Trigger ...
|
// Trigger ...
|
||||||
bool hasTriggerBullishTrend = triggerXConditions.bullishTrendBuffer[1];
|
ENUM_X_DIRECTION triggerTrendDir;
|
||||||
bool hasTriggerBearishTrend = triggerXConditions.bearishTrendBuffer[1];
|
bool hasTriggerTrend =
|
||||||
|
triggerCycleHelper
|
||||||
|
.DetectMarketStructure(
|
||||||
|
triggerTrendDir //
|
||||||
|
);
|
||||||
|
bool hasTriggerBullishTrend =
|
||||||
|
hasTriggerTrend &&
|
||||||
|
IsBullish(triggerTrendDir);
|
||||||
|
bool hasTriggerBearishTrend =
|
||||||
|
hasTriggerTrend &&
|
||||||
|
IsBearish(triggerTrendDir);
|
||||||
|
|
||||||
//
|
//
|
||||||
// Decision ...
|
// Decision ...
|
||||||
bool hasDecisionBullishTrend = decisionXConditions.bullishTrendBuffer[1];
|
ENUM_X_DIRECTION decisionTrendDir;
|
||||||
bool hasDecisionBearishTrend = decisionXConditions.bearishTrendBuffer[1];
|
bool hasDecisionTrend =
|
||||||
|
decisionCycleHelper
|
||||||
|
.DetectMarketStructure(
|
||||||
|
decisionTrendDir //
|
||||||
|
);
|
||||||
|
bool hasDecisionBullishTrend =
|
||||||
|
hasDecisionTrend &&
|
||||||
|
IsBullish(decisionTrendDir);
|
||||||
|
bool hasDecisionBearishTrend =
|
||||||
|
hasDecisionTrend &&
|
||||||
|
IsBearish(decisionTrendDir);
|
||||||
|
|
||||||
//
|
//
|
||||||
// Analyse ...
|
// Analyse ...
|
||||||
bool hasAnalyseBullishTrend = analyseXConditions.bullishTrendBuffer[1];
|
ENUM_X_DIRECTION analyseTrendDir;
|
||||||
bool hasAnalyseBearishTrend = analyseXConditions.bearishTrendBuffer[1];
|
bool hasAnalyseTrend =
|
||||||
|
analyseCycleHelper
|
||||||
|
.DetectMarketStructure(
|
||||||
|
analyseTrendDir //
|
||||||
|
);
|
||||||
|
bool hasAnalyseBullishTrend =
|
||||||
|
hasAnalyseTrend &&
|
||||||
|
IsBullish(analyseTrendDir);
|
||||||
|
bool hasAnalyseBearishTrend =
|
||||||
|
hasAnalyseTrend &&
|
||||||
|
IsBearish(analyseTrendDir);
|
||||||
|
|
||||||
//
|
//
|
||||||
// Consolidation Zone ...
|
// Consolidation Zone ...
|
||||||
|
|||||||
@@ -35,7 +35,7 @@
|
|||||||
const string X121SMCStrategyToken = "X121SMC";
|
const string X121SMCStrategyToken = "X121SMC";
|
||||||
|
|
||||||
//
|
//
|
||||||
const string X121SMCXTestToken = "X121XTest";
|
const string X121SMCXToken = "X121X";
|
||||||
const string X121SMCXPZToken = "X121XPZ";
|
const string X121SMCXPZToken = "X121XPZ";
|
||||||
const string X121SMCXRSPVIToken = "X121XRSPVI";
|
const string X121SMCXRSPVIToken = "X121XRSPVI";
|
||||||
const string X121SMCXSTRPVToken = "X121XSTRPV";
|
const string X121SMCXSTRPVToken = "X121XSTRPV";
|
||||||
@@ -46,7 +46,7 @@ enum ENUM_X_121_SMC_PROVIDERS
|
|||||||
{
|
{
|
||||||
//
|
//
|
||||||
X_121_SMC_PROVIDER_NONE,
|
X_121_SMC_PROVIDER_NONE,
|
||||||
X_121_SMC_PROVIDER_XTEST,
|
X_121_SMC_PROVIDER_X,
|
||||||
X_121_SMC_PROVIDER_XPZ,
|
X_121_SMC_PROVIDER_XPZ,
|
||||||
X_121_SMC_PROVIDER_XRSPVI,
|
X_121_SMC_PROVIDER_XRSPVI,
|
||||||
X_121_SMC_PROVIDER_XSTRPV,
|
X_121_SMC_PROVIDER_XSTRPV,
|
||||||
@@ -704,8 +704,8 @@ string ToString(ENUM_X_121_SMC_PROVIDERS value)
|
|||||||
switch (value)
|
switch (value)
|
||||||
{
|
{
|
||||||
//
|
//
|
||||||
case X_121_SMC_PROVIDER_XTEST:
|
case X_121_SMC_PROVIDER_X:
|
||||||
result = X121SMCXTestToken;
|
result = X121SMCXToken;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -747,9 +747,9 @@ ENUM_X_121_SMC_PROVIDERS ParseProvider(string value)
|
|||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
if (Contains(X121SMCXTestToken, value))
|
if (Contains(X121SMCXToken, value))
|
||||||
{
|
{
|
||||||
result = X_121_SMC_PROVIDER_XTEST;
|
result = X_121_SMC_PROVIDER_X;
|
||||||
}
|
}
|
||||||
else if (Contains(X121SMCXPZToken, value))
|
else if (Contains(X121SMCXPZToken, value))
|
||||||
{
|
{
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -58,9 +58,6 @@ struct X121SMCStrategyXPZSignalConditions
|
|||||||
bool isPriceZoneValidForPeak;
|
bool isPriceZoneValidForPeak;
|
||||||
bool isPriceZoneValidForVale;
|
bool isPriceZoneValidForVale;
|
||||||
|
|
||||||
//
|
|
||||||
XPVPivot pivotZone;
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Constructor ...
|
// Constructor ...
|
||||||
X121SMCStrategyXPZSignalConditions()
|
X121SMCStrategyXPZSignalConditions()
|
||||||
@@ -181,7 +178,6 @@ struct X121SMCStrategyXPZSignalConditions
|
|||||||
|
|
||||||
//
|
//
|
||||||
priceZone.Clean();
|
priceZone.Clean();
|
||||||
pivotZone.Clean();
|
|
||||||
isPriceZoneValidForPeak = false;
|
isPriceZoneValidForPeak = false;
|
||||||
isPriceZoneValidForVale = false;
|
isPriceZoneValidForVale = false;
|
||||||
}
|
}
|
||||||
@@ -194,13 +190,6 @@ struct X121SMCStrategyXPZSignalConditions
|
|||||||
X121SMCStrategyXPZSignalConditions mXPZConditions;
|
X121SMCStrategyXPZSignalConditions mXPZConditions;
|
||||||
X121SMCStrategyXPZSignalConditions mXPZConditionsCollection[];
|
X121SMCStrategyXPZSignalConditions mXPZConditionsCollection[];
|
||||||
|
|
||||||
//
|
|
||||||
double X121SMCXPZPivotPeak;
|
|
||||||
double X121SMCXPZPivotVale;
|
|
||||||
datetime X121SMCXPZPivotEnd;
|
|
||||||
datetime X121SMCXPZPivotStart;
|
|
||||||
ENUM_XPV_PIVOTS X121SMCXPZPivotType = XPV_NONE;
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Extension Functions ...
|
// Extension Functions ...
|
||||||
|
|
||||||
@@ -425,25 +414,63 @@ bool DetectX121SMCXPZSiganlSetup(
|
|||||||
|
|
||||||
//
|
//
|
||||||
// Consolidation ...
|
// Consolidation ...
|
||||||
|
ENUM_X_DIRECTION consolidationTrendDir;
|
||||||
//
|
bool hasConsolidationTrend =
|
||||||
bool hasConsolidationBullishTrend = consolidationXConditions.isTrendBullish;
|
consolidationCycleHelper
|
||||||
bool hasConsolidationBearishTrend = consolidationXConditions.isTrendBearish;
|
.DetectMarketStructure(
|
||||||
|
consolidationTrendDir //
|
||||||
|
);
|
||||||
|
bool hasConsolidationBullishTrend =
|
||||||
|
hasConsolidationTrend &&
|
||||||
|
IsBullish(consolidationTrendDir);
|
||||||
|
bool hasConsolidationBearishTrend =
|
||||||
|
hasConsolidationTrend &&
|
||||||
|
IsBearish(consolidationTrendDir);
|
||||||
|
|
||||||
//
|
//
|
||||||
// Verification ...
|
// Verification ...
|
||||||
bool hasVerificationBullishTrend = verificationXConditions.isTrendBullish;
|
ENUM_X_DIRECTION verificationTrendDir;
|
||||||
bool hasVerificationBearishTrend = verificationXConditions.isTrendBearish;
|
bool hasVerificationTrend =
|
||||||
|
verificationCycleHelper
|
||||||
|
.DetectMarketStructure(
|
||||||
|
verificationTrendDir //
|
||||||
|
);
|
||||||
|
bool hasVerificationBullishTrend =
|
||||||
|
hasVerificationTrend &&
|
||||||
|
IsBullish(verificationTrendDir);
|
||||||
|
bool hasVerificationBearishTrend =
|
||||||
|
hasVerificationTrend &&
|
||||||
|
IsBearish(verificationTrendDir);
|
||||||
|
|
||||||
//
|
//
|
||||||
// Analyse ...
|
// Analyse ...
|
||||||
bool hasAnalyseBullishTrend = analyseXConditions.isTrendBullish;
|
ENUM_X_DIRECTION analyseTrendDir;
|
||||||
bool hasAnalyseBearishTrend = analyseXConditions.isTrendBearish;
|
bool hasAnalyseTrend =
|
||||||
|
analyseCycleHelper
|
||||||
|
.DetectMarketStructure(
|
||||||
|
analyseTrendDir //
|
||||||
|
);
|
||||||
|
bool hasAnalyseBullishTrend =
|
||||||
|
hasAnalyseTrend &&
|
||||||
|
IsBullish(analyseTrendDir);
|
||||||
|
bool hasAnalyseBearishTrend =
|
||||||
|
hasAnalyseTrend &&
|
||||||
|
IsBearish(analyseTrendDir);
|
||||||
|
|
||||||
//
|
//
|
||||||
// Decision ...
|
// Decision ...
|
||||||
bool hasDecisionBullishTrend = decisionXConditions.isTrendBullish;
|
ENUM_X_DIRECTION decisionTrendDir;
|
||||||
bool hasDecisionBearishTrend = decisionXConditions.isTrendBearish;
|
bool hasDecisionTrend =
|
||||||
|
decisionCycleHelper
|
||||||
|
.DetectMarketStructure(
|
||||||
|
decisionTrendDir //
|
||||||
|
);
|
||||||
|
bool hasDecisionBullishTrend =
|
||||||
|
hasDecisionTrend &&
|
||||||
|
IsBullish(decisionTrendDir);
|
||||||
|
bool hasDecisionBearishTrend =
|
||||||
|
hasDecisionTrend &&
|
||||||
|
IsBearish(decisionTrendDir);
|
||||||
|
|
||||||
//
|
//
|
||||||
// Detect Bar State ...
|
// Detect Bar State ...
|
||||||
@@ -541,314 +568,6 @@ bool DetectX121SMCXPZSiganlSetup(
|
|||||||
//
|
//
|
||||||
;
|
;
|
||||||
|
|
||||||
//
|
|
||||||
// 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(X121SMCXPZPivotStart);
|
|
||||||
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)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
X121SMCXPZPivotStart = cTime;
|
|
||||||
X121SMCXPZPivotType =
|
|
||||||
isPeakStart
|
|
||||||
? XPV_PEAK
|
|
||||||
: XPV_VALE;
|
|
||||||
|
|
||||||
//
|
|
||||||
X121SMCXPZPivotPeak = decisionXConditions.peaksBuffer[1];
|
|
||||||
X121SMCXPZPivotVale = decisionXConditions.valesBuffer[1];
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
hasPivot = IsValid(X121SMCXPZPivotStart);
|
|
||||||
|
|
||||||
//
|
|
||||||
// Create XPVPivot instance ...
|
|
||||||
if (hasPivot)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
conditions.pivotZone.symbol = symbol;
|
|
||||||
conditions.pivotZone.period = period;
|
|
||||||
|
|
||||||
//
|
|
||||||
conditions.pivotZone.to = cTime;
|
|
||||||
conditions.pivotZone.repetition = 3;
|
|
||||||
|
|
||||||
//
|
|
||||||
conditions.pivotZone.upper = X121SMCXPZPivotPeak;
|
|
||||||
conditions.pivotZone.lower = X121SMCXPZPivotVale;
|
|
||||||
|
|
||||||
//
|
|
||||||
conditions.pivotZone.type = X121SMCXPZPivotType;
|
|
||||||
conditions.pivotZone.from = X121SMCXPZPivotStart;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
if (hasPivot)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
bool isBreaked = X121SMCXPZPivotType == XPV_PEAK
|
|
||||||
? decisionXConditions.isBreakedUpPrevPeak
|
|
||||||
: decisionXConditions.isBreakedDownPrevVale;
|
|
||||||
|
|
||||||
//
|
|
||||||
if (!isBreaked)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
X121SMCXPZPivotPeak = decisionXConditions.peaksBuffer[1];
|
|
||||||
X121SMCXPZPivotVale = decisionXConditions.valesBuffer[1];
|
|
||||||
|
|
||||||
//
|
|
||||||
conditions.pivotZone.to = cTime;
|
|
||||||
conditions.pivotZone.repetition++;
|
|
||||||
conditions.pivotZone.upper = X121SMCXPZPivotPeak;
|
|
||||||
conditions.pivotZone.lower = X121SMCXPZPivotVale;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
//
|
|
||||||
X121SMCXPZPivotEnd = 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(X121SMCXPZPivotEnd);
|
|
||||||
if (isPivotEnded)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
X121SMCXPZPivotPeak = 0;
|
|
||||||
X121SMCXPZPivotVale = 0;
|
|
||||||
X121SMCXPZPivotEnd = NULL;
|
|
||||||
X121SMCXPZPivotStart = NULL;
|
|
||||||
X121SMCXPZPivotType = XPV_NONE;
|
|
||||||
|
|
||||||
//
|
|
||||||
conditions.pivotZone.Clean();
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Detect Price Zone ...
|
// Detect Price Zone ...
|
||||||
|
|
||||||
@@ -989,8 +708,6 @@ bool DetectX121SMCXPZSiganlSetup(
|
|||||||
|
|
||||||
//
|
//
|
||||||
bool isPriceZoneBullish =
|
bool isPriceZoneBullish =
|
||||||
//
|
|
||||||
hasPivot &&
|
|
||||||
//
|
//
|
||||||
hasVerificationBullishTrend &&
|
hasVerificationBullishTrend &&
|
||||||
hasAnalyseBullishTrend &&
|
hasAnalyseBullishTrend &&
|
||||||
@@ -1003,14 +720,14 @@ bool DetectX121SMCXPZSiganlSetup(
|
|||||||
isCBarBullishFormed &&
|
isCBarBullishFormed &&
|
||||||
isInDecisionDiscount &&
|
isInDecisionDiscount &&
|
||||||
decisionXConditions.isAtrLowerUnderVale &&
|
decisionXConditions.isAtrLowerUnderVale &&
|
||||||
decisionXConditions.isAtrLowerSlopeBullish
|
decisionXConditions.isAtrLowerSlopeBullish &&
|
||||||
|
//
|
||||||
|
true
|
||||||
//
|
//
|
||||||
;
|
;
|
||||||
|
|
||||||
//
|
//
|
||||||
bool isPriceZoneBearish =
|
bool isPriceZoneBearish =
|
||||||
//
|
|
||||||
hasPivot &&
|
|
||||||
//
|
//
|
||||||
hasVerificationBearishTrend &&
|
hasVerificationBearishTrend &&
|
||||||
hasAnalyseBearishTrend &&
|
hasAnalyseBearishTrend &&
|
||||||
@@ -1023,7 +740,9 @@ bool DetectX121SMCXPZSiganlSetup(
|
|||||||
isInDecisionPremium &&
|
isInDecisionPremium &&
|
||||||
isCBarBearishFormed &&
|
isCBarBearishFormed &&
|
||||||
decisionXConditions.isAtrUpperOverPeak &&
|
decisionXConditions.isAtrUpperOverPeak &&
|
||||||
decisionXConditions.isAtrUpperSlopeBearish
|
decisionXConditions.isAtrUpperSlopeBearish &&
|
||||||
|
//
|
||||||
|
true
|
||||||
//
|
//
|
||||||
;
|
;
|
||||||
|
|
||||||
|
|||||||
@@ -445,25 +445,63 @@ bool DetectX121SMCXRSPVISiganlSetup(
|
|||||||
|
|
||||||
//
|
//
|
||||||
// Consolidation ...
|
// Consolidation ...
|
||||||
|
ENUM_X_DIRECTION consolidationTrendDir;
|
||||||
//
|
bool hasConsolidationTrend =
|
||||||
bool hasConsolidationBullishTrend = consolidationXConditions.isTrendBullish;
|
consolidationCycleHelper
|
||||||
bool hasConsolidationBearishTrend = consolidationXConditions.isTrendBearish;
|
.DetectMarketStructure(
|
||||||
|
consolidationTrendDir //
|
||||||
|
);
|
||||||
|
bool hasConsolidationBullishTrend =
|
||||||
|
hasConsolidationTrend &&
|
||||||
|
IsBullish(consolidationTrendDir);
|
||||||
|
bool hasConsolidationBearishTrend =
|
||||||
|
hasConsolidationTrend &&
|
||||||
|
IsBearish(consolidationTrendDir);
|
||||||
|
|
||||||
//
|
//
|
||||||
// Verification ...
|
// Verification ...
|
||||||
bool hasVerificationBullishTrend = verificationXConditions.isTrendBullish;
|
ENUM_X_DIRECTION verificationTrendDir;
|
||||||
bool hasVerificationBearishTrend = verificationXConditions.isTrendBearish;
|
bool hasVerificationTrend =
|
||||||
|
verificationCycleHelper
|
||||||
|
.DetectMarketStructure(
|
||||||
|
verificationTrendDir //
|
||||||
|
);
|
||||||
|
bool hasVerificationBullishTrend =
|
||||||
|
hasVerificationTrend &&
|
||||||
|
IsBullish(verificationTrendDir);
|
||||||
|
bool hasVerificationBearishTrend =
|
||||||
|
hasVerificationTrend &&
|
||||||
|
IsBearish(verificationTrendDir);
|
||||||
|
|
||||||
//
|
//
|
||||||
// Analyse ...
|
// Analyse ...
|
||||||
bool hasAnalyseBullishTrend = analyseXConditions.isTrendBullish;
|
ENUM_X_DIRECTION analyseTrendDir;
|
||||||
bool hasAnalyseBearishTrend = analyseXConditions.isTrendBearish;
|
bool hasAnalyseTrend =
|
||||||
|
analyseCycleHelper
|
||||||
|
.DetectMarketStructure(
|
||||||
|
analyseTrendDir //
|
||||||
|
);
|
||||||
|
bool hasAnalyseBullishTrend =
|
||||||
|
hasAnalyseTrend &&
|
||||||
|
IsBullish(analyseTrendDir);
|
||||||
|
bool hasAnalyseBearishTrend =
|
||||||
|
hasAnalyseTrend &&
|
||||||
|
IsBearish(analyseTrendDir);
|
||||||
|
|
||||||
//
|
//
|
||||||
// Decision ...
|
// Decision ...
|
||||||
bool hasDecisionBullishTrend = decisionXConditions.isTrendBullish;
|
ENUM_X_DIRECTION decisionTrendDir;
|
||||||
bool hasDecisionBearishTrend = decisionXConditions.isTrendBearish;
|
bool hasDecisionTrend =
|
||||||
|
decisionCycleHelper
|
||||||
|
.DetectMarketStructure(
|
||||||
|
decisionTrendDir //
|
||||||
|
);
|
||||||
|
bool hasDecisionBullishTrend =
|
||||||
|
hasDecisionTrend &&
|
||||||
|
IsBullish(decisionTrendDir);
|
||||||
|
bool hasDecisionBearishTrend =
|
||||||
|
hasDecisionTrend &&
|
||||||
|
IsBearish(decisionTrendDir);
|
||||||
|
|
||||||
//
|
//
|
||||||
// Detect Bar State ...
|
// Detect Bar State ...
|
||||||
|
|||||||
@@ -423,25 +423,63 @@ bool DetectX121SMCXSTRPVSiganlSetup(
|
|||||||
|
|
||||||
//
|
//
|
||||||
// Consolidation ...
|
// Consolidation ...
|
||||||
|
ENUM_X_DIRECTION consolidationTrendDir;
|
||||||
//
|
bool hasConsolidationTrend =
|
||||||
bool hasConsolidationBullishTrend = consolidationXConditions.isTrendBullish;
|
consolidationCycleHelper
|
||||||
bool hasConsolidationBearishTrend = consolidationXConditions.isTrendBearish;
|
.DetectMarketStructure(
|
||||||
|
consolidationTrendDir //
|
||||||
|
);
|
||||||
|
bool hasConsolidationBullishTrend =
|
||||||
|
hasConsolidationTrend &&
|
||||||
|
IsBullish(consolidationTrendDir);
|
||||||
|
bool hasConsolidationBearishTrend =
|
||||||
|
hasConsolidationTrend &&
|
||||||
|
IsBearish(consolidationTrendDir);
|
||||||
|
|
||||||
//
|
//
|
||||||
// Verification ...
|
// Verification ...
|
||||||
bool hasVerificationBullishTrend = verificationXConditions.isTrendBullish;
|
ENUM_X_DIRECTION verificationTrendDir;
|
||||||
bool hasVerificationBearishTrend = verificationXConditions.isTrendBearish;
|
bool hasVerificationTrend =
|
||||||
|
verificationCycleHelper
|
||||||
|
.DetectMarketStructure(
|
||||||
|
verificationTrendDir //
|
||||||
|
);
|
||||||
|
bool hasVerificationBullishTrend =
|
||||||
|
hasVerificationTrend &&
|
||||||
|
IsBullish(verificationTrendDir);
|
||||||
|
bool hasVerificationBearishTrend =
|
||||||
|
hasVerificationTrend &&
|
||||||
|
IsBearish(verificationTrendDir);
|
||||||
|
|
||||||
//
|
//
|
||||||
// Analyse ...
|
// Analyse ...
|
||||||
bool hasAnalyseBullishTrend = analyseXConditions.isTrendBullish;
|
ENUM_X_DIRECTION analyseTrendDir;
|
||||||
bool hasAnalyseBearishTrend = analyseXConditions.isTrendBearish;
|
bool hasAnalyseTrend =
|
||||||
|
analyseCycleHelper
|
||||||
|
.DetectMarketStructure(
|
||||||
|
analyseTrendDir //
|
||||||
|
);
|
||||||
|
bool hasAnalyseBullishTrend =
|
||||||
|
hasAnalyseTrend &&
|
||||||
|
IsBullish(analyseTrendDir);
|
||||||
|
bool hasAnalyseBearishTrend =
|
||||||
|
hasAnalyseTrend &&
|
||||||
|
IsBearish(analyseTrendDir);
|
||||||
|
|
||||||
//
|
//
|
||||||
// Decision ...
|
// Decision ...
|
||||||
bool hasDecisionBullishTrend = decisionXConditions.isTrendBullish;
|
ENUM_X_DIRECTION decisionTrendDir;
|
||||||
bool hasDecisionBearishTrend = decisionXConditions.isTrendBearish;
|
bool hasDecisionTrend =
|
||||||
|
decisionCycleHelper
|
||||||
|
.DetectMarketStructure(
|
||||||
|
decisionTrendDir //
|
||||||
|
);
|
||||||
|
bool hasDecisionBullishTrend =
|
||||||
|
hasDecisionTrend &&
|
||||||
|
IsBullish(decisionTrendDir);
|
||||||
|
bool hasDecisionBearishTrend =
|
||||||
|
hasDecisionTrend &&
|
||||||
|
IsBearish(decisionTrendDir);
|
||||||
|
|
||||||
//
|
//
|
||||||
// Detect Bar State ...
|
// Detect Bar State ...
|
||||||
|
|||||||
@@ -27,6 +27,7 @@
|
|||||||
#include "../Classes/x-121.smc.market.cycle.helper.class.mq5"
|
#include "../Classes/x-121.smc.market.cycle.helper.class.mq5"
|
||||||
|
|
||||||
//
|
//
|
||||||
|
#include "../Signals/x-121.smc.x.signal.lib.mq5"
|
||||||
#include "../Signals/x-121.smc.xpz.signal.lib.mq5"
|
#include "../Signals/x-121.smc.xpz.signal.lib.mq5"
|
||||||
#include "../Signals/x-121.smc.xrspvi.signal.lib.mq5"
|
#include "../Signals/x-121.smc.xrspvi.signal.lib.mq5"
|
||||||
#include "../Signals/x-121.smc.xstrpv.signal.lib.mq5"
|
#include "../Signals/x-121.smc.xstrpv.signal.lib.mq5"
|
||||||
@@ -43,6 +44,7 @@ class XCX121SMCStrategy : public XCX121SMCBaseStrategy
|
|||||||
public:
|
public:
|
||||||
//
|
//
|
||||||
// Props ...
|
// Props ...
|
||||||
|
bool useXSignal;
|
||||||
bool useXPZSignal;
|
bool useXPZSignal;
|
||||||
bool useXRSPVISignal;
|
bool useXRSPVISignal;
|
||||||
bool useXSTRPVSignal;
|
bool useXSTRPVSignal;
|
||||||
@@ -195,10 +197,20 @@ class XCX121SMCStrategy : public XCX121SMCBaseStrategy
|
|||||||
bool hasSignal = false;
|
bool hasSignal = false;
|
||||||
|
|
||||||
//
|
//
|
||||||
|
bool hasXSignal = false;
|
||||||
bool hasXPZSignal = false;
|
bool hasXPZSignal = false;
|
||||||
bool hasXRSPVISignal = false;
|
bool hasXRSPVISignal = false;
|
||||||
bool hasXSTRPVSignal = false;
|
bool hasXSTRPVSignal = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
// X Signal ...
|
||||||
|
if (useXSignal && !hasSignal)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
hasXSignal = DetectXSignal(conditions);
|
||||||
|
hasSignal = hasXSignal;
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// XPZ Signal ...
|
// XPZ Signal ...
|
||||||
if (useXPZSignal && !hasSignal)
|
if (useXPZSignal && !hasSignal)
|
||||||
@@ -382,11 +394,11 @@ class XCX121SMCStrategy : public XCX121SMCBaseStrategy
|
|||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// XSTRPV Guard Detection ...
|
// X Guard Detection ...
|
||||||
if (useXSTRPVSignal)
|
if (useXSignal)
|
||||||
{
|
{
|
||||||
//
|
//
|
||||||
bool hasGuard = DetectX121SMCXSTRPVGuards(
|
bool hasGuard = DetectX121SMCXGuards(
|
||||||
guards,
|
guards,
|
||||||
positions,
|
positions,
|
||||||
mTriggerCycleHelper,
|
mTriggerCycleHelper,
|
||||||
@@ -415,6 +427,23 @@ class XCX121SMCStrategy : public XCX121SMCBaseStrategy
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// XSTRPV Guard Detection ...
|
||||||
|
if (useXSTRPVSignal)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool hasGuard = DetectX121SMCXSTRPVGuards(
|
||||||
|
guards,
|
||||||
|
positions,
|
||||||
|
mTriggerCycleHelper,
|
||||||
|
mDecisionCycleHelper,
|
||||||
|
mAnalyseCycleHelper,
|
||||||
|
mVerificationCycleHelper,
|
||||||
|
mConsolidationCycleHelper,
|
||||||
|
mVisionCycleHelper //
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// XRSPVI Guard Detection ...
|
// XRSPVI Guard Detection ...
|
||||||
if (useXRSPVISignal)
|
if (useXRSPVISignal)
|
||||||
@@ -471,8 +500,8 @@ class XCX121SMCStrategy : public XCX121SMCBaseStrategy
|
|||||||
// Signalling Functions ...
|
// Signalling Functions ...
|
||||||
|
|
||||||
//
|
//
|
||||||
// XSTRPV Signal ...
|
// X Signal ...
|
||||||
bool DetectXSTRPVSignal(
|
bool DetectXSignal(
|
||||||
X121SMCStrategyConditions &conditions //
|
X121SMCStrategyConditions &conditions //
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
@@ -537,22 +566,22 @@ class XCX121SMCStrategy : public XCX121SMCBaseStrategy
|
|||||||
datetime cTime = TimeCurrent();
|
datetime cTime = TimeCurrent();
|
||||||
|
|
||||||
//
|
//
|
||||||
ENUM_X_121_SMC_PROVIDERS provider = X_121_SMC_PROVIDER_XSTRPV;
|
ENUM_X_121_SMC_PROVIDERS provider = X_121_SMC_PROVIDER_X;
|
||||||
string providerStr = ToString(provider);
|
string providerStr = ToString(provider);
|
||||||
|
|
||||||
//
|
//
|
||||||
// Detect Setup Conditions ...
|
// Detect Setup Conditions ...
|
||||||
datetime setupTime = mXSTRPVConditions.setupTime;
|
datetime setupTime = mXConditions.setupTime;
|
||||||
bool isSetuped = mXSTRPVConditions.IsSetuped();
|
bool isSetuped = mXConditions.IsSetuped();
|
||||||
ENUM_X_DIRECTION setupDir = mXSTRPVConditions.dir;
|
ENUM_X_DIRECTION setupDir = mXConditions.dir;
|
||||||
if (!isSetuped)
|
if (!isSetuped)
|
||||||
{
|
{
|
||||||
//
|
//
|
||||||
// Detect Signal Setup ...
|
// Detect Signal Setup ...
|
||||||
isSetuped = DetectX121SMCXSTRPVSiganlSetup(
|
isSetuped = DetectX121SMCXSiganlSetup(
|
||||||
symbol,
|
symbol,
|
||||||
period,
|
period,
|
||||||
mXSTRPVConditions,
|
mXConditions,
|
||||||
mTriggerCycleHelper,
|
mTriggerCycleHelper,
|
||||||
mDecisionCycleHelper,
|
mDecisionCycleHelper,
|
||||||
mAnalyseCycleHelper,
|
mAnalyseCycleHelper,
|
||||||
@@ -562,25 +591,25 @@ class XCX121SMCStrategy : public XCX121SMCBaseStrategy
|
|||||||
);
|
);
|
||||||
|
|
||||||
//
|
//
|
||||||
setupDir = mXSTRPVConditions.dir;
|
setupDir = mXConditions.dir;
|
||||||
setupTime = mXSTRPVConditions.setupTime;
|
setupTime = mXConditions.setupTime;
|
||||||
|
|
||||||
//
|
//
|
||||||
if (isSetuped)
|
if (isSetuped)
|
||||||
{
|
{
|
||||||
//
|
//
|
||||||
int items = AddX121SMCXSTRPVConditionsIfNotExists(
|
int items = AddX121SMCXConditionsIfNotExists(
|
||||||
mXSTRPVConditions,
|
mXConditions,
|
||||||
mXSTRPVConditionsCollection //
|
mXConditionsCollection //
|
||||||
);
|
);
|
||||||
|
|
||||||
//
|
//
|
||||||
mXSTRPVConditions.Clean();
|
mXConditions.Clean();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
int conditionsCount = ArraySize(mXSTRPVConditionsCollection);
|
int conditionsCount = ArraySize(mXConditionsCollection);
|
||||||
result = IsValidSize(conditionsCount);
|
result = IsValidSize(conditionsCount);
|
||||||
if (!result)
|
if (!result)
|
||||||
{
|
{
|
||||||
@@ -590,12 +619,12 @@ class XCX121SMCStrategy : public XCX121SMCBaseStrategy
|
|||||||
//
|
//
|
||||||
// Looking For Conditions ...
|
// Looking For Conditions ...
|
||||||
int selectedIndex = 0;
|
int selectedIndex = 0;
|
||||||
X121SMCStrategyXSTRPVSignalConditions mTmpConditions[];
|
X121SMCStrategyXSignalConditions mTmpConditions[];
|
||||||
Copy(
|
Copy(
|
||||||
mXSTRPVConditionsCollection,
|
mXConditionsCollection,
|
||||||
mTmpConditions //
|
mTmpConditions //
|
||||||
);
|
);
|
||||||
X121SMCStrategyXSTRPVSignalConditions mConditions;
|
X121SMCStrategyXSignalConditions mConditions;
|
||||||
for (int i = 0; i < conditionsCount; i++)
|
for (int i = 0; i < conditionsCount; i++)
|
||||||
{
|
{
|
||||||
//
|
//
|
||||||
@@ -606,7 +635,7 @@ class XCX121SMCStrategy : public XCX121SMCBaseStrategy
|
|||||||
{
|
{
|
||||||
//
|
//
|
||||||
// Detect Signal Trigger ...
|
// Detect Signal Trigger ...
|
||||||
canTrigger = DetectX121SMCXSTRPVSiganlTrigger(
|
canTrigger = DetectX121SMCXSiganlTrigger(
|
||||||
mTmpConditions[i],
|
mTmpConditions[i],
|
||||||
symbol,
|
symbol,
|
||||||
period,
|
period,
|
||||||
@@ -628,7 +657,7 @@ class XCX121SMCStrategy : public XCX121SMCBaseStrategy
|
|||||||
{
|
{
|
||||||
//
|
//
|
||||||
ArrayRemove(
|
ArrayRemove(
|
||||||
mXSTRPVConditionsCollection,
|
mXConditionsCollection,
|
||||||
i,
|
i,
|
||||||
1 //
|
1 //
|
||||||
);
|
);
|
||||||
@@ -661,7 +690,7 @@ class XCX121SMCStrategy : public XCX121SMCBaseStrategy
|
|||||||
//
|
//
|
||||||
// Remove Selected Index from Main Collection ...
|
// Remove Selected Index from Main Collection ...
|
||||||
ArrayRemove(
|
ArrayRemove(
|
||||||
mXSTRPVConditionsCollection,
|
mXConditionsCollection,
|
||||||
selectedIndex,
|
selectedIndex,
|
||||||
1 //
|
1 //
|
||||||
);
|
);
|
||||||
@@ -906,6 +935,224 @@ class XCX121SMCStrategy : public XCX121SMCBaseStrategy
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// XSTRPV Signal ...
|
||||||
|
bool DetectXSTRPVSignal(
|
||||||
|
X121SMCStrategyConditions &conditions //
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
bool isBullish = false;
|
||||||
|
bool isBearish = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
int zIndex = 0;
|
||||||
|
int cIndex = zIndex + 1;
|
||||||
|
int pIndex = cIndex + 1;
|
||||||
|
int ppIndex = pIndex + 1;
|
||||||
|
|
||||||
|
//
|
||||||
|
string symbol = GetSymbol();
|
||||||
|
ENUM_TIMEFRAMES period = GetPeriod();
|
||||||
|
|
||||||
|
//
|
||||||
|
XOHCL zBar;
|
||||||
|
result = zBar.Init(
|
||||||
|
symbol,
|
||||||
|
period,
|
||||||
|
zIndex //
|
||||||
|
);
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
XOHCL cBar;
|
||||||
|
result = cBar.Init(
|
||||||
|
symbol,
|
||||||
|
period,
|
||||||
|
cIndex //
|
||||||
|
);
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
XOHCL pBar;
|
||||||
|
result = pBar.Init(
|
||||||
|
symbol,
|
||||||
|
period,
|
||||||
|
pIndex //
|
||||||
|
);
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
double cLL = cBar.FindLowest(7, MODE_LOW);
|
||||||
|
double cHH = cBar.FindHighest(7, MODE_HIGH);
|
||||||
|
|
||||||
|
//
|
||||||
|
datetime cTime = TimeCurrent();
|
||||||
|
|
||||||
|
//
|
||||||
|
ENUM_X_121_SMC_PROVIDERS provider = X_121_SMC_PROVIDER_XSTRPV;
|
||||||
|
string providerStr = ToString(provider);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Detect Setup Conditions ...
|
||||||
|
datetime setupTime = mXSTRPVConditions.setupTime;
|
||||||
|
bool isSetuped = mXSTRPVConditions.IsSetuped();
|
||||||
|
ENUM_X_DIRECTION setupDir = mXSTRPVConditions.dir;
|
||||||
|
if (!isSetuped)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Detect Signal Setup ...
|
||||||
|
isSetuped = DetectX121SMCXSTRPVSiganlSetup(
|
||||||
|
symbol,
|
||||||
|
period,
|
||||||
|
mXSTRPVConditions,
|
||||||
|
mTriggerCycleHelper,
|
||||||
|
mDecisionCycleHelper,
|
||||||
|
mAnalyseCycleHelper,
|
||||||
|
mVerificationCycleHelper,
|
||||||
|
mConsolidationCycleHelper,
|
||||||
|
mVisionCycleHelper //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
setupDir = mXSTRPVConditions.dir;
|
||||||
|
setupTime = mXSTRPVConditions.setupTime;
|
||||||
|
|
||||||
|
//
|
||||||
|
if (isSetuped)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
int items = AddX121SMCXSTRPVConditionsIfNotExists(
|
||||||
|
mXSTRPVConditions,
|
||||||
|
mXSTRPVConditionsCollection //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
mXSTRPVConditions.Clean();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
int conditionsCount = ArraySize(mXSTRPVConditionsCollection);
|
||||||
|
result = IsValidSize(conditionsCount);
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Looking For Conditions ...
|
||||||
|
int selectedIndex = 0;
|
||||||
|
X121SMCStrategyXSTRPVSignalConditions mTmpConditions[];
|
||||||
|
Copy(
|
||||||
|
mXSTRPVConditionsCollection,
|
||||||
|
mTmpConditions //
|
||||||
|
);
|
||||||
|
X121SMCStrategyXSTRPVSignalConditions mConditions;
|
||||||
|
for (int i = 0; i < conditionsCount; i++)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Check Triggers ...
|
||||||
|
bool canTrigger = mTmpConditions[i].CanTrigger();
|
||||||
|
datetime triggerTime = mTmpConditions[i].triggerTime;
|
||||||
|
if (!canTrigger)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Detect Signal Trigger ...
|
||||||
|
canTrigger = DetectX121SMCXSTRPVSiganlTrigger(
|
||||||
|
mTmpConditions[i],
|
||||||
|
symbol,
|
||||||
|
period,
|
||||||
|
mTriggerCycleHelper,
|
||||||
|
mDecisionCycleHelper,
|
||||||
|
mAnalyseCycleHelper,
|
||||||
|
mVerificationCycleHelper,
|
||||||
|
mConsolidationCycleHelper,
|
||||||
|
mVisionCycleHelper //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
result = canTrigger;
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool isISetuped = mTmpConditions[i].IsSetuped();
|
||||||
|
if (!isISetuped)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
ArrayRemove(
|
||||||
|
mXSTRPVConditionsCollection,
|
||||||
|
i,
|
||||||
|
1 //
|
||||||
|
);
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
triggerTime = mTmpConditions[i].triggerTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
if (canTrigger)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
selectedIndex = i;
|
||||||
|
mConditions = mTmpConditions[i];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
result = IsValid(mConditions.setupTime) &&
|
||||||
|
HasDirection(mConditions.dir);
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Remove Selected Index from Main Collection ...
|
||||||
|
ArrayRemove(
|
||||||
|
mXSTRPVConditionsCollection,
|
||||||
|
selectedIndex,
|
||||||
|
1 //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Check Signal Direction ...
|
||||||
|
isBullish = IsBullish(mConditions.dir);
|
||||||
|
isBearish = IsBearish(mConditions.dir);
|
||||||
|
result = isBullish ||
|
||||||
|
isBearish;
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Issues Signal on Conditions ...
|
||||||
|
conditions.sl = mConditions.sl;
|
||||||
|
conditions.provider = providerStr;
|
||||||
|
conditions.signalDir = mConditions.dir;
|
||||||
|
conditions.target = mConditions.target;
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// XRSPVI Signal ...
|
// XRSPVI Signal ...
|
||||||
bool DetectXRSPVISignal(
|
bool DetectXRSPVISignal(
|
||||||
@@ -1139,9 +1386,10 @@ class XCX121SMCStrategy : public XCX121SMCBaseStrategy
|
|||||||
void InitialHelpers()
|
void InitialHelpers()
|
||||||
{
|
{
|
||||||
//
|
//
|
||||||
useXPZSignal = true;
|
useXSignal = true;
|
||||||
useXRSPVISignal = true;
|
useXPZSignal = false;
|
||||||
useXSTRPVSignal = true;
|
useXRSPVISignal = false;
|
||||||
|
useXSTRPVSignal = false;
|
||||||
|
|
||||||
//
|
//
|
||||||
string symbol = GetSymbol();
|
string symbol = GetSymbol();
|
||||||
@@ -1209,12 +1457,12 @@ class XCX121SMCStrategy : public XCX121SMCBaseStrategy
|
|||||||
|
|
||||||
//
|
//
|
||||||
// XATR ...
|
// XATR ...
|
||||||
x121Inputs.xatrInputs.showATRUpper = showAll || true;
|
x121Inputs.xatrInputs.showATRUpper = showAll || false;
|
||||||
x121Inputs.xatrInputs.showATRLower = showAll || true;
|
x121Inputs.xatrInputs.showATRLower = showAll || false;
|
||||||
|
|
||||||
//
|
//
|
||||||
// XSTR ...
|
// XSTR ...
|
||||||
x121Inputs.xstrInputs.showStr = showAll || true;
|
x121Inputs.xstrInputs.showStr = showAll || false;
|
||||||
x121Inputs.xstrInputs.showStrUpper = showAll || false;
|
x121Inputs.xstrInputs.showStrUpper = showAll || false;
|
||||||
x121Inputs.xstrInputs.showStrLower = showAll || false;
|
x121Inputs.xstrInputs.showStrLower = showAll || false;
|
||||||
|
|
||||||
@@ -1234,9 +1482,9 @@ class XCX121SMCStrategy : public XCX121SMCBaseStrategy
|
|||||||
|
|
||||||
//
|
//
|
||||||
// XVWAP ...
|
// XVWAP ...
|
||||||
x121Inputs.xvwapInputs.showVWapFast = showAll || true;
|
x121Inputs.xvwapInputs.showVWapFast = showAll || false;
|
||||||
x121Inputs.xvwapInputs.showVWapMedium = showAll || true;
|
x121Inputs.xvwapInputs.showVWapMedium = showAll || false;
|
||||||
x121Inputs.xvwapInputs.showVWapSlow = showAll || true;
|
x121Inputs.xvwapInputs.showVWapSlow = showAll || false;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Initialize Cycle Helpers ...
|
// Initialize Cycle Helpers ...
|
||||||
|
|||||||
Reference in New Issue
Block a user