Files
MQL5Data/Documents/BKP/tmp.x121.smc.mq5
T
2024-11-21 17:48:22 +03:30

2079 lines
55 KiB
Plaintext

//
// Peaks ...
int peaksCount = ArraySize(conditions.peaks);
if (IsValidSize(peaksCount))
{
//
for (int i = 0; i < peaksCount; i++)
{
//
XPVPivot iPivot = conditions.peaks[i];
//
XCXPVPivotObject *iObj;
iObj = new XCXPVPivotObject();
//
bool isCreated = iObj.Create(
mPOIDrawer.ChartIdentification(),
mPOIDrawer.SubWindowIdentification(),
iPivot //
);
if (isCreated)
{
//
iObj.PivotWidth(1);
iObj.PivotFill(false);
iObj.PivotColor(clrAqua);
iObj.PivotStyle(STYLE_SOLID);
//
AddObjectIfNotExists(iObj);
}
}
}
//
// Vales ...
int valesCount = ArraySize(conditions.vales);
if (IsValidSize(valesCount))
{
//
for (int i = 0; i < valesCount; i++)
{
//
XPVPivot iPivot = conditions.vales[i];
//
XCXPVPivotObject *iObj;
iObj = new XCXPVPivotObject();
//
bool isCreated = iObj.Create(
mPOIDrawer.ChartIdentification(),
mPOIDrawer.SubWindowIdentification(),
iPivot //
);
if (isCreated)
{
//
iObj.PivotWidth(1);
iObj.PivotFill(false);
iObj.PivotStyle(STYLE_SOLID);
iObj.PivotColor(clrMagenta);
//
AddObjectIfNotExists(iObj);
}
}
}
///////////////////////////////////////////////////////////////////
// Conditions Parsing ...
///////////////////////////////////////////////////////////////////
//
// Conditions Props ...
//
// D1 ...
//
XPOIState d1State;
ENUM_X_DIRECTION d1MarketDirection;
XCSupportZone *d1SupportZones[];
XCResistanceZone *d1ResistanceZones[];
//
XCSwing *d1SwingHigh;
XCSwing *d1SwingLow;
//
// H4 ...
//
XPOIState h4State;
ENUM_X_DIRECTION h4MarketDirection;
XCSupportZone *h4SupportZones[];
XCResistanceZone *h4ResistanceZones[];
//
XCSwing *h4SwingHigh;
XCSwing *h4SwingLow;
//
// H2 ...
//
XPOIState h2State;
ENUM_X_DIRECTION h2MarketDirection;
XCSupportZone *h2SupportZones[];
XCResistanceZone *h2ResistanceZones[];
//
XCSwing *h2SwingHigh;
XCSwing *h2SwingLow;
//
// H1 ...
//
XPOIState h1State;
ENUM_X_DIRECTION h1MarketDirection;
XCSupportZone *h1SupportZones[];
XCResistanceZone *h1ResistanceZones[];
//
XCSwing *h1SwingHigh;
XCSwing *h1SwingLow;
//
// M15 ...
//
XPOIState m15State;
ENUM_X_DIRECTION m15MarketDirection;
XCSupportZone *m15SupportZones[];
XCResistanceZone *m15ResistanceZones[];
//
XCSwing *m15SwingHigh;
XCSwing *m15SwingLow;
//
// M5 ...
//
XPOIState m5State;
ENUM_X_DIRECTION m5MarketDirection;
XCSupportZone *m5SupportZones[];
XCResistanceZone *m5ResistanceZones[];
//
XCSwing *m5SwingHigh;
XCSwing *m5SwingLow;
//
// M1 ...
//
XPOIState m1State;
ENUM_X_DIRECTION m1MarketDirection;
XCSupportZone *m1SupportZones[];
XCResistanceZone *m1ResistanceZones[];
//
XCSwing *m1SwingHigh;
XCSwing *m1SwingLow;
//
// Clean Method ...
//
// D1 ...
//
d1State.Clean();
d1MarketDirection = X_DIRECTION_NONE;
Clean(d1SupportZones);
Clean(d1ResistanceZones);
//
d1SwingHigh = NULL;
d1SwingLow = NULL;
//
// H4 ...
//
h4State.Clean();
h4MarketDirection = X_DIRECTION_NONE;
Clean(h4SupportZones);
Clean(h4ResistanceZones);
//
h4SwingHigh = NULL;
h4SwingLow = NULL;
//
// H2 ...
//
h2State.Clean();
h2MarketDirection = X_DIRECTION_NONE;
Clean(h2SupportZones);
Clean(h2ResistanceZones);
//
h2SwingHigh = NULL;
h2SwingLow = NULL;
//
// H1 ...
//
h1State.Clean();
h1MarketDirection = X_DIRECTION_NONE;
Clean(h1SupportZones);
Clean(h1ResistanceZones);
//
h1SwingHigh = NULL;
h1SwingLow = NULL;
//
// M15 ...
//
m15State.Clean();
m15MarketDirection = X_DIRECTION_NONE;
Clean(m15SupportZones);
Clean(m15ResistanceZones);
//
m15SwingHigh = NULL;
m15SwingLow = NULL;
//
// M5 ...
//
m5State.Clean();
m5MarketDirection = X_DIRECTION_NONE;
Clean(m5SupportZones);
Clean(m5ResistanceZones);
//
m5SwingHigh = NULL;
m5SwingLow = NULL;
//
// M1 ...
//
m1State.Clean();
m1MarketDirection = X_DIRECTION_NONE;
Clean(m1SupportZones);
Clean(m1ResistanceZones);
//
m1SwingHigh = NULL;
m1SwingLow = NULL;
//
// Tools Functions ...
//
//
// Custom Tools ...
/**
* Check Conditions for Detect Market Structure ...
*
* @param structure: ENUM_X_DIRECTION member, Market Structure Direction reference ...
*
* @return ( bool )
*/
bool HasMarketStructure(
ENUM_X_DIRECTION &structure //
)
{
//
bool result = false;
//
structure = X_DIRECTION_NONE;
//
result = IsValid();
if (!result)
{
return result;
}
//
bool is1DBullish = IsBullish(d1MarketDirection);
bool is1DBearish = IsBearish(d1MarketDirection);
//
bool is4HBullish = IsBullish(h4MarketDirection);
bool is4HBearish = IsBearish(h4MarketDirection);
//
bool is2HBullish = IsBullish(h2MarketDirection);
bool is2HBearish = IsBearish(h2MarketDirection);
//
bool is1HBullish = IsBullish(h1MarketDirection);
bool is1HBearish = IsBearish(h1MarketDirection);
//
bool is15MBullish = IsBullish(m15MarketDirection);
bool is15MBearish = IsBearish(m15MarketDirection);
//
bool is5MBullish = IsBullish(m5MarketDirection);
bool is5MBearish = IsBearish(m5MarketDirection);
//
bool is1MBullish = IsBullish(m1MarketDirection);
bool is1MBearish = IsBearish(m1MarketDirection);
//
bool isStructuresBullish =
//
is1HBullish &&
is15MBullish &&
is5MBullish
//
;
//
bool isStructuresBearish =
//
is1HBearish &&
is15MBearish &&
is5MBearish
//
;
//
bool hasMarketStructure =
isStructuresBullish ||
isStructuresBearish;
result = hasMarketStructure;
if (!result)
{
return result;
}
//
structure =
isStructuresBullish
? X_DIRECTION_BULLISH
: X_DIRECTION_BEARISH;
//
return result;
}
//
// Strategy Class Calling on Conditions Detections ...
//
// Detect Market Structures ...
//
// 1D ...
conditions.d1State = _1DState;
result = DetectMarketStructure(
conditions.d1MarketDirection,
conditions.d1SupportZones,
conditions.d1ResistanceZones,
_1DState //
);
if (!result)
{
return result;
}
//
// 4H ...
conditions.h4State = _4HState;
result = DetectMarketStructure(
conditions.h4MarketDirection,
conditions.h4SupportZones,
conditions.h4ResistanceZones,
_4HState //
);
if (!result)
{
return result;
}
//
// 2H ...
conditions.h2State = _2HState;
result = DetectMarketStructure(
conditions.h2MarketDirection,
conditions.h2SupportZones,
conditions.h2ResistanceZones,
_2HState //
);
if (!result)
{
return result;
}
//
// 1H ...
conditions.h1State = _1HState;
result = DetectMarketStructure(
conditions.h1MarketDirection,
conditions.h1SupportZones,
conditions.h1ResistanceZones,
_1HState //
);
if (!result)
{
return result;
}
//
// 15M ...
conditions.m15State = _15MState;
result = DetectMarketStructure(
conditions.m15MarketDirection,
conditions.m15SupportZones,
conditions.m15ResistanceZones,
_15MState //
);
if (!result)
{
return result;
}
//
// 5M ...
conditions.m5State = _5MState;
result = DetectMarketStructure(
conditions.m5MarketDirection,
conditions.m5SupportZones,
conditions.m5ResistanceZones,
_5MState //
);
if (!result)
{
return result;
}
//
// 1M ...
conditions.m1State = _1MState;
result = DetectMarketStructure(
conditions.m1MarketDirection,
conditions.m1SupportZones,
conditions.m1ResistanceZones,
_1MState //
);
if (!result)
{
return result;
}
//
// 1H-15M-5M ...
ENUM_X_DIRECTION marketStructure = X_DIRECTION_NONE;
result = conditions.HasMarketStructure(marketStructure);
if (!result)
{
return result;
}
//
// Detect Swing High and Swing Low ...
// 1H-15M-5M ...
int count = 0;
//
// 1H ...
//
XCSwing *h1SwingLows[];
XCSwing *h1SwingHighs[];
XCSupportZone *h1SupportZone = NULL;
XCResistanceZone *h1ResistanceZone = NULL;
//
count = ArraySize(conditions.h1SupportZones);
if (IsValidSize(count))
{
//
for (int i = 0; i < count; i++)
{
//
XCSupportZone *item = conditions.h1SupportZones[i];
//
bool canSelect =
h1SupportZone == NULL ||
h1SupportZone.Lower() < item.Lower();
if (canSelect)
{
h1SupportZone = item;
}
}
}
if (h1SupportZone != NULL)
{
//
// Detect Swings ...
count = ArraySize(conditions.h1State.swingLows);
if (IsValidSize(count))
{
//
double upper = h1SupportZone.Upper();
double lower = h1SupportZone.Lower();
//
for (int i = 0; i < count; i++)
{
//
XCSwing *item = conditions.h1State.swingLows[i];
//
XOHCL iBar;
bool isFilled = item.FillBar(iBar);
if (!isFilled)
{
continue;
}
//
bool canSelect = (iBar.high <= upper &&
iBar.low >= lower) ||
(iBar.high >= upper &&
iBar.low <= lower);
if (canSelect)
{
//
Add(
item,
h1SwingLows //
);
//
// Draw ...
XCSwingLowObject *iObj;
bool isCreated = mPOIDrawer.CreateSwingLow(
item,
iObj //
);
if (isCreated)
{
AddObjectIfNotExists(iObj);
}
}
}
}
//
// Draw ...
XCSupportZoneObject *iObj;
bool isCreated = mPOIDrawer.CreateSupportZone(
h1SupportZone,
iObj //
);
if (isCreated)
{
AddObjectIfNotExists(iObj);
}
}
//
count = ArraySize(conditions.h1ResistanceZones);
if (IsValidSize(count))
{
//
for (int i = 0; i < count; i++)
{
//
XCResistanceZone *item = conditions.h1ResistanceZones[i];
//
bool canSelect =
h1ResistanceZone == NULL ||
h1ResistanceZone.Upper() > item.Upper();
if (canSelect)
{
h1ResistanceZone = item;
}
}
}
if (h1ResistanceZone != NULL)
{
//
// Detect Swings ...
count = ArraySize(conditions.h1State.swingHighs);
if (IsValidSize(count))
{
//
double upper = h1ResistanceZone.Upper();
double lower = h1ResistanceZone.Lower();
//
for (int i = 0; i < count; i++)
{
//
XCSwing *item = conditions.h1State.swingHighs[i];
//
XOHCL iBar;
bool isFilled = item.FillBar(iBar);
if (!isFilled)
{
continue;
}
//
bool canSelect = (iBar.high <= upper &&
iBar.low >= lower) ||
(iBar.high >= upper &&
iBar.low <= lower);
if (canSelect)
{
//
Add(
item,
h1SwingHighs //
);
//
// Draw ...
XCSwingHighObject *iObj;
bool isCreated = mPOIDrawer.CreateSwingHigh(
item,
iObj //
);
if (isCreated)
{
AddObjectIfNotExists(iObj);
}
}
}
}
//
// Draw ...
XCResistanceZoneObject *iObj;
bool isCreated = mPOIDrawer.CreateResistanceZone(
h1ResistanceZone,
iObj //
);
if (isCreated)
{
AddObjectIfNotExists(iObj);
}
}
//
// 15M ...
//
XCSupportZone *m15SupportZone = NULL;
count = ArraySize(conditions.m15SupportZones);
if (IsValidSize(count))
{
//
for (int i = 0; i < count; i++)
{
//
XCSupportZone *item = conditions.m15SupportZones[i];
//
bool canSelect =
m15SupportZone == NULL ||
m15SupportZone.Lower() < item.Lower();
if (canSelect)
{
m15SupportZone = item;
}
}
}
if (m15SupportZone != NULL)
{
//
XCSupportZoneObject *iObj;
bool isCreated = mPOIDrawer.CreateSupportZone(
m15SupportZone,
iObj //
);
if (isCreated)
{
AddObjectIfNotExists(iObj);
}
}
//
XCResistanceZone *m15ResistanceZone = NULL;
count = ArraySize(conditions.m15ResistanceZones);
if (IsValidSize(count))
{
//
for (int i = 0; i < count; i++)
{
//
XCResistanceZone *item = conditions.m15ResistanceZones[i];
//
bool canSelect =
m15ResistanceZone == NULL ||
m15ResistanceZone.Upper() > item.Upper();
if (canSelect)
{
m15ResistanceZone = item;
}
}
}
if (m15ResistanceZone != NULL)
{
//
XCResistanceZoneObject *iObj;
bool isCreated = mPOIDrawer.CreateResistanceZone(
m15ResistanceZone,
iObj //
);
if (isCreated)
{
AddObjectIfNotExists(iObj);
}
}
//
// 5M ...
//
XCSupportZone *m5SupportZone = NULL;
count = ArraySize(conditions.m5SupportZones);
if (IsValidSize(count))
{
//
for (int i = 0; i < count; i++)
{
//
XCSupportZone *item = conditions.m5SupportZones[i];
//
bool canSelect =
m5SupportZone == NULL ||
m5SupportZone.Lower() < item.Lower();
if (canSelect)
{
m5SupportZone = item;
}
}
}
if (m5SupportZone != NULL)
{
//
XCSupportZoneObject *iObj;
bool isCreated = mPOIDrawer.CreateSupportZone(
m5SupportZone,
iObj //
);
if (isCreated)
{
AddObjectIfNotExists(iObj);
}
}
//
XCResistanceZone *m5ResistanceZone = NULL;
count = ArraySize(conditions.m5ResistanceZones);
if (IsValidSize(count))
{
//
for (int i = 0; i < count; i++)
{
//
XCResistanceZone *item = conditions.m5ResistanceZones[i];
//
bool canSelect =
m5ResistanceZone == NULL ||
m5ResistanceZone.Upper() > item.Upper();
if (canSelect)
{
m5ResistanceZone = item;
}
}
}
if (m5ResistanceZone != NULL)
{
//
XCResistanceZoneObject *iObj;
bool isCreated = mPOIDrawer.CreateResistanceZone(
m5ResistanceZone,
iObj //
);
if (isCreated)
{
AddObjectIfNotExists(iObj);
}
}
//
// DrawState(_5MState);
//
//
// Strategy Class Tools Functions ...
/**
* Detect Specified States Market Structure ...
*
* @param dir: ENUM_X_DIRECTION member, Refrence ...
* @param state: XPOIState instance ...
*
* @return ( bool )
*/
bool DetectMarketStructure(
ENUM_X_DIRECTION &dir,
XCSupportZone *&supportZones[],
XCResistanceZone *&resistanceZones[],
XPOIState &state //
)
{
//
bool result = false;
//
int count = 0;
//
// Filter Untouched Supports ...
Clean(supportZones);
int untouchedSupportsCount = 0;
count = ArraySize(state.supportZones);
if (IsValidSize(count))
{
//
for (int i = 0; i < count; i++)
{
//
XCSupportZone *item = state.supportZones[i];
//
// Find Breakout Bar
XOHCL iBar;
bool isFilled = item.FillBar(iBar);
if (!isFilled)
{
break;
}
//
int iBarIndex = iBar.Index();
int iBarUnTouchedCount = 0;
for (int j = 0; j < iBarIndex; j++)
{
//
XOHCL jBar;
bool isInited = jBar.Init(
iBar.symbol,
iBar.period,
j //
);
if (!isInited)
{
break;
}
//
bool isUntouched =
jBar.low > item.Upper();
if (isUntouched)
{
iBarUnTouchedCount++;
}
else
{
iBarUnTouchedCount--;
}
}
//
if (iBarUnTouchedCount > 0)
{
//
Add(
item,
supportZones //
);
}
}
//
untouchedSupportsCount = ArraySize(supportZones);
if (IsValidSize(untouchedSupportsCount))
{
//
// Draw ...
// for (int i = 0; i < untouchedSupportsCount; i++)
// {
// //
// XCSupportZone *item = supportZones[i];
// //
// XCSupportZoneObject *iObj;
// bool isCreated = mPOIDrawer.CreateSupportZone(
// item,
// iObj //
// );
// if (isCreated)
// {
// AddObjectIfNotExists(iObj);
// }
// }
}
}
//
// Filter Untouched Resistances ...
Clean(resistanceZones);
int untouchedResistancesCount = 0;
count = ArraySize(state.resistanceZones);
if (IsValidSize(count))
{
//
for (int i = 0; i < count; i++)
{
//
XCResistanceZone *item = state.resistanceZones[i];
//
// Find Breakout Bar
XOHCL iBar;
bool isFilled = item.FillBar(iBar);
if (!isFilled)
{
break;
}
//
int iBarIndex = iBar.Index();
int iBarUnTouchedCount = 0;
for (int j = 0; j < iBarIndex; j++)
{
//
XOHCL jBar;
bool isInited = jBar.Init(
iBar.symbol,
iBar.period,
j //
);
if (!isInited)
{
break;
}
//
bool isUntouched =
jBar.high < item.Lower();
if (isUntouched)
{
iBarUnTouchedCount++;
}
else
{
iBarUnTouchedCount--;
}
}
//
if (iBarUnTouchedCount > 0)
{
//
Add(
item,
resistanceZones //
);
}
}
//
untouchedResistancesCount = ArraySize(resistanceZones);
if (IsValidSize(untouchedResistancesCount))
{
//
// Draw ...
// for (int i = 0; i < untouchedResistancesCount; i++)
// {
// //
// XCResistanceZone *item = resistanceZones[i];
// //
// XCResistanceZoneObject *iObj;
// bool isCreated = mPOIDrawer.CreateResistanceZone(
// item,
// iObj //
// );
// if (isCreated)
// {
// AddObjectIfNotExists(iObj);
// }
// }
}
}
//
bool hasBullishStructure =
IsValidSize(untouchedSupportsCount) &&
untouchedSupportsCount > untouchedResistancesCount;
bool hasBearishStructure =
IsValidSize(untouchedResistancesCount) &&
untouchedResistancesCount > untouchedSupportsCount;
//
result = (hasBullishStructure &&
!hasBearishStructure) ||
(hasBearishStructure &&
!hasBullishStructure);
//
if (result)
{
//
dir =
hasBullishStructure
? X_DIRECTION_BULLISH
: X_DIRECTION_BEARISH;
}
//
return result;
}
////////////////////////////////////////////////////////////////////////////
//
// Detect Order Blocks ...
// int obsCount = 0;
//
// Find Bullish Order Block ...
// XCOrderBlock *bullishOB = NULL;
// XCRejectionBar *bullishOBRejectionBar = NULL;
// obsCount = lastPivot.state.CountBullishOrderBlocks();
// if (IsValidSize(obsCount))
// {
// //
// for (int i = 0; i < obsCount; i++)
// {
// //
// XCOrderBlock *iOB = lastPivot.state.bullishOrderBlocks[i];
// //
// XOHCL iBar;
// bool hasBar = iOB.FillBar(iBar);
// bool isPeriodSame = hasBar &&
// iBar.period == _period;
// //
// if (iOB.Upper() <= pivotMid &&
// iOB.Lower() >= lastPivot.lower)
// {
// //
// bullishOB = iOB;
// break;
// }
// }
// }
// bool hasBullishOB = bullishOB != NULL;
// bool isBullishOBRejected = false;
// if (hasBullishOB)
// {
// //
// int bullishRejectedBarsCount = lastPivot.state.CountBullishRejectionBars();
// if (IsValidSize(bullishRejectedBarsCount))
// {
// //
// for (int i = 0; i < bullishRejectedBarsCount; i++)
// {
// //
// XCRejectionBar *item = lastPivot.state.bullishRejectionBars[i];
// //
// XOHCL iBar;
// bool isFilled = item.FillBar(iBar);
// if (!isFilled)
// {
// continue;
// }
// //
// bool isRejected = iBar.low <= bullishOB.Lower() &&
// (iBar.GetDown() <= bullishOB.Upper() ||
// iBar.GetDown() > bullishOB.Upper());
// //
// isBullishOBRejected =
// bullishOBRejectionBar == NULL
// ? isRejected
// : isRejected &&
// item.From() > bullishOBRejectionBar.From();
// if (isBullishOBRejected)
// {
// bullishOBRejectionBar = item;
// }
// }
// }
// if (isBullishOBRejected)
// {
// //
// bullishOBRejectionBar.To(cTime);
// XCBullishRejectionBarObject *iObj;
// bool isCreated = mPOIDrawer.CreateBullishRejectionBar(
// bullishOBRejectionBar,
// iObj //
// );
// if (isCreated)
// {
// AddObjectIfNotExists(iObj);
// }
// }
// //
// bullishOB.To(cTime);
// XCBullishOrderBlockObject *iObj;
// bool isCreated = mPOIDrawer.CreateBullishOrderBlock(
// bullishOB,
// iObj //
// );
// if (isCreated)
// {
// AddObjectIfNotExists(iObj);
// }
// }
//
// Find Bearish Order Block ...
// XCOrderBlock *bearishOB = NULL;
// XCRejectionBar *bearishOBRejectionBar = NULL;
// obsCount = lastPivot.state.CountBearishOrderBlocks();
// if (IsValidSize(obsCount))
// {
// //
// for (int i = 0; i < obsCount; i++)
// {
// //
// XCOrderBlock *iOB = lastPivot.state.bearishOrderBlocks[i];
// //
// XOHCL iBar;
// bool hasBar = iOB.FillBar(iBar);
// bool isPeriodSame = hasBar &&
// iBar.period == _period;
// //
// if (iOB.Lower() >= pivotMid &&
// iOB.Upper() <= lastPivot.upper)
// {
// //
// bearishOB = iOB;
// break;
// }
// }
// }
// bool hasBearishOB = bearishOB != NULL;
// bool isBearishOBRejected = false;
// if (hasBearishOB)
// {
// //
// int bearishRejectedBarsCount = lastPivot.state.CountBearishRejectionBars();
// if (IsValidSize(bearishRejectedBarsCount))
// {
// //
// for (int i = 0; i < bearishRejectedBarsCount; i++)
// {
// //
// XCRejectionBar *item = lastPivot.state.bearishRejectionBars[i];
// //
// XOHCL iBar;
// bool isFilled = item.FillBar(iBar);
// if (!isFilled)
// {
// continue;
// }
// //
// bool isRejected = iBar.high >= bearishOB.Upper() &&
// (iBar.GetUp() <= bearishOB.Lower() ||
// iBar.GetUp() > bearishOB.Lower());
// //
// isBearishOBRejected =
// bearishOBRejectionBar == NULL
// ? isRejected
// : isRejected &&
// item.From() > bearishOBRejectionBar.From();
// if (isBearishOBRejected)
// {
// bearishOBRejectionBar = item;
// }
// }
// }
// if (isBearishOBRejected)
// {
// //
// bearishOBRejectionBar.To(cTime);
// XCBearishRejectionBarObject *iObj;
// bool isCreated = mPOIDrawer.CreateBearishRejectionBar(
// bearishOBRejectionBar,
// iObj //
// );
// if (isCreated)
// {
// AddObjectIfNotExists(iObj);
// }
// }
// //
// bearishOB.To(cTime);
// XCBearishOrderBlockObject *iObj;
// bool isCreated = mPOIDrawer.CreateBearishOrderBlock(
// bearishOB,
// iObj //
// );
// if (isCreated)
// {
// AddObjectIfNotExists(iObj);
// }
// }
// //
// // Find an Order Block ...
// bool isBearishOrderBlockRejected = false;
/////////////////////////////////////////////////////////////////////////////
//
RedrawOrderFlow();
//
// Check Candlestick PullBacks ...
ENUM_X_DIRECTION pullBackDir;
bool hasPullBack = mBarAnalyser.HasPullBack(
pullBackDir,
cBar,
3, // Loopback ...
true // Force Body ...
);
bool hasBullishPullback =
hasPullBack &&
pullBackDir == X_DIRECTION_BULLISH;
bool hasBearishPullback =
hasPullBack &&
pullBackDir == X_DIRECTION_BEARISH;
//
bool isInDiscount =
bid < pivotMid &&
bid > lastPivot.lower;
//
bool isInPremium =
bid > pivotMid &&
bid < lastPivot.upper;
//
// Check Order Flow Validation ...
//
// For Bullish Order Flow ...
// if Price Breakes Lower to Down, means Change of Charcter Happens ...
bool isCHOCHHappens =
isBullishOrderFlow ? bid < lastPivot.lower - pip
: bid > lastPivot.upper + pip;
//
// For Bullish Order Flow ...
// if Price Breakes Upper to Up, means Breake of Structure Happens ...
bool isBOSHappens =
isBullishOrderFlow ? bid > lastPivot.upper + pip
: bid < lastPivot.lower - pip;
//
if (isBOSHappens)
{
//
// RedrawOrderFlow();
Print("");
}
//
if (isCHOCHHappens)
{
//
result = false;
ResetOrderFlow();
return result;
}
//
// Check 3MA and 3VWAP State ...
//
bool isVWAPBullishOrdered =
//
(
//
(conditions.x3vwapConditions.isBullishOrdered ||
conditions.x3vwapConditions.isSwitchedToBullishOrdered)
//
||
//
conditions.x3vwapConditions.fasts[cIndex] > conditions.x3vwapConditions.mids[cIndex]
//
||
//
conditions.x3vwapConditions.mids[cIndex] > conditions.x3vwapConditions.slows[cIndex]
//
)
//
;
//
bool isVWAPBearishOrdered =
//
(
//
(conditions.x3vwapConditions.isBearishOrdered ||
conditions.x3vwapConditions.isSwitchedToBearishOrdered)
//
||
//
conditions.x3vwapConditions.fasts[cIndex] < conditions.x3vwapConditions.mids[cIndex]
//
||
//
conditions.x3vwapConditions.mids[cIndex] < conditions.x3vwapConditions.slows[cIndex]
//
)
//
;
//
bool isVWapBullishState =
//
(
//
(conditions.x3vwapConditions.isBullishState ||
conditions.x3vwapConditions.isSwitchedToBullishState)
//
||
//
(x3vwapHelper.IsBullish(conditions.x3vwapConditions.fastStates[cIndex]) &&
x3vwapHelper.IsBullish(conditions.x3vwapConditions.midStates[cIndex]))
//
||
//
(x3vwapHelper.IsBullish(conditions.x3vwapConditions.midStates[cIndex]) &&
x3vwapHelper.IsBullish(conditions.x3vwapConditions.slowStates[cIndex]))
//
)
//
;
//
bool isVWapBearishState =
//
(
//
(conditions.x3vwapConditions.isBearishState ||
conditions.x3vwapConditions.isSwitchedToBearishState)
//
||
//
(x3vwapHelper.IsBearish(conditions.x3vwapConditions.fastStates[cIndex]) &&
x3vwapHelper.IsBearish(conditions.x3vwapConditions.midStates[cIndex]))
//
||
//
(x3vwapHelper.IsBearish(conditions.x3vwapConditions.midStates[cIndex]) &&
x3vwapHelper.IsBearish(conditions.x3vwapConditions.slowStates[cIndex]))
//
)
//
;
//
bool isVWapOverFastMA =
//
(
//
(conditions.x3vwapConditions.fasts[cIndex] > conditions.x3maConditions.fasts[cIndex] &&
conditions.x3vwapConditions.mids[cIndex] > conditions.x3maConditions.fasts[cIndex])
//
||
//
(conditions.x3vwapConditions.fasts[cIndex] > conditions.x3maConditions.fasts[cIndex] &&
conditions.x3vwapConditions.mids[cIndex] > conditions.x3maConditions.fasts[cIndex] &&
conditions.x3vwapConditions.slows[cIndex] > conditions.x3maConditions.fasts[cIndex])
//
)
//
;
//
bool isVWapUnderFastMA =
//
(
//
(conditions.x3vwapConditions.fasts[cIndex] < conditions.x3maConditions.fasts[cIndex] &&
conditions.x3vwapConditions.mids[cIndex] < conditions.x3maConditions.fasts[cIndex])
//
||
//
(conditions.x3vwapConditions.fasts[cIndex] < conditions.x3maConditions.fasts[cIndex] &&
conditions.x3vwapConditions.mids[cIndex] < conditions.x3maConditions.fasts[cIndex] &&
conditions.x3vwapConditions.slows[cIndex] < conditions.x3maConditions.fasts[cIndex])
//
)
//
;
//
bool is3Bullish =
//
(
//
(isVWAPBullishOrdered &&
isVWapBullishState)
//
||
//
(isVWAPBullishOrdered &&
isVWapOverFastMA)
//
||
//
(isVWapBullishState &&
isVWapOverFastMA)
//
)
//
;
//
bool is3Bearish =
//
(
//
(isVWAPBearishOrdered &&
isVWapBearishState)
//
||
//
(isVWAPBearishOrdered &&
isVWapUnderFastMA)
//
||
//
(isVWapBearishState &&
isVWapUnderFastMA)
//
)
//
;
//
// Check Parabolic Sars State ...
//
bool isSarBullish =
//
(conditions.xchsarConditions.isCBullish &&
conditions.xchsarConditions.isSSwitchedBullish)
//
||
//
(conditions.xchsarConditions.isSBullish &&
conditions.xchsarConditions.isCSwitchedBullish)
//
;
bool isSarBearish =
//
(conditions.xchsarConditions.isCBearish &&
conditions.xchsarConditions.isSSwitchedBearish)
//
||
//
(conditions.xchsarConditions.isSBearish &&
conditions.xchsarConditions.isCSwitchedBearish)
//
;
// //
// hasLong =
// //
// is3Bullish &&
// // isInDiscount &&
// isSarBullish // &&
// // hasBullishPullback &&
// // bullishLiquidityPercent > 30
// //
// ;
// //
// hasShort =
// //
// is3Bearish &&
// // isInPremium &&
// isSarBearish // &&
// // hasBearishPullback &&
// // bearishLiquidityPercent > 30
// //
// ;
//////////////////////
//
XPVPivot lastPivot;
result = GetLastItem(
lastPivot,
mOrderFlow //
);
if (!result)
{
return result;
}
bool isBullishOrderFlow = IsBullish(mOrderFlowDir);
bool isBearishOrderFlow = IsBearish(mOrderFlowDir);
double pivotMid = lastPivot.CalculateMid();
//
// Calculate Liquidity Percent ...
double bullishLiquidityPercent = lastPivot
.CalculateLiquidityPercent(X_DIRECTION_BULLISH);
double bearishLiquidityPercent = lastPivot
.CalculateLiquidityPercent(X_DIRECTION_BEARISH);
double minLiquidityPercent = 35;
bool hasBullishLiquidity = bullishLiquidityPercent >= minLiquidityPercent;
bool hasBearishLiquidity = bearishLiquidityPercent >= minLiquidityPercent;
result = hasBullishLiquidity ||
hasBearishLiquidity;
if (!result)
{
return result;
}
/////////////////////////////////////////////////////////////////
// //
// // 1D Period ...
// // POI Detector ...
// m1DPOI = new XCPOIDetector(
// symbol,
// PERIOD_D1 //
// );
// //
// m1DPOI.MaxNumberOfRequiredPOIs(poiRequired);
// //
// m1DPOI.Init();
// //
// // 4H Period ...
// // POI Detector ...
// m4HPOI = new XCPOIDetector(
// symbol,
// PERIOD_H4 //
// );
// //
// m4HPOI.MaxNumberOfRequiredPOIs(poiRequired);
// //
// m4HPOI.Init();
// //
// // 2H Period ...
// // POI Detector ...
// m2HPOI = new XCPOIDetector(
// symbol,
// PERIOD_H2 //
// );
// //
// m2HPOI.MaxNumberOfRequiredPOIs(poiRequired);
// //
// m2HPOI.Init();
//
// 1H Period ...
// POI Detector ...
// m1HPOI = new XCPOIDetector(
// symbol,
// PERIOD_H1 //
// );
// //
// m1HPOI.MaxNumberOfRequiredPOIs(poiRequired);
// //
// m1HPOI.Init();
//
// 15M Period ...
// POI Detector ...
// m15MPOI = new XCPOIDetector(
// symbol,
// PERIOD_M15 //
// );
// //
// m15MPOI.MaxNumberOfRequiredPOIs(poiRequired);
// //
// m15MPOI.Init();
// //
// // 5M Period ...
// // POI Detector ...
// m5MPOI = new XCPOIDetector(
// symbol,
// PERIOD_M5 //
// );
// //
// m5MPOI.MaxNumberOfRequiredPOIs(poiRequired);
// //
// m5MPOI.Init();
// //
// // 1M Period ...
// // POI Detector ...
// m1MPOI = new XCPOIDetector(
// symbol,
// PERIOD_M1 //
// );
// //
// m1MPOI.MaxNumberOfRequiredPOIs(poiRequired);
// //
// m1MPOI.Init();
////////////////////////////////
// delete m1DPOI;
// delete m4HPOI;
// delete m2HPOI;
delete m1HPOI;
delete m15MPOI;
// delete m5MPOI;
// delete m1MPOI;
///////////////////////////////////
//
// Point Of Interests ...
XCPOIDetector *mTriggerPOIDetector;
XCPOIDetector *mAnalysePOIDetector;
XCPOIDetector *mVisionPOIDetector;
//
// XCPOIDetector *m1DPOI;
// XCPOIDetector *m4HPOI;
// XCPOIDetector *m2HPOI;
// XCPOIDetector *m1HPOI;
// XCPOIDetector *m15MPOI;
// XCPOIDetector *m5MPOI;
// XCPOIDetector *m1MPOI;
//
XPOIState mTriggerPOIState;
XPOIState mAnalysePOIState;
XPOIState mVisionPOIState;
// XPOIState _1DState;
// XPOIState _4HState;
// XPOIState _2HState;
// XPOIState _1HState;
// XPOIState _15MState;
// XPOIState _5MState;
// XPOIState _1MState;
// XPOIState _CombineState;
///////////////////////////////////////////
//
// Update POIs ...
//
ENUM_XPOI_EVENTS _events[];
mPOIDetector.Update(_events);
// //
// ENUM_XPOI_EVENTS _1DStates[];
// m1DPOI.Update(_1DStates);
// //
// ENUM_XPOI_EVENTS _4HStates[];
// m4HPOI.Update(_4HStates);
// //
// ENUM_XPOI_EVENTS _2HStates[];
// m2HPOI.Update(_2HStates);
//
ENUM_XPOI_EVENTS _1HStates[];
m1HPOI.Update(_1HStates);
// //
// ENUM_XPOI_EVENTS _15MStates[];
// m15MPOI.Update(_15MStates);
// //
// ENUM_XPOI_EVENTS _5MStates[];
// m5MPOI.Update(_5MStates);
// //
// ENUM_XPOI_EVENTS _1MStates[];
// m1MPOI.Update(_1MStates);
// //
// // Read all POI States ...
mPOIDetector.GetState(_state);
// m1DPOI.GetState(_1DState);
// m4HPOI.GetState(_4HState);
// m2HPOI.GetState(_2HState);
m1HPOI.GetState(_1HState);
// m15MPOI.GetState(_15MState);
// m5MPOI.GetState(_5MState);
// m1MPOI.GetState(_1MState);
//
// Combine States ...
// XPOIState _States[];
// AddRef(
// _1DState,
// _States //
// );
// AddRef(
// _4HState,
// _States //
// );
// AddRef(
// _2HState,
// _States //
// );
// AddRef(
// _1HState,
// _States //
// );
// AddRef(
// _15MState,
// _States //
// );
// AddRef(
// _5MState,
// _States //
// );
// AddRef(
// _1MState,
// _States //
// );
// CombineStates(
// _CombineState,
// _States //
// );
////////////////////////////////////////////////////////////////
//
// Works by WVAP and PSar ...
bool long1 =
//
conditions.x3vwapConditions.isBullishState &&
conditions.x3vwapConditions.isBullishOrdered &&
// conditions.xpvConditions.vales[cIndex] == conditions.xchsarConditions.cSars[cIndex] &&
conditions.xchsarConditions.cSars[cIndex] < conditions.x3vwapConditions.slows[cIndex]
//
;
if (long1)
{
//
CustomStateDrawing(_1HState);
selectedSL = conditions.xpvConditions.vales[cIndex];
}
//
// Works by WVAP and PSar ...
bool short1 =
//
conditions.x3vwapConditions.isBearishState &&
conditions.x3vwapConditions.isBearishOrdered &&
// conditions.xpvConditions.peaks[cIndex] == conditions.xchsarConditions.cSars[cIndex] &&
conditions.xchsarConditions.cSars[cIndex] > conditions.x3vwapConditions.slows[cIndex]
//
;
if (short1)
{
//
CustomStateDrawing(_1HState);
selectedSL = conditions.xpvConditions.peaks[cIndex];
}
/////////////////////////////////////////////////////////////////////////////////////////////////////
// mOrderFlow[pivotIDX].state.ticksZone =
//_15MState.ticksZone;
// //
// // D1 ...
// XPOIState d1;
// if (_1DState.HasChild())
// {
// //
// DetectPivotPOIs(
// mOrderFlow[pivotIDX],
// _1DState,
// d1,
// lookupSwingHighs,
// lookupSwingLows,
// lookupSupportZones,
// lookupResistanceZones,
// lookupSupplyZones,
// lookupDemandZones,
// lookupBullishOrderBlocks,
// lookupBearishOrderBlocks,
// lookupBullishFairValueGaps,
// lookupBearishFairValueGaps,
// lookupBullishRejectionBars,
// lookupBearishRejectionBars,
// lookupBullishMomentumBars,
// lookupBearishMomentumBars //
// );
// //
// if (d1.HasChild())
// {
// d1.Fill(mOrderFlow[pivotIDX].state);
// }
// }
// //
// // H4 ...
// XPOIState h4;
// if (_4HState.HasChild())
// {
// //
// DetectPivotPOIs(
// mOrderFlow[pivotIDX],
// _4HState,
// h4,
// lookupSwingHighs,
// lookupSwingLows,
// lookupSupportZones,
// lookupResistanceZones,
// lookupSupplyZones,
// lookupDemandZones,
// lookupBullishOrderBlocks,
// lookupBearishOrderBlocks,
// lookupBullishFairValueGaps,
// lookupBearishFairValueGaps,
// lookupBullishRejectionBars,
// lookupBearishRejectionBars,
// lookupBullishMomentumBars,
// lookupBearishMomentumBars //
// );
// //
// if (h4.HasChild())
// {
// h4.Fill(mOrderFlow[pivotIDX].state);
// }
// }
//
// H2 ...
// XPOIState h2;
// if (_2HState.HasChild())
// {
// //
// DetectPivotPOIs(
// mOrderFlow[pivotIDX],
// _2HState,
// h2,
// lookupSwingHighs,
// lookupSwingLows,
// lookupSupportZones,
// lookupResistanceZones,
// lookupSupplyZones,
// lookupDemandZones,
// lookupBullishOrderBlocks,
// lookupBearishOrderBlocks,
// lookupBullishFairValueGaps,
// lookupBearishFairValueGaps,
// lookupBullishRejectionBars,
// lookupBearishRejectionBars,
// lookupBullishMomentumBars,
// lookupBearishMomentumBars //
// );
// //
// if (h2.HasChild())
// {
// h2.Fill(mOrderFlow[pivotIDX].state);
// }
// }
//
// H1 ...
XPOIState h1;
if (_1HState.HasChild())
{
//
DetectPivotPOIs(
mOrderFlow[pivotIDX],
_1HState,
h1,
lookupSwingHighs,
lookupSwingLows,
lookupSupportZones,
lookupResistanceZones,
lookupSupplyZones,
lookupDemandZones,
lookupBullishOrderBlocks,
lookupBearishOrderBlocks,
lookupBullishFairValueGaps,
lookupBearishFairValueGaps,
lookupBullishRejectionBars,
lookupBearishRejectionBars,
lookupBullishMomentumBars,
lookupBearishMomentumBars //
);
//
if (h1.HasChild())
{
h1.Fill(mOrderFlow[pivotIDX].state);
}
}
//
// M15 ...
// XPOIState m15;
// if (_15MState.HasChild())
// {
// //
// DetectPivotPOIs(
// mOrderFlow[pivotIDX],
// _15MState,
// m15,
// lookupSwingHighs,
// lookupSwingLows,
// lookupSupportZones,
// lookupResistanceZones,
// lookupSupplyZones,
// lookupDemandZones,
// lookupBullishOrderBlocks,
// lookupBearishOrderBlocks,
// lookupBullishFairValueGaps,
// lookupBearishFairValueGaps,
// lookupBullishRejectionBars,
// lookupBearishRejectionBars,
// lookupBullishMomentumBars,
// lookupBearishMomentumBars //
// );
// //
// if (m15.HasChild())
// {
// m15.Fill(mOrderFlow[pivotIDX].state);
// }
// }
//
// M5 ...
// XPOIState m5;
// if (_5MState.HasChild())
// {
// //
// DetectPivotPOIs(
// mOrderFlow[pivotIDX],
// _5MState,
// m5,
// lookupSwingHighs,
// lookupSwingLows,
// lookupSupportZones,
// lookupResistanceZones,
// lookupSupplyZones,
// lookupDemandZones,
// lookupBullishOrderBlocks,
// lookupBearishOrderBlocks,
// lookupBullishFairValueGaps,
// lookupBearishFairValueGaps,
// lookupBullishRejectionBars,
// lookupBearishRejectionBars,
// lookupBullishMomentumBars,
// lookupBearishMomentumBars //
// );
// //
// if (m5.HasChild())
// {
// m5.Fill(mOrderFlow[pivotIDX].state);
// }
// }
//
// M1 ...
// XPOIState m1;
// if (_1MState.HasChild())
// {
// //
// DetectPivotPOIs(
// mOrderFlow[pivotIDX],
// _1MState,
// m1,
// lookupSwingHighs,
// lookupSwingLows,
// lookupSupportZones,
// lookupResistanceZones,
// lookupSupplyZones,
// lookupDemandZones,
// lookupBullishOrderBlocks,
// lookupBearishOrderBlocks,
// lookupBullishFairValueGaps,
// lookupBearishFairValueGaps,
// lookupBullishRejectionBars,
// lookupBearishRejectionBars,
// lookupBullishMomentumBars,
// lookupBearishMomentumBars //
// );
// //
// if (m1.HasChild())
// {
// m1.Fill(mOrderFlow[pivotIDX].state);
// }
// }