From 64fc1fb3197e19bf3d30b6ea69f76e36df680ef5 Mon Sep 17 00:00:00 2001 From: Hadi Khazaee Asl Date: Mon, 23 Sep 2024 07:48:38 +0330 Subject: [PATCH] Apply Fix on Signal Delays ... --- .../XObjects/x-saherelm.x-button.class.mq5 | 162 +++++++++++ .../BKP/XObjects/x-saherelm.x-label.class.mq5 | 176 ++++++++++++ .../x-saherelm.x-rectangle.label.class.mq5 | 268 ++++++++++++++++++ Experts/x-saherelm.x121.ea.mq5 | 21 ++ 4 files changed, 627 insertions(+) create mode 100644 Documents/BKP/XObjects/x-saherelm.x-button.class.mq5 create mode 100644 Documents/BKP/XObjects/x-saherelm.x-label.class.mq5 create mode 100644 Documents/BKP/XObjects/x-saherelm.x-rectangle.label.class.mq5 diff --git a/Documents/BKP/XObjects/x-saherelm.x-button.class.mq5 b/Documents/BKP/XObjects/x-saherelm.x-button.class.mq5 new file mode 100644 index 00000000..6aadff80 --- /dev/null +++ b/Documents/BKP/XObjects/x-saherelm.x-button.class.mq5 @@ -0,0 +1,162 @@ +// /////////////////////////////////////////////////////// +// // +// // SaherElm IT Center MQL5 Class Library +// // -------------------------------------- +// // Name: XCButton +// // 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 + +// // +// #include "../x-saherelm.base.class.mq5" + +// // +// // Definitions ... + +// // +// // Implementation ... + +// // +// // a Button Creation Class ... +// class XCButton : XSCBase +// { +// // +// // Public ... +// public: +// // +// // Constructor(s) ... +// void XCButton() +// { +// } + +// // +// // Deconstructor ... +// void ~XCButton() +// { +// } + +// // +// // Actions ... + +// /** +// * Create an Instance of Class Object ... +// * +// * @param name: Object Name +// * @param xDis: X Distance +// * @param yDis: Y Distance +// * @param xSize: X Size +// * @param ySize: Y Size +// */ +// bool Create( +// string name, +// int xDis, +// int yDis, +// int xSize, +// int ySize // +// ) +// { +// // +// // Object creation and property settings +// bool result = false; + +// // +// result = ObjectCreate(0, name, OBJ_BUTTON, 0, 0, 0); +// if (!result) +// { +// return result; +// } + +// // +// ObjectSetInteger(0, name, OBJPROP_XDISTANCE, xDis); +// ObjectSetInteger(0, name, OBJPROP_YDISTANCE, yDis); +// ObjectSetInteger(0, name, OBJPROP_XSIZE, xSize); +// ObjectSetInteger(0, name, OBJPROP_YSIZE, ySize); + +// // +// mName = name; + +// // +// return result; +// } + +// /** +// * Destroy Class Instance ... +// */ +// void Destroy() +// { +// ObjectDelete(0, mName); +// } + +// // +// // Getter(s) / Setter(s) ... + +// /** +// * Set Object Border Color ... +// * +// * @param value: color +// */ +// void SetBorderColor(color value) +// { +// ObjectSetInteger(0, mName, OBJPROP_BORDER_COLOR, value); +// } + +// /** +// * Set Object Background Color ... +// * +// * @param value: color +// */ +// void SetBGColor(color value) +// { +// ObjectSetInteger(0, mName, OBJPROP_BGCOLOR, value); +// } + +// /** +// * Set Object Text ... +// * +// * @param value: text +// */ +// void SetText(string value) +// { +// ObjectSetString(0, mName, OBJPROP_TEXT, value); +// } + +// // +// // Protected ... +// protected: +// // +// // Private ... +// private: +// // +// // Props ... + +// // +// string mName; // Name of Object + +// // +// // Mouse state tracking variables ... +// int mlbDownX; +// int mlbDownY; +// int mlbDownXDistance; +// int mlbDownYDistance; +// int mPreviousMouseState; + +// // +// bool mMovingState; // State for whether the object is moving + +// // +// string mAddedNames[]; // Array of added names +// long mAddedXDisDiffrence[]; // Arrays to store added distance differences +// long mAddedYDisDiffrence[]; // Arrays to store added distance differences +// }; diff --git a/Documents/BKP/XObjects/x-saherelm.x-label.class.mq5 b/Documents/BKP/XObjects/x-saherelm.x-label.class.mq5 new file mode 100644 index 00000000..cad4e192 --- /dev/null +++ b/Documents/BKP/XObjects/x-saherelm.x-label.class.mq5 @@ -0,0 +1,176 @@ +// /////////////////////////////////////////////////////// +// // +// // SaherElm IT Center MQL5 Class Library +// // -------------------------------------- +// // Name: XCLabel +// // 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 + +// // +// #include "../x-saherelm.base.class.mq5" + +// // +// // Definitions ... + +// // +// // Implementation ... + +// // +// // a Label Creation Class ... +// class XCLabel : XSCBase +// { +// // +// // Public ... +// public: +// // +// // Constructor(s) ... +// void XCLabel() +// { +// } + +// // +// // Deconstructor ... +// void ~XCLabel() +// { +// } + +// // +// // Actions ... + +// /** +// * Create an Instance of Class Object ... +// * +// * @param name: Object Name +// * @param xDis: X Distance +// * @param yDis: Y Distance +// */ +// bool Create( +// string name, +// int xDis, +// int yDis // +// ) +// { +// // +// // Object creation and property settings +// bool result = false; + +// // +// result = ObjectCreate(0, name, OBJ_LABEL, 0, 0, 0); +// if (!result) +// { +// return result; +// } + +// // +// ObjectSetInteger(0, name, OBJPROP_XDISTANCE, xDis); +// ObjectSetInteger(0, name, OBJPROP_YDISTANCE, yDis); + +// // +// mName = name; + +// // +// return result; +// } + +// /** +// * Destroy Class Instance ... +// */ +// void Destroy() +// { +// ObjectDelete(0, mName); +// } + +// // +// // Getter(s) / Setter(s) ... + +// /** +// * Set Text Color ... +// * +// * @param value: color +// */ +// void SetTextColor(color value) +// { +// ObjectSetInteger(0, mName, OBJPROP_COLOR, value); +// } + +// /** +// * Set Text of Object ... +// * +// * @param value: text +// */ +// void SetText(string value) +// { +// ObjectSetString(0, mName, OBJPROP_TEXT, value); +// } + +// /** +// * Get Text Of Object ... +// * +// * @return ( string ) +// */ +// string GetText() +// { +// return ObjectGetString(0, mName, OBJPROP_TEXT); +// } + +// /** +// * Set Font Size of Object ... +// * +// * @param value: size +// */ +// void SetFontSize(int value) +// { +// ObjectSetInteger(0, mName, OBJPROP_FONTSIZE, value); +// } + +// /** +// * Set Font Name Of Object ... +// * +// * @param value: font name +// */ +// void SetFont(string value) +// { +// ObjectSetString(0, mName, OBJPROP_FONT, value); +// } + +// // +// // Protected ... +// protected: +// // +// // Private ... +// private: +// // +// // Props ... + +// // +// string mName; // Name of Object + +// // +// // Mouse state tracking variables ... +// int mlbDownX; +// int mlbDownY; +// int mlbDownXDistance; +// int mlbDownYDistance; +// int mPreviousMouseState; + +// // +// bool mMovingState; // State for whether the object is moving + +// // +// string mAddedNames[]; // Array of added names +// long mAddedXDisDiffrence[]; // Arrays to store added distance differences +// long mAddedYDisDiffrence[]; // Arrays to store added distance differences +// }; diff --git a/Documents/BKP/XObjects/x-saherelm.x-rectangle.label.class.mq5 b/Documents/BKP/XObjects/x-saherelm.x-rectangle.label.class.mq5 new file mode 100644 index 00000000..8d29be05 --- /dev/null +++ b/Documents/BKP/XObjects/x-saherelm.x-rectangle.label.class.mq5 @@ -0,0 +1,268 @@ +// /////////////////////////////////////////////////////// +// // +// // SaherElm IT Center MQL5 Class Library +// // -------------------------------------- +// // Name: XCRectangleLabel +// // 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 + +// // +// #include "../x-saherelm.base.class.mq5" + +// // +// // Definitions ... + +// // +// // Implementation ... + +// // +// // a Rectangle Label Creation Class ... +// class XCRectangleLabel : XSCBase +// { +// // +// // Public ... +// public: +// // +// // Constructor(s) ... +// void XCRectangleLabel() +// { +// } + +// // +// // Deconstructor ... +// void ~XCRectangleLabel() +// { +// } + +// // +// // Getter(s) / Setter(s) ... + +// // +// // Handlers ... + +// /** +// * Event Handling for Mouse Movement ... +// * @param id: Event ID +// * @param lparam: Event parameter of long type +// * @param dparam: Event parameter of double type +// * @param sparam: Event parameter of string type +// */ +// void OnEvent( +// int id, +// long lparam, +// double dparam, +// string sparam // +// ) +// { +// // +// // Handle mouse movement events for dragging the rectangle label +// if (id == CHARTEVENT_MOUSE_MOVE) +// { +// // +// int X = (int)lparam; +// int Y = (int)dparam; +// int MouseState = (int)sparam; + +// // +// string name = mName; +// int XSize = (int)ObjectGetInteger(0, name, OBJPROP_XSIZE); +// int YSize = (int)ObjectGetInteger(0, name, OBJPROP_YSIZE); +// int XDistance = (int)ObjectGetInteger(0, name, OBJPROP_XDISTANCE); +// int YDistance = (int)ObjectGetInteger(0, name, OBJPROP_YDISTANCE); + +// // +// if (MouseState == 1 && +// mPreviousMouseState == 0) +// { +// // +// mlbDownX = X; +// mlbDownY = Y; +// mlbDownXDistance = XDistance; +// mlbDownYDistance = YDistance; + +// // +// if (X >= XDistance && +// Y >= YDistance && +// X <= XDistance + XSize && +// Y <= YDistance + YSize) +// { +// mMovingState = true; +// } +// } + +// // +// if (mMovingState) +// { +// // +// ChartSetInteger(0, CHART_MOUSE_SCROLL, false); +// ObjectSetInteger(0, name, OBJPROP_XDISTANCE, mlbDownXDistance + X - mlbDownX); +// ObjectSetInteger(0, name, OBJPROP_YDISTANCE, mlbDownYDistance + Y - mlbDownY); + +// // +// for (int i = 0; i < ArraySize(mAddedNames); i++) +// { +// // +// ObjectSetInteger(0, mAddedNames[i], OBJPROP_XDISTANCE, mlbDownXDistance + X - mlbDownX - mAddedXDisDiffrence[i]); +// ObjectSetInteger(0, mAddedNames[i], OBJPROP_YDISTANCE, mlbDownYDistance + Y - mlbDownY - mAddedYDisDiffrence[i]); +// } + +// // +// ChartRedraw(0); +// } + +// // +// if (MouseState == 0) +// { +// // +// mMovingState = false; +// ChartSetInteger(0, CHART_MOUSE_SCROLL, true); +// } + +// // +// mPreviousMouseState = MouseState; +// } +// } + +// // +// // Actions ... + +// /** +// * Create an Instance of Class Object ... +// * +// * @param name: Object Name +// * @param xDis: X Distance +// * @param yDis: Y Distance +// * @param xSize: X Size +// * @param ySize: Y Size +// */ +// bool Create( +// string name, +// int xDis, +// int yDis, +// int xSize, +// int ySize // +// ) +// { +// // +// // Object creation and property settings +// bool result = false; + +// // +// result = ObjectCreate(0, name, OBJ_RECTANGLE_LABEL, 0, 0, 0); +// if (!result) +// { +// return result; +// } + +// // +// ObjectSetInteger(0, name, OBJPROP_XDISTANCE, xDis); +// ObjectSetInteger(0, name, OBJPROP_YDISTANCE, yDis); +// ObjectSetInteger(0, name, OBJPROP_XSIZE, xSize); +// ObjectSetInteger(0, name, OBJPROP_YSIZE, ySize); + +// // +// mName = name; + +// // +// return result; +// } + +// /** +// * Destroy Class Instance ... +// */ +// void Destroy() +// { +// ObjectDelete(0, mName); +// } + +// /** +// * Set Object Border Type ... +// * +// * @param borderType: Specified border type +// */ +// void SetBorderType(ENUM_BORDER_TYPE borderType) +// { +// // +// ObjectSetInteger( +// 0, +// mName, +// OBJPROP_BORDER_TYPE, +// borderType // +// ); +// } + +// /** +// * Set Object Background Color +// * +// * @param value: color +// */ +// void SetBGColor(color value) +// { +// // +// ObjectSetInteger( +// 0, +// mName, +// OBJPROP_BGCOLOR, +// value // +// ); +// } + +// /** +// * Add a Name to Object +// * @param name: name +// */ +// void Add(string name) +// { +// // +// // Add a new object by name to the rectangle label and track distances +// ArrayResize(mAddedNames, ArraySize(mAddedNames) + 1); +// ArrayResize(mAddedXDisDiffrence, ArraySize(mAddedXDisDiffrence) + 1); +// ArrayResize(mAddedYDisDiffrence, ArraySize(mAddedYDisDiffrence) + 1); + +// // +// mAddedNames[ArraySize(mAddedNames) - 1] = name; +// mAddedXDisDiffrence[ArraySize(mAddedXDisDiffrence) - 1] = ObjectGetInteger(0, mName, OBJPROP_XDISTANCE) - ObjectGetInteger(0, name, OBJPROP_XDISTANCE); +// mAddedYDisDiffrence[ArraySize(mAddedYDisDiffrence) - 1] = ObjectGetInteger(0, mName, OBJPROP_YDISTANCE) - ObjectGetInteger(0, name, OBJPROP_YDISTANCE); +// } + +// // +// // Protected ... +// protected: +// // +// // Private ... +// private: +// // +// // Props ... + +// // +// string mName; // Name of Object + +// // +// // Mouse state tracking variables ... +// int mlbDownX; +// int mlbDownY; +// int mlbDownXDistance; +// int mlbDownYDistance; +// int mPreviousMouseState; + +// // +// bool mMovingState; // State for whether the object is moving + +// // +// string mAddedNames[]; // Array of added names +// long mAddedXDisDiffrence[]; // Arrays to store added distance differences +// long mAddedYDisDiffrence[]; // Arrays to store added distance differences +// }; diff --git a/Experts/x-saherelm.x121.ea.mq5 b/Experts/x-saherelm.x121.ea.mq5 index a6e99bc2..55b25ff2 100644 --- a/Experts/x-saherelm.x121.ea.mq5 +++ b/Experts/x-saherelm.x121.ea.mq5 @@ -195,6 +195,7 @@ string mTag = ""; // double eaR2R = 1.5; +datetime lastSignalOn = NULL; bool eaUseFixedTPSLPoints = true; // @@ -1002,6 +1003,20 @@ void OnSignalRecieved( ) : conditionsSummary; + // + // Check Signal Delay ... + datetime currentTime = TimeCurrent(); + int delay = eaDelayBarBetweenTwoSameSignal; + bool isDelayPassed = delay <= 0 + ? true + : !IsValid(lastSignalOn) + ? true + : MathAbs(TimeToSeconds(currentTime)) - MathAbs(TimeToSeconds(lastSignalOn)) >= ulong(delay * PeriodSeconds(_Period)); + if (!isDelayPassed) + { + return; + } + // // Execute Signal Using Trade Handler ... ENUM_X_SIGNAL_EXECUTION_RESULT state; @@ -1009,6 +1024,12 @@ void OnSignalRecieved( signal, state // ); + + // + if (isExecuted) + { + lastSignalOn = currentTime; + } } //