Files
MQL5Data/X121SMCEA/Strategy/x-121.smc.strategy.class.mq5
T
2024-10-26 19:48:36 +03:30

1888 lines
39 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
///////////////////////////////////////////////////////
//
// SaherElm IT Center MQL5 Class Library
// --------------------------------------
// Name: XSCX121Strategy
// Description: provides all based classes for use ...
//
//
// Maintainer:
// ------------
// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com)
//
//////////////////////////////////////////////////////
//
// Global Properties ...
#property library
#property copyright "Copyright 2023, SaherElm IT Center"
#property link "https://www.saherelm.ir"
#property version "1.00"
#property strict
//
// Imports ...
//
#include "../../Classes/x-saherelm.x-poi.class.mq5"
#include "../../Classes/x-saherelm.xalert.class.mq5"
#include "../../Classes/x-saherelm.xtrade.class.mq5"
#include "../Libraries/x-121.smc.lib.mq5"
//
// Helper(s) ...
//
// XStrategy Class Implementation(s) ...
class XCX121SMCStrategy : public XSCBaseAlert
{
//
// Public ...
public:
//
//
// Constructor(s) ...
void XCX121SMCStrategy(
//
// Base ...
string _symbol, // Trading Symbol
ENUM_TIMEFRAMES _period // Trading TimeFrame
)
{
//
mSymbol = _symbol;
mPeriod = _period;
//
Init();
}
//
// Deconstructor ...
void ~XCX121SMCStrategy()
{
DeInit();
}
//
// Getter / Setter (s) ...
/**
* Retrieve Symbol ...
*
* @return ( string )
*/
string Symbol()
{
return mSymbol;
}
/**
* Retrieve TimeFrame ...
*
* @return ( ENUM_TIMEFRAMES )
*/
ENUM_TIMEFRAMES Period()
{
return mPeriod;
}
/**
* Check Strategy is Disabled or not ...
*
* @return ( bool )
*/
bool IsDisabled()
{
return mForceDisabled;
}
/**
* Get Signal Volume ...
*
* @return ( double )
*/
double Volume()
{
return mVolume;
}
/**
* Set Signal Volume ...
*
* @param value: Double ...
*/
void Volume(double value)
{
//
if (value < 0.01)
{
value = 0.01;
}
//
mVolume = value;
}
/**
* Get Risk/Reward Ratio ...
*
* @return ( double )
*/
double R2R()
{
return mR2R;
}
/**
* Set Risk/Reward Ratio ...
*
* @param value: Double ...
*/
void R2R(double value)
{
//
if (value < 0)
{
value = 1.5;
}
//
mR2R = value;
}
/**
* Get Long Signalling State ...
*
* @return ( bool )
*/
bool AllowLong()
{
return mAllowLong;
}
/**
* Set Long Signalling State ...
*
* @param value: Boolean ...
*/
void AllowLong(bool value)
{
mAllowLong = value;
}
/**
* Get Short Signalling State ...
*
* @return ( bool )
*/
bool AllowShort()
{
return mAllowShort;
}
/**
* Set Short Signalling State ...
*
* @param value: Argument 1
*/
void AllowShort(bool value)
{
mAllowShort = value;
}
//
// Actions ...
/**
* Disable Strategy ...
*/
void Disable()
{
mForceDisabled = true;
}
/**
* Enable Strategy ...
*/
void Enable()
{
mForceDisabled = false;
}
/**
* Register Signal Event Handler ...
*
* @param handler: an Instance of TOnXSignal ...
*/
void AddXSignalEventHandler(TOnX121SMCSignal handler)
{
//
Add(
handler,
mSignalEventHandlers //
);
}
//
// Virtual Actions ...
//
// Check Conditions For Signal and Execute Signal ...
virtual void HandleTick()
{
//
// Check State ...
if (IsDisabled())
{
return;
}
//
// Check Signalling State ...
if (!AllowLong() && !AllowShort())
{
return;
}
//
// Check Bar Tracker State ...
if (!mBarTracker.CanProcessBar())
{
return;
}
//
// Retrieve Current Tick and Check it's Time
// by Last Issued Tick ...
MqlTick cTick;
bool hasTick = GetTick(
mSymbol,
cTick //
);
bool isSameAsLast = cTick.time == mLastTick.time;
if (isSameAsLast)
{
return;
}
//
// Update Last Issued Tick ...
mLastTick = cTick;
SaveTickData();
CleanupTicks();
//
// Update POIs ...
//
ENUM_XPOI_EVENTS _4HStates[];
m4HPOI.Update(_4HStates);
//
ENUM_XPOI_EVENTS _4HSupDemStates[];
m4HSupDemPOI.Update(_4HSupDemStates);
//
ENUM_XPOI_EVENTS _15MStates[];
m15MPOI.Update(_15MStates);
//
ENUM_XPOI_EVENTS _5MStates[];
m5MPOI.Update(_5MStates);
//
// Check Current Processing Tick has Signal or not ...
XSignal signal;
X121SMCStrategyConditions conditions;
bool hasSignal = HasSignal(
signal,
conditions //
);
if (!hasSignal)
{
return;
}
//
// Waits Until Next Candle if Current Tick has Signal ...
mBarTracker.Waits();
//
// Notify Signal Event Handlers ...
NotifyOnSignalEventHandlers(
signal,
conditions //
);
}
//
// Check Conditions For Signal ...
virtual bool HasSignal(
XSignal &signal,
X121SMCStrategyConditions &conditions //
)
{
//
bool result = false;
//
signal.Clean();
conditions.Clean();
//
double sl = 0;
double tp = 0;
double risk = 0;
double entry = 0;
double reward = 0;
double r2r = R2R();
double volume = Volume();
ENUM_POSITION_TYPE type = POSITION_TYPE_BUY;
ENUM_X_ORDER_MODES mode = X_ORDER_MODE_MARKET;
//
bool hasLong = false;
bool hasShort = false;
//
// Start Calculations ...
//
double points = GetPoints(mSymbol);
//
int zIndex = 0;
int cIndex = zIndex + 1;
int pIndex = cIndex + 1;
int ppIndex = pIndex + 1;
//
// Retrieve Bars ...
//
// Zero Bar ...
XOHCL zBar;
result = zBar.Init(
mSymbol,
mPeriod,
zIndex //
);
if (!result)
{
return result;
}
//
// Last Bar ...
XOHCL cBar;
result = cBar.Init(
mSymbol,
mPeriod,
cIndex //
);
if (!result)
{
return result;
}
//
// Prepare Conditions ...
//
conditions.symbol = mSymbol;
conditions.period = mPeriod;
conditions.time = cBar.time;
//
// Reading POI(s) ...
//
XPOIState _4HSupDemState;
m4HSupDemPOI.GetState(_4HSupDemState);
//
// 4H ...
XPOIState _4HState;
m4HPOI.GetState(_4HState);
//
// 15M ...
XPOIState _15MState;
m15MPOI.GetState(_15MState);
//
// 5M ...
XPOIState _5MState;
m5MPOI.GetState(_5MState);
//
// Try to Implement SMC Based Conditions ...
//
// 1- First Step is Find a Supply and Demand Zone ...
// - [] this Zone must be Fresh ...
// - [] contains Engulfing ...
// - [] has Order Block ...
// - [] has FVG ...
DetectImportantPOIs(
conditions,
_4HSupDemState,
_4HState,
_15MState,
_5MState //
);
if (conditions.supplyZone.IsValid() ||
conditions.bearishFVG.IsValid() ||
conditions.bearishOrderBlock.IsValid())
{
//
AddRef(
conditions,
mConditions //
);
}
else if (conditions.demandZone.IsValid() ||
conditions.bullishFVG.IsValid() ||
conditions.bullishOrderBlock.IsValid())
{
//
AddRef(
conditions,
mConditions //
);
}
//
conditions.Clean();
//
// Check Conditions for Signal ...
int conditionsCount = ArraySize(mConditions);
if (!IsValidSize(conditionsCount))
{
//
result = false;
return result;
}
//
// Loop through Conditions for Filter Based on POIs ...
for (int i = 0; i < conditionsCount; i++)
{
//
X121SMCStrategyConditions iConditions = mConditions[i];
//
// LONG ...
//
bool isSoImportantLong =
conditions.demandZone.IsValid() &&
conditions.bullishFVG.IsValid() &&
conditions.bullishOrderBlock.IsValid();
//
bool isImportantLong =
conditions.demandZone.IsValid() &&
(conditions.bullishFVG.IsValid() ||
conditions.bullishOrderBlock.IsValid());
//
bool isRiskyLong =
conditions.demandZone.IsValid() &&
(conditions.bullishFVG.IsValid() ||
conditions.bullishOrderBlock.IsValid());
//
bool hasLongConditions = isSoImportantLong;
// ||
// isImportantLong ||
// isRiskyLong;
//
if (hasLongConditions)
{
//
DrawConditions(conditions);
Print("hasLongConditions");
}
//
// SHORT ...
//
bool isSoImportantShort =
conditions.supplyZone.IsValid() &&
conditions.bearishFVG.IsValid() &&
conditions.bearishOrderBlock.IsValid();
//
bool isImportantShort =
conditions.supplyZone.IsValid() &&
(conditions.bearishFVG.IsValid() ||
conditions.bearishOrderBlock.IsValid());
//
bool isRiskyShort =
conditions.supplyZone.IsValid() &&
(!conditions.bearishFVG.IsValid() &&
!conditions.bearishOrderBlock.IsValid());
//
bool hasShortConditions = isSoImportantShort;
// ||
// isImportantShort ||
// isRiskyShort;
//
if (hasShortConditions)
{
//
DrawConditions(conditions);
Print("hasShortConditions");
}
//
}
//
return result;
}
//
// Overrides ...
//
// Customize Strategy Identifier ...
string GetTag() override
{
return X121SMCStrategyToken;
}
//
// Protected ...
protected:
//
//
// Props ...
//
// Private ...
private:
//
// Props ...
//
string mSymbol; // Trading Symbol ...
ENUM_TIMEFRAMES mPeriod; // Trading TimeFrame ...
bool mForceDisabled; // Force Disabled ...
bool mAllowLong; // Allow Long Signals
bool mAllowShort; // Allow Short Signals
double mR2R; // Risk/Rewar Ratio ...
double mVolume; // Static Volume Per Trades ...
//
MqlTick mLastTick; // Last Issued Tick ...
XTick mTicks[]; // Hold Ticks Data ...
/**
* Cleanup Ticks Size ...
*/
void CleanupTicks()
{
//
int maxRequiredTicks = 50;
int ticksCount = ArraySize(mTicks);
if (!IsValidSize(ticksCount) ||
ticksCount <= maxRequiredTicks)
{
return;
}
//
int removeCount = ticksCount - maxRequiredTicks;
if (!IsValidSize(removeCount))
{
return;
}
//
ArrayRemove(
mTicks,
0,
removeCount //
);
}
/**
* Add new Tick Data to Collection ...
*/
void SaveTickData()
{
//
datetime time = TimeCurrent();
double ask = GetAsk(mSymbol);
double bid = GetBid(mSymbol);
//
XTick tick;
bool isInited = tick.Init(
mSymbol,
time,
bid,
ask //
);
if (!isInited)
{
return;
}
//
AddRef(
tick,
mTicks //
);
}
//
XBarTracker mBarTracker; // Strategy Time Tracker ...
//
// Point Of Interests ...
XCPOI *m4HPOI;
XCPOI *m4HSupDemPOI;
XCPOI *m15MPOI;
XCPOI *m5MPOI;
//
// Collect all Drawn Objects ...
CArrayObj mDrawnObjects;
/**
* Remove Specified Drawn Object ...
*
* @param name: Object name ...
*/
void RemoveObject(string name)
{
//
if (!IsValid(name))
{
return;
}
//
int count = mDrawnObjects.Total();
if (!IsValidSize(count))
{
return;
}
//
int idx = -1;
for (int i = 0; i < count; i++)
{
//
string iName = ((CChartObject *)mDrawnObjects.At(i)).Name();
string iObjName = ((XCBaseObject *)mDrawnObjects.At(i)).ObjName();
//
if ((IsValid(iName) &&
iName == name) ||
(IsValid(iObjName) &&
iObjName == name))
{
//
idx = i;
break;
}
}
//
if (IsValidIndex(idx))
{
mDrawnObjects.Delete(idx);
}
}
//
XOHCL mSwingHigh;
CChartObjectHLine *mSwingHighObject;
//
XOHCL mSwingLow;
CChartObjectHLine *mSwingLowObject;
//
// Holding Supply and Demand Zones ...
// XZone mSupplyZones[];
// XZone mDemandZones[];
//
// XZone mBearishOrderBlocks[];
// XZone mBullishOrderBlocks[];
//
// XZone mBearishFVGs[];
// XZone mBullishFVGs[];
//
X121SMCStrategyConditions mConditions[];
//
// Actions ...
/**
* Install all Helpers and Prepare all Configurations for required Indicators ...
*/
void Init()
{
//
mForceDisabled = false;
//
string symbol = Symbol();
ENUM_TIMEFRAMES period = Period();
//
// Initialize Bar Tracker ...
mBarTracker.Init(
symbol,
period //
);
//
// Initialize POIs ...
//
// this used only for Supply and
// Demand Zone for H4 Time Frame ..,
// POI Detector ...
m4HSupDemPOI = new XCPOI(
symbol,
PERIOD_M15 //
);
m4HSupDemPOI.Window(0);
m4HSupDemPOI.DisablePOIs();
m4HSupDemPOI.DisableDrawPOIs();
m4HSupDemPOI.ChartID(ChartID());
m4HSupDemPOI.AllowSupplyZones(true);
m4HSupDemPOI.AllowDemandZones(true);
m4HSupDemPOI.SupplyZonePeriod(PERIOD_H4);
m4HSupDemPOI.DemandZonePeriod(PERIOD_H4);
//
m4HSupDemPOI.Init();
//
// 4H Period ...
// POI Detector ...
m4HPOI = new XCPOI(
symbol,
PERIOD_H4 //
);
//
m4HPOI.Window(0);
m4HPOI.DisableDrawPOIs();
m4HPOI.ChartID(ChartID());
m4HPOI.SupplyZonePeriod(PERIOD_H4);
m4HPOI.DemandZonePeriod(PERIOD_H4);
//
m4HPOI.Init();
//
// 15M Period ...
// POI Detector ...
m15MPOI = new XCPOI(
symbol,
PERIOD_M15 //
);
//
m15MPOI.Window(0);
m15MPOI.DisableDrawPOIs();
m15MPOI.ChartID(ChartID());
m15MPOI.MaxNumberOfRequiredPOIs(2);
m15MPOI.SupplyZonePeriod(PERIOD_M15);
m15MPOI.DemandZonePeriod(PERIOD_M15);
//
m15MPOI.Init();
//
// Trigger Period ...
// POI Detector ...
m5MPOI = new XCPOI(
symbol,
PERIOD_M5 //
);
//
m5MPOI.Window(0);
m5MPOI.DisableDrawPOIs();
m5MPOI.ChartID(ChartID());
m5MPOI.MaxNumberOfRequiredPOIs(2);
m5MPOI.SupplyZonePeriod(PERIOD_M5);
m5MPOI.DemandZonePeriod(PERIOD_M5);
//
m5MPOI.Init();
//
}
/**
* De Initialize all Tools ...
*/
void DeInit()
{
//
delete m4HPOI;
delete m5MPOI;
delete m15MPOI;
// delete m4HSupDemPOI;
}
/**
* Reste Bar Tracker ...
*/
void ResetBarTracker()
{
mBarTracker.Clean();
}
/**
* Prepare and Normalize Signal for Execution in Strategy ...
*
* @param signal: XSignal instance ...
*
* @return ( bool )
*/
bool PrepareSignal(XSignal &signal)
{
//
bool result = false;
//
// Check Strategy Is Enables ...
result = !IsDisabled();
if (!result)
{
return result;
}
//
// Validate Signal ...
result = signal.IsValid();
if (!result)
{
return result;
}
//
bool isLong = IsLong(signal.type);
//
// TODO: Implement Signal Preparation Mechanism here ...
//
return result;
}
/**
* Update Supply and Demand Zones ...
*
* @param state: Argument 1
*/
void DetectImportantPOIs(
X121SMCStrategyConditions &conditions,
XPOIState &supplyAndDemandZoneState,
XPOIState &orderBlocksState,
XPOIState &fvgsState,
XPOIState &triggerState //
)
{
//
int supplyZonesCount = ArraySize(supplyAndDemandZoneState.supplyZones);
int demandZonesCount = ArraySize(supplyAndDemandZoneState.demandZones);
//
XOHCL swingHighs[];
Copy(
orderBlocksState.swingHighs,
swingHighs //
);
Copy(
fvgsState.swingHighs,
swingHighs,
false //
);
Copy(
triggerState.swingHighs,
swingHighs,
false //
);
//
XOHCL swingLows[];
Copy(
orderBlocksState.swingLows,
swingLows //
);
Copy(
fvgsState.swingLows,
swingLows,
false //
);
Copy(
triggerState.swingLows,
swingLows,
false //
);
//
int swingHighsCount = ArraySize(swingHighs);
int swingLowsCount = ArraySize(swingLows);
if (!IsValidSize(swingLowsCount) ||
!IsValidSize(swingHighsCount) ||
!IsValidSize(supplyZonesCount) ||
!IsValidSize(demandZonesCount))
{
return;
}
//
XOHCL zBar;
bool isInited = zBar.Init(
Symbol(),
Period(),
0 //
);
if (!isInited)
{
return;
}
//
// Detect Swing High and Low as Market Structure Boundaries ...
//
// Swing High ...
XOHCL tmpBar;
for (int i = 0; i < swingHighsCount; i++)
{
//
XOHCL iSwing = swingHighs[i];
//
if (!tmpBar.IsValid() ||
tmpBar.high < iSwing.high)
{
tmpBar = iSwing;
}
}
DrawSwingHigh(tmpBar);
//
// Swing Low ...
tmpBar.Clean();
for (int i = 0; i < swingLowsCount; i++)
{
//
XOHCL iSwing = swingLows[i];
//
if (!tmpBar.IsValid() ||
tmpBar.low > iSwing.low)
{
tmpBar = iSwing;
}
}
DrawSwingLow(tmpBar);
tmpBar.Clean();
//
// Supply Zone ...
for (int i = 0; i < supplyZonesCount; i++)
{
//
XZone iSupplyZone = supplyAndDemandZoneState.supplyZones[i];
conditions.supplyZone = iSupplyZone;
//
XZone iBearishOrderBlock;
XZone iBearishFVG;
//
bool isPassed = false;
int orderBlocksCount = ArraySize(orderBlocksState.bearishOrderBlocks);
isPassed = IsValidSize(orderBlocksCount);
if (!isPassed)
{
continue;
}
//
// Find Related Order Block ...
isPassed = false;
for (int j = 0; j < orderBlocksCount; j++)
{
//
XZone jOrderBlock = orderBlocksState.bearishOrderBlocks[j];
//
bool isOrderBlockInsideZone = IsSupplyZoneOrderBlock(
iSupplyZone,
jOrderBlock //
);
if (isOrderBlockInsideZone)
{
//
isPassed = true;
iBearishOrderBlock = jOrderBlock;
conditions.bearishOrderBlock = jOrderBlock;
break;
}
}
if (!isPassed)
{
continue;
}
//
isPassed = false;
int fairValueGapsCount = ArraySize(fvgsState.bearishFVGs);
isPassed = IsValidSize(fairValueGapsCount);
if (!isPassed)
{
continue;
}
//
// Find Related Fair Value Gaps ...
isPassed = false;
for (int j = 0; j < fairValueGapsCount; j++)
{
//
XZone jFVG = fvgsState.bearishFVGs[j];
//
bool isBelongs = IsBearishOrderBlockFVG(
iBearishOrderBlock,
jFVG //
);
if (isBelongs)
{
//
iBearishFVG = jFVG;
conditions.bearishFVG = jFVG;
//
isPassed = true;
break;
}
}
// if (!isPassed)
// {
// continue;
// }
// //
// if (isPassed)
// {
// //
// DrawSupplyZone(iSupplyZone);
// DrawBearishOrderBlock(iBearishOrderBlock);
// DrawBearishFVG(iBearishFVG);
// }
}
//
// Demand Zone ...
for (int i = 0; i < demandZonesCount; i++)
{
//
XZone iDemandZone = supplyAndDemandZoneState.demandZones[i];
conditions.demandZone = iDemandZone;
//
XZone iBullishOrderBlock;
XZone iBullishFVG;
//
bool isPassed = false;
int orderBlocksCount = ArraySize(orderBlocksState.bullishOrderBlocks);
isPassed = IsValidSize(orderBlocksCount);
if (!isPassed)
{
continue;
}
//
// Find Related Order Block ...
isPassed = false;
for (int j = 0; j < orderBlocksCount; j++)
{
//
XZone jOrderBlock = orderBlocksState.bullishOrderBlocks[j];
//
bool isOrderBlockInsideZone = IsDemandZoneOrderBlock(
iDemandZone,
jOrderBlock //
);
if (isOrderBlockInsideZone)
{
//
isPassed = true;
iBullishOrderBlock = jOrderBlock;
conditions.bullishOrderBlock = jOrderBlock;
break;
}
}
if (!isPassed)
{
continue;
}
//
isPassed = false;
int fairValueGapsCount = ArraySize(fvgsState.bullishFVGs);
isPassed = IsValidSize(fairValueGapsCount);
if (!isPassed)
{
continue;
}
//
// Find Related Fair Value Gaps ...
isPassed = false;
for (int j = 0; j < fairValueGapsCount; j++)
{
//
XZone jFVG = fvgsState.bullishFVGs[j];
//
bool isBelongs = IsBullishOrderBlockFVG(
iBullishOrderBlock,
jFVG //
);
if (isBelongs)
{
//
iBullishFVG = jFVG;
conditions.bullishFVG = jFVG;
//
isPassed = true;
break;
}
}
// if (!isPassed)
// {
// continue;
// }
// //
// if (isPassed)
// {
// //
// DrawDemandZone(iDemandZone);
// DrawBullishOrderBlock(iBullishOrderBlock);
// DrawBullishFVG(iBullishFVG);
// }
}
//
}
//
// On X121 Signal Recieved Event Handler(s) ...
TOnX121SMCSignal mSignalEventHandlers[];
//
/**
* Notified Signal Event Handler(s) ...
*
* @param signal: XSignal instance ...
* @param conditions: XStrategyConditions instance ...
*/
void NotifyOnSignalEventHandlers(
XSignal &signal,
X121SMCStrategyConditions &conditions //
)
{
//
if (!signal.IsValid() || !conditions.IsValid())
{
return;
}
//
int count = ArraySize(mSignalEventHandlers);
if (!IsValidSize(count))
{
return;
}
//
for (int i = 0; i < count; i++)
{
//
mSignalEventHandlers[i](
signal,
conditions //
);
}
}
//
// Tools Functions ...
/**
* Check an Order Block belongs to a Supply Zone ...
*
* @param supply: XZone instance ...
* @param orderBlock: XZone instance ...
*
* @return ( bool )
*/
bool IsSupplyZoneOrderBlock(
XZone &supply,
XZone &orderBlock //
)
{
//
bool result = false;
//
result = supply.IsValid() &&
orderBlock.IsValid();
if (!result)
{
return result;
}
//
result =
orderBlock.upper <= supply.upper;
//
return result;
}
/**
* Check an Order Block belongs to a Demand Zone ...
*
* @param demand: XZone instance ...
* @param orderBlock: XZone instance ...
*
* @return ( bool )
*/
bool IsDemandZoneOrderBlock(
XZone &demand,
XZone &orderBlock //
)
{
//
bool result = false;
//
result = demand.IsValid() &&
orderBlock.IsValid();
if (!result)
{
return result;
}
//
result =
orderBlock.lower >= demand.lower;
//
return result;
}
/**
* Check a Bearish FVG belongs to a Bearish Order Block ...
*
* @param orderBlock: XZone instance ...
* @param fvg: XZone instance ...
*
* @return ( bool )
*/
bool IsBearishOrderBlockFVG(
XZone &orderBlock,
XZone &fvg //
)
{
//
bool result = false;
//
result = fvg.IsValid() &&
orderBlock.IsValid();
if (!result)
{
return result;
}
//
result =
fvg.upper <= orderBlock.upper &&
fvg.upper > orderBlock.lower;
//
return result;
}
/**
* Check a Bullish FVG belongs to a Bullish Order Block ...
*
* @param orderBlock: XZone instance ...
* @param fvg: XZone instance ...
*
* @return ( bool )
*/
bool IsBullishOrderBlockFVG(
XZone &orderBlock,
XZone &fvg //
)
{
//
bool result = false;
//
result = fvg.IsValid() &&
orderBlock.IsValid();
if (!result)
{
return result;
}
//
result =
fvg.lower >= orderBlock.lower &&
fvg.lower < orderBlock.upper;
//
return result;
}
//
// Draw Functions ...
/**
* Draw Specific Swing High ...
*
* @param swing: XOHCL instance which represents Swing Point ...
*/
void DrawSwingHigh(XOHCL &swing)
{
//
if (!swing.IsValid())
{
return;
}
//
string name = swing.GetTag(ToString(X_POI_SWING_HIGH));
//
if (mSwingHigh.IsValid())
{
//
mSwingHigh.Clean();
mSwingHighObject.Delete();
}
//
mSwingHigh = swing;
mSwingHighObject = new CChartObjectHLine();
bool isCreated = mSwingHighObject.Create(
ChartID(),
name,
0,
swing.high //
);
if (!isCreated)
{
return;
}
//
mSwingHighObject.Width(1);
mSwingHighObject.Color(clrBrown);
mSwingHighObject.Style(STYLE_SOLID);
}
/**
* Draw Specific Swing Low ...
*
* @param swing: XOHCL instance which represents Swing Point ...
*/
void DrawSwingLow(XOHCL &swing)
{
//
if (!swing.IsValid())
{
return;
}
//
string name = swing.GetTag(ToString(X_POI_SWING_LOW));
//
if (mSwingLow.IsValid())
{
//
mSwingLow.Clean();
mSwingLowObject.Delete();
}
//
mSwingLow = swing;
mSwingLowObject = new CChartObjectHLine();
//
bool isCreated = mSwingLowObject.Create(
ChartID(),
name,
0,
swing.low //
);
if (!isCreated)
{
return;
}
//
mSwingLowObject.Width(1);
mSwingLowObject.Color(clrGreen);
mSwingLowObject.Style(STYLE_SOLID);
}
/**
* Draw Supply Zone ...
*
* @param zone: XZone instance ...
*/
void DrawSupplyZone(XZone &zone)
{
//
if (!zone.IsValid())
{
return;
}
//
string name = zone.GetTag();
RemoveObject(name);
// int idx = FindIndex(zone, mSupplyZones);
// if (IsValidIndex(idx))
// {
// // //
// // ArrayRemove(
// // mSupplyZones,
// // idx,
// // 1 //
// // );
// //
// }
//
zone.to = TimeCurrent();
name = zone.GetTag();
// AddRef(
// zone,
// mSupplyZones //
// );
//
XCSupplyZoneObject *iObj;
iObj = new XCSupplyZoneObject();
bool isCreated = iObj.CreateByZone(
ChartID(),
name,
0,
zone,
NULL,
true //
);
if (!isCreated)
{
return;
}
//
iObj.ZoneWidth(1);
iObj.ZoneStyle(STYLE_DOT);
iObj.ZoneColor(clrMagenta);
//
mDrawnObjects.Add(iObj);
}
/**
* Draw Demand Zone ...
*
* @param zone: XZone instance ...
*/
void DrawDemandZone(XZone &zone)
{
//
if (!zone.IsValid())
{
return;
}
//
string name = zone.GetTag();
RemoveObject(name);
// int idx = FindIndex(zone, mDemandZones);
// if (IsValidIndex(idx))
// {
// // //
// // ArrayRemove(
// // mDemandZones,
// // idx,
// // 1 //
// // );
// //
// }
//
zone.to = TimeCurrent();
name = zone.GetTag();
// AddRef(
// zone,
// mDemandZones //
// );
//
XCDemandZoneObject *iObj;
iObj = new XCDemandZoneObject();
bool isCreated = iObj.CreateByZone(
ChartID(),
name,
0,
zone,
NULL,
true //
);
if (!isCreated)
{
return;
}
//
iObj.ZoneWidth(1);
iObj.ZoneStyle(STYLE_DOT);
iObj.ZoneColor(clrAqua);
//
mDrawnObjects.Add(iObj);
}
/**
* Draw Specific Bearish Order Block ...
*
* @param zone: XZone instance ...
*/
void DrawBearishOrderBlock(XZone &zone)
{
//
if (!zone.IsValid())
{
return;
}
//
string name = zone.GetTag();
RemoveObject(name);
// int idx = FindIndex(zone, mBearishOrderBlocks);
// if (IsValidIndex(idx))
// {
// // //
// // ArrayRemove(
// // mBearishOrderBlocks,
// // idx,
// // 1 //
// // );
// //
// }
//
zone.to = TimeCurrent();
name = zone.GetTag();
// AddRef(
// zone,
// mBearishOrderBlocks //
// );
//
XCBearishOrderBlockObject *iObj;
iObj = new XCBearishOrderBlockObject();
bool isCreated = iObj.CreateByZone(
ChartID(),
name,
0,
zone,
NULL,
true //
);
if (!isCreated)
{
return;
}
//
iObj.ZoneWidth(1);
iObj.ZoneColor(clrRed);
iObj.ZoneStyle(STYLE_DASH);
//
mDrawnObjects.Add(iObj);
}
/**
* Draw Specific Bullish Order Block ...
*
* @param zone: XZone instance ...
*/
void DrawBullishOrderBlock(XZone &zone)
{
//
if (!zone.IsValid())
{
return;
}
//
string name = zone.GetTag();
RemoveObject(name);
// int idx = FindIndex(zone, mBullishOrderBlocks);
// if (IsValidIndex(idx))
// {
// // //
// // ArrayRemove(
// // mBullishOrderBlocks,
// // idx,
// // 1 //
// // );
// //
// }
//
zone.to = TimeCurrent();
name = zone.GetTag();
// AddRef(
// zone,
// mBullishOrderBlocks //
// );
//
XCBullishOrderBlockObject *iObj;
iObj = new XCBullishOrderBlockObject();
bool isCreated = iObj.CreateByZone(
ChartID(),
name,
0,
zone,
NULL,
true //
);
if (!isCreated)
{
return;
}
//
iObj.ZoneWidth(1);
iObj.ZoneColor(clrLime);
iObj.ZoneStyle(STYLE_DASH);
//
mDrawnObjects.Add(iObj);
}
/**
* Draw Specific Bearish FVG ...
*
* @param zone: XZone instance ...
*/
void DrawBearishFVG(XZone &zone)
{
//
if (!zone.IsValid())
{
return;
}
//
string name = zone.GetTag();
RemoveObject(name);
// int idx = FindIndex(zone, mBearishFVGs);
// if (IsValidIndex(idx))
// {
// //
// // ArrayRemove(
// // mBearishFVGs,
// // idx,
// // 1 //
// // );
// //
// }
//
zone.to = TimeCurrent();
name = zone.GetTag();
// AddRef(
// zone,
// mBearishFVGs //
// );
//
XCBearishFVGObject *iObj;
iObj = new XCBearishFVGObject();
bool isCreated = iObj.CreateByZone(
ChartID(),
name,
0,
zone,
NULL,
true //
);
if (!isCreated)
{
return;
}
//
iObj.ZoneWidth(1);
iObj.ZoneColor(clrOrange);
iObj.ZoneStyle(STYLE_DASHDOT);
//
mDrawnObjects.Add(iObj);
}
/**
* Draw Specific Bullish FVG ...
*
* @param zone: XZone instance ...
*/
void DrawBullishFVG(XZone &zone)
{
//
if (!zone.IsValid())
{
return;
}
//
string name = zone.GetTag();
RemoveObject(name);
// int idx = FindIndex(zone, mBullishFVGs);
// if (IsValidIndex(idx))
// {
// // //
// // ArrayRemove(
// // mBullishFVGs,
// // idx,
// // 1 //
// // );
// //
// }
//
zone.to = TimeCurrent();
name = zone.GetTag();
// AddRef(
// zone,
// mBullishFVGs //
// );
//
XCBullishFVGObject *iObj;
iObj = new XCBullishFVGObject();
bool isCreated = iObj.CreateByZone(
ChartID(),
name,
0,
zone,
NULL,
true //
);
if (!isCreated)
{
return;
}
//
iObj.ZoneWidth(1);
iObj.ZoneColor(clrSteelBlue);
iObj.ZoneStyle(STYLE_DASHDOT);
//
mDrawnObjects.Add(iObj);
}
/**
* Draw Specific Condition ...
*
* @param conditions: Argument 1
*/
void DrawConditions(X121SMCStrategyConditions &conditions)
{
//
if (conditions.supplyZone.IsValid())
{
DrawSupplyZone(conditions.supplyZone);
}
//
if (conditions.bearishOrderBlock.IsValid())
{
DrawBearishOrderBlock(conditions.bearishOrderBlock);
}
//
if (conditions.bearishFVG.IsValid())
{
DrawBearishFVG(conditions.bearishFVG);
}
//
if (conditions.demandZone.IsValid())
{
DrawDemandZone(conditions.demandZone);
}
//
if (conditions.bullishOrderBlock.IsValid())
{
DrawBullishOrderBlock(conditions.bullishOrderBlock);
}
//
if (conditions.bullishFVG.IsValid())
{
DrawBullishFVG(conditions.bullishFVG);
}
}
//
};
//