From 20aeac12f67d085949da3282a4e57f4e98a8fcc8 Mon Sep 17 00:00:00 2001 From: Hadi Khazaee Asl Date: Wed, 25 Sep 2024 06:41:21 +0330 Subject: [PATCH] Add Supports for Signalling Panel and its Actions and also Completely Test it ... --- .../XCObjects/x-saherelm.x-button.class.mq5 | 20 ++ .../XCObjects/x-saherelm.x-panel.class.mq5 | 42 ++- Experts/x-saherelm.test-panel.ea.mq5 | 314 +++++++++++++----- 3 files changed, 286 insertions(+), 90 deletions(-) diff --git a/Classes/XCObjects/x-saherelm.x-button.class.mq5 b/Classes/XCObjects/x-saherelm.x-button.class.mq5 index a573deda..9e835985 100644 --- a/Classes/XCObjects/x-saherelm.x-button.class.mq5 +++ b/Classes/XCObjects/x-saherelm.x-button.class.mq5 @@ -122,6 +122,16 @@ class XCButton : XSCBase ObjectSetInteger(0, mName, OBJPROP_BGCOLOR, value); } + /** + * Set Object Text Color ... + * + * @param value: Color + */ + void SetColor(color value) + { + ObjectSetInteger(0, mName, OBJPROP_COLOR, value); + } + /** * Set Object Text ... * @@ -152,6 +162,16 @@ class XCButton : XSCBase ObjectSetInteger(0, mName, OBJPROP_BACK, value); } + /** + * Set Button Click State ... + * + * @param value: state + */ + void SetState(bool value) + { + ObjectSetInteger(0, mName, OBJPROP_STATE, value); + } + // // Protected ... protected: diff --git a/Classes/XCObjects/x-saherelm.x-panel.class.mq5 b/Classes/XCObjects/x-saherelm.x-panel.class.mq5 index 4f0198b6..d128f0f0 100644 --- a/Classes/XCObjects/x-saherelm.x-panel.class.mq5 +++ b/Classes/XCObjects/x-saherelm.x-panel.class.mq5 @@ -107,7 +107,7 @@ class XCPanel : XSCBase // mTitleBarName = name + "_TITLE_BAR"; - mTitleTextName = name + "_CAPTION"; + mCaptionLblName = name + "_CAPTION"; mBodyName = name + "_BODY"; // @@ -156,22 +156,22 @@ class XCPanel : XSCBase // // Caption ... - result = mTitleText.Create(mTitleTextName, xDis, yDis); + result = mCaptionLbl.Create(mCaptionLblName, xDis, yDis); if (!result) { // Destroy(); return result; } - mTitleText.SetText(caption); - mTitleText.SetAnchor(captionAnchor); - mTitleText.SetTextColor(captionColor); - mTitleText.SetFontSize(captionontSize); + mCaptionLbl.SetText(caption); + mCaptionLbl.SetAnchor(captionAnchor); + mCaptionLbl.SetTextColor(captionColor); + mCaptionLbl.SetFontSize(captionontSize); // // Adding Child Objects ... mTitleBar.Add(mBodyName); - mTitleBar.Add(mTitleTextName); + mTitleBar.Add(mCaptionLblName); // return result; @@ -185,12 +185,12 @@ class XCPanel : XSCBase // mBodyName = NULL; mTitleBarName = NULL; - mTitleTextName = NULL; + mCaptionLblName = NULL; // mBody.Destroy(); mTitleBar.Destroy(); - mTitleText.Destroy(); + mCaptionLbl.Destroy(); } /** @@ -226,6 +226,26 @@ class XCPanel : XSCBase mTitleBar.Add(name); } + /** + * Retrieve Panel Caption ... + * + * @return ( string ) + */ + string Caption() + { + return mCaptionLbl.GetText(); + } + + /** + * Set Panel Caption ... + * + * @param value: Caption + */ + void Caption(string value) + { + mCaptionLbl.SetText(value); + } + // protected: private: @@ -235,10 +255,10 @@ class XCPanel : XSCBase // string mBodyName; string mTitleBarName; - string mTitleTextName; + string mCaptionLblName; // - XCLabel mTitleText; + XCLabel mCaptionLbl; XCRectangleLabel mBody; XCRectangleLabel mTitleBar; diff --git a/Experts/x-saherelm.test-panel.ea.mq5 b/Experts/x-saherelm.test-panel.ea.mq5 index 374c090e..5de583d6 100644 --- a/Experts/x-saherelm.test-panel.ea.mq5 +++ b/Experts/x-saherelm.test-panel.ea.mq5 @@ -14,13 +14,16 @@ CTrade trade; // string mTag; -XCPanel eaPanel; -XCButton eaStateBtn; -string eaStateBtnName; -XCButton eaLongStateBtn; -string eaLongStateBtnName; -XCButton eaShortStateBtn; -string eaShortStateBtnName; +XCPanel eaSignallingPanel; +string eaSignallingPanelName; +XCButton eaSignallingBtn; +string eaSignallingBtnName; +XCButton eaSignallingLongBtn; +string eaSignallingLongBtnName; +XCButton eaSignallingShortBtn; +string eaSignallingShortBtnName; + +// bool eaEnableLongs = true; bool eaEnableShorts = true; @@ -31,7 +34,8 @@ int OnInit() { // mTag = "XPanel"; - if (!InitialGUI()) { + if (!InitialGUI()) + { return INIT_FAILED; } @@ -47,6 +51,15 @@ void OnDeinit(const int reason) DestroyGUI(); } +//+------------------------------------------------------------------+ +//| Expert tick function | +//+------------------------------------------------------------------+ +void OnTick() +{ + // + UpdateGUI(); +} + //+------------------------------------------------------------------+ //|Chart event handling function | //+------------------------------------------------------------------+ @@ -54,7 +67,7 @@ void OnChartEvent(const int id, const long &lparam, const double &dparam, const { // // Handle Object Movement ... - eaPanel.OnEvent(id, lparam, dparam, sparam); + eaSignallingPanel.OnEvent(id, lparam, dparam, sparam); // // Handle OnClick Event ... @@ -76,71 +89,12 @@ bool InitialGUI() bool result = false; // - // Create a Panel ... - result = eaPanel.Create( - mTag, - 100, - 100, - 300, - 200 // - ); + result = InitSignallingGUI(); if (!result) { return result; } - // - // Create Activation Button ... - string eaStatePrefix = mTag + "_State_"; - - // - // Signalling ... - eaStateBtnName = eaStatePrefix + "btn"; - result = eaStateBtn.Create( - eaStateBtnName, - 100, - 120, - 300, - 25 // - ); - if (!result) - { - return result; - } - eaPanel.Add(eaStateBtnName); - - // - // Long Signalling ... - eaLongStateBtnName = eaStatePrefix + "_Long_btn"; - result = eaLongStateBtn.Create( - eaLongStateBtnName, - 100, - 145, - 150, - 25 // - ); - if (!result) - { - return result; - } - eaPanel.Add(eaLongStateBtnName); - - // - // Short Signalling ... - eaShortStateBtnName = eaStatePrefix + "_Short_btn"; - result = eaShortStateBtn.Create( - eaShortStateBtnName, - 250, - 145, - 150, - 25 // - ); - if (!result) - { - return result; - } - eaPanel.Add(eaShortStateBtnName); - // ChartRedraw(0); @@ -148,21 +102,164 @@ bool InitialGUI() return result; } +/** + * Update GUI Content ... + */ +void UpdateGUI() +{ + // + UpdateSignallingGUI(); +} + +/** + * Initialize State and Signalling GUI ... + * + * @return ( bool ) + */ +bool InitSignallingGUI() +{ + // + bool result = false; + + // + eaSignallingPanelName = mTag + "SIGNALLING"; + + // + // Create a Panel ... + result = eaSignallingPanel.Create( + eaSignallingPanelName, + 100, + 100, + 300, + 50 // + ); + if (!result) + { + return result; + } + eaSignallingPanel.Caption("Signalling"); + + // + // Create Activation Button ... + string eaSignallingPrefix = eaSignallingPanelName + "_State_"; + + // + // Signalling ... + eaSignallingBtnName = eaSignallingPrefix + "btn"; + result = eaSignallingBtn.Create( + eaSignallingBtnName, + 100, + 120, + 300, + 25 // + ); + if (!result) + { + return result; + } + eaSignallingBtn.SetText(""); + eaSignallingPanel.Add(eaSignallingBtnName); + + // + // Long Signalling ... + eaSignallingLongBtnName = eaSignallingPrefix + "_Long_btn"; + result = eaSignallingLongBtn.Create( + eaSignallingLongBtnName, + 100, + 145, + 150, + 25 // + ); + if (!result) + { + return result; + } + eaSignallingLongBtn.SetText(""); + eaSignallingPanel.Add(eaSignallingLongBtnName); + + // + // Short Signalling ... + eaSignallingShortBtnName = eaSignallingPrefix + "_Short_btn"; + result = eaSignallingShortBtn.Create( + eaSignallingShortBtnName, + 250, + 145, + 150, + 25 // + ); + if (!result) + { + return result; + } + eaSignallingShortBtn.SetText(""); + eaSignallingPanel.Add(eaSignallingShortBtnName); + + // + UpdateSignallingGUI(); + + // + return result; +} + +/** + * Update Signalling GUI Content ... + */ +void UpdateSignallingGUI() +{ + // + // Preparing State ... + bool isSignallingActive = eaEnableLongs || + eaEnableShorts; + + // + // All Signalls ... + color mSignallingBtnTextColor = isSignallingActive + ? clrRed + : clrGreen; + string mSignallingBtnText = isSignallingActive + ? "Deactive" + : "Active"; + eaSignallingBtn.SetText(mSignallingBtnText); + eaSignallingBtn.SetColor(mSignallingBtnTextColor); + + // + // Long Signals ... + color mSignallingLongBtnTextColor = eaEnableLongs + ? clrRed + : clrGreen; + string mSignallingLongBtnText = eaEnableLongs + ? "Deactive Longs" + : "Active Longs"; + eaSignallingLongBtn.SetText(mSignallingLongBtnText); + eaSignallingLongBtn.SetColor(mSignallingLongBtnTextColor); + + // + // Short Signals ... + color mSignallingShortBtnTextColor = eaEnableShorts + ? clrRed + : clrGreen; + string mSignallingShortBtnText = eaEnableShorts + ? "Deactive Shorts" + : "Active Shorts"; + eaSignallingShortBtn.SetText(mSignallingShortBtnText); + eaSignallingShortBtn.SetColor(mSignallingShortBtnTextColor); +} + /** * Destroy GUI ... */ void DestroyGUI() { // - eaStateBtnName = NULL; - eaLongStateBtnName = NULL; - eaShortStateBtnName = NULL; + eaSignallingBtnName = NULL; + eaSignallingLongBtnName = NULL; + eaSignallingShortBtnName = NULL; // - eaPanel.Destroy(); - eaStateBtn.Destroy(); - eaLongStateBtn.Destroy(); - eaShortStateBtn.Destroy(); + eaSignallingPanel.Destroy(); + eaSignallingBtn.Destroy(); + eaSignallingLongBtn.Destroy(); + eaSignallingShortBtn.Destroy(); } /** @@ -180,23 +277,82 @@ void HandleOnClickEvent(string name) // // State Button ... - if (name == eaStateBtnName) + bool isClicked = false; + if (name == eaSignallingBtnName) { // + isClicked = true; + HandleChangeState(); + eaSignallingBtn.SetState(false); Print("State Button Clicked ..."); } // - else if (name == eaLongStateBtnName) + else if (name == eaSignallingLongBtnName) { // + isClicked = true; + HandleChangeLongsState(); + eaSignallingLongBtn.SetState(false); Print("Long State Button Clicked ..."); } // - else if (name == eaShortStateBtnName) + else if (name == eaSignallingShortBtnName) { // + isClicked = true; + HandleChangeShortsState(); + eaSignallingShortBtn.SetState(false); Print("Short State Button Clicked ..."); } + + // + if (isClicked) + { + UpdateGUI(); + } +} + +// +// GUI EVENT Handlers ... + +/** + * Toggle Signalling State ... + */ +void HandleChangeState() +{ + // + bool isActive = eaEnableLongs || + eaEnableShorts; + + // + if (isActive) + { + // + eaEnableLongs = false; + eaEnableShorts = false; + } + else + { + // + eaEnableLongs = true; + eaEnableShorts = true; + } +} + +/** + * Toggle Longs Signalling State ... + */ +void HandleChangeLongsState() +{ + eaEnableLongs = !eaEnableLongs; +} + +/** + * Toggle Shorts Signalling State ... + */ +void HandleChangeShortsState() +{ + eaEnableShorts = !eaEnableShorts; } // \ No newline at end of file