last works ...
adding some tools to ch helper classes ...
This commit is contained in:
@@ -98,11 +98,12 @@ struct XCHHKInputs
|
||||
|
||||
//
|
||||
// Presentation ...
|
||||
bool showCurrent; // Show Current Cycle
|
||||
bool showShort; // Show Short Cycle
|
||||
bool showMedium; // Show Medium Cycle
|
||||
bool showLong; // Show Long Cycle
|
||||
bool showHind; // Show Hind Cycle
|
||||
bool ignoreShadows; // Ignore Bar Shadows
|
||||
bool showCurrent; // Show Current Cycle
|
||||
bool showShort; // Show Short Cycle
|
||||
bool showMedium; // Show Medium Cycle
|
||||
bool showLong; // Show Long Cycle
|
||||
bool showHind; // Show Hind Cycle
|
||||
|
||||
//
|
||||
// Constructor(s) ...
|
||||
@@ -133,6 +134,7 @@ struct XCHHKInputs
|
||||
hcPeriod = NULL;
|
||||
|
||||
//
|
||||
ignoreShadows = false;
|
||||
showCurrent = false;
|
||||
showShort = false;
|
||||
showMedium = false;
|
||||
@@ -158,6 +160,7 @@ struct XCHHKInputs
|
||||
hcPeriod = NULL;
|
||||
|
||||
//
|
||||
ignoreShadows = false;
|
||||
showCurrent = true;
|
||||
showShort = true;
|
||||
showMedium = true;
|
||||
@@ -790,6 +793,7 @@ public:
|
||||
//
|
||||
// Presentation ...
|
||||
"",
|
||||
mInputs.ignoreShadows,
|
||||
mInputs.showCurrent,
|
||||
mInputs.showShort,
|
||||
mInputs.showMedium,
|
||||
@@ -2453,6 +2457,863 @@ public:
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Tools ...
|
||||
|
||||
//
|
||||
double GetCyclesMaxHigh(
|
||||
int barIndex, // Bar Index
|
||||
ENUM_X_MARKET_CYCLES &cycles[] // Cycles
|
||||
)
|
||||
{
|
||||
//
|
||||
double result = 0;
|
||||
|
||||
//
|
||||
int cyclesCount = ArraySize(cycles);
|
||||
if (!IsValidSize(cyclesCount))
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
double values[];
|
||||
for (int i = 0; i < cyclesCount; i++)
|
||||
{
|
||||
//
|
||||
XOHCL iBar;
|
||||
bool isBarInited = false;
|
||||
|
||||
//
|
||||
switch (cycles[i])
|
||||
{
|
||||
//
|
||||
// CURRENT ...
|
||||
case X_MARKET_CYCLE_UNKNOWN:
|
||||
//
|
||||
isBarInited = CAsOHCL(
|
||||
iBar,
|
||||
barIndex //
|
||||
);
|
||||
break;
|
||||
|
||||
//
|
||||
// SHORT ...
|
||||
case X_MARKET_CYCLE_SHORT:
|
||||
//
|
||||
isBarInited = SAsOHCL(
|
||||
iBar,
|
||||
barIndex //
|
||||
);
|
||||
break;
|
||||
|
||||
//
|
||||
// MEDIUM ...
|
||||
case X_MARKET_CYCLE_MEDIUM:
|
||||
//
|
||||
isBarInited = MAsOHCL(
|
||||
iBar,
|
||||
barIndex //
|
||||
);
|
||||
break;
|
||||
|
||||
//
|
||||
// LONG ...
|
||||
case X_MARKET_CYCLE_LONG:
|
||||
//
|
||||
isBarInited = LAsOHCL(
|
||||
iBar,
|
||||
barIndex //
|
||||
);
|
||||
break;
|
||||
|
||||
//
|
||||
// HIND ...
|
||||
case X_MARKET_CYCLE_HIND:
|
||||
//
|
||||
isBarInited = HAsOHCL(
|
||||
iBar,
|
||||
barIndex //
|
||||
);
|
||||
break;
|
||||
}
|
||||
|
||||
//
|
||||
if (isBarInited)
|
||||
{
|
||||
//
|
||||
Add(
|
||||
iBar.high,
|
||||
values //
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
result = GetMax(values);
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
double GetCyclesMinHigh(
|
||||
int barIndex, // Bar Index
|
||||
ENUM_X_MARKET_CYCLES &cycles[] // Cycles
|
||||
)
|
||||
{
|
||||
//
|
||||
double result = 0;
|
||||
|
||||
//
|
||||
int cyclesCount = ArraySize(cycles);
|
||||
if (!IsValidSize(cyclesCount))
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
double values[];
|
||||
for (int i = 0; i < cyclesCount; i++)
|
||||
{
|
||||
//
|
||||
XOHCL iBar;
|
||||
bool isBarInited = false;
|
||||
|
||||
//
|
||||
switch (cycles[i])
|
||||
{
|
||||
//
|
||||
// CURRENT ...
|
||||
case X_MARKET_CYCLE_UNKNOWN:
|
||||
//
|
||||
isBarInited = CAsOHCL(
|
||||
iBar,
|
||||
barIndex //
|
||||
);
|
||||
break;
|
||||
|
||||
//
|
||||
// SHORT ...
|
||||
case X_MARKET_CYCLE_SHORT:
|
||||
//
|
||||
isBarInited = SAsOHCL(
|
||||
iBar,
|
||||
barIndex //
|
||||
);
|
||||
break;
|
||||
|
||||
//
|
||||
// MEDIUM ...
|
||||
case X_MARKET_CYCLE_MEDIUM:
|
||||
//
|
||||
isBarInited = MAsOHCL(
|
||||
iBar,
|
||||
barIndex //
|
||||
);
|
||||
break;
|
||||
|
||||
//
|
||||
// LONG ...
|
||||
case X_MARKET_CYCLE_LONG:
|
||||
//
|
||||
isBarInited = LAsOHCL(
|
||||
iBar,
|
||||
barIndex //
|
||||
);
|
||||
break;
|
||||
|
||||
//
|
||||
// HIND ...
|
||||
case X_MARKET_CYCLE_HIND:
|
||||
//
|
||||
isBarInited = HAsOHCL(
|
||||
iBar,
|
||||
barIndex //
|
||||
);
|
||||
break;
|
||||
}
|
||||
|
||||
//
|
||||
if (isBarInited)
|
||||
{
|
||||
//
|
||||
Add(
|
||||
iBar.high,
|
||||
values //
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
result = GetMin(values);
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
double GetCyclesMaxLow(
|
||||
int barIndex, // Bar Index
|
||||
ENUM_X_MARKET_CYCLES &cycles[] // Cycles
|
||||
)
|
||||
{
|
||||
//
|
||||
double result = 0;
|
||||
|
||||
//
|
||||
int cyclesCount = ArraySize(cycles);
|
||||
if (!IsValidSize(cyclesCount))
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
double values[];
|
||||
for (int i = 0; i < cyclesCount; i++)
|
||||
{
|
||||
//
|
||||
XOHCL iBar;
|
||||
bool isBarInited = false;
|
||||
|
||||
//
|
||||
switch (cycles[i])
|
||||
{
|
||||
//
|
||||
// CURRENT ...
|
||||
case X_MARKET_CYCLE_UNKNOWN:
|
||||
//
|
||||
isBarInited = CAsOHCL(
|
||||
iBar,
|
||||
barIndex //
|
||||
);
|
||||
break;
|
||||
|
||||
//
|
||||
// SHORT ...
|
||||
case X_MARKET_CYCLE_SHORT:
|
||||
//
|
||||
isBarInited = SAsOHCL(
|
||||
iBar,
|
||||
barIndex //
|
||||
);
|
||||
break;
|
||||
|
||||
//
|
||||
// MEDIUM ...
|
||||
case X_MARKET_CYCLE_MEDIUM:
|
||||
//
|
||||
isBarInited = MAsOHCL(
|
||||
iBar,
|
||||
barIndex //
|
||||
);
|
||||
break;
|
||||
|
||||
//
|
||||
// LONG ...
|
||||
case X_MARKET_CYCLE_LONG:
|
||||
//
|
||||
isBarInited = LAsOHCL(
|
||||
iBar,
|
||||
barIndex //
|
||||
);
|
||||
break;
|
||||
|
||||
//
|
||||
// HIND ...
|
||||
case X_MARKET_CYCLE_HIND:
|
||||
//
|
||||
isBarInited = HAsOHCL(
|
||||
iBar,
|
||||
barIndex //
|
||||
);
|
||||
break;
|
||||
}
|
||||
|
||||
//
|
||||
if (isBarInited)
|
||||
{
|
||||
//
|
||||
Add(
|
||||
iBar.low,
|
||||
values //
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
result = GetMax(values);
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
double GetCyclesMinLow(
|
||||
int barIndex, // Bar Index
|
||||
ENUM_X_MARKET_CYCLES &cycles[] // Cycles
|
||||
)
|
||||
{
|
||||
//
|
||||
double result = 0;
|
||||
|
||||
//
|
||||
int cyclesCount = ArraySize(cycles);
|
||||
if (!IsValidSize(cyclesCount))
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
double values[];
|
||||
for (int i = 0; i < cyclesCount; i++)
|
||||
{
|
||||
//
|
||||
XOHCL iBar;
|
||||
bool isBarInited = false;
|
||||
|
||||
//
|
||||
switch (cycles[i])
|
||||
{
|
||||
//
|
||||
// CURRENT ...
|
||||
case X_MARKET_CYCLE_UNKNOWN:
|
||||
//
|
||||
isBarInited = CAsOHCL(
|
||||
iBar,
|
||||
barIndex //
|
||||
);
|
||||
break;
|
||||
|
||||
//
|
||||
// SHORT ...
|
||||
case X_MARKET_CYCLE_SHORT:
|
||||
//
|
||||
isBarInited = SAsOHCL(
|
||||
iBar,
|
||||
barIndex //
|
||||
);
|
||||
break;
|
||||
|
||||
//
|
||||
// MEDIUM ...
|
||||
case X_MARKET_CYCLE_MEDIUM:
|
||||
//
|
||||
isBarInited = MAsOHCL(
|
||||
iBar,
|
||||
barIndex //
|
||||
);
|
||||
break;
|
||||
|
||||
//
|
||||
// LONG ...
|
||||
case X_MARKET_CYCLE_LONG:
|
||||
//
|
||||
isBarInited = LAsOHCL(
|
||||
iBar,
|
||||
barIndex //
|
||||
);
|
||||
break;
|
||||
|
||||
//
|
||||
// HIND ...
|
||||
case X_MARKET_CYCLE_HIND:
|
||||
//
|
||||
isBarInited = HAsOHCL(
|
||||
iBar,
|
||||
barIndex //
|
||||
);
|
||||
break;
|
||||
}
|
||||
|
||||
//
|
||||
if (isBarInited)
|
||||
{
|
||||
//
|
||||
Add(
|
||||
iBar.low,
|
||||
values //
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
result = GetMin(values);
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Calculate Bullish Power ...
|
||||
double GetBullishPower(
|
||||
int barIndex // Bar Index
|
||||
)
|
||||
{
|
||||
//
|
||||
double result = 0;
|
||||
|
||||
//
|
||||
XOHCL cBar;
|
||||
bool isInited = CAsOHCL(
|
||||
cBar,
|
||||
barIndex //
|
||||
);
|
||||
if (!isInited)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
if (cBar.IsBullish())
|
||||
{
|
||||
result += cBar.GetBody();
|
||||
}
|
||||
|
||||
//
|
||||
XOHCL sBar;
|
||||
isInited = SAsOHCL(
|
||||
sBar,
|
||||
barIndex //
|
||||
);
|
||||
if (!isInited)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
if (sBar.IsBullish())
|
||||
{
|
||||
result += sBar.GetBody();
|
||||
}
|
||||
|
||||
//
|
||||
XOHCL mBar;
|
||||
isInited = MAsOHCL(
|
||||
mBar,
|
||||
barIndex //
|
||||
);
|
||||
if (!isInited)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
if (mBar.IsBullish())
|
||||
{
|
||||
result += mBar.GetBody();
|
||||
}
|
||||
|
||||
//
|
||||
XOHCL lBar;
|
||||
isInited = LAsOHCL(
|
||||
lBar,
|
||||
barIndex //
|
||||
);
|
||||
if (!isInited)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
if (lBar.IsBullish())
|
||||
{
|
||||
result += lBar.GetBody();
|
||||
}
|
||||
|
||||
//
|
||||
XOHCL hBar;
|
||||
isInited = HAsOHCL(
|
||||
hBar,
|
||||
barIndex //
|
||||
);
|
||||
if (!isInited)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
if (hBar.IsBullish())
|
||||
{
|
||||
result += hBar.GetBody();
|
||||
}
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Calculate Bearish Power ...
|
||||
double GetBearishPower(
|
||||
int barIndex // Bar Index
|
||||
)
|
||||
{
|
||||
//
|
||||
double result = 0;
|
||||
|
||||
//
|
||||
XOHCL cBar;
|
||||
bool isInited = CAsOHCL(
|
||||
cBar,
|
||||
barIndex //
|
||||
);
|
||||
if (!isInited)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
if (cBar.IsBearish())
|
||||
{
|
||||
result += cBar.GetBody();
|
||||
}
|
||||
|
||||
//
|
||||
XOHCL sBar;
|
||||
isInited = SAsOHCL(
|
||||
sBar,
|
||||
barIndex //
|
||||
);
|
||||
if (!isInited)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
if (sBar.IsBearish())
|
||||
{
|
||||
result += sBar.GetBody();
|
||||
}
|
||||
|
||||
//
|
||||
XOHCL mBar;
|
||||
isInited = MAsOHCL(
|
||||
mBar,
|
||||
barIndex //
|
||||
);
|
||||
if (!isInited)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
if (mBar.IsBearish())
|
||||
{
|
||||
result += mBar.GetBody();
|
||||
}
|
||||
|
||||
//
|
||||
XOHCL lBar;
|
||||
isInited = LAsOHCL(
|
||||
lBar,
|
||||
barIndex //
|
||||
);
|
||||
if (!isInited)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
if (lBar.IsBearish())
|
||||
{
|
||||
result += lBar.GetBody();
|
||||
}
|
||||
|
||||
//
|
||||
XOHCL hBar;
|
||||
isInited = HAsOHCL(
|
||||
hBar,
|
||||
barIndex //
|
||||
);
|
||||
if (!isInited)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
if (hBar.IsBearish())
|
||||
{
|
||||
result += hBar.GetBody();
|
||||
}
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Check Bullish Power is Up ...
|
||||
bool HasBullishPower(
|
||||
int barIndex // Bar Index
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
double bullishPower = GetBullishPower(barIndex);
|
||||
double bearishPower = GetBearishPower(barIndex);
|
||||
|
||||
//
|
||||
result =
|
||||
//
|
||||
bearishPower >= 0 &&
|
||||
bullishPower > bearishPower
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Check Bearish Power is Up ...
|
||||
bool HasBearishPower(
|
||||
int barIndex // Bar Index
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
double bullishPower = GetBullishPower(barIndex);
|
||||
double bearishPower = GetBearishPower(barIndex);
|
||||
|
||||
//
|
||||
result =
|
||||
//
|
||||
bullishPower >= 0 &&
|
||||
bearishPower > bullishPower
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Check Bullish Power Increasing ...
|
||||
bool IsBullishPowerIncreasing(
|
||||
int barIndex, // Bar Index
|
||||
int loopback = 5 // Loopback
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
if (loopback <= 0)
|
||||
{
|
||||
loopback = 5;
|
||||
}
|
||||
|
||||
//
|
||||
double firstPower = GetBullishPower(barIndex);
|
||||
double lastPower = firstPower;
|
||||
for (int i = barIndex + 1; i < barIndex + loopback; i++)
|
||||
{
|
||||
//
|
||||
double iPower = GetBullishPower(i);
|
||||
|
||||
//
|
||||
result =
|
||||
//
|
||||
iPower > 0 &&
|
||||
firstPower > 0 &&
|
||||
lastPower > iPower
|
||||
//
|
||||
;
|
||||
if (!result)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
//
|
||||
lastPower = iPower;
|
||||
}
|
||||
|
||||
//
|
||||
if (result)
|
||||
{
|
||||
//
|
||||
result =
|
||||
//
|
||||
firstPower > lastPower
|
||||
//
|
||||
;
|
||||
}
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Check Bullish Power Decreasing ...
|
||||
bool IsBullishPowerDecreasing(
|
||||
int barIndex, // Bar Index
|
||||
int loopback = 5 // Loopback
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
if (loopback <= 0)
|
||||
{
|
||||
loopback = 5;
|
||||
}
|
||||
|
||||
//
|
||||
double firstPower = GetBullishPower(barIndex);
|
||||
double lastPower = firstPower;
|
||||
for (int i = barIndex + 1; i < barIndex + loopback; i++)
|
||||
{
|
||||
//
|
||||
double iPower = GetBullishPower(i);
|
||||
|
||||
//
|
||||
result =
|
||||
//
|
||||
iPower > 0 &&
|
||||
firstPower > 0 &&
|
||||
lastPower < iPower
|
||||
//
|
||||
;
|
||||
if (!result)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
//
|
||||
lastPower = iPower;
|
||||
}
|
||||
|
||||
//
|
||||
if (result)
|
||||
{
|
||||
//
|
||||
result =
|
||||
//
|
||||
firstPower < lastPower
|
||||
//
|
||||
;
|
||||
}
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Check Bearish Power Increasing ...
|
||||
bool IsBearishPowerIncreasing(
|
||||
int barIndex, // Bar Index
|
||||
int loopback = 5 // Loopback
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
if (loopback <= 0)
|
||||
{
|
||||
loopback = 5;
|
||||
}
|
||||
|
||||
//
|
||||
double firstPower = GetBearishPower(barIndex);
|
||||
double lastPower = firstPower;
|
||||
for (int i = barIndex + 1; i < barIndex + loopback; i++)
|
||||
{
|
||||
//
|
||||
double iPower = GetBearishPower(i);
|
||||
|
||||
//
|
||||
result =
|
||||
//
|
||||
iPower > 0 &&
|
||||
firstPower > 0 &&
|
||||
lastPower > iPower
|
||||
//
|
||||
;
|
||||
if (!result)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
//
|
||||
lastPower = iPower;
|
||||
}
|
||||
|
||||
//
|
||||
if (result)
|
||||
{
|
||||
//
|
||||
result =
|
||||
//
|
||||
firstPower > lastPower
|
||||
//
|
||||
;
|
||||
}
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Check Bearish Power Decreasing ...
|
||||
bool IsBearishPowerDecreasing(
|
||||
int barIndex, // Bar Index
|
||||
int loopback = 5 // Loopback
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
if (loopback <= 0)
|
||||
{
|
||||
loopback = 5;
|
||||
}
|
||||
|
||||
//
|
||||
double firstPower = GetBearishPower(barIndex);
|
||||
double lastPower = firstPower;
|
||||
for (int i = barIndex + 1; i < barIndex + loopback; i++)
|
||||
{
|
||||
//
|
||||
double iPower = GetBearishPower(i);
|
||||
|
||||
//
|
||||
result =
|
||||
//
|
||||
iPower > 0 &&
|
||||
firstPower > 0 &&
|
||||
lastPower < iPower
|
||||
//
|
||||
;
|
||||
if (!result)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
//
|
||||
lastPower = iPower;
|
||||
}
|
||||
|
||||
//
|
||||
if (result)
|
||||
{
|
||||
//
|
||||
result =
|
||||
//
|
||||
firstPower < lastPower
|
||||
//
|
||||
;
|
||||
}
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Conditions ...
|
||||
|
||||
@@ -2569,9 +3430,9 @@ public:
|
||||
|
||||
//
|
||||
bool isCSwitchedToBullish = isCBullish &&
|
||||
!isCBullishPrev;
|
||||
!isCBullishPrev;
|
||||
bool isCSwitchedToBearish = isCBearish &&
|
||||
!isCBearishPrev;
|
||||
!isCBearishPrev;
|
||||
|
||||
//
|
||||
bool isCloseOverCHigh = cBar.close > conditions.cBars[cIndex].high;
|
||||
@@ -2600,9 +3461,9 @@ public:
|
||||
|
||||
//
|
||||
bool isSSwitchedToBullish = isSBullish &&
|
||||
!isSBullishPrev;
|
||||
!isSBullishPrev;
|
||||
bool isSSwitchedToBearish = isSBearish &&
|
||||
!isSBearishPrev;
|
||||
!isSBearishPrev;
|
||||
|
||||
//
|
||||
bool isCloseOverSHigh = cBar.close > conditions.sBars[cIndex].high;
|
||||
@@ -2631,9 +3492,9 @@ public:
|
||||
|
||||
//
|
||||
bool isMSwitchedToBullish = isMBullish &&
|
||||
!isMBullishPrev;
|
||||
!isMBullishPrev;
|
||||
bool isMSwitchedToBearish = isMBearish &&
|
||||
!isMBearishPrev;
|
||||
!isMBearishPrev;
|
||||
|
||||
//
|
||||
bool isCloseOverMHigh = cBar.close > conditions.mBars[cIndex].high;
|
||||
@@ -2662,9 +3523,9 @@ public:
|
||||
|
||||
//
|
||||
bool isLSwitchedToBullish = isLBullish &&
|
||||
!isLBullishPrev;
|
||||
!isLBullishPrev;
|
||||
bool isLSwitchedToBearish = isLBearish &&
|
||||
!isLBearishPrev;
|
||||
!isLBearishPrev;
|
||||
|
||||
//
|
||||
bool isCloseOverLHigh = cBar.close > conditions.lBars[cIndex].high;
|
||||
@@ -2693,9 +3554,9 @@ public:
|
||||
|
||||
//
|
||||
bool isHSwitchedToBullish = isHBullish &&
|
||||
!isHBullishPrev;
|
||||
!isHBullishPrev;
|
||||
bool isHSwitchedToBearish = isHBearish &&
|
||||
!isHBearishPrev;
|
||||
!isHBearishPrev;
|
||||
|
||||
//
|
||||
bool isCloseOverHHigh = cBar.close > conditions.hBars[cIndex].high;
|
||||
|
||||
@@ -1585,6 +1585,794 @@ public:
|
||||
);
|
||||
}
|
||||
|
||||
//
|
||||
// Tools ...
|
||||
|
||||
//
|
||||
double GetCyclesMaxFast(
|
||||
int barIndex, // Bar Index
|
||||
ENUM_X_MARKET_CYCLES &cycles[] // Cycles
|
||||
)
|
||||
{
|
||||
//
|
||||
double result = 0;
|
||||
|
||||
//
|
||||
int cyclesCount = ArraySize(cycles);
|
||||
if (!IsValidSize(cyclesCount))
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
double values[];
|
||||
for (int i = 0; i < cyclesCount; i++)
|
||||
{
|
||||
//
|
||||
double iValue = 0;
|
||||
|
||||
//
|
||||
switch (cycles[i])
|
||||
{
|
||||
//
|
||||
// CURRENT ...
|
||||
case X_MARKET_CYCLE_UNKNOWN:
|
||||
//
|
||||
iValue = GetCFast(barIndex);
|
||||
break;
|
||||
|
||||
//
|
||||
// SHORT ...
|
||||
case X_MARKET_CYCLE_SHORT:
|
||||
//
|
||||
iValue = GetSFast(barIndex);
|
||||
break;
|
||||
|
||||
//
|
||||
// MEDIUM ...
|
||||
case X_MARKET_CYCLE_MEDIUM:
|
||||
//
|
||||
iValue = GetMFast(barIndex);
|
||||
break;
|
||||
|
||||
//
|
||||
// LONG ...
|
||||
case X_MARKET_CYCLE_LONG:
|
||||
//
|
||||
iValue = GetLFast(barIndex);
|
||||
break;
|
||||
|
||||
//
|
||||
// HIND ...
|
||||
case X_MARKET_CYCLE_HIND:
|
||||
//
|
||||
iValue = GetHFast(barIndex);
|
||||
break;
|
||||
}
|
||||
|
||||
//
|
||||
if (iValue > 0)
|
||||
{
|
||||
//
|
||||
Add(
|
||||
iValue,
|
||||
values //
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
result = GetMax(values);
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
double GetCyclesMinFast(
|
||||
int barIndex, // Bar Index
|
||||
ENUM_X_MARKET_CYCLES &cycles[] // Cycles
|
||||
)
|
||||
{
|
||||
//
|
||||
double result = 0;
|
||||
|
||||
//
|
||||
int cyclesCount = ArraySize(cycles);
|
||||
if (!IsValidSize(cyclesCount))
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
double values[];
|
||||
for (int i = 0; i < cyclesCount; i++)
|
||||
{
|
||||
//
|
||||
double iValue = 0;
|
||||
|
||||
//
|
||||
switch (cycles[i])
|
||||
{
|
||||
//
|
||||
// CURRENT ...
|
||||
case X_MARKET_CYCLE_UNKNOWN:
|
||||
//
|
||||
iValue = GetCFast(barIndex);
|
||||
break;
|
||||
|
||||
//
|
||||
// SHORT ...
|
||||
case X_MARKET_CYCLE_SHORT:
|
||||
//
|
||||
iValue = GetSFast(barIndex);
|
||||
break;
|
||||
|
||||
//
|
||||
// MEDIUM ...
|
||||
case X_MARKET_CYCLE_MEDIUM:
|
||||
//
|
||||
iValue = GetMFast(barIndex);
|
||||
break;
|
||||
|
||||
//
|
||||
// LONG ...
|
||||
case X_MARKET_CYCLE_LONG:
|
||||
//
|
||||
iValue = GetLFast(barIndex);
|
||||
break;
|
||||
|
||||
//
|
||||
// HIND ...
|
||||
case X_MARKET_CYCLE_HIND:
|
||||
//
|
||||
iValue = GetHFast(barIndex);
|
||||
break;
|
||||
}
|
||||
|
||||
//
|
||||
if (iValue > 0)
|
||||
{
|
||||
//
|
||||
Add(
|
||||
iValue,
|
||||
values //
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
result = GetMin(values);
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
double GetCyclesMaxSlow(
|
||||
int barIndex, // Bar Index
|
||||
ENUM_X_MARKET_CYCLES &cycles[] // Cycles
|
||||
)
|
||||
{
|
||||
//
|
||||
double result = 0;
|
||||
|
||||
//
|
||||
int cyclesCount = ArraySize(cycles);
|
||||
if (!IsValidSize(cyclesCount))
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
double values[];
|
||||
for (int i = 0; i < cyclesCount; i++)
|
||||
{
|
||||
//
|
||||
double iValue = 0;
|
||||
|
||||
//
|
||||
switch (cycles[i])
|
||||
{
|
||||
//
|
||||
// CURRENT ...
|
||||
case X_MARKET_CYCLE_UNKNOWN:
|
||||
//
|
||||
iValue = GetCSlow(barIndex);
|
||||
break;
|
||||
|
||||
//
|
||||
// SHORT ...
|
||||
case X_MARKET_CYCLE_SHORT:
|
||||
//
|
||||
iValue = GetSSlow(barIndex);
|
||||
break;
|
||||
|
||||
//
|
||||
// MEDIUM ...
|
||||
case X_MARKET_CYCLE_MEDIUM:
|
||||
//
|
||||
iValue = GetMSlow(barIndex);
|
||||
break;
|
||||
|
||||
//
|
||||
// LONG ...
|
||||
case X_MARKET_CYCLE_LONG:
|
||||
//
|
||||
iValue = GetLSlow(barIndex);
|
||||
break;
|
||||
|
||||
//
|
||||
// HIND ...
|
||||
case X_MARKET_CYCLE_HIND:
|
||||
//
|
||||
iValue = GetHSlow(barIndex);
|
||||
break;
|
||||
}
|
||||
|
||||
//
|
||||
if (iValue > 0)
|
||||
{
|
||||
//
|
||||
Add(
|
||||
iValue,
|
||||
values //
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
result = GetMax(values);
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
double GetCyclesMinSlow(
|
||||
int barIndex, // Bar Index
|
||||
ENUM_X_MARKET_CYCLES &cycles[] // Cycles
|
||||
)
|
||||
{
|
||||
//
|
||||
double result = 0;
|
||||
|
||||
//
|
||||
int cyclesCount = ArraySize(cycles);
|
||||
if (!IsValidSize(cyclesCount))
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
double values[];
|
||||
for (int i = 0; i < cyclesCount; i++)
|
||||
{
|
||||
//
|
||||
double iValue = 0;
|
||||
|
||||
//
|
||||
switch (cycles[i])
|
||||
{
|
||||
//
|
||||
// CURRENT ...
|
||||
case X_MARKET_CYCLE_UNKNOWN:
|
||||
//
|
||||
iValue = GetCSlow(barIndex);
|
||||
break;
|
||||
|
||||
//
|
||||
// SHORT ...
|
||||
case X_MARKET_CYCLE_SHORT:
|
||||
//
|
||||
iValue = GetSSlow(barIndex);
|
||||
break;
|
||||
|
||||
//
|
||||
// MEDIUM ...
|
||||
case X_MARKET_CYCLE_MEDIUM:
|
||||
//
|
||||
iValue = GetMSlow(barIndex);
|
||||
break;
|
||||
|
||||
//
|
||||
// LONG ...
|
||||
case X_MARKET_CYCLE_LONG:
|
||||
//
|
||||
iValue = GetLSlow(barIndex);
|
||||
break;
|
||||
|
||||
//
|
||||
// HIND ...
|
||||
case X_MARKET_CYCLE_HIND:
|
||||
//
|
||||
iValue = GetHSlow(barIndex);
|
||||
break;
|
||||
}
|
||||
|
||||
//
|
||||
if (iValue > 0)
|
||||
{
|
||||
//
|
||||
Add(
|
||||
iValue,
|
||||
values //
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
result = GetMin(values);
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
double GetCyclesMax(
|
||||
int barIndex, // Bar Index
|
||||
ENUM_X_MARKET_CYCLES &cycles[] // Cycles
|
||||
)
|
||||
{
|
||||
//
|
||||
double result = 0;
|
||||
|
||||
//
|
||||
double maxFast = GetCyclesMaxFast(
|
||||
barIndex,
|
||||
cycles //
|
||||
);
|
||||
double maxSlow = GetCyclesMaxSlow(
|
||||
barIndex,
|
||||
cycles //
|
||||
);
|
||||
|
||||
//
|
||||
result = MathMax(maxFast, maxSlow);
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
double GetCyclesMin(
|
||||
int barIndex, // Bar Index
|
||||
ENUM_X_MARKET_CYCLES &cycles[] // Cycles
|
||||
)
|
||||
{
|
||||
//
|
||||
double result = 0;
|
||||
|
||||
//
|
||||
double minFast = GetCyclesMinFast(
|
||||
barIndex,
|
||||
cycles //
|
||||
);
|
||||
double minSlow = GetCyclesMinSlow(
|
||||
barIndex,
|
||||
cycles //
|
||||
);
|
||||
|
||||
//
|
||||
result = MathMin(minFast, minSlow);
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Calculate Bullish Power ...
|
||||
double GetBullishPower(
|
||||
int barIndex // Bar Index
|
||||
)
|
||||
{
|
||||
//
|
||||
double result = 0;
|
||||
|
||||
//
|
||||
double fast = 0;
|
||||
double slow = 0;
|
||||
double delta = 0;
|
||||
|
||||
//
|
||||
// CURRENT ...
|
||||
fast = GetCFast(barIndex);
|
||||
slow = GetCSlow(barIndex);
|
||||
delta = MathAbs(fast - slow);
|
||||
if (fast > slow)
|
||||
{
|
||||
result += delta;
|
||||
}
|
||||
|
||||
//
|
||||
// SHORT ...
|
||||
fast = GetSFast(barIndex);
|
||||
slow = GetSSlow(barIndex);
|
||||
delta = MathAbs(fast - slow);
|
||||
if (fast > slow)
|
||||
{
|
||||
result += delta;
|
||||
}
|
||||
|
||||
//
|
||||
// MEDIUM ...
|
||||
fast = GetMFast(barIndex);
|
||||
slow = GetMSlow(barIndex);
|
||||
delta = MathAbs(fast - slow);
|
||||
if (fast > slow)
|
||||
{
|
||||
result += delta;
|
||||
}
|
||||
|
||||
//
|
||||
// LONG ...
|
||||
fast = GetLFast(barIndex);
|
||||
slow = GetLSlow(barIndex);
|
||||
delta = MathAbs(fast - slow);
|
||||
if (fast > slow)
|
||||
{
|
||||
result += delta;
|
||||
}
|
||||
|
||||
//
|
||||
// HIND ...
|
||||
fast = GetHFast(barIndex);
|
||||
slow = GetHSlow(barIndex);
|
||||
delta = MathAbs(fast - slow);
|
||||
if (fast > slow)
|
||||
{
|
||||
result += delta;
|
||||
}
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Calculate Bearish Power ...
|
||||
double GetBearishPower(
|
||||
int barIndex // Bar Index
|
||||
)
|
||||
{
|
||||
//
|
||||
double result = 0;
|
||||
|
||||
//
|
||||
double fast = 0;
|
||||
double slow = 0;
|
||||
double delta = 0;
|
||||
|
||||
//
|
||||
// CURRENT ...
|
||||
fast = GetCFast(barIndex);
|
||||
slow = GetCSlow(barIndex);
|
||||
delta = MathAbs(slow - fast);
|
||||
if (fast < slow)
|
||||
{
|
||||
result += delta;
|
||||
}
|
||||
|
||||
//
|
||||
// SHORT ...
|
||||
fast = GetSFast(barIndex);
|
||||
slow = GetSSlow(barIndex);
|
||||
delta = MathAbs(slow - fast);
|
||||
if (fast < slow)
|
||||
{
|
||||
result += delta;
|
||||
}
|
||||
|
||||
//
|
||||
// MEDIUM ...
|
||||
fast = GetMFast(barIndex);
|
||||
slow = GetMSlow(barIndex);
|
||||
delta = MathAbs(slow - fast);
|
||||
if (fast < slow)
|
||||
{
|
||||
result += delta;
|
||||
}
|
||||
|
||||
//
|
||||
// LONG ...
|
||||
fast = GetLFast(barIndex);
|
||||
slow = GetLSlow(barIndex);
|
||||
delta = MathAbs(slow - fast);
|
||||
if (fast < slow)
|
||||
{
|
||||
result += delta;
|
||||
}
|
||||
|
||||
//
|
||||
// HIND ...
|
||||
fast = GetHFast(barIndex);
|
||||
slow = GetHSlow(barIndex);
|
||||
delta = MathAbs(slow - fast);
|
||||
if (fast < slow)
|
||||
{
|
||||
result += delta;
|
||||
}
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Check Bullish Power is Up ...
|
||||
bool HasBullishPower(
|
||||
int barIndex // Bar Index
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
double bullishPower = GetBullishPower(barIndex);
|
||||
double bearishPower = GetBearishPower(barIndex);
|
||||
|
||||
//
|
||||
result =
|
||||
//
|
||||
bearishPower >= 0 &&
|
||||
bullishPower > bearishPower
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Check Bearish Power is Up ...
|
||||
bool HasBearishPower(
|
||||
int barIndex // Bar Index
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
double bullishPower = GetBullishPower(barIndex);
|
||||
double bearishPower = GetBearishPower(barIndex);
|
||||
|
||||
//
|
||||
result =
|
||||
//
|
||||
bullishPower >= 0 &&
|
||||
bearishPower > bullishPower
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Check Bullish Power Increasing ...
|
||||
bool IsBullishPowerIncreasing(
|
||||
int barIndex, // Bar Index
|
||||
int loopback = 5 // Loopback
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
if (loopback <= 0)
|
||||
{
|
||||
loopback = 5;
|
||||
}
|
||||
|
||||
//
|
||||
double firstPower = GetBullishPower(barIndex);
|
||||
double lastPower = firstPower;
|
||||
for (int i = barIndex + 1; i < barIndex + loopback; i++)
|
||||
{
|
||||
//
|
||||
double iPower = GetBullishPower(i);
|
||||
|
||||
//
|
||||
result =
|
||||
//
|
||||
iPower > 0 &&
|
||||
firstPower > 0 &&
|
||||
lastPower > iPower
|
||||
//
|
||||
;
|
||||
if (!result)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
//
|
||||
lastPower = iPower;
|
||||
}
|
||||
|
||||
//
|
||||
if (result)
|
||||
{
|
||||
//
|
||||
result =
|
||||
//
|
||||
firstPower > lastPower
|
||||
//
|
||||
;
|
||||
}
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Check Bullish Power Decreasing ...
|
||||
bool IsBullishPowerDecreasing(
|
||||
int barIndex, // Bar Index
|
||||
int loopback = 5 // Loopback
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
if (loopback <= 0)
|
||||
{
|
||||
loopback = 5;
|
||||
}
|
||||
|
||||
//
|
||||
double firstPower = GetBullishPower(barIndex);
|
||||
double lastPower = firstPower;
|
||||
for (int i = barIndex + 1; i < barIndex + loopback; i++)
|
||||
{
|
||||
//
|
||||
double iPower = GetBullishPower(i);
|
||||
|
||||
//
|
||||
result =
|
||||
//
|
||||
iPower > 0 &&
|
||||
firstPower > 0 &&
|
||||
lastPower < iPower
|
||||
//
|
||||
;
|
||||
if (!result)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
//
|
||||
lastPower = iPower;
|
||||
}
|
||||
|
||||
//
|
||||
if (result)
|
||||
{
|
||||
//
|
||||
result =
|
||||
//
|
||||
firstPower < lastPower
|
||||
//
|
||||
;
|
||||
}
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Check Bearish Power Increasing ...
|
||||
bool IsBearishPowerIncreasing(
|
||||
int barIndex, // Bar Index
|
||||
int loopback = 5 // Loopback
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
if (loopback <= 0)
|
||||
{
|
||||
loopback = 5;
|
||||
}
|
||||
|
||||
//
|
||||
double firstPower = GetBearishPower(barIndex);
|
||||
double lastPower = firstPower;
|
||||
for (int i = barIndex + 1; i < barIndex + loopback; i++)
|
||||
{
|
||||
//
|
||||
double iPower = GetBearishPower(i);
|
||||
|
||||
//
|
||||
result =
|
||||
//
|
||||
iPower > 0 &&
|
||||
firstPower > 0 &&
|
||||
lastPower > iPower
|
||||
//
|
||||
;
|
||||
if (!result)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
//
|
||||
lastPower = iPower;
|
||||
}
|
||||
|
||||
//
|
||||
if (result)
|
||||
{
|
||||
//
|
||||
result =
|
||||
//
|
||||
firstPower > lastPower
|
||||
//
|
||||
;
|
||||
}
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Check Bearish Power Decreasing ...
|
||||
bool IsBearishPowerDecreasing(
|
||||
int barIndex, // Bar Index
|
||||
int loopback = 5 // Loopback
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
if (loopback <= 0)
|
||||
{
|
||||
loopback = 5;
|
||||
}
|
||||
|
||||
//
|
||||
double firstPower = GetBearishPower(barIndex);
|
||||
double lastPower = firstPower;
|
||||
for (int i = barIndex + 1; i < barIndex + loopback; i++)
|
||||
{
|
||||
//
|
||||
double iPower = GetBearishPower(i);
|
||||
|
||||
//
|
||||
result =
|
||||
//
|
||||
iPower > 0 &&
|
||||
firstPower > 0 &&
|
||||
lastPower < iPower
|
||||
//
|
||||
;
|
||||
if (!result)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
//
|
||||
lastPower = iPower;
|
||||
}
|
||||
|
||||
//
|
||||
if (result)
|
||||
{
|
||||
//
|
||||
result =
|
||||
//
|
||||
firstPower < lastPower
|
||||
//
|
||||
;
|
||||
}
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Conditions ...
|
||||
|
||||
//
|
||||
bool GetConditions(
|
||||
XCHMConditions &conditions, //
|
||||
|
||||
Reference in New Issue
Block a user