last ...
This commit is contained in:
@@ -908,7 +908,112 @@ class XCMarketPatternDetector : public XCBase
|
||||
return result;
|
||||
}
|
||||
|
||||
bool HasTrend(
|
||||
/**
|
||||
* Check Specified Bar has SignalKey Bar Pattern or not ...
|
||||
*
|
||||
* @param bar: XOHCL, Specified Bar ...
|
||||
* @param dir: ENUM_X_DIRECTION a reference for Direction ...
|
||||
* @param shadowApprovedMultiplier: int, Shadow Size Approve Multiplier ...
|
||||
* @param minimumPinBarRangeMultiplier: doubble, Range Size Approve Multiplier in Point ...
|
||||
* @param forceDirection: bool, Apply Force Bar Type ...
|
||||
*
|
||||
* @return ( bool )
|
||||
*/
|
||||
bool IsSignalKeyBarPattern(
|
||||
XOHCL &bar,
|
||||
ENUM_X_DIRECTION &dir,
|
||||
int shadowApprovedMultiplier = 3,
|
||||
double minimumPinBarRangeMultiplier = 4,
|
||||
bool forceDirection = false //
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
// Prepare ...
|
||||
CleanDirection(dir);
|
||||
|
||||
//
|
||||
// Validate ...
|
||||
result = bar.IsValid();
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Get Requirements ...
|
||||
XOHCL pBar;
|
||||
result = bar.GetPreviousBar(pBar);
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Chck Previous Bar must Pinned ...
|
||||
result = IsPinnedBar(
|
||||
pBar,
|
||||
dir,
|
||||
shadowApprovedMultiplier,
|
||||
minimumPinBarRangeMultiplier,
|
||||
forceDirection //
|
||||
);
|
||||
if (!result)
|
||||
{
|
||||
//
|
||||
pBar.Clean();
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Check Direction ...
|
||||
bool isBullish =
|
||||
bar.IsBullish() &&
|
||||
IsSpecifiedBullish(dir) &&
|
||||
bar.close > pBar.high;
|
||||
bool isBearish =
|
||||
bar.IsBearish() &&
|
||||
IsSpecifiedBearish(dir) &&
|
||||
bar.close < pBar.low;
|
||||
result = isBullish || isBearish;
|
||||
if (!result)
|
||||
{
|
||||
//
|
||||
pBar.Clean();
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
dir = bar.GetDirection();
|
||||
|
||||
//
|
||||
result = HasDirection(dir);
|
||||
|
||||
//
|
||||
// Cleanup Resources ...
|
||||
pBar.Clean();
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Trending ...
|
||||
|
||||
/**
|
||||
* Check Trend Exists Based on Swings ...
|
||||
*
|
||||
* @param bar: XOHCL, Specified Bar ...
|
||||
* @param dir: ENUM_X_DIRECTION a reference for Direction ...
|
||||
* @param swings: XOHCL Array, Holds Swings ...
|
||||
* @param numberOfSwings: int, Number of Swing Points for Detect Trend ...
|
||||
* @param swingShoulders: int, Swing Shoulders Approvement Length ...
|
||||
*
|
||||
* @return ( bool )
|
||||
*/
|
||||
bool HasSwingTrend(
|
||||
XOHCL &bar,
|
||||
ENUM_X_DIRECTION &dir,
|
||||
XOHCL &swings[],
|
||||
@@ -1031,7 +1136,128 @@ class XCMarketPatternDetector : public XCBase
|
||||
|
||||
//
|
||||
// Check Trend Based On Swings ...
|
||||
|
||||
|
||||
//
|
||||
// Check Directions ...
|
||||
|
||||
//
|
||||
bool isBullish = false;
|
||||
bool isBearish = false;
|
||||
|
||||
//
|
||||
datetime oldestSwingLow = NULL;
|
||||
datetime oldestSwingHigh = NULL;
|
||||
|
||||
//
|
||||
// Checking Bullish Trend based on Swing Lows ...
|
||||
int count = ArraySize(swingLows);
|
||||
for (int i = 0; i < count - 1; i++)
|
||||
{
|
||||
//
|
||||
has = swingLows[i].low > swingLows[i + 1].low;
|
||||
isBullish =
|
||||
!isBullish
|
||||
? has
|
||||
: isBullish && has;
|
||||
if (!isBullish)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
//
|
||||
datetime oldeTime = MathMin(swingLows[i].time, swingLows[i + 1].time);
|
||||
oldestSwingLow =
|
||||
!IsSpecifiedValid(oldestSwingLow)
|
||||
? oldeTime
|
||||
: MathMin(oldestSwingLow, oldeTime);
|
||||
}
|
||||
|
||||
//
|
||||
// Checking Bearish Trend based on Swing Highs ...
|
||||
count = ArraySize(swingHighs);
|
||||
for (int i = 0; i < count - 1; i++)
|
||||
{
|
||||
//
|
||||
has = swingHighs[i].high < swingHighs[i + 1].high;
|
||||
isBearish =
|
||||
!isBearish
|
||||
? has
|
||||
: isBearish && has;
|
||||
if (!isBearish)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
//
|
||||
datetime oldeTime = MathMin(swingHighs[i].time, swingHighs[i + 1].time);
|
||||
oldestSwingHigh =
|
||||
!IsSpecifiedValid(oldestSwingHigh)
|
||||
? oldeTime
|
||||
: MathMin(oldestSwingHigh, oldeTime);
|
||||
}
|
||||
|
||||
//
|
||||
result = isBullish || isBearish;
|
||||
if (!result)
|
||||
{
|
||||
//
|
||||
iSwing.Clean();
|
||||
SpecifiedClean(swingLows);
|
||||
SpecifiedClean(swingHighs);
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
if (isBullish &&
|
||||
isBearish &&
|
||||
IsSpecifiedValid(oldestSwingLow) &&
|
||||
IsSpecifiedValid(oldestSwingHigh))
|
||||
{
|
||||
//
|
||||
// Here we Have to Detect Newest Trend or Oldest Trend ...
|
||||
isBullish = oldestSwingLow < oldestSwingHigh;
|
||||
isBearish = oldestSwingHigh < oldestSwingLow;
|
||||
}
|
||||
|
||||
//
|
||||
result = (isBullish && !isBearish) ||
|
||||
(isBearish && !isBullish);
|
||||
if (!result)
|
||||
{
|
||||
//
|
||||
iSwing.Clean();
|
||||
SpecifiedClean(swingLows);
|
||||
SpecifiedClean(swingHighs);
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
if (isBullish)
|
||||
{
|
||||
//
|
||||
Copy(
|
||||
swingLows,
|
||||
swings //
|
||||
);
|
||||
|
||||
//
|
||||
dir = X_DIRECTION_BULLISH;
|
||||
}
|
||||
else
|
||||
{
|
||||
//
|
||||
Copy(
|
||||
swingHighs,
|
||||
swings //
|
||||
);
|
||||
|
||||
//
|
||||
dir = X_DIRECTION_BEARISH;
|
||||
}
|
||||
|
||||
//
|
||||
iSwing.Clean();
|
||||
|
||||
Reference in New Issue
Block a user