/////////////////////////////////////////////////////// // // SaherElm IT Center MQL5 Class Library // -------------------------------------- // Name: XChartObjects // Description: provides all require Chart Objects ... // // // 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 // #include "../../Classes/x-saherelm.x-chart-objects.class.mq5" #include "../../Classes/x-saherelm.x-poi.drawer.class.mq5" #include "../../Libraries/x-saherelm.x-poi.lib.mq5" #include "../Libraries/x-121.smc.lib.mq5" // #include // // Definitions ... enum ENUM_X121SMC_CHARTOBJECTS { // // Global ... X_121SMC_CONDITIONS_OBJ = 110121, X_121SMC_MARKET_STRUCTURE_OBJ = 110122, }; // // Implementations ... // // Market Conditions ... class XC121SMCConditionsObject : public XCBaseObject { // public: // // // Constructor ... void XC121SMCConditionsObject(XCPOIDrawer *_poiDrawer) { mPOIDrawer = _poiDrawer; } // // Deconstructor ... void ~XC121SMCConditionsObject() { } /** * Create a Conditions Object on Chart ... * * @param chart_id: Long ... * @param name: String ... * @param window: Integer ... * @param conditions: X121SMCStrategyConditions instance ... * * @return ( bool ) */ bool CreateByConditions( long chart_id, const string name, const int window, X121SMCStrategyConditions &conditions // ) { // bool result = false; // result = IsValid(name); if (!result) { return result; } // string nameMD5 = ToMD5(name); string suffix = "_" + nameMD5; // // Supply Zone ... bool isCreated = mPOIDrawer.CreateSupplyZone( conditions.supplyZone, mSupplyZoneObj // ); // // Demnd Zone ... isCreated = mPOIDrawer.CreateDemandZone( conditions.demandZone, mDemandZoneObj // ); // // Bullish Order Block ... isCreated = mPOIDrawer.CreateBullishOrderBlock( conditions.bullishOrderBlock, mBullishOBObj // ); // // Bearish Order Block ... isCreated = mPOIDrawer.CreateBearishOrderBlock( conditions.bearishOrderBlock, mBearishOBObj // ); // // Collections ... // // Order Blocks ... // // Bullish ... int count = ArraySize(conditions.bullishOrderBlocks); if (IsValidSize(count)) { // for (int i = 0; i < count; i++) { // XZone iZone = conditions.bullishOrderBlocks[i]; // XCBullishOrderBlockObject *iObj; bool isCreated = mPOIDrawer.CreateBullishOrderBlock( iZone, iObj // ); // if (isCreated) { mBullishOBObjs.Add(iObj); } } } // // Bearish ... count = ArraySize(conditions.bearishOrderBlocks); if (IsValidSize(count)) { // for (int i = 0; i < count; i++) { // XZone iZone = conditions.bearishOrderBlocks[i]; // XCBearishOrderBlockObject *iObj; bool isCreated = mPOIDrawer.CreateBearishOrderBlock( iZone, iObj // ); // if (isCreated) { mBearishOBObjs.Add(iObj); } } } // // Fair Value Gaps ... // // Bullish ... count = ArraySize(conditions.bullishFVGs); if (IsValidSize(count)) { // for (int i = 0; i < count; i++) { // XZone iZone = conditions.bullishFVGs[i]; // XCBullishFVGObject *iObj; bool isCreated = mPOIDrawer.CreateBullishFVG( iZone, iObj // ); // if (isCreated) { mBullishFVGObjs.Add(iObj); } } } // // Bearish ... count = ArraySize(conditions.bearishFVGs); if (IsValidSize(count)) { // for (int i = 0; i < count; i++) { // XZone iZone = conditions.bearishFVGs[i]; // XCBearishFVGObject *iObj; bool isCreated = mPOIDrawer.CreateBearishFVG( iZone, iObj // ); // if (isCreated) { mBearishFVGObjs.Add(iObj); } } } // // Support and Resistance Zones ... // // Supports ... count = ArraySize(conditions.supports); if (IsValidSize(count)) { // for (int i = 0; i < count; i++) { // XOHCL iBar = conditions.supports[i]; // XCSupportZoneObject *iObj; bool isCreated = mPOIDrawer.CreateSupportZone( iBar, iObj // ); // if (isCreated) { mSupportZoneObjs.Add(iObj); } } } // // Resistances ... count = ArraySize(conditions.resistances); if (IsValidSize(count)) { // for (int i = 0; i < count; i++) { // XOHCL iBar = conditions.resistances[i]; // XCResistanceZoneObject *iObj; bool isCreated = mPOIDrawer.CreateResistanceZone( iBar, iObj // ); // if (isCreated) { mResistanceZoneObjs.Add(iObj); } } } // // Swings ... // // High ... count = ArraySize(conditions.swingHighs); if (IsValidSize(count)) { // for (int i = 0; i < count; i++) { // XOHCL iBar = conditions.swingHighs[i]; // XCSwingHighObject *iObj; bool isCreated = mPOIDrawer.CreateSwingHigh( iBar, iObj // ); // if (isCreated) { mSwingHighObjs.Add(iObj); } } } // // Low ... count = ArraySize(conditions.swingLows); if (IsValidSize(count)) { // for (int i = 0; i < count; i++) { // XOHCL iBar = conditions.swingLows[i]; // XCSwingLowObject *iObj; bool isCreated = mPOIDrawer.CreateSwingLow( iBar, iObj // ); // if (isCreated) { mSwingLowObjs.Add(iObj); } } } // // Momentum Bars ... // // Bullish ... count = ArraySize(conditions.bullishMomentumBars); if (IsValidSize(count)) { // for (int i = 0; i < count; i++) { // XOHCL iBar = conditions.bullishMomentumBars[i]; // XCBullishMomentumBarObject *iObj; bool isCreated = mPOIDrawer.CreateBullishMomentumBar( iBar, iObj // ); // if (isCreated) { mBullishMomentumBarObjs.Add(iObj); } } } // // Bearish ... count = ArraySize(conditions.bearishMomentumBars); if (IsValidSize(count)) { // for (int i = 0; i < count; i++) { // XOHCL iBar = conditions.bearishMomentumBars[i]; // XCBearishMomentumBarObject *iObj; bool isCreated = mPOIDrawer.CreateBearishMomentumBar( iBar, iObj // ); // if (isCreated) { mBearishMomentumBarObjs.Add(iObj); } } } // // Rejection Bars ... // // Bullish ... count = ArraySize(conditions.bullishRejectionBars); if (IsValidSize(count)) { // for (int i = 0; i < count; i++) { // XOHCL iBar = conditions.bullishRejectionBars[i]; // XCBullishRejectionBarObject *iObj; bool isCreated = mPOIDrawer.CreateBullishRejectionBar( iBar, iObj // ); // if (isCreated) { mBullishRejectionBarObjs.Add(iObj); } } } // // Bearish ... count = ArraySize(conditions.bearishRejectionBars); if (IsValidSize(count)) { // for (int i = 0; i < count; i++) { // XOHCL iBar = conditions.bearishRejectionBars[i]; // XCBearishRejectionBarObject *iObj; bool isCreated = mPOIDrawer.CreateBearishRejectionBar( iBar, iObj // ); // if (isCreated) { mBearishRejectionBarObjs.Add(iObj); } } } // if (result) { ObjName(name); } // return result; } /** * Retrieve Object Type ... * * @return ( ENUM_X121SMC_CHARTOBJECTS ) */ virtual ENUM_X121SMC_CHARTOBJECTS Type() { return X_121SMC_CONDITIONS_OBJ; } // private: // XCPOIDrawer *mPOIDrawer; // XCSupplyZoneObject *mSupplyZoneObj; XCDemandZoneObject *mDemandZoneObj; // XCBullishOrderBlockObject *mBullishOBObj; XCBearishOrderBlockObject *mBearishOBObj; // CArrayObj mBullishOBObjs; CArrayObj mBearishOBObjs; // CArrayObj mBullishFVGObjs; CArrayObj mBearishFVGObjs; // CArrayObj mSupportZoneObjs; CArrayObj mResistanceZoneObjs; // CArrayObj mSwingHighObjs; CArrayObj mSwingLowObjs; // CArrayObj mBullishMomentumBarObjs; CArrayObj mBearishMomentumBarObjs; // CArrayObj mBullishRejectionBarObjs; CArrayObj mBearishRejectionBarObjs; // }; // // Market Structure ... class XC121SMCMarketStructureObject : public XCBaseObject { // public: // // // Constructor ... void XC121SMCMarketStructureObject(XCPOIDrawer *_poiDrawer) { mPOIDrawer = _poiDrawer; } // // Deconstructor ... void ~XC121SMCMarketStructureObject() { } /** * Create a Conditions Object on Chart ... * * @param chart_id: Long ... * @param name: String ... * @param window: Integer ... * @param conditions: X121SMCStrategyConditions instance ... * * @return ( bool ) */ bool CreateByStructure( long chart_id, const string name, const int window, X121SMCMarketStructure &structure // ) { // bool result = false; // result = IsValid(name); if (!result) { return result; } // string nameMD5 = ToMD5(name); string suffix = "_" + nameMD5; // // Supply Zone ... bool isCreated = mPOIDrawer.CreateSupplyZone( structure.supplyZone, mSupplyZoneObj // ); // // Demnd Zone ... isCreated = mPOIDrawer.CreateDemandZone( structure.demandZone, mDemandZoneObj // ); // // Bullish Order Block ... isCreated = mPOIDrawer.CreateBullishOrderBlock( structure.bullishOrderBlock, mBullishOBObj // ); // // Bearish Order Block ... isCreated = mPOIDrawer.CreateBearishOrderBlock( structure.bearishOrderBlock, mBearishOBObj // ); // // Collections ... // // Order Blocks ... // // Bullish ... int count = ArraySize(structure.bullishOrderBlocks); if (IsValidSize(count)) { // for (int i = 0; i < count; i++) { // XZone iZone = structure.bullishOrderBlocks[i]; // XCBullishOrderBlockObject *iObj; bool isCreated = mPOIDrawer.CreateBullishOrderBlock( iZone, iObj // ); // if (isCreated) { mBullishOBObjs.Add(iObj); } } } // // Bearish ... count = ArraySize(structure.bearishOrderBlocks); if (IsValidSize(count)) { // for (int i = 0; i < count; i++) { // XZone iZone = structure.bearishOrderBlocks[i]; // XCBearishOrderBlockObject *iObj; bool isCreated = mPOIDrawer.CreateBearishOrderBlock( iZone, iObj // ); // if (isCreated) { mBearishOBObjs.Add(iObj); } } } // // Fair Value Gaps ... // // Bullish ... count = ArraySize(structure.bullishFVGs); if (IsValidSize(count)) { // for (int i = 0; i < count; i++) { // XZone iZone = structure.bullishFVGs[i]; // XCBullishFVGObject *iObj; bool isCreated = mPOIDrawer.CreateBullishFVG( iZone, iObj // ); // if (isCreated) { mBullishFVGObjs.Add(iObj); } } } // // Bearish ... count = ArraySize(structure.bearishFVGs); if (IsValidSize(count)) { // for (int i = 0; i < count; i++) { // XZone iZone = structure.bearishFVGs[i]; // XCBearishFVGObject *iObj; bool isCreated = mPOIDrawer.CreateBearishFVG( iZone, iObj // ); // if (isCreated) { mBearishFVGObjs.Add(iObj); } } } // // Support and Resistance Zones ... // // Supports ... count = ArraySize(structure.supports); if (IsValidSize(count)) { // for (int i = 0; i < count; i++) { // XOHCL iBar = structure.supports[i]; // XCSupportZoneObject *iObj; bool isCreated = mPOIDrawer.CreateSupportZone( iBar, iObj // ); // if (isCreated) { mSupportZoneObjs.Add(iObj); } } } // // Resistances ... count = ArraySize(structure.resistances); if (IsValidSize(count)) { // for (int i = 0; i < count; i++) { // XOHCL iBar = structure.resistances[i]; // XCResistanceZoneObject *iObj; bool isCreated = mPOIDrawer.CreateResistanceZone( iBar, iObj // ); // if (isCreated) { mResistanceZoneObjs.Add(iObj); } } } // // Swings ... // // High ... count = ArraySize(structure.swingHighs); if (IsValidSize(count)) { // for (int i = 0; i < count; i++) { // XOHCL iBar = structure.swingHighs[i]; // XCSwingHighObject *iObj; bool isCreated = mPOIDrawer.CreateSwingHigh( iBar, iObj // ); // if (isCreated) { mSwingHighObjs.Add(iObj); } } } // // Low ... count = ArraySize(structure.swingLows); if (IsValidSize(count)) { // for (int i = 0; i < count; i++) { // XOHCL iBar = structure.swingLows[i]; // XCSwingLowObject *iObj; bool isCreated = mPOIDrawer.CreateSwingLow( iBar, iObj // ); // if (isCreated) { mSwingLowObjs.Add(iObj); } } } // // Momentum Bars ... // // Bullish ... count = ArraySize(structure.bullishMomentumBars); if (IsValidSize(count)) { // for (int i = 0; i < count; i++) { // XOHCL iBar = structure.bullishMomentumBars[i]; // XCBullishMomentumBarObject *iObj; bool isCreated = mPOIDrawer.CreateBullishMomentumBar( iBar, iObj // ); // if (isCreated) { mBullishMomentumBarObjs.Add(iObj); } } } // // Bearish ... count = ArraySize(structure.bearishMomentumBars); if (IsValidSize(count)) { // for (int i = 0; i < count; i++) { // XOHCL iBar = structure.bearishMomentumBars[i]; // XCBearishMomentumBarObject *iObj; bool isCreated = mPOIDrawer.CreateBearishMomentumBar( iBar, iObj // ); // if (isCreated) { mBearishMomentumBarObjs.Add(iObj); } } } // // Rejection Bars ... // // Bullish ... count = ArraySize(structure.bullishRejectionBars); if (IsValidSize(count)) { // for (int i = 0; i < count; i++) { // XOHCL iBar = structure.bullishRejectionBars[i]; // XCBullishRejectionBarObject *iObj; bool isCreated = mPOIDrawer.CreateBullishRejectionBar( iBar, iObj // ); // if (isCreated) { mBullishRejectionBarObjs.Add(iObj); } } } // // Bearish ... count = ArraySize(structure.bearishRejectionBars); if (IsValidSize(count)) { // for (int i = 0; i < count; i++) { // XOHCL iBar = structure.bearishRejectionBars[i]; // XCBearishRejectionBarObject *iObj; bool isCreated = mPOIDrawer.CreateBearishRejectionBar( iBar, iObj // ); // if (isCreated) { mBearishRejectionBarObjs.Add(iObj); } } } // if (result) { ObjName(name); } // return result; } /** * Retrieve Object Type ... * * @return ( ENUM_X121SMC_CHARTOBJECTS ) */ virtual ENUM_X121SMC_CHARTOBJECTS Type() { return X_121SMC_MARKET_STRUCTURE_OBJ; } // private: // XCPOIDrawer *mPOIDrawer; // XCSupplyZoneObject *mSupplyZoneObj; XCDemandZoneObject *mDemandZoneObj; // XCBullishOrderBlockObject *mBullishOBObj; XCBearishOrderBlockObject *mBearishOBObj; // CArrayObj mBullishOBObjs; CArrayObj mBearishOBObjs; // CArrayObj mBullishFVGObjs; CArrayObj mBearishFVGObjs; // CArrayObj mSupportZoneObjs; CArrayObj mResistanceZoneObjs; // CArrayObj mSwingHighObjs; CArrayObj mSwingLowObjs; // CArrayObj mBullishMomentumBarObjs; CArrayObj mBearishMomentumBarObjs; // CArrayObj mBullishRejectionBarObjs; CArrayObj mBearishRejectionBarObjs; // }; //