last ...
This commit is contained in:
+75
-1
@@ -159,4 +159,78 @@
|
|||||||
//
|
//
|
||||||
;
|
;
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
//
|
||||||
|
iBox.to = TimeCurrent();
|
||||||
|
XCBoxObject *iObj;
|
||||||
|
has = helper.poiDrawer.DrawBox(
|
||||||
|
iBox,
|
||||||
|
iObj //
|
||||||
|
);
|
||||||
|
if (has)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
iObj.BoxWidth(2);
|
||||||
|
|
||||||
|
//
|
||||||
|
color iCLR =
|
||||||
|
iBox.IsBullish()
|
||||||
|
? clrAqua
|
||||||
|
: clrMagenta;
|
||||||
|
iObj.BoxColor(iCLR);
|
||||||
|
iObj.BoxStyle(STYLE_SOLID);
|
||||||
|
}
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
//
|
||||||
|
// COMPLEX ...
|
||||||
|
|
||||||
|
//
|
||||||
|
double iKTIRNDs[] = {
|
||||||
|
cKI,
|
||||||
|
cTKI,
|
||||||
|
cTrend //
|
||||||
|
};
|
||||||
|
|
||||||
|
//
|
||||||
|
double iKTIRNDMax = GetMax(iKTIRNDs);
|
||||||
|
double iKTIRNDMin = GetMin(iKTIRNDs);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Conditions Preparing ...
|
||||||
|
|
||||||
|
//
|
||||||
|
bool isTKITRNDBullish =
|
||||||
|
cKIState > 0 &&
|
||||||
|
cTKIState > 0 &&
|
||||||
|
ctrendState > 0;
|
||||||
|
|
||||||
|
//
|
||||||
|
bool isTKITRNDBullishPrev =
|
||||||
|
pKIState > 0 &&
|
||||||
|
pTKIState > 0 &&
|
||||||
|
ptrendState > 0;
|
||||||
|
|
||||||
|
//
|
||||||
|
bool isTKITRNDBearish =
|
||||||
|
cKIState < 0 &&
|
||||||
|
cTKIState < 0 &&
|
||||||
|
ctrendState < 0;
|
||||||
|
|
||||||
|
//
|
||||||
|
bool isTKITRNDBearishPrev =
|
||||||
|
pKIState < 0 &&
|
||||||
|
pTKIState < 0 &&
|
||||||
|
ptrendState < 0;
|
||||||
|
|
||||||
|
//
|
||||||
|
bool isTKITRNDSwitchedToBullish =
|
||||||
|
isTKITRNDBullish &&
|
||||||
|
!isTKITRNDBullishPrev;
|
||||||
|
|
||||||
|
//
|
||||||
|
bool isTKITRNDSwitchedToBearish =
|
||||||
|
isTKITRNDBearish &&
|
||||||
|
!isTKITRNDBearishPrev;
|
||||||
|
|||||||
@@ -674,6 +674,7 @@ class XCXCAEAPOIDetector : public XCBase
|
|||||||
//
|
//
|
||||||
// Tools ...
|
// Tools ...
|
||||||
|
|
||||||
|
//
|
||||||
virtual void Default()
|
virtual void Default()
|
||||||
{
|
{
|
||||||
//
|
//
|
||||||
@@ -3376,6 +3377,7 @@ class XCXCAEAPOIDetector : public XCBase
|
|||||||
|
|
||||||
//
|
//
|
||||||
void Validate(
|
void Validate(
|
||||||
|
XBoxZone &unAvailableBoxes[],
|
||||||
int barIndex = 0 //
|
int barIndex = 0 //
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
@@ -3424,6 +3426,7 @@ class XCXCAEAPOIDetector : public XCBase
|
|||||||
//
|
//
|
||||||
has = IsPivotBreaked(
|
has = IsPivotBreaked(
|
||||||
iPivot,
|
iPivot,
|
||||||
|
unAvailableBoxes,
|
||||||
barIndex //
|
barIndex //
|
||||||
);
|
);
|
||||||
if (!has)
|
if (!has)
|
||||||
@@ -3461,6 +3464,7 @@ class XCXCAEAPOIDetector : public XCBase
|
|||||||
//
|
//
|
||||||
has = IsPivotBreaked(
|
has = IsPivotBreaked(
|
||||||
iPivot,
|
iPivot,
|
||||||
|
unAvailableBoxes,
|
||||||
barIndex //
|
barIndex //
|
||||||
);
|
);
|
||||||
if (!has)
|
if (!has)
|
||||||
@@ -3498,6 +3502,7 @@ class XCXCAEAPOIDetector : public XCBase
|
|||||||
//
|
//
|
||||||
has = IsPivotBreaked(
|
has = IsPivotBreaked(
|
||||||
iPivot,
|
iPivot,
|
||||||
|
unAvailableBoxes,
|
||||||
barIndex //
|
barIndex //
|
||||||
);
|
);
|
||||||
if (!has)
|
if (!has)
|
||||||
@@ -3535,6 +3540,7 @@ class XCXCAEAPOIDetector : public XCBase
|
|||||||
//
|
//
|
||||||
has = IsPivotBreaked(
|
has = IsPivotBreaked(
|
||||||
iPivot,
|
iPivot,
|
||||||
|
unAvailableBoxes,
|
||||||
barIndex //
|
barIndex //
|
||||||
);
|
);
|
||||||
if (!has)
|
if (!has)
|
||||||
@@ -3572,6 +3578,7 @@ class XCXCAEAPOIDetector : public XCBase
|
|||||||
//
|
//
|
||||||
has = IsPivotBreaked(
|
has = IsPivotBreaked(
|
||||||
iPivot,
|
iPivot,
|
||||||
|
unAvailableBoxes,
|
||||||
barIndex //
|
barIndex //
|
||||||
);
|
);
|
||||||
if (!has)
|
if (!has)
|
||||||
@@ -3609,6 +3616,7 @@ class XCXCAEAPOIDetector : public XCBase
|
|||||||
//
|
//
|
||||||
has = IsPivotBreaked(
|
has = IsPivotBreaked(
|
||||||
iPivot,
|
iPivot,
|
||||||
|
unAvailableBoxes,
|
||||||
barIndex //
|
barIndex //
|
||||||
);
|
);
|
||||||
if (!has)
|
if (!has)
|
||||||
@@ -3646,6 +3654,7 @@ class XCXCAEAPOIDetector : public XCBase
|
|||||||
//
|
//
|
||||||
has = IsPivotBreaked(
|
has = IsPivotBreaked(
|
||||||
iPivot,
|
iPivot,
|
||||||
|
unAvailableBoxes,
|
||||||
barIndex //
|
barIndex //
|
||||||
);
|
);
|
||||||
if (!has)
|
if (!has)
|
||||||
@@ -3683,6 +3692,7 @@ class XCXCAEAPOIDetector : public XCBase
|
|||||||
//
|
//
|
||||||
has = IsPivotBreaked(
|
has = IsPivotBreaked(
|
||||||
iPivot,
|
iPivot,
|
||||||
|
unAvailableBoxes,
|
||||||
barIndex //
|
barIndex //
|
||||||
);
|
);
|
||||||
if (!has)
|
if (!has)
|
||||||
@@ -3720,6 +3730,7 @@ class XCXCAEAPOIDetector : public XCBase
|
|||||||
//
|
//
|
||||||
has = IsPivotBreaked(
|
has = IsPivotBreaked(
|
||||||
iPivot,
|
iPivot,
|
||||||
|
unAvailableBoxes,
|
||||||
barIndex //
|
barIndex //
|
||||||
);
|
);
|
||||||
if (!has)
|
if (!has)
|
||||||
@@ -3757,6 +3768,7 @@ class XCXCAEAPOIDetector : public XCBase
|
|||||||
//
|
//
|
||||||
has = IsPivotBreaked(
|
has = IsPivotBreaked(
|
||||||
iPivot,
|
iPivot,
|
||||||
|
unAvailableBoxes,
|
||||||
barIndex //
|
barIndex //
|
||||||
);
|
);
|
||||||
if (!has)
|
if (!has)
|
||||||
@@ -3794,6 +3806,7 @@ class XCXCAEAPOIDetector : public XCBase
|
|||||||
//
|
//
|
||||||
has = IsPivotBreaked(
|
has = IsPivotBreaked(
|
||||||
iPivot,
|
iPivot,
|
||||||
|
unAvailableBoxes,
|
||||||
barIndex //
|
barIndex //
|
||||||
);
|
);
|
||||||
if (!has)
|
if (!has)
|
||||||
@@ -3831,6 +3844,7 @@ class XCXCAEAPOIDetector : public XCBase
|
|||||||
//
|
//
|
||||||
has = IsPivotBreaked(
|
has = IsPivotBreaked(
|
||||||
iPivot,
|
iPivot,
|
||||||
|
unAvailableBoxes,
|
||||||
barIndex //
|
barIndex //
|
||||||
);
|
);
|
||||||
if (!has)
|
if (!has)
|
||||||
@@ -3868,6 +3882,7 @@ class XCXCAEAPOIDetector : public XCBase
|
|||||||
//
|
//
|
||||||
has = IsPivotBreaked(
|
has = IsPivotBreaked(
|
||||||
iPivot,
|
iPivot,
|
||||||
|
unAvailableBoxes,
|
||||||
barIndex //
|
barIndex //
|
||||||
);
|
);
|
||||||
if (!has)
|
if (!has)
|
||||||
@@ -3905,6 +3920,7 @@ class XCXCAEAPOIDetector : public XCBase
|
|||||||
//
|
//
|
||||||
has = IsPivotBreaked(
|
has = IsPivotBreaked(
|
||||||
iPivot,
|
iPivot,
|
||||||
|
unAvailableBoxes,
|
||||||
barIndex //
|
barIndex //
|
||||||
);
|
);
|
||||||
if (!has)
|
if (!has)
|
||||||
@@ -3942,6 +3958,7 @@ class XCXCAEAPOIDetector : public XCBase
|
|||||||
//
|
//
|
||||||
has = IsPivotBreaked(
|
has = IsPivotBreaked(
|
||||||
iPivot,
|
iPivot,
|
||||||
|
unAvailableBoxes,
|
||||||
barIndex //
|
barIndex //
|
||||||
);
|
);
|
||||||
if (!has)
|
if (!has)
|
||||||
@@ -3979,6 +3996,7 @@ class XCXCAEAPOIDetector : public XCBase
|
|||||||
//
|
//
|
||||||
has = IsPivotBreaked(
|
has = IsPivotBreaked(
|
||||||
iPivot,
|
iPivot,
|
||||||
|
unAvailableBoxes,
|
||||||
barIndex //
|
barIndex //
|
||||||
);
|
);
|
||||||
if (!has)
|
if (!has)
|
||||||
@@ -4016,6 +4034,7 @@ class XCXCAEAPOIDetector : public XCBase
|
|||||||
//
|
//
|
||||||
has = IsPivotBreaked(
|
has = IsPivotBreaked(
|
||||||
iPivot,
|
iPivot,
|
||||||
|
unAvailableBoxes,
|
||||||
barIndex //
|
barIndex //
|
||||||
);
|
);
|
||||||
if (!has)
|
if (!has)
|
||||||
@@ -4053,6 +4072,7 @@ class XCXCAEAPOIDetector : public XCBase
|
|||||||
//
|
//
|
||||||
has = IsPivotBreaked(
|
has = IsPivotBreaked(
|
||||||
iPivot,
|
iPivot,
|
||||||
|
unAvailableBoxes,
|
||||||
barIndex //
|
barIndex //
|
||||||
);
|
);
|
||||||
if (!has)
|
if (!has)
|
||||||
@@ -4090,6 +4110,7 @@ class XCXCAEAPOIDetector : public XCBase
|
|||||||
//
|
//
|
||||||
has = IsPivotBreaked(
|
has = IsPivotBreaked(
|
||||||
iPivot,
|
iPivot,
|
||||||
|
unAvailableBoxes,
|
||||||
barIndex //
|
barIndex //
|
||||||
);
|
);
|
||||||
if (!has)
|
if (!has)
|
||||||
@@ -4127,6 +4148,7 @@ class XCXCAEAPOIDetector : public XCBase
|
|||||||
//
|
//
|
||||||
has = IsPivotBreaked(
|
has = IsPivotBreaked(
|
||||||
iPivot,
|
iPivot,
|
||||||
|
unAvailableBoxes,
|
||||||
barIndex //
|
barIndex //
|
||||||
);
|
);
|
||||||
if (!has)
|
if (!has)
|
||||||
@@ -4164,6 +4186,7 @@ class XCXCAEAPOIDetector : public XCBase
|
|||||||
//
|
//
|
||||||
has = IsPivotBreaked(
|
has = IsPivotBreaked(
|
||||||
iPivot,
|
iPivot,
|
||||||
|
unAvailableBoxes,
|
||||||
barIndex //
|
barIndex //
|
||||||
);
|
);
|
||||||
if (!has)
|
if (!has)
|
||||||
@@ -4201,6 +4224,7 @@ class XCXCAEAPOIDetector : public XCBase
|
|||||||
//
|
//
|
||||||
has = IsPivotBreaked(
|
has = IsPivotBreaked(
|
||||||
iPivot,
|
iPivot,
|
||||||
|
unAvailableBoxes,
|
||||||
barIndex //
|
barIndex //
|
||||||
);
|
);
|
||||||
if (!has)
|
if (!has)
|
||||||
@@ -4214,6 +4238,160 @@ class XCXCAEAPOIDetector : public XCBase
|
|||||||
}
|
}
|
||||||
Clean(tmp);
|
Clean(tmp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
has = HasRSICrossedOverOSPivots();
|
||||||
|
if (has)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
Copy(
|
||||||
|
rsiCrossedOverOSPivots,
|
||||||
|
tmp //
|
||||||
|
);
|
||||||
|
Clean(rsiCrossedOverOSPivots);
|
||||||
|
while (HasChild(tmp))
|
||||||
|
{
|
||||||
|
//
|
||||||
|
XCAPivot iPivot = tmp[0];
|
||||||
|
ArrayRemove(
|
||||||
|
tmp,
|
||||||
|
0,
|
||||||
|
1 //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
has = IsPivotBreaked(
|
||||||
|
iPivot,
|
||||||
|
unAvailableBoxes,
|
||||||
|
barIndex //
|
||||||
|
);
|
||||||
|
if (!has)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
AddRef(
|
||||||
|
iPivot,
|
||||||
|
rsiCrossedOverOSPivots //
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Clean(tmp);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
has = HasRSICrossedUnderOBPivots();
|
||||||
|
if (has)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
Copy(
|
||||||
|
rsiCrossedUnderOBPivots,
|
||||||
|
tmp //
|
||||||
|
);
|
||||||
|
Clean(rsiCrossedUnderOBPivots);
|
||||||
|
while (HasChild(tmp))
|
||||||
|
{
|
||||||
|
//
|
||||||
|
XCAPivot iPivot = tmp[0];
|
||||||
|
ArrayRemove(
|
||||||
|
tmp,
|
||||||
|
0,
|
||||||
|
1 //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
has = IsPivotBreaked(
|
||||||
|
iPivot,
|
||||||
|
unAvailableBoxes,
|
||||||
|
barIndex //
|
||||||
|
);
|
||||||
|
if (!has)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
AddRef(
|
||||||
|
iPivot,
|
||||||
|
rsiCrossedUnderOBPivots //
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Clean(tmp);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
has = HasCCICrossedOverOSPivots();
|
||||||
|
if (has)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
Copy(
|
||||||
|
cciCrossedOverOSPivots,
|
||||||
|
tmp //
|
||||||
|
);
|
||||||
|
Clean(cciCrossedOverOSPivots);
|
||||||
|
while (HasChild(tmp))
|
||||||
|
{
|
||||||
|
//
|
||||||
|
XCAPivot iPivot = tmp[0];
|
||||||
|
ArrayRemove(
|
||||||
|
tmp,
|
||||||
|
0,
|
||||||
|
1 //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
has = IsPivotBreaked(
|
||||||
|
iPivot,
|
||||||
|
unAvailableBoxes,
|
||||||
|
barIndex //
|
||||||
|
);
|
||||||
|
if (!has)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
AddRef(
|
||||||
|
iPivot,
|
||||||
|
cciCrossedOverOSPivots //
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Clean(tmp);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
has = HasCCICrossedUnderOBPivots();
|
||||||
|
if (has)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
Copy(
|
||||||
|
cciCrossedUnderOBPivots,
|
||||||
|
tmp //
|
||||||
|
);
|
||||||
|
Clean(cciCrossedUnderOBPivots);
|
||||||
|
while (HasChild(tmp))
|
||||||
|
{
|
||||||
|
//
|
||||||
|
XCAPivot iPivot = tmp[0];
|
||||||
|
ArrayRemove(
|
||||||
|
tmp,
|
||||||
|
0,
|
||||||
|
1 //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
has = IsPivotBreaked(
|
||||||
|
iPivot,
|
||||||
|
unAvailableBoxes,
|
||||||
|
barIndex //
|
||||||
|
);
|
||||||
|
if (!has)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
AddRef(
|
||||||
|
iPivot,
|
||||||
|
cciCrossedUnderOBPivots //
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Clean(tmp);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -4508,7 +4686,8 @@ class XCXCAEAPOIDetector : public XCBase
|
|||||||
|
|
||||||
//
|
//
|
||||||
has = HasRSICrossedOverOSPivots();
|
has = HasRSICrossedOverOSPivots();
|
||||||
if (has) {
|
if (has)
|
||||||
|
{
|
||||||
//
|
//
|
||||||
count = CountRSICrossedOverOSPivots();
|
count = CountRSICrossedOverOSPivots();
|
||||||
for (int i = 0; i < count; i++)
|
for (int i = 0; i < count; i++)
|
||||||
@@ -4532,7 +4711,8 @@ class XCXCAEAPOIDetector : public XCBase
|
|||||||
|
|
||||||
//
|
//
|
||||||
has = HasCCICrossedOverOSPivots();
|
has = HasCCICrossedOverOSPivots();
|
||||||
if (has) {
|
if (has)
|
||||||
|
{
|
||||||
//
|
//
|
||||||
count = CountCCICrossedOverOSPivots();
|
count = CountCCICrossedOverOSPivots();
|
||||||
for (int i = 0; i < count; i++)
|
for (int i = 0; i < count; i++)
|
||||||
@@ -4853,7 +5033,8 @@ class XCXCAEAPOIDetector : public XCBase
|
|||||||
|
|
||||||
//
|
//
|
||||||
has = HasRSICrossedUnderOBPivots();
|
has = HasRSICrossedUnderOBPivots();
|
||||||
if (has) {
|
if (has)
|
||||||
|
{
|
||||||
//
|
//
|
||||||
count = CountRSICrossedUnderOBPivots();
|
count = CountRSICrossedUnderOBPivots();
|
||||||
for (int i = 0; i < count; i++)
|
for (int i = 0; i < count; i++)
|
||||||
@@ -4877,7 +5058,8 @@ class XCXCAEAPOIDetector : public XCBase
|
|||||||
|
|
||||||
//
|
//
|
||||||
has = HasCCICrossedUnderOBPivots();
|
has = HasCCICrossedUnderOBPivots();
|
||||||
if (has) {
|
if (has)
|
||||||
|
{
|
||||||
//
|
//
|
||||||
count = CountCCICrossedUnderOBPivots();
|
count = CountCCICrossedUnderOBPivots();
|
||||||
for (int i = 0; i < count; i++)
|
for (int i = 0; i < count; i++)
|
||||||
@@ -5346,6 +5528,7 @@ class XCXCAEAPOIDetector : public XCBase
|
|||||||
bool CheckPivotCommons(
|
bool CheckPivotCommons(
|
||||||
XCAPivot &pivot,
|
XCAPivot &pivot,
|
||||||
XBoxZone &box,
|
XBoxZone &box,
|
||||||
|
XBoxZone &unAvailableBoxes[],
|
||||||
int barIndex = 0 //
|
int barIndex = 0 //
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
@@ -5384,6 +5567,47 @@ class XCXCAEAPOIDetector : public XCBase
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
result = CheckPivotIsAvailable(
|
||||||
|
box,
|
||||||
|
unAvailableBoxes //
|
||||||
|
);
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
box.Clean();
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
bool CheckPivotIsAvailable(
|
||||||
|
XBoxZone &pivotBox,
|
||||||
|
XBoxZone &unAvailableBoxes[] //
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
result = pivotBox.IsValid();
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
int idx = -1;
|
||||||
|
bool isExists = FindBoxIndex(
|
||||||
|
idx,
|
||||||
|
pivotBox,
|
||||||
|
unAvailableBoxes //
|
||||||
|
);
|
||||||
|
result = !isExists;
|
||||||
|
|
||||||
//
|
//
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@@ -5391,6 +5615,7 @@ class XCXCAEAPOIDetector : public XCBase
|
|||||||
//
|
//
|
||||||
bool IsPivotBreaked(
|
bool IsPivotBreaked(
|
||||||
XCAPivot &pivot,
|
XCAPivot &pivot,
|
||||||
|
XBoxZone &unAvailableBoxes[],
|
||||||
int barIndex = 0 //
|
int barIndex = 0 //
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
@@ -5402,6 +5627,7 @@ class XCXCAEAPOIDetector : public XCBase
|
|||||||
result = CheckPivotCommons(
|
result = CheckPivotCommons(
|
||||||
pivot,
|
pivot,
|
||||||
iBox,
|
iBox,
|
||||||
|
unAvailableBoxes,
|
||||||
barIndex //
|
barIndex //
|
||||||
);
|
);
|
||||||
if (!result)
|
if (!result)
|
||||||
|
|||||||
@@ -422,6 +422,7 @@ int AddGuard(
|
|||||||
bool DetectXCAEAConditions(
|
bool DetectXCAEAConditions(
|
||||||
XBoxZone &boxes[],
|
XBoxZone &boxes[],
|
||||||
XCAEAConditions &conditions,
|
XCAEAConditions &conditions,
|
||||||
|
XBoxZone &pivotBox,
|
||||||
XBoxZone &box,
|
XBoxZone &box,
|
||||||
ENUM_X_DIRECTION &dir,
|
ENUM_X_DIRECTION &dir,
|
||||||
XCXCAEAHelper *helper,
|
XCXCAEAHelper *helper,
|
||||||
@@ -474,6 +475,112 @@ bool DetectXCAEAConditions(
|
|||||||
int p3IDX = p2IDX + 1;
|
int p3IDX = p2IDX + 1;
|
||||||
int p4IDX = p3IDX + 1;
|
int p4IDX = p3IDX + 1;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Reading Parameters ...
|
||||||
|
|
||||||
|
//
|
||||||
|
// KI ...
|
||||||
|
|
||||||
|
//
|
||||||
|
double cKI = conditions.kiBuffer[cIDX];
|
||||||
|
double pKI = conditions.kiBuffer[pIDX];
|
||||||
|
double p2KI = conditions.kiBuffer[p2IDX];
|
||||||
|
|
||||||
|
//
|
||||||
|
double cKIState = conditions.kiStateBuffer[cIDX];
|
||||||
|
double pKIState = conditions.kiStateBuffer[pIDX];
|
||||||
|
double p2KIState = conditions.kiStateBuffer[p2IDX];
|
||||||
|
|
||||||
|
//
|
||||||
|
// TKI ...
|
||||||
|
|
||||||
|
//
|
||||||
|
double cTKI = conditions.tkiBuffer[cIDX];
|
||||||
|
double pTKI = conditions.tkiBuffer[pIDX];
|
||||||
|
double p2TKI = conditions.tkiBuffer[p2IDX];
|
||||||
|
|
||||||
|
//
|
||||||
|
double cTKIState = conditions.tkiStateBuffer[cIDX];
|
||||||
|
double pTKIState = conditions.tkiStateBuffer[pIDX];
|
||||||
|
double p2TKIState = conditions.tkiStateBuffer[p2IDX];
|
||||||
|
|
||||||
|
//
|
||||||
|
// TREND ...
|
||||||
|
|
||||||
|
//
|
||||||
|
double cTrend = conditions.trendBuffer[cIDX];
|
||||||
|
double pTrend = conditions.trendBuffer[pIDX];
|
||||||
|
double p2Trend = conditions.trendBuffer[p2IDX];
|
||||||
|
|
||||||
|
//
|
||||||
|
double ctrendState = conditions.trendStateBuffer[cIDX];
|
||||||
|
double ptrendState = conditions.trendStateBuffer[pIDX];
|
||||||
|
double p2trendState = conditions.trendStateBuffer[p2IDX];
|
||||||
|
|
||||||
|
//
|
||||||
|
// SWING Low ...
|
||||||
|
double cSWL = conditions.swingLowBuffer[cIDX];
|
||||||
|
double pSWL = conditions.swingLowBuffer[pIDX];
|
||||||
|
double p2SWL = conditions.swingLowBuffer[p2IDX];
|
||||||
|
|
||||||
|
//
|
||||||
|
// SWING High ...
|
||||||
|
double cSWH = conditions.swingHighBuffer[cIDX];
|
||||||
|
double pSWH = conditions.swingHighBuffer[pIDX];
|
||||||
|
double p2SWH = conditions.swingHighBuffer[p2IDX];
|
||||||
|
|
||||||
|
//
|
||||||
|
// PEAK ...
|
||||||
|
double zPeak = conditions.peakBuffer[zIDX];
|
||||||
|
double cPeak = conditions.peakBuffer[cIDX];
|
||||||
|
double pPeak = conditions.peakBuffer[pIDX];
|
||||||
|
double p2Peak = conditions.peakBuffer[p2IDX];
|
||||||
|
double p3Peak = conditions.peakBuffer[p3IDX];
|
||||||
|
|
||||||
|
//
|
||||||
|
// VALE ...
|
||||||
|
double zVale = conditions.valeBuffer[zIDX];
|
||||||
|
double cVale = conditions.valeBuffer[cIDX];
|
||||||
|
double pVale = conditions.valeBuffer[pIDX];
|
||||||
|
double p2Vale = conditions.valeBuffer[p2IDX];
|
||||||
|
double p3Vale = conditions.valeBuffer[p3IDX];
|
||||||
|
|
||||||
|
//
|
||||||
|
// RSI ...
|
||||||
|
double zRSI = conditions.rsiBuffer[zIDX];
|
||||||
|
double cRSI = conditions.rsiBuffer[cIDX];
|
||||||
|
double pRSI = conditions.rsiBuffer[pIDX];
|
||||||
|
double p2RSI = conditions.rsiBuffer[p2IDX];
|
||||||
|
double p3RSI = conditions.rsiBuffer[p3IDX];
|
||||||
|
|
||||||
|
//
|
||||||
|
// CCI ...
|
||||||
|
double zCCI = conditions.cciBuffer[zIDX];
|
||||||
|
double cCCI = conditions.cciBuffer[cIDX];
|
||||||
|
double pCCI = conditions.cciBuffer[pIDX];
|
||||||
|
double p2CCI = conditions.cciBuffer[p2IDX];
|
||||||
|
double p3CCI = conditions.cciBuffer[p3IDX];
|
||||||
|
|
||||||
|
//
|
||||||
|
// RVI ...
|
||||||
|
|
||||||
|
//
|
||||||
|
double zRVI = conditions.rviBuffer[zIDX];
|
||||||
|
double cRVI = conditions.rviBuffer[cIDX];
|
||||||
|
double pRVI = conditions.rviBuffer[pIDX];
|
||||||
|
double p2RVI = conditions.rviBuffer[p2IDX];
|
||||||
|
double p3RVI = conditions.rviBuffer[p3IDX];
|
||||||
|
|
||||||
|
//
|
||||||
|
double zRVISignal = conditions.rviSignalBuffer[zIDX];
|
||||||
|
double cRVISignal = conditions.rviSignalBuffer[cIDX];
|
||||||
|
double pRVISignal = conditions.rviSignalBuffer[pIDX];
|
||||||
|
double p2RVISignal = conditions.rviSignalBuffer[p2IDX];
|
||||||
|
double p3RVISignal = conditions.rviSignalBuffer[p3IDX];
|
||||||
|
|
||||||
|
//
|
||||||
|
// Reading Bars ...
|
||||||
|
|
||||||
//
|
//
|
||||||
XOHCL zBar;
|
XOHCL zBar;
|
||||||
XOHCL cBar;
|
XOHCL cBar;
|
||||||
@@ -519,146 +626,6 @@ bool DetectXCAEAConditions(
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
|
||||||
bool isBarBullishVPattern =
|
|
||||||
pBar.IsBullish() &&
|
|
||||||
cBar.low > pBar.low &&
|
|
||||||
p2Bar.low > pBar.low;
|
|
||||||
|
|
||||||
//
|
|
||||||
bool isBarBearishVPattern =
|
|
||||||
pBar.IsBearish() &&
|
|
||||||
cBar.high < pBar.high &&
|
|
||||||
p2Bar.high < pBar.high;
|
|
||||||
|
|
||||||
//
|
|
||||||
// Detect Selected Box ...
|
|
||||||
XBoxZone selectedBox;
|
|
||||||
bool hasBoxes = HasChild(boxes);
|
|
||||||
if (hasBoxes)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
// Detect Selected Boxes ...
|
|
||||||
XBoxZone tmp[];
|
|
||||||
Copy(
|
|
||||||
boxes,
|
|
||||||
tmp //
|
|
||||||
);
|
|
||||||
while (HasChild(tmp))
|
|
||||||
{
|
|
||||||
//
|
|
||||||
idx = GetYoungest(tmp);
|
|
||||||
has = IsValidIndex(idx);
|
|
||||||
if (!has)
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
XBoxZone iBox;
|
|
||||||
iBox = tmp[idx];
|
|
||||||
ArrayRemove(
|
|
||||||
tmp,
|
|
||||||
idx,
|
|
||||||
1 //
|
|
||||||
);
|
|
||||||
|
|
||||||
//
|
|
||||||
// Check Selected Box not RSI or CCI ...
|
|
||||||
has = iBox.type == ToString(XCA_PEAKSWHRES) ||
|
|
||||||
iBox.type == ToString(XCA_VALESWLSUP);
|
|
||||||
if (!has)
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
bool isBullish = iBox.IsBullish();
|
|
||||||
bool isBearish = iBox.IsBearish();
|
|
||||||
|
|
||||||
//
|
|
||||||
double rejectedCheckPrice =
|
|
||||||
isBullish
|
|
||||||
? iBox.upper
|
|
||||||
: iBox.lower;
|
|
||||||
|
|
||||||
//
|
|
||||||
// Check Box Selecting Senarios ...
|
|
||||||
|
|
||||||
//
|
|
||||||
// Selecting Rejected Boxes ...
|
|
||||||
bool isRejected = cBar.IsRejected(
|
|
||||||
rejectedCheckPrice,
|
|
||||||
iBox.dir,
|
|
||||||
false,
|
|
||||||
false //
|
|
||||||
);
|
|
||||||
|
|
||||||
//
|
|
||||||
// Selecting Activation Boxes ...
|
|
||||||
|
|
||||||
//
|
|
||||||
bool isBullishActivated =
|
|
||||||
isBullish &&
|
|
||||||
isBarBullishVPattern &&
|
|
||||||
cBar.GetUp() > rejectedCheckPrice &&
|
|
||||||
cBar.GetDown() < rejectedCheckPrice;
|
|
||||||
|
|
||||||
//
|
|
||||||
bool isBearishActivated =
|
|
||||||
isBearish &&
|
|
||||||
isBarBearishVPattern &&
|
|
||||||
cBar.GetUp() > rejectedCheckPrice &&
|
|
||||||
cBar.GetDown() < rejectedCheckPrice;
|
|
||||||
|
|
||||||
//
|
|
||||||
bool isActivated = isBullishActivated ||
|
|
||||||
isBearishActivated;
|
|
||||||
|
|
||||||
//
|
|
||||||
has = // isRejected ||
|
|
||||||
isActivated;
|
|
||||||
if (has)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
selectedBox = iBox;
|
|
||||||
|
|
||||||
//
|
|
||||||
iBox.Clean();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
iBox.Clean();
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
Clean(tmp);
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Force Conditions to Have Selected Box ...
|
|
||||||
result = hasBoxes &&
|
|
||||||
selectedBox.IsValid();
|
|
||||||
if (!result)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
zBar.Clean();
|
|
||||||
cBar.Clean();
|
|
||||||
pBar.Clean();
|
|
||||||
p2Bar.Clean();
|
|
||||||
p3Bar.Clean();
|
|
||||||
p4Bar.Clean();
|
|
||||||
|
|
||||||
//
|
|
||||||
box.Clean();
|
|
||||||
conditions.Clean();
|
|
||||||
selectedBox.Clean();
|
|
||||||
|
|
||||||
//
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Bars Conditions ...
|
// Bars Conditions ...
|
||||||
|
|
||||||
@@ -745,6 +712,30 @@ bool DetectXCAEAConditions(
|
|||||||
isCBarBearishMomentum ||
|
isCBarBearishMomentum ||
|
||||||
isCBarBearishEngulfed);
|
isCBarBearishEngulfed);
|
||||||
|
|
||||||
|
//
|
||||||
|
double pBarLowShadow = pBar.GetLowShadow();
|
||||||
|
double pBarHighShadow = pBar.GetHighShadow();
|
||||||
|
|
||||||
|
//
|
||||||
|
bool isPBarSwingLow =
|
||||||
|
pBarLowShadow > 0 &&
|
||||||
|
pBar.low < p2Bar.low &&
|
||||||
|
pBar.low < cBar.low &&
|
||||||
|
p2Bar.GetUp() >= pBar.low &&
|
||||||
|
p2Bar.GetDown() <= pBar.high &&
|
||||||
|
cBar.GetUp() >= pBar.low &&
|
||||||
|
cBar.GetDown() <= pBar.high;
|
||||||
|
|
||||||
|
//
|
||||||
|
bool isPBarSwingHigh =
|
||||||
|
pBarHighShadow > 0 &&
|
||||||
|
pBar.high > p2Bar.high &&
|
||||||
|
pBar.high > cBar.high &&
|
||||||
|
p2Bar.GetUp() >= pBar.low &&
|
||||||
|
p2Bar.GetDown() <= pBar.high &&
|
||||||
|
cBar.GetUp() >= pBar.low &&
|
||||||
|
cBar.GetDown() <= pBar.high;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Score ...
|
// Score ...
|
||||||
|
|
||||||
@@ -769,174 +760,262 @@ bool DetectXCAEAConditions(
|
|||||||
conditions
|
conditions
|
||||||
.GenerateSummary();
|
.GenerateSummary();
|
||||||
|
|
||||||
|
//
|
||||||
|
// Detect Selected Box ...
|
||||||
|
double providedSL = 0;
|
||||||
|
bool isBoxRejected = false;
|
||||||
|
bool isBoxActivated = false;
|
||||||
|
bool hasBoxes = HasChild(boxes);
|
||||||
|
if (hasBoxes)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Detect Selected Boxes ...
|
||||||
|
XBoxZone tmp[];
|
||||||
|
Copy(
|
||||||
|
boxes,
|
||||||
|
tmp //
|
||||||
|
);
|
||||||
|
while (HasChild(tmp))
|
||||||
|
{
|
||||||
|
//
|
||||||
|
idx = GetYoungest(tmp);
|
||||||
|
has = IsValidIndex(idx);
|
||||||
|
if (!has)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
XBoxZone iBox;
|
||||||
|
iBox = tmp[idx];
|
||||||
|
ArrayRemove(
|
||||||
|
tmp,
|
||||||
|
idx,
|
||||||
|
1 //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Check Selected Box not RSI or CCI ...
|
||||||
|
has = iBox.type == ToString(XCA_PEAKSWHRES) ||
|
||||||
|
iBox.type == ToString(XCA_VALESWLSUP);
|
||||||
|
if (!has)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
bool isBullish = iBox.IsBullish();
|
||||||
|
bool isBearish = iBox.IsBearish();
|
||||||
|
|
||||||
|
//
|
||||||
|
double rejectedCheckPrice =
|
||||||
|
isBullish
|
||||||
|
? iBox.upper
|
||||||
|
: iBox.lower;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Check Box Selecting Senarios ...
|
||||||
|
|
||||||
|
//
|
||||||
|
// Selecting Rejected Boxes ...
|
||||||
|
isBoxRejected = cBar.IsRejected(
|
||||||
|
rejectedCheckPrice,
|
||||||
|
iBox.dir,
|
||||||
|
false,
|
||||||
|
false //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Selecting Activation Boxes ...
|
||||||
|
|
||||||
|
//
|
||||||
|
bool isBullishActivated =
|
||||||
|
isBullish &&
|
||||||
|
isPBarSwingLow &&
|
||||||
|
cBar.IsBullish() &&
|
||||||
|
cBar.GetUp() > rejectedCheckPrice &&
|
||||||
|
cBar.GetDown() < rejectedCheckPrice;
|
||||||
|
|
||||||
|
//
|
||||||
|
bool isBearishActivated =
|
||||||
|
isBearish &&
|
||||||
|
isPBarSwingHigh &&
|
||||||
|
cBar.IsBearish() &&
|
||||||
|
cBar.GetUp() > rejectedCheckPrice &&
|
||||||
|
cBar.GetDown() < rejectedCheckPrice;
|
||||||
|
|
||||||
|
//
|
||||||
|
isBoxActivated = isBullishActivated ||
|
||||||
|
isBearishActivated;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Detect Box is Selected or not ...
|
||||||
|
has =
|
||||||
|
isBoxRejected ||
|
||||||
|
isBoxActivated;
|
||||||
|
if (has)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
pivotBox = iBox;
|
||||||
|
|
||||||
|
//
|
||||||
|
iBox.Clean();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
iBox.Clean();
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
Clean(tmp);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Force Conditions to Have Selected Box ...
|
||||||
|
result = hasBoxes &&
|
||||||
|
pivotBox.IsValid();
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
zBar.Clean();
|
||||||
|
cBar.Clean();
|
||||||
|
pBar.Clean();
|
||||||
|
p2Bar.Clean();
|
||||||
|
p3Bar.Clean();
|
||||||
|
p4Bar.Clean();
|
||||||
|
|
||||||
|
//
|
||||||
|
box.Clean();
|
||||||
|
pivotBox.Clean();
|
||||||
|
conditions.Clean();
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Conditions ...
|
// Conditions ...
|
||||||
|
|
||||||
//
|
//
|
||||||
// Reading Values ...
|
bool isRSIBullish =
|
||||||
|
zRSI >= cRSI &&
|
||||||
|
cRSI > pRSI;
|
||||||
|
bool isRSIBearish =
|
||||||
|
zRSI <= cRSI &&
|
||||||
|
cRSI < pRSI;
|
||||||
|
|
||||||
//
|
//
|
||||||
// KI ...
|
bool isCCIBullish =
|
||||||
|
zCCI >= cCCI &&
|
||||||
|
cCCI > pCCI &&
|
||||||
|
(zCCI > conditions.cciOSLevel ||
|
||||||
|
cCCI > conditions.cciOSLevel);
|
||||||
|
bool isCCIBearish =
|
||||||
|
zCCI >= cCCI &&
|
||||||
|
cCCI > pCCI &&
|
||||||
|
(zCCI < conditions.cciOBLevel ||
|
||||||
|
cCCI < conditions.cciOBLevel);
|
||||||
|
|
||||||
//
|
//
|
||||||
double cKI = conditions.kiBuffer[cIDX];
|
bool isRVIBullish = false;
|
||||||
double pKI = conditions.kiBuffer[pIDX];
|
bool isRVIBearish = false;
|
||||||
double p2KI = conditions.kiBuffer[p2IDX];
|
|
||||||
|
|
||||||
//
|
//
|
||||||
double cKIState = conditions.kiStateBuffer[cIDX];
|
// Signaller Summarization ...
|
||||||
double pKIState = conditions.kiStateBuffer[pIDX];
|
|
||||||
double p2KIState = conditions.kiStateBuffer[p2IDX];
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// TKI ...
|
// Cond1 Act Using Box Activation ...
|
||||||
|
|
||||||
//
|
|
||||||
double cTKI = conditions.tkiBuffer[cIDX];
|
|
||||||
double pTKI = conditions.tkiBuffer[pIDX];
|
|
||||||
double p2TKI = conditions.tkiBuffer[p2IDX];
|
|
||||||
|
|
||||||
//
|
|
||||||
double cTKIState = conditions.tkiStateBuffer[cIDX];
|
|
||||||
double pTKIState = conditions.tkiStateBuffer[pIDX];
|
|
||||||
double p2TKIState = conditions.tkiStateBuffer[p2IDX];
|
|
||||||
|
|
||||||
//
|
|
||||||
// TREND ...
|
|
||||||
|
|
||||||
//
|
|
||||||
double cTrend = conditions.trendBuffer[cIDX];
|
|
||||||
double pTrend = conditions.trendBuffer[pIDX];
|
|
||||||
double p2Trend = conditions.trendBuffer[p2IDX];
|
|
||||||
|
|
||||||
//
|
|
||||||
double ctrendState = conditions.trendStateBuffer[cIDX];
|
|
||||||
double ptrendState = conditions.trendStateBuffer[pIDX];
|
|
||||||
double p2trendState = conditions.trendStateBuffer[p2IDX];
|
|
||||||
|
|
||||||
//
|
|
||||||
// SWING Low ...
|
|
||||||
|
|
||||||
//
|
|
||||||
double cSWL = conditions.swingLowBuffer[cIDX];
|
|
||||||
double pSWL = conditions.swingLowBuffer[pIDX];
|
|
||||||
double p2SWL = conditions.swingLowBuffer[p2IDX];
|
|
||||||
|
|
||||||
//
|
|
||||||
// SWING High ...
|
|
||||||
|
|
||||||
//
|
|
||||||
double cSWH = conditions.swingHighBuffer[cIDX];
|
|
||||||
double pSWH = conditions.swingHighBuffer[pIDX];
|
|
||||||
double p2SWH = conditions.swingHighBuffer[p2IDX];
|
|
||||||
|
|
||||||
//
|
|
||||||
// PEAK ...
|
|
||||||
|
|
||||||
//
|
|
||||||
double cPeak = conditions.peakBuffer[cIDX];
|
|
||||||
double pPeak = conditions.peakBuffer[pIDX];
|
|
||||||
double p2Peak = conditions.peakBuffer[p2IDX];
|
|
||||||
|
|
||||||
//
|
|
||||||
// VALE ...
|
|
||||||
|
|
||||||
//
|
|
||||||
double cVale = conditions.valeBuffer[cIDX];
|
|
||||||
double pVale = conditions.valeBuffer[pIDX];
|
|
||||||
double p2Vale = conditions.valeBuffer[p2IDX];
|
|
||||||
|
|
||||||
//
|
|
||||||
// COMPLEX ...
|
|
||||||
|
|
||||||
//
|
|
||||||
double iKTIRNDs[] = {
|
|
||||||
cKI,
|
|
||||||
cTKI,
|
|
||||||
cTrend //
|
|
||||||
};
|
|
||||||
|
|
||||||
//
|
|
||||||
double iKTIRNDMax = GetMax(iKTIRNDs);
|
|
||||||
double iKTIRNDMin = GetMin(iKTIRNDs);
|
|
||||||
|
|
||||||
//
|
|
||||||
// Conditions Preparing ...
|
|
||||||
|
|
||||||
//
|
|
||||||
bool isTKITRNDBullish =
|
|
||||||
cKIState > 0 &&
|
|
||||||
cTKIState > 0 &&
|
|
||||||
ctrendState > 0;
|
|
||||||
|
|
||||||
//
|
|
||||||
bool isTKITRNDBullishPrev =
|
|
||||||
pKIState > 0 &&
|
|
||||||
pTKIState > 0 &&
|
|
||||||
ptrendState > 0;
|
|
||||||
|
|
||||||
//
|
|
||||||
bool isTKITRNDBearish =
|
|
||||||
cKIState < 0 &&
|
|
||||||
cTKIState < 0 &&
|
|
||||||
ctrendState < 0;
|
|
||||||
|
|
||||||
//
|
|
||||||
bool isTKITRNDBearishPrev =
|
|
||||||
pKIState < 0 &&
|
|
||||||
pTKIState < 0 &&
|
|
||||||
ptrendState < 0;
|
|
||||||
|
|
||||||
//
|
|
||||||
bool isTKITRNDSwitchedToBullish =
|
|
||||||
isTKITRNDBullish &&
|
|
||||||
!isTKITRNDBullishPrev;
|
|
||||||
|
|
||||||
//
|
|
||||||
bool isTKITRNDSwitchedToBearish =
|
|
||||||
isTKITRNDBearish &&
|
|
||||||
!isTKITRNDBearishPrev;
|
|
||||||
|
|
||||||
//
|
//
|
||||||
bool isCond1Bullish =
|
bool isCond1Bullish =
|
||||||
// conditions.isRSIOS &&
|
//
|
||||||
// conditions.isValeIsPivot &&
|
false &&
|
||||||
// isTKITRNDSwitchedToBullish
|
isCCIBullish &&
|
||||||
conditions.isKISwitchedToBullish
|
isBoxActivated &&
|
||||||
|
pivotBox.IsValid() &&
|
||||||
|
pivotBox.IsBullish()
|
||||||
//
|
//
|
||||||
;
|
;
|
||||||
|
|
||||||
//
|
//
|
||||||
bool isCond1Bearish =
|
bool isCond1Bearish =
|
||||||
// conditions.isRSIOB &&
|
//
|
||||||
// conditions.isPeakIsPivot &&
|
false &&
|
||||||
// isTKITRNDSwitchedToBearish
|
isCCIBearish &&
|
||||||
conditions.isKISwitchedToBearish
|
isBoxActivated &&
|
||||||
|
pivotBox.IsValid() &&
|
||||||
|
pivotBox.IsBearish()
|
||||||
//
|
//
|
||||||
;
|
;
|
||||||
|
|
||||||
//
|
//
|
||||||
if (isCond1Bullish ||
|
bool isCond1 = isCond1Bullish ||
|
||||||
isCond1Bearish)
|
isCond1Bearish;
|
||||||
|
if (isCond1)
|
||||||
{
|
{
|
||||||
|
//
|
||||||
|
providedSL =
|
||||||
|
isCond1Bullish
|
||||||
|
? MathMin(pBar.low, pivotBox.lower)
|
||||||
|
: MathMax(pBar.high, pivotBox.upper);
|
||||||
|
|
||||||
//
|
//
|
||||||
Print("Cond1");
|
Print("Cond1");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Cond2 Act Using Box Rejection ...
|
||||||
|
|
||||||
|
//
|
||||||
|
bool isCond2Bullish =
|
||||||
|
//
|
||||||
|
isBoxRejected &&
|
||||||
|
pivotBox.IsValid() &&
|
||||||
|
pivotBox.IsBullish()
|
||||||
|
//
|
||||||
|
;
|
||||||
|
|
||||||
|
//
|
||||||
|
bool isCond2Bearish =
|
||||||
|
//
|
||||||
|
isBoxRejected &&
|
||||||
|
pivotBox.IsValid() &&
|
||||||
|
pivotBox.IsBearish()
|
||||||
|
//
|
||||||
|
;
|
||||||
|
|
||||||
|
//
|
||||||
|
bool isCond2 = isCond2Bullish ||
|
||||||
|
isCond2Bearish;
|
||||||
|
if (isCond2)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
providedSL =
|
||||||
|
isCond1Bullish
|
||||||
|
? MathMin(pBar.low, pivotBox.lower)
|
||||||
|
: MathMax(pBar.high, pivotBox.upper);
|
||||||
|
|
||||||
|
//
|
||||||
|
Print("Cond2");
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Summarise Conditions ...
|
// Summarise Conditions ...
|
||||||
|
|
||||||
//
|
//
|
||||||
bool isBullish =
|
bool isBullish =
|
||||||
//
|
//
|
||||||
false
|
isCond1Bullish ||
|
||||||
//
|
isCond2Bullish;
|
||||||
;
|
//
|
||||||
|
;
|
||||||
|
|
||||||
//
|
//
|
||||||
bool isBearish =
|
bool isBearish =
|
||||||
//
|
//
|
||||||
false
|
isCond1Bearish ||
|
||||||
|
isCond2Bearish
|
||||||
//
|
//
|
||||||
;
|
;
|
||||||
|
|
||||||
@@ -956,7 +1035,14 @@ bool DetectXCAEAConditions(
|
|||||||
conditions.symbol,
|
conditions.symbol,
|
||||||
dir //
|
dir //
|
||||||
);
|
);
|
||||||
double sl = 0; // conditions.kijunSenBuffer[cIDX];
|
|
||||||
|
//
|
||||||
|
double sl =
|
||||||
|
providedSL > 0
|
||||||
|
? providedSL
|
||||||
|
: isBullish
|
||||||
|
? pivotBox.lower
|
||||||
|
: pivotBox.upper;
|
||||||
|
|
||||||
//
|
//
|
||||||
box.dir = dir;
|
box.dir = dir;
|
||||||
@@ -980,7 +1066,7 @@ bool DetectXCAEAConditions(
|
|||||||
box.from = p4Bar.time;
|
box.from = p4Bar.time;
|
||||||
|
|
||||||
//
|
//
|
||||||
box.type = ToString(dir) + "_Signal_" + conditions.symbol + "_" + ToString(conditions.period);
|
box.type = "XCASignal";
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -995,6 +1081,7 @@ bool DetectXCAEAConditions(
|
|||||||
{
|
{
|
||||||
//
|
//
|
||||||
box.Clean();
|
box.Clean();
|
||||||
|
pivotBox.Clean();
|
||||||
conditions.Clean();
|
conditions.Clean();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -44,6 +44,7 @@ class XCXCAEASignaller : XCBase
|
|||||||
XCXCAEAHelper *helper;
|
XCXCAEAHelper *helper;
|
||||||
XCXCAEAPOIDrawer *drawer;
|
XCXCAEAPOIDrawer *drawer;
|
||||||
bool continuesRFTillTarget;
|
bool continuesRFTillTarget;
|
||||||
|
XBoxZone unAvailableBoxes[];
|
||||||
XCXCAEAPOIDetector *detector;
|
XCXCAEAPOIDetector *detector;
|
||||||
XCAEAStrategyConditions mConditions;
|
XCAEAStrategyConditions mConditions;
|
||||||
XCAEAStrategyConditions mConditionsCollection[];
|
XCAEAStrategyConditions mConditionsCollection[];
|
||||||
@@ -165,8 +166,13 @@ class XCXCAEASignaller : XCBase
|
|||||||
|
|
||||||
//
|
//
|
||||||
// Setup Conditions ...
|
// Setup Conditions ...
|
||||||
|
XBoxZone boxes[];
|
||||||
|
XBoxZone pivotBox;
|
||||||
XBoxZone signalBox;
|
XBoxZone signalBox;
|
||||||
|
XBoxZone bullishBoxes[];
|
||||||
|
XBoxZone bearishBoxes[];
|
||||||
bool hasSignalBox = false;
|
bool hasSignalBox = false;
|
||||||
|
XCAEAConditions conditions;
|
||||||
ENUM_X_DIRECTION signalBoxDir = X_DIRECTION_NONE;
|
ENUM_X_DIRECTION signalBoxDir = X_DIRECTION_NONE;
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -178,6 +184,7 @@ class XCXCAEASignaller : XCBase
|
|||||||
//
|
//
|
||||||
// Validate Pivots ...
|
// Validate Pivots ...
|
||||||
detector.Validate(
|
detector.Validate(
|
||||||
|
unAvailableBoxes,
|
||||||
zIndex //
|
zIndex //
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -190,18 +197,17 @@ class XCXCAEASignaller : XCBase
|
|||||||
|
|
||||||
//
|
//
|
||||||
// Bullish ...
|
// Bullish ...
|
||||||
XBoxZone bullishBoxes[];
|
int bullishBoxesCount =
|
||||||
int bullishBoxesCount = detector
|
detector
|
||||||
.FillBullishBoxes(bullishBoxes);
|
.FillBullishBoxes(bullishBoxes);
|
||||||
|
|
||||||
//
|
//
|
||||||
// Bearish ...
|
// Bearish ...
|
||||||
XBoxZone bearishBoxes[];
|
int bearishBoxesCount =
|
||||||
int bearishBoxesCount = detector
|
detector
|
||||||
.FillBearishBoxes(bearishBoxes);
|
.FillBearishBoxes(bearishBoxes);
|
||||||
|
|
||||||
//
|
//
|
||||||
XBoxZone boxes[];
|
|
||||||
Copy(
|
Copy(
|
||||||
bullishBoxes,
|
bullishBoxes,
|
||||||
boxes,
|
boxes,
|
||||||
@@ -215,24 +221,75 @@ class XCXCAEASignaller : XCBase
|
|||||||
int boxesCount = ArraySize(boxes);
|
int boxesCount = ArraySize(boxes);
|
||||||
bool hasBoxes = IsValidSize(boxesCount);
|
bool hasBoxes = IsValidSize(boxesCount);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Filter UnAvailable Boxes ...
|
||||||
|
if (hasBoxes)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Remove UnAvailable Boxes ...
|
||||||
|
has = HasChild(unAvailableBoxes);
|
||||||
|
if (has)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
count = ArraySize(unAvailableBoxes);
|
||||||
|
for (int i = 0; i < count; i++)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
XBoxZone iBox = unAvailableBoxes[i];
|
||||||
|
|
||||||
|
//
|
||||||
|
has = FindBoxIndex(
|
||||||
|
idx,
|
||||||
|
iBox,
|
||||||
|
boxes //
|
||||||
|
);
|
||||||
|
if (has)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
ArrayRemove(
|
||||||
|
boxes,
|
||||||
|
idx,
|
||||||
|
1 //
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
hasBoxes = HasChild(boxes);
|
||||||
|
boxesCount = ArraySize(boxes);
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
//
|
//
|
||||||
//
|
//
|
||||||
|
|
||||||
//
|
//
|
||||||
XCAEAConditions conditions;
|
|
||||||
if (hasBoxes)
|
if (hasBoxes)
|
||||||
{
|
{
|
||||||
//
|
//
|
||||||
|
// Detect Sinal Box ...
|
||||||
hasSignalBox = DetectXCAEAConditions(
|
hasSignalBox = DetectXCAEAConditions(
|
||||||
boxes,
|
boxes,
|
||||||
conditions,
|
conditions,
|
||||||
|
pivotBox,
|
||||||
signalBox,
|
signalBox,
|
||||||
signalBoxDir,
|
signalBoxDir,
|
||||||
helper,
|
helper,
|
||||||
zIndex,
|
zIndex,
|
||||||
loopback //
|
loopback //
|
||||||
);
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Make Pivot Box UnAvailable ...
|
||||||
|
if (pivotBox.IsValid())
|
||||||
|
{
|
||||||
|
//
|
||||||
|
AddRef(
|
||||||
|
pivotBox,
|
||||||
|
unAvailableBoxes //
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -360,11 +417,34 @@ class XCXCAEASignaller : XCBase
|
|||||||
rfReward++;
|
rfReward++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//
|
||||||
|
double rfReward = 2;
|
||||||
|
|
||||||
|
//
|
||||||
|
double rewardRF = risk * rfReward;
|
||||||
|
double rfTP =
|
||||||
|
isBullish
|
||||||
|
? entry + rewardRF
|
||||||
|
: entry - rewardRF;
|
||||||
|
|
||||||
|
//
|
||||||
|
Add(
|
||||||
|
rfTP,
|
||||||
|
mConditions.targets //
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Cleanup Resource ...
|
// Cleanup Resource ...
|
||||||
|
|
||||||
|
//
|
||||||
|
Clean(boxes);
|
||||||
|
Clean(bullishBoxes);
|
||||||
|
Clean(bearishBoxes);
|
||||||
|
|
||||||
//
|
//
|
||||||
zBar.Clean();
|
zBar.Clean();
|
||||||
cBar.Clean();
|
cBar.Clean();
|
||||||
@@ -372,6 +452,7 @@ class XCXCAEASignaller : XCBase
|
|||||||
pPBar.Clean();
|
pPBar.Clean();
|
||||||
|
|
||||||
//
|
//
|
||||||
|
pivotBox.Clean();
|
||||||
signalBox.Clean();
|
signalBox.Clean();
|
||||||
conditions.Clean();
|
conditions.Clean();
|
||||||
|
|
||||||
@@ -578,7 +659,7 @@ class XCXCAEASignaller : XCBase
|
|||||||
{
|
{
|
||||||
//
|
//
|
||||||
useGuards = false;
|
useGuards = false;
|
||||||
continuesRFTillTarget = true;
|
continuesRFTillTarget = false;
|
||||||
|
|
||||||
//
|
//
|
||||||
barTraker.Init(
|
barTraker.Init(
|
||||||
@@ -633,7 +714,7 @@ class XCXCAEASignaller : XCBase
|
|||||||
|
|
||||||
//
|
//
|
||||||
// Oscillators Views ...
|
// Oscillators Views ...
|
||||||
inputs.showCCI = false;
|
inputs.showCCI = true;
|
||||||
inputs.showRSI = false;
|
inputs.showRSI = false;
|
||||||
inputs.showMFI = false;
|
inputs.showMFI = false;
|
||||||
inputs.showRVI = false;
|
inputs.showRVI = false;
|
||||||
|
|||||||
Reference in New Issue
Block a user