//+------------------------------------------------------------------+ //| ProjectName | //| Copyright 2020, CompanyName | //| http://www.companyname.net | //+------------------------------------------------------------------+ // // Imports ... #include "../Classes/XCObjects/x-saherelm.x-panel.class.mq5" #include // CTrade trade; // string mTag; // // SIGNALLING GUI ... XCPanel eaSignallingPanel; string eaSignallingPanelName; XCButton eaSignallingBtn; string eaSignallingBtnName; XCButton eaSignallingLongBtn; string eaSignallingLongBtnName; XCButton eaSignallingShortBtn; string eaSignallingShortBtnName; // // PROTECTOR GUI ... XCPanel eaProtectorPanel; string eaProtectorPanelName; XCButton eaHedgingBtn; string eaHedgingBtnName; XCButton eaTraillingBtn; string eaTraillingBtnName; XCButton eaFreezingBtn; string eaFreezingBtnName; XCButton eaSupportingBtn; string eaSupportingBtnName; // bool eaEnableLongs = true; bool eaEnableShorts = true; // bool mAllowHedge = true; // Allow Protector to Hedge Positions double eaHedgeMinVolumeStep = 0.01; // Minimum Volume Step For Hedge int eaMinimumOpenPositionsForHEHedge = 2; // Minimum Open Positions For HE Hedge double eaHedgeHEMinProfitPerVolumeStep = 1; // Minimum Required Profit For HE Hedge Per Volume Step double eaHedgeBEMinProfitPerVolumeStep = 0.5; // Minimum Required Profit For BE Hedge Per Volume Step // bool mAllowTrail = true; // Allow Trail Stop for Positions double eaTrailStartDistance = 35; // Specify Trail Start in Point double eaTrailStep = 10; // Trail Step in Point // bool mllowFreeze = false; // Allow Freezing double eaFreezeVolumeMultiplier = 3; // Specify Freeze Volume Multiplier double eaFreezeDistance = 100; // Specify Freeze Start Drawdown in Point // bool mAllowSupport = false; // Allow Support double eaSupportStartDistance = 0; // Specify Start Support Drawdown in Point double eaSupportVolumeMultiplier = 1; // Specify Support Volume Multiplier //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { // mTag = "XPanel"; if (!InitialGUI()) { return INIT_FAILED; } // return (INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { DestroyGUI(); } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { // UpdateGUI(); } //+------------------------------------------------------------------+ //|Chart event handling function | //+------------------------------------------------------------------+ void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam) { // // Handle Object Movement ... eaProtectorPanel.OnEvent(id, lparam, dparam, sparam); eaSignallingPanel.OnEvent(id, lparam, dparam, sparam); // // Handle OnClick Event ... if (id == CHARTEVENT_OBJECT_CLICK) { HandleOnClickEvent(sparam); } } //+------------------------------------------------------------------+ /** * Initial GUI ... * * @return ( bool ) */ bool InitialGUI() { // bool result = false; // result = InitSignallingGUI(); if (!result) { return result; } // result = InitialProtectorGUI(); if (!result) { return result; } // ChartRedraw(0); // return result; } /** * Update GUI Content ... */ void UpdateGUI() { // UpdateSignallingGUI(); UpdateProtectorGUI(); } /** * Destroy GUI ... */ void DestroyGUI() { // DestroySignallingGUI(); DestroyProtectorGUI(); } /** * Handle Object's Click Events ... * * @param name: Clicked Object Name */ void HandleOnClickEvent(string name) { // if (!IsValid(name)) { return; } // bool isClicked = false; // // Signalling State Button ... if (name == eaSignallingBtnName) { // isClicked = true; HandleChangeState(); eaSignallingBtn.SetState(false); Print("State Button Clicked ..."); } // // Long Signalling State ... else if (name == eaSignallingLongBtnName) { // isClicked = true; HandleChangeLongsState(); eaSignallingLongBtn.SetState(false); Print("Long State Button Clicked ..."); } // // Short Signalling State ... else if (name == eaSignallingShortBtnName) { // isClicked = true; HandleChangeShortsState(); eaSignallingShortBtn.SetState(false); Print("Short State Button Clicked ..."); } // // Hedging State Button ... else if (name == eaHedgingBtnName) { // isClicked = true; HandleChangeHedgingState(); eaHedgingBtn.SetState(false); Print("Hedging State Button Clicked ..."); } // // Trailling State Button ... else if (name == eaTraillingBtnName) { // isClicked = true; HandleChangeTraillingState(); eaTraillingBtn.SetState(false); Print("Trailling State Button Clicked ..."); } // // Freezing State Button ... else if (name == eaFreezingBtnName) { // isClicked = true; HandleChangeFreezingState(); eaFreezingBtn.SetState(false); Print("Freezing State Button Clicked ..."); } // // Supporting State Button ... else if (name == eaSupportingBtnName) { // isClicked = true; HandleChangeSupportingState(); eaSupportingBtn.SetState(false); Print("Supporting State Button Clicked ..."); } // if (isClicked) { UpdateGUI(); } } // // SIGNALLING GUI ... /** * Initialize State and Signalling GUI ... * * @return ( bool ) */ bool InitSignallingGUI() { // bool result = false; // eaSignallingPanelName = mTag + "SIGNALLING"; // // Create a Panel ... result = eaSignallingPanel.Create( eaSignallingPanelName, 10, 40, 300, 50 // ); if (!result) { return result; } eaSignallingPanel.Caption("Signalling"); // // Create Activation Button ... string eaSignallingPrefix = eaSignallingPanelName + "_"; // // Signalling ... eaSignallingBtnName = eaSignallingPrefix + "btn"; result = eaSignallingBtn.Create( eaSignallingBtnName, 10, 60, 300, 25 // ); if (!result) { return result; } eaSignallingBtn.SetText(""); eaSignallingPanel.Add(eaSignallingBtnName); // // Long Signalling ... eaSignallingLongBtnName = eaSignallingPrefix + "_Long_btn"; result = eaSignallingLongBtn.Create( eaSignallingLongBtnName, 10, 85, 150, 25 // ); if (!result) { return result; } eaSignallingLongBtn.SetText(""); eaSignallingPanel.Add(eaSignallingLongBtnName); // // Short Signalling ... eaSignallingShortBtnName = eaSignallingPrefix + "_Short_btn"; result = eaSignallingShortBtn.Create( eaSignallingShortBtnName, 160, 85, 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 Signalling GUI ... */ void DestroySignallingGUI() { // eaSignallingBtnName = NULL; eaSignallingLongBtnName = NULL; eaSignallingShortBtnName = NULL; // eaSignallingPanel.Destroy(); eaSignallingBtn.Destroy(); eaSignallingLongBtn.Destroy(); eaSignallingShortBtn.Destroy(); } // // PROTECTOR GUI ... /** * Initial Protector GUI ... * * @return ( bool ) */ bool InitialProtectorGUI() { // bool result = false; // eaProtectorPanelName = mTag + "PROTECTOR"; // // Create a Panel ... result = eaProtectorPanel.Create( eaProtectorPanelName, 10, 110, 300, 100 // ); if (!result) { return result; } eaProtectorPanel.Caption("Protector"); // string eaProtectorPrefix = eaProtectorPanelName + "_"; // // Hedging ... eaHedgingBtnName = eaProtectorPrefix + "HEDGING_btn"; result = eaHedgingBtn.Create( eaHedgingBtnName, 10, 130, 300, 25 // ); if (!result) { return result; } eaHedgingBtn.SetText(""); eaProtectorPanel.Add(eaHedgingBtnName); // // Trailling ... eaTraillingBtnName = eaProtectorPrefix + "TRAILLING_btn"; result = eaTraillingBtn.Create( eaTraillingBtnName, 10, 155, 300, 25 // ); if (!result) { return result; } eaTraillingBtn.SetText(""); eaProtectorPanel.Add(eaTraillingBtnName); // // Freezing ... eaFreezingBtnName = eaProtectorPrefix + "FREEZING_btn"; result = eaFreezingBtn.Create( eaFreezingBtnName, 10, 180, 300, 25 // ); if (!result) { return result; } eaFreezingBtn.SetText(""); eaProtectorPanel.Add(eaFreezingBtnName); // // Supporting ... eaSupportingBtnName = eaProtectorPrefix + "SUPPORTING_btn"; result = eaSupportingBtn.Create( eaSupportingBtnName, 10, 205, 300, 25 // ); if (!result) { return result; } eaSupportingBtn.SetText(""); eaProtectorPanel.Add(eaSupportingBtnName); // UpdateProtectorGUI(); // return result; } /** * Update Signalling GUI Content ... */ void UpdateProtectorGUI() { // // Hedging ... bool isHedgingEnabled = mAllowHedge && eaHedgeMinVolumeStep > 0 && (eaHedgeHEMinProfitPerVolumeStep > 0 || eaHedgeBEMinProfitPerVolumeStep > 0) && eaMinimumOpenPositionsForHEHedge >= 0; // color eaHedgingBtnTextColor = isHedgingEnabled ? clrRed : clrGreen; string eaHedgingBtnText = isHedgingEnabled ? "Deactive Hedging" : "Active Hedging"; eaHedgingBtn.SetText(eaHedgingBtnText); eaHedgingBtn.SetColor(eaHedgingBtnTextColor); // // Trailling ... bool isTraillingEnabled = mAllowTrail && eaTrailStep > 0 && eaTrailStartDistance >= 0; // color eaTraillingBtnColor = isTraillingEnabled ? clrRed : clrGreen; string eaTraillingBtnText = isTraillingEnabled ? "Deactive Trailling" : "Active Trailling"; eaTraillingBtn.SetText(eaTraillingBtnText); eaTraillingBtn.SetColor(eaTraillingBtnColor); // // Freezing ... bool isFreezingEnabled = mllowFreeze && eaFreezeDistance > 0 && eaFreezeVolumeMultiplier > 0; // color eaFreezingBtnColor = isFreezingEnabled ? clrRed : clrGreen; string eaFreezingBtnText = isFreezingEnabled ? "Deactive Freezing" : "Active Freezing"; eaFreezingBtn.SetText(eaFreezingBtnText); eaFreezingBtn.SetColor(eaFreezingBtnColor); // // Supporting ... bool isSupportingEnabled = !isFreezingEnabled && mAllowSupport && eaSupportStartDistance > 0 && eaSupportVolumeMultiplier > 0; // color eaSupportingBtnColor = isSupportingEnabled ? clrRed : clrGreen; string eaSupportingBtnText = isSupportingEnabled ? "Deactive Supporting" : "Active Supporting"; eaSupportingBtn.SetText(eaSupportingBtnText); eaSupportingBtn.SetColor(eaSupportingBtnColor); } /** * Destroy Protector GUI ... */ void DestroyProtectorGUI() { // eaHedgingBtnName = NULL; eaFreezingBtnName = NULL; eaTraillingBtnName = NULL; eaSupportingBtnName = NULL; eaProtectorPanelName = NULL; // eaHedgingBtn.Destroy(); eaFreezingBtn.Destroy(); eaTraillingBtn.Destroy(); eaSupportingBtn.Destroy(); eaProtectorPanel.Destroy(); } // // 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; } /** * Toggle Hedging State ... */ void HandleChangeHedgingState() { } /** * Toggle Trailling State ... */ void HandleChangeTraillingState() { } /** * Toogle Freezing State ... */ void HandleChangeFreezingState() { } /** * Toogle Supporting State ... */ void HandleChangeSupportingState() { } //