From 2cca497b62559a0168f28ec2fc48522af4da8752 Mon Sep 17 00:00:00 2001 From: Hadi Khazaee Asl Date: Tue, 24 Sep 2024 18:02:10 +0330 Subject: [PATCH] last works on GUI Panel Developing ... --- .../XCObjects/x-saherelm.x-button.class.mq5 | 16 ++- Classes/XCObjects/x-saherelm.x-edit.class.mq5 | 10 ++ .../XCObjects/x-saherelm.x-label.class.mq5 | 19 ++++ .../XCObjects/x-saherelm.x-panel.class.mq5 | 38 ++++++- Experts/x-saherelm.test-panel.ea.mq5 | 61 +++++++++- Experts/x-saherelm.x121.ea.mq5 | 107 ++++++++++++++++++ 6 files changed, 242 insertions(+), 9 deletions(-) diff --git a/Classes/XCObjects/x-saherelm.x-button.class.mq5 b/Classes/XCObjects/x-saherelm.x-button.class.mq5 index 0f72bdb5..4fb47d9e 100644 --- a/Classes/XCObjects/x-saherelm.x-button.class.mq5 +++ b/Classes/XCObjects/x-saherelm.x-button.class.mq5 @@ -104,7 +104,7 @@ class XCButton : XSCBase /** * Set Object Border Color ... - * + * * @param value: color */ void SetBorderColor(color value) @@ -114,7 +114,7 @@ class XCButton : XSCBase /** * Set Object Background Color ... - * + * * @param value: color */ void SetBGColor(color value) @@ -124,7 +124,7 @@ class XCButton : XSCBase /** * Set Object Text ... - * + * * @param value: text */ void SetText(string value) @@ -132,6 +132,16 @@ class XCButton : XSCBase ObjectSetString(0, mName, OBJPROP_TEXT, value); } + /** + * Set Object ZOrder ... + * + * @param value: z order + */ + void SetZOrder(int value) + { + ObjectSetInteger(0, mName, OBJPROP_ZORDER, value); + } + // // Protected ... protected: diff --git a/Classes/XCObjects/x-saherelm.x-edit.class.mq5 b/Classes/XCObjects/x-saherelm.x-edit.class.mq5 index 034416eb..d04852e0 100644 --- a/Classes/XCObjects/x-saherelm.x-edit.class.mq5 +++ b/Classes/XCObjects/x-saherelm.x-edit.class.mq5 @@ -152,6 +152,16 @@ class XCEdit : XSCBase return ObjectGetString(0, mName, OBJPROP_TEXT); } + /** + * Set Object ZOrder ... + * + * @param value: z order + */ + void SetZOrder(int value) + { + ObjectSetInteger(0, mName, OBJPROP_ZORDER, value); + } + // // Protected ... protected: diff --git a/Classes/XCObjects/x-saherelm.x-label.class.mq5 b/Classes/XCObjects/x-saherelm.x-label.class.mq5 index 79d94c7d..ea5b27b6 100644 --- a/Classes/XCObjects/x-saherelm.x-label.class.mq5 +++ b/Classes/XCObjects/x-saherelm.x-label.class.mq5 @@ -146,6 +146,25 @@ class XCLabel : XSCBase ObjectSetString(0, mName, OBJPROP_FONT, value); } + /** + * Set Object Anchor ... + * + * @param value: anchor + */ + void SetAnchor(ENUM_ANCHOR_POINT value) { + ObjectSetInteger(0, mName, OBJPROP_ANCHOR, value); + } + + /** + * Set Object ZOrder ... + * + * @param value: z order + */ + void SetZOrder(int value) + { + ObjectSetInteger(0, mName, OBJPROP_ZORDER, value); + } + // // Protected ... protected: diff --git a/Classes/XCObjects/x-saherelm.x-panel.class.mq5 b/Classes/XCObjects/x-saherelm.x-panel.class.mq5 index 2b6406b2..ea5a1787 100644 --- a/Classes/XCObjects/x-saherelm.x-panel.class.mq5 +++ b/Classes/XCObjects/x-saherelm.x-panel.class.mq5 @@ -52,7 +52,25 @@ class XCPanel : XSCBase // // Action ... - // + /** + * Create an instance of Panel Object ... + * + * @param name: Object name + * @param xDis: X Distance + * @param yDis: Y Distance + * @param xSize: X Size + * @param ySize: Y Size + * @param titleBarBorderType: Border Type of Panel TitleBar + * @param titleBarBGColor: Background Color of Panel TitleBar + * @param caption: Caption Text of Panel TitleBar + * @param captionontSize: Font Size of Panel Caption + * @param captionColor: Text Color of Panel Caption + * @param captionAnchor: Anchor Point of Panel Caption + * @param bodyBorderType: Border Type of Panel Body + * @param bodyBGColor: Background Color of Panel Body + * + * @return ( bool ) + */ bool Create( string name, int xDis, @@ -68,6 +86,7 @@ class XCPanel : XSCBase string caption = "", int captionontSize = 9, color captionColor = clrWhite, + ENUM_ANCHOR_POINT captionAnchor = ANCHOR_LEFT_UPPER, // // Body ... ENUM_BORDER_TYPE bodyBorderType = BORDER_FLAT, @@ -99,7 +118,7 @@ class XCPanel : XSCBase // // Title Bar ... - int titleBarHeight = ySize / 5; + int titleBarHeight = 20; result = mTitleBar.Create( mTitleBarName, xDis, @@ -144,6 +163,7 @@ class XCPanel : XSCBase return result; } mTitleText.SetText(caption); + mTitleText.SetAnchor(captionAnchor); mTitleText.SetTextColor(captionColor); mTitleText.SetFontSize(captionontSize); @@ -156,7 +176,9 @@ class XCPanel : XSCBase return result; } - // + /** + * Destroy Panel Object and all of it's Child + */ void Destroy() { // @@ -193,6 +215,16 @@ class XCPanel : XSCBase ); } + /** + * Add Specific Child Object ... + * + * @param name: object name + */ + void Add(string name) + { + mTitleBar.Add(name); + } + // protected: private: diff --git a/Experts/x-saherelm.test-panel.ea.mq5 b/Experts/x-saherelm.test-panel.ea.mq5 index a8f219f8..e45d3039 100644 --- a/Experts/x-saherelm.test-panel.ea.mq5 +++ b/Experts/x-saherelm.test-panel.ea.mq5 @@ -13,7 +13,12 @@ CTrade trade; // -XCPanel panel; +string mTag; +XCPanel eaPanel; +XCButton eaStateBtn; +string eaStateBtnName; +bool eaEnableLongs = true; +bool eaEnableShorts = true; //+------------------------------------------------------------------+ //| Expert initialization function | @@ -21,7 +26,7 @@ XCPanel panel; int OnInit() { // - panel.Create("XPanel", 100, 100, 200, 100); + // panel.Create("XPanel", 100, 100, 300, 200); // // Enables mouse move events on the chart @@ -70,6 +75,9 @@ int OnInit() // TitleBar.Add("BuyButton"); // TitleBar.Add("SellButton"); + // + mTag = "XPanel"; + InitialPanel(); ChartRedraw(0); // Redraws the chart return (INIT_SUCCEEDED); } @@ -87,6 +95,9 @@ void OnDeinit(const int reason) // LotSize.Destroy(); // BuyButton.Destroy(); // SellButton.Destroy(); + + // + eaPanel.Destroy(); } //+------------------------------------------------------------------+ @@ -113,6 +124,50 @@ void OnChartEvent(const int id, const long &lparam, const double &dparam, const // TitleBar.OnEvent(id, lparam, dparam, sparam); // - panel.OnEvent(id, lparam, dparam, sparam); + eaPanel.OnEvent(id, lparam, dparam, sparam); } //+------------------------------------------------------------------+ + +// +bool InitialPanel() +{ + // + bool result = false; + + // + // Create a Panel ... + result = eaPanel.Create( + mTag, + 100, + 100, + 300, + 200 // + ); + if (!result) + { + return result; + } + + // + // Create Activation Button ... + string eaStatePrefix = mTag + "_State_"; + eaStateBtnName = eaStatePrefix + "lbl"; + result = eaStateBtn.Create( + eaStateBtnName, + 100, + 120, + 100, + 25 // + ); + if (!result) + { + return result; + } + eaStateBtn.SetZOrder(100); + + // + eaPanel.Add(eaStateBtnName); + + // + return result; +} \ No newline at end of file diff --git a/Experts/x-saherelm.x121.ea.mq5 b/Experts/x-saherelm.x121.ea.mq5 index 55b25ff2..a7047058 100644 --- a/Experts/x-saherelm.x121.ea.mq5 +++ b/Experts/x-saherelm.x121.ea.mq5 @@ -36,6 +36,9 @@ #include "../Parsers/x-saherelm.xch.che.parser.mq5" #include "../Strategies/x-saherelm.xch.che.strategy.mq5" +// +#include "../Classes/XCObjects/x-saherelm.x-panel.class.mq5" + // // Inputs ... @@ -190,6 +193,14 @@ XTimeTracker eaTimeTracker; // Trade Handler Instance Class ... X121SCTradeHandler *eaTradeHandler; +// +// Panel of EA ... +XCPanel eaPanel; +XCButton eaStateButton; +string eaStateButtonTitle; +bool eaEnableLongs = true; +bool eaEnableShorts = true; + // string mTag = ""; @@ -230,6 +241,13 @@ int OnInit() // EventSetTimer(1); // EventSetMillisecondTimer(100); + // + // Create Panel for EA Data ... + if (!InitialPanel()) + { + return INIT_FAILED; + } + // // Alert Initialization ... string msg = "Initialized Successfully ..."; @@ -271,6 +289,9 @@ void OnDeinit(const int reason) delete eaTrader; delete eaTradeHandler; + // + eaPanel.Destroy(); + // Clean(strategies); } @@ -282,6 +303,7 @@ void OnTick() // HandleTradeState(); HandleTimeReport(); + HandlePanelUpdate(); HandleStrategiesOnTick(); } @@ -302,6 +324,24 @@ void OnTimer() // HandleStrategiesOnTick(); } +// +// Chart Event Handler ... +void OnChartEvent( + const int id, + const long &lparam, + const double &dparam, + const string &sparam // +) +{ + // + eaPanel.OnEvent( + id, + lparam, + dparam, + sparam // + ); +} + // // Custom Functions ... @@ -418,6 +458,42 @@ bool ValidateInputs() return result; } +// +bool InitialPanel() +{ + // + bool result = false; + + // + // Create a Panel ... + result = eaPanel.Create( + mTag, + 100, + 100, + 300, + 200 // + ); + if (!result) + { + return result; + } + + // + // Create Activation Button ... + string eaStatePrefix = mTag + "_State_"; + eaStateButtonTitle = eaStatePrefix + "lbl"; + result = eaStateButton.Create( + eaStateButtonTitle, + 100, + 120, + 100, + 25 // + ); + + // + return result; +} + // // Initialize all Requirements ... bool InitialEA() @@ -885,6 +961,19 @@ void HandleTimeReport() } } +// +// Update Panel ... +void HandlePanelUpdate() +{ + // + // Prepare State ... + bool isEnable = eaEnableLongs || + eaEnableShorts; + + // + string stateStr = isEnable ? "Active" : "Inactive"; +} + // // SIGNAL EVENT Handlers ... // @@ -912,6 +1001,9 @@ void OnSignalRecieved( return; } + // + bool isLong = IsLong(signal.type); + // // Notify When a Raw (Unfiltered) Signal Recieved // if it's Provided ... @@ -949,6 +1041,21 @@ void OnSignalRecieved( // eaTradeHandler.UpdateSignal(signal); } + else + { + signal.volume = eaVolume; + } + + // + // Chekc Signalling Enable or not ... + bool canContinue = + isLong + ? eaEnableLongs + : eaEnableShorts; + if (!canContinue) + { + return; + } // // Since Signal Filtering done based on