544 lines
14 KiB
Plaintext
544 lines
14 KiB
Plaintext
//
|
|
bool HasSenario1Conditions(
|
|
ENUM_X_CYCLES cycle,
|
|
XBoxZone &box,
|
|
XBoxZone &holderBox,
|
|
ENUM_X_DIRECTION &dir,
|
|
X121SMCStrategySignalProviderData &provider,
|
|
ENUM_X_CYCLES holderCycle = X_CYCLE_NONE,
|
|
int barIndex = 0 //
|
|
)
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
// Fil Selected Data ...
|
|
XPOIState cState;
|
|
X121Conditions cXConditions;
|
|
XC121SMCCycleHelper *cHelper;
|
|
X121SMCCycleConditions cConditions;
|
|
result = provider.SelectCycle(
|
|
cycle,
|
|
cState,
|
|
cXConditions,
|
|
cHelper,
|
|
cConditions //
|
|
);
|
|
if (!result)
|
|
{
|
|
//
|
|
cState.Clean();
|
|
ZeroMemory(cHelper);
|
|
cConditions.Clean();
|
|
cXConditions.Clean();
|
|
|
|
//
|
|
return result;
|
|
}
|
|
Parse(cXConditions);
|
|
|
|
//
|
|
// Fil Selected Data ...
|
|
XPOIState chState;
|
|
X121Conditions chXConditions;
|
|
XC121SMCCycleHelper *chHelper;
|
|
X121SMCCycleConditions chConditions;
|
|
if (holderCycle != X_CYCLE_NONE)
|
|
{
|
|
//
|
|
result = provider.SelectCycle(
|
|
holderCycle,
|
|
chState,
|
|
chXConditions,
|
|
chHelper,
|
|
chConditions //
|
|
);
|
|
if (!result)
|
|
{
|
|
//
|
|
chState.Clean();
|
|
ZeroMemory(chHelper);
|
|
chConditions.Clean();
|
|
chXConditions.Clean();
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
Parse(chXConditions);
|
|
}
|
|
|
|
//
|
|
// Normalize Args ...
|
|
|
|
//
|
|
box.Clean();
|
|
holderBox.Clean();
|
|
dir = X_DIRECTION_NONE;
|
|
|
|
//
|
|
if (barIndex < 0)
|
|
{
|
|
barIndex = 0;
|
|
}
|
|
|
|
//
|
|
int idx = -1;
|
|
int count = 0;
|
|
bool has = false;
|
|
|
|
//
|
|
int zIDX = barIndex;
|
|
int cIDX = zIDX + 1;
|
|
int pIDX = cIDX + 1;
|
|
|
|
//
|
|
bool isBullish = false;
|
|
bool isBearish = false;
|
|
|
|
//
|
|
XOHCL zBar;
|
|
XOHCL cBar;
|
|
XOHCL pBar;
|
|
|
|
//
|
|
// Initial Bars ...
|
|
result = zBar.Init(
|
|
cState.symbol,
|
|
cState.period,
|
|
barIndex //
|
|
);
|
|
result =
|
|
result &&
|
|
zBar.GetPreviousBar(cBar);
|
|
result =
|
|
result &&
|
|
cBar.GetPreviousBar(pBar);
|
|
if (!result)
|
|
{
|
|
//
|
|
zBar.Clean();
|
|
cBar.Clean();
|
|
pBar.Clean();
|
|
cState.Clean();
|
|
chState.Clean();
|
|
ZeroMemory(cHelper);
|
|
cConditions.Clean();
|
|
cXConditions.Clean();
|
|
ZeroMemory(chHelper);
|
|
chConditions.Clean();
|
|
chXConditions.Clean();
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Detecting Signal Conditions ...
|
|
|
|
//
|
|
bool isX3MAFastRejectUp =
|
|
//
|
|
cBar.low < cXConditions.x3maFastBuffer[cIDX] &&
|
|
cBar.GetDown() > cXConditions.x3maFastBuffer[cIDX]
|
|
//
|
|
;
|
|
|
|
//
|
|
bool isX3MAFastRejectDown =
|
|
//
|
|
cBar.high > cXConditions.x3maFastBuffer[cIDX] &&
|
|
cBar.GetUp() < cXConditions.x3maFastBuffer[cIDX]
|
|
//
|
|
;
|
|
|
|
//
|
|
// Find Breaker Bar ...
|
|
datetime nearCloseOverX3MAFast = cHelper.GetNearestCloseOverX3MAFast(cBar);
|
|
datetime nearCloseUnderX3MAFast = cHelper.GetNearestCloseUnderX3MAFast(cBar);
|
|
bool hasNearestCloseOverX3MAFast =
|
|
IsValid(nearCloseOverX3MAFast) &&
|
|
IsValid(nearCloseUnderX3MAFast)
|
|
? nearCloseOverX3MAFast > nearCloseUnderX3MAFast
|
|
: IsValid(nearCloseOverX3MAFast)
|
|
? true
|
|
: false;
|
|
bool hasNearestCloseUnderX3MAFast =
|
|
IsValid(nearCloseOverX3MAFast) &&
|
|
IsValid(nearCloseUnderX3MAFast)
|
|
? nearCloseUnderX3MAFast > nearCloseOverX3MAFast
|
|
: IsValid(nearCloseUnderX3MAFast)
|
|
? true
|
|
: false;
|
|
|
|
//
|
|
// Bullish Conditions ...
|
|
isBullish =
|
|
//
|
|
// Base Condition ...
|
|
(
|
|
//
|
|
cBar.IsBullish() &&
|
|
isX3MAFastRejectUp &&
|
|
cXConditions.isSMHKBullish &&
|
|
hasNearestCloseOverX3MAFast &&
|
|
cXConditions.xhkSMOpenBuffer[cIDX] < cXConditions.x3maMidBuffer[cIDX]
|
|
//
|
|
)
|
|
//
|
|
;
|
|
|
|
//
|
|
// Bearish Conditions ...
|
|
isBearish =
|
|
//
|
|
// Base Condition ...
|
|
(
|
|
//
|
|
cBar.IsBearish() &&
|
|
isX3MAFastRejectDown &&
|
|
cXConditions.isSMHKBearish &&
|
|
hasNearestCloseUnderX3MAFast &&
|
|
cXConditions.xhkSMOpenBuffer[cIDX] > cXConditions.x3maMidBuffer[cIDX]
|
|
//
|
|
)
|
|
//
|
|
;
|
|
|
|
//
|
|
// Filling Requirements ...
|
|
result =
|
|
isBullish ||
|
|
isBearish;
|
|
if (result)
|
|
{
|
|
//
|
|
dir =
|
|
isBullish
|
|
? X_DIRECTION_BULLISH
|
|
: X_DIRECTION_BEARISH;
|
|
|
|
//
|
|
box.dir = dir;
|
|
box.to = TimeCurrent();
|
|
box.symbol = cXConditions.symbol;
|
|
box.period = cXConditions.period;
|
|
|
|
//
|
|
int fromIDX = -1;
|
|
if (isBullish)
|
|
{
|
|
//
|
|
fromIDX = GetBarIndex(
|
|
cBar.symbol,
|
|
cBar.period,
|
|
nearCloseOverX3MAFast //
|
|
);
|
|
}
|
|
else
|
|
{
|
|
//
|
|
fromIDX = GetBarIndex(
|
|
cBar.symbol,
|
|
cBar.period,
|
|
nearCloseUnderX3MAFast //
|
|
);
|
|
}
|
|
|
|
//
|
|
if (IsValidIndex(fromIDX))
|
|
{
|
|
//
|
|
box.from = iTime(
|
|
zBar.symbol,
|
|
zBar.period,
|
|
fromIDX //
|
|
);
|
|
}
|
|
else
|
|
{
|
|
box.from = pBar.time;
|
|
}
|
|
|
|
//
|
|
// Detect Holder Box ...
|
|
XBoxZone tmpBoxes[];
|
|
if (chState.IsValid())
|
|
{
|
|
//
|
|
if (isBullish)
|
|
{
|
|
//
|
|
// Demand Zones ...
|
|
XBoxZone tmp[];
|
|
ToBox(
|
|
chState.demandZones,
|
|
tmp //
|
|
);
|
|
Copy(
|
|
tmp,
|
|
tmpBoxes,
|
|
false //
|
|
);
|
|
Clean(tmp);
|
|
|
|
//
|
|
// Bullish Order Blocks ...
|
|
ToBox(
|
|
chState.bullishOrderBlocks,
|
|
tmp //
|
|
);
|
|
Copy(
|
|
tmp,
|
|
tmpBoxes,
|
|
false //
|
|
);
|
|
Clean(tmp);
|
|
|
|
//
|
|
// Bullish Fair Value Gaps ...
|
|
ToBox(
|
|
chState.bullishFairValueGaps,
|
|
tmp //
|
|
);
|
|
Copy(
|
|
tmp,
|
|
tmpBoxes,
|
|
false //
|
|
);
|
|
Clean(tmp);
|
|
}
|
|
else
|
|
{
|
|
//
|
|
// Supply Zones ...
|
|
XBoxZone tmp[];
|
|
ToBox(
|
|
chState.supplyZones,
|
|
tmp //
|
|
);
|
|
Copy(
|
|
tmp,
|
|
tmpBoxes,
|
|
false //
|
|
);
|
|
Clean(tmp);
|
|
|
|
//
|
|
// Bearish Order Blocks ...
|
|
ToBox(
|
|
chState.bearishOrderBlocks,
|
|
tmp //
|
|
);
|
|
Copy(
|
|
tmp,
|
|
tmpBoxes,
|
|
false //
|
|
);
|
|
Clean(tmp);
|
|
|
|
//
|
|
// Bearish Fair Value Gaps ...
|
|
ToBox(
|
|
chState.bearishFairValueGaps,
|
|
tmp //
|
|
);
|
|
Copy(
|
|
tmp,
|
|
tmpBoxes,
|
|
false //
|
|
);
|
|
Clean(tmp);
|
|
}
|
|
}
|
|
|
|
//
|
|
has = HasChild(tmpBoxes);
|
|
if (has)
|
|
{
|
|
//
|
|
while (HasChild(tmpBoxes))
|
|
{
|
|
//
|
|
idx = GetOldest(tmpBoxes);
|
|
has = IsValidIndex(idx);
|
|
if (!has)
|
|
{
|
|
break;
|
|
}
|
|
|
|
//
|
|
XBoxZone iBox = tmpBoxes[idx];
|
|
ArrayRemove(
|
|
tmpBoxes,
|
|
idx,
|
|
1 //
|
|
);
|
|
|
|
//
|
|
has = IsBoxInside(
|
|
box,
|
|
iBox //
|
|
);
|
|
if (has)
|
|
{
|
|
//
|
|
holderBox = iBox;
|
|
holderBox.to = TimeCurrent();
|
|
iBox.Clean();
|
|
break;
|
|
}
|
|
|
|
//
|
|
iBox.Clean();
|
|
}
|
|
}
|
|
|
|
//
|
|
Clean(tmpBoxes);
|
|
|
|
//
|
|
// Fix Box Upper and Lower based on Strategy ...
|
|
|
|
//
|
|
double points = GetPoints(box.symbol);
|
|
double minPointsDiff = points * 20;
|
|
|
|
//
|
|
double prefferSL = 0;
|
|
|
|
//
|
|
// Other SL Conditions ...
|
|
if (prefferSL <= 0)
|
|
{
|
|
//
|
|
prefferSL = cHelper
|
|
.mX121Helper
|
|
.xhkHelper
|
|
.GetSMHKOpen(fromIDX);
|
|
}
|
|
|
|
//
|
|
if (prefferSL > 0)
|
|
{
|
|
//
|
|
box.upper =
|
|
isBullish
|
|
? zBar.open
|
|
: prefferSL;
|
|
|
|
//
|
|
box.lower =
|
|
isBullish
|
|
? prefferSL
|
|
: zBar.open;
|
|
}
|
|
|
|
//
|
|
if (box.IsValid())
|
|
{
|
|
//
|
|
XCBoxObject *iObj;
|
|
bool isCreated = cHelper.mPOIDrawer.DrawBox(
|
|
box,
|
|
iObj //
|
|
);
|
|
if (isCreated)
|
|
{
|
|
//
|
|
iObj.BoxWidth(2);
|
|
iObj.BoxFill(true);
|
|
iObj.BoxStyle(STYLE_DOT);
|
|
|
|
//
|
|
Print("Signal ...");
|
|
}
|
|
}
|
|
|
|
//
|
|
// Validate Conditions to Force Has Holder Box ...
|
|
|
|
// //
|
|
// result =
|
|
// result &&
|
|
// holderBox.IsValid() &&
|
|
// dir == holderBox.dir;
|
|
|
|
// //
|
|
// if (!result)
|
|
// {
|
|
// //
|
|
// isBullish = false;
|
|
// isBearish = false;
|
|
// }
|
|
}
|
|
|
|
//
|
|
// Check All Conditions ...
|
|
result =
|
|
box.IsValid() &&
|
|
HasDirection(dir) &&
|
|
(isBullish ||
|
|
isBearish);
|
|
|
|
//
|
|
// Cleanup Resources ...
|
|
zBar.Clean();
|
|
cBar.Clean();
|
|
pBar.Clean();
|
|
cState.Clean();
|
|
chState.Clean();
|
|
ZeroMemory(cHelper);
|
|
cConditions.Clean();
|
|
cXConditions.Clean();
|
|
ZeroMemory(chHelper);
|
|
chConditions.Clean();
|
|
chXConditions.Clean();
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////
|
|
|
|
//
|
|
// Detecting Signal Conditions ...
|
|
|
|
//
|
|
// Bullish Conditions ...
|
|
isBullish =
|
|
//
|
|
// Base Condition ...
|
|
(
|
|
//
|
|
provider.visionXConditions.isSMHKBullish &&
|
|
provider.decisionXConditions.isSarBullish &&
|
|
provider.decisionXConditions.isVWapFastBullish &&
|
|
provider.decisionXConditions.isX3MaFastBullish &&
|
|
provider.consolidationXConditions.isSMHKBullish &&
|
|
provider.decisionXConditions.isSMHKSwitchedToBullish
|
|
//
|
|
)
|
|
//
|
|
;
|
|
|
|
//
|
|
// Bearish Conditions ...
|
|
isBearish =
|
|
//
|
|
// Base Condition ...
|
|
(
|
|
//
|
|
provider.visionXConditions.isSMHKBearish &&
|
|
provider.decisionXConditions.isSarBearish &&
|
|
provider.decisionXConditions.isVWapFastBearish &&
|
|
provider.decisionXConditions.isX3MaFastBearish &&
|
|
provider.consolidationXConditions.isSMHKBearish &&
|
|
provider.decisionXConditions.isSMHKSwitchedToBearish
|
|
//
|
|
)
|
|
//
|
|
;
|