Files
MQL5Data/Documents/BKP/x-omid.signalling.mq5
T
2025-03-18 23:41:12 +03:30

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
//
)
//
;