From 19da857809f60aab437cf531f76ab0659e479d0d Mon Sep 17 00:00:00 2001 From: kenorb Date: Fri, 19 Apr 2024 14:30:21 +0000 Subject: [PATCH 01/14] Adds initial .vscode/settings.json --- .vscode/settings.json | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .vscode/settings.json diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 000000000..6e4042bdf --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,5 @@ +{ + "files.associations": { + "indicatorcandle.h": "c" + } +} \ No newline at end of file From b6769829098538e05623696fb4d4fd564150d5d2 Mon Sep 17 00:00:00 2001 From: kenorb Date: Fri, 19 Apr 2024 14:30:29 +0000 Subject: [PATCH 02/14] Adds DavidAnson.vscode-markdownlint extension to devcontainer --- .devcontainer/devcontainer.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 7389048a9..9eeed2795 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -7,7 +7,8 @@ "extensions": [ "L-I-V.mql-tools", "ms-vscode.cpptools", - "vscodevim.vim" + "vscodevim.vim", + "DavidAnson.vscode-markdownlint" ], } }, From f55eb8745f2d4bdb6fc84ed8bce7515808d7ad65 Mon Sep 17 00:00:00 2001 From: kenorb Date: Fri, 19 Apr 2024 14:32:25 +0000 Subject: [PATCH 03/14] Adds wine to devcontainer --- .devcontainer/devcontainer.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 9eeed2795..7498b4a1a 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -19,7 +19,8 @@ "ghcr.io/guiyomh/features/vim:0": {}, "ghcr.io/jungaretti/features/make:1": {}, "ghcr.io/prulloac/devcontainer-features/pre-commit:1": {}, - "ghcr.io/hspaans/devcontainer-features/ansible-lint:1": {} + "ghcr.io/hspaans/devcontainer-features/ansible-lint:1": {}, + "ghcr.io/maks1ms/devcontainers-features/wine:0": {} }, // Or use a Dockerfile or Docker Compose file. More info: https://containers.dev/guide/dockerfile "image": "mcr.microsoft.com/devcontainers/base:jammy", From 111e4eecd9a26f7c7f70c44d4de8345181d0d7b2 Mon Sep 17 00:00:00 2001 From: "Rafal W." Date: Fri, 19 Apr 2024 14:40:30 +0000 Subject: [PATCH 04/14] devcontainer: Adds node --- .devcontainer/devcontainer.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 7498b4a1a..ed46af684 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -20,7 +20,8 @@ "ghcr.io/jungaretti/features/make:1": {}, "ghcr.io/prulloac/devcontainer-features/pre-commit:1": {}, "ghcr.io/hspaans/devcontainer-features/ansible-lint:1": {}, - "ghcr.io/maks1ms/devcontainers-features/wine:0": {} + "ghcr.io/maks1ms/devcontainers-features/wine:0": {}, + "ghcr.io/devcontainers-contrib/features/node-asdf:0": {} }, // Or use a Dockerfile or Docker Compose file. More info: https://containers.dev/guide/dockerfile "image": "mcr.microsoft.com/devcontainers/base:jammy", From 0873c086ce2b8a7518fba877181699fa7f62bf94 Mon Sep 17 00:00:00 2001 From: "Rafal W." Date: Fri, 19 Apr 2024 14:40:54 +0000 Subject: [PATCH 05/14] Disables wine package Refs: https://github.com/Maks1mS/devcontainers-features/issues/5 --- .devcontainer/devcontainer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index ed46af684..0796ac114 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -20,7 +20,7 @@ "ghcr.io/jungaretti/features/make:1": {}, "ghcr.io/prulloac/devcontainer-features/pre-commit:1": {}, "ghcr.io/hspaans/devcontainer-features/ansible-lint:1": {}, - "ghcr.io/maks1ms/devcontainers-features/wine:0": {}, + // "ghcr.io/maks1ms/devcontainers-features/wine:0": {}, "ghcr.io/devcontainers-contrib/features/node-asdf:0": {} }, // Or use a Dockerfile or Docker Compose file. More info: https://containers.dev/guide/dockerfile From ca96c21dc4dfe1d9412118f124af838f57db2ac1 Mon Sep 17 00:00:00 2001 From: kenorb Date: Fri, 19 Apr 2024 14:56:34 +0000 Subject: [PATCH 06/14] Fixes new lines [end-of-file-fixer] --- .devcontainer/devcontainer.json | 2 +- .vscode/settings.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 0796ac114..ab7146929 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -26,4 +26,4 @@ // Or use a Dockerfile or Docker Compose file. More info: https://containers.dev/guide/dockerfile "image": "mcr.microsoft.com/devcontainers/base:jammy", "name": "EA31337" -} \ No newline at end of file +} diff --git a/.vscode/settings.json b/.vscode/settings.json index 6e4042bdf..9084cffd9 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -2,4 +2,4 @@ "files.associations": { "indicatorcandle.h": "c" } -} \ No newline at end of file +} From 4842049ac1d3a0930f302ad007529cd57ee219fd Mon Sep 17 00:00:00 2001 From: kenorb Date: Fri, 19 Apr 2024 15:36:53 +0000 Subject: [PATCH 07/14] Adds EA31337.vscode-mql-tools extension --- .devcontainer/devcontainer.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index ab7146929..44cb575cc 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -5,10 +5,10 @@ "customizations": { "vscode": { "extensions": [ - "L-I-V.mql-tools", "ms-vscode.cpptools", "vscodevim.vim", - "DavidAnson.vscode-markdownlint" + "DavidAnson.vscode-markdownlint", + "EA31337.vscode-mql-tools" ], } }, From 505c0fb116a85b6f818abca519b78c4060147cbd Mon Sep 17 00:00:00 2001 From: kenorb Date: Tue, 23 Apr 2024 22:00:04 +0100 Subject: [PATCH 08/14] GHA: Compile: Skips clean-up by default --- .github/workflows/compile.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/compile.yml b/.github/workflows/compile.yml index 754641b8d..6c99f4d95 100644 --- a/.github/workflows/compile.yml +++ b/.github/workflows/compile.yml @@ -17,12 +17,14 @@ jobs: uses: EA31337/EA-Tester/.github/workflows/platform-linux.yml@dev with: artifact_name: mt4 + skip_cleanup: true version: 4 mt5: name: Installs platform (5) uses: EA31337/EA-Tester/.github/workflows/platform-linux.yml@dev with: artifact_name: mt5 + skip_cleanup: true version: 5 compile: From cc5decc77e0fd1f294b531bea12759834f62c7ba Mon Sep 17 00:00:00 2001 From: Cedric Gava Date: Tue, 23 Apr 2024 21:40:37 +0200 Subject: [PATCH 09/14] CGA(Trade): proposal for macor based computation of SIGNAL BUY/SELL CLOSE/BUY composite signal --- Trade/tests/TradeEnumMacro.mq4 | 69 ++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 Trade/tests/TradeEnumMacro.mq4 diff --git a/Trade/tests/TradeEnumMacro.mq4 b/Trade/tests/TradeEnumMacro.mq4 new file mode 100644 index 000000000..71774e9c3 --- /dev/null +++ b/Trade/tests/TradeEnumMacro.mq4 @@ -0,0 +1,69 @@ +//+------------------------------------------------------------------+ +//| test_enum.mq4 | +//| Cedric Gava | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Cedric Gava" +#property link "https://www.mql5.com" +#property version "1.00" +#property strict + +#include +#include + + +// all the following macro return true if the main signal is activated AND the filter is not activated AND the time filter is not activated +#define TRADE_SIGNAL_IS_CLOSE_BUY(x) ((x & TRADE_SIGNAL_FLAG_CLOSE_BUY_MAIN) && !(x & (TRADE_SIGNAL_FLAG_CLOSE_BUY_FILTER | TRADE_SIGNAL_FLAG_CLOSE_TIME_FILTER))) +#define TRADE_SIGNAL_IS_CLOSE_SELL(x) ((x & TRADE_SIGNAL_FLAG_CLOSE_SELL_MAIN) && !(x & (TRADE_SIGNAL_FLAG_CLOSE_SELL_FILTER | TRADE_SIGNAL_FLAG_CLOSE_TIME_FILTER))) +#define TRADE_SIGNAL_IS_OPEN_BUY(x) ((x & TRADE_SIGNAL_FLAG_OPEN_BUY_MAIN) && !(x & (TRADE_SIGNAL_FLAG_OPEN_BUY_FILTER | TRADE_SIGNAL_FLAG_OPEN_TIME_FILTER))) +#define TRADE_SIGNAL_IS_OPEN_SELL(x) ((x & TRADE_SIGNAL_FLAG_OPEN_SELL_MAIN) && !(x & (TRADE_SIGNAL_FLAG_OPEN_SELL_FILTER | TRADE_SIGNAL_FLAG_OPEN_TIME_FILTER))) + +int testEnum(){ + uint s; + + s = TRADE_SIGNAL_FLAG_CLOSE_BUY_MAIN | 0 | 0 ; assertTrueOrFail(TRADE_SIGNAL_IS_CLOSE_BUY(s)==true ,"Fail!"); + s = TRADE_SIGNAL_FLAG_CLOSE_BUY_MAIN | TRADE_SIGNAL_FLAG_CLOSE_BUY_FILTER | 0 ; assertTrueOrFail(TRADE_SIGNAL_IS_CLOSE_BUY(s)==false,"Fail!"); + s = TRADE_SIGNAL_FLAG_CLOSE_BUY_MAIN | 0 | TRADE_SIGNAL_FLAG_CLOSE_TIME_FILTER ; assertTrueOrFail(TRADE_SIGNAL_IS_CLOSE_BUY(s)==false,"Fail!"); + s = TRADE_SIGNAL_FLAG_CLOSE_BUY_MAIN | TRADE_SIGNAL_FLAG_CLOSE_BUY_FILTER | TRADE_SIGNAL_FLAG_CLOSE_TIME_FILTER ; assertTrueOrFail(TRADE_SIGNAL_IS_CLOSE_BUY(s)==false,"Fail!"); + s = 0 | 0 | 0 ; assertTrueOrFail(TRADE_SIGNAL_IS_CLOSE_BUY(s)==false,"Fail!"); + s = 0 | TRADE_SIGNAL_FLAG_CLOSE_BUY_FILTER | 0 ; assertTrueOrFail(TRADE_SIGNAL_IS_CLOSE_BUY(s)==false,"Fail!"); + s = 0 | 0 | TRADE_SIGNAL_FLAG_CLOSE_TIME_FILTER ; assertTrueOrFail(TRADE_SIGNAL_IS_CLOSE_BUY(s)==false,"Fail!"); + s = 0 | TRADE_SIGNAL_FLAG_CLOSE_BUY_FILTER | TRADE_SIGNAL_FLAG_CLOSE_TIME_FILTER ; assertTrueOrFail(TRADE_SIGNAL_IS_CLOSE_BUY(s)==false,"Fail!"); + + s = TRADE_SIGNAL_FLAG_CLOSE_SELL_MAIN| 0 | 0 ; assertTrueOrFail(TRADE_SIGNAL_IS_CLOSE_SELL(s)==true ,"Fail!"); + s = TRADE_SIGNAL_FLAG_CLOSE_SELL_MAIN| TRADE_SIGNAL_FLAG_CLOSE_SELL_FILTER| 0 ; assertTrueOrFail(TRADE_SIGNAL_IS_CLOSE_SELL(s)==false,"Fail!"); + s = TRADE_SIGNAL_FLAG_CLOSE_SELL_MAIN| 0 | TRADE_SIGNAL_FLAG_CLOSE_TIME_FILTER ; assertTrueOrFail(TRADE_SIGNAL_IS_CLOSE_SELL(s)==false,"Fail!"); + s = TRADE_SIGNAL_FLAG_CLOSE_SELL_MAIN| TRADE_SIGNAL_FLAG_CLOSE_SELL_FILTER| TRADE_SIGNAL_FLAG_CLOSE_TIME_FILTER ; assertTrueOrFail(TRADE_SIGNAL_IS_CLOSE_SELL(s)==false,"Fail!"); + s = 0 | 0 | 0 ; assertTrueOrFail(TRADE_SIGNAL_IS_CLOSE_SELL(s)==false,"Fail!"); + s = 0 | TRADE_SIGNAL_FLAG_CLOSE_SELL_FILTER| 0 ; assertTrueOrFail(TRADE_SIGNAL_IS_CLOSE_SELL(s)==false,"Fail!"); + s = 0 | 0 | TRADE_SIGNAL_FLAG_CLOSE_TIME_FILTER ; assertTrueOrFail(TRADE_SIGNAL_IS_CLOSE_SELL(s)==false,"Fail!"); + s = 0 | TRADE_SIGNAL_FLAG_CLOSE_SELL_FILTER| TRADE_SIGNAL_FLAG_CLOSE_TIME_FILTER ; assertTrueOrFail(TRADE_SIGNAL_IS_CLOSE_SELL(s)==false,"Fail!"); + + + s = TRADE_SIGNAL_FLAG_OPEN_BUY_MAIN | 0 | 0 ; assertTrueOrFail(TRADE_SIGNAL_IS_OPEN_BUY(s)==true ,"Fail!"); + s = TRADE_SIGNAL_FLAG_OPEN_BUY_MAIN | TRADE_SIGNAL_FLAG_OPEN_BUY_FILTER | 0 ; assertTrueOrFail(TRADE_SIGNAL_IS_OPEN_BUY(s)==false,"Fail!"); + s = TRADE_SIGNAL_FLAG_OPEN_BUY_MAIN | 0 | TRADE_SIGNAL_FLAG_OPEN_TIME_FILTER ; assertTrueOrFail(TRADE_SIGNAL_IS_OPEN_BUY(s)==false,"Fail!"); + s = TRADE_SIGNAL_FLAG_OPEN_BUY_MAIN | TRADE_SIGNAL_FLAG_OPEN_BUY_FILTER | TRADE_SIGNAL_FLAG_OPEN_TIME_FILTER ; assertTrueOrFail(TRADE_SIGNAL_IS_OPEN_BUY(s)==false,"Fail!"); + s = 0 | 0 | 0 ; assertTrueOrFail(TRADE_SIGNAL_IS_OPEN_BUY(s)==false,"Fail!"); + s = 0 | TRADE_SIGNAL_FLAG_OPEN_BUY_FILTER | 0 ; assertTrueOrFail(TRADE_SIGNAL_IS_OPEN_BUY(s)==false,"Fail!"); + s = 0 | 0 | TRADE_SIGNAL_FLAG_OPEN_TIME_FILTER ; assertTrueOrFail(TRADE_SIGNAL_IS_OPEN_BUY(s)==false,"Fail!"); + s = 0 | TRADE_SIGNAL_FLAG_OPEN_BUY_FILTER | TRADE_SIGNAL_FLAG_OPEN_TIME_FILTER ; assertTrueOrFail(TRADE_SIGNAL_IS_OPEN_BUY(s)==false,"Fail!"); + + s = TRADE_SIGNAL_FLAG_OPEN_SELL_MAIN | 0 | 0 ; assertTrueOrFail(TRADE_SIGNAL_IS_OPEN_SELL(s)==true ,"Fail!"); + s = TRADE_SIGNAL_FLAG_OPEN_SELL_MAIN | TRADE_SIGNAL_FLAG_OPEN_SELL_FILTER | 0 ; assertTrueOrFail(TRADE_SIGNAL_IS_OPEN_SELL(s)==false,"Fail!"); + s = TRADE_SIGNAL_FLAG_OPEN_SELL_MAIN | 0 | TRADE_SIGNAL_FLAG_OPEN_TIME_FILTER ; assertTrueOrFail(TRADE_SIGNAL_IS_OPEN_SELL(s)==false,"Fail!"); + s = TRADE_SIGNAL_FLAG_OPEN_SELL_MAIN | TRADE_SIGNAL_FLAG_OPEN_SELL_FILTER | TRADE_SIGNAL_FLAG_OPEN_TIME_FILTER ; assertTrueOrFail(TRADE_SIGNAL_IS_OPEN_SELL(s)==false,"Fail!"); + s = 0 | 0 | 0 ; assertTrueOrFail(TRADE_SIGNAL_IS_OPEN_SELL(s)==false,"Fail!"); + s = 0 | TRADE_SIGNAL_FLAG_OPEN_SELL_FILTER | 0 ; assertTrueOrFail(TRADE_SIGNAL_IS_OPEN_SELL(s)==false,"Fail!"); + s = 0 | 0 | TRADE_SIGNAL_FLAG_OPEN_TIME_FILTER ; assertTrueOrFail(TRADE_SIGNAL_IS_OPEN_SELL(s)==false,"Fail!"); + s = 0 | TRADE_SIGNAL_FLAG_OPEN_SELL_FILTER | TRADE_SIGNAL_FLAG_OPEN_TIME_FILTER ; assertTrueOrFail(TRADE_SIGNAL_IS_OPEN_SELL(s)==false,"Fail!"); + return INIT_SUCCEEDED; +} + +void OnStart(){ + if (testEnum()==INIT_SUCCEEDED){ + Print("Test passed!"); + } else { + Print("Test failed!"); + } +} From bce372b52c34272cf9f0d6f7ca393cc28d2cf2fd Mon Sep 17 00:00:00 2001 From: kenorb Date: Tue, 23 Apr 2024 22:12:15 +0100 Subject: [PATCH 10/14] Renames TradeEnumMacro.mq4 to TradeSignalEnumMacro.test.mq5 --- Trade/tests/{TradeEnumMacro.mq4 => TradeSignalEnumMacro.test.mq5} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename Trade/tests/{TradeEnumMacro.mq4 => TradeSignalEnumMacro.test.mq5} (100%) diff --git a/Trade/tests/TradeEnumMacro.mq4 b/Trade/tests/TradeSignalEnumMacro.test.mq5 similarity index 100% rename from Trade/tests/TradeEnumMacro.mq4 rename to Trade/tests/TradeSignalEnumMacro.test.mq5 From d5fad4c0b2cf21ee9e43da611eac9d59e5f0c795 Mon Sep 17 00:00:00 2001 From: kenorb Date: Tue, 23 Apr 2024 22:14:05 +0100 Subject: [PATCH 11/14] Adds a wrapper file for TradeSignalEnumMacro --- Trade/tests/TradeSignalEnumMacro.test.mq4 | 28 +++++++++++++++++++++++ Trade/tests/TradeSignalEnumMacro.test.mq5 | 25 ++++++++++++++------ 2 files changed, 46 insertions(+), 7 deletions(-) create mode 100644 Trade/tests/TradeSignalEnumMacro.test.mq4 diff --git a/Trade/tests/TradeSignalEnumMacro.test.mq4 b/Trade/tests/TradeSignalEnumMacro.test.mq4 new file mode 100644 index 000000000..2dc519fb9 --- /dev/null +++ b/Trade/tests/TradeSignalEnumMacro.test.mq4 @@ -0,0 +1,28 @@ +//+------------------------------------------------------------------+ +//| EA31337 framework | +//| Copyright 2016-2021, EA31337 Ltd | +//| https://github.com/EA31337 | +//+------------------------------------------------------------------+ + +/* + * This file is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +/** + * @file + * Test functionality of TradeSignal class. + */ + +// Includes. +#include "TradeSignalEnumMacro.test.mq5" diff --git a/Trade/tests/TradeSignalEnumMacro.test.mq5 b/Trade/tests/TradeSignalEnumMacro.test.mq5 index 71774e9c3..2153d026d 100644 --- a/Trade/tests/TradeSignalEnumMacro.test.mq5 +++ b/Trade/tests/TradeSignalEnumMacro.test.mq5 @@ -1,12 +1,23 @@ //+------------------------------------------------------------------+ -//| test_enum.mq4 | -//| Cedric Gava | -//| https://www.mql5.com | +//| EA31337 framework | +//| Copyright 2016-2021, EA31337 Ltd | +//| https://github.com/EA31337 | //+------------------------------------------------------------------+ -#property copyright "Cedric Gava" -#property link "https://www.mql5.com" -#property version "1.00" -#property strict + +/* + * This file is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #include #include From 8ff1b3aac3f6dc7290c0316d3c91f9087b209e25 Mon Sep 17 00:00:00 2001 From: kenorb Date: Tue, 23 Apr 2024 22:15:55 +0100 Subject: [PATCH 12/14] Moves enum macros into the main file and fixes compilation errors --- Trade/TradeSignal.struct.h | 7 ++ Trade/tests/TradeSignalEnumMacro.test.mq5 | 86 ++++++++++------------- 2 files changed, 46 insertions(+), 47 deletions(-) diff --git a/Trade/TradeSignal.struct.h b/Trade/TradeSignal.struct.h index 77918c1fd..17854cd58 100644 --- a/Trade/TradeSignal.struct.h +++ b/Trade/TradeSignal.struct.h @@ -50,6 +50,13 @@ #define SIGNAL_OPEN_TIME_FILTER STRUCT_ENUM(TradeSignalEntry, TRADE_SIGNAL_FLAG_OPEN_TIME_FILTER) #define SIGNAL_OPEN_UPWARDS STRUCT_ENUM(TradeSignalEntry, TRADE_SIGNAL_FLAG_OPEN_UPWARDS) +// All the following macro return true if the main signal is activated +// AND the filter is not activated AND the time filter is not activated. +#define TRADE_SIGNAL_IS_CLOSE_BUY(x) (((x & SIGNAL_CLOSE_BUY_MAIN) != 0) && !(x & (SIGNAL_CLOSE_BUY_FILTER | SIGNAL_CLOSE_TIME_FILTER))) +#define TRADE_SIGNAL_IS_CLOSE_SELL(x) (((x & SIGNAL_CLOSE_SELL_MAIN) != 0) && !(x & (SIGNAL_CLOSE_SELL_FILTER | SIGNAL_CLOSE_TIME_FILTER))) +#define TRADE_SIGNAL_IS_OPEN_BUY(x) (((x & SIGNAL_OPEN_BUY_MAIN) != 0) && !(x & (SIGNAL_OPEN_BUY_FILTER | SIGNAL_OPEN_TIME_FILTER))) +#define TRADE_SIGNAL_IS_OPEN_SELL(x) (((x & SIGNAL_OPEN_SELL_MAIN) != 0) && !(x & (SIGNAL_OPEN_SELL_FILTER | SIGNAL_OPEN_TIME_FILTER))) + // Structure for a trade signal. struct TradeSignalEntry { protected: diff --git a/Trade/tests/TradeSignalEnumMacro.test.mq5 b/Trade/tests/TradeSignalEnumMacro.test.mq5 index 2153d026d..f198433b0 100644 --- a/Trade/tests/TradeSignalEnumMacro.test.mq5 +++ b/Trade/tests/TradeSignalEnumMacro.test.mq5 @@ -22,59 +22,51 @@ #include #include - -// all the following macro return true if the main signal is activated AND the filter is not activated AND the time filter is not activated -#define TRADE_SIGNAL_IS_CLOSE_BUY(x) ((x & TRADE_SIGNAL_FLAG_CLOSE_BUY_MAIN) && !(x & (TRADE_SIGNAL_FLAG_CLOSE_BUY_FILTER | TRADE_SIGNAL_FLAG_CLOSE_TIME_FILTER))) -#define TRADE_SIGNAL_IS_CLOSE_SELL(x) ((x & TRADE_SIGNAL_FLAG_CLOSE_SELL_MAIN) && !(x & (TRADE_SIGNAL_FLAG_CLOSE_SELL_FILTER | TRADE_SIGNAL_FLAG_CLOSE_TIME_FILTER))) -#define TRADE_SIGNAL_IS_OPEN_BUY(x) ((x & TRADE_SIGNAL_FLAG_OPEN_BUY_MAIN) && !(x & (TRADE_SIGNAL_FLAG_OPEN_BUY_FILTER | TRADE_SIGNAL_FLAG_OPEN_TIME_FILTER))) -#define TRADE_SIGNAL_IS_OPEN_SELL(x) ((x & TRADE_SIGNAL_FLAG_OPEN_SELL_MAIN) && !(x & (TRADE_SIGNAL_FLAG_OPEN_SELL_FILTER | TRADE_SIGNAL_FLAG_OPEN_TIME_FILTER))) - int testEnum(){ uint s; - - s = TRADE_SIGNAL_FLAG_CLOSE_BUY_MAIN | 0 | 0 ; assertTrueOrFail(TRADE_SIGNAL_IS_CLOSE_BUY(s)==true ,"Fail!"); - s = TRADE_SIGNAL_FLAG_CLOSE_BUY_MAIN | TRADE_SIGNAL_FLAG_CLOSE_BUY_FILTER | 0 ; assertTrueOrFail(TRADE_SIGNAL_IS_CLOSE_BUY(s)==false,"Fail!"); - s = TRADE_SIGNAL_FLAG_CLOSE_BUY_MAIN | 0 | TRADE_SIGNAL_FLAG_CLOSE_TIME_FILTER ; assertTrueOrFail(TRADE_SIGNAL_IS_CLOSE_BUY(s)==false,"Fail!"); - s = TRADE_SIGNAL_FLAG_CLOSE_BUY_MAIN | TRADE_SIGNAL_FLAG_CLOSE_BUY_FILTER | TRADE_SIGNAL_FLAG_CLOSE_TIME_FILTER ; assertTrueOrFail(TRADE_SIGNAL_IS_CLOSE_BUY(s)==false,"Fail!"); - s = 0 | 0 | 0 ; assertTrueOrFail(TRADE_SIGNAL_IS_CLOSE_BUY(s)==false,"Fail!"); - s = 0 | TRADE_SIGNAL_FLAG_CLOSE_BUY_FILTER | 0 ; assertTrueOrFail(TRADE_SIGNAL_IS_CLOSE_BUY(s)==false,"Fail!"); - s = 0 | 0 | TRADE_SIGNAL_FLAG_CLOSE_TIME_FILTER ; assertTrueOrFail(TRADE_SIGNAL_IS_CLOSE_BUY(s)==false,"Fail!"); - s = 0 | TRADE_SIGNAL_FLAG_CLOSE_BUY_FILTER | TRADE_SIGNAL_FLAG_CLOSE_TIME_FILTER ; assertTrueOrFail(TRADE_SIGNAL_IS_CLOSE_BUY(s)==false,"Fail!"); - - s = TRADE_SIGNAL_FLAG_CLOSE_SELL_MAIN| 0 | 0 ; assertTrueOrFail(TRADE_SIGNAL_IS_CLOSE_SELL(s)==true ,"Fail!"); - s = TRADE_SIGNAL_FLAG_CLOSE_SELL_MAIN| TRADE_SIGNAL_FLAG_CLOSE_SELL_FILTER| 0 ; assertTrueOrFail(TRADE_SIGNAL_IS_CLOSE_SELL(s)==false,"Fail!"); - s = TRADE_SIGNAL_FLAG_CLOSE_SELL_MAIN| 0 | TRADE_SIGNAL_FLAG_CLOSE_TIME_FILTER ; assertTrueOrFail(TRADE_SIGNAL_IS_CLOSE_SELL(s)==false,"Fail!"); - s = TRADE_SIGNAL_FLAG_CLOSE_SELL_MAIN| TRADE_SIGNAL_FLAG_CLOSE_SELL_FILTER| TRADE_SIGNAL_FLAG_CLOSE_TIME_FILTER ; assertTrueOrFail(TRADE_SIGNAL_IS_CLOSE_SELL(s)==false,"Fail!"); - s = 0 | 0 | 0 ; assertTrueOrFail(TRADE_SIGNAL_IS_CLOSE_SELL(s)==false,"Fail!"); - s = 0 | TRADE_SIGNAL_FLAG_CLOSE_SELL_FILTER| 0 ; assertTrueOrFail(TRADE_SIGNAL_IS_CLOSE_SELL(s)==false,"Fail!"); - s = 0 | 0 | TRADE_SIGNAL_FLAG_CLOSE_TIME_FILTER ; assertTrueOrFail(TRADE_SIGNAL_IS_CLOSE_SELL(s)==false,"Fail!"); - s = 0 | TRADE_SIGNAL_FLAG_CLOSE_SELL_FILTER| TRADE_SIGNAL_FLAG_CLOSE_TIME_FILTER ; assertTrueOrFail(TRADE_SIGNAL_IS_CLOSE_SELL(s)==false,"Fail!"); + s = SIGNAL_CLOSE_BUY_MAIN | 0 | 0 ; assertTrueOrFail(TRADE_SIGNAL_IS_CLOSE_BUY(s)==true ,"Fail!"); + s = SIGNAL_CLOSE_BUY_MAIN | SIGNAL_CLOSE_BUY_FILTER | 0 ; assertTrueOrFail(TRADE_SIGNAL_IS_CLOSE_BUY(s)==false,"Fail!"); + s = SIGNAL_CLOSE_BUY_MAIN | 0 | SIGNAL_CLOSE_TIME_FILTER ; assertTrueOrFail(TRADE_SIGNAL_IS_CLOSE_BUY(s)==false,"Fail!"); + s = SIGNAL_CLOSE_BUY_MAIN | SIGNAL_CLOSE_BUY_FILTER | SIGNAL_CLOSE_TIME_FILTER ; assertTrueOrFail(TRADE_SIGNAL_IS_CLOSE_BUY(s)==false,"Fail!"); + s = 0 | 0 | 0 ; assertTrueOrFail(TRADE_SIGNAL_IS_CLOSE_BUY(s)==false,"Fail!"); + s = 0 | SIGNAL_CLOSE_BUY_FILTER | 0 ; assertTrueOrFail(TRADE_SIGNAL_IS_CLOSE_BUY(s)==false,"Fail!"); + s = 0 | 0 | SIGNAL_CLOSE_TIME_FILTER ; assertTrueOrFail(TRADE_SIGNAL_IS_CLOSE_BUY(s)==false,"Fail!"); + s = 0 | SIGNAL_CLOSE_BUY_FILTER | SIGNAL_CLOSE_TIME_FILTER ; assertTrueOrFail(TRADE_SIGNAL_IS_CLOSE_BUY(s)==false,"Fail!"); + + s = SIGNAL_CLOSE_SELL_MAIN | 0 | 0 ; assertTrueOrFail(TRADE_SIGNAL_IS_CLOSE_SELL(s)==true ,"Fail!"); + s = SIGNAL_CLOSE_SELL_MAIN | SIGNAL_CLOSE_SELL_FILTER| 0 ; assertTrueOrFail(TRADE_SIGNAL_IS_CLOSE_SELL(s)==false,"Fail!"); + s = SIGNAL_CLOSE_SELL_MAIN | 0 | SIGNAL_CLOSE_TIME_FILTER ; assertTrueOrFail(TRADE_SIGNAL_IS_CLOSE_SELL(s)==false,"Fail!"); + s = SIGNAL_CLOSE_SELL_MAIN | SIGNAL_CLOSE_SELL_FILTER | SIGNAL_CLOSE_TIME_FILTER ; assertTrueOrFail(TRADE_SIGNAL_IS_CLOSE_SELL(s)==false,"Fail!"); + s = 0 | 0 | 0 ; assertTrueOrFail(TRADE_SIGNAL_IS_CLOSE_SELL(s)==false,"Fail!"); + s = 0 | SIGNAL_CLOSE_SELL_FILTER| 0 ; assertTrueOrFail(TRADE_SIGNAL_IS_CLOSE_SELL(s)==false,"Fail!"); + s = 0 | 0 | SIGNAL_CLOSE_TIME_FILTER ; assertTrueOrFail(TRADE_SIGNAL_IS_CLOSE_SELL(s)==false,"Fail!"); + s = 0 | SIGNAL_CLOSE_SELL_FILTER | SIGNAL_CLOSE_TIME_FILTER ; assertTrueOrFail(TRADE_SIGNAL_IS_CLOSE_SELL(s)==false,"Fail!"); - s = TRADE_SIGNAL_FLAG_OPEN_BUY_MAIN | 0 | 0 ; assertTrueOrFail(TRADE_SIGNAL_IS_OPEN_BUY(s)==true ,"Fail!"); - s = TRADE_SIGNAL_FLAG_OPEN_BUY_MAIN | TRADE_SIGNAL_FLAG_OPEN_BUY_FILTER | 0 ; assertTrueOrFail(TRADE_SIGNAL_IS_OPEN_BUY(s)==false,"Fail!"); - s = TRADE_SIGNAL_FLAG_OPEN_BUY_MAIN | 0 | TRADE_SIGNAL_FLAG_OPEN_TIME_FILTER ; assertTrueOrFail(TRADE_SIGNAL_IS_OPEN_BUY(s)==false,"Fail!"); - s = TRADE_SIGNAL_FLAG_OPEN_BUY_MAIN | TRADE_SIGNAL_FLAG_OPEN_BUY_FILTER | TRADE_SIGNAL_FLAG_OPEN_TIME_FILTER ; assertTrueOrFail(TRADE_SIGNAL_IS_OPEN_BUY(s)==false,"Fail!"); - s = 0 | 0 | 0 ; assertTrueOrFail(TRADE_SIGNAL_IS_OPEN_BUY(s)==false,"Fail!"); - s = 0 | TRADE_SIGNAL_FLAG_OPEN_BUY_FILTER | 0 ; assertTrueOrFail(TRADE_SIGNAL_IS_OPEN_BUY(s)==false,"Fail!"); - s = 0 | 0 | TRADE_SIGNAL_FLAG_OPEN_TIME_FILTER ; assertTrueOrFail(TRADE_SIGNAL_IS_OPEN_BUY(s)==false,"Fail!"); - s = 0 | TRADE_SIGNAL_FLAG_OPEN_BUY_FILTER | TRADE_SIGNAL_FLAG_OPEN_TIME_FILTER ; assertTrueOrFail(TRADE_SIGNAL_IS_OPEN_BUY(s)==false,"Fail!"); - s = TRADE_SIGNAL_FLAG_OPEN_SELL_MAIN | 0 | 0 ; assertTrueOrFail(TRADE_SIGNAL_IS_OPEN_SELL(s)==true ,"Fail!"); - s = TRADE_SIGNAL_FLAG_OPEN_SELL_MAIN | TRADE_SIGNAL_FLAG_OPEN_SELL_FILTER | 0 ; assertTrueOrFail(TRADE_SIGNAL_IS_OPEN_SELL(s)==false,"Fail!"); - s = TRADE_SIGNAL_FLAG_OPEN_SELL_MAIN | 0 | TRADE_SIGNAL_FLAG_OPEN_TIME_FILTER ; assertTrueOrFail(TRADE_SIGNAL_IS_OPEN_SELL(s)==false,"Fail!"); - s = TRADE_SIGNAL_FLAG_OPEN_SELL_MAIN | TRADE_SIGNAL_FLAG_OPEN_SELL_FILTER | TRADE_SIGNAL_FLAG_OPEN_TIME_FILTER ; assertTrueOrFail(TRADE_SIGNAL_IS_OPEN_SELL(s)==false,"Fail!"); - s = 0 | 0 | 0 ; assertTrueOrFail(TRADE_SIGNAL_IS_OPEN_SELL(s)==false,"Fail!"); - s = 0 | TRADE_SIGNAL_FLAG_OPEN_SELL_FILTER | 0 ; assertTrueOrFail(TRADE_SIGNAL_IS_OPEN_SELL(s)==false,"Fail!"); - s = 0 | 0 | TRADE_SIGNAL_FLAG_OPEN_TIME_FILTER ; assertTrueOrFail(TRADE_SIGNAL_IS_OPEN_SELL(s)==false,"Fail!"); - s = 0 | TRADE_SIGNAL_FLAG_OPEN_SELL_FILTER | TRADE_SIGNAL_FLAG_OPEN_TIME_FILTER ; assertTrueOrFail(TRADE_SIGNAL_IS_OPEN_SELL(s)==false,"Fail!"); + s = SIGNAL_OPEN_BUY_MAIN | 0 | 0 ; assertTrueOrFail(TRADE_SIGNAL_IS_OPEN_BUY(s)==true ,"Fail!"); + s = SIGNAL_OPEN_BUY_MAIN | SIGNAL_OPEN_BUY_FILTER | 0 ; assertTrueOrFail(TRADE_SIGNAL_IS_OPEN_BUY(s)==false,"Fail!"); + s = SIGNAL_OPEN_BUY_MAIN | 0 | SIGNAL_OPEN_TIME_FILTER ; assertTrueOrFail(TRADE_SIGNAL_IS_OPEN_BUY(s)==false,"Fail!"); + s = SIGNAL_OPEN_BUY_MAIN | SIGNAL_OPEN_BUY_FILTER | SIGNAL_OPEN_TIME_FILTER ; assertTrueOrFail(TRADE_SIGNAL_IS_OPEN_BUY(s)==false,"Fail!"); + s = 0 | 0 | 0 ; assertTrueOrFail(TRADE_SIGNAL_IS_OPEN_BUY(s)==false,"Fail!"); + s = 0 | SIGNAL_OPEN_BUY_FILTER | 0 ; assertTrueOrFail(TRADE_SIGNAL_IS_OPEN_BUY(s)==false,"Fail!"); + s = 0 | 0 | SIGNAL_OPEN_TIME_FILTER ; assertTrueOrFail(TRADE_SIGNAL_IS_OPEN_BUY(s)==false,"Fail!"); + s = 0 | SIGNAL_OPEN_BUY_FILTER | SIGNAL_OPEN_TIME_FILTER ; assertTrueOrFail(TRADE_SIGNAL_IS_OPEN_BUY(s)==false,"Fail!"); + + s = SIGNAL_OPEN_SELL_MAIN | 0 | 0 ; assertTrueOrFail(TRADE_SIGNAL_IS_OPEN_SELL(s)==true ,"Fail!"); + s = SIGNAL_OPEN_SELL_MAIN | SIGNAL_OPEN_SELL_FILTER | 0 ; assertTrueOrFail(TRADE_SIGNAL_IS_OPEN_SELL(s)==false,"Fail!"); + s = SIGNAL_OPEN_SELL_MAIN | 0 | SIGNAL_OPEN_TIME_FILTER ; assertTrueOrFail(TRADE_SIGNAL_IS_OPEN_SELL(s)==false,"Fail!"); + s = SIGNAL_OPEN_SELL_MAIN | SIGNAL_OPEN_SELL_FILTER | SIGNAL_OPEN_TIME_FILTER ; assertTrueOrFail(TRADE_SIGNAL_IS_OPEN_SELL(s)==false,"Fail!"); + s = 0 | 0 | 0 ; assertTrueOrFail(TRADE_SIGNAL_IS_OPEN_SELL(s)==false,"Fail!"); + s = 0 | SIGNAL_OPEN_SELL_FILTER | 0 ; assertTrueOrFail(TRADE_SIGNAL_IS_OPEN_SELL(s)==false,"Fail!"); + s = 0 | 0 | SIGNAL_OPEN_TIME_FILTER ; assertTrueOrFail(TRADE_SIGNAL_IS_OPEN_SELL(s)==false,"Fail!"); + s = 0 | SIGNAL_OPEN_SELL_FILTER | SIGNAL_OPEN_TIME_FILTER ; assertTrueOrFail(TRADE_SIGNAL_IS_OPEN_SELL(s)==false,"Fail!"); return INIT_SUCCEEDED; } -void OnStart(){ - if (testEnum()==INIT_SUCCEEDED){ - Print("Test passed!"); - } else { - Print("Test failed!"); - } +/** + * Implements OnInit(). + */ +int OnInit() { + return testEnum(); } From 990d9eb9179b5e8d9a91bd3c547ba29124407eea Mon Sep 17 00:00:00 2001 From: kenorb Date: Tue, 23 Apr 2024 22:46:51 +0100 Subject: [PATCH 13/14] Trade: TradeSignalEnumMacro: Fixes includes to use local path --- Trade/tests/TradeSignalEnumMacro.test.mq5 | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Trade/tests/TradeSignalEnumMacro.test.mq5 b/Trade/tests/TradeSignalEnumMacro.test.mq5 index f198433b0..1e465488f 100644 --- a/Trade/tests/TradeSignalEnumMacro.test.mq5 +++ b/Trade/tests/TradeSignalEnumMacro.test.mq5 @@ -19,8 +19,9 @@ * along with this program. If not, see . */ -#include -#include +// Includes. +#include "../../Test.mqh" +#include "../TradeSignal.struct.h" int testEnum(){ uint s; @@ -62,7 +63,7 @@ int testEnum(){ s = 0 | 0 | SIGNAL_OPEN_TIME_FILTER ; assertTrueOrFail(TRADE_SIGNAL_IS_OPEN_SELL(s)==false,"Fail!"); s = 0 | SIGNAL_OPEN_SELL_FILTER | SIGNAL_OPEN_TIME_FILTER ; assertTrueOrFail(TRADE_SIGNAL_IS_OPEN_SELL(s)==false,"Fail!"); return INIT_SUCCEEDED; -} +} /** * Implements OnInit(). From d4d8f50f3ca99d9921eb000f7cfd2e0a1e9f09a8 Mon Sep 17 00:00:00 2001 From: kenorb Date: Tue, 23 Apr 2024 22:53:54 +0100 Subject: [PATCH 14/14] GHA: Compile: Support for workflow calls --- .github/workflows/compile.yml | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/.github/workflows/compile.yml b/.github/workflows/compile.yml index 6c99f4d95..15fb31abe 100644 --- a/.github/workflows/compile.yml +++ b/.github/workflows/compile.yml @@ -1,6 +1,9 @@ --- name: Compile +env: + ARTIFACT_PREFIX: ${{ inputs.artifact_prefix || 'mt' }} + # yamllint disable-line rule:truthy on: pull_request: @@ -9,6 +12,18 @@ on: push: paths-ignore: - '**.md' + workflow_call: + inputs: + artifact_prefix: + default: mt + description: Artifact prefix. + required: false + type: string + skip_cleanup: + default: false + description: Whether to skip a clean-up job. + required: false + type: boolean jobs: @@ -16,14 +31,16 @@ jobs: name: Installs platform (4) uses: EA31337/EA-Tester/.github/workflows/platform-linux.yml@dev with: - artifact_name: mt4 + artifact_name: ${{ inputs.artifact_prefix || 'mt' }}4 + artifact_overwrite: true skip_cleanup: true version: 4 mt5: name: Installs platform (5) uses: EA31337/EA-Tester/.github/workflows/platform-linux.yml@dev with: - artifact_name: mt5 + artifact_name: ${{ inputs.artifact_prefix || 'mt' }}5 + artifact_overwrite: true skip_cleanup: true version: 5 @@ -50,3 +67,13 @@ jobs: strategy: matrix: version: [4, 5] + + cleanup: + if: inputs.skip_cleanup != true + name: Clean-up + needs: [compile-indicators] + runs-on: ubuntu-latest + steps: + - uses: geekyeggo/delete-artifact@v5 + with: + name: ${{ env.ARTIFACT_PREFIX }}*