last ...
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
////////////////////////////////////////////////
|
||||
|
||||
// //
|
||||
// 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
Reference in New Issue
Block a user