This commit is contained in:
2025-01-08 17:32:36 +03:30
parent 73f39629fb
commit 9158a6cc6d
6 changed files with 1535 additions and 322 deletions
+142 -122
View File
@@ -49,8 +49,7 @@ struct X121SMCStrategyXTWPVSignalConditions
datetime triggerTime;
//
XFVGOrderBlock bullishOrderBlocks[];
XFVGOrderBlock bearishOrderBlocks[];
XFVGOrderBlock fvgOB;
//
// Constructor ...
@@ -166,40 +165,20 @@ struct X121SMCStrategyXTWPVSignalConditions
*/
void ExtensionClean()
{
//
Clean(bullishOrderBlocks);
Clean(bearishOrderBlocks);
fvgOB.Clean();
}
/**
* Update Order Blocks Date ...
*/
void UpdateOrderBlocks() {
void UpdateOrderBlocks()
{
//
int count = 0;
datetime cTime = TimeCurrent();
//
count = ArraySize(bullishOrderBlocks);
if (IsValidSize(count)) {
//
for (int i = 0; i < count; i++) {
//
bullishOrderBlocks[i].orderBlock.To(cTime);
bullishOrderBlocks[i].fairValueGap.To(cTime);
}
}
//
count = ArraySize(bearishOrderBlocks);
if (IsValidSize(count)) {
//
for (int i = 0; i < count; i++) {
//
bearishOrderBlocks[i].orderBlock.To(cTime);
bearishOrderBlocks[i].fairValueGap.To(cTime);
}
}
fvgOB.orderBlock.To(cTime);
fvgOB.fairValueGap.To(cTime);
}
//
@@ -447,14 +426,14 @@ bool DetectX121SMCXTWPVSiganlSetup(
//
conditions.dir = forDir;
Copy(
bullishOrderBlocks,
conditions.bullishOrderBlocks //
);
Copy(
bearishOrderBlocks,
conditions.bearishOrderBlocks //
);
if (isBullish)
{
conditions.fvgOB = bullishOrderBlocks[0];
}
else
{
conditions.fvgOB = bearishOrderBlocks[0];
}
//
conditions.setupTime = cTime;
@@ -483,7 +462,7 @@ bool DetectX121SMCXTWPVSiganlTrigger(
XC121SMCCycleHelper *consolidationCycleHelper,
XC121SMCCycleHelper *visionCycleHelper,
//
int maxAllowedSetupAge = 0 //
int maxAllowedSetupAge = 576 //
//
)
{
@@ -684,86 +663,44 @@ bool DetectX121SMCXTWPVSiganlTrigger(
//
// Trigger Conditions ...
//
double decisionPeak = decisionConditions.x121Conditions.peaksBuffer[1];
double isNewDecisionPeak = decisionConditions.x121Conditions.isNewPeak;
//
double decisionVale = decisionConditions.x121Conditions.valesBuffer[1];
double isNewDecisionVale = decisionConditions.x121Conditions.isNewVale;
//
// Waits For Price to Go Inside FVG ...
XFVGOrderBlock fvgOrderBlock;
bool isPriceInsideOB = false;
bool isPriceInsideFVG = false;
if (isBullish)
{
//
int count = ArraySize(conditions.bullishOrderBlocks);
for (int i = 0; i < count; i++)
{
//
XFVGOrderBlock iModel = conditions.bullishOrderBlocks[i];
bool isPriceInsideOB = IsPriceInsideZone(
cBar,
conditions.fvgOB.orderBlock //
);
//
isPriceInsideOB = IsPriceInsideZone(
cBar,
iModel.orderBlock //
);
//
isPriceInsideFVG = IsPriceInsideZone(
cBar,
iModel.fairValueGap //
);
//
if (isPriceInsideOB &&
isPriceInsideFVG)
{
//
fvgOrderBlock = iModel;
break;
}
//
isPriceInsideOB = false;
isPriceInsideFVG = false;
}
}
else
{
//
int count = ArraySize(conditions.bearishOrderBlocks);
for (int i = 0; i < count; i++)
{
//
XFVGOrderBlock iModel = conditions.bearishOrderBlocks[i];
//
isPriceInsideOB = IsPriceInsideZone(
cBar,
iModel.orderBlock //
);
//
isPriceInsideFVG = IsPriceInsideZone(
cBar,
iModel.fairValueGap //
);
//
if (isPriceInsideOB &&
isPriceInsideFVG)
{
//
fvgOrderBlock = iModel;
break;
}
//
isPriceInsideOB = false;
isPriceInsideFVG = false;
}
}
//
bool isPriceInsideFVG = IsPriceInsideZone(
cBar,
conditions.fvgOB.fairValueGap //
);
//
result = isPriceInsideOB &&
isPriceInsideFVG &&
fvgOrderBlock.IsValid();
conditions.fvgOB.IsValid();
if (!result)
{
return result;
}
//
double fvgOBUpper = 0;
double fvgOBLower = 0;
bool hasBoundary = conditions.fvgOB.GetBoundary(
fvgOBUpper,
fvgOBLower //
);
result = hasBoundary;
if (!result)
{
return result;
@@ -773,13 +710,15 @@ bool DetectX121SMCXTWPVSiganlTrigger(
// Detect Bullish Conditions ...
isBullish =
isBullish &&
cBar.IsBullish();
cBar.IsBullish() &&
isNewDecisionVale;
//
// Detect Bearish Conditions ...
isBearish =
isBearish &&
cBar.IsBearish();
cBar.IsBearish() &&
isNewDecisionPeak;
//
result = isBullish ||
@@ -788,13 +727,6 @@ bool DetectX121SMCXTWPVSiganlTrigger(
{
//
// Cleanup Setup Conditions ...
// int setupAge = conditions.GetSetupAge();
// if (IsValidSize(setupAge) &&
// IsValidSize(maxAllowedSetupAge) &&
// setupAge >= maxAllowedSetupAge)
// {
// conditions.Clean();
// }
//
return result;
@@ -844,6 +776,22 @@ bool DetectX121SMCXTWPVSiganlTrigger(
double peak = triggerConditions.x121Conditions.peaksBuffer[1];
double vale = triggerConditions.x121Conditions.valesBuffer[1];
//
if (conditions.fvgOB.IsValid())
{
//
Add(
fvgOBUpper,
sls //
);
//
Add(
fvgOBLower,
sls //
);
}
//
if (isBullish)
{
@@ -857,6 +805,12 @@ bool DetectX121SMCXTWPVSiganlTrigger(
sls //
);
}
//
Add(
vale,
sls //
);
}
else if (isBearish)
{
@@ -870,11 +824,12 @@ bool DetectX121SMCXTWPVSiganlTrigger(
sls //
);
}
}
//
if (ArraySize(sls) == 0)
{
//
Add(
peak,
sls //
);
}
//
@@ -927,6 +882,71 @@ bool DetectX121SMCXTWPVSiganlTrigger(
return result;
}
//
int AddX121SMCXTWPVConditionsIfNotExists(
X121SMCStrategyXTWPVSignalConditions &item,
X121SMCStrategyXTWPVSignalConditions &items[] //
)
{
//
int result = 0;
//
bool isSetuped = IsValid(item.setupTime) &&
HasDirection(item.dir);
if (!isSetuped)
{
return result;
}
//
int count = ArraySize(items);
bool canAdd = !IsValidSize(count);
if (!canAdd)
{
//
// Prese Item Data ...
bool isBullish = IsBullish(item.dir);
//
bool hasSame = false;
for (int i = 0; i < count; i++)
{
//
X121SMCStrategyXTWPVSignalConditions iItem = items[i];
//
hasSame = iItem.fvgOB.IsSameAs(item.fvgOB);
if (hasSame)
{
break;
}
}
//
canAdd = !hasSame;
}
//
if (canAdd)
{
//
AddRef(
item,
items //
);
//
// Remove Olds ...
//
result = ArraySize(items);
}
//
return result;
}
//
// Draw Signal ...
int DrawX121SMCXTWPVSiganl(