From 2804652f2098ad97468709bfac0b4e7e6a7473c9 Mon Sep 17 00:00:00 2001 From: Hadi Khazaee Asl Date: Wed, 1 May 2024 14:46:50 +0330 Subject: [PATCH] backup x121 setup ... --- MQLTestWorkspace/BKPS/BKP/sc.mq5 | 216 + .../Old/Classes/x-saherelm.http.class.ex5 | Bin 0 -> 5952 bytes .../Old/Classes/x-saherelm.http.class.mq5 | 385 ++ .../x-saherelm.x121.provider.class.ex5 | Bin 0 -> 11186 bytes .../x-saherelm.x121.provider.class.mq5 | 2939 +++++++++++ .../Old/Classes/x-saherelm.x121.xea.class.ex5 | Bin 0 -> 13024 bytes .../Old/Classes/x-saherelm.x121.xea.class.mq5 | 1631 ++++++ .../Old/Classes/x-saherelm.xaccount.class.ex5 | Bin 0 -> 6576 bytes .../Old/Classes/x-saherelm.xaccount.class.mq5 | 398 ++ .../X121/Old/Classes/x-saherelm.xea.class.ex5 | Bin 0 -> 10264 bytes .../X121/Old/Classes/x-saherelm.xea.class.mq5 | 1573 ++++++ .../Old/Classes/x-saherelm.xhelper.class.ex5 | Bin 0 -> 6178 bytes .../Old/Classes/x-saherelm.xhelper.class.mq5 | 209 + .../Classes/x-saherelm.xnotifier.class.ex5 | Bin 0 -> 6346 bytes .../Classes/x-saherelm.xprovider.class.ex5 | Bin 0 -> 7944 bytes .../Classes/x-saherelm.xprovider.class.mq5 | 304 ++ .../Old/Classes/x-saherelm.xtrade.class.ex5 | Bin 0 -> 6974 bytes .../Old/Classes/x-saherelm.xtrade.class.mq5 | 4193 +++++++++++++++ .../X121/Old/Experts/x-saherelm.xea.ex5 | Bin 0 -> 618858 bytes .../X121/Old/Experts/x-saherelm.xea.mq5 | 378 ++ .../x-saherelm.x121.xama.helper.class.ex5 | Bin 0 -> 6644 bytes .../x-saherelm.x121.xama.helper.class.mq5 | 446 ++ .../x-saherelm.x121.xcc.helper.class.ex5 | Bin 0 -> 6122 bytes .../x-saherelm.x121.xcc.helper.class.mq5 | 293 ++ .../x-saherelm.x121.xche.helper.class.ex5 | Bin 0 -> 6464 bytes .../x-saherelm.x121.xche.helper.class.mq5 | 612 +++ .../x-saherelm.x121.xct.helper.class.ex5 | Bin 0 -> 7230 bytes .../x-saherelm.x121.xct.helper.class.mq5 | 248 + .../x-saherelm.x121.xdema.helper.class.ex5 | Bin 0 -> 6566 bytes .../x-saherelm.x121.xdema.helper.class.mq5 | 470 ++ .../x-saherelm.x121.xfbb.helper.class.ex5 | Bin 0 -> 6314 bytes .../x-saherelm.x121.xfbb.helper.class.mq5 | 733 +++ .../x-saherelm.x121.xhk.helper.class.ex5 | Bin 0 -> 6322 bytes .../x-saherelm.x121.xhk.helper.class.mq5 | 441 ++ .../x-saherelm.x121.xhull.helper.class.ex5 | Bin 0 -> 6234 bytes .../x-saherelm.x121.xhull.helper.class.mq5 | 544 ++ .../x-saherelm.x121.xich.helper.class.ex5 | Bin 0 -> 5718 bytes .../x-saherelm.x121.xich.helper.class.mq5 | 1083 ++++ .../x-saherelm.x121.xman.helper.class.ex5 | Bin 0 -> 7366 bytes .../x-saherelm.x121.xman.helper.class.mq5 | 3062 +++++++++++ .../x-saherelm.x121.xmrb.helper.class.ex5 | Bin 0 -> 6270 bytes .../x-saherelm.x121.xmrb.helper.class.mq5 | 895 ++++ .../x-saherelm.x121.xosc.helper.class.ex5 | Bin 0 -> 6826 bytes .../x-saherelm.x121.xosc.helper.class.mq5 | 830 +++ .../x-saherelm.x121.xpv.helper.class.ex5 | Bin 0 -> 6484 bytes .../x-saherelm.x121.xpv.helper.class.mq5 | 946 ++++ .../x-saherelm.x121.xsslc.helper.class.ex5 | Bin 0 -> 6022 bytes .../x-saherelm.x121.xsslc.helper.class.mq5 | 481 ++ .../x-saherelm.x121.xstr.helper.class.ex5 | Bin 0 -> 6390 bytes .../x-saherelm.x121.xstr.helper.class.mq5 | 473 ++ .../x-saherelm.x121.xtm.helper.class.ex5 | Bin 0 -> 6604 bytes .../x-saherelm.x121.xtm.helper.class.mq5 | 445 ++ .../x-saherelm.x121.xtrnd.helper.class.ex5 | Bin 0 -> 6866 bytes .../x-saherelm.x121.xtrnd.helper.class.mq5 | 1235 +++++ .../Market/WH Fair Value Gap MT5.ex5 | Bin 0 -> 46642 bytes .../Old/Indicators/x-saherelm.x121.xama.ex5 | Bin 0 -> 10734 bytes .../Old/Indicators/x-saherelm.x121.xama.mq5 | 350 ++ .../Old/Indicators/x-saherelm.x121.xcc.ex5 | Bin 0 -> 11202 bytes .../Old/Indicators/x-saherelm.x121.xcc.mq5 | 454 ++ .../Old/Indicators/x-saherelm.x121.xche.ex5 | Bin 0 -> 19190 bytes .../Old/Indicators/x-saherelm.x121.xche.mq5 | 631 +++ .../Old/Indicators/x-saherelm.x121.xcpv.ex5 | Bin 0 -> 79574 bytes .../Old/Indicators/x-saherelm.x121.xct.ex5 | Bin 0 -> 13130 bytes .../Old/Indicators/x-saherelm.x121.xct.mq5 | 264 + .../Old/Indicators/x-saherelm.x121.xdema.ex5 | Bin 0 -> 12368 bytes .../Old/Indicators/x-saherelm.x121.xdema.mq5 | 348 ++ .../Old/Indicators/x-saherelm.x121.xfbb.ex5 | Bin 0 -> 23408 bytes .../Old/Indicators/x-saherelm.x121.xfbb.mq5 | 768 +++ .../Old/Indicators/x-saherelm.x121.xhk.ex5 | Bin 0 -> 11564 bytes .../Old/Indicators/x-saherelm.x121.xhk.mq5 | 486 ++ .../Old/Indicators/x-saherelm.x121.xhull.ex5 | Bin 0 -> 18792 bytes .../Old/Indicators/x-saherelm.x121.xhull.mq5 | 602 +++ .../Old/Indicators/x-saherelm.x121.xich.ex5 | Bin 0 -> 21272 bytes .../Old/Indicators/x-saherelm.x121.xich.mq5 | 836 +++ .../Old/Indicators/x-saherelm.x121.xman.ex5 | Bin 0 -> 92964 bytes .../Old/Indicators/x-saherelm.x121.xman.mq5 | 4064 +++++++++++++++ .../Old/Indicators/x-saherelm.x121.xmrb.ex5 | Bin 0 -> 21258 bytes .../Old/Indicators/x-saherelm.x121.xmrb.mq5 | 786 +++ .../Old/Indicators/x-saherelm.x121.xosc.ex5 | Bin 0 -> 24868 bytes .../Old/Indicators/x-saherelm.x121.xosc.mq5 | 721 +++ .../Old/Indicators/x-saherelm.x121.xpv.ex5 | Bin 0 -> 23764 bytes .../Old/Indicators/x-saherelm.x121.xpv.mq5 | 992 ++++ .../Old/Indicators/x-saherelm.x121.xsslc.ex5 | Bin 0 -> 14266 bytes .../Old/Indicators/x-saherelm.x121.xsslc.mq5 | 437 ++ .../Old/Indicators/x-saherelm.x121.xstr.ex5 | Bin 0 -> 13370 bytes .../Old/Indicators/x-saherelm.x121.xstr.mq5 | 580 +++ .../Old/Indicators/x-saherelm.x121.xtm.ex5 | Bin 0 -> 11990 bytes .../Old/Indicators/x-saherelm.x121.xtm.mq5 | 354 ++ .../Old/Indicators/x-saherelm.x121.xtrnd.ex5 | Bin 0 -> 36924 bytes .../Old/Indicators/x-saherelm.x121.xtrnd.mq5 | 1253 +++++ .../X121/Old/Indicators/x-saherelm.xchnl.ex5 | Bin 0 -> 25486 bytes .../X121/Old/Indicators/x-saherelm.xchnl.mq5 | 775 +++ .../Old/Libraries/x-saherelm.alert.lib.ex5 | Bin 0 -> 8824 bytes .../Old/Libraries/x-saherelm.alert.lib.mq5 | 187 + .../Old/Libraries/x-saherelm.common.lib.ex5 | Bin 0 -> 5628 bytes .../Old/Libraries/x-saherelm.common.lib.mq5 | 4635 +++++++++++++++++ .../Old/Libraries/x-saherelm.draw.lib.ex5 | Bin 0 -> 6644 bytes .../Old/Libraries/x-saherelm.draw.lib.mq5 | 2462 +++++++++ .../Old/Libraries/x-saherelm.http.lib.ex5 | Bin 0 -> 3788 bytes .../Old/Libraries/x-saherelm.http.lib.mq5 | 177 + .../X121/Old/Libraries/x-saherelm.log.lib.ex5 | Bin 0 -> 5924 bytes .../X121/Old/Libraries/x-saherelm.log.lib.mq5 | 1088 ++++ .../Old/Libraries/x-saherelm.models.lib.ex5 | Bin 0 -> 4976 bytes .../Old/Libraries/x-saherelm.models.lib.mq5 | 292 ++ .../Libraries/x-saherelm.seriallizer.lib.ex5 | Bin 0 -> 7124 bytes .../Libraries/x-saherelm.seriallizer.lib.mq5 | 371 ++ .../Libraries/x-saherelm.x121.draw.lib.ex5 | Bin 0 -> 6782 bytes .../Libraries/x-saherelm.x121.draw.lib.mq5 | 241 + .../x-saherelm.x121.signaller.lib.ex5 | Bin 0 -> 10570 bytes .../x-saherelm.x121.signaller.lib.mq5 | 245 + .../Libraries/x-saherelm.x121.support.lib.ex5 | Bin 0 -> 11408 bytes .../Libraries/x-saherelm.x121.support.lib.mq5 | 584 +++ 112 files changed, 50446 insertions(+) create mode 100644 MQLTestWorkspace/BKPS/BKP/sc.mq5 create mode 100644 MQLTestWorkspace/X121/Old/Classes/x-saherelm.http.class.ex5 create mode 100644 MQLTestWorkspace/X121/Old/Classes/x-saherelm.http.class.mq5 create mode 100644 MQLTestWorkspace/X121/Old/Classes/x-saherelm.x121.provider.class.ex5 create mode 100644 MQLTestWorkspace/X121/Old/Classes/x-saherelm.x121.provider.class.mq5 create mode 100644 MQLTestWorkspace/X121/Old/Classes/x-saherelm.x121.xea.class.ex5 create mode 100644 MQLTestWorkspace/X121/Old/Classes/x-saherelm.x121.xea.class.mq5 create mode 100644 MQLTestWorkspace/X121/Old/Classes/x-saherelm.xaccount.class.ex5 create mode 100644 MQLTestWorkspace/X121/Old/Classes/x-saherelm.xaccount.class.mq5 create mode 100644 MQLTestWorkspace/X121/Old/Classes/x-saherelm.xea.class.ex5 create mode 100644 MQLTestWorkspace/X121/Old/Classes/x-saherelm.xea.class.mq5 create mode 100644 MQLTestWorkspace/X121/Old/Classes/x-saherelm.xhelper.class.ex5 create mode 100644 MQLTestWorkspace/X121/Old/Classes/x-saherelm.xhelper.class.mq5 create mode 100644 MQLTestWorkspace/X121/Old/Classes/x-saherelm.xnotifier.class.ex5 create mode 100644 MQLTestWorkspace/X121/Old/Classes/x-saherelm.xprovider.class.ex5 create mode 100644 MQLTestWorkspace/X121/Old/Classes/x-saherelm.xprovider.class.mq5 create mode 100644 MQLTestWorkspace/X121/Old/Classes/x-saherelm.xtrade.class.ex5 create mode 100644 MQLTestWorkspace/X121/Old/Classes/x-saherelm.xtrade.class.mq5 create mode 100644 MQLTestWorkspace/X121/Old/Experts/x-saherelm.xea.ex5 create mode 100644 MQLTestWorkspace/X121/Old/Experts/x-saherelm.xea.mq5 create mode 100644 MQLTestWorkspace/X121/Old/Helpers/x-saherelm.x121.xama.helper.class.ex5 create mode 100644 MQLTestWorkspace/X121/Old/Helpers/x-saherelm.x121.xama.helper.class.mq5 create mode 100644 MQLTestWorkspace/X121/Old/Helpers/x-saherelm.x121.xcc.helper.class.ex5 create mode 100644 MQLTestWorkspace/X121/Old/Helpers/x-saherelm.x121.xcc.helper.class.mq5 create mode 100644 MQLTestWorkspace/X121/Old/Helpers/x-saherelm.x121.xche.helper.class.ex5 create mode 100644 MQLTestWorkspace/X121/Old/Helpers/x-saherelm.x121.xche.helper.class.mq5 create mode 100644 MQLTestWorkspace/X121/Old/Helpers/x-saherelm.x121.xct.helper.class.ex5 create mode 100644 MQLTestWorkspace/X121/Old/Helpers/x-saherelm.x121.xct.helper.class.mq5 create mode 100644 MQLTestWorkspace/X121/Old/Helpers/x-saherelm.x121.xdema.helper.class.ex5 create mode 100644 MQLTestWorkspace/X121/Old/Helpers/x-saherelm.x121.xdema.helper.class.mq5 create mode 100644 MQLTestWorkspace/X121/Old/Helpers/x-saherelm.x121.xfbb.helper.class.ex5 create mode 100644 MQLTestWorkspace/X121/Old/Helpers/x-saherelm.x121.xfbb.helper.class.mq5 create mode 100644 MQLTestWorkspace/X121/Old/Helpers/x-saherelm.x121.xhk.helper.class.ex5 create mode 100644 MQLTestWorkspace/X121/Old/Helpers/x-saherelm.x121.xhk.helper.class.mq5 create mode 100644 MQLTestWorkspace/X121/Old/Helpers/x-saherelm.x121.xhull.helper.class.ex5 create mode 100644 MQLTestWorkspace/X121/Old/Helpers/x-saherelm.x121.xhull.helper.class.mq5 create mode 100644 MQLTestWorkspace/X121/Old/Helpers/x-saherelm.x121.xich.helper.class.ex5 create mode 100644 MQLTestWorkspace/X121/Old/Helpers/x-saherelm.x121.xich.helper.class.mq5 create mode 100644 MQLTestWorkspace/X121/Old/Helpers/x-saherelm.x121.xman.helper.class.ex5 create mode 100644 MQLTestWorkspace/X121/Old/Helpers/x-saherelm.x121.xman.helper.class.mq5 create mode 100644 MQLTestWorkspace/X121/Old/Helpers/x-saherelm.x121.xmrb.helper.class.ex5 create mode 100644 MQLTestWorkspace/X121/Old/Helpers/x-saherelm.x121.xmrb.helper.class.mq5 create mode 100644 MQLTestWorkspace/X121/Old/Helpers/x-saherelm.x121.xosc.helper.class.ex5 create mode 100644 MQLTestWorkspace/X121/Old/Helpers/x-saherelm.x121.xosc.helper.class.mq5 create mode 100644 MQLTestWorkspace/X121/Old/Helpers/x-saherelm.x121.xpv.helper.class.ex5 create mode 100644 MQLTestWorkspace/X121/Old/Helpers/x-saherelm.x121.xpv.helper.class.mq5 create mode 100644 MQLTestWorkspace/X121/Old/Helpers/x-saherelm.x121.xsslc.helper.class.ex5 create mode 100644 MQLTestWorkspace/X121/Old/Helpers/x-saherelm.x121.xsslc.helper.class.mq5 create mode 100644 MQLTestWorkspace/X121/Old/Helpers/x-saherelm.x121.xstr.helper.class.ex5 create mode 100644 MQLTestWorkspace/X121/Old/Helpers/x-saherelm.x121.xstr.helper.class.mq5 create mode 100644 MQLTestWorkspace/X121/Old/Helpers/x-saherelm.x121.xtm.helper.class.ex5 create mode 100644 MQLTestWorkspace/X121/Old/Helpers/x-saherelm.x121.xtm.helper.class.mq5 create mode 100644 MQLTestWorkspace/X121/Old/Helpers/x-saherelm.x121.xtrnd.helper.class.ex5 create mode 100644 MQLTestWorkspace/X121/Old/Helpers/x-saherelm.x121.xtrnd.helper.class.mq5 create mode 100644 MQLTestWorkspace/X121/Old/Indicators/Market/WH Fair Value Gap MT5.ex5 create mode 100644 MQLTestWorkspace/X121/Old/Indicators/x-saherelm.x121.xama.ex5 create mode 100644 MQLTestWorkspace/X121/Old/Indicators/x-saherelm.x121.xama.mq5 create mode 100644 MQLTestWorkspace/X121/Old/Indicators/x-saherelm.x121.xcc.ex5 create mode 100644 MQLTestWorkspace/X121/Old/Indicators/x-saherelm.x121.xcc.mq5 create mode 100644 MQLTestWorkspace/X121/Old/Indicators/x-saherelm.x121.xche.ex5 create mode 100644 MQLTestWorkspace/X121/Old/Indicators/x-saherelm.x121.xche.mq5 create mode 100644 MQLTestWorkspace/X121/Old/Indicators/x-saherelm.x121.xcpv.ex5 create mode 100644 MQLTestWorkspace/X121/Old/Indicators/x-saherelm.x121.xct.ex5 create mode 100644 MQLTestWorkspace/X121/Old/Indicators/x-saherelm.x121.xct.mq5 create mode 100644 MQLTestWorkspace/X121/Old/Indicators/x-saherelm.x121.xdema.ex5 create mode 100644 MQLTestWorkspace/X121/Old/Indicators/x-saherelm.x121.xdema.mq5 create mode 100644 MQLTestWorkspace/X121/Old/Indicators/x-saherelm.x121.xfbb.ex5 create mode 100644 MQLTestWorkspace/X121/Old/Indicators/x-saherelm.x121.xfbb.mq5 create mode 100644 MQLTestWorkspace/X121/Old/Indicators/x-saherelm.x121.xhk.ex5 create mode 100644 MQLTestWorkspace/X121/Old/Indicators/x-saherelm.x121.xhk.mq5 create mode 100644 MQLTestWorkspace/X121/Old/Indicators/x-saherelm.x121.xhull.ex5 create mode 100644 MQLTestWorkspace/X121/Old/Indicators/x-saherelm.x121.xhull.mq5 create mode 100644 MQLTestWorkspace/X121/Old/Indicators/x-saherelm.x121.xich.ex5 create mode 100644 MQLTestWorkspace/X121/Old/Indicators/x-saherelm.x121.xich.mq5 create mode 100644 MQLTestWorkspace/X121/Old/Indicators/x-saherelm.x121.xman.ex5 create mode 100644 MQLTestWorkspace/X121/Old/Indicators/x-saherelm.x121.xman.mq5 create mode 100644 MQLTestWorkspace/X121/Old/Indicators/x-saherelm.x121.xmrb.ex5 create mode 100644 MQLTestWorkspace/X121/Old/Indicators/x-saherelm.x121.xmrb.mq5 create mode 100644 MQLTestWorkspace/X121/Old/Indicators/x-saherelm.x121.xosc.ex5 create mode 100644 MQLTestWorkspace/X121/Old/Indicators/x-saherelm.x121.xosc.mq5 create mode 100644 MQLTestWorkspace/X121/Old/Indicators/x-saherelm.x121.xpv.ex5 create mode 100644 MQLTestWorkspace/X121/Old/Indicators/x-saherelm.x121.xpv.mq5 create mode 100644 MQLTestWorkspace/X121/Old/Indicators/x-saherelm.x121.xsslc.ex5 create mode 100644 MQLTestWorkspace/X121/Old/Indicators/x-saherelm.x121.xsslc.mq5 create mode 100644 MQLTestWorkspace/X121/Old/Indicators/x-saherelm.x121.xstr.ex5 create mode 100644 MQLTestWorkspace/X121/Old/Indicators/x-saherelm.x121.xstr.mq5 create mode 100644 MQLTestWorkspace/X121/Old/Indicators/x-saherelm.x121.xtm.ex5 create mode 100644 MQLTestWorkspace/X121/Old/Indicators/x-saherelm.x121.xtm.mq5 create mode 100644 MQLTestWorkspace/X121/Old/Indicators/x-saherelm.x121.xtrnd.ex5 create mode 100644 MQLTestWorkspace/X121/Old/Indicators/x-saherelm.x121.xtrnd.mq5 create mode 100644 MQLTestWorkspace/X121/Old/Indicators/x-saherelm.xchnl.ex5 create mode 100644 MQLTestWorkspace/X121/Old/Indicators/x-saherelm.xchnl.mq5 create mode 100644 MQLTestWorkspace/X121/Old/Libraries/x-saherelm.alert.lib.ex5 create mode 100644 MQLTestWorkspace/X121/Old/Libraries/x-saherelm.alert.lib.mq5 create mode 100644 MQLTestWorkspace/X121/Old/Libraries/x-saherelm.common.lib.ex5 create mode 100644 MQLTestWorkspace/X121/Old/Libraries/x-saherelm.common.lib.mq5 create mode 100644 MQLTestWorkspace/X121/Old/Libraries/x-saherelm.draw.lib.ex5 create mode 100644 MQLTestWorkspace/X121/Old/Libraries/x-saherelm.draw.lib.mq5 create mode 100644 MQLTestWorkspace/X121/Old/Libraries/x-saherelm.http.lib.ex5 create mode 100644 MQLTestWorkspace/X121/Old/Libraries/x-saherelm.http.lib.mq5 create mode 100644 MQLTestWorkspace/X121/Old/Libraries/x-saherelm.log.lib.ex5 create mode 100644 MQLTestWorkspace/X121/Old/Libraries/x-saherelm.log.lib.mq5 create mode 100644 MQLTestWorkspace/X121/Old/Libraries/x-saherelm.models.lib.ex5 create mode 100644 MQLTestWorkspace/X121/Old/Libraries/x-saherelm.models.lib.mq5 create mode 100644 MQLTestWorkspace/X121/Old/Libraries/x-saherelm.seriallizer.lib.ex5 create mode 100644 MQLTestWorkspace/X121/Old/Libraries/x-saherelm.seriallizer.lib.mq5 create mode 100644 MQLTestWorkspace/X121/Old/Libraries/x-saherelm.x121.draw.lib.ex5 create mode 100644 MQLTestWorkspace/X121/Old/Libraries/x-saherelm.x121.draw.lib.mq5 create mode 100644 MQLTestWorkspace/X121/Old/Libraries/x-saherelm.x121.signaller.lib.ex5 create mode 100644 MQLTestWorkspace/X121/Old/Libraries/x-saherelm.x121.signaller.lib.mq5 create mode 100644 MQLTestWorkspace/X121/Old/Libraries/x-saherelm.x121.support.lib.ex5 create mode 100644 MQLTestWorkspace/X121/Old/Libraries/x-saherelm.x121.support.lib.mq5 diff --git a/MQLTestWorkspace/BKPS/BKP/sc.mq5 b/MQLTestWorkspace/BKPS/BKP/sc.mq5 new file mode 100644 index 0000000..8a3ee8b --- /dev/null +++ b/MQLTestWorkspace/BKPS/BKP/sc.mq5 @@ -0,0 +1,216 @@ + + // + // Level 1 ... + + // + ENUM_XMAN_STATES scHState = (ENUM_XMAN_STATES)sHHStateBuffer[barIndex]; + ENUM_XMAN_STATES scHStatePrev = (ENUM_XMAN_STATES)sHHStateBuffer[barIndex + 1]; + ENUM_XMAN_STATES scLState = (ENUM_XMAN_STATES)sLLStateBuffer[barIndex]; + ENUM_XMAN_STATES scLStatePrev = (ENUM_XMAN_STATES)sLLStateBuffer[barIndex + 1]; + + // + bool isSCHBullish = + // + scHState = XMAN_STATE_BULLISH + // + ; + // + bool isSCHPrevBullish = + // + scHStatePrev = XMAN_STATE_BULLISH + // + ; + + // + bool isSCLBullish = + // + scLState == XMAN_STATE_BULLISH + // + ; + + // + bool isSCLPrevBullish = + // + scLStatePrev == XMAN_STATE_BULLISH + // + ; + + // + bool isSCBullish = + // + isSCHBullish && + isSCLBullish + // + ; + + // + bool isSCPrevBullish = + // + isSCHPrevBullish && + isSCLPrevBullish + // + ; + + // + bool isSCSwitchedToBullish = + // + isSCBullish && + !isSCPrevBullish + // + ; + + // + bool isSCHSwitchedToBullish = + // + isSCHBullish && + !isSCHPrevBullish + // + ; + + // + bool isSCLSwitchedToBullish = + // + isSCLBullish && + !isSCLPrevBullish + // + ; + + // + bool isSCHBearish = + // + scHState == XMAN_STATE_BEARISH + // + ; + + // + bool isSCHPrevBearish = + // + scHStatePrev == XMAN_STATE_BEARISH + // + ; + + // + bool isSCLBearish = + // + scLState == XMAN_STATE_BEARISH + // + ; + + // + bool isSCLPrevBearish = + // + scLStatePrev == XMAN_STATE_BEARISH + // + ; + + // + bool isSCBearish = + // + isSCHBearish && + isSCLBearish + // + ; + + // + bool isSCPrevBearish = + // + isSCHPrevBearish && + isSCLPrevBearish + // + ; + + // + bool isSCSwitchedToBearish = + // + isSCBearish && + !isSCPrevBearish + // + ; + + // + bool isSCHSwitchedToBearish = + // + isSCHBearish && + !isSCHPrevBearish + // + ; + + // + bool isSCLSwitchedToBearish = + // + isSCLBearish && + !isSCLPrevBearish + // + ; + + // + bool isSCNeutural = + // + !isSCBullish && + !isSCBearish + // + ; + + // + bool isSCPrevNeutural = + // + !isSCPrevBullish && + !isSCPrevBearish + // + ; + + // + bool isSCHNeutural = + // + !isSCHBullish && + !isSCHBearish + // + ; + + // + bool isSCHPrevNeutural = + // + !isSCHPrevBullish && + !isSCHPrevBearish + // + ; + + // + bool isSCLNeutural = + // + !isSCLBullish && + !isSCLBearish + // + ; + + // + bool isSCLPrevNeutural = + // + !isSCLPrevBullish && + !isSCLPrevBearish + // + ; + + // + bool isSCSwitchedToNeutural = + // + isSCNeutural && + !isSCPrevNeutural + // + ; + + // + bool isSCHSwitchedToNeutural = + // + isSCHNeutural && + !isSCHPrevNeutural + // + ; + + // + bool isSCLSwitchedToNeutural = + // + isSCLNeutural && + !isSCLPrevNeutural + // + ; diff --git a/MQLTestWorkspace/X121/Old/Classes/x-saherelm.http.class.ex5 b/MQLTestWorkspace/X121/Old/Classes/x-saherelm.http.class.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..fbc2a39a3cac09b6482ee079b928c4f3a67ee4db GIT binary patch literal 5952 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 literal 0 HcmV?d00001 diff --git a/MQLTestWorkspace/X121/Old/Classes/x-saherelm.http.class.mq5 b/MQLTestWorkspace/X121/Old/Classes/x-saherelm.http.class.mq5 new file mode 100644 index 0000000..e28342d --- /dev/null +++ b/MQLTestWorkspace/X121/Old/Classes/x-saherelm.http.class.mq5 @@ -0,0 +1,385 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 Class Library +// ---------------------------------------------- +// Name: XSCHttp +// Description: provides all HTTP requirements ... +// +// +// 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 + +// +// START Definitions ... +// + +// +enum X_HTTP_METHOD +{ + X_HTTP_GET, + X_HTTP_POST +}; + +// +// Convert enum to String ... +string ToString(X_HTTP_METHOD method) +{ + // + string result = ""; + + // + switch (method) + { + // + case X_HTTP_GET: + result = "GET"; + break; + + // + case X_HTTP_POST: + result = "POST"; + break; + } + + // + return result; +} + +// +// END Definitions ... +// + +// +// START Import and Inclused requirements ... +// + +// +// Includes ... +#include "../Libraries/x-saherelm.common.lib.mq5" + +// +// END Import and Inclused requirements ... +// + +// +// START Overrides ... +// + +// +// END Overrides ... +// + +// +// a Class for Manage Account ... +class XSCHttp +{ + // + // Public ... +public: + // + // Constructor ... + void XSCHttp() + { + XSCHttp("", 10000); + } + void XSCHttp( + string path, // Base Folder to Store Data + int timeout // base timeout for Requests + ) + { + // + Path(path); + Timeout(timeout); + } + + // + // Deconstructor ... + void ~XSCHttp() + { + } + + // + // START Getter(s)/Setter(s) ... + // + + // + // Path ... + void Path(string value) + { + mPath = value; + } + + string Path() + { + return mPath; + } + + // + // Timeout ... + void Timeout(int value) + { + mTimeout = value; + } + + // + int Timeout() + { + return mTimeout; + } + + // + // Error ... + int Error() + { + return mError; + } + + // + // Response ... + string Response() + { + return mResponse; + } + + // + // END Getter(s)/Setter(s) ... + // + + // + // START Provided Functions ... + // + + // + // Send Global Request ... + int SendRequest( + X_HTTP_METHOD method, // Httm Request Method + const string url, // Server Address + const string headers, // Headers providing + const char &payload[], // the Data which needs to Send + char &response[], // Response of request + string responseHeaders, // Response Headers + int timeout = 500 // Timeout for response default is 500 + ) + { + // + int result = -1; + + // + string strMethod = ToString(method); + if (StringLen(strMethod) == 0) + { + return result; + } + + // + // Reset State ... + ResetState(); + + // + result = WebRequest( + strMethod, + url, + headers, + timeout, + payload, + response, + responseHeaders); + + // + if (result < 0) + { + mError = GetLastError(); + } + else + { + mResponse = CharArrayToString(response); + } + + // + return result; + } + + // + // Get Request ... + int GetRequest( + const string url, // Server Address + const string headers, // Headers providing + const char &payload[], // the Data which needs to Send + char &response[], // Response of request + string responseHeaders, // Response Headers + int timeout = 500 // Timeout for response default is 500 + ) + { + // + int result = SendRequest( + X_HTTP_GET, + url, + headers, + payload, + response, + responseHeaders, + timeout); + + // + return result; + } + + // + // Post Request ... + int PostRequest( + const string url, // Server Address + const string headers, // Headers providing + const char &payload[], // the Data which needs to Send + char &response[], // Response of request + string responseHeaders, // Response Headers + int timeout = 500 // Timeout for response default is 500 + ) + { + // + int result = SendRequest( + X_HTTP_POST, + url, + headers, + payload, + response, + responseHeaders, + timeout); + + // + return result; + } + + // + // Handle Download Specific URL Content to Specific Path and File Name ... + bool Download( + string url, // the URL address which going to download + string fileName // Specify Destination file name to Store Response + ) + { + // + bool result = false; + + // + string filePath = GetFilePath(fileName); + string cookie = NULL; + string referer = NULL; + int timeout = Timeout(); + + // + char payload[]; + string headers; + char response[]; + string responseHeaders; + + // + // Send Request ... + int requestResult = GetRequest( + url, + headers, + payload, + response, + responseHeaders, + timeout); + + // + // Define File Handler ... + int mFileHandler = FileOpen( + filePath, + FILE_WRITE | FILE_BIN); + if (mFileHandler == INVALID_HANDLE) + { + // + mError = GetLastError(); + return result; + } + + // + // Write Response to File ... + uint writed = FileWriteArray( + mFileHandler, + response, + 0, + ArraySize(response)); + FileFlush(mFileHandler); + FileClose(mFileHandler); + + // + result = writed > 0; + + // + return result; + } + + // + // END Provided Functions ... + // + + // + // Protected ... +protected: + // + // Destintion Folder Path ... + string mPath; + + // + // WEB Request Timeout Value ... + int mTimeout; + + // + // WEB Request's Response ... + string mResponse; + + // + // Error Value ... + int mError; + + // + // Private ... +private: + // + // Reset Errors State ... + void ResetState() + { + // + // Reset Errors ... + mError = -1; + mResponse = ""; + ResetLastError(); + } + + // + // Generate Full File Path ... + string GetFilePath(string fileName) + { + // + string result = ""; + + // + result = + // + Path() + "\\" + fileName + // + ; + + // + return result; + } +}; + +// +// START Usefull Functions ... +// + +// +// END Usefull Functions ... +// diff --git a/MQLTestWorkspace/X121/Old/Classes/x-saherelm.x121.provider.class.ex5 b/MQLTestWorkspace/X121/Old/Classes/x-saherelm.x121.provider.class.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..e331dfe98f723edb9f0a2f7155cd6458ed4e20ff GIT binary patch literal 11186 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 ChoLtB literal 0 HcmV?d00001 diff --git a/MQLTestWorkspace/X121/Old/Classes/x-saherelm.x121.provider.class.mq5 b/MQLTestWorkspace/X121/Old/Classes/x-saherelm.x121.provider.class.mq5 new file mode 100644 index 0000000..43f9fdc --- /dev/null +++ b/MQLTestWorkspace/X121/Old/Classes/x-saherelm.x121.provider.class.mq5 @@ -0,0 +1,2939 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 Class Library +// ---------------------------------------------- +// Name: XSCX121Provider +// Description: X121 Signal Provider ... +// +// +// 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 + +// +// START Definitions ... +// + +// +// START Import and Inclused requirements ... +// + +// +// Includes ... +#include "../Classes/x-saherelm.xprovider.class.mq5" +#include "../Helpers/x-saherelm.x121.xct.helper.class.mq5" +#include "../Helpers/x-saherelm.x121.xcc.helper.class.mq5" +#include "../Helpers/x-saherelm.x121.xhk.helper.class.mq5" +#include "../Helpers/x-saherelm.x121.xtm.helper.class.mq5" +#include "../Helpers/x-saherelm.x121.xpv.helper.class.mq5" +#include "../Helpers/x-saherelm.x121.xstr.helper.class.mq5" +#include "../Helpers/x-saherelm.x121.xfbb.helper.class.mq5" +#include "../Helpers/x-saherelm.x121.xosc.helper.class.mq5" +#include "../Helpers/x-saherelm.x121.xama.helper.class.mq5" +#include "../Helpers/x-saherelm.x121.xmrb.helper.class.mq5" +#include "../Helpers/x-saherelm.x121.xche.helper.class.mq5" +#include "../Helpers/x-saherelm.x121.xich.helper.class.mq5" +#include "../Helpers/x-saherelm.x121.xdema.helper.class.mq5" +#include "../Helpers/x-saherelm.x121.xtrnd.helper.class.mq5" +#include "../Helpers/x-saherelm.x121.xsslc.helper.class.mq5" +#include "../Helpers/x-saherelm.x121.xhull.helper.class.mq5" + +// +// Library ... +#include "../Libraries/x-saherelm.draw.lib.mq5" +#include "../Libraries/x-saherelm.seriallizer.lib.mq5" + +// +// END Import and Inclused requirements ... +// + +// +// Here we Have to Define an Input Structure Model +// for Provider Class to Handle Helpers Definitions ... +struct X121ProviderInputs +{ + // + // XCT ... + // Candle Timer ... + XCTInputs xctConfig; + + // + // XCC ... + // Candle Styling ... + XCCInputs xccConfig; + + // + // XHK ... + // HikenAshi Candle Representing ... + XHKInputs xhkConfig; + + // + // XTM ... + // Trend Magic ... + XTMInputs xtmConfig; + + // + // XPV ... + // Peaks And Vales ... + XPVInputs xpvConfig; + + // + // XOSC ... + // OSCILLATORS ... + XOSCInputs xoscConfig; + + // + // XAMA ... + // Adaptive Moving Average ... + XAMAInputs xamaConfig; + + // + // XMRB ... + // Moving Average Ribbon ... + XMRBInputs xmrbConfig; + + // + // XCHE ... + // Chandelier Exit Points ... + XCHEInputs xcheConfig; + + // + // XICH ... + // Ichimopku Kinko Hyo ... + XICHInputs xichConfig; + + // + // XTRND ... + // Trend Detector ... + XTRNDInputs xtrndConfig; + + // + // XSSLC ... + // SSL Channel ... + XSSLCInputs xsslcConfig; + + // + // XHULL ... + // Hull Trend Detection Channel ... + XHULLInputs xhullConfig; + + // + // XFBB ... + XFBBInputs xfbbConfig; + + // + // XSTR ... + XSTRInputs xstrConfig; + + // + // XDEMA ... + XDEMAInputs xdemaConfig; +}; + +// +// Model Market Sense based On Current Captured conditions ... +struct X121MarketConditions +{ + // + // Commonly Used Info ... + + // + // Symbol ... + string symbol; + + // + // Period ... + ENUM_TIMEFRAMES period; + + // + // Bar Time ... + datetime barTime; + + // + XCandleRemains barRemains; + + // + // Bar Index ... + int barIndex; + + // + // Check Current Market Condition has Signal or not ... + bool hasSignal; + + // + // If has any Signal, Models it's related info here ... + XSignal signal; + + // + // Support and Resistances ... + // if provides Signal ... + XOHCLSupRes supportResistances; + + // + // Change Price Steps ... + double momentumStep; + + // + XOHCL candles[]; + + // + // INDICATORS Market Sense ... + + // + // XCT ... + // there is not any Info provided here ... + + // + // XCC ... + // there is not any Info provided here ... + + // + // XHK ... + XHKInfo xhkInfo; + + // + // XTM ... + XTMInfo xtmInfo; + + // + // XPV ... + XPVInfo xpvInfo; + + // + // XOSC ... + XOSCInfo xoscInfo; + + // + // XAMA ... + XAMAInfo xamaInfo; + + // + // XMRB ... + XMRBInfo xmrbInfo; + + // + // XCHE ... + XCHEInfo xcheInfo; + + // + // XICH ... + XICHInfo xichInfo; + + // + // XTRND ... + XTRNDInfo xtrndInfo; + + // + // XSSLC ... + XSSLCInfo xsslcInfo; + + // + // XHULL ... + XHULLInfo xhullInfo; + + // + // XSTR ... + XSTRInfo xstrInfo; + + // + // XFBB ... + XFBBInfo xfbbInfo; + + // + // XDEMA ... + XDEMAInfo xdemaInfo; +}; + +// +// Notified a Signal was Appears ... +typedef void (*TOnSignalConditions)( + X121MarketConditions &info); + +// +// All Available Signal Types ... +enum ENUM_X121_SIGNAL_PROVIDERS +{ + NONE, // NONE ... + X786, // Hadi Khazaee Asl ... + X92, // Hadi Khazaee Asl ... + X110, // AmirAli Khazaee ... + X121, // Hadi Khazaee Asl ... + X128, // Farhad Farahmand ... +}; + +// +// END Definitions ... +// + +// +// START Overrides ... +// + +// +// END Overrides ... +// + +// +// a Base Class for All of our EA's ... +class XSCX121Provider : public XSCEABaseProvider +{ + // + // Public ... +public: + // + // Props ... + X121ProviderInputs providedConfig; + X121ProviderInputs currentConfig; + X121ProviderInputs cleanConfig; + + // + // Indicator Helper Classes Instance ... + + // + // XCT ... + XSCXCTHelper *mXCTHelper; + + // + // XCC ... + XSCXCCHelper *mXCCHelper; + + // + // XHK ... + XSCXHKHelper *mXHKHelper; + + // + // XTM ... + XSCXTMHelper *mXTMHelper; + + // + // XPV ... + XSCXPVHelper *mXPVHelper; + + // + // XOSC ... + XSCXOSCHelper *mXOSCHelper; + + // + // XAMA ... + XSCXAMAHelper *mXAMAHelper; + + // + // XMRB ... + XSCXMRBHelper *mXMRBHelper; + + // + // XCHE ... + XSCXCHEHelper *mXCHEHelper; + + // + // XICH ... + XSCXICHHelper *mXICHHelper; + + // + // XTRND ... + XSCXTRNDHelper *mXTRNDHelper; + + // + // XSSLC ... + XSCXSSLCHelper *mXSSLCHelper; + + // + // XHULL ... + XSCXHULLHelper *mXHULLHelper; + + // + // XSTR ... + XSCXSTRHelper *mXSTRHelper; + + // + // XFBB ... + XSCXFBBHelper *mXFBBHelper; + + // + // XDEMA ... + XSCXDEMAHelper *mXDEMAHelper; + + // + // Hull Pivot Points ... + double upZonePivots[]; + double downZonePivots[]; + + // + // Peaks and Vales Verifications Number ... + double peaksPivots[]; + double valesPivots[]; + + // + double ichPivots[]; + + // + double fiboPivots[]; + + // + int pvConsequences; + + // + // Constructor ... + void XSCX121Provider( + string symbol, // Trading Symbol ... + ENUM_TIMEFRAMES period // Trading Time Frame ... + ) + { + // + mMinPivots = 100; + pvConsequences = 26; + + // + PrepareTag(); + } + + // + // Deconstructor ... + void ~XSCX121Provider() + { + // + IndicatorRelease(mCTimerHandler); + + // + // De construct Helpers ... + delete mXCTHelper; + delete mXCCHelper; + delete mXHKHelper; + delete mXTMHelper; + delete mXPVHelper; + delete mXOSCHelper; + delete mXAMAHelper; + delete mXMRBHelper; + delete mXCHEHelper; + delete mXICHHelper; + delete mXSTRHelper; + delete mXFBBHelper; + delete mXTRNDHelper; + delete mXSSLCHelper; + delete mXHULLHelper; + delete mXDEMAHelper; + } + + // + virtual void PrepareTag() + { + mTag = "X121Provider((" + mSymbol + ")(" + ToString(mPeriod) + ")"; + } + + // + virtual bool Init() + { + // + bool result = false; + + // + // Instantiate all Indicators Helper Classes ... + + // + // XCT ... + mXCTHelper = new XSCXCTHelper( + mSymbol, + mPeriod); + result = mXCTHelper.SetConfig(currentConfig.xctConfig); + if (!result) + { + return result; + } + + // + // XCC ... + mXCCHelper = new XSCXCCHelper( + mSymbol, + mPeriod); + result = mXCCHelper.SetConfig(currentConfig.xccConfig); + if (!result) + { + return result; + } + + // + // XHK ... + mXHKHelper = new XSCXHKHelper( + mSymbol, + mPeriod); + result = mXHKHelper.SetConfig(currentConfig.xhkConfig); + if (!result) + { + return result; + }; + + // + // XTM ... + mXTMHelper = new XSCXTMHelper( + mSymbol, + mPeriod); + result = mXTMHelper.SetConfig(currentConfig.xtmConfig); + if (!result) + { + return result; + }; + + // + // XPV ... + mXPVHelper = new XSCXPVHelper( + mSymbol, + mPeriod); + result = mXPVHelper.SetConfig(currentConfig.xpvConfig); + if (!result) + { + return result; + }; + + // + // XOSC ... + mXOSCHelper = new XSCXOSCHelper( + mSymbol, + mPeriod); + result = mXOSCHelper.SetConfig(currentConfig.xoscConfig); + if (!result) + { + return result; + }; + + // + // XAMA ... + mXAMAHelper = new XSCXAMAHelper( + mSymbol, + mPeriod); + result = mXAMAHelper.SetConfig(currentConfig.xamaConfig); + if (!result) + { + return result; + }; + + // + // XMRB ... + mXMRBHelper = new XSCXMRBHelper( + mSymbol, + mPeriod); + result = mXMRBHelper.SetConfig(currentConfig.xmrbConfig); + if (!result) + { + return result; + }; + + // + // XCHE ... + mXCHEHelper = new XSCXCHEHelper( + mSymbol, + mPeriod); + result = mXCHEHelper.SetConfig(currentConfig.xcheConfig); + if (!result) + { + return result; + }; + + // + // XICH ... + mXICHHelper = new XSCXICHHelper( + mSymbol, + mPeriod); + result = mXICHHelper.SetConfig(currentConfig.xichConfig); + if (!result) + { + return result; + }; + + // + // XTRND ... + mXTRNDHelper = new XSCXTRNDHelper( + mSymbol, + mPeriod); + result = mXTRNDHelper.SetConfig(currentConfig.xtrndConfig); + if (!result) + { + return result; + }; + + // + // XSSLC ... + mXSSLCHelper = new XSCXSSLCHelper( + mSymbol, + mPeriod); + result = mXSSLCHelper.SetConfig(currentConfig.xsslcConfig); + if (!result) + { + return result; + }; + + // + // XHULL ... + mXHULLHelper = new XSCXHULLHelper( + mSymbol, + mPeriod); + result = mXHULLHelper.SetConfig(currentConfig.xhullConfig); + if (!result) + { + return result; + }; + + // + // XSTR ... + mXSTRHelper = new XSCXSTRHelper( + mSymbol, + mPeriod); + result = mXSTRHelper.SetConfig(currentConfig.xstrConfig); + if (!result) + { + return result; + }; + + // + // XFBB ... + mXFBBHelper = new XSCXFBBHelper( + mSymbol, + mPeriod); + result = mXFBBHelper.SetConfig(currentConfig.xfbbConfig); + if (!result) + { + return result; + }; + + // + // XDEMA ... + mXDEMAHelper = new XSCXDEMAHelper( + mSymbol, + mPeriod); + result = mXDEMAHelper.SetConfig(currentConfig.xdemaConfig); + if (!result) + { + return result; + }; + + // + return result; + } + + // + virtual int GetMaxLength() + { + // + int result = -1; + + // + result = MathMax(result, mXCTHelper.GetMaxLength()); + result = MathMax(result, mXCCHelper.GetMaxLength()); + result = MathMax(result, mXHKHelper.GetMaxLength()); + result = MathMax(result, mXTMHelper.GetMaxLength()); + result = MathMax(result, mXPVHelper.GetMaxLength()); + result = MathMax(result, mXOSCHelper.GetMaxLength()); + result = MathMax(result, mXAMAHelper.GetMaxLength()); + result = MathMax(result, mXMRBHelper.GetMaxLength()); + result = MathMax(result, mXCHEHelper.GetMaxLength()); + result = MathMax(result, mXICHHelper.GetMaxLength()); + result = MathMax(result, mXTRNDHelper.GetMaxLength()); + result = MathMax(result, mXSSLCHelper.GetMaxLength()); + result = MathMax(result, mXHULLHelper.GetMaxLength()); + result = MathMax(result, mXSTRHelper.GetMaxLength()); + result = MathMax(result, mXFBBHelper.GetMaxLength()); + result = MathMax(result, mXDEMAHelper.GetMaxLength()); + + // + return result; + } + + // + virtual int GetCalculatedBars() + { + // + int result = -1; + + // + int mXCTBars = mXCTHelper.GetCalculatedBars(); + int mXCCBars = mXCCHelper.GetCalculatedBars(); + int mXHKBars = mXHKHelper.GetCalculatedBars(); + int mXTMBars = mXTMHelper.GetCalculatedBars(); + int mXPVBars = mXPVHelper.GetCalculatedBars(); + int mXOSCBars = mXOSCHelper.GetCalculatedBars(); + int mXAMABars = mXAMAHelper.GetCalculatedBars(); + int mXMRBBars = mXMRBHelper.GetCalculatedBars(); + int mXCHEBars = mXCHEHelper.GetCalculatedBars(); + int mXICHBars = mXICHHelper.GetCalculatedBars(); + int mXTRNDBars = mXTRNDHelper.GetCalculatedBars(); + int mXSSLCBars = mXSSLCHelper.GetCalculatedBars(); + int mXHULLBars = mXHULLHelper.GetCalculatedBars(); + int mXSTRBars = mXSTRHelper.GetCalculatedBars(); + int mXFBBBars = mXFBBHelper.GetCalculatedBars(); + int mXDEMABars = mXDEMAHelper.GetCalculatedBars(); + + // + int min = MathMin(mXCTBars, mXCCBars); + min = MathMin(min, mXHKBars); + min = MathMin(min, mXTMBars); + min = MathMin(min, mXPVBars); + min = MathMin(min, mXOSCBars); + min = MathMin(min, mXAMABars); + min = MathMin(min, mXMRBBars); + min = MathMin(min, mXCHEBars); + min = MathMin(min, mXICHBars); + min = MathMin(min, mXTRNDBars); + min = MathMin(min, mXSSLCBars); + min = MathMin(min, mXHULLBars); + min = MathMin(min, mXSTRBars); + min = MathMin(min, mXFBBBars); + min = MathMin(min, mXDEMABars); + + // + int max = MathMax(mXCTBars, mXCCBars); + max = MathMax(max, mXHKBars); + max = MathMax(max, mXTMBars); + max = MathMax(max, mXPVBars); + max = MathMax(max, mXOSCBars); + max = MathMax(max, mXAMABars); + max = MathMax(max, mXMRBBars); + max = MathMax(max, mXCHEBars); + max = MathMax(max, mXICHBars); + max = MathMax(max, mXTRNDBars); + max = MathMax(max, mXSSLCBars); + max = MathMax(max, mXHULLBars); + max = MathMax(max, mXSTRBars); + max = MathMax(max, mXFBBBars); + max = MathMax(max, mXDEMABars); + + // + result = min; + + // + return result; + } + + // + virtual void ProcessBuffers() + { + UpdatePivotPoints(); + } + + // + virtual bool ProcessTick(X121MarketConditions &conditions) + { + // + if (CanIgnoreTick()) + { + return false; + } + + // + return ProcessSignals(conditions); + } + + // + int GetMinPivots() + { + return mMinPivots; + } + + // + X121ProviderInputs GetConfig() + { + // + X121ProviderInputs result; + + // + result = currentConfig; + + // + return result; + } + + // + // Set Available Signallers ... + bool SetSignallers( + string &signallers[]) + { + // + bool result = false; + + // + result = ArraySize(signallers) > 0; + if (!result) + { + return result; + } + + // + Copy( + signallers, + mSignallers); + + // + return result; + } + + // + bool SetConfig(X121ProviderInputs &config) + { + // + bool result = false; + + // + PrepareConfig(config); + + // + result = Init(); + + // + return result; + } + + // + bool ResetDefaultConfig() + { + // + bool result = SetConfig(providedConfig); + + // + return result; + } + + // + bool ShowCleanConfig() + { + // + currentConfig = cleanConfig; + + // + bool result = Init(); + + // + return result; + } + + // + bool ShowDefaultConfig() + { + // + currentConfig = providedConfig; + + // + bool result = Init(); + + // + return result; + } + + // + bool IsAllowdSignaller( + ENUM_X121_SIGNAL_PROVIDERS provider // Signal Provider + ) + { + // + bool result = false; + + // + string providerStr = ToString(provider); + + // + result = Contains( + providerStr, + mSignallers); + + // + return result; + } + + // + // Generate Market Sense ... + X121MarketConditions GetMarketConditions( + int barIndex // Specified Bar Index + ) + { + // + X121MarketConditions result; + + // + // Fill Common Data ... + result.symbol = mSymbol; + result.period = mPeriod; + result.barIndex = barIndex; + + // + datetime barTime = GetCandleTime( + mSymbol, + mPeriod, + barIndex); + result.barTime = barTime; + + // + int remainedCandle = barIndex > 0 + ? barIndex - 1 + : barIndex; + GetCandleRemainsTime( + result.barRemains, + mSymbol, + mPeriod, + remainedCandle); + + // + // Attach Candles Info in XOHCL Model to Conditions ... + int mLoopBackBars = mXHKHelper.Loopback(); + XOHCL candles[]; + GetCandles( + candles, + mSymbol, + mPeriod, + 0, + mLoopBackBars); + Copy( + candles, + result.candles); + Clean(candles); + + // + result.xhkInfo = mXHKHelper.GetInfo(barIndex); + result.xtmInfo = mXTMHelper.GetInfo(barIndex); + result.xpvInfo = mXPVHelper.GetInfo(barIndex); + result.xoscInfo = mXOSCHelper.GetInfo(barIndex); + result.xamaInfo = mXAMAHelper.GetInfo(barIndex); + result.xmrbInfo = mXMRBHelper.GetInfo(barIndex); + result.xcheInfo = mXCHEHelper.GetInfo(barIndex); + result.xichInfo = mXICHHelper.GetInfo(barIndex); + result.xtrndInfo = mXTRNDHelper.GetInfo(barIndex); + result.xsslcInfo = mXSSLCHelper.GetInfo(barIndex); + result.xhullInfo = mXHULLHelper.GetInfo(barIndex); + result.xstrInfo = mXSTRHelper.GetInfo(barIndex); + result.xfbbInfo = mXFBBHelper.GetInfo(barIndex); + result.xdemaInfo = mXDEMAHelper.GetInfo(barIndex); + + // + return result; + } + + // + bool GuardCheck(XGuard &guards[]) + { + // + bool result = false; + + // + Clean(guards); + + // + // Implement Guards Check ... + X121MarketConditions mConditions = GetMarketConditions(1); + X121MarketConditions mConditions2 = GetMarketConditions(2); + + // + XOHCL c0 = GetCandle( + mSymbol, + mPeriod, + 0); + double c0Price = MathMin(c0.low, c0.close); + + // + double ll1 = GetLowestLow( + mSymbol, + mPeriod, + 3, + 1); + double ll2 = GetLowestLow( + mSymbol, + mPeriod, + 3, + 2); + + // + bool isXAMACrossedUnderXTM = + // + mConditions.xamaInfo.value < mConditions.xtmInfo.value && + mConditions2.xamaInfo.value >= mConditions2.xtmInfo.value + // + ; + + // + // X786 ... + bool canCheckX786 = IsAllowdSignaller(X786); + if (canCheckX786) + { + // + } + + // + // X92 ... + bool canCheckX92 = IsAllowdSignaller(X92); + if (canCheckX92) + { + } + + // + // X110 ... + bool canCheckX110 = IsAllowdSignaller(X110); + if (canCheckX110) + { + // + } + + // + // X121 ... + bool canCheckX121 = IsAllowdSignaller(X121); + if (canCheckX121) + { + // + } + + // + // X128 ... + bool canCheckX128 = IsAllowdSignaller(X128); + if (canCheckX128) + { + // + } + + // + result = ArraySize(guards) > 0; + + // + return result; + } + + // + // Add Specific On SignalConditions Event Handler ... + int AddOnSignalConditionEventHandler(TOnSignalConditions handler) + { + // + ArrayResize( + mSignalConditionsEventHandlers, + ArraySize(mSignalConditionsEventHandlers) + 1); + + // + int result = ArraySize(mSignalConditionsEventHandlers) - 1; + mSignalConditionsEventHandlers[result] = handler; + + // + return result; + } + + // + // Remove All On Signal Event Handler ... + void ReoveOnSignalEventHandlers() + { + // + ArrayFree(mSignalConditionsEventHandlers); + } + + // + // Notify a Signal Found on all Event Listeners ... + void NotifyOnSignalConditionsEvent(X121MarketConditions &info) + { + // + int listenerCount = ArraySize(mSignalConditionsEventHandlers); + if (listenerCount <= 0) + { + return; + } + + // + // Loop Through Listeners ... + for (int i = 0; i < listenerCount; i++) + { + // + TOnSignalConditions listener = mSignalConditionsEventHandlers[i]; + + // + listener(info); + } + } + + // + // PIVOTS ... + + // + void ProccessPivotPoints() + { + // + if (mStartPivotScan) + { + return; + } + + // + mStartPivotScan = true; + + // + int maxLength = GetMaxLength(); + int cBars = GetCalculatedBars(); + int scanSize = cBars - maxLength - 1; + for (int i = 1; i < scanSize; i++) + { + // + UpdatePivotPoints(i); + + // + int pivotsCount = CountPivots(); + if (pivotsCount >= mMinPivots) + { + break; + } + } + } + + // + int CountPivots() + { + // + int pivotSizes[]; + int upZoneCount = ArraySize(upZonePivots); + if (upZoneCount > 0) + { + // + Add( + upZoneCount, + pivotSizes); + } + + // + int downZoneCount = ArraySize(downZonePivots); + if (downZoneCount > 0) + { + // + Add( + downZoneCount, + pivotSizes); + } + + // + int peaksCount = ArraySize(peaksPivots); + if (peaksCount > 0) + { + // + Add( + peaksCount, + pivotSizes); + } + + // + int valesCount = ArraySize(valesPivots); + if (valesCount > 0) + { + // + Add( + valesCount, + pivotSizes); + } + + // + int fibsCount = ArraySize(fiboPivots); + if (fibsCount > 0) + { + // + Add( + fibsCount, + pivotSizes); + } + + // + int ichsCount = ArraySize(ichPivots); + if (ichsCount > 0) + { + // + Add( + ichsCount, + pivotSizes); + } + + // + int result = ArraySize(pivotSizes) > 0 + ? pivotSizes[ArrayMaximum(pivotSizes)] + : 0; + + // + return result; + } + + // + // Generate Exists Support and Resistance based on Given Price ... + XOHCLSupRes GenerateSupportAndResistance( + double price, // Specified Price + int count = 10 // Number of Pivots in Each Side + ) + { + // + XOHCLSupRes result; + + // + UpdatePivotPoints(0); + + // + double pivots[]; + FillPivotPoints(pivots); + + // + // Generate Support and Resistances ... + result = ExtractSupportAndResistance( + price, + pivots, + count); + + // + return result; + } + + // + // Protected ... +protected: + // + // Private ... +private: + // + // CCandle Timer ... + int mCTimerHandler; + + // + // Signal Event Handlers ... + TOnSignalConditions mSignalConditionsEventHandlers[]; + + // + // Make Provided Config in Clean Style ... + void PrepareConfig(X121ProviderInputs &config) + { + // + cleanConfig = config; + + // + // XCT ... + // Candle Timing ... + cleanConfig.xctConfig.showCandleTime = false; + + // + // XCC ... + // Candle Styling ... + cleanConfig.xccConfig.showCandles = true; + + // + // XHK ... + // HikenAshi Candle Representing ... + cleanConfig.xhkConfig.drawCandles = false; + cleanConfig.xhkConfig.drawCandleLines = false; + + // + // XTM ... + // Trend Magic ... + cleanConfig.xtmConfig.showLine = false; + + // + // XPV ... + // Peaks And Vales ... + cleanConfig.xpvConfig.showPeaksAndVales = false; + cleanConfig.xpvConfig.showLevels = false; + cleanConfig.xpvConfig.showFibo1Levels = false; + cleanConfig.xpvConfig.showFibo2Levels = false; + cleanConfig.xpvConfig.showFibo3Levels = false; + + // + // XAMA ... + // Adaptive Moving Average ... + cleanConfig.xamaConfig.showLine = false; + + // + // XMRB ... + // Moving Average Ribbon ... + cleanConfig.xmrbConfig.showFastMa = false; + cleanConfig.xmrbConfig.showSlowMa = false; + cleanConfig.xmrbConfig.showRibbon = false; + + // + // XCHE ... + // Chandelier Exit Points ... + cleanConfig.xcheConfig.showLongExit1Line = false; + cleanConfig.xcheConfig.showShortExit1Line = false; + cleanConfig.xcheConfig.showLongExit2Line = false; + cleanConfig.xcheConfig.showShortExit2Line = false; + + // + // XICH ... + // Ichimopku Kinko Hyo ... + cleanConfig.xichConfig.showTenkanSen = false; + cleanConfig.xichConfig.showKijunSen = false; + cleanConfig.xichConfig.showKijunSenPlus = false; + cleanConfig.xichConfig.showKijunSenNegative = false; + cleanConfig.xichConfig.showChikouSpan = false; + cleanConfig.xichConfig.showSenkouSpanA = false; + cleanConfig.xichConfig.showSenkouSpanB = false; + cleanConfig.xichConfig.showKumo = false; + + // + // XTRND ... + // Trend Detector ... + cleanConfig.xtrndConfig.showConsolidations = false; + cleanConfig.xtrndConfig.showTrend = false; + cleanConfig.xtrndConfig.showL1Trend = false; + cleanConfig.xtrndConfig.showL2Trend = false; + cleanConfig.xtrndConfig.showL3Trend = false; + + // + // XSSLC ... + // SSL Channel ... + cleanConfig.xsslcConfig.showUp = false; + cleanConfig.xsslcConfig.showDown = false; + + // + // XHULL ... + // Hull Trend Detection Channel ... + cleanConfig.xhullConfig.showUpZone = false; + cleanConfig.xhullConfig.showDownZone = false; + + // + // XSTR ... + cleanConfig.xstrConfig.showTrends = false; + cleanConfig.xstrConfig.fillTrends = false; + + // + // XFBB ... + cleanConfig.xfbbConfig.showBand = false; + cleanConfig.xfbbConfig.showGoldenArea = false; + cleanConfig.xfbbConfig.showOthers = false; + + // + // XDEMA ... + cleanConfig.xdemaConfig.showDema = false; + cleanConfig.xdemaConfig.showEMA = false; + cleanConfig.xdemaConfig.showEMAOfEMA = false; + + // + providedConfig = config; + currentConfig = config; + } + + // + void Calculate(int barIndex) + { + // + mXCTHelper.Calculate(barIndex); + mXCCHelper.Calculate(barIndex); + mXHKHelper.Calculate(barIndex); + mXTMHelper.Calculate(barIndex); + mXPVHelper.Calculate(barIndex); + mXAMAHelper.Calculate(barIndex); + mXMRBHelper.Calculate(barIndex); + mXCHEHelper.Calculate(barIndex); + mXICHHelper.Calculate(barIndex); + mXTRNDHelper.Calculate(barIndex); + mXSSLCHelper.Calculate(barIndex); + mXHULLHelper.Calculate(barIndex); + mXOSCHelper.Calculate(barIndex); + mXSTRHelper.Calculate(barIndex); + mXFBBHelper.Calculate(barIndex); + mXDEMAHelper.Calculate(barIndex); + } + + // + int mMinPivots; + bool mStartPivotScan; + double mLastMomentumStep; + + // + // Find Required Pivots for Support and Resistance ... + void UpdatePivotPoints( + int barIndex = 1 // Specified Candle ... + ) + { + // + Calculate(barIndex); + + // + // Detect Peask and Vales Pivots ... + + // + // Detect Hull Pivots ... + // find Hull Trend Changes ... + int idx = 1; + bool isHullUpChanged = + // + ( + // + (XHULL_ZONE_STATES)mXHULLHelper.upStateBuffer[idx] == XHULL_STATE_BULLISH && + (XHULL_ZONE_STATES)mXHULLHelper.upStateBuffer[idx + 1] != XHULL_STATE_BULLISH + // + ) + // + || + // + ( + // + (XHULL_ZONE_STATES)mXHULLHelper.upStateBuffer[idx] == XHULL_STATE_BEARISH && + (XHULL_ZONE_STATES)mXHULLHelper.upStateBuffer[idx + 1] != XHULL_STATE_BEARISH + // + ) + // + ; + + // + bool isHullDownChanged = + // + ( + // + (XHULL_ZONE_STATES)mXHULLHelper.downStateBuffer[idx] == XHULL_STATE_BULLISH && + (XHULL_ZONE_STATES)mXHULLHelper.downStateBuffer[idx + 1] != XHULL_STATE_BULLISH + // + ) + // + || + // + ( + // + (XHULL_ZONE_STATES)mXHULLHelper.downStateBuffer[idx] == XHULL_STATE_BEARISH && + (XHULL_ZONE_STATES)mXHULLHelper.downStateBuffer[idx + 1] != XHULL_STATE_BEARISH + // + ) + // + ; + + // + // Find Change State ... + if (isHullUpChanged || + isHullDownChanged) + { + // + AddIfNotExists( + mXHULLHelper.upBuffer[idx], + upZonePivots); + + // + AddIfNotExists( + mXHULLHelper.downBuffer[idx], + downZonePivots); + } + + // + // Find Momentom Step ... + if (isHullUpChanged && + isHullDownChanged) + { + // + mLastMomentumStep = MathAbs(mXHULLHelper.upBuffer[idx] - mXHULLHelper.downBuffer[idx]); + mLastMomentumStep = NormalizePrice( + mLastMomentumStep, + mSymbol); + } + + // + // Find Peaks and Vales ... + double selectedFib1 = mXPVHelper.fl1Buffer[idx]; + double selectedFib2 = mXPVHelper.fl2Buffer[idx]; + double selectedFib3 = mXPVHelper.fl3Buffer[idx]; + double selectedPeak = mXPVHelper.peaksBuffer[idx]; + double selectedVale = mXPVHelper.valesBuffer[idx]; + + // + double selectedTenkanSen = mXICHHelper.tenkanSenBuffer[idx]; + double selectedKijunSen = mXICHHelper.kijunSenBuffer[idx]; + + // + int fib1Verified = 0; + int fib2Verified = 0; + int fib3Verified = 0; + int peaksVerified = 0; + int valesVerified = 0; + int kijunSenVerified = 0; + int tenkanSenVerified = 0; + int senkouSpanAVerified = 0; + int senkouSpanBVerified = 0; + for (int i = barIndex + 1; i < pvConsequences + barIndex + 1; i++) + { + // + int idx = i - barIndex; + + // + // PEAKS and VALES ... + + // + if (selectedPeak == mXPVHelper.peaksBuffer[idx]) + { + peaksVerified++; + } + else + { + peaksVerified = 0; + } + + // + if (selectedVale == mXPVHelper.valesBuffer[idx]) + { + valesVerified++; + } + else + { + valesVerified = 0; + } + + // + if (selectedFib1 == mXPVHelper.fl1Buffer[idx]) + { + fib1Verified++; + } + else + { + fib1Verified = 0; + } + + // + if (selectedFib2 == mXPVHelper.fl2Buffer[idx]) + { + fib2Verified++; + } + else + { + fib2Verified = 0; + } + + // + if (selectedFib3 == mXPVHelper.fl3Buffer[idx]) + { + fib3Verified++; + } + else + { + fib3Verified = 0; + } + + // + // ICHIMOKU Kinko Hyo ... + + // + if (selectedTenkanSen == mXICHHelper.tenkanSenBuffer[idx]) + { + tenkanSenVerified++; + } + else + { + tenkanSenVerified = 0; + } + + // + if (selectedKijunSen == mXICHHelper.kijunSenBuffer[idx]) + { + kijunSenVerified++; + } + else + { + kijunSenVerified++; + } + } + + // + if (peaksVerified >= pvConsequences) + { + // + AddIfNotExists( + selectedPeak, + peaksPivots); + } + + // + if (valesVerified >= pvConsequences) + { + // + AddIfNotExists( + selectedVale, + valesPivots); + } + + // + if (fib1Verified >= pvConsequences) + { + // + AddIfNotExists( + selectedFib1, + fiboPivots); + } + + // + if (fib2Verified >= pvConsequences) + { + // + AddIfNotExists( + selectedFib2, + fiboPivots); + } + + // + if (fib3Verified >= pvConsequences) + { + // + AddIfNotExists( + selectedFib3, + fiboPivots); + } + + // + if (tenkanSenVerified >= pvConsequences) + { + // + AddIfNotExists( + selectedTenkanSen, + ichPivots); + } + + // + if (kijunSenVerified >= pvConsequences) + { + // + AddIfNotExists( + selectedKijunSen, + ichPivots); + } + + // // + // if (senkouSpanAVerified >= pvConsequences) + // { + // // + // AddIfNotExists( + // selectedSenkouSpanA, + // ichPivots); + // } + + // // + // if (senkouSpanBVerified >= pvConsequences) + // { + // // + // AddIfNotExists( + // selectedSenkouSpanB, + // ichPivots); + // } + } + + // + void FillPivotPoints( + double &result[]) + { + // + Clean(result); + + // + int pCount = CountPivots(); + if (pCount <= 0) + { + return; + } + + // + AddsIfNotExists( + upZonePivots, + result); + + // + AddsIfNotExists( + downZonePivots, + result); + + // + AddsIfNotExists( + peaksPivots, + result); + + // + AddsIfNotExists( + valesPivots, + result); + + // + AddsIfNotExists( + fiboPivots, + result); + + // + AddsIfNotExists( + ichPivots, + result); + } + + // + // Available Signallers ... + string mSignallers[]; + + // + // Here we are Capture Conditions and Check Signals ... + // The Signals Must be Unique for each providers ... + bool ProcessSignals(X121MarketConditions &conditions) + { + // + X121MarketConditions mConditions = GetMarketConditions(1); + + // + // BUY ... + + // + Clean(mConditions.signal); + bool hasLongSignal = HasLongSignal(mConditions); + if (hasLongSignal) + { + // + NotifyOnSignalEvent( + mConditions.signal); + NotifyOnSignalConditionsEvent(mConditions); + mWaitUntilNewCandle = true; + + // + conditions = mConditions; + return true; + } + + // + // SELL ... + + // + Clean(mConditions.signal); + bool hasShortignal = HasShortSignal(mConditions); + if (hasShortignal) + { + // + NotifyOnSignalEvent( + mConditions.signal); + NotifyOnSignalConditionsEvent(mConditions); + mWaitUntilNewCandle = true; + + // + conditions = mConditions; + return true; + } + + // + return false; + } + + // + // Check has Long Signal on Each Strategies ... + bool HasLongSignal(X121MarketConditions &conditions) + { + // + bool result = false; + + // + double xTPPoint = 10; + + // + double entry = GetEntry( + mSymbol, + POSITION_TYPE_BUY); + + // + XOHCL c0 = GetCandle( + mSymbol, + mPeriod, + 0); + + // + double c0SelectedPrice = MathMin(c0.close, c0.low); + c0SelectedPrice = MathMin(c0SelectedPrice, c0.open); + + // + XOHCL c1 = GetCandle( + mSymbol, + mPeriod, + 1); + bool isC1Bullish = IsBullishCandle(c1); + + // + XOHCL c2 = GetCandle( + mSymbol, + mPeriod, + 2); + bool isC2Bullish = IsBullishCandle(c2); + + // + XOHCL c3 = GetCandle( + mSymbol, + mPeriod, + 3); + bool isC3Bullish = IsBullishCandle(c3); + + // + double pivots[]; + FillPivotPoints(pivots); + XOHCLSupRes supRes = ExtractSupportAndResistance( + 1, + pivots, + 15); + X121MarketConditions mConditions = GetMarketConditions(1); + X121MarketConditions mConditions2 = GetMarketConditions(2); + + // + bool isMRBFastCrossedOverPVFL3 = + // + mConditions.xmrbInfo.fast > mConditions.xpvInfo.fl3 && + mConditions2.xmrbInfo.fast <= mConditions2.xpvInfo.fl3 + // + ; + + // + bool isMRBFastCrossedUnderPVFL3 = + // + mConditions.xmrbInfo.fast < mConditions.xpvInfo.fl3 && + mConditions2.xmrbInfo.fast >= mConditions2.xpvInfo.fl3 + // + ; + + // + bool isMRBFastCrossedWithPVFL3 = + // + isMRBFastCrossedOverPVFL3 || + isMRBFastCrossedUnderPVFL3 + // + ; + + // + bool isPeakHappens = + // + mConditions.xpvInfo.peak != mConditions2.xpvInfo.peak + // + ; + + // + bool isHKBullishCandle = + mConditions.xhkInfo.open < mConditions.xhkInfo.close; + + // + // DEMA Vale ... + double mDemaVale[]; + double mDeamPeak[]; + ArraySetAsSeries(mDemaVale, true); + ArraySetAsSeries(mDeamPeak, true); + ArrayCopy( + mDemaVale, + mXDEMAHelper.demaBuffer, + 0, + 5); + bool isDemaVale = IsInVale( + ArraySize(mDemaVale) - 1, + mDemaVale); + + // + Clean(mConditions.signal); + + // + // X786 ... + bool x786HasSignal = false; + bool canCheckX786 = IsAllowdSignaller(X786); + if (canCheckX786) + { + // + x786HasSignal = + // + ( + // + isPeakHappens && + mConditions.xpvInfo.isNewPeak && + mConditions.xpvInfo.peak > mConditions2.xpvInfo.peak + // + ) + // + && + // + ( + // + mConditions.xmrbInfo.isFastOverSlow && + ( + // + mConditions.xmrbInfo.isR1FastOverSlow && + (mConditions.xmrbInfo.isR1FastOverSlow || + mConditions.xmrbInfo.isR2FastOverSlow) + // + ) + // + ) + // + && + // + ( + // + mConditions.xcheInfo.longExit1 != EMPTY_VALUE && + mConditions.xcheInfo.longExit2 != EMPTY_VALUE && + mConditions2.xcheInfo.longExit1 != EMPTY_VALUE && + mConditions2.xcheInfo.longExit2 != EMPTY_VALUE + // + ) + // + && + // + ( + // + mConditions.xhullInfo.isUpBullish && + mConditions.xhullInfo.isDownBullish + // + ) + // + && + // + ( + // + c1.low > mConditions.xdemaInfo.dema && + c2.low > mConditions.xdemaInfo.dema && + c3.low > mConditions.xdemaInfo.dema + // + ) + // + && + // + ( + // + mConditions.xstrInfo.isTrendBullish + // + ) + // + ; + + // + if (x786HasSignal) + { + // + Add( + ToString(X786), + mConditions.signal.providers); + + // + // double slPoint = 15; + // double slPrice = PointToPrice( + // mConditions.symbol, + // slPoint); + // double sl = entry - slPrice; + + // + double tpPoint = xTPPoint; + double tpPrice = PointToPrice( + mConditions.symbol, + tpPoint); + double tp = entry + tpPrice; + + // + mConditions.signal.r2r = 1; + mConditions.signal.riskAmount = 0.01; + mConditions.signal.mode = X_ORDER_MODE_MARKET; + mConditions.signal.entry = entry; + mConditions.signal.sl = 0; + mConditions.signal.tp = tp; + + // + mConditions.signal.ignoreSL = true; + mConditions.signal.useRiskAmountAsVolume = true; + } + } + + // + // X92 ... + bool x92HasSignal = false; + bool canCheckX92 = IsAllowdSignaller(X92); + if (canCheckX92) + { + // + x92HasSignal = + // + mConditions.xtrndInfo.isTrendDownBullish && + mConditions.xtrndInfo.isL1TrendDownBullish && + mConditions.xtrndInfo.isL2TrendDownBullish + // + ; + + // + if (x92HasSignal) + { + // + Add( + ToString(X92), + mConditions.signal.providers); + + // + double tpPoint = xTPPoint; + double tpPrice = PointToPrice( + mConditions.symbol, + tpPoint); + double tp = entry + tpPrice; + + // + double sl = 0; + + // + mConditions.signal.sl = sl; + mConditions.signal.tp = tp; + mConditions.signal.r2r = 1.5; + mConditions.signal.entry = entry; + mConditions.signal.riskAmount = 0.01; + mConditions.signal.mode = X_ORDER_MODE_MARKET; + + // + mConditions.signal.ignoreSL = false; + mConditions.signal.ignoreTP = false; + mConditions.signal.calculateTP = false; + mConditions.signal.useRiskAmountAsVolume = true; + } + } + + // + // X110 ... + bool x110HasSignal = false; + bool canCheckX110 = IsAllowdSignaller(X110); + if (canCheckX110) + { + // + x110HasSignal = + // + isMRBFastCrossedWithPVFL3 && + mConditions.xtmInfo.isBullish + // + ; + + // + if (x110HasSignal) + { + // + Add( + ToString(X110), + mConditions.signal.providers); + + // + // double slPoint = 10; + // double slPrice = PointToPrice( + // mConditions.symbol, + // slPoint); + // double sl = entry + slPrice; + + // + double tpPoint = xTPPoint; + double tpPrice = PointToPrice( + mConditions.symbol, + tpPoint); + double tp = entry + tpPrice; + + // + mConditions.signal.r2r = 1; + mConditions.signal.riskAmount = 0.005; + mConditions.signal.mode = X_ORDER_MODE_MARKET; + mConditions.signal.entry = entry; + mConditions.signal.sl = 0; + mConditions.signal.tp = tp; + + // + mConditions.signal.ignoreSL = true; + mConditions.signal.useRiskAmountAsVolume = true; + } + } + + // + // X121 ... + bool x121HasSignal = false; + bool canCheckX121 = IsAllowdSignaller(X121); + if (canCheckX121) + { + // + x121HasSignal = + // + ( + // + ( + // + isC1Bullish && + (isC2Bullish || + isC3Bullish) + // + ) + // + && + // + c2.open > c3.open && + c1.open > c2.open + // + ) + // + && + // + (mConditions.xpvInfo.fl3 == mConditions2.xpvInfo.fl3) + // + && + // + ( + // + c3.low < mConditions.xpvInfo.fl3 && + c2.low >= mConditions.xpvInfo.fl3 && + ( + // + c2.high >= mConditions.xpvInfo.fl1 + // + || + // + ( + // + c2.high < mConditions.xpvInfo.fl1 && + c2.high > mConditions.xpvInfo.fl2 && + c1.low < mConditions.xpvInfo.fl1 && + c1.high > mConditions.xpvInfo.fl1 + // + ) + // + ) + // + && + // + c0SelectedPrice > mConditions.xpvInfo.fl1 + // + ) + // + ; + + // + if (x121HasSignal) + { + // + Add( + ToString(X121), + mConditions.signal.providers); + + // + // double slPoint = 15; + // double slPrice = PointToPrice( + // mConditions.symbol, + // slPoint); + // double sl = entry - slPrice; + + // + double tpPoint = xTPPoint; + double tpPrice = PointToPrice( + mConditions.symbol, + tpPoint); + double tp = entry + tpPrice; + + // + mConditions.signal.r2r = 1; + mConditions.signal.riskAmount = 0.01; + mConditions.signal.mode = X_ORDER_MODE_MARKET; + mConditions.signal.entry = entry; + mConditions.signal.sl = 0; + mConditions.signal.tp = tp; + + // + mConditions.signal.ignoreSL = true; + mConditions.signal.useRiskAmountAsVolume = true; + } + } + + // + // X128 ... + bool x128HasSignal = false; + bool canCheckX128 = IsAllowdSignaller(X128); + if (canCheckX128) + { + // + x128HasSignal = + // + isPeakHappens && + mConditions.xamaInfo.value > mConditions.xtmInfo.value + // + ; + + // + if (x128HasSignal) + { + // + Add( + ToString(X128), + mConditions.signal.providers); + + // + // double slPoint = 15; + // double slPrice = PointToPrice( + // mConditions.symbol, + // slPoint); + // double sl = entry - slPrice; + + // + double tpPoint = xTPPoint; + double tpPrice = PointToPrice( + mConditions.symbol, + tpPoint); + double tp = entry + tpPrice; + + // + mConditions.signal.r2r = 1; + mConditions.signal.riskAmount = 0.01; + mConditions.signal.mode = X_ORDER_MODE_MARKET; + mConditions.signal.entry = entry; + mConditions.signal.sl = 0; + mConditions.signal.tp = tp; + + // + mConditions.signal.ignoreSL = true; + mConditions.signal.useRiskAmountAsVolume = true; + } + } + + // + result = + // + x786HasSignal + // + || + // + x92HasSignal + // + || + // + x110HasSignal + // + || + // + x121HasSignal + // + || + // + x128HasSignal + // + ; + + // + if (result) + { + // + conditions = mConditions; + + // + conditions.supportResistances = supRes; + conditions.momentumStep = mLastMomentumStep; + + // + conditions.signal.symbol = mSymbol; + conditions.signal.period = mPeriod; + conditions.signal.type = POSITION_TYPE_BUY; + + // + conditions.hasSignal = true; + + // + bool drawVLine = false; + if (drawVLine) + { + // + ulong tick = MathRand() * 10000; + + // + DrawVerticalLine( + 0, + ToString(tick), + 0, + iTime( + mSymbol, + mPeriod, + 0), + clrYellow); + } + } + + // + return result; + } + + // + // Check has Short Signal on Each Strategies ... + bool HasShortSignal(X121MarketConditions &conditions) + { + // + bool result = false; + + // + double xTPPoint = 10; + + // + double entry = GetEntry( + mSymbol, + POSITION_TYPE_SELL); + + // + XOHCL c0 = GetCandle( + mSymbol, + mPeriod, + 0); + + // + double c0SelectedPrice = MathMin(c0.close, c0.low); + c0SelectedPrice = MathMin(c0SelectedPrice, c0.open); + + // + XOHCL c1 = GetCandle( + mSymbol, + mPeriod, + 1); + bool isC1Bearish = IsBearishCandle(c1); + + // + XOHCL c2 = GetCandle( + mSymbol, + mPeriod, + 2); + bool isC2Bearish = IsBearishCandle(c2); + + // + XOHCL c3 = GetCandle( + mSymbol, + mPeriod, + 3); + bool isC3Bearish = IsBearishCandle(c3); + + // + double pivots[]; + FillPivotPoints(pivots); + XOHCLSupRes supRes = ExtractSupportAndResistance( + 1, + pivots, + 15); + X121MarketConditions mConditions = GetMarketConditions(1); + X121MarketConditions mConditions2 = GetMarketConditions(2); + + // + bool isMRBSlowCrossedOverPVFL3 = + // + mConditions.xmrbInfo.slow > mConditions.xpvInfo.fl3 && + mConditions2.xmrbInfo.slow <= mConditions2.xpvInfo.fl3 + // + ; + + // + bool isMRBSlowCrossedUnderPVFL3 = + // + mConditions.xmrbInfo.slow < mConditions.xpvInfo.fl3 && + mConditions2.xmrbInfo.slow >= mConditions2.xpvInfo.fl3 + // + ; + + // + bool isMRBSlowCrossedWithPVFL3 = + // + isMRBSlowCrossedOverPVFL3 || + isMRBSlowCrossedUnderPVFL3 + // + ; + + // + bool isValeHappens = + // + mConditions.xpvInfo.vale != mConditions2.xpvInfo.vale + // + ; + + // + Clean(mConditions.signal); + + // + // X786 ... + bool x786HasSignal = false; + bool canCheckX786 = IsAllowdSignaller(X786); + if (canCheckX786) + { + // + x786HasSignal = + // + ( + // + isValeHappens && + mConditions.xpvInfo.isNewVale && + mConditions.xpvInfo.vale < mConditions2.xpvInfo.vale + // + ) + // + && + // + ( + // + mConditions.xmrbInfo.isFastUnderSlow && + ( + // + mConditions.xmrbInfo.isR1FastUnderSlow && + (mConditions.xmrbInfo.isR1FastUnderSlow || + mConditions.xmrbInfo.isR2FastUnderSlow) + // + ) + // + ) + // + && + // + ( + // + mConditions.xcheInfo.shortExit1 != EMPTY_VALUE && + mConditions.xcheInfo.shortExit2 != EMPTY_VALUE && + mConditions2.xcheInfo.shortExit1 != EMPTY_VALUE && + mConditions2.xcheInfo.shortExit2 != EMPTY_VALUE + // + ) + // + && + // + ( + // + mConditions.xhullInfo.isUpBearish && + mConditions.xhullInfo.isDownBearish + // + ) + // + && + // + ( + // + c1.high < mConditions.xdemaInfo.dema && + c2.high < mConditions.xdemaInfo.dema && + c3.high < mConditions.xdemaInfo.dema + // + ) + // + && + // + ( + // + mConditions.xstrInfo.isTrendBearish + // + ) + // + ; + + // + if (x786HasSignal) + { + // + Add( + ToString(X786), + mConditions.signal.providers); + + // + // double slPoint = 15; + // double slPrice = PointToPrice( + // mConditions.symbol, + // slPoint); + // double sl = entry - slPrice; + + // + double tpPoint = xTPPoint; + double tpPrice = PointToPrice( + mConditions.symbol, + tpPoint); + double tp = entry - tpPrice; + + // + mConditions.signal.r2r = 1; + mConditions.signal.riskAmount = 0.01; + mConditions.signal.mode = X_ORDER_MODE_MARKET; + mConditions.signal.entry = entry; + mConditions.signal.sl = 0; + mConditions.signal.tp = tp; + + // + mConditions.signal.ignoreSL = true; + mConditions.signal.useRiskAmountAsVolume = true; + } + } + + // + // X92 ... + bool x92HasSignal = false; + bool canCheckX92 = IsAllowdSignaller(X92); + if (canCheckX92) + { + // + x92HasSignal = + // + mConditions.xtrndInfo.isTrendUpBearish && + mConditions.xtrndInfo.isL1TrendUpBearish && + mConditions.xtrndInfo.isL2TrendUpBearish && + false + // + ; + + // + if (x92HasSignal) + { + // + Add( + ToString(X92), + mConditions.signal.providers); + + // + double tpPoint = xTPPoint; + double tpPrice = PointToPrice( + mConditions.symbol, + tpPoint); + double tp = entry - tpPrice; + + // + mConditions.signal.sl = 0; + mConditions.signal.tp = tp; + mConditions.signal.r2r = 1.5; + mConditions.signal.entry = entry; + mConditions.signal.riskAmount = 0.01; + mConditions.signal.mode = X_ORDER_MODE_MARKET; + + // + mConditions.signal.ignoreSL = false; + mConditions.signal.ignoreTP = false; + mConditions.signal.calculateTP = false; + mConditions.signal.useRiskAmountAsVolume = true; + } + } + + // + // X110 ... + bool x110HasSignal = false; + bool canCheckX110 = IsAllowdSignaller(X110); + if (canCheckX110) + { + // + x110HasSignal = + // + isMRBSlowCrossedWithPVFL3 && + mConditions.xtmInfo.isBearish + // + ; + + // + if (x110HasSignal) + { + // + Add( + ToString(X110), + mConditions.signal.providers); + + // + // double slPoint = 15; + // double slPrice = PointToPrice( + // mConditions.symbol, + // slPoint); + // double sl = entry + slPrice; + + // + double tpPoint = xTPPoint; + double tpPrice = PointToPrice( + mConditions.symbol, + tpPoint); + double tp = entry - tpPrice; + + // + mConditions.signal.r2r = 1; + mConditions.signal.riskAmount = 0.005; + mConditions.signal.mode = X_ORDER_MODE_MARKET; + mConditions.signal.entry = entry; + mConditions.signal.sl = 0; + mConditions.signal.tp = tp; + + // + mConditions.signal.ignoreSL = true; + mConditions.signal.useRiskAmountAsVolume = true; + } + } + + // + // X121 ... + bool x121HasSignal = false; + bool canCheckX121 = IsAllowdSignaller(X121); + if (canCheckX121) + { + // + x121HasSignal = + // + ( + // + ( + // + isC1Bearish && + (isC2Bearish || + isC3Bearish) + // + ) + // + && + // + c2.open < c3.open && + c1.open < c2.open + // + ) + // + && + // + (mConditions.xpvInfo.fl3 == mConditions2.xpvInfo.fl3) + // + && + // + ( + // + c3.high > mConditions.xpvInfo.fl1 && + c2.low <= mConditions.xpvInfo.fl1 && + ( + // + c2.low <= mConditions.xpvInfo.fl3 + // + || + // + ( + // + c2.low > mConditions.xpvInfo.fl3 && + c2.low < mConditions.xpvInfo.fl2 && + c1.high > mConditions.xpvInfo.fl3 && + c1.low < mConditions.xpvInfo.fl3 + // + ) + // + ) + // + && + // + c0SelectedPrice < mConditions.xpvInfo.fl3 + // + ) + // + ; + + // + if (x121HasSignal) + { + // + Add( + ToString(X121), + mConditions.signal.providers); + + // + // double slPoint = 15; + // double slPrice = PointToPrice( + // mConditions.symbol, + // slPoint); + // double sl = entry - slPrice; + + // + double tpPoint = xTPPoint; + double tpPrice = PointToPrice( + mConditions.symbol, + tpPoint); + double tp = entry - tpPrice; + + // + mConditions.signal.r2r = 1; + mConditions.signal.riskAmount = 0.01; + mConditions.signal.mode = X_ORDER_MODE_MARKET; + mConditions.signal.entry = entry; + mConditions.signal.sl = 0; + mConditions.signal.tp = tp; + + // + mConditions.signal.ignoreSL = true; + mConditions.signal.useRiskAmountAsVolume = true; + } + } + + // + // X128 ... + bool x128HasSignal = false; + bool canCheckX128 = IsAllowdSignaller(X128); + if (canCheckX128) + { + // + x128HasSignal = + // + isValeHappens && + mConditions.xamaInfo.value < mConditions.xtmInfo.value + // + ; + + // + if (x128HasSignal) + { + // + Add( + ToString(X128), + mConditions.signal.providers); + + // + // double slPoint = 15; + // double slPrice = PointToPrice( + // mConditions.symbol, + // slPoint); + // double sl = entry + slPrice; + + // + double tpPoint = xTPPoint; + double tpPrice = PointToPrice( + mConditions.symbol, + tpPoint); + double tp = entry - tpPrice; + + // + mConditions.signal.r2r = 1; + mConditions.signal.riskAmount = 0.005; + mConditions.signal.mode = X_ORDER_MODE_MARKET; + mConditions.signal.entry = entry; + mConditions.signal.sl = 0; + mConditions.signal.tp = tp; + + // + mConditions.signal.ignoreSL = true; + mConditions.signal.useRiskAmountAsVolume = true; + } + } + + // + result = + // + x786HasSignal + // + || + // + x92HasSignal + // + || + // + x110HasSignal + // + || + // + x121HasSignal + // + || + // + x128HasSignal + // + ; + + // + if (result) + { + // + conditions = mConditions; + + // + conditions.supportResistances = supRes; + conditions.momentumStep = mLastMomentumStep; + + // + conditions.signal.symbol = mSymbol; + conditions.signal.period = mPeriod; + conditions.signal.type = POSITION_TYPE_SELL; + + // + conditions.hasSignal = true; + } + + // + return result; + } +}; + +// +// START Definitions ... +// + +// +// Model Signal Providers Definitions ... +struct X121SignalProvider +{ + // + // Provider use Which Symbol ... + string symbol; + + // + // Allowed Providers ... + string providers[]; + + // + // Provider use Which Time Frame ... + ENUM_TIMEFRAMES period; + + // + // Risk Amount Per Trades Related to Time Frames ... + // Percent of Available Balance ... + double riskAmount; + + // + // Provider ... + XSCX121Provider *provider; +}; + +// +// END Definitions ... +// + +// +// START Usefull Functions ... +// + +// +// Add Specific Provider to List ... +void Add( + X121SignalProvider &item, // item want to add + X121SignalProvider &buffer[] // Destination buffer +) +{ + // + ArrayResize( + buffer, + ArraySize(buffer) + 1); + + // + buffer[ArraySize(buffer) - 1] = item; +} + +// +// Generate Identifier Tag ... +string GenerateTag(X121SignalProvider &descriptor) +{ + // + string result = ""; + + // + result = descriptor.symbol + "," + ToString(descriptor.period); + + // + return result; +} + +// +// Converts a Signal provider to String ... +string ToString(ENUM_X121_SIGNAL_PROVIDERS provider) +{ + return EnumToString(provider); +} + +// +// convert an String to Signal provider ... +ENUM_X121_SIGNAL_PROVIDERS ToProvider(string provider) +{ + // + ENUM_X121_SIGNAL_PROVIDERS result = NONE; + + // + if (ToString(NONE) == provider) + { + result = NONE; + } + else if (ToString(X786) == provider) + { + result = X786; + } + else if (ToString(X92) == provider) + { + result = X92; + } + else if (ToString(X110) == provider) + { + result = X110; + } + else if (ToString(X121) == provider) + { + result = X121; + } + else if (ToString(X128) == provider) + { + result = X128; + } + + // + return result; +} + +// +// Extract Provider Type from Signal Commnet ... +ENUM_X121_SIGNAL_PROVIDERS ExtractPositionProvider(XPosition &position) +{ + // + ENUM_X121_SIGNAL_PROVIDERS result = NONE; + + // + string providerStr = + ExtractString( + position.comment, + XProviderToken + "(", + ")"); + if (StringLen(providerStr) <= 0) + { + return result; + } + + // + result = ToProvider(providerStr); + + // + return result; +} + +// +// List All Available Providers ... +void GetAllProviders( + ENUM_X121_SIGNAL_PROVIDERS &result[] // Hold Result ... +) +{ + // + Clean(result); + + // + // X786 ... + ArrayResize( + result, + ArraySize(result) + 1); + result[ArraySize(result) - 1] = X786; + + // + // X92 ... + ArrayResize( + result, + ArraySize(result) + 1); + result[ArraySize(result) - 1] = X92; + + // + // X110 ... + ArrayResize( + result, + ArraySize(result) + 1); + result[ArraySize(result) - 1] = X110; + + // + // X121 ... + ArrayResize( + result, + ArraySize(result) + 1); + result[ArraySize(result) - 1] = X121; + + // + // X128 ... + ArrayResize( + result, + ArraySize(result) + 1); + result[ArraySize(result) - 1] = X128; +} + +// +// Lis All Available Providers ... +void GetAllProviders( + string &result[] // Hold Result ... +) +{ + // + Clean(result); + + // + ENUM_X121_SIGNAL_PROVIDERS providers[]; + GetAllProviders(providers); + int providersCount = ArraySize(providers); + if (providersCount <= 0) + { + return; + } + + // + for (int i = 0; i < providersCount; i++) + { + // + ENUM_X121_SIGNAL_PROVIDERS iProvider = providers[i]; + + // + Add( + ToString(iProvider), + result); + } +} + +// +// END Usefull Functions ... +// diff --git a/MQLTestWorkspace/X121/Old/Classes/x-saherelm.x121.xea.class.ex5 b/MQLTestWorkspace/X121/Old/Classes/x-saherelm.x121.xea.class.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..b7209327c77385f1ff0f111ce8e9e61352e87ba6 GIT binary patch literal 13024 zcmdUVV{k4&vu14Dwrx9kW81cEoY=N)+qRvP6XV2ovgf;Z_usAB{kuIi(=$(xo}QYT znyMDpWCwKuDnSwg1NtYxKu7t^#EA4>kK|7YDKhvipZf1F8NiMgL*;|9bz& z^8d5^hq3EF54ZsF05Sec9{-gX{<6pHGPyh~eL9GyTuT{|6L{ ze+7oesSeps(+H29v`8D^OfHUXOKCXUB=h#ma)5K1@DS@nRHWHK97`? zcpVY~$wYXpJ*#1N_a`B;mM8%C+JIE& zkN;`w5N+u%ge~~I)}Bu>oVm*AgoM~!8^j&p8kv4nrq`GsJ^`X%Uuwte=ox(qmz#^y zRTBu}9&Vft?0?&TL!LGGM24sAo&z8lk_XHNgz88SLq%xfQq!(tTTE-k+56apEEEW& zJRM!3=~;n{%^qm*xEt4@bu*M{z zSr%;&Z7=EU1g_EZ0Tccmyy()se3Hg|ITvivuGWlw;|EDou=1I|;rZhSp17`viw=1uCMN;fh&*=y2VG3BiR6wuODN?lI{-?>w5E@ zrY;=a(jB(*U?gBR^epyd)7s%A3OVR*(pz6gy5rQV9($#|B>`%c$@;dOrU9ZBq}~1k zSL$RL$`~ETPC2Xd(8(Qa%BRW@#owpH;*vc@!ikPVjv3;jzy_(CiG@=S@rVbmiJonm zC{!?WMOfwh8M^^bAnTrM(43^6pTdqFdzWd4?@@`70K)Y8)6COa4>W7y6S;a5eVq{- z>c@_itzTUh&RHvoY#eZy+=T93419J1ZRW-<-bIvWxHa;4fokfnOlZnk7V3yKkqa>q zL9sE`$6>9gA%!uYR#N5*>6?KH6LNp-+zz@;ufuG=`bb0y zz+C^ZzkMr{MIKw3^_0h`$#CYs}2SOH3R@44ACkH3awUA9AXK0bikT=EMl&Ka8 zfp|h|ut^l&JF|90n)NR(Yx+hUuOj{NkO{xI;Z<{!Iuq;4ciFI|?;o9sIg4sQVQzUI z5p&%4RMoh7qF*pi^o}H)e3!Ps2vya~`>bvWSK{{%uqGXl?Z7{pti1Gl9T_b^fG5%I zlnH*ix}UvBX!ObiW5(yZn9MdcAr^@re3K*Mi6{jQ{>ygP%W&o;qeff5d{-litMz4b z4x5^C1_P;rLT}q%iE~8$#WPN(!Af#)RAf8-U?lM=bhtKL%%Z{AfjGAcpo)h8f8n6x ziw!ApKp}Q3l<@EbrWhTe2T8uXM{UKEO+Z-MvmU(=7ZCyntrspl3j75`Z2kKa(A4<) zS*$5T`<@Qgex zrgYXlXN*#gX`QJM^Y#|twOn0mY|flN0A`>rV)D|rq~C< zw%Bm?yAUG{)^QPOwmgZlqSo{KVwLoAWg4;!Q4_>*j!=m4>#U?Y=qD=pF@%fkMlYez z5Q1>+&s#2A-hwjt!w~p<8*rtD{#DH*L_h&y^O=lEW9VyufAcCauUnU?yomH5$;-Y_ zy?b?7SM>-0!Rj520ZUfti-|U zC-scRZ_hLKGT~CJ98Q;@yx&zK=hA4rICBBq58Vex>1ShmggcVXT#mAgXKb9ga~ z$MrtSpUR|5Oo@g!Lkgv7T1MxaBeQnllf!<&xtK!x(P9s{0aM$ipeZ1ck`A7H*vi1M zZn4iz?lm1R#;yP$yln*Y5Ghv^)nvofhHzkMNlwW->Gkqj!V!wnHp6l~bfEw$l=cof z-dXswtLwNiozGbQnLc5cH;wJ0ojctX(}*va8z`_GW`6UVOD-!~B#A$AX3+n!zCZ#` zaz$_%5S4e*u?h;%-?h88Y$5K`blPi((Cm5F2vf6eNwr#eWm7_cUNb1DdP%XRtC-LfQ^oCqH27P5Z7_*O{ z{aCcEV#OdWm+pdfA0$WA{XwP->Nh-kD>s%rL*d@ZUAJ}LedyDdFtd*-!NhlN#*rJ;B{P3rStA+spxoidZ5NkXl$JF6yM--Lrk zq^i*U5C)<8Vp^n2Zy2gqtQZJy=deqQ+vjC9lm>mj2~b^9dBVQo-<7I#Hm&UhzLpC^0_%p0))tI*FjbnV@3=OihdGW*PNhwW&f}(PRR6+{B;8`2$-l! zHkJ9&SJ5U1rx3~MF*-h{dc%)+Vn7wNurf^W`!~=7(TP+zNU&T-GMXEC{ausBw4v86 z<--_>3)1=6xWxVl$8^GB^!uL{17qp-m^*aQ&O5>-@OH?e6o_CQ{iwu0Z(P?k5|eGNQoK#~&)X-Y!hE(%L{Wnq3GijOJG5Oe*S^+e(3+2&vd3K3bhcyMata z!5ys`N9~sNQql^L&02C*g=?Wo!X1;!fIg!~Wz>&!uA%2aNoNw>}Jiot6Eb&+mgeqBN$9yLLYU>I_0HQ zS(pf)p0E_2q%mJQj^|(gGw5qeN~G2^d4^&WWLq-zpP7%lF#=XJq?cC%+=q-8!pDIu zPB+}(BHnKidJq}U?(rB=I# z<*(52J8JoH=JC}E?+dR*(shSS1#dSDZglesr{-?sGn%wovT&%gY<%*MdyKE^o)4`) zriPsGyRPB znA3yZp&puBM~Hvy59bq;?3LuUAyu~Fw#AeX)dpUN1euM+%G+8xXxU{AF~4a-%jg&) zJW$RjG@eSwHxgSn?Pk`K9Nn5MjclT!RUQ-k|tXy}5HUyau zFRx*4zBW~0Kij}R#2_I&yn4KOEOve!ua)k%|BDf6^j7>g4R)K6w&kkf6z-Z?b=ZfR zNb2&K$_}2_R+pX-+TgikQ~w#`HbvB)+)jYI`tyr1log|e;}*|d8R?pQapg9(`ESX5 z|IjTOP3g|?^sU|grhN#29K4dEWpY|{y_t%^rL@{y!fhWAvV4&?#p}e$w1OHKV}ZQW;ic|Ggb!Jdf$m5#W*A`%csT@< zYPPo54VCw213_g%FrjD>O9~s3!x=fjt!15HVM{#cIvtCbrnrr_(D^*@4{78$USa@!du2Njr0l%~?9g0FZQn zJWjJ=4l30@7{%-|fD4l*Qu~%Y<{_)n?}5EAVm}kvHjPT!oX#QRzoLMY!u}ZqL5Gra zdh&>jaW!Dsp(Q3;Of$r<^SZ97HqUG1`p%@(1NKzZF?b>JjfvsnlGts8E1;Uu7UDby z>pkI1;`QOzW7Key(Ik!$W;96IGf}lL#KBSifQOByu5{7E=#oHh%G<2fOZ+Ri1tKdW z>o@z@9dwlB1{2*!uAA_*oBc*S%|~n`%2PLGHxp+-+%xAd3Pz+26dn(hKJpp{6CUDQoz zn7SU*zNv}Xo88@^4ouA(T1^DLmox=-@DSKpv1>HR0#P`ipK6 z1hcu>Xvl1nlsjUpu{I(?9T*xP8-|Ler#?$LCE1^lkh zDbbIhtd2ef&x6~R=p^FXnjls9ofS?=cd&*Jr=UO0Pru~Qa0Z`RaP<_0-s;Lh>IsBp z*`RXTd|>z79Db!RSoIyhBMs&T6MLMZMk1zzkIc><7aTbE6j=c*o^NC94?{SnSgB`1Z}awIz3_3{ z<69GsdaBU%P)Zo|Zcq~3QUEaUw30H|f7yCcNbxFF%G@AEPQfNfb>;CrOrl9hS^_4> zgbMtYA}5=HF?+Gx=q{Yxy<0i=R|j~&sSX$d1E-DOOVsq?TXXJr!P=z=bd7;A`Fejty+@M?a5RkdbjBx1bH4grnEFpgTgb(CJL%7wXoP53 zp08o}Tq7R^uV&k@88ok9?6kTo>|~crYPZ-OFimocz#Tc0iD5S`d7{K!NE)MYc~VZE zuks(6_UkYjeu^P6%x3y9{MI@A3L#4sPLqYZ;~Iq0qD?6jMEN?m41U*7pG-mMy;DgR zK#U&?4sne^x42ay|Ng_vFje9sayU4=UySOKMpLTaViY4mKoezp5s?|?!}co{EzN7P z8OyFizjnU*a8`W)#oGWEqAIpYxaK>*aZr`1L!C$SsDwmD{u}6JB{6%W?3btt&qtko zZk9RM-}SrnN9xrX&?kbCo;A*D5nm>wD~u%-#}^z~Nb`PJvOzHY@2oG`Ssx=nWgP3% zxts^BH0B?4^3!)4bKEuT?4n5n;`nlS=cjbDGEz}O0V$4Q&Yp6nUc%ta@a(tO#OOFo z);VRn6yzmY`04BQfT*{t|KQ9TyYv#&pOD za^lf?rjEeAUNMUf#I5~_if>90+QX+g4M7CeuPQIhfo|32);Lc5}**$+G&18Cdkh zf+xP^IDUU9d84pE?SlFU9L;cWX&*W)7lr7vlll@1y2O@&* zm{0|+3&P30wCGd0oMD`FT~GslI4*1P0Uh{rUTtu^t@JIAdcx;hw5Bx9G<3&~rLh5J z^xSB5VAtyHyxa1l&u2Y0|9Fyra{6l<^wVV?b79fV5t#oDKW#$+#J3SuK&+G3ti7u@f#So?=Hj)6n7D zOFl&l=-nLyMJgoJv_#1Ne*fmN^RM#t-puE( zI;MjZ81(7{L45u)Hwd&;S{oko^1C(pU2nUoSh5NRhZqm<2$Scf^Qoyr;SMrDyhF;T zVy8LxpRJH7u>?of6uJwY1TK=*GcaVze$!VS77L&9i2v@uc!bRm${xKGWa_&m8%0EV z)E||kuft!&Od_{B1rYCpLs#|wiWL`G6zmc`UUkAHG!VE$r$sp3f_Il$ycq3#b(k0{@hhkdm{u$Zi}es!H~%k#e%zj^_rj-=S-fd;<0>CAb-lE+ zm(Y7S%t!x*%B8HE)}7`+L2t34YFhcub@!}^rCytR=NoDMDdWbt%?XnI+96}kz|ik; z08s~TCJd2kESG-0&P&G4(!t3V6`$_fFObO04*8Zm&kh9Lg|$=_NmEBl9iX`?uRi#A z_aC4MQKmRt-ZmfweTC$?sqvw4SE+Ytvx+pt8Fq9f}?Ack*l~_5e}msdz`#no&j-VlS)9 z7V@7`ho#}D=L&dt_crj%$8(=7GW_MK+D}$S{@rycY(d;SeBr5&jX2k|Y~GW(AW;z& zC2+1nzaA4wer*FdB<66XEStM_H}I+*d>n#8INS$yyV)-8g0d-Hb=G*zp2Z%F5XWSA zf~VNlb`s5tCTsu^OlgBJn&V`Ew0a$@Qf+T8?KiB$hrH(3nJjrtK_qjmVK}hu95s~! zb^`zTShCJVML9cp6C{PXNN)SmYo@(XXfoXwQvVGBV_fh|39MF0cP|#R?GyuONP3sU zcF+cUU5KtP{D=MMw4PjJ-(7FfWR^_(^CJq{4%Ne7OonItW1l7kJ$H^yjPElY0jD^3W?@e(+Jy(vlfkpGp&U zABt>mo`<{ct>5m9P**!Gv8=9s$55ZIcw`Mz`7km8?Zg~P*wJsJR(+-K^%V2YPG$(Uyu=+b;d?Uk38>u8U1i>Mf+$ajU z=sCM0A#$`I6Kr3^01Rt{Llq|4hd(jCwmL^DwM3wB83;83^pLG4zHQ``-8%PVkl@*k z-F4PACd67WrsC+INmpa4Vhf28ep6Uxi@1PJokYy*3I`P-==3k?U*Xu2U6Z1{@z&nI zdIH0-b|K@B+%_EI<$Ctq`0t=`8Ymm&V=qOnKrPJWt<9;pGRIyx^OOBck>xRm%6R@= zUpmJLg2U~wOKRQ9%#znl_G1}KWy=iU>bF}?H8UyPDUB1O_fb4fDji^NZw{R=EyO9e zOomg+{%F!jZWPLh)s=Y8(ldv1lG`hk>DW-ZFV^)7+H&&B-5PBYI9Bi~<87)%Sc^n@ z(LvLA2B5@v9m`uRsKJWfzusWpN9xMxq2(wtFGkuo+!Hq;F8)0YmCSV~@!BQ*3OJ}l zuYY)ayR{Ay97x9$PK+HY(dH%fgwSg!`i@@rAQTfzT0_c(89TI;o60v+BZ62ZA=BHn zWmu)UM?4DOlWUqfcFUDdm)XE3qpkLsQN6*_<*pN%$$d7`DuqKYG-5~V&uncSL+g4~8BOwEa5#>SMwS!3w&@1ln9HAk1G zO*E$HKnYiuQY`&o(YZFvh2psSB{B*?6CRs#ThgD@%09t$RNPVMP`HCGs9s$3%G!|o zm=Y#m%Na!XPoY|aQx+mvt=gsfgOQM0P+IA<4vtl0<;^QUv?J zNi28h%G<+j4Hag4gM~5mi#D888#4r!_J3Y;q=6XyRvi-}s3lfdw2W;I?E`%kRi{4a z9IwjX9|^$ST9J}1R$Bzmnl(g){fj4)2eSEB8 z!z`;{bq&{#W2)OZ>>?7>XV1}>Xchv(7TBUKzZXz`D3jtJMd?M z+yco4Fm#=Ju;{uU&T)vUSga}7QS~B+eas#UsDluYlKKNOiUbgbELl0Z%-f;L z`HX3q^Psx(z02KHZ*iXkeZGysTE~C@x^Oj^If3g|h zZc8GLc_0O)5wu{y!vmDOzog?FAn>eq40Ib!pfdexd3UR9KtHXkG z*#%TT^Ds<#hAXQ%(0SXq3c;_Xx;0VGtwjU#;5C zEkE$advn<#-qD)JO`>jOY3rb8XdA|DT~{<|;xVJGDcai-Se8g?iO7Eke{xloX~Jzh zjhljDxBq_m>H5{e5+9S@geH^U18nuAqBM>2M1slIM7Ip{lxp3Om(ULCNw$sSxN+(z zXEsUpdnBx(49i>!_%hg)h1;9nP~?LOWrh1}MXQulF@JvLt4Sb|iICvkOG4>AHB&U7 zyy$$Eyi^_n7K8+s+Z2l=^#ypBijvVhAH`s0It*hIi?LvcTnm7bqIa|&x zem9D?DDRU>_i1O)JhWS26P2lE&%FVu2~p3x?7j%ir(3TkcaD^l0H$GtcE~gYtkhtY zp>K+KRDSZ4(@bRF_(c1N-=x*Y@N&fC!g+gL>uCd9Crx}b!DRKVx;4vz1U$4iA|w&S zYYM*k#B+z2I3E}+dv~lYn@1l+(i^gII)z04l}2k!k%CayY@NMhU#Z6?VObPydZo)_ zxc}zhn#)G|jN-XIUdt>nWLCPzl|%7nNdE+malM8A*Xqke6t>_aukXGYOF~QAsh4k1 zl7(_uy6zQyiUULB3BA<^bN_=bN_HPf_!pk_oz+qLal)-l?+msZQM_#C_1E4^*G+Pp z^RD}edsqaq=j5}6?zQ2L;MdQ$9*FfMkmD4Z)hrrUl!-f-+iTKTmfAY3oU%_!b+&87 zbxLsyD}?@E`|5&YrcOYQd1rEw1AmHZ&OO_o>5{huAXI4ndN^-}^N68_!k3hNXd2iR z>~KmdR|Ylg1`wSPdz&9%{qFpd*l>6-Lz`2E%t#%FA(z0R*zCepEi;DX$l}$(d5bLI zYQ#1+lPQSNu=Nf2(~RcLU+bT<2@OiXx)cb;HFfC(5flwML~JbN9ZbliheOLMJ7Mg1 z9hnjxYJ9Rm`H^GJlbp&MF!epq!e~_#uG22adXa?l7|Pc&3Jg6`@z{oG_dhN$-=>4> z2+SL-U>xA5M{c77ds!IsY_&BzI;pDTzGDv|l>nr?tEiQ_1WW^f)mTCHy`2}wb_VFY zvZoDFUv~&67}kdNfwd9yP+89FsAA%o26u3%Do+j;b*Za<8nx^SLUI0vY&c$1(52W` zQIt#wrlMy3ee;I&!ly$FOE{%(Y_b_IXl4!FkKH)#oS``1DhkOY*#5k5_gW0-ofz;s zZQoa~1S(O%^`cApCw1%XL%?+62GT~1V=K6KkVX556Drl#u<#$NBf3k1;zTI<9w&Vn zdoN*h6_k~d4xSBip$fT)W9Y1v-pU_g;7ZM}S4<}!yd2A56NSj#N!RDpCOJJ{vTnp) zUoxlY9#p&y21gwYvBBjvB-^hk|MM;fD8C1aM=5aC(hXqP<)tpF^v{oi`AS zr{W^kNSTfooiz@SiJ~LHRH;~Y+5e(u+C4>UO_A30%6`I9gjIgsFcn@A*d?$R1Yl&k zsW{}K!uIwx^V*Vac;bUnZ_j+oZkvF+9hB0?p9rqQEcT&9OQX4(xpu-q!y5`Ep#>Qk zqZqa=)unWVwe=31av59!Eqf1|Zc6rNiDcS`^lObLid|`0&s;8I>|jHoF<09p+ph*F zG@hMX5{s`UGpJrZ$%wMMh0aR54XsYZGS_3R-Ai4Sq&_WsJxX*Td4-3&_UK(~X0sqmi}oKFwhCzf`3m}cW%w=I_p}sx%wUB| zl3W`b#fugRSDXTPN&wV@e?pHp=5F8$8FX#sWPcZHaH~d4!SQMVdVgV>_ti=duS(@A z^Tg||Y#U+<#=AY%g{sTG-o@w>0APZHWJJ`O(u0t~;I2EL`!_&$aNQzb1pt`y4P4tn zyWB8k0)Hb%-8sFP_=y`89Z1?is!^Q?ebe(nyAGZ}^N!7I?<-ZUmb^h1;uywFF)XHw zg!CY0O-E}8+?G*lEv?%uzhNK}szgz;E1-ePp;Ve9BZ_mjt^`CJxzW)pl&_esFBo4W zLQUG9#1%+)gj%3&ApI@FM4ey@G))Or=sFyeooZf(t!}DfcyH2W6ePmP%Y)uP@D$6m zQOCjl;4F1c6PjxmEf0`Df;hV_#yM(^n1C#SE^)+WxMzom)hrhe$x3~|^qI?0UKz?u za%lHk$+-n5yxjc7A6EH`qByNdAZ}~2!Q84Cy$Re)N*ID5&g?ISZod{=C{8bcT{Oy) zuM@Ca?^OP7zcVg&z_MN*Hq}*Jln#E@Tr!hR zxo9!wZw#CcWuu|`cBIqmIg26HO@z?7R5lGd9k(2Y>VZL$Z(O{0+Tze_)+gSuA`Z&RcDJHlqKL3iDtuGjF>rtt4MvA86rXb zMv#7q0syp>Q@IqF!tHs2wY7?ZlukPTXRG9z@l_9ApQ%Zs+Ie*f)Jp$O{! zwp0(&Mow<3bj)0OtSn{;h@SQO*?2yU)0m^Pz$`cv5)G(OatgyA`m+H!B23&+rf3I$ zoO+5$l8@?PUc}y8O&OFhhn@ZcPQWKFSzLrLg4&U!Mt;OuP5Jpgm1pvJMRtO;EF%Zt(JxZO7JgJXoqPluo&Fft->2w*t)QwTS{NC; z=yd-@$ave-QPi%bX-{Fwt|`^t-wle4tJY{ww1JHs_j~1tkUgdH;hK|YC_`e_-T+a_ zTTP>BGic4z z?Oi;%BZWXsW>%p^(->4zG3hRl>c!T=J0B#}9=}<#wFj5OQErD!t_$z2^)5ux@T(jw5@|-2n{Pmo{JzXrn zgo;g*q!VlBa~i(YC1b1%y3Sf%fdE|6!3tc4nQj(PmF~fesDGY8f>TOpZ-mhm_@Aw! z8da#N-(a;-oSmegXhwtR$ajW6pR9vQpI^42>3SA?)akXc9es&VzfUy_{#v=!@~IBk zCw}@5{Plq=is#!BxIhhD2u4iDQ@7kJ)aehbGb8`-(W`ut6WAB{q$9a&;QRN}?2C5I zS#2y9J8tT;QNU#p=!3#3G;8;MoKcKZj35N7GKC=O!V%BF6Spfvf_6PMRgWQJ3gRP@ zchYjed1BDfZtOKu6{O8MVt4}OoidyaD1wh){K#V*Z3-t1XVaZV7?4|yo7hpsT(o7> zLwlZ?se6~mi|5PK2q%AT6^`|e9!c~r+HS9ux#$>iQlk}-nL?webs7l=-W)xJVl1ObGK@-Y-nc4Joez;E}z;nfUKf?!KP>f0cKT&;-5uB#hoQ4i8@e_LJ9 zYaF}7z0FzA`4l6mfG6QB!xN@!qj_+dO+LuC-8ic4c>mq2#9z1)+GXg8i`gC6--&FZ0RGD<88>&UB2@z($V4 zC9|stolS#m@IT=fOw@}PbPhc`WtPhu=s{v)S2h1#^nuPvK6RdnuX0suuo4Q+573pvuU z`d_xS1Iw2K`P2@%dB-fVRT|7dyyK(^cDO#S0k7s|0K$X?l{)-xePS=ri5 zw)P1#0iz{5fkc3g+;zOJCHmXwzn^B)2msNDEYF=s+o#A?YcR~i-e$TR;aB}OT7Jff z79sME;|Zse+AV5vyD`67uy96+6fXs4!~#$cnex8pQBo^W(Gfxq%E4C@Sp>W8BwQb0 zIc97_5p|a7j&LpA?rI*_qQ6028~MR`)?!^mJH65oh{1PEvRM+0t|yH3e3a1c8G*i(v>D)^Oe%#WA1E_5MsVnQa@p zuoqMTT-R@@DL9T1wTq2f>00gJ80ee)!B7 zud2hlE&KA54cHoZ?AA;(-v}sW(~ElG5dn;?cU%$l_bykDMCr;7*h_SLb>Md>pVV;1 z;ZrV%zgWD}f1=EMD=qt{9gO7!>R$lZlZbg7D50sE8#rPIg4DcHCo(UDG4nwPX$q0a zuycV!_DRxO>yZ*uXtsI{!1F(W3VzUh)IKd&YuPJ9EyP2gP_3DMDFsB)+tAHlxnE z8vqvZ?7AlYQE6X+CLMi^NWjRQQP7rbr5?2cM65`Oz(M5=1ulrwgl#ui!!jNx$~?G` z-|z<1!R7Dbqnv#Vz6Ee9&6%ZCeLC}7$eQ$`3L~w>3hJm$bqGF<-j@ce5Oy=La!`+h zL|r<7$W{A=F4wCsgbY|a4R_wJP^B#K`Q+(73hzg-qxEp!;j_FB=os5j8`pBKl2#V@ z0&jVH$Ah;En4Ql79D^1cG=dwDI6hwZ9T@ENJkkm#a1jJ4qzjzW2QJ+Z4|Qp5 I6W$a53tR>xMgRZ+ literal 0 HcmV?d00001 diff --git a/MQLTestWorkspace/X121/Old/Classes/x-saherelm.x121.xea.class.mq5 b/MQLTestWorkspace/X121/Old/Classes/x-saherelm.x121.xea.class.mq5 new file mode 100644 index 0000000..1406413 --- /dev/null +++ b/MQLTestWorkspace/X121/Old/Classes/x-saherelm.x121.xea.class.mq5 @@ -0,0 +1,1631 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 Class Library +// ---------------------------------------------- +// Name: XSCX121EA +// Description: an Expert Class which +// used X121 Setup ... +// +// +// 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 + +// +// START Import and Inclused requirements ... +// + +// +// Includes ... +#include "../Classes/x-saherelm.xea.class.mq5" +#include "../Libraries/x-saherelm.x121.draw.lib.mq5" +#include "../Libraries/x-saherelm.x121.support.lib.mq5" +#include "../Libraries/x-saherelm.x121.signaller.lib.mq5" +#include "../Classes/x-saherelm.x121.provider.class.mq5" + +// +// END Import and Inclused requirements ... +// + +// +// START Definitions ... +// + +// +// an Structure to Holds a Support of Support ... +struct XSupport +{ + // + // Supported Position ... + XPosition position; + + // + // Last Support Date ... + ulong lastSupport; + + // + // Last SUpported Volume ... + double lastSupportVolume; +}; + +// +// END Definitions ... +// + +// +// START Overrides ... +// + +// +// END Overrides ... +// + +// +// an Expert Advisor Class by X121Provider ... +class XSCX121EA : public XSCBaseEA +{ + // + // Public ... +public: + // + // Props ... + + // + // Constructor ... + void XSCX121EA( + string symbol, // Trading Symbol + ENUM_TIMEFRAMES period, // Trading Time Frame + ulong magic, // Magic Number + int slippage, // Slippgae + TOnStopLoss onStopLossTriggered = NULL, // On StopLoass Triggered Event Handler + TOnTakeProfit onTakeProfitTriggered = NULL, // On TakeProfit Triggered Event Handler + TOnDealsChanged onDealsChangedHandler = NULL, // On Deals Changed Event Handler + TOnOrdersChanged onOrdersChangedHandler = NULL, // On Orders Changed Event Handler + TOnPositionsChanged onPositionsChangedHandler = NULL, // On Positions Changed Event Handler + TOnTradeStateChanged onTradeStateChangedHandler = NULL, // On Trade State Changed Event Handler + TOnSignalConditions onSignalConditions = NULL // On SignalConditions Event Handler + ) : XSCBaseEA(symbol, + period, + magic, + slippage, + onStopLossTriggered, + onTakeProfitTriggered, + onDealsChangedHandler, + onOrdersChangedHandler, + onPositionsChangedHandler, + onTradeStateChangedHandler) + { + mOnSignalConditions = onSignalConditions; + } + + // + // DeConstructor ... + void ~XSCX121EA() + { + // + int providersCount = ArraySize(mProviders); + if (providersCount > 0) + { + // + for (int i = 0; i < providersCount; i++) + { + // + X121SignalProvider iProvider = mProviders[i]; + + // + delete iProvider.provider; + } + } + } + + // + // START Properties ... + // + + // + // Add Provider ... + bool AddProvider( + X121SignalProvider &provider // Specific Provider ... + ) + { + // + bool result = false; + + // + // Validate Provider ... + if (provider.symbol == NULL || + provider.period == NULL || + provider.riskAmount <= 0 || + StringLen(provider.symbol) == 0 || + ArraySize(provider.providers) == 0) + { + return result; + } + + // + // Check Exists or not ... + int idx = GetProviderIndex( + provider.symbol, + provider.period); + if (idx >= 0) + { + return result; + } + + // + PrepareProviderConfig(); + + // + // Make Instance of X121Provider Class ... + provider.provider = new XSCX121Provider( + mSymbol, + mPeriod); + + // + // Attach Event Listener ... + if (mOnSignalConditions != NULL) + { + // + // Attach Event Handlers ... + provider.provider.AddOnSignalConditionEventHandler(mOnSignalConditions); + } + + // + // Set Signallers to Provider Class ... + result = provider.provider.SetSignallers(provider.providers); + if (!result) + { + return result; + } + + // + // Initialize Provider ... + result = provider.provider.SetConfig(mProviderConfig); + + // + // Add Prepared Provider to Providers ... + Add( + provider, + mProviders); + + // + return result; + } + + // + // Add Providers ... + int AddProviders( + X121SignalProvider &providers[] // Specific Providers ... + ) + { + // + int result = 0; + + // + int providersCount = ArraySize(providers); + if (providersCount <= 0) + { + return result; + } + + // + for (int i = 0; i < providersCount; i++) + { + // + X121SignalProvider iProvider = providers[i]; + + // + bool isAdded = AddProvider(iProvider); + if (isAdded) + { + result++; + } + } + + // + return result; + } + + // + // END Properties ... + // + + // + // START Overrides ... + // + + // + void OnPositionsChangedHandler(int count) + { + // + XPosition positions[]; + mTrader.GetPositions(positions); + int positionsCount = ArraySize(positions); + if (positionsCount <= 0) + { + return; + } + + // + for (int i = 0; i < positionsCount; i++) + { + // + XPosition iPosition = positions[i]; + + // + XPositionPack pack; + bool hasPositionPack = mTrader.GetPositionPack( + iPosition.ticket, + pack); + if (hasPositionPack) + { + continue; + } + } + } + + // + // Handle TakeProfit Event ... + void OnTakeProfitTriggered(const XDeal &deal) + { + // + // Get Take Profit Position ... + ulong ticket = deal.positionId; + string symbol = deal.symbol; + + // + XOrder supportOrders[]; + + // + XOrder orders[]; + mTrader.GetOrders( + orders, + symbol, + NULL, + ORDER_STATE_PLACED); + int ordersCount = ArraySize(orders); + if (ordersCount <= 0) + { + return; + } + + // + for (int i = 0; i < ordersCount; i++) + { + // + XOrder iOrder = orders[i]; + + // + string params[]; + bool isSupport = ExtractSupportParams( + iOrder.comment, + params); + if (!isSupport) + { + continue; + } + + // + ulong parentTicket = ExtractParentTicket(iOrder.comment); + if (parentTicket != ticket) + { + continue; + } + + // + Add( + iOrder, + supportOrders); + } + + // + int supportOrdersCount = ArraySize(supportOrders); + if (supportOrdersCount <= 0) + { + return; + } + + // + bool isCanceled = mTrader.CancelOrders(supportOrders); + if (isCanceled) + { + // + string message = "Close (" + ToString(supportOrdersCount) + ") Support of: (" + ToString(ticket) + ") due it's Take Profit ..."; + + // + LogMessage(message); + } + } + + // + // END Overrides ... + // + + // + // START Inheritance Functions ... + // + + // + void PrepareTag() + { + mTag = "X121EA:" + mSymbol + "," + ToString(mPeriod) + (string)mMagic; + } + + // + // Check Providers Guard States ... + bool CheckGuard(XGuard &guards[]) + { + // + bool result = false; + + // + Clean(guards); + + // + int providersCount = ArraySize(mProviders); + if (providersCount <= 0) + { + return result; + } + + // + for (int i = 0; i < providersCount; i++) + { + // + X121SignalProvider iProvider = mProviders[i]; + + // + XGuard iGuards[]; + bool iHasGuard = iProvider.provider.GuardCheck(iGuards); + if (iHasGuard) + { + // + Copy( + iGuards, + guards, + false); + } + } + + // + // Here we Can Implement Custom Guards Senario ... + + // + // Do Management Equity ... + HandleEquityManagement(); + + // + result = ArraySize(guards) > 0; + + // + return result; + } + + // + // Check Providers for Signals ... + bool SignalCheck(XSignal &signals[]) + { + // + bool result = false; + + // + Clean(signals); + + // + // Check Max Allowed Positions ... + result = ChecPositionsForTrade(); + if (!result) + { + return result; + } + + // + // Check Equity ... + result = CheckEquityForTrade(); + if (!result) { + return result; + } + + // + int providersCount = ArraySize(mProviders); + if (providersCount <= 0) + { + return result; + } + + // + for (int i = 0; i < providersCount; i++) + { + // + X121SignalProvider iProvider = mProviders[i]; + + // + int iFoundedPivots = iProvider.provider.CountPivots(); + int iReuiredPivots = iProvider.provider.GetMinPivots(); + if (iFoundedPivots < iReuiredPivots) + { + // + iProvider.provider.ProccessPivotPoints(); + + // + continue; + } + + // + X121MarketConditions iConditions; + // + // By Use this Template we Can Test Signallers + // then Make Them Traditional ... + bool iHasSignal = XTMPProcessSignal( + iConditions, + iProvider.provider); + + // + // TODO: Fix this ... + // iProvider.provider.ProcessTick(iConditions); + + // + if (iHasSignal && iConditions.hasSignal) + { + // + // Check Signalling is Enabled by Signal type ... + bool isiSignalLong = IsLong(iConditions.signal.type); + if ((isiSignalLong && !mEnableLongs) || (!isiSignalLong && !mEnableShorts)) + { + continue; + } + + // + PrepareConditionsSignal(iConditions); + + // + // Generate Support Signals ... + // GenerateSignalSupports( + // iConditions.signal, + // iProvider.provider); + + // + // DrawConditionsSignalOnChart(iConditions); + + // + Add( + iConditions.signal, + signals); + } + } + + // + result = ArraySize(signals) > 0; + + // + // IMPORTANT: + // Since we have to Implement our Signal Execution Senario + // Ignore this here for Default behaviour and implememt or Execution ... + if (result) + { + // + XSignal allowedSignals[]; + + // + // Select Which Signal need To Execute ... + bool hasEquity = CheckEquityForTrade(); + if (hasEquity) + { + // + // Since we have necessary Equity for Trade ... + // Accept all incomming Signals ... + Copy( + signals, + allowedSignals); + + // + // TODO: + // Implement Trade Policies ... + } + else + { + // + // How to Select Signals when there is no Equity for Trade ... + LogMessage("No Equity ..."); + } + + // + int allowedSignalsCount = ArraySize(allowedSignals); + if (allowedSignalsCount > 0) + { + // + // Execute Signals oly when allowed ... + mTrader.ExecuteSignals(allowedSignals); + } + + // + // Prevent Default Base Signal Execution ... + + // + Clean(signals); + + // + return false; + } + + // + return result; + } + + // + // END Inheritance Functions ... + // + + // + // START Provided Actions ... + // + + // + // END Provided Actions ... + // + + // + // Protected ... +protected: + // + // Private ... +private: + // + // Props ... + X121SignalProvider mProviders[]; + X121ProviderInputs mProviderConfig; + TOnSignalConditions mOnSignalConditions; + + // + // Actions ... + + // + // SUPPORT ... + // + + // + // EQUITYMANAGEMENT ... + // Supported Positions ... + XSupport mSupports[]; + + // + // EQUITYMANAGEMENT ... + // Check Support of Supports Exists or ot ... + bool HasSuppors() + { + return CountSupports() > 0; + } + + // + // EQUITYMANAGEMENT ... + // Count Exists Support of Supports ... + int CountSupports() + { + return ArraySize(mSupports); + } + + // + // EQUITYMANAGEMENT ... + // Retrieve Supported of Supports ... + int GetSupportsIndex( + ulong ticket // Desired Support Position Ticket ... + ) + { + // + int result = -1; + + // + int supportsCount = CountSupports(); + if (supportsCount <= 0) + { + return result; + } + + // + for (int i = 0; i < supportsCount; i++) + { + // + XSupport iSupport = mSupports[i]; + + // + if (iSupport.position.ticket != 0 && + iSupport.position.ticket == ticket) + { + // + result = i; + break; + } + } + + // + return result; + } + + // + // EQUITYMANAGEMENT ... + // Add Supported of Supports ... + bool AddSupports( + XSupport &support // Support item ... + ) + { + // + bool result = false; + + // + // Check Support Exists or not ... + int supIndex = GetSupportsIndex(support.position.ticket); + if (supIndex < 0) + { + // + // Add New ... + Add(support, + mSupports); + + // + result = true; + } + else + { + // + // Update Exists ... + + // + int supportsCount = CountSupports(); + XSupport collection[]; + for (int i = 0; i < supportsCount; i++) + { + // + XSupport iSupport = mSupports[i]; + + // + if (iSupport.position.ticket == support.position.ticket) + { + continue; + } + + // + Add(iSupport, + collection); + } + + // + Add(support, + collection); + + // + Copy( + collection, + mSupports, + true); + + // + Clean(collection); + + // + result = true; + } + + // + return result; + } + + // + // EQUITYMANAGEMENT ... + // Remove Supported Of Supports ... + bool RemoveSupports( + XSupport &support // Support item ... + ) + { + // + bool result = false; + + // + // Check Support Exists or not ... + int supIndex = GetSupportsIndex(support.position.ticket); + if (supIndex < 0) + { + return result; + } + + // + int supportsCount = CountSupports(); + XSupport collection[]; + for (int i = 0; i < supportsCount; i++) + { + // + XSupport iSupport = mSupports[i]; + + // + if (iSupport.position.ticket == support.position.ticket) + { + continue; + } + + // + Add(iSupport, + collection); + } + + // + Copy( + collection, + mSupports, + true); + + // + Clean(collection); + + // + result = true; + + // + return result; + } + + // + // EQUITYMANAGEMENT ... + int GetSupportAge( + int index // Supported Index + ) + { + // + int result = -1; + + // + int supportsCount = CountSupports(); + if (index < 0 || index > supportsCount - 1) + { + return result; + } + + // + // Retrieve Required Info ... + string symbol = mSupports[index].position.symbol; + ENUM_TIMEFRAMES period = mSupports[index].position.period; + datetime lastDate = MilliSecondsToTiem(mSupports[index].lastSupport); + + // + // Calculate Age ... + result = iBarShift( + symbol, + period, + lastDate); + + // + return result; + } + + // + // EQUITYMANAGEMENT ... + // + + // + // Do All Equity Management Works here ... + void HandleEquityManagement() + { + + // + // Handle Hedging Positions ... + HandleHedging(); + + // + return; + + // + // Close All Long Time Placed Support Signals + // Which doesn't Triggered yest ... + HandleCancelAllUntriggeredSupports(); + + // + // Check Equity ... + bool hasEquity = CheckEquityForTrade(); + if (hasEquity) + { + return; + } + + // + // Retrieve Provider Count ... + int providersCount = ArraySize(mProviders); + if (providersCount <= 0) + { + // + // We Have at least two Position for Hedging ... + return; + } + + // + // Loop Through Registered Provider Instances ... + for (int i = 0; i < providersCount; i++) + { + // + bool canIgnoreSupporting = false; + + // + X121SignalProvider iSProvider = mProviders[i]; + + // + string symbol = iSProvider.symbol; + ENUM_TIMEFRAMES period = iSProvider.period; + XSCX121Provider *analyzer = iSProvider.provider; + + // + // We Have to Detect Each Providers In DrawDown Signals and then + // Found any Support Signals for them ... + // 1- must have at least TWO Support Signal without tp ... + // 2- there are some signals by providing tp ... + // 3- Trend base and Conditional Supports by tp ... + + // + XPosition inDrawdownPositions[]; + GetInDrawdownPositions( + inDrawdownPositions, // Result ... + symbol, + NULL, // All Types ... + period, + NULL, // All Providers ... + NULL // Select All ... + ); + int inDrawdownPositionsCount = ArraySize(inDrawdownPositions); + if (inDrawdownPositionsCount <= 0) + { + continue; + } + + // + // Find Oldest Position to CHeck Trade Age ... + XPosition oldestInDrawdownPosition; + int oldestInDrawdownPositionAge = GetOldest( + oldestInDrawdownPosition, + inDrawdownPositions); + bool isTooOldForSupport = oldestInDrawdownPositionAge >= oldAgePositionForSupportFactor; + if (!isTooOldForSupport) + { + continue; + } + + // + // Now we Have to Check Exists EQM Supports ... + XOrder orders[]; + GetOrders( + orders, + symbol, + NULL, // All Types ... + NULL, // All States ... + period, + NULL // All Providers ... + ); + int ordersCount = ArraySize(orders); + if (ordersCount > 0) + { + // + // Extract EQM Support Signals ... + XOrder supportOrders[]; + ordersCount = GetEQMSupportOrders( + supportOrders, + orders, + period); + if (ordersCount > 0) + { + // + // Since there are EQM Untriggere Support Orders here ... + // we have to check theirs longest Age ... + XOrder longestUntriggeredSupportOrder; + int longestUntriggeredSupportOrderAge = GetOldest( + longestUntriggeredSupportOrder, + supportOrders); + canIgnoreSupporting = longestUntriggeredSupportOrderAge < oldAgeSupportForReNewFactor; + if (canIgnoreSupporting) + { + continue; + } + } + } + + // + // Here we Have To Generate new Support Signals and Execute them ... + XSignal supports[]; + int supportsCount = GenerateMarketSupports( + supports, + symbol, // Trading Symbol ... + period, // Trading Timeframe ... + analyzer // Market Analizer ( Signal Provider Instance ) ... + ); + if (supportsCount <= 0) + { + continue; + } + + // + PrepareSignals(supports); + + // + string comment = GenerateXEQMSupportComment(period); + int executed = mTrader.ExecuteSignals( + supports, + comment); + } + } + + // + // Close All Positions in Summary Profit ... + bool HandleHedging() + { + // + bool result = false; + + // + // List All Open Positions and Calculate Profit Summary ... + + // + double profit = 0; + double requiredProfit = 0; + + // + XPosition positions[]; + GetPositions( + positions, // Result ... + NULL, // All Symbols ... + NULL, // All Types ... + NULL, // All Period ... + NULL // All Providers ... + ); + int positionsCount = ArraySize(positions); + if (positionsCount <= 0) + { + return result; + } + + // + for (int i = 0; i < positionsCount; i++) + { + // + XPosition iPosition = positions[i]; + + // + profit += iPosition.profit; + requiredProfit += ((iPosition.volume / minProfitPerVolumeFactor) * minProfitPerTrade) + (-1 * iPosition.swap); + } + + // + // Check We Can Hedge or not ... + result = profit >= requiredProfit; + if (!result) + { + // + // Here we Have to Close Long In Profit Trades ... + // Open Positions ... + XPosition longestInProfitPosition; + int longestInProfitPositionAge = GetOldest( + longestInProfitPosition, + positions); + double requireProfit = minProfitPerTrade * (longestInProfitPosition.profit / minProfitPerVolumeFactor) + -1 * (longestInProfitPosition.swap); + bool canClose = + longestInProfitPositionAge >= oldAgePositionForSupportFactor && + longestInProfitPosition.profit > 0 && longestInProfitPosition.profit > requireProfit; + if (canClose) + { + // + string comment = "EQM Close In Profit ..."; + + // + bool isClosed = mTrader.Close( + longestInProfitPosition.ticket, + comment); + if (isClosed) + { + // + // Force Cancel All Pending Orders ... + HandleCancelAllUntriggeredSupports(true); + + // + string message = "EQM Close Position (" + ToString(longestInProfitPosition.ticket) + ") by: " + ToString(longestInProfitPosition.profit); + + // + LogMessage(message); + + // + result = true; + } + } + + // + // Check if one Position is Open and it's in Drawdown and ore than + // longest age ... + // close it ... + // if (!result) + // { + // // + // if (longestInProfitPositionAge >= oldAgePositionForSupportFactor) + // { + // // + // string comment = "EQM Close In DD ..."; + + // // + // int closed = mTrader.ClosePositions( + // positions, + // comment); + // result = closed == positionsCount; + // } + // } + + // + return result; + } + + // + string comment = "EQM Hedge ..."; + int closed = mTrader.ClosePositions( + positions, + comment); + + // + result = closed == positionsCount; + if (result) + { + // + // Force Cancel All Pending Orders ... + HandleCancelAllUntriggeredSupports(true); + + // + string message = "EQM Close (" + ToString(closed) + ") Positions due HEDGE by: " + ToString(profit); + + // + LogMessage(message); + } + + // + return result; + } + + // + // We Have To Cancell All Untriggered Supports ... + void HandleCancelAllUntriggeredSupports( + bool force = false // Force Close All ... + ) + { + // + // Retrieve all Placed EQM Supports ... + XOrder orders[]; + GetOrders( + orders, + NULL, // All Symbols ... + NULL, // All Types ... + NULL, // All State ... + NULL, // All Periods ... + NULL // All Providers ... + ); + int ordersCount = ArraySize(orders); + if (ordersCount <= 0) + { + return; + } + + // + XOrder supports[]; + int supportsCount = GetEQMSupportOrders( + supports, + orders, + NULL // All Time Frames ... + ); + if (supportsCount <= 0) + { + return; + } + + // + XOrder oldest; + int oldestAge = GetOldest( + oldest, + orders); + bool isTooOldForCancel = oldestAge >= oldAgeSupportForReNewFactor; + if (!force && !isTooOldForCancel) + { + return; + } + + // + bool isCanceled = mTrader.CancelOrders( + supports); + } + + // + // Pepare a Collection Of Signals ... + void PrepareSignals(XSignal &signals[]) + { + // + int signalsCount = ArraySize(signals); + if (signalsCount <= 0) + { + return; + } + + // + for (int i = 0; i < signalsCount; i++) + { + // + PrepareSignal(signals[i]); + } + } + + // + // PROVIDERS ... + // + + // + // Find Specific Provider Index by using give symbol and period ... + int GetProviderIndex( + string symbol, // Trading Symbol ... + ENUM_TIMEFRAMES period // Trading Time frame ... + ) + { + // + int result = -1; + + // + // Validate Args ... + if (period == NULL || + symbol == NULL || + StringLen(symbol) == 0) + { + return result; + } + + // + int providersCount = ArraySize(mProviders); + if (providersCount <= 0) + { + return result; + } + + // + for (int i = 0; i < providersCount; i++) + { + // + X121SignalProvider iProvider = mProviders[i]; + + // + if (iProvider.symbol == symbol && iProvider.period == period) + { + // + result = i; + break; + } + } + + // + return result; + } + + // + // Prepare Default Configurations for X121Provider Setup ... + void PrepareProviderConfig() + { + // + // XCT ... + // Candle Timing ... + mProviderConfig.xctConfig.clr = clrBlueViolet; + mProviderConfig.xctConfig.corner = CORNER_RIGHT_UPPER; + mProviderConfig.xctConfig.showCandleTime = true; + + // + // XCC ... + // Candle Styling ... + mProviderConfig.xccConfig.upColor = clrLime; + mProviderConfig.xccConfig.downColor = clrRed; + mProviderConfig.xccConfig.lineColor = clrLime; + mProviderConfig.xccConfig.bearishColor = clrRed; + mProviderConfig.xccConfig.bullishColor = clrLime; + mProviderConfig.xccConfig.volumesColor = clrGreen; + mProviderConfig.xccConfig.showCandles = true; + + // + // XHK ... + // HikenAshi Candle Representing ... + mProviderConfig.xhkConfig.drawCandleLines = false; + + // + // XTM ... + // Trend Magic ... + mProviderConfig.xtmConfig.length = 35; + mProviderConfig.xtmConfig.shift = 0; + mProviderConfig.xtmConfig.method = MODE_SMA; + mProviderConfig.xtmConfig.appliedTo = PRICE_LOW; + mProviderConfig.xtmConfig.showLine = false; + + // + // XPV ... + // Peaks And Vales ... + mProviderConfig.xpvConfig.shortLength = 9; + mProviderConfig.xpvConfig.mediumLength = 17; + mProviderConfig.xpvConfig.longLength = 26; + mProviderConfig.xpvConfig.hindLength = 35; + mProviderConfig.xpvConfig.fiboLevel1 = 0.382; + mProviderConfig.xpvConfig.fiboLevel2 = 0.5; + mProviderConfig.xpvConfig.fiboLevel3 = 0.618; + mProviderConfig.xpvConfig.hhMode = MODE_HIGH; + mProviderConfig.xpvConfig.llMode = MODE_LOW; + mProviderConfig.xpvConfig.showPeaksAndVales = false; + mProviderConfig.xpvConfig.showLevels = false; + mProviderConfig.xpvConfig.showFibo1Levels = false; + mProviderConfig.xpvConfig.showFibo2Levels = false; + mProviderConfig.xpvConfig.showFibo3Levels = false; + + // + // XAMA ... + // Adaptive Moving Average ... + mProviderConfig.xamaConfig.length = 52; + mProviderConfig.xamaConfig.fastEMA = 2; + mProviderConfig.xamaConfig.slowEMA = 30; + mProviderConfig.xamaConfig.maShift = 0; + mProviderConfig.xamaConfig.appliedTo = PRICE_LOW; + mProviderConfig.xamaConfig.showLine = false; + + // + // XMRB ... + // Moving Average Ribbon ... + mProviderConfig.xmrbConfig.fast1Length = 3; + mProviderConfig.xmrbConfig.slow1Length = 5; + mProviderConfig.xmrbConfig.fast2Length = 8; + mProviderConfig.xmrbConfig.slow2Length = 13; + mProviderConfig.xmrbConfig.fast3Length = 21; + mProviderConfig.xmrbConfig.slow3Length = 34; + mProviderConfig.xmrbConfig.fast4Length = 55; + mProviderConfig.xmrbConfig.slow4Length = 89; + mProviderConfig.xmrbConfig.fast5Length = 144; + mProviderConfig.xmrbConfig.slow5Length = 233; + mProviderConfig.xmrbConfig.ribbonMode = MODE_EMA; + mProviderConfig.xmrbConfig.ribbonAppliedTo = PRICE_CLOSE; + mProviderConfig.xmrbConfig.showFastMa = false; + mProviderConfig.xmrbConfig.showSlowMa = false; + mProviderConfig.xmrbConfig.showRibbon = false; + + // + // XCHE ... + // Chandelier Exit Points ... + mProviderConfig.xcheConfig.length = 35; + mProviderConfig.xcheConfig.loopback = 26; + mProviderConfig.xcheConfig.multiplier1 = 3; + mProviderConfig.xcheConfig.multiplier2 = 3.5; + mProviderConfig.xcheConfig.upAppliedTo = PRICE_HIGH; + mProviderConfig.xcheConfig.downAppliedTo = PRICE_LOW; + mProviderConfig.xcheConfig.showLongExit1Line = false; + mProviderConfig.xcheConfig.showShortExit1Line = false; + mProviderConfig.xcheConfig.showLongExit2Line = false; + mProviderConfig.xcheConfig.showShortExit2Line = false; + + // + // XICH ... + // Ichimopku Kinko Hyo ... + mProviderConfig.xichConfig.tenkanSenLength = 9; + mProviderConfig.xichConfig.tenkanSenMode = X_XICH_HH_LL_MODE; + mProviderConfig.xichConfig.kijunSenLength = 26; + mProviderConfig.xichConfig.kijunSenMode = X_XICH_HH_LL_MODE; + mProviderConfig.xichConfig.senkouSpanBLength = 52; + mProviderConfig.xichConfig.senkouSpanBMode = X_XICH_HH_LL_MODE; + mProviderConfig.xichConfig.chikuoSpanAppliedTo = PRICE_CLOSE; + mProviderConfig.xichConfig.showTenkanSen = false; + mProviderConfig.xichConfig.showKijunSen = false; + mProviderConfig.xichConfig.showKijunSenPlus = false; + mProviderConfig.xichConfig.showKijunSenNegative = false; + mProviderConfig.xichConfig.showChikouSpan = false; + mProviderConfig.xichConfig.showSenkouSpanA = false; + mProviderConfig.xichConfig.showSenkouSpanB = false; + mProviderConfig.xichConfig.showKumo = false; + mProviderConfig.xichConfig.shiftKumo = true; + + // + // XTRND ... + // Trend Detector ... + mProviderConfig.xtrndConfig.cycleLength = 2; + mProviderConfig.xtrndConfig.numberOfVerifications = 2; + mProviderConfig.xtrndConfig.hhMode = MODE_HIGH; + mProviderConfig.xtrndConfig.llMode = MODE_LOW; + mProviderConfig.xtrndConfig.l1Method = X_PERIOD_AUTO; + mProviderConfig.xtrndConfig.l1Period = NULL; + mProviderConfig.xtrndConfig.l2Method = X_PERIOD_AUTO; + mProviderConfig.xtrndConfig.l2Period = NULL; + mProviderConfig.xtrndConfig.l3Method = X_PERIOD_AUTO; + mProviderConfig.xtrndConfig.l3Period = NULL; + mProviderConfig.xtrndConfig.showConsolidations = false; + mProviderConfig.xtrndConfig.showTrend = false; + mProviderConfig.xtrndConfig.showL1Trend = false; + mProviderConfig.xtrndConfig.showL2Trend = false; + mProviderConfig.xtrndConfig.showL3Trend = false; + + // + // XSSLC ... + // SSL Channel ... + mProviderConfig.xsslcConfig.length = 36; + mProviderConfig.xsslcConfig.method = MODE_SMA; + mProviderConfig.xsslcConfig.upAppliedTo = PRICE_HIGH; + mProviderConfig.xsslcConfig.downAppliedTo = PRICE_LOW; + mProviderConfig.xsslcConfig.showUp = false; + mProviderConfig.xsslcConfig.showDown = false; + + // + // XHULL ... + // Hull Trend Detection Channel ... + mProviderConfig.xhullConfig.length = 72; + mProviderConfig.xhullConfig.divisor = 2; + mProviderConfig.xhullConfig.upAppliedTo = PRICE_HIGH; + mProviderConfig.xhullConfig.downAppliedTo = PRICE_LOW; + mProviderConfig.xhullConfig.showUpZone = false; + mProviderConfig.xhullConfig.showDownZone = false; + + // + // XOSC ... + mProviderConfig.xoscConfig.atrLength = 14; + mProviderConfig.xoscConfig.rviLength = 10; + mProviderConfig.xoscConfig.bullpLength = 13; + mProviderConfig.xoscConfig.bearpLength = 13; + mProviderConfig.xoscConfig.volumeAppliedTo = VOLUME_TICK; + mProviderConfig.xoscConfig.rsiLength = 14; + mProviderConfig.xoscConfig.rsiAppliedTo = PRICE_CLOSE; + mProviderConfig.xoscConfig.cciLength = 14; + mProviderConfig.xoscConfig.cciAppliedTo = PRICE_TYPICAL; + mProviderConfig.xoscConfig.stddevLength = 20; + mProviderConfig.xoscConfig.stddevShift = 0; + mProviderConfig.xoscConfig.stddevMethod = MODE_SMA; + mProviderConfig.xoscConfig.stddevAppliedTo = PRICE_CLOSE; + mProviderConfig.xoscConfig.momentumLength = 14; + mProviderConfig.xoscConfig.momentumAppliedTo = PRICE_CLOSE; + mProviderConfig.xoscConfig.sarStep = 0.02; + mProviderConfig.xoscConfig.sarMaximum = 0.2; + mProviderConfig.xoscConfig.macdFastLength = 12; + mProviderConfig.xoscConfig.macdSlowLength = 26; + mProviderConfig.xoscConfig.macdSignaLength = 9; + mProviderConfig.xoscConfig.macdAppliedTo = PRICE_CLOSE; + mProviderConfig.xoscConfig.stochKLength = 5; + mProviderConfig.xoscConfig.stochDLength = 3; + mProviderConfig.xoscConfig.stochSlowing = 3; + mProviderConfig.xoscConfig.stochMaMethod = MODE_SMA; + mProviderConfig.xoscConfig.stochMode = STO_LOWHIGH; + + // + // XSTR ... + mProviderConfig.xstrConfig.atrLength = 12; + mProviderConfig.xstrConfig.atrMultiplier = 3.0; + mProviderConfig.xstrConfig.atrAppliedTo = PRICE_MEDIAN; + mProviderConfig.xstrConfig.showTrends = false; + mProviderConfig.xstrConfig.fillTrends = false; + + // + // XFBB ... + mProviderConfig.xfbbConfig.length = 200; + mProviderConfig.xfbbConfig.multiplier = 3.0; + mProviderConfig.xfbbConfig.appliedTo = PRICE_TYPICAL; + mProviderConfig.xfbbConfig.showBase = false; + mProviderConfig.xfbbConfig.showBand = false; + mProviderConfig.xfbbConfig.showGoldenArea = false; + mProviderConfig.xfbbConfig.showOthers = false; + + // + // XDEMA ... + mProviderConfig.xdemaConfig.length = 200; + mProviderConfig.xdemaConfig.shift = 0; + mProviderConfig.xdemaConfig.showDema = false; + mProviderConfig.xdemaConfig.showEMA = false; + mProviderConfig.xdemaConfig.showEMAOfEMA = false; + + // + PreDefineProviderConfig(); + } + + // + void PreDefineProviderConfig() + { + // + // Default Configs For Different States ... + bool showPV = false; + bool showHK = false; + bool showTM = false; + bool showCHE = false; + bool showSTR = false; + bool showFBB = false; + bool showMRB = false; + bool showTRND = false; + bool showDEMA = false; + bool showHULL = false; + bool showSimpleIchi = false; + + // + // Predefine ... + + // + // X786 ... + showPV = true; + // showTM = false; + // showHK = false; + showCHE = true; + // showSTR = false; + // showDEMA = true; + showTRND = true; + // showHULL = false; + // showSimpleIchi = false; + + // + if (showHK) + { + // + // Hiken Ashi ... + mProviderConfig.xccConfig.showCandles = false; + mProviderConfig.xhkConfig.drawCandles = true; + } + if (showPV) + { + // + // Peaks and Vales ... + mProviderConfig.xpvConfig.showLevels = true; + mProviderConfig.xpvConfig.showFibo1Levels = true; + mProviderConfig.xpvConfig.showFibo2Levels = true; + mProviderConfig.xpvConfig.showFibo3Levels = true; + mProviderConfig.xpvConfig.showPeaksAndVales = true; + } + if (showSimpleIchi) + { + // + // Simple Ichimoku Kinko Hyo ... + mProviderConfig.xichConfig.showKijunSen = true; + mProviderConfig.xichConfig.showTenkanSen = true; + mProviderConfig.xichConfig.showSenkouSpanA = true; + mProviderConfig.xichConfig.showSenkouSpanB = true; + } + if (showCHE) + { + // + // Chandelier Exit ... + mProviderConfig.xcheConfig.showLongExit1Line = true; + mProviderConfig.xcheConfig.showLongExit2Line = true; + mProviderConfig.xcheConfig.showShortExit1Line = true; + mProviderConfig.xcheConfig.showShortExit2Line = true; + } + if (showTRND) + { + // + // Show Trend ... + mProviderConfig.xtrndConfig.showTrend = true; + mProviderConfig.xtrndConfig.showL1Trend = true; + mProviderConfig.xtrndConfig.showL2Trend = true; + mProviderConfig.xtrndConfig.showL3Trend = true; + mProviderConfig.xtrndConfig.showConsolidations = false; + } + if (showSTR) + { + // + // Show Super Trend ... + mProviderConfig.xstrConfig.showTrends = true; + } + if (showFBB) + { + // + // Show Fibonacci Band ... + mProviderConfig.xfbbConfig.showBase = true; + mProviderConfig.xfbbConfig.showBand = true; + mProviderConfig.xfbbConfig.showGoldenArea = true; + } + if (showDEMA) + { + // + // Show Double EMA ... + mProviderConfig.xdemaConfig.showDema = true; + } + if (showMRB) + { + // + mProviderConfig.xmrbConfig.showFastMa = true; + mProviderConfig.xmrbConfig.showSlowMa = true; + mProviderConfig.xmrbConfig.showRibbon = false; + } + if (showTM) + { + mProviderConfig.xtmConfig.showLine = true; + } + if (showHULL) + { + // + mProviderConfig.xhullConfig.showUpZone = true; + mProviderConfig.xhullConfig.showDownZone = true; + } + + // + // X128 ... + // + // XTM ... + // Trend Magic ... + // mProviderConfig.xtmConfig.length = 17; + // mProviderConfig.xtmConfig.shift = 0; + // mProviderConfig.xtmConfig.method = MODE_SMA; + // mProviderConfig.xtmConfig.appliedTo = PRICE_CLOSE; + // mProviderConfig.xtmConfig.showLine = false; + + // + // XAMA ... + // Adaptive Moving Average ... + // mProviderConfig.xamaConfig.length = 52; + // mProviderConfig.xamaConfig.fastEMA = 2; + // mProviderConfig.xamaConfig.slowEMA = 6; + // mProviderConfig.xamaConfig.maShift = 0; + // mProviderConfig.xamaConfig.appliedTo = PRICE_CLOSE; + // mProviderConfig.xamaConfig.showLine = false; + } + + // + void PrepareConditionsSignal(X121MarketConditions &conditions) + { + // + if (!conditions.hasSignal) + { + return; + } + + // + bool isLong = IsLong(conditions.signal.type); + + // + // Check Calculate TP ... + if ( + conditions.signal.sl > 0 && + conditions.signal.r2r > 0 && + conditions.signal.entry > 0 && + conditions.signal.calculateTP) + { + // + double riskPrice = MathAbs(conditions.signal.entry - conditions.signal.sl); + double riskPoint = PriceToPoint( + conditions.signal.symbol, + riskPrice); + double rewardPoint = riskPoint * conditions.signal.r2r; + double rewardPrice = PointToPrice( + conditions.signal.symbol, + rewardPoint); + + // + double tp = + isLong + ? conditions.signal.entry + rewardPrice + : conditions.signal.entry - rewardPrice; + + // + conditions.signal.tp = tp; + } + + // + PrepareSignal(conditions.signal); + } + + // + void DrawConditionsSignalOnChart(X121MarketConditions &conditions) + { + // + ulong mTicket = MathRand() * 100000; + + // + DrawSignal( + mTicket, + conditions.signal); + + // + DrawSupportResistance( + 0, + conditions.supportResistances, + conditions.signal.providers[0]); + } +}; + +// +// START Usefull Functions ... +// + +// +// END Usefull Functions ... +// diff --git a/MQLTestWorkspace/X121/Old/Classes/x-saherelm.xaccount.class.ex5 b/MQLTestWorkspace/X121/Old/Classes/x-saherelm.xaccount.class.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..2da986c7f26feaf1bf367b02879d2bec0c2218ef GIT binary patch literal 6576 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 HZWa6or!ix! literal 0 HcmV?d00001 diff --git a/MQLTestWorkspace/X121/Old/Classes/x-saherelm.xaccount.class.mq5 b/MQLTestWorkspace/X121/Old/Classes/x-saherelm.xaccount.class.mq5 new file mode 100644 index 0000000..4425f0b --- /dev/null +++ b/MQLTestWorkspace/X121/Old/Classes/x-saherelm.xaccount.class.mq5 @@ -0,0 +1,398 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 Class Library +// ---------------------------------------------- +// Name: XSCAccount +// Description: provides all Account requirements ... +// +// +// 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 + +// +// START Definitions ... +// + +// +// END Definitions ... +// + +// +// START Import and Inclused requirements ... +// + +// +// Includes ... +#include +#include "../Libraries/x-saherelm.common.lib.mq5" + +// +// END Import and Inclused requirements ... +// + +// +// START Overrides ... +// + +// +// END Overrides ... +// + +// +// a Class for Manage Account ... +class XSCAccount +{ + // + // Public ... +public: + // + // Constructor ... + void XSCAccount() + { + // + mAccountInfo = new CAccountInfo(); + } + + // + // Deconstructor ... + void ~XSCAccount() + { + } + + // + // START Provided Functions ... + // + + // + // User Account ... + long GetUserAccount() + { + return mAccountInfo.Login(); + } + + // + // Account Leverage ... + long GetLeverage() + { + return mAccountInfo.Leverage(); + } + + // + // Get Trade Expert State ... + bool CanExpertTrade() + { + return mAccountInfo.TradeExpert(); + } + + // + // User Account Trade Mopde (ENUM_ACCOUNT_TRADE_MODE) ... + // -------------------------- + // ACCOUNT_TRADE_MODE_DEMO + // ACCOUNT_TRADE_MODE_CONTEST + // ACCOUNT_TRADE_MODE_REAL + ENUM_ACCOUNT_TRADE_MODE GetTradeMode() + { + return mAccountInfo.TradeMode(); + } + + // + // Get Account Balance ... + double GetBalance() + { + return mAccountInfo.Balance(); + } + + // + // Get the amount of give Credit ... + double GetCredit() + { + return mAccountInfo.Credit(); + } + + // + // Get the amount of current Profit on account ... + double GetProfit() + { + return mAccountInfo.Profit(); + } + + // + // Get the amount of current Equity on account ... + double GetEquity() + { + return mAccountInfo.Equity(); + } + + // + // Get the amount of reserved Margin ... + double GetMargin() + { + return mAccountInfo.Margin(); + } + + // + // Get the amount of free Margin ... + double GetFreeMargin() + { + return mAccountInfo.FreeMargin(); + } + + // + // Get the Level of Margin ... + double GetMarginLevel() + { + return mAccountInfo.MarginLevel(); + } + + // + // Get the Level Of Margin for a Deposit ... + double GetMarginCall() + { + return mAccountInfo.MarginCall(); + } + + // + // Get the Level of Margin for Stop out ... + double GetMarginStopOut() + { + return mAccountInfo.MarginStopOut(); + } + + // + // Get the Client Name ... + string GetName() + { + return mAccountInfo.Name(); + } + + // + // Get the Trade Server Name ... + string GetServerName() + { + return mAccountInfo.Server(); + } + + // + // Get deposit Currency Name ... + string GetCurrency() + { + return mAccountInfo.Currency(); + } + + // + // Get the Company Name that serves an Account ... + string GetCompany() + { + return mAccountInfo.Company(); + } + + // + // Calculate Profits for the current account based on passed parameters ... + double CalculateTradeProfit( + const string symbol, // trading symbol + ENUM_ORDER_TYPE type, // order type + double volume, // volume + double entry, // open price + double exit // close price + ) + { + // + double result = mAccountInfo.OrderProfitCheck( + symbol, + type, + volume, + entry, + exit); + + // + return result; + } + + // + // Calculate amount of margin which required for trade operation ... + double CalculateMarging( + const string symbol, // trading symbol + ENUM_ORDER_TYPE type, // order type + double volume, // volume + double entry // open price + ) + { + // + double result = mAccountInfo.MarginCheck( + symbol, + type, + volume, + entry); + + // + return result; + } + + // + // Calculate amount of free margin left after trade operation ... + double CalculateFreeMarging( + const string symbol, // trading symbol + ENUM_ORDER_TYPE type, // order type + double volume, // volume + double entry // open price + ) + { + // + double result = mAccountInfo.FreeMarginCheck( + symbol, + type, + volume, + entry); + + // + return result; + } + + // + // Calculate the Maximum possible volume of trade operation ... + double CalculateMaxVolume( + const string symbol, // trading symbol + ENUM_ORDER_TYPE type, // order type + double entry, // open price + double percent = 100 // percent of available margin + ) + { + // + double result = mAccountInfo.MaxLotCheck( + symbol, + type, + entry, + percent); + + // + return result; + } + + // + // Calculate Point Value for Given Symbol based on Account ... + double GetPointValue( + string symbol // trading symbol + ) + { + // + double result = 0; + + // + double tickSize = SymbolInfoDouble(symbol, SYMBOL_TRADE_TICK_SIZE); + double tickValue = SymbolInfoDouble(symbol, SYMBOL_TRADE_TICK_VALUE); + double point = SymbolInfoDouble(symbol, SYMBOL_POINT); + + // + double ticksPerPoint = tickSize / point; + + // + result = tickValue / ticksPerPoint; + + // + return result; + } + + // + // Calculate Risk Amount based on account Currency by Providing: + // Points and Volume ... + double CalculateRiskAmount( + string symbol, // trading symbol + double points, // amount of Risk Points + double volume // position Volume + ) + { + // + double result = 0; + + // + double pointValue = GetPointValue(symbol); + + // + result = pointValue * volume * points; + + // + return result; + } + + // + // Calculate Risk Points based on account Currency by Providing: + // Volume and Amount ... + double CalculateRiskPoints( + string symbol, // trading symbol + double volume, // position Volume + double amount // amount of Risk based on Account Currency + ) + { + // + double result = 0; + + // + double pointValue = GetPointValue(symbol); + + // + result = amount / (pointValue * volume); + + // + return result; + } + + // + // Calculate Volume based on account Currency by Providing: + // Amount and Risk Points ... + double CalculateVolume( + string symbol, // trading symbol + double amount, // amount of Risk based on Account Currency + double points // amount of Risk Points + ) + { + // + double result = 0; + + // + points = + points <= 0 + ? 10 + : points; + + // + double pointValue = GetPointValue(symbol); + + // + result = amount / (pointValue * points); + + // + return result; + } + + // + // END Provided Functions ... + // + + // + // Protected ... +protected: + // + // Private ... +private: + // + // Account Info ... + CAccountInfo mAccountInfo; +}; + +// +// START Usefull Functions ... +// + +// +// END Usefull Functions ... +// diff --git a/MQLTestWorkspace/X121/Old/Classes/x-saherelm.xea.class.ex5 b/MQLTestWorkspace/X121/Old/Classes/x-saherelm.xea.class.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..1a1d89f8e7930db4cb6b172cc41e6d37ba2f55c3 GIT binary patch literal 10264 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 literal 0 HcmV?d00001 diff --git a/MQLTestWorkspace/X121/Old/Classes/x-saherelm.xea.class.mq5 b/MQLTestWorkspace/X121/Old/Classes/x-saherelm.xea.class.mq5 new file mode 100644 index 0000000..4344f30 --- /dev/null +++ b/MQLTestWorkspace/X121/Old/Classes/x-saherelm.xea.class.mq5 @@ -0,0 +1,1573 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 Class Library +// ---------------------------------------------- +// Name: XSCBaseEA +// Description: provides all Base EA requirements ... +// +// +// 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 + +// +// START Definitions ... +// + +// +// END Definitions ... +// + +// +// START Import and Inclused requirements ... +// + +// +// Includes ... +#include "../Libraries/x-saherelm.alert.lib.mq5" +#include "../Libraries/x-saherelm.common.lib.mq5" +#include "../Classes/x-saherelm.xtrade.class.mq5" +#include "../Classes/x-saherelm.xaccount.class.mq5" +#include "../Classes/x-saherelm.xprovider.class.mq5" +#include "../Libraries/x-saherelm.seriallizer.lib.mq5" + +// +// END Import and Inclused requirements ... +// + +// +// START Overrides ... +// + +// +// END Overrides ... +// + +// +// a Class for Handle base requirements ... +// for indicators ... +class XSCBaseEA +{ + // + // Public ... +public: + // + // Props ... + XSCTrade *mTrader; + XSCAccount *mAccount; + + // + bool isNewHour; + bool isNewDay; + bool isNewWeek; + bool isNewMonth; + bool isNewCandle; + + // + bool isInTestMode; + + // + bool mWaitsUntilNewCandle; + + // + // Constructor ... + void XSCBaseEA( + string symbol, // Trading Symbol + ENUM_TIMEFRAMES period, // Trading Time Frame + ulong magic, // Magic Number + int slippage, // Slippgae + TOnStopLoss onStopLossTriggered = NULL, // On StopLoass Triggered Event Handler + TOnTakeProfit onTakeProfitTriggered = NULL, // On TakeProfit Triggered Event Handler + TOnDealsChanged onDealsChangedHandler = NULL, // On Deals Changed Event Handler + TOnOrdersChanged onOrdersChangedHandler = NULL, // On Orders Changed Event Handler + TOnPositionsChanged onPositionsChangedHandler = NULL, // On Positions Changed Event Handler + TOnTradeStateChanged onTradeStateChangedHandler = NULL // On Trade State Changed Event Handler + ) + { + // + mSymbol = symbol; + mPeriod = period; + + // + mMagic = magic; + mSlippage = slippage; + + // + mOnStopLossTriggered = onStopLossTriggered; + mOnTakeProfitTriggered = onTakeProfitTriggered; + mOnDealsChangedHandler = onDealsChangedHandler; + mOnOrdersChangedHandler = onOrdersChangedHandler; + mOnPositionsChangedHandler = onPositionsChangedHandler; + mOnTradeStateChangedHandler = onTradeStateChangedHandler; + + // + // Reset Timings ... + ResetTiming(); + + // + EnableLongs(true); + EnableShorts(true); + + // + MaxAllowedPositions(0); + MaxAllowedDrawDownFactor(0); + + // + InitRequirements(); + } + + // + // Deconstructor ... + void ~XSCBaseEA() + { + // + delete mTrader; + delete mAccount; + } + + // + // START Properties ... + // + + // + // Symbol ... + string GetSymbol() + { + return mSymbol; + } + + // + // Period ... + ENUM_TIMEFRAMES GetPeriod() + { + return mPeriod; + } + + // + // Tag ... + string GetTag() + { + return mTag; + } + + // + ulong GetMagic() + { + return mMagic; + } + + // + int GetSlippage() + { + return mSlippage; + } + + // + // Check Long Signalling State ... + bool EnableLongs() + { + return mEnableLongs; + } + + // + // Set Long Signalling State ... + void EnableLongs(bool enable) + { + // + if (enable == mEnableLongs) + { + return; + } + + // + mEnableLongs = enable; + } + + // + // Check Short Signalling State ... + bool EnableShorts() + { + return mEnableShorts; + } + + // + // Set Short Signalling State ... + void EnableShorts(bool enable) + { + // + if (enable == mEnableShorts) + { + return; + } + + // + mEnableShorts = enable; + } + + // + // Get Max Allowed Positions at Same Time ... + int MaxAllowedPositions() + { + return mMaxAllowedPositions; + } + + // + // Set Max Allowed Positions at Same Time ... + void MaxAllowedPositions(int value) + { + // + if (value < 0 || + value == mMaxAllowedPositions) + { + return; + } + + // + mMaxAllowedPositions = value; + } + + // + // Get Max Allowed DrawDown Factor ... + double MaxAllowedDrawDownFactor() + { + return mMaxAllowedDrawDownFactor; + } + + // + // Set Max Allowed Positions at Same Time ... + void MaxAllowedDrawDownFactor(double value) + { + // + if (value < 0 || + value == mMaxAllowedDrawDownFactor) + { + return; + } + + // + mMaxAllowedDrawDownFactor = value; + } + + // + // Check Acocunt Balance is Allow new Trades or not ... + bool CheckEquityForTrade() + { + // + bool result = false; + + // + if (mMaxAllowedDrawDownFactor <= 0) + { + // + result = true; + return result; + } + + // + double equity = mAccount.GetEquity(); + double balance = mAccount.GetBalance(); + + // + double selectedBalance = MathMax(equity, balance) - MathMin(equity, balance); + + // + double balanceForFactor = MathAbs(equity - balance); + if (balanceForFactor <= 0) + { + balanceForFactor = balance; + } + else + { + balanceForFactor = equity; + } + + // + double maxAllowedBalanceDrawDown = balanceForFactor * mMaxAllowedDrawDownFactor; + + // + result = equity > balance || + (equity <= balance && + selectedBalance <= maxAllowedBalanceDrawDown); + + // + return result; + } + + // + // Check Max Allowed Positions Policy for Trade ... + bool ChecPositionsForTrade() + { + // + bool result = false; + + // + if (mMaxAllowedPositions <= 0) + { + // + result = true; + return result; + } + + // + int positionsCount = mTrader.CountPositions(); + if (positionsCount <= 0) + { + // + result = true; + return result; + } + + // + result = positionsCount <= mMaxAllowedPositions; + + // + return result; + } + + // + // Check Account Policies ... + bool CheckAccountPolicies() + { + // + bool result = false; + + // + // Check Equity for Trade ... + result = CheckEquityForTrade(); + if (!result) + { + // + string message = "not enough Equity for Trade ..."; + + // + LogMessage(message); + + // // + // // Handle Force Close Positions on Max Drawdown ... + // HandleGuardForceCloseAction( + // NULL, // All Providers ... + // NULL, // All Symbols ... + // NULL, // All Type of Positions ... + // NULL // All Periods ... + // ); + + // + return result; + } + + // + // Check Max Allowed Position for Trade ... + result = ChecPositionsForTrade(); + if (!result) + { + // + string message = "max allowed Positions reached ..."; + + // + LogMessage(message); + + // // + // HandleGuardCloseInProfitAction( + // NULL, // All Providers ... + // NULL, // All Symbols ... + // NULL, // All Type of Positions ... + // NULL, // All Periods ... + // X_POSITION_SELECT_MAX // Select Max Position ... + // ); + + // // + // HandleGuardCloseInDrawdownAction( + // NULL, // All Providers ... + // NULL, // All Symbols ... + // NULL, // All Type of Positions ... + // NULL, // All Periods ... + // X_POSITION_SELECT_MAX // Select Max Position ... + // ); + + // + return result; + } + + // + return result; + } + + // + // END Properties ... + // + + // + // START Provided Functions ... + // + + // + // Prepare Tag ... + virtual void PrepareTag() + { + mTag = "XEA" + mSymbol + "," + ToString(mPeriod) + (string)mMagic; + } + + // + // Handle Chart Events ... + virtual void OnChartEvent( + const int id, // event ID + const long &lparam, // long type event parameter + const double &dparam, // double type event parameter + const string &sparam // string type event parameter + ) + { + } + + // + // Check any Registered Providers Signalling ... + virtual bool SignalCheck(XSignal &signals[]) + { + return false; + } + + // + // Check for any Custom Guard Actions Guard Actions ... + virtual bool CheckGuard(XGuard &guards[]) + { + return false; + } + + // + // NOTE: you have to call these Functions on Static Classes to Handle Works ... + + // + // Handle StopLoss Event ... + virtual void OnStopLossTriggered(const XDeal &deal) {} + + // + // Handle TakeProfit Event ... + virtual void OnTakeProfitTriggered(const XDeal &deal) {} + + // + // Handle Deals Changed Event ... + virtual void OnDealsChangedHandler(int count) {} + + // + // Handle Order Changed Event ... + virtual void OnOrdersChangedHandler(int count) {} + + // + // Handle Position Changed Event ... + virtual void OnPositionsChangedHandler(int count) {} + + // + // Handle Trade State Changed ... + virtual void OnTradeStateChangedHandler(const XOnTradeHandlerState &state) {} + + // + // Implemented Actions ... + + // + // OnTick Handler ... + void OnTick() + { + // + // Check Account Policies ... + bool isAccountPassed = CheckAccountPolicies(); + if (!isAccountPassed) + { + return; + } + + // + // First Check Guards .... + // Only when Open Positions Exists or Has Pending Order ... + XGuard guards[]; + bool hasGuard = CheckGuard(guards); + if (hasGuard) + { + DoGuards(guards); + } + + // + XSignal signals[]; + bool hasSignal = SignalCheck(signals); + if (hasSignal) + { + // + // Here we have to Check Signals and also it's State ... + XSignal enabledSignals[]; + int signalsCount = ArraySize(signals); + if (signalsCount <= 0) + { + return; + } + + // + // Filter Signals by their type and + // also Check EA Enable their type ... + for (int i = 0; i < signalsCount; i++) + { + // + XSignal iSignal = signals[i]; + bool isLong = IsLong(iSignal.type); + if ((isLong && mEnableLongs) || + (!isLong && mEnableShorts)) + { + // + PrepareSignal(iSignal); + + // + Add( + iSignal, + enabledSignals); + } + } + + // + int enabledSignalsCount = ArraySize(enabledSignals); + if (enabledSignalsCount <= 0) + { + return; + } + + // + // Check Trade Policies ... + + // + // Check Equity for Trade ... + bool canDoTrade = CheckEquityForTrade(); + if (!canDoTrade) + { + // + string message = "not enough Equity for Trade ..."; + + // + LogMessage(message); + return; + } + + // + // Check Max Allowed Position for Trade ... + canDoTrade = ChecPositionsForTrade(); + if (!canDoTrade) + { + // + string message = "max allowed Positions reached ..."; + + // + LogMessage(message); + + // + // Check How to Act with Signals if Max In Drawdown Reached ... + // TODO: Here we Have to Define Max In Draw Down Position type ... + return; + } + + // + mTrader.ExecuteSignals(enabledSignals); + } + } + + // + // Handle On Trade ... + void OnTrade() + { + // + XOnTradeHandlerState state = mTrader.HandleOnTrade(); + + // + if ( + !state.hasNewDeal && + !state.hasNewOrder && + !state.hasNewPosition && + !state.hasNewHistoryOrder) + { + return; + } + + // + // STATE ... + + // + // Notfy Trade State Changed Event ... + OnTradeStateChangedHandler(state); + + // + // DEALS ... + if (state.hasNewDeal) + { + // + // Notfy Deals Changed Event ... + OnDealsChangedHandler(state.newDeals); + + // + // Retrieve Last Deal ... + XDeal deals[]; + mTrader.GetDeals(deals); + int dealsCount = ArraySize(deals); + if (dealsCount > 0) + { + // + XDeal lastDeal = deals[0]; + + // + if (lastDeal.reason == DEAL_REASON_TP) + { + OnTakeProfitTriggered(lastDeal); + } + else if (lastDeal.reason == DEAL_REASON_SL) + { + OnStopLossTriggered(lastDeal); + } + } + } + + // + // ORDERS ... + if (state.hasNewOrder || state.hasNewHistoryOrder) + { + // + // Notfy Orders Changed Event ... + OnOrdersChangedHandler(state.newOrders + state.newHistoryOrders); + } + + // + // POSITIONS ... + if (state.hasNewPosition) + { + // + // Notfy Positions Changed Event ... + OnPositionsChangedHandler(state.newPositions); + } + } + + // + // Retrieve Dept Of Market ... + void OnBookEvent(const string &symbol) + { + // + // TODO: Implement this ... + } + + // + // TOOLS ... + + // + // Prepare a Signal and Do Calculations ... + void PrepareSignal( + XSignal &signal // a Signal for Preparation ... + ) + { + // + // Calculate Volume ... + if (signal.useRiskAmountAsVolume && signal.riskAmount > 0) + { + signal.volume = signal.riskAmount; + } + else if ( + signal.sl > 0 && + signal.tp > 0 && + signal.volume == 0 && + signal.riskAmount > 0 && + !signal.useSupportAndResistance) + { + // + // Calculate Risk Point ... + double riskPoint = MathAbs(signal.entry - signal.sl); + riskPoint = PriceToPoint( + signal.symbol, + riskPoint); + + // + double volume = mAccount.CalculateVolume( + signal.symbol, + signal.riskAmount, + riskPoint); + + // + signal.volume = volume; + } + else if (signal.useSupportAndResistance) + { + // + // Calculate Everything using Supports and Resistances ... + // TODO: Implement Later ... + } + + // + if (signal.ignoreTP) + { + signal.tp = 0; + } + + // + if (signal.ignoreSL) + { + signal.sl = 0; + } + + // + // Normalize Signal ... + NormalizeSignal(signal); + } + + // + // Get All Open Trades ... + void GetPositions( + XPosition &result[], // Hold Result ... + string symbol = NULL, // Trading Symbol ... + ENUM_POSITION_TYPE type = NULL, // Trading Type ... + ENUM_TIMEFRAMES period = NULL, // Trading Period ... + string provider = NULL // Signal Provider ... + ) + { + // + Clean(result); + + // + bool hasSymbol = !(symbol == NULL || StringLen(symbol) == 0); + bool hasProvider = !(provider == NULL || StringLen(provider) == 0); + + // + int positionsCount = mTrader.CountPositions(); + if (positionsCount <= 0) + { + return; + } + + // + XPosition positions[]; + mTrader.GetPositions( + positions, + symbol, + period); + positionsCount = ArraySize(positions); + if (positionsCount <= 0) + { + return; + } + + // + if (!hasProvider && type == NULL) + { + // + Copy( + positions, + result); + + // + return; + } + + // + if (type == NULL) + { + // + ArrayResize( + result, + ArraySize(positions)); + + // + for (int i = 0; i < positionsCount; i++) + { + // + Add( + positions[i], + result); + } + + // + return; + } + + // + for (int i = 0; i < positionsCount; i++) + { + // + XPosition iPosition = positions[i]; + + // + string iProvider = ExtractProvider(iPosition.comment); + if (hasProvider && iProvider != provider) + { + continue; + } + + // + if (type == NULL || iPosition.type == type) + { + // + Add( + iPosition, + result); + } + } + } + + // + // Get All In Profit Trades ... + void GetInProfitPositions( + XPosition &result[], // Hold Result ... + string symbol = NULL, // Trading Symbol ... + ENUM_POSITION_TYPE type = NULL, // Trading Type ... + ENUM_TIMEFRAMES period = NULL, // Trading Period ... + string provider = NULL, // Signal Provider ... + ENUM_X_POSITION_SELECT_METHODS method = NULL // Select Method ... + ) + { + // + Clean(result); + + // + if (method == NULL) + { + method = X_POSITION_SELECT_ALL; + } + + // + // Prevent Going Forwars Since selection type is NONE ... + if (method == X_POSITION_SELECT_NONE) + { + return; + } + + // + bool isMinSelectable = method == X_POSITION_SELECT_MIN; + bool isMaxSelectable = method == X_POSITION_SELECT_MAX; + + // + XPosition positions[]; + GetPositions( + positions, + symbol, + type, + period, + provider); + int positionsCount = ArraySize(positions); + if (positionsCount <= 0) + { + return; + } + + // + // Define Temp Position for Selecting Max Position ... + XPosition maxPos; + maxPos.profit = INVALID_HANDLE; + + // + // Define Temp Position for Selecting Min Position ... + XPosition minPos; + minPos.profit = INVALID_HANDLE; + + // + // Loop through available Positions for Selecting Positions ... + for (int i = 0; i < positionsCount; i++) + { + // + XPosition iPosition = positions[i]; + + // + // Check Profit State ... + if (iPosition.profit <= 0) + { + continue; + } + + // + // Check Selection State ... + if (isMinSelectable) + { + // + if (minPos.profit == INVALID_HANDLE || + minPos.profit > iPosition.profit) + { + minPos = iPosition; + } + + // + continue; + } + else if (isMaxSelectable) + { + // + if (maxPos.profit == INVALID_HANDLE || + maxPos.profit < iPosition.profit) + { + maxPos = iPosition; + } + + // + continue; + } + else + { + // + Add( + iPosition, + result); + } + } + + // + // Add Selected Position if Provided to Results ... + if (isMinSelectable) + { + // + Add( + minPos, + result); + } + else if (isMaxSelectable) + { + // + Add( + maxPos, + result); + } + } + + // + // Get All In Drawdown Trades ... + void GetInDrawdownPositions( + XPosition &result[], // Hold Result ... + string symbol = NULL, // Trading Symbol ... + ENUM_POSITION_TYPE type = NULL, // Trading Type ... + ENUM_TIMEFRAMES period = NULL, // Trading Period ... + string provider = NULL, // Signal Provider ... + ENUM_X_POSITION_SELECT_METHODS method = NULL // Select Method ... + ) + { + // + Clean(result); + + // + if (method == NULL) + { + method = X_POSITION_SELECT_ALL; + } + + // + // Prevent Going Forwars Since selection type is NONE ... + if (method == X_POSITION_SELECT_NONE) + { + return; + } + + // + bool isMinSelectable = method == X_POSITION_SELECT_MIN; + bool isMaxSelectable = method == X_POSITION_SELECT_MAX; + + // + XPosition positions[]; + GetPositions( + positions, + symbol, + type, + period, + provider); + int positionsCount = ArraySize(positions); + if (positionsCount <= 0) + { + return; + } + + // + // Define Temp Position for Selecting Max Position ... + XPosition maxPos; + maxPos.profit = INVALID_HANDLE; + + // + // Define Temp Position for Selecting Min Position ... + XPosition minPos; + minPos.profit = INVALID_HANDLE; + + // + // Loop through available Positions for Selecting Positions ... + for (int i = 0; i < positionsCount; i++) + { + // + XPosition iPosition = positions[i]; + + // + // Check Profit State ... + if (iPosition.profit >= 0) + { + continue; + } + + // + // Check Selection State ... + if (isMinSelectable) + { + // + if (minPos.profit == INVALID_HANDLE || + minPos.profit < iPosition.profit) + { + minPos = iPosition; + } + + // + continue; + } + else if (isMaxSelectable) + { + // + if (maxPos.profit == INVALID_HANDLE || + maxPos.profit > iPosition.profit) + { + maxPos = iPosition; + } + + // + continue; + } + else + { + // + Add( + iPosition, + result); + } + } + + // + // Add Selected Position if Provided to Results ... + if (isMinSelectable) + { + // + Add( + minPos, + result); + } + else if (isMaxSelectable) + { + // + Add( + maxPos, + result); + } + } + + // + // Retrieve Orders ... + void GetOrders( + XOrder &result[], // Hold Result ... + string symbol = NULL, // Trading Symbol ... + ENUM_ORDER_TYPE type = NULL, // Trading Type ... + ENUM_ORDER_STATE state = NULL, // Trading State ... + ENUM_TIMEFRAMES period = NULL, // Trading Period ... + string provider = NULL // Signal Provider ... + ) + { + // + Clean(result); + + // + XOrder orders[]; + mTrader.GetOrders( + orders, + symbol, + period, + state); + int ordersCount = ArraySize(orders); + if (ordersCount <= 0) + { + return; + } + + // + if (type == NULL && + (provider == NULL || + StringLen(provider) == 0)) + { + // + Copy( + orders, + result); + + // + return; + } + + // + for (int i = 0; i < ordersCount; i++) + { + // + XOrder iOrder = orders[i]; + + // + if (type != NULL && iOrder.type != type) + { + continue; + } + + // + if (provider != NULL && + StringLen(provider) > 0) + { + // + // Generate Order Provider ... + string iProvider = ExtractProvider(iOrder.comment); + if (iProvider != provider) + { + continue; + } + } + + // + Add( + iOrder, + result); + } + } + + // + // GUARD Handlers ... + + // + // Parse Recievd Guards and Do them ... + void DoGuards(XGuard &guards[]) + { + int guardsCount = ArraySize(guards); + if (guardsCount <= 0) + { + return; + } + + // + for (int i = 0; i < guardsCount; i++) + { + // + XGuard iGuard = guards[i]; + + // + switch (iGuard.action) + { + // + // Hedge In Profit Specified Positions ... + case X_GUARD_ACTION_HEDGE: + HandleGuardHedgeAction( + iGuard.provider, + iGuard.symbol, + iGuard.type, + iGuard.period); + break; + + // + // Trail Stop Loss in Specified Positions ... + case X_GUARD_ACTION_TRAIL_STOP: + HandleGuardTrailingStopAction( + iGuard.provider, + iGuard.symbol, + iGuard.type, + iGuard.period, + iGuard.dblPayLoad); + break; + + // + // Force Close Specified Positions ... + case X_GUARD_ACTION_FORCE_CLOSE: + HandleGuardForceCloseAction( + iGuard.provider, + iGuard.symbol, + iGuard.type, + iGuard.period); + break; + + // + // Generate and Place Support Signals ... + case X_GUARD_ACTION_ADD_SUPPORT_SIGNAL: + HandleGuardAddSupportPositionAction( + iGuard.provider, + iGuard.symbol, + iGuard.type, + iGuard.period); + break; + + // + // Delete All Placed Pending Orders ... + case X_GUARD_ACTION_CANCEL_PENDING_ORDERS: + HandleGuardCancelPendingOrdersAction( + iGuard.provider, + iGuard.symbol, + iGuard.type, + iGuard.period); + break; + } + } + } + + // + // Close All Specified Provider's Positions in Profit Summary ... + void HandleGuardHedgeAction( + string provider, // Positions Provided by Specific Provider + string symbol, // Trading Symbol + ENUM_POSITION_TYPE type, // Trading Type + ENUM_TIMEFRAMES period, // Specified Time Frame + double minProfitForHedging = 1 // Specified Profit for Hedge + ) + { + // + } + + // + // Close Max In Profit Trade Guard Action ... + void HandleGuardCloseInProfitAction( + string provider, // Positions Provided by Specific Provider + string symbol, // Trading Symbol + ENUM_POSITION_TYPE type, // Trading Type + ENUM_TIMEFRAMES period, // Specified Time Frame + ENUM_X_POSITION_SELECT_METHODS method = NULL // Select Method + ) + { + // + XPosition positions[]; + GetInProfitPositions( + positions, + symbol, + type, + period, + provider, + method); + int positionsCount = ArraySize(positions); + if (positionsCount <= 0) + { + return; + } + + // + string comment = "Close InProfit ..."; + mTrader.ClosePositions( + positions, + comment); + + // + string message = "Guard Close (" + ToString(positionsCount) + ") Postion(s) In Profit ..."; + LogMessage(message); + } + + // + // Close Max In Drawdown Trade Guard Action ... + void HandleGuardCloseInDrawdownAction( + string provider, // Positions Provided by Specific Provider + string symbol, // Trading Symbol + ENUM_POSITION_TYPE type, // Trading Type + ENUM_TIMEFRAMES period, // Specified Time Frame + ENUM_X_POSITION_SELECT_METHODS method = NULL // Select Method + ) + { + // + XPosition positions[]; + GetInDrawdownPositions( + positions, + symbol, + type, + period, + provider, + method); + int positionsCount = ArraySize(positions); + if (positionsCount <= 0) + { + return; + } + + // + string comment = "Close InDrawdown ..."; + mTrader.ClosePositions( + positions, + comment); + + // + string message = "Guard Close (" + ToString(positionsCount) + ") Position(s) In Drawdown ..."; + LogMessage(message); + } + + // + // Force Close Specified Set Of Position ... + void HandleGuardForceCloseAction( + string provider, // Positions Provided by Specific Provider + string symbol, // Trading Symbol + ENUM_POSITION_TYPE type, // Trading Type + ENUM_TIMEFRAMES period, // Specified Time Frame + ulong ticket = 0 // Specific Ticket + ) + { + // + string comment = ""; + + // + // Close All Positions ... + if (ticket == 0) + { + // + XPosition positions[]; + GetPositions( + positions, + symbol, + type, + period, + provider); + if (ArraySize(positions) <= 0) + { + return; + } + + // + comment = provider + " Force Close Guard ..."; + + // + mTrader.ClosePositions( + positions, + comment); + } + // + // Close Specific Position ... + else + { + // + XPosition position; + bool hasPosition = mTrader.GetPosition( + position, + ticket); + + // + if (hasPosition) + { + // + comment = provider + "(" + ToString(ticket) + ")" + " Force Close Guard ..."; + + // + mTrader.Close( + ticket, + comment); + } + } + + // + if (StringLen(comment) > 0) + { + LogMessage(comment); + } + } + + // + // Trailing Specified Set Of Positions Stop Losses ... + void HandleGuardTrailingStopAction( + string provider, // Positions Provided by Specific Provider + string symbol, // Trading Symbol + ENUM_POSITION_TYPE type, // Trading Type + ENUM_TIMEFRAMES period, // Specified Time Frame + double sl // Desired SL Value ... + ) + { + // + if (sl <= 0) + { + return; + } + + // + NormalizePrice( + sl, + symbol); + + // + XPosition positions[]; + GetPositions( + positions, + symbol, + type, + period, + provider); + int positionsCount = ArraySize(positions); + if (positionsCount <= 0) + { + return; + } + + // + int modified = 0; + for (int i = 0; i < positionsCount; i++) + { + // + XPosition iPosition = positions[i]; + + // + string comment = PrepareSLTrailComment(iPosition.comment); + + // + bool isModified = mTrader.Modify( + iPosition.ticket, + sl, + iPosition.tp, + comment); + if (isModified) + { + modified++; + } + } + + // + if (modified > 0) + { + // + string msg = "(" + ToString(modified) + ") Position's Stop Trailed Successfully ..."; + + // + LogMessage(msg); + } + } + + // + // Add Support Signal for Specified Positions ... + void HandleGuardAddSupportPositionAction( + string provider, // Positions Provided by Specific Provider + string symbol, // Trading Symbol + ENUM_POSITION_TYPE type, // Trading Type + ENUM_TIMEFRAMES period // Specified Time Frame + ) + { + // + // TODO: Implement this ... + } + + // + // Cancel all Placed Orders ... + void HandleGuardCancelPendingOrdersAction( + string provider, // Positions Provided by Specific Provider + string symbol, // Trading Symbol + ENUM_POSITION_TYPE type, // Trading Type + ENUM_TIMEFRAMES period // Specified Time Frame + ) + { + // + // TODO: Implement this ... + } + + // + // END Provided Functions ... + // + + // + // Protected ... +protected: + // + string GetTagPrefix() + { + // + string result = "(" + mSymbol + ")(" + ToString(mPeriod) + ")"; + + // + return result; + } + + // + // Symbol ... + string mSymbol; + + // + // Period ... + ENUM_TIMEFRAMES mPeriod; + + // + // ExpertAdviser MAgic Number ... + ulong mMagic; + + // + // Slipppage ... + int mSlippage; + + // + // Tag Identifier ... + string mTag; + + // + bool mEnableLongs; + bool mEnableShorts; + + // + int mMaxAllowedPositions; + double mMaxAllowedDrawDownFactor; + + // + // Private ... +private: + // + // Define Requirements ... + + // + // XSCTrade Event Handlers ... + TOnStopLoss mOnStopLossTriggered; + TOnTakeProfit mOnTakeProfitTriggered; + TOnDealsChanged mOnDealsChangedHandler; + TOnOrdersChanged mOnOrdersChangedHandler; + TOnPositionsChanged mOnPositionsChangedHandler; + TOnTradeStateChanged mOnTradeStateChangedHandler; + + // + // Initi Requirements ... + void InitRequirements() + { + // + // Account Manager ... + mAccount = new XSCAccount(); + + // + // Trader ... + mTrader = new XSCTrade( + mSlippage, + mMagic); + + // + // Attach Event Handlers ... + + // + if (mOnStopLossTriggered != NULL) + { + mTrader.AddOnStopLossEventHandler(mOnStopLossTriggered); + } + + // + if (mOnTakeProfitTriggered != NULL) + { + mTrader.AddOnTakeProfitEventHandler(mOnTakeProfitTriggered); + } + + // + if (mOnDealsChangedHandler != NULL) + { + mTrader.AddOnDealsChangedEventHandler(mOnDealsChangedHandler); + } + + // + if (mOnOrdersChangedHandler != NULL) + { + mTrader.AddOnOrdersChangedEventHandler(mOnOrdersChangedHandler); + } + + // + if (mOnPositionsChangedHandler != NULL) + { + mTrader.AddOnPositionsChangedEventHandler(mOnPositionsChangedHandler); + } + + // + if (mOnTradeStateChangedHandler != NULL) + { + mTrader.AddOnTradeStateChangedEventHandler(mOnTradeStateChangedHandler); + } + } +}; + +// +// START Usefull Functions ... +// + +// +// END Usefull Functions ... +// diff --git a/MQLTestWorkspace/X121/Old/Classes/x-saherelm.xhelper.class.ex5 b/MQLTestWorkspace/X121/Old/Classes/x-saherelm.xhelper.class.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..c24b0d7e281ff94d05390d2685006abf3a05d852 GIT binary patch literal 6178 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 literal 0 HcmV?d00001 diff --git a/MQLTestWorkspace/X121/Old/Classes/x-saherelm.xhelper.class.mq5 b/MQLTestWorkspace/X121/Old/Classes/x-saherelm.xhelper.class.mq5 new file mode 100644 index 0000000..d9cea8b --- /dev/null +++ b/MQLTestWorkspace/X121/Old/Classes/x-saherelm.xhelper.class.mq5 @@ -0,0 +1,209 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 Class Library +// ---------------------------------------------- +// Name: XSCBaseHelper +// Description: provides all Base Indicator +// Helper requirements ... +// +// +// 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 + +// +// START Definitions ... +// + +// +// END Definitions ... +// + +// +// START Import and Inclused requirements ... +// + +// +// Includes ... +#include "../Libraries/x-saherelm.common.lib.mq5" + +// +// END Import and Inclused requirements ... +// + +// +// START Overrides ... +// + +// +// END Overrides ... +// + +// +// a Class for Handle base requirements ... +// for indicators ... +class XSCBaseHelper +{ + // + // Public ... +public: + // + // Constructor ... + void XSCBaseHelper( + string symbol, // Trading Symbol + ENUM_TIMEFRAMES period // Trading Time Frame + ) + { + // + mSymbol = symbol; + mPeriod = period; + + // + LoopBack(52); + } + + // + // Deconstructor ... + void ~XSCBaseHelper() + { + IndicatorRelease(mHandler); + } + + // + // START Properties ... + // + + // + // Loopback Bars ... + void LoopBack(int value) + { + mLoopbackBars = value; + } + + int Loopback() + { + return mLoopbackBars; + } + + // + // Symbol ... + string GetSymbol() + { + return mSymbol; + } + + // + // Period ... + ENUM_TIMEFRAMES GetPeriod() + { + return mPeriod; + } + + // + // Tag ... + string GetTag() + { + return mTag; + } + + // + // Retrieve Bars ... + int GetBars() + { + // + int result = + Bars( + mSymbol, + mPeriod); + + // + return result; + } + + // + int GetCalculatedBars() + { + return BarsCalculated(mHandler); + } + + // + // END Properties ... + // + + // + // START Provided Functions ... + // + + // + // Prepare Tag ... + virtual void PrepareTag() {} + + // + // Reading Buffers based on Given Bar Index ... + virtual void Calculate( + int barIndex // Given Bar Index + ); + + // + // Retrieve MAx Required Length for Calculations ... + virtual int GetMaxLength(); + + // + // END Provided Functions ... + // + + // + // Protected ... +protected: + // + string GetTagPrefix() + { + // + string result = "(" + mSymbol + ")(" + ToString(mPeriod) + ")"; + + // + return result; + } + + // + // Symbol ... + string mSymbol; + + // + // Period ... + ENUM_TIMEFRAMES mPeriod; + + // + // Indicator Handler ... + int mHandler; + + // + // Number Of Items Read Per Tick ... + int mLoopbackBars; + + // + // Tag Identifier ... + string mTag; + + // + // Private ... +private: + // +}; + +// +// START Usefull Functions ... +// + +// +// END Usefull Functions ... +// diff --git a/MQLTestWorkspace/X121/Old/Classes/x-saherelm.xnotifier.class.ex5 b/MQLTestWorkspace/X121/Old/Classes/x-saherelm.xnotifier.class.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..6dbc041bc700b5645b073803c81b160b3562cd34 GIT binary patch literal 6346 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 literal 0 HcmV?d00001 diff --git a/MQLTestWorkspace/X121/Old/Classes/x-saherelm.xprovider.class.ex5 b/MQLTestWorkspace/X121/Old/Classes/x-saherelm.xprovider.class.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..d9f05433901607eb400177abc7a3f20d8ed059d8 GIT binary patch literal 7944 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 literal 0 HcmV?d00001 diff --git a/MQLTestWorkspace/X121/Old/Classes/x-saherelm.xprovider.class.mq5 b/MQLTestWorkspace/X121/Old/Classes/x-saherelm.xprovider.class.mq5 new file mode 100644 index 0000000..e60bb27 --- /dev/null +++ b/MQLTestWorkspace/X121/Old/Classes/x-saherelm.xprovider.class.mq5 @@ -0,0 +1,304 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 Class Library +// ---------------------------------------------- +// Name: XSCEABaseProvider +// Description: provides base requirements for +// Specific Sgnal Provider ... +// +// +// 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 + +// +// START Import and Inclused requirements ... +// + +// +// Includes ... +#include "../Libraries/x-saherelm.log.lib.mq5" +#include "../Libraries/x-saherelm.draw.lib.mq5" +#include "../Libraries/x-saherelm.models.lib.mq5" +#include "../Libraries/x-saherelm.common.lib.mq5" + +// +// END Import and Inclused requirements ... +// + +// +// START Definitions ... +// + +// +// Notified a Signal was Appears ... +typedef void (*OnSignal)( + XSignal &signal); + +// +// Notified a Guard Appears ... +typedef void (*OnGuard)(XGuard &guard); + +// +// END Definitions ... +// + +// +// START Overrides ... +// + +// +// END Overrides ... +// + +// +// a Base Class for All of our EA's ... +class XSCEABaseProvider +{ + // + // Public ... +public: + // + // Constructor ... + void XSCEABaseProvider() + { + mSymbol = _Symbol; + mPeriod = _Period; + } + void XSCEABaseProvider( + string symbol, + ENUM_TIMEFRAMES period) + { + // + mSymbol = symbol; + mPeriod = period; + + // + mTag = mSymbol + "," + ToString(mPeriod); + + // + mIsInTestMode = IsRunningOnTestMode(); + } + + // + // Deconstructor ... + void ~XSCEABaseProvider() + { + } + + // + bool CanIgnoreTick() { + // + mIsNewCandle = IsNewCandle( + mSymbol, + mPeriod); + bool result = mIsInTestMode + ? !mIsNewCandle + : !mIsNewCandle && mWaitUntilNewCandle; + + // + return result; + } + + // + // Prepare State ... + void OnTick() + { + // + mIsNewCandle = IsNewCandle( + mSymbol, + mPeriod); + mCanIgnoreTick = mIsInTestMode + ? !mIsNewCandle + : !mIsNewCandle && mWaitUntilNewCandle; + + // + ProcessBuffers(); + + // + if (mCanIgnoreTick) + { + return; + } + + // + mWaitUntilNewCandle = false; + + // + ProcessTick(); + } + + // + virtual void PrepareTag(); + + // + // Initialize Indicators and Requirements ... + virtual bool Init(); + + // + virtual int GetMaxLength(); + + // + virtual int GetCalculatedBars(); + + // + // Handle Update Buffers ... + virtual void ProcessBuffers() + { + return; + } + + // + // Handle On Tick Event ... + virtual void ProcessTick() + { + return; + } + + // + // Check for Guards ... + virtual bool GuardCheck(XGuard &guards[]); + + // + // Add Specific On Signal Event Handler ... + int AddOnSignalEventHandler(OnSignal handler) + { + // + ArrayResize( + mSignalEventHandlers, + ArraySize(mSignalEventHandlers) + 1); + + // + int result = ArraySize(mSignalEventHandlers) - 1; + mSignalEventHandlers[result] = handler; + + // + return result; + } + + // + // Remove All On Signal Event Handler ... + void ReoveOnSignalEventHandlers() + { + // + ArrayFree(mSignalEventHandlers); + } + + // + // Notify a Signal Found on all Event Listeners ... + void NotifyOnSignalEvent(XSignal &info) + { + // + int listenerCount = ArraySize(mSignalEventHandlers); + if (listenerCount <= 0) + { + return; + } + + // + // Loop Through Listeners ... + for (int i = 0; i < listenerCount; i++) + { + // + OnSignal listener = mSignalEventHandlers[i]; + + // + listener(info); + } + } + + // + // Protected ... +protected: + // + string mSymbol; + + // + ENUM_TIMEFRAMES mPeriod; + + // + string mTag; + + // + bool mIsNewCandle; + bool mIsInTestMode; + bool mCanIgnoreTick; + bool mWaitUntilNewCandle; + + // + // Private ... +private: + // + // Signal Event Handlers ... + OnSignal mSignalEventHandlers[]; +}; + +// +// START Definitions ... +// + +// +// Model Signal Providers Definitions ... +struct XBaseSignalProvider +{ + // + // Provider use Which Symbol ... + string symbol; + + // + // Provider use Which Time Frame ... + ENUM_TIMEFRAMES period; + + // + // Risk Amount Per Trades Related to Time Frames ... + // Percent of Available Balance ... + double riskAmount; + + // + // Desired Magic Number ... + ulong magicNumber; +}; + +// +struct XLastSignal +{ + datetime at; + string provider; +}; + +// +// END Definitions ... +// + +// +// START Usefull Functions ... +// + +// +// Add Specific Provider to List ... +void Add( + XBaseSignalProvider &item, // item want to add + XBaseSignalProvider &buffer[] // Destination buffer +) +{ + // + ArrayResize( + buffer, + ArraySize(buffer) + 1); + + // + buffer[ArraySize(buffer) - 1] = item; +} + +// +// END Usefull Functions ... +// diff --git a/MQLTestWorkspace/X121/Old/Classes/x-saherelm.xtrade.class.ex5 b/MQLTestWorkspace/X121/Old/Classes/x-saherelm.xtrade.class.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..8b4746eb01b36900d35d89b28777da18e01c0b01 GIT binary patch literal 6974 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 Buy ... + // DEAL_TYPE_SELL => Sell ... + // DEAL_TYPE_BUY_CANCELED => Canceled buy deal ... + // There can be a situation when a previously executed buy deal is canceled. In this case, + // the type of the previously executed deal (DEAL_TYPE_BUY) is changed to DEAL_TYPE_BUY_CANCELED, + // and its profit/loss is zeroized. Previously obtained profit/loss is charged/withdrawn using a separated balance operation ... + // + // DEAL_TYPE_SELL_CANCELED => Canceled sell deal ... + // There can be a situation when a previously executed sell deal is canceled. In this case, + // the type of the previously executed deal (DEAL_TYPE_SELL) is changed to DEAL_TYPE_SELL_CANCELED, + // and its profit/loss is zeroized. Previously obtained profit/loss is charged/withdrawn using a separated balance operation + // + // DEAL_TYPE_BALANCE => Balance ... + // DEAL_TYPE_CREDIT => Credit ... + // DEAL_TYPE_CHARGE => Additional charge ... + // DEAL_TYPE_CORRECTION => Correction ... + // DEAL_TAX => Tax charges ... + // DEAL_TYPE_BONUS => Bonus ... + // DEAL_TYPE_INTEREST => Interest rate ... + // DEAL_DIVIDEND => Dividend operations... + // DEAL_DIVIDEND_FRANKED => Franked (non-taxable) dividend operations ... + // DEAL_TYPE_COMMISSION => Additional commission ... + // DEAL_TYPE_COMMISSION_DAILY => Daily commission ... + // DEAL_TYPE_COMMISSION_MONTHLY => Monthly commission ... + // DEAL_TYPE_COMMISSION_AGENT_DAILY => Daily agent commission ... + // DEAL_TYPE_COMMISSION_AGENT_MONTHLY => Monthly agent commission + ENUM_DEAL_TYPE type; + + // + // the deal direction ... + // ---------------------------------- + // DEAL_ENTRY_IN => Entry in ... + // DEAL_ENTRY_OUT => Entry out ... + // DEAL_ENTRY_INOUT => Reverse ... + // DEAL_ENTRY_OUT_BY => Close a position by an opposite one ... + ENUM_DEAL_ENTRY entry; + + // + // deal reson ... + // --------------------- + // DEAL_REASON_SL => The deal was executed as a result of Stop Loss activation ... + // DEAL_REASON_TP => The deal was executed as a result of Take Profit activation ... + // DEAL_REASON_SO => The deal was executed as a result of the Stop Out event ... + // DEAL_REASON_WEB => The deal was executed as a result of activation of an order placed from the web platform ... + // DEAL_REASON_SPLIT => The deal was executed after the split (price reduction) of an instrument, which had an open position during split announcement ... + // DEAL_REASON_CLIENT => The deal was executed as a result of activation of an order placed from a desktop terminal ... + // DEAL_REASON_MOBILE => The deal was executed as a result of activation of an order placed from a mobile application ... + // DEAL_REASON_EXPERT => The deal was executed as a result of activation of an order placed from an MQL5 program, i.e. an Expert Advisor or a script ... + // DEAL_REASON_VMARGIN => The deal was executed after charging the variation margin ... + // DEAL_REASON_ROLLOVER => The deal was executed due to a rollover ... + ENUM_DEAL_REASON reason; +}; + +// +// Model a Position with all of it's Supports ... +struct XPositionPack +{ + // + ulong ticket; + + // + XPosition position; + + // + int supportOrdersCount; + int supportPositionsCount; + + // + XOrder supportOrders[]; + XPosition supportPositions[]; +}; + +// +// Model OnTrade Event Handler Result on XCTrade Class ... +struct XOnTradeHandlerState +{ + // + bool hasNewDeal; + int newDeals; + + // + bool hasNewOrder; + int newOrders; + + // + bool hasNewPosition; + int newPositions; + + // + bool hasNewHistoryOrder; + int newHistoryOrders; +}; + +// +typedef void (*TOnDealsChanged)(int count); + +// +typedef void (*TOnOrdersChanged)(int count); + +// +typedef void (*TOnPositionsChanged)(int count); + +// +typedef void (*TOnStopLoss)(const XDeal &deal); +typedef void (*TOnTakeProfit)(const XDeal &deal); + +// +typedef void (*TOnTradeStateChanged)(const XOnTradeHandlerState &state); + +// +// END Definitions ... +// + +// +// START Import and Inclused requirements ... +// + +// +// Includes ... +#include +#include "../Libraries/x-saherelm.log.lib.mq5" +#include "../Libraries/x-saherelm.common.lib.mq5" +#include "../Libraries/x-saherelm.seriallizer.lib.mq5" + +// +// END Import and Inclused requirements ... +// + +// +// START Overrides ... +// + +// +// XCTrade Base Class ... +class XSCTradeBase : public CTrade +{ +public: + // + // Modify Specific Position, by Specific Comment ... + bool PositionModify( + const string symbol, // Symbol + const double sl, // Stop Loss + const double tp, // Take Profit + const string comment = "" // Comment For Modify + ) + { + // + // check stopped + if (IsStopped(__FUNCTION__)) + { + return (false); + } + + // + // check position existence + if (!SelectPosition(symbol)) + { + return (false); + } + + // + // clean + ClearStructures(); + + // + // setting request + m_request.action = TRADE_ACTION_SLTP; + m_request.symbol = symbol; + m_request.magic = m_magic; + m_request.sl = sl; + m_request.tp = tp; + m_request.position = PositionGetInteger(POSITION_TICKET); + + // + // Specified Comment ... + if (StringLen(comment) > 0) + { + m_request.comment = comment; + } + + // + // action and return the result + return (OrderSend(m_request, m_result)); + } + bool PositionModify( + const ulong ticket, // Position Ticket + const double sl, // Stop Loss + const double tp, // Take Profit + const string comment = "" // Comment For Modify + ) + { + // + // check stopped + if (IsStopped(__FUNCTION__)) + { + return (false); + } + + // + // check position existence + if (!PositionSelectByTicket(ticket)) + { + return (false); + } + + // + // clean + ClearStructures(); + + // + // setting request + m_request.action = TRADE_ACTION_SLTP; + m_request.position = ticket; + m_request.symbol = PositionGetString(POSITION_SYMBOL); + m_request.magic = m_magic; + m_request.sl = sl; + m_request.tp = tp; + + // + // Specified Comment ... + if (StringLen(comment) > 0) + { + m_request.comment = comment; + } + + // + // action and return the result + return (OrderSend(m_request, m_result)); + } + + // + // Close Specific Position, by Specific Comment ... + bool PositionClose( + const string symbol, // Symbol + const ulong deviation, // Deviation + const string comment = "" // Comment For Close + ) + { + // + bool partial_close = false; + int retry_count = 10; + uint retcode = TRADE_RETCODE_REJECT; + + // + // check stopped + if (IsStopped(__FUNCTION__)) + { + return (false); + } + + // + // clean + ClearStructures(); + + // + // check filling + if (!FillingCheck(symbol)) + { + return (false); + } + + // + do + { + // + // check + if (SelectPosition(symbol)) + { + // + if ((ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY) + { + // + // prepare request for close BUY position + m_request.type = ORDER_TYPE_SELL; + m_request.price = SymbolInfoDouble(symbol, SYMBOL_BID); + } + else + { + // + // prepare request for close SELL position + m_request.type = ORDER_TYPE_BUY; + m_request.price = SymbolInfoDouble(symbol, SYMBOL_ASK); + } + } + else + { + // + // position not found + m_result.retcode = retcode; + return (false); + } + + // + // setting request + m_request.action = TRADE_ACTION_DEAL; + m_request.symbol = symbol; + m_request.volume = PositionGetDouble(POSITION_VOLUME); + m_request.magic = m_magic; + m_request.deviation = (deviation == ULONG_MAX) ? m_deviation : deviation; + m_request.position = PositionGetInteger(POSITION_TICKET); + + // + // Specify Comment ... + m_request.comment = comment; + + // + // check volume + double max_volume = SymbolInfoDouble(symbol, SYMBOL_VOLUME_MAX); + if (m_request.volume > max_volume) + { + // + m_request.volume = max_volume; + partial_close = true; + } + else + { + partial_close = false; + } + + // + // hedging? just send order + if (IsHedging()) + { + return (OrderSend(m_request, m_result)); + } + + // + // order send + if (!OrderSend(m_request, m_result)) + { + // + if (--retry_count != 0) + { + continue; + } + + // + if (retcode == TRADE_RETCODE_DONE_PARTIAL) + { + m_result.retcode = retcode; + } + + // + return (false); + } + + // + //--- WARNING. If position volume exceeds the maximum volume allowed for deal, + //--- and when the asynchronous trade mode is on, for safety reasons, position is closed not completely, + //--- but partially. It is decreased by the maximum volume allowed for deal. + if (m_async_mode) + { + break; + } + + // + retcode = TRADE_RETCODE_DONE_PARTIAL; + if (partial_close) + { + Sleep(1000); + } + } while (partial_close); + + // + // succeed + return (true); + } + bool PositionClose( + const ulong ticket, // Position Ticket + const ulong deviation, // Deviation + const string comment = "" // Comment For Close + ) + { + // + // check stopped + if (IsStopped(__FUNCTION__)) + { + return (false); + } + + // + // check position existence + if (!PositionSelectByTicket(ticket)) + { + return (false); + } + + // + string symbol = PositionGetString(POSITION_SYMBOL); + + // + // clean + ClearStructures(); + + // + // check filling + if (!FillingCheck(symbol)) + { + return (false); + } + + // + // check + if ((ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY) + { + // + // prepare request for close BUY position + m_request.type = ORDER_TYPE_SELL; + m_request.price = SymbolInfoDouble(symbol, SYMBOL_BID); + } + else + { + // + // prepare request for close SELL position + m_request.type = ORDER_TYPE_BUY; + m_request.price = SymbolInfoDouble(symbol, SYMBOL_ASK); + } + + // + // setting request + m_request.action = TRADE_ACTION_DEAL; + m_request.position = ticket; + m_request.symbol = symbol; + m_request.volume = PositionGetDouble(POSITION_VOLUME); + m_request.magic = m_magic; + m_request.deviation = (deviation == ULONG_MAX) ? m_deviation : deviation; + + // + // Specify Comment ... + m_request.comment = comment; + + // + // close position + return (OrderSend(m_request, m_result)); + } + + // + // Partial Close Specific Position, by Specific Comment ... + bool PositionClosePartial( + const string symbol, // Symbol + const double volume, // Partial Closing Volume + const ulong deviation, // Deviation + const string comment = "" // Comment For Close + ) + { + // + uint retcode = TRADE_RETCODE_REJECT; + + // + // check stopped + if (IsStopped(__FUNCTION__)) + { + return (false); + } + + // + // for hedging mode only + if (!IsHedging()) + { + return (false); + } + + // + // clean + ClearStructures(); + + // + // check filling + if (!FillingCheck(symbol)) + { + return (false); + } + + // + // check + if (SelectPosition(symbol)) + { + // + if ((ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY) + { + // + // prepare request for close BUY position + m_request.type = ORDER_TYPE_SELL; + m_request.price = SymbolInfoDouble(symbol, SYMBOL_BID); + } + else + { + // + // prepare request for close SELL position + m_request.type = ORDER_TYPE_BUY; + m_request.price = SymbolInfoDouble(symbol, SYMBOL_ASK); + } + } + else + { + // + // position not found + m_result.retcode = retcode; + return (false); + } + + // + // check volume + double position_volume = PositionGetDouble(POSITION_VOLUME); + if (position_volume > volume) + { + position_volume = volume; + } + + // + // setting request + m_request.action = TRADE_ACTION_DEAL; + m_request.symbol = symbol; + m_request.volume = position_volume; + m_request.magic = m_magic; + m_request.deviation = (deviation == ULONG_MAX) ? m_deviation : deviation; + m_request.position = PositionGetInteger(POSITION_TICKET); + + // + // Specifieng Comment ... + m_request.comment = comment; + + // + // hedging? just send order + return (OrderSend(m_request, m_result)); + } + bool PositionClosePartial( + const ulong ticket, // Position Ticket + const double volume, // Partial Closing Volume + const ulong deviation, // Deviation + const string comment = "" // Comment For Close + ) + { + // + // check stopped + if (IsStopped(__FUNCTION__)) + { + return (false); + } + + // + // for hedging mode only + if (!IsHedging()) + { + return (false); + } + + // + // check position existence + if (!PositionSelectByTicket(ticket)) + { + return (false); + } + + // + string symbol = PositionGetString(POSITION_SYMBOL); + + // + // clean + ClearStructures(); + + // + // check filling + if (!FillingCheck(symbol)) + { + return (false); + } + + // + // check + if ((ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY) + { + // + // prepare request for close BUY position + m_request.type = ORDER_TYPE_SELL; + m_request.price = SymbolInfoDouble(symbol, SYMBOL_BID); + } + else + { + // + // prepare request for close SELL position + m_request.type = ORDER_TYPE_BUY; + m_request.price = SymbolInfoDouble(symbol, SYMBOL_ASK); + } + + // + // check volume + double position_volume = PositionGetDouble(POSITION_VOLUME); + if (position_volume > volume) + { + position_volume = volume; + } + + // + // setting request + m_request.action = TRADE_ACTION_DEAL; + m_request.position = ticket; + m_request.symbol = symbol; + m_request.volume = position_volume; + m_request.magic = m_magic; + m_request.deviation = (deviation == ULONG_MAX) ? m_deviation : deviation; + + // + // Specifieng Comment ... + m_request.comment = comment; + + // + // close position + return (OrderSend(m_request, m_result)); + } +}; + +// +// END Overrides ... +// + +// +// a Class for Manage Trades ... +class XSCTrade +{ + // + // Public ... +public: + // + // Constructor ... + void XSCTrade( + int slippage, // Specify Slippage + ulong magicNumber // Specify Magic Number + ) + { + // + mSlippage = slippage; + mMagicNumber = magicNumber; + + // + mPeriodPrefix = "PR"; + + // + mTrader = new XSCTradeBase(); + + // + mTrader.SetAsyncMode(false); + mTrader.SetDeviationInPoints(mSlippage); + mTrader.SetExpertMagicNumber(mMagicNumber); + + // + // Setting Log Level ... + mTrader.LogLevel(LOG_LEVEL_ERRORS); + + // + // Prepare Trade Event Materials ... + // + mDaysForRead = 1; + mScanStarted = false; + + // + // Reset On Trade Counter ... + ResetOnTradeContext(); + + // + // Init On Trade Context ... + InitOnTradeContext(); + } + + // + // Deconstructor ... + void ~XSCTrade() + { + } + + // + // START Event Processing ... + // + + // + // This Must be Called Every time OnTrade Event Happening ... + XOnTradeHandlerState HandleOnTrade() + { + // + // Handle OnTrade Event ... + XOnTradeHandlerState state = {}; + HandleOnTradeEvent(state); + if ( + !state.hasNewDeal && + !state.hasNewOrder && + !state.hasNewPosition && + !state.hasNewHistoryOrder) + { + return state; + } + + // + // STATE ... + + // + // Notfy Trade State Changed Event ... + NotifyTradeStateChangeEvent(state); + + // + // DEALS ... + if (state.hasNewDeal) + { + // + // Notfy Deals Changed Event ... + NotifyDealsChangeEvent(state.newDeals); + + // + // Retrieve Last Deal ... + XDeal deals[]; + GetDeals(deals); + int dealsCount = ArraySize(deals); + if (dealsCount > 0) + { + // + XDeal lastDeal = deals[0]; + + // + if (lastDeal.reason == DEAL_REASON_TP) + { + NotifyTakeProfitEvent(lastDeal); + } + else if (lastDeal.reason == DEAL_REASON_SL) + { + NotifyStopLossEvent(lastDeal); + } + } + } + + // + // ORDERS ... + if (state.hasNewOrder || state.hasNewHistoryOrder) + { + // + // Notfy Orders Changed Event ... + NotifyOrdersChangeEvent(state.newOrders + state.newHistoryOrders); + } + + // + // POSITIONS ... + if (state.hasNewPosition) + { + // + // Notfy Positions Changed Event ... + NotifyPositionsChangeEvent(state.newPositions); + } + + // + return state; + } + + // + // Process On Trade Requirement + void HandleOnTradeEvent( + XOnTradeHandlerState &result // Hold's Result + ) + { + // + if (mScanStarted) + { + ProcessOnTradeContext(result); + } + else + { + InitOnTradeContext(); + } + } + + // + // Event Emitters ... + + // + // STATE Changed ... + + // + // Clear Trade State Changed Event Handlers ... + void ClearOnTradeStateChangedEventHandlers() + { + // + ArrayFree(mTradeStateChangedEventHandlers); + + // + ArrayResize(mTradeStateChangedEventHandlers, 0); + } + + // + // Add New Deals Changed Event Handler ... + void AddOnTradeStateChangedEventHandler(TOnTradeStateChanged handler) + { + // + ArrayResize( + mTradeStateChangedEventHandlers, + ArraySize(mTradeStateChangedEventHandlers) + 1); + + // + mTradeStateChangedEventHandlers[ArraySize(mTradeStateChangedEventHandlers) - 1] = handler; + } + + // + // DEALS ... + + // + // Clear Deals Changed Event Handlers ... + void ClearOnDealsChangedEventHandlers() + { + // + ArrayFree(mDealsChangedEventHandlers); + + // + ArrayResize(mDealsChangedEventHandlers, 0); + } + + // + // Add New Deals Changed Event Handler ... + void AddOnDealsChangedEventHandler(TOnDealsChanged handler) + { + // + ArrayResize( + mDealsChangedEventHandlers, + ArraySize(mDealsChangedEventHandlers) + 1); + + // + mDealsChangedEventHandlers[ArraySize(mDealsChangedEventHandlers) - 1] = handler; + } + + // + // ORDERS ... + + // + // Clear Orders Changed Event Handlers ... + void ClearOnOrdersChangedEventHandlers() + { + // + ArrayFree(mOrdersChangedEventHandlers); + + // + ArrayResize(mOrdersChangedEventHandlers, 0); + } + + // + // Add New Orders Changed Event Handler ... + void AddOnOrdersChangedEventHandler(TOnOrdersChanged handler) + { + // + ArrayResize( + mOrdersChangedEventHandlers, + ArraySize(mOrdersChangedEventHandlers) + 1); + + // + mOrdersChangedEventHandlers[ArraySize(mOrdersChangedEventHandlers) - 1] = handler; + } + + // + // POSITIONS ... + + // + // Clear Positions Changed Event Handlers ... + void ClearOnPositionsChangedEventHandlers() + { + // + ArrayFree(mPositionsChangedEventHandlers); + + // + ArrayResize(mPositionsChangedEventHandlers, 0); + } + + // + // Add New Positions Changed Event Handler ... + void AddOnPositionsChangedEventHandler(TOnPositionsChanged handler) + { + // + ArrayResize( + mPositionsChangedEventHandlers, + ArraySize(mPositionsChangedEventHandlers) + 1); + + // + mPositionsChangedEventHandlers[ArraySize(mPositionsChangedEventHandlers) - 1] = handler; + } + + // + // TPSL ... + + // + // Clear Stop Loss Event Handlers ... + void ClearOnStopLossEventHandlers() + { + // + ArrayFree(mStopLossEventHandlers); + + // + ArrayResize(mStopLossEventHandlers, 0); + } + + // + // Add New Stop Loss Event Handler ... + void AddOnStopLossEventHandler(TOnStopLoss handler) + { + // + ArrayResize( + mStopLossEventHandlers, + ArraySize(mStopLossEventHandlers) + 1); + + // + mStopLossEventHandlers[ArraySize(mStopLossEventHandlers) - 1] = handler; + } + + // + // Clear Take Profit Event Handlers ... + void ClearOnTakeProfitEventHandlers() + { + // + ArrayFree(mTakeProfitEventHandlers); + + // + ArrayResize(mTakeProfitEventHandlers, 0); + } + + // + // Add New Stop Loss Event Handler ... + void AddOnTakeProfitEventHandler(TOnTakeProfit handler) + { + // + ArrayResize( + mTakeProfitEventHandlers, + ArraySize(mTakeProfitEventHandlers) + 1); + + // + mTakeProfitEventHandlers[ArraySize(mTakeProfitEventHandlers) - 1] = handler; + } + + // + // END Event Processing ... + // + + // + // START Provided Functions ... + // + + // + // Count Currently Open Positions ... + int CountPositions( + string symbol = "", // Specified Symbol + ENUM_POSITION_TYPE type = NULL // Specified Type + ) + { + // + int result = 0; + + // + int allPositions = 0; + int longPositions = 0; + int shortPositions = 0; + + // + int positionsCount = PositionsTotal(); + if (positionsCount <= 0) + { + return result; + } + + // + for (int i = 0; i < positionsCount; i++) + { + // + if (!mPositionInfo.SelectByIndex(i)) + { + continue; + } + + // + if (mPositionInfo.Magic() != mMagicNumber) + { + continue; + } + + // + string positionSymbol = mPositionInfo.Symbol(); + + // + ENUM_POSITION_TYPE positionType = mPositionInfo.PositionType(); + + // + if ( + type == NULL && + StringLen(symbol) <= 0) + { + // + allPositions++; + + // + continue; + } + else if ( + type != NULL && + StringLen(symbol) > 0) + { + // + if (type == positionType && + symbol == positionSymbol) + { + // + if (type == POSITION_TYPE_BUY) + { + longPositions++; + } + else + { + shortPositions++; + } + + // + continue; + } + } + else if (StringLen(symbol) > 0) + { + // + if (positionSymbol == symbol) + { + // + allPositions++; + + // + continue; + } + } + else if (type != NULL) + { + // + if (type == positionType) + { + // + if (type == POSITION_TYPE_BUY) + { + longPositions++; + } + else + { + shortPositions++; + } + + // + continue; + } + } + } + + // + // Specify Result ... + if ( + type == NULL && + StringLen(symbol) <= 0) + { + // + result = allPositions; + } + else if ( + type != NULL && + StringLen(symbol) > 0) + { + // + if (type == POSITION_TYPE_BUY) + { + result = longPositions; + } + else + { + result = shortPositions++; + } + } + else if (StringLen(symbol) > 0) + { + // + result = allPositions; + } + else if (type != NULL) + { + // + if (type == POSITION_TYPE_BUY) + { + result = longPositions; + } + else + { + result = shortPositions; + } + } + + // + return result; + } + + // + // Retrieve Max In Profit Position Ticket ... + ulong GetMaxInProfitPosition( + string symbol = "", // Specified Symbol + ENUM_POSITION_TYPE type = NULL // Specified Type + ) + { + // + ulong result = -1; + + // + double profit = 0; + + // + int positionsCount = PositionsTotal(); + if (positionsCount <= 0) + { + return result; + } + + // + for (int i = 0; i < positionsCount; i++) + { + // + if (!mPositionInfo.SelectByIndex(i)) + { + continue; + } + + // + if (mPositionInfo.Magic() != mMagicNumber) + { + continue; + } + + // + ulong positionTicket = mPositionInfo.Ticket(); + + // + string positionSymbol = mPositionInfo.Symbol(); + + // + double positionProfit = mPositionInfo.Profit(); + double positionAbsProfit = MathAbs(positionProfit); + if (positionProfit <= 0) + { + continue; + } + + // + ENUM_POSITION_TYPE positionType = mPositionInfo.PositionType(); + + // + if ( + type == NULL && + StringLen(symbol) <= 0) + { + // + if (profit < positionAbsProfit) + { + // + result = positionTicket; + profit = positionAbsProfit; + } + + // + continue; + } + else if ( + type != NULL && + StringLen(symbol) > 0) + { + // + if (type == positionType && + symbol == positionSymbol) + { + // + if (type == POSITION_TYPE_BUY) + { + // + if (profit < positionAbsProfit) + { + // + result = positionTicket; + profit = positionAbsProfit; + } + } + else + { + // + if (profit < positionAbsProfit) + { + // + result = positionTicket; + profit = positionAbsProfit; + } + } + + // + continue; + } + } + else if (StringLen(symbol) > 0) + { + // + if (positionSymbol == symbol) + { + // + if (profit < positionAbsProfit) + { + // + result = positionTicket; + profit = positionAbsProfit; + } + + // + continue; + } + } + else if (type != NULL) + { + // + if (type == positionType) + { + // + if (type == POSITION_TYPE_BUY) + { + // + if (profit < positionAbsProfit) + { + // + result = positionTicket; + profit = positionAbsProfit; + } + } + else + { + // + if (profit < positionAbsProfit) + { + // + result = positionTicket; + profit = positionAbsProfit; + } + } + + // + continue; + } + } + } + + // + return result; + } + + // + // Retrieve Max In DrawDown Position Ticket ... + ulong GetMaxInDrawDownPosition( + string symbol = "", // Specified Symbol + ENUM_POSITION_TYPE type = NULL // Specified Type + ) + { + // + ulong result = -1; + + // + double profit = 0; + + // + int positionsCount = PositionsTotal(); + if (positionsCount <= 0) + { + return result; + } + + // + for (int i = 0; i < positionsCount; i++) + { + // + if (!mPositionInfo.SelectByIndex(i)) + { + continue; + } + + // + if (mPositionInfo.Magic() != mMagicNumber) + { + continue; + } + + // + ulong positionTicket = mPositionInfo.Ticket(); + + // + string positionSymbol = mPositionInfo.Symbol(); + + // + double positionProfit = mPositionInfo.Profit(); + double positionAbsProfit = MathAbs(positionProfit); + if (positionProfit >= 0) + { + continue; + } + + // + ENUM_POSITION_TYPE positionType = mPositionInfo.PositionType(); + + // + if ( + type == NULL && + StringLen(symbol) <= 0) + { + // + if (profit < positionAbsProfit) + { + // + result = positionTicket; + profit = positionAbsProfit; + } + + // + continue; + } + else if ( + type != NULL && + StringLen(symbol) > 0) + { + // + if (type == positionType && + symbol == positionSymbol) + { + // + if (type == POSITION_TYPE_BUY) + { + // + if (profit < positionAbsProfit) + { + // + result = positionTicket; + profit = positionAbsProfit; + } + } + else + { + // + if (profit < positionAbsProfit) + { + // + result = positionTicket; + profit = positionAbsProfit; + } + } + + // + continue; + } + } + else if (StringLen(symbol) > 0) + { + // + if (positionSymbol == symbol) + { + // + if (profit < positionAbsProfit) + { + // + result = positionTicket; + profit = positionAbsProfit; + } + + // + continue; + } + } + else if (type != NULL) + { + // + if (type == positionType) + { + // + if (type == POSITION_TYPE_BUY) + { + // + if (profit < positionAbsProfit) + { + // + result = positionTicket; + profit = positionAbsProfit; + } + } + else + { + // + if (profit < positionAbsProfit) + { + // + result = positionTicket; + profit = positionAbsProfit; + } + } + + // + continue; + } + } + } + + // + return result; + } + + // + // Retrieve Specific Position's Profit ... + double GetPositionProfit( + const ulong ticket // Specified Position Ticket + ) + { + // + double result = 0; + + // + int positionsCount = PositionsTotal(); + if (positionsCount <= 0) + { + return result; + } + + // + for (int i = 0; i < positionsCount; i++) + { + // + if (!mPositionInfo.SelectByIndex(i)) + { + continue; + } + + // + if (mPositionInfo.Magic() != mMagicNumber) + { + continue; + } + + // + ulong positionTicket = mPositionInfo.Ticket(); + if (positionTicket != ticket) + { + continue; + } + + // + result = mPositionInfo.Profit(); + break; + } + + // + return result; + } + + // + // Retrieve Specific Position's OpenDate ... + datetime GetPositionOpenDate( + const ulong ticket // Specified Position Ticket + ) + { + // + datetime result = 0; + + // + int positionsCount = PositionsTotal(); + if (positionsCount <= 0) + { + return result; + } + + // + for (int i = 0; i < positionsCount; i++) + { + // + if (!mPositionInfo.SelectByIndex(i)) + { + continue; + } + + // + if (mPositionInfo.Magic() != mMagicNumber) + { + continue; + } + + // + ulong positionTicket = mPositionInfo.Ticket(); + if (positionTicket != ticket) + { + continue; + } + + // + result = mPositionInfo.Time(); + break; + } + + // + return result; + } + + // + // Retrieve Specific Position's Comment ... + string GetPositionComment( + const ulong ticket // Specified Position Ticket + ) + { + // + string result = ""; + + // + int positionsCount = PositionsTotal(); + if (positionsCount <= 0) + { + return result; + } + + // + for (int i = 0; i < positionsCount; i++) + { + // + if (!mPositionInfo.SelectByIndex(i)) + { + continue; + } + + // + if (mPositionInfo.Magic() != mMagicNumber) + { + continue; + } + + // + ulong positionTicket = mPositionInfo.Ticket(); + if (positionTicket != ticket) + { + continue; + } + + // + result = mPositionInfo.Comment(); + break; + } + + // + return result; + } + + // + // Retrieve All Open Positions Profit ... + double GetPositionsProfit( + string symbol = "", // Specified Symbol + ENUM_POSITION_TYPE type = NULL // Specified Type + ) + { + // + double result = 0; + + // + int positionsCount = PositionsTotal(); + if (positionsCount <= 0) + { + return result; + } + + // + for (int i = 0; i < positionsCount; i++) + { + // + if (!mPositionInfo.SelectByIndex(i)) + { + continue; + } + + // + if (mPositionInfo.Magic() != mMagicNumber) + { + continue; + } + + // + ulong positionTicket = mPositionInfo.Ticket(); + + // + string positionSymbol = mPositionInfo.Symbol(); + + // + double positionProfit = mPositionInfo.Profit(); + + // + ENUM_POSITION_TYPE positionType = mPositionInfo.PositionType(); + + // + if ( + type == NULL && + StringLen(symbol) <= 0) + { + // + result += positionProfit; + + // + continue; + } + else if ( + type != NULL && + StringLen(symbol) > 0) + { + // + if (type == positionType && + symbol == positionSymbol) + { + // + if (type == POSITION_TYPE_BUY) + { + result += positionProfit; + } + else + { + result += positionProfit; + } + + // + continue; + } + } + else if (StringLen(symbol) > 0) + { + // + if (positionSymbol == symbol) + { + result += positionProfit; + + // + continue; + } + } + else if (type != NULL) + { + // + if (type == positionType) + { + // + if (type == POSITION_TYPE_BUY) + { + result += positionProfit; + } + else + { + result += positionProfit; + } + + // + continue; + } + } + } + + // + return result; + } + + // + // Find Oldes Position ... + ulong GetOldestPosition( + string symbol = "", // Specified Symbol + ENUM_POSITION_TYPE type = NULL // Specified Type + ) + { + // + ulong result = 0; + + // + int age = 0; + + // + int positionsCount = PositionsTotal(); + if (positionsCount <= 0) + { + return result; + } + + // + for (int i = 0; i < positionsCount; i++) + { + // + if (!mPositionInfo.SelectByIndex(i)) + { + continue; + } + + // + if (mPositionInfo.Magic() != mMagicNumber) + { + continue; + } + + // + ulong positionTicket = mPositionInfo.Ticket(); + + // + string positionSymbol = mPositionInfo.Symbol(); + + // + double positionProfit = mPositionInfo.Profit(); + double positionAbsProfit = MathAbs(positionProfit); + if (positionProfit >= 0) + { + continue; + } + + // + ENUM_POSITION_TYPE positionType = mPositionInfo.PositionType(); + + // + string positionComment = mPositionInfo.Comment(); + ENUM_TIMEFRAMES positionPeriod = ExtractPositionPeriod(positionComment); + + // + // Calculate Position's Age ... + datetime positionOpenTime = mPositionInfo.Time(); + + // + // Retrieve Trade Open Bar Index based on Current Period ... + int positionOpenBarIndex = iBarShift( + positionSymbol, + positionPeriod, + positionOpenTime); + + // + // Calculate Trade Life ... + int positionAge = MathAbs(0 - positionOpenBarIndex); + + // + if ( + type == NULL && + StringLen(symbol) <= 0) + { + // + if (age < positionAge) + { + // + age = positionAge; + result = positionTicket; + } + + // + continue; + } + else if ( + type != NULL && + StringLen(symbol) > 0) + { + // + if (type == positionType && + symbol == positionSymbol) + { + // + if (type == POSITION_TYPE_BUY) + { + // + if (age < positionAge) + { + // + age = positionAge; + result = positionTicket; + } + } + else + { + // + if (age < positionAge) + { + // + age = positionAge; + result = positionTicket; + } + } + + // + continue; + } + } + else if (StringLen(symbol) > 0) + { + // + if (positionSymbol == symbol) + { + // + if (age < positionAge) + { + // + age = positionAge; + result = positionTicket; + } + + // + continue; + } + } + else if (type != NULL) + { + // + if (type == positionType) + { + // + if (type == POSITION_TYPE_BUY) + { + // + if (age < positionAge) + { + // + age = positionAge; + result = positionTicket; + } + } + else + { + // + if (age < positionAge) + { + // + age = positionAge; + result = positionTicket; + } + } + + // + continue; + } + } + } + + // + return result; + } + + // + // Force Open a Buy/Long Position ... + bool Buy( + string symbol, // Specified Symbol + ENUM_TIMEFRAMES period, // Specified Trade's Period + double volume, // position volume + double price, // execution price + double sl = 0, // stop loss price + double tp = 0, // take profit price + string comment = "" // comment + ) + { + // + bool result = false; + + // + string mPeriodStr = GeneratePositionPeriodComment(period); + + // + comment += mPeriodStr; + + // + result = mTrader.Buy( + volume, + symbol, + price, + sl, + tp, + comment); + + // + return result; + } + + // + // Send BUY LIMIT order ... + bool BuyLimit( + string symbol, // Specified Symbol + ENUM_TIMEFRAMES period, // Specified Trade's Period + double volume, // order volume + double price, // order price + double sl = 0.0, // stop loss price + double tp = 0.0, // take profit price + ENUM_ORDER_TYPE_TIME typeTime = ORDER_TIME_GTC, // order lifetime + datetime expiration = 0, // order expiration time + string comment = "" // comment + ) + { + // + bool result = false; + + // + string mPeriodStr = GeneratePositionPeriodComment(period); + + // + comment += mPeriodStr; + + // + result = mTrader.BuyLimit( + volume, + price, + symbol, + sl, + tp, + typeTime, + expiration, + comment); + + // + return result; + } + + // + // Send BUY STOP order ... + bool BuyStop( + string symbol, // Specified Symbol + ENUM_TIMEFRAMES period, // Specified Trade's Period + double volume, // order volume + double price, // order price + double sl = 0.0, // stop loss price + double tp = 0.0, // take profit price + ENUM_ORDER_TYPE_TIME typeTime = ORDER_TIME_GTC, // order lifetime + datetime expiration = 0, // order expiration time + string comment = "" // comment + ) + { + // + bool result = false; + + // + string mPeriodStr = GeneratePositionPeriodComment(period); + + // + comment += mPeriodStr; + + // + result = mTrader.BuyStop( + volume, + price, + symbol, + sl, + tp, + typeTime, + expiration, + comment); + + // + return result; + } + + // + // Force Open a Sell/Short Position ... + bool Sell( + string symbol, // Specified Symbol + ENUM_TIMEFRAMES period, // Specified Trade's Period + double volume, // position volume + double price, // execution price + double sl = 0, // stop loss price + double tp = 0, // take profit price + string comment = "" // comment + ) + { + // + bool result = false; + + // + string mPeriodStr = GeneratePositionPeriodComment(period); + + // + comment += mPeriodStr; + + // + result = mTrader.Sell( + volume, + symbol, + price, + sl, + tp, + comment); + + // + return result; + } + + // + // Send SELL LIMIT order ... + bool SellLimit( + string symbol, // Specified Symbol + ENUM_TIMEFRAMES period, // Specified Trade's Period + double volume, // order volume + double price, // order price + double sl = 0.0, // stop loss price + double tp = 0.0, // take profit price + ENUM_ORDER_TYPE_TIME typeTime = ORDER_TIME_GTC, // order lifetime + datetime expiration = 0, // order expiration time + string comment = "" // comment + ) + { + // + bool result = false; + + // + string mPeriodStr = GeneratePositionPeriodComment(period); + + // + comment += mPeriodStr; + + // + result = mTrader.SellLimit( + volume, + price, + symbol, + sl, + tp, + typeTime, + expiration, + comment); + + // + return result; + } + + // + // Send SELL STOP order ... + bool SellStop( + string symbol, // Specified Symbol + ENUM_TIMEFRAMES period, // Specified Trade's Period + double volume, // order volume + double price, // order price + double sl = 0.0, // stop loss price + double tp = 0.0, // take profit price + ENUM_ORDER_TYPE_TIME typeTime = ORDER_TIME_GTC, // order lifetime + datetime expiration = 0, // order expiration time + string comment = "" // comment + ) + { + // + bool result = false; + + // + string mPeriodStr = GeneratePositionPeriodComment(period); + + // + comment += mPeriodStr; + + // + result = mTrader.SellStop( + volume, + price, + symbol, + sl, + tp, + typeTime, + expiration, + comment); + + // + return result; + } + + // + // Modify Position ... + bool Modify( + const ulong ticket, // position ticket + double sl = 0, // stop loss price + double tp = 0, // take profit + string comment = "" // comment + ) + { + // + bool result = false; + + // + // Validate Args ... + if (tp <= 0 && sl <= 0) + { + result = false; + return result; + } + + // + // Use Position Comment when there isn't new One ... + if (StringLen(comment) == 0) + { + comment = GetPositionComment(ticket); + } + + // + result = mTrader.PositionModify( + ticket, + sl, + tp, + comment); + + // + return result; + } + + // + // Close Position By Ticket ... + bool Close( + ulong ticket, // Position Ticket + string comment = "" // Close Position By Specific Comment + ) + { + // + bool result = false; + + // + // Try to Select Position ... + if (!mPositionInfo.SelectByTicket(ticket)) + { + return result; + } + + // + // Close Position By Specific Comment ... + result = mTrader.PositionClose( + ticket, + mSlippage, + comment); + + // + return result; + } + + // + // Close All Positions ... + void CloseAllPositions( + string comment = "" // Close Position By Specific Comment + ) + { + // + int positionsCount = PositionsTotal(); + if (positionsCount <= 0) + { + return; + } + + // + for (int i = 0; i < positionsCount; i++) + { + // + if (!mPositionInfo.SelectByIndex(i)) + { + continue; + } + + // + if (mPositionInfo.Magic() != mMagicNumber) + { + continue; + } + + // + ulong positionTicket = mPositionInfo.Ticket(); + Close( + positionTicket, + comment); + } + } + + // + // Close Partial By Ticket ... + bool ClosePartial( + ulong ticket, // Position Ticket + double volume, // Volume Size for Partial Closing + string comment = "" // Close Position By Specific Comment + ) + { + // + bool result = false; + + // + if (!mPositionInfo.SelectByTicket(ticket)) + { + return result; + } + + // + result = mTrader.PositionClosePartial( + ticket, + volume, + mSlippage, + comment); + + // + return result; + } + + // + // Find Position Open Bar Index ... + int GetPositionOpenBarIndex( + const ulong ticket // position ticket + ) + { + // + int result = -1; + + // + int positionsCount = PositionsTotal(); + if (positionsCount <= 0) + { + return result; + } + + // + for (int i = 0; i < positionsCount; i++) + { + // + if (!mPositionInfo.SelectByIndex(i)) + { + continue; + } + + // + if (mPositionInfo.Magic() != mMagicNumber) + { + continue; + } + + // + ulong positionTicket = mPositionInfo.Ticket(); + if (positionTicket != ticket) + { + continue; + } + + // + string symbol = mPositionInfo.Symbol(); + datetime openAt = mPositionInfo.Time(); + string comment = mPositionInfo.Comment(); + ENUM_TIMEFRAMES period = ExtractPositionPeriod(comment); + + // + result = iBarShift( + symbol, + period, + openAt); + } + + // + return result; + } + + // + bool GetPosition( + XPosition &position, // Holds result ... + ulong ticket // Required Position Ticket ... + ) + { + // + bool result = false; + + // + XPosition positions[]; + GetPositions(positions); + int positionsCount = ArraySize(positions); + if (positionsCount <= 0) + { + return result; + } + + // + for (int i = 0; i < positionsCount; i++) + { + // + XPosition iPosition = positions[i]; + + // + result = iPosition.ticket == ticket; + if (!result) + { + continue; + } + + // + position = iPosition; + break; + } + + // + return result; + } + + // + // Retrieve Positions as an Array ... + void GetPositions( + XPosition &result[] // Hold Result ... + ) + { + // + Clean(result); + + // + int positionsCount = PositionsTotal(); + if (positionsCount <= 0) + { + return; + } + + // + for (int i = 0; i < positionsCount; i++) + { + // + if (!mPositionInfo.SelectByIndex(i)) + { + continue; + } + + // + if (mPositionInfo.Magic() != mMagicNumber) + { + continue; + } + + // + ulong magic = mPositionInfo.Magic(); + ulong ticket = mPositionInfo.Ticket(); + string symbol = mPositionInfo.Symbol(); + datetime openAt = mPositionInfo.Time(); + double swap = mPositionInfo.Swap(); + double sl = mPositionInfo.StopLoss(); + double tp = mPositionInfo.TakeProfit(); + double profit = mPositionInfo.Profit(); + double volume = mPositionInfo.Volume(); + string comment = mPositionInfo.Comment(); + double entry = mPositionInfo.PriceOpen(); + double price = mPositionInfo.PriceCurrent(); + double commission = mPositionInfo.Commission(); + ENUM_POSITION_TYPE type = mPositionInfo.PositionType(); + ENUM_TIMEFRAMES period = ExtractPositionPeriod(comment); + + // + XPosition iPosition = {}; + + // + iPosition.tp = tp; + iPosition.sl = sl; + iPosition.swap = swap; + iPosition.type = type; + iPosition.magic = magic; + iPosition.entry = entry; + iPosition.price = price; + iPosition.ticket = ticket; + iPosition.symbol = symbol; + iPosition.period = period; + iPosition.volume = volume; + iPosition.openAt = openAt; + iPosition.profit = profit; + iPosition.comment = comment; + iPosition.commission = commission; + + // + Add( + iPosition, + result); + } + } + + // + void GetPositions( + XPosition &result[], // Hold Result ... + string symbol, // Trading Symbol ... + ENUM_TIMEFRAMES period // Trading Period ... + ) + { + // + Clean(result); + + // + bool hasPeriod = period != NULL; + bool hasSymbol = symbol != NULL && StringLen(symbol) > 0; + + // + int positionsCount = PositionsTotal(); + if (positionsCount <= 0) + { + return; + } + + // + XPosition allPositions[]; + GetPositions(allPositions); + + // + if (!hasPeriod && !hasSymbol) + { + // + Copy( + allPositions, + result); + + // + return; + } + + // + for (int i = 0; i < positionsCount; i++) + { + // + XPosition iPosition = allPositions[i]; + + // + if (hasSymbol && + symbol != iPosition.symbol) + { + continue; + } + + // + ENUM_TIMEFRAMES positionPeriod = ExtractPositionPeriod(iPosition.comment); + if (hasPeriod && + period != positionPeriod) + { + continue; + } + + // + Add( + iPosition, + result); + } + } + + // + // Execute a Signal ... + bool ExecuteSignal( + XSignal &signal, // Signal ... + string comment = "", // Position Comment ... + ENUM_ORDER_TYPE_TIME lifetime = ORDER_TIME_GTC, // Order LifeTime ... + datetime expiration = 0 // order expiration time + ) + { + // + bool result = false; + + // + double currentEntry = GetEntry( + signal.symbol, + signal.type); + bool isLong = IsLong(signal.type); + + // + ResetLastError(); + + // + if (signal.mode == X_ORDER_MODE_MARKET) + { + // + // Execute MArket Orders ... + if (isLong) + { + // + result = Buy( + signal.symbol, + signal.period, + signal.volume, + signal.entry, + signal.sl, + signal.tp, + comment); + } + else + { + // + result = Sell( + signal.symbol, + signal.period, + signal.volume, + signal.entry, + signal.sl, + signal.tp, + comment); + } + } + else if (signal.mode == X_ORDER_MODE_LIMIT) + { + // + // Execute Limit Orders ... + + // + // Check Conditions ... + + // + // Check Price ... + result = isLong + ? signal.entry < currentEntry + : signal.entry > currentEntry; + if (!result) + { + return result; + } + + // + // Check Expiration Date ... + result = (lifetime == ORDER_TIME_SPECIFIED || lifetime == ORDER_TIME_SPECIFIED_DAY) + ? expiration > 0 + : true; + if (!result) + { + return result; + } + + // + if (isLong) + { + // + result = BuyLimit( + signal.symbol, + signal.period, + signal.volume, + signal.entry, + signal.sl, + signal.tp, + lifetime, + expiration, + comment); + } + else + { + // + result = SellLimit( + signal.symbol, + signal.period, + signal.volume, + signal.entry, + signal.sl, + signal.tp, + lifetime, + expiration, + comment); + } + } + else if (signal.mode == X_ORDER_MODE_STOP) + { + // + // Execute Stop Orders ... + + // + // Check Conditions ... + + // + // Check Price ... + result = isLong + ? signal.entry > currentEntry + : signal.entry < currentEntry; + if (!result) + { + return result; + } + + // + // Check Expiration Date ... + result = (lifetime == ORDER_TIME_SPECIFIED || lifetime == ORDER_TIME_SPECIFIED_DAY) + ? expiration > 0 + : true; + if (!result) + { + return result; + } + + // + if (isLong) + { + // + result = BuyStop( + signal.symbol, + signal.period, + signal.volume, + signal.entry, + signal.sl, + signal.tp, + lifetime, + expiration, + comment); + } + else + { + // + result = SellStop( + signal.symbol, + signal.period, + signal.volume, + signal.entry, + signal.sl, + signal.tp, + lifetime, + expiration, + comment); + } + } + + // + if (!result) + { + LogMessage("Error: " + (string)GetLastError() + ", " + GetErrorDescription(GetLastError())); + } + else + { + // + // Retrieve Last Position Ticket ... + ulong ticket = GetLastOpenPositionTicket(); + + // + // Check Position have Support Signals or not ... + int supportsCount = ArraySize(signal.supports); + if (supportsCount > 0) + { + // + int executed = 0; + for (int i = 0; i < supportsCount; i++) + { + // + XSignal iSupport = signal.supports[i]; + + // + int supIndex = i + 1; + string iComment = GenerateSupportSignalComment( + ticket, + supIndex); + + // + bool isExecuted = ExecuteSignal( + iSupport, + iComment); + if (isExecuted) + { + executed++; + } + } + + // + result = executed == supportsCount; + } + } + + // + return result; + } + + // + // Execute a Collection of Signals ... + int ExecuteSignals( + const XSignal &signals[], // an Array of Signals ... + string comment = "", // Position Comment ... + ENUM_ORDER_TYPE_TIME lifetime = ORDER_TIME_GTC, // Order LifeTime ... + datetime expiration = 0 // order expiration time + ) + { + // + int result = 0; + + // + int signalsCount = ArraySize(signals); + if (signalsCount <= 0) + { + return result; + } + + // + for (int i = 0; i < signalsCount; i++) + { + // + XSignal iSignal = signals[i]; + + // + if (StringLen(comment) == 0) + { + comment = GenerateProvidersString(iSignal); + } + + // + bool isExecuted = ExecuteSignal( + iSignal, + comment, + lifetime, + expiration); + + // + if (isExecuted) + { + result++; + } + } + + // + return result; + } + + // + // Retrieve in Profit Positions ... + void GetInProfitPositions( + XPosition &result[] // Hold Result ... + ) + { + // + Clean(result); + + // + XPosition allPositions[]; + GetPositions(allPositions); + int positionsCount = ArraySize(allPositions); + if (positionsCount <= 0) + { + return; + } + + // + for (int i = 0; i < positionsCount; i++) + { + // + XPosition iPosition = allPositions[i]; + + // + if (iPosition.profit > 0) + { + Add( + iPosition, + result); + } + } + } + + // + // Retrieve in Drawdown Positions ... + void GetInDrawdownPositions( + XPosition &result[] // Hold Result ... + ) + { + // + Clean(result); + + // + XPosition allPositions[]; + GetPositions(allPositions); + int positionsCount = ArraySize(allPositions); + if (positionsCount <= 0) + { + return; + } + + // + for (int i = 0; i < positionsCount; i++) + { + // + XPosition iPosition = allPositions[i]; + + // + if (iPosition.profit < 0) + { + Add( + iPosition, + result); + } + } + } + + // + // Close a Collection Of Positions ... + int ClosePositions( + XPosition &positions[], // Positions to Close ... + string comment = "" // Specified Comment ... + ) + { + // + int result = 0; + int positionsCount = ArraySize(positions); + if (positionsCount <= 0) + { + return result; + } + + // + for (int i = 0; i < positionsCount; i++) + { + // + XPosition iPosition = positions[i]; + + // + bool isClosed = Close( + iPosition.ticket, + comment); + if (isClosed) + { + result++; + } + } + + // + return result; + } + + // + // Retrieve All Orders ... + void GetOrders( + XOrder &result[], // Holdes Result .... + string symbol, // Trading Symbol ... + ENUM_TIMEFRAMES period, // Trading TimeFrame ... + ENUM_ORDER_STATE state = NULL // Order State ... + ) + { + // + Clean(result); + + // + int ordersCount = OrdersTotal(); + if (ordersCount <= 0) + { + return; + } + + // + // Since Orders may be so more than positions ... + // start Orders Collectiong Loops reverse ... + for (int i = ordersCount - 1; i >= 0; i--) + { + // + if (!mOrderInfo.SelectByIndex(i)) + { + continue; + } + + // + if (mOrderInfo.Magic() != mMagicNumber) + { + continue; + } + + // + // Reading Order Info ... + long magic = mOrderInfo.Magic(); + double sl = mOrderInfo.StopLoss(); + ulong ticket = mOrderInfo.Ticket(); + double tp = mOrderInfo.TakeProfit(); + string oSymbol = mOrderInfo.Symbol(); + string comment = mOrderInfo.Comment(); + long pocitionID = mOrderInfo.PositionId(); + double openPrice = mOrderInfo.PriceOpen(); + datetime setupAt = mOrderInfo.TimeSetup(); + datetime executedAt = mOrderInfo.TimeDone(); + ENUM_ORDER_STATE oState = mOrderInfo.State(); + ENUM_ORDER_TYPE type = mOrderInfo.OrderType(); + double currentPrice = mOrderInfo.PriceCurrent(); + datetime expiredAt = mOrderInfo.TimeExpiration(); + double initialVolume = mOrderInfo.VolumeInitial(); + double currentVolume = mOrderInfo.VolumeCurrent(); + double stopLimitPrice = mOrderInfo.PriceStopLimit(); + ENUM_ORDER_TYPE_TIME lifetime = mOrderInfo.TypeTime(); + ENUM_ORDER_TYPE_FILLING filling = mOrderInfo.TypeFilling(); + + // + if (StringLen(symbol) > 0 && symbol != oSymbol) + { + continue; + } + + // + ENUM_TIMEFRAMES oPeriod = ExtractPositionPeriod(comment); + if (period != NULL && period != oPeriod) + { + continue; + } + + // + if (state != NULL && oState != state) + { + continue; + } + + // + // Now Create an instance of XOrder struct and fill it by + // retrieved data, and add it to results ... + XOrder iOrder = {}; + + // + iOrder.sl = sl; + iOrder.tp = tp; + iOrder.type = type; + iOrder.magic = magic; + iOrder.state = oState; + iOrder.ticket = ticket; + iOrder.smybol = oSymbol; + iOrder.period = oPeriod; + iOrder.setupAt = setupAt; + iOrder.comment = comment; + iOrder.filling = filling; + iOrder.lifetime = lifetime; + iOrder.expiredAt = expiredAt; + iOrder.openPrice = openPrice; + iOrder.pocitionID = pocitionID; + iOrder.executedAt = executedAt; + iOrder.currentPrice = currentPrice; + iOrder.initialVolume = initialVolume; + iOrder.currentVolume = currentVolume; + iOrder.stopLimitPrice = stopLimitPrice; + + // + Add( + iOrder, + result); + } + } + + // + int CountOrders() + { + return OrdersTotal(); + } + + // + // Cancel Specific Order ... + bool CancelOrder(ulong ticket) + { + return mTrader.OrderDelete(ticket); + } + + // + // Cancel Specific Orders ... + bool CancelOrders( + XOrder &orders[]) + { + // + bool result = false; + + // + int ordersCount = ArraySize(orders); + if (ordersCount <= 0) + { + return result; + } + + // + for (int i = 0; i < ordersCount; i++) + { + // + XOrder iOrder = orders[i]; + + // + bool isDeleted = mTrader.OrderDelete(iOrder.ticket); + if (isDeleted && !result) + { + result = isDeleted; + } + } + + // + return result; + } + + // + // Retrieve All Deals ... + void GetDeals(XDeal &result[]) + { + // + Clean(result); + + // + int dealsCount = HistoryDealsTotal(); + if (dealsCount <= 0) + { + return; + } + + // + for (int i = dealsCount - 1; i >= 0; i--) + { + // + if (!mDealInfo.SelectByIndex(i)) + { + continue; + } + + // + if (mDealInfo.Magic() != mMagicNumber) + { + continue; + } + + // + // Reading Order Info ... + double swap = mDealInfo.Swap(); + ulong magic = mDealInfo.Magic(); + ulong order = mDealInfo.Order(); + ulong ticket = mDealInfo.Ticket(); + datetime time = mDealInfo.Time(); + double price = mDealInfo.Price(); + string symbol = mDealInfo.Symbol(); + double profit = mDealInfo.Profit(); + double volume = mDealInfo.Volume(); + string comment = mDealInfo.Comment(); + ulong positionId = mDealInfo.PositionId(); + ENUM_DEAL_ENTRY entry = mDealInfo.Entry(); + double commission = mDealInfo.Commission(); + ENUM_DEAL_TYPE type = mDealInfo.DealType(); + ENUM_DEAL_REASON reason = (ENUM_DEAL_REASON)HistoryDealGetInteger( + ticket, + DEAL_REASON); + + // + XDeal iDeal = {}; + + // + iDeal.swap = swap; + iDeal.time = time; + iDeal.type = type; + iDeal.magic = magic; + iDeal.entry = entry; + iDeal.order = order; + iDeal.price = price; + iDeal.ticket = ticket; + iDeal.symbol = symbol; + iDeal.profit = profit; + iDeal.volume = volume; + iDeal.reason = reason; + iDeal.comment = comment; + iDeal.positionId = positionId; + iDeal.commission = commission; + + // + Add( + iDeal, + result); + } + } + + // + // Generate String Representation Of Position's Time Frame ... + string GeneratePositionPeriodComment(ENUM_TIMEFRAMES period) + { + // + string result = mPeriodPrefix + "(" + ToString(period) + ")"; + + // + return result; + } + + // + // Extract Position Time Frame From it's Comment ... + ENUM_TIMEFRAMES ExtractPositionPeriod(string comment) + { + // + ENUM_TIMEFRAMES result = _Period; + + // + if (StringLen(comment) <= 0) + { + return result; + } + + // + string periodStr = ExtractString( + comment, + mPeriodPrefix + "(", + ")"); + if (StringLen(periodStr) <= 0) + { + return result; + } + + // + result = ToPeriod(periodStr); + + // + return result; + } + + // + // Retrieve Last Open Position Ticket ... + ulong GetLastOpenPositionTicket() + { + // + ulong result = 0; + + int positionsCount = PositionsTotal(); + if (positionsCount <= 0) + { + return result; + } + + // + result = PositionGetTicket(PositionsTotal() - 1); + + // + return result; + } + + // + // Retrieve Last Placed Order Ticket ... + ulong GetLastPlacedOrderTicket() + { + // + ulong result = 0; + + int ordersCount = OrdersTotal(); + if (ordersCount <= 0) + { + return result; + } + + // + if (mOrderInfo.SelectByIndex(ordersCount - 1)) + { + result = mOrderInfo.Ticket(); + } + + // + return result; + } + + // + // SUPPORT Signals ... + + // + // Retrieve a Position if Exists + // by all of it's Supported Positon/Order (s) ... + bool GetPositionPack( + ulong ticket, // Sepcified Position's Ticket + XPositionPack &pack // Hold Result ... + ) + { + // + bool result = false; + + // + int positionsCount = CountPositions(); + int ordersCount = CountOrders(); + if (ordersCount <= 0 && positionsCount <= 0) + { + return result; + } + + // + XPosition position; + result = GetPosition( + position, + ticket); + if (!result) + { + return result; + } + + // + XOrder supportOrders[]; + XPosition supportPositions[]; + + // + XOrder orders[]; + GetOrders( + orders, + position.symbol, + position.period, + ORDER_STATE_PLACED); + ordersCount = ArraySize(orders); + + // + // Select Orders ... + if (ordersCount > 0) + { + // + for (int i = 0; i < ordersCount; i++) + { + // + XOrder iOrder = orders[i]; + + // + string params[]; + bool hasSupport = ExtractSupportParams( + iOrder.comment, + params); + if (hasSupport) + { + // + ulong parentTicket = ExtractParentTicket(iOrder.comment); + if (parentTicket == ticket) + { + // + Add( + iOrder, + supportOrders); + } + } + } + } + + // + XPosition positions[]; + GetPositions( + positions, + position.symbol, + position.period); + positionsCount = ArraySize(positions); + + // + // Select Positions ... + if (positionsCount > 0) + { + // + for (int i = 0; i < positionsCount; i++) + { + // + XPosition iPosition = positions[i]; + + // + string params[]; + bool hasSupport = ExtractSupportParams( + iPosition.comment, + params); + if (hasSupport) + { + // + ulong parentTicket = ExtractParentTicket(iPosition.comment); + if (parentTicket == ticket) + { + // + Add( + iPosition, + supportPositions); + } + } + } + } + + // + int supportOrdersCount = ArraySize(supportOrders); + int supportPositionsCount = ArraySize(supportPositions); + + // + pack.ticket = ticket; + pack.position = position; + + // + Copy(supportOrders, + pack.supportOrders); + Copy(supportPositions, + pack.supportPositions); + + // + pack.supportOrdersCount = supportOrdersCount; + pack.supportPositionsCount = supportPositionsCount; + + // + result = true; + + // + return result; + } + + // + // END Provided Functions ... + // + + // + // Protected ... +protected: + // + // Private ... + + // + // EVENTS Handlers Notifiers ... + + // + // STATE ... + void NotifyTradeStateChangeEvent(const XOnTradeHandlerState &state) + { + // + int count = ArraySize(mTradeStateChangedEventHandlers); + if (count <= 0) + { + return; + } + + // + for (int i = 0; i < count; i++) + { + // + TOnTradeStateChanged iHandler = mTradeStateChangedEventHandlers[i]; + iHandler(state); + } + } + + // + // DEALS ... + void NotifyDealsChangeEvent(int changes) + { + // + int count = ArraySize(mDealsChangedEventHandlers); + if (count <= 0) + { + return; + } + + // + for (int i = 0; i < count; i++) + { + // + TOnDealsChanged iHandler = mDealsChangedEventHandlers[i]; + iHandler(changes); + } + } + + // + // ORDERS ... + void NotifyOrdersChangeEvent(int changes) + { + // + int count = ArraySize(mOrdersChangedEventHandlers); + if (count <= 0) + { + return; + } + + // + for (int i = 0; i < count; i++) + { + // + TOnOrdersChanged iHandler = mOrdersChangedEventHandlers[i]; + iHandler(changes); + } + } + + // + // POSITIONS ... + void NotifyPositionsChangeEvent(int changes) + { + // + int count = ArraySize(mPositionsChangedEventHandlers); + if (count <= 0) + { + return; + } + + // + for (int i = 0; i < count; i++) + { + // + TOnPositionsChanged iHandler = mPositionsChangedEventHandlers[i]; + iHandler(changes); + } + } + + // + // TPSL ... + + // + void NotifyStopLossEvent(const XDeal &deal) + { + // + int count = ArraySize(mStopLossEventHandlers); + if (count <= 0) + { + return; + } + + // + for (int i = 0; i < count; i++) + { + // + TOnStopLoss iHandler = mStopLossEventHandlers[i]; + iHandler(deal); + } + } + + // + void NotifyTakeProfitEvent(const XDeal &deal) + { + // + int count = ArraySize(mTakeProfitEventHandlers); + if (count <= 0) + { + return; + } + + // + for (int i = 0; i < count; i++) + { + // + TOnTakeProfit iHandler = mTakeProfitEventHandlers[i]; + iHandler(deal); + } + } + +private: + // + // using deviation, it must be in Point ... + int mSlippage; + + // + // using magic number ... + ulong mMagicNumber; + + // + // using CTrade instance ... + XSCTradeBase mTrader; + + // + // Deals Info ... + CDealInfo mDealInfo; + + // + // Order Info ... + COrderInfo mOrderInfo; + + // + // using PositionInfo instance ... + CPositionInfo mPositionInfo; + + // + // ADDITIONAL Data ... + + // + string mPeriodPrefix; + + // + // START Trade Processing ... + // + + // + int mDaysForRead; + + // + // set the limits of the trade history on the global scope ... + + // + // // start date for trade history in cache ... + datetime mStartDate; + + // + // end date for trade history in cache ... + datetime mEndDate; + + // + // global OnTrade counters ... + + // + // number of active orders ... + int mOrdersCount; + + // + // number of open positions ... + int mPositionsCount; + + // + // number of deals in the trade history cache ... + int mDealsCount; + + // + // number of orders in the trade history cache ... + int mHistoryOrdersCount; + + // + // flag of counter relevance ... + bool mScanStarted; + + // + // Check Statrt Date In Trade History ... + void CheckStartDateInTradeHistory() + { + // + // initial interval, if we were to start working right now .. + datetime currStart = TimeCurrent() - (mDaysForRead * PeriodSeconds(PERIOD_D1)); + + // + // make sure that the start limit of the trade history has not gone + // more than 1 day over the intended date ... + if (currStart - mStartDate > PeriodSeconds(PERIOD_D1)) + { + // + // correct the start date of history to be loaded in the cache ... + mStartDate = currStart; + + // + // now reload the trade history for the updated interval ... + HistorySelect(mStartDate, mEndDate); + + // + // correct the deal and order counters in history for further comparison + mHistoryOrdersCount = HistoryOrdersTotal(); + mDealsCount = HistoryDealsTotal(); + } + } + + // + // Process On Trade Context ... + void ProcessOnTradeContext( + XOnTradeHandlerState &result // Hold's Result + ) + { + // + mEndDate = TimeCurrent(); + + // + ResetLastError(); + + // + // download trading history from the specified interval to the program cache ... + bool selected = HistorySelect(mStartDate, mEndDate); + if (!selected) + { + return; + } + + // + // get the current values ... + int currOrders = OrdersTotal(); + int currPositions = PositionsTotal(); + int currDeals = HistoryDealsTotal(); + int currHistoryOrders = HistoryOrdersTotal(); + + // + // Orders ... + // check if the number of active orders has been changed ... + if (currOrders != mOrdersCount) + { + // + // number of active orders has been changed ... + result.hasNewOrder = true; + result.newOrders = currOrders - mOrdersCount; + + // + // update the value ... + mOrdersCount = currOrders; + } + + // + // Positions ... + // changes in the number of open positions ... + if (currPositions != mPositionsCount) + { + // + // number of open positions has been changed ... + result.hasNewPosition = true; + result.newPositions = currPositions - mPositionsCount; + + // + // update the value ... + mPositionsCount = currPositions; + } + + // + // Deals ... + // changes in the number of deals in the trade history cache ... + if (currDeals != mDealsCount) + { + // + // number of deals in the trade history cache has been changed ... + result.hasNewDeal = true; + result.newDeals = currDeals - mDealsCount; + + // + // update the value ... + mDealsCount = currDeals; + } + + // + // History Orders ... + // changes in the number of history orders in the trade history cache ... + if (currHistoryOrders != mHistoryOrdersCount) + { + // + // number of history orders in the trade history cache has been changed ... + result.hasNewHistoryOrder = true; + result.newHistoryOrders = currHistoryOrders - mHistoryOrdersCount; + + // + // update the value ... + mHistoryOrdersCount = currHistoryOrders; + } + + // + // checking if it is necessary to change the limits of the trade history to be requested in cache ... + CheckStartDateInTradeHistory(); + } + + // + // Reset On Trade Scanner Context ... + void ResetOnTradeContext() + { + // + mEndDate = TimeCurrent(); + mStartDate = mEndDate - (mDaysForRead * PeriodSeconds(PERIOD_D1)); + } + + // + // Initial Context Of Trade Scanner ... + void InitOnTradeContext() + { + // + ResetLastError(); + + // + mOrdersCount = OrdersTotal(); + mPositionsCount = PositionsTotal(); + + // + // load history ... + bool selected = HistorySelect(mStartDate, mEndDate); + if (!selected) + { + return; + } + + // + // get the current value ... + mDealsCount = HistoryDealsTotal(); + mHistoryOrdersCount = HistoryOrdersTotal(); + + // + mScanStarted = true; + } + + // + // Deals Changed Event Handlers ... + TOnDealsChanged mDealsChangedEventHandlers[]; + + // + // Orders Changed Event Handlers ... + TOnOrdersChanged mOrdersChangedEventHandlers[]; + + // + // Positions Changed Event Handlers ... + TOnPositionsChanged mPositionsChangedEventHandlers[]; + + // + // Trade State Changed Event Handlers ... + TOnTradeStateChanged mTradeStateChangedEventHandlers[]; + + // + // TPSL ... + TOnStopLoss mStopLossEventHandlers[]; + TOnTakeProfit mTakeProfitEventHandlers[]; + + // + // END Trade Processing ... + // +}; + +// +// START Usefull Functions ... +// + +// +// Add Specific XPosition to Specified Array ... +void Add( + XDeal &item, + XDeal &buffer[]) +{ + // + ArrayResize( + buffer, + ArraySize(buffer) + 1); + + // + buffer[ArraySize(buffer) - 1] = item; +} +void Add( + XOrder &item, + XOrder &buffer[]) +{ + // + ArrayResize( + buffer, + ArraySize(buffer) + 1); + + // + buffer[ArraySize(buffer) - 1] = item; +} +void Add( + XPosition &item, + XPosition &buffer[]) +{ + // + ArrayResize( + buffer, + ArraySize(buffer) + 1); + + // + buffer[ArraySize(buffer) - 1] = item; +} + +// +// Clear All Items Inside Array ... +void Clean(XDeal &buffer[]) +{ + // + ArrayFree(buffer); + ArrayResize(buffer, 0); +} +void Clean(XOrder &buffer[]) +{ + // + ArrayFree(buffer); + ArrayResize(buffer, 0); +} +void Clean(XPosition &buffer[]) +{ + // + ArrayFree(buffer); + ArrayResize(buffer, 0); +} + +// +// Generate Identifier Tag ... +string GenerateTag(XSignal &info) +{ + // + string result = ""; + + // + result = info.symbol + "," + ToString(info.period); + + // + return result; +} + +// +// Convert Position to Signal ... +XSignal ToSignalInfo( + XPosition &position) +{ + // + XSignal result; + + // + result.tp = position.tp; + result.sl = position.sl; + result.type = position.type; + result.entry = position.entry; + result.symbol = position.symbol; + result.period = position.period; + result.volume = position.volume; + + // + return result; +} + +// +// AGE Calculations ... +// + +// +// Retrieve a Position Age ... +int GetAge( + XPosition &position, // Selected Position ... + ENUM_TIMEFRAMES period = NULL // Dest Time Frame ... +) +{ + // + int result = -1; + + // + if (period == NULL) + { + period = _Period; + } + + // + result = iBarShift( + position.symbol, + period, + position.openAt); + + // + return result; +} + +// +// Retrieve an Order Age ... +int GetAge( + XOrder &order, // Selected Order ... + ENUM_TIMEFRAMES period = NULL // Dest Time Frame ... +) +{ + // + int result = -1; + + // + if (period == NULL) + { + period = _Period; + } + + // + result = iBarShift( + order.smybol, + period, + order.setupAt); + + // + return result; +} + +// +// Retrieve a Deal Age ... +int GetAge( + XDeal &deal, // Selected Deal ... + ENUM_TIMEFRAMES period = NULL // Dest Time Frame ... +) +{ + // + int result = -1; + + // + if (period == NULL) + { + period = _Period; + } + + // + result = iBarShift( + deal.symbol, + period, + deal.time); + + // + return result; +} + +// +// OLDEST Detection ... + +// +// Get Oldest Deal ... +int GetOldest( + XDeal &item, // Hold Result ... + XDeal &items[] // Source Array ... +) +{ + // + int result = 0; + + // + int itemsCount = ArraySize(items); + if (itemsCount <= 0) + { + return result; + } + + // + int tmpAge = 0; + XDeal tmpItem; + for (int i = 0; i < itemsCount; i++) + { + // + XDeal iItem = items[i]; + + // + int iAge = GetAge(iItem); + if (iAge > 0 && + (tmpAge == 0 || tmpAge < iAge)) + { + // + tmpAge = iAge; + tmpItem = iItem; + } + } + + // + if (tmpAge > 0) + { + // + result = tmpAge; + item = tmpItem; + } + + // + return result; +} + +// +// Get Oldest Order ... +int GetOldest( + XOrder &item, // Hold Result ... + XOrder &items[] // Source Array ... +) +{ + // + int result = 0; + + // + int itemsCount = ArraySize(items); + if (itemsCount <= 0) + { + return result; + } + + // + int tmpAge = 0; + XOrder tmpItem; + for (int i = 0; i < itemsCount; i++) + { + // + XOrder iItem = items[i]; + + // + int iAge = GetAge(iItem); + if (iAge > 0 && + (tmpAge == 0 || tmpAge < iAge)) + { + // + tmpAge = iAge; + tmpItem = iItem; + } + } + + // + if (tmpAge > 0) + { + // + result = tmpAge; + item = tmpItem; + } + + // + return result; +} + +// +// Get Oldes Position ... +int GetOldest( + XPosition &item, // Hold Result ... + XPosition &items[] // Source Array ... +) +{ + // + int result = 0; + + // + int itemsCount = ArraySize(items); + if (itemsCount <= 0) + { + return result; + } + + // + int tmpAge = 0; + XPosition tmpItem; + for (int i = 0; i < itemsCount; i++) + { + // + XPosition iItem = items[i]; + + // + int iAge = GetAge(iItem); + if (iAge > 0 && + (tmpAge == 0 || tmpAge < iAge)) + { + // + tmpAge = iAge; + tmpItem = iItem; + } + } + + // + if (tmpAge > 0) + { + // + result = tmpAge; + item = tmpItem; + } + + // + return result; +} + +// +// END Usefull Functions ... +// diff --git a/MQLTestWorkspace/X121/Old/Experts/x-saherelm.xea.ex5 b/MQLTestWorkspace/X121/Old/Experts/x-saherelm.xea.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..5ff7473c96d1c76f5f04c36f131e3d813ede1e8f GIT binary patch literal 618858 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�U3P2zb8z0PDO?nV#eAVDG%bMwETj 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
}`SZA%@>IwYm8--m5{^QFkHqy8MXb!R0 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 z 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 A`2YX_ literal 0 HcmV?d00001 diff --git a/MQLTestWorkspace/X121/Old/Experts/x-saherelm.xea.mq5 b/MQLTestWorkspace/X121/Old/Experts/x-saherelm.xea.mq5 new file mode 100644 index 0000000..1d8522b --- /dev/null +++ b/MQLTestWorkspace/X121/Old/Experts/x-saherelm.xea.mq5 @@ -0,0 +1,378 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 Expert Advisor +// ---------------------------------------- +// Name: X121EA +// Description: this is an expert controller +// advisors which provides a mechanism for use them ... +// +// +// Maintainer: +// ------------ +// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) +// +////////////////////////////////////////////////////// +// +// Global Properties ... +#property copyright "Copyright 2023, SaherElm IT Center" +#property link "https://saherelm.ir" +#property version "1.00" +#property description "SaherElm X121EA" +#property strict + +// +// START Definitions ... +// + +// +#define ShortName "X121EA" + +// +// END Definitions ... +// + +// +// START Inputs ... +// + +// +// EA ... +input group "Common"; +input bool xEAEnable = true; // Enable EA +input int xEASlippage = 10; // Slippgae +input ulong xEAMagicNumber = 1604056; // Magic Number + +// +// Providers ... +input group "Providers"; +input bool xEAUseCurrentConfig = true; // Use Only Current Config +input string xEAProvidersConfiguration = ""; // Providers Configuration +input string xEADefaultSignalProviders = "X786,X92,X110,X121,X128"; // Default Allowed Signal Providers + +// +// Signals ... +input group "Signals"; +input bool xEAEnableLongs = true; // Enable Long Trades +input bool xEAEnableShorts = true; // Enable Short Trades + +// +// Risk Management ... +input group "Risk Management"; +input int xEAMaxOpenPositions = 15; // Max Allowed Open Trades +input double xEAMinRiskAmountPerTrade = 0.001; // Min Risk Amount Per Trade +input double xEAMaxAllowedDrawDownFactor = 0.001; // Max Allowed Drawdown Factor + +// +// Alerts ... +input group "Alerts"; +input bool xEAEnableAlerts = true; // Enable Events Alert +input bool xEAEnableHourlyAlerts = false; // Send Alert on each new Hour +input bool xEAEnableDailyAlerts = false; // Send Alert on each new Day +input bool xEAEnableWeeklyAlerts = false; // Send Alert on each new Week +input bool xEAEnableMonthlyAlerts = false; // Send Alert on each new Month + +// +// END Inputs ... +// + +// +// START Including Providers ... +// + +// +// Logger Library ... +#include "../Libraries/x-saherelm.log.lib.mq5" +#include "../Classes/x-saherelm.x121.xea.class.mq5" + +// +// END Including Providers ... +// + +// +// START Global Definitions: Variables, Properties and etc ... +// + +// +XSCX121EA *mX121EA; + +// +// END Global Definitions: Variables, Properties and etc ... +// + +// +// START Event Handlers ... +// + +// +// Initialization ... +int OnInit() +{ + // + logTag = ShortName; + drawPrefix = logTag; + alertPrefix = logTag; + + // + // Validate Inputs ... + if (!ValidateInputs()) + { + return INIT_PARAMETERS_INCORRECT; + } + + // + bool isInit = InitEAInstance(); + if (!isInit) + { + return INIT_FAILED; + } + + // + // Init Succeed ... + return INIT_SUCCEEDED; +} + +// +// DeInitialization ... +void OnDeinit(const int reason) +{ + // + // REASON_PROGRAM 0 The EA has stopped working calling the ExpertRemove() function + // REASON_REMOVE 1 Program removed from a chart + // REASON_RECOMPILE 2 Program recompiled + // REASON_CHARTCHANGE 3 A symbol or a chart period is changed + // REASON_CHARTCLOSE 4 Chart closed + // REASON_PARAMETERS 5 Inputs changed by a user + // REASON_ACCOUNT 6 Another account has been activated or reconnection to the trade server has occurred due to changes in the account settings + // REASON_TEMPLATE 7 Another chart template applied + // REASON_INITFAILED 8 The OnInit() handler returned a non-zero value + // REASON_CLOSE 9 Terminal closed + + // + // De Initialize XEA Providers ... + delete mX121EA; +} + +// +// On Tick Handler ... +void OnTick() +{ + // + // Prevent Going Forward if user Disable it ... + if (xEAEnable) + { + mX121EA.OnTick(); + } +} + +// +// Handle Trade Events ... +void OnTrade() +{ + mX121EA.OnTrade(); +} + +// +// Handle Signal Event ... +void OnSignalConditionsRecieved(X121MarketConditions &info) +{ +} + +// +// Handle StopLoss Event ... +void OnStopLossTriggered(const XDeal &deal) +{ +} + +// +// Handle TakeProfit Event ... +void OnTakeProfitTriggered(const XDeal &deal) +{ +} + +// +// Handle Deals Changed Event ... +void OnDealsChangedHandler(int count) +{ +} + +// +// Handle Order Changed Event ... +void OnOrdersChangedHandler(int count) +{ +} + +// +// Handle Position Changed Event ... +void OnPositionsChangedHandler(int count) +{ +} + +// +// Handle Trade State Changed ... +void OnTradeStateChangedHandler(const XOnTradeHandlerState &state) +{ +} + +// +// END Event Handlers ... +// + +// +// START Functions ... +// + +// +// Validate Input Args for Initialization ... +bool ValidateInputs() +{ + // + bool result = true; + + // + // Validate Args ... + result = + // + xEASlippage > 0 && + xEAMagicNumber > 0 && + xEAMinRiskAmountPerTrade > 0 && + StringLen(xEADefaultSignalProviders) > 0 + // + // TODO: add new validations here ... + // + ; + + // + // Validate Providers ... + if (result) + { + // + string providers[]; + SplitContent( + providers, + xEADefaultSignalProviders); + + // + int providersCount = ArraySize(providers); + if (providersCount <= 0) + { + // + result = false; + return result; + } + + // + string allProviders[]; + GetAllProviders(allProviders); + + // + bool hasError = false; + for (int i = 0; i < providersCount; i++) + { + // + string iProvider = providers[i]; + if (!Contains(iProvider, allProviders)) + { + // + hasError = true; + break; + } + } + + // + if (hasError) + { + // + result = false; + return result; + } + } + + // + // Logging State ... + string message = "Validation of (" + logTag + ") Inputs " + (result ? "Succeeded" : "Failed") + " ..."; + LogMessage(message); + + // + return result; +} + +// +// Initialize X121EA Class Instances ... +bool InitEAInstance() +{ + // + bool result = false; + + // + X121SignalProvider providers[]; + + // + // Validatie Providers Configuration ... + if (xEAUseCurrentConfig) + { + // + // Here we Ignore xEAProvidersConfiguration ... + // Have to Create a Default Provider Structure and Attached it to X121EA Instance ... + X121SignalProvider provider; + + // + provider.symbol = _Symbol; + provider.period = _Period; + provider.riskAmount = xEAMinRiskAmountPerTrade; + + // + string signalProviders[]; + SplitContent( + signalProviders, + xEADefaultSignalProviders); + + // + Copy( + signalProviders, + provider.providers); + + // + // Now add Default Provider to Providers Array ... + Add( + provider, + providers); + } + else + { + // + // TODO: Here we must Implement all mechanism to Extract Provider Configurations and + // Add them one by one to XEA Instance ... + } + + // + mX121EA = new XSCX121EA( + _Symbol, + _Period, + xEAMagicNumber, + xEASlippage, + OnStopLossTriggered, + OnTakeProfitTriggered, + OnDealsChangedHandler, + OnOrdersChangedHandler, + OnPositionsChangedHandler, + OnTradeStateChangedHandler, + OnSignalConditionsRecieved); + + // + mX121EA.EnableLongs(xEAEnableLongs); + mX121EA.EnableShorts(xEAEnableShorts); + mX121EA.MaxAllowedPositions(xEAMaxOpenPositions); + mX121EA.MaxAllowedDrawDownFactor(xEAMaxAllowedDrawDownFactor); + + // + // Attach Providers to EA Instance ... + int providersCount = ArraySize(providers); + int addedProviders = mX121EA.AddProviders(providers); + result = addedProviders == providersCount; + + // + return result; +} +// +// END Functions ... +// diff --git a/MQLTestWorkspace/X121/Old/Helpers/x-saherelm.x121.xama.helper.class.ex5 b/MQLTestWorkspace/X121/Old/Helpers/x-saherelm.x121.xama.helper.class.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..a4afc54131aa140bbba17f7d5b81e8eb4b432e1a GIT binary patch literal 6644 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 literal 0 HcmV?d00001 diff --git a/MQLTestWorkspace/X121/Old/Helpers/x-saherelm.x121.xama.helper.class.mq5 b/MQLTestWorkspace/X121/Old/Helpers/x-saherelm.x121.xama.helper.class.mq5 new file mode 100644 index 0000000..ca80be4 --- /dev/null +++ b/MQLTestWorkspace/X121/Old/Helpers/x-saherelm.x121.xama.helper.class.mq5 @@ -0,0 +1,446 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 Helper Class Library +// ---------------------------------------------- +// Name: XSCXAMAHelper +// Description: provides all Indicator +// Helper requirements ... +// +// +// 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 + +// +// START Definitions ... +// + +// +// Inputs ... +struct XAMAInputs +{ + // + // Makret ... + int length; // Length + int fastEMA; // Fast EMA Length + int slowEMA; // Slow EMA Length + int maShift; // Shift + ENUM_APPLIED_PRICE appliedTo; // Applied To + + // + // Presentation ... + bool showLine; // Show Line +}; + +// +// Index of Lines ... +enum ENUM_XAMA_BUFFERS +{ + // + // Main Requirements ... + XAMA_LINE = 0, + XAMA_STATE_LINE = 1, +}; + +// +// XAMA Indicator States ... +enum ENUM_XAMA_STATES +{ + X_XAMA_BULLISH = 0, + X_XAMA_BEARISH = 2, + X_XAMA_NEUTURAL = 1, +}; + +// +// Retrieve Info Model ... +struct XAMAInfo +{ + // + // Symbol ... + string symbol; + + // + // Period ... + ENUM_TIMEFRAMES period; + + // + // Bar Time ... + datetime barTime; + + // + // Bar Index ... + int barIndex; + + // + // Values ... + double value; + + // + double values[]; + double states[]; + + // + // State ... + ENUM_XAMA_STATES state; + + // + // Conditions ... + + // + // Detect Trend is Bullish or not ... + bool isBullish; + + // + // Detect Trend is Switched to Bullish Or not ... + bool isSwitchedBullish; + + // + // Detect Trend is Bearish or not ... + bool isBearish; + + // + // Detect Trend is Switched to Bearish Or not ... + bool isSwitchedBearish; + + // + // Detect Trend is Neutural or not ... + bool isNeutural; + + // + // Detect Trend is Switched to Neutural Or not ... + bool isSwitchedNeutural; +}; + +// +// END Definitions ... +// + +// +// START Import and Inclused requirements ... +// + +// +// Includes ... +#include "../Libraries/x-saherelm.common.lib.mq5" +#include "../Classes/x-saherelm.xhelper.class.mq5" + +// +// END Import and Inclused requirements ... +// + +// +// START Overrides ... +// + +// +// END Overrides ... +// + +// +// a Class for Helping Indicators Requirements ... +class XSCXAMAHelper : public XSCBaseHelper +{ + // + // Public ... +public: + // + // Buffers ... + double valueBuffer[]; + double stateBuffer[]; + + // + // Constructor ... + void XSCXAMAHelper( + string symbol, // Trading Symbol + ENUM_TIMEFRAMES period // Trading Time Frame + ) : XSCBaseHelper(symbol, period) + { + PrepareTag(); + } + + // + // Deconstructor ... + void ~XSCXAMAHelper() + { + } + + // + // START Properties ... + // + + // + // END Properties ... + // + + // + // START Provided Functions ... + // + + // + // Prepare Tag ... + virtual void PrepareTag() + { + mTag = "XAMA" + GetTagPrefix(); + } + + // + virtual int GetMaxLength() + { + // + int result = -1; + + // + result = mLength; + + // + return result; + } + + // + // Initial Indicator Handler ... + bool Init() + { + // + bool result = false; + + // + // Validate Args ... + result = + // + (mLength >= 2) + // + ; + if (!result) + { + return false; + } + + // + // Initialize Handler ... + mHandler = iCustom( + // + mSymbol, + mPeriod, + "x-saherelm.x121.xama", + // + // Inputs ... + // + // Makret ... + "", + // + // Length ... + mLength, + // + // Fast EMA Length ... + mFastEMA, + // + // Slow EMA Length ... + mSlowEMA, + // + // Shift ... + mMaShift, + // + // Applied To ... + mAppliedTo, + // + // Presentation ... + "", + // + // Show Line ... + mShowLine + // + ); + result = mHandler != INVALID_HANDLE; + + // + return result; + } + + // + // Retrieve Current Config ... + XAMAInputs GetConfig() + { + // + XAMAInputs result; + + // + result.length = mLength; + result.fastEMA = mFastEMA; + result.slowEMA = mSlowEMA; + result.maShift = mMaShift; + result.appliedTo = mAppliedTo; + result.showLine = mShowLine; + + // + return result; + } + + // + // Set Config ... + bool SetConfig(XAMAInputs &config) + { + // + bool result = false; + + // + mLength = config.length; + mFastEMA = config.fastEMA; + mSlowEMA = config.slowEMA; + mMaShift = config.maShift; + mAppliedTo = config.appliedTo; + mShowLine = config.showLine; + + // + result = Init(); + + // + return result; + } + + // + // Reading Buffers based on Given Bar Index ... + virtual void Calculate( + int barIndex // Given Bar Index + ) + { + // + // VALUE ... + ArraySetAsSeries(valueBuffer, true); + CopyBuffer( + mHandler, + XAMA_LINE, + barIndex, + mLoopbackBars, + valueBuffer); + + // + // STATE ... + ArraySetAsSeries(stateBuffer, true); + CopyBuffer( + mHandler, + XAMA_STATE_LINE, + barIndex, + mLoopbackBars, + stateBuffer); + } + + // + // Retrieve Info at Specific Bar Index ... + XAMAInfo GetInfo( + int barIndex // Given Bar Index + ) + { + // + XAMAInfo result; + + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + // Do Calculations ... + Calculate(barIndex); + + // + // Generate Candle Time ... + datetime barTime = GetCandleTime( + mSymbol, + mPeriod, + barIndex); + + // + // Fill Result ... + result.symbol = mSymbol; + result.period = mPeriod; + result.barTime = barTime; + result.barIndex = barIndex; + + // + result.value = valueBuffer[barIndex]; + + // + Copy( + valueBuffer, + result.values); + + // + Copy( + stateBuffer, + result.states); + + // + ENUM_XAMA_STATES state = (ENUM_XAMA_STATES)stateBuffer[barIndex]; + ENUM_XAMA_STATES prevState = (ENUM_XAMA_STATES)stateBuffer[barIndex + 1]; + result.state = state; + + // + result.isBullish = state == X_XAMA_BULLISH; + result.isBearish = state == X_XAMA_BEARISH; + result.isNeutural = state == X_XAMA_NEUTURAL; + + // + result.isSwitchedBullish = + state == X_XAMA_BULLISH && prevState != X_XAMA_BULLISH; + result.isSwitchedBearish = + state == X_XAMA_BEARISH && prevState != X_XAMA_BEARISH; + result.isSwitchedNeutural = + state == X_XAMA_NEUTURAL && prevState != X_XAMA_NEUTURAL; + + // + return result; + } + + // + // END Provided Functions ... + // + + // + // Protected ... +protected: + // + // Private ... +private: + // + // Indicator Properties ... + // + // Market ... + // + // Length ... + int mLength; + // + // Fast EMA Length ... + int mFastEMA; + // + // Slow EMA Length ... + int mSlowEMA; + // + // Shift ... + int mMaShift; + // + // Applied To ... + ENUM_APPLIED_PRICE mAppliedTo; + // + // Presentation ... + // + // Show Line ... + bool mShowLine; +}; + +// +// START Usefull Functions ... +// + +// +// END Usefull Functions ... +// diff --git a/MQLTestWorkspace/X121/Old/Helpers/x-saherelm.x121.xcc.helper.class.ex5 b/MQLTestWorkspace/X121/Old/Helpers/x-saherelm.x121.xcc.helper.class.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..5023f40d459aa725560da9dc0792f311ce834389 GIT binary patch literal 6122 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 9 && + mLoopback >= 0; + if (!result) + { + return result; + } + + // + // Initialize Handler ... + mHandler = iCustom( + // + mSymbol, + mPeriod, + "x-saherelm.x121.xche", + // + // Inputs ... + // + // Market ... + "", + // + // Length ... + mLength, + // + // Loopback ... + mLoopback, + // + // 1st Multiplier ... + mMultiplier1, + // + // 2nd Multiplier ... + mMultiplier2, + // + // Calculation ... + "", + // + // Up Zone Applied to ... + mUpAppliedTo, + // + // Down Zone Applied to ... + mDownAppliedTo, + // + // Presentation ... + "", + // + // Show 1st Long Exit ... + mShowLongExit1Line, + // + // Show 1st Short Exit ... + mShowShortExit1Line, + // + // Show 2st Long Exit ... + mShowLongExit2Line, + // + // Show 2st Short Exit ... + mShowShortExit2Line + // + ); + result = mHandler != INVALID_HANDLE; + + // + return result; + } + + // + // Retrieve Current Config ... + XCHEInputs GetConfig() + { + // + XCHEInputs result; + + // + result.length = mLength; + result.loopback = mLoopback; + result.multiplier1 = mMultiplier1; + result.multiplier2 = mMultiplier2; + result.upAppliedTo = mUpAppliedTo; + result.downAppliedTo = mDownAppliedTo; + result.showLongExit1Line = mShowLongExit1Line; + result.showShortExit1Line = mShowShortExit1Line; + result.showLongExit2Line = mShowLongExit2Line; + result.showShortExit2Line = mShowShortExit2Line; + + // + return result; + } + + // + // Set Config ... + bool SetConfig(XCHEInputs &config) + { + // + bool result = false; + + // + mLength = config.length; + mLoopback = config.loopback; + mMultiplier1 = config.multiplier1; + mMultiplier2 = config.multiplier2; + mUpAppliedTo = config.upAppliedTo; + mDownAppliedTo = config.downAppliedTo; + mShowLongExit1Line = config.showLongExit1Line; + mShowShortExit1Line = config.showShortExit1Line; + mShowLongExit2Line = config.showLongExit2Line; + mShowShortExit2Line = config.showShortExit2Line; + + // + result = Init(); + + // + return result; + } + + // + // Reading Buffers based on Given Bar Index ... + virtual void Calculate( + int barIndex // Given Bar Index + ) + { + // + // LEVEL 1 .. + + // + // LONG Exit ... + ArraySetAsSeries(longExit1Buffer, true); + CopyBuffer( + mHandler, + XCHE_1ST_LONG_EXIT_LINE, + barIndex, + mLoopbackBars, + longExit1Buffer); + + // + // SHORT Exit ... + ArraySetAsSeries(shortExit1Buffer, true); + CopyBuffer( + mHandler, + XCHE_1ST_SHORT_EXIT_LINE, + barIndex, + mLoopbackBars, + shortExit1Buffer); + + // + // LEVEL 2 .. + + // + // LONG Exit ... + ArraySetAsSeries(longExit2Buffer, true); + CopyBuffer( + mHandler, + XCHE_2ND_LONG_EXIT_LINE, + barIndex, + mLoopbackBars, + longExit2Buffer); + + // + // SHORT Exit ... + ArraySetAsSeries(shortExit2Buffer, true); + CopyBuffer( + mHandler, + XCHE_2ND_SHORT_EXIT_LINE, + barIndex, + mLoopbackBars, + shortExit2Buffer); + } + + // + // Retrieve Info at Specific Bar Index ... + XCHEInfo GetInfo( + int barIndex // Given Bar Index + ) + { + // + XCHEInfo result; + + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + // Do Calculations ... + Calculate(barIndex); + + // + // Generate Candle Time ... + datetime barTime = GetCandleTime( + mSymbol, + mPeriod, + barIndex); + + // + // Fill Result ... + result.symbol = mSymbol; + result.period = mPeriod; + result.barTime = barTime; + result.barIndex = barIndex; + + // + double longExit1 = longExit1Buffer[barIndex]; + double longExit1Prev = longExit1Buffer[barIndex + 1]; + double shortExit1 = shortExit1Buffer[barIndex]; + double shortExit1Prev = shortExit1Buffer[barIndex + 1]; + + // + double longExit2 = longExit2Buffer[barIndex]; + double longExit2Prev = longExit2Buffer[barIndex + 1]; + double shortExit2 = shortExit2Buffer[barIndex]; + double shortExit2Prev = shortExit2Buffer[barIndex + 1]; + + // + Copy( + longExit1Buffer, + result.le1); + Copy( + longExit2Buffer, + result.le2); + + // + Copy( + shortExit1Buffer, + result.se1); + Copy( + shortExit2Buffer, + result.se2); + + // + result.longExit1 = longExit1; + result.shortExit1 = shortExit1; + result.longExit2 = longExit2; + result.shortExit2 = shortExit2; + + // + result.isLongExit1Start = + longExit1 != EMPTY_VALUE && + longExit1Prev == EMPTY_VALUE; + + // + result.isShortExit1Start = + shortExit1 != EMPTY_VALUE && + shortExit1Prev == EMPTY_VALUE; + + // + result.isLongExit2Start = + longExit2 != EMPTY_VALUE && + longExit2Prev == EMPTY_VALUE; + + // + result.isShortExit2Start = + shortExit2 != EMPTY_VALUE && + shortExit2Prev == EMPTY_VALUE; + + // + return result; + } + + // + // END Provided Functions ... + // + + // + // Protected ... +protected: + // + // Private ... +private: + // + // Indicator Properties ... + // + // Market ... + // + // Length ... + int mLength; + // + // Loopback ... + int mLoopback; + // + // 1st Multiplier ... + double mMultiplier1; + // + // 2nd Multiplier ... + double mMultiplier2; + // + // Calculation ... + // + // Up Zone Applied to ... + ENUM_APPLIED_PRICE mUpAppliedTo; + // + // Down Zone Applied to ... + ENUM_APPLIED_PRICE mDownAppliedTo; + // + // Presentation ... + // + // Show 1st Long Exit ... + bool mShowLongExit1Line; + // + // Show 1st Short Exit ... + bool mShowShortExit1Line; + // + // Show 2st Long Exit ... + bool mShowLongExit2Line; + // + // Show 2st Short Exit ... + bool mShowShortExit2Line; +}; + +// +// START Usefull Functions ... +// + +// +// END Usefull Functions ... +// diff --git a/MQLTestWorkspace/X121/Old/Helpers/x-saherelm.x121.xct.helper.class.ex5 b/MQLTestWorkspace/X121/Old/Helpers/x-saherelm.x121.xct.helper.class.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..628a31d8333f9570962504264043f3b9e4da431e GIT binary patch literal 7230 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 J|9oAS@LyD#hRgr} literal 0 HcmV?d00001 diff --git a/MQLTestWorkspace/X121/Old/Helpers/x-saherelm.x121.xdema.helper.class.mq5 b/MQLTestWorkspace/X121/Old/Helpers/x-saherelm.x121.xdema.helper.class.mq5 new file mode 100644 index 0000000..2806bc2 --- /dev/null +++ b/MQLTestWorkspace/X121/Old/Helpers/x-saherelm.x121.xdema.helper.class.mq5 @@ -0,0 +1,470 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 Helper Class Library +// ---------------------------------------------- +// Name: XSCXDEMAHelper +// Description: provides all Indicator +// Helper requirements ... +// +// +// 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 + +// +// START Definitions ... +// + +// +// Inputs ... +struct XDEMAInputs +{ + // + // Makret ... + int length; // Length + int shift; // Shift + + // + // Presentation ... + bool showDema; // Show Dema + bool showEMA; // Show EMA + bool showEMAOfEMA; // Show EMA of EMA +}; + +// +// Index of Lines ... +enum ENUM_XDEMA_BUFFERS +{ + // + // Main Requirements ... + XDEMA_LINE = 0, + XDEMA_EMA_LINE = 2, + XDEMA_EMA_OF_EMA_LINE = 4, +}; + +// +// Retrieve Info Model ... +struct XDEMAInfo +{ + // + // Symbol ... + string symbol; + + // + // Period ... + ENUM_TIMEFRAMES period; + + // + // Bar Time ... + datetime barTime; + + // + // Bar Index ... + int barIndex; + + // + // Values ... + double dema; + double ema; + double emaOfEma; + + // + double demas[]; + double emas[]; + double emaOfEMAs[]; + + // + // Conditions ... +}; + +// +// END Definitions ... +// + +// +// START Import and Inclused requirements ... +// + +// +// Includes ... +#include "../Libraries/x-saherelm.common.lib.mq5" +#include "../Classes/x-saherelm.xhelper.class.mq5" + +// +// END Import and Inclused requirements ... +// + +// +// START Overrides ... +// + +// +// END Overrides ... +// + +// +// a Class for Helping Indicators Requirements ... +class XSCXDEMAHelper : public XSCBaseHelper +{ + // + // Public ... +public: + // + // Buffers ... + double demaBuffer[]; + double emaBuffer[]; + double emaOfEMABuffer[]; + + // + // Constructor ... + void XSCXDEMAHelper( + string symbol, // Trading Symbol + ENUM_TIMEFRAMES period // Trading Time Frame + ) : XSCBaseHelper(symbol, period) + { + PrepareTag(); + } + + // + // Deconstructor ... + void ~XSCXDEMAHelper() + { + } + + // + // START Properties ... + // + + // + // END Properties ... + // + + // + // START Provided Functions ... + // + + // + // Prepare Tag ... + virtual void PrepareTag() + { + mTag = "XDEMA" + GetTagPrefix(); + } + + // + virtual int GetMaxLength() + { + // + int result = -1; + + // + result = mLength; + + // + return result; + } + + // + // Initial Indicator Handler ... + bool Init() + { + // + bool result = false; + + // + // Validate Args ... + result = + // + (mLength >= 2 && + mShift >= 0) + // + ; + if (!result) + { + return false; + } + + // + // Initialize Handler ... + mHandler = iCustom( + // + mSymbol, + mPeriod, + "x-saherelm.x121.xdema", + // + // Inputs ... + // + // Makret ... + "", + // + // Length ... + mLength, + // + // Shift ... + mShift, + // + // Presentation ... + "", + // + // Show Dema ... + mShowDema, + // + // Show EMA ... + mShowEMA, + // + // Show EMA of EMA ... + mShowEMAOfEMA + // + ); + result = mHandler != INVALID_HANDLE; + + // + return result; + } + + // + // Retrieve Current Config ... + XDEMAInputs GetConfig() + { + // + XDEMAInputs result; + + // + result.length = mLength; + result.shift = mShift; + result.showDema = mShowDema; + result.showEMA = mShowEMA; + result.showEMAOfEMA = mShowEMAOfEMA; + + // + return result; + } + + // + // Set Config ... + bool SetConfig(XDEMAInputs &config) + { + // + bool result = false; + + // + mLength = config.length; + mShift = config.shift; + mShowDema = config.showDema; + mShowEMA = config.showEMA; + mShowEMAOfEMA = config.showEMAOfEMA; + + // + result = Init(); + + // + return result; + } + + // + // Show Dema ... + bool ShowDema( + bool show // Show or Hide + ) + { + // + bool result = false; + + // + if (mShowDema == show) + { + return true; + } + + // + mShowDema = show; + result = Init(); + + // + return result; + } + + // + // Show EMA ... + bool ShowEMA( + bool show // Show or Hide + ) + { + // + bool result = false; + + // + if (mShowEMA == show) + { + return true; + } + + // + mShowEMA = show; + result = Init(); + + // + return result; + } + + // + // Show EMA of EMA ... + bool ShowEMAOfEMA( + bool show // Show or Hide + ) + { + // + bool result = false; + + // + if (mShowEMAOfEMA == show) + { + return true; + } + + // + mShowEMAOfEMA = show; + result = Init(); + + // + return result; + } + + // + // Reading Buffers based on Given Bar Index ... + virtual void Calculate( + int barIndex // Given Bar Index + ) + { + // + // DEMA ... + ArraySetAsSeries(demaBuffer, true); + CopyBuffer( + mHandler, + XDEMA_LINE, + barIndex, + mLoopbackBars, + demaBuffer); + + // + // EMA ... + ArraySetAsSeries(emaBuffer, true); + CopyBuffer( + mHandler, + XDEMA_EMA_LINE, + barIndex, + mLoopbackBars, + emaBuffer); + + // + // EMAOFEMA ... + ArraySetAsSeries(emaOfEMABuffer, true); + CopyBuffer( + mHandler, + XDEMA_EMA_OF_EMA_LINE, + barIndex, + mLoopbackBars, + emaOfEMABuffer); + } + + // + // Retrieve Info at Specific Bar Index ... + XDEMAInfo GetInfo( + int barIndex // Given Bar Index + ) + { + // + XDEMAInfo result; + + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + // Do Calculations ... + Calculate(barIndex); + + // + // Generate Candle Time ... + datetime barTime = GetCandleTime( + mSymbol, + mPeriod, + barIndex); + + // + // Fill Result ... + result.symbol = mSymbol; + result.period = mPeriod; + result.barTime = barTime; + result.barIndex = barIndex; + + // + result.ema = emaBuffer[barIndex]; + result.dema = demaBuffer[barIndex]; + result.emaOfEma = emaOfEMABuffer[barIndex]; + + // + Copy( + emaBuffer, + result.demas); + Copy( + demaBuffer, + result.emas); + Copy( + emaOfEMABuffer, + result.emaOfEMAs); + + // + return result; + } + + // + // END Provided Functions ... + // + + // + // Protected ... +protected: + // + // Private ... +private: + // + // Indicator Properties ... + // + // Market ... + // + // Length ... + int mLength; + // + // Shift ... + int mShift; + // + // Presentation ... + // + // Show Dema ... + bool mShowDema; + // + // Show EMA ... + bool mShowEMA; + // + // Show EMA of EMA ... + bool mShowEMAOfEMA; +}; + +// +// START Usefull Functions ... +// + +// +// END Usefull Functions ... +// diff --git a/MQLTestWorkspace/X121/Old/Helpers/x-saherelm.x121.xfbb.helper.class.ex5 b/MQLTestWorkspace/X121/Old/Helpers/x-saherelm.x121.xfbb.helper.class.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..8e9751e0dff260637762875b207f6467930b0d6a GIT binary patch literal 6314 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 StD{GAacP}gy^q?*_`d*x^x&NU literal 0 HcmV?d00001 diff --git a/MQLTestWorkspace/X121/Old/Helpers/x-saherelm.x121.xfbb.helper.class.mq5 b/MQLTestWorkspace/X121/Old/Helpers/x-saherelm.x121.xfbb.helper.class.mq5 new file mode 100644 index 0000000..17bc30a --- /dev/null +++ b/MQLTestWorkspace/X121/Old/Helpers/x-saherelm.x121.xfbb.helper.class.mq5 @@ -0,0 +1,733 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 Helper Class Library +// ---------------------------------------------- +// Name: XSCXFBBHelper +// Description: provides all Indicator +// Helper requirements ... +// +// +// 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 + +// +// START Definitions ... +// + +// +// Inputs ... +struct XFBBInputs +{ + // + // Market ... + // + // Length ... + int length; + // + // Multiplier ... + double multiplier; + // + // Applied To ... + ENUM_APPLIED_PRICE appliedTo; + + // + // Presentation ... + // + // Show Base ... + bool showBase; + // + // Show Band ... + bool showBand; + // + // Show Golden Area ... + bool showGoldenArea; + // + // Show Other Levels ... + bool showOthers; +}; + +// +// Index of Lines ... +enum ENUM_XFBB_BUFFERS +{ + // + // Main Requirements ... + XFBB_BASE_LINE = 0, + XFBB_BASE_STATE_LINE = 1, + XFBB_UP_BAND_LINE = 13, + XFBB_DOWN_BAND_LINE = 24, + // + XFBB_UP_1_LINE = 2, + XFBB_UP_2_LINE = 4, + XFBB_UP_3_LINE = 6, + XFBB_UP_4_LINE = 8, + XFBB_UP_5_LINE = 10, + // + XFBB_DOWN_1_LINE = 14, + XFBB_DOWN_2_LINE = 16, + XFBB_DOWN_3_LINE = 18, + XFBB_DOWN_4_LINE = 20, + XFBB_DOWN_5_LINE = 22, +}; + +// +// Retrieve Info Model ... +struct XFBBInfo +{ + // + // Symbol ... + string symbol; + + // + // Period ... + ENUM_TIMEFRAMES period; + + // + // Bar Time ... + datetime barTime; + + // + // Bar Index ... + int barIndex; + + // + // Values ... + double base; + double baseState; + + // + double upBand; + double downBand; + + // + double up1; + double up2; + double up3; + double up4; + double up5; + + // + double down1; + double down2; + double down3; + double down4; + double down5; + + // + double bases[]; + double baseStates[]; + double upBands[]; + double downBands[]; + double up1s[]; + double up2s[]; + double up3s[]; + double up4s[]; + double up5s[]; + double down1s[]; + double down2s[]; + double down3s[]; + double down4s[]; + double down5s[]; + + // + // Conditions ... +}; + +// +// END Definitions ... +// + +// +// START Import and Inclused requirements ... +// + +// +// Includes ... +#include "../Libraries/x-saherelm.common.lib.mq5" +#include "../Classes/x-saherelm.xhelper.class.mq5" + +// +// END Import and Inclused requirements ... +// + +// +// START Overrides ... +// + +// +// END Overrides ... +// + +// +// a Class for Helping Indicators Requirements ... +class XSCXFBBHelper : public XSCBaseHelper +{ + // + // Public ... +public: + // + // Buffers ... + double baseBuffer[]; + double baseStateBuffer[]; + double upBandBuffer[]; + double downBandBuffer[]; + double up1Buffer[]; + double up2Buffer[]; + double up3Buffer[]; + double up4Buffer[]; + double up5Buffer[]; + double down1Buffer[]; + double down2Buffer[]; + double down3Buffer[]; + double down4Buffer[]; + double down5Buffer[]; + + // + // Constructor ... + void XSCXFBBHelper( + string symbol, // Trading Symbol + ENUM_TIMEFRAMES period // Trading Time Frame + ) : XSCBaseHelper(symbol, period) + { + PrepareTag(); + } + + // + // Deconstructor ... + void ~XSCXFBBHelper() + { + } + + // + // START Properties ... + // + + // + // END Properties ... + // + + // + // START Provided Functions ... + // + + // + // Prepare Tag ... + virtual void PrepareTag() + { + mTag = "XFBB" + GetTagPrefix(); + } + + // + virtual int GetMaxLength() + { + // + int result = -1; + + // + result = mLength; + + // + return result; + } + + // + // Initial Indicator Handler ... + bool Init() + { + // + bool result = false; + + // + // Validate Args ... + result = + // + (mLength >= 2 && + mMultiplier >= 0) + // + ; + if (!result) + { + return false; + } + + // + // Initialize Handler ... + mHandler = iCustom( + // + mSymbol, + mPeriod, + "x-saherelm.x121.xfbb", + // + // Inputs ... + // + // Market ... + "", + // + // Length ... + mLength, + // + // Multiplier ... + mMultiplier, + // + // Applied To ... + mApliedTo, + // + // Presentation ... + "", + // + // Show Base ... + mShowBase, + // + // Show Band ... + mShowBand, + // + // Show Golden Area ... + mShowGoldenArea, + // + // Show Other Levels ... + mShowOthers + // + ); + result = mHandler != INVALID_HANDLE; + + // + return result; + } + + // + // Retrieve Current Config ... + XFBBInputs GetConfig() + { + // + XFBBInputs result; + + // + result.length = mLength; + result.multiplier = mMultiplier; + result.appliedTo = mApliedTo; + result.showBase = mShowBase; + result.showBand = mShowBand; + result.showGoldenArea = mShowGoldenArea; + result.showOthers = mShowOthers; + + // + return result; + } + + // + // Set Config ... + bool SetConfig(XFBBInputs &config) + { + // + bool result = false; + + // + mLength = config.length; + mMultiplier = config.multiplier; + mApliedTo = config.appliedTo; + mShowBase = config.showBase; + mShowBand = config.showBand; + mShowGoldenArea = config.showGoldenArea; + mShowOthers = config.showOthers; + + // + result = Init(); + + // + return result; + } + + // + // Show Base ... + bool ShowBase( + bool show // Show or Hide + ) + { + // + bool result = false; + + // + if (mShowBase == show) + { + return true; + } + + // + mShowBase = show; + result = Init(); + + // + return result; + } + + // + // Show Band ... + bool ShowBand( + bool show // Show or Hide + ) + { + // + bool result = false; + + // + if (mShowBand == show) + { + return true; + } + + // + mShowBand = show; + result = Init(); + + // + return result; + } + + // + // Show Golden Area ... + bool ShowGoldenArea( + bool show // Show or Hide + ) + { + // + bool result = false; + + // + if (mShowGoldenArea == show) + { + return true; + } + + // + mShowGoldenArea = show; + result = Init(); + + // + return result; + } + + // + // Show Other Levels ... + bool ShowOthers( + bool show // Show or Hide + ) + { + // + bool result = false; + + // + if (mShowOthers == show) + { + return true; + } + + // + mShowOthers = show; + result = Init(); + + // + return result; + } + + // + // Reading Buffers based on Given Bar Index ... + virtual void Calculate( + int barIndex // Given Bar Index + ) + { + // + // BASE ... + ArraySetAsSeries(baseBuffer, true); + CopyBuffer( + mHandler, + XFBB_BASE_LINE, + barIndex, + mLoopbackBars, + baseBuffer); + + // + // BASE STATE ... + ArraySetAsSeries(baseStateBuffer, true); + CopyBuffer( + mHandler, + XFBB_BASE_STATE_LINE, + barIndex, + mLoopbackBars, + baseStateBuffer); + + // + // UPBAND ... + ArraySetAsSeries(upBandBuffer, true); + CopyBuffer( + mHandler, + XFBB_UP_BAND_LINE, + barIndex, + mLoopbackBars, + upBandBuffer); + + // + // DOWNBAND ... + ArraySetAsSeries(downBandBuffer, true); + CopyBuffer( + mHandler, + XFBB_DOWN_BAND_LINE, + barIndex, + mLoopbackBars, + downBandBuffer); + + // + // UP 1 ... + ArraySetAsSeries(up1Buffer, true); + CopyBuffer( + mHandler, + XFBB_UP_1_LINE, + barIndex, + mLoopbackBars, + up1Buffer); + + // + // UP 2 ... + ArraySetAsSeries(up2Buffer, true); + CopyBuffer( + mHandler, + XFBB_UP_2_LINE, + barIndex, + mLoopbackBars, + up2Buffer); + + // + // UP 3 ... + ArraySetAsSeries(up3Buffer, true); + CopyBuffer( + mHandler, + XFBB_UP_3_LINE, + barIndex, + mLoopbackBars, + up3Buffer); + + // + // UP 4 ... + ArraySetAsSeries(up4Buffer, true); + CopyBuffer( + mHandler, + XFBB_UP_4_LINE, + barIndex, + mLoopbackBars, + up4Buffer); + + // + // UP 5 ... + ArraySetAsSeries(up5Buffer, true); + CopyBuffer( + mHandler, + XFBB_UP_5_LINE, + barIndex, + mLoopbackBars, + up5Buffer); + + // + // DOWN 1 ... + ArraySetAsSeries(down1Buffer, true); + CopyBuffer( + mHandler, + XFBB_DOWN_1_LINE, + barIndex, + mLoopbackBars, + down1Buffer); + + // + // DOWN 2 ... + ArraySetAsSeries(down2Buffer, true); + CopyBuffer( + mHandler, + XFBB_DOWN_2_LINE, + barIndex, + mLoopbackBars, + down2Buffer); + + // + // DOWN 3 ... + ArraySetAsSeries(down3Buffer, true); + CopyBuffer( + mHandler, + XFBB_DOWN_3_LINE, + barIndex, + mLoopbackBars, + down3Buffer); + + // + // DOWN 4 ... + ArraySetAsSeries(down4Buffer, true); + CopyBuffer( + mHandler, + XFBB_DOWN_4_LINE, + barIndex, + mLoopbackBars, + down4Buffer); + + // + // DOWN 5 ... + ArraySetAsSeries(down5Buffer, true); + CopyBuffer( + mHandler, + XFBB_DOWN_5_LINE, + barIndex, + mLoopbackBars, + down5Buffer); + } + + // + // Retrieve Info at Specific Bar Index ... + XFBBInfo GetInfo( + int barIndex // Given Bar Index + ) + { + // + XFBBInfo result; + + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + // Do Calculations ... + Calculate(barIndex); + + // + // Generate Candle Time ... + datetime barTime = GetCandleTime( + mSymbol, + mPeriod, + barIndex); + + // + // Fill Result ... + result.symbol = mSymbol; + result.period = mPeriod; + result.barTime = barTime; + result.barIndex = barIndex; + + // + // values ... + result.base = baseBuffer[barIndex]; + result.baseState = baseStateBuffer[barIndex]; + result.upBand = upBandBuffer[barIndex]; + result.downBand = downBandBuffer[barIndex]; + result.up1 = up1Buffer[barIndex]; + result.up2 = up2Buffer[barIndex]; + result.up3 = up3Buffer[barIndex]; + result.up4 = up4Buffer[barIndex]; + result.up5 = up5Buffer[barIndex]; + result.down1 = down1Buffer[barIndex]; + result.down2 = down2Buffer[barIndex]; + result.down3 = down3Buffer[barIndex]; + result.down4 = down4Buffer[barIndex]; + result.down5 = down5Buffer[barIndex]; + + // + Copy( + baseBuffer, + result.bases); + Copy( + baseStateBuffer, + result.baseStates); + Copy( + upBandBuffer, + result.upBands); + Copy( + downBandBuffer, + result.downBands); + Copy( + up1Buffer, + result.up1s); + Copy( + up2Buffer, + result.up2s); + Copy( + up3Buffer, + result.up3s); + Copy( + up4Buffer, + result.up4s); + Copy( + up5Buffer, + result.up5s); + Copy( + down1Buffer, + result.down1s); + Copy( + down2Buffer, + result.down2s); + Copy( + down3Buffer, + result.down3s); + Copy( + down4Buffer, + result.down4s); + Copy( + down5Buffer, + result.down5s); + + // + return result; + } + + // + // END Provided Functions ... + // + + // + // Protected ... +protected: + // + // Private ... +private: + // + // Indicator Properties ... + // + // Market ... + // + // Length ... + int mLength; + // + // Multiplier ... + double mMultiplier; + // + // Applied To ... + ENUM_APPLIED_PRICE mApliedTo; + + // + // Presentation ... + // + // Show Base ... + bool mShowBase; + // + // Show Band ... + bool mShowBand; + // + // Show Golden Area ... + bool mShowGoldenArea; + // + // Show Other Levels ... + bool mShowOthers; +}; + +// +// START Usefull Functions ... +// + +// +// END Usefull Functions ... +// diff --git a/MQLTestWorkspace/X121/Old/Helpers/x-saherelm.x121.xhk.helper.class.ex5 b/MQLTestWorkspace/X121/Old/Helpers/x-saherelm.x121.xhk.helper.class.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..5fccd57c1a376fe7c15adc913981f7d4570e8a88 GIT binary patch literal 6322 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 WVLFDt;$q=Sm!c=8_i&+=75OhpZ15ET literal 0 HcmV?d00001 diff --git a/MQLTestWorkspace/X121/Old/Helpers/x-saherelm.x121.xhk.helper.class.mq5 b/MQLTestWorkspace/X121/Old/Helpers/x-saherelm.x121.xhk.helper.class.mq5 new file mode 100644 index 0000000..eeef329 --- /dev/null +++ b/MQLTestWorkspace/X121/Old/Helpers/x-saherelm.x121.xhk.helper.class.mq5 @@ -0,0 +1,441 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 Helper Class Library +// ---------------------------------------------- +// Name: XSCXHKHelper +// Description: provides all Indicator +// Helper requirements ... +// +// +// 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 + +// +// START Definitions ... +// + +// +// Inputs ... +struct XHKInputs +{ + // + // Presentation ... + bool drawCandles; // Draw Hiken Ashi Candle + bool drawCandleLines; // Show HikenAshi Lines +}; + +// +// Index of Lines ... +enum ENUM_XHK_BUFFERS +{ + // + // Main Requirements ... + XHK_OPEN_LINE = 0, + XHK_HIGH_LINE = 1, + XHK_LOW_LINE = 2, + XHK_CLOSE_LINE = 3, +}; + +// +// Retrieve Info Model ... +struct XHKInfo +{ + // + // Symbol ... + string symbol; + + // + // Period ... + ENUM_TIMEFRAMES period; + + // + // Bar Time ... + datetime barTime; + + // + // Bar Index ... + int barIndex; + + // + // Values ... + double open; + double high; + double low; + double close; + + // + double opens[]; + double highs[]; + double lows[]; + double closes[]; + + // + // Conditions ... + + // + // Detect Candle is Bullish or not ... + bool isBullish; + + // + // Detect Candle is Bearish or not ... + bool isBearish; +}; + +// +// END Definitions ... +// + +// +// START Import and Inclused requirements ... +// + +// +// Includes ... +#include "../Libraries/x-saherelm.common.lib.mq5" +#include "../Classes/x-saherelm.xhelper.class.mq5" + +// +// END Import and Inclused requirements ... +// + +// +// START Overrides ... +// + +// +// END Overrides ... +// + +// +// a Class for Helping Indicators Requirements ... +class XSCXHKHelper : public XSCBaseHelper +{ + // + // Public ... +public: + // + // Buffers ... + double openBuffer[]; + double highBuffer[]; + double lowBuffer[]; + double closeBuffer[]; + + // + // Constructor ... + void XSCXHKHelper( + string symbol, // Trading Symbol + ENUM_TIMEFRAMES period // Trading Time Frame + // + // Indicator Properties ... + // + // Presentation ... + // + // Draw Hiken Ashi Candle ... + ) : XSCBaseHelper(symbol, period) + { + PrepareTag(); + } + + // + // Deconstructor ... + void ~XSCXHKHelper() + { + } + + // + // START Properties ... + // + + // + // Draw Candles ... + bool DrawCandles( + bool show // Show or Hide + ) + { + // + bool result = false; + + // + if (mDrawCandles == show) + { + return true; + } + + // + mDrawCandles = show; + result = Init(); + + // + return result; + } + + // + // Show HikenAshi Lines ... + bool DrawCandleLines( + bool show // Show or Hide + ) + { + // + bool result = false; + + // + if (mDrawCandleLines == show) + { + return true; + } + + // + mDrawCandleLines = show; + result = Init(); + + // + return result; + } + + // + // END Properties ... + // + + // + // START Provided Functions ... + // + + // + // Prepare Tag ... + virtual void PrepareTag() + { + mTag = "XHK" + GetTagPrefix(); + } + + // + virtual int GetMaxLength() + { + // + int result = -1; + + // + result = 2; + + // + return result; + } + + // + // Initial Indicator Handler ... + bool Init() + { + // + bool result = false; + + // + // Initialize Handler ... + mHandler = iCustom( + // + mSymbol, + mPeriod, + "x-saherelm.x121.xhk", + // + // Inputs ... + // + // Presentation ... + "", + // + // Draw Hiken Ashi Candle ... + mDrawCandles, + // + // Show HikenAshi Lines ... + mDrawCandleLines + // + ); + result = mHandler != INVALID_HANDLE; + + // + return result; + } + + // + // Retrieve Current Config ... + XHKInputs GetConfig() + { + // + XHKInputs result; + + // + result.drawCandles = mDrawCandles; + result.drawCandleLines = mDrawCandleLines; + + // + return result; + } + + // + // Set Config ... + bool SetConfig(XHKInputs &config) + { + // + bool result = false; + + // + mDrawCandles = config.drawCandles; + mDrawCandleLines = config.drawCandleLines; + + // + result = Init(); + + // + return result; + } + + // + // Reading Buffers based on Given Bar Index ... + virtual void Calculate( + int barIndex // Given Bar Index + ) + { + // + // OPEN ... + ArraySetAsSeries(openBuffer, true); + CopyBuffer( + mHandler, + XHK_OPEN_LINE, + barIndex, + mLoopbackBars, + openBuffer); + + // + // HIGH ... + ArraySetAsSeries(highBuffer, true); + CopyBuffer( + mHandler, + XHK_HIGH_LINE, + barIndex, + mLoopbackBars, + highBuffer); + + // + // LOW ... + ArraySetAsSeries(lowBuffer, true); + CopyBuffer( + mHandler, + XHK_LOW_LINE, + barIndex, + mLoopbackBars, + lowBuffer); + + // + // CLOSE ... + ArraySetAsSeries(closeBuffer, true); + CopyBuffer( + mHandler, + XHK_CLOSE_LINE, + barIndex, + mLoopbackBars, + closeBuffer); + } + + // + // Retrieve Info at Specific Bar Index ... + XHKInfo GetInfo( + int barIndex // Given Bar Index + ) + { + // + XHKInfo result; + + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + // Do Calculations ... + Calculate(barIndex); + + // + // Generate Candle Time ... + datetime barTime = GetCandleTime( + mSymbol, + mPeriod, + barIndex); + + // + // Fill Result ... + result.symbol = mSymbol; + result.period = mPeriod; + result.barTime = barTime; + result.barIndex = barIndex; + + // + double open = openBuffer[barIndex]; + double high = highBuffer[barIndex]; + double low = lowBuffer[barIndex]; + double close = closeBuffer[barIndex]; + + // + result.open = open; + result.high = high; + result.low = low; + result.close = close; + + // + Copy( + openBuffer, + result.opens); + Copy( + highBuffer, + result.highs); + Copy( + lowBuffer, + result.lows); + Copy( + closeBuffer, + result.closes); + + // + result.isBullish = open < close; + result.isBearish = open >= close; + + // + return result; + } + + // + // END Provided Functions ... + // + + // + // Protected ... +protected: + // + // Private ... +private: + // + // Indicator Properties ... + // + // Presentation ... + // + // Draw Hiken Ashi Candle ... + bool mDrawCandles; + // + // Show HikenAshi Lines ... + bool mDrawCandleLines; +}; + +// +// START Usefull Functions ... +// + +// +// END Usefull Functions ... +// diff --git a/MQLTestWorkspace/X121/Old/Helpers/x-saherelm.x121.xhull.helper.class.ex5 b/MQLTestWorkspace/X121/Old/Helpers/x-saherelm.x121.xhull.helper.class.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..7d0b879d61ddd8a7312e921a5ace4273f6054ab6 GIT binary patch literal 6234 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 nSRyViZ-= 9 && + mDivisor >= 0.5; + if (!result) + { + return result; + } + + // + // Initialize Handler ... + mHandler = iCustom( + // + mSymbol, + mPeriod, + "x-saherelm.x121.xhull", + // + // Inputs ... + // + // Market ... + "", + // + // Length ... + mLength, + // + // Divisor (Speed) ... + mDivisor, + // + // Calculation ... + "", + // + // Up Zone Applied to ... + mUpAppliedTo, + // + // Down Zone Applied to ... + mDownAppliedTo, + // + // Presentation ... + "", + // + // Show Up Zone ... + mShowUpZone, + // + // Show Down Zone ... + mShowDownZone + // + ); + result = mHandler != INVALID_HANDLE; + + // + return result; + } + + // + // Retrieve Current Config ... + XHULLInputs GetConfig() + { + // + XHULLInputs result; + + // + result.length = mLength; + result.divisor = mDivisor; + result.upAppliedTo = mUpAppliedTo; + result.downAppliedTo = mDownAppliedTo; + result.showUpZone = mShowUpZone; + result.showDownZone = mShowDownZone; + + // + return result; + } + + // + // Set Config ... + bool SetConfig(XHULLInputs &config) + { + // + bool result = false; + + // + mLength = config.length; + mDivisor = config.divisor; + mUpAppliedTo = config.upAppliedTo; + mDownAppliedTo = config.downAppliedTo; + mShowUpZone = config.showUpZone; + mShowDownZone = config.showDownZone; + + // + result = Init(); + + // + return result; + } + + // + // Reading Buffers based on Given Bar Index ... + virtual void Calculate( + int barIndex // Given Bar Index + ) + { + // + // UP ... + ArraySetAsSeries(upBuffer, true); + CopyBuffer( + mHandler, + XHULL_UP_ZONE_LINE, + barIndex, + mLoopbackBars, + upBuffer); + + // + // UP State ... + ArraySetAsSeries(upStateBuffer, true); + CopyBuffer( + mHandler, + XHULL_UP_ZONE_STATE_LINE, + barIndex, + mLoopbackBars, + upStateBuffer); + + // + // DOWN ... + ArraySetAsSeries(downBuffer, true); + CopyBuffer( + mHandler, + XHULL_DOWN_ZONE_LINE, + barIndex, + mLoopbackBars, + downBuffer); + + // + // DOWN State ... + ArraySetAsSeries(downStateBuffer, true); + CopyBuffer( + mHandler, + XHULL_DOWN_ZONE_STATE_LINE, + barIndex, + mLoopbackBars, + downStateBuffer); + } + + // + // Retrieve Info at Specific Bar Index ... + XHULLInfo GetInfo( + int barIndex // Given Bar Index + ) + { + // + XHULLInfo result; + + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + // Do Calculations ... + Calculate(barIndex); + + // + // Generate Candle Time ... + datetime barTime = GetCandleTime( + mSymbol, + mPeriod, + barIndex); + + // + // Fill Result ... + result.symbol = mSymbol; + result.period = mPeriod; + result.barTime = barTime; + result.barIndex = barIndex; + + // + double up = upBuffer[barIndex]; + XHULL_ZONE_STATES upState = (XHULL_ZONE_STATES)upStateBuffer[barIndex]; + XHULL_ZONE_STATES upStatePrev = (XHULL_ZONE_STATES)upStateBuffer[barIndex + 1]; + + // + double down = downBuffer[barIndex]; + XHULL_ZONE_STATES downState = (XHULL_ZONE_STATES)downStateBuffer[barIndex]; + XHULL_ZONE_STATES downStatePrev = (XHULL_ZONE_STATES)downStateBuffer[barIndex + 1]; + + // + result.up = up; + result.upState = upState; + result.down = down; + result.downState = downState; + + // + Copy( + upBuffer, + result.ups); + Copy( + upStateBuffer, + result.upStates); + Copy( + downBuffer, + result.downs); + Copy( + downStateBuffer, + result.downStates); + + // + result.isUpBullish = upState = XHULL_STATE_BULLISH; + result.isUpBearish = upState = XHULL_STATE_BEARISH; + result.isUpNeutural = upState = XHULL_STATE_NEUTURAL; + + // + result.isUpSwitchedToBullish = upState == XHULL_STATE_BULLISH && + upStatePrev != XHULL_STATE_BULLISH; + result.isUpSwitchedToBearish = upState == XHULL_STATE_BEARISH && + upStatePrev != XHULL_STATE_BEARISH; + result.isUpSwitchedToNeutural = upState == XHULL_STATE_NEUTURAL && + upStatePrev != XHULL_STATE_NEUTURAL; + + // + result.isDownBullish = downState = XHULL_STATE_BULLISH; + result.isDownBearish = downState = XHULL_STATE_BEARISH; + result.isDownNeutural = downState = XHULL_STATE_NEUTURAL; + + // + result.isDownSwitchedToBullish = downState == XHULL_STATE_BULLISH && + downStatePrev != XHULL_STATE_BULLISH; + result.isDownSwitchedToBearish = downState == XHULL_STATE_BEARISH && + downStatePrev != XHULL_STATE_BEARISH; + result.isDownSwitchedToNeutural = downState == XHULL_STATE_NEUTURAL && + downStatePrev != XHULL_STATE_NEUTURAL; + + // + return result; + } + + // + // END Provided Functions ... + // + + // + // Protected ... +protected: + // + // Private ... +private: + // + // Indicator Properties ... + // + // Market ... + // + // Length ... + int mLength; + // + // Divisor (Speed) ... + double mDivisor; + // + // Calculation ... + // + // Up Zone Applied to ... + ENUM_APPLIED_PRICE mUpAppliedTo; + // + // Down Zone Applied to ... + ENUM_APPLIED_PRICE mDownAppliedTo; + // + // Presentation ... + // + // Show Up Zone ... + bool mShowUpZone; + // + // Show Down Zone ... + bool mShowDownZone; +}; + +// +// START Usefull Functions ... +// + +// +// END Usefull Functions ... +// diff --git a/MQLTestWorkspace/X121/Old/Helpers/x-saherelm.x121.xich.helper.class.ex5 b/MQLTestWorkspace/X121/Old/Helpers/x-saherelm.x121.xich.helper.class.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..e79b63981711bebfc221a12b4445fc890f64d2e6 GIT binary patch literal 5718 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 literal 0 HcmV?d00001 diff --git a/MQLTestWorkspace/X121/Old/Helpers/x-saherelm.x121.xich.helper.class.mq5 b/MQLTestWorkspace/X121/Old/Helpers/x-saherelm.x121.xich.helper.class.mq5 new file mode 100644 index 0000000..e348836 --- /dev/null +++ b/MQLTestWorkspace/X121/Old/Helpers/x-saherelm.x121.xich.helper.class.mq5 @@ -0,0 +1,1083 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 Helper Class Library +// ---------------------------------------------- +// Name: XSCXICHHelper +// Description: provides all Indicator +// Helper requirements ... +// +// +// Maintainer: +// ------------ +// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) +// +////////////////////////////////////////////////////// +// +// Global Properties ... +// +// Global Properties ... +#property library +#property copyright "Copyright 2023, SaherElm IT Center" +#property link "https://www.saherelm.ir" +#property version "1.00" +#property strict + +// +// START Definitions ... +// + +// +// Ichimoku Lines Calculator Mode ... +enum ENUM_X_ICHIMOKU_CALCULATION_MODE +{ + // + X_XICH_HH_LL_MODE = 1, // Highest High and Lowest Low + X_XICH_HO_LC_MODE = 2, // Highest Open and Lowest Close +}; + +// +// Inputs ... +struct XICHInputs +{ + // + // TENKANSEN ... + // Tenkan Sen ... + int tenkanSenLength; // Length + ENUM_X_ICHIMOKU_CALCULATION_MODE tenkanSenMode; // Calculation Mode + + // + // KIJUNSEN ... + // Kijun Sen ... + int kijunSenLength; // Length + ENUM_X_ICHIMOKU_CALCULATION_MODE kijunSenMode; // Calculation Mode + + // + // SENKOUSPANB ... + // Senkou Span B ... + int senkouSpanBLength; // Length + ENUM_X_ICHIMOKU_CALCULATION_MODE senkouSpanBMode; // Calculation Mode + + // + // CHIKOUSPAN ... + // Chikou Span ... + ENUM_APPLIED_PRICE chikuoSpanAppliedTo; // Price Type + + // + // Presentation ... + bool showTenkanSen; // Show Tenkan Sen + bool showKijunSen; // Show Kijun Sen + bool showKijunSenPlus; // Show Kijun Sen + + bool showKijunSenNegative; // Show Kijun Sen - + bool showChikouSpan; // Show Chikou Span + bool showSenkouSpanA; // Show Senkou Span A + bool showSenkouSpanB; // Show Senkou Span B + bool showKumo; // Show Kumo + bool shiftKumo; // Shift Kumo to Future +}; + +// +// Index of Lines ... +enum ENUM_XICH_BUFFERS +{ + // + // Main Requirements ... + XICH_TEANKANSEN_LINE = 0, + XICH_KIJUNSEN_LINE = 1, + XICH_CHIKOUSPAN_LINE = 4, + XICH_SENKOUSPANA_LINE = 5, + XICH_SENKOUSPANB_LINE = 6, + // + XICH_D_TENK_LINE = 9, + XICH_D_KIJ_LINE = 10, + XICH_D_CHIK_LINE = 11, + XICH_D_SSA_LINE = 12, + XICH_D_SSB_LINE = 13 +}; + +// +// Retrieve Info Model ... +struct XICHInfo +{ + // + // Symbol ... + string symbol; + + // + // Period ... + ENUM_TIMEFRAMES period; + + // + // Bar Time ... + datetime barTime; + + // + // Bar Index ... + int barIndex; + + // + // Values ... + double tenkanSen; + double kijunSen; + double chikouSpan; + double senkouSpanA; + double senkouSpanB; + double senkouSpanAFuture; + double senkouSpanBFuture; + + // + double dKij; + double dSSA; + double dSSB; + double dTenk; + double dChik; + + // + double dKijs[]; + double dSSAs[]; + double dSSBs[]; + double dTenks[]; + double dChiks[]; + + // + // Conditions ... + + // + bool isTenkanSenOverKijunSen; + bool isTenkanSenUnderKijunSen; + bool isTenkanSenCrossedOverKijunSen; + bool isTenkanSenCrossedUnderKijunSen; + + // + bool isKumoBullish; + bool isKumoBearish; + bool isFutureKumoBullish; + bool isFutureKumoBearish; + bool isKumoSwitchedToBullish; + bool isKumoSwitchedToBearish; + bool isFutureKumoSwitchedToBullish; + bool isFutureKumoSwitchedToBearish; + + // + bool isTenkanSenOverSenkouSpanA; + bool isTenkanSenUnderSenkouSpanA; + bool isTenkanSenOverFutureSenkouSpanA; + bool isTenkanSenUnderFutureSenkouSpanA; + bool isTenkanSenCrossedOverSenkouSpanA; + bool isTenkanSenCrossedUnderSenkouSpanA; + bool isTenkanSenCrossedOverFutureSenkouSpanA; + bool isTenkanSenCrossedUnderFutureSenkouSpanA; + + // + bool isTenkanSenOverSenkouSpanB; + bool isTenkanSenUnderSenkouSpanB; + bool isTenkanSenOverFutureSenkouSpanB; + bool isTenkanSenUnderFutureSenkouSpanB; + bool isTenkanSenCrossedOverSenkouSpanB; + bool isTenkanSenCrossedUnderSenkouSpanB; + bool isTenkanSenCrossedOverFutureSenkouSpanB; + bool isTenkanSenCrossedUnderFutureSenkouSpanB; + + // + bool isKijunSenOverSenkouSpanA; + bool isKijunSenUnderSenkouSpanA; + bool isKijunSenOverFutureSenkouSpanA; + bool isKijunSenUnderFutureSenkouSpanA; + bool isKijunSenCrossedOverSenkouSpanA; + bool isKijunSenCrossedUnderSenkouSpanA; + bool isKijunSenCrossedOverFutureSenkouSpanA; + bool isKijunSenCrossedUnderFutureSenkouSpanA; + + // + bool isKijunSenOverSenkouSpanB; + bool isKijunSenUnderSenkouSpanB; + bool isKijunSenOverFutureSenkouSpanB; + bool isKijunSenUnderFutureSenkouSpanB; + bool isKijunSenCrossedOverSenkouSpanB; + bool isKijunSenCrossedUnderSenkouSpanB; + bool isKijunSenCrossedOverFutureSenkouSpanB; + bool isKijunSenCrossedUnderFutureSenkouSpanB; +}; + +// +// END Definitions ... +// + +// +// START Import and Inclused requirements ... +// + +// +// Includes ... +#include "../Libraries/x-saherelm.common.lib.mq5" +#include "../Classes/x-saherelm.xhelper.class.mq5" + +// +// END Import and Inclused requirements ... +// + +// +// START Overrides ... +// + +// +// END Overrides ... +// + +// +// a Class for Helping Indicators Requirements ... +class XSCXICHHelper : public XSCBaseHelper +{ + // + // Public ... +public: + // + // Buffers ... + double tenkanSenBuffer[]; + double kijunSenBuffer[]; + double chikouSpanBuffer[]; + double senkouSpanABuffer[]; + double senkouSpanBBuffer[]; + + // + double dTenkanBuffer[]; + double dKijunBuffer[]; + double dChikouBuffer[]; + double dSSABuffer[]; + double dSSBBuffer[]; + + // + // Constructor ... + void XSCXICHHelper( + string symbol, // Trading Symbol + ENUM_TIMEFRAMES period // Trading Time Frame + ) : XSCBaseHelper(symbol, period) + { + PrepareTag(); + } + + // + // Deconstructor ... + void ~XSCXICHHelper() + { + } + + // + // START Properties ... + // + + // + // Show Tenkan Sen ... + bool ShowTenkanSen( + bool show // Show or Hide + ) + { + // + bool result = false; + + // + if (mShowTenkanSen == show) + { + return true; + } + + // + mShowTenkanSen = show; + result = Init(); + + // + return result; + } + + // + // Show Kijun Sen ... + bool ShowKijunSen( + bool show // Show or Hide + ) + { + // + bool result = false; + + // + if (mShowKijunSen == show) + { + return true; + } + + // + mShowKijunSen = show; + result = Init(); + + // + return result; + } + + // + // Show Chikou Span ... + bool ShowChikouSpan( + bool show // Show or Hide + ) + { + // + bool result = false; + + // + if (mShowChikouSpan == show) + { + return true; + } + + // + mShowChikouSpan = show; + result = Init(); + + // + return result; + } + + // + // Show Senkou Span A ... + bool ShowSenkouSpanA( + bool show // Show or Hide + ) + { + // + bool result = false; + + // + if (mShowSenkouSpanA == show) + { + return true; + } + + // + mShowSenkouSpanA = show; + result = Init(); + + // + return result; + } + + // + // Show Senkou Span B ... + bool ShowSenkouSpanB( + bool show // Show or Hide + ) + { + // + bool result = false; + + // + if (mShowSenkouSpanB == show) + { + return true; + } + + // + mShowSenkouSpanB = show; + result = Init(); + + // + return result; + } + + // + // Show Kumo ... + bool ShowKumo( + bool show // Show or Hide + ) + { + // + bool result = false; + + // + if (mShowKumo == show) + { + return true; + } + + // + mShowKumo = show; + result = Init(); + + // + return result; + } + + // + // END Properties ... + // + + // + // START Provided Functions ... + // + + // + // Prepare Tag ... + virtual void PrepareTag() + { + mTag = "XICH" + GetTagPrefix(); + } + + // + virtual int GetMaxLength() + { + // + int result = -1; + // + result = MathMax(result, mTenkanSenLength); + result = MathMax(result, mKijunSenLength); + result = MathMax(result, mSenkouSpanBLength); + + // + return result; + } + + // + // Initial Indicator Handler ... + bool Init() + { + // + bool result = false; + + // + // Validate Inputs ... + // + result = + (mTenkanSenLength > 2 && + mKijunSenLength > mTenkanSenLength && + mSenkouSpanBLength > mKijunSenLength); + if (!result) + { + return result; + } + + // + // Initialize Handler ... + mHandler = iCustom( + // + mSymbol, + mPeriod, + "x-saherelm.x121.xich", + // + // Inputs ... + // + // TENKANSEN ... + "", + // + // Length ... + mTenkanSenLength, + // + // Calculation Mode ... + mTenkanSenMode, + // + // KIJUNSEN ... + "", + // + // Length ... + mKijunSenLength, + // + // Calculation Mode ... + mKijunSenMode, + // + // SENKOUSPANA ... + "", + // + // Length ... + mSenkouSpanBLength, + // + // Calculation Mode ... + mSenkouSpanBMode, + // + // CHIKOUSPAN ... + "", + // + // Price Type ... + mChikuoSpanAppliedTo, + // + // PRESENTATION ... + "", + // + // Show Tenkan Sen ... + mShowTenkanSen, + // + // Show Kijun Sen ... + mShowKijunSen, + // + // Show Kijun Sen + ... + mShowKijunSenPlus, + // + // Show Kijun Sen - ... + mShowKijunSenNegative, + // + // Show Chikou Span ... + mShowChikouSpan, + // + // Show Senkou Span A ... + mShowSenkouSpanA, + // + // Show Senkou Span B ... + mShowSenkouSpanB, + // + // Show Kumo ... + mShowKumo, + // + // Shift Kumo to Future ... + mShiftKumo + // + ); + result = mHandler != INVALID_HANDLE; + + // + return result; + } + + // + // Retrieve Current Config ... + XICHInputs GetConfig() + { + // + XICHInputs result; + + // + result.tenkanSenLength = mTenkanSenLength; + result.tenkanSenMode = mTenkanSenMode; + result.kijunSenLength = mKijunSenLength; + result.kijunSenMode = mKijunSenMode; + result.senkouSpanBLength = mSenkouSpanBLength; + result.senkouSpanBMode = mSenkouSpanBMode; + result.chikuoSpanAppliedTo = mChikuoSpanAppliedTo; + result.showTenkanSen = mShowTenkanSen; + result.showKijunSen = mShowKijunSen; + result.showKijunSenPlus = mShowKijunSenPlus; + result.showKijunSenNegative = mShowKijunSenNegative; + result.showChikouSpan = mShowChikouSpan; + result.showSenkouSpanA = mShowSenkouSpanA; + result.showSenkouSpanB = mShowSenkouSpanB; + result.showKumo = mShowKumo; + result.shiftKumo = mShiftKumo; + + // + return result; + } + + // + // Set Config ... + bool SetConfig(XICHInputs &config) + { + // + bool result = false; + + // + mTenkanSenLength = config.tenkanSenLength; + mTenkanSenMode = config.tenkanSenMode; + mKijunSenLength = config.kijunSenLength; + mKijunSenMode = config.kijunSenMode; + mSenkouSpanBLength = config.senkouSpanBLength; + mSenkouSpanBMode = config.senkouSpanBMode; + mChikuoSpanAppliedTo = config.chikuoSpanAppliedTo; + mShowTenkanSen = config.showTenkanSen; + mShowKijunSen = config.showKijunSen; + mShowKijunSenPlus = config.showKijunSenPlus; + mShowKijunSenNegative = config.showKijunSenNegative; + mShowChikouSpan = config.showChikouSpan; + mShowSenkouSpanA = config.showSenkouSpanA; + mShowSenkouSpanB = config.showSenkouSpanB; + mShowKumo = config.showKumo; + mShiftKumo = config.shiftKumo; + + // + result = Init(); + + // + return result; + } + + // + // Reading Buffers based on Given Bar Index ... + virtual void Calculate( + int barIndex // Given Bar Index + ) + { + // + // Since Ichimoku Has Some Issues ... + mLoopbackBars = 52; + + // + // TENKANSEN ... + ArraySetAsSeries(tenkanSenBuffer, true); + CopyBuffer( + mHandler, + XICH_TEANKANSEN_LINE, + barIndex, + mLoopbackBars, + tenkanSenBuffer); + + // + // KIJUNSEN ... + ArraySetAsSeries(kijunSenBuffer, true); + CopyBuffer( + mHandler, + XICH_KIJUNSEN_LINE, + barIndex, + mLoopbackBars, + kijunSenBuffer); + + // + // CHIKOUSPAN ... + ArraySetAsSeries(chikouSpanBuffer, true); + CopyBuffer( + mHandler, + XICH_CHIKOUSPAN_LINE, + barIndex + mKijunSenLength + 1, + mLoopbackBars, + chikouSpanBuffer); + + // + // SENKOUSPANA ... + ArraySetAsSeries(senkouSpanABuffer, true); + CopyBuffer( + mHandler, + XICH_SENKOUSPANA_LINE, + -1 * (barIndex + mKijunSenLength), + mLoopbackBars, + senkouSpanABuffer); + + // + // SENKOUSPANB ... + ArraySetAsSeries(senkouSpanBBuffer, true); + CopyBuffer( + mHandler, + XICH_SENKOUSPANB_LINE, + -1 * (barIndex + mKijunSenLength), + mLoopbackBars, + senkouSpanBBuffer); + + // + // DATA Buffers ... + + // + // D Tenkan ... + ArraySetAsSeries(dTenkanBuffer, true); + CopyBuffer( + mHandler, + XICH_D_TENK_LINE, + barIndex, + mLoopbackBars, + dTenkanBuffer); + + // + // D Kijun ... + ArraySetAsSeries(dKijunBuffer, true); + CopyBuffer( + mHandler, + XICH_D_KIJ_LINE, + barIndex, + mLoopbackBars, + dKijunBuffer); + + // + // D Chikou ... + ArraySetAsSeries(dChikouBuffer, true); + CopyBuffer( + mHandler, + XICH_D_CHIK_LINE, + barIndex, + mLoopbackBars, + dChikouBuffer); + + // + // D SSA ... + ArraySetAsSeries(dSSABuffer, true); + CopyBuffer( + mHandler, + XICH_D_SSA_LINE, + barIndex, + mLoopbackBars, + dSSABuffer); + + // + // D SSB ... + ArraySetAsSeries(dSSBBuffer, true); + CopyBuffer( + mHandler, + XICH_D_SSB_LINE, + barIndex, + mLoopbackBars, + dSSBBuffer); + } + + // + // Retrieve Info at Specific Bar Index ... + XICHInfo GetInfo( + int barIndex // Given Bar Index + ) + { + // + XICHInfo result; + + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + // Do Calculations ... + Calculate(barIndex); + + // + // Generate Candle Time ... + datetime barTime = GetCandleTime( + mSymbol, + mPeriod, + barIndex); + + // + // Fill Result ... + result.symbol = mSymbol; + result.period = mPeriod; + result.barTime = barTime; + result.barIndex = barIndex; + + // + double dTenk = dTenkanBuffer[barIndex]; + double dTenkPrev = dTenkanBuffer[barIndex + 1]; + + // + double dKij = dKijunBuffer[barIndex]; + double dKijrev = dKijunBuffer[barIndex + 1]; + + // + double dChik = dChikouBuffer[barIndex]; + double dChikPrev = dChikouBuffer[barIndex + 1]; + + // + double dSSA = dSSABuffer[barIndex]; + double dSSAPrev = dSSABuffer[barIndex + 1]; + + // + double dSSB = dSSBBuffer[barIndex]; + double dSSBPrev = dSSBBuffer[barIndex + 1]; + + // + Copy( + dKijunBuffer, + result.dKijs); + Copy( + dSSABuffer, + result.dSSAs); + Copy( + dSSBBuffer, + result.dSSBs); + Copy( + dTenkanBuffer, + result.dTenks); + Copy( + dChikouBuffer, + result.dChiks); + + // + result.dTenk = dTenk; + result.dKij = dKij; + result.dChik = dChik; + result.dSSA = dSSA; + result.dSSB = dSSB; + + // + double tenkanSen = tenkanSenBuffer[barIndex]; + double tenkanSenPrev = tenkanSenBuffer[barIndex + 1]; + + // + double kijunSen = kijunSenBuffer[barIndex]; + double kijunSenPrev = kijunSenBuffer[barIndex + 1]; + + // + double chikouSpan = chikouSpanBuffer[barIndex + mKijunSenLength]; + double chikouSpanPrev = chikouSpanBuffer[barIndex + mKijunSenLength + 1]; + + // + double senkouSpanA = senkouSpanABuffer[barIndex + mKijunSenLength]; + double senkouSpanAPrev = senkouSpanABuffer[barIndex + mKijunSenLength + 1]; + + // + double senkouSpanB = senkouSpanBBuffer[barIndex + mKijunSenLength]; + double senkouSpanBPrev = senkouSpanBBuffer[barIndex + mKijunSenLength + 1]; + + // + double senkouSpanAFuture = senkouSpanABuffer[barIndex]; + double senkouSpanAFuturePrev = senkouSpanABuffer[barIndex + 1]; + + // + double senkouSpanBFuture = senkouSpanBBuffer[barIndex]; + double senkouSpanBFuturePrev = senkouSpanBBuffer[barIndex + 1]; + + // + bool isTenkanSenOverKijunSen = + tenkanSen > kijunSen; + bool isTenkanSenUnderKijunSen = + tenkanSen < kijunSen; + bool isTenkanSenCrossedOverKijunSen = + tenkanSen > kijunSen && + tenkanSenPrev <= kijunSenPrev; + bool isTenkanSenCrossedUnderKijunSen = + tenkanSen < kijunSen && + tenkanSenPrev >= kijunSenPrev; + + // + bool isKumoBullish = + senkouSpanA > senkouSpanB; + bool isKumoBearish = + senkouSpanA < senkouSpanB; + bool isFutureKumoBullish = + senkouSpanAFuture > senkouSpanBFuture; + bool isFutureKumoBearish = + senkouSpanAFuture < senkouSpanBFuture; + bool isKumoSwitchedToBullish = + senkouSpanA > senkouSpanB && + senkouSpanAPrev <= senkouSpanBPrev; + bool isKumoSwitchedToBearish = + senkouSpanA < senkouSpanB && + senkouSpanAPrev >= senkouSpanBPrev; + bool isFutureKumoSwitchedToBullish = + senkouSpanAFuture > senkouSpanBFuture && + senkouSpanAFuturePrev <= senkouSpanBFuturePrev; + bool isFutureKumoSwitchedToBearish = + senkouSpanAFuture < senkouSpanBFuture && + senkouSpanAFuturePrev >= senkouSpanBFuturePrev; + + // + bool isTenkanSenOverSenkouSpanA = + tenkanSen > senkouSpanA; + bool isTenkanSenUnderSenkouSpanA = + tenkanSen < senkouSpanA; + bool isTenkanSenOverFutureSenkouSpanA = + tenkanSen > senkouSpanAFuture; + bool isTenkanSenUnderFutureSenkouSpanA = + tenkanSen < senkouSpanAFuture; + bool isTenkanSenCrossedOverSenkouSpanA = + tenkanSen > senkouSpanA && + tenkanSenPrev <= senkouSpanAPrev; + bool isTenkanSenCrossedUnderSenkouSpanA = + tenkanSen < senkouSpanA && + tenkanSenPrev >= senkouSpanAPrev; + bool isTenkanSenCrossedOverFutureSenkouSpanA = + tenkanSen > senkouSpanAFuture && + tenkanSenPrev <= senkouSpanAFuturePrev; + bool isTenkanSenCrossedUnderFutureSenkouSpanA = + tenkanSen < senkouSpanAFuture && + tenkanSenPrev >= senkouSpanAFuturePrev; + + // + bool isTenkanSenOverSenkouSpanB = + tenkanSen > senkouSpanB; + bool isTenkanSenUnderSenkouSpanB = + tenkanSen < senkouSpanB; + bool isTenkanSenOverFutureSenkouSpanB = + tenkanSen > senkouSpanBFuture; + bool isTenkanSenUnderFutureSenkouSpanB = + tenkanSen < senkouSpanBFuture; + bool isTenkanSenCrossedOverSenkouSpanB = + tenkanSen > senkouSpanB && + tenkanSenPrev <= senkouSpanBPrev; + bool isTenkanSenCrossedUnderSenkouSpanB = + tenkanSen < senkouSpanB && + tenkanSenPrev >= senkouSpanBPrev; + bool isTenkanSenCrossedOverFutureSenkouSpanB = + tenkanSen > senkouSpanBFuture && + tenkanSenPrev <= senkouSpanBFuturePrev; + bool isTenkanSenCrossedUnderFutureSenkouSpanB = + tenkanSen < senkouSpanBFuture && + tenkanSenPrev >= senkouSpanBFuturePrev; + + // + bool isKijunSenOverSenkouSpanA = + kijunSen > senkouSpanA; + bool isKijunSenUnderSenkouSpanA = + kijunSen < senkouSpanA; + bool isKijunSenOverFutureSenkouSpanA = + kijunSen > senkouSpanAFuture; + bool isKijunSenUnderFutureSenkouSpanA = + kijunSen < senkouSpanAFuture; + bool isKijunSenCrossedOverSenkouSpanA = + kijunSen > senkouSpanA && + kijunSenPrev <= senkouSpanAPrev; + bool isKijunSenCrossedUnderSenkouSpanA = + kijunSen < senkouSpanA && + kijunSenPrev >= senkouSpanAPrev; + bool isKijunSenCrossedOverFutureSenkouSpanA = + kijunSen > senkouSpanAFuture && + kijunSenPrev <= senkouSpanAFuturePrev; + bool isKijunSenCrossedUnderFutureSenkouSpanA = + kijunSen < senkouSpanAFuture && + kijunSenPrev >= senkouSpanAFuturePrev; + + // + bool isKijunSenOverSenkouSpanB = + kijunSen > senkouSpanB; + bool isKijunSenUnderSenkouSpanB = + kijunSen < senkouSpanB; + bool isKijunSenOverFutureSenkouSpanB = + kijunSen > senkouSpanBFuture; + bool isKijunSenUnderFutureSenkouSpanB = + kijunSen < senkouSpanBFuture; + bool isKijunSenCrossedOverSenkouSpanB = + kijunSen > senkouSpanB && + kijunSenPrev <= senkouSpanB; + bool isKijunSenCrossedUnderSenkouSpanB = + kijunSen < senkouSpanB && + kijunSenPrev >= senkouSpanB; + bool isKijunSenCrossedOverFutureSenkouSpanB = + kijunSen > senkouSpanBFuture && + kijunSenPrev <= senkouSpanBFuturePrev; + bool isKijunSenCrossedUnderFutureSenkouSpanB = + kijunSen < senkouSpanBFuture && + kijunSenPrev >= senkouSpanBFuturePrev; + + // + result.tenkanSen = tenkanSen; + result.kijunSen = kijunSen; + result.chikouSpan = chikouSpan; + result.senkouSpanA = senkouSpanA; + result.senkouSpanB = senkouSpanB; + result.senkouSpanAFuture = senkouSpanAFuture; + result.senkouSpanBFuture = senkouSpanBFuture; + + // + result.isTenkanSenOverKijunSen = isTenkanSenOverKijunSen; + result.isTenkanSenUnderKijunSen = isTenkanSenUnderKijunSen; + result.isTenkanSenCrossedOverKijunSen = isTenkanSenCrossedOverKijunSen; + result.isTenkanSenCrossedUnderKijunSen = isTenkanSenCrossedUnderKijunSen; + + // + result.isKumoBullish = isKumoBullish; + result.isKumoBearish = isKumoBearish; + result.isFutureKumoBullish = isFutureKumoBullish; + result.isFutureKumoBearish = isFutureKumoBearish; + result.isKumoSwitchedToBullish = isKumoSwitchedToBullish; + result.isKumoSwitchedToBearish = isKumoSwitchedToBearish; + result.isFutureKumoSwitchedToBullish = isFutureKumoSwitchedToBullish; + result.isFutureKumoSwitchedToBearish = isFutureKumoSwitchedToBearish; + + // + result.isTenkanSenOverSenkouSpanA = isTenkanSenOverSenkouSpanA; + result.isTenkanSenUnderSenkouSpanA = isTenkanSenUnderSenkouSpanA; + result.isTenkanSenOverFutureSenkouSpanA = isTenkanSenOverFutureSenkouSpanA; + result.isTenkanSenUnderFutureSenkouSpanA = isTenkanSenUnderFutureSenkouSpanA; + result.isTenkanSenCrossedOverSenkouSpanA = isTenkanSenCrossedOverSenkouSpanA; + result.isTenkanSenCrossedUnderSenkouSpanA = isTenkanSenCrossedUnderSenkouSpanA; + result.isTenkanSenCrossedOverFutureSenkouSpanA = isTenkanSenCrossedOverFutureSenkouSpanA; + result.isTenkanSenCrossedUnderFutureSenkouSpanA = isTenkanSenCrossedUnderFutureSenkouSpanA; + + // + result.isTenkanSenOverSenkouSpanB = isTenkanSenOverSenkouSpanB; + result.isTenkanSenUnderSenkouSpanB = isTenkanSenUnderSenkouSpanB; + result.isTenkanSenOverFutureSenkouSpanB = isTenkanSenOverFutureSenkouSpanB; + result.isTenkanSenUnderFutureSenkouSpanB = isTenkanSenUnderFutureSenkouSpanB; + result.isTenkanSenCrossedOverSenkouSpanB = isTenkanSenCrossedOverSenkouSpanB; + result.isTenkanSenCrossedUnderSenkouSpanB = isTenkanSenCrossedUnderSenkouSpanB; + result.isTenkanSenCrossedOverFutureSenkouSpanB = isTenkanSenCrossedOverFutureSenkouSpanB; + result.isTenkanSenCrossedUnderFutureSenkouSpanB = isTenkanSenCrossedUnderFutureSenkouSpanB; + + // + result.isKijunSenOverSenkouSpanA = isKijunSenOverSenkouSpanA; + result.isKijunSenUnderSenkouSpanA = isKijunSenUnderSenkouSpanA; + result.isKijunSenOverFutureSenkouSpanA = isKijunSenOverFutureSenkouSpanA; + result.isKijunSenUnderFutureSenkouSpanA = isKijunSenUnderFutureSenkouSpanA; + result.isKijunSenCrossedOverSenkouSpanA = isKijunSenCrossedOverSenkouSpanA; + result.isKijunSenCrossedUnderSenkouSpanA = isKijunSenCrossedUnderSenkouSpanA; + result.isKijunSenCrossedOverFutureSenkouSpanA = isKijunSenCrossedOverFutureSenkouSpanA; + result.isKijunSenCrossedUnderFutureSenkouSpanA = isKijunSenCrossedUnderFutureSenkouSpanA; + + // + result.isKijunSenOverSenkouSpanB = isKijunSenOverSenkouSpanB; + result.isKijunSenUnderSenkouSpanB = isKijunSenUnderSenkouSpanB; + result.isKijunSenOverFutureSenkouSpanB = isKijunSenOverFutureSenkouSpanB; + result.isKijunSenUnderFutureSenkouSpanB = isKijunSenUnderFutureSenkouSpanB; + result.isKijunSenCrossedOverSenkouSpanB = isKijunSenCrossedOverSenkouSpanB; + result.isKijunSenCrossedUnderSenkouSpanB = isKijunSenCrossedUnderSenkouSpanB; + result.isKijunSenCrossedOverFutureSenkouSpanB = isKijunSenCrossedOverFutureSenkouSpanB; + result.isKijunSenCrossedUnderFutureSenkouSpanB = isKijunSenCrossedUnderFutureSenkouSpanB; + + // + return result; + } + + // + // END Provided Functions ... + // + + // + // Protected ... +protected: + // + // Private ... +private: + // + // Indicator Properties ... + // + // TENKANSEN ... + // + // Length ... + int mTenkanSenLength; + // + // Calculation Mode ... + ENUM_X_ICHIMOKU_CALCULATION_MODE mTenkanSenMode; + // + // KIJUNSEN ... + // + // Length ... + int mKijunSenLength; + // + // Calculation Mode ... + ENUM_X_ICHIMOKU_CALCULATION_MODE mKijunSenMode; + // + // SENKOUSPANB ... + // + // Length ... + int mSenkouSpanBLength; + // + // Calculation Mode ... + ENUM_X_ICHIMOKU_CALCULATION_MODE mSenkouSpanBMode; + // + // CHIKOUSPAN ... + // + // Price Type ... + ENUM_APPLIED_PRICE mChikuoSpanAppliedTo; + // + // Presentation ... + // + // Show Tenkan Sen ... + bool mShowTenkanSen; + // + // Show Kijun Sen ... + bool mShowKijunSen; + // + // Show Kijun Sen + ... + bool mShowKijunSenPlus; + // + // Show Kijun Sen - ... + bool mShowKijunSenNegative; + // + // Show Chikou Span ... + bool mShowChikouSpan; + // + // Show Senkou Span A ... + bool mShowSenkouSpanA; + // + // Show Senkou Span B ... + bool mShowSenkouSpanB; + // + // Show Kumo ... + bool mShowKumo; + // + // Shift Kumo to Future ... + bool mShiftKumo; +}; + +// +// START Usefull Functions ... +// + +// +// END Usefull Functions ... +// diff --git a/MQLTestWorkspace/X121/Old/Helpers/x-saherelm.x121.xman.helper.class.ex5 b/MQLTestWorkspace/X121/Old/Helpers/x-saherelm.x121.xman.helper.class.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..ff91aef3a865ee9e1e3887f33b62b86a43acf203 GIT binary patch literal 7366 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 Z54(6I(O%r=A555z?m}fI@%9T-{{@4p66gQ` literal 0 HcmV?d00001 diff --git a/MQLTestWorkspace/X121/Old/Helpers/x-saherelm.x121.xman.helper.class.mq5 b/MQLTestWorkspace/X121/Old/Helpers/x-saherelm.x121.xman.helper.class.mq5 new file mode 100644 index 0000000..d20082c --- /dev/null +++ b/MQLTestWorkspace/X121/Old/Helpers/x-saherelm.x121.xman.helper.class.mq5 @@ -0,0 +1,3062 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 Helper Class Library +// ---------------------------------------------- +// Name: XSCXMANHelper +// Description: provides all Indicator +// Helper requirements ... +// +// +// 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 + +// +// START Definitions ... +// + +// +// All Extractable Buffers ... +enum ENUM_XMAN_BUFFERS +{ + // + // Peaks and Vales ... + XMAN_PEAKS_LINE = 0, // Peaks + XMAN_PEAKS_STATE_LINE = 65, // New Peak + XMAN_VALES_LINE = 1, // Vales + XMAN_VALES_STATE_LINE = 66, // New Vales + // + // Fibonacci Retracement ... + XMAN_FIB_L1_LINE = 6, // Fibo Level 1 + XMAN_FIB_L2_LINE = 8, // Fibo Level 2 + XMAN_FIB_L3_LINE = 10, // Fibo Level 3 + // + // Period Cycles ... + // + // Short Cycle ... + XMAN_SC_HH_LINE = 12, // High + XMAN_SC_HH_STATE_LINE = 67, // High State + XMAN_SC_LL_LINE = 14, // Low + XMAN_SC_LL_STATE_LINE = 68, // Low State + // + // Medium ... + XMAN_MC_HH_LINE = 16, // High + XMAN_MC_HH_STATE_LINE = 69, // High State + XMAN_MC_LL_LINE = 18, // Low + XMAN_MC_LL_STATE_LINE = 70, // Low State + // + // Long ... + XMAN_LC_HH_LINE = 20, // High + XMAN_LC_HH_STATE_LINE = 71, // High State + XMAN_LC_LL_LINE = 22, // Low + XMAN_LC_LL_STATE_LINE = 72, // Low State + // + // Hind ... + XMAN_HC_HH_LINE = 24, // High + XMAN_HC_HH_STATE_LINE = 73, // High State + XMAN_HC_LL_LINE = 26, // Low + XMAN_HC_LL_STATE_LINE = 74, // Low State + // + // XSTR ... + XMAN_TREND_LINE = 30, // Trend Value + XMAN_TREND_STATE_LINE = 75, // Trend Direction + // + // XMRB ... + // + // RIBBON 1 _ HIGH ... + XMAN_RB1_LINE = 32, // Value + XMAN_RB1_STATE_LINE = 76, // State + // + // RIBBON 2 _ OPEN ... + XMAN_RB2_LINE = 34, // Value + XMAN_RB2_STATE_LINE = 77, // State + // + // RIBBON 3 _ CLOSE ... + XMAN_RB3_LINE = 36, // Value + XMAN_RB3_STATE_LINE = 78, // State + // + // RIBBON 4 _ MEDIAN ... + XMAN_RB4_LINE = 38, // Value + XMAN_RB4_STATE_LINE = 79, // State + // + // RIBBON 5 _ TYPICAL ... + XMAN_RB5_LINE = 40, // Value + XMAN_RB5_STATE_LINE = 80, // State + // + // RIBBON 6 _ LOW ... + XMAN_RB6_LINE = 42, // Value + XMAN_RB6_STATE_LINE = 81, // State + // + // XSSLC ... + XMAN_SSLC_UP_LINE = 44, // Up + XMAN_SSLC_DOWN_LINE = 82, // Down + // + // XHULL ... + XMAN_HULL_UP_LINE = 48, // Up + XMAN_HULL_UP_STATE_LINE = 82, // Up State + XMAN_HULL_DOWN_LINE = 50, // Down + XMAN_HULL_DOWN_STATE_LINE = 83, // Down State + // + // XHK ... + XMAN_HK_OPEN_LINE = 52, // Open + XMAN_HK_HIGH_LINE = 53, // High + XMAN_HK_LOW_LINE = 54, // Low + XMAN_HK_CLOSE_LINE = 55, // Close + XMAN_HK_STATE_LINE = 84, // State +}; + +// +// Define States On XMAN ... +enum ENUM_XMAN_STATES +{ + XMAN_STATE_BULLISH = 2, + XMAN_STATE_STRONG_BULLISH = 8, + XMAN_STATE_BEARISH = 3, + XMAN_STATE_STRONG_BEARISH = 9, + XMAN_STATE_NEUTURAL = 1, + XMAN_STATE_STRONG_NEUTURAL = 7, +}; + +// +// XPERIOD Calculation Method ... +// USED For Multiple Time Frames ... +enum ENUM_X_PERIOD_METHOD +{ + // + X_PERIOD_NOTHING, // Nothing + X_PERIOD_AUTO, // Auto Select + X_PERIOD_MANUALLY // Manually +}; + +// +enum ENUM_X_MA_METHOD +{ + X_MA_NOTHING, // Nothing + X_MA_SMA, // Simple + X_MA_EMA, // Expotential + X_MA_SMMA, // Smoothed Simple + X_MA_LWMA, // Linear Weighted + X_MA_AMA // Adaptive +}; + +// +// Model all required info as a Model for Instancing Helper Class ... +struct XMANInputs +{ + // + // Candle Timer ... + color candleTimerColor; // Text Color + ENUM_BASE_CORNER candleTimerCorner; // Text Position + + // + // Chart Style ... + color upColor; // Up Color + color downColor; // Down Color + color lineColor; // Line mode and Doji candlestick Color + color bearishColor; // Bullish Color + color bullishColor; // Bearish Color + color volumesColor; // Volumes Color + + // + // Market Cycles ... + + // + // Level 1 ... + ENUM_X_PERIOD_METHOD l1Method; // How to Find Period + ENUM_TIMEFRAMES l1Period; // Time Period + + // + // Level 2 ... + ENUM_X_PERIOD_METHOD l2Method; // How to Find Period + ENUM_TIMEFRAMES l2Period; // Time Period + + // + // Level 3 ... + ENUM_X_PERIOD_METHOD l3Method; // How to Find Period + ENUM_TIMEFRAMES l3Period; // Time Period + + // + // Level 4 ... + ENUM_X_PERIOD_METHOD l4Method; // How to Find Period + ENUM_TIMEFRAMES l4Period; // Time Period + + // + // Fibonacci ... + double fiboLevel1; // Fibio 1st Level + double fiboLevel2; // Fibio 2st Level + double fiboLevel3; // Fibio 3rd Level + + // + // Boundary Detection Modes ... + ENUM_SERIESMODE hhMode; // Highest High Calculation Method + ENUM_SERIESMODE llMode; // Lowest Low Calculation Method + + // + // Trend Detection + double trendMultiplier; // Multiplier + ENUM_APPLIED_PRICE trendPriceAppliedTo; // Applied To + + // + // Ribbon Detection ... + ENUM_X_MA_METHOD ribbonMode; // How to Calculate + + // + // Hull Trend Detection ... + double hullDivisor; // Divisor (Speed) + ENUM_APPLIED_PRICE hullUpAppliedTo; // Up Zone Applied to + ENUM_APPLIED_PRICE hullDownAppliedTo; // Down Zone Applied to + + // + // SSL Channel Detection ... + ENUM_X_MA_METHOD sslcMode; // How to Calculate + ENUM_APPLIED_PRICE sslcUpAppliedTo; // Up Applied To + ENUM_APPLIED_PRICE sslcDownAppliedTo; // Down Applied To + + // + // Presentation ... + bool showCandleTimer; // Show Candle Time + bool showCandles; // Show Candles + bool showHKCandles; // Draw Hiken Ashi Candle + bool showPeaksAndVales; // Show Peaks and Vales + bool showTrends; // Show Trends + bool fillTrends; // Fill Trends + bool showLevels; // Show Levels + bool showConsolidations; // Show Consolidations + bool showRibbons; // Show Ribbons + bool showHull; // Show Hull + bool showSSLChannel; // Show SSL Channel + bool showFibo1Levels; // Show Fibo 1st Level + bool showFibo2Levels; // Show Fibo 2nd Level + bool showFibo3Levels; // Show Fibo 3rd Level +}; + +// +// Model all Extractable Info as a Model for Market Analyzing ... +struct XMANInfo +{ + // + // COMMONS ... + + // + // Symbol ... + string symbol; + + // + // Period ... + ENUM_TIMEFRAMES period; + + // + // Bar Time ... + datetime barTime; + + // + // Bar Index ... + int barIndex; + + // + // SPECIALS ... + + // + // Buffers ... + + // + // Peaks and Vales ... + double peaks[]; + double peaksStates[]; + double vales[]; + double valesStates[]; + + // + // Fibonacci ... + double fibLevel1s[]; + double fibLevel2s[]; + double fibLevel3s[]; + + // + // Cycles ... + + // + // Short ... + double sHHs[]; + double sHHStates[]; + double sLLs[]; + double sLLStates[]; + + // + // Medium ... + double mHHs[]; + double mHHStates[]; + double mLLs[]; + double mLLStates[]; + + // + // Long ... + double lHHs[]; + double lHHStates[]; + double lLLs[]; + double lLLStates[]; + + // + // Hind ... + double hHHs[]; + double hHHStates[]; + double hLLs[]; + double hLLStates[]; + + // + // Trends ... + double trends[]; + double trendStates[]; + + // + // Ribbons ... + + // + // 1 _ High ... + double ribbon1s[]; + double ribbon1States[]; + + // + // 2 _ Open ... + double ribbon2s[]; + double ribbon2States[]; + + // + // 3 _ Close ... + double ribbon3s[]; + double ribbon3States[]; + + // + // 4 _ Median ... + double ribbon4s[]; + double ribbon4States[]; + + // + // 5 _ Typical ... + double ribbon5s[]; + double ribbon5States[]; + + // + // 6 _ Low ... + double ribbon6s[]; + double ribbon6States[]; + + // + // SSL Channel ... + double sslUps[]; + double sslDowns[]; + + // + // Hull Trend ... + double hullUps[]; + double hullUpStates[]; + double hullDowns[]; + double hullDownStates[]; + + // + // Hiken Ashi ... + double hkOpens[]; + double hkHighs[]; + double hkLows[]; + double hkCloses[]; + double hkStates[]; + + // + // Conditions ... + + // + // Peaks and Vales ... + bool isNewPeak; + bool isNewVale; + + // + // Trend ... + bool isTrendBullish; + bool isTrendSwitchedToBullish; + bool isTrendBearish; + bool isTrendSwitchedToBearish; + bool isTrendNeutural; + bool isTrendSwitchedToNeutural; + + // + // SSL Channel ... + bool isSSLBullish; + bool isSSLSwitchedToBullish; + bool isSSLBearish; + bool isSSLSwitchedBearish; + bool isSSLNeutural; + bool isSSLSwitchedNeutural; + + // + // Hull Trend ... + + // + bool isHullBullish; + bool isHullUpBullish; + bool isHullDownBullish; + bool isHullSwitchedToBullish; + + // + bool isHullBearish; + bool isHullUpBearish; + bool isHullDownBearish; + bool isHullSwitchedToBearish; + + // + bool isHullNeutural; + bool isHullUpNeutural; + bool isHullDownNeutural; + bool isHullSwitchedToNeutural; + + // + // HK ... + bool isHKBullish; + bool isHKBearish; + + // + // Market Cycles ... + + // + // Short ... + + // + bool isSCBullish; + bool isSCHBullish; + bool isSCLBullish; + bool isSCSwitchedToBullish; + bool isSCHSwitchedToBullish; + bool isSCLSwitchedToBullish; + + // + bool isSCBearish; + bool isSCHBearish; + bool isSCLBearish; + bool isSCSwitchedToBearish; + bool isSCHSwitchedToBearish; + bool isSCLSwitchedToBearish; + + // + bool isSCNeutural; + bool isSCHNeutural; + bool isSCLNeutural; + bool isSCSwitchedToNeutural; + bool isSCHSwitchedToNeutural; + bool isSCLSwitchedToNeutural; + + // + // Medium ... + + // + bool isMCBullish; + bool isMCHBullish; + bool isMCLBullish; + bool isMCSwitchedToBullish; + bool isMCHSwitchedToBullish; + bool isMCLSwitchedToBullish; + + // + bool isMCBearish; + bool isMCHBearish; + bool isMCLBearish; + bool isMCSwitchedToBearish; + bool isMCHSwitchedToBearish; + bool isMCLSwitchedToBearish; + + // + bool isMCNeutural; + bool isMCHNeutural; + bool isMCLNeutural; + bool isMCSwitchedToNeutural; + bool isMCHSwitchedToNeutural; + bool isMCLSwitchedToNeutural; + + // + // Long ... + + // + bool isLCBullish; + bool isLCHBullish; + bool isLCLBullish; + bool isLCSwitchedToBullish; + bool isLCHSwitchedToBullish; + bool isLCLSwitchedToBullish; + + // + bool isLCBearish; + bool isLCHBearish; + bool isLCLBearish; + bool isLCSwitchedToBearish; + bool isLCHSwitchedToBearish; + bool isLCLSwitchedToBearish; + + // + bool isLCNeutural; + bool isLCHNeutural; + bool isLCLNeutural; + bool isLCSwitchedToNeutural; + bool isLCHSwitchedToNeutural; + bool isLCLSwitchedToNeutural; + + // + // Hind ... + + // + bool isHCBullish; + bool isHCHBullish; + bool isHCLBullish; + bool isHCSwitchedToBullish; + bool isHCHSwitchedToBullish; + bool isHCLSwitchedToBullish; + + // + bool isHCBearish; + bool isHCHBearish; + bool isHCLBearish; + bool isHCSwitchedToBearish; + bool isHCHSwitchedToBearish; + bool isHCLSwitchedToBearish; + + // + bool isHCNeutural; + bool isHCHNeutural; + bool isHCLNeutural; + bool isHCSwitchedToNeutural; + bool isHCHSwitchedToNeutural; + bool isHCLSwitchedToNeutural; + + // + // Ribbons ... + + // + // R1 ... + + // + bool isRibbon1Bullish; + bool isRibbon2Bullish; + bool isRibbon3Bullish; + bool isRibbon4Bullish; + bool isRibbon5Bullish; + bool isRibbon6Bullish; + + // + bool isRibbon1Bearish; + bool isRibbon2Bearish; + bool isRibbon3Bearish; + bool isRibbon4Bearish; + bool isRibbon5Bearish; + bool isRibbon6Bearish; + + // + bool isRibbon1Neutural; + bool isRibbon2Neutural; + bool isRibbon3Neutural; + bool isRibbon4Neutural; + bool isRibbon5Neutural; + bool isRibbon6Neutural; + + // + bool isRibbonBullish; + bool isRibbonSwitchedToBullish; + + // + bool isRibbonBearish; + bool isRibbonSwitchedToBearish; + + // + bool isRibbonNeutural; + bool isRibbonSwitchedToNeutural; +}; + +// +// END Definitions ... +// + +// +// START Import and Inclused requirements ... +// + +// +// Includes ... +#include "../Libraries/x-saherelm.common.lib.mq5" +#include "../Classes/x-saherelm.xhelper.class.mq5" + +// +// END Import and Inclused requirements ... +// + +// +// START Overrides ... +// + +// +// END Overrides ... +// + +// +class XSCXMANHelper : public XSCBaseHelper +{ + // + // Public ... +public: + // + // Props ... + + // + // Peaks and Vales ... + double peaksBuffer[]; + double peaksStateBuffer[]; + double valesBuffer[]; + double valesStateBuffer[]; + + // + // Fibonacci ... + double fibLevel1Buffer[]; + double fibLevel2Buffer[]; + double fibLevel3Buffer[]; + + // + // Cycles ... + + // + // Short ... + double sHHBuffer[]; + double sHHStateBuffer[]; + double sLLBuffer[]; + double sLLStateBuffer[]; + + // + // Medium ... + double mHHBuffer[]; + double mHHStateBuffer[]; + double mLLBuffer[]; + double mLLStateBuffer[]; + + // + // Long ... + double lHHBuffer[]; + double lHHStateBuffer[]; + double lLLBuffer[]; + double lLLStateBuffer[]; + + // + // Hind ... + double hHHBuffer[]; + double hHHStateBuffer[]; + double hLLBuffer[]; + double hLLStateBuffer[]; + + // + // Trends ... + double trendBuffer[]; + double trendStateBuffer[]; + + // + // Ribbons ... + + // + // 1 _ High ... + double ribbon1Buffer[]; + double ribbon1StateBuffer[]; + + // + // 2 _ Open ... + double ribbon2Buffer[]; + double ribbon2StateBuffer[]; + + // + // 3 _ Close ... + double ribbon3Buffer[]; + double ribbon3StateBuffer[]; + + // + // 4 _ Median ... + double ribbon4Buffer[]; + double ribbon4StateBuffer[]; + + // + // 5 _ Typical ... + double ribbon5Buffer[]; + double ribbon5StateBuffer[]; + + // + // 6 _ Low ... + double ribbon6Buffer[]; + double ribbon6StateBuffer[]; + + // + // SSL Channel ... + double sslUpBuffer[]; + double sslDownBuffer[]; + + // + // Hull Trend ... + double hullUpBuffer[]; + double hullUpStateBuffer[]; + double hullDownBuffer[]; + double hullDownStateBuffer[]; + + // + // Hiken Ashi ... + double hkOpenBuffer[]; + double hkHighBuffer[]; + double hkLowBuffer[]; + double hkCloseBuffer[]; + double hkStateBuffer[]; + + // + // Constructor ... + void XSCXMANHelper( + string symbol, // Trading Symbol + ENUM_TIMEFRAMES period // Trading Time Frame + ) : XSCBaseHelper(symbol, period) + { + PrepareTag(); + } + + // + // Deconstructor ... + void ~XSCXMANHelper() + { + } + + // + // START Properties ... + // + + // + // END Properties ... + // + + // + // START Provided Functions ... + // + + // + // Prepare Tag ... + virtual void PrepareTag() + { + mTag = "XMAN" + GetTagPrefix(); + } + + // + virtual int GetMaxLength() + { + // + int result = 1; + + // + result = 1; + + // + return result; + } + + // + // Initial Indicator Handler ... + bool Init() + { + // + bool result = false; + + // + // Validate Args ... + result = + // + // L1 ... + // Short Cycle ... + ( + // + mL1Method == X_PERIOD_AUTO + ? mL1Period == NULL + : mL1Period != NULL && mL1Method != X_PERIOD_NOTHING + // + ) + // + && + // + // L2 ... + // Medium Cycle ... + ( + // + mL2Method == X_PERIOD_AUTO + ? mL2Period == NULL + : mL2Period != NULL && mL2Method != X_PERIOD_NOTHING + // + ) + // + && + // + // L3 ... + // Long Cycle ... + ( + // + mL3Method == X_PERIOD_AUTO + ? mL3Period == NULL + : mL3Period != NULL && mL3Method != X_PERIOD_NOTHING + // + ) + // + && + // + // L4 ... + // Hind Cycle ... + ( + // + mL4Method == X_PERIOD_AUTO + ? mL4Period == NULL + : mL4Period != NULL && mL4Method != X_PERIOD_NOTHING + // + ) + // + && + // + // Validate Ribbon ... + ( + // + mRibbonMode != X_MA_NOTHING + // + ) + // + ; + if (!result) + { + return false; + } + + // + // Initialize Handler ... + mHandler = iCustom( + // + mSymbol, + mPeriod, + "x-saherelm.x121.xman", + // + // Inputs ... + // + // Candle Timer ... + "", + // + mCandleTimerColor, // Text Color + mCandleTimerCorner, // Text Position + // + // Chart Style ... + "", + // + mUpColor, // Up Color + mDownColor, // Down Color + mLineColor, // Line mode and Doji candlestick Color + mBearishColor, // Bullish Color + mBullishColor, // Bearish Color + mVolumesColor, // Volumes Color + // + // Market Cycles ... + "", + // + // Level 1 ... + "", + // + mL1Method, // How to Find Period + mL1Period, // Time Period + // + // Level 2 ... + "", + // + mL2Method, // How to Find Period + mL2Period, // Time Period + // + // Level 3 ... + "", + // + mL3Method, // How to Find Period + mL3Period, // Time Period + // + // Level 4 ... + "", + // + mL4Method, // How to Find Period + mL4Period, // Time Period + // + // Fibonacci ... + "", + // + mFiboLevel1, // Fibio 1st Level + mFiboLevel2, // Fibio 2st Level + mFiboLevel3, // Fibio 3rd Level + // + // Boundary Detection Modes ... + "", + // + mHHMode, // Highest High Calculation Method + mLLMode, // Lowest Low Calculation Method + // + // Trend Detection + "", + // + mTrendMultiplier, // Multiplier + mTrendPriceAppliedTo, // Applied To + // + // Ribbon Detection ... + "", + // + mRibbonMode, // How to Calculate + // + // Hull Trend Detection ... + "", + // + mHullDivisor, // Divisor (Speed) + mHullUpAppliedTo, // Up Zone Applied to + mHullDownAppliedTo, // Down Zone Applied to + // + // SSL Channel Detection ... + "", + // + mSslcMode, // How to Calculate + mSslcUpAppliedTo, // Up Applied To + mSslcDownAppliedTo, // Down Applied To + // + // Presentation ... + "", + // + mShowCandleTimer, // Show Candle Timer + mShowCandles, // Show Candles + mShowHKCandles, // Draw Hiken Ashi Candle + mShowPeaksAndVales, // Show Peaks and Vales + mShowTrends, // Show Trends + mSillTrends, // Fill Trends + mShowLevels, // Show Levels + mShowConsolidations, // Show Consolidations + mShowRibbons, // Show Ribbons + mShowHull, // Show Hull + mShowSSLChannel, // Show SSL Channel + mShowFibo1Levels, // Show Fibo 1st Level + mShowFibo2Levels, // Show Fibo 2nd Level + mShowFibo3Levels // Show Fibo 3rd Level + // + ); + result = mHandler != INVALID_HANDLE; + + // + return result; + } + + // + // Retrieve Current Config ... + XMANInputs GetConfig() + { + // + XMANInputs result; + + // + result.candleTimerColor = mCandleTimerColor; + result.candleTimerCorner = mCandleTimerCorner; + result.upColor = mUpColor; + result.downColor = mDownColor; + result.lineColor = mLineColor; + result.bearishColor = mBearishColor; + result.bullishColor = mBullishColor; + result.volumesColor = mVolumesColor; + result.l1Method = mL1Method; + result.l1Period = mL1Period; + result.l2Method = mL2Method; + result.l2Period = mL2Period; + result.l3Method = mL3Method; + result.l3Period = mL3Period; + result.l4Method = mL4Method; + result.l4Period = mL4Period; + result.fiboLevel1 = mFiboLevel1; + result.fiboLevel2 = mFiboLevel2; + result.fiboLevel3 = mFiboLevel3; + result.hhMode = mHHMode; + result.llMode = mLLMode; + result.trendMultiplier = mTrendMultiplier; + result.trendPriceAppliedTo = mTrendPriceAppliedTo; + result.ribbonMode = mRibbonMode; + result.hullDivisor = mHullDivisor; + result.hullUpAppliedTo = mHullUpAppliedTo; + result.hullDownAppliedTo = mHullDownAppliedTo; + result.sslcMode = mSslcMode; + result.sslcUpAppliedTo = mSslcUpAppliedTo; + result.sslcDownAppliedTo = mSslcDownAppliedTo; + result.showCandleTimer = mShowCandleTimer; + result.showCandles = mShowCandles; + result.showHKCandles = mShowHKCandles; + result.showPeaksAndVales = mShowPeaksAndVales; + result.showTrends = mShowTrends; + result.fillTrends = mSillTrends; + result.showLevels = mShowLevels; + result.showConsolidations = mShowConsolidations; + result.showRibbons = mShowRibbons; + result.showHull = mShowHull; + result.showSSLChannel = mShowSSLChannel; + result.showFibo1Levels = mShowFibo1Levels; + result.showFibo2Levels = mShowFibo2Levels; + result.showFibo3Levels = mShowFibo3Levels; + + // + return result; + } + + // + // Set Config ... + bool SetConfig(XMANInputs &config) + { + // + bool result = false; + + // + mCandleTimerColor = config.candleTimerColor; + mCandleTimerCorner = config.candleTimerCorner; + mUpColor = config.upColor; + mDownColor = config.downColor; + mLineColor = config.lineColor; + mBearishColor = config.bearishColor; + mBullishColor = config.bullishColor; + mVolumesColor = config.volumesColor; + mL1Method = config.l1Method; + mL1Period = config.l1Period; + mL2Method = config.l2Method; + mL2Period = config.l2Period; + mL3Method = config.l3Method; + mL3Period = config.l3Period; + mL4Method = config.l4Method; + mL4Period = config.l4Period; + mFiboLevel1 = config.fiboLevel1; + mFiboLevel2 = config.fiboLevel2; + mFiboLevel3 = config.fiboLevel3; + mHHMode = config.hhMode; + mLLMode = config.llMode; + mTrendMultiplier = config.trendMultiplier; + mTrendPriceAppliedTo = config.trendPriceAppliedTo; + mRibbonMode = config.ribbonMode; + mHullDivisor = config.hullDivisor; + mHullUpAppliedTo = config.hullUpAppliedTo; + mHullDownAppliedTo = config.hullDownAppliedTo; + mSslcMode = config.sslcMode; + mSslcUpAppliedTo = config.sslcUpAppliedTo; + mSslcDownAppliedTo = config.sslcDownAppliedTo; + mShowCandleTimer = config.showCandleTimer; + mShowCandles = config.showCandles; + mShowHKCandles = config.showHKCandles; + mShowPeaksAndVales = config.showPeaksAndVales; + mShowTrends = config.showTrends; + mSillTrends = config.fillTrends; + mShowLevels = config.showLevels; + mShowConsolidations = config.showConsolidations; + mShowRibbons = config.showRibbons; + mShowHull = config.showHull; + mShowSSLChannel = config.showSSLChannel; + mShowFibo1Levels = config.showFibo1Levels; + mShowFibo2Levels = config.showFibo2Levels; + mShowFibo3Levels = config.showFibo3Levels; + + // + result = Init(); + + // + return result; + } + + // + // Reading Buffers based on Given Bar Index ... + virtual void Calculate( + int barIndex // Given Bar Index + ) + { + // + // Peaks ... + ArraySetAsSeries(peaksBuffer, true); + CopyBuffer( + mHandler, + XMAN_PEAKS_LINE, + barIndex, + mLoopbackBars, + peaksBuffer); + + // + // Peaks State ... + ArraySetAsSeries(peaksStateBuffer, true); + CopyBuffer( + mHandler, + XMAN_PEAKS_STATE_LINE, + barIndex, + mLoopbackBars, + peaksStateBuffer); + + // + // Vales ... + ArraySetAsSeries(valesBuffer, true); + CopyBuffer( + mHandler, + XMAN_VALES_LINE, + barIndex, + mLoopbackBars, + valesBuffer); + + // + // Vales State ... + ArraySetAsSeries(valesStateBuffer, true); + CopyBuffer( + mHandler, + XMAN_VALES_STATE_LINE, + barIndex, + mLoopbackBars, + valesStateBuffer); + + // + // Fibo 1 ... + ArraySetAsSeries(fibLevel1Buffer, true); + CopyBuffer( + mHandler, + XMAN_FIB_L1_LINE, + barIndex, + mLoopbackBars, + fibLevel1Buffer); + + // + // Fibo 2 ... + ArraySetAsSeries(fibLevel2Buffer, true); + CopyBuffer( + mHandler, + XMAN_FIB_L2_LINE, + barIndex, + mLoopbackBars, + fibLevel2Buffer); + + // + // Fibo 3 ... + ArraySetAsSeries(fibLevel3Buffer, true); + CopyBuffer( + mHandler, + XMAN_FIB_L3_LINE, + barIndex, + mLoopbackBars, + fibLevel3Buffer); + + // + // Cycles ... + + // + // Short ... + + // + // High ... + ArraySetAsSeries(sHHBuffer, true); + CopyBuffer( + mHandler, + XMAN_SC_HH_LINE, + barIndex, + mLoopbackBars, + sHHBuffer); + + // + // High State ... + ArraySetAsSeries(sHHStateBuffer, true); + CopyBuffer( + mHandler, + XMAN_SC_HH_STATE_LINE, + barIndex, + mLoopbackBars, + sHHStateBuffer); + + // + // High ... + ArraySetAsSeries(sLLBuffer, true); + CopyBuffer( + mHandler, + XMAN_SC_LL_LINE, + barIndex, + mLoopbackBars, + sLLBuffer); + + // + // High State ... + ArraySetAsSeries(sLLStateBuffer, true); + CopyBuffer( + mHandler, + XMAN_SC_LL_STATE_LINE, + barIndex, + mLoopbackBars, + sLLStateBuffer); + + // + // Medium ... + + // + // High ... + ArraySetAsSeries(mHHBuffer, true); + CopyBuffer( + mHandler, + XMAN_MC_HH_LINE, + barIndex, + mLoopbackBars, + mHHBuffer); + + // + // High State ... + ArraySetAsSeries(mHHStateBuffer, true); + CopyBuffer( + mHandler, + XMAN_MC_HH_STATE_LINE, + barIndex, + mLoopbackBars, + mHHStateBuffer); + + // + // High ... + ArraySetAsSeries(mLLBuffer, true); + CopyBuffer( + mHandler, + XMAN_MC_LL_LINE, + barIndex, + mLoopbackBars, + mLLBuffer); + + // + // High State ... + ArraySetAsSeries(mLLStateBuffer, true); + CopyBuffer( + mHandler, + XMAN_MC_LL_STATE_LINE, + barIndex, + mLoopbackBars, + mLLStateBuffer); + + // + // Long ... + + // + // High ... + ArraySetAsSeries(lHHBuffer, true); + CopyBuffer( + mHandler, + XMAN_LC_HH_LINE, + barIndex, + mLoopbackBars, + lHHBuffer); + + // + // High State ... + ArraySetAsSeries(lHHStateBuffer, true); + CopyBuffer( + mHandler, + XMAN_LC_HH_STATE_LINE, + barIndex, + mLoopbackBars, + lHHStateBuffer); + + // + // High ... + ArraySetAsSeries(lLLBuffer, true); + CopyBuffer( + mHandler, + XMAN_LC_LL_LINE, + barIndex, + mLoopbackBars, + lLLBuffer); + + // + // High State ... + ArraySetAsSeries(lLLStateBuffer, true); + CopyBuffer( + mHandler, + XMAN_LC_LL_STATE_LINE, + barIndex, + mLoopbackBars, + lLLStateBuffer); + + // + // Hind ... + + // + // High ... + ArraySetAsSeries(hHHBuffer, true); + CopyBuffer( + mHandler, + XMAN_HC_HH_LINE, + barIndex, + mLoopbackBars, + hHHBuffer); + + // + // High State ... + ArraySetAsSeries(hHHStateBuffer, true); + CopyBuffer( + mHandler, + XMAN_HC_HH_STATE_LINE, + barIndex, + mLoopbackBars, + hHHStateBuffer); + + // + // High ... + ArraySetAsSeries(hLLBuffer, true); + CopyBuffer( + mHandler, + XMAN_HC_LL_LINE, + barIndex, + mLoopbackBars, + hLLBuffer); + + // + // High State ... + ArraySetAsSeries(hLLStateBuffer, true); + CopyBuffer( + mHandler, + XMAN_HC_LL_STATE_LINE, + barIndex, + mLoopbackBars, + hLLStateBuffer); + + // + // Trend ... + + // + // Trend ... + ArraySetAsSeries(trendBuffer, true); + CopyBuffer( + mHandler, + XMAN_TREND_LINE, + barIndex, + mLoopbackBars, + trendBuffer); + + // + // Trend State ... + ArraySetAsSeries(trendStateBuffer, true); + CopyBuffer( + mHandler, + XMAN_TREND_STATE_LINE, + barIndex, + mLoopbackBars, + trendStateBuffer); + + // + // Ribbons ... + + // + // 1 ... + + // + // R1 ... + ArraySetAsSeries(ribbon1Buffer, true); + CopyBuffer( + mHandler, + XMAN_RB1_LINE, + barIndex, + mLoopbackBars, + ribbon1Buffer); + + // + // R1 State ... + ArraySetAsSeries(ribbon1StateBuffer, true); + CopyBuffer( + mHandler, + XMAN_RB1_STATE_LINE, + barIndex, + mLoopbackBars, + ribbon1StateBuffer); + + // + // 2 ... + + // + // R2 ... + ArraySetAsSeries(ribbon2Buffer, true); + CopyBuffer( + mHandler, + XMAN_RB2_LINE, + barIndex, + mLoopbackBars, + ribbon2Buffer); + + // + // R2 State ... + ArraySetAsSeries(ribbon2StateBuffer, true); + CopyBuffer( + mHandler, + XMAN_RB2_STATE_LINE, + barIndex, + mLoopbackBars, + ribbon2StateBuffer); + + // + // 3 ... + + // + // R3 ... + ArraySetAsSeries(ribbon3Buffer, true); + CopyBuffer( + mHandler, + XMAN_RB3_LINE, + barIndex, + mLoopbackBars, + ribbon3Buffer); + + // + // R3 State ... + ArraySetAsSeries(ribbon3StateBuffer, true); + CopyBuffer( + mHandler, + XMAN_RB3_STATE_LINE, + barIndex, + mLoopbackBars, + ribbon3StateBuffer); + + // + // 4 ... + + // + // R4 ... + ArraySetAsSeries(ribbon4Buffer, true); + CopyBuffer( + mHandler, + XMAN_RB4_LINE, + barIndex, + mLoopbackBars, + ribbon4Buffer); + + // + // R4 State ... + ArraySetAsSeries(ribbon4StateBuffer, true); + CopyBuffer( + mHandler, + XMAN_RB4_STATE_LINE, + barIndex, + mLoopbackBars, + ribbon4StateBuffer); + + // + // 5 ... + + // + // R5 ... + ArraySetAsSeries(ribbon5Buffer, true); + CopyBuffer( + mHandler, + XMAN_RB5_LINE, + barIndex, + mLoopbackBars, + ribbon5Buffer); + + // + // R5 State ... + ArraySetAsSeries(ribbon5StateBuffer, true); + CopyBuffer( + mHandler, + XMAN_RB5_STATE_LINE, + barIndex, + mLoopbackBars, + ribbon5StateBuffer); + + // + // 6 ... + + // + // R6 ... + ArraySetAsSeries(ribbon6Buffer, true); + CopyBuffer( + mHandler, + XMAN_RB6_LINE, + barIndex, + mLoopbackBars, + ribbon6Buffer); + + // + // R6 State ... + ArraySetAsSeries(ribbon6StateBuffer, true); + CopyBuffer( + mHandler, + XMAN_RB6_STATE_LINE, + barIndex, + mLoopbackBars, + ribbon6StateBuffer); + + // + // SSL Channel ... + + // + // UP ... + ArraySetAsSeries(sslUpBuffer, true); + CopyBuffer( + mHandler, + XMAN_SSLC_UP_LINE, + barIndex, + mLoopbackBars, + sslUpBuffer); + + // + // DOWN ... + ArraySetAsSeries(sslDownBuffer, true); + CopyBuffer( + mHandler, + XMAN_SSLC_DOWN_LINE, + barIndex, + mLoopbackBars, + sslDownBuffer); + + // + // HULL Trend ... + + // + // UP ... + ArraySetAsSeries(hullUpBuffer, true); + CopyBuffer( + mHandler, + XMAN_HULL_UP_LINE, + barIndex, + mLoopbackBars, + hullUpBuffer); + + // + // UP State ... + ArraySetAsSeries(hullUpStateBuffer, true); + CopyBuffer( + mHandler, + XMAN_HULL_UP_STATE_LINE, + barIndex, + mLoopbackBars, + hullUpStateBuffer); + + // + // DOWN ... + ArraySetAsSeries(hullDownBuffer, true); + CopyBuffer( + mHandler, + XMAN_HULL_DOWN_LINE, + barIndex, + mLoopbackBars, + hullDownBuffer); + + // + // DOWN State ... + ArraySetAsSeries(hullDownStateBuffer, true); + CopyBuffer( + mHandler, + XMAN_HULL_DOWN_STATE_LINE, + barIndex, + mLoopbackBars, + hullDownStateBuffer); + + // + // Hiken Ashi ... + + // + // Open ... + ArraySetAsSeries(hkOpenBuffer, true); + CopyBuffer( + mHandler, + XMAN_HK_OPEN_LINE, + barIndex, + mLoopbackBars, + hkOpenBuffer); + + // + // High ... + ArraySetAsSeries(hkHighBuffer, true); + CopyBuffer( + mHandler, + XMAN_HK_HIGH_LINE, + barIndex, + mLoopbackBars, + hkHighBuffer); + + // + // Low ... + ArraySetAsSeries(hkLowBuffer, true); + CopyBuffer( + mHandler, + XMAN_HK_LOW_LINE, + barIndex, + mLoopbackBars, + hkLowBuffer); + + // + // Close ... + ArraySetAsSeries(hkCloseBuffer, true); + CopyBuffer( + mHandler, + XMAN_HK_CLOSE_LINE, + barIndex, + mLoopbackBars, + hkCloseBuffer); + + // + // Close ... + ArraySetAsSeries(hkStateBuffer, true); + CopyBuffer( + mHandler, + XMAN_HK_STATE_LINE, + barIndex, + mLoopbackBars, + hkStateBuffer); + } + + // + // Retrieve Info at Specific Bar Index ... + XMANInfo GetInfo( + int barIndex // Given Bar Index + ) + { + // + XMANInfo result; + + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + // Do Calculations ... + Calculate(barIndex); + + // + // Generate Candle Time ... + datetime barTime = GetCandleTime( + mSymbol, + mPeriod, + barIndex); + + // + // Fill Result ... + result.symbol = mSymbol; + result.period = mPeriod; + result.barTime = barTime; + result.barIndex = barIndex; + + // + // Buffers ... + + // + Copy(peaksBuffer, + result.peaks); + Copy(peaksStateBuffer, + result.peaksStates); + Copy(valesBuffer, + result.vales); + Copy(valesStateBuffer, + result.valesStates); + + // + Copy(fibLevel1Buffer, + result.fibLevel1s); + Copy(fibLevel2Buffer, + result.fibLevel2s); + Copy(fibLevel3Buffer, + result.fibLevel3s); + + // + Copy(sHHBuffer, + result.sHHs); + Copy(sHHStateBuffer, + result.sHHStates); + Copy(sLLBuffer, + result.sLLs); + Copy(sLLStateBuffer, + result.sLLStates); + + // + Copy(mHHBuffer, + result.mHHs); + Copy(mHHStateBuffer, + result.mHHStates); + Copy(mLLBuffer, + result.mLLs); + Copy(mLLStateBuffer, + result.mLLStates); + + // + Copy(lHHBuffer, + result.lHHs); + Copy(lHHStateBuffer, + result.lHHStates); + Copy(lLLBuffer, + result.lLLs); + Copy(lLLStateBuffer, + result.lLLStates); + + // + Copy(hHHBuffer, + result.hHHs); + Copy(hHHStateBuffer, + result.hHHStates); + Copy(hLLBuffer, + result.hLLs); + Copy(hLLStateBuffer, + result.hLLStates); + + // + Copy(trendBuffer, + result.trends); + Copy(trendStateBuffer, + result.trendStates); + + // + Copy(ribbon1Buffer, + result.ribbon1s); + Copy(ribbon1StateBuffer, + result.ribbon1States); + + // + Copy(ribbon2Buffer, + result.ribbon2s); + Copy(ribbon2StateBuffer, + result.ribbon2States); + + // + Copy(ribbon3Buffer, + result.ribbon3s); + Copy(ribbon3StateBuffer, + result.ribbon3States); + + // + Copy(ribbon4Buffer, + result.ribbon4s); + Copy(ribbon4StateBuffer, + result.ribbon4States); + + // + Copy(ribbon5Buffer, + result.ribbon5s); + Copy(ribbon5StateBuffer, + result.ribbon5States); + + // + Copy(ribbon6Buffer, + result.ribbon6s); + Copy(ribbon6StateBuffer, + result.ribbon6States); + + // + Copy(sslUpBuffer, + result.sslUps); + Copy(sslDownBuffer, + result.sslDowns); + + // + Copy(hullUpBuffer, + result.hullUps); + Copy(hullUpStateBuffer, + result.hullUpStates); + Copy(hullDownBuffer, + result.hullDowns); + Copy(hullDownStateBuffer, + result.hullDownStates); + + // + Copy(hkOpenBuffer, + result.hkOpens); + Copy(hkHighBuffer, + result.hkHighs); + Copy(hkLowBuffer, + result.hkLows); + Copy(hkCloseBuffer, + result.hkCloses); + Copy(hkStateBuffer, + result.hkStates); + + // + // Conditions ... + bool isNewPeak = + // + peaksStateBuffer[barIndex] != EMPTY_VALUE + // + ; + bool isNewVale = + // + valesStateBuffer[barIndex] != EMPTY_VALUE + // + ; + + // + // XSTR ... + + // + // Reading Temp ... + ENUM_XMAN_STATES trendState = (ENUM_XMAN_STATES)trendStateBuffer[barIndex]; + ENUM_XMAN_STATES trendStatePrev = (ENUM_XMAN_STATES)trendStateBuffer[barIndex + 1]; + + // + bool isTrendBullish = + // + trendState == XMAN_STATE_BULLISH + // + ; + + // + bool isTrendPrevBullish = + // + trendStatePrev == XMAN_STATE_BULLISH + // + ; + + // + bool isTrendSwitchedToBullish = + // + isTrendBullish && + !isTrendPrevBullish + // + ; + + // + bool isTrendBearish = + // + trendState == XMAN_STATE_BEARISH + // + ; + + // + bool isTrendPrevBearish = + // + trendStatePrev == XMAN_STATE_BEARISH + // + ; + + // + bool isTrendSwitchedToBearish = + // + isTrendBearish && + !isTrendPrevBearish + // + ; + + // + bool isTrendNeutural = + // + !isTrendBullish && + !isTrendBearish + // + ; + + // + bool isTrendPrevNeutural = + // + !isTrendPrevBullish && + !isTrendPrevBearish + // + ; + + // + bool isTrendSwitchedToNeutural = + // + isTrendNeutural && + !isTrendPrevNeutural + // + ; + + // + // XSSLC ... + + // + bool isSSLBullish = + // + sslUpBuffer[barIndex] > sslDownBuffer[barIndex] + // + ; + + // + bool isSSLPrevBullish = + // + sslUpBuffer[barIndex + 1] > sslDownBuffer[barIndex + 1] + // + ; + + // + bool isSSLSwitchedToBullish = + // + isSSLBullish && + !isSSLPrevBullish + // + ; + + // + bool isSSLBearish = + // + sslUpBuffer[barIndex] < sslDownBuffer[barIndex] + // + ; + + // + bool isSSLPrevBearish = + // + sslUpBuffer[barIndex + 1] < sslDownBuffer[barIndex + 1] + // + ; + + // + bool isSSLSwitchedBearish = + // + isSSLBearish && + !isSSLPrevBearish + // + ; + + // + bool isSSLNeutural = + // + !isSSLBullish && + !isSSLBearish + // + ; + + // + bool isSSLPrevNeutural = + // + !isSSLPrevBullish && + !isSSLPrevBearish + // + ; + + // + bool isSSLSwitchedNeutural = + // + isSSLNeutural && + !isSSLPrevNeutural + // + ; + + // + // XHULL ... + + // + bool isHullUpBullish = + // + hullUpStateBuffer[barIndex] == XMAN_STATE_BULLISH + // + ; + + // + bool isHullUpPrevBullish = + // + hullUpStateBuffer[barIndex + 1] == XMAN_STATE_BULLISH + // + ; + + // + bool isHullDownBullish = + // + hullDownStateBuffer[barIndex] == XMAN_STATE_BULLISH + // + ; + + // + bool isHullDownPrevBullish = + // + hullDownStateBuffer[barIndex + 1] == XMAN_STATE_BULLISH + // + ; + + // + bool isHullBullish = + // + isHullUpBullish && + isHullDownBullish + // + ; + + // + bool isHullPrevBullish = + // + isHullUpPrevBullish && + isHullDownPrevBullish + // + ; + + // + bool isHullSwitchedToBullish = + // + isHullBullish && + !isHullPrevBullish + // + ; + + // + bool isHullUpBearish = + // + hullUpStateBuffer[barIndex] == XMAN_STATE_BEARISH + // + ; + + // + bool isHullUpPrevBearish = + // + hullUpStateBuffer[barIndex + 1] == XMAN_STATE_BEARISH + // + ; + + // + bool isHullDownBearish = + // + hullDownStateBuffer[barIndex] == XMAN_STATE_BEARISH + // + ; + + // + bool isHullDownPrevBearish = + // + hullDownStateBuffer[barIndex + 1] == XMAN_STATE_BEARISH + // + ; + + // + bool isHullBearish = + // + isHullUpBearish && + isHullDownBearish + // + ; + + // + bool isHullPrevBearish = + // + isHullUpPrevBearish && + isHullDownPrevBearish + // + ; + + // + bool isHullSwitchedToBearish = + // + isHullBearish && + !isHullPrevBearish + // + ; + + // + bool isHullUpNeutural = + // + !isHullUpBullish && + !isHullUpBearish + // + ; + + // + bool isHullUpPrevNeutural = + // + !isHullUpPrevBullish && + !isHullUpPrevBearish + // + ; + + // + bool isHullDownNeutural = + // + !isHullDownBullish && + !isHullDownBearish + // + ; + + // + bool isHullDownPrevNeutural = + // + !isHullDownPrevBullish && + !isHullDownPrevBearish + // + ; + + // + bool isHullNeutural = + // + isHullUpNeutural && + isHullDownNeutural + // + ; + + // + bool isHullPrevNeutural = + // + isHullUpPrevNeutural && + isHullDownPrevNeutural + // + ; + + // + bool isHullSwitchedToNeutural = + // + isHullNeutural && + !isHullPrevNeutural + // + ; + + // + // XHK ... + + // + // Hiken Ashi ... + bool isHKBullish = + // + hkStateBuffer[barIndex] == XMAN_STATE_BULLISH + // + ; + bool isHKBearish = + // + hkStateBuffer[barIndex] == XMAN_STATE_BEARISH + // + ; + + // + // Cycles ... + + // + // Level 1 ... + + // + ENUM_XMAN_STATES scHState = (ENUM_XMAN_STATES)sHHStateBuffer[barIndex]; + ENUM_XMAN_STATES scHStatePrev = (ENUM_XMAN_STATES)sHHStateBuffer[barIndex + 1]; + ENUM_XMAN_STATES scLState = (ENUM_XMAN_STATES)sLLStateBuffer[barIndex]; + ENUM_XMAN_STATES scLStatePrev = (ENUM_XMAN_STATES)sLLStateBuffer[barIndex + 1]; + + // + // Bullish ... + + // + bool isSCHBullish = scHState == XMAN_STATE_BULLISH; + bool isSCHPrevBullish = scHStatePrev == XMAN_STATE_BULLISH; + + // + bool isSCLBullish = scLState == XMAN_STATE_BULLISH; + bool isSCLPrevBullish = scLStatePrev == XMAN_STATE_BULLISH; + + // + bool isSCBullish = + isSCHBullish && + isSCLBullish; + + // + bool isSCPrevBullish = + isSCHPrevBullish && + isSCLPrevBullish; + + // + bool isSCHSwitchedToBullish = + isSCHBullish && + !isSCHPrevBullish; + + // + bool isSCLSwitchedToBullish = + isSCLBullish && + !isSCLPrevBullish; + + // + bool isSCSwitchedToBullish = + isSCBullish && + !isSCPrevBullish; + + // + // Bearish ... + + // + bool isSCHBearish = scHState == XMAN_STATE_BEARISH; + bool isSCHPrevBearish = scHStatePrev == XMAN_STATE_BEARISH; + + // + bool isSCLBearish = scLState == XMAN_STATE_BEARISH; + bool isSCLPrevBearish = scLStatePrev == XMAN_STATE_BEARISH; + + // + bool isSCBearish = + isSCHBearish && + isSCLBearish; + + // + bool isSCPrevBearish = + isSCHPrevBearish && + isSCLPrevBearish; + + // + bool isSCHSwitchedToBearish = + isSCHBearish && + !isSCHPrevBearish; + + // + bool isSCLSwitchedToBearish = + isSCLBearish && + !isSCLPrevBearish; + + // + bool isSCSwitchedToBearish = + isSCBearish && + !isSCPrevBearish; + + // + // Neutural ... + + // + bool isSCHNeutural = + !isSCHBullish && + !isSCHBearish; + + // + bool isSCHPrevNeutural = + !isSCHPrevBullish && + !isSCHPrevBearish; + + // + bool isSCLNeutural = + !isSCLBullish && + !isSCLBearish; + + // + bool isSCLPrevNeutural = + !isSCLPrevBullish && + !isSCLPrevBearish; + + // + bool isSCNeutural = + isSCHNeutural && + isSCLNeutural; + + // + bool isSCPrevNeutural = + isSCHPrevNeutural && + isSCLPrevNeutural; + + // + bool isSCHSwitchedToNeutural = + isSCHNeutural && + !isSCHPrevNeutural; + + // + bool isSCLSwitchedToNeutural = + isSCLNeutural && + !isSCLPrevNeutural; + + // + bool isSCSwitchedToNeutural = + isSCNeutural && + !isSCPrevNeutural; + + // + // Level 2 ... + + // + ENUM_XMAN_STATES mcHState = (ENUM_XMAN_STATES)mHHStateBuffer[barIndex]; + ENUM_XMAN_STATES mcHStatePrev = (ENUM_XMAN_STATES)mHHStateBuffer[barIndex + 1]; + ENUM_XMAN_STATES mcLState = (ENUM_XMAN_STATES)mLLStateBuffer[barIndex]; + ENUM_XMAN_STATES mcLStatePrev = (ENUM_XMAN_STATES)mLLStateBuffer[barIndex + 1]; + + // + // Bullish ... + + // + bool isMCHBullish = mcHState == XMAN_STATE_BULLISH; + bool isMCHPrevBullish = mcHStatePrev == XMAN_STATE_BULLISH; + + // + bool isMCLBullish = mcLState == XMAN_STATE_BULLISH; + bool isMCLPrevBullish = mcLStatePrev == XMAN_STATE_BULLISH; + + // + bool isMCBullish = + isMCHBullish && + isMCLBullish; + + // + bool isMCPrevBullish = + isMCHPrevBullish && + isMCLPrevBullish; + + // + bool isMCHSwitchedToBullish = + isMCHBullish && + !isMCHPrevBullish; + + // + bool isMCLSwitchedToBullish = + isMCLBullish && + !isMCLPrevBullish; + + // + bool isMCSwitchedToBullish = + isMCBullish && + !isMCPrevBullish; + + // + // Bearish ... + + // + bool isMCHBearish = mcHState == XMAN_STATE_BEARISH; + bool isMCHPrevBearish = mcHStatePrev == XMAN_STATE_BEARISH; + + // + bool isMCLBearish = mcLState == XMAN_STATE_BEARISH; + bool isMCLPrevBearish = mcLStatePrev == XMAN_STATE_BEARISH; + + // + bool isMCBearish = + isMCHBearish && + isMCLBearish; + + // + bool isMCPrevBearish = + isMCHPrevBearish && + isMCLPrevBearish; + + // + bool isMCHSwitchedToBearish = + isMCHBearish && + !isMCHPrevBearish; + + // + bool isMCLSwitchedToBearish = + isMCLBearish && + !isMCLPrevBearish; + + // + bool isMCSwitchedToBearish = + isMCBearish && + !isMCPrevBearish; + + // + // Neutural ... + + // + bool isMCHNeutural = + !isMCHBullish && + !isMCHBearish; + + // + bool isMCHPrevNeutural = + !isMCHPrevBullish && + !isMCHPrevBearish; + + // + bool isMCLNeutural = + !isMCLBullish && + !isMCLBearish; + + // + bool isMCLPrevNeutural = + !isMCLPrevBullish && + !isMCLPrevBearish; + + // + bool isMCNeutural = + isMCHNeutural && + isMCLNeutural; + + // + bool isMCPrevNeutural = + isMCHPrevNeutural && + isMCLPrevNeutural; + + // + bool isMCHSwitchedToNeutural = + isMCHNeutural && + !isMCHPrevNeutural; + + // + bool isMCLSwitchedToNeutural = + isMCLNeutural && + !isMCLPrevNeutural; + + // + bool isMCSwitchedToNeutural = + isMCNeutural && + !isMCPrevNeutural; + + // + // Level 3 ... + + // + ENUM_XMAN_STATES lcHState = (ENUM_XMAN_STATES)lHHStateBuffer[barIndex]; + ENUM_XMAN_STATES lcHStatePrev = (ENUM_XMAN_STATES)lHHStateBuffer[barIndex + 1]; + ENUM_XMAN_STATES lcLState = (ENUM_XMAN_STATES)lLLStateBuffer[barIndex]; + ENUM_XMAN_STATES lcLStatePrev = (ENUM_XMAN_STATES)lLLStateBuffer[barIndex + 1]; + + // + // Bullish ... + + // + bool isLCHBullish = lcHState == XMAN_STATE_BULLISH; + bool isLCHPrevBullish = lcHStatePrev == XMAN_STATE_BULLISH; + + // + bool isLCLBullish = lcLState == XMAN_STATE_BULLISH; + bool isLCLPrevBullish = lcLStatePrev == XMAN_STATE_BULLISH; + + // + bool isLCBullish = + isLCHBullish && + isLCLBullish; + + // + bool isLCPrevBullish = + isLCHPrevBullish && + isLCLPrevBullish; + + // + bool isLCHSwitchedToBullish = + isLCHBullish && + !isLCHPrevBullish; + + // + bool isLCLSwitchedToBullish = + isLCLBullish && + !isLCLPrevBullish; + + // + bool isLCSwitchedToBullish = + isLCBullish && + !isLCPrevBullish; + + // + // Bearish ... + + // + bool isLCHBearish = lcHState == XMAN_STATE_BEARISH; + bool isLCHPrevBearish = lcHStatePrev == XMAN_STATE_BEARISH; + + // + bool isLCLBearish = lcLState == XMAN_STATE_BEARISH; + bool isLCLPrevBearish = lcLStatePrev == XMAN_STATE_BEARISH; + + // + bool isLCBearish = + isLCHBearish && + isLCLBearish; + + // + bool isLCPrevBearish = + isLCHPrevBearish && + isLCLPrevBearish; + + // + bool isLCHSwitchedToBearish = + isLCHBearish && + !isLCHPrevBearish; + + // + bool isLCLSwitchedToBearish = + isLCLBearish && + !isLCLPrevBearish; + + // + bool isLCSwitchedToBearish = + isLCBearish && + !isLCPrevBearish; + + // + // Neutural ... + + // + bool isLCHNeutural = + !isLCHBullish && + !isLCHBearish; + + // + bool isLCHPrevNeutural = + !isLCHPrevBullish && + !isLCHPrevBearish; + + // + bool isLCLNeutural = + !isLCLBullish && + !isLCLBearish; + + // + bool isLCLPrevNeutural = + !isLCLPrevBullish && + !isLCLPrevBearish; + + // + bool isLCNeutural = + isLCHNeutural && + isLCLNeutural; + + // + bool isLCPrevNeutural = + isLCHPrevNeutural && + isLCLPrevNeutural; + + // + bool isLCHSwitchedToNeutural = + isLCHNeutural && + !isLCHPrevNeutural; + + // + bool isLCLSwitchedToNeutural = + isLCLNeutural && + !isLCLPrevNeutural; + + // + bool isLCSwitchedToNeutural = + isLCNeutural && + !isLCPrevNeutural; + + // + // Level 4 ... + + // + ENUM_XMAN_STATES hcHState = (ENUM_XMAN_STATES)hHHStateBuffer[barIndex]; + ENUM_XMAN_STATES hcHStatePrev = (ENUM_XMAN_STATES)hHHStateBuffer[barIndex + 1]; + ENUM_XMAN_STATES hcLState = (ENUM_XMAN_STATES)hLLStateBuffer[barIndex]; + ENUM_XMAN_STATES hcLStatePrev = (ENUM_XMAN_STATES)hLLStateBuffer[barIndex + 1]; + + // + // Bullish ... + + // + bool isHCHBullish = hcHState == XMAN_STATE_BULLISH; + bool isHCHPrevBullish = hcHStatePrev == XMAN_STATE_BULLISH; + + // + bool isHCLBullish = hcLState == XMAN_STATE_BULLISH; + bool isHCLPrevBullish = hcLStatePrev == XMAN_STATE_BULLISH; + + // + bool isHCBullish = + isHCHBullish && + isHCLBullish; + + // + bool isHCPrevBullish = + isHCHPrevBullish && + isHCLPrevBullish; + + // + bool isHCHSwitchedToBullish = + isHCHBullish && + !isHCHPrevBullish; + + // + bool isHCLSwitchedToBullish = + isHCLBullish && + !isHCLPrevBullish; + + // + bool isHCSwitchedToBullish = + isHCBullish && + !isHCPrevBullish; + + // + // Bearish ... + + // + bool isHCHBearish = hcHState == XMAN_STATE_BEARISH; + bool isHCHPrevBearish = hcHStatePrev == XMAN_STATE_BEARISH; + + // + bool isHCLBearish = hcLState == XMAN_STATE_BEARISH; + bool isHCLPrevBearish = hcLStatePrev == XMAN_STATE_BEARISH; + + // + bool isHCBearish = + isHCHBearish && + isHCLBearish; + + // + bool isHCPrevBearish = + isHCHPrevBearish && + isHCLPrevBearish; + + // + bool isHCHSwitchedToBearish = + isHCHBearish && + !isHCHPrevBearish; + + // + bool isHCLSwitchedToBearish = + isHCLBearish && + !isHCLPrevBearish; + + // + bool isHCSwitchedToBearish = + isHCBearish && + !isHCPrevBearish; + + // + // Neutural ... + + // + bool isHCHNeutural = + !isHCHBullish && + !isHCHBearish; + + // + bool isHCHPrevNeutural = + !isHCHPrevBullish && + !isHCHPrevBearish; + + // + bool isHCLNeutural = + !isHCLBullish && + !isHCLBearish; + + // + bool isHCLPrevNeutural = + !isHCLPrevBullish && + !isHCLPrevBearish; + + // + bool isHCNeutural = + isHCHNeutural && + isHCLNeutural; + + // + bool isHCPrevNeutural = + isHCHPrevNeutural && + isHCLPrevNeutural; + + // + bool isHCHSwitchedToNeutural = + isHCHNeutural && + !isHCHPrevNeutural; + + // + bool isHCLSwitchedToNeutural = + isHCLNeutural && + !isHCLPrevNeutural; + + // + bool isHCSwitchedToNeutural = + isHCNeutural && + !isHCPrevNeutural; + + // + // Ribbons ... + + // + // R1 ... + ENUM_XMAN_STATES r1State = (ENUM_XMAN_STATES)ribbon1StateBuffer[barIndex]; + ENUM_XMAN_STATES r1StatePrev = (ENUM_XMAN_STATES)ribbon1StateBuffer[barIndex + 1]; + + // + // R2 ... + ENUM_XMAN_STATES r2State = (ENUM_XMAN_STATES)ribbon2StateBuffer[barIndex]; + ENUM_XMAN_STATES r2StatePrev = (ENUM_XMAN_STATES)ribbon2StateBuffer[barIndex + 1]; + + // + // R3 ... + ENUM_XMAN_STATES r3State = (ENUM_XMAN_STATES)ribbon3StateBuffer[barIndex]; + ENUM_XMAN_STATES r3StatePrev = (ENUM_XMAN_STATES)ribbon3StateBuffer[barIndex + 1]; + + // + // R4 ... + ENUM_XMAN_STATES r4State = (ENUM_XMAN_STATES)ribbon4StateBuffer[barIndex]; + ENUM_XMAN_STATES r4StatePrev = (ENUM_XMAN_STATES)ribbon4StateBuffer[barIndex + 1]; + + // + // R5 ... + ENUM_XMAN_STATES r5State = (ENUM_XMAN_STATES)ribbon5StateBuffer[barIndex]; + ENUM_XMAN_STATES r5StatePrev = (ENUM_XMAN_STATES)ribbon5StateBuffer[barIndex + 1]; + + // + // R6 ... + ENUM_XMAN_STATES r6State = (ENUM_XMAN_STATES)ribbon6StateBuffer[barIndex]; + ENUM_XMAN_STATES r6StatePrev = (ENUM_XMAN_STATES)ribbon6StateBuffer[barIndex + 1]; + + // + // Bullish ... + + // + bool isRibbon1Bullish = r1State == XMAN_STATE_BULLISH; + bool isRibbon2Bullish = r2State == XMAN_STATE_BULLISH; + bool isRibbon3Bullish = r3State == XMAN_STATE_BULLISH; + bool isRibbon4Bullish = r4State == XMAN_STATE_BULLISH; + bool isRibbon5Bullish = r5State == XMAN_STATE_BULLISH; + bool isRibbon6Bullish = r6State == XMAN_STATE_BULLISH; + + // + bool isRibbon1PrevBullish = r1StatePrev == XMAN_STATE_BULLISH; + bool isRibbon2PrevBullish = r2StatePrev == XMAN_STATE_BULLISH; + bool isRibbon3PrevBullish = r3StatePrev == XMAN_STATE_BULLISH; + bool isRibbon4PrevBullish = r4StatePrev == XMAN_STATE_BULLISH; + bool isRibbon5PrevBullish = r5StatePrev == XMAN_STATE_BULLISH; + bool isRibbon6PrevBullish = r6StatePrev == XMAN_STATE_BULLISH; + + // + // Bearish ... + + // + bool isRibbon1Bearish = r1State == XMAN_STATE_BEARISH; + bool isRibbon2Bearish = r2State == XMAN_STATE_BEARISH; + bool isRibbon3Bearish = r3State == XMAN_STATE_BEARISH; + bool isRibbon4Bearish = r4State == XMAN_STATE_BEARISH; + bool isRibbon5Bearish = r5State == XMAN_STATE_BEARISH; + bool isRibbon6Bearish = r6State == XMAN_STATE_BEARISH; + + // + bool isRibbon1PrevBearish = r1StatePrev == XMAN_STATE_BEARISH; + bool isRibbon2PrevBearish = r2StatePrev == XMAN_STATE_BEARISH; + bool isRibbon3PrevBearish = r3StatePrev == XMAN_STATE_BEARISH; + bool isRibbon4PrevBearish = r4StatePrev == XMAN_STATE_BEARISH; + bool isRibbon5PrevBearish = r5StatePrev == XMAN_STATE_BEARISH; + bool isRibbon6PrevBearish = r6StatePrev == XMAN_STATE_BEARISH; + + // + // Neutural ... + + // + bool isRibbon1Neutural = + !isRibbon1Bullish && + !isRibbon1Bearish; + + // + bool isRibbon2Neutural = + !isRibbon2Bullish && + !isRibbon2Bearish; + + // + bool isRibbon3Neutural = + !isRibbon3Bullish && + !isRibbon3Bearish; + + // + bool isRibbon4Neutural = + !isRibbon4Bullish && + !isRibbon4Bearish; + + // + bool isRibbon5Neutural = + !isRibbon5Bullish && + !isRibbon5Bearish; + + // + bool isRibbon6Neutural = + !isRibbon6Bullish && + !isRibbon6Bearish; + + // + bool isRibbon1PrevNeutural = + !isRibbon1PrevBullish && + !isRibbon1PrevBearish; + + // + bool isRibbon2PrevNeutural = + !isRibbon2PrevBullish && + !isRibbon2PrevBearish; + + // + bool isRibbon3PrevNeutural = + !isRibbon3PrevBullish && + !isRibbon3PrevBearish; + + // + bool isRibbon4PrevNeutural = + !isRibbon4PrevBullish && + !isRibbon4PrevBearish; + + // + bool isRibbon5PrevNeutural = + !isRibbon5PrevBullish && + !isRibbon5PrevBearish; + + // + bool isRibbon6PrevNeutural = + !isRibbon6PrevBullish && + !isRibbon6PrevBearish; + + // + // All Ribbons ... + + // + bool isRibbonBullish = + isRibbon1Bullish && + isRibbon2Bullish && + isRibbon3Bullish && + isRibbon4Bullish && + isRibbon5Bullish && + isRibbon6Bullish; + // + bool isRibbonPrevBullish = + isRibbon1PrevBullish && + isRibbon2PrevBullish && + isRibbon3PrevBullish && + isRibbon4PrevBullish && + isRibbon5PrevBullish && + isRibbon6PrevBullish; + + // + bool isRibbonSwitchedToBullish = + isRibbonBullish && + !isRibbonPrevBullish; + + // + bool isRibbonBearish = + isRibbon1Bearish && + isRibbon2Bearish && + isRibbon3Bearish && + isRibbon4Bearish && + isRibbon5Bearish && + isRibbon6Bearish; + + // + bool isRibbonPrevBearish = + isRibbon1PrevBearish && + isRibbon2PrevBearish && + isRibbon3PrevBearish && + isRibbon4PrevBearish && + isRibbon5PrevBearish && + isRibbon6PrevBearish; + + // + bool isRibbonSwitchedToBearish = + isRibbonBearish && + !isRibbonPrevBearish; + + // + bool isRibbonNeutural = + isRibbon1Neutural && + isRibbon2Neutural && + isRibbon3Neutural && + isRibbon4Neutural && + isRibbon5Neutural && + isRibbon6Neutural; + + // + bool isRibbonPrevNeutural = + isRibbon1PrevNeutural && + isRibbon2PrevNeutural && + isRibbon3PrevNeutural && + isRibbon4PrevNeutural && + isRibbon5PrevNeutural && + isRibbon6PrevNeutural; + + // + bool isRibbonSwitchedToNeutural = + isRibbonNeutural && + !isRibbonPrevNeutural; + + // + result.isNewPeak = isNewPeak; + result.isNewVale = isNewVale; + result.isTrendBullish = isTrendBullish; + result.isTrendSwitchedToBullish = isTrendSwitchedToBullish; + result.isTrendBearish = isTrendBearish; + result.isTrendSwitchedToBearish = isTrendSwitchedToBearish; + result.isTrendNeutural = isTrendNeutural; + result.isTrendSwitchedToNeutural = isTrendSwitchedToNeutural; + result.isSSLBullish = isSSLBullish; + result.isSSLSwitchedToBullish = isSSLSwitchedToBullish; + result.isSSLBearish = isSSLBearish; + result.isSSLSwitchedBearish = isSSLSwitchedBearish; + result.isSSLNeutural = isSSLNeutural; + result.isSSLSwitchedNeutural = isSSLSwitchedNeutural; + result.isHullBullish = isHullBullish; + result.isHullUpBullish = isHullUpBullish; + result.isHullDownBullish = isHullDownBullish; + result.isHullSwitchedToBullish = isHullSwitchedToBullish; + result.isHullBearish = isHullBearish; + result.isHullUpBearish = isHullUpBearish; + result.isHullDownBearish = isHullDownBearish; + result.isHullSwitchedToBearish = isHullSwitchedToBearish; + result.isHullNeutural = isHullNeutural; + result.isHullUpNeutural = isHullUpNeutural; + result.isHullDownNeutural = isHullDownNeutural; + result.isHullSwitchedToNeutural = isHullSwitchedToNeutural; + result.isHKBullish = isHKBullish; + result.isHKBearish = isHKBearish; + result.isSCBullish = isSCBullish; + result.isSCHBullish = isSCHBullish; + result.isSCLBullish = isSCLBullish; + result.isSCSwitchedToBullish = isSCSwitchedToBullish; + result.isSCHSwitchedToBullish = isSCHSwitchedToBullish; + result.isSCLSwitchedToBullish = isSCLSwitchedToBullish; + result.isSCBearish = isSCBearish; + result.isSCHBearish = isSCHBearish; + result.isSCLBearish = isSCLBearish; + result.isSCSwitchedToBearish = isSCSwitchedToBearish; + result.isSCHSwitchedToBearish = isSCHSwitchedToBearish; + result.isSCLSwitchedToBearish = isSCLSwitchedToBearish; + result.isSCNeutural = isSCNeutural; + result.isSCHNeutural = isSCHNeutural; + result.isSCLNeutural = isSCLNeutural; + result.isSCSwitchedToNeutural = isSCSwitchedToNeutural; + result.isSCHSwitchedToNeutural = isSCHSwitchedToNeutural; + result.isSCLSwitchedToNeutural = isSCLSwitchedToNeutural; + result.isMCBullish = isMCBullish; + result.isMCHBullish = isMCHBullish; + result.isMCLBullish = isMCLBullish; + result.isMCSwitchedToBullish = isMCSwitchedToBullish; + result.isMCHSwitchedToBullish = isMCHSwitchedToBullish; + result.isMCLSwitchedToBullish = isMCLSwitchedToBullish; + result.isMCBearish = isMCBearish; + result.isMCHBearish = isMCHBearish; + result.isMCLBearish = isMCLBearish; + result.isMCSwitchedToBearish = isMCSwitchedToBearish; + result.isMCHSwitchedToBearish = isMCHSwitchedToBearish; + result.isMCLSwitchedToBearish = isMCLSwitchedToBearish; + result.isMCNeutural = isMCNeutural; + result.isMCHNeutural = isMCHNeutural; + result.isMCLNeutural = isMCLNeutural; + result.isMCSwitchedToNeutural = isMCSwitchedToNeutural; + result.isMCHSwitchedToNeutural = isMCHSwitchedToNeutural; + result.isMCLSwitchedToNeutural = isMCLSwitchedToNeutural; + result.isLCBullish = isLCBullish; + result.isLCHBullish = isLCHBullish; + result.isLCLBullish = isLCLBullish; + result.isLCSwitchedToBullish = isLCSwitchedToBullish; + result.isLCHSwitchedToBullish = isLCHSwitchedToBullish; + result.isLCLSwitchedToBullish = isLCLSwitchedToBullish; + result.isLCBearish = isLCBearish; + result.isLCHBearish = isLCHBearish; + result.isLCLBearish = isLCLBearish; + result.isLCSwitchedToBearish = isLCSwitchedToBearish; + result.isLCHSwitchedToBearish = isLCHSwitchedToBearish; + result.isLCLSwitchedToBearish = isLCLSwitchedToBearish; + result.isLCNeutural = isLCNeutural; + result.isLCHNeutural = isLCHNeutural; + result.isLCLNeutural = isLCLNeutural; + result.isLCSwitchedToNeutural = isLCSwitchedToNeutural; + result.isLCHSwitchedToNeutural = isLCHSwitchedToNeutural; + result.isLCLSwitchedToNeutural = isLCLSwitchedToNeutural; + result.isHCBullish = isHCBullish; + result.isHCHBullish = isHCHBullish; + result.isHCLBullish = isHCLBullish; + result.isHCSwitchedToBullish = isHCSwitchedToBullish; + result.isHCHSwitchedToBullish = isHCHSwitchedToBullish; + result.isHCLSwitchedToBullish = isHCLSwitchedToBullish; + result.isHCBearish = isHCBearish; + result.isHCHBearish = isHCHBearish; + result.isHCLBearish = isHCLBearish; + result.isHCSwitchedToBearish = isHCSwitchedToBearish; + result.isHCHSwitchedToBearish = isHCHSwitchedToBearish; + result.isHCLSwitchedToBearish = isHCLSwitchedToBearish; + result.isHCNeutural = isHCNeutural; + result.isHCHNeutural = isHCHNeutural; + result.isHCLNeutural = isHCLNeutural; + result.isHCSwitchedToNeutural = isHCSwitchedToNeutural; + result.isHCHSwitchedToNeutural = isHCHSwitchedToNeutural; + result.isHCLSwitchedToNeutural = isHCLSwitchedToNeutural; + result.isRibbon1Bullish = isRibbon1Bullish; + result.isRibbon2Bullish = isRibbon2Bullish; + result.isRibbon3Bullish = isRibbon3Bullish; + result.isRibbon4Bullish = isRibbon4Bullish; + result.isRibbon5Bullish = isRibbon5Bullish; + result.isRibbon6Bullish = isRibbon6Bullish; + result.isRibbon1Bearish = isRibbon1Bearish; + result.isRibbon2Bearish = isRibbon2Bearish; + result.isRibbon3Bearish = isRibbon3Bearish; + result.isRibbon4Bearish = isRibbon4Bearish; + result.isRibbon5Bearish = isRibbon5Bearish; + result.isRibbon6Bearish = isRibbon6Bearish; + result.isRibbon1Neutural = isRibbon1Neutural; + result.isRibbon2Neutural = isRibbon2Neutural; + result.isRibbon3Neutural = isRibbon3Neutural; + result.isRibbon4Neutural = isRibbon4Neutural; + result.isRibbon5Neutural = isRibbon5Neutural; + result.isRibbon6Neutural = isRibbon6Neutural; + result.isRibbonBullish = isRibbonBullish; + result.isRibbonSwitchedToBullish = isRibbonSwitchedToBullish; + result.isRibbonBearish = isRibbonBearish; + result.isRibbonSwitchedToBearish = isRibbonSwitchedToBearish; + result.isRibbonNeutural = isRibbonNeutural; + result.isRibbonSwitchedToNeutural = isRibbonSwitchedToNeutural; + + // + return result; + } + + // + // Protcted ... +protected: + // + // Private ... +private: + // + // Inputs ... + + // + // Candle Timer ... + color mCandleTimerColor; // Text Color + ENUM_BASE_CORNER mCandleTimerCorner; // Text Position + + // + // Chart Style ... + color mUpColor; // Up Color + color mDownColor; // Down Color + color mLineColor; // Line mode and Doji candlestick Color + color mBearishColor; // Bullish Color + color mBullishColor; // Bearish Color + color mVolumesColor; // Volumes Color + + // + // Market Cycles ... + + // + // Level 1 ... + ENUM_X_PERIOD_METHOD mL1Method; // How to Find Period + ENUM_TIMEFRAMES mL1Period; // Time Period + + // + // Level 2 ... + ENUM_X_PERIOD_METHOD mL2Method; // How to Find Period + ENUM_TIMEFRAMES mL2Period; // Time Period + + // + // Level 3 ... + ENUM_X_PERIOD_METHOD mL3Method; // How to Find Period + ENUM_TIMEFRAMES mL3Period; // Time Period + + // + // Level 4 ... + ENUM_X_PERIOD_METHOD mL4Method; // How to Find Period + ENUM_TIMEFRAMES mL4Period; // Time Period + + // + // Fibonacci ... + double mFiboLevel1; // Fibio 1st Level + double mFiboLevel2; // Fibio 2st Level + double mFiboLevel3; // Fibio 3rd Level + + // + // Boundary Detection Modes ... + ENUM_SERIESMODE mHHMode; // Highest High Calculation Method + ENUM_SERIESMODE mLLMode; // Lowest Low Calculation Method + + // + // Trend Detection + double mTrendMultiplier; // Multiplier + ENUM_APPLIED_PRICE mTrendPriceAppliedTo; // Applied To + + // + // Ribbon Detection ... + ENUM_X_MA_METHOD mRibbonMode; // How to Calculate + + // + // Hull Trend Detection ... + double mHullDivisor; // Divisor (Speed) + ENUM_APPLIED_PRICE mHullUpAppliedTo; // Up Zone Applied to + ENUM_APPLIED_PRICE mHullDownAppliedTo; // Down Zone Applied to + + // + // SSL Channel Detection ... + ENUM_X_MA_METHOD mSslcMode; // How to Calculate + ENUM_APPLIED_PRICE mSslcUpAppliedTo; // Up Applied To + ENUM_APPLIED_PRICE mSslcDownAppliedTo; // Down Applied To + + // + // Presentation ... + bool mShowCandleTimer; // Show Candle Time + bool mShowCandles; // Show Candles + bool mShowHKCandles; // Draw Hiken Ashi Candle + bool mShowPeaksAndVales; // Show Peaks and Vales + bool mShowTrends; // Show Trends + bool mSillTrends; // Fill Trends + bool mShowLevels; // Show Levels + bool mShowConsolidations; // Show Consolidations + bool mShowRibbons; // Show Ribbons + bool mShowHull; // Show Hull + bool mShowSSLChannel; // Show SSL Channel + bool mShowFibo1Levels; // Show Fibo 1st Level + bool mShowFibo2Levels; // Show Fibo 2nd Level + bool mShowFibo3Levels; // Show Fibo 3rd Level +}; + +// +// START Usefull Functions ... +// + +// +// END Usefull Functions ... +// diff --git a/MQLTestWorkspace/X121/Old/Helpers/x-saherelm.x121.xmrb.helper.class.ex5 b/MQLTestWorkspace/X121/Old/Helpers/x-saherelm.x121.xmrb.helper.class.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..a5adbac298bef39f7648add70a4e2c60923b41ae GIT binary patch literal 6270 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 a*#2T&TKR&iOzz9W*e|lp6$!;c!v6&ntL#ev literal 0 HcmV?d00001 diff --git a/MQLTestWorkspace/X121/Old/Helpers/x-saherelm.x121.xmrb.helper.class.mq5 b/MQLTestWorkspace/X121/Old/Helpers/x-saherelm.x121.xmrb.helper.class.mq5 new file mode 100644 index 0000000..5680e05 --- /dev/null +++ b/MQLTestWorkspace/X121/Old/Helpers/x-saherelm.x121.xmrb.helper.class.mq5 @@ -0,0 +1,895 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 Helper Class Library +// ---------------------------------------------- +// Name: XSCXMRBHelper +// Description: provides all Indicator +// Helper requirements ... +// +// +// 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 + +// +// START Definitions ... +// + +// +// Inputs ... +struct XMRBInputs +{ + // + // Ribbon 1 ... + int fast1Length; // Fast + int slow1Length; // Slow + + // + // Ribbon 2 ... + int fast2Length; // Fast + int slow2Length; // Slow + + // + // Ribbon 3 ... + int fast3Length; // Fast + int slow3Length; // Slow + + // + // Ribbon 4 ... + int fast4Length; // Fast + int slow4Length; // Slow + + // + // Ribbon 5 ... + int fast5Length; // Fast + int slow5Length; // Slow + + // + // Calculation ... + ENUM_MA_METHOD ribbonMode; // Mode + ENUM_APPLIED_PRICE ribbonAppliedTo; // Applied To + + // + // Presentation ... + bool showFastMa; // Show Fast + bool showSlowMa; // Show Slow + bool showRibbon; // Show Ribbon +}; + +// +// Index of Lines ... +enum ENUM_XMRB_BUFFERS +{ + // + // Main Requirements ... + XMRB_FAST_LINE = 0, + XMRB_SLOW_LINE = 1, + // + // RIBBON 1 ... + XMRB_R1_FAST_LINE = 2, + XMRB_R1_SLOW_LINE = 3, + // + // RIBBON 2 ... + XMRB_R2_FAST_LINE = 4, + XMRB_R2_SLOW_LINE = 5, + // + // RIBBON 3 ... + XMRB_R3_FAST_LINE = 6, + XMRB_R3_SLOW_LINE = 7, + // + // RIBBON 4 ... + XMRB_R4_FAST_LINE = 8, + XMRB_R4_SLOW_LINE = 9, + // + // RIBBON 5 ... + XMRB_R5_FAST_LINE = 10, + XMRB_R5_SLOW_LINE = 11, +}; + +// +// Retrieve Info Model ... +struct XMRBInfo +{ + // + // Symbol ... + string symbol; + + // + // Period ... + ENUM_TIMEFRAMES period; + + // + // Bar Time ... + datetime barTime; + + // + // Bar Index ... + int barIndex; + + // + // Values ... + double fast; + double slow; + double fastR1; + double slowR1; + double fastR2; + double slowR2; + double fastR3; + double slowR3; + double fastR4; + double slowR4; + double fastR5; + double slowR5; + + // + double fasts[]; + double slows[]; + double fastR1s[]; + double slowR1s[]; + double fastR2s[]; + double slowR2s[]; + double fastR3s[]; + double slowR3s[]; + double fastR4s[]; + double slowR4s[]; + double fastR5s[]; + double slowR5s[]; + + // + // Conditions ... + + // + bool isFastOverSlow; + bool isFastCrossedOverSlow; + bool isFastUnderSlow; + bool isFastCrossedUnderSlow; + + // + bool isR1FastOverSlow; + bool isR1FastCrossedOverSlow; + bool isR1FastUnderSlow; + bool isR1FastCrossedUnderSlow; + + // + bool isR2FastOverSlow; + bool isR2FastCrossedOverSlow; + bool isR2FastUnderSlow; + bool isR2FastCrossedUnderSlow; + + // + bool isR3FastOverSlow; + bool isR3FastCrossedOverSlow; + bool isR3FastUnderSlow; + bool isR3FastCrossedUnderSlow; + + // + bool isR4FastOverSlow; + bool isR4FastCrossedOverSlow; + bool isR4FastUnderSlow; + bool isR4FastCrossedUnderSlow; + + // + bool isR5FastOverSlow; + bool isR5FastCrossedOverSlow; + bool isR5FastUnderSlow; + bool isR5FastCrossedUnderSlow; +}; + +// +// END Definitions ... +// + +// +// START Import and Inclused requirements ... +// + +// +// Includes ... +#include "../Libraries/x-saherelm.common.lib.mq5" +#include "../Classes/x-saherelm.xhelper.class.mq5" + +// +// END Import and Inclused requirements ... +// + +// +// START Overrides ... +// + +// +// END Overrides ... +// + +// +// a Class for Helping Indicators Requirements ... +class XSCXMRBHelper : public XSCBaseHelper +{ + // + // Public ... +public: + // + // Buffers ... + double fastBuffer[]; + double slowBuffer[]; + double fastR1Buffer[]; + double slowR1Buffer[]; + double fastR2Buffer[]; + double slowR2Buffer[]; + double fastR3Buffer[]; + double slowR3Buffer[]; + double fastR4Buffer[]; + double slowR4Buffer[]; + double fastR5Buffer[]; + double slowR5Buffer[]; + + // + // Constructor ... + void XSCXMRBHelper( + string symbol, // Trading Symbol + ENUM_TIMEFRAMES period // Trading Time Frame + ) : XSCBaseHelper(symbol, period) + { + PrepareTag(); + } + + // + // Deconstructor ... + void ~XSCXMRBHelper() + { + } + + // + // START Properties ... + // + + // + // Show Fast ... + bool ShowFast( + bool show // Show or Hide + ) + { + // + bool result = false; + + // + if (mShowFastMa == show) + { + return true; + } + + // + mShowFastMa = show; + result = Init(); + + // + return result; + } + + // + // Show Slow ... + bool ShowSlow( + bool show // Show or Hide + ) + { + // + bool result = false; + + // + if (mShowSlowMa == show) + { + return true; + } + + // + mShowSlowMa = show; + result = Init(); + + // + return result; + } + + // + // Show Ribbon ... + bool ShowRibbon( + bool show // Show or Hide + ) + { + // + bool result = false; + + // + if (mShowRibbon == show) + { + return true; + } + + // + mShowRibbon = show; + result = Init(); + + // + return result; + } + + // + // END Properties ... + // + + // + // START Provided Functions ... + // + + // + // Prepare Tag ... + virtual void PrepareTag() + { + mTag = "XMRB" + GetTagPrefix(); + } + + // + virtual int GetMaxLength() + { + // + int result = -1; + + // + result = MathMax(mFast1Length, mFast2Length); + result = MathMax(result, mFast3Length); + result = MathMax(result, mFast4Length); + result = MathMax(result, mFast5Length); + + // + result = MathMax(result, mSlow1Length); + result = MathMax(result, mSlow2Length); + result = MathMax(result, mSlow3Length); + result = MathMax(result, mSlow4Length); + result = MathMax(result, mSlow5Length); + + // + return result; + } + + // + // Initial Indicator Handler ... + bool Init() + { + // + bool result = false; + + // + // Validate Inputs ... + result = + // + (mFast1Length > 2 && + mFast2Length > mFast1Length && + mFast3Length > mFast2Length && + mFast4Length > mFast3Length && + mFast5Length > mFast4Length && + mSlow1Length > mFast1Length && + mSlow2Length > mFast2Length && + mSlow3Length > mFast3Length && + mSlow4Length > mFast4Length && + mSlow5Length > mFast5Length && + mSlow2Length > mSlow1Length && + mSlow3Length > mSlow2Length && + mSlow4Length > mSlow3Length && + mSlow5Length > mSlow4Length + // + ) + // + ; + if (!result) + { + return result; + } + + // + // Initialize Handler ... + mHandler = iCustom( + // + mSymbol, + mPeriod, + "x-saherelm.x121.xmrb", + // + // Inputs ... + // + // Ribbon 1 ... + "", + mFast1Length, + mSlow1Length, + // + // Ribbon 2 ... + "", + mFast2Length, + mSlow2Length, + // + // Ribbon 3 ... + "", + mFast3Length, + mSlow3Length, + // + // Ribbon 4 ... + "", + mFast4Length, + mSlow4Length, + // + // Ribbon 5 ... + "", + mFast5Length, + mSlow5Length, + // + // Calculation ... + "", + // + // Mode ... + mRibbonMode, + // + // Applied To ... + mRibbonAppliedTo, + // + // Presentation ... + "", + // + // Show Fast ... + mShowFastMa, + // + // Show Slow ... + mShowSlowMa, + // + // Show Ribbon ... + mShowRibbon + // + ); + result = mHandler != INVALID_HANDLE; + + // + return result; + } + + // + // Retrieve Current Config ... + XMRBInputs GetConfig() + { + // + XMRBInputs result; + + // + result.fast1Length = mFast1Length; + result.slow1Length = mSlow1Length; + result.fast2Length = mFast2Length; + result.slow2Length = mSlow2Length; + result.fast3Length = mFast3Length; + result.slow3Length = mSlow3Length; + result.fast4Length = mFast4Length; + result.slow4Length = mSlow4Length; + result.fast5Length = mFast5Length; + result.slow5Length = mSlow5Length; + result.ribbonMode = mRibbonMode; + result.ribbonAppliedTo = mRibbonAppliedTo; + result.showFastMa = mShowFastMa; + result.showSlowMa = mShowSlowMa; + result.showRibbon = mShowRibbon; + + // + return result; + } + + // + // Set Config ... + bool SetConfig(XMRBInputs &config) + { + // + bool result = false; + + // + mFast1Length = config.fast1Length; + mSlow1Length = config.slow1Length; + mFast2Length = config.fast2Length; + mSlow2Length = config.slow2Length; + mFast3Length = config.fast3Length; + mSlow3Length = config.slow3Length; + mFast4Length = config.fast4Length; + mSlow4Length = config.slow4Length; + mFast5Length = config.fast5Length; + mSlow5Length = config.slow5Length; + mRibbonMode = config.ribbonMode; + mRibbonAppliedTo = config.ribbonAppliedTo; + mShowFastMa = config.showFastMa; + mShowSlowMa = config.showSlowMa; + mShowRibbon = config.showRibbon; + + // + result = Init(); + + // + return result; + } + + // + // Reading Buffers based on Given Bar Index ... + virtual void Calculate( + int barIndex // Given Bar Index + ) + { + // + // FAST ... + ArraySetAsSeries(fastBuffer, true); + CopyBuffer( + mHandler, + XMRB_FAST_LINE, + barIndex, + mLoopbackBars, + fastBuffer); + + // + // SLOW ... + ArraySetAsSeries(slowBuffer, true); + CopyBuffer( + mHandler, + XMRB_SLOW_LINE, + barIndex, + mLoopbackBars, + slowBuffer); + + // + // RIBBON 1 ... + + // + // FAST ... + ArraySetAsSeries(fastR1Buffer, true); + CopyBuffer( + mHandler, + XMRB_R1_FAST_LINE, + barIndex, + mLoopbackBars, + fastR1Buffer); + + // + // SLOW ... + ArraySetAsSeries(slowR1Buffer, true); + CopyBuffer( + mHandler, + XMRB_R1_SLOW_LINE, + barIndex, + mLoopbackBars, + slowR1Buffer); + + // + // RIBBON 2 ... + + // + // FAST ... + ArraySetAsSeries(fastR2Buffer, true); + CopyBuffer( + mHandler, + XMRB_R2_FAST_LINE, + barIndex, + mLoopbackBars, + fastR2Buffer); + + // + // SLOW ... + ArraySetAsSeries(slowR2Buffer, true); + CopyBuffer( + mHandler, + XMRB_R2_SLOW_LINE, + barIndex, + mLoopbackBars, + slowR2Buffer); + + // + // RIBBON 3 ... + + // + // FAST ... + ArraySetAsSeries(fastR3Buffer, true); + CopyBuffer( + mHandler, + XMRB_R3_FAST_LINE, + barIndex, + mLoopbackBars, + fastR3Buffer); + + // + // SLOW ... + ArraySetAsSeries(slowR3Buffer, true); + CopyBuffer( + mHandler, + XMRB_R3_SLOW_LINE, + barIndex, + mLoopbackBars, + slowR3Buffer); + + // + // RIBBON 4 ... + + // + // FAST ... + ArraySetAsSeries(fastR4Buffer, true); + CopyBuffer( + mHandler, + XMRB_R4_FAST_LINE, + barIndex, + mLoopbackBars, + fastR4Buffer); + + // + // SLOW ... + ArraySetAsSeries(slowR4Buffer, true); + CopyBuffer( + mHandler, + XMRB_R4_SLOW_LINE, + barIndex, + mLoopbackBars, + slowR4Buffer); + + // + // RIBBON 5 ... + + // + // FAST ... + ArraySetAsSeries(fastR5Buffer, true); + CopyBuffer( + mHandler, + XMRB_R5_FAST_LINE, + barIndex, + mLoopbackBars, + fastR5Buffer); + + // + // SLOW ... + ArraySetAsSeries(slowR5Buffer, true); + CopyBuffer( + mHandler, + XMRB_R5_SLOW_LINE, + barIndex, + mLoopbackBars, + slowR5Buffer); + } + + // + // Retrieve Info at Specific Bar Index ... + XMRBInfo GetInfo( + int barIndex // Given Bar Index + ) + { + // + XMRBInfo result; + + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + // Do Calculations ... + Calculate(barIndex); + + // + // Generate Candle Time ... + datetime barTime = GetCandleTime( + mSymbol, + mPeriod, + barIndex); + + // + // Fill Result ... + result.symbol = mSymbol; + result.period = mPeriod; + result.barTime = barTime; + result.barIndex = barIndex; + + // + double fast = fastBuffer[barIndex]; + double fastPrev = fastBuffer[barIndex + 1]; + double slow = slowBuffer[barIndex]; + double slowPrev = slowBuffer[barIndex + 1]; + double fastR1 = fastR1Buffer[barIndex]; + double fastR1Prev = fastR1Buffer[barIndex + 1]; + double slowR1 = slowR1Buffer[barIndex]; + double slowR1Prev = slowR1Buffer[barIndex + 1]; + double fastR2 = fastR2Buffer[barIndex]; + double fastR2Prev = fastR2Buffer[barIndex + 1]; + double slowR2 = slowR2Buffer[barIndex]; + double slowR2Prev = slowR2Buffer[barIndex + 1]; + double fastR3 = fastR3Buffer[barIndex]; + double fastR3Prev = fastR3Buffer[barIndex + 1]; + double slowR3 = slowR3Buffer[barIndex]; + double slowR3Prev = slowR3Buffer[barIndex + 1]; + double fastR4 = fastR4Buffer[barIndex]; + double fastR4Prev = fastR4Buffer[barIndex + 1]; + double slowR4 = slowR4Buffer[barIndex]; + double slowR4Prev = slowR4Buffer[barIndex + 1]; + double fastR5 = fastR5Buffer[barIndex]; + double fastR5Prev = fastR5Buffer[barIndex + 1]; + double slowR5 = slowR5Buffer[barIndex]; + double slowR5Prev = slowR5Buffer[barIndex + 1]; + + // + Copy( + fastBuffer, + result.fasts); + Copy( + slowBuffer, + result.slows); + Copy( + fastR1Buffer, + result.fastR1s); + Copy( + slowR1Buffer, + result.slowR1s); + Copy( + fastR2Buffer, + result.fastR2s); + Copy( + slowR2Buffer, + result.slowR2s); + Copy( + fastR3Buffer, + result.fastR3s); + Copy( + slowR3Buffer, + result.slowR3s); + Copy( + fastR4Buffer, + result.fastR4s); + Copy( + slowR4Buffer, + result.slowR4s); + Copy( + fastR5Buffer, + result.fastR5s); + Copy( + slowR5Buffer, + result.slowR5s); + + // + result.fast = fast; + result.slow = slow; + result.fastR1 = fastR1; + result.slowR1 = slowR1; + result.fastR2 = fastR2; + result.slowR2 = slowR2; + result.fastR3 = fastR3; + result.slowR3 = slowR3; + result.fastR4 = fastR4; + result.slowR4 = slowR4; + result.fastR5 = fastR5; + result.slowR5 = slowR5; + + // + result.isFastOverSlow = + fast > slow; + result.isFastCrossedOverSlow = + fast > slow && fastPrev <= slowPrev; + result.isFastUnderSlow = + fast < slow; + result.isFastCrossedUnderSlow = + fast < slow && fastPrev >= slowPrev; + + // + result.isR1FastOverSlow = + fastR1 > slowR1; + result.isR1FastCrossedOverSlow = + fastR1 > slowR1 && fastR1Prev <= slowR1Prev; + result.isR1FastUnderSlow = + fastR1 < slowR1; + result.isR1FastCrossedUnderSlow = + fastR1 < slowR1 && fastR1Prev >= slowR1Prev; + + // + result.isR2FastOverSlow = + fastR2 > slowR2; + result.isR2FastCrossedOverSlow = + fastR2 > slowR2 && fastR2Prev <= slowR2Prev; + result.isR2FastUnderSlow = + fastR2 < slowR2; + result.isR2FastCrossedUnderSlow = + fastR2 < slowR2 && fastR2Prev >= slowR2Prev; + + // + result.isR3FastOverSlow = + fastR3 > slowR3; + result.isR3FastCrossedOverSlow = + fastR3 > slowR3 && fastR3Prev <= slowR3Prev; + result.isR3FastUnderSlow = + fastR3 < slowR3; + result.isR3FastCrossedUnderSlow = + fastR3 < slowR3 && fastR3Prev >= slowR3Prev; + + // + result.isR4FastOverSlow = + fastR4 > slowR4; + result.isR4FastCrossedOverSlow = + fastR4 > slowR4 && fastR4Prev <= slowR4Prev; + result.isR4FastUnderSlow = + fastR4 < slowR4; + result.isR4FastCrossedUnderSlow = + fastR4 < slowR4 && fastR4Prev >= slowR4Prev; + + // + result.isR5FastOverSlow = + fastR5 > slowR5; + result.isR5FastCrossedOverSlow = + fastR5 > slowR5 && fastR5Prev <= slowR5Prev; + result.isR5FastUnderSlow = + fastR5 < slowR5; + result.isR5FastCrossedUnderSlow = + fastR5 < slowR5 && fastR5Prev >= slowR5Prev; + + // + return result; + } + + // + // END Provided Functions ... + // + + // + // Protected ... +protected: + // + // Private ... +private: + // + // Indicator Properties ... + // + // Market ... + // + // Ribbon 1 ... + int mFast1Length; + int mSlow1Length; + // + // Ribbon 2 ... + int mFast2Length; + int mSlow2Length; + // + // Ribbon 3 ... + int mFast3Length; + int mSlow3Length; + // + // Ribbon 4 ... + int mFast4Length; + int mSlow4Length; + // + // Ribbon 5 ... + int mFast5Length; + int mSlow5Length; + // + // Calculation ... + // + // Mode ... + ENUM_MA_METHOD mRibbonMode; + // + // Applied To ... + ENUM_APPLIED_PRICE mRibbonAppliedTo; + // + // Presentation ... + // + // Show Fast ... + bool mShowFastMa; + // + // Show Slow ... + bool mShowSlowMa; + // + // Show Ribbon ... + bool mShowRibbon; +}; + +// +// START Usefull Functions ... +// + +// +// END Usefull Functions ... +// diff --git a/MQLTestWorkspace/X121/Old/Helpers/x-saherelm.x121.xosc.helper.class.ex5 b/MQLTestWorkspace/X121/Old/Helpers/x-saherelm.x121.xosc.helper.class.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..e907e1adbc736c128aa3f5e9475fb540e5b64555 GIT binary patch literal 6826 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 2 && + mRviLength >= 2 && + mBullpLength >= 2 && + mBearpLength >= 2 && + mRsiLength >= 2 && + mCciLength >= 2 && + mMomentumLength >= 2 && + mSarStep > 0 && + mSarStep < mSarMaximum && + mMacdFastLength >= 2 && + mMacdSlowLength > mMacdFastLength && + mMacdSignaLength >= 2 && + mStochKLength >= 2 && + mStochDLength >= 2 && + mStochSlowing >= 2 && + mStddevLength >= 2 && + mStddevShift >= 0 + // + ; + if (!result) + { + return false; + } + + // + // Initialize Handler ... + mHandler = iCustom( + // + mSymbol, + mPeriod, + "x-saherelm.x121.xosc", + // + // Inputs ... + // + // ATR ... + "", + mAtrLength, + // + // RVI ... + "", + mRviLength, + // + // BULLPOWER ... + "", + mBullpLength, + // + // BEARPOWER ... + "", + mBearpLength, + // + // VOLUME ... + "", + mVolumeAppliedTo, + // + // RSI ... + "", + mRsiLength, + mRsiAppliedTo, + // + // CCI ... + "", + mCciLength, + mCciAppliedTo, + // + // STANDARDDEVIATION ... + "", + mStddevLength, + mStddevShift, + mStddevMethod, + mStddevAppliedTo, + // + // MOMENTUM ... + "", + mMomentumLength, + mMomentumAppliedTo, + // + // SAR ... + "", + mSarStep, + mSarMaximum, + // + // MACD ... + "", + mMacdFastLength, + mMacdSlowLength, + mMacdSignaLength, + mMacdAppliedTo, + // + // STOCHASTIC ... + "", + mStochKLength, + mStochDLength, + mStochSlowing, + mStochMaMethod, + mStochMode + // + ); + result = mHandler != INVALID_HANDLE; + + // + return result; + } + + // + // Retrieve Current Config ... + XOSCInputs GetConfig() + { + // + XOSCInputs result; + + // + result.atrLength = mAtrLength; + result.rviLength = mRviLength; + result.bullpLength = mBullpLength; + result.bearpLength = mBearpLength; + result.volumeAppliedTo = mVolumeAppliedTo; + result.rsiLength = mRsiLength; + result.rsiAppliedTo = mRsiAppliedTo; + result.cciLength = mCciLength; + result.cciAppliedTo = mCciAppliedTo; + result.momentumLength = mMomentumLength; + result.momentumAppliedTo = mMomentumAppliedTo; + result.sarStep = mSarStep; + result.sarMaximum = mSarMaximum; + result.macdFastLength = mMacdFastLength; + result.macdSlowLength = mMacdSlowLength; + result.macdSignaLength = mMacdSignaLength; + result.macdAppliedTo = mMacdAppliedTo; + result.stochKLength = mStochKLength; + result.stochDLength = mStochDLength; + result.stochSlowing = mStochSlowing; + result.stochMaMethod = mStochMaMethod; + result.stochMode = mStochMode; + result.stddevLength = mStddevLength; + result.stddevShift = mStddevShift; + result.stddevMethod = mStddevMethod; + result.stddevAppliedTo = mStddevAppliedTo; + + // + return result; + } + + // + // Set Config ... + bool SetConfig(XOSCInputs &config) + { + // + bool result = false; + + // + mAtrLength = config.atrLength; + mRviLength = config.rviLength; + mBullpLength = config.bullpLength; + mBearpLength = config.bearpLength; + mVolumeAppliedTo = config.volumeAppliedTo; + mRsiLength = config.rsiLength; + mRsiAppliedTo = config.rsiAppliedTo; + mCciLength = config.cciLength; + mCciAppliedTo = config.cciAppliedTo; + mMomentumLength = config.momentumLength; + mMomentumAppliedTo = config.momentumAppliedTo; + mSarStep = config.sarStep; + mSarMaximum = config.sarMaximum; + mMacdFastLength = config.macdFastLength; + mMacdSlowLength = config.macdSlowLength; + mMacdSignaLength = config.macdSignaLength; + mMacdAppliedTo = config.macdAppliedTo; + mStochKLength = config.stochKLength; + mStochDLength = config.stochDLength; + mStochSlowing = config.stochSlowing; + mStochMaMethod = config.stochMaMethod; + mStochMode = config.stochMode; + mStddevLength = config.stddevLength; + mStddevShift = config.stddevShift; + mStddevMethod = config.stddevMethod; + mStddevAppliedTo = config.stddevAppliedTo; + + // + result = Init(); + + // + return result; + } + + // + // Reading Buffers based on Given Bar Index ... + virtual void Calculate( + int barIndex // Given Bar Index + ) + { + // + // ATR ... + ArraySetAsSeries(atrBuffer, true); + CopyBuffer( + mHandler, + XOSC_ATR_LINE, + barIndex, + mLoopbackBars, + atrBuffer); + + // + // RVI ... + + // + // MAIN ... + ArraySetAsSeries(rviMainBuffer, true); + CopyBuffer( + mHandler, + XOSC_RVI_MAIN_LINE, + barIndex, + mLoopbackBars, + rviMainBuffer); + + // + // SIGNAL ... + ArraySetAsSeries(rviSignalBuffer, true); + CopyBuffer( + mHandler, + XOSC_RVI_SIGNAL_LINE, + barIndex, + mLoopbackBars, + rviSignalBuffer); + + // + // BULLPOWER ... + ArraySetAsSeries(bullPBuffer, true); + CopyBuffer( + mHandler, + XOSC_BULLP_LINE, + barIndex, + mLoopbackBars, + bullPBuffer); + + // + // BEARPOWER ... + ArraySetAsSeries(bearPBuffer, true); + CopyBuffer( + mHandler, + XOSC_BEARP_LINE, + barIndex, + mLoopbackBars, + bearPBuffer); + + // + // VOLUME ... + ArraySetAsSeries(volumeBuffer, true); + CopyBuffer( + mHandler, + XOSC_BEARP_LINE, + barIndex, + mLoopbackBars, + volumeBuffer); + + // + // RSI ... + ArraySetAsSeries(rsiBuffer, true); + CopyBuffer( + mHandler, + XOSC_VOLUME_LINE, + barIndex, + mLoopbackBars, + rsiBuffer); + + // + // CCI ... + ArraySetAsSeries(cciBuffer, true); + CopyBuffer( + mHandler, + XOSC_CCI_LINE, + barIndex, + mLoopbackBars, + cciBuffer); + + // + // MOMENTUM ... + ArraySetAsSeries(momentumBuffer, true); + CopyBuffer( + mHandler, + XOSC_MOMENTUM_LINE, + barIndex, + mLoopbackBars, + momentumBuffer); + + // + // SAR ... + ArraySetAsSeries(sarBuffer, true); + CopyBuffer( + mHandler, + XOSC_SAR_LINE, + barIndex, + mLoopbackBars, + sarBuffer); + + // + // MACD ... + + // + // MAIN ... + ArraySetAsSeries(macdMainBuffer, true); + CopyBuffer( + mHandler, + XOSC_MACD_MAIN_LINE, + barIndex, + mLoopbackBars, + macdMainBuffer); + + // + // SIGNAL ... + ArraySetAsSeries(macdSignalBuffer, true); + CopyBuffer( + mHandler, + XOSC_MACD_SIGNAL_LINE, + barIndex, + mLoopbackBars, + macdSignalBuffer); + + // + // STOCHASTIC ... + + // + // MAIN ... + ArraySetAsSeries(stochMainBuffer, true); + CopyBuffer( + mHandler, + XOSC_STOCH_MAIN_LINE, + barIndex, + mLoopbackBars, + stochMainBuffer); + + // + // SIGNAL ... + ArraySetAsSeries(stochSignalBuffer, true); + CopyBuffer( + mHandler, + XOSC_STOCH_SIGNAL_LINE, + barIndex, + mLoopbackBars, + stochSignalBuffer); + + // + // STANDARDDEVIATION ... + ArraySetAsSeries(stddevBuffer, true); + CopyBuffer( + mHandler, + XOSC_STDDEV_LINE, + barIndex, + mLoopbackBars, + stddevBuffer); + } + + // + // Retrieve Info at Specific Bar Index ... + XOSCInfo GetInfo( + int barIndex // Given Bar Index + ) + { + // + XOSCInfo result; + + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + // Do Calculations ... + Calculate(barIndex); + + // + // Generate Candle Time ... + datetime barTime = GetCandleTime( + mSymbol, + mPeriod, + barIndex); + + // + // Fill Result ... + result.symbol = mSymbol; + result.period = mPeriod; + result.barTime = barTime; + result.barIndex = barIndex; + + // + result.atr = atrBuffer[barIndex]; + result.rviMain = rviMainBuffer[barIndex]; + result.rviSignal = rviSignalBuffer[barIndex]; + result.bullPower = bullPBuffer[barIndex]; + result.bearPower = bearPBuffer[barIndex]; + result.volume = volumeBuffer[barIndex]; + result.rsi = rsiBuffer[barIndex]; + result.cci = cciBuffer[barIndex]; + result.momentum = momentumBuffer[barIndex]; + result.sar = sarBuffer[barIndex]; + result.macdMain = macdMainBuffer[barIndex]; + result.macdSignal = macdMainBuffer[barIndex]; + result.stochMain = stochMainBuffer[barIndex]; + result.stochSignal = stochSignalBuffer[barIndex]; + result.stddev = stddevBuffer[barIndex]; + + // + Copy( + atrBuffer, + result.atrs); + Copy( + rviMainBuffer, + result.rviMains); + Copy( + rviSignalBuffer, + result.rviSignals); + Copy( + bullPBuffer, + result.bullPs); + Copy( + bearPBuffer, + result.bearPs); + Copy( + volumeBuffer, + result.volumes); + Copy( + rsiBuffer, + result.rsis); + Copy( + cciBuffer, + result.ccis); + Copy( + momentumBuffer, + result.momentums); + Copy( + sarBuffer, + result.sars); + Copy( + macdMainBuffer, + result.macdMains); + Copy( + macdSignalBuffer, + result.macdSignals); + Copy( + stochMainBuffer, + result.stochMains); + Copy( + stochSignalBuffer, + result.stochSignals); + Copy( + stddevBuffer, + result.stddevs); + + // + return result; + } + + // + // END Provided Functions ... + // + + // + // Protected ... +protected: + // + // Private ... +private: + // + // Indicator Properties ... + // + // ATR ... + int mAtrLength; + + // + // RVI ... + int mRviLength; + + // + // BULLPOWER ... + int mBullpLength; + + // + // BEARPOWER ... + int mBearpLength; + + // + // VOLUME ... + ENUM_APPLIED_VOLUME mVolumeAppliedTo; + + // + // RSI ... + int mRsiLength; + ENUM_APPLIED_PRICE mRsiAppliedTo; + + // + // CCI ... + int mCciLength; + ENUM_APPLIED_PRICE mCciAppliedTo; + + // + // MOMENTUM ... + int mMomentumLength; + ENUM_APPLIED_PRICE mMomentumAppliedTo; + + // + // SAR ... + double mSarStep; + double mSarMaximum; + + // + // MACD ... + int mMacdFastLength; + int mMacdSlowLength; + int mMacdSignaLength; + ENUM_APPLIED_PRICE mMacdAppliedTo; + + // + // STOCHASTIC ... + int mStochKLength; + int mStochDLength; + int mStochSlowing; + ENUM_MA_METHOD mStochMaMethod; + ENUM_STO_PRICE mStochMode; + + // + // STANDARDDEVIATION ... + int mStddevLength; + int mStddevShift; + ENUM_MA_METHOD mStddevMethod; + ENUM_APPLIED_PRICE mStddevAppliedTo; +}; + +// +// START Usefull Functions ... +// + +// +// END Usefull Functions ... +// diff --git a/MQLTestWorkspace/X121/Old/Helpers/x-saherelm.x121.xpv.helper.class.ex5 b/MQLTestWorkspace/X121/Old/Helpers/x-saherelm.x121.xpv.helper.class.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..708394242b7eff7494ed4033b8bea53a8867856c GIT binary patch literal 6484 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 literal 0 HcmV?d00001 diff --git a/MQLTestWorkspace/X121/Old/Helpers/x-saherelm.x121.xpv.helper.class.mq5 b/MQLTestWorkspace/X121/Old/Helpers/x-saherelm.x121.xpv.helper.class.mq5 new file mode 100644 index 0000000..9e4914f --- /dev/null +++ b/MQLTestWorkspace/X121/Old/Helpers/x-saherelm.x121.xpv.helper.class.mq5 @@ -0,0 +1,946 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 Helper Class Library +// ---------------------------------------------- +// Name: XSCXPVHelper +// Description: provides all Indicator +// Helper requirements ... +// +// +// 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 + +// +// START Definitions ... +// + +// +// Inputs ... +struct XPVInputs +{ + // + // Makret Cycles ... + int shortLength; // Short Length + int mediumLength; // Medium Length + int longLength; // Long Length + int hindLength; // Hind Length + double fiboLevel1; // Fibio 1st Level + double fiboLevel2; // Fibio 2st Level + double fiboLevel3; // Fibio 3rd Level + + // + // Detection Modes ... + ENUM_SERIESMODE hhMode; // Highest High Calculation Method + ENUM_SERIESMODE llMode; // Lowest Low Calculation Method + + // + // Presentation ... + bool showPeaksAndVales; // Show Peaks and Vales + bool showLevels; // Show Levels + bool showFibo1Levels; // Show Fibo 1st Level + bool showFibo2Levels; // Show Fibo 2nd Level + bool showFibo3Levels; // Show Fibo 3rd Level +}; + +// +// Index of Lines ... +enum ENUM_XPV_BUFFERS +{ + // + // Main Requirements ... + XPV_PEAKS_LINE = 0, + XPV_VALES_LINE = 1, + // + XPV_RESISTANCE_LINE = 2, + XPV_RESISTANCE_STATE_LINE = 3, + // + XPV_SUPPORT_LINE = 4, + XPV_SUPPORT_STATE_LINE = 5, + // + XPV_FL1_LINE = 6, + XPV_FL2_LINE = 8, + XPV_FL3_LINE = 10, + // + // SHORT ... + XPV_SHORT_HIGH_LINE = 12, + XPV_SHORT_LOW_LINE = 13, + // + // MEDIUM ... + XPV_MEDIUM_HIGH_LINE = 14, + XPV_MEDIUM_LOW_LINE = 15, + // + // LONG ... + XPV_LONG_HIGH_LINE = 16, + XPV_LONG_LOW_LINE = 17, + // + // HIND ... + XPV_HIND_HIGH_LINE = 18, + XPV_HIND_LOW_LINE = 19, +}; + +// +// Retrieve Info Model ... +struct XPVInfo +{ + // + // Symbol ... + string symbol; + + // + // Period ... + ENUM_TIMEFRAMES period; + + // + // Bar Time ... + datetime barTime; + + // + // Bar Index ... + int barIndex; + + // + // Values ... + double peak; + double vale; + double fl1; + double fl2; + double fl3; + + // + double r; + double rState; + double s; + double sSate; + + // + // SHORT ... + double sl; + double sh; + + // + // MEDIUM ... + double ml; + double mh; + + // + // LONG ... + double ll; + double lh; + + // + // HIND ... + double hl; + double hh; + + // + double peakss[]; + double valess[]; + double fl1s[]; + double fl2s[]; + double fl3s[]; + double rs[]; + double rStates[]; + double ss[]; + double sStates[]; + double sls[]; + double shs[]; + double mls[]; + double mhs[]; + double lls[]; + double lhs[]; + double hls[]; + double hhs[]; + + // + // Conditions ... + + // + // Determines New Peaks Happens ... + bool isNewPeak; + + // + // Determines New Vales Happens ... + bool isNewVale; +}; + +// +// END Definitions ... +// + +// +// START Import and Inclused requirements ... +// + +// +// Includes ... +#include "../Libraries/x-saherelm.common.lib.mq5" +#include "../Classes/x-saherelm.xhelper.class.mq5" + +// +// END Import and Inclused requirements ... +// + +// +// START Overrides ... +// + +// +// END Overrides ... +// + +// +// a Class for Helping Indicators Requirements ... +class XSCXPVHelper : public XSCBaseHelper +{ + // + // Public ... +public: + // + // Buffers ... + double peaksBuffer[]; + double valesBuffer[]; + double fl1Buffer[]; + double fl2Buffer[]; + double fl3Buffer[]; + + // + // Support and Resistance ... + double rBuffer[]; + double rStateBuffer[]; + + // + double sBuffer[]; + double sStateBuffer[]; + + // + // SHORT ... + double slBuffer[]; + double shBuffer[]; + + // + // MEDIUM ... + double mlBuffer[]; + double mhBuffer[]; + + // + // LONG ... + double llBuffer[]; + double lhBuffer[]; + + // + // HIND ... + double hlBuffer[]; + double hhBuffer[]; + + // + // Constructor ... + void XSCXPVHelper( + string symbol, // Trading Symbol + ENUM_TIMEFRAMES period // Trading Time Frame + ) : XSCBaseHelper(symbol, period) + { + PrepareTag(); + } + + // + // Deconstructor ... + void ~XSCXPVHelper() + { + } + + // + // START Properties ... + // + + // + // Show Levels ... + bool ShowLevels( + bool show // Show or Hide Levels + ) + { + // + bool result = false; + + // + if (mShowLevels == show) + { + return true; + } + + // + mShowLevels = show; + result = Init(); + + // + return result; + } + + // + // Show Peaks and Vales ... + bool ShowPeaksAnVales( + bool show // Show or Hide Levels + ) + { + // + bool result = false; + + // + if (mShowPeaksAndVales == show) + { + return true; + } + + // + mShowPeaksAndVales = show; + result = Init(); + + // + return result; + } + + // + // Show Fibo 1st Level ... + bool ShowFibo1Levels( + bool show // Show or Hide Levels + ) + { + // + bool result = false; + + // + if (mShowFibo1Levels == show) + { + return true; + } + + // + mShowFibo1Levels = show; + result = Init(); + + // + return result; + } + + // + // Show Fibo 2nd Level ... + bool ShowFibo2Levels( + bool show // Show or Hide Levels + ) + { + // + bool result = false; + + // + if (mShowFibo2Levels == show) + { + return true; + } + + // + mShowFibo2Levels = show; + result = Init(); + + // + return result; + } + + // + // Show Fibo 3rd Level ... + bool ShowFibo3Levels( + bool show // Show or Hide Levels + ) + { + // + bool result = false; + + // + if (mShowFibo3Levels == show) + { + return true; + } + + // + mShowFibo3Levels = show; + result = Init(); + + // + return result; + } + + // + // END Properties ... + // + + // + // START Provided Functions ... + // + + // + // Prepare Tag ... + virtual void PrepareTag() + { + mTag = "XPV" + GetTagPrefix(); + } + + // + virtual int GetMaxLength() + { + // + int result = -1; + + // + result = MathMax(mShortLength, mMediumLength); + result = MathMax(result, mLongLength); + result = MathMax(result, mHindLength); + + // + return result; + } + + // + // Initial Indicator Handler ... + bool Init() + { + // + bool result = false; + + // + // Validate Args ... + result = + // + (mShortLength > 2 && + mMediumLength > mShortLength && + mLongLength > mMediumLength && + mHindLength > mLongLength) + // + ; + if (!result) + { + return false; + } + + // + // Initialize Handler ... + mHandler = iCustom( + // + mSymbol, + mPeriod, + "x-saherelm.x121.xpv", + // + // Inputs ... + // + // Market ... + "", + // + // Short Length ... + mShortLength, + // + // Medium Length + mMediumLength, + // + // Long Length ... + mLongLength, + // + // Hind Length ... + mHindLength, + // + // Fibio 1st Level ... + mFiboLevel1, + // + // Fibio 2st Level ... + mFiboLevel2, + // + // Fibio 3rd Level ... + mFiboLevel3, + // + // Detection Mode ... + "", + // + // Highest High Calculation Method ... + mHHMode, + // + // Lowest Low Calculation Method ... + mLLMode, + // + // Presentations ... + "", + // + // Show Peaks and Vales ... + mShowPeaksAndVales, + // + // Show Levels ... + mShowLevels, + // + // Show Fibo 1st Level ... + mShowFibo1Levels, + // + // Show Fibo 2nd Level ... + mShowFibo2Levels, + // + // Show Fibo 3rd Level ... + mShowFibo3Levels + // + ); + result = mHandler != INVALID_HANDLE; + + // + return result; + } + + // + // Retrieve Current Config ... + XPVInputs GetConfig() + { + // + XPVInputs result; + + // + result.shortLength = mShortLength; + result.mediumLength = mMediumLength; + result.longLength = mLongLength; + result.hindLength = mHindLength; + result.fiboLevel1 = mFiboLevel1; + result.fiboLevel2 = mFiboLevel2; + result.fiboLevel3 = mFiboLevel3; + result.hhMode = mHHMode; + result.llMode = mLLMode; + result.showPeaksAndVales = mShowPeaksAndVales; + result.showLevels = mShowLevels; + result.showFibo1Levels = mShowFibo1Levels; + result.showFibo2Levels = mShowFibo2Levels; + result.showFibo3Levels = mShowFibo3Levels; + + // + return result; + } + + // + // Set Config ... + bool SetConfig(XPVInputs &config) + { + // + bool result = false; + + // + mShortLength = config.shortLength; + mMediumLength = config.mediumLength; + mLongLength = config.longLength; + mHindLength = config.hindLength; + mFiboLevel1 = config.fiboLevel1; + mFiboLevel2 = config.fiboLevel2; + mFiboLevel3 = config.fiboLevel3; + mHHMode = config.hhMode; + mLLMode = config.llMode; + mShowPeaksAndVales = config.showPeaksAndVales; + mShowLevels = config.showLevels; + mShowFibo1Levels = config.showFibo1Levels; + mShowFibo2Levels = config.showFibo2Levels; + mShowFibo3Levels = config.showFibo3Levels; + + // + result = Init(); + + // + return result; + } + + // + // Reading Buffers based on Given Bar Index ... + virtual void Calculate( + int barIndex // Given Bar Index + ) + { + // + // PEAKS ... + ArraySetAsSeries(peaksBuffer, true); + CopyBuffer( + mHandler, + XPV_PEAKS_LINE, + barIndex, + mLoopbackBars, + peaksBuffer); + + // + // VALES ... + ArraySetAsSeries(valesBuffer, true); + CopyBuffer( + mHandler, + XPV_VALES_LINE, + barIndex, + mLoopbackBars, + valesBuffer); + + // + // FIBBO LEVELS ... + + // + // LEVEL 1 ... + ArraySetAsSeries(fl1Buffer, true); + CopyBuffer( + mHandler, + XPV_FL1_LINE, + barIndex, + mLoopbackBars, + fl1Buffer); + + // + // LEVEL 2 ... + ArraySetAsSeries(fl2Buffer, true); + CopyBuffer( + mHandler, + XPV_FL2_LINE, + barIndex, + mLoopbackBars, + fl2Buffer); + + // + // LEVEL 3 ... + ArraySetAsSeries(fl3Buffer, true); + CopyBuffer( + mHandler, + XPV_FL3_LINE, + barIndex, + mLoopbackBars, + fl3Buffer); + + // + // Support and Resistance ... + + // + // Resistance ... + ArraySetAsSeries(rBuffer, true); + ArraySetAsSeries(rStateBuffer, true); + CopyBuffer( + mHandler, + XPV_RESISTANCE_LINE, + barIndex, + mLoopbackBars, + rBuffer); + CopyBuffer( + mHandler, + XPV_RESISTANCE_STATE_LINE, + barIndex, + mLoopbackBars, + rStateBuffer); + + // + // Support ... + ArraySetAsSeries(sBuffer, true); + ArraySetAsSeries(sStateBuffer, true); + CopyBuffer( + mHandler, + XPV_SUPPORT_LINE, + barIndex, + mLoopbackBars, + sBuffer); + CopyBuffer( + mHandler, + XPV_SUPPORT_STATE_LINE, + barIndex, + mLoopbackBars, + sStateBuffer); + + // + // CYCLES ... + + // + // SHORT ... + + // + // HIGH ... + ArraySetAsSeries(shBuffer, true); + CopyBuffer( + mHandler, + XPV_SHORT_HIGH_LINE, + barIndex, + mLoopbackBars, + shBuffer); + + // + // LOW ... + ArraySetAsSeries(slBuffer, true); + CopyBuffer( + mHandler, + XPV_SHORT_LOW_LINE, + barIndex, + mLoopbackBars, + slBuffer); + + // + // MEDIUM ... + + // + // HIGH ... + ArraySetAsSeries(mhBuffer, true); + CopyBuffer( + mHandler, + XPV_MEDIUM_HIGH_LINE, + barIndex, + mLoopbackBars, + mhBuffer); + + // + // LOW ... + ArraySetAsSeries(mlBuffer, true); + CopyBuffer( + mHandler, + XPV_MEDIUM_LOW_LINE, + barIndex, + mLoopbackBars, + mlBuffer); + + // + // LONG ... + + // + // HIGH ... + ArraySetAsSeries(lhBuffer, true); + CopyBuffer( + mHandler, + XPV_LONG_HIGH_LINE, + barIndex, + mLoopbackBars, + lhBuffer); + + // + // LOW ... + ArraySetAsSeries(llBuffer, true); + CopyBuffer( + mHandler, + XPV_LONG_LOW_LINE, + barIndex, + mLoopbackBars, + llBuffer); + + // + // HIND ... + + // + // HIGH ... + ArraySetAsSeries(hhBuffer, true); + CopyBuffer( + mHandler, + XPV_HIND_HIGH_LINE, + barIndex, + mLoopbackBars, + hhBuffer); + + // + // LOW ... + ArraySetAsSeries(hlBuffer, true); + CopyBuffer( + mHandler, + XPV_HIND_LOW_LINE, + barIndex, + mLoopbackBars, + hlBuffer); + } + + // + // Retrieve Info at Specific Bar Index ... + XPVInfo GetInfo( + int barIndex // Given Bar Index + ) + { + // + XPVInfo result; + + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + // Do Calculations ... + Calculate(barIndex); + + // + // Generate Candle Time ... + datetime barTime = GetCandleTime( + mSymbol, + mPeriod, + barIndex); + + // + // Fill Result ... + result.symbol = mSymbol; + result.period = mPeriod; + result.barTime = barTime; + result.barIndex = barIndex; + + // + result.peak = peaksBuffer[barIndex]; + result.vale = valesBuffer[barIndex]; + result.fl1 = fl1Buffer[barIndex]; + result.fl2 = fl2Buffer[barIndex]; + result.fl3 = fl3Buffer[barIndex]; + + // + result.r = rBuffer[barIndex]; + result.rState = rStateBuffer[barIndex]; + result.s = sBuffer[barIndex]; + result.sSate = sStateBuffer[barIndex]; + + // + // SHORT ... + result.sl = slBuffer[barIndex]; + result.sh = shBuffer[barIndex]; + + // + // MEDIUM ... + result.ml = mlBuffer[barIndex]; + result.mh = mhBuffer[barIndex]; + + // + // LONG ... + result.ll = llBuffer[barIndex]; + result.lh = lhBuffer[barIndex]; + + // + // HIND ... + result.hl = hlBuffer[barIndex]; + result.hh = hhBuffer[barIndex]; + + // + Copy( + peaksBuffer, + result.peakss); + Copy( + valesBuffer, + result.valess); + Copy( + fl1Buffer, + result.fl1s); + Copy( + fl2Buffer, + result.fl2s); + Copy( + fl3Buffer, + result.fl3s); + Copy( + rBuffer, + result.rs); + Copy( + rStateBuffer, + result.rStates); + Copy( + sBuffer, + result.ss); + Copy( + sStateBuffer, + result.sStates); + Copy( + slBuffer, + result.sls); + Copy( + shBuffer, + result.shs); + Copy( + mlBuffer, + result.mls); + Copy( + mhBuffer, + result.mhs); + Copy( + llBuffer, + result.lls); + Copy( + lhBuffer, + result.lhs); + Copy( + hlBuffer, + result.hls); + Copy( + hhBuffer, + result.hhs); + + // + result.isNewPeak = + peaksBuffer[barIndex] != peaksBuffer[barIndex + 1]; + result.isNewVale = + valesBuffer[barIndex] != valesBuffer[barIndex + 1]; + + // + return result; + } + + // + // END Provided Functions ... + // + + // + // Protected ... +protected: + // + // Private ... +private: + // + // Indicator Properties ... + // + // Market ... + // + // Short Length ... + int mShortLength; + // + // Medium Length + int mMediumLength; + // + // Long Length ... + int mLongLength; + // + // Hind Length ... + int mHindLength; + // + // Fibio 1st Level ... + double mFiboLevel1; + // + // Fibio 2st Level ... + double mFiboLevel2; + // + // Fibio 3rd Level ... + double mFiboLevel3; + // + // Detection Mode ... + // + // Highest High Calculation Method ... + ENUM_SERIESMODE mHHMode; + // + // Lowest Low Calculation Method ... + ENUM_SERIESMODE mLLMode; + // + // Presentations ... + // + // Show Peaks and Vales ... + bool mShowPeaksAndVales; + // + // Show Levels ... + bool mShowLevels; + // + // Show Fibo 1st Level ... + bool mShowFibo1Levels; + // + // Show Fibo 2nd Level ... + bool mShowFibo2Levels; + // + // Show Fibo 3rd Level ... + bool mShowFibo3Levels; +}; + +// +// START Usefull Functions ... +// + +// +// END Usefull Functions ... +// diff --git a/MQLTestWorkspace/X121/Old/Helpers/x-saherelm.x121.xsslc.helper.class.ex5 b/MQLTestWorkspace/X121/Old/Helpers/x-saherelm.x121.xsslc.helper.class.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..1a86e325215b583eb652f9a7362d394c6a738d6c GIT binary patch literal 6022 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 literal 0 HcmV?d00001 diff --git a/MQLTestWorkspace/X121/Old/Helpers/x-saherelm.x121.xsslc.helper.class.mq5 b/MQLTestWorkspace/X121/Old/Helpers/x-saherelm.x121.xsslc.helper.class.mq5 new file mode 100644 index 0000000..7fd81db --- /dev/null +++ b/MQLTestWorkspace/X121/Old/Helpers/x-saherelm.x121.xsslc.helper.class.mq5 @@ -0,0 +1,481 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 Helper Class Library +// ---------------------------------------------- +// Name: XSCXSSLCHelper +// Description: provides all Indicator +// Helper requirements ... +// +// +// 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 + +// +// START Definitions ... +// + +// +// Inputs ... +struct XSSLCInputs +{ + // + // Market ... + int length; // Length + + // + // Calculation ... + ENUM_MA_METHOD method; // Method + ENUM_APPLIED_PRICE upAppliedTo; // Up Applied To + ENUM_APPLIED_PRICE downAppliedTo; // Down Applied To + + // + // Presentation ... + bool showUp; // Show Up + bool showDown; // Show Down +}; + +// +// Index of Lines ... +enum ENUM_XSSLC_BUFFERS +{ + // + // Main Requirements ... + XSSLC_UP_LINE = 0, + XSSLC_DOWN_LINE = 1, +}; + +// +// Retrieve Info Model ... +struct XSSLCInfo +{ + // + // Symbol ... + string symbol; + + // + // Period ... + ENUM_TIMEFRAMES period; + + // + // Bar Time ... + datetime barTime; + + // + // Bar Index ... + int barIndex; + + // + // Values ... + double up; + double down; + + // + double ups[]; + double downs[]; + + // + // Conditions ... + + // + // Detect Trend is Bullish or not ... + bool isBullish; + + // + // Detect Trend is Switched to Bullish Or not ... + bool isSwitchedBullish; + + // + // Detect Trend is Bearish or not ... + bool isBearish; + + // + // Detect Trend is Switched to Bearish Or not ... + bool isSwitchedBearish; +}; + +// +// END Definitions ... +// + +// +// START Import and Inclused requirements ... +// + +// +// Includes ... +#include "../Libraries/x-saherelm.common.lib.mq5" +#include "../Classes/x-saherelm.xhelper.class.mq5" + +// +// END Import and Inclused requirements ... +// + +// +// START Overrides ... +// + +// +// END Overrides ... +// + +// +// a Class for Helping Indicators Requirements ... +class XSCXSSLCHelper : public XSCBaseHelper +{ + // + // Public ... +public: + // + // Buffers ... + double upBuffer[]; + double downBuffer[]; + + // + // Constructor ... + void XSCXSSLCHelper( + string symbol, // Trading Symbol + ENUM_TIMEFRAMES period // Trading Time Frame + ) : XSCBaseHelper(symbol, period) + { + PrepareTag(); + } + + // + // Deconstructor ... + void ~XSCXSSLCHelper() + { + } + + // + // START Properties ... + // + + // + // Show Up ... + bool ShowUp( + bool show // Show or Hide Line + ) + { + // + bool result = false; + + // + if (mShowUp == show) + { + return true; + } + + // + mShowUp = show; + result = Init(); + + // + return result; + } + + // + // Show Down ... + bool ShowDown( + bool show // Show or Hide Line + ) + { + // + bool result = false; + + // + if (mShowDown == show) + { + return true; + } + + // + mShowDown = show; + result = Init(); + + // + return result; + } + + // + // END Properties ... + // + + // + // START Provided Functions ... + // + + // + // Prepare Tag ... + virtual void PrepareTag() + { + mTag = "XSSLC" + GetTagPrefix(); + } + + // + virtual int GetMaxLength() + { + // + int result = -1; + + // + result = mLength; + + // + return result; + } + + // + // Initial Indicator Handler ... + bool Init() + { + // + bool result = false; + + // + // Validate Args ... + result = + // + (mLength >= 2) + // + ; + if (!result) + { + return false; + } + + // + // Initialize Handler ... + mHandler = iCustom( + // + mSymbol, + mPeriod, + "x-saherelm.x121.xsslc", + // + // Inputs ... + // + // Market ... + "", + // + // Length ... + mLength, + // + // Calculation ... + "", + // + // Method ... + mMethod, + // + // Up Applied To ... + mUpAppliedTo, + // + // Down Applied To ... + mDownAppliedTo, + // + // Presentation ... + "", + // + // Show Up ... + mShowUp, + // + // Show Down ... + mShowDown + // + ); + result = mHandler != INVALID_HANDLE; + + // + return result; + } + + // + // Retrieve Current Config ... + XSSLCInputs GetConfig() + { + // + XSSLCInputs result; + + // + result.length = mLength; + result.method = mMethod; + result.upAppliedTo = mUpAppliedTo; + result.downAppliedTo = mDownAppliedTo; + result.showUp = mShowUp; + result.showDown = mShowDown; + + // + return result; + } + + // + // Set Config ... + bool SetConfig(XSSLCInputs &config) + { + // + bool result = false; + + // + mLength = config.length; + mMethod = config.method; + mUpAppliedTo = config.upAppliedTo; + mDownAppliedTo = config.downAppliedTo; + mShowUp = config.showUp; + mShowDown = config.showDown; + + // + result = Init(); + + // + return result; + } + + // + // Reading Buffers based on Given Bar Index ... + virtual void Calculate( + int barIndex // Given Bar Index + ) + { + // + // UP ... + ArraySetAsSeries(upBuffer, true); + CopyBuffer( + mHandler, + XSSLC_UP_LINE, + barIndex, + mLoopbackBars, + upBuffer); + + // + // DOWN ... + ArraySetAsSeries(downBuffer, true); + CopyBuffer( + mHandler, + XSSLC_DOWN_LINE, + barIndex, + mLoopbackBars, + downBuffer); + } + + // + // Retrieve Info at Specific Bar Index ... + XSSLCInfo GetInfo( + int barIndex // Given Bar Index + ) + { + // + XSSLCInfo result; + + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + // Do Calculations ... + Calculate(barIndex); + + // + // Generate Candle Time ... + datetime barTime = GetCandleTime( + mSymbol, + mPeriod, + barIndex); + + // + // Fill Result ... + result.symbol = mSymbol; + result.period = mPeriod; + result.barTime = barTime; + result.barIndex = barIndex; + + // + double up = upBuffer[barIndex]; + double upPrev = upBuffer[barIndex + 1]; + double down = downBuffer[barIndex]; + double downPrev = downBuffer[barIndex + 1]; + + // + Copy( + upBuffer, + result.ups + ); + Copy( + downBuffer, + result.downs + ); + + // + result.up = up; + result.down = down; + + // + result.isBullish = up > down; + result.isBearish = up < down; + + // + result.isSwitchedBullish = + up > down && + upPrev <= downPrev; + result.isSwitchedBearish = + up < down && + upPrev >= downPrev; + + // + return result; + } + + // + // END Provided Functions ... + // + + // + // Protected ... +protected: + // + // Private ... +private: + // + // Indicator Properties ... + // + // Market ... + // + // Length ... + int mLength; + // + // Calculation ... + // + // Method ... + ENUM_MA_METHOD mMethod; + // + // Up Applied To ... + ENUM_APPLIED_PRICE mUpAppliedTo; + // + // Down Applied To ... + ENUM_APPLIED_PRICE mDownAppliedTo; + // + // Presentation ... + // + // Show Up ... + bool mShowUp; + // + // Show Down ... + bool mShowDown; +}; + +// +// START Usefull Functions ... +// + +// +// END Usefull Functions ... +// diff --git a/MQLTestWorkspace/X121/Old/Helpers/x-saherelm.x121.xstr.helper.class.ex5 b/MQLTestWorkspace/X121/Old/Helpers/x-saherelm.x121.xstr.helper.class.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..62837360a86222922937d16c7bda70284a5a96b9 GIT binary patch literal 6390 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 literal 0 HcmV?d00001 diff --git a/MQLTestWorkspace/X121/Old/Helpers/x-saherelm.x121.xstr.helper.class.mq5 b/MQLTestWorkspace/X121/Old/Helpers/x-saherelm.x121.xstr.helper.class.mq5 new file mode 100644 index 0000000..72b7f90 --- /dev/null +++ b/MQLTestWorkspace/X121/Old/Helpers/x-saherelm.x121.xstr.helper.class.mq5 @@ -0,0 +1,473 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 Helper Class Library +// ---------------------------------------------- +// Name: XSCXSTRHelper +// Description: provides all Indicator +// Helper requirements ... +// +// +// 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 + +// +// START Definitions ... +// + +// +// Inputs ... +struct XSTRInputs +{ + // + // Market ... + // + // Length ... + int atrLength; + // + // Multiplier ... + double atrMultiplier; + // + // Applied To ... + ENUM_APPLIED_PRICE atrAppliedTo; + + // + // Presentation ... + // + // Show Trends ... + bool showTrends; + // + // Fill Trends ... + bool fillTrends; +}; + +// +// Index of Lines ... +enum ENUM_XSTR_BUFFERS +{ + // + // Main Requirements ... + XSTR_LINE = 2, + XSTR_TREND_LINE = 5 +}; + +// +// Trend State ... +enum ENUM_XSTR_TREND +{ + XSTR_BULLISH = 1, + XSTR_BEARISH = -1 +}; + +// +// Retrieve Info Model ... +struct XSTRInfo +{ + // + // Symbol ... + string symbol; + + // + // Period ... + ENUM_TIMEFRAMES period; + + // + // Bar Time ... + datetime barTime; + + // + // Bar Index ... + int barIndex; + + // + // Values ... + double main; + ENUM_XSTR_TREND trend; + + // + double mains[]; + double trends[]; + + // + // Conditions ... + bool isTrendBullish; + bool isTrendBearish; + bool isTrendSwitchedToBullish; + bool isTrendSwitchedToBearish; +}; + +// +// END Definitions ... +// + +// +// START Import and Inclused requirements ... +// + +// +// Includes ... +#include "../Libraries/x-saherelm.common.lib.mq5" +#include "../Classes/x-saherelm.xhelper.class.mq5" + +// +// END Import and Inclused requirements ... +// + +// +// START Overrides ... +// + +// +// END Overrides ... +// + +// +// a Class for Helping Indicators Requirements ... +class XSCXSTRHelper : public XSCBaseHelper +{ + // + // Public ... +public: + // + // Buffers ... + double mainBuffer[]; + double trendBuffer[]; + + // + // Constructor ... + void XSCXSTRHelper( + string symbol, // Trading Symbol + ENUM_TIMEFRAMES period // Trading Time Frame + ) : XSCBaseHelper(symbol, period) + { + PrepareTag(); + } + + // + // Deconstructor ... + void ~XSCXSTRHelper() + { + } + + // + // START Properties ... + // + + // + // END Properties ... + // + + // + // START Provided Functions ... + // + + // + // Prepare Tag ... + virtual void PrepareTag() + { + mTag = "XSTR" + GetTagPrefix(); + } + + // + virtual int GetMaxLength() + { + // + int result = -1; + + // + result = mAtrLength; + + // + return result; + } + + // + // Initial Indicator Handler ... + bool Init() + { + // + bool result = false; + + // + // Validate Args ... + result = + // + (mAtrLength >= 2 && + mAtrMultiplier >= 0) + // + ; + if (!result) + { + return false; + } + + // + // Initialize Handler ... + mHandler = iCustom( + // + mSymbol, + mPeriod, + "x-saherelm.x121.xstr", + // + // Inputs ... + // + // Makret ... + "", + // + // Length ... + mAtrLength, + // + // Multiplier ... + mAtrMultiplier, + // + // Applied To ... + mAtrAppliedTo, + // + // Presentation ... + "", + // + // Show Trends ... + mShowTrends, + // + // Fill Trends ... + mFillTrends); + result = mHandler != INVALID_HANDLE; + + // + return result; + } + + // + // Retrieve Current Config ... + XSTRInputs GetConfig() + { + // + XSTRInputs result; + + // + result.atrLength = mAtrLength; + result.atrMultiplier = mAtrMultiplier; + result.atrAppliedTo = mAtrAppliedTo; + result.showTrends = mShowTrends; + result.fillTrends = mFillTrends; + + // + return result; + } + + // + // Set Config ... + bool SetConfig(XSTRInputs &config) + { + // + bool result = false; + + // + mAtrLength = config.atrLength; + mAtrMultiplier = config.atrMultiplier; + mAtrAppliedTo = config.atrAppliedTo; + mShowTrends = config.showTrends; + mFillTrends = config.fillTrends; + + // + result = Init(); + + // + return result; + } + + // + // Show Trends ... + bool ShowTrends( + bool show // Show or Hide + ) + { + // + bool result = false; + + // + if (mShowTrends == show) + { + return true; + } + + // + mShowTrends = show; + result = Init(); + + // + return result; + } + + // + // Fill Trends ... + bool FillTrends( + bool show // Show or Hide + ) + { + // + bool result = false; + + // + if (mFillTrends == show) + { + return true; + } + + // + mFillTrends = show; + result = Init(); + + // + return result; + } + + // + // Reading Buffers based on Given Bar Index ... + virtual void Calculate( + int barIndex // Given Bar Index + ) + { + // + // MAIN ... + ArraySetAsSeries(mainBuffer, true); + CopyBuffer( + mHandler, + XSTR_LINE, + barIndex, + mLoopbackBars, + mainBuffer); + + // + // TREND ... + ArraySetAsSeries(trendBuffer, true); + CopyBuffer( + mHandler, + XSTR_TREND_LINE, + barIndex, + mLoopbackBars, + trendBuffer); + } + + // + // Retrieve Info at Specific Bar Index ... + XSTRInfo GetInfo( + int barIndex // Given Bar Index + ) + { + // + XSTRInfo result; + + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + // Do Calculations ... + Calculate(barIndex); + + // + // Generate Candle Time ... + datetime barTime = GetCandleTime( + mSymbol, + mPeriod, + barIndex); + + // + // Fill Result ... + result.symbol = mSymbol; + result.period = mPeriod; + result.barTime = barTime; + result.barIndex = barIndex; + + // + double main = mainBuffer[barIndex]; + ENUM_XSTR_TREND trend = (ENUM_XSTR_TREND)trendBuffer[barIndex]; + ENUM_XSTR_TREND trendPrev = (ENUM_XSTR_TREND)trendBuffer[barIndex + 1]; + + // + Copy( + mainBuffer, + result.mains); + Copy( + trendBuffer, + result.trends); + + // + result.main = main; + result.trend = trend; + + // + result.isTrendBullish = + trend == XSTR_BULLISH; + + // + result.isTrendBearish = + trend == XSTR_BEARISH; + + // + result.isTrendSwitchedToBullish = + trend == XSTR_BULLISH && + trendPrev != XSTR_BULLISH; + + // + result.isTrendSwitchedToBearish = + trend == XSTR_BEARISH && + trendPrev != XSTR_BEARISH; + + // + return result; + } + + // + // END Provided Functions ... + // + + // + // Protected ... +protected: + // + // Private ... +private: + // + // Indicator Properties ... + // + // Market ... + // + // Length ... + int mAtrLength; + // + // Multiplier ... + double mAtrMultiplier; + // + // Applied To ... + ENUM_APPLIED_PRICE mAtrAppliedTo; + + // + // Presentation ... + // + // Show Trends ... + bool mShowTrends; + // + // Fill Trends ... + bool mFillTrends; +}; + +// +// START Usefull Functions ... +// + +// +// END Usefull Functions ... +// diff --git a/MQLTestWorkspace/X121/Old/Helpers/x-saherelm.x121.xtm.helper.class.ex5 b/MQLTestWorkspace/X121/Old/Helpers/x-saherelm.x121.xtm.helper.class.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..c2f511bcdc0fe00905f3c413f7c7fb0f13aab718 GIT binary patch literal 6604 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 literal 0 HcmV?d00001 diff --git a/MQLTestWorkspace/X121/Old/Helpers/x-saherelm.x121.xtm.helper.class.mq5 b/MQLTestWorkspace/X121/Old/Helpers/x-saherelm.x121.xtm.helper.class.mq5 new file mode 100644 index 0000000..3587529 --- /dev/null +++ b/MQLTestWorkspace/X121/Old/Helpers/x-saherelm.x121.xtm.helper.class.mq5 @@ -0,0 +1,445 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 Helper Class Library +// ---------------------------------------------- +// Name: XSCXTMHelper +// Description: provides all Indicator +// Helper requirements ... +// +// +// 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 + +// +// START Definitions ... +// + +// +// Inputs ... +struct XTMInputs +{ + // + // Makret ... + int length; // Length + int shift; // Shift + + // + // Calculations ... + ENUM_MA_METHOD method; // Method + ENUM_APPLIED_PRICE appliedTo; // Applied To + + // + // Presentation ... + bool showLine; // Show Line +}; + +// +// Index of Lines ... +enum ENUM_XTM_BUFFERS +{ + // + // Main Requirements ... + XTM_LINE = 0, + XTM_STATE_LINE = 1, +}; + +// +// XTM Indicator States ... +enum ENUM_XTM_STATES +{ + X_XTM_BULLISH = 0, + X_XTM_BEARISH = 2, + X_XTM_NEUTURAL = 1, +}; + +// +// Retrieve Info Model ... +struct XTMInfo +{ + // + // Symbol ... + string symbol; + + // + // Period ... + ENUM_TIMEFRAMES period; + + // + // Bar Time ... + datetime barTime; + + // + // Bar Index ... + int barIndex; + + // + // Values ... + double value; + + // + // State ... + ENUM_XTM_STATES state; + + // + double values[]; + double states[]; + + // + // Conditions ... + + // + // Detect Trend is Bullish or not ... + bool isBullish; + + // + // Detect Trend is Switched to Bullish Or not ... + bool isSwitchedBullish; + + // + // Detect Trend is Bearish or not ... + bool isBearish; + + // + // Detect Trend is Switched to Bearish Or not ... + bool isSwitchedBearish; + + // + // Detect Trend is Neutural or not ... + bool isNeutural; + + // + // Detect Trend is Switched to Neutural Or not ... + bool isSwitchedNeutural; +}; + +// +// END Definitions ... +// + +// +// START Import and Inclused requirements ... +// + +// +// Includes ... +#include "../Libraries/x-saherelm.common.lib.mq5" +#include "../Classes/x-saherelm.xhelper.class.mq5" + +// +// END Import and Inclused requirements ... +// + +// +// START Overrides ... +// + +// +// END Overrides ... +// + +// +// a Class for Helping Indicators Requirements ... +class XSCXTMHelper : public XSCBaseHelper +{ + // + // Public ... +public: + // + // Buffers ... + double valueBuffer[]; + double stateBuffer[]; + + // + // Constructor ... + void XSCXTMHelper( + string symbol, // Trading Symbol + ENUM_TIMEFRAMES period // Trading Time Frame + ) : XSCBaseHelper(symbol, period) + { + PrepareTag(); + } + + // + // Deconstructor ... + void ~XSCXTMHelper() + { + } + + // + // START Properties ... + // + + // + // END Properties ... + // + + // + // START Provided Functions ... + // + + // + // Prepare Tag ... + virtual void PrepareTag() + { + mTag = "XTM" + GetTagPrefix(); + } + + // + virtual int GetMaxLength() + { + // + int result = -1; + + // + result = mLength; + + // + return result; + } + + // + // Initial Indicator Handler ... + bool Init() + { + // + bool result = false; + + // + // Validate Args ... + result = + // + (mLength >= 2) + // + ; + if (!result) + { + return false; + } + + // + // Initialize Handler ... + mHandler = iCustom( + // + mSymbol, + mPeriod, + "x-saherelm.x121.xtm", + // + // Inputs ... + // + // Makret ... + "", + // + // Length ... + mLength, + // + // Shift ... + mShift, + // + // Calculations ... + "", + // + // Method ... + mMethod, + // + // Applied To ... + mAppliedTo, + // + // Presentation ... + "", + // + // Show Line ... + mShowLine + // + ); + result = mHandler != INVALID_HANDLE; + + // + return result; + } + + // + // Retrieve Current Config ... + XTMInputs GetConfig() + { + // + XTMInputs result; + + // + result.length = mLength; + result.shift = mShift; + result.method = mMethod; + result.appliedTo = mAppliedTo; + result.showLine = mShowLine; + + // + return result; + } + + // + // Set Config ... + bool SetConfig(XTMInputs &config) + { + // + bool result = false; + + // + mLength = config.length; + mShift = config.shift; + mMethod = config.method; + mAppliedTo = config.appliedTo; + mShowLine = config.showLine; + + // + result = Init(); + + // + return result; + } + + // + // Reading Buffers based on Given Bar Index ... + virtual void Calculate( + int barIndex // Given Bar Index + ) + { + // + // VALUE ... + ArraySetAsSeries(valueBuffer, true); + CopyBuffer( + mHandler, + XTM_LINE, + barIndex, + mLoopbackBars, + valueBuffer); + + // + // STATE ... + ArraySetAsSeries(stateBuffer, true); + CopyBuffer( + mHandler, + XTM_STATE_LINE, + barIndex, + mLoopbackBars, + stateBuffer); + } + + // + // Retrieve Info at Specific Bar Index ... + XTMInfo GetInfo( + int barIndex // Given Bar Index + ) + { + // + XTMInfo result; + + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + // Do Calculations ... + Calculate(barIndex); + + // + // Generate Candle Time ... + datetime barTime = GetCandleTime( + mSymbol, + mPeriod, + barIndex); + + // + // Fill Result ... + result.symbol = mSymbol; + result.period = mPeriod; + result.barTime = barTime; + result.barIndex = barIndex; + + // + result.value = valueBuffer[barIndex]; + + // + ENUM_XTM_STATES state = (ENUM_XTM_STATES)stateBuffer[barIndex]; + ENUM_XTM_STATES prevState = (ENUM_XTM_STATES)stateBuffer[barIndex + 1]; + result.state = state; + + // + Copy( + valueBuffer, + result.values); + Copy( + stateBuffer, + result.states); + + // + result.isBullish = state == X_XTM_BULLISH; + result.isBearish = state == X_XTM_BEARISH; + result.isNeutural = state == X_XTM_NEUTURAL; + + // + result.isSwitchedBullish = + state == X_XTM_BULLISH && prevState != X_XTM_BULLISH; + result.isSwitchedBearish = + state == X_XTM_BEARISH && prevState != X_XTM_BEARISH; + result.isSwitchedNeutural = + state == X_XTM_NEUTURAL && prevState != X_XTM_NEUTURAL; + + // + return result; + } + + // + // END Provided Functions ... + // + + // + // Protected ... +protected: + // + // Private ... +private: + // + // Indicator Properties ... + // + // Makret ... + // + // Length ... + int mLength; + // + // Shift ... + int mShift; + + // + // Calculations ... + // + // Method ... + ENUM_MA_METHOD mMethod; + // + // Applied To ... + ENUM_APPLIED_PRICE mAppliedTo; + + // + // Presentation ... + // + // Show Line ... + bool mShowLine; +}; + +// +// START Usefull Functions ... +// + +// +// END Usefull Functions ... +// diff --git a/MQLTestWorkspace/X121/Old/Helpers/x-saherelm.x121.xtrnd.helper.class.ex5 b/MQLTestWorkspace/X121/Old/Helpers/x-saherelm.x121.xtrnd.helper.class.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..106ae03be393a4063423e06aeb6531c68c71d74c GIT binary patch literal 6866 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 literal 0 HcmV?d00001 diff --git a/MQLTestWorkspace/X121/Old/Helpers/x-saherelm.x121.xtrnd.helper.class.mq5 b/MQLTestWorkspace/X121/Old/Helpers/x-saherelm.x121.xtrnd.helper.class.mq5 new file mode 100644 index 0000000..2a97e2d --- /dev/null +++ b/MQLTestWorkspace/X121/Old/Helpers/x-saherelm.x121.xtrnd.helper.class.mq5 @@ -0,0 +1,1235 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 Helper Class Library +// ---------------------------------------------- +// Name: XSCXTRNDHelper +// Description: provides all Indicator +// Helper requirements ... +// +// +// 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 + +// +// START Definitions ... +// + +// +// XPERIOD Calculation Method ... +// USED For Multiple Time Frames ... +enum ENUM_X_PERIOD_METHOD +{ + // + X_PERIOD_NOTHING, + // + X_PERIOD_AUTO, + // + X_PERIOD_MANUALLY +}; + +// +// Inputs ... +struct XTRNDInputs +{ + // + // Makret ... + int cycleLength; // Cycle Length to Check + int numberOfVerifications; // Number of Verifications + + // + // Calculation ... + ENUM_SERIESMODE hhMode; // Detect Up + ENUM_SERIESMODE llMode; // Detect Low + + // + // Cycles ... + + // + // Level 1 ... + ENUM_X_PERIOD_METHOD l1Method; // How to Find Period + ENUM_TIMEFRAMES l1Period; // Time Period + + // + // Level 2 ... + ENUM_X_PERIOD_METHOD l2Method; // How to Find Period + ENUM_TIMEFRAMES l2Period; // Time Period + + // + // Level 3 ... + ENUM_X_PERIOD_METHOD l3Method; // How to Find Period + ENUM_TIMEFRAMES l3Period; // Time Period + + // + // Presentation ... + bool showConsolidations; // Show Consolidations + bool showTrend; // Show Trend + bool showL1Trend; // Show Cycle 1 Trend + bool showL2Trend; // Show Cycle 2 Trend + bool showL3Trend; // Show Cycle 3 Trend +}; + +// +// Index of Lines ... +enum ENUM_XTRND_BUFFERS +{ + // + // Main Requirements ... + XTRND_UP_LINE = 0, + XTRND_UP_STATE_LINE = 16, + XTRND_DOWN_LINE = 2, + XTRND_DOWN_STATE_LINE = 17, + // + // LEVEL 1 ... + XTRND_L1_UP_LINE = 4, + XTRND_L1_UP_STATE_LINE = 18, + XTRND_L1_DOWN_LINE = 6, + XTRND_L1_DOWN_STATE_LINE = 19, + // + // LEVEL 2 ... + XTRND_L2_UP_LINE = 8, + XTRND_L2_UP_STATE_LINE = 20, + XTRND_L2_DOWN_LINE = 10, + XTRND_L2_DOWN_STATE_LINE = 21, + // + // LEVEL 3 ... + XTRND_L3_UP_LINE = 12, + XTRND_L3_UP_STATE_LINE = 22, + XTRND_L3_DOWN_LINE = 14, + XTRND_L3_DOWN_STATE_LINE = 23, +}; + +// +enum ENUM_XTRND_STATES +{ + XTRND_STATE_BULLISH = 1, + XTRND_STATE_BEARISH = 2, + XTRND_STATE_CONSOLIDATION = 0, +}; + +// +// Retrieve Info Model ... +struct XTRNDInfo +{ + // + // Symbol ... + string symbol; + + // + // Period ... + ENUM_TIMEFRAMES period; + + // + // Bar Time ... + datetime barTime; + + // + // Bar Index ... + int barIndex; + + // + // Values ... + double hh; + ENUM_XTRND_STATES hhState; + double ll; + double llState; + double l1hh; + ENUM_XTRND_STATES l1hhState; + double l1ll; + ENUM_XTRND_STATES l1llState; + double l2hh; + ENUM_XTRND_STATES l2hhState; + double l2ll; + ENUM_XTRND_STATES l2llState; + double l3hh; + ENUM_XTRND_STATES l3hhState; + double l3ll; + ENUM_XTRND_STATES l3llState; + + // + double hhs[]; + double hhStates[]; + double lls[]; + double llStates[]; + double l1hhs[]; + double l1hhStates[]; + double l1lls[]; + double l1llStates[]; + double l2hhs[]; + double l2hhStates[]; + double l2lls[]; + double l2llStates[]; + double l3hhs[]; + double l3hhStates[]; + double l3lls[]; + double l3llStates[]; + + // + // Conditions ... + // + bool isTrendBullish; + bool isTrendSwitchedToBullish; + bool isTrendBearish; + bool isTrendSwitchedToBearish; + bool isTrendConsolidation; + bool isTrendSwitchedToConsolidation; + + // + bool isTrendUpBullish; + bool isTrendUpBearish; + bool isTrendDownBullish; + bool isTrendDownBearish; + + // + bool isL1TrendBullish; + bool isL1TrendSwitchedToBullish; + bool isL1TrendBearish; + bool isL1TrendSwitchedToBearish; + bool isL1TrendConsolidation; + bool isL1TrendSwitchedToConsolidation; + + // + bool isL1TrendUpBullish; + bool isL1TrendUpBearish; + bool isL1TrendDownBullish; + bool isL1TrendDownBearish; + + // + bool isL2TrendBullish; + bool isL2TrendSwitchedToBullish; + bool isL2TrendBearish; + bool isL2TrendSwitchedToBearish; + bool isL2TrendConsolidation; + bool isL2TrendSwitchedToConsolidation; + + // + bool isL2TrendUpBullish; + bool isL2TrendUpBearish; + bool isL2TrendDownBullish; + bool isL2TrendDownBearish; + + // + bool isL3TrendBullish; + bool isL3TrendSwitchedToBullish; + bool isL3TrendBearish; + bool isL3TrendSwitchedToBearish; + bool isL3TrendConsolidation; + bool isL3TrendSwitchedToConsolidation; + + // + bool isL3TrendUpBullish; + bool isL3TrendUpBearish; + bool isL3TrendDownBullish; + bool isL3TrendDownBearish; +}; + +// +// END Definitions ... +// + +// +// START Import and Inclused requirements ... +// + +// +// Includes ... +#include "../Libraries/x-saherelm.common.lib.mq5" +#include "../Classes/x-saherelm.xhelper.class.mq5" + +// +// END Import and Inclused requirements ... +// + +// +// START Overrides ... +// + +// +// END Overrides ... +// + +// +// a Class for Helping Indicators Requirements ... +class XSCXTRNDHelper : public XSCBaseHelper +{ + // + // Public ... +public: + // + // Buffers ... + double hhBuffer[]; + double hhStateBuffer[]; + double llBuffer[]; + double llStateBuffer[]; + double l1hhBuffer[]; + double l1hhStateBuffer[]; + double l1llBuffer[]; + double l1llStateBuffer[]; + double l2hhBuffer[]; + double l2hhStateBuffer[]; + double l2llBuffer[]; + double l2llStateBuffer[]; + double l3hhBuffer[]; + double l3hhStateBuffer[]; + double l3llBuffer[]; + double l3llStateBuffer[]; + + // + // Constructor ... + void XSCXTRNDHelper( + string symbol, // Trading Symbol + ENUM_TIMEFRAMES period // Trading Time Frame + ) : XSCBaseHelper(symbol, period) + { + PrepareTag(); + } + + // + // Deconstructor ... + void ~XSCXTRNDHelper() + { + } + + // + // START Properties ... + // + + // + // Show Trend ... + bool ShowTrend( + bool show // Show or Hide + ) + { + // + bool result = false; + + // + if (mShowTrend == show) + { + return true; + } + + // + mShowTrend = show; + result = Init(); + + // + return result; + } + + // + // Show Cycle 1 Trend ... + bool ShowL1Trends( + bool show // Show or Hide + ) + { + // + bool result = false; + + // + if (mShowL1Trends == show) + { + return true; + } + + // + mShowL1Trends = show; + result = Init(); + + // + return result; + } + + // + // Show Cycle 2 Trend ... + bool ShowL2Trends( + bool show // Show or Hide + ) + { + // + bool result = false; + + // + if (mShowL2Trends == show) + { + return true; + } + + // + mShowL2Trends = show; + result = Init(); + + // + return result; + } + + // + // Show Cycle 3 Trend ... + bool ShowL3Trends( + bool show // Show or Hide + ) + { + // + bool result = false; + + // + if (mShowL3Trends == show) + { + return true; + } + + // + mShowL3Trends = show; + result = Init(); + + // + return result; + } + + // + // END Properties ... + // + + // + // START Provided Functions ... + // + + // + // Prepare Tag ... + virtual void PrepareTag() + { + mTag = "XTRND" + GetTagPrefix(); + } + + // + virtual int GetMaxLength() + { + // + int result = -1; + + // + result = MathMax( + mCycleLength, + mNumberOfVerifications); + + // + return result; + } + + // + // Initial Indicator Handler ... + bool Init() + { + // + bool result = false; + + // + // Validate Inputs ... + // + // + result = + // + (mCycleLength > 0 && + mNumberOfVerifications > 0) + // + ; + if (!result) + { + return result; + } + + // + // Initialize Handler ... + mHandler = iCustom( + // + mSymbol, + mPeriod, + "x-saherelm.x121.xtrnd", + // + // Inputs ... + // + // Market ... + "", + // + // Cycle Length to Check ... + mCycleLength, + // + // Number of Verifications ... + mNumberOfVerifications, + // + // Calculations ... + "", + // + // Detect Up ... + mHHMode, + // + // Detect Low ... + mLLMode, + // + // Cycles ... + "", + // + // LEVEL 1 ... + "", + // + // How to Find Period ... + mLLMethod, + // + // Time Period ... + mL1Period, + // + // LEVEL 2 ... + "", + // + // How to Find Period ... + mL2Method, + // + // Time Period ... + mL2Period, + // + // LEVEL 3 ... + "", + // + // How to Find Period ... + mL3Method, + // + // Time Period ... + mL3Period, + // + // Presentation ... + "", + // + // Show Consolidations ... + mShowConsolidations, + // + // Show Trend ... + mShowTrend, + // + // Show Cycle 1 Trend ... + mShowL1Trends, + // + // Show Cycle 2 Trend ... + mShowL2Trends, + // + // Show Cycle 3 Trend ... + mShowL3Trends + // + ); + result = mHandler != INVALID_HANDLE; + + // + return result; + } + + // + // Retrieve Current Config ... + XTRNDInputs GetConfig() + { + // + XTRNDInputs result; + + // + result.cycleLength = mCycleLength; + result.numberOfVerifications = mNumberOfVerifications; + result.hhMode = mHHMode; + result.llMode = mLLMode; + result.l1Method = mLLMethod; + result.l1Period = mL1Period; + result.l2Method = mL2Method; + result.l2Period = mL2Period; + result.l3Method = mL3Method; + result.l3Period = mL3Period; + result.showConsolidations = mShowConsolidations; + result.showTrend = mShowTrend; + result.showL1Trend = mShowL1Trends; + result.showL2Trend = mShowL2Trends; + result.showL3Trend = mShowL3Trends; + + // + return result; + } + + // + // Set Config ... + bool SetConfig(XTRNDInputs &config) + { + // + bool result = false; + + // + mCycleLength = config.cycleLength; + mNumberOfVerifications = config.numberOfVerifications; + mHHMode = config.hhMode; + mLLMode = config.llMode; + mLLMethod = config.l1Method; + mL1Period = config.l1Period; + mL2Method = config.l2Method; + mL2Period = config.l2Period; + mL3Method = config.l3Method; + mL3Period = config.l3Period; + mShowConsolidations = config.showConsolidations; + mShowTrend = config.showTrend; + mShowL1Trends = config.showL1Trend; + mShowL2Trends = config.showL2Trend; + mShowL3Trends = config.showL3Trend; + + // + result = Init(); + + // + return result; + } + + // + // Reading Buffers based on Given Bar Index ... + virtual void Calculate( + int barIndex // Given Bar Index + ) + { + // + // HH ... + ArraySetAsSeries(hhBuffer, true); + CopyBuffer( + mHandler, + XTRND_UP_LINE, + barIndex, + mLoopbackBars, + hhBuffer); + + // + // HH State ... + ArraySetAsSeries(hhStateBuffer, true); + CopyBuffer( + mHandler, + XTRND_UP_STATE_LINE, + barIndex, + mLoopbackBars, + hhStateBuffer); + + // + // LL ... + ArraySetAsSeries(llBuffer, true); + CopyBuffer( + mHandler, + XTRND_DOWN_LINE, + barIndex, + mLoopbackBars, + llBuffer); + + // + // LL State ... + ArraySetAsSeries(llStateBuffer, true); + CopyBuffer( + mHandler, + XTRND_DOWN_STATE_LINE, + barIndex, + mLoopbackBars, + llStateBuffer); + + // + // CYCLES ... + + // + // LEVEL 1 ... + + // + // HH ... + ArraySetAsSeries(l1hhBuffer, true); + CopyBuffer( + mHandler, + XTRND_L1_UP_LINE, + barIndex, + mLoopbackBars, + l1hhBuffer); + + // + // HH State ... + ArraySetAsSeries(l1hhStateBuffer, true); + CopyBuffer( + mHandler, + XTRND_L1_UP_STATE_LINE, + barIndex, + mLoopbackBars, + l1hhStateBuffer); + + // + // LL ... + ArraySetAsSeries(l1llBuffer, true); + CopyBuffer( + mHandler, + XTRND_L1_DOWN_LINE, + barIndex, + mLoopbackBars, + l1llBuffer); + + // + // LL State ... + ArraySetAsSeries(l1llStateBuffer, true); + CopyBuffer( + mHandler, + XTRND_L1_DOWN_STATE_LINE, + barIndex, + mLoopbackBars, + l1llStateBuffer); + + // + // LEVEL 2 ... + + // + // HH ... + ArraySetAsSeries(l2hhBuffer, true); + CopyBuffer( + mHandler, + XTRND_L2_UP_LINE, + barIndex, + mLoopbackBars, + l2hhBuffer); + + // + // HH State ... + ArraySetAsSeries(l2hhStateBuffer, true); + CopyBuffer( + mHandler, + XTRND_L2_UP_STATE_LINE, + barIndex, + mLoopbackBars, + l2hhStateBuffer); + + // + // LL ... + ArraySetAsSeries(l2llBuffer, true); + CopyBuffer( + mHandler, + XTRND_L2_DOWN_LINE, + barIndex, + mLoopbackBars, + l2llBuffer); + + // + // LL State ... + ArraySetAsSeries(l2llStateBuffer, true); + CopyBuffer( + mHandler, + XTRND_L2_DOWN_STATE_LINE, + barIndex, + mLoopbackBars, + l2llStateBuffer); + + // + // LEVEL 3 ... + + // + // HH ... + ArraySetAsSeries(l3hhBuffer, true); + CopyBuffer( + mHandler, + XTRND_L3_UP_LINE, + barIndex, + mLoopbackBars, + l3hhBuffer); + + // + // HH State ... + ArraySetAsSeries(l3hhStateBuffer, true); + CopyBuffer( + mHandler, + XTRND_L3_UP_STATE_LINE, + barIndex, + mLoopbackBars, + l3hhStateBuffer); + + // + // LL ... + ArraySetAsSeries(l3llBuffer, true); + CopyBuffer( + mHandler, + XTRND_L3_DOWN_LINE, + barIndex, + mLoopbackBars, + l3llBuffer); + + // + // LL State ... + ArraySetAsSeries(l3llStateBuffer, true); + CopyBuffer( + mHandler, + XTRND_L3_DOWN_STATE_LINE, + barIndex, + mLoopbackBars, + l3llStateBuffer); + } + + // + // Retrieve Info at Specific Bar Index ... + XTRNDInfo GetInfo( + int barIndex // Given Bar Index + ) + { + // + XTRNDInfo result; + + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + // Do Calculations ... + Calculate(barIndex); + + // + // Generate Candle Time ... + datetime barTime = GetCandleTime( + mSymbol, + mPeriod, + barIndex); + + // + // Fill Result ... + result.symbol = mSymbol; + result.period = mPeriod; + result.barTime = barTime; + result.barIndex = barIndex; + + // + double hh = hhBuffer[barIndex]; + ENUM_XTRND_STATES hhState = (ENUM_XTRND_STATES)hhStateBuffer[barIndex]; + ENUM_XTRND_STATES hhStatePrev = (ENUM_XTRND_STATES)hhStateBuffer[barIndex + 1]; + + // + double ll = llBuffer[barIndex]; + ENUM_XTRND_STATES llState = (ENUM_XTRND_STATES)llStateBuffer[barIndex]; + ENUM_XTRND_STATES llStatePrev = (ENUM_XTRND_STATES)llStateBuffer[barIndex + 1]; + + // + double l1hh = l1hhBuffer[barIndex]; + ENUM_XTRND_STATES l1hhState = (ENUM_XTRND_STATES)l1hhStateBuffer[barIndex]; + ENUM_XTRND_STATES l1hhStatePrev = (ENUM_XTRND_STATES)l1hhStateBuffer[barIndex + 1]; + + // + double l1ll = l1llBuffer[barIndex]; + ENUM_XTRND_STATES l1llState = (ENUM_XTRND_STATES)l1llStateBuffer[barIndex]; + ENUM_XTRND_STATES l1llStatePrev = (ENUM_XTRND_STATES)l1llStateBuffer[barIndex + 1]; + + // + double l2hh = l2hhBuffer[barIndex]; + ENUM_XTRND_STATES l2hhState = (ENUM_XTRND_STATES)l2hhStateBuffer[barIndex]; + ENUM_XTRND_STATES l2hhStatePrev = (ENUM_XTRND_STATES)l2hhStateBuffer[barIndex + 1]; + + // + double l2ll = l2llBuffer[barIndex]; + ENUM_XTRND_STATES l2llState = (ENUM_XTRND_STATES)l2llStateBuffer[barIndex]; + ENUM_XTRND_STATES l2llStatePrev = (ENUM_XTRND_STATES)l2llStateBuffer[barIndex + 1]; + + // + double l3hh = l3hhBuffer[barIndex]; + ENUM_XTRND_STATES l3hhState = (ENUM_XTRND_STATES)l3hhStateBuffer[barIndex]; + ENUM_XTRND_STATES l3hhStatePrev = (ENUM_XTRND_STATES)l3hhStateBuffer[barIndex + 1]; + + // + double l3ll = l3llBuffer[barIndex]; + ENUM_XTRND_STATES l3llState = (ENUM_XTRND_STATES)l3llStateBuffer[barIndex]; + ENUM_XTRND_STATES l3llStatePrev = (ENUM_XTRND_STATES)l3llStateBuffer[barIndex + 1]; + + // + Copy( + hhBuffer, + result.hhs); + Copy( + hhStateBuffer, + result.hhStates); + Copy( + llBuffer, + result.lls); + Copy( + llStateBuffer, + result.llStates); + Copy( + l1hhBuffer, + result.l1hhs); + Copy( + l1hhStateBuffer, + result.l1hhStates); + Copy( + l1llBuffer, + result.l1lls); + Copy( + l1llStateBuffer, + result.l1llStates); + Copy( + l2hhBuffer, + result.l2hhs); + Copy( + l2hhStateBuffer, + result.l2hhStates); + Copy( + l2llBuffer, + result.l2lls); + Copy( + l2llStateBuffer, + result.l2llStates); + Copy( + l3hhBuffer, + result.l3hhs); + Copy( + l3hhStateBuffer, + result.l3hhStates); + Copy( + l3llBuffer, + result.l3lls); + Copy( + l3llStateBuffer, + result.l3llStates); + + // + bool isTrendBullish = + hhState == XTRND_STATE_BULLISH && + llState == XTRND_STATE_BULLISH; + bool isPrevTrendBullish = + hhStatePrev == XTRND_STATE_BULLISH && + llStatePrev == XTRND_STATE_BULLISH; + bool isTrendBearish = + hhState == XTRND_STATE_BEARISH && + llState == XTRND_STATE_BEARISH; + bool isPrevTrendBearish = + hhStatePrev == XTRND_STATE_BEARISH && + llStatePrev == XTRND_STATE_BEARISH; + bool isTrendConsolidation = + hhState == XTRND_STATE_CONSOLIDATION && + llState == XTRND_STATE_CONSOLIDATION; + bool isPrevTrendConsolidation = + hhStatePrev == XTRND_STATE_CONSOLIDATION && + llStatePrev == XTRND_STATE_CONSOLIDATION; + + // + bool isTrendUpBullish = + hhState == XTRND_STATE_BULLISH; + bool isTrendUpBearish = + hhState == XTRND_STATE_BEARISH; + bool isTrendDownBullish = + llState == XTRND_STATE_BULLISH; + bool isTrendDownBearish = + llState == XTRND_STATE_BEARISH; + + // + bool isTrendSwitchedToBullish = + isTrendBullish && + !isPrevTrendBullish; + bool isTrendSwitchedToBearish = + isTrendBearish && + !isPrevTrendBearish; + bool isTrendSwitchedToConsolidation = + isTrendConsolidation && + !isPrevTrendConsolidation; + + // + bool isL1TrendBullish = + l1hhState == XTRND_STATE_BULLISH && + l1llState == XTRND_STATE_BULLISH; + bool isL1PrevTrendBullish = + l1hhStatePrev == XTRND_STATE_BULLISH && + l1llStatePrev == XTRND_STATE_BULLISH; + bool isL1TrendBearish = + l1hhState == XTRND_STATE_BEARISH && + l1llState == XTRND_STATE_BEARISH; + bool isL1PrevTrendBearish = + l1hhStatePrev == XTRND_STATE_BEARISH && + l1llStatePrev == XTRND_STATE_BEARISH; + bool isL1TrendConsolidation = + l1hhState == XTRND_STATE_CONSOLIDATION && + l1llState == XTRND_STATE_CONSOLIDATION; + bool isL1PrevTrendConsolidation = + l1hhStatePrev == XTRND_STATE_CONSOLIDATION && + l1llStatePrev == XTRND_STATE_CONSOLIDATION; + + // + bool isL1TrendUpBullish = + l1hhState == XTRND_STATE_BULLISH; + bool isL1TrendUpBearish = + l1hhState == XTRND_STATE_BEARISH; + bool isL1TrendDownBullish = + l1llState == XTRND_STATE_BULLISH; + bool isL1TrendDownBearish = + l1llState == XTRND_STATE_BEARISH; + + // + bool isL1TrendSwitchedToBullish = + isL1TrendBullish && + !isL1PrevTrendBullish; + bool isL1TrendSwitchedToBearish = + isL1TrendBearish && + !isL1PrevTrendBearish; + bool isL1TrendSwitchedToConsolidation = + isL1TrendConsolidation && + !isL1PrevTrendConsolidation; + + // + bool isL2TrendBullish = + l2hhState == XTRND_STATE_BULLISH && + l2llState == XTRND_STATE_BULLISH; + bool isL2PrevTrendBullish = + l2hhStatePrev == XTRND_STATE_BULLISH && + l2llStatePrev == XTRND_STATE_BULLISH; + bool isL2TrendBearish = + l2hhState == XTRND_STATE_BEARISH && + l2llState == XTRND_STATE_BEARISH; + bool isL2PrevTrendBearish = + l2hhStatePrev == XTRND_STATE_BEARISH && + l2llStatePrev == XTRND_STATE_BEARISH; + bool isL2TrendConsolidation = + l2hhState == XTRND_STATE_CONSOLIDATION && + l2llState == XTRND_STATE_CONSOLIDATION; + bool isL2PrevTrendConsolidation = + l2hhStatePrev == XTRND_STATE_CONSOLIDATION && + l2llStatePrev == XTRND_STATE_CONSOLIDATION; + + // + bool isL2TrendUpBullish = + l2hhState == XTRND_STATE_BULLISH; + bool isL2TrendUpBearish = + l2hhState == XTRND_STATE_BEARISH; + bool isL2TrendDownBullish = + l2llState == XTRND_STATE_BULLISH; + bool isL2TrendDownBearish = + l2llState == XTRND_STATE_BEARISH; + + // + bool isL2TrendSwitchedToBullish = + isL2TrendBullish && + !isL2PrevTrendBullish; + bool isL2TrendSwitchedToBearish = + isL2TrendBearish && + !isL2PrevTrendBearish; + bool isL2TrendSwitchedToConsolidation = + isL2TrendConsolidation && + !isL2PrevTrendConsolidation; + + // + bool isL3TrendBullish = + l3hhState == XTRND_STATE_BULLISH && + l3llState == XTRND_STATE_BULLISH; + bool isL3PrevTrendBullish = + l3hhStatePrev == XTRND_STATE_BULLISH && + l3llStatePrev == XTRND_STATE_BULLISH; + bool isL3TrendBearish = + l3hhState == XTRND_STATE_BEARISH && + l3llState == XTRND_STATE_BEARISH; + bool isL3PrevTrendBearish = + l3hhStatePrev == XTRND_STATE_BEARISH && + l3llStatePrev == XTRND_STATE_BEARISH; + bool isL3TrendConsolidation = + l3hhState == XTRND_STATE_CONSOLIDATION && + l3llState == XTRND_STATE_CONSOLIDATION; + bool isL3PrevTrendConsolidation = + l3hhStatePrev == XTRND_STATE_CONSOLIDATION && + l3llStatePrev == XTRND_STATE_CONSOLIDATION; + + // + bool isL3TrendUpBullish = + l3hhState == XTRND_STATE_BULLISH; + bool isL3TrendUpBearish = + l3hhState == XTRND_STATE_BEARISH; + bool isL3TrendDownBullish = + l3llState == XTRND_STATE_BULLISH; + bool isL3TrendDownBearish = + l3llState == XTRND_STATE_BEARISH; + + // + bool isL3TrendSwitchedToBullish = + isL3TrendBullish && + !isL3PrevTrendBullish; + bool isL3TrendSwitchedToBearish = + isL3TrendBearish && + !isL3PrevTrendBearish; + bool isL3TrendSwitchedToConsolidation = + isL3TrendConsolidation && + !isL3PrevTrendConsolidation; + + // + result.hh = hh; + result.hhState = hhState; + result.ll = ll; + result.llState = llState; + result.l1hh = l1hh; + result.l1hhState = l1hhState; + result.l1ll = l1ll; + result.l1llState = l1llState; + result.l2hh = l2hh; + result.l2hhState = l2hhState; + result.l2ll = l2ll; + result.l2llState = l2llState; + result.l3hh = l3hh; + result.l3hhState = l3hhState; + result.l3ll = l3ll; + result.l3llState = l3llState; + + // + // LEVEL 0 ... + + // + result.isTrendBullish = isTrendBullish; + result.isTrendBearish = isTrendBearish; + result.isTrendConsolidation = isTrendConsolidation; + + // + result.isTrendUpBullish = isTrendUpBullish; + result.isTrendUpBearish = isTrendUpBearish; + result.isTrendDownBullish = isTrendDownBullish; + result.isTrendDownBearish = isTrendDownBearish; + + // + result.isTrendSwitchedToBullish = isTrendSwitchedToBullish; + result.isTrendSwitchedToBearish = isTrendSwitchedToBearish; + result.isTrendSwitchedToConsolidation = isTrendSwitchedToConsolidation; + + // + // LEVEL 1 ... + + // + result.isL1TrendBullish = isL1TrendBullish; + result.isL1TrendBearish = isL1TrendBearish; + result.isL1TrendConsolidation = isL1TrendConsolidation; + + // + result.isL1TrendUpBullish = isL1TrendUpBullish; + result.isL1TrendUpBearish = isL1TrendUpBearish; + result.isL1TrendDownBullish = isL1TrendDownBullish; + result.isL1TrendDownBearish = isL1TrendDownBearish; + + // + result.isL1TrendSwitchedToBullish = isL1TrendSwitchedToBullish; + result.isL1TrendSwitchedToBearish = isL1TrendSwitchedToBearish; + result.isL1TrendSwitchedToConsolidation = isL1TrendSwitchedToConsolidation; + + // + // LEVEL 2 ... + + // + result.isL2TrendBullish = isL2TrendBullish; + result.isL2TrendBearish = isL2TrendBearish; + result.isL2TrendConsolidation = isL2TrendConsolidation; + + // + result.isL2TrendUpBullish = isL2TrendUpBullish; + result.isL2TrendUpBearish = isL2TrendUpBearish; + result.isL2TrendDownBullish = isL2TrendDownBullish; + result.isL2TrendDownBearish = isL2TrendDownBearish; + + // + result.isL2TrendSwitchedToBullish = isL2TrendSwitchedToBullish; + result.isL2TrendSwitchedToBearish = isL2TrendSwitchedToBearish; + result.isL2TrendSwitchedToConsolidation = isL2TrendSwitchedToConsolidation; + + // + // LEVEL 3 ... + + // + result.isL3TrendBullish = isL3TrendBullish; + result.isL3TrendBearish = isL3TrendBearish; + result.isL3TrendConsolidation = isL3TrendConsolidation; + + // + result.isL3TrendUpBullish = isL3TrendUpBullish; + result.isL3TrendUpBearish = isL3TrendUpBearish; + result.isL3TrendDownBullish = isL3TrendDownBullish; + result.isL3TrendDownBearish = isL3TrendDownBearish; + + // + result.isL3TrendSwitchedToBullish = isL3TrendSwitchedToBullish; + result.isL3TrendSwitchedToBearish = isL3TrendSwitchedToBearish; + result.isL3TrendSwitchedToConsolidation = isL3TrendSwitchedToConsolidation; + + // + return result; + } + + // + // END Provided Functions ... + // + + // + // Protected ... +protected: + // + // Private ... +private: + // + // Indicator Properties ... + // + // Market ... + // + // Cycle Length to Check ... + int mCycleLength; + // + // Number of Verifications ... + int mNumberOfVerifications; + // + // Calculations ... + // + // Detect Up ... + ENUM_SERIESMODE mHHMode; + // + // Detect Low ... + ENUM_SERIESMODE mLLMode; + // + // Cycles ... + // + // LEVEL 1 ... + // + // How to Find Period ... + ENUM_X_PERIOD_METHOD mLLMethod; + // + // Time Period ... + ENUM_TIMEFRAMES mL1Period; + // + // LEVEL 2 ... + // + // How to Find Period ... + ENUM_X_PERIOD_METHOD mL2Method; + // + // Time Period ... + ENUM_TIMEFRAMES mL2Period; + // + // LEVEL 3 ... + // + // How to Find Period ... + ENUM_X_PERIOD_METHOD mL3Method; + // + // Time Period ... + ENUM_TIMEFRAMES mL3Period; + // + // Presentation ... + // + // Show Consolidations ... + bool mShowConsolidations; + // + // Show Trend ... + bool mShowTrend; + // + // Show Cycle 1 Trend ... + bool mShowL1Trends; + // + // Show Cycle 2 Trend ... + bool mShowL2Trends; + // + // Show Cycle 3 Trend ... + bool mShowL3Trends; +}; + +// +// START Usefull Functions ... +// + +// +// END Usefull Functions ... +// diff --git a/MQLTestWorkspace/X121/Old/Indicators/Market/WH Fair Value Gap MT5.ex5 b/MQLTestWorkspace/X121/Old/Indicators/Market/WH Fair Value Gap MT5.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..97a3517d868716ed014fb0f6ac15d4e902c135b8 GIT binary patch literal 46642 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 literal 0 HcmV?d00001 diff --git a/MQLTestWorkspace/X121/Old/Indicators/x-saherelm.x121.xama.mq5 b/MQLTestWorkspace/X121/Old/Indicators/x-saherelm.x121.xama.mq5 new file mode 100644 index 0000000..4856cbb --- /dev/null +++ b/MQLTestWorkspace/X121/Old/Indicators/x-saherelm.x121.xama.mq5 @@ -0,0 +1,350 @@ +////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 Indicator +// --------------------------------------------- +// Name: X121_XAMA +// Description: Trend Magic Indicator ... +// +// +// Maintainer: +// ------------ +// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) +// +////////////////////////////////////////////////////// +// +// Global Properties ... +#property copyright "Copyright 2023, SaherElm IT Center" +#property link "https://saherelm.ir" +#property version "1.00" +#property description "SaherElm X121_XAMA Indicator" +#property strict + +// +// START Constants ... +// +#define ShortName "X121_XAMA" + +// +// XAMA Indicator States ... +enum ENUM_X_XAMA_STATES +{ + X_XAMA_BULLISH = 0, + X_XAMA_BEARISH = 2, + X_XAMA_NEUTURAL = 1, +}; +// +// END Constants ... +// + +// +// START Inputs ... +// + +// +input group "Makret"; +input int length = 52; // Length +input int fastEMA = 2; // Fast EMA Length +input int slowEMA = 30; // Slow EMA Length +input int maShift = 0; // Shift +input ENUM_APPLIED_PRICE appliedTo = PRICE_LOW; // Applied To + +// +input group "Presentation"; +input bool showLine = true; // Show Line + +// +// END Inputs ... +// + +// +// Includes Common Library ... +#include "../Libraries/x-saherelm.common.lib.mq5" + +// +// START Buffers ... +// +#property indicator_chart_window + +// +#property indicator_buffers 3 +#property indicator_plots 1 + +// +// maBuffer ... +#define maBufferIndex 0 +#define maColorBufferIndex 1 + +double maBuffer[]; +double maColorBuffer[]; + +#property indicator_label1 "X121_XAMA" +#property indicator_type1 DRAW_COLOR_LINE +#property indicator_color1 clrLime, clrGray, clrRed +#property indicator_style1 STYLE_SOLID +#property indicator_width1 1 + +// +// END Buffers ... +// + +// +// START Global Definitions: Variables, Properties and etc ... +// + +// +int maxLength; + +// +int maHandler = INVALID_HANDLE; + +// +// END Global Definitions: Variables, Properties and etc ... +// + +// +// START Event Handlers ... +// +// +// Initialization ... +int OnInit() +{ + // + // Validate Inputs ... + if (!ValidateInputs()) + { + return INIT_PARAMETERS_INCORRECT; + } + + // + // because in some cases we may have more than one input for + // calculation and we must prevent any calculation + // untill we pass the biggest input length, here we get max Input length + // and then wait until pass it ... + maxLength = ExtractMaxLengthOfInputs(); + + // + // Initializing MA Handler ... + maHandler = iAMA( + _Symbol, + _Period, + length, + fastEMA, + slowEMA, + maShift, + appliedTo); + if (maHandler == INVALID_HANDLE) + { + // + string message = "Error Initializing Ma Handler ..."; + Print(message); + + // + return INIT_FAILED; + } + + // + // Define Index Buffers ... + DefineBuffers(); + + // + // Set Indicator ShortName ... + SetIndicatorName(); + + // + // Init Succeed ... + return INIT_SUCCEEDED; +} + +// +// DeInitialization ... +void OnDeinit(const int reason) +{ + // + // REASON_PROGRAM 0 The EA has stopped working calling the ExpertRemove() function + // REASON_REMOVE 1 Program removed from a chart + // REASON_RECOMPILE 2 Program recompiled + // REASON_CHARTCHANGE 3 A symbol or a chart period is changed + // REASON_CHARTCLOSE 4 Chart closed + // REASON_PARAMETERS 5 Inputs changed by a user + // REASON_ACCOUNT 6 Another account has been activated or reconnection to the trade server has occurred due to changes in the account settings + // REASON_TEMPLATE 7 Another chart template applied + // REASON_INITFAILED 8 The OnInit() handler returned a non-zero value + // REASON_CLOSE 9 Terminal closed + + // + // Here we can handle De Initialization Reasons ... + IndicatorRelease(maHandler); +} + +// +// Calculating what we want ... +int OnCalculate( + // + // total Candles on chart ... + const int rates_total, + // + // total calculated Candles on charts ... + const int prev_calculated, + // + // history of Candles Open Time ... + const datetime &time[], + // + // history of Candles Open Price ... + const double &open[], + // + // history of Candles High Price ... + const double &high[], + // + // history of Candles Low Price ... + const double &low[], + // + // history of Candles Close Price ... + const double &close[], + // + // history of Tick Volumes on Candle ... + const long &tick_volume[], + // + // history of Trade Volumes ... + const long &volume[], + // + // history of Candles Spread Price ... + const int &spread[]) +{ + // + // Prepare Buffers ... + ArraySetAsSeries(time, true); + ArraySetAsSeries(open, true); + ArraySetAsSeries(high, true); + ArraySetAsSeries(low, true); + ArraySetAsSeries(close, true); + ArraySetAsSeries(tick_volume, true); + ArraySetAsSeries(volume, true); + ArraySetAsSeries(spread, true); + + // + // this counts Available Bars ... + int limit; + + // + // Check Calculated Bars ... + int maCalculatedBars = BarsCalculated(maHandler); + if (maCalculatedBars < maxLength) + { + return prev_calculated; + } + + // + limit = (prev_calculated > rates_total || prev_calculated <= 0) ? rates_total : (rates_total - prev_calculated) + 1; + + // + // Buffers Copy ... + int copiedMas = CopyBuffer(maHandler, 0, 0, limit, maBuffer); + if (copiedMas <= 0) + { + return prev_calculated; + } + + // + // Main Loop ... + for (int i = limit - 1; i >= 0 && !IsStopped(); i--) + { + // + // Do Buffers Calculation ... + CalculateBuffers(i); + } + + // + return rates_total; +} + +// +// END Event Handlers ... +// + +// +// START Functions ... +// + +// +// Validate Input Args for Initialization ... +bool ValidateInputs() +{ + // + bool result = false; + + // + // Validate Args ... + if (length >= 2) + { + result = true; + } + + // + return result; +} + +// +// Retrieve all Exists Input Max Length ... +// use for Start Of Drawing ... +int ExtractMaxLengthOfInputs() +{ + // + int result = 0; + + // + result = length; + + // + return result; +} + +// +// Define Indexes and Styles ... +void DefineBuffers() +{ + // + ENUM_DRAW_TYPE drawType = showLine ? DRAW_COLOR_LINE : DRAW_NONE; + + // + // Ma Buffer ... + ArraySetAsSeries(maBuffer, true); + SetIndexBuffer(maBufferIndex, maBuffer, INDICATOR_DATA); + PlotIndexSetInteger(maBufferIndex, PLOT_DRAW_TYPE, drawType); + PlotIndexSetInteger(maBufferIndex, PLOT_SHOW_DATA, showLine); + + // + // Ma Color Buffer ... + ArraySetAsSeries(maColorBuffer, true); + SetIndexBuffer(maColorBufferIndex, maColorBuffer, INDICATOR_COLOR_INDEX); +} + +// +// Set Indicator Short Name and also we can define Buffers Labels ... +void SetIndicatorName() +{ + IndicatorSetString(INDICATOR_SHORTNAME, ShortName); +} + +// +// Calculate Buffers ... +void CalculateBuffers(int bar_index) +{ + // + // Requirements ... + XOHCL candle = GetCandle(bar_index); + + // + double maValue = maBuffer[bar_index]; + + // + double lineColorIndex = + maValue < candle.low ? 0 : maValue > candle.high ? 2 + : 1; + // + // Set Ma Buffer Color Index ... + maColorBuffer[bar_index] = lineColorIndex; +} + +// +// END Functions ... +// diff --git a/MQLTestWorkspace/X121/Old/Indicators/x-saherelm.x121.xcc.ex5 b/MQLTestWorkspace/X121/Old/Indicators/x-saherelm.x121.xcc.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..34b97ce3b9a248e78d8760a62c4eb38df840f959 GIT binary patch literal 11202 zcmdUSV{j+Hv*0h-*tTsu8{4*R+qP|PY}>YNCmY+j{a@W()x8hz`|GLhn#Q0tRU@L# z3hDqTM&Jhp5C8x`fFn@A{|DEC_lE}1{b<;#QanI6ATy3Bd3VnE^Ea=1KsAe^QfwdJ%v%z~-Ms0-*el3jLGW{6P<;=V zF=;gZU`m};m+TU#cU`9Z&Ym|O87$_ldnih@BcvlX@}mE&3h~eY3ZV(IXV~RF-cZkE z(X1@!+ix_g_*;N;pJ{I&z6(h*nzc{CD{dx+m#8wKcC?#pg_#_qEGdyeh0 zf&z0jOH(oI81_M{b-a6$qU$Zb&)h++w$?#nCE0zPbaG0TS=WpCmz*%svO^K06R-uY zI7EW>IFKmd2@9HI90CkRk+YACUt}ARianY1826bXN0L(^M867PF7;!fgZ)Wl>UJeD zM#{ylrjG!Gg#*gEZ#vcswCIQ3G5=uh2u;HgNMroxjM=Spl~OZq0fgDSd&jI*rUn&> z|5CeLN$CzY@d$wa4RDS5L7#FB7>;UjGLd&~2A%=$gl!t8381a1V z)nRc(-3t@SQrRnDNlv+tLTAQ=2#OiGV6xW;fL$5mmfrAuo?@bA7qNBqa!h%e0+XSK z;e{Q7<(@JH)&wJ(Y{d%SW0~Mb%^sk^;L)WE2P=FW=DLw_=VTM{*9<)aZMzp5@=|ZC zE3;~Lak`VnueL%;qSAyNh=or%v$m(Rt&mnT2W^Bk{5xbt@yq>1&6@c3kdNd21P{?w zyxfVQiOF`;ce6+-Wdcv()$yLerUkh!lk)qzXKi)h{Tqv$^{&>(3Y`kFw$fsQTXlF)I@|J%!>!6*(UU1X4aUV_*Y~Agu>E2B z-EltY+^QYi15?i^yy)scg2_|Igh=$-WFLRKCIp@jnZM*_G3WA&*<4U-R$O9dB^x-Y zY(VFL4idS?bvV!C$kWlK(3V3K8AL^;PC&yerN4%@Yn>%8A*H8@BXp<^f?FOVQ!2?B5;!||cw1g3Mg@_x?XMqvU=D_Rz7|eor-1&4X&alUqEh~0 zD_lpR38gQTr`D3-beAw7A7zUPRiJyX(B) zM&g*uQ?lOb|%nNwZ`OIs7&R! zJ5Q1Dbtv0*e+aoOLb;$=M$rQW%g&t@=B)SFBlAIrhD}^nG#3Kj%eBBD9{%l3#Fj^u16*DgBXcj`W zvKE|1eTcDSmMnGiFSm8Q=3QD~>G^$MiueVGN@;_M0-5nbcQ~@l#4t=w``qPKorpbn zchT3`0msv6z?7Xp4;LL(4d&zsNr za-UOQ_d7LqMZcuJ3H9XKDw26)<48;QLigQSo=)mYG<~ z4Tj5Kv*t+_hs0>Ay)50sK|+^NkS$n|0DgLUwn;337=#t!ouAHth|f3@flmU+`IU2& zSzo+M_obm*wPCO&DyekZ?0~n1ss%Gt+c9F=Fq6z)o-5@ z?dC|EX-Lm>B~`N3DnunHel+4NB&%%ySsxeOP4&k%jhLvbJnw+Oqknsm-#n^tTp%yO zwsR@`CgGIBN)gDvTOJa_R6sxf73J#6wZWrC;8{@lccYXE?vslSD!S%#F2osbHy33x z$GuXztD+ga)BsJfx`E4Nk0ew@Pu!k>kv_TEuMX@UPoA>164Bgjme7Q^CZ&gFJ?8#C zqCd5Le@{2jG{AtXs?X-AgM_^2JjRoeW;RM(A7DiZp%wTXndM!w2<0`qpi8GD4ft)4 zl^!H4&162;et(YktT!Gk1o>Ag;%I2u0hVX-vcZ==_4I3m7ki=yCAE+zszr&qmJU|p ztXc>_HdZI;D?HrQSKkGv_Z^ib)1|1G23I%BDtrIL2F%TCF(`}kk9=O}^$Ch~)bRY= z=MFo}+=>?-1E)$+M63CF+%R{?& z-Hr^MN(g*0?1SUU}lb?_Hs|gd@Bo&Gvt;1M7@ni6%1D; zOZG(x}kim>jW{7B} zk6d!FCn<}FNc<2aIS+(e5^hZ{cbQ?r5lwq;)_ni+XPadaVpmUwd$ARlz(UgB*@?it zEyf&)#HFo~>4#uC>eaQs6C*MQvauQSL|o-6wlosYT^0t@eQJ~&w_&LK13(pSoXHVx zbS=)i0L@6j| zq^r1`a?)-$mM9Y8x_!15^~2b)ofc?1j))%?kU(d@^t)%hI8M^MA9s28#`9Cb%XA zV=NQ!l!=T?J-C$|ZkjJUra|}e_OOMMIb5+ORgWgFp3WO-jHuW`iOQOjX{u-w~zf{gdlvI!!^knu7#jCZ*95-0cSAPAH=Odg}EWY*W%>DS7U*{X>Z zz&|7NWq5#Dj-{QPex#&8-Ze!yDlxxRfUiS6ADM~KRoX+(NZ{K;QK;{!suiqDqY!wq}8LJ4q~N7P%v37R|S|uY6rQsMqCwW>P=?OlOT#Sb(wnni?^9l_jB(mFfTl{U~!|(Pq4wh za@nU$$OA~43%r+M4iG}|mjmXn_2d%#wix&x;V3A*Z&G3#bN|2ubFNX5RsCfB78=|? z2K!Ahpf}0vkx+kdyI0h?N%jN_z?UzK3#Hok)D;4x%B)@moV=V=SBY#?(DN}Ettml? z!Zc&Jn>@jtO_C|PNmYmONIuAM>q|}Nd~k+Of%7AmI;K_;%mHN{K1hVd&k8Sc&zH1-5t0w*UKsfV#_t8`po`Y#r15T~$&Vd^6 zdHW%HMaM{-s%SWKi%6zV_qkW{2b#?%MLaUf@n+2m?<5c?$kuNOd}JNue4u@qm>L9y z%}v!0u(Wc|X?0?D5k$h<&+&{(JusA|kU-|yKzf$78u+si2W{HoX;i*}#9n!=-|-r9 zHBg(PT&%Vy8%di}fPcgIdYV~||DK>57}p9REMuIkF@`(}@!Qw7FV=h6f>oK#Qew^Xcw1ISR@Ozs7 za`Mw+Y$7NGC%3AN1u18&6dmA6g8&Dg{M=|y50|dTEcMShe_!O@Y;)PMB`__3>D(sU zL_)`$(2y9E)|r|Qs5aWw^GSxkxO$v@BeK6AeoY8jr<)3B;fQ(O0_~n@21J((fIajT zv6EH_t7r4LCA_0i@zADUUIV=68agV2DB<0hNGv3dQc4QCab-RF!m%;iNoML*C$O$W zPX|AHVQIt+j3po(={1Kmdi^>}M5*a;#`M!2MbnBy z+)&)A?T#1Cy7Tc1=vVX>igB@rk`DIeIn7{N+T)VJDe<{`8;Z(q1crma5m-N2-gm&w zqQpM;--(2}s*P203i|jmyg@9eRZq3!(o9L8D!ltx3c9unL-L6pj%sx!d)iDFisx;+ z-Z)>$R0>yBdQ-_-lQkb04#R;A4VYInhQbO7u_-w$ zOm1dVdeK%b3Z1@oiu!B3IczlH2IDp%pnwd@)8T^rfS=vrP~_ESb-1b_CT33;o&9am za5X`~x)V~N68Yt?Ab8Fu5F_K3E*O0+ZhdyJEm_~SM==?dQQ*1wRF`=?-35Mtp zvi*Q2ijZb=`*<-U?0!EZ_V6WZ#A_U99PglGa3NeFjIcmNSho_ageN|()v3~|0Us75>VA}av53BnRJ%xU$4>MoVb~N z?HRXEU-M$PJAis?;H$(*yN6rS8r*PMEJC4+j>) zu48OW&4P^Pg^l`hzrf=RHtwOwONZ{BUZmP9|Cku0?8>f3cbNHn z;MJN{VDiG6%uL5V-St&H{0B|qvL_fb24?Xe*P zK2OIzay_A907ns?Z$5336uNys9^h|>Dvb{yxjMxNy-y~&Ek9yS0d13i(?l5t0?aXG zQp&&%oC;0R=+1fWnb;fKY4A>n)sNeP+={5wlo(V}ZYMRRCX3tDGN@K`sj$-VFaV5) zk!5vMNajen$r*d4vydO%Y^@NQcDyEEAtEpLw0Yrg94v#3$x18gUOzQ9?l>^$6z{cc z>g}!Y{Q3c>DCsltJrR*`uZTvs%K@{}2z8`ERlrh0uWgGdv0VztK^dD&j%)bInS#H}9WPJs$JgRHlp4!FjmEj{szP@NxjwoSTWm z(Y3^0b?P{kJd`dw6#h>ms24RMV<*0IZ`x+9o`wO@An zyOVdKT7n8?Ak%mr{3b`OXG=eVDJnM5gii3 zMZ=Qkw~-zbLr(O_X^9w{f&%|oGH-v2W4pZtZC_hm0hSBwXLLI(OJ|<~vQpQpVXWBN z160fWx4x7L9u7a61rSP<-nxrjRjkTIPf2Xj_?tk!C3w#`E$3O7o44E_=9+PGEy17W z_=_J$&pre(ob_koE=jp~afzF+4aOZ58T|MR5e7ZY)lSq3O}0lNa8MTN{n9>yin7nIbeb`ljE}+m$|CEdn$FXl3j%Zi$=6jSHeE z(BSTUA){3gaBP?J_Vp=LoC*laJoJh?U+{RvHQhGKe?7DSQbCQju|k1 zEy=>Bzhmm`VBHU6S>Ar%LjQ{45kem@ufBcwrRfE!f|o3p1{L_Li`lEmVssN@m4xQPPVexo8k#PEGI3 zD@8=mISdK}*Vm!kNF+X+u>R{1S_S3t?pZlnB#XI6bjoxiwWiu&(?;@2VPh zV1>NhB7@qa1){S_&={li@fkF9cE;Uq}D>U~dl0!jK`i~w4 zCLnZt5wqs=1JleG(9kn#w+K|8;1_%{{EaO9tJ;Dk@1@K|)^}f?`1TaI496uLzeKBN zj!&N!-K-X4N8UAu{`^?ci&zl}p`tqU*SKbGOXn5R{u5La5RD`XU_Kokc3@3|%1nEi zo>(hgEPtvh!RJ6)VVwk@nGZ7OKcTeuS)>c>fO8y1W?enRRpNVWN3#HD*b_jH+&TI; zepa};RkgM?==3$>iX=6+7tEV4aj(WYuB>n4D-Y_ZNd%3gf5@!C^-U&X5}^isjL+Rc z7-Q~hWr6&Cu3!nzbGl<8bUy#4_C;$2rcZUhVlFt!dzR`@s$<@8!KE=3WY3o&TxS!g zNy+x0migSlH)L_M2d&c|@(oMb-dTNI3jV{Ijol}MZCR(*AkcOIXknG!I7j|yqj+PU z5mlrHBm}su zL0K#d1gy1EA&~)9{C4XyRLhg*dCyw1st#J6+W0{e)9Pb^`qKcIfcaq?j4}vDXX9(# zi|m;Wr`U{xka#qz6JK54lTKLQSCa(``f(t>dJmIc>~zcr8=*Yr%564?$T@i!yG;Fv zC!Df)R-{wko4|qb(#7;1+$LlEfYPd=3rUDB=Ycol`O*+AWX60G?3oQTb`y&2?deyuj}-#P$q_t)vfp1 zoW6nv&;*xAdJ$HQh)o!Q;O1j2y&`YAsoSJ_aONBY442CbeY6Wt(g0K9HdPc8Jv=hP z_y&K0;h4wJCfh06tKqYd0b*~5XSpN<)7f;&bReMv^|Z=i=gq??!Q-vKsx~;93G{ad)!ZA@pWtY<1SvAjV!+!~mfBp|m-m`WYwZ zLAmj`{&AqgrL(%RV#Luk&!!2?CZpv%s=pV*;Wa0|F5{o&wJ`Kkkd}jOyr~;%)oAPm zZ1t9G&iPytrbW|q;f^YA_8+RLknTo2Cf_*Hq5{%AJ~ry9`kH(G4F{)9_Us6qGxSt{ zGxc*3#`S~7bXQaw!BO4yn7xVCMayK*gNFsK*b*YlY}#O8grljV9f%?W=T(HTB{7?S znPu(l6II<#@;~#X2KmYQoL>-B5_(34tE#iItDNF`PsV&?^NucM3s5}(&s+NBnS3`xeGn2h60J0|oT2lqiVMCm-@WscZwK6uS)zj^#U zS9j1|dbJ5Rdx@9>zC9TEMbWrL40iykT=LWCp|=Uq_Db!VIm0PoKt_8lc7!BrwOy%3ZTrXtI|t6a;XpL15k4I`tD?&197zYN01H zDenIQE!xUP9F+yT3*05jIra*>BWWd9X0-)^xZS#Ks-}kDV9-0KtO`Zq`t}>M@G8Jo z=#I0jBc!i{O`V}FlI%&ZU$Dr<>o$QN#|=^8!5ivZfEw|9<3xtYD;Z9G-Y1?&5By?xXxv2T&bLew9=Uq$%20^z#S(Vo{&<{L2YJg(zdQp3$>U>tIkUXMp3@R_` zVL(7!M*KtHtI07k!I^=ZDg&`3=^)P#md2ZiB$vt&w}#jHtm9*54J-tE=Sv8)Br?FD zZ!FaY^yJ<&Gs1oce^QXkpr96HX6Y(|jSH1&5r~pkvP}4eYTw@|^-Q-?r{sM8Oi09% z)oTVw?_=PoMtEtUywyNqy9A>R;7GB`hGvxqzh?2J-Mr2H2WnzGr0RWQxRtFlmPnZv zc?)6n9@&+L0rti^uQ*_I`%>7{%b${1sNkW{JC4N~d=NakUU{H6h}U!D?>}3YAV`*0|ITmWb$HX# zR17728g+$1Zy^}IWb>i3lousXz0Q(hZl%2~q4Ft9=a&nE1ofm`BQ)e1<%1#o5=tE- z8;GcMfzFDs_ocunw%L6aX|*vKDt=?gxA>Lus^GCIP-1FAD4uF+ptPVy)pPqNN;$l8 zJH;PnNx&*rw>^v6}ufB7xe3YkaA z{7Qe>EhQ((xeg`A1pq?SFYy+;LfW@pFuan&O~m*eT$PO6!*-8eB>y^kLEYFEy*WiCErVPNjlqXKA$TOZ%_LK0(tNTBIap_+GME@ds|sGUA- z)u@vS!`1W)JB%NdsMu%Z_F5lMmoSys-pvCZei59_QNJ(Dt0XGKR4 z5G7`o)Trz1L!5f@uH#5di0D?Q`K}g{xlns2v}!QQ3-MBkBAyGhzBQ%XHEP+PM^3%_N{39FxUmt`0%+bqJ2#dAX0?0fs4`eR9Q8hbFJ=~k$NWQ=>$#lu|( z$l_r_N5UVtmgxw=@EiH&0b{{m&cOHZoHR|=g6lh%>R!8S7*VI5a7NhivU@%}(U3FaL2 zqsFVSk+7)w6%rRa{PrG&XcYx{yzw$buezwv*>0)x%LBkaAP@WHj7yV=+wS{Qkc}S5MEKGe$=M4{) zg!C~3%NJ_RY7t#JMlHmF`f^K127*k*nUGom)V6P)O%fX7Q!h<$U%)P~BXy0cSE82W zVJG2-KIE!@q=~zzRdNaiKW&HvCY9Ro=jMEfN*}*~Fl;hpMSh^wIg3 zGBiu)jobR#9B7`C$YW$OW3GUC!&}A4)Ij!vCHilBDs6Ma+WjJsFz0Uwc&=G^kv$lnw_)dJdnmO*<)s76i~sshCEGx8RM4pO zN9os%(|MI4Ml!$L6R6}=8D4?>CB6A4;*LG{04jNi42lNvq?QB&`Fy{O&g?Qti#2ni z5 z|CpRCtAzop1;)nFo=k9M_TdM+lZB9ni*P(nA;x9`iW%9XQA`KsQnN9#cAg8QUn6!Jc!gkIf9%!r1%<(rJnvQVmMqX`{%mZ-q%EtrQ^|rZrSXuXwJCpe;!}`WRBk zc7GqiST3piV%P7`e7>BS!PtJyd4j<79(>^iWW=V0`pe4G@+up4Kz~){w3}$)`TMz5 ziee%Crj|TWddB_Ne}!&|No;V!&wIujIZ7B~L9(CFLc_N!{ep`q7rwXM2bItbD2}!W zbFHYQC)15OL^S|M?#LV^=fzbT?n=Z$k>W4XbYL@bvI9spaw3!@jK6;MrqZ~xIg!0Y z-}kfi@^?e;P=pNOF$J%+YkEo8KHkn{Lg?q|^qea~r*P_d^3jgw-7s1&s=YkZb{mAy z`>)Nn}wHD#if{eey9r$EFc#XQQPs(HVBhli; zG`aQm2#A|MndfqVIHcQCrm|8i2t_YDjY#e*ea z;Or{7v^STrI^5%&Q*nOKyCzp=1sCLWGN>sR^Zx=5oC#zJFPP|d$uz0_o>`19V+B}% zJ#L;SdB5<9axP9#syD@WcU!eccz3y@bI>f|#elYp%%(sX{B>U%af)Fl zjme-?xqWAjkC65rxU&4okZkTj@dX}yw+%{Q=H2#kRlI@R2X>2{@Spd8u+b}WKv-I6 zjmoJdn!tujkIH`VS^2hgy@+$XH8;l?Ej5jB7;blQI_{e7_T_+xeW0@%=D^q$-CNjz H&*Fap9O+#y literal 0 HcmV?d00001 diff --git a/MQLTestWorkspace/X121/Old/Indicators/x-saherelm.x121.xcc.mq5 b/MQLTestWorkspace/X121/Old/Indicators/x-saherelm.x121.xcc.mq5 new file mode 100644 index 0000000..7389725 --- /dev/null +++ b/MQLTestWorkspace/X121/Old/Indicators/x-saherelm.x121.xcc.mq5 @@ -0,0 +1,454 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 Candle Styles +// --------------------------------------------------- +// Name: X121_CC +// Description: Candle Styles ... +// +// +// Maintainer: +// ------------ +// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) +// +////////////////////////////////////////////////////// +// +// Global Properties ... +#property copyright "Copyright 2023, SaherElm IT Center" +#property link "https://saherelm.ir" +#property version "1.00" +#property description "SaherElm X121_CC Indicator" +#property strict + +// +// START Constants ... +// + +// +// Indicator Short Name ... +#define ShortName "X121_CC" + +// +// Holds an SnapShot of Charts Configuration ... +struct XChartStyle +{ + // + // chart's ID ... + long chartId; + // + // chart's mode ... + ENUM_CHART_MODE mode; + // + // show bid line ... + bool showBidLine; + // + // show ask line ... + bool showAskLine; + // + // show grids on chart ... + bool showGrid; + // + // show volumes ... + bool showVolumes; + // + // Displaying trade levels in the chart (levels of open positions, Stop Loss, Take Profit and pending orders) ... + bool showTradeLevels; + // + // chart autoscroll ... + bool autoScroll; + // + // chart quick navigation state ... + bool quickNavigation; + // + // chart's foreground color ... + color foreGroundColor; + // + // chart's background color ... + color backGroundColor; + // + // Up Color ... + color upColor; + // + // Down Color ... + color downColor; + // + // Bullish color ... + color bullishColor; + // + // Bearish color ... + color bearishColor; + // + // grid color ... + color gridColor; + // + // bid line color ... + color bidLineColor; + // + // ask line color ... + color askLineColor; + // + // line mode and doji candlestick color ... + color lineColor; + // + // Color of stop order levels (Stop Loss and Take Profit) ... + color stopColor; + // + // volumes color ... + color volumesColor; +}; + +// +// END Constants ... +// + +// +// START Inputs ... +// + +// +input group "Chart Style"; +input color upColor = clrLime; // Up Color +input color downColor = clrRed; // Down Color +input color lineColor = clrLime; // Line mode and Doji candlestick Color +input color bearishColor = clrRed; // Bullish Color +input color bullishColor = clrLime; // Bearish Color +input color volumesColor = clrGreen; // Volumes Color + +// +input group "Presentation"; +input bool showCandles = true; // Show Candles + +// +// END Inputs ... +// + +// +// START Includes and Imports ... +// + +// +// Includes Draw Library ... +#include "../Libraries/x-saherelm.draw.lib.mq5" + +// +// Includes Common Library ... +#include "../Libraries/x-saherelm.common.lib.mq5" + +// +// END Includes and Imports ... +// + +// +// START Buffers ... +// + +// +#property indicator_chart_window + +// +#property indicator_buffers 0 +#property indicator_plots 0 + +// +// END Buffers ... +// + +// +// START Global Definitions: Variables, Properties and etc ... +// + +// +int maxLength; + +// +XChartStyle chartStyle; +XChartStyle clearStyle; + +// +// END Global Definitions: Variables, Properties and etc ... +// + +// +// START Event Handlers ... +// + +// +// Initialization ... +int OnInit() +{ + // + // Validate Inputs ... + if (!ValidateInputs()) + { + return INIT_PARAMETERS_INCORRECT; + } + + // + drawPrefix = ShortName; + + // + // because in some cases we may have more than one input for + // calculation and we must prevent any calculation + // untill we pass the biggest input length, here we get max Input length + // and then wait until pass it ... + maxLength = ExtractMaxLengthOfInputs(); + + // + // Define Index Buffers ... + DefineBuffers(); + + // + // Set Indicator ShortName ... + SetIndicatorName(); + + // + // Apply Chart Style ... + ApplyCustomChartStyle(); + + // + // Init Succeed ... + return INIT_SUCCEEDED; +} + +// +// DeInitialization ... +void OnDeinit(const int reason) +{ + // + // REASON_PROGRAM 0 The EA has stopped working calling the ExpertRemove() function + // REASON_REMOVE 1 Program removed from a chart + // REASON_RECOMPILE 2 Program recompiled + // REASON_CHARTCHANGE 3 A symbol or a chart period is changed + // REASON_CHARTCLOSE 4 Chart closed + // REASON_PARAMETERS 5 Inputs changed by a user + // REASON_ACCOUNT 6 Another account has been activated or reconnection to the trade server has occurred due to changes in the account settings + // REASON_TEMPLATE 7 Another chart template applied + // REASON_INITFAILED 8 The OnInit() handler returned a non-zero value + // REASON_CLOSE 9 Terminal closed +} + +// +// Calculating what we want ... +int OnCalculate( + // + // total Candles on chart ... + const int rates_total, + // + // total calculated Candles on charts ... + const int prev_calculated, + // + // history of Candles Open Time ... + const datetime &time[], + // + // history of Candles Open Price ... + const double &open[], + // + // history of Candles High Price ... + const double &high[], + // + // history of Candles Low Price ... + const double &low[], + // + // history of Candles Close Price ... + const double &close[], + // + // history of Tick Volumes on Candle ... + const long &tick_volume[], + // + // history of Trade Volumes ... + const long &volume[], + // + // history of Candles Spread Price ... + const int &spread[]) +{ + // + // Prepare Buffers ... + ArraySetAsSeries(time, true); + ArraySetAsSeries(open, true); + ArraySetAsSeries(high, true); + ArraySetAsSeries(low, true); + ArraySetAsSeries(close, true); + ArraySetAsSeries(tick_volume, true); + ArraySetAsSeries(volume, true); + ArraySetAsSeries(spread, true); + + // + // this counts Available Bars ... + int limit; + + // + limit = (prev_calculated > rates_total || prev_calculated <= 0) ? rates_total : (rates_total - prev_calculated) + 1; + + // + // Main Loop ... + for (int i = limit - 1; i >= 0 && !IsStopped(); i--) + { + CalculateBuffers(i); + } + + // + return rates_total; +} + +// +// END Event Handlers ... +// + +// +// START Functions ... +// + +// +// Validate Input Args for Initialization ... +bool ValidateInputs() +{ + // + bool result = true; + + // + return result; +} + +// +// Retrieve all Exists Input Max Length ... +// use for Start Of Drawing ... +int ExtractMaxLengthOfInputs() +{ + // + int result = 0; + + // + return result; +} + +// +// Define Indexes and Styles ... +void DefineBuffers() +{ +} + +// +// Set Indicator Short Name and also we can define Buffers Labels ... +void SetIndicatorName() +{ + IndicatorSetString(INDICATOR_SHORTNAME, ShortName); +} + +// +// Calculate Buffers ... +void CalculateBuffers( + int bar_index // Selected Bar Index +) +{ +} + +// +// Apply Custom Chart Style ... +void ApplyCustomChartStyle() +{ + // + // Read Current Chart Config and Store it ... + ReadChartStyle(); + + // + // After Reading Current Chart Style ... + // we have to Save Configs and Change Styles ... + clearStyle = chartStyle; + + // + clearStyle.upColor = CLR_NONE; + clearStyle.downColor = CLR_NONE; + clearStyle.lineColor = CLR_NONE; + clearStyle.bullishColor = CLR_NONE; + clearStyle.bearishColor = CLR_NONE; + + // + // Decide to Show or not Candles based on User Input ... + if (showCandles) + { + SetChartStyle(chartStyle); + } + else + { + SetChartStyle(clearStyle); + } +} + +// +// Read Previous Chart Style ... +void ReadChartStyle() +{ + // + // Retrieve Current Chart ID ... + long chartId = ChartID(); + chartStyle.chartId = chartId; + + // + // Retrieve Chart Mode ... + chartStyle.mode = (ENUM_CHART_MODE)ChartGetInteger(chartId, CHART_MODE); + + // + chartStyle.showBidLine = (bool)ChartGetInteger(chartId, CHART_SHOW_BID_LINE); + chartStyle.showAskLine = (bool)ChartGetInteger(chartId, CHART_SHOW_ASK_LINE); + chartStyle.showGrid = (bool)ChartGetInteger(chartId, CHART_SHOW_GRID); + chartStyle.showVolumes = (bool)ChartGetInteger(chartId, CHART_SHOW_VOLUMES); + chartStyle.showTradeLevels = (bool)ChartGetInteger(chartId, CHART_SHOW_TRADE_LEVELS); + chartStyle.autoScroll = (bool)ChartGetInteger(chartId, CHART_AUTOSCROLL); + chartStyle.quickNavigation = (bool)ChartGetInteger(chartId, CHART_QUICK_NAVIGATION); + + // + chartStyle.foreGroundColor = (color)ChartGetInteger(chartId, CHART_COLOR_FOREGROUND); + chartStyle.backGroundColor = (color)ChartGetInteger(chartId, CHART_COLOR_BACKGROUND); + chartStyle.upColor = (color)ChartGetInteger(chartId, CHART_COLOR_CHART_UP); + chartStyle.downColor = (color)ChartGetInteger(chartId, CHART_COLOR_CHART_DOWN); + chartStyle.bullishColor = (color)ChartGetInteger(chartId, CHART_COLOR_CANDLE_BULL); + chartStyle.bearishColor = (color)ChartGetInteger(chartId, CHART_COLOR_CANDLE_BEAR); + chartStyle.gridColor = (color)ChartGetInteger(chartId, CHART_COLOR_GRID); + chartStyle.bidLineColor = (color)ChartGetInteger(chartId, CHART_COLOR_BID); + chartStyle.askLineColor = (color)ChartGetInteger(chartId, CHART_COLOR_ASK); + chartStyle.stopColor = (color)ChartGetInteger(chartId, CHART_COLOR_STOP_LEVEL); + chartStyle.lineColor = (color)ChartGetInteger(chartId, CHART_COLOR_CHART_LINE); + chartStyle.volumesColor = (color)ChartGetInteger(chartId, CHART_COLOR_VOLUME); + + // + chartStyle.upColor = upColor; + chartStyle.downColor = downColor; + chartStyle.lineColor = lineColor; + chartStyle.bearishColor = bearishColor; + chartStyle.bullishColor = bullishColor; + chartStyle.volumesColor = volumesColor; +} + +// +// Set Chart Style ... +void SetChartStyle( + XChartStyle &mChartStyle // Chart Style to Apply +) +{ + // + ApplyChartStyle( + mChartStyle.chartId, + mChartStyle.mode, + mChartStyle.showBidLine, + mChartStyle.showAskLine, + mChartStyle.showGrid, + mChartStyle.showVolumes, + mChartStyle.showTradeLevels, + mChartStyle.autoScroll, + mChartStyle.quickNavigation, + mChartStyle.foreGroundColor, + mChartStyle.backGroundColor, + mChartStyle.upColor, + mChartStyle.downColor, + mChartStyle.bullishColor, + mChartStyle.bearishColor, + mChartStyle.gridColor, + mChartStyle.bidLineColor, + mChartStyle.askLineColor, + mChartStyle.lineColor, + mChartStyle.stopColor, + mChartStyle.volumesColor); +} + +// +// END Functions ... +// diff --git a/MQLTestWorkspace/X121/Old/Indicators/x-saherelm.x121.xche.ex5 b/MQLTestWorkspace/X121/Old/Indicators/x-saherelm.x121.xche.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..b76eaec3281c29be8a1760584aaee89699351244 GIT binary patch literal 19190 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 9 && + loopback >= 0; + + // + return result; +} + +// +// Retrieve all Exists Input Max Length ... +// use for Start Of Drawing ... +int ExtractMaxLengthOfInputs() +{ + // + int result = 0; + + // + result = MathMax(length, loopback); + + // + return result; +} + +// +// Set Indicator Short Name and also we can define Buffers Labels ... +void SetIndicatorName() +{ + IndicatorSetString(INDICATOR_SHORTNAME, ShortName); +} + +// +// Define Indexes and Styles ... +void DefineBuffers() +{ + // + uint arrowCode = 159; + + // + // LEVEL 1 ... + + // + // Long Exit 1 ... + + // + // Draw Type ... + ENUM_DRAW_TYPE longExit1DrawType = showLongExit1Line ? DRAW_LINE : DRAW_NONE; + ENUM_DRAW_TYPE longExit1StartDrawType = showLongExit1Line ? DRAW_ARROW : DRAW_NONE; + + // + // Buffer ... + SetIndexBuffer(longExit1BufferIndex, longExit1Buffer, INDICATOR_DATA); + PlotIndexSetInteger(longExit1BufferIndex, PLOT_SHOW_DATA, showLongExit1Line); + PlotIndexSetInteger(longExit1BufferIndex, PLOT_DRAW_TYPE, longExit1DrawType); + + // + // Start Buffer ... + SetIndexBuffer(longExit1StartBufferIndex, longExit1StartBuffer, INDICATOR_DATA); + PlotIndexSetInteger(longExit1StartBufferIndex, PLOT_ARROW, arrowCode); + PlotIndexSetInteger(longExit1StartBufferIndex, PLOT_SHOW_DATA, false); + PlotIndexSetInteger(longExit1StartBufferIndex, PLOT_DRAW_TYPE, longExit1StartDrawType); + + // + // Short Exit 1 ... + + // + // Draw Type ... + ENUM_DRAW_TYPE shortExit1DrawType = showShortExit1Line ? DRAW_LINE : DRAW_NONE; + ENUM_DRAW_TYPE shortExit1StartDrawType = showShortExit1Line ? DRAW_ARROW : DRAW_NONE; + + // + // Buffer ... + SetIndexBuffer(shortExit1BufferIndex, shortExit1Buffer, INDICATOR_DATA); + PlotIndexSetInteger(shortExit1BufferIndex, PLOT_SHOW_DATA, showShortExit1Line); + PlotIndexSetInteger(shortExit1BufferIndex, PLOT_DRAW_TYPE, shortExit1DrawType); + + // + // Start Buffer ... + SetIndexBuffer(shortExit1StartBufferIndex, shortExit1StartBuffer, INDICATOR_DATA); + PlotIndexSetInteger(shortExit1StartBufferIndex, PLOT_ARROW, arrowCode); + PlotIndexSetInteger(shortExit1StartBufferIndex, PLOT_SHOW_DATA, false); + PlotIndexSetInteger(shortExit1StartBufferIndex, PLOT_DRAW_TYPE, shortExit1StartDrawType); + + // + // LEVEL 2 ... + + // + // Long Exit 2 ... + + // + // Draw Type ... + ENUM_DRAW_TYPE longExit2DrawType = showLongExit2Line ? DRAW_LINE : DRAW_NONE; + ENUM_DRAW_TYPE longExit2StartDrawType = showLongExit2Line ? DRAW_ARROW : DRAW_NONE; + + // + // Buffer ... + SetIndexBuffer(longExit2BufferIndex, longExit2Buffer, INDICATOR_DATA); + PlotIndexSetInteger(longExit2BufferIndex, PLOT_SHOW_DATA, showLongExit2Line); + PlotIndexSetInteger(longExit2BufferIndex, PLOT_DRAW_TYPE, longExit2DrawType); + + // + // Start Buffer ... + SetIndexBuffer(longExit2StartBufferIndex, longExit2StartBuffer, INDICATOR_DATA); + PlotIndexSetInteger(longExit2StartBufferIndex, PLOT_ARROW, arrowCode); + PlotIndexSetInteger(longExit2StartBufferIndex, PLOT_SHOW_DATA, false); + PlotIndexSetInteger(longExit2StartBufferIndex, PLOT_DRAW_TYPE, longExit2StartDrawType); + + // + // Short Exit 2 ... + + // + // Draw Type ... + ENUM_DRAW_TYPE shortExit2DrawType = showShortExit2Line ? DRAW_LINE : DRAW_NONE; + ENUM_DRAW_TYPE shortExit2StartDrawType = showShortExit2Line ? DRAW_ARROW : DRAW_NONE; + + // + // Buffer ... + SetIndexBuffer(shortExit2BufferIndex, shortExit2Buffer, INDICATOR_DATA); + PlotIndexSetInteger(shortExit2BufferIndex, PLOT_SHOW_DATA, showShortExit2Line); + PlotIndexSetInteger(shortExit2BufferIndex, PLOT_DRAW_TYPE, shortExit2DrawType); + + // + // Start Buffer ... + SetIndexBuffer(shortExit2StartBufferIndex, shortExit2StartBuffer, INDICATOR_DATA); + PlotIndexSetInteger(shortExit2StartBufferIndex, PLOT_ARROW, arrowCode); + PlotIndexSetInteger(shortExit2StartBufferIndex, PLOT_SHOW_DATA, false); + PlotIndexSetInteger(shortExit2StartBufferIndex, PLOT_DRAW_TYPE, shortExit2StartDrawType); +} + +// +// Calculate Buffers ... +void CalculateBuffers( + int bar_index, // Selected Bar Index + int prevCalculated, // Previous Calculated + int ratesTotal, // Total Rates + const double &open[], // Rates Open ... + const double &high[], // Rates High ... + const double &low[], // Rates Low ... + const double &close[] // Rates Close ... +) +{ + // + // Cleanup Buffers ... + longExit1Buffer[bar_index] = longExit1StartBuffer[bar_index] = shortExit1Buffer[bar_index] = shortExit1StartBuffer[bar_index] = EMPTY_VALUE; + longExit2Buffer[bar_index] = longExit2StartBuffer[bar_index] = shortExit2Buffer[bar_index] = shortExit2StartBuffer[bar_index] = EMPTY_VALUE; + + // + int start = MathMax(bar_index - loopback, 0); + + // + // Calculate ATR Value ... + double atrValue = 0; + for (int k = 1; k <= length && (bar_index - k - 1) >= 0; k++) + { + // + atrValue += MathMax(high[bar_index - k], close[MathMax(bar_index - k - 1, 0)]) - + MathMin(low[bar_index - k], close[MathMax(bar_index - k - 1, 0)]); + } + atrValue /= (double)length; + + // + // Retrieve Highest High and Lowest Lows ... + double loopbackMax = high[ArrayMaximum(high, start, loopback)]; + double loopbackMin = low[ArrayMinimum(low, start, loopback)]; + + // + // Fill Multi Dimesional Working Array ... + work[bar_index][hi1Idx] = loopbackMax - multiplier1 * atrValue; + work[bar_index][lo1Idx] = loopbackMin + multiplier1 * atrValue; + work[bar_index][hi2Idx] = loopbackMax - multiplier2 * atrValue; + work[bar_index][lo2Idx] = loopbackMin + multiplier2 * atrValue; + work[bar_index][trend1Idx] = (bar_index > 0) ? work[bar_index - 1][trend1Idx] : 0; + work[bar_index][trend2Idx] = (bar_index > 0) ? work[bar_index - 1][trend2Idx] : 0; + + // + if (bar_index > 0) + { + // + // Calculate Trends ... + if (close[bar_index] > work[bar_index - 1][lo1Idx]) + { + work[bar_index][trend1Idx] = 1; + } + + // + if (close[bar_index] < work[bar_index - 1][hi1Idx]) + { + work[bar_index][trend1Idx] = -1; + } + + // + if (close[bar_index] > work[bar_index - 1][lo2Idx]) + { + work[bar_index][trend2Idx] = 1; + } + + // + if (close[bar_index] < work[bar_index - 1][hi2Idx]) + { + work[bar_index][trend2Idx] = -1; + } + + // + // Calculate Exit Values ... + + // + // Exit 1 ... + + // + // Long ... + if (multiplier1 > 0 && work[bar_index][trend1Idx] == 1) + { + // + if (work[bar_index][hi1Idx] < work[bar_index - 1][hi1Idx]) + { + work[bar_index][hi1Idx] = work[bar_index - 1][hi1Idx]; + } + + // + longExit1Buffer[bar_index] = work[bar_index][hi1Idx]; + + // + if (longExit1Buffer[bar_index - 1] == EMPTY_VALUE) + { + longExit1StartBuffer[bar_index] = longExit1Buffer[bar_index]; + } + } + + // + // Short ... + if (multiplier1 > 0 && work[bar_index][trend1Idx] == -1) + { + // + if (work[bar_index][lo1Idx] > work[bar_index - 1][lo1Idx]) + { + work[bar_index][lo1Idx] = work[bar_index - 1][lo1Idx]; + } + + // + shortExit1Buffer[bar_index] = work[bar_index][lo1Idx]; + + // + if (shortExit1Buffer[bar_index - 1] == EMPTY_VALUE) + { + shortExit1StartBuffer[bar_index] = shortExit1Buffer[bar_index]; + } + } + + // + // Exit 2 ... + + // + // Long ... + if (multiplier2 > 0 && work[bar_index][trend2Idx] == 1) + { + if (work[bar_index][hi2Idx] < work[bar_index - 1][hi2Idx]) + { + work[bar_index][hi2Idx] = work[bar_index - 1][hi2Idx]; + } + + // + longExit2Buffer[bar_index] = work[bar_index][hi2Idx]; + + // + if (longExit2Buffer[bar_index - 1] == EMPTY_VALUE) + { + longExit2StartBuffer[bar_index] = longExit2Buffer[bar_index]; + } + } + + // + // Short ... + if (multiplier2 > 0 && work[bar_index][trend2Idx] == -1) + { + // + if (work[bar_index][lo2Idx] > work[bar_index - 1][lo2Idx]) + { + work[bar_index][lo2Idx] = work[bar_index - 1][lo2Idx]; + } + + // + shortExit2Buffer[bar_index] = work[bar_index][lo2Idx]; + + // + if (shortExit2Buffer[bar_index - 1] == EMPTY_VALUE) + { + shortExit2StartBuffer[bar_index] = shortExit2Buffer[bar_index]; + } + } + } +} + +// +// END Functions ... +// diff --git a/MQLTestWorkspace/X121/Old/Indicators/x-saherelm.x121.xcpv.ex5 b/MQLTestWorkspace/X121/Old/Indicators/x-saherelm.x121.xcpv.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..af5659475bfae2f5a92f3481aef06a89dfcda9ac GIT binary patch literal 79574 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%0D!R8J>U$sTe4#5EP_h_Xf1LBzueh#4tSTvi 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 NaW7j{na( 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 VedebcT$@!Re{mg`MBrAS{{`_KN2mY* literal 0 HcmV?d00001 diff --git a/MQLTestWorkspace/X121/Old/Indicators/x-saherelm.x121.xct.mq5 b/MQLTestWorkspace/X121/Old/Indicators/x-saherelm.x121.xct.mq5 new file mode 100644 index 0000000..72f2a26 --- /dev/null +++ b/MQLTestWorkspace/X121/Old/Indicators/x-saherelm.x121.xct.mq5 @@ -0,0 +1,264 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 Indicator +// --------------------------------------------- +// Name: X121_XCT +// Description: Trend Magic Indicator ... +// +// +// Maintainer: +// ------------ +// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) +// +////////////////////////////////////////////////////// +// +// Global Properties ... +#property copyright "Copyright 2023, SaherElm IT Center" +#property link "https://saherelm.ir" +#property version "1.00" +#property description "SaherElm X121_XCT Indicator" +#property strict + +// +// START Constants ... +// + +// +#define ShortName "X121_XCT" +#include "../Libraries/x-saherelm.common.lib.mq5" + +// +// END Constants ... +// + +// +// START Inputs ... +// + +// +input color clr = clrYellow; // Text Color +input ENUM_BASE_CORNER corner = CORNER_RIGHT_LOWER; // Text Position + +// +input group "Presentation"; +input bool showCandleTime = true; // Show Candle Time + +// +// END Inputs ... +// + +// +// START Buffers ... +// + +// +#property indicator_chart_window + +// +#property indicator_buffers 0 +#property indicator_plots 0 + +// +// END Buffers ... +// + +// +// START Global Definitions: Variables, Properties and etc ... +// + +// +// END Global Definitions: Variables, Properties and etc ... +// + +// +// START Event Handlers ... +// + +// +// Initialization ... +int OnInit() +{ + // + // Validate Inputs ... + if (showCandleTime) + { + CreateIndicatorObject(); + } + else + { + ObjectDelete(0, ShortName); + } + + // + // Set Indicator ShortName ... + SetIndicatorName(); + + // + // Init Succeed ... + return INIT_SUCCEEDED; +} + +// +// DeInitialization ... +void OnDeinit(const int reason) +{ + // + // REASON_PROGRAM 0 The EA has stopped working calling the ExpertRemove() function + // REASON_REMOVE 1 Program removed from a chart + // REASON_RECOMPILE 2 Program recompiled + // REASON_CHARTCHANGE 3 A symbol or a chart period is changed + // REASON_CHARTCLOSE 4 Chart closed + // REASON_PARAMETERS 5 Inputs changed by a user + // REASON_ACCOUNT 6 Another account has been activated or reconnection to the trade server has occurred due to changes in the account settings + // REASON_TEMPLATE 7 Another chart template applied + // REASON_INITFAILED 8 The OnInit() handler returned a non-zero value + // REASON_CLOSE 9 Terminal closed + + // + // Delete Object ... + ObjectDelete(0, ShortName); + + // + Comment(""); +} + +// +// Calculating what we want ... +int OnCalculate( + // + // total Candles on chart ... + const int rates_total, + // + // total calculated Candles on charts ... + const int prev_calculated, + // + // history of Candles Open Time ... + const datetime &time[], + // + // history of Candles Open Price ... + const double &open[], + // + // history of Candles High Price ... + const double &high[], + // + // history of Candles Low Price ... + const double &low[], + // + // history of Candles Close Price ... + const double &close[], + // + // history of Tick Volumes on Candle ... + const long &tick_volume[], + // + // history of Trade Volumes ... + const long &volume[], + // + // history of Candles Spread Price ... + const int &spread[]) +{ + // + ArraySetAsSeries(time, true); + + // + if (!showCandleTime) + { + return rates_total; + } + + // + XCandleRemains remainTime; + GetCandleRemainsTime( + remainTime, + _Symbol, + _Period, + 0); + + // + string msg = ToString( + remainTime, + "", + "", + "", + "", + "", + ":", + true); + + // + long mSpread = SymbolInfoInteger(Symbol(), SYMBOL_SPREAD); + + // + string _sp = ""; + if (mSpread < 10) + _sp = ".."; + else if (mSpread < 100) + _sp = "."; + + // + string objText = "Spread: " + IntegerToString(mSpread) + _sp + " Next Bar in: " + msg; + + // + ObjectSetInteger(0, ShortName, OBJPROP_COLOR, clr); + ObjectSetString(0, ShortName, OBJPROP_TEXT, objText); + ObjectSetInteger(0, ShortName, OBJPROP_FONTSIZE, 10); + ObjectSetString(0, ShortName, OBJPROP_FONT, "Courier"); + + // + return rates_total; +} + +// +// END Event Handlers ... +// + +// +// START Functions ... +// + +// +// Set Indicator Short Name and also we can define Buffers Labels ... +void SetIndicatorName() +{ + IndicatorSetString(INDICATOR_SHORTNAME, ShortName); +} + +// +void CreateIndicatorObject() +{ + // + if (!showCandleTime) + { + return; + } + + // + ObjectCreate(0, ShortName, OBJ_LABEL, 0, 0, 0); + ObjectSetInteger(0, ShortName, OBJPROP_CORNER, corner); + ObjectSetInteger(0, ShortName, OBJPROP_XDISTANCE, 10); + ObjectSetInteger(0, ShortName, OBJPROP_YDISTANCE, 2); + + // + ENUM_ANCHOR_POINT Anchor = ANCHOR_LEFT_UPPER; + switch (corner) + { + case CORNER_LEFT_UPPER: + Anchor = ANCHOR_LEFT_UPPER; + break; + case CORNER_RIGHT_UPPER: + Anchor = ANCHOR_RIGHT_UPPER; + break; + case CORNER_LEFT_LOWER: + Anchor = ANCHOR_LEFT_LOWER; + break; + case CORNER_RIGHT_LOWER: + Anchor = ANCHOR_RIGHT_LOWER; + break; + } + + // + ObjectSetInteger(0, ShortName, OBJPROP_ANCHOR, Anchor); +} + +// +// END Functions ... +// diff --git a/MQLTestWorkspace/X121/Old/Indicators/x-saherelm.x121.xdema.ex5 b/MQLTestWorkspace/X121/Old/Indicators/x-saherelm.x121.xdema.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..92c507cadfde57126235b01ece8ab8084328f6c2 GIT binary patch literal 12368 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 literal 0 HcmV?d00001 diff --git a/MQLTestWorkspace/X121/Old/Indicators/x-saherelm.x121.xdema.mq5 b/MQLTestWorkspace/X121/Old/Indicators/x-saherelm.x121.xdema.mq5 new file mode 100644 index 0000000..186778e --- /dev/null +++ b/MQLTestWorkspace/X121/Old/Indicators/x-saherelm.x121.xdema.mq5 @@ -0,0 +1,348 @@ +////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 Indicator +// --------------------------------------------- +// Name: X121_XDEMA +// Description: Super Trend Indicator ... +// +// +// Maintainer: +// ------------ +// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) +// +////////////////////////////////////////////////////// +// +// Global Properties ... +#property copyright "Copyright 2023, SaherElm IT Center" +#property link "https://saherelm.ir" +#property version "1.00" +#property description "SaherElm X121_XAMA Indicator" +#property strict + +// +// START Constants ... +// + +#define ShortName "X121_XDEMA" + +// +// END Constants ... +// + +// +// START Inputs ... +// + +// +// Market ... +input group "Market"; +input int length = 200; // Length +input int shift = 0; // Shift + +// +// Presentation ... +input group "Presentation"; +input bool showDema = true; // Show Dema +input bool showEMA = false; // Show EMA +input bool showEMAOfEMA = false; // Show EMA of EMA + +// +// END Inputs ... +// + +// +// Includes Common Library ... +#include +#include "../Libraries/x-saherelm.common.lib.mq5" + +// +// START Buffers ... +// + +// +#property indicator_chart_window + +// +#property indicator_buffers 6 +#property indicator_plots 6 + +// +#define demaBufferIndex 0 +double demaBuffer[]; + +// +#define demaColorBufferIndex 1 +double demaColorBuffer[]; + +// +#property indicator_label1 "X121_XDEMA DEMA" +#property indicator_type1 DRAW_COLOR_LINE +#property indicator_color1 clrDodgerBlue, CLR_NONE +#property indicator_style1 STYLE_SOLID +#property indicator_width1 1 + +// +#define emaBufferIndex 2 +double emaBuffer[]; + +// +#define emaColorBufferIndex 3 +double emaColorBuffer[]; + +// +#property indicator_label2 "X121_XDEMA EMA" +#property indicator_type2 DRAW_COLOR_LINE +#property indicator_color2 clrBlue, CLR_NONE +#property indicator_style2 STYLE_DOT +#property indicator_width2 1 + +// +#define emaOfEMABufferIndex 4 +double emaOfEMABuffer[]; + +// +#define emaOfEMAColorBufferIndex 5 +double emaOfEMAColorBuffer[]; + +// +#property indicator_label3 "X121_XDEMA EMA of EMA" +#property indicator_type3 DRAW_COLOR_LINE +#property indicator_color3 clrOrange, CLR_NONE +#property indicator_style3 STYLE_DOT +#property indicator_width3 1 + +// +// END Buffers ... +// + +// +// START Global Definitions: Variables, Properties and etc ... +// + +// +int maxLength; + +// +// END Global Definitions: Variables, Properties and etc ... +// + +// +// START Event Handlers ... +// + +// +// Initialization ... +int OnInit() +{ + // + // Validate Inputs ... + if (!ValidateInputs()) + { + return INIT_PARAMETERS_INCORRECT; + } + + // + // because in some cases we may have more than one input for + // calculation and we must prevent any calculation + // untill we pass the biggest input length, here we get max Input length + // and then wait until pass it ... + maxLength = ExtractMaxLengthOfInputs(); + + // + // Define Index Buffers ... + DefineBuffers(); + + // + // Set Indicator ShortName ... + SetIndicatorName(); + + // + // Init Succeed ... + return INIT_SUCCEEDED; +} + +// +// DeInitialization ... +void OnDeinit(const int reason) +{ + // + // REASON_PROGRAM 0 The EA has stopped working calling the ExpertRemove() function + // REASON_REMOVE 1 Program removed from a chart + // REASON_RECOMPILE 2 Program recompiled + // REASON_CHARTCHANGE 3 A symbol or a chart period is changed + // REASON_CHARTCLOSE 4 Chart closed + // REASON_PARAMETERS 5 Inputs changed by a user + // REASON_ACCOUNT 6 Another account has been activated or reconnection to the trade server has occurred due to changes in the account settings + // REASON_TEMPLATE 7 Another chart template applied + // REASON_INITFAILED 8 The OnInit() handler returned a non-zero value + // REASON_CLOSE 9 Terminal closed +} + +// +// Do Calculations ... +int OnCalculate(const int rates_total, + const int prev_calculated, + const int begin, + const double &price[]) +{ + // + ArraySetAsSeries(price, true); + + // + // check for data ... + if (rates_total < 2 * length - 2) + { + return 0; + } + + // + int limit; + + // + limit = (prev_calculated > rates_total || prev_calculated <= 0) ? rates_total : (rates_total - prev_calculated) + 1; + + // + // calculate EMA ... + ExponentialMAOnBuffer(rates_total, prev_calculated, 0, length, price, emaBuffer); + + // + // calculate EMA on EMA array ... + ExponentialMAOnBuffer(rates_total, prev_calculated, length - 1, length, emaBuffer, emaOfEMABuffer); + + // + // Main Loop ... + for (int i = limit - 1; i >= 0 && !IsStopped(); i--) + { + // + // calculate DEMA ... + demaBuffer[i] = 2 * emaBuffer[i] - emaOfEMABuffer[i]; + + // + double showColorIDX = 0; + double hideColorIDX = 1; + + // + demaColorBuffer[i] = hideColorIDX; + emaColorBuffer[i] = hideColorIDX; + emaOfEMAColorBuffer[i] = hideColorIDX; + + // + if (showDema) + { + demaColorBuffer[i] = showColorIDX; + } + + // + if (showEMA) + { + emaColorBuffer[i] = showColorIDX; + } + + // + if (showEMAOfEMA) + { + emaOfEMAColorBuffer[i] = showColorIDX; + } + } + + // + return rates_total; +} + +// +// END Event Handlers ... +// + +// +// START Functions ... +// + +// +// Validate Input Args for Initialization ... +bool ValidateInputs() +{ + // + bool result = + // + (length > 2 && + shift >= 0) + // + ; + + // + return result; +} + +// +// Retrieve all Exists Input Max Length ... +// use for Start Of Drawing ... +int ExtractMaxLengthOfInputs() +{ + // + int result = 0; + + // + // Peaks and Vales ... + result = length; + + // + return result; +} + +// +// Set Indicator Short Name and also we can define Buffers Labels ... +void SetIndicatorName() +{ + IndicatorSetString(INDICATOR_SHORTNAME, ShortName); +} + +// +// Define Indexes and Styles ... +void DefineBuffers() +{ + // + // DEMA ... + + // + // Buffer ... + ArraySetAsSeries(demaBuffer, true); + SetIndexBuffer(demaBufferIndex, demaBuffer, INDICATOR_DATA); + PlotIndexSetInteger(demaBufferIndex, PLOT_SHOW_DATA, showDema); + + // + // Color Buffer ... + ArraySetAsSeries(demaColorBuffer, true); + SetIndexBuffer(demaColorBufferIndex, demaColorBuffer, INDICATOR_COLOR_INDEX); + + // + // EMA ... + + // + // Buffer ... + ArraySetAsSeries(emaBuffer, true); + SetIndexBuffer(emaBufferIndex, emaBuffer, INDICATOR_DATA); + PlotIndexSetInteger(emaBufferIndex, PLOT_SHOW_DATA, showEMA); + + // + // Color Buffer ... + ArraySetAsSeries(emaColorBuffer, true); + SetIndexBuffer(emaColorBufferIndex, emaColorBuffer, INDICATOR_COLOR_INDEX); + + // + // EMA of EMA ... + + // + // Buffer ... + ArraySetAsSeries(emaOfEMABuffer, true); + SetIndexBuffer(emaOfEMABufferIndex, emaOfEMABuffer, INDICATOR_DATA); + PlotIndexSetInteger(emaOfEMABufferIndex, PLOT_SHOW_DATA, showEMAOfEMA); + + // + // Color Buffer ... + ArraySetAsSeries(emaOfEMAColorBuffer, true); + SetIndexBuffer(emaOfEMAColorBufferIndex, emaOfEMAColorBuffer, INDICATOR_COLOR_INDEX); +} + +// +// END Functions ... +// diff --git a/MQLTestWorkspace/X121/Old/Indicators/x-saherelm.x121.xfbb.ex5 b/MQLTestWorkspace/X121/Old/Indicators/x-saherelm.x121.xfbb.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..fbfcc924a3c4bc4c7c0bfc6387ecd48070b432a2 GIT binary patch literal 23408 zcmdSAQ?MvOyCt}7+s4_pZQHhWwr$(CZQHhO+t!@Fqwhp_KisF8ht7)3s{Ga$Rkbo# zBr3B+)LB660g4d#K>!E<0004wKmh)?Af7{Zi-NLQ3UAJuQGC4a_`iYwGGza!;lJ|# z^FAIB0094q000mK{{{Wmd4pcu+SE)Ci_&Nj{hhs&_klnkDFjUoI)ik9ZjGhZ+{Ol( z-_?cI^gsSW0CoU>0o(x`04xB^0L%fL{=F_E0R6wn1VH`oS_#15pVj0aE&^Z;VDrx+ z0igUZ75Znh{pbB31)zfK3II_#-dly!gi7nc)GHgIg4n0mABhc4E2o&jruM895sU_X zBDsA|pUHP|UN+I>NtA$+UmHUmPFHJZv zsEVvMWv73wshZ4-;JS|lO~PnpBoLjvNL|_3o(}rBEe2mzgz#^9AjJ(c4=lEK!J#n( zIQeyRJHsfdm87h}Vl44-D)^qRl?9sTkuEb|qje6fc_TO-t!5Ojt#ec2x9~UiSWOSe zR_Ht+{5T`nN6ENbdb9Mn(5XFf+`yQd#&SS#P3Zt>MjIF#M7oXhT!ARk4br)L=GjJS z#*_7%i0jKUap^v}zEigVB8dU=^4JT?WUB+tp~So@u7vzX!68VV#-m6_&tdDu_96

EZJiQKVd3vBAthKl#_4~Un#N47n|uROTZzAMQ% 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 literal 0 HcmV?d00001 diff --git a/MQLTestWorkspace/X121/Old/Indicators/x-saherelm.x121.xfbb.mq5 b/MQLTestWorkspace/X121/Old/Indicators/x-saherelm.x121.xfbb.mq5 new file mode 100644 index 0000000..90d3274 --- /dev/null +++ b/MQLTestWorkspace/X121/Old/Indicators/x-saherelm.x121.xfbb.mq5 @@ -0,0 +1,768 @@ +////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 Indicator +// -------------------------------------- +// Name: X121_XFBB +// Description: Fibonacci Band ... +// +// +// Maintainer: +// ------------ +// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) +// +////////////////////////////////////////////////////// +// +// Global Properties ... +#property copyright "Copyright 2023, SaherElm IT Center" +#property link "https://saherelm.ir" +#property version "1.00" +#property description "SaherElm X121_XFBB Indicator" +#property strict + +// +// START Constants ... +// + +// +// Indicator Short Name ... +#define ShortName "X121_XFBB" + +// +// END Constants ... +// + +// +// START Inputs ... +// + +// +// Market ... +input group "Market"; +input int length = 200; // Length +input double multiplier = 3.0; // Multiplier +input ENUM_APPLIED_PRICE appliedTo = PRICE_TYPICAL; // Applied To + +// +// Presentation ... +input group "Presentation"; +input bool showBase = true; // Show Base +input bool showBand = true; // Show Band +input bool showGoldenArea = true; // Show Golden Area +input bool showOthers = false; // Show Other Levels + +// +// END Inputs ... +// + +// +// START Includes and Imports ... +// + +// +// Includes Common Library ... +#include "../Libraries/x-saherelm.common.lib.mq5" + +// +// END Includes and Imports ... +// + +// +// START Buffers ... +// + +// +#property indicator_chart_window + +// +#property indicator_buffers 28 +#property indicator_plots 26 + +// +// PLOTTED Buffers ... + +// +#define baseBufferIndex 0 +#define basePlotBufferIndex 0 +double baseBuffer[]; + +// +#property indicator_label1 "X121_XFBB Base" +#property indicator_type1 DRAW_COLOR_LINE +#property indicator_color1 CLR_NONE, clrDarkGray, clrDeepPink, clrMediumSeaGreen +#property indicator_style1 STYLE_DOT + +#define baseColorBufferIndex 1 +double baseColorBuffer[]; + +// +#define upL1BufferIndex 2 +#define upL1PlotBufferIndex 1 +double upL1Buffer[]; + +// +#property indicator_label2 "X121_XFBB UF 1" +#property indicator_type2 DRAW_COLOR_LINE +#property indicator_color2 CLR_NONE, clrDarkGray +#property indicator_style2 STYLE_DOT + +#define upL1ColorBufferIndex 3 +double upL1ColorBuffer[]; + +// +#define upL2BufferIndex 4 +#define upL2PlotBufferIndex 2 +double upL2Buffer[]; + +#define upL2ColorBufferIndex 5 +double upL2ColorBuffer[]; + +// +#property indicator_label3 "X121_XFBB UF 2" +#property indicator_type3 DRAW_COLOR_LINE +#property indicator_color3 CLR_NONE, clrDarkGray +#property indicator_style3 STYLE_DOT + +// +#define upL3BufferIndex 6 +#define upL3PlotBufferIndex 3 +double upL3Buffer[]; + +#define upL3ColorBufferIndex 7 +double upL3ColorBuffer[]; + +// +#property indicator_label4 "X121_XFBB UF 3" +#property indicator_type4 DRAW_COLOR_LINE +#property indicator_color4 CLR_NONE, clrGold +#property indicator_style4 STYLE_DOT + +// +#define upL4BufferIndex 8 +#define upL4PlotBufferIndex 4 +double upL4Buffer[]; + +#define upL4ColorBufferIndex 9 +double upL4ColorBuffer[]; + +// +#property indicator_label5 "X121_XFBB UF 4" +#property indicator_type5 DRAW_COLOR_LINE +#property indicator_color5 CLR_NONE, clrGold +#property indicator_style5 STYLE_DOT + +// +#define upL5BufferIndex 10 +#define upL5PlotBufferIndex 5 +double upL5Buffer[]; + +#define upL5ColorBufferIndex 11 +double upL5ColorBuffer[]; + +// +#property indicator_label6 "X121_XFBB UF 5" +#property indicator_type6 DRAW_COLOR_LINE +#property indicator_color6 CLR_NONE, clrDarkGray +#property indicator_style6 STYLE_DOT + +// +#define upL6BufferIndex 12 +#define upL6PlotBufferIndex 6 +double upL6Buffer[]; + +#define upL6ColorBufferIndex 13 +double upL6ColorBuffer[]; + +// +#property indicator_label7 "X121_XFBB UF 6" +#property indicator_type7 DRAW_COLOR_LINE +#property indicator_color7 CLR_NONE, clrRed +#property indicator_style7 STYLE_DOT + +// +// DOWN ... + +// +#define downL1BufferIndex 14 +#define downL1PlotBufferIndex 7 +double downL1Buffer[]; + +#define downL1ColorBufferIndex 15 +double downL1ColorBuffer[]; + +// +#property indicator_label8 "X121_XFBB UD 1" +#property indicator_type8 DRAW_COLOR_LINE +#property indicator_color8 CLR_NONE, clrDarkGray +#property indicator_style8 STYLE_DOT + +// +#define downL2BufferIndex 16 +#define downL2PlotBufferIndex 8 +double downL2Buffer[]; + +#define downL2ColorBufferIndex 17 +double downL2ColorBuffer[]; + +// +#property indicator_label9 "X121_XFBB UD 2" +#property indicator_type9 DRAW_COLOR_LINE +#property indicator_color9 CLR_NONE, clrDarkGray +#property indicator_style9 STYLE_DOT + +// +#define downL3BufferIndex 18 +#define downL3PlotBufferIndex 9 +double downL3Buffer[]; + +#define downL3ColorBufferIndex 19 +double downL3ColorBuffer[]; + +// +#property indicator_label10 "X121_XFBB UD 3" +#property indicator_type10 DRAW_COLOR_LINE +#property indicator_color10 CLR_NONE, clrGold +#property indicator_style10 STYLE_DOT + +// +#define downL4BufferIndex 20 +#define downL4PlotBufferIndex 10 +double downL4Buffer[]; + +#define downL4ColorBufferIndex 21 +double downL4ColorBuffer[]; + +// +#property indicator_label11 "X121_XFBB UD 4" +#property indicator_type11 DRAW_COLOR_LINE +#property indicator_color11 CLR_NONE, clrGold +#property indicator_style11 STYLE_DOT + +// +#define downL5BufferIndex 22 +#define downL5PlotBufferIndex 11 +double downL5Buffer[]; + +#define downL5ColorBufferIndex 23 +double downL5ColorBuffer[]; + +// +#property indicator_label12 "X121_XFBB UD 5" +#property indicator_type12 DRAW_COLOR_LINE +#property indicator_color12 CLR_NONE, clrDarkGray +#property indicator_style12 STYLE_DOT + +// +#define downL6BufferIndex 24 +#define downL6PlotBufferIndex 12 +double downL6Buffer[]; + +#define downL6ColorBufferIndex 25 +double downL6ColorBuffer[]; + +// +#property indicator_label13 "X121_XFBB UD 6" +#property indicator_type13 DRAW_COLOR_LINE +#property indicator_color13 CLR_NONE, clrRed +#property indicator_style13 STYLE_DOT + +// +// DATA BUffers ... + +// +#define stdDevBufferIndex 26 +double stdDevBuffer[]; + +// +#define vwmaBufferIndex 27 +double vwmaBuffer[]; + +// +// END Buffers ... +// + +// +// START Global Definitions: Variables, Properties and etc ... +// + +// +int maxLength; + +// +int mSTDevHandler = INVALID_HANDLE; + +// +// END Global Definitions: Variables, Properties and etc ... +// + +// +// START Event Handlers ... +// + +// +// Initialization ... +int OnInit() +{ + // + // Validate Inputs ... + if (!ValidateInputs()) + { + return INIT_PARAMETERS_INCORRECT; + } + + // + // because in some cases we may have more than one input for + // calculation and we must prevent any calculation + // untill we pass the biggest input length, here we get max Input length + // and then wait until pass it ... + maxLength = ExtractMaxLengthOfInputs(); + + // + // Define Index Buffers ... + DefineBuffers(); + + // + // Set Indicator ShortName ... + SetIndicatorName(); + + // + // Initialize Handlers ... + mSTDevHandler = iStdDev( + _Symbol, + _Period, + length, + 0, + MODE_SMA, + appliedTo); + if (mSTDevHandler == INVALID_HANDLE) + { + return INIT_FAILED; + } + + // + // Init Succeed ... + return INIT_SUCCEEDED; +} + +// +// DeInitialization ... +void OnDeinit(const int reason) +{ + // + // REASON_PROGRAM 0 The EA has stopped working calling the ExpertRemove() function + // REASON_REMOVE 1 Program removed from a chart + // REASON_RECOMPILE 2 Program recompiled + // REASON_CHARTCHANGE 3 A symbol or a chart period is changed + // REASON_CHARTCLOSE 4 Chart closed + // REASON_PARAMETERS 5 Inputs changed by a user + // REASON_ACCOUNT 6 Another account has been activated or reconnection to the trade server has occurred due to changes in the account settings + // REASON_TEMPLATE 7 Another chart template applied + // REASON_INITFAILED 8 The OnInit() handler returned a non-zero value + // REASON_CLOSE 9 Terminal closed + + // + // Here we can handle De Initialization Reasons ... + + // + IndicatorRelease(mSTDevHandler); +} + +// +// Calculating what we want ... +int OnCalculate( + // + // total Candles on chart ... + const int rates_total, + // + // total calculated Candles on charts ... + const int prev_calculated, + // + // history of Candles Open Time ... + const datetime &time[], + // + // history of Candles Open Price ... + const double &open[], + // + // history of Candles High Price ... + const double &high[], + // + // history of Candles Low Price ... + const double &low[], + // + // history of Candles Close Price ... + const double &close[], + // + // history of Tick Volumes on Candle ... + const long &tick_volume[], + // + // history of Trade Volumes ... + const long &volume[], + // + // history of Candles Spread Price ... + const int &spread[]) +{ + // + int i = (prev_calculated > 0 ? prev_calculated - 1 : 0); + for (i; i < rates_total && !IsStopped(); i++) + { + // + double price = GetAppliedPrice( + appliedTo, + open, + high, + low, + close, + i); + + // + double vwma = iVWMA(price, volume[i], length, i, rates_total); + vwmaBuffer[i] = vwma; + baseBuffer[i] = vwma; + + // + double baseColorIDX = (i > 0) + ? (vwmaBuffer[i] > vwmaBuffer[i - 1]) + ? 3 + : (vwmaBuffer[i] < vwmaBuffer[i - 1]) + ? 2 + : baseColorBuffer[i - 1] + : 1; + + // + if (showBase) + { + baseColorBuffer[i] = baseColorIDX; + } + else + { + baseColorBuffer[i] = 0; + } + } + + // + // this counts Available Bars ... + int limit; + + // + // Check Calculated Bars ... + // + int stdDevCalculatedBars = BarsCalculated(mSTDevHandler); + if (stdDevCalculatedBars < maxLength) + { + return prev_calculated; + } + + // + limit = (prev_calculated > rates_total || prev_calculated <= 0) ? rates_total : (rates_total - prev_calculated) + 1; + + // + // Buffers Copy ... + // + int copiedSTDDevs = CopyBuffer(mSTDevHandler, 0, 0, limit, stdDevBuffer); + if (copiedSTDDevs <= 0) + { + return prev_calculated; + } + + // + // Main Loop ... + for (int i = limit - 1; i > 0 && !IsStopped(); i--) + { + CalculateBuffers(i); + } + + // + return rates_total; +} + +// +// END Event Handlers ... +// + +// +// START Functions ... +// + +// +// Validate Input Args for Initialization ... +bool ValidateInputs() +{ + // + bool result = + // + (length >= 2 && + multiplier > 0) + // + ; + + // + return result; +} + +// +// Retrieve all Exists Input Max Length ... +// use for Start Of Drawing ... +int ExtractMaxLengthOfInputs() +{ + // + int result = 0; + + // + result = MathMax(result, length); + + // + return result; +} + +// +// Define Indexes and Styles ... +void DefineBuffers() +{ + // + // PLOTTED ... + + // + // BASE ... + // ArraySetAsSeries(baseBuffer, true); + // ArraySetAsSeries(baseColorBuffer, true); + SetIndexBuffer(baseBufferIndex, baseBuffer, INDICATOR_DATA); + PlotIndexSetInteger(basePlotBufferIndex, PLOT_SHOW_DATA, showBase); + SetIndexBuffer(baseColorBufferIndex, baseColorBuffer, INDICATOR_COLOR_INDEX); + + // + // UP 1 ... + // ArraySetAsSeries(upL1Buffer, true); + // ArraySetAsSeries(upL1ColorBuffer, true); + SetIndexBuffer(upL1BufferIndex, upL1Buffer, INDICATOR_DATA); + PlotIndexSetInteger(upL1PlotBufferIndex, PLOT_SHOW_DATA, showOthers); + SetIndexBuffer(upL1ColorBufferIndex, upL1ColorBuffer, INDICATOR_COLOR_INDEX); + + // + // UP 2 ... + // ArraySetAsSeries(upL2Buffer, true); + // ArraySetAsSeries(upL2ColorBuffer, true); + SetIndexBuffer(upL2BufferIndex, upL2Buffer, INDICATOR_DATA); + PlotIndexSetInteger(upL2PlotBufferIndex, PLOT_SHOW_DATA, showOthers); + SetIndexBuffer(upL2ColorBufferIndex, upL2ColorBuffer, INDICATOR_COLOR_INDEX); + + // + // UP 3 ... + // ArraySetAsSeries(upL3Buffer, true); + // ArraySetAsSeries(upL3ColorBuffer, true); + SetIndexBuffer(upL3BufferIndex, upL3Buffer, INDICATOR_DATA); + PlotIndexSetInteger(upL3PlotBufferIndex, PLOT_SHOW_DATA, showGoldenArea); + SetIndexBuffer(upL3ColorBufferIndex, upL3ColorBuffer, INDICATOR_COLOR_INDEX); + + // + // UP 4 ... + // ArraySetAsSeries(upL4Buffer, true); + // ArraySetAsSeries(upL4ColorBuffer, true); + SetIndexBuffer(upL4BufferIndex, upL4Buffer, INDICATOR_DATA); + PlotIndexSetInteger(upL4PlotBufferIndex, PLOT_SHOW_DATA, showGoldenArea); + SetIndexBuffer(upL4ColorBufferIndex, upL4ColorBuffer, INDICATOR_COLOR_INDEX); + + // + // UP 5 ... + // ArraySetAsSeries(upL5Buffer, true); + // ArraySetAsSeries(upL5ColorBuffer, true); + SetIndexBuffer(upL5BufferIndex, upL5Buffer, INDICATOR_DATA); + PlotIndexSetInteger(upL5PlotBufferIndex, PLOT_SHOW_DATA, showOthers); + SetIndexBuffer(upL5ColorBufferIndex, upL5ColorBuffer, INDICATOR_COLOR_INDEX); + + // + // UP 6 ... + // ArraySetAsSeries(upL6Buffer, true); + // ArraySetAsSeries(upL6ColorBuffer, true); + SetIndexBuffer(upL6BufferIndex, upL6Buffer, INDICATOR_DATA); + PlotIndexSetInteger(upL6PlotBufferIndex, PLOT_SHOW_DATA, showBand); + SetIndexBuffer(upL6ColorBufferIndex, upL6ColorBuffer, INDICATOR_COLOR_INDEX); + + // + // DOWN 1 ... + // ArraySetAsSeries(downL1Buffer, true); + // ArraySetAsSeries(downL1ColorBuffer, true); + SetIndexBuffer(downL1BufferIndex, downL1Buffer, INDICATOR_DATA); + PlotIndexSetInteger(downL1PlotBufferIndex, PLOT_SHOW_DATA, showOthers); + SetIndexBuffer(downL1ColorBufferIndex, downL1ColorBuffer, INDICATOR_COLOR_INDEX); + + // + // DOWN 2 ... + // ArraySetAsSeries(downL2Buffer, true); + // ArraySetAsSeries(downL2ColorBuffer, true); + SetIndexBuffer(downL2BufferIndex, downL2Buffer, INDICATOR_DATA); + PlotIndexSetInteger(downL2PlotBufferIndex, PLOT_SHOW_DATA, showOthers); + SetIndexBuffer(downL2ColorBufferIndex, downL2ColorBuffer, INDICATOR_COLOR_INDEX); + + // + // DOWN 3 ... + // ArraySetAsSeries(downL3Buffer, true); + // ArraySetAsSeries(downL3ColorBuffer, true); + SetIndexBuffer(downL3BufferIndex, downL3Buffer, INDICATOR_DATA); + PlotIndexSetInteger(downL3PlotBufferIndex, PLOT_SHOW_DATA, showGoldenArea); + SetIndexBuffer(downL3ColorBufferIndex, downL3ColorBuffer, INDICATOR_COLOR_INDEX); + + // + // DOWN 4 ... + // ArraySetAsSeries(downL4Buffer, true); + // ArraySetAsSeries(downL4ColorBuffer, true); + SetIndexBuffer(downL4BufferIndex, downL4Buffer, INDICATOR_DATA); + PlotIndexSetInteger(downL4PlotBufferIndex, PLOT_SHOW_DATA, showGoldenArea); + SetIndexBuffer(downL4ColorBufferIndex, downL4ColorBuffer, INDICATOR_COLOR_INDEX); + + // + // DOWN 5 ... + // ArraySetAsSeries(downL5Buffer, true); + // ArraySetAsSeries(downL5ColorBuffer, true); + SetIndexBuffer(downL5BufferIndex, downL5Buffer, INDICATOR_DATA); + PlotIndexSetInteger(downL5PlotBufferIndex, PLOT_SHOW_DATA, showOthers); + SetIndexBuffer(downL5ColorBufferIndex, downL5ColorBuffer, INDICATOR_COLOR_INDEX); + + // + // DOWN 6 ... + // ArraySetAsSeries(downL6Buffer, true); + // ArraySetAsSeries(downL6ColorBuffer, true); + SetIndexBuffer(downL6BufferIndex, downL6Buffer, INDICATOR_DATA); + PlotIndexSetInteger(downL6PlotBufferIndex, PLOT_SHOW_DATA, showBand); + SetIndexBuffer(downL6ColorBufferIndex, downL6ColorBuffer, INDICATOR_COLOR_INDEX); + + // + // DATA ... + + // + // ArraySetAsSeries(stdDevBuffer, true); + SetIndexBuffer(stdDevBufferIndex, stdDevBuffer, INDICATOR_CALCULATIONS); + + // + // ArraySetAsSeries(vwmaBuffer, true); + SetIndexBuffer(vwmaBufferIndex, vwmaBuffer, INDICATOR_CALCULATIONS); +} + +// +// Set Indicator Short Name and also we can define Buffers Labels ... +void SetIndicatorName() +{ + IndicatorSetString(INDICATOR_SHORTNAME, ShortName); +} + +// +// Calculate Buffers ... +void CalculateBuffers( + int bar_index // Selected Bar Index +) +{ + // + double stdDev = stdDevBuffer[bar_index]; + double dev = stdDev * multiplier; + + // + double base = baseBuffer[bar_index]; + + // + double fib1 = 0.236; + double fib2 = 0.382; + double fib3 = 0.5; + double fib4 = 0.618; + double fib5 = 0.764; + double fib6 = 1; + + // + double u1 = base + (fib1 * dev); + double u2 = base + (fib2 * dev); + double u3 = base + (fib3 * dev); + double u4 = base + (fib4 * dev); + double u5 = base + (fib5 * dev); + double u6 = base + (fib6 * dev); + + // + upL1Buffer[bar_index] = u1; + upL2Buffer[bar_index] = u2; + upL3Buffer[bar_index] = u3; + upL4Buffer[bar_index] = u4; + upL5Buffer[bar_index] = u5; + upL6Buffer[bar_index] = u6; + + // + double d1 = base - (fib1 * dev); + double d2 = base - (fib2 * dev); + double d3 = base - (fib3 * dev); + double d4 = base - (fib4 * dev); + double d5 = base - (fib5 * dev); + double d6 = base - (fib6 * dev); + + // + downL1Buffer[bar_index] = d1; + downL2Buffer[bar_index] = d2; + downL3Buffer[bar_index] = d3; + downL4Buffer[bar_index] = d4; + downL5Buffer[bar_index] = d5; + downL6Buffer[bar_index] = d6; + + // + // Setup Color IDX ... + + // + double hideColorIDX = 0; + double showColorIDX = 1; + + // + // SET Default Colors ... + + // + upL1ColorBuffer[bar_index] = hideColorIDX; + upL2ColorBuffer[bar_index] = hideColorIDX; + upL3ColorBuffer[bar_index] = hideColorIDX; + upL4ColorBuffer[bar_index] = hideColorIDX; + upL5ColorBuffer[bar_index] = hideColorIDX; + upL6ColorBuffer[bar_index] = hideColorIDX; + + // + downL1ColorBuffer[bar_index] = hideColorIDX; + downL2ColorBuffer[bar_index] = hideColorIDX; + downL3ColorBuffer[bar_index] = hideColorIDX; + downL4ColorBuffer[bar_index] = hideColorIDX; + downL5ColorBuffer[bar_index] = hideColorIDX; + downL6ColorBuffer[bar_index] = hideColorIDX; + + // + if (!showBase) + { + baseColorBuffer[bar_index] = hideColorIDX; + } + + // + if (showBand) + { + // + upL6ColorBuffer[bar_index] = showColorIDX; + downL6ColorBuffer[bar_index] = showColorIDX; + } + + // + if (showGoldenArea) + { + // + upL3ColorBuffer[bar_index] = showColorIDX; + upL4ColorBuffer[bar_index] = showColorIDX; + + // + downL3ColorBuffer[bar_index] = showColorIDX; + downL4ColorBuffer[bar_index] = showColorIDX; + } + + // + if (showOthers) + { + // + upL1ColorBuffer[bar_index] = showColorIDX; + upL2ColorBuffer[bar_index] = showColorIDX; + upL5ColorBuffer[bar_index] = showColorIDX; + + // + downL1ColorBuffer[bar_index] = showColorIDX; + downL2ColorBuffer[bar_index] = showColorIDX; + downL5ColorBuffer[bar_index] = showColorIDX; + } +} + +// +// END Functions ... +// diff --git a/MQLTestWorkspace/X121/Old/Indicators/x-saherelm.x121.xhk.ex5 b/MQLTestWorkspace/X121/Old/Indicators/x-saherelm.x121.xhk.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..ec446ea0bcd9b6d16dd062c9bbf3a4e476b12ccb GIT binary patch literal 11564 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 T__C rates_total || prev_calculated <= 0) ? rates_total : (rates_total - prev_calculated) + 1; + + // + // Main Loop ... + for (int i = limit - 1; i >= 0 && !IsStopped(); i--) + { + CalculateBuffers(i, prev_calculated, rates_total, open, high, close, low); + } + + // + return rates_total; +} + +// +// END Event Handlers ... +// + +// +// START Functions ... +// + +// +// Validate Input Args for Initialization ... +bool ValidateInputs() +{ + // + bool result = true; + + // + return result; +} + +// +// Retrieve all Exists Input Max Length ... +// use for Start Of Drawing ... +int ExtractMaxLengthOfInputs() +{ + // + int result = 0; + + // + return result; +} + +// +// Define Indexes and Styles ... +void DefineBuffers() +{ + // + // Candles Color ... + ArraySetAsSeries(candleColorBuffer, true); + SetIndexBuffer(candleColorBufferIndex, candleColorBuffer, INDICATOR_COLOR_INDEX); + + // + // Set EMPTY_VALUE on Candles Buffer ... + PlotIndexSetDouble(candlesBufferIndex, PLOT_EMPTY_VALUE, 0.0); + + // + PlotIndexSetInteger(candlesBufferIndex, PLOT_SHOW_DATA, false); + PlotIndexSetInteger(candleColorBufferIndex, PLOT_SHOW_DATA, false); + + // + // Open ... + ArraySetAsSeries(openBuffer, true); + PlotIndexSetInteger(openBufferIndex, PLOT_SHOW_DATA, false); + SetIndexBuffer(openBufferIndex, openBuffer, INDICATOR_DATA); + + // + // High ... + ArraySetAsSeries(highBuffer, true); + SetIndexBuffer(highBufferIndex, highBuffer, INDICATOR_DATA); + PlotIndexSetInteger(highBufferIndex, PLOT_SHOW_DATA, false); + + // + // Close ... + ArraySetAsSeries(closeBuffer, true); + SetIndexBuffer(closeBufferIndex, closeBuffer, INDICATOR_DATA); + PlotIndexSetInteger(closeBufferIndex, PLOT_SHOW_DATA, false); + + // + // Low ... + ArraySetAsSeries(lowBuffer, true); + SetIndexBuffer(lowBufferIndex, lowBuffer, INDICATOR_DATA); + PlotIndexSetInteger(lowBufferIndex, PLOT_SHOW_DATA, false); + + // + // Open HK ... + ENUM_DRAW_TYPE openDrawType = drawCandleLines ? DRAW_COLOR_LINE : DRAW_NONE; + ArraySetAsSeries(openHKBuffer, true); + SetIndexBuffer(openHKBufferIndex, openHKBuffer, INDICATOR_DATA); + PlotIndexSetInteger(openHKBufferPlotIndex, PLOT_SHOW_DATA, drawCandleLines); + PlotIndexSetInteger(openHKBufferPlotIndex, PLOT_DRAW_TYPE, openDrawType); + + // + ArraySetAsSeries(openHKColorBuffer, true); + SetIndexBuffer(openHKColorBufferIndex, openHKColorBuffer, INDICATOR_COLOR_INDEX); + + // + // High HK ... + ENUM_DRAW_TYPE highDrawType = drawCandleLines ? DRAW_COLOR_LINE : DRAW_NONE; + ArraySetAsSeries(highHKBuffer, true); + SetIndexBuffer(highHKBufferIndex, highHKBuffer, INDICATOR_DATA); + PlotIndexSetInteger(highHKBufferPlotIndex, PLOT_SHOW_DATA, drawCandleLines); + PlotIndexSetInteger(highHKBufferPlotIndex, PLOT_DRAW_TYPE, highDrawType); + + // + ArraySetAsSeries(highHKColorBuffer, true); + SetIndexBuffer(highHKColorBufferIndex, highHKColorBuffer, INDICATOR_COLOR_INDEX); + + // + // Low HK ... + ENUM_DRAW_TYPE lowDrawType = drawCandleLines ? DRAW_COLOR_LINE : DRAW_NONE; + ArraySetAsSeries(lowHKBuffer, true); + SetIndexBuffer(lowHKBufferIndex, lowHKBuffer, INDICATOR_DATA); + PlotIndexSetInteger(lowHKBufferPlotIndex, PLOT_SHOW_DATA, drawCandleLines); + PlotIndexSetInteger(lowHKBufferPlotIndex, PLOT_DRAW_TYPE, lowDrawType); + + // + ArraySetAsSeries(lowHKColorBuffer, true); + SetIndexBuffer(lowHKColorBufferIndex, lowHKColorBuffer, INDICATOR_COLOR_INDEX); + + // + // Close HK ... + ENUM_DRAW_TYPE closeDrawType = drawCandleLines ? DRAW_COLOR_LINE : DRAW_NONE; + ArraySetAsSeries(closeHKBuffer, true); + SetIndexBuffer(closeHKBufferIndex, closeHKBuffer, INDICATOR_DATA); + PlotIndexSetInteger(closeHKBufferPlotIndex, PLOT_SHOW_DATA, drawCandleLines); + PlotIndexSetInteger(closeHKBufferPlotIndex, PLOT_DRAW_TYPE, closeDrawType); + + // + ArraySetAsSeries(closeHKColorBuffer, true); + SetIndexBuffer(closeHKColorBufferIndex, closeHKColorBuffer, INDICATOR_COLOR_INDEX); +} + +// +// Set Indicator Short Name and also we can define Buffers Labels ... +void SetIndicatorName() +{ + IndicatorSetString(INDICATOR_SHORTNAME, ShortName); +} + +// +// Calculate Buffers ... +void CalculateBuffers( + int bar_index, // Selected Bar Index + const int prevCalculated, + const int ratesTotal, + const double &open[], + const double &high[], + const double &close[], + const double &low[]) +{ + // + double mPrevHKOpenValue; + double mPrevHKCloseValue; + + // + if (ArraySize(open) <= bar_index + 1) + { + // + mPrevHKOpenValue = 0; + mPrevHKCloseValue = 0; + } + else + { + // + mPrevHKOpenValue = openBuffer[bar_index + 1]; + mPrevHKCloseValue = closeBuffer[bar_index + 1]; + } + + // + double mHKOpenValue = (mPrevHKOpenValue + mPrevHKCloseValue) / 2; + double mHKCloseValue = (open[bar_index] + high[bar_index] + close[bar_index] + low[bar_index]) / 4; + double mHKHighValue = MathMax(high[bar_index], MathMax(mHKOpenValue, mHKCloseValue)); + double mHKLowValue = MathMin(low[bar_index], MathMin(mHKOpenValue, mHKCloseValue)); + + // + openBuffer[bar_index] = mHKOpenValue; + highBuffer[bar_index] = mHKHighValue; + lowBuffer[bar_index] = mHKLowValue; + closeBuffer[bar_index] = mHKCloseValue; + + // + double candleColorValue = + mHKOpenValue < mHKCloseValue ? 0 : 1; + + // + candleColorBuffer[bar_index] = drawCandles ? candleColorValue : 2; + + // + openHKBuffer[bar_index] = mHKOpenValue; + openHKColorBuffer[bar_index] = candleColorValue; + + // + highHKBuffer[bar_index] = mHKHighValue; + highHKColorBuffer[bar_index] = candleColorValue; + + // + lowHKBuffer[bar_index] = mHKLowValue; + lowHKColorBuffer[bar_index] = candleColorValue; + + // + closeHKBuffer[bar_index] = mHKCloseValue; + closeHKColorBuffer[bar_index] = candleColorValue; +} + +// +// END Functions ... +// diff --git a/MQLTestWorkspace/X121/Old/Indicators/x-saherelm.x121.xhull.ex5 b/MQLTestWorkspace/X121/Old/Indicators/x-saherelm.x121.xhull.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..26519fc32b729d2afef1aaa856f1413c131b8cab GIT binary patch literal 18792 zcmdS9W3VVq5G8nR+qP}ne%H2b+rIDGwr$(CZCmrc*`1A;{W1TiI;y%WPex~-%Bsrj zjuusC1#tik1+WIN`6rPC zQ2Eyi|C8DN)BX?nzq$O!*!kZGI00}0(EmG}{y)AZ|C2A>zj67$o8kZ2JB$Ey|Gdrc ze^&ZGpnN24>}?o5&Mefjq>Gr}Xk_LMLUwY%+^l=`bU2vx0cS-R#Hl@ga5Yya<**W1 zcl#`PJIU}Lxn6(1-u>g+3J4;<%an%Wro%_%b@aK4N5Zk+p=os zT{LtGM4o_y^Rk}AM%r5^979bB_b1@%U-*3w zkU=nt)pl;sG>0Xt{)h?87s0beFy!<)%BYOh-gB8QFc`xc4qHk^e*n6EJcB|8`5-D^ z8_ojD@&$^b(_0`|swSJY5g?%@D62x15J^}*$ZEl`U`3Ik@CivZI@t3#ducgw(A>k@ z!R4dnnS#R@Xxw@&Sa_Mh>)7LpFunN+;nawzI#a3CSEz$QI@A!!5o%;?Q&?wB;mHS& zzES9aio&`wX&~=BU#>lJ3GS- zo$Lb!?ubwk4+$>%yjup-Q`VQI49Fu@);OksBxQsR=)e?XSX+PzAG&{wPS~P>5NEH9 z-=$60+^2GtW;pCoRm_&5jv>VC1MPi@JagA|Sx&5VpMx&hg0(g=JggYGj7Oh5XjLJ| zgQ_iu-NU0U+peakEAz@&Yr1lexDgLQoqGc|_NfM>&z27J9_Gj{T{XK|$$fMKG8v|B z5yXCC3t0TDeD4owt`88!SxUY{q9}R4hK~3+$0!v%7U6;~Oc(EA|-d#-AH-Y(swzuZV4yFbb5+960eBR0M$o{bw zziA4@cN*##-MD622@5LKGq~w)z4vZ0J%N8+lcrzN`83lTI!DMt{9PoP5as%ErmwB0 zpULFF{S@}cO7w^15bh63$_k)#m?_W2c9q_*GH7Q6}7cU^vVvk3nzzIbw|SubICksT(9k&xAu z=;gegrtEt0JE`M+$C_(n^PPg)J=>xNrpRayI;uJJ+XJ_ro~5z&ib;vF)G~mZh==?1 zHOL~g7I+S!QapRx>H~UMjZSltE@0aQsSrXK@OtT--6%%p;kp;ox021OJuM!kIY4<5BZ<`5h>NrrzbafN_-+&PDE0M|1Uj)y2#DW7%EsE&% z`}eR{8|NuSy_FSvG6^(x4qD9uQbV8a*QLwkj-R9ANnlyAXYGbbdl;uoyg4DLrhQ~{ zuCC*PS8_gqY9h94nX^X*_5*N%+x(2PEm$jr1P3E}`1#KB4Q$3xGq4&La_^#Uj%$u< zY?q_0Suw?~eh5fR666C5{$u=EzAr#mr*gBLT_oiTjC>He8_mhT2*t6~5xpwBayR$B z>@#v@csz`C;LdNK0>KY@enr!UTn3^Pn-^(--Q7+(jRC(;+ua0sw@mk+D_i>KHWL{A zSW03J5B_W)P%~T8gP1E2(=cW!fUKa?Ul~kOO7?_*l9Pion;@yjH#i0{DW|B!WsFM-d!k za6S=Sgwt-59bEGn9zc&e>u7+i-tcu%9o!`v5|4x@Zf_Oi>5p4#AQ0(GRK~I54BIvj zvbg_7(QA?1!#8STHt>^7h~1w02xIL+&U6E4bGt*@U2{31&f7#D(Qx{198nkHF}+SK z$jF9ZWR|p5@4SVBzMTFs8xT!hm|;I>dnUf}f;xH0wu5*=P-1EvO|cR*ZlOMW@`rPk zGEtrX>g#hf$rFUs(svYY5xk<3vDzyU zxFb`sI>4)Iuv5{;F%B{(*BxARrBQ02NEV>g$poYE`yyMPsS=pm8U%5d!Us6QV`*R@!P-;ylE^i}?@h6TQuw00{uMLzBsFQJ*2E=hZ-&;}wClr(Y; zs*VI@Eswkqb!>6(-if&M*ggd&uTsE?r`xe{DIJgtPWJ@Ac`dEq3#rg8A5?1fdADf$ zd*-ESv#;&J7_rrXtVn?gweoa%uToe4CYjJX3uj)^^%Vt1`T@K#uHbAHKZ??$1aBTr z<;qHE`rvyhCYT*_BsUB!Y|J4LyMrS~}DWP@x zL<33{@#py>xqtb%d}32YCUn=e&M##a8O?UfS428*eB~o`0;}BFBxR{Z6)F%^A^DJy zfZ>7W1#lnk%C*@h^$sLcA^#*ioM_g*-|B%0=AsQ(u}i+~DX3G|vPGkx4;(1mN_;&TGqbzlw<#-{+ZR5B>SbFBQ4B z^iiIKSqSPB^yb_%*CLS3xTJ&C(>ASs#1iSrd*lOU28Y|3$6pI{8?Mye~Fpb8$sNq1c0JzPFw=#Er zS$4y${V7yXFd2W!CFoiZ?FuQCs`yl=cp1$2kU8!fQYq5@+~$n(-BJC>WroQ^sVbY} zKJM2pQc}^mvfs65zLF|lZ<*3Q)H0EAW!>fulua()dgPG_lrNz<@iDpJ&Q8KE{th&^ zImN!K8+G2bfY#T$ z)mWH0ScgHxRbuRl{Fm*%8-{*&m>f^ z+O9+|=*7BG0oTe%{i1}w3x9%*>NbZvW%0qR8Dq`{1gYG9;REu6C@+>OnSRPIRf6xw z&I$R#57`&MW;FlwS*9;1<2ZJizf`)dAc)7>^$e#9lA+5a>y7v51#g`Qlc#mgiH?vX zms@~6IJS+AeibTga3{cO!{b5tbOpEW2cbbtQTmt; zBb%j~u}avu@*pm+*`)J4r)r3zso6;S(EC)w^?M=BG)ZLR1!tH@#iT2biK-|cSlq8c z0DHm!DU#}Nr>BTahwCRcY;vax(g|UvRpA;%@JUaa#WeQytH5F3#c*G8mVB11&Y~=o zQ0_K~9OoynPDw@NCA5fa-EOaFZf>KH?~uP#YY6O4`K?Uo7*bb{g&?-j+OQjC%&!~2 zq_B0OGAkoX<7neoVc!Lv)yL0IRI&HDwSY33BdO$> zOj_HnA>4Hw$6-@AeHo;ZyoBdb60v=bMQm4!m+cCGUI++{ZdMqJ^?jzks+QGMI3LDx zwYZ2AZQE6!JIi4~q}9T58T3#f3$hWu8F^Y{Bm(S0=LrdviA{6Tt69DwHIY*L!rJ)o zVygiC(Di~6-~_GlB-fzMrDh1@r5`n|gv#@k)+P-#>cQ@lE%tcMxP*!N7y zF=4ofW~`fHnZd>u8g3A_vX8KJ1N+1`o)JkoY~@Q@O#r=#$%J`dQE2MrFJMD0Iq!o^ zxO~|Tpr3t#_>R6~uzQ2!=gtuKelQ5~#U7D;r6iX^CN1dHezP}^-3PZeX)-XgLMcwW zaKhN5S({5yjwgA#jrpCi>I#{Iorc1ut%T7*s}ZQ zYds-t_ykI?0j(jdTB~&&>1Itko~plU*Gc@BZLPn_$KBVL{1(QVA)FQB+>GtFZQ%7}K88 zNwK3tZ%SdZ2YFA~k-xg;RE!!%*Z3oKcL|e^rg~nOl%_iM*MiAw;<0hzJvy>6xd z^b2<|44JIHT4Fi}!hBX$=EE$8F^a{>8H;0gjxgMjJ86hRU{{z1%`T62<-DVnS-|K+ zn;hpK)qLZhNp`m+A3m!%B;r;fCex0c95Ir6l=6%x;nn2&T?Z4>>^4EBq{!RW?Goko zUjgclT5{%0sm@U{p@g>*m`{;eIJEipvJTrbgBRS(69GPs6Wf+VQoLNX!PmqmutWE(Nb^b24v8Xo)n$Apg z^h+Rw@CKEo#LJ5^hT;zje_Q|Tn9Znd%rpYG5$&jSlwHgzhQmvf=eH-`;2Fh*x6Wee z%OtJRp)SL{a0)SZeP5);R<$_DVOKDoMNuscH{~)4&y7Fz06CLTL3iydQ)yNj^T~I9 zK&CnA_!K*uce|RvrPwI|&@)6)X-_C32{8)VcJ#ef{Fan#UrWJ==jn%C`vU}GZRfZ5 zH~_7S99Fwdd}6QO|1}8=joPkVP?FC1$1%8OP;}||#AWl>esvG%$%PXO2aksg8*MeP ziA=o&BZQZEnDfKQ+vw$=D@# z=94|wm*PpC;$ky2B%%+t z@(gYCaa~;$ug+lA;Wa08M<<5bsI^_HQJ8dy zenO|p`KGuiD&>@rOME3|Vfid+cT3*u3wBnuEL(+RB0JAfYKk)@{t6GgCGV8Sk(7-Q z_SC7AU!A)Jd~0so?TP{)@S$4Jf|tWUA<~qYFgEvXEvPN52xLPQ^SgA8zc48W#^2}4 z`w>y!v>mk}u!sxh{DCnrT(Y>)jA2l?_iW*EdTx50d&%e>Wk~xYGMBD3uIDn2kCA+% z=Xoz(H(WC#CfDM%VM#PzVD@(51?T)^n;%D+ZpS4g8A&rKcVhM=DU;Za3|o}S@2Ets zqwV4kKlWRzS6C!(yjYpp=Py$gI^&L~CaF6<|C1-UV~;I|+)btU(w%+Q5W6mgh%1aX z9?wUK-J@lw?#5k5!6ViNN~k?c4JQSSM_MxtvnHouBjpZ8?qPqVm8O@H5Xb-h@cPlw z9I}&3Le!k}dM_HY%p_xDDH>j&#G{8(zG5F>u0GL-{o{kVNT&x*oi1&WC7kJ8wIGdf ze@>u|b1b<_2M8;3p*%9gcFn)68`RkVir+R%10hwVp4&Y?97Ndz7TG`I!i$Yus4G#n zgl8oS4$D-N>P?rkQP%{(Pfdyy#~0GVlna5e zee0GRj;p+W*mXUwJ`^d`7dba?T8t*>n*0zC#zjgUw?F6U+srJNXjtS6&glnkK5SeD zt>Tq|X`**^&5!Q=iS%RD(^1nGpR1ZU*_d>lDAfn4XI%io*n?QmtFXT{=1ZMG?0wHK zb!Tt|0yue`MAD=(a1KW4)cocXH;$gSN!78^LcBm%5nAA#PGU(%XP`OqG-Yv`RGP`n z2?4Gn(53^=i?no-LhwODGk5!>NDon`+cUd-sZU=(C?lUf6-VR~0QdATuo-UK($#qU z(H(YpfLb1Zj*};nwyFtgC9C|yYc$6=YN7#*t?v|Sfw=s$m!~+?6o*1KH83sW-PW7N z2F2C6FrY#1rlAR%=^bYe6p`5HsC1N4v;ek;s1Ff27O^%ebJwnnNWV)H*@6yq?@f5BHwJUq&(kWss!zc!EbVbBpJmBXZEq@GMPa$jllUtpKP6u$N}+ zVwNh2Hk%^-lQ7D{GL9bEoHfbGdudM`j0t8*(cg7xHh%jOwuqJ69lSa&tLQiVcn3e7 z6poM&rR}I@WBvCGI~i7(M{8qlBz*1{$5NawT4fpj#`_K&!K#pju5O8a2YeoW^?1e@ zn@M{1z7-AL@HddOUGj5P=7%E|oB}p5B#V|`o;I+`k&DiD`w4MilDj($t`>AQ-5CU2 z#Z?fN4-80tVO{&9QLjE{VAAO#_~QGB$wa`CYFpM!MJu8n1*Oi_0xZdXUa&OJ3zQLZ zlhK7YSr5P^w}u&pa!Nm!v?L45dvL3jrUbu)-m`ynG0asY>lPoAL8g z{q;_3T|8tHSyQw?CZm`qsm81+O=%qA&N?#qw1ybFm7M(s1&7L~=KhsgIlZ%{L%=(O z#Peiki0+u~vjkGb(bp`m)eKX~K!65aySN0o=4g4e9?IB77T+0^rZmTLXyOaQy!W~b zed8zDt=t)cgVKYDkk_MrS+DKz{%OBHZ;>EDGd(`ENK^+NWu9i9^r}gU^5{HY1V2^_ zQCeSQ@!OM!=F*{)rX{XNG@NnA3+Qn7^fgo{6KYb{I=T~Ov4Pu-s*wyzTZ!ksh|cm; z$gSXy(ya+^ylYsr_#Or;e}`UZq2}l$KUJFe<<*HLw*zE2*oK1&8y%@-(jBI%uNfU0 z`0nnZ3?=7@k+FW7jadea*-s;~V0bKCguQpB*Phm?#y6oIjLL^!>#IxD%Uuefiffaz zY^-JTOlB?G4YA!P*ULfb`Cn#uuo5`r$-M`|NnAggU|TH>v1nGC3~KYdlUk>hk3sb{ z^(fTHi+NZ#cb_}W=bK_@5}m~JfC5c=*K?1brR1oW`{v|?6p@rnG63!oNt|=iqa%K~ z4+uDZVp$7AG+)K0AO!Kg*!Rl2RHwE13!H`7!AzfW#|~jpL57p{?!jy1h^>2xQ^lXL z7ra5TkYp=tq_(uaa5y2RPO9(+8cVbIVIaA+!E_Zs8}p`!}Abr4?!`HUc{ zbH<98MJf!~GukQ(*l&HY`qr=xcU7yRNQoqFiqlL8rqRnsTaIYBCwH z4EI?UazBthd#9)E$Y%}(-VXktugCzi%9*2qz&Q{}&z&KbrNg%-1uZ)CkPt`Bml*HV)?5JrI_+DGFp6 zsc;)87i=jw0wH}M5C|9m9GT~yJBqbxO9uo5yHXg3&(og{fru^Dq|BH<6^uOUVRci; zuItLsuFq|yIcuzQf7F2|Ea^khb751)DB~p$qDWNdoKI3D`#-q#?TMXm+6n7A7G}2; zC+Yy)JSUnfP_SGsBZYX5n#p{b$U|&*;&=8@axj2T3GUo`YNX63&j(aFHjT3vt9|h+r}PMqg@4 z?U|PGa`~0jEl}$H0Zg%B{MAa>VtM@D{}Acwp)fSYdS60cvr1L1ix!8r7&N6OgOcgX zMiLMZ0alCdjFmO4ZiU?vNki_OP0qk7=P&RmEIKWs;ZWt!#YM0aG{bE zb(uuhQBUojbc6vVjmHS^kXzXI=oAt3a#FXgCAWkp?7^Wgfq*%_)&O7*{|=BGnt!2% zAu_uf(#grOxwIKIsBaXk`C`ZVf8=_H(VzIEte!aBf|r@NsRR~URlX*d zwKjk7@lIYP__p4s()}V7HHn(6X*sqza5xLK4r?{H$mReu(4{G?8A&+L({S7lcngJp zyf(t8149Ix5SyVVJroI@Uzdx)@1(wmYq3`*c0A(u?GlPgcD)w;z)-rUeC{W+ApomQ zz4EPe%mFx(>u;ns)kIbPIbnqZmb$C{X#g)d2CfS18RCW=ZO7{^Cp`VxMrLx;&nkw( zfFIhng!z(sD&D}8bX|mD1<`FpS&1UWUp7Tv`tq60q=%7-@s1T|84AP<<-OQxew zZwyY7E<4qlwr$7@Yypq)ZsL4ty5DhG&@OOVvGOuaz)n%m_e9M}V{{5ps{u8{jUT{vyPwd_J*j02_EzH(yjRp%RBSdqD8RnzDS= zeafsoMSF0fbQ#`cG%du{9X7_8L`GA)d}>=x_k2$7+?8U=P{FT_1-klip9t9}lP4fg z%i#?0Go6q<2)wcpIZt(sW55DRB;si^&!Cv{9Sq51*~Yndc;KJX5HAHnySRyB@0#N; zUDuf#?bihLSTr+I)EbkEr_w(%+C6#~8G<7UkUJ-?V9&o%=x(YD)RshPiZ>&+s6X~& zWbO{k2(%kSCa*6FQg!?YKy(7WRs9hAzY)|9^L zQ(mp+M4(szbLL@Uar$LOkjj}csI^qjR-FgE%#=l&k2uI@kRnp?j0rLFs&lCc5vmoH zC%v&BK>DWl-eQ8r*8djCAnQgpu82+a(B>;7`J>)wUxnsst8-W++76dJp0$LkUU-Tw zo<1+099EwD?N{6u%gqta2bTIRo)0$cHANC1%Nnd01j`8IgFm4l0Z=Rc6L67tjyXx6 z>;;wI0Ac{@c<|U!QIQ-qn+^`tXz8%P!{EUp+qtf*I6x_H58o0nsI8yrq8eliy$bK< z@Iul6L$M19NMjBc&3lKTnP4z|52)iD5c_)}WechFMAY76cOg)g^`S**kjRc5F28*9 z#~Bt^C)cdjKbQfb`PoIY%pU!86B+Vp;Pen&M;Wlp!`z-MALMspcqdEK3&Oe3(iP4x zVFxwNKeltFc1g^HK3+5K*9*e^=2>=OhD)9MY+5S3dYhcEY;!*;#vn3Ol9+uPx3&zr zS8nyl*-niYTX0enST$yDNG5MB3xaOO-=$wnABhMCWk_Je?xwpOFiIcfxyqh8T*zys z@F1ZH^~I+(pG?R9V0PoONpZCnk&N`|M3ZU=sxHz1!@HB^#B!JPgs@!d2?~dUC`}(OX(5NXFGG} z%l+ykO0W%)UD;g_LPS*Pu$dRl6PLnqvkO4Q$g;c~uH-GuMrzE0`7KSH!FC60-y>30Fk*G%OR6%DbtEU^up8x24~8R_+)oan;ZoCcTEzFanS{#wqEqC3c`i?B9Zgf zFnbbW(CHVL!uWlM5^4g36EXwIEF>^2VfDb7uOFlJ`n9fHB?EZ(Wyo)BWLkMg;^5sw zknj3ff(55nK%+oJ>8ORczXDI8!(Ys!7x>f6z6A;L{wL0d3Gicw#jR?uzSx@2E7weh zwjnUT4=9jL?#ROq$Eb5p0s=Q!o4LWvB*2;>EQ1|nHT|F8P`u7_NDH8irYPrY-ghQ}%L$-htEQ^OM}++~HDPqZG!a_ZfJ) zfP7jzU=Og34PJ4QI|W$yZr!TeqDCZ|pqjaF>9mgXErY2bp&4LO5_>ekm#ws1hSkif zCgy3cpNx{W3IXDmFKBu_T6%!0tlRP-FjDy|o$-aZEm*Bb-MB$GpNy2Q$-+D};7zdc z?xpOBu2Gaw*w7`9awEyvTn;d5>5fMCsnoHGwu%j{Tk1sMrAj6{YN}1-egcf)A^|@M z6`8!XD;T*nJ09p4snQf!Sd@;x7w{~#4!VY*_;2Gp6)Zr-P zy6ZVz|2Z{cf@duRq6}dWvh*DjJl-o3qvsGCl+5q*fXB^j>Ht{k1)}a=N-F+MilGZV{TZ`T;7Upr2QEgy0 z;C9xMDZRW(%_BH=-#QQNsjJD=bzQYC>71kVB)k?1VwKZ&#ul3Z2F3HG#Tacm5`drc zsJl-r)<)T<*|5N2nC5E~6R}E8gytk#uM&{auW{Qbj%*Tg2{4@#X|Fq~2-l}*Rn9J? z4i#+*w#wvc`5SSg^0hvfA>9bCypfyxBqlJNlu@}5P$%}JPozL?W|LJ$khmQD`BmB1 zwxJ+E4oK01BldV_vni^4{e@S$=q=2;)>EQIE@cY~W0`05On?t;U(2>i^sM9wWiELJ zMAqe}kUw1o$CsR0r(g5EX(CU5(*8}PdY6cQ6Q*W#(~OV|9e&&wkPqL%J9bp2zG|nrDSIobN9SIMi+HHb!~^^i~_`;mOQ zejxYPx-ya0U9)x?QbqBEG&J_JD1d%y&%e})F;pEm{dza68H79zP=R_ zdIN_j%sQ`!)WbP9ZtS*}LQ{H-?2-*|avueEHdGxTGp(^t{11|R^y169+Mid52GJo6#@Vw$VoZedd+3 z7T8mN9?p|l^-kSxl;mDvE()&xz{k$yzSYBB;SVJ+5@|IPp#1h-uh=9e8>aG41UbsF zgF%{6q!q-_f8a0={YW4oI-941evHA5R~LGG7SDV!2riT&as}ots`#L#n1qOt6 zx5PW4?0zS)0u44ttjLJlZWyqxX>ret?E1K}r_J0cswoKKM6c2Zr8)2Z)uOlIrSN0- zG6~47z_AVRQgw;QK=AaCD#u{Ov|9T;Vd^nPzx(hC7(x5)Zok!w9DjChDX>W}ZQgN&8CcI}i{^xcEre_)lstq-ID{iJ4uOmYC3x>zn0&)5{Oh{)# zi4b=iYqF+bZhHL zuZUwDl=8Aok+Ohi;dVgq56FL*msu5;-zBF`Ny#qCyWmR1Yo#pEx)40`* zr(=IS!QHN(Waf8ORqsm1Qd-j#y7CO6gK{3n+9Vv{foWUf06$&19t0>H(`s;w=~(!F z82|;8ELYDy&@<({zTO)Zi21;T?RG^Z4vdFw{l%!$!K0B(COOyglqe z5(w-&CLuqN(|4O0N|oG)0*z$XSQpJJ(tw^oiKEk*NpWP*ZUV8#p8h&E6@Mq2Qq$*{ z=vd=hx8czPL<5D>R}5lqB#3HU$jla#R_5m@kLhY)b_+W6z=rbT7pMjpeg)&3a7a6J z9qaKzUDZ)GUqfi-g27ebCrmt;tkMM)FbPw>sVxE+6taaAirp3dfmbJLP){=+(_s6P z2VzjNzbm<9pm);ge_fgrPL1QFbV^S&>cD&j6S+!22r2H!@@*pNsB>Y6vy^_1Hm~#z zgWl=+`LK?%#>1i9PEIg(Nv4*t5nIuG+2Mo@T~3nK2!L+bu=Z3fcxmhtND9!>{Y99J z4f9$rDZB-P_GhQ{#{8l&UZ5>Z+J}Z?5dJc+P{5#Fp>YM6l0cmu^{-Uc5Y3cVcVPY> zH<8dJ2Hks%qOEXpFoB;CNmLS}2;uAGA2P30z*2a?$s7N-VsV@5uu3xD=Z zu91B;G{o2zY!{aP&ZF=h5!VyU$Pg;>2!o`f>s4R&ja#X{-FGuMbV`iB%!Sy|l^L@V zBglWdGCI}IW|V>GpWUP;goaf!RFBFsv-~Zu)h$9avAEsJg`c-XIkQU^!Chnu>UOxM z$NHhiO7qsr``D&fZ;iHUt$TQivb5mjPdKFJjbH;Yydta7w_-O4BnoX7D>Gd;@AwJH zMNuXO1(c_>sxldIea)$Mk5$+_{oinwb^kW?)p?P;+?Q-ubt@ zA>=yYk<&x3<;%Mw3XCI(zxwb&`BRVxpl=DFBWz?6E@v<&%6zn=LsHX}z;$UnC-F>Q zMBYbFohz6C;CCRfdpXSup~g4_Q8o6&I^M?z$I$LhDfWdHGIoE1ZQu&ZHl;JgLCo|c zjr)HM$e3cWP>_Osor0s~?^Ugw$J`TW4fsEPDbUEu@G}9W z=LBlAxM+3~U)If52iyFDauh%3>y8gxjj*`}*pvCgfPuL?n(2o^hL+Kxp!y`Hi8G1~ zWHMs<8N#mE0+pUikv}z&J2-AHO&;`E66pmlGf3YFwt?Y5K z9OjanMOWWnkM4)kv;6*;c|5gM#PMTn^^=@y=iy!9;?CSbl+vV-h!YwVN`eSe6WJML zDxq<#d_vba6Zs8nLWC zhpNPx-4D}CreKE>Ul;;F`|RM!RR52v`Q;fbaHJ~;T$xX{!t`w5J6Jp2*WE_F5Zsq*nM=}gQs|e) zqY4Uh@hY(FvzMjv@V5GkD?L8^Ti)0~=*;s5|2$fuiL_D?+W^w~J?ub_t7pmYfF2O+ z^TRV%crbAYi}(Jl&UAaBr43lq7DN2Vj3K<9P1eDPQzskWyNlgDum~`J;JUD&wEMh- zA0B})=StXKbzh~rmCGSKpR|Q@lhQ=1tT51mfDr;>Tm0{Z`uzi5owVO>2F{py^&Tb%L2iLq^Ds7qSUI%vvB8YHz-xj-=1TL1%6zYe zJ6<5)4O9KBmGMJl(z4=T6(!T0`c~5}N}mAmC#`PzoBKy1DWJ{7djU_ff}`2$opEs% zWc7w-fciKdFt*zJM^jM|6vIYP*=_2zk`d)=Ck(`p>OSM~H|7k5!6^bSAoDHk%j1hd zQDV*q+3jNIBnJr}cvOj2@CLh$#qU*im({Eau*B$?-}jqa)HGE3=FF@wMD!6DkLh_e zkxJNEbD|fYLM@gHNrB+euIe-tQN8V!B%g|!(_?G_>vRt#%$*pi0obws^>-~!e9;zz5 zJ-}E@RiuH`)&XkZf-iSTF6DOt{zB?B<;GG03LUY2sOe!OLR$LzO^wbJ=iw>Dvvv=| z%zToNCDCUcyl$FEAJFw1B}$^}pNuEQA~THZbIio06-f&6SJ9L+hCaB?h;p`g{HEvh z{w4QaILSKG^#eAARo?o|%HoQpn&OjDxSW&9i84R)4*=%8yDW{N?$drovkt#w!Gf#{ zZ6t8B7_*~zw31SDpX;o!CkdH{U9mDt;O+zrzL(jMBW4@I?A?hQbO2u?A^(kTh_)0f zDNZH~tb_i>pe9haUj7&fG`%a)=^xm2V6+ZA+3?$H0!p8HhFO=Zp0;kNqfMM`zL^x) zWG5-BfAPmg5bOr(u!vZ>FYbKo^}5U89e|V3wz!S3pDLj=lH@00-)``s!c9dZk46v&^89pT!^S6h zaj-8P27HE@{6&$G^D3Ae14!h6O6+ph1zs#1M>zY)GOoK@yZA8?6se-H56ec2y$v4U zX_5}(WV&1SIwJc$A?3?i=@|>N6Epio`fpvdw7ce4L#H@n63{`crsF6MT6q82uYgof z6dM4!MV2)A@{Sa@AzHKV$#shx{Vk46@$R~W%Y4Ls}hhqR(-3bHhA~09P^nYw}u34xiEq+s+HIYABxzz5>c$ zr@r{Zvp@90!Mr(it_vdYjzG{@088bqc8SoQ2tJj#xwA-#jwa0;b*5)4>4 zpJwv*JFqtku{eGI=-kE+GWgS+Yya`n_~6LUV@<-x1ahZFlXv@YOF;kr(RK2m5Cfb# zW+sZb%;u_YHH{U+UttaI@qFPR7IxO#4mK(SD!j?{fx5&-QB|L;DEAn}5aL!!#=3w? zt!LHLbINT{?Ytn37HaN6Le2nkZ4O~zeVooecvc;WB^FYm^n$f7bQyM_>u)>giXL$Q zP_5%(XsK$I2QfK` zmMCJjEGJnKH;;b-DCBAvWDe*4^5z;l&SKmk2H5kM_;G+&UV0!Vc#2a5C zju-T4c*kP>UFko@(7cJXs)M@WycqlM{Uat0XumONo`}HwO{~%@lfv+#Z8WKS&RIZN z^Zi!eqTAsGRDPu>r|@o~AE*(f$l5SKg8{Sh7~@MOTy%XQ*Q4!)<()jp&jZ2}7s)=w z`yDx*43UyY=$+x5&`gD-j&r;6M@@%T|PU<;A5~(+9YIt=O zc_`DO6+)|!Ie_d5B|jGJ=<)Pl{$twmsU_Ibi>$UI()K#qKcYfMYARmA1vGk|BkT+U zD^UIY(<#gYe@OBbOQ3iO-j%1e z4d%c6|FOTbZ$+9>T)k5o+24(9?A*hzLEOy%?|28|K)duPIPu2Q+2wS9W%b+t8$CNH z_~`w&=2F@(k&LPt3T#lj#d%T) zXSVR9Af0!lD(aU6oF0c2A20Ga=;t4vUoG1YqoNv$uOMuxtgf#8oO#Wj1eiw+n8;U{0Ra5+@RtE zcB5NFrc?dA*3~9czuClj?O4;LG!qjxYDRy|w+0Rk!BZ~nGlw4jwwQ^be^9mu_Lhov zx%jsCz;wrSLSpYJv44(Qgq=a9)DCqsrchg87=7_D04e>La%olZQXS=0bgg@v(kG?u z!jZA#BeHWWl?XDwh*m{F9PmGkX-+qG>`~6Q=I|P8Ts=;5y-2eECS99UwM7lm@z17@AuV9d9ms|7 z>FhaXTfT#l?W%XH9T)QpF-yoDqjrcF(>|sm z?j~EnU|LJj<7>8btRv&vBWbru=F8*C?Sd~O4$+|`Q{ECGv^XPpSZpj6cYiF8>9E`7 zO1nRDvsG!`!LEt1FY-3vjci~teb#I!-uEtXP)+RwpVTqUz(vJ5pxmZEI^Q3FYLCJA zni1-cgB6Iiv6PqL_)phzE`mb{dqUDlg^%(n_ru~kdelwbLyUSuy3$UveKdMAgzLtP zr8+o`>PM-HOQE{q@72S84(P-9fEjX5;Uw1EO1=O_SQj7~##_xvB-Qtu6h8xzbzsHX z=eC4xHa*BTS5ZbsZ4YyD2NLYFH^Po9XGFKcP)Jqie#c}K#e$@z`?U}|NOhllQo_Gn z#P+XkM+X`Z5Wh!uhXotuN@quAQ67`Oa%}~`w|aKH7}SRpya?m2nUR+7j z;cc{bswLsvA#1fux3;O4AY+`QQ#0GvN|DpR&FX6b%838=d#)7NWDFDu~%o` zzp#h1E%Y?vi*8;td)R6!-1#hXPEYFwoz^eUzDL75p5CNEIN=?FXpz7Am=oxcfft6i zua=eL_EFVzEQCP{c|_1lgOTtn^~K;kc-BkbL5_GuxYSIvdp3AAg6+hPqdYc`=t-xH zNu#*q?bpG84C=x9ej9L5-zL=ENWlI`Rv8`~#9hlvBG>hu5{GRV7F!rN zTnX{4GUPCR#i6vtoR~UVE&~x^#yVBE!7?C2WmjN+M(`()@QJ$Y-%Y^E2FK-4Fs%mB zbDtY&_uF-kUV-Mkj}9xUh|dgQ6tGLc~0TYH@4v9n!M1( z;#wdfgm=kpqbO?*+`vtT55NGmSZfb+qTNISb$-$oodb8ahJc0Bt@k*P@#(P>GGaMr z`IE+8u6j56^DG8blEsS0Blq#TEOTfjOM?G7zwGTJI9drNlZ1$GT(=ptO?64o_Opy) z!4OI~5&ycL&$>9Wk=8I1UJvcUq0!0=4uN3)`g|TWdNRrv#KX%xDyi(K?O%ezZr`;; Kd5X$u?pwCBhf6B} literal 0 HcmV?d00001 diff --git a/MQLTestWorkspace/X121/Old/Indicators/x-saherelm.x121.xhull.mq5 b/MQLTestWorkspace/X121/Old/Indicators/x-saherelm.x121.xhull.mq5 new file mode 100644 index 0000000..dbfc3e1 --- /dev/null +++ b/MQLTestWorkspace/X121/Old/Indicators/x-saherelm.x121.xhull.mq5 @@ -0,0 +1,602 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 Indicator +// --------------------------------------------- +// Name: X121_XHULL +// Description: Hull Trend Indicator ... +// +// +// Maintainer: +// ------------ +// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) +// +////////////////////////////////////////////////////// +// +// Global Properties ... +#property copyright "Copyright 2023, SaherElm IT Center" +#property link "https://saherelm.ir" +#property version "1.00" +#property description "SaherElm X121_XHULL Indicator" +#property strict + +// +// START Constants ... +// + +// +#define ShortName "X121_XHULL" + +// +struct XHullData +{ + // + double value; + double value3; + + // + double wsum1; + double wsum2; + double wsum3; + + // + double lsum1; + double lsum2; + double lsum3; +}; + +// +// END Constants ... +// + +// +// START Includes and Imports ... +// + +// +// Includes Common Library ... +#include "../Libraries/x-saherelm.common.lib.mq5" + +// +// END Includes and Imports ... +// + +// +// START XSCHULL Class Definition ... +// + +// +// a Class For Hull Calculations ... +class XSCHull +{ + // +public: + // + // Constructor ... + XSCHull() : mFullPeriod(1), mHalfPeriod(1), mSqrtPeriod(1), mArraySize(-1) + { + // + // These are a way above to assign Private variables at Construct time ... + } + + // + // Deconstructor ... + ~XSCHull() + { + ArrayFree(mData); + } + + // + // Initial Hull ... + bool Init( + int mPeriod, + double mDivisor) + { + // + bool result = false; + + // + mFullPeriod = (int)(mPeriod > 1 ? mPeriod : 1); + mHalfPeriod = (int)(mFullPeriod > 1 ? mFullPeriod / (mDivisor > 1 ? mDivisor : 1) : 1); + mSqrtPeriod = (int)MathSqrt(mFullPeriod); + + // + mArraySize = -1; + mWeight1 = mWeight2 = mWeight3 = 1; + + // + result = true; + + // + return result; + } + + // + // CalCulate Specific Value ... + double Calculate( + double value, + int i, + int bars) + { + // + double result = 0; + + // + if (mArraySize < bars) + { + // + mArraySize = ArrayResize(mData, bars + 500); + if (mArraySize < bars) + return result; + } + + // + mData[i].value = value; + if (i > mFullPeriod) + { + // + mData[i].wsum1 = mData[i - 1].wsum1 + value * mHalfPeriod - mData[i - 1].lsum1; + mData[i].lsum1 = mData[i - 1].lsum1 + value - mData[i - mHalfPeriod].value; + mData[i].wsum2 = mData[i - 1].wsum2 + value * mFullPeriod - mData[i - 1].lsum2; + mData[i].lsum2 = mData[i - 1].lsum2 + value - mData[i - mFullPeriod].value; + } + else + { + // + mData[i].wsum1 = mData[i].wsum2 = + mData[i].lsum1 = mData[i].lsum2 = mWeight1 = mWeight2 = 0; + for (int k = 0, w1 = mHalfPeriod, w2 = mFullPeriod; w2 > 0 && i >= k; k++, w1--, w2--) + { + // + if (w1 > 0) + { + // + mData[i].wsum1 += mData[i - k].value * w1; + mData[i].lsum1 += mData[i - k].value; + mWeight1 += w1; + } + + // + mData[i].wsum2 += mData[i - k].value * w2; + mData[i].lsum2 += mData[i - k].value; + mWeight2 += w2; + } + } + + // + mData[i].value3 = 2.0 * mData[i].wsum1 / mWeight1 - mData[i].wsum2 / mWeight2; + + // + if (i > mSqrtPeriod) + { + // + mData[i].wsum3 = mData[i - 1].wsum3 + mData[i].value3 * mSqrtPeriod - mData[i - 1].lsum3; + mData[i].lsum3 = mData[i - 1].lsum3 + mData[i].value3 - mData[i - mSqrtPeriod].value3; + } + else + { + // + mData[i].wsum3 = + mData[i].lsum3 = mWeight3 = 0; + + // + for (int k = 0, w3 = mSqrtPeriod; w3 > 0 && i >= k; k++, w3--) + { + // + mData[i].wsum3 += mData[i - k].value3 * w3; + mData[i].lsum3 += mData[i - k].value3; + mWeight3 += w3; + } + } + + // + result = mData[i].wsum3 / mWeight3; + + // + return result; + } + + // + // Protected ... +protected: + // + // Private ... +private: + // + int mFullPeriod; + int mHalfPeriod; + int mSqrtPeriod; + int mArraySize; + double mWeight1; + double mWeight2; + double mWeight3; + + // + XHullData mData[]; +}; + +// +// END XSCHULL Class Definition ... +// + +// +// START Inputs ... +// + +// +input group "Market"; +input int length = 72; // Length +input double divisor = 2.0; // Divisor (Speed) + +// +input group "Calculation"; +input ENUM_APPLIED_PRICE upAppliedTo = PRICE_HIGH; // Up Zone Applied to +input ENUM_APPLIED_PRICE downAppliedTo = PRICE_LOW; // Down Zone Applied to + +// +input group "Presentation"; +input bool showUpZone = true; // Show Up Zone +input bool showDownZone = true; // Show Down Zone + +// +// END Inputs ... +// + +// +// START Buffers ... +// + +// +#property indicator_chart_window + +// +#property indicator_buffers 4 +#property indicator_plots 4 + +// +// UP Zone ... + +// +#define upZoneBufferIndex 0 +#define upZoneColorBufferIndex 1 + +// +double upZoneBuffer[]; +double upZoneColorBuffer[]; + +// +#property indicator_label1 "X121_XHULL Up" +#property indicator_type1 DRAW_COLOR_LINE +#property indicator_color1 clrLightGray, clrAqua, clrMagenta +#property indicator_width1 1 + +// +// DOWN Zone ... + +// +#define downZoneBufferIndex 2 +#define downZoneColorBufferIndex 3 + +// +double downZoneBuffer[]; +double downZoneColorBuffer[]; + +// +#property indicator_label2 "X121_XHULL Down" +#property indicator_type2 DRAW_COLOR_LINE +#property indicator_color2 clrLightGray, clrAqua, clrMagenta +#property indicator_width2 1 + +// +// END Buffers ... +// + +// +// START Global Definitions: Variables, Properties and etc ... +// + +// +int maxLength; + +// +XSCHull *mUpZHull; +XSCHull *mDownZHull; + +// +// END Global Definitions: Variables, Properties and etc ... +// + +// +// START Event Handlers ... +// +// +// Initialization ... +int OnInit() +{ + // + // Validate Inputs ... + if (!ValidateInputs()) + { + return INIT_PARAMETERS_INCORRECT; + } + + // + // because in some cases we may have more than one input for + // calculation and we must prevent any calculation + // untill we pass the biggest input length, here we get max Input length + // and then wait until pass it ... + maxLength = ExtractMaxLengthOfInputs(); + + // + // Define Index Buffers ... + DefineBuffers(); + + // + // Set Indicator ShortName ... + SetIndicatorName(); + + // + // Make an Instance of Hull Class ... + + // + mUpZHull = new XSCHull(); + mUpZHull.Init( + length, + divisor); + + // + mDownZHull = new XSCHull(); + mDownZHull.Init( + length, + divisor); + + // + // Init Succeed ... + return INIT_SUCCEEDED; +} + +// +// DeInitialization ... +void OnDeinit(const int reason) +{ + // + // REASON_PROGRAM 0 The EA has stopped working calling the ExpertRemove() function + // REASON_REMOVE 1 Program removed from a chart + // REASON_RECOMPILE 2 Program recompiled + // REASON_CHARTCHANGE 3 A symbol or a chart mPeriod is changed + // REASON_CHARTCLOSE 4 Chart closed + // REASON_PARAMETERS 5 Inputs changed by a user + // REASON_ACCOUNT 6 Another account has been activated or reconnection to the trade server has occurred due to changes in the account settings + // REASON_TEMPLATE 7 Another chart template applied + // REASON_INITFAILED 8 The OnInit() handler returned a non-zero value + // REASON_CLOSE 9 Terminal closed + + // + delete mUpZHull; + delete mDownZHull; +} + +// +// Calculating what we want ... +int OnCalculate( + // + // total Candles on chart ... + const int rates_total, + // + // total calculated Candles on charts ... + const int prev_calculated, + // + // history of Candles Open Time ... + const datetime &time[], + // + // history of Candles Open Price ... + const double &open[], + // + // history of Candles High Price ... + const double &high[], + // + // history of Candles Low Price ... + const double &low[], + // + // history of Candles Close Price ... + const double &close[], + // + // history of Tick Volumes on Candle ... + const long &tick_volume[], + // + // history of Trade Volumes ... + const long &volume[], + // + // history of Candles Spread Price ... + const int &spread[]) +{ + // + // this counts Available Bars ... + int limit; + + // + limit = prev_calculated - 1; + if (limit < 0) + { + limit = 0; + } + + // + // Main Loop ... + for (int i = limit; i < rates_total && !IsStopped(); i++) + { + // + double upPrice = getPrice( + upAppliedTo, + open, high, low, close, i); + + // + double downPrice = getPrice( + downAppliedTo, + open, high, low, close, i); + + // + CalculateBuffers( + i, + rates_total, + upPrice, + downPrice); + } + + // + return rates_total; +} +// +// END Event Handlers ... +// + +// +// START Functions ... +// + +// +// Validate Input Args for Initialization ... +bool ValidateInputs() +{ + // + bool result = true; + + // + result = + length >= 9 && + divisor >= 0.5; + + // + return result; +} + +// +// Retrieve all Exists Input Max Length ... +// use for Start Of Drawing ... +int ExtractMaxLengthOfInputs() +{ + // + int result = 0; + + // + result = length; + + // + return result; +} + +// +// Set Indicator Short Name and also we can define Buffers Labels ... +void SetIndicatorName() +{ + // + IndicatorSetString(INDICATOR_SHORTNAME, ShortName); +} + +// +// Define Indexes and Styles ... +void DefineBuffers() +{ + // + // UP Zone ... + + // + // Draw Type ... + ENUM_DRAW_TYPE upZoneDrawType = showUpZone ? DRAW_COLOR_LINE : DRAW_NONE; + + // + // Buffer ... + SetIndexBuffer(upZoneBufferIndex, upZoneBuffer, INDICATOR_DATA); + PlotIndexSetInteger(upZoneBufferIndex, PLOT_SHOW_DATA, showUpZone); + PlotIndexSetInteger(upZoneBufferIndex, PLOT_DRAW_TYPE, upZoneDrawType); + + // + // Color Buffer ... + SetIndexBuffer(upZoneColorBufferIndex, upZoneColorBuffer, INDICATOR_COLOR_INDEX); + + // + // DOWN Zone ... + + // + // Draw Type ... + ENUM_DRAW_TYPE downZoneDrawType = showDownZone ? DRAW_COLOR_LINE : DRAW_NONE; + + // + // Buffer ... + SetIndexBuffer(downZoneBufferIndex, downZoneBuffer, INDICATOR_DATA); + PlotIndexSetInteger(downZoneBufferIndex - 1, PLOT_SHOW_DATA, showDownZone); + PlotIndexSetInteger(downZoneBufferIndex - 1, PLOT_DRAW_TYPE, downZoneDrawType); + + // + // Color Buffer ... + SetIndexBuffer(downZoneColorBufferIndex, downZoneColorBuffer, INDICATOR_COLOR_INDEX); +} + +// +// Calculate Buffers ... +void CalculateBuffers( + int bar_index, // Selected Bar Index + int ratesTotal, // Total Rates + double upPrice, // Up Price ... + double downPrice // Down Price ... +) +{ + // + double upValue = mUpZHull.Calculate( + upPrice, + bar_index, + ratesTotal); + upZoneBuffer[bar_index] = upValue; + double upColorIDX = (bar_index > 0) + ? (upZoneBuffer[bar_index] > upZoneBuffer[bar_index - 1]) + ? 1 + : (upZoneBuffer[bar_index] < upZoneBuffer[bar_index - 1]) + ? 2 + : upZoneColorBuffer[bar_index - 1] + : 0; + upZoneColorBuffer[bar_index] = upColorIDX; + + // + double downValue = mDownZHull.Calculate( + downPrice, + bar_index, + ratesTotal); + downZoneBuffer[bar_index] = downValue; + double downColorIDX = (bar_index > 0) + ? (downZoneBuffer[bar_index] > downZoneBuffer[bar_index - 1]) + ? 1 + : (downZoneBuffer[bar_index] < downZoneBuffer[bar_index - 1]) + ? 2 + : downZoneColorBuffer[bar_index - 1] + : 0; + downZoneColorBuffer[bar_index] = downColorIDX; +} + +// +// END Functions ... +// + +// +// TEMPLATE Function ... + +template +double getPrice(ENUM_APPLIED_PRICE tprice, T &open[], T &high[], T &low[], T &close[], int i) +{ + switch (tprice) + { + case PRICE_CLOSE: + return (close[i]); + case PRICE_OPEN: + return (open[i]); + case PRICE_HIGH: + return (high[i]); + case PRICE_LOW: + return (low[i]); + case PRICE_MEDIAN: + return ((high[i] + low[i]) / 2.0); + case PRICE_TYPICAL: + return ((high[i] + low[i] + close[i]) / 3.0); + case PRICE_WEIGHTED: + return ((high[i] + low[i] + close[i] + close[i]) / 4.0); + } + return (0); +} diff --git a/MQLTestWorkspace/X121/Old/Indicators/x-saherelm.x121.xich.ex5 b/MQLTestWorkspace/X121/Old/Indicators/x-saherelm.x121.xich.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..1e8f4d33b677cd872e88badd5987fb009778e2e7 GIT binary patch literal 21272 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 d^rNV rates_total || prev_calculated <= 0) ? rates_total : (rates_total - prev_calculated) + 1; + + // + // Main Loop ... + for (int i = limit - 1; i >= 0 && !IsStopped(); i--) + { + CalculateBuffers(i); + } + + // + return rates_total; +} + +// +// END Event Handlers ... +// + +// +// START Functions ... +// + +// +// Validate Input Args for Initialization ... +bool ValidateInputs() +{ + // + bool result = + // + (shortLength > 2 && + mediumLength > shortLength && + longLength > mediumLength && + hindLength > longLength) + // + ; + + // + return result; +} + +// +// Retrieve all Exists Input Max Length ... +// use for Start Of Drawing ... +int ExtractMaxLengthOfInputs() +{ + // + int result = 0; + + // + // Peaks and Vales ... + result = MathMax(shortLength, mediumLength); + result = MathMax(result, longLength); + result = MathMax(result, hindLength); + + // + return result; +} + +// +// Define Indexes and Styles ... +void DefineBuffers() +{ + // + // RANGE ... + + // + // PEAKS and VALES ... + ENUM_DRAW_TYPE pvDrawType = showPeaksAndVales ? DRAW_ARROW : DRAW_NONE; + + // + // PEAKS ... + ArraySetAsSeries(peaksBuffer, true); + SetIndexBuffer(peaksBufferIndex, peaksBuffer, INDICATOR_DATA); + PlotIndexSetInteger(peaksBufferIndex, PLOT_ARROW, 225); + // PlotIndexSetInteger(peaksBufferIndex, PLOT_ARROW_SHIFT, -20); + PlotIndexSetDouble(peaksBufferIndex, PLOT_EMPTY_VALUE, 0); + + // + PlotIndexSetInteger(peaksBufferIndex, PLOT_SHOW_DATA, showPeaksAndVales); + PlotIndexSetInteger(peaksBufferIndex, PLOT_DRAW_TYPE, pvDrawType); + + // + // VALES ... + ArraySetAsSeries(valesBuffer, true); + SetIndexBuffer(valesBufferIndex, valesBuffer, INDICATOR_DATA); + PlotIndexSetInteger(valesBufferIndex, PLOT_ARROW, 225); + // PlotIndexSetInteger(valesBufferIndex, PLOT_ARROW_SHIFT, 20); + PlotIndexSetDouble(valesBufferIndex, PLOT_EMPTY_VALUE, 0); + + // + PlotIndexSetInteger(valesBufferIndex, PLOT_SHOW_DATA, showPeaksAndVales); + PlotIndexSetInteger(valesBufferIndex, PLOT_DRAW_TYPE, pvDrawType); + + // + // SUPPORT and RESISTANCE ... + // + + // + // RESISTANCE ... + ArraySetAsSeries(rBuffer, true); + SetIndexBuffer(rBufferIndex, rBuffer, INDICATOR_DATA); + PlotIndexSetInteger(rBufferIndex, PLOT_DRAW_BEGIN, maxLength); + PlotIndexSetInteger(rBufferIndex, PLOT_SHOW_DATA, false); + + // + // RESISTANCE Color ... + ArraySetAsSeries(rColorBuffer, true); + SetIndexBuffer(rColorBufferIndex, rColorBuffer, INDICATOR_COLOR_INDEX); + + // + // SUPPORT ... + ArraySetAsSeries(sBuffer, true); + SetIndexBuffer(sBufferIndex, sBuffer, INDICATOR_DATA); + PlotIndexSetInteger(sBufferIndex, PLOT_DRAW_BEGIN, maxLength); + PlotIndexSetInteger(sBufferPlotIndex, PLOT_SHOW_DATA, false); + + // + // SUPPORT Color ... + ArraySetAsSeries(sColorBuffer, true); + SetIndexBuffer(sColorBufferIndex, sColorBuffer, INDICATOR_COLOR_INDEX); + + // + // FIBBO Levels ... + + // + // LEVEL 1 ... + + // + // BULLISH ... + ArraySetAsSeries(fl1Buffer, true); + SetIndexBuffer(fl1BufferIndex, fl1Buffer, INDICATOR_DATA); + PlotIndexSetInteger(fl1BufferIndex, PLOT_DRAW_BEGIN, maxLength); + PlotIndexSetInteger(fl1BufferIndex, PLOT_SHOW_DATA, showFibo1Levels); + + // + // BULLISH Color ... + ArraySetAsSeries(fl1ColorBuffer, true); + SetIndexBuffer(fl1ColorBufferIndex, fl1ColorBuffer, INDICATOR_COLOR_INDEX); + + // + // LEVEL 2 ... + + // + // BULLISH ... + ArraySetAsSeries(fl2Buffer, true); + SetIndexBuffer(fl2BufferIndex, fl2Buffer, INDICATOR_DATA); + PlotIndexSetInteger(fl2BufferIndex, PLOT_DRAW_BEGIN, maxLength); + PlotIndexSetInteger(fl2BufferIndex, PLOT_SHOW_DATA, showFibo2Levels); + + // + // BULLISH Color ... + ArraySetAsSeries(fl2ColorBuffer, true); + SetIndexBuffer(fl2ColorBufferIndex, fl2ColorBuffer, INDICATOR_COLOR_INDEX); + + // + // LEVEL 3 ... + + // + // BULLISH ... + ArraySetAsSeries(fl3Buffer, true); + SetIndexBuffer(fl3BufferIndex, fl3Buffer, INDICATOR_DATA); + PlotIndexSetInteger(fl3BufferIndex, PLOT_DRAW_BEGIN, maxLength); + PlotIndexSetInteger(fl3BufferIndex, PLOT_SHOW_DATA, showFibo3Levels); + + // + // BULLISH Color ... + ArraySetAsSeries(fl3ColorBuffer, true); + SetIndexBuffer(fl3ColorBufferIndex, fl3ColorBuffer, INDICATOR_COLOR_INDEX); + + // + ENUM_DRAW_TYPE zoneDrawType = showLevels ? DRAW_LINE : DRAW_NONE; + + // + // SHORT Buffers ... + + // + // HIGH ... + ArraySetAsSeries(sHHBuffer, true); + SetIndexBuffer(sHHBufferIndex, sHHBuffer, INDICATOR_DATA); + PlotIndexSetInteger(sHHBufferIndex, PLOT_DRAW_BEGIN, maxLength); + + // + PlotIndexSetInteger(sHHBufferPlotIndex, PLOT_SHOW_DATA, showLevels); + PlotIndexSetInteger(sHHBufferPlotIndex, PLOT_DRAW_TYPE, zoneDrawType); + + // + // LOW ... + ArraySetAsSeries(sLLBuffer, true); + SetIndexBuffer(sLLBufferIndex, sLLBuffer, INDICATOR_DATA); + PlotIndexSetInteger(sLLBufferIndex, PLOT_DRAW_BEGIN, maxLength); + + // + PlotIndexSetInteger(sLLBufferPlotIndex, PLOT_SHOW_DATA, showLevels); + PlotIndexSetInteger(sLLBufferPlotIndex, PLOT_DRAW_TYPE, zoneDrawType); + + // + // MEDIUM Buffer ... + + // + // HIGH ... + ArraySetAsSeries(mHHBuffer, true); + SetIndexBuffer(mHHBufferIndex, mHHBuffer, INDICATOR_DATA); + PlotIndexSetInteger(mHHBufferIndex, PLOT_DRAW_BEGIN, maxLength); + + // + PlotIndexSetInteger(mHHBufferPlotIndex, PLOT_SHOW_DATA, showLevels); + PlotIndexSetInteger(mHHBufferPlotIndex, PLOT_DRAW_TYPE, zoneDrawType); + + // + // LOW ... + ArraySetAsSeries(mLLBuffer, true); + SetIndexBuffer(mLLBufferIndex, mLLBuffer, INDICATOR_DATA); + PlotIndexSetInteger(mLLBufferIndex, PLOT_DRAW_BEGIN, maxLength); + + // + PlotIndexSetInteger(mLLBufferPlotIndex, PLOT_SHOW_DATA, showLevels); + PlotIndexSetInteger(mLLBufferPlotIndex, PLOT_DRAW_TYPE, zoneDrawType); + + // + // LONG Buffer ... + + // + // HIGH ... + ArraySetAsSeries(lHHBuffer, true); + SetIndexBuffer(lHHBufferIndex, lHHBuffer, INDICATOR_DATA); + PlotIndexSetInteger(lHHBufferIndex, PLOT_DRAW_BEGIN, maxLength); + + // + PlotIndexSetInteger(lHHBufferPlotIndex, PLOT_SHOW_DATA, showLevels); + PlotIndexSetInteger(lHHBufferPlotIndex, PLOT_DRAW_TYPE, zoneDrawType); + + // + // LOW ... + ArraySetAsSeries(lLLBuffer, true); + SetIndexBuffer(lLLBufferIndex, lLLBuffer, INDICATOR_DATA); + PlotIndexSetInteger(lLLBufferIndex, PLOT_DRAW_BEGIN, maxLength); + + // + PlotIndexSetInteger(lLLBufferPlotIndex, PLOT_SHOW_DATA, showLevels); + PlotIndexSetInteger(lLLBufferPlotIndex, PLOT_DRAW_TYPE, zoneDrawType); + + // + // HIND Buffer ... + + // + // HIGH ... + ArraySetAsSeries(hHHBuffer, true); + SetIndexBuffer(hHHBufferIndex, hHHBuffer, INDICATOR_DATA); + PlotIndexSetInteger(hHHBufferIndex, PLOT_DRAW_BEGIN, maxLength); + + // + PlotIndexSetInteger(hHHBufferPlotIndex, PLOT_SHOW_DATA, showLevels); + PlotIndexSetInteger(hHHBufferPlotIndex, PLOT_DRAW_TYPE, zoneDrawType); + + // + // LOW ... + ArraySetAsSeries(hLLBuffer, true); + SetIndexBuffer(hLLBufferIndex, hLLBuffer, INDICATOR_DATA); + PlotIndexSetInteger(hLLBufferIndex, PLOT_DRAW_BEGIN, maxLength); + + // + PlotIndexSetInteger(hLLBufferPlotIndex, PLOT_SHOW_DATA, showLevels); + PlotIndexSetInteger(hLLBufferPlotIndex, PLOT_DRAW_TYPE, zoneDrawType); +} + +// +// Set Indicator Short Name and also we can define Buffers Labels ... +void SetIndicatorName() +{ + IndicatorSetString(INDICATOR_SHORTNAME, ShortName); +} + +// +// Calculate Buffers ... +void CalculateBuffers( + int bar_index // Selected Bar Index +) +{ + // + // Calculate ... + + // + double rColorIDX = 1; + double sColorIDX = 1; + + // + // SHORT ... + + // + // HIGH ... + int sHHIndex = iHighest( + _Symbol, + _Period, + hhMode, + shortLength, + bar_index); + double sHHValue = GetAppliedPrice( + sHHIndex, + hhMode); + + // + sHHBuffer[bar_index] = sHHValue; + + // + // LOW ... + int sLLIndex = iLowest( + _Symbol, + _Period, + llMode, + shortLength, + bar_index); + double sLLValue = GetAppliedPrice( + sLLIndex, + llMode); + + // + sLLBuffer[bar_index] = sLLValue; + + // + // MEDIUM ... + + // + // HIGH ... + int mHHIndex = iHighest( + _Symbol, + _Period, + hhMode, + mediumLength, + bar_index); + double mHHValue = GetAppliedPrice( + mHHIndex, + hhMode); + + // + mHHBuffer[bar_index] = mHHValue; + + // + // LOW ... + int mLLIndex = iLowest( + _Symbol, + _Period, + llMode, + mediumLength, + bar_index); + double mLLValue = GetAppliedPrice( + mLLIndex, + llMode); + + // + mLLBuffer[bar_index] = mLLValue; + + // + // LONG ... + + // + // HIGH ... + int lHHIndex = iHighest( + _Symbol, + _Period, + hhMode, + longLength, + bar_index); + double lHHValue = GetAppliedPrice( + lHHIndex, + hhMode); + + // + lHHBuffer[bar_index] = lHHValue; + + // + // LOW ... + int lLLIndex = iLowest( + _Symbol, + _Period, + llMode, + longLength, + bar_index); + double lLLValue = GetAppliedPrice( + lLLIndex, + llMode); + + // + lLLBuffer[bar_index] = lLLValue; + + // + // HIND ... + + // + // HIGH ... + int hHHIndex = iHighest( + _Symbol, + _Period, + hhMode, + hindLength, + bar_index); + double hHHValue = GetAppliedPrice( + hHHIndex, + hhMode); + + // + hHHBuffer[bar_index] = hHHValue; + + // + // LOW ... + int hLLIndex = iLowest( + _Symbol, + _Period, + llMode, + hindLength, + bar_index); + double hLLValue = GetAppliedPrice( + hLLIndex, + llMode); + + // + hLLBuffer[bar_index] = hLLValue; + + // + // RESISTANCE SUPPORT ... + + // + // RESISTANCE ... + double rValue = (sHHValue + mHHValue + lHHValue + hHHValue) / 4; + rBuffer[bar_index] = rValue; + + // + // SUPPORT ... + double sValue = (sLLValue + mLLValue + lLLValue + hLLValue) / 4; + sBuffer[bar_index] = sValue; + + // + // PEAKS and VALES ... + + // + // PEAKS ... + bool isPeak = rValue == hHHValue && + hHHValue == lHHValue && + lHHValue == mHHValue && + mHHValue == sHHValue; + // + if (isPeak && lastPeak != rValue) + { + // + if (showPeaksAndVales) + { + rColorIDX = 0; + } + + // + lastPeak = rValue; + peaksBuffer[bar_index] = lastPeak; + } + else + { + peaksBuffer[bar_index] = lastPeak; + } + + // + // VALES ... + bool isVale = sValue == hLLValue && + hLLValue == lLLValue && + lLLValue == mLLValue && + mLLValue == sLLValue; + + // + if (isVale && lastVale != sValue) + { + // + if (showPeaksAndVales) + { + sColorIDX = 0; + } + + // + lastVale = sValue; + valesBuffer[bar_index] = lastVale; + } + else + { + valesBuffer[bar_index] = lastVale; + } + + // + // Set Default Colors ... + + // + rColorBuffer[bar_index] = rColorIDX; + sColorBuffer[bar_index] = sColorIDX; + + // + // Calculate Fibonacci ... + double upPrice = peaksBuffer[bar_index]; + double downPrice = valesBuffer[bar_index]; + + // + // Level 1 ... + + // + // Bullish ... + double fibLevel1BullishValue = GetFibonacciLevel( + upPrice, + downPrice, + fiboLevel1, + 1); + fl1Buffer[bar_index] = fibLevel1BullishValue; + double fl1BullColorIdx = showFibo1Levels ? 1 : 0; + fl1ColorBuffer[bar_index] = fl1BullColorIdx; + + // // + // // Bearish ... + // double fibLevel1BearishValue = GetFibonacciLevel( + // upPrice, + // downPrice, + // fiboLevel1, + // 0); + // fl1BearBuffer[bar_index] = fibLevel1BearishValue; + // double fl1BearColorIdx = showFibo1Levels ? 1 : 0; + // fl1BearColorBuffer[bar_index] = fl1BearColorIdx; + + // + // Level 2 ... + + // + // Bullish ... + double fibLevel2BullishValue = GetFibonacciLevel( + upPrice, + downPrice, + fiboLevel2, + 1); + fl2Buffer[bar_index] = fibLevel2BullishValue; + double fl2BullColorIdx = showFibo2Levels ? 1 : 0; + fl2ColorBuffer[bar_index] = fl2BullColorIdx; + + // // + // // Bearish ... + // double fibLevel2BearishValue = GetFibonacciLevel( + // upPrice, + // downPrice, + // fiboLevel2, + // 0); + // fl2BearBuffer[bar_index] = fibLevel2BearishValue; + // double fl2BearColorIdx = showFibo2Levels ? 1 : 0; + // fl2BearColorBuffer[bar_index] = fl2BearColorIdx; + + // + // Level 3 ... + + // + // Bullish ... + double fibLevel3BullishValue = GetFibonacciLevel( + upPrice, + downPrice, + fiboLevel3, + 1); + fl3Buffer[bar_index] = fibLevel3BullishValue; + double fl3BullColorIdx = showFibo3Levels ? 1 : 0; + fl3ColorBuffer[bar_index] = fl3BullColorIdx; + + // // + // // Bearish ... + // double fibLevel3BearishValue = GetFibonacciLevel( + // upPrice, + // downPrice, + // fiboLevel3, + // 0); + // fl3BearBuffer[bar_index] = fibLevel3BearishValue; + // double fl3BearColorIdx = showFibo3Levels ? 1 : 0; + // fl3BearColorBuffer[bar_index] = fl3BearColorIdx; +} + +// +// END Functions ... +// diff --git a/MQLTestWorkspace/X121/Old/Indicators/x-saherelm.x121.xsslc.ex5 b/MQLTestWorkspace/X121/Old/Indicators/x-saherelm.x121.xsslc.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..fe36f136375faadffc16a5af4ec99c26fd4cae2c GIT binary patch literal 14266 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 literal 0 HcmV?d00001 diff --git a/MQLTestWorkspace/X121/Old/Indicators/x-saherelm.x121.xsslc.mq5 b/MQLTestWorkspace/X121/Old/Indicators/x-saherelm.x121.xsslc.mq5 new file mode 100644 index 0000000..e682067 --- /dev/null +++ b/MQLTestWorkspace/X121/Old/Indicators/x-saherelm.x121.xsslc.mq5 @@ -0,0 +1,437 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 Indicator +// ---------------------------------------------------- +// Name: X121_XSSLC +// Description: SSL Channel Indicator +// +// +// Maintainer: +// ------------ +// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) +// +////////////////////////////////////////////////////// +// +// Global Properties ... +#property copyright "Copyright 2023, SaherElm IT Center" +#property link "https://saherelm.ir" +#property version "1.00" +#property description "SaherElm X121_XSSLC Indicator" +#property strict + +// +// START Constants ... +// + +// +// Indicator Short Name ... +#define ShortName "X121_XSSLC" + +// +// END Constants ... +// + +// +// START Inputs ... +// + +// +input group "Market"; +input int length = 36; // Length + +// +input group "Calculation"; +input ENUM_MA_METHOD method = MODE_SMA; // Method +input ENUM_APPLIED_PRICE upAppliedTo = PRICE_HIGH; // Up Applied To +input ENUM_APPLIED_PRICE downAppliedTo = PRICE_LOW; // Down Applied To + +// +input group "Presentation"; +input bool showUp = true; // Show Up +input bool showDown = true; // Show Down + +// +// END Inputs ... +// + +// +// START Includes and Imports ... +// + +// +// Includes Common Library ... +#include "../Libraries/x-saherelm.common.lib.mq5" + +// +// END Includes and Imports ... +// + +// +// START Buffers ... +// +#property indicator_chart_window + +// +#property indicator_buffers 5 +#property indicator_plots 2 + +// +// PLOTTED Buffers ... + +// +#define upBufferIndex 0 +double upBuffer[]; + +// +#property indicator_label1 "X121_XSSLC Up" +#property indicator_type1 DRAW_LINE +#property indicator_color1 clrLime +#property indicator_style1 STYLE_SOLID +#property indicator_width1 1 + +// +#define downBufferIndex 1 +double downBuffer[]; + +// +#property indicator_label2 "X121_XSSLC Down" +#property indicator_type2 DRAW_LINE +#property indicator_color2 clrRed +#property indicator_style2 STYLE_SOLID +#property indicator_width2 1 + +// +// DATA Buffers ... + +// +#define upMaBufferIndex 2 +double upMaBuffer[]; + +// +#define downMaBufferIndex 3 +double downMaBuffer[]; + +// +#define kpiBufferIndex 4 +double kpiBuffer[]; + +// +// END Buffers ... +// + +// +// START Global Definitions: Variables, Properties and etc ... +// + +// +int maxLength; + +// +int upHandler = INVALID_HANDLE; +int downHandler = INVALID_HANDLE; + +// +// END Global Definitions: Variables, Properties and etc ... +// + +// +// START Event Handlers ... +// + +// +// Initialization ... +int OnInit() +{ + // + // Validate Inputs ... + if (!ValidateInputs()) + { + return INIT_PARAMETERS_INCORRECT; + } + + // + // because in some cases we may have more than one input for + // calculation and we must prevent any calculation + // untill we pass the biggest input length, here we get max Input length + // and then wait until pass it ... + maxLength = ExtractMaxLengthOfInputs(); + + // + // Define Index Buffers ... + DefineBuffers(); + + // + // Set Indicator ShortName ... + SetIndicatorName(); + + // + // Initialize Requierd Handlers ... + upHandler = iMA( + _Symbol, + _Period, + length, + 0, + method, + upAppliedTo); + downHandler = iMA( + _Symbol, + _Period, + length, + 0, + method, + downAppliedTo); + if (upHandler == INVALID_HANDLE || downHandler == INVALID_HANDLE) + { + // + string msg = "Error in Initilizing Indicator ..."; + Print(msg); + + // + return INIT_FAILED; + } + + // + // Init Succeed ... + return INIT_SUCCEEDED; +} + +// +// DeInitialization ... +void OnDeinit(const int reason) +{ + // + // REASON_PROGRAM 0 The EA has stopped working calling the ExpertRemove() function + // REASON_REMOVE 1 Program removed from a chart + // REASON_RECOMPILE 2 Program recompiled + // REASON_CHARTCHANGE 3 A symbol or a chart period is changed + // REASON_CHARTCLOSE 4 Chart closed + // REASON_PARAMETERS 5 Inputs changed by a user + // REASON_ACCOUNT 6 Another account has been activated or reconnection to the trade server has occurred due to changes in the account settings + // REASON_TEMPLATE 7 Another chart template applied + // REASON_INITFAILED 8 The OnInit() handler returned a non-zero value + // REASON_CLOSE 9 Terminal closed + + // + // Release Indicators ... + IndicatorRelease(upHandler); + IndicatorRelease(downHandler); +} + +// +// Calculating what we want ... +int OnCalculate( + // + // total Candles on chart ... + const int rates_total, + // + // total calculated Candles on charts ... + const int prev_calculated, + // + // history of Candles Open Time ... + const datetime &time[], + // + // history of Candles Open Price ... + const double &open[], + // + // history of Candles High Price ... + const double &high[], + // + // history of Candles Low Price ... + const double &low[], + // + // history of Candles Close Price ... + const double &close[], + // + // history of Tick Volumes on Candle ... + const long &tick_volume[], + // + // history of Trade Volumes ... + const long &volume[], + // + // history of Candles Spread Price ... + const int &spread[]) +{ + // + // Prepare Buffers ... + ArraySetAsSeries(time, true); + ArraySetAsSeries(open, true); + ArraySetAsSeries(high, true); + ArraySetAsSeries(low, true); + ArraySetAsSeries(close, true); + ArraySetAsSeries(tick_volume, true); + ArraySetAsSeries(volume, true); + ArraySetAsSeries(spread, true); + + // + // this counts Available Bars ... + int limit; + + // + // Check Calculated Bars ... + int upCalculatedBars = BarsCalculated(upHandler); + int downCalculatedBars = BarsCalculated(downHandler); + if (upCalculatedBars < maxLength || + downCalculatedBars < maxLength) + { + return prev_calculated; + } + + // + limit = (prev_calculated > rates_total || prev_calculated <= 0) ? rates_total : (rates_total - prev_calculated) + 1; + + // + // Buffers Copy ... + int copiedUps = CopyBuffer(upHandler, 0, 0, limit, upMaBuffer); + int copiedDowns = CopyBuffer(downHandler, 0, 0, limit, downMaBuffer); + if (copiedUps <= 0 || + copiedDowns <= 0) + { + return prev_calculated; + } + + // + // Main Loop ... + for (int i = limit - 1; i >= 0 && !IsStopped(); i--) + { + CalculateBuffers(i, limit, rates_total, prev_calculated, close); + } + + // + return rates_total; +} + +// +// END Event Handlers ... +// + +// +// START Functions ... +// + +// +// Validate Input Args for Initialization ... +bool ValidateInputs() +{ + // + bool result = + // + (length > 2) + // + ; + + // + return result; +} + +// +// Retrieve all Exists Input Max Length ... +// use for Start Of Drawing ... +int ExtractMaxLengthOfInputs() +{ + // + int result = 0; + + // + result = MathMax(result, length); + + // + return result; +} + +// +// Define Indexes and Styles ... +void DefineBuffers() +{ + // + // UP ... + + // + ENUM_DRAW_TYPE upDrawType = showUp ? DRAW_LINE : DRAW_NONE; + + + ArraySetAsSeries(upBuffer, true); + SetIndexBuffer(upBufferIndex, upBuffer, INDICATOR_DATA); + PlotIndexSetInteger(upBufferIndex, PLOT_SHOW_DATA, false); + PlotIndexSetInteger(upBufferIndex, PLOT_DRAW_BEGIN, maxLength); + PlotIndexSetInteger(upBufferIndex, PLOT_DRAW_TYPE, upDrawType); + + // + // DOWN ... + + // + ENUM_DRAW_TYPE downDrawType = showDown ? DRAW_LINE : DRAW_NONE; + + + ArraySetAsSeries(downBuffer, true); + SetIndexBuffer(downBufferIndex, downBuffer, INDICATOR_DATA); + PlotIndexSetInteger(downBufferIndex, PLOT_SHOW_DATA, showDown); + PlotIndexSetInteger(downBufferIndex, PLOT_DRAW_BEGIN, maxLength); + PlotIndexSetInteger(downBufferIndex, PLOT_DRAW_TYPE, downDrawType); + + // + // DATA Buffers ... + + // + // UP MA ... + ArraySetAsSeries(upMaBuffer, true); + SetIndexBuffer(upMaBufferIndex, upMaBuffer, INDICATOR_CALCULATIONS); + + // + // DOWN MA ... + ArraySetAsSeries(downMaBuffer, true); + SetIndexBuffer(downMaBufferIndex, downMaBuffer, INDICATOR_CALCULATIONS); + + // + // KPI ... + ArraySetAsSeries(kpiBuffer, true); + SetIndexBuffer(kpiBufferIndex, kpiBuffer, INDICATOR_CALCULATIONS); +} + +// +// Set Indicator Short Name and also we can define Buffers Labels ... +void SetIndicatorName() +{ + IndicatorSetString(INDICATOR_SHORTNAME, ShortName); +} + +// +// Calculate Buffers ... +void CalculateBuffers( + int bar_index, // Selected Bar Index + int limit, + int ratesTotal, + int prevCalculated, + const double &close[]) +{ + // + double upMaValue = upMaBuffer[bar_index]; + double downMaValue = downMaBuffer[bar_index]; + + // + double closeValue = close[bar_index]; + + // + double kpiValue; + if (closeValue > upMaValue) { + kpiValue = 1; + } else if (closeValue < downMaValue) { + kpiValue = -1; + } else { + kpiValue = kpiBuffer[bar_index + 1]; + } + + // + kpiBuffer[bar_index] = kpiValue; + + // + double upValue = kpiValue < 0 ? downMaValue : upMaValue; + upBuffer[bar_index] = upValue; + + // + double downValue = kpiValue < 0 ? upMaValue : downMaValue; + downBuffer[bar_index] = downValue; +} + +// +// END Functions ... +// diff --git a/MQLTestWorkspace/X121/Old/Indicators/x-saherelm.x121.xstr.ex5 b/MQLTestWorkspace/X121/Old/Indicators/x-saherelm.x121.xstr.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..fcb6351d9a35485d67f5560a001e2327af22aab0 GIT binary patch literal 13370 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 literal 0 HcmV?d00001 diff --git a/MQLTestWorkspace/X121/Old/Indicators/x-saherelm.x121.xstr.mq5 b/MQLTestWorkspace/X121/Old/Indicators/x-saherelm.x121.xstr.mq5 new file mode 100644 index 0000000..bca9597 --- /dev/null +++ b/MQLTestWorkspace/X121/Old/Indicators/x-saherelm.x121.xstr.mq5 @@ -0,0 +1,580 @@ +////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 Indicator +// --------------------------------------------- +// Name: X121_XSTR +// Description: Super Trend Indicator ... +// +// +// Maintainer: +// ------------ +// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) +// +////////////////////////////////////////////////////// +// +// Global Properties ... +#property copyright "Copyright 2023, SaherElm IT Center" +#property link "https://saherelm.ir" +#property version "1.00" +#property description "SaherElm X121_XAMA Indicator" +#property strict + +// +// START Constants ... +// + +#define ShortName "X121_XSTR" + +// +// END Constants ... +// + +// +// START Inputs ... +// + +// +// Market ... +input group "ATR"; +input int atrLength = 14; // Length +input double atrMultiplier = 3.0; // Multiplier +input ENUM_APPLIED_PRICE atrAppliedTo = PRICE_MEDIAN; // Applied To + +// +// Presentation ... +input group "Presentation"; +input bool showTrends = true; // Show Trends +input bool fillTrends = true; // Fill Trends + +// +// END Inputs ... +// + +// +// Includes Common Library ... +#include "../Libraries/x-saherelm.common.lib.mq5" + +// +// START Buffers ... +// + +// +#property indicator_chart_window + +// +#property indicator_buffers 9 +#property indicator_plots 2 + +// +#define fillUpBufferIndex 0 +double fillUpBuffer[]; + +#define fillDownBufferIndex 1 +double fillDownBuffer[]; + +// +#define fillingPlotBufferIndex 0 + +// +#property indicator_label1 "X121_XSTR Filling" +#property indicator_type1 DRAW_FILLING +#property indicator_color1 clrBisque, clrPaleGreen + +// +#define mainBufferIndex 2 +#define mainPlotBufferIndex 1 +double mainBuffer[]; + +// +#define mainColorBufferIndex 3 +double mainColorBuffer[]; + +// +#property indicator_label2 "X121_XSTR" +#property indicator_type2 DRAW_COLOR_LINE +#property indicator_color2 CLR_NONE, clrGreen, clrDarkRed +#property indicator_style2 STYLE_DOT + +// +// DATA Buffers ... + +// +#define atrBufferIndex 4 +double atrBuffer[]; + +// +#define trendBufferIndex 5 +double trendBuffer[]; + +// +#define upBufferIndex 6 +double upBuffer[]; + +// +#define downBufferIndex 7 +double downBuffer[]; + +// +#define priceBufferIndex 8 +double priceBuffer[]; + +// +// END Buffers ... +// + +// +// START Global Definitions: Variables, Properties and etc ... +// + +// +int maxLength; + +// +int atrHandler = INVALID_HANDLE; + +// +int changeOfTrend; +int startBearishTrend; +int startBullishTrend; + +// +// END Global Definitions: Variables, Properties and etc ... +// + +// +// START Event Handlers ... +// + +// +// Initialization ... +int OnInit() +{ + // + // Validate Inputs ... + if (!ValidateInputs()) + { + return INIT_PARAMETERS_INCORRECT; + } + + // + // because in some cases we may have more than one input for + // calculation and we must prevent any calculation + // untill we pass the biggest input length, here we get max Input length + // and then wait until pass it ... + maxLength = ExtractMaxLengthOfInputs(); + + // + atrHandler = iATR( + _Symbol, + _Period, + atrLength); + if (atrHandler == INVALID_HANDLE) + { + return INIT_FAILED; + } + + // + // Define Index Buffers ... + DefineBuffers(); + + // + // Set Indicator ShortName ... + SetIndicatorName(); + + // + // Init Succeed ... + return INIT_SUCCEEDED; +} + +// +// DeInitialization ... +void OnDeinit(const int reason) +{ + // + // REASON_PROGRAM 0 The EA has stopped working calling the ExpertRemove() function + // REASON_REMOVE 1 Program removed from a chart + // REASON_RECOMPILE 2 Program recompiled + // REASON_CHARTCHANGE 3 A symbol or a chart period is changed + // REASON_CHARTCLOSE 4 Chart closed + // REASON_PARAMETERS 5 Inputs changed by a user + // REASON_ACCOUNT 6 Another account has been activated or reconnection to the trade server has occurred due to changes in the account settings + // REASON_TEMPLATE 7 Another chart template applied + // REASON_INITFAILED 8 The OnInit() handler returned a non-zero value + // REASON_CLOSE 9 Terminal closed + + // + // Here we can handle De Initialization Reasons ... + IndicatorRelease(atrHandler); +} + +// +// Calculating what we want ... +int OnCalculate( + // + // total Candles on chart ... + const int rates_total, + // + // total calculated Candles on charts ... + const int prev_calculated, + // + // history of Candles Open Time ... + const datetime &time[], + // + // history of Candles Open Price ... + const double &open[], + // + // history of Candles High Price ... + const double &high[], + // + // history of Candles Low Price ... + const double &low[], + // + // history of Candles Close Price ... + const double &close[], + // + // history of Tick Volumes on Candle ... + const long &tick_volume[], + // + // history of Trade Volumes ... + const long &volume[], + // + // history of Candles Spread Price ... + const int &spread[]) +{ + // + int numOfRequiredAtrs; + if (prev_calculated > rates_total || prev_calculated < 0) + { + numOfRequiredAtrs = rates_total; + } + else + { + // + numOfRequiredAtrs = rates_total - prev_calculated; + if (prev_calculated > 0) + { + numOfRequiredAtrs++; + } + } + + // + // Checking for stop ... + if (IsStopped()) + { + return 0; + } + + // + // Check Number of items Copy or not ... + int copiedATRs = CopyBuffer(atrHandler, 0, 0, numOfRequiredAtrs, atrBuffer); + if (copiedATRs <= 0) + { + return 0; + } + + // + int limit; + + // + // checking for the limit start of calculation of an indicator ... + if (prev_calculated > rates_total || prev_calculated <= 0) + { + // + // starting index for calculation of all bars ... + limit = maxLength; + } + else + { + // + // starting number for calculation of new bars + limit = prev_calculated - 1; + } + + // + // Main Loop ... + for (int i = limit; i < rates_total && !IsStopped(); i++) + { + // + // Calculated Price ... + double price = getPrice( + atrAppliedTo, + open, + high, + low, + close, + i); + // price = (high[i] + low[i]) / 2; + priceBuffer[i] = price; + + // + double atr = atrBuffer[i]; + + // + // Up ... + upBuffer[i] = price + (atrMultiplier * atr); + + // + // Down ... + downBuffer[i] = price - (atrMultiplier * atr); + + // + if (close[i] > upBuffer[i - 1]) + { + // + trendBuffer[i] = 1; + if (trendBuffer[i - 1] == -1) + { + changeOfTrend = 1; + } + } + else if (close[i] < downBuffer[i - 1]) + { + // + trendBuffer[i] = -1; + if (trendBuffer[i - 1] == 1) + { + changeOfTrend = 1; + } + } + else if (trendBuffer[i - 1] == 1) + { + // + trendBuffer[i] = 1; + changeOfTrend = 0; + } + else if (trendBuffer[i - 1] == -1) + { + // + trendBuffer[i] = -1; + changeOfTrend = 0; + } + + // + // Down Trend Starting ... + if (trendBuffer[i] < 0 && trendBuffer[i - 1] > 0) + { + startBearishTrend = 1; + } + else + { + startBearishTrend = 0; + } + + // + // Up Trend Starting ... + if (trendBuffer[i] > 0 && trendBuffer[i - 1] < 0) + { + startBullishTrend = 1; + } + else + { + startBullishTrend = 0; + } + + // + if (trendBuffer[i] > 0 && downBuffer[i] < downBuffer[i - 1]) + { + downBuffer[i] = downBuffer[i - 1]; + } + + // + if (trendBuffer[i] < 0 && upBuffer[i] > upBuffer[i - 1]) + { + upBuffer[i] = upBuffer[i - 1]; + } + + // + if (startBearishTrend == 1) + { + upBuffer[i] = priceBuffer[i] + (atrMultiplier * atr); + } + + // + if (startBullishTrend == 1) + { + downBuffer[i] = priceBuffer[i] - (atrMultiplier * atr); + } + + // + // Draw the indicator ... + + // + double colorIDX = 0; + mainColorBuffer[i] = colorIDX; + + // + if (trendBuffer[i] == 1) + { + // + mainBuffer[i] = downBuffer[i]; + if (changeOfTrend == 1) + { + mainBuffer[i - 1] = mainBuffer[i - 2]; + changeOfTrend = 0; + } + + // + colorIDX = 1; + } + else if (trendBuffer[i] == -1) + { + // + mainBuffer[i] = upBuffer[i]; + if (changeOfTrend == 1) + { + // + mainBuffer[i - 1] = mainBuffer[i - 2]; + changeOfTrend = 0; + } + + // + colorIDX = 2; + } + + // + if (showTrends) + { + mainColorBuffer[i] = colorIDX; + } + + // + // Filling ... + if (fillTrends) + { + // + fillUpBuffer[i] = mainBuffer[i]; + fillDownBuffer[i] = close[i]; + } + else + { + // + fillUpBuffer[i] = EMPTY_VALUE; + fillDownBuffer[i] = EMPTY_VALUE; + } + } + + // + return rates_total; +} + +// +// END Event Handlers ... +// + +// +// START Functions ... +// + +// +// Validate Input Args for Initialization ... +bool ValidateInputs() +{ + // + bool result = false; + + // + // Validate Args ... + result = + // + atrLength >= 2 + // + ; + + // + return result; +} + +// +// Retrieve all Exists Input Max Length ... +// use for Start Of Drawing ... +int ExtractMaxLengthOfInputs() +{ + // + int result = 0; + + // + result = atrLength; + + // + return result; +} + +// +// Set Indicator Short Name and also we can define Buffers Labels ... +void SetIndicatorName() +{ + IndicatorSetString(INDICATOR_SHORTNAME, ShortName); +} + +// +// Define Indexes and Styles ... +void DefineBuffers() +{ + // + // PLOT Buffers ... + + // + // FILLINGS ... + SetIndexBuffer(fillUpBufferIndex, fillUpBuffer, INDICATOR_DATA); + SetIndexBuffer(fillDownBufferIndex, fillDownBuffer, INDICATOR_DATA); + PlotIndexSetInteger(fillingPlotBufferIndex, PLOT_SHOW_DATA, false); + + // + // MAIN ... + SetIndexBuffer(mainBufferIndex, mainBuffer, INDICATOR_DATA); + PlotIndexSetInteger(mainPlotBufferIndex, PLOT_SHOW_DATA, showTrends); + SetIndexBuffer(mainColorBufferIndex, mainColorBuffer, INDICATOR_COLOR_INDEX); + + // + // DATA Buffers ... + + // + // ATR ... + SetIndexBuffer(atrBufferIndex, atrBuffer, INDICATOR_CALCULATIONS); + + // + // TREND ... + SetIndexBuffer(trendBufferIndex, trendBuffer, INDICATOR_CALCULATIONS); + + // + // UP ... + SetIndexBuffer(upBufferIndex, upBuffer, INDICATOR_CALCULATIONS); + + // + // DOWN ... + SetIndexBuffer(downBufferIndex, downBuffer, INDICATOR_CALCULATIONS); + + // + // PRICE ... + SetIndexBuffer(priceBufferIndex, priceBuffer, INDICATOR_CALCULATIONS); +} + +// +// END Functions ... +// + +// +// TEMPLATE Function ... + +template +double getPrice(ENUM_APPLIED_PRICE tprice, T &open[], T &high[], T &low[], T &close[], int i) +{ + switch (tprice) + { + case PRICE_CLOSE: + return (close[i]); + case PRICE_OPEN: + return (open[i]); + case PRICE_HIGH: + return (high[i]); + case PRICE_LOW: + return (low[i]); + case PRICE_MEDIAN: + return ((high[i] + low[i]) / 2.0); + case PRICE_TYPICAL: + return ((high[i] + low[i] + close[i]) / 3.0); + case PRICE_WEIGHTED: + return ((high[i] + low[i] + close[i] + close[i]) / 4.0); + } + return (0); +} diff --git a/MQLTestWorkspace/X121/Old/Indicators/x-saherelm.x121.xtm.ex5 b/MQLTestWorkspace/X121/Old/Indicators/x-saherelm.x121.xtm.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..326e17f0ffca85fa18ee22b25a46aa059dd9c98b GIT binary patch literal 11990 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 rates_total || prev_calculated <= 0) ? rates_total : (rates_total - prev_calculated) + 1; + + // + // Buffers Copy ... + int copiedMas = CopyBuffer(maHandler, 0, 0, limit, maBuffer); + if (copiedMas <= 0) + { + return prev_calculated; + } + + // + // Main Loop ... + for (int i = limit - 1; i >= 0 && !IsStopped(); i--) + { + // + // Do Buffers Calculation ... + CalculateBuffers(i); + } + + // + return rates_total; +} +// +// END Event Handlers ... +// + +// +// START Functions ... +// + +// +// Validate Input Args for Initialization ... +bool ValidateInputs() +{ + // + bool result = false; + + // + // Validate Args ... + if (length >= 2) + { + result = true; + } + + // + return result; +} + +// +// Retrieve all Exists Input Max Length ... +// use for Start Of Drawing ... +int ExtractMaxLengthOfInputs() +{ + // + int result = 0; + + // + result = length; + + // + return result; +} + +// +// Define Indexes and Styles ... +void DefineBuffers() +{ + // + ENUM_DRAW_TYPE drawType = showLine ? DRAW_COLOR_LINE : DRAW_NONE; + + // + // Ma Buffer ... + ArraySetAsSeries(maBuffer, true); + SetIndexBuffer(maBufferIndex, maBuffer, INDICATOR_DATA); + PlotIndexSetInteger(maBufferIndex, PLOT_DRAW_TYPE, drawType); + PlotIndexSetInteger(maBufferIndex, PLOT_SHOW_DATA, showLine); + + // + // Ma Color Buffer ... + ArraySetAsSeries(maColorBuffer, true); + SetIndexBuffer(maColorBufferIndex, maColorBuffer, INDICATOR_COLOR_INDEX); +} + +// +// Set Indicator Short Name and also we can define Buffers Labels ... +void SetIndicatorName() +{ + IndicatorSetString(INDICATOR_SHORTNAME, ShortName); +} + +// +// Calculate Buffers ... +void CalculateBuffers(int bar_index) +{ + // + // Requirements ... + XOHCL candle = GetCandle(bar_index); + + // + double maValue = maBuffer[bar_index]; + + // + double lineColorIndex = + maValue < candle.low ? 0 : maValue > candle.high ? 2 + : 1; + + // + // Set Ma Buffer Color Index ... + maColorBuffer[bar_index] = lineColorIndex; +} + +// +// END Functions ... +// diff --git a/MQLTestWorkspace/X121/Old/Indicators/x-saherelm.x121.xtrnd.ex5 b/MQLTestWorkspace/X121/Old/Indicators/x-saherelm.x121.xtrnd.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..76db2cf8ac08b37ae394ccb25c112e8ada8311d9 GIT binary patch literal 36924 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 H-B rates_total || prev_calculated <= 0) ? rates_total : (rates_total - prev_calculated) + 1; + + // + // Main Loop ... + for (int i = limit - 1; i >= 0 && !IsStopped(); i--) + { + CalculateBuffers(i); + } + + // + return rates_total; +} + +// +// END Event Handlers ... +// + +// +// START Functions ... +// + +// +// Validate Input Args for Initialization ... +bool ValidateInputs() +{ + // + bool result = + // + (cycleLength > 0 && + numberOfVerifications > 0) + // + ; + + // + return result; +} + +// +// Retrieve all Exists Input Max Length ... +// use for Start Of Drawing ... +int ExtractMaxLengthOfInputs() +{ + // + int result = 0; + + // + // Peaks and Vales ... + result = MathMax( + cycleLength, + numberOfVerifications); + + // + return result; +} + +// +// Initial Multi Time Frame Cycles Periods ... +void InitialCycles() +{ + // + // Calculate Current Period Secconds ... + currentPeriodSecconds = PeriodSeconds(_Period); + + // + // Nearest ... + // Calculate Cycle 1 Requirements ... + if (mL1Period == NULL) + { + // + if (l1Method == X_PERIOD_AUTO) + { + mL1Period = GetNearestTimeFrame(_Period); + } + else + { + mL1Period = l1Period; + } + + // + mL1PeriodSecconds = PeriodSeconds(mL1Period); + + // + mL1Candles = mL1PeriodSecconds / currentPeriodSecconds; + } + + // + // Mediest ... + // Calculate Cycle 2 Requirements ... + if (mL2Period == NULL) + { + // + if (l2Method == X_PERIOD_AUTO) + { + mL2Period = GetMediestTimeFrame(_Period); + } + else + { + mL2Period = l2Period; + } + + // + mL2PeriodSecconds = PeriodSeconds(mL2Period); + + // + mL2Candles = mL2PeriodSecconds / currentPeriodSecconds; + } + + // + // Farest ... + // Calculate Cycle 3 Requirements ... + if (mL3Period == NULL) + { + // + if (l3Method == X_PERIOD_AUTO) + { + mL3Period = GetFarestTimeFrame(_Period); + } + else + { + mL3Period = l3Period; + } + + // + mL3PeriodSecconds = PeriodSeconds(mL3Period); + + // + mL3Candles = mL3PeriodSecconds / currentPeriodSecconds; + } +} + +// +// Define Indexes and Styles ... +void DefineBuffers() +{ + // + // HH Buffer ... + + // + // SERIES ... + ArraySetAsSeries(hhBuffer, true); + SetIndexBuffer(hhBufferIndex, hhBuffer, INDICATOR_DATA); + + // + // PLOT Config ... + PlotIndexSetInteger(hhPlotBufferIndex, PLOT_SHOW_DATA, showTrend); + PlotIndexSetInteger(hhPlotBufferIndex, PLOT_DRAW_BEGIN, maxLength); + + // + // COLOR Buffer ... + ArraySetAsSeries(hhColorBuffer, true); + SetIndexBuffer(hhColorBufferIndex, hhColorBuffer, INDICATOR_COLOR_INDEX); + + // + // LL Buffer ... + + // + // SERIES ... + ArraySetAsSeries(llBuffer, true); + SetIndexBuffer(llBufferIndex, llBuffer, INDICATOR_DATA); + + // + // PLOT Config ... + PlotIndexSetInteger(llPlotBufferIndex, PLOT_SHOW_DATA, showTrend); + PlotIndexSetInteger(llPlotBufferIndex, PLOT_DRAW_BEGIN, maxLength); + + // + // COLOR Buffer ... + ArraySetAsSeries(llColorBuffer, true); + SetIndexBuffer(llColorBufferIndex, llColorBuffer, INDICATOR_COLOR_INDEX); + + // + // CYCLES ... + + // + // NEAREST ... + + // + // HH Buffer ... + + // + // SERIES ... + ArraySetAsSeries(l1hhBuffer, true); + SetIndexBuffer(l1hhBufferIndex, l1hhBuffer, INDICATOR_DATA); + + // + // PLOT Config ... + PlotIndexSetInteger(l1hhPlotBufferIndex, PLOT_SHOW_DATA, showL1Trend); + PlotIndexSetInteger(l1hhPlotBufferIndex, PLOT_DRAW_BEGIN, maxLength); + + // + // COLOR Buffer ... + ArraySetAsSeries(l1hhColorBuffer, true); + SetIndexBuffer(l1hhColorBufferIndex, l1hhColorBuffer, INDICATOR_COLOR_INDEX); + + // + // LL Buffer ... + + // + // SERIES ... + ArraySetAsSeries(l1llBuffer, true); + SetIndexBuffer(l1llBufferIndex, l1llBuffer, INDICATOR_DATA); + + // + // PLOT Config ... + PlotIndexSetInteger(l1llPlotBufferIndex, PLOT_SHOW_DATA, showL1Trend); + PlotIndexSetInteger(l1llPlotBufferIndex, PLOT_DRAW_BEGIN, maxLength); + + // + // COLOR Buffer ... + ArraySetAsSeries(l1llColorBuffer, true); + SetIndexBuffer(l1llColorBufferIndex, l1llColorBuffer, INDICATOR_COLOR_INDEX); + + // + // MEDIEST ... + + // + // HH Buffer ... + + // + // SERIES ... + ArraySetAsSeries(l2hhBuffer, true); + SetIndexBuffer(l2hhBufferIndex, l2hhBuffer, INDICATOR_DATA); + + // + // PLOT Config ... + PlotIndexSetInteger(l2hhPlotBufferIndex, PLOT_SHOW_DATA, showL2Trend); + PlotIndexSetInteger(l2hhPlotBufferIndex, PLOT_DRAW_BEGIN, maxLength); + + // + // COLOR Buffer ... + ArraySetAsSeries(l2hhColorBuffer, true); + SetIndexBuffer(l2hhColorBufferIndex, l2hhColorBuffer, INDICATOR_COLOR_INDEX); + + // + // LL Buffer ... + + // + // SERIES ... + ArraySetAsSeries(l2llBuffer, true); + SetIndexBuffer(l2llBufferIndex, l2llBuffer, INDICATOR_DATA); + + // + // PLOT Config ... + PlotIndexSetInteger(l2llPlotBufferIndex, PLOT_SHOW_DATA, showL2Trend); + PlotIndexSetInteger(l2llPlotBufferIndex, PLOT_DRAW_BEGIN, maxLength); + + // + // COLOR Buffer ... + ArraySetAsSeries(l2llColorBuffer, true); + SetIndexBuffer(l2llColorBufferIndex, l2llColorBuffer, INDICATOR_COLOR_INDEX); + + // + // FAREST ... + + // + // HH Buffer ... + + // + // SERIES ... + ArraySetAsSeries(l3hhBuffer, true); + SetIndexBuffer(l3hhBufferIndex, l3hhBuffer, INDICATOR_DATA); + + // + // PLOT Config ... + PlotIndexSetInteger(l3hhPlotBufferIndex, PLOT_SHOW_DATA, showL3Trend); + PlotIndexSetInteger(l3hhPlotBufferIndex, PLOT_DRAW_BEGIN, maxLength); + + // + // COLOR Buffer ... + ArraySetAsSeries(l3hhColorBuffer, true); + SetIndexBuffer(l3hhColorBufferIndex, l3hhColorBuffer, INDICATOR_COLOR_INDEX); + + // + // LL Buffer ... + + // + // SERIES ... + ArraySetAsSeries(l3llBuffer, true); + SetIndexBuffer(l3llBufferIndex, l3llBuffer, INDICATOR_DATA); + + // + // PLOT Config ... + PlotIndexSetInteger(l3llPlotBufferIndex, PLOT_SHOW_DATA, showL3Trend); + PlotIndexSetInteger(l3llPlotBufferIndex, PLOT_DRAW_BEGIN, maxLength); + + // + // COLOR Buffer ... + ArraySetAsSeries(l3llColorBuffer, true); + SetIndexBuffer(l3llColorBufferIndex, l3llColorBuffer, INDICATOR_COLOR_INDEX); + + // + // DATA Buffers ... + ArraySetAsSeries(hhStateBuffer, true); + SetIndexBuffer(hhStateBufferIndex, hhStateBuffer, INDICATOR_CALCULATIONS); + + ArraySetAsSeries(llStateBuffer, true); + SetIndexBuffer(llStateBufferIndex, llStateBuffer, INDICATOR_CALCULATIONS); + + // + // LEVEL 1 ... + ArraySetAsSeries(l1HHStateBuffer, true); + SetIndexBuffer(l1HHStateBufferIndex, l1HHStateBuffer, INDICATOR_CALCULATIONS); + + ArraySetAsSeries(l1LLStateBuffer, true); + SetIndexBuffer(l1LLStateBufferIndex, l1LLStateBuffer, INDICATOR_CALCULATIONS); + + // + // LEVEL 2 ... + ArraySetAsSeries(l2HHStateBuffer, true); + SetIndexBuffer(l2HHStateBufferIndex, l2HHStateBuffer, INDICATOR_CALCULATIONS); + + ArraySetAsSeries(l2LLStateBuffer, true); + SetIndexBuffer(l2LLStateBufferIndex, l2LLStateBuffer, INDICATOR_CALCULATIONS); + + // + // LEVEL 3 ... + ArraySetAsSeries(l3HHStateBuffer, true); + SetIndexBuffer(l3HHStateBufferIndex, l3HHStateBuffer, INDICATOR_CALCULATIONS); + + ArraySetAsSeries(l3LLStateBuffer, true); + SetIndexBuffer(l3LLStateBufferIndex, l3LLStateBuffer, INDICATOR_CALCULATIONS); +} + +// +// Set Indicator Short Name and also we can define Buffers Labels ... +void SetIndicatorName() +{ + // + IndicatorSetString(INDICATOR_SHORTNAME, ShortName); +} + +// +// Calculate Buffers ... +void CalculateBuffers( + int bar_index // Selected Bar Index +) +{ + // + // HIGHER Highs ... + double hh = GetHighestHigh( + _Symbol, + _Period, + hhMode, + cycleLength, + bar_index); + + // + hhBuffer[bar_index] = hh; + + // + // LOWER Lows ... + double ll = GetLowestLow( + _Symbol, + _Period, + llMode, + cycleLength, + bar_index); + + // + llBuffer[bar_index] = ll; + + // + // Set Default Color ... + // in Consolidations use index 0 for CLR_NONE ... + double hhColorIDX = showConsolidations && showTrend ? 1 : 0; + double llColorIDX = showConsolidations && showTrend ? 1 : 0; + hhColorBuffer[bar_index] = hhColorIDX; + llColorBuffer[bar_index] = llColorIDX; + + // + // Calculate Cycle Changes ... + + // + int cycleCLength = cycleLength * numberOfVerifications; + bool isCycleCLengthPassed = MathAbs(ArraySize(hhBuffer) - bar_index) > cycleCLength + 1; + + // + if (isCycleCLengthPassed) + { + // + bool isLowestLowUp = true; + bool isLowestLowDown = true; + bool isHighsestHighUp = true; + bool isHighsestHighDown = true; + for (int i = bar_index; i < bar_index + cycleCLength; i++) + { + // + double iHH = hhBuffer[i]; + double iLL = llBuffer[i]; + + // + if (hh < iHH) + { + isHighsestHighUp = false; + } + else if (hh > iHH) + { + isHighsestHighDown = false; + } + + // + if (ll < iLL) + { + isLowestLowUp = false; + } + else if (ll > iLL) + { + isLowestLowDown = false; + } + } + + // + // Detect Trends and Change Colors ... + + // + if (isLowestLowUp && + isHighsestHighUp) + { + // + hhColorIDX = 2; + llColorIDX = 2; + } + + // + if (isLowestLowDown && + isHighsestHighDown) + { + // + hhColorIDX = 3; + llColorIDX = 3; + } + } + + // + if (showTrend) + { + // + hhColorBuffer[bar_index] = hhColorIDX; + llColorBuffer[bar_index] = llColorIDX; + } + + // + hhColorIDX = + hhColorIDX == 0 || hhColorIDX == 1 + ? 0 + : hhColorIDX - 1; + llColorIDX = + llColorIDX == 0 || llColorIDX == 1 + ? 0 + : llColorIDX - 1; + + // + hhStateBuffer[bar_index] = hhColorIDX; + llStateBuffer[bar_index] = llColorIDX; + + // + // CYCLE 1 ... + + // + int l1cycleLength = cycleLength * mL1Candles; + + // + // HIGHER Highs ... + double l1hh = GetHighestHigh( + _Symbol, + _Period, + hhMode, + l1cycleLength, + bar_index); + + // + l1hhBuffer[bar_index] = l1hh; + + // + // LOWER Lows ... + double l1ll = GetLowestLow( + _Symbol, + _Period, + llMode, + l1cycleLength, + bar_index); + + // + l1llBuffer[bar_index] = l1ll; + + // + // Set Default Color ... + // in Consolidations use index 0 for CLR_NONE ... + double l1hhColorIDX = showConsolidations && showL1Trend ? 1 : 0; + double l1llColorIDX = showConsolidations && showL1Trend ? 1 : 0; + l1hhColorBuffer[bar_index] = l1hhColorIDX; + l1llColorBuffer[bar_index] = l1llColorIDX; + + // + // Calculate Cycle Changes ... + + // + int l1cycleCLength = l1cycleLength * numberOfVerifications; + bool isl1CycleCLengthPassed = MathAbs(ArraySize(l1hhBuffer) - bar_index) > l1cycleCLength + 1; + + // + if (isl1CycleCLengthPassed) + { + // + bool isLowestLowUp = true; + bool isLowestLowDown = true; + bool isHighsestHighUp = true; + bool isHighsestHighDown = true; + for (int i = bar_index; i < bar_index + l1cycleCLength; i++) + { + // + double iHH = l1hhBuffer[i]; + double iLL = l1llBuffer[i]; + + // + if (l1hh < iHH) + { + isHighsestHighUp = false; + } + else if (l1hh > iHH) + { + isHighsestHighDown = false; + } + + // + if (l1ll < iLL) + { + isLowestLowUp = false; + } + else if (l1ll > iLL) + { + isLowestLowDown = false; + } + } + + // + // Detect Trends and Change Colors ... + + // + if (isLowestLowUp && + isHighsestHighUp) + { + // + l1hhColorIDX = 2; + l1llColorIDX = 2; + } + + // + if (isLowestLowDown && + isHighsestHighDown) + { + // + l1hhColorIDX = 3; + l1llColorIDX = 3; + } + } + + // + if (showL1Trend) + { + // + l1hhColorBuffer[bar_index] = l1hhColorIDX; + l1llColorBuffer[bar_index] = l1llColorIDX; + } + + // + l1hhColorIDX = + l1hhColorIDX == 0 || l1hhColorIDX == 1 + ? 0 + : l1hhColorIDX - 1; + l1llColorIDX = + l1llColorIDX == 0 || l1llColorIDX == 1 + ? 0 + : l1llColorIDX - 1; + + // + l1HHStateBuffer[bar_index] = l1hhColorIDX; + l1LLStateBuffer[bar_index] = l1llColorIDX; + + + // + // CYCLE 2 ... + + // + int l2cycleLength = cycleLength * mL2Candles; + + // + // HIGHER Highs ... + double l2hh = GetHighestHigh( + _Symbol, + _Period, + hhMode, + l2cycleLength, + bar_index); + + // + l2hhBuffer[bar_index] = l2hh; + + // + // LOWER Lows ... + double l2ll = GetLowestLow( + _Symbol, + _Period, + llMode, + l2cycleLength, + bar_index); + + // + l2llBuffer[bar_index] = l2ll; + + // + // Set Default Color ... + // in Consolidations use index 0 for CLR_NONE ... + double l2hhColorIDX = showConsolidations && showL2Trend ? 1 : 0; + double l2llColorIDX = showConsolidations && showL2Trend ? 1 : 0; + l2hhColorBuffer[bar_index] = l2hhColorIDX; + l2llColorBuffer[bar_index] = l2llColorIDX; + + // + // Calculate Cycle Changes ... + + // + int l2cycleCLength = l2cycleLength * numberOfVerifications; + bool isl2CycleCLengthPassed = MathAbs(ArraySize(l2hhBuffer) - bar_index) > l2cycleCLength + 1; + + // + if (isl2CycleCLengthPassed) + { + // + bool isLowestLowUp = true; + bool isLowestLowDown = true; + bool isHighsestHighUp = true; + bool isHighsestHighDown = true; + for (int i = bar_index; i < bar_index + l2cycleCLength; i++) + { + // + double iHH = l2hhBuffer[i]; + double iLL = l2llBuffer[i]; + + // + if (l2hh < iHH) + { + isHighsestHighUp = false; + } + else if (l2hh > iHH) + { + isHighsestHighDown = false; + } + + // + if (l2ll < iLL) + { + isLowestLowUp = false; + } + else if (l2ll > iLL) + { + isLowestLowDown = false; + } + } + + // + // Detect Trends and Change Colors ... + + // + if (isLowestLowUp && + isHighsestHighUp) + { + // + l2hhColorIDX = 2; + l2llColorIDX = 2; + } + + // + if (isLowestLowDown && + isHighsestHighDown) + { + // + l2hhColorIDX = 3; + l2llColorIDX = 3; + } + } + + // + if (showL2Trend) + { + // + l2hhColorBuffer[bar_index] = l2hhColorIDX; + l2llColorBuffer[bar_index] = l2llColorIDX; + } + + // + l2hhColorIDX = + l2hhColorIDX == 0 || l2hhColorIDX == 1 + ? 0 + : l2hhColorIDX - 1; + l2llColorIDX = + l2llColorIDX == 0 || l2llColorIDX == 1 + ? 0 + : l2llColorIDX - 1; + + // + l2HHStateBuffer[bar_index] = l2hhColorIDX; + l2LLStateBuffer[bar_index] = l2llColorIDX; + + // + // CYCLE 3 ... + + // + int l3cycleLength = cycleLength * mL3Candles; + + // + // HIGHER Highs ... + double l3hh = GetHighestHigh( + _Symbol, + _Period, + hhMode, + l3cycleLength, + bar_index); + + // + l3hhBuffer[bar_index] = l3hh; + + // + // LOWER Lows ... + double l3ll = GetLowestLow( + _Symbol, + _Period, + llMode, + l3cycleLength, + bar_index); + + // + l3llBuffer[bar_index] = l3ll; + + // + // Set Default Color ... + // in Consolidations use index 0 for CLR_NONE ... + double l3hhColorIDX = showConsolidations && showL3Trend ? 1 : 0; + double l3llColorIDX = showConsolidations && showL3Trend ? 1 : 0; + l3hhColorBuffer[bar_index] = l3hhColorIDX; + l3llColorBuffer[bar_index] = l3llColorIDX; + + // + // Calculate Cycle Changes ... + + // + int l3cycleCLength = l3cycleLength * numberOfVerifications; + bool isl3CycleCLengthPassed = MathAbs(ArraySize(l3hhBuffer) - bar_index) > l3cycleCLength + 1; + + // + if (isl3CycleCLengthPassed) + { + // + bool isLowestLowUp = true; + bool isLowestLowDown = true; + bool isHighsestHighUp = true; + bool isHighsestHighDown = true; + for (int i = bar_index; i < bar_index + l3cycleCLength; i++) + { + // + double iHH = l3hhBuffer[i]; + double iLL = l3llBuffer[i]; + + // + if (l3hh < iHH) + { + isHighsestHighUp = false; + } + else if (l3hh > iHH) + { + isHighsestHighDown = false; + } + + // + if (l3ll < iLL) + { + isLowestLowUp = false; + } + else if (l3ll > iLL) + { + isLowestLowDown = false; + } + } + + // + // Detect Trends and Change Colors ... + + // + if (isLowestLowUp && + isHighsestHighUp) + { + // + l3hhColorIDX = 2; + l3llColorIDX = 2; + } + + // + if (isLowestLowDown && + isHighsestHighDown) + { + // + l3hhColorIDX = 3; + l3llColorIDX = 3; + } + } + + // + if (showL3Trend) + { + // + l3hhColorBuffer[bar_index] = l3hhColorIDX; + l3llColorBuffer[bar_index] = l3llColorIDX; + } + + // + l3hhColorIDX = + l3hhColorIDX == 0 || l3hhColorIDX == 1 + ? 0 + : l3hhColorIDX - 1; + l3llColorIDX = + l3llColorIDX == 0 || l3llColorIDX == 1 + ? 0 + : l3llColorIDX - 1; + + // + l3HHStateBuffer[bar_index] = l3hhColorIDX; + l3LLStateBuffer[bar_index] = l3llColorIDX; +} + +// +// END Functions ... +// diff --git a/MQLTestWorkspace/X121/Old/Indicators/x-saherelm.xchnl.ex5 b/MQLTestWorkspace/X121/Old/Indicators/x-saherelm.xchnl.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..391ac562a04ba851ab1a8bc1cb0c5ce8e92f3298 GIT binary patch literal 25486 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 MM5lTUTtC5flUwvNsQ>@~ literal 0 HcmV?d00001 diff --git a/MQLTestWorkspace/X121/Old/Indicators/x-saherelm.xchnl.mq5 b/MQLTestWorkspace/X121/Old/Indicators/x-saherelm.xchnl.mq5 new file mode 100644 index 0000000..c850540 --- /dev/null +++ b/MQLTestWorkspace/X121/Old/Indicators/x-saherelm.xchnl.mq5 @@ -0,0 +1,775 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 Indicator +// --------------------------------------------- +// Name: X121_XCHNL +// Description: XCHL Channel Indicator ... +// +// +// Maintainer: +// ------------ +// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) +// +////////////////////////////////////////////////////// +// +// Global Properties ... +#property copyright "Copyright 2023, SaherElm IT Center" +#property link "https://saherelm.ir" +#property version "1.00" +#property description "SaherElm X121_XCHNL Indicator" +#property strict + +// +// START Constants ... +// + +// +#define ShortName "X121_XCHNL" + +// +// END Constants ... +// + +// +// START Includes and Imports ... +// + +// +// Includes Common Library ... +#include "../Libraries/x-saherelm.common.lib.mq5" + +// +// Includes Draw Library ... +#include "../Libraries/x-saherelm.draw.lib.mq5" + +// +// END Includes and Imports ... +// + +// +// START XSCHULL Class Definition ... +// + +// +// END XSCHULL Class Definition ... +// + +// +// START Inputs ... +// + +// +input group "Makret Cycles"; +input int shortLength = 9; // Short Length +input int mediumLength = 17; // Medium Length +input int longLength = 26; // Long Length +input int hindLength = 35; // Hind Length + +// +input group "Trend"; +input int numOfShoulder = 10; // Number of Shoulders for Swings + +// +input group "Detection Modes"; +input ENUM_SERIESMODE hhMode = MODE_HIGH; // Highest High Calculation Method +input ENUM_SERIESMODE llMode = MODE_LOW; // Lowest Low Calculation Method + +// +input group "Presentation"; +input bool showTrend = false; // Show Trend +input bool showSRs = false; // Show Support and Resistance + +// +// END Inputs ... +// + +// +// START Buffers ... +// + +// +// PEKSANDVALES ... + +#property indicator_chart_window + +// +#property indicator_buffers 8 +#property indicator_plots 0 + +#define sHHBufferIndex 0 +#define sLLBufferIndex 1 +#define mHHBufferIndex 2 +#define mLLBufferIndex 3 +#define lHHBufferIndex 4 +#define lLLBufferIndex 5 +#define hHHBufferIndex 6 +#define hLLBufferIndex 7 + +double sHHBuffer[]; +double sLLBuffer[]; +double mHHBuffer[]; +double mLLBuffer[]; +double lHHBuffer[]; +double lLLBuffer[]; +double hHHBuffer[]; +double hLLBuffer[]; + +// +// END Buffers ... +// + +// +// START Global Definitions: Variables, Properties and etc ... +// + +// +int maxLength; + +// +// END Global Definitions: Variables, Properties and etc ... +// + +// +// START Event Handlers ... +// +// +// Initialization ... +int OnInit() +{ + // + // Validate Inputs ... + if (!ValidateInputs()) + { + return INIT_PARAMETERS_INCORRECT; + } + + // + drawPrefix = ShortName; + + // + // because in some cases we may have more than one input for + // calculation and we must prevent any calculation + // untill we pass the biggest input length, here we get max Input length + // and then wait until pass it ... + maxLength = ExtractMaxLengthOfInputs(); + + // + // Define Index Buffers ... + DefineBuffers(); + + // + // Set Indicator ShortName ... + SetIndicatorName(); + + // + // Make an Instance of Hull Class ... + + // + // Init Succeed ... + return INIT_SUCCEEDED; +} + +// +// DeInitialization ... +void OnDeinit(const int reason) +{ + // + // REASON_PROGRAM 0 The EA has stopped working calling the ExpertRemove() function + // REASON_REMOVE 1 Program removed from a chart + // REASON_RECOMPILE 2 Program recompiled + // REASON_CHARTCHANGE 3 A symbol or a chart mPeriod is changed + // REASON_CHARTCLOSE 4 Chart closed + // REASON_PARAMETERS 5 Inputs changed by a user + // REASON_ACCOUNT 6 Another account has been activated or reconnection to the trade server has occurred due to changes in the account settings + // REASON_TEMPLATE 7 Another chart template applied + // REASON_INITFAILED 8 The OnInit() handler returned a non-zero value + // REASON_CLOSE 9 Terminal closed + + // + RemoveDraws(drawPrefix); +} + +// +// Calculating what we want ... +int OnCalculate( + // + // total Candles on chart ... + const int rates_total, + // + // total calculated Candles on charts ... + const int prev_calculated, + // + // history of Candles Open Time ... + const datetime &time[], + // + // history of Candles Open Price ... + const double &open[], + // + // history of Candles High Price ... + const double &high[], + // + // history of Candles Low Price ... + const double &low[], + // + // history of Candles Close Price ... + const double &close[], + // + // history of Tick Volumes on Candle ... + const long &tick_volume[], + // + // history of Trade Volumes ... + const long &volume[], + // + // history of Candles Spread Price ... + const int &spread[]) +{ + // + // this counts Available Bars ... + int limit; + + // + limit = prev_calculated - 1; + if (limit < 0) + { + limit = 0; + } + + // + // Main Loop ... + for (int i = limit; i < rates_total && !IsStopped(); i++) + { + CalculateBuffers(i); + } + + // + return rates_total; +} +// +// END Event Handlers ... +// + +// +// START Functions ... +// + +// +// Validate Input Args for Initialization ... +bool ValidateInputs() +{ + // + bool result = true; + + // + result = + // + // Validate Peaks and Vales ... + (shortLength > 2 && + mediumLength > shortLength && + longLength > mediumLength && + hindLength > longLength) + // + ; + + // + return result; +} + +// +// Retrieve all Exists Input Max Length ... +// use for Start Of Drawing ... +int ExtractMaxLengthOfInputs() +{ + // + int result = 0; + + // + // Peaks and Vales ... + result = MathMax(shortLength, mediumLength); + result = MathMax(result, longLength); + result = MathMax(result, hindLength); + + // + return result; +} + +// +// Set Indicator Short Name and also we can define Buffers Labels ... +void SetIndicatorName() +{ + // + IndicatorSetString(INDICATOR_SHORTNAME, ShortName); +} + +// +// Define Indexes and Styles ... +void DefineBuffers() +{ + // + ArraySetAsSeries(sHHBuffer, true); + SetIndexBuffer(sHHBufferIndex, sHHBuffer, INDICATOR_CALCULATIONS); + + // + ArraySetAsSeries(sLLBuffer, true); + SetIndexBuffer(sLLBufferIndex, sLLBuffer, INDICATOR_CALCULATIONS); + + // + ArraySetAsSeries(mHHBuffer, true); + SetIndexBuffer(mHHBufferIndex, mHHBuffer, INDICATOR_CALCULATIONS); + + // + ArraySetAsSeries(mLLBuffer, true); + SetIndexBuffer(mLLBufferIndex, mLLBuffer, INDICATOR_CALCULATIONS); + + // + ArraySetAsSeries(lHHBuffer, true); + SetIndexBuffer(lHHBufferIndex, lHHBuffer, INDICATOR_CALCULATIONS); + + // + ArraySetAsSeries(lLLBuffer, true); + SetIndexBuffer(lLLBufferIndex, lLLBuffer, INDICATOR_CALCULATIONS); + + // + ArraySetAsSeries(hHHBuffer, true); + SetIndexBuffer(hHHBufferIndex, hHHBuffer, INDICATOR_CALCULATIONS); + + // + ArraySetAsSeries(hLLBuffer, true); + SetIndexBuffer(hLLBufferIndex, hLLBuffer, INDICATOR_CALCULATIONS); +} + +// +// Calculate Buffers ... +void CalculateBuffers( + int bar_index // Selected Bar Index +) +{ + // + // Calculate ... + + // + // SHORT ... + + // + // HIGH ... + int sHHIndex = iHighest( + _Symbol, + _Period, + hhMode, + shortLength, + bar_index); + double sHHValue = GetAppliedPrice( + sHHIndex, + hhMode); + + // + sHHBuffer[bar_index] = sHHValue; + + // + // LOW ... + int sLLIndex = iLowest( + _Symbol, + _Period, + llMode, + shortLength, + bar_index); + double sLLValue = GetAppliedPrice( + sLLIndex, + llMode); + + // + sLLBuffer[bar_index] = sLLValue; + + // + // MEDIUM ... + + // + // HIGH ... + int mHHIndex = iHighest( + _Symbol, + _Period, + hhMode, + mediumLength, + bar_index); + double mHHValue = GetAppliedPrice( + mHHIndex, + hhMode); + + // + mHHBuffer[bar_index] = mHHValue; + + // + // LOW ... + int mLLIndex = iLowest( + _Symbol, + _Period, + llMode, + mediumLength, + bar_index); + double mLLValue = GetAppliedPrice( + mLLIndex, + llMode); + + // + mLLBuffer[bar_index] = mLLValue; + + // + // LONG ... + + // + // HIGH ... + int lHHIndex = iHighest( + _Symbol, + _Period, + hhMode, + longLength, + bar_index); + double lHHValue = GetAppliedPrice( + lHHIndex, + hhMode); + + // + lHHBuffer[bar_index] = lHHValue; + + // + // LOW ... + int lLLIndex = iLowest( + _Symbol, + _Period, + llMode, + longLength, + bar_index); + double lLLValue = GetAppliedPrice( + lLLIndex, + llMode); + + // + lLLBuffer[bar_index] = lLLValue; + + // + // HIND ... + + // + // HIGH ... + int hHHIndex = iHighest( + _Symbol, + _Period, + hhMode, + hindLength, + bar_index); + double hHHValue = GetAppliedPrice( + hHHIndex, + hhMode); + + // + hHHBuffer[bar_index] = hHHValue; + + // + // LOW ... + int hLLIndex = iLowest( + _Symbol, + _Period, + llMode, + hindLength, + bar_index); + double hLLValue = GetAppliedPrice( + hLLIndex, + llMode); + + // + hLLBuffer[bar_index] = hLLValue; + + // + // Find Swings ... + + // + // High ... + int hSwing1 = FindSwing( + _Symbol, + _Period, + MODE_HIGH, + numOfShoulder, + bar_index + 1); + + int hSwing2 = FindSwing( + _Symbol, + _Period, + MODE_HIGH, + numOfShoulder, + hSwing1 + 1); + + // + // High ... + int hSwing3 = FindSwing( + _Symbol, + _Period, + MODE_HIGH, + numOfShoulder, + hSwing2 + 1); + + // int hSwing4 = FindSwing( + // _Symbol, + // _Period, + // MODE_HIGH, + // numOfShoulder, + // hSwing3 + 1); + + // + // Low ... + int lSwing1 = FindSwing( + _Symbol, + _Period, + MODE_LOW, + numOfShoulder, + bar_index + 1); + + int lSwing2 = FindSwing( + _Symbol, + _Period, + MODE_LOW, + numOfShoulder, + lSwing1 + 1); + + int lSwing3 = FindSwing( + _Symbol, + _Period, + MODE_LOW, + numOfShoulder, + lSwing2 + 1); + + // int lSwing4 = FindSwing( + // _Symbol, + // _Period, + // MODE_LOW, + // numOfShoulder, + // lSwing3 + 1); + + // + if (bar_index < 50) + { + + // + bool isStrongResistance = + // + hHHBuffer[bar_index + 1] == hHHBuffer[bar_index + 2] && + hHHBuffer[bar_index + 2] == hHHBuffer[bar_index + 3] && + // + lHHBuffer[bar_index + 1] == lHHBuffer[bar_index + 2] && + lHHBuffer[bar_index + 2] == lHHBuffer[bar_index + 3] && + // + mHHBuffer[bar_index + 1] == mHHBuffer[bar_index + 2] && + mHHBuffer[bar_index + 2] == mHHBuffer[bar_index + 3] && + // + sHHBuffer[bar_index + 1] == sHHBuffer[bar_index + 2] && + sHHBuffer[bar_index + 2] == sHHBuffer[bar_index + 3] + // + ; + + // + bool isStrongSupport = + // + hLLBuffer[bar_index + 1] == hLLBuffer[bar_index + 2] && + hLLBuffer[bar_index + 2] == hLLBuffer[bar_index + 3] && + // + lLLBuffer[bar_index + 1] == lLLBuffer[bar_index + 2] && + lLLBuffer[bar_index + 2] == lLLBuffer[bar_index + 3] && + // + mLLBuffer[bar_index + 1] == mLLBuffer[bar_index + 2] && + mLLBuffer[bar_index + 2] == mLLBuffer[bar_index + 3] && + // + sLLBuffer[bar_index + 1] == sLLBuffer[bar_index + 2] && + sLLBuffer[bar_index + 2] == sLLBuffer[bar_index + 3] + // + ; + + // + if (isStrongResistance && showSRs) + { + // + DrawSupportResistance( + "R", + clrRed, + sHHBuffer[bar_index + 3], + bar_index + 3); + } + + // + if (isStrongSupport && showSRs) + { + // + DrawSupportResistance( + "S", + clrGreen, + sLLBuffer[bar_index + 3], + bar_index + 3); + } + } + + // + if (showTrend && bar_index < 20) + { + // + DrawSwing( + "High1", + MODE_HIGH, + clrAqua, + hSwing1, + hSwing2); + + // + DrawSwing( + "Low1", + MODE_LOW, + clrAqua, + lSwing1, + lSwing2); + + // + DrawSwing( + "High2", + MODE_HIGH, + clrMagenta, + hSwing2, + hSwing3); + + // + DrawSwing( + "Low2", + MODE_LOW, + clrMagenta, + lSwing2, + lSwing3); + } +} + +// +void DrawSwing( + string prefix, // Prefix ... + ENUM_SERIESMODE mode, // Swing Mode ... + color swingColor, // Color ... + int index1, // Index 1 ... + int index2 // Index 2 ... +) +{ + // + if (mode != MODE_HIGH && mode != MODE_LOW) + { + return; + } + + // + XOHCL c1 = GetCandle( + _Symbol, + _Period, + index1); + + // + datetime time1 = GetCandleTime( + _Symbol, + _Period, + index1); + + // + XOHCL c2 = GetCandle( + _Symbol, + _Period, + index2); + + // + datetime time2 = GetCandleTime( + _Symbol, + _Period, + index2); + + // + double value1 = -1; + double value2 = -1; + + // + switch (mode) + { + // + case MODE_HIGH: + value1 = c1.high; + value2 = c2.high; + break; + + // + case MODE_LOW: + value1 = c1.low; + value2 = c2.low; + break; + } + + // + if (value1 == -1 || value2 == -1) + { + return; + } + + // + long chartId = ChartID(); + string tlName = prefix + "_" + "TrendLine"; + + // // + // if (IsDrawExists(tlName)) { + // RemoveDraw(tlName); + // } + + // + DrawTrendLine( + chartId, + tlName, + 0, + time2, + value2, + time1, + value1, + swingColor, + STYLE_DOT, + 3, + false, + false, + true); +} + +// +// Draw Support and Resistance ... +void DrawSupportResistance( + string prefix, // Prefix ... + color lColor, // Color ... + double price, // Support or Resistance price ... + int bar_index // Start Bar Index ... +) +{ + // + datetime time1 = GetCandleTime( + _Symbol, + _Period, + bar_index); + + // + datetime time2 = GetCandleTime( + _Symbol, + _Period, + bar_index - 1); + + // + long chartId = ChartID(); + string tlName = prefix + "_" + "TL" + "_" + (string)(NormalizePrice(price, _Symbol)); + + // + DrawTrendLine( + chartId, + tlName, + 0, + time1, + price, + time2, + price, + lColor, + STYLE_DOT, + 3, + false, + false, + true); +} diff --git a/MQLTestWorkspace/X121/Old/Libraries/x-saherelm.alert.lib.ex5 b/MQLTestWorkspace/X121/Old/Libraries/x-saherelm.alert.lib.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..b958914a2b8f63939d80b2c1397d7b276a2d62fb GIT binary patch literal 8824 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 literal 0 HcmV?d00001 diff --git a/MQLTestWorkspace/X121/Old/Libraries/x-saherelm.alert.lib.mq5 b/MQLTestWorkspace/X121/Old/Libraries/x-saherelm.alert.lib.mq5 new file mode 100644 index 0000000..429d830 --- /dev/null +++ b/MQLTestWorkspace/X121/Old/Libraries/x-saherelm.alert.lib.mq5 @@ -0,0 +1,187 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 Alert Library +// -------------------------------------- +// Name: XAlert +// Description: provides Alerts abilities ... +// +// +// 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 + +// +// START Inputs ... +// +input group "Alerts"; +input bool enableAlerts = true; // Enable Alerts +input bool logAlerts = true; // Log Alerts +input bool terminalAlerts = false; // Terminal Alerts +input bool mailAlerts = false; // Mail Alerts +input bool pushAlerts = false; // Push Alerts +// +// END Inputs ... +// + +// +#include "x-saherelm.log.lib.mq5" + +// +// START Global Definitions: Variables, Properties and etc ... +// +string alertPrefix = "X-Alert"; +// +// END Global Definitions: Variables, Properties and etc ... +// + +// +// START Provided Functions ... +// +// +// Initial Library if required ... +bool OnInInitAlertLibrary() +{ + return false; +} + +// +// DeInitial Library if required ... +void OnDeinitAlertLibrary() +{ +} + +// +// Attach Alert Prefix to Message ... +string PrepareAlertMessage(string message) +{ + // + StringReplace(message, "\n", " | "); + + // + StringConcatenate(message, alertPrefix, " > ", message); + + // + return message; +} + +// +// Logging an Alert ... +void LogAlert(string message) +{ + // + // Validate Args ... + if (!enableAlerts || !logAlerts) + { + return; + } + + // + LogMessage(alertPrefix, message); +} + +// +// Terminal Alert ... +void TerminalAlert(string message) +{ + // + // Validate Args ... + if (!enableAlerts || !terminalAlerts) + { + return; + } + + // + // Prepare Message ... + message = PrepareAlertMessage(message); + + // Send Terminal Alert ... + Alert(message); +} + +// +// Mail Alert ... +void MailAlert(string message) +{ + // + // Validate Args ... + if (!enableAlerts || !mailAlerts) + { + return; + } + + // + // Send Mail Alert ... + SendMail(alertPrefix, message); +} + +// +// Send Push Notification ... +void PushAlert(string message) +{ + // + // Validate Args ... + if (!enableAlerts || !pushAlerts) + { + return; + } + + // + // Prepare Message ... + message = PrepareAlertMessage(message); + + // + // Send Push Notification Alert ... + SendNotification(message); +} + +// +// Alert Sending ... +void SendAlert(string message) +{ + // + // Validate Args ... + if (!enableAlerts) + { + return; + } + + // + // Log ... + if (logAlerts) + { + LogAlert(message); + } + + // + // Terminal ... + if (terminalAlerts) + { + TerminalAlert(message); + } + + // + // Mail ... + if (mailAlerts) + { + MailAlert(message); + } + + // + // Push ... + if (pushAlerts) + { + PushAlert(message); + } +} +// +// END Provided Functions ... +// diff --git a/MQLTestWorkspace/X121/Old/Libraries/x-saherelm.common.lib.ex5 b/MQLTestWorkspace/X121/Old/Libraries/x-saherelm.common.lib.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..b15d6ec1039566074ba22c8621cdfdedb34a69e1 GIT binary patch literal 5628 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 CqK9Vy literal 0 HcmV?d00001 diff --git a/MQLTestWorkspace/X121/Old/Libraries/x-saherelm.common.lib.mq5 b/MQLTestWorkspace/X121/Old/Libraries/x-saherelm.common.lib.mq5 new file mode 100644 index 0000000..dd7d431 --- /dev/null +++ b/MQLTestWorkspace/X121/Old/Libraries/x-saherelm.common.lib.mq5 @@ -0,0 +1,4635 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 Common Library +// -------------------------------------- +// Name: XCommon +// Description: provide all commonly used functions ... +// +// +// 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 + +// +// START Inputs ... +// + +// +// END Inputs ... +// + +// +// Include Models Library ... +#include "x-saherelm.models.lib.mq5" + +// +// START Global Definitions: Variables, Properties and etc ... +// +// +// END Global Definitions: Variables, Properties and etc ... +// + +// +// START Provided Functions ... +// + +// +// Detect is new Candle or not ... +bool IsNewCandle() +{ + // + bool result = false; + + // + static int barsOnChart = 0; + int currentBarsOnChart = Bars(_Symbol, _Period); + result = currentBarsOnChart > barsOnChart; + if (!result) + { + return result; + } + + // + barsOnChart = currentBarsOnChart; + result = true; + + // + return result; +} +bool IsNewCandle( + string mSymbol, // Trading Symbol ... + ENUM_TIMEFRAMES mPeriod // Trading Time Frame ... +) +{ + // + bool result = false; + + // + static string mChartTags[]; + static int mChartBars[]; + + // + string chTag = mSymbol + "," + ToString(mPeriod); + + // + int currChTagIdx = -1; + int chCountedBars = 0; + int currentBars = Bars(mSymbol, mPeriod); + + // + if (ArraySize(mChartTags) > 0) + { + // + for (int i = 0; i < ArraySize(mChartTags); i++) + { + // + string iTag = mChartTags[i]; + if (iTag != chTag) + { + continue; + } + + // + currChTagIdx = i; + break; + } + + // + if (currChTagIdx > -1) + { + chCountedBars = mChartBars[currChTagIdx]; + } + } + + // + result = currentBars > chCountedBars; + if (result) + { + // + if (currChTagIdx > -1) + { + // + mChartTags[currChTagIdx] = chTag; + mChartBars[currChTagIdx] = currentBars; + } + else + { + // + Add(chTag, mChartTags); + Add(currentBars, mChartBars); + } + } + + // + return result; +} + +// +double XNZ(double check, double val = 0) +{ + if (check == EMPTY_VALUE || check == 0) + { + return val; + } + else + { + return check; + } +} + +// +// Retrive Ask Price ... +double GetAsk() +{ + return SymbolInfoDouble(_Symbol, SYMBOL_ASK); +} +double GetAsk( + string symbol // selected symbol for calculations +) +{ + // + double result = SymbolInfoDouble(symbol, SYMBOL_ASK); + + // + return result; +} + +// +// Retrieve Bid Price ... +double GetBid() +{ + return SymbolInfoDouble(_Symbol, SYMBOL_BID); +} +double GetBid( + string symbol // selected symbol for calculations +) +{ + // + double result = SymbolInfoDouble(symbol, SYMBOL_BID); + + // + return result; +} + +// +// Calculate and Retrieve Spread Price ... +double GetSpread() +{ + // + double ask = GetAsk(); + double bid = GetBid(); + double result = MathAbs(ask - bid); + + // + return result; +} +double GetSpread( + string symbol // selected symbol for calculations +) +{ + // + double ask = GetAsk(symbol); + double bid = GetBid(symbol); + double result = MathAbs(ask - bid); + + // + return result; +} + +// +// Get Points ... +double GetPoints() +{ + return _Point; +} +double GetPoints( + string symbol // selected symbol for calculations +) +{ + // + double result = SymbolInfoDouble(symbol, SYMBOL_POINT); + + // + return result; +} + +// +// Get Digits ... +int GetDigits() +{ + return _Digits; +} +int GetDigits( + string symbol // selected symbol for calculations +) +{ + // + int result = (int)SymbolInfoInteger(symbol, SYMBOL_DIGITS); + + // + return result; +} + +// +// Get Signal Entry ... +double GetEntry( + ENUM_POSITION_TYPE type // Get entry price for Which direction trade ... +) +{ + // + double result = 0; + + // + bool isLong = type == POSITION_TYPE_BUY; + result = isLong ? GetAsk() : GetBid(); + result = NormalizePrice(result); + + // + return result; +} +double GetEntry( + string symbol, // Specified Symbol + ENUM_POSITION_TYPE type // Get entry price for Which direction trade ... +) +{ + // + double result = 0; + + // + bool isLong = type == POSITION_TYPE_BUY; + result = isLong ? GetAsk(symbol) : GetBid(symbol); + result = NormalizePrice(result, symbol); + + // + return result; +} + +// +// Get Signal Exit ... +double GetExit( + ENUM_POSITION_TYPE type // Get entry price for Which direction trade ... +) +{ + // + double result = 0; + + // + bool isLong = type == POSITION_TYPE_BUY; + result = isLong ? GetBid() : GetAsk(); + result = NormalizePrice(result); + + // + return result; +} +double GetExit( + string symbol, // Specified Symbol + ENUM_POSITION_TYPE type // Get entry price for Which direction trade ... +) +{ + // + double result = 0; + + // + bool isLong = type == POSITION_TYPE_BUY; + result = isLong ? GetBid(symbol) : GetAsk(symbol); + result = NormalizePrice(result, symbol); + + // + return result; +} + +// +// Determine a Position type is Long or not ... +bool IsLong(ENUM_POSITION_TYPE type) +{ + // + bool result = type == POSITION_TYPE_BUY; + + // + return result; +} +bool IsLong(ENUM_ORDER_TYPE type) +{ + // + bool result = type == ORDER_TYPE_BUY; + + // + return result; +} + +// +// Determine a Position type is Short or not ... +bool IsShort(ENUM_POSITION_TYPE type) +{ + // + bool result = type == POSITION_TYPE_SELL; + + // + return result; +} +bool IsShort(ENUM_ORDER_TYPE type) +{ + // + bool result = type == ORDER_TYPE_SELL; + + // + return result; +} + +// +// Get 1 Pip in Price Value ... +double GetPipPrice() +{ + // + double result = _Point; + if (_Digits == 3 || _Digits == 5) + { + result *= 10; + } + + // + return result; +} +double GetPipPrice( + string symbol // selected symbol for calculations +) +{ + // + double symbolPoint = GetPoints(symbol); + int symbolDigits = GetDigits(symbol); + + // + double result = symbolPoint; + if (symbolDigits == 3 || symbolDigits == 5) + { + result *= 10; + } + + // + return result; +} + +// +// Converts Pips To Price ... +double PipsToPrice( + int pips // pips amount +) +{ + // + int digits = GetDigits(); + double pipValue = GetPipPrice(); + double result = pips * pipValue; + + // + result = NormalizeDouble(result, digits); + + // + return result; +} +double PipsToPrice( + double pips // pips amount +) +{ + // + int digits = GetDigits(); + double pipValue = GetPipPrice(); + double result = pips * pipValue; + + // + result = NormalizeDouble(result, digits); + + // + return result; +} +double PipsToPrice( + string symbol, // selected symbol for calculation + int pips // pips amount +) +{ + // + int digits = GetDigits(symbol); + double pipValue = GetPipPrice(symbol); + double result = pips * pipValue; + + // + result = NormalizeDouble(result, digits); + + // + return result; +} +double PipsToPrice( + string symbol, // selected symbol for calculation + double pips // pips amount +) +{ + // + int digits = GetDigits(symbol); + double pipValue = GetPipPrice(symbol); + double result = pips * pipValue; + + // + result = NormalizeDouble(result, digits); + + // + return result; +} + +// +// Converts Price to Pips ... +double PriceToPips( + double price // the price amount which required to calculate +) +{ + // + int digits = GetDigits(); + double pipPrice = GetPipPrice(); + + // + double result = price / pipPrice; + + // + result = NormalizeDouble(result, digits); + + // + return result; +} +double PriceToPips( + string symbol, // Selected Symbol + double price // the price amount which required to calculate +) +{ + // + int digits = GetDigits(symbol); + double pipPrice = GetPipPrice(symbol); + + // + double result = price / pipPrice; + + // + result = NormalizeDouble(result, digits); + + // + return result; +} + +// +// Convert Price to Point ... +double PriceToPoint( + double price // the price amount which required to calculate +) +{ + return PriceToPoint(_Symbol, price); +} +double PriceToPoint( + string symbol, // Selected Symbol + double price // the price amount which required to calculate +) +{ + // + double result = 0; + + // + double point = GetPoints(symbol); + result = price / point; + + // + return result; +} + +// +// Converts Point to Price ... +double PointToPrice( + double points // Points Size +) +{ + return PointToPrice(_Symbol, points); +} +double PointToPrice( + string symbol, // Selected Symbol + double points // Points Size +) +{ + // + double result = 0; + + // + double point = GetPoints(symbol); + result = points * point; + + // + return result; +} + +// +// Get a Candle Body ... +double GetCandleBody( + XOHCL &candle // specified candle +) +{ + // + double result = MathAbs(candle.open - candle.close); + + // + return result; +} + +// +// Get a Candle Range ... +double GetCandleRange( + XOHCL &candle // specified candle +) +{ + // + double result = MathAbs(candle.high - candle.low); + + // + return result; +} + +// +// Get a Candle Shadow ... +double GetCandleShadow( + XOHCL &candle // specified candle +) +{ + // + double range = GetCandleRange(candle); + double body = GetCandleBody(candle); + + // + double result = MathAbs(range - body); + + // + return result; +} + +// +// Check a Candle is Base Candle for RTM or not ... +bool IsBaseCandle( + XOHCL &candle // specified candle +) +{ + // + double range = GetCandleRange(candle); + double body = GetCandleBody(candle); + + // + bool result = body > range; + + // + return result; +} + +// +// Retrieve Applied Price at Specific Candle ... +double GetAppliedPrice( + XOHCL &candle, // specified candle + ENUM_APPLIED_PRICE source = PRICE_CLOSE // specified Applied To +) +{ + // + double result = EMPTY_VALUE; + + // + switch (source) + { + // + // Open ... + case PRICE_OPEN: + result = candle.open; + break; + + // + // High ... + case PRICE_HIGH: + result = candle.high; + break; + + // + // Low ... + case PRICE_LOW: + result = candle.low; + break; + + // + // Median ((High + Low) / 2) ... + case PRICE_MEDIAN: + result = (candle.high + candle.low) / 2; + break; + + // + // Typical ((High + Low + Close)/3) ... + case PRICE_TYPICAL: + result = (candle.high + candle.low + candle.close) / 3; + break; + + // + // Weighted ((High + Low + Close + Close)/4) ... + case PRICE_WEIGHTED: + result = (candle.high + candle.low + (candle.close * 2)) / 4; + break; + + // + // Close ... + default: + case PRICE_CLOSE: + result = candle.close; + break; + } + + // + return result; +} +double GetAppliedPrice( + int bar_index, // specify candle index + ENUM_APPLIED_PRICE source = PRICE_CLOSE // specified Applied To +) +{ + // + double result = EMPTY_VALUE; + + // + XOHCL candle = GetCandle(bar_index); + result = GetAppliedPrice(candle, source); + + // + return result; +} +double GetAppliedPrice( + int bar_index, // specify candle index + ENUM_SERIESMODE mode // converts Series Mode to Applied Price ... +) +{ + // + double result = 0; + + // + ENUM_APPLIED_PRICE mAppliedTo = To(mode); + result = GetAppliedPrice( + bar_index, + mAppliedTo); + + // + return result; +} + +// +template +double GetAppliedPrice(ENUM_APPLIED_PRICE tprice, T &open[], T &high[], T &low[], T &close[], int i) +{ + switch (tprice) + { + case PRICE_CLOSE: + return (close[i]); + case PRICE_OPEN: + return (open[i]); + case PRICE_HIGH: + return (high[i]); + case PRICE_LOW: + return (low[i]); + case PRICE_MEDIAN: + return ((high[i] + low[i]) / 2.0); + case PRICE_TYPICAL: + return ((high[i] + low[i] + close[i]) / 3.0); + case PRICE_WEIGHTED: + return ((high[i] + low[i] + close[i] + close[i]) / 4.0); + } + return (0); +} + +// +// Converts ... +ENUM_APPLIED_PRICE To( + ENUM_SERIESMODE mode // converts Series Mode to Applied Price ... +) +{ + // + ENUM_APPLIED_PRICE result = PRICE_CLOSE; + + // + switch (mode) + { + // + // High ... + case MODE_HIGH: + result = PRICE_HIGH; + break; + + // + // Open ... + case MODE_OPEN: + result = PRICE_OPEN; + break; + + // + // Low ... + case MODE_LOW: + result = PRICE_LOW; + break; + + // + // Close ... + // Default ... + case MODE_CLOSE: + default: + result = PRICE_CLOSE; + break; + } + + // + return result; +} + +// +// Retrieve a Candel Data ... +XOHCL GetCandle(int bar_index) +{ + // + XOHCL result = {}; + + // + double open = iOpen(_Symbol, _Period, bar_index); + double high = iHigh(_Symbol, _Period, bar_index); + double close = iClose(_Symbol, _Period, bar_index); + double low = iLow(_Symbol, _Period, bar_index); + + // + result.low = low; + result.open = open; + result.high = high; + result.close = close; + + // + return result; +} +XOHCL GetCandle( + ENUM_TIMEFRAMES mPeriod, // specify timeframe + int bar_index // specify candle index +) +{ + // + XOHCL result = {}; + + // + double open = iOpen(_Symbol, mPeriod, bar_index); + double high = iHigh(_Symbol, mPeriod, bar_index); + double close = iClose(_Symbol, mPeriod, bar_index); + double low = iLow(_Symbol, mPeriod, bar_index); + + // + result.low = low; + result.open = open; + result.high = high; + result.close = close; + + // + return result; +} +XOHCL GetCandle( + string symbol, // specify symbol + ENUM_TIMEFRAMES mPeriod, // specify timeframe + int bar_index // specify candle index +) +{ + // + XOHCL result = {}; + + // + double open = iOpen(symbol, mPeriod, bar_index); + double high = iHigh(symbol, mPeriod, bar_index); + double close = iClose(symbol, mPeriod, bar_index); + double low = iLow(symbol, mPeriod, bar_index); + + // + result.low = low; + result.open = open; + result.high = high; + result.close = close; + + // + return result; +} + +// +// Get a Series Of Candles ... +bool GetCandles( + XOHCL &result[], // Hold Result ... + string mSymbol = NULL, // Specified Symbol ... + ENUM_TIMEFRAMES mPeriod = NULL, // Specified Period ... + int mStart = 0, // Start Bar Index ... + int mCount = 1 // Specified Number of Candles ... +) +{ + // + bool mResult = false; + + // + if (mStart < 0) + { + mStart = 0; + } + + // + if (mCount <= 0) + { + mCount = 1; + } + + // + Clean(result); + + // + for (int i = mStart; i < mStart + mCount; i++) + { + // + XOHCL iC = GetCandle( + mSymbol, + mPeriod, + i); + + // + Add( + iC, + result); + } + + // + mResult = ArraySize(result) > 0; + + // + return mResult; +} + +// +// Retrieve a candle index in current timeframe inside another timeframe ... +int GetCandleBarIndex( + int bar_index, // Specify Candle index in current timeframe + ENUM_TIMEFRAMES destPeriod // Specify destination timeframe +) +{ + // + int result = -1; + + // + datetime barTime = iTime(_Symbol, _Period, bar_index); + result = iBarShift(_Symbol, destPeriod, barTime); + + // + return result; +} + +// +// Retrieve a symbol candle index in source time frame inside dest timeframe ... +int GetCandleBarIndex( + int bar_index, // Specify Candle index in current timeframe + string symbol, // Specify desired Symbol + ENUM_TIMEFRAMES sourcePeriod, // Specify bar_index timeframe + ENUM_TIMEFRAMES destPeriod // Specify destination timeframe +) +{ + // + int result = -1; + + // + datetime barTime = iTime(symbol, sourcePeriod, bar_index); + result = iBarShift(symbol, destPeriod, barTime); + + // + return result; +} + +// +// Check a Candle is Bullish or not ... +bool IsBullishCandle( + XOHCL &candle // specified candle +) +{ + // + bool result = false; + + // + result = candle.open < candle.close; + + // + return result; +} +bool IsBullishCandle( + int bar_index // candle index +) +{ + // + bool result = false; + + // + XOHCL candle = GetCandle(bar_index); + + // + result = IsBullishCandle(candle); + + // + return result; +} +bool IsBullishCandle( + string symbol, // specify symbol + ENUM_TIMEFRAMES mPeriod, // specify timeframe + int bar_index // candle index +) +{ + // + bool result = false; + + // + XOHCL candle = GetCandle( + symbol, + mPeriod, + bar_index); + + // + result = IsBullishCandle(candle); + + // + return result; +} + +// +// Check a Candle is Bullish or not ... +bool IsBearishCandle( + XOHCL &candle // specified candle +) +{ + // + bool result = false; + + // + result = candle.open > candle.close; + + // + return result; +} +bool IsBearishCandle( + int bar_index // candle index +) +{ + // + bool result = false; + + // + XOHCL candle = GetCandle(bar_index); + + // + result = IsBearishCandle(candle); + + // + return result; +} +bool IsBearishCandle( + string symbol, // specify symbol + ENUM_TIMEFRAMES mPeriod, // specify timeframe + int bar_index // candle index +) +{ + // + bool result = false; + + // + XOHCL candle = GetCandle( + symbol, + mPeriod, + bar_index); + + // + result = IsBearishCandle(candle); + + // + return result; +} + +// +// Check Candle Body Bigger Than it's Shadow ... +bool CandleHasStrongBody(XOHCL &candle) +{ + // + double bodySize = MathAbs(candle.open - candle.close); + double shadowSize = MathAbs(candle.high - candle.low) - bodySize; + + // + bool result = bodySize > (shadowSize * 1.5); + + // + return result; +} + +// +// Determines a cnadle is Swing High +// or Swing Low order block ... +ENUM_X_SWING_TYPE GetCandleSwing(int bar_index) +{ + // + ENUM_X_SWING_TYPE result = X_NO_SWING; + + // + // Reading Candle Models ... + XOHCL candles[3]; + candles[0] = GetCandle(bar_index + 1); + candles[1] = GetCandle(bar_index + 2); + candles[2] = GetCandle(bar_index + 3); + + // + // Check Swing Start Candle has Strong Body ... + bool isStrongBodyCandle = CandleHasStrongBody(candles[2]); + if (!isStrongBodyCandle) + { + return result; + } + + // + // Check Swing Low Conditions ... + bool isSwingLowOrderBlock = + candles[2].low < candles[1].low && + candles[1].low < candles[0].low && + candles[2].low < candles[0].low; + if (isSwingLowOrderBlock) + { + result = X_SWING_LOW; + } + + // + // Check Swing High Conditions ... + bool isSwingHighOrderBlock = + candles[2].high > candles[1].high && + candles[1].high > candles[0].high && + candles[2].high > candles[0].high; + if (isSwingHighOrderBlock) + { + result = X_SWING_HIGH; + } + + // + return result; +} +ENUM_X_SWING_TYPE GetCandleSwing( + ENUM_TIMEFRAMES mPeriod, // specify timeframe + int bar_index // specify candle index +) +{ + // + ENUM_X_SWING_TYPE result = X_NO_SWING; + + // + // Reading Candle Models ... + XOHCL candles[3]; + candles[0] = GetCandle(mPeriod, bar_index + 1); + candles[1] = GetCandle(mPeriod, bar_index + 2); + candles[2] = GetCandle(mPeriod, bar_index + 3); + + // + // Check Swing Start Candle has Strong Body ... + bool isStrongBodyCandle = CandleHasStrongBody(candles[2]); + if (!isStrongBodyCandle) + { + return result; + } + + // + // Check Swing Low Conditions ... + bool isSwingLowOrderBlock = + candles[2].low < candles[1].low && + candles[1].low < candles[0].low && + candles[2].low < candles[0].low; + if (isSwingLowOrderBlock) + { + result = X_SWING_LOW; + } + + // + // Check Swing High Conditions ... + bool isSwingHighOrderBlock = + candles[2].high > candles[1].high && + candles[1].high > candles[0].high && + candles[2].high > candles[0].high; + if (isSwingHighOrderBlock) + { + result = X_SWING_HIGH; + } + + // + return result; +} +ENUM_X_SWING_TYPE GetCandleSwing( + string symbol, // specify symbol + ENUM_TIMEFRAMES mPeriod, // specify timeframe + int bar_index // specify candle index +) +{ + // + ENUM_X_SWING_TYPE result = X_NO_SWING; + + // + // Reading Candle Models ... + XOHCL candles[3]; + candles[0] = GetCandle(symbol, mPeriod, bar_index + 1); + candles[1] = GetCandle(symbol, mPeriod, bar_index + 2); + candles[2] = GetCandle(symbol, mPeriod, bar_index + 3); + + // + // Check Swing Start Candle has Strong Body ... + bool isStrongBodyCandle = CandleHasStrongBody(candles[2]); + if (!isStrongBodyCandle) + { + return result; + } + + // + // Check Swing Low Conditions ... + bool isSwingLowOrderBlock = + candles[2].low < candles[1].low && + candles[1].low < candles[0].low && + candles[2].low < candles[0].low; + if (isSwingLowOrderBlock) + { + result = X_SWING_LOW; + } + + // + // Check Swing High Conditions ... + bool isSwingHighOrderBlock = + candles[2].high > candles[1].high && + candles[1].high > candles[0].high && + candles[2].high > candles[0].high; + if (isSwingHighOrderBlock) + { + result = X_SWING_HIGH; + } + + // + return result; +} + +// +// Find Swing Points ... +int FindSwing( + string mSymbol, // Trading Symbol ... + ENUM_TIMEFRAMES mPeriod, // Trading Period ... + ENUM_SERIESMODE mode, // Swing Based On Price mode ... + int mLength, // Loopback ... + int bar_index // BarIndex ... +) +{ + // + int result = -1; + + // + if (StringLen(mSymbol) == 0 || (mode != MODE_HIGH && mode != MODE_LOW)) + { + return result; + } + + // + int current = bar_index; + int founded = FindNextSwing( + mSymbol, + mPeriod, + mode, + (mLength * 2) + 1, + current - mLength); + + // + while (founded != current) + { + // + current = FindNextSwing( + mSymbol, + mPeriod, + mode, + mLength, + current + 1); + + // + founded = FindNextSwing( + mSymbol, + mPeriod, + mode, + (mLength * 2) + 1, + current - mLength); + } + + // + result = current; + + // + return result; +} + +// +// Find Next Swing ... +int FindNextSwing( + string mSymbol, // Trading Symbol ... + ENUM_TIMEFRAMES mPeriod, // Trading Period ... + ENUM_SERIESMODE mode, // Swing Based On Price mode ... + int mLength, // Loopback ... + int bar_index // BarIndex ... +) +{ + // + int result = -1; + + // + if (bar_index < 0) + { + mLength += bar_index; + bar_index = 0; + } + + // + result = mode == MODE_HIGH + ? iHighest( + mSymbol, + mPeriod, + mode, + mLength, + bar_index) + : iLowest( + mSymbol, + mPeriod, + mode, + mLength, + bar_index); + + // + return result; +} + +// +// Retrieve Market Highest High ... +double GetHighestHigh( + int mLength, // Which market Length use + int bar_index // bar index +) +{ + // + double result = -1; + + // + int rIdx = iHighest( + _Symbol, + _Period, + MODE_HIGH, + mLength, + bar_index); + + // + result = iHigh( + _Symbol, + _Period, + rIdx); + + // + return result; +} +double GetHighestHigh( + int mLength, // Which market Length use + int bar_index, // bar index + ENUM_SERIESMODE mode // Calculation mode +) +{ + // + double result = -1; + + // + int rIdx = iHighest( + _Symbol, + _Period, + mode, + mLength, + bar_index); + + // + result = iHigh( + _Symbol, + _Period, + rIdx); + + // + return result; +} +double GetHighestHigh( + string symbol, // Specified Symbol + ENUM_TIMEFRAMES mPeriod, // Specified Period + int mLength, // Which market Length use + int bar_index // bar index +) +{ + // + double result = -1; + + // + int rIdx = iHighest( + symbol, + mPeriod, + MODE_HIGH, + mLength, + bar_index); + + // + result = iHigh( + symbol, + mPeriod, + rIdx); + + // + return result; +} +double GetHighestHigh( + string symbol, // Specified Symbol + ENUM_TIMEFRAMES mPeriod, // Specified Period + ENUM_SERIESMODE mode, // Calculation mode + int mLength, // Which market Length use + int bar_index // bar index +) +{ + // + double result = -1; + + // + int rIdx = iHighest( + symbol, + mPeriod, + mode, + mLength, + bar_index); + + // + result = iHigh( + symbol, + mPeriod, + rIdx); + + // + return result; +} + +// +// Retrieve Market Lowest Low ... +double GetLowestLow( + int mLength, // Which market Length use + int bar_index // bar index +) +{ + // + double result = -1; + + // + int rIdx = iLowest( + _Symbol, + _Period, + MODE_LOW, + mLength, + bar_index); + + // + result = iLow( + _Symbol, + _Period, + rIdx); + + // + return result; +} +double GetLowestLow( + int mLength, // Which market Length use + int bar_index, // bar index + ENUM_SERIESMODE mode // Calculation mode +) +{ + // + double result = -1; + + // + int rIdx = iLowest( + _Symbol, + _Period, + mode, + mLength, + bar_index); + + // + result = iLow( + _Symbol, + _Period, + rIdx); + + // + return result; +} +double GetLowestLow( + string symbol, // Specified Symbol + ENUM_TIMEFRAMES mPeriod, // Specified Period + int mLength, // Which market Length use + int bar_index // bar index +) +{ + // + double result = -1; + + // + int rIdx = iLowest( + symbol, + mPeriod, + MODE_LOW, + mLength, + bar_index); + + // + result = iLow( + symbol, + mPeriod, + rIdx); + + // + return result; +} +double GetLowestLow( + string symbol, // Specified Symbol + ENUM_TIMEFRAMES mPeriod, // Specified Period + ENUM_SERIESMODE mode, // Calculation mode + int mLength, // Which market Length use + int bar_index // bar index +) +{ + // + double result = -1; + + // + int rIdx = iLowest( + symbol, + mPeriod, + mode, + mLength, + bar_index); + + // + result = iLow( + symbol, + mPeriod, + rIdx); + + // + return result; +} + +// +// Find Support and Resistance for Specific Bar based on provided Buffer ... +XOHCLSupRes ExtractSupportAndResistance( + int barIndex, // Bar Index ... + const double &pivots[], // Provided Pivot Points ... + int count = 3, // Number of Requireds ... + string mSymbol = NULL, // Trading Symbol ... + ENUM_TIMEFRAMES mPeriod = NULL // Trading Period ... +) +{ + // + if (StringLen(mSymbol) == 0 || mSymbol == NULL) + { + mSymbol = _Symbol; + } + + // + if (mPeriod == NULL) + { + mPeriod = _Period; + } + + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + XOHCLSupRes result; + Clean(result.res); + Clean(result.sup); + + // + int pivotsCount = ArraySize(pivots); + if (pivotsCount <= 0) + { + return result; + } + + // + if (count <= 0 || + count > pivotsCount - 1) + { + return result; + } + + // + XOHCL cBar = GetCandle( + mSymbol, + mPeriod, + barIndex); + + // + double tmpR[]; + + // + double tmpS[]; + + // + // Extract Supports ... + // which prices is under low of candle ... + // + // Extract Resistance ... + // which prices is over high of candle ... + for (int i = 0; i < pivotsCount; i++) + { + // + double iFlat = pivots[i]; + + // + if (iFlat > cBar.high) + { + Add( + iFlat, + tmpR); + } + else if (iFlat < cBar.low) + { + Add( + iFlat, + tmpS); + } + } + + // + // Sorting Founded Resistance and Supports ... + + // + // Since Resistance Levels must be Increasing ... + ArraySort(tmpR); + + // + // Since Support Levels must be Decreasing ... + ArraySort(tmpS); + ArrayReverse(tmpS); + + // + // Fill Resistance ... + int tmpRCount = ArraySize(tmpR); + if (tmpRCount > 0) + { + // + if (tmpRCount < count) + { + // + ArrayCopy( + result.res, + tmpR); + } + else + { + // + ArrayCopy( + result.res, + tmpR, + 0, + 0, + count); + } + } + + // + // Fill Supports ... + int tmpSCount = ArraySize(tmpS); + if (tmpSCount > 0) + { + // + if (tmpSCount < count) + { + // + ArrayCopy( + result.sup, + tmpS); + } + else + { + // + ArrayCopy( + result.sup, + tmpS, + 0, + 0, + count); + } + } + + // + return result; +} + +// +// Find Support and Resistance for Specific Price based on provided Buffer ... +XOHCLSupRes ExtractSupportAndResistance( + double price, // Price ... + const double &pivots[], // Provided Pivot Points ... + int count = 3 // Number of Requireds ... +) +{ + // + XOHCLSupRes result; + Clean(result.res); + Clean(result.sup); + + // + if (price <= 0) + { + return result; + } + + // + int pivotsCount = ArraySize(pivots); + if (pivotsCount <= 0) + { + return result; + } + + // + if (count <= 0 || + count > pivotsCount - 1) + { + return result; + } + + // + double tmpR[]; + + // + double tmpS[]; + + // + // Extract Supports ... + // which prices is under low of candle ... + // + // Extract Resistance ... + // which prices is over high of candle ... + for (int i = 0; i < pivotsCount; i++) + { + // + double iFlat = pivots[i]; + + // + if (iFlat > price) + { + Add( + iFlat, + tmpR); + } + else if (iFlat < price) + { + Add( + iFlat, + tmpS); + } + } + + // + // Sorting Founded Resistance and Supports ... + + // + // Since Resistance Levels must be Increasing ... + ArraySort(tmpR); + + // + // Since Support Levels must be Decreasing ... + ArraySort(tmpS); + ArrayReverse(tmpS); + + // + // Fill Resistance ... + int tmpRCount = ArraySize(tmpR); + if (tmpRCount > 0) + { + // + if (tmpRCount < count) + { + // + ArrayCopy( + result.res, + tmpR); + } + else + { + // + ArrayCopy( + result.res, + tmpR, + 0, + 0, + count); + } + } + + // + // Fill Supports ... + int tmpSCount = ArraySize(tmpS); + if (tmpSCount > 0) + { + // + if (tmpSCount < count) + { + // + ArrayCopy( + result.sup, + tmpS); + } + else + { + // + ArrayCopy( + result.sup, + tmpS, + 0, + 0, + count); + } + } + + // + return result; +} + +// +// Find a Value less than Specified ... +double FindLesserThanValue( + double value, // Specified Value ... + const double &source[], // Source ... + bool isDescend = false // Find Biggest Lesser Value ... +) +{ + // + double result = -1; + + // + int itemsCount = ArraySize(source); + if (itemsCount <= 0) + { + return result; + } + + // + // Make a Copy of source ... + double tmp[]; + + // + ArrayResize( + tmp, + ArraySize(source)); + + // + ArrayCopy( + tmp, + source); + + // + // Sort Temp Buffer ... + ArraySort(tmp); + if (isDescend) + { + ArrayReverse(tmp); + } + + // + int tmpCount = ArraySize(tmp); + for (int i = 0; i < tmpCount; i++) + { + // + double iValue = tmp[i]; + + // + if (iValue < value) + { + // + result = iValue; + break; + } + } + + // + return result; +} + +// +// Find a Value less than Specified ... +double FindBiggerThanValue( + double value, // Specified Value ... + const double &source[], // Source ... + bool isDescend = false // Find Smallest Bigger Value ... +) +{ + // + double result = -1; + + // + int itemsCount = ArraySize(source); + if (itemsCount <= 0) + { + return result; + } + + // + // Make a Copy of source ... + double tmp[]; + + // + ArrayResize( + tmp, + ArraySize(source)); + + // + ArrayCopy( + tmp, + source); + + // + // Sort Temp Buffer ... + ArraySort(tmp); + if (!isDescend) + { + ArrayReverse(tmp); + } + + // + int tmpCount = ArraySize(tmp); + for (int i = 0; i < tmpCount; i++) + { + // + double iValue = tmp[i]; + + // + if (iValue > value) + { + // + result = iValue; + break; + } + } + + // + return result; +} + +// +// Calculate Fib Level ... +double GetFibonacciLevel( + double upPrice, + double downPrice, + double level, + int direction) +{ + // + double ling = upPrice - downPrice; + double pLevel = (ling / 100) * (level * 100); + + // + double result = direction > 0 ? upPrice - pLevel : downPrice + pLevel; + result = NormalizeDouble(result, _Digits); + + // + return result; +} + +// +// Check first Cross Over second at bar_index ... +bool IsCrossOver( + const double &first[], // the buffer which check crossing over second buffer + const double &second[], // first buffer checks based on this buffer + const int bar_index // check crosses in specific index +) +{ + // + bool result = false; + + // + ArraySetAsSeries(first, true); + ArraySetAsSeries(second, true); + + // + // Validate Args ... + if (ArraySize(first) < bar_index + 1 || ArraySize(second) < bar_index + 1) + { + return result; + } + + // + result = first[bar_index] > second[bar_index] && + !(first[bar_index + 1] > second[bar_index + 1]); + + // + return result; +} + +// +// Check first is Over second at bar_index ... +bool IsOver( + const double &first[], // the buffer which check over second buffer + const double &second[], // first buffer checks based on this buffer + const int bar_index // check crosses in specific index +) +{ + // + bool result = false; + + // + ArraySetAsSeries(first, true); + ArraySetAsSeries(second, true); + + // + // Validate Args ... + if (ArraySize(first) < bar_index + 1 || ArraySize(second) < bar_index + 1) + { + return result; + } + + // + result = first[bar_index] > second[bar_index] && + first[bar_index + 1] > second[bar_index + 1]; + + // + return result; +} + +// +// Check first Cross Under second at bar_index ... +bool IsCrossUnder( + const double &first[], // the buffer which check crossing under second buffer + const double &second[], // first buffer checks based on this buffer + const int bar_index // check crosses in specific index +) +{ + // + bool result = false; + + // + ArraySetAsSeries(first, true); + ArraySetAsSeries(second, true); + + // + // Validate Args ... + if (ArraySize(first) < bar_index + 1 || ArraySize(second) < bar_index + 1) + { + return result; + } + + // + result = first[bar_index] < second[bar_index] && + !(first[bar_index + 1] < second[bar_index + 1]); + + // + return result; +} + +// +// Check first is Under second at bar_index ... +bool IsUnder( + const double &first[], // the buffer which check under second buffer + const double &second[], // first buffer checks based on this buffer + const int bar_index // check crosses in specific index +) +{ + // + bool result = false; + + // + ArraySetAsSeries(first, true); + ArraySetAsSeries(second, true); + + // + // Validate Args ... + if (ArraySize(first) < bar_index + 1 || ArraySize(second) < bar_index + 1) + { + return result; + } + + // + result = first[bar_index] < second[bar_index] && + first[bar_index + 1] < second[bar_index + 1]; + + // + return result; +} + +// +// Calculate Slope of Specified Buffer at Specified Index ... +double GetSlope( + int from, // In Past Index ... + int to, // In Past Index ... + double &buffer[]) +{ + // + double result = 0; + + // + double toValue = buffer[to]; + double fromValue = buffer[from]; + double deltaValue = toValue - fromValue; + double deltaTime = from - to; + + // + result = deltaValue / deltaTime; + + // + return result; +} + +// +// Check if a Value Increasing in Loopback ... +bool IsIncreasing( + int from, // Last Time Index + int to, // Fisr Tima Index + double &buffer[] // the Buffer which required to search +) +{ + // + bool result = false; + + // + // Validate Args ... + if ( + from <= to || + ArraySize(buffer) < from + 1) + { + return result; + } + + // + // Loop through Items ... + double toValue = buffer[to]; + double fromValue = buffer[from]; + result = toValue > fromValue; + for (int i = to + 1; i <= from - 1; i++) + { + // + double iValue = buffer[i]; + bool isPassed = toValue >= iValue; + + // + bool isIIncreasing = IsIncreasing( + from, + i, + buffer); + + // + // Check Result ... + result = result && isPassed && isIIncreasing; + if (!result) + { + break; + } + } + + // + return result; +} + +// +// Check if a Value Decreasing in Loopback ... +bool IsDecreasing( + int from, // Last Time Index + int to, // Fisr Tima Index + double &buffer[] // the Buffer which required to search +) +{ + // + bool result = false; + + // + // Validate Args ... + if ( + from <= to || + ArraySize(buffer) < from + 1) + { + return result; + } + + // + // Loop through Items ... + double toValue = buffer[to]; + double fromValue = buffer[from]; + result = toValue < fromValue; + for (int i = to + 1; i <= from - 1; i++) + { + // + double iValue = buffer[i]; + bool isPassed = toValue <= iValue; + + // + bool isIDecreasing = IsDecreasing( + from, + i, + buffer); + + // + // Check Result ... + result = result && isPassed && isIDecreasing; + if (!result) + { + break; + } + } + + // + return result; +} + +// +// Get Max Value of Specific Loopback of a Buffer ... +double GetMaxValue( + int mLoopback, // loopback length + double &buffer[] // the Buffer which required to search +) +{ + // + double result = 0; + + // + // Validate Args ... + if ( + mLoopback < 2 || + ArraySize(buffer) < mLoopback) + { + return result; + } + + // + // Loop Through LoopBack ... + for (int i = 0; i < mLoopback; i++) + { + // + double iValue = buffer[i]; + + // + result = + // + result == 0 || result < iValue + // + ? iValue + // + : result + // + ; + } + + // + return result; +} + +// +// Get Min Value of Specific Loopback of a Buffer ... +double GetMinValue( + int mLoopback, // loopback length + double &buffer[] // the Buffer which required to search +) +{ + // + double result = 0; + + // + // Validate Args ... + if ( + mLoopback < 2 || + ArraySize(buffer) < mLoopback) + { + return result; + } + + // + // Loop Through LoopBack ... + for (int i = 0; i < mLoopback; i++) + { + // + double iValue = buffer[i]; + + // + result = + // + result == 0 || result > iValue + // + ? iValue + // + : result + // + ; + } + + // + return result; +} + +// +// Find Same Values in Array ... +void FindSameValueInBuffer( + double &result[], // Holds Result ... + double &source[], // Source ... + int verifications = 3 // Number of Consequence Repeat ... +) +{ + // + Clean(result); + + // + // TenkanSen Flats ... + int sourceCount = ArraySize(source); + if (sourceCount > verifications) + { + // + double mLast = 0; + int mVerified = 0; + for (int i = 0; i < sourceCount; i++) + { + // + double iVal = source[i]; + if (mLast == 0) + { + mLast = iVal; + } + else if (mLast == iVal) + { + mVerified++; + } + else + { + mLast = iVal; + mVerified = 0; + } + + // + if (iVal == mLast && mVerified >= verifications) + { + // + Add( + iVal, + result); + + // + mLast = 0; + mVerified = 0; + } + } + } +} + +// +bool IsInPeak( + int mLoopback, // loopback length + double &buffer[] // the Buffer which required to search +) +{ + // + bool result = false; + + // + // Validate Args ... + if ( + mLoopback < 2 || + ArraySize(buffer) < mLoopback + 1) + { + return result; + } + + // + int q1Length = mLoopback / 4; + int halfLength = mLoopback / 2; + int q2Length = halfLength + q1Length; + + // + double firstValue = buffer[1]; + double q1Value = buffer[q1Length]; + double q2Value = buffer[q2Length]; + double halfValue = buffer[halfLength]; + double lastValue = buffer[ArraySize(buffer) - 1]; + + // + // Peak ... + result = + // + firstValue > lastValue + // + && + // + ( + firstValue > q1Value && + firstValue > halfValue) + // + ; + + // + return result; +} + +// +bool IsInVale( + int mLoopback, // loopback length + double &buffer[] // the Buffer which required to search +) +{ + // + bool result = false; + + // + // Validate Args ... + if ( + mLoopback < 2 || + ArraySize(buffer) < mLoopback + 1) + { + return result; + } + + // + int q1Length = mLoopback / 4; + int halfLength = mLoopback / 2; + int q2Length = halfLength + q1Length; + + // + double firstValue = buffer[1]; + double q1Value = buffer[q1Length]; + double q2Value = buffer[q2Length]; + double halfValue = buffer[halfLength]; + double lastValue = buffer[ArraySize(buffer) - 1]; + + // + // Peak ... + result = + // + firstValue < lastValue + // + && + // + ( + firstValue < q1Value && + firstValue < halfValue) + // + ; + + // + return result; +} + +// +// Check Sharp Happens or not ... +bool IsSharpChanged( + double fromValue, // Past Value + double toValue, // Present Value + double maxValue, // Max in Range Value + double minValue // Min in Range Value +) +{ + // + bool result = false; + + // + // This Used In Increased or Decreased Sharp Detection ... + bool isIncreased = toValue > fromValue; + + // + double toFromDelta = MathAbs(toValue - fromValue); + double minMaxDelta = maxValue - minValue; + + // + result = toFromDelta >= (minMaxDelta / 3); + + // + return result; +} +bool IsSharpChanged( + int from, // Past Index in Series + int to, // Present Index in Series + double &buffer[] // the Buffer which required to search +) +{ + // + bool result = false; + + // + // Validate Args ... + if ( + from <= to || + ArraySize(buffer) < from + 1) + { + return result; + } + + // + // Loop through Items ... + double toValue = buffer[to]; + double fromValue = buffer[from]; + + // + // This Used In Increased or Decreased Sharp Detection ... + bool isIncreased = toValue > fromValue; + + // + double minValue = GetMinValue( + ArraySize(buffer) - 1, + buffer); + double maxValue = GetMaxValue( + ArraySize(buffer) - 1, + buffer); + double minMaxDelta = maxValue - minValue; + + // + // Sharp Detection ... + result = IsSharpChanged( + fromValue, + toValue, + maxValue, + minValue); + + // + return result; +} +bool IsSharpChanged( + int from, // Past Bar Index + int to, // Present Bar Index + ENUM_APPLIED_PRICE appliedPrice // Which Price Choose in From or To +) +{ + // + bool result = false; + + // + double toValue = GetAppliedPrice( + to, + appliedPrice); + double fromValue = GetAppliedPrice( + from, + appliedPrice); + + // + int hIdx = iHighest( + _Symbol, + _Period, + MODE_HIGH, + from, + to); + double maxValue = iHigh( + _Symbol, + _Period, + hIdx); + + // + int lIdx = iLowest( + _Symbol, + _Period, + MODE_LOW, + from, + to); + double minValue = iLow( + _Symbol, + _Period, + lIdx); + + // + result = IsSharpChanged( + fromValue, + toValue, + maxValue, + minValue); + + // + return result; +} + +// +// Check InCreased Sharp Happens or not ... +bool IsSharpIncreasedChanged( + double fromValue, // Past Value + double toValue, // Present Value + double maxValue, // Max in Range Value + double minValue // Min in Range Value +) +{ + // + bool result = false; + + // + // This Used In Increased or Decreased Sharp Detection ... + bool isIncreased = toValue > fromValue; + + // + double toFromDelta = MathAbs(toValue - fromValue); + double minMaxDelta = maxValue - minValue; + + // + result = + isIncreased && + toFromDelta >= (minMaxDelta / 3); + + // + return result; +} +bool IsSharpIncreasedChanged( + int from, // Past Index in Series + int to, // Present Index in Series + double &buffer[] // the Buffer which required to search +) +{ + // + bool result = false; + + // + // Validate Args ... + if ( + from <= to || + ArraySize(buffer) < from + 1) + { + return result; + } + + // + // Loop through Items ... + double toValue = buffer[to]; + double fromValue = buffer[from]; + + // + double minValue = GetMinValue( + ArraySize(buffer) - 1, + buffer); + double maxValue = GetMaxValue( + ArraySize(buffer) - 1, + buffer); + double minMaxDelta = maxValue - minValue; + + // + // Sharp Detection ... + result = IsSharpIncreasedChanged( + fromValue, + toValue, + maxValue, + minValue); + + // + return result; +} +bool IsSharpIncreasedChanged( + int from, // Past Bar Index + int to, // Present Bar Index + ENUM_APPLIED_PRICE appliedPrice // Which Price Choose in From or To +) +{ + // + bool result = false; + + // + double toValue = GetAppliedPrice( + to, + appliedPrice); + double fromValue = GetAppliedPrice( + from, + appliedPrice); + + // + int hIdx = iHighest( + _Symbol, + _Period, + MODE_HIGH, + from, + to); + double maxValue = iHigh( + _Symbol, + _Period, + hIdx); + + // + int lIdx = iLowest( + _Symbol, + _Period, + MODE_LOW, + from, + to); + double minValue = iLow( + _Symbol, + _Period, + lIdx); + + // + result = IsSharpIncreasedChanged( + fromValue, + toValue, + maxValue, + minValue); + + // + return result; +} + +// +// Check Decreased Sharp Happens or not ... +bool IsSharpDecreasedChanged( + double fromValue, // Past Value + double toValue, // Present Value + double maxValue, // Max in Range Value + double minValue // Min in Range Value +) +{ + // + bool result = false; + + // + // This Used In Increased or Decreased Sharp Detection ... + bool isIncreased = toValue > fromValue; + + // + double toFromDelta = MathAbs(toValue - fromValue); + double minMaxDelta = maxValue - minValue; + + // + result = + !isIncreased && + toFromDelta >= (minMaxDelta / 3); + + // + return result; +} +bool IsSharpDecreasedChanged( + int from, // Past Index in Series + int to, // Present Index in Series + double &buffer[] // the Buffer which required to search +) +{ + // + bool result = false; + + // + // Validate Args ... + if ( + from <= to || + ArraySize(buffer) < from + 1) + { + return result; + } + + // + // Loop through Items ... + double toValue = buffer[to]; + double fromValue = buffer[from]; + + // + double minValue = GetMinValue( + ArraySize(buffer) - 1, + buffer); + double maxValue = GetMaxValue( + ArraySize(buffer) - 1, + buffer); + double minMaxDelta = maxValue - minValue; + + // + // Sharp Detection ... + result = IsSharpDecreasedChanged( + fromValue, + toValue, + maxValue, + minValue); + + // + return result; +} +bool IsSharpDecreasedChanged( + int from, // Past Bar Index + int to, // Present Bar Index + ENUM_APPLIED_PRICE appliedPrice // Which Price Choose in From or To +) +{ + // + bool result = false; + + // + double toValue = GetAppliedPrice( + to, + appliedPrice); + double fromValue = GetAppliedPrice( + from, + appliedPrice); + + // + int hIdx = iHighest( + _Symbol, + _Period, + MODE_HIGH, + from, + to); + double maxValue = iHigh( + _Symbol, + _Period, + hIdx); + + // + int lIdx = iLowest( + _Symbol, + _Period, + MODE_LOW, + from, + to); + double minValue = iLow( + _Symbol, + _Period, + lIdx); + + // + result = IsSharpDecreasedChanged( + fromValue, + toValue, + maxValue, + minValue); + + // + return result; +} + +// +void Clean(int &buffer[]) +{ + // + ArrayFree(buffer); + ArrayResize(buffer, 0); +} +void Clean(ulong &buffer[]) +{ + // + ArrayFree(buffer); + ArrayResize(buffer, 0); +} +void Clean(string &buffer[]) +{ + // + ArrayFree(buffer); + ArrayResize(buffer, 0); +} +void Clean(double &buffer[]) +{ + // + ArrayFree(buffer); + ArrayResize(buffer, 0); +} + +// +bool GetLastItem( + double &item, // Holds Result + double &buffer[] // Specified Buffer +) +{ + // + bool result = false; + + // + int bufferSize = ArraySize(buffer); + if (bufferSize <= 0) + { + return result; + } + + // + item = buffer[bufferSize - 1]; + + // + result = true; + return result; +} +bool GetLastItem( + datetime &item, // Holds Result + datetime &buffer[] // Specified Buffer +) +{ + // + bool result = false; + + // + int bufferSize = ArraySize(buffer); + if (bufferSize <= 0) + { + return result; + } + + // + item = buffer[bufferSize - 1]; + + // + result = true; + return result; +} + +// +void Add( + int item, // item want to add + int &buffer[] // Destination buffer +) +{ + // + ArrayResize( + buffer, + ArraySize(buffer) + 1); + + // + buffer[ArraySize(buffer) - 1] = item; +} +void Add( + ulong item, // item want to add + ulong &buffer[] // Destination buffer +) +{ + // + ArrayResize( + buffer, + ArraySize(buffer) + 1); + + // + buffer[ArraySize(buffer) - 1] = item; +} +void Add( + string item, // item want to add + string &buffer[] // Destination buffer +) +{ + // + ArrayResize( + buffer, + ArraySize(buffer) + 1); + + // + buffer[ArraySize(buffer) - 1] = item; +} +void Add( + double item, // item want to add + double &buffer[] // Destination buffer +) +{ + // + ArrayResize( + buffer, + ArraySize(buffer) + 1); + + // + buffer[ArraySize(buffer) - 1] = item; +} +void Add( + XOHCL &item, // item want to add + XOHCL &buffer[] // Destination buffer +) +{ + // + ArrayResize( + buffer, + ArraySize(buffer) + 1); + + // + buffer[ArraySize(buffer) - 1] = item; +} +void Add( + datetime &item, // item want to add + datetime &buffer[] // Destination buffer +) +{ + // + ArrayResize( + buffer, + ArraySize(buffer) + 1); + + // + buffer[ArraySize(buffer) - 1] = item; +} + +// +// Add an Item to a Buffer if not Exists ... +void AddIfNotExists( + double value, + double &values[], + double smoothingPoint = 3) +{ + // + double smoothingValue = smoothingPoint * GetPoints(_Symbol); + + // + int valuesCount = ArraySize(values); + if (valuesCount <= 0) + { + // + Add(value, + values); + } + else + { + // + bool isExists = false; + for (int i = 0; i < valuesCount; i++) + { + // + double iVal = values[i]; + + // + double diff = MathAbs(iVal - value); + + // + if (iVal == value || diff < smoothingValue) + { + // + isExists = true; + break; + } + } + + // + if (!isExists) + { + // + Add(value, + values); + } + } +} + +// +// Add a Buffers Child to another Buffer +// if it's not Contains them ... +void AddsIfNotExists( + double &source[], + double &dest[], + double smoothingPoint = 3) +{ + // + double smoothingValue = smoothingPoint * GetPoints(_Symbol); + + // + int sourceCount = ArraySize(source); + if (sourceCount <= 0) + { + return; + } + + // + for (int i = 0; i < sourceCount; i++) + { + // + double iSource = source[i]; + + // + AddIfNotExists( + iSource, + dest, + smoothingPoint); + } +} + +// +// Converts a Buffer to String Representation ... +string ToString( + const int &buffer[], // Specified Buffer + string separator = ",", // Specified Separator + bool addIndex = false, // Specified Add Items Indexes or Not + string indexLabel = "i:", // Specified Index Label + string indexSeparator = ">" // Specified Index Separator + +) +{ + // + string result = ""; + + // + int bufferSize = ArraySize(buffer); + if (bufferSize <= 0) + { + return result; + } + + // + for (int i = 0; i < bufferSize; i++) + { + // + if (addIndex) + { + // + if (StringLen(indexLabel) > 0) + { + result += indexLabel + " "; + } + + // + result += (string)i + " "; + + // + if (StringLen(indexSeparator) > 0) + { + result += indexSeparator + " "; + } + } + + // + string iItemString = (string)buffer[i]; + + // + result += iItemString; + + // + if (i < bufferSize - 1) + { + result += separator; + } + } + + // + return result; +} +string ToString( + const double &buffer[], // Specified Buffer + string separator = ",", // Specified Separator + bool addIndex = false, // Specified Add Items Indexes or Not + string indexLabel = "i:", // Specified Index Label + string indexSeparator = ">" // Specified Index Separator + +) +{ + // + string result = ""; + + // + int bufferSize = ArraySize(buffer); + if (bufferSize <= 0) + { + return result; + } + + // + for (int i = 0; i < bufferSize; i++) + { + // + if (addIndex) + { + // + if (StringLen(indexLabel) > 0) + { + result += indexLabel + " "; + } + + // + result += (string)i + " "; + + // + if (StringLen(indexSeparator) > 0) + { + result += indexSeparator + " "; + } + } + + // + string iItemString = (string)buffer[i]; + + // + result += iItemString; + + // + if (i < bufferSize - 1) + { + result += separator; + } + } + + // + return result; +} +string ToString( + const string &buffer[], // Specified Buffer + string separator = ",", // Specified Separator + bool addIndex = false, // Specified Add Items Indexes or Not + string indexLabel = "i:", // Specified Index Label + string indexSeparator = ">" // Specified Index Separator + +) +{ + // + string result = ""; + + // + int bufferSize = ArraySize(buffer); + if (bufferSize <= 0) + { + return result; + } + + // + for (int i = 0; i < bufferSize; i++) + { + // + if (addIndex) + { + // + if (StringLen(indexLabel) > 0) + { + result += indexLabel + " "; + } + + // + result += (string)i + " "; + + // + if (StringLen(indexSeparator) > 0) + { + result += indexSeparator + " "; + } + } + + // + string iItemString = (string)buffer[i]; + + // + result += iItemString; + + // + if (i < bufferSize - 1) + { + result += separator; + } + } + + // + return result; +} +string ToString( + const datetime &buffer[], // Specified Buffer + string separator = ",", // Specified Separator + bool addIndex = false, // Specified Add Items Indexes or Not + string indexLabel = "i:", // Specified Index Label + string indexSeparator = ">" // Specified Index Separator +) +{ + // + string result = ""; + + // + int bufferSize = ArraySize(buffer); + if (bufferSize <= 0) + { + return result; + } + + // + for (int i = 0; i < bufferSize; i++) + { + // + if (addIndex) + { + // + if (StringLen(indexLabel) > 0) + { + result += indexLabel + " "; + } + + // + result += (string)i + " "; + + // + if (StringLen(indexSeparator) > 0) + { + result += indexSeparator + " "; + } + } + + // + string iItemString = (string)buffer[i]; + + // + result += iItemString; + + // + if (i < bufferSize - 1) + { + result += separator; + } + } + + // + return result; +} +template +string ToString(T value) +{ + return (string)value; +} + +// +// Search Array For Specific Item ... +template +int FindIndex( + T item, // What is Search ... + T &buffer[] // Search in ... +) +{ + // + int result = -1; + + // + int count = ArraySize(buffer); + if (count <= 0) + { + return result; + } + + // + for (int i = 0; i < count; i++) + { + // + T iT = buffer[i]; + + // + if (iT == item) + { + // + result = i; + break; + } + } + + // + return result; +} + +template +bool Contains( + T item, // What is Search ... + T &buffer[] // Search in ... +) +{ + // + bool result = false; + + // + int idx = FindIndex( + item, + buffer); + result = idx > -1; + + // + return result; +} + +// +// Split an String Representation of an Array ... +void SplitContent( + string &result[], // Hold Result ... + string content, // Source ... + string separator = ",", // Separator ... + bool forceCleanResult = true // Clean Result ... +) +{ + // + if (forceCleanResult) + { + Clean(result); + } + + // + if (separator == NULL || StringLen(separator) == 0) + { + separator = ","; + } + + // + if (StringLen(content) == 0) + { + return; + } + + // + StringSplit( + content, + StringGetCharacter( + separator, + 0), + result); +} + +// +// Extract Data from String ... +string ExtractString( + const string source, // Source String used for Extracting + const string startString, // Expression Start String must be Unique + const string endString // Where to End Extraction, usually a Sign +) +{ + // + string result = ""; + + // + // Validate String ... + if ( + StringLen(source) == 0 || + StringLen(endString) == 0 || + StringLen(startString) == 0) + { + return result; + } + + // + // Find Start String Position ... + int sPos = StringFind( + source, + startString); + if (sPos < 0) + { + return result; + } + + // + // Find End String Position after Start String ... + int searchEndFromPos = sPos + StringLen(startString); + int ePos = StringFind( + source, + endString, + searchEndFromPos); + if (ePos < 0) + { + return result; + } + + // + // Extract Data from Source ... + int dLength = ePos - searchEndFromPos; + result = StringSubstr( + source, + searchEndFromPos, + dLength); + + // + return result; +} + +// +// Normalize a give Volume ... +double NormalizeVolume( + double volume, // desired volume to normalize + string symbol = NULL, // Specified Symbol for Normalization + int mLength = 2 // Length of Digits +) +{ + // + double result = volume; + + // + // Normalize Symbol ... + if (StringLen(symbol) == 0) + { + symbol = _Symbol; + } + + // + // Normalize Digits ... + int digits = GetDigits(symbol); + mLength = + mLength == 0 || mLength > digits + ? digits + : MathMin(mLength, digits); + + // + // Normalize Volume ... + result = NormalizeDouble(result, mLength); + + // + double maxAvailableVolume = SymbolInfoDouble(symbol, SYMBOL_VOLUME_MAX); + double minAvailableVolume = SymbolInfoDouble(symbol, SYMBOL_VOLUME_MIN); + + // + // Validate Result ... + if (result > maxAvailableVolume) + { + result = maxAvailableVolume; + } + else if (result < minAvailableVolume) + { + result = minAvailableVolume; + } + + // + return result; +} + +// +// Normallize Price ... +double NormalizePrice( + double price, // desired Price for normalization + string symbol = NULL // Specified Symbol for Normalization +) +{ + // + double result = 0; + + // + // Mormalize Symbol ... + if (StringLen(symbol) == 0) + { + symbol = _Symbol; + } + + // + int digits = GetDigits(symbol); + result = NormalizeDouble(price, digits); + + // + return result; +} + +// +// Do All Normalization on Specific Signal ... +void NormalizeSignal(XSignal &signal) +{ + // + // ENTRY ... + if (signal.entry > 0) + { + signal.entry = NormalizePrice(signal.entry, signal.symbol); + } + + // + // TP ... + if (signal.tp > 0) + { + signal.tp = NormalizePrice(signal.tp, signal.symbol); + } + + // + // SL ... + if (signal.sl > 0) + { + signal.sl = NormalizePrice(signal.sl, signal.symbol); + } + + // + // VOLUME ... + if (signal.volume > 0) + { + signal.volume = NormalizeVolume(signal.volume, signal.symbol); + } +} + +// +// Check Expert Running in Testing Mode or not ... +bool IsRunningOnTestMode() +{ + // + bool result = false; + + // + // check programm mode ... + result = MQL5InfoInteger(MQL5_TESTING); + + // + return result; +} + +// +// Calculate Volume Weighted Moving Average ... +double iVWMA( + double price, + double volume, + int period, + int i, + int bars, + int instance = 0 // +) +{ +#define ¤ instance +#ifdef _averageInstances +#define _functionInstances _averageInstances +#else #define _functionInstances 1 +#endif + struct sVwmaArrayStruct + { + double price; + double volume; + double sump; + double sumv; + }; + static sVwmaArrayStruct m_array[][_functionInstances]; + static int m_arraySize = 0; + if (m_arraySize < bars) + { + int _res = ArrayResize(m_array, bars + 500); + if (_res <= bars) + return (0); + m_arraySize = _res; + } + + // + //--- + // + + if (volume == 0) + volume = 1; + m_array[i][¤].price = volume * price; + m_array[i][¤].volume = volume; + if (i > period) + { + m_array[i][¤].sump = m_array[i - 1][¤].sump + m_array[i][¤].price - m_array[i - period][¤].price; + m_array[i][¤].sumv = m_array[i - 1][¤].sumv + volume - m_array[i - period][¤].volume; + } + else + { + m_array[i][¤].sump = m_array[i][¤].price; + m_array[i][¤].sumv = m_array[i][¤].volume; + for (int k = 1; k < period && i >= k; k++) + { + m_array[i][¤].sump += m_array[i - k][¤].price; + m_array[i][¤].sumv += m_array[i - k][¤].volume; + } + } + return (m_array[i][¤].sump / m_array[i][¤].sumv); + + // + //--- + // + +#undef ¤ #undef _functionInstances +} + +// +// Date Time Manipulation Functions ... +// + +// +// Representation of Time Struct ... +// struct MqlDateTime +// { +// int year; // Year +// int mon; // Month +// int day; // Day +// int hour; // Hour +// int min; // Minutes +// int sec; // Seconds +// int day_of_week; // Day of week (0-Sunday, 1-Monday, ... ,6-Saturday) +// int day_of_year; // Day number of the year (January 1st is assigned the number value of zero) +// }; + +// +// Converts Time to Seconds ... +ulong TimeToSeconds( + datetime time // Specify time to Convert ... +) +{ + // + ulong result = (ulong)time; + + // + return result; +} +ulong TimeToSeconds( + MqlDateTime &time // Specify time to Convert ... +) +{ + // + datetime dTime = StructToTime(time); + + // + ulong result = TimeToSeconds(dTime); + + // + return result; +} + +// +// Converts Seconds To Time ... +datetime SecondsToTime( + ulong seconds // Specify Seconds to Convert ... +) +{ + // + datetime result = (datetime)seconds; + + // + return result; +} +MqlDateTime SecondsToStruct( + ulong seconds // Specify Seconds to Convert ... +) +{ + // + datetime dTime = SecondsToTime(seconds); + + // + MqlDateTime result = {}; + TimeToStruct( + dTime, + result); + + // + return result; +} + +// +// Converts Time to MilliSeconds ... +ulong TimeToMilliSeconds( + datetime time // Specify time to Convert ... +) +{ + // + ulong result = TimeToSeconds(time) * 1000; + + // + return result; +} +ulong TimeToMilliSeconds( + MqlDateTime &time // Specify time to Convert ... +) +{ + // + datetime dTime = StructToTime(time); + + // + ulong result = TimeToMilliSeconds(dTime); + + // + return result; +} + +// +// Converts MillisSeconds to Time ... +datetime MilliSecondsToTiem( + ulong milliSeconds // Specify MilliSeconds to Convert ... +) +{ + // + ulong seconds = milliSeconds / 1000; + + // + datetime result = SecondsToTime(seconds); + + // + return result; +} +MqlDateTime MilliSecondsToStruct( + ulong milliSeconds // Specify MilliSeconds to Convert ... +) +{ + // + datetime dTime = MilliSecondsToTiem(milliSeconds); + + // + MqlDateTime result = {}; + TimeToStruct( + dTime, + result); + + // + return result; +} + +// +// Retrieve DateTime Structure ... +MqlDateTime GetCurrentTime() +{ + // + MqlDateTime result = {}; + + // + TimeCurrent(result); + + // + return result; +} + +// +// Retrieve Current Time as Seconds ... +ulong GetCurrentTimeAsSeconds() +{ + // + datetime time = TimeCurrent(); + + // + ulong result = TimeToSeconds(time); + + // + return result; +} + +// +// Retrieve Current Time as MilliSeconds ... +ulong GetCurrentTimeAsMilliSeconds() +{ + // + datetime time = TimeCurrent(); + + // + ulong result = TimeToMilliSeconds(time); + + // + return result; +} + +// +// Retrieve Specified Candle Time ... +datetime GetCandleTime( + string symbol = "", // Specify Symbol + ENUM_TIMEFRAMES period = NULL, // Specify TimeFrame + int bar_index = 0 // Specify Bar Index +) +{ + // + // Validate and Normalize Args ... + + // + // Normalize Symbol ... + symbol = StringLen(symbol) == 0 + ? _Symbol + : symbol; + + // + // Normalize Period ... + period = period == NULL + ? _Period + : period; + + // + // Retrieve Bar Time ... + datetime result = iTime( + symbol, + period, + bar_index); + + // + return result; +} + +// +// Retrieve Specified Candle Time ... +ulong GetCandleTimeAsSeconds( + string symbol = "", // Specify Symbol + ENUM_TIMEFRAMES period = NULL, // Specify TimeFrame + int bar_index = 0 // Specify Bar Index +) +{ + // + // Retrieve Bar Time ... + datetime time = GetCandleTime( + symbol, + period, + bar_index); + + // + ulong result = TimeToSeconds(time); + + // + return result; +} + +// +// Retrieve Specified Candle Time ... +ulong GetCandleTimeAsMilliSeconds( + string symbol = "", // Specify Symbol + ENUM_TIMEFRAMES period = NULL, // Specify TimeFrame + int bar_index = 0 // Specify Bar Index +) +{ + // + // Retrieve Bar Time ... + datetime time = GetCandleTime( + symbol, + period, + bar_index); + + // + ulong result = TimeToMilliSeconds(time); + + // + return result; +} + +// +// Retrieve a Candle Time Structure ... +MqlDateTime GetCandleTimeStruct( + string symbol = "", // Specify Symbol + ENUM_TIMEFRAMES period = NULL, // Specify TimeFrame + int bar_index = 0 // Specify Bar Index +) +{ + // + MqlDateTime result = {}; + + // + // Retrieve Bar Time ... + datetime barTime = GetCandleTime( + symbol, + period, + bar_index); + + // + // Convert to Structure ... + TimeToStruct(barTime, result); + + // + return result; +} + +// +// Retrieve Number of Candles in a Day ... +int GetDailyCandleCount(ENUM_TIMEFRAMES mPeriod) +{ + // + int seconds = PeriodSeconds(mPeriod); + + // + int daySeconds = 24 * 60 * 60; + + // + int result = daySeconds / seconds; + + // + return result; +} + +int GetDailyCandleCount() +{ + // + int result = GetDailyCandleCount(_Period); + + // + return result; +} + +// +// +// + +// +// Holds Month ... +static int xMonth = -1; + +// +// Holds Day Of Week ... +static int xDayOfWeek = -1; +static int xForWeekDay = -1; + +// +// Holds Day ... +static int xDay = -1; + +// +// Holds Hour ... +static int xHour = -1; + +// +// Reset Timing Variables ... +void ResetTiming() +{ + // + xHour = -1; + xDay = -1; + xDayOfWeek = -1; + xMonth = -1; +} + +// +// Detecting New Houre ... +bool IsNewHour() +{ + // + bool result = false; + + // + // Retrieve Current Time as Struct ... + MqlDateTime timeStruct = GetCurrentTime(); + + // + // Check Houre ... + result = timeStruct.hour != xHour; + if (result) + { + xHour = timeStruct.hour; + } + + // + return result; +} + +// +// Detecting New Day ... +bool IsNewDay() +{ + // + bool result = false; + + // + // Retrieve Current Time as Struct ... + MqlDateTime timeStruct = GetCurrentTime(); + + // + // Check Houre ... + result = timeStruct.day_of_year != xDay; + if (result) + { + xDay = timeStruct.day_of_year; + } + + // + return result; +} + +// +// Detecting New Week ... +bool IsNewWeek() +{ + // + bool result = false; + + // + // Retrieve Current Time as Struct ... + MqlDateTime timeStruct = GetCurrentTime(); + + // + // Check Week ... + // Since Week Starts From Monday in Forex World ... + // we Calculate Start of Week by 1-Monday ... + result = + xDayOfWeek == -1 && + xForWeekDay == -1 + ? true + : timeStruct.day_of_week == 1 && + timeStruct.day_of_year > xForWeekDay; + + // + xForWeekDay = timeStruct.day_of_year; + xDayOfWeek = timeStruct.day_of_week; + + // + return result; +} + +// +// Detecting End Of Week ... +bool IsWeekEnd() +{ + // + bool result = false; + + // + // Retrieve Current Time as Struct ... + MqlDateTime timeStruct = GetCurrentTime(); + + // + // Check WeekEnd ... + // Since Week Starts From Monday in Forex World ... + // we Calculate End of Week by 5-Friday ... + result = + xDayOfWeek != -1 && + timeStruct.day_of_week == 5 && + timeStruct.hour == 23 && + timeStruct.min == 59 && + timeStruct.sec == 59; + + // + return result; +} + +// +// Detecting New Month ... +bool IsNewMonth() +{ + // + bool result = false; + + // + // Retrieve Current Time as Struct ... + MqlDateTime timeStruct = GetCurrentTime(); + + // + // Check Houre ... + result = timeStruct.mon != xMonth; + if (result) + { + xMonth = timeStruct.mon; + } + + // + return result; +} + +// +// Find Hindmost Time Frame ... +ENUM_TIMEFRAMES GetHindmostTimeFrame( + ENUM_TIMEFRAMES mPeriod // Specified Period +) +{ + // + ENUM_TIMEFRAMES result = NULL; + + // + // Normalize Period ... + if ( + mPeriod < 0 || + mPeriod == NULL) + { + mPeriod = _Period; + } + + // + switch (mPeriod) + { + // + case PERIOD_M1: + case PERIOD_M2: + case PERIOD_M3: + case PERIOD_M4: + case PERIOD_M5: + case PERIOD_M6: + case PERIOD_M10: + case PERIOD_M12: + case PERIOD_M15: + result = PERIOD_H12; + break; + + // + case PERIOD_M20: + case PERIOD_M30: + case PERIOD_H1: + case PERIOD_H2: + case PERIOD_H3: + case PERIOD_H4: + result = PERIOD_D1; + break; + + // + case PERIOD_H6: + case PERIOD_H8: + case PERIOD_H12: + case PERIOD_D1: + result = PERIOD_W1; + break; + + // + default: + result = PERIOD_MN1; + break; + } + + // + return result; +} + +// +// Find Farest Time Frame ... +ENUM_TIMEFRAMES GetFarestTimeFrame( + ENUM_TIMEFRAMES mPeriod // Specified Period +) +{ + // + ENUM_TIMEFRAMES result = NULL; + + // + // Normalize Period ... + if ( + mPeriod < 0 || + mPeriod == NULL) + { + mPeriod = _Period; + } + + // + switch (mPeriod) + { + // + case PERIOD_M1: + case PERIOD_M2: + case PERIOD_M3: + case PERIOD_M4: + case PERIOD_M5: + case PERIOD_M6: + case PERIOD_M10: + case PERIOD_M12: + case PERIOD_M15: + case PERIOD_M20: + case PERIOD_M30: + result = PERIOD_H4; + break; + + // + case PERIOD_H1: + case PERIOD_H2: + case PERIOD_H3: + case PERIOD_H4: + result = PERIOD_H12; + break; + + // + case PERIOD_H6: + case PERIOD_H8: + case PERIOD_H12: + case PERIOD_D1: + result = PERIOD_W1; + break; + + // + default: + result = PERIOD_MN1; + break; + } + + // + return result; +} + +// +// Find Medium Time Frame ... +ENUM_TIMEFRAMES GetMediestTimeFrame( + ENUM_TIMEFRAMES mPeriod // Specified Period +) +{ + // + ENUM_TIMEFRAMES result = NULL; + + // + // Normalize Period ... + if ( + mPeriod < 0 || + mPeriod == NULL) + { + mPeriod = _Period; + } + + // + switch (mPeriod) + { + // + case PERIOD_M1: + case PERIOD_M2: + case PERIOD_M3: + case PERIOD_M4: + case PERIOD_M5: + case PERIOD_M6: + case PERIOD_M10: + case PERIOD_M12: + case PERIOD_M15: + case PERIOD_M20: + result = PERIOD_H1; + break; + + // + case PERIOD_M30: + result = PERIOD_H2; + break; + + // + case PERIOD_H1: + case PERIOD_H2: + case PERIOD_H3: + result = PERIOD_H4; + break; + + // + case PERIOD_H4: + case PERIOD_H6: + case PERIOD_H8: + result = PERIOD_H12; + break; + + // + case PERIOD_H12: + result = PERIOD_D1; + break; + + // + case PERIOD_D1: + result = PERIOD_W1; + break; + + // + case PERIOD_W1: + result = PERIOD_MN1; + break; + + // + default: + result = PERIOD_MN1; + break; + } + + // + return result; +} + +// +// Find Nearest Time Frame ... +ENUM_TIMEFRAMES GetNearestTimeFrame( + ENUM_TIMEFRAMES mPeriod // Specified Period +) +{ + // + ENUM_TIMEFRAMES result = NULL; + + // + // Normalize Period ... + if ( + mPeriod < 0 || + mPeriod == NULL) + { + mPeriod = _Period; + } + + // + switch (mPeriod) + { + // + case PERIOD_M1: + case PERIOD_M2: + case PERIOD_M3: + case PERIOD_M4: + result = PERIOD_M5; + break; + + // + case PERIOD_M5: + case PERIOD_M6: + case PERIOD_M10: + case PERIOD_M12: + result = PERIOD_M15; + break; + + // + case PERIOD_M15: + case PERIOD_M20: + result = PERIOD_M30; + break; + + // + case PERIOD_M30: + result = PERIOD_H1; + break; + + // + case PERIOD_H1: + case PERIOD_H2: + case PERIOD_H3: + result = PERIOD_H4; + break; + + // + case PERIOD_H4: + case PERIOD_H6: + case PERIOD_H8: + result = PERIOD_H12; + break; + + // + case PERIOD_H12: + result = PERIOD_D1; + break; + + // + case PERIOD_D1: + result = PERIOD_W1; + break; + + // + case PERIOD_W1: + result = PERIOD_MN1; + break; + + // + default: + result = PERIOD_MN1; + break; + } + + // + return result; +} + +// +// Get Specific Time Frame Start Candle Time ... +datetime GetPeriodStartTime( + string mSymbol = NULL, // Specified Symbol ... + ENUM_TIMEFRAMES mPeriod = NULL, // Specified Period ... + datetime mTime = NULL // Specified Bar Time ... +) +{ + // + // Normalize Arg ... + + // + if ( + mSymbol == NULL || + StringLen(mSymbol) == 0) + { + mSymbol = _Symbol; + } + + // + if ( + mPeriod < 0 || + mPeriod == NULL) + { + mPeriod = _Period; + } + + // + if ( + mTime < 0 || + mTime == NULL) + { + mTime = TimeCurrent(); + } + + // + int barIndex = iBarShift( + mSymbol, + mPeriod, + mTime, + false); + + // + datetime result = iTime( + mSymbol, + mPeriod, + barIndex); + + // + return result; +} + +// +struct XCandleRemains +{ + // + int days; + int hours; + int minutes; + int seconds; +}; + +// +string ToString( + XCandleRemains &item, + string dayId = "d", + string hourId = "h", + string minuteId = "m", + string secondId = "s", + string idSeparator = ": ", + string separator = ", ", + bool ignoreZeroValues = true) +{ + // + string result = ""; + + // + // Days ... + if (!ignoreZeroValues || item.days > 0) + { + result += dayId + idSeparator + (string)item.days + separator; + } + + // + // Hours ... + if (!ignoreZeroValues || item.hours > 0) + { + // + string strHour = ToString(item.hours); + if (StringLen(strHour) == 1) { + strHour = "0" + strHour; + } + + // + result += hourId + idSeparator + strHour + separator; + } + + // + // Minutes ... + if (!ignoreZeroValues || item.minutes > 0) + { + // + string strMinute = ToString(item.minutes); + if (StringLen(strMinute) == 1) { + strMinute = "0" + strMinute; + } + + // + result += minuteId + idSeparator + strMinute + separator; + } + + // + // Seconds ... + if (!ignoreZeroValues || item.seconds > 0) + { + // + string strSec = ToString(item.seconds); + if (StringLen(strSec) == 1) { + strSec = "0" + strSec; + } + + // + result += secondId + idSeparator + strSec; + } + + // + return result; +} + +// +// Retrieve Specific Candles Ramained Time ... +void GetCandleRemainsTime( + XCandleRemains &result, // Holds Result ... + string mSymbol = NULL, // Specified Symbol ... + ENUM_TIMEFRAMES mPeriod = NULL, // Specified Period ... + int mBarIndex = 0 // Specified Bar Index ... +) +{ + // + int minuteSecoonds = 60; + int hourSeconds = minuteSecoonds * 60; + int daySeconds = 24 * hourSeconds; + + // + int periodSeconds = PeriodSeconds( + mPeriod); + datetime startTime = GetCandleTime( + mSymbol, + mPeriod, + mBarIndex); + + // + int secondsDiff = (int)startTime + periodSeconds - (int)TimeCurrent(); + + // + int days = 0; + int hours = 0; + int minutes = 0; + int seconds = 0; + + // + int mWorkingSecondsDiff = secondsDiff; + if (mWorkingSecondsDiff > daySeconds) + { + // + days = mWorkingSecondsDiff / daySeconds; + mWorkingSecondsDiff -= days * daySeconds; + } + if (mWorkingSecondsDiff > hourSeconds) + { + // + hours = mWorkingSecondsDiff / hourSeconds; + mWorkingSecondsDiff -= hours * hourSeconds; + } + if (mWorkingSecondsDiff > minuteSecoonds) + { + // + minutes = mWorkingSecondsDiff / minuteSecoonds; + mWorkingSecondsDiff -= minutes * minuteSecoonds; + } + seconds = mWorkingSecondsDiff; + + // + result.days = days; + result.hours = hours; + result.minutes = minutes; + result.seconds = seconds; +} + +// +// Converts an String to TimeFrame ... +ENUM_TIMEFRAMES ToPeriod(string value) +{ + // + if (StringLen(value) == 0) + { + return _Period; + } + + // + StringTrimLeft(value); + StringTrimRight(value); + + // + ENUM_TIMEFRAMES result = _Period; + + // + if (value == "M1") + { + result = PERIOD_M1; + } + else if (value == "M2") + { + result = PERIOD_M2; + } + else if (value == "M3") + { + result = PERIOD_M3; + } + else if (value == "M4") + { + result = PERIOD_M4; + } + else if (value == "M5") + { + result = PERIOD_M5; + } + else if (value == "M6") + { + result = PERIOD_M6; + } + else if (value == "M10") + { + result = PERIOD_M10; + } + else if (value == "M12") + { + result = PERIOD_M12; + } + else if (value == "M15") + { + result = PERIOD_M15; + } + else if (value == "M20") + { + result = PERIOD_M20; + } + else if (value == "M30") + { + result = PERIOD_M30; + } + else if (value == "H1") + { + result = PERIOD_H1; + } + else if (value == "H2") + { + result = PERIOD_H2; + } + else if (value == "H3") + { + result = PERIOD_H3; + } + else if (value == "H4") + { + result = PERIOD_H4; + } + else if (value == "H6") + { + result = PERIOD_H6; + } + else if (value == "H8") + { + result = PERIOD_H8; + } + else if (value == "H12") + { + result = PERIOD_H12; + } + else if (value == "D1") + { + result = PERIOD_D1; + } + else if (value == "W1") + { + result = PERIOD_W1; + } + else if (value == "MN1") + { + result = PERIOD_MN1; + } + + // + return result; +} + +// +// Converts Period to String ... +string ToString(ENUM_TIMEFRAMES period) +{ + // + string result = ""; + + // + string mPStr = EnumToString(period); + + string mPStrParts[]; + int partsCount = StringSplit( + mPStr, + StringGetCharacter("_", 0), + mPStrParts); + if (partsCount <= 0) + { + return result; + } + + // + result = mPStrParts[1]; + + // + return result; +} + +// +// END Provided Functions ... +// diff --git a/MQLTestWorkspace/X121/Old/Libraries/x-saherelm.draw.lib.ex5 b/MQLTestWorkspace/X121/Old/Libraries/x-saherelm.draw.lib.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..bb125724445935df7ed3cb7c09484a0759aaee67 GIT binary patch literal 6644 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 0; iObj--) + { + // + string on = ObjectName(chartId, iObj, subWindow); + if (StringFind(on, tag) >= 0) + { + ObjectDelete(chartId, on); + } + } + + // + // Redraw Chart ... + ChartRedraw(); +} + +// +bool RemoveDraw( + string name, + int chartId = -1, + int subWindow = -1) +{ + // + bool result = false; + + // + if (chartId == -1) + { + chartId = 0; + } + + // + if (subWindow == -1) + { + subWindow = 0; + } + + // + string objName = ""; + for (int iObj = ObjectsTotal(chartId, subWindow) - 1; iObj >= 0; iObj--) + { + // + string on = ObjectName(chartId, iObj, subWindow); + if (StringFind(on, name) >= 0) + { + // + objName = on; + break; + } + } + + // + if (StringLen(objName) > 0) + { + result = ObjectDelete(chartId, objName); + } + + // + return result; +} + +// +// Deselect All Draws ... +void DeselectAllDraws() +{ + // + int objs = ObjectsTotal(ChartID(), 0); + for (int o = 0; o < objs; o++) + { + ObjectSetInteger(ChartID(), ObjectName(ChartID(), o, 0), OBJPROP_SELECTED, false); + } + + // + ChartRedraw(); +} + +// +// Check Object Exists ... +bool IsDrawExists( + string name, + int chartId = -1, + int subWindow = -1) +{ + // + bool result = false; + + // + if (chartId == -1) + { + chartId = 0; + } + + // + if (subWindow == -1) + { + subWindow = 0; + } + + // + for (int iObj = ObjectsTotal(chartId, subWindow) - 1; iObj >= 0; iObj--) + { + // + string on = ObjectName(chartId, iObj, subWindow); + result = StringFind(on, name) >= 0; + if (result) + { + break; + } + } + + // + return result; +} +// +// END Provided Functions ... +// + +// +// START Regular Draws ... +// + +// +// START Arrow Functions ... +// +// +// Draw an Arrow Object on Chart ... +bool DrawArrow( + const long chartID = 0, // chart's ID + const string name = "Arrow", // arrow name + const int subWindow = 0, // subwindow index + datetime time = 0, // anchor point time + double price = 0, // anchor point price + const uchar arrowCode = 252, // arrow code + const ENUM_ARROW_ANCHOR anchor = ANCHOR_BOTTOM, // anchor point position + const color clr = clrAqua, // arrow color + const ENUM_LINE_STYLE style = STYLE_SOLID, // border line style + const int width = 3, // arrow size + const bool back = false, // in the background + const bool selection = false, // highlight to move + const bool hidden = false, // hidden in the object list + const long zOrder = 0 // Order Object ... +) +{ + // + // set anchor point coordinates if they are not set ... + ChangeArrowEmptyPoint(time, price); + + // + // reset the error value ... + ResetLastError(); + + // + // Normalize Name ... + string objName = drawPrefix + "_" + name; + + // + // create an arrow ... + if (!ObjectCreate(chartID, objName, OBJ_ARROW, subWindow, time, price)) + { + // + string message = + __FUNCTION__ + + ": failed to create an arrow! Error code = " + + (string)GetLastError(); + + // + LogMessage(message); + + // + return false; + } + + // + // set the arrow code ... + ObjectSetInteger(chartID, objName, OBJPROP_ARROWCODE, arrowCode); + + // + // set anchor type ... + ObjectSetInteger(chartID, objName, OBJPROP_ANCHOR, anchor); + + // + // set the arrow color ... + ObjectSetInteger(chartID, objName, OBJPROP_COLOR, clr); + + // + // set the border line style ... + ObjectSetInteger(chartID, objName, OBJPROP_STYLE, style); + + // + // set the arrow's size ... + ObjectSetInteger(chartID, objName, OBJPROP_WIDTH, width); + + // + // display in the foreground false or background true ... + ObjectSetInteger(chartID, objName, OBJPROP_BACK, back); + + // + // enable true or disable false the mode of moving the arrow by mouse + // when creating a graphical object using ObjectCreate function, the object cannot be + // highlighted and moved by default. Inside this method, selection parameter + // is false by default, if you want making it possible to highlight and move the object + // change it to true ... + ObjectSetInteger(chartID, objName, OBJPROP_SELECTABLE, true); + ObjectSetInteger(chartID, objName, OBJPROP_SELECTED, selection); + + // + // hide true or display false graphical object name in the object list ... + ObjectSetInteger(chartID, objName, OBJPROP_HIDDEN, hidden); + + // + // set the priority for receiving the event of a mouse click in the chart ... + ObjectSetInteger(chartID, objName, OBJPROP_ZORDER, zOrder); + + // + // successful execution ... + return true; +} + +// +// Move the anchor point of Arrow ... +bool MoveArrow( + const long chartID = 0, // chart's ID + const string name = "Arrow", // object name + datetime time = 0, // anchor point time coordinate + double price = 0 // anchor point price coordinate +) +{ + // + // if point position is not set, move it to the current bar having Bid price ... + if (!time) + { + time = TimeCurrent(); + } + + // + if (!price) + { + price = SymbolInfoDouble(_Symbol, SYMBOL_BID); + } + + // + // reset the error value + ResetLastError(); + + // + // move the anchor point ... + if (!ObjectMove(chartID, name, 0, time, price)) + { + // + string message = + __FUNCTION__ + + ": failed to move the anchor point! Error code = " + + (string)GetLastError(); + + // + LogMessage(message); + + // + return false; + } + + // + // successful execution ... + return true; +} + +// +// Delete an arrow ... +bool DeleteArrow( + const long chartID = 0, // chart's ID + const string name = "Arrow" // arrow name +) +{ + // + // reset the error value ... + ResetLastError(); + + // + // delete an arrow ... + if (!ObjectDelete(chartID, name)) + { + // + string message = + __FUNCTION__ + + ": failed to delete an arrow! Error code = " + + (string)GetLastError(); + + // + LogMessage(message); + + // + return false; + } + + // + // successful execution ... + return true; +} + +// +// Change the arrow code ... +bool ArrowCodeChange( + const long chartID = 0, // chart's ID + const string name = "Arrow", // object name + const uchar code = 252 // arrow code +) +{ + // + // reset the error value ... + ResetLastError(); + + // + // change the arrow code ... + if (!ObjectSetInteger(chartID, name, OBJPROP_ARROWCODE, code)) + { + // + string message = + __FUNCTION__ + + ": failed to change the arrow code! Error code = " + + (string)GetLastError(); + + // + LogMessage(message); + + // + return false; + } + + // + // successful execution ... + return true; +} + +// +// Change anchor type ... +bool ArrowAnchorChange( + const long chartID = 0, // chart's ID + const string name = "Arrow", // object name + const ENUM_ARROW_ANCHOR anchor = ANCHOR_TOP // anchor type +) +{ + // + // reset the error value ... + ResetLastError(); + + // + // change anchor type ... + if (!ObjectSetInteger(chartID, name, OBJPROP_ANCHOR, anchor)) + { + // + string message = + __FUNCTION__ + + ": failed to change anchor type! Error code = " + + (string)GetLastError(); + + // + LogMessage(message); + + // + return false; + } + + // + // successful execution ... + return true; +} + +// +// Check anchor point values and set default values +// for empty ones ... +void ChangeArrowEmptyPoint( + datetime &time, + double &price) +{ + // + // if the point's time is not set, it will be on the current bar ... + if (!time) + { + time = TimeCurrent(); + } + + // + // if the point's price is not set, it will have Bid value ... + if (!price) + { + price = SymbolInfoDouble(_Symbol, SYMBOL_BID); + } +} +// +// END Arrow Functions ... +// + +// +// START Horizontal Line Functions ... +// +// +// Create, Draw the horizontal line ... +bool DrawHorizontalLine( + const long chartID = 0, // chart's ID + const string name = "HLine", // line name + const int subWindow = 0, // subwindow index + double price = 0, // line price + const color clr = clrRed, // line color + const ENUM_LINE_STYLE style = STYLE_SOLID, // line style + const int width = 1, // line width + const bool back = false, // in the background + const bool selection = false, // highlight to move + const bool hidden = false, // hidden in the object list + const long zOrder = 0 // priority for mouse click +) +{ + // + // if the price is not set, set it at the current Bid price level ... + if (!price) + { + price = SymbolInfoDouble(Symbol(), SYMBOL_BID); + } + + // + // reset the error value ... + ResetLastError(); + + // + // Normalize Name ... + string objName = drawPrefix + "_" + name; + + // + // create a horizontal line ... + if (!ObjectCreate(chartID, objName, OBJ_HLINE, subWindow, 0, price)) + { + // + string message = + __FUNCTION__ + + ": failed to create a horizontal line! Error code = " + + (string)GetLastError(); + + // + LogMessage(message); + + // + return false; + } + + // + // set line color ... + ObjectSetInteger(chartID, objName, OBJPROP_COLOR, clr); + + // + // set line display style ... + ObjectSetInteger(chartID, objName, OBJPROP_STYLE, style); + + // + // set line width ... + ObjectSetInteger(chartID, objName, OBJPROP_WIDTH, width); + + // + // display in the foreground false or background true ... + ObjectSetInteger(chartID, objName, OBJPROP_BACK, back); + + // + // enable true or disable false the mode of moving the line by mouse + // when creating a graphical object using ObjectCreate function, the object cannot be + // highlighted and moved by default. Inside this method, selection parameter + // is true by default making it possible to highlight and move the object + ObjectSetInteger(chartID, objName, OBJPROP_SELECTABLE, selection); + ObjectSetInteger(chartID, objName, OBJPROP_SELECTED, selection); + + // + // hide true or display false graphical object name in the object list ... + ObjectSetInteger(chartID, objName, OBJPROP_HIDDEN, hidden); + + // + // set the priority for receiving the event of a mouse click in the chart ... + ObjectSetInteger(chartID, objName, OBJPROP_ZORDER, zOrder); + + // + // successful execution ... + return true; +} + +// +// Move horizontal line ... +bool MoveHorizontalLine( + const long chartID = 0, // chart's ID + const string name = "HLine", // line name + double price = 0 // line price +) +{ + // + // if the line price is not set, move it to the current Bid price level ... + if (!price) + { + price = SymbolInfoDouble(Symbol(), SYMBOL_BID); + } + + // + // reset the error value ... + ResetLastError(); + + // + // move a horizontal line ... + if (!ObjectMove(chartID, name, 0, 0, price)) + { + // + string message = + __FUNCTION__ + + ": failed to move the horizontal line! Error code = " + + (string)GetLastError(); + + // + LogMessage(message); + + // + return false; + } + + // + // successful execution ... + return true; +} + +// +// Delete a horizontal line ... +bool DeleteHorizontalLine( + const long chartID = 0, // chart's ID + const string name = "HLine" // line name +) +{ + // + // reset the error value ... + ResetLastError(); + + // + // delete a horizontal line ... + if (!ObjectDelete(chartID, name)) + { + // + string message = + __FUNCTION__ + + ": failed to delete a horizontal line! Error code = " + + (string)GetLastError(); + + // + LogMessage(message); + + // + return false; + } + + // + // successful execution ... + return true; +} +// +// END Horizontal Line Functions ... +// + +// +// START Vertical Line Functions ... +// +// +// Create the vertical line ... +bool DrawVerticalLine( + const long chartID = 0, // chart's ID + const string name = "VLine", // line name + const int subWindow = 0, // subwindow index + datetime time = 0, // line time + const color clr = clrRed, // line color + const ENUM_LINE_STYLE style = STYLE_SOLID, // line style + const int width = 1, // line width + const bool back = false, // in the background + const bool selection = false, // highlight to move + const bool hidden = false, // hidden in the object list + const long zOrder = 0 // priority for mouse click +) +{ + // + // if the line time is not set, draw it via the last bar ... + if (!time) + { + time = TimeCurrent(); + } + + // + // reset the error value + ResetLastError(); + + // + // Normalize Name ... + string objName = drawPrefix + "_" + name; + + // + // create a vertical line ... + if (!ObjectCreate(chartID, objName, OBJ_VLINE, subWindow, time, 0)) + { + // + string message = + __FUNCTION__ + + ": failed to create a vertical line! Error code = " + + (string)GetLastError(); + + // + LogMessage(message); + + // + return false; + } + + // + // set line color ... + ObjectSetInteger(chartID, objName, OBJPROP_COLOR, clr); + + // + // set line display style ... + ObjectSetInteger(chartID, objName, OBJPROP_STYLE, style); + + // + // set line width ... + ObjectSetInteger(chartID, objName, OBJPROP_WIDTH, width); + + // + // display in the foreground false or background true ... + ObjectSetInteger(chartID, objName, OBJPROP_BACK, back); + + // + // enable true or disable false the mode of moving the line by mouse + // when creating a graphical object using ObjectCreate function, the object cannot be + // highlighted and moved by default. Inside this method, selection parameter + // is true by default making it possible to highlight and move the object ... + ObjectSetInteger(chartID, objName, OBJPROP_SELECTABLE, true); + ObjectSetInteger(chartID, objName, OBJPROP_SELECTED, selection); + + // + // hide true or display false graphical object name in the object list ... + ObjectSetInteger(chartID, objName, OBJPROP_HIDDEN, hidden); + + // + // set the priority for receiving the event of a mouse click in the chart + ObjectSetInteger(chartID, objName, OBJPROP_ZORDER, zOrder); + + // + // successful execution ... + return true; +} + +// +// Move the vertical line ... +bool MoveVerticalLine( + const long chartID = 0, // chart's ID + const string name = "VLine", // line name + datetime time = 0 // line time +) +{ + // + // if line time is not set, move the line to the last bar ... + if (!time) + { + time = TimeCurrent(); + } + + // + // reset the error value ... + ResetLastError(); + + // + // move the vertical line ... + if (!ObjectMove(chartID, name, 0, time, 0)) + { + // + string message = + __FUNCTION__ + + ": failed to move the vertical line! Error code = " + + (string)GetLastError(); + + // + LogMessage(message); + + // + return false; + } + + // + // successful execution ... + return true; +} + +// +// Delete the vertical line ... +bool DeleteVerticalLine( + const long chartID = 0, // chart's ID + const string name = "VLine" // line name +) +{ + // + // reset the error value ... + ResetLastError(); + + // + // delete the vertical line ... + if (!ObjectDelete(chartID, name)) + { + // + string message = + __FUNCTION__ + + ": failed to delete the vertical line! Error code = " + + (string)GetLastError(); + + // + LogMessage(message); + + // + return false; + } + + // + // successful execution ... + return true; +} +// +// END Vertical Line Functions ... +// + +// +// START RectangleLabel Functions ... +// +// +// Create Rectangle Label Object ... +bool DrawRectangleLabel( + const long chartID = 0, // chart's ID + const string name = "RectLabel", // label name + const int subWindow = 0, // subwindow index + const int x = 0, // X coordinate + const int y = 0, // Y coordinate + const int width = 50, // width + const int height = 18, // height + const color bgColor = clrWhiteSmoke, // background color + const ENUM_BORDER_TYPE border = BORDER_SUNKEN, // border type + const ENUM_BASE_CORNER corner = CORNER_LEFT_UPPER, // chart corner for anchoring + const color clr = clrRed, // flat border color (Flat) + const ENUM_LINE_STYLE style = STYLE_SOLID, // flat border style + const int lineWidth = 1, // flat border width + const bool back = false, // in the background + const bool selection = false, // highlight to move + const bool hidden = false, // hidden in the object list + const long zOrder = 0 // priority for mouse click +) +{ + // + // reset the error value ... + ResetLastError(); + + // + // Normalize Name ... + string objName = drawPrefix + "_" + name; + + // + // + // create a rectangle label + if (!ObjectCreate(chartID, objName, OBJ_RECTANGLE_LABEL, subWindow, 0, 0)) + { + // + string message = + __FUNCTION__ + + ": failed to create a rectangle label! Error code = " + + (string)GetLastError(); + + // + LogMessage(message); + + // + return false; + } + + // + // set label coordinates ... + ObjectSetInteger(chartID, objName, OBJPROP_XDISTANCE, x); + ObjectSetInteger(chartID, objName, OBJPROP_YDISTANCE, y); + + // + // set label size ... + ObjectSetInteger(chartID, objName, OBJPROP_XSIZE, width); + ObjectSetInteger(chartID, objName, OBJPROP_YSIZE, height); + + // + // set background color ... + ObjectSetInteger(chartID, objName, OBJPROP_BGCOLOR, bgColor); + + // + // set border type ... + ObjectSetInteger(chartID, objName, OBJPROP_BORDER_TYPE, border); + + // + // set the chart's corner, relative to which point coordinates are defined ... + ObjectSetInteger(chartID, objName, OBJPROP_CORNER, corner); + + // + // set flat border color (in Flat mode) ... + ObjectSetInteger(chartID, objName, OBJPROP_COLOR, clr); + + // + // set flat border line style ... + ObjectSetInteger(chartID, objName, OBJPROP_STYLE, style); + + // + // set flat border width ... + ObjectSetInteger(chartID, objName, OBJPROP_WIDTH, lineWidth); + + // + // display in the foreground false or background true ... + ObjectSetInteger(chartID, objName, OBJPROP_BACK, back); + + // + // enable true or disable false the mode of moving the label by mouse ... + ObjectSetInteger(chartID, objName, OBJPROP_SELECTABLE, selection); + ObjectSetInteger(chartID, objName, OBJPROP_SELECTED, selection); + + // + // hide true or display false graphical object name in the object list ... + ObjectSetInteger(chartID, objName, OBJPROP_HIDDEN, hidden); + + // + // set the priority for receiving the event of a mouse click in the chart ... + ObjectSetInteger(chartID, objName, OBJPROP_ZORDER, zOrder); + + // + // successful execution ... + return true; +} + +// +// Move Rectangle Label .. +bool MoveRectangleLabel( + const long chartID = 0, // chart's ID + const string name = "RectLabel", // label name + const int x = 0, // X coordinate + const int y = 0 // Y coordinate +) +{ + // + // reset the error value ... + ResetLastError(); + + // + // move the rectangle label ... + if (!ObjectSetInteger(chartID, name, OBJPROP_XDISTANCE, x)) + { + // + string message = + __FUNCTION__ + + ": failed to move X coordinate of the label! Error code = " + + (string)GetLastError(); + + // + LogMessage(message); + + // + return false; + } + + // + if (!ObjectSetInteger(chartID, name, OBJPROP_YDISTANCE, y)) + { + // + string message = + __FUNCTION__ + + ": failed to move Y coordinate of the label! Error code = " + + (string)GetLastError(); + + // + return false; + } + + // + // successful execution ... + return true; +} + +// +// Delete the rectangle label ... +bool DeleteRectangleLabel( + const long chartID = 0, // chart's ID + const string name = "RectLabel" // label name +) +{ + // + // reset the error value ... + ResetLastError(); + + // + // delete the label ... + if (!ObjectDelete(chartID, name)) + { + // + string message = + __FUNCTION__ + + ": failed to delete a rectangle label! Error code = " + + (string)GetLastError(); + + // + LogMessage(message); + + // + return false; + } + + // + // successful execution ... + return true; +} + +// +// Change Rectangle Label Size ... +bool ChangeSizeRectangleLabel( + const long chartID = 0, // chart's ID + const string name = "RectLabel", // label name + const int width = 50, // label width + const int height = 18 // label height +) +{ + // + // reset the error value ... + ResetLastError(); + + // + // change label size ... + if (!ObjectSetInteger(chartID, name, OBJPROP_XSIZE, width)) + { + // + string message = + __FUNCTION__ + + ": failed to change the label's width! Error code = " + + (string)GetLastError(); + + // + LogMessage(message); + + // + return false; + } + + // + if (!ObjectSetInteger(chartID, name, OBJPROP_YSIZE, height)) + { + // + string message = + __FUNCTION__ + + ": failed to change the label's height! Error code = " + + (string)GetLastError(); + + // + LogMessage(message); + + // + return false; + } + + // + // successful execution ... + return true; +} + +// +// Change rectangle label border type ... +bool RectLabelChangeBorderType( + const long chartID = 0, // chart's ID + const string name = "RectLabel", // label name + const ENUM_BORDER_TYPE border = BORDER_SUNKEN // border type +) +{ + // + // reset the error value ... + ResetLastError(); + + // + // change border type ... + if (!ObjectSetInteger(chartID, name, OBJPROP_BORDER_TYPE, border)) + { + // + string message = + __FUNCTION__ + + ": failed to change the border type! Error code = " + + (string)GetLastError(); + + // + LogMessage(message); + + // + return false; + } + + // + // successful execution ... + return true; +} +// +// END RectangleLabel Functions ... +// + +// +// START TrendLine Funcions ... +// +// Create a trend line by the given coordinates ... +bool DrawTrendLine( + const long chartID = 0, // chart's ID + const string name = "TrendLine", // line name + const int subWindow = 0, // subwindow index + datetime time1 = 0, // first point time + double price1 = 0, // first point price + datetime time2 = 0, // second point time + double price2 = 0, // second point price + const color clr = clrYellow, // line color + const ENUM_LINE_STYLE style = STYLE_SOLID, // line style + const int width = 1, // line width + const bool back = false, // in the background + const bool selection = false, // highlight to move + const bool rayRight = false, // line's continuation to the right + const bool hidden = false, // hidden in the object list + const long zOrder = 0 // priority for mouse click +) +{ + // + // set anchor points' coordinates if they are not set ... + ChangeTrendLineEmptyPoints( + time1, + price1, + time2, + price2); + + // + // reset the error value ... + ResetLastError(); + + // + // Normalize Name ... + string objName = drawPrefix + "_" + name; + + // + // create a trend line by the given coordinates ... + if (!ObjectCreate(chartID, objName, OBJ_TREND, subWindow, time1, price1, time2, price2)) + { + // + string message = + __FUNCTION__ + + ": failed to create a trend line! Error code = " + + (string)GetLastError(); + + // + LogMessage(message); + + // + return false; + } + + // + // set line color ... + ObjectSetInteger(chartID, objName, OBJPROP_COLOR, clr); + + // + // set line display style ... + ObjectSetInteger(chartID, objName, OBJPROP_STYLE, style); + + // + // set line width ... + ObjectSetInteger(chartID, objName, OBJPROP_WIDTH, width); + + // + // display in the foreground false or background true ... + ObjectSetInteger(chartID, objName, OBJPROP_BACK, back); + + // + // enable true or disable false the mode of moving the line by mouse + // when creating a graphical object using ObjectCreate function, the object cannot be + // highlighted and moved by default. Inside this method, selection parameter + // is true by default making it possible to highlight and move the object ... + ObjectSetInteger(chartID, objName, OBJPROP_SELECTABLE, true); + ObjectSetInteger(chartID, objName, OBJPROP_SELECTED, selection); + + // + // enable true or disable false the mode of continuation of the line's display to the right ... + ObjectSetInteger(chartID, objName, OBJPROP_RAY_RIGHT, rayRight); + + // + // hide true or display false graphical object name in the object list ... + ObjectSetInteger(chartID, objName, OBJPROP_HIDDEN, hidden); + + // + // set the priority for receiving the event of a mouse click in the chart ... + ObjectSetInteger(chartID, objName, OBJPROP_ZORDER, zOrder); + + // + // successful execution ... + return true; +} + +// +// Move trend line anchor point ... | +bool ChangeTrendLinePoint( + const long chartID = 0, // chart's ID + const string name = "TrendLine", // line name + const int pointindex = 0, // anchor point index + datetime time = 0, // anchor point time coordinate + double price = 0 // anchor point price coordinate +) +{ + // + // if point position is not set, move it to the current bar having Bid price ... + if (!time) + { + time = TimeCurrent(); + } + + // + if (!price) + { + price = SymbolInfoDouble(Symbol(), SYMBOL_BID); + } + + // + // reset the error value ... + ResetLastError(); + + // + // move trend line's anchor point ... + if (!ObjectMove(chartID, name, pointindex, time, price)) + { + // + string message = + __FUNCTION__ + + ": failed to move the anchor point! Error code = " + + (string)GetLastError(); + + // + LogMessage(message); + + // + return false; + } + + // + // successful execution ... + return true; +} + +// +// The function deletes the trend line from the chart ... +bool DeleteTrendLine( + const long chartID = 0, // chart's ID + const string name = "TrendLine" // line name +) +{ + // + // reset the error value ... + ResetLastError(); + + // + // delete a trend line ... + if (!ObjectDelete(chartID, name)) + { + // + string message = + __FUNCTION__ + + ": failed to delete a trend line! Error code = " + + (string)GetLastError(); + + // + LogMessage(message); + + // + return false; + } + + // + // successful execution ... + return true; +} + +// +// Check the values of trend line's anchor points and set default ... +// values for empty ones ... +void ChangeTrendLineEmptyPoints( + datetime &time1, + double &price1, + datetime &time2, + double &price2) +{ + // + // if the first point's time is not set, it will be on the current bar ... + if (!time1) + { + time1 = TimeCurrent(); + } + + // + // if the first point's price is not set, it will have Bid value ... + if (!price1) + { + price1 = SymbolInfoDouble(Symbol(), SYMBOL_BID); + } + + // + // if the second point's time is not set, it is located 9 bars left from the second one ... + if (!time2) + { + // + // array for receiving the open time of the last 10 bars ... + datetime temp[10]; + CopyTime(Symbol(), Period(), time1, 10, temp); + + // + // set the second point 9 bars left from the first one ... + time2 = temp[0]; + } + + // + // if the second point's price is not set, it is equal to the first point's one ... + if (!price2) + { + price2 = price1; + } +} +// +// END TrendLine Functions ... +// + +// +// START Text Functions ... +// +// Create and Draw a Text Object ... +bool DrawText( + const long chartID = 0, // chart's ID + const string name = "Text", // object name + const int subWindow = 0, // subwindow index + datetime time = 0, // anchor point time + double price = 0, // anchor point price + const string text = "Text", // the text itself + const string font = "Arial", // font + const int fontSize = 10, // font size + const color clr = clrRed, // color + const double angle = 0.0, // text slope + const ENUM_ANCHOR_POINT anchor = ANCHOR_CENTER, // anchor type + const bool back = false, // in the background + const bool selection = false, // highlight to move + const bool hidden = true, // hidden in the object list + const long zOrder = 0 // priority for mouse click +) +{ + // + // set anchor point coordinates if they are not set ... + ChangeTextEmptyPoint(time, price); + + // + // reset the error value ... + ResetLastError(); + + // + // Normalize Name ... + string objName = drawPrefix + "_" + name; + + // + // + // create Text object + if (!ObjectCreate(chartID, objName, OBJ_TEXT, subWindow, time, price)) + { + // + string message = + __FUNCTION__ + + ": failed to create \"Text\" object! Error code = " + + (string)GetLastError(); + + // + LogMessage(message); + + // + return false; + } + + // + // set the text ... + ObjectSetString(chartID, objName, OBJPROP_TEXT, text); + + // + // set text font ... + ObjectSetString(chartID, objName, OBJPROP_FONT, font); + + // + // set font size ... + ObjectSetInteger(chartID, objName, OBJPROP_FONTSIZE, fontSize); + + // + // set the slope angle of the text ... + ObjectSetDouble(chartID, objName, OBJPROP_ANGLE, angle); + + // + // set anchor type ... + ObjectSetInteger(chartID, objName, OBJPROP_ANCHOR, anchor); + + // + // set color ... + ObjectSetInteger(chartID, objName, OBJPROP_COLOR, clr); + + // + // display in the foreground false or background true ... + ObjectSetInteger(chartID, objName, OBJPROP_BACK, back); + + // + // enable true or disable false the mode of moving the object by mouse ... + ObjectSetInteger(chartID, objName, OBJPROP_SELECTABLE, true); + ObjectSetInteger(chartID, objName, OBJPROP_SELECTED, selection); + + // + // hide true or display false graphical object name in the object list ... + ObjectSetInteger(chartID, objName, OBJPROP_HIDDEN, hidden); + + // + // set the priority for receiving the event of a mouse click in the chart ... + ObjectSetInteger(chartID, objName, OBJPROP_ZORDER, zOrder); + + // + // successful execution ... + return true; +} + +// +// Move the anchor point ... +bool MoveText( + const long chartID = 0, // chart's ID + const string name = "Text", // object name + datetime time = 0, // anchor point time coordinate + double price = 0 // anchor point price coordinate +) +{ + // + // + // if point position is not set, move it to the current bar having Bid price + if (!time) + { + time = TimeCurrent(); + } + + // + if (!price) + { + price = SymbolInfoDouble(_Symbol, SYMBOL_BID); + } + + // + // reset the error value ... + ResetLastError(); + + // + // move the anchor point .. + if (!ObjectMove(chartID, name, 0, time, price)) + { + // + string message = + __FUNCTION__ + + ": failed to move the anchor point! Error code = " + + (string)GetLastError(); + + // + LogMessage(message); + + // + return false; + } + + // + // successful execution ... + return true; +} + +// +// Change the object text ... +bool ChangeText( + const long chartID = 0, // chart's ID + const string name = "Text", // object name + const string text = "Text" // text +) +{ + // + // reset the error value ... + ResetLastError(); + + // + // change object text ... + if (!ObjectSetString(chartID, name, OBJPROP_TEXT, text)) + { + // + string message = + __FUNCTION__ + + ": failed to change the text! Error code = " + + (string)GetLastError(); + + // + LogMessage(message); + + // + return false; + } + + // + // successful execution ... + return true; +} + +// +// Delete Text object ... +bool DeleteText( + const long chartID = 0, // chart's ID + const string name = "Text" // object name +) +{ + // + // reset the error value ... + ResetLastError(); + + // + // delete the object ... + if (!ObjectDelete(chartID, name)) + { + // + string message = + __FUNCTION__ + + ": failed to delete \"Text\" object! Error code = " + + (string)GetLastError(); + + // + LogMessage(message); + + // + return false; + } + + // + // successful execution + return true; +} + +// +// Check anchor point values and set default values +// for empty ones ... +void ChangeTextEmptyPoint( + datetime &time, + double &price) +{ + // + // if the point's time is not set, it will be on the current bar ... + if (!time) + { + time = TimeCurrent(); + } + + // + // if the point's price is not set, it will have Bid value ... + if (!price) + { + price = SymbolInfoDouble(_Symbol, SYMBOL_BID); + } +} +// +// END Text Functions ... +// + +// +// START Fibonacchi Functions ... +// +// +// Create Fibonacci Retracement by the given coordinates ... +bool DrawFibonacci( + const long chartID = 0, // chart's ID + const string name = "Fibonacci", // object name + const int subWindow = 0, // subwindow index + datetime time1 = 0, // first point time + double price1 = 0, // first point price + datetime time2 = 0, // second point time + double price2 = 0, // second point price + const color clr = clrRed, // object color + const ENUM_LINE_STYLE style = STYLE_SOLID, // object line style + const int width = 1, // object line width + const bool back = false, // in the background + const bool selection = true, // highlight to move + const bool rayRight = false, // object's continuation to the right + const bool hidden = true, // hidden in the object list + const long zOrder = 0 // priority for mouse click +) +{ + // + // set anchor points' coordinates if they are not set ... + ChangeFibonacciEmptyPoints(time1, price1, time2, price2); + + // + // reset the error value ... + ResetLastError(); + + // + // Normalize Name ... + string objName = drawPrefix + "_" + name; + + // + // Create Fibonacci Retracement by the given coordinates ... + if (!ObjectCreate(chartID, objName, OBJ_FIBO, subWindow, time1, price1, time2, price2)) + { + // + string message = + __FUNCTION__ + + ": failed to create \"Fibonacci Retracement\"! Error code = " + + (string)GetLastError(); + + // + LogMessage(message); + + // + return false; + } + + // + // set color ... + ObjectSetInteger(chartID, objName, OBJPROP_COLOR, clr); + + // + // set line style ... + ObjectSetInteger(chartID, objName, OBJPROP_STYLE, style); + + // + // set line width ... + ObjectSetInteger(chartID, objName, OBJPROP_WIDTH, width); + + // + // display in the foreground false or background true ... + ObjectSetInteger(chartID, objName, OBJPROP_BACK, back); + + // + // enable true or disable false the mode of highlighting the channel for moving + // when creating a graphical object using ObjectCreate function, the object cannot be + // highlighted and moved by default. Inside this method, selection parameter + // is true by default making it possible to highlight and move the object ... + ObjectSetInteger(chartID, objName, OBJPROP_SELECTABLE, true); + ObjectSetInteger(chartID, objName, OBJPROP_SELECTED, selection); + + // + // enable true or disable false the mode of continuation of the object's display to the right ... + ObjectSetInteger(chartID, objName, OBJPROP_RAY_RIGHT, rayRight); + + // + // hide true or display false graphical object name in the object list ... + ObjectSetInteger(chartID, objName, OBJPROP_HIDDEN, hidden); + + // + // set the priority for receiving the event of a mouse click in the chart ... + ObjectSetInteger(chartID, objName, OBJPROP_ZORDER, zOrder); + + // + // successful execution ... + return true; +} + +// +// Create Fibonacci Retracement by the given coordinates ... +bool DrawCustomFibonacci( + // + int levels, // number of level lines + double &values[], // values of level lines + color &colors[], // color of level lines + ENUM_LINE_STYLE &styles[], // style of level lines + int &widths[], // width of level lines + string &descriptions[], // level Descriptions + // + const long chartID = 0, // chart's ID + const string name = "Fibonacci", // object name + const int subWindow = 0, // subwindow index + datetime time1 = 0, // first point time + double price1 = 0, // first point price + datetime time2 = 0, // second point time + double price2 = 0, // second point price + const color clr = clrAqua, // object color + const ENUM_LINE_STYLE style = STYLE_DOT, // object line style + const int width = 1, // object line width + const bool back = false, // in the background + const bool selection = true, // highlight to move + const bool rayRight = false, // object's continuation to the right + const bool hidden = true, // hidden in the object list + const long zOrder = 0 // priority for mouse click +) +{ + // + // set anchor points' coordinates if they are not set ... + ChangeFibonacciEmptyPoints(time1, price1, time2, price2); + + // + // reset the error value ... + ResetLastError(); + + // + // Normalize Name ... + string objName = drawPrefix + "_" + name; + + // + // Create Fibonacci Retracement by the given coordinates ... + if (!ObjectCreate(chartID, name, OBJ_FIBO, subWindow, time1, price1, time2, price2)) + { + // + string message = + __FUNCTION__ + + ": failed to create \"Fibonacci Retracement\"! Error code = " + + (string)GetLastError(); + + // + LogMessage(message); + + // + return false; + } + + // + // set color ... + ObjectSetInteger(chartID, objName, OBJPROP_COLOR, clr); + + // + // set line style ... + ObjectSetInteger(chartID, objName, OBJPROP_STYLE, style); + + // + // set line width ... + ObjectSetInteger(chartID, objName, OBJPROP_WIDTH, width); + + // + // display in the foreground false or background true ... + ObjectSetInteger(chartID, objName, OBJPROP_BACK, back); + + // + // enable true or disable false the mode of highlighting the channel for moving + // when creating a graphical object using ObjectCreate function, the object cannot be + // highlighted and moved by default. Inside this method, selection parameter + // is true by default making it possible to highlight and move the object ... + ObjectSetInteger(chartID, objName, OBJPROP_SELECTABLE, true); + ObjectSetInteger(chartID, objName, OBJPROP_SELECTED, selection); + + // + // enable true or disable false the mode of continuation of the object's display to the right ... + ObjectSetInteger(chartID, objName, OBJPROP_RAY_RIGHT, rayRight); + + // + // hide true or display false graphical object name in the object list ... + ObjectSetInteger(chartID, objName, OBJPROP_HIDDEN, hidden); + + // + // set the priority for receiving the event of a mouse click in the chart ... + ObjectSetInteger(chartID, objName, OBJPROP_ZORDER, zOrder); + + // + // Change Levels Of Fibonacci ... + bool result = FibonacciLevelsSet( + levels, + values, + colors, + styles, + widths, + descriptions, + chartID, + objName); + + // + // successful execution ... + return result; +} + +// +// Set number of levels and their parameters ... +bool FibonacciLevelsSet( + int levels, // number of level lines + double &values[], // values of level lines + color &colors[], // color of level lines + ENUM_LINE_STYLE &styles[], // style of level lines + int &widths[], // width of level lines + string &descriptions[], // level Descriptions + const long chartID = 0, // chart's ID + const string name = "Fibonacci" // object name +) +{ + // + // check array sizes ... + if ( + levels != ArraySize(colors) || + levels != ArraySize(styles) || + levels != ArraySize(widths) || + levels != ArraySize(widths)) + { + // + string message = + __FUNCTION__ + + ": array length does not correspond to the number of levels, error!"; + + // + LogMessage(message); + + // + return false; + } + + // + // set the number of levels ... + ObjectSetInteger(chartID, name, OBJPROP_LEVELS, levels); + + // + // set the properties of levels in the loop ... + for (int i = 0; i < levels; i++) + { + // + // level value ... + ObjectSetDouble(chartID, name, OBJPROP_LEVELVALUE, i, values[i]); + + // + // level color ... + ObjectSetInteger(chartID, name, OBJPROP_LEVELCOLOR, i, colors[i]); + + // + // level style ... + ObjectSetInteger(chartID, name, OBJPROP_LEVELSTYLE, i, styles[i]); + + // + // level width ... + ObjectSetInteger(chartID, name, OBJPROP_LEVELWIDTH, i, widths[i]); + + // + // level description ... + // ObjectSetString(chartID, name, OBJPROP_LEVELTEXT, i, DoubleToString(100 * values[i], 1)); + ObjectSetString(chartID, name, OBJPROP_LEVELTEXT, i, descriptions[i]); + } + + // + // successful execution ... + return true; +} + +// +// Move Fibonacci Retracement anchor point ... +bool FibonacciPointChange( + const long chartID = 0, // chart's ID + const string name = "Fibonacci", // object name + const int pointIndex = 0, // anchor point index + datetime time = 0, // anchor point time coordinate + double price = 0 // anchor point price coordinate +) +{ + // + // if point position is not set, move it to the current bar having Bid price ... + if (!time) + { + time = TimeCurrent(); + } + + // + if (!price) + { + price = SymbolInfoDouble(_Symbol, SYMBOL_BID); + } + + // + // reset the error value ... + ResetLastError(); + + // + // move the anchor point ... + if (!ObjectMove(chartID, name, pointIndex, time, price)) + { + // + string message = + __FUNCTION__ + + ": failed to move the anchor point! Error code = " + + (string)GetLastError(); + + // + LogMessage(message); + + // + return false; + } + + // + // successful execution ... + return true; +} + +// +// Delete Fibonacci Retracement ... +bool DeleteFibonachi( + const long chartID = 0, // chart's ID + const string name = "Fibonacci" // object name +) +{ + // + // reset the error value ... + ResetLastError(); + + // + // delete the object ... + if (!ObjectDelete(chartID, name)) + { + // + string message = + __FUNCTION__ + + ": failed to delete \"Fibonacci Retracement\"! Error code = " + + (string)GetLastError(); + + // + LogMessage(message); + + // + return false; + } + + // + // successful execution ... + return true; +} + +// +// Check the values of Fibonacci Retracement anchor points and set +// default values for empty ones ... +void ChangeFibonacciEmptyPoints( + datetime &time1, + double &price1, + datetime &time2, + double &price2) +{ + // + // if the second point's time is not set, it will be on the current bar ... + if (!time2) + { + time2 = TimeCurrent(); + } + + // + // if the second point's price is not set, it will have Bid value ... + if (!price2) + { + price2 = SymbolInfoDouble(_Symbol, SYMBOL_BID); + } + + // + // if the first point's time is not set, it is located 9 bars left from the second one ... + if (!time1) + { + // + // array for receiving the open time of the last 10 bars ... + datetime temp[10]; + CopyTime(Symbol(), Period(), time2, 10, temp); + + // + // set the first point 9 bars left from the second one ... + time1 = temp[0]; + } + + // + // if the first point's price is not set, move it 200 points below the second one ... + if (!price1) + { + price1 = price2 - 200 * SymbolInfoDouble(_Symbol, SYMBOL_POINT); + } +} +// +// END Fibonacci Functions ... +// + +// +// START Event Functions ... +// + +// +// Create an Event ... +bool EventCreate( + const long chartID = 0, // chart's ID + const string name = "Event", // object name + const int subWindow = 0, // subwindow index + const string text = "Content", // event text + datetime time = 0, // anchor point time + const color clr = clrRed, // color + const int width = 1, // point width when highlighted + const bool back = false, // in the background + const bool selection = false, // highlight to move + const bool hidden = true, // hidden in the object list + const long zOrder = 0 // priority for mouse click +) +{ + // + if (!time) + { + time = TimeCurrent(); + } + + // + ResetLastError(); + + // + if (!ObjectCreate(chartID, name, OBJ_EVENT, subWindow, time, 0)) + { + // + string message = + __FUNCTION__ + + ": failed to create \"Event\" object! Error code = " + + (string)GetLastError(); + + // + LogMessage(message); + + // + return false; + } + + // + // set event text + ObjectSetString(chartID, name, OBJPROP_TEXT, text); + + // + // set color + ObjectSetInteger(chartID, name, OBJPROP_COLOR, clr); + + // + // set anchor point width if the object is highlighted + ObjectSetInteger(chartID, name, OBJPROP_WIDTH, width); + + // + // display in the foreground false or background true + ObjectSetInteger(chartID, name, OBJPROP_BACK, back); + + // + // enable true or disable false the mode of moving event by mouse + ObjectSetInteger(chartID, name, OBJPROP_SELECTABLE, selection); + ObjectSetInteger(chartID, name, OBJPROP_SELECTED, selection); + + // + // hide true or display false graphical object name in the object list + ObjectSetInteger(chartID, name, OBJPROP_HIDDEN, hidden); + + // + // set the priority for receiving the event of a mouse click in the chart + ObjectSetInteger(chartID, name, OBJPROP_ZORDER, zOrder); + + // + // successful execution + return true; +} + +// +// Change Event object text +bool EventTextChange( + const long chartID = 0, // chart's ID + const string name = "Event", // event name + const string text = "Content" // text +) +{ + // + // reset the error value + ResetLastError(); + + // + // change object text + if (!ObjectSetString(chartID, name, OBJPROP_TEXT, text)) + { + // + string message = + __FUNCTION__ + + ": failed to change the text! Error code = " + + (string)GetLastError(); + + // + LogMessage(message); + + // + return false; + } + + // + // successful execution + return true; +} + +// +// Move Event object +bool EventMove( + const long chartID = 0, // chart's ID + const string name = "Event", // event name + datetime time = 0 // time +) +{ + // + // if time is not set, move event to the last bar + if (!time) + { + time = TimeCurrent(); + } + + // + // reset the error value + ResetLastError(); + + // + // move the object + if (!ObjectMove(chartID, name, 0, time, 0)) + { + // + string message = + __FUNCTION__ + + ": failed to move \"Event\" object! Error code = " + + (string)GetLastError(); + + // + LogMessage(message); + + // + return false; + } + + // + // successful execution + return true; +} + +// +// Delete Event object +bool EventDelete( + const long chartID = 0, // chart's ID + const string name = "Event" // event name +) +{ + // + // reset the error value + ResetLastError(); + + // + // delete the object + if (!ObjectDelete(chartID, name)) + { + // + string message = + __FUNCTION__ + + ": failed to delete \"Event\" object! Error code = " + + (string)GetLastError(); + + // + LogMessage(message); + + // + return false; + } + + // + // successful execution + return true; +} + +// +// END Event Functions ... +// + +// +// START Button Functions ... +// + +// +// Create the button ... +bool ButtonCreate( + const long chartID = 0, // chart's ID + const string name = "Button", // button name + const int subWindow = 0, // subwindow index + const int x = 0, // X coordinate + const int y = 0, // Y coordinate + const int width = 50, // button width + const int height = 15, // button height + const ENUM_BASE_CORNER corner = CORNER_LEFT_UPPER, // chart corner for anchoring + const string text = "Button", // text + const string font = "Arial", // font + const int fontSize = 8, // font size + const color clr = clrBlack, // text color + const color bgColor = clrLightGray, // background color + const color borderColor = clrNONE, // border color + const bool state = false, // pressed/released + const bool back = false, // in the background + const bool selection = false, // highlight to move + const bool hidden = true, // hidden in the object list + const long zOrder = 0 // priority for mouse click +) +{ + // + bool result = false; + + // + // create the button + result = ObjectCreate(chartID, name, OBJ_BUTTON, subWindow, 0, 0); + if (!result) + { + return result; + } + + // + // set button coordinates + ObjectSetInteger(chartID, name, OBJPROP_XDISTANCE, x); + ObjectSetInteger(chartID, name, OBJPROP_YDISTANCE, y); + + // + // set button size + ObjectSetInteger(chartID, name, OBJPROP_XSIZE, width); + ObjectSetInteger(chartID, name, OBJPROP_YSIZE, height); + + // + // set the chart's corner, relative to which point coordinates are defined + ObjectSetInteger(chartID, name, OBJPROP_CORNER, corner); + + // + // set the text + ObjectSetString(chartID, name, OBJPROP_TEXT, text); + + // + // set text font + ObjectSetString(chartID, name, OBJPROP_FONT, font); + + // + // set font size + ObjectSetInteger(chartID, name, OBJPROP_FONTSIZE, fontSize); + + // + // set text color + ObjectSetInteger(chartID, name, OBJPROP_COLOR, clr); + + // + // set background color + ObjectSetInteger(chartID, name, OBJPROP_BGCOLOR, bgColor); + + // + // set border color + ObjectSetInteger(chartID, name, OBJPROP_BORDER_COLOR, borderColor); + + // + // display in the foreground false or background true + ObjectSetInteger(chartID, name, OBJPROP_BACK, back); + + // + // set button state + ObjectSetInteger(chartID, name, OBJPROP_STATE, state); + + // + // enable true or disable false the mode of moving the button by mouse + ObjectSetInteger(chartID, name, OBJPROP_SELECTABLE, selection); + ObjectSetInteger(chartID, name, OBJPROP_SELECTED, selection); + + // + // hide true or display false graphical object name in the object list + ObjectSetInteger(chartID, name, OBJPROP_HIDDEN, hidden); + + // + // set the priority for receiving the event of a mouse click in the chart + ObjectSetInteger(chartID, name, OBJPROP_ZORDER, zOrder); + + // + return result; +} + +// +// Move the button ... +bool ButtonMove( + const long chartID = 0, // chart's ID + const string name = "Button", // button name + const int x = 0, // X coordinate + const int y = 0 // Y coordinate +) +{ + // + bool result = false; + + // + // move the button + + // + result = ObjectSetInteger(chartID, name, OBJPROP_XDISTANCE, x); + if (!result) + { + return result; + } + + // + result = ObjectSetInteger(chartID, name, OBJPROP_YDISTANCE, y); + + // + return result; +} + +// +// Change button size ... +bool ButtonChangeSize( + const long chartID = 0, // chart's ID + const string name = "Button", // button name + const int width = 50, // button width + const int height = 18 // button height +) +{ + // + bool result = false; + + // + // change the button size + + // + result = ObjectSetInteger(chartID, name, OBJPROP_XSIZE, width); + if (!result) + { + return result; + } + + // + result = ObjectSetInteger(chartID, name, OBJPROP_YSIZE, height); + + // + return result; +} + +// +// Change corner of the chart for binding the button ... +bool ButtonChangeCorner( + const long chartID = 0, // chart's ID + const string name = "Button", // button name + const ENUM_BASE_CORNER corner = CORNER_LEFT_UPPER // chart corner for anchoring +) +{ + // + bool result = false; + + // + // change anchor corner + + // + result = ObjectSetInteger(chartID, name, OBJPROP_CORNER, corner); + + // + return result; +} + +// +// Change button text ... +bool ButtonTextChange( + const long chartID = 0, // chart's ID + const string name = "Button", // button name + const string text = "Text" // text +) +{ + // + bool result = false; + + // + // change object text + result = ObjectSetString(chartID, name, OBJPROP_TEXT, text); + + // + return result; +} + +// +// Delete the button ... +bool ButtonDelete( + const long chartID = 0, // chart's ID + const string name = "Button" // button name +) +{ + // + bool result = false; + + // + // delete the button + result = ObjectDelete(chartID, name); + + // + return result; +} +// +// END Button Functions ... +// + +// +// END Regular Draws ... +// + +// +// START Chart Style Drawers ... +// +// +// Apply Styles On Chart ... +void ApplyChartStyle( + long mChartId = -1, // chart's ID + ENUM_CHART_MODE mMode = CHART_CANDLES, // chart's mMode + bool mShowBidLine = true, // show bid line + bool mShowAskLine = true, // show ask line + bool mShowGrid = false, // show grids on chart + bool mShowVolumes = false, // show volumes + bool mShowTradeLevels = true, // Displaying trade levels in the chart (levels of open positions, Stop Loss, Take Profit and pending orders) + bool mAutoScroll = true, // chart autoscroll + bool mQuickNavigation = true, // chart quick navigation state + color mForeGroundColor = clrWhite, // chart's foreground color + color mBackGroundColor = clrBlack, // chart's background color + color mUpColor = clrGreen, // Up Color + color mDownColor = clrRed, // Down Color + color mBullishColor = clrGreen, // Bullish color + color mBearishColor = clrRed, // Bearish color + color mGridColor = clrGray, // grid color + color mBidLineColor = clrGray, // bid line color + color mAskLineColor = clrRed, // ask line color + color mLineColor = clrLime, // line mMode and doji candlestick color + color mStopColor = clrGold, // Color of stop order levels (Stop Loss and Take Profit) + color mVolumesColor = clrGreen // volumes color +) +{ + // + // Validate Args ... + if (mChartId == -1) + { + mChartId = 0; + } + + // + ChartSetInteger(mChartId, CHART_MODE, mMode); + ChartSetInteger(mChartId, CHART_SHOW_BID_LINE, mShowBidLine); + ChartSetInteger(mChartId, CHART_SHOW_ASK_LINE, mShowAskLine); + ChartSetInteger(mChartId, CHART_SHOW_GRID, mShowGrid); + ChartSetInteger(mChartId, CHART_SHOW_VOLUMES, mShowVolumes); + ChartSetInteger(mChartId, CHART_SHOW_TRADE_LEVELS, mShowTradeLevels); + ChartSetInteger(mChartId, CHART_AUTOSCROLL, mAutoScroll); + ChartSetInteger(mChartId, CHART_QUICK_NAVIGATION, mQuickNavigation); + ChartSetInteger(mChartId, CHART_COLOR_FOREGROUND, mForeGroundColor); + ChartSetInteger(mChartId, CHART_COLOR_BACKGROUND, mBackGroundColor); + ChartSetInteger(mChartId, CHART_COLOR_CHART_UP, mUpColor); + ChartSetInteger(mChartId, CHART_COLOR_CHART_DOWN, mDownColor); + ChartSetInteger(mChartId, CHART_COLOR_CANDLE_BULL, mBullishColor); + ChartSetInteger(mChartId, CHART_COLOR_CANDLE_BEAR, mBearishColor); + ChartSetInteger(mChartId, CHART_COLOR_GRID, mGridColor); + ChartSetInteger(mChartId, CHART_COLOR_BID, mBidLineColor); + ChartSetInteger(mChartId, CHART_COLOR_ASK, mAskLineColor); + ChartSetInteger(mChartId, CHART_COLOR_STOP_LEVEL, mStopColor); + ChartSetInteger(mChartId, CHART_COLOR_CHART_LINE, mLineColor); + ChartSetInteger(mChartId, CHART_COLOR_VOLUME, mVolumesColor); +} + +// +// Retrieve Chart Size in Pixel ... +struct XSize +{ + long width; + long height; + + // + int x; + int y; + int w; + int h; + + // + int wStep; + int hStep; +}; + +// +// Retrieve Chart Size ... +bool GetChartSize( + XSize &result, // Holds Result ... + long chartID = 0 // Specified Chart ID ... +) +{ + // + bool mResult = false; + + // + mResult = ChartGetInteger(0, CHART_WIDTH_IN_PIXELS, 0, result.width); + if (!mResult) + { + return mResult; + } + + // + mResult = ChartGetInteger(0, CHART_HEIGHT_IN_PIXELS, 0, result.height); + + // + return mResult; +} + +// +// END Chart Style Drawers ... +// \ No newline at end of file diff --git a/MQLTestWorkspace/X121/Old/Libraries/x-saherelm.http.lib.ex5 b/MQLTestWorkspace/X121/Old/Libraries/x-saherelm.http.lib.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..8e36336c38397703fdec3090104bd3fba32f4376 GIT binary patch literal 3788 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 literal 0 HcmV?d00001 diff --git a/MQLTestWorkspace/X121/Old/Libraries/x-saherelm.log.lib.mq5 b/MQLTestWorkspace/X121/Old/Libraries/x-saherelm.log.lib.mq5 new file mode 100644 index 0000000..3e30eb9 --- /dev/null +++ b/MQLTestWorkspace/X121/Old/Libraries/x-saherelm.log.lib.mq5 @@ -0,0 +1,1088 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 Logger Library +// --------------------------------------- +// Name: XLogger +// Description: provides Logging abilities ... +// +// +// 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 + +// +// START Inputs ... +// +// input group "Logging"; +// input bool enableLogging = true; // Enable Logging +bool enableLogging = true; // Enable Logging +// +// END Inputs ... +// + +// +// Including Models ... +#include "x-saherelm.models.lib.mq5" + +// +// START Global Definitions: Variables, Properties and etc ... +// +string logTag = "X-Logger"; // LogTag +// +// END Global Definitions: Variables, Properties and etc ... +// + +// +// START Provided Functions ... +// +// +// Logging a Message ... +void LogMessage(string message) +{ + // + if (!enableLogging) + { + return; + } + + // + Print(logTag, " > ", message); +} +void LogMessage(string tag, string message) +{ + // + if (!enableLogging) + { + return; + } + + // + Print(tag, " > ", message); +} + +// +void LogEmptyLine() +{ + LogMessage(" "); +} + +// +void LogError( + int error = -1 // Specific Error +) { + // + if (error <= -1) { + error = GetLastError(); + } + + // + string errorMsg = GetErrorDescription(error); + + // + LogMessage("Error: " + errorMsg); +} + +// +// Logging an Array ... +void LogArray(int &array[]) +{ + // + if (!enableLogging) + { + return; + } + + // + Print(logTag, ">"); + ArrayPrint(array); +} +void LogArray(double &array[]) +{ + // + if (!enableLogging) + { + return; + } + + // + Print(logTag, ">"); + ArrayPrint(array); +} +void LogArray(string &array[]) +{ + // + if (!enableLogging) + { + return; + } + + // + Print(logTag, ">"); + ArrayPrint(array); +} +// +// END Provided Functions ... +// + + +// +// Error Descriptions Functions ... +// + +// +// Retrieve Specified Error Code Description ... +string GetErrorDescription(int err_code) +{ + // + string result = ""; + + // + switch (err_code) + { + // + //--- Constant Description + + // + case ERR_SUCCESS: + result = "The operation completed successfully"; + break; + + // + case ERR_INTERNAL_ERROR: + result = "Unexpected internal error"; + break; + + // + case ERR_WRONG_INTERNAL_PARAMETER: + result = "Wrong parameter in the inner call of the client terminal function"; + break; + + // + case ERR_INVALID_PARAMETER: + result = "Wrong parameter when calling the system function"; + break; + + // + case ERR_NOT_ENOUGH_MEMORY: + result = "Not enough memory to perform the system function"; + break; + + // + case ERR_STRUCT_WITHOBJECTS_ORCLASS: + result = "The structure contains objects of strings and/or dynamic arrays and/or structure of such objects and/or classes"; + break; + + // + case ERR_INVALID_ARRAY: + result = "Array of a wrong type, wrong size, or a damaged object of a dynamic array"; + break; + + // + case ERR_ARRAY_RESIZE_ERROR: + result = "Not enough memory for the relocation of an array, or an attempt to change the size of a static array"; + break; + + // + case ERR_STRING_RESIZE_ERROR: + result = "Not enough memory for the relocation of string"; + break; + + // + case ERR_NOTINITIALIZED_STRING: + result = "Not initialized string"; + break; + + // + case ERR_INVALID_DATETIME: + result = "Invalid date and/or time"; + break; + + // + case ERR_ARRAY_BAD_SIZE: + result = "Requested array size exceeds 2 GB"; + break; + + // + case ERR_INVALID_POINTER: + result = "Wrong pointer"; + break; + + // + case ERR_INVALID_POINTER_TYPE: + result = "Wrong type of pointer"; + break; + + // + case ERR_FUNCTION_NOT_ALLOWED: + result = "System function is not allowed to call"; + break; + + // + //--- Charts + + // + case ERR_CHART_WRONG_ID: + result = "Wrong chart ID"; + break; + + // + case ERR_CHART_NO_REPLY: + result = "Chart does not respond"; + break; + + // + case ERR_CHART_NOT_FOUND: + result = "Chart not found"; + break; + + // + case ERR_CHART_NO_EXPERT: + result = "No Expert Advisor in the chart that could handle the event"; + break; + + // + case ERR_CHART_CANNOT_OPEN: + result = "Chart opening error"; + break; + + // + case ERR_CHART_CANNOT_CHANGE: + result = "Failed to change chart symbol and period"; + break; + + // + case ERR_CHART_CANNOT_CREATE_TIMER: + result = "Failed to create timer"; + break; + + // + case ERR_CHART_WRONG_PROPERTY: + result = "Wrong chart property ID"; + break; + + // + case ERR_CHART_SCREENSHOT_FAILED: + result = "Error creating screenshots"; + break; + + // + case ERR_CHART_NAVIGATE_FAILED: + result = "Error navigating through chart"; + break; + + // + case ERR_CHART_TEMPLATE_FAILED: + result = "Error applying template"; + break; + + // + case ERR_CHART_WINDOW_NOT_FOUND: + result = "Subwindow containing the indicator was not found"; + break; + + // + case ERR_CHART_INDICATOR_CANNOT_ADD: + result = "Error adding an indicator to chart"; + break; + + // + case ERR_CHART_INDICATOR_CANNOT_DEL: + result = "Error deleting an indicator from the chart"; + break; + + // + case ERR_CHART_INDICATOR_NOT_FOUND: + result = "Indicator not found on the specified chart"; + break; + + // + //--- Graphical Objects + case ERR_OBJECT_ERROR: + result = "Error working with a graphical object"; + break; + + // + case ERR_OBJECT_NOT_FOUND: + result = "Graphical object was not found"; + break; + + // + case ERR_OBJECT_WRONG_PROPERTY: + result = "Wrong ID of a graphical object property"; + break; + + // + case ERR_OBJECT_GETDATE_FAILED: + result = "Unable to get date corresponding to the value"; + break; + + // + case ERR_OBJECT_GETVALUE_FAILED: + result = "Unable to get value corresponding to the date"; + break; + + // + //--- MarketInfo + + // + case ERR_MARKET_UNKNOWN_SYMBOL: + result = "Unknown symbol"; + break; + + // + case ERR_MARKET_NOT_SELECTED: + result = "Symbol is not selected in MarketWatch"; + break; + + // + case ERR_MARKET_WRONG_PROPERTY: + result = "Wrong identifier of a symbol property"; + break; + + // + case ERR_MARKET_LASTTIME_UNKNOWN: + result = "Time of the last tick is not known (no ticks)"; + break; + + // + case ERR_MARKET_SELECT_ERROR: + result = "Error adding or deleting a symbol in MarketWatch"; + break; + + // + //--- History Access + + // + case ERR_HISTORY_NOT_FOUND: + result = "Requested history not found"; + break; + + // + case ERR_HISTORY_WRONG_PROPERTY: + result = "Wrong ID of the history property"; + break; + + // + //--- Global_Variables + + // + case ERR_GLOBALVARIABLE_NOT_FOUND: + result = "Global variable of the client terminal is not found"; + break; + + // + case ERR_GLOBALVARIABLE_EXISTS: + result = "Global variable of the client terminal with the same name already exists"; + break; + + // + case ERR_MAIL_SEND_FAILED: + result = "Email sending failed"; + break; + + // + case ERR_PLAY_SOUND_FAILED: + result = "Sound playing failed"; + break; + + // + case ERR_MQL5_WRONG_PROPERTY: + result = "Wrong identifier of the program property"; + break; + + // + case ERR_TERMINAL_WRONG_PROPERTY: + result = "Wrong identifier of the terminal property"; + break; + + // + case ERR_FTP_SEND_FAILED: + result = "File sending via ftp failed"; + break; + + // + case ERR_NOTIFICATION_SEND_FAILED: + result = "Error in sending notification"; + break; + + // + //--- Custom Indicator Buffers + + // + case ERR_BUFFERS_NO_MEMORY: + result = "Not enough memory for the distribution of indicator buffers"; + break; + + // + case ERR_BUFFERS_WRONG_INDEX: + result = "Wrong indicator buffer index"; + break; + + // + //--- Custom Indicator Properties + + // + case ERR_CUSTOM_WRONG_PROPERTY: + result = "Wrong ID of the custom indicator property"; + break; + + // + //--- Account + + // + case ERR_ACCOUNT_WRONG_PROPERTY: + result = "Wrong account property ID"; + break; + + // + case ERR_TRADE_WRONG_PROPERTY: + result = "Wrong trade property ID"; + break; + + // + case ERR_TRADE_DISABLED: + result = "Trading by Expert Advisors prohibited"; + break; + + // + case ERR_TRADE_POSITION_NOT_FOUND: + result = "Position not found"; + break; + + // + case ERR_TRADE_ORDER_NOT_FOUND: + result = "Order not found"; + break; + + // + case ERR_TRADE_DEAL_NOT_FOUND: + result = "Deal not found"; + break; + + // + case ERR_TRADE_SEND_FAILED: + result = "Trade request sending failed"; + break; + + // + //--- Indicators + + // + case ERR_INDICATOR_UNKNOWN_SYMBOL: + result = "Unknown symbol"; + break; + + // + case ERR_INDICATOR_CANNOT_CREATE: + result = "Indicator cannot be created"; + break; + + // + case ERR_INDICATOR_NO_MEMORY: + result = "Not enough memory to add the indicator"; + break; + + // + case ERR_INDICATOR_CANNOT_APPLY: + result = "The indicator cannot be applied to another indicator"; + break; + + // + case ERR_INDICATOR_CANNOT_ADD: + result = "Error applying an indicator to chart"; + break; + + // + case ERR_INDICATOR_DATA_NOT_FOUND: + result = "Requested data not found"; + break; + + // + case ERR_INDICATOR_WRONG_HANDLE: + result = "Wrong indicator handle"; + break; + + // + case ERR_INDICATOR_WRONG_PARAMETERS: + result = "Wrong number of parameters when creating an indicator"; + break; + + // + case ERR_INDICATOR_PARAMETERS_MISSING: + result = "No parameters when creating an indicator"; + break; + + // + case ERR_INDICATOR_CUSTOM_NAME: + result = "The first parameter in the array must be the name of the custom indicator"; + break; + + // + case ERR_INDICATOR_PARAMETER_TYPE: + result = "Invalid parameter type in the array when creating an indicator"; + break; + + // + case ERR_INDICATOR_WRONG_INDEX: + result = "Wrong index of the requested indicator buffer"; + break; + + // + //--- Depth of Market + + // + case ERR_BOOKS_CANNOT_ADD: + result = "Depth Of Market can not be added"; + break; + + // + case ERR_BOOKS_CANNOT_DELETE: + result = "Depth Of Market can not be removed"; + break; + + // + case ERR_BOOKS_CANNOT_GET: + result = "The data from Depth Of Market can not be obtained"; + break; + + // + case ERR_BOOKS_CANNOT_SUBSCRIBE: + result = "Error in subscribing to receive new data from Depth Of Market"; + break; + + // + //--- File Operations + + // + case ERR_TOO_MANY_FILES: + result = "More than 64 files cannot be opened at the same time"; + break; + + // + case ERR_WRONG_FILENAME: + result = "Invalid file name"; + break; + + // + case ERR_TOO_LONG_FILENAME: + result = "Too long file name"; + break; + + // + case ERR_CANNOT_OPEN_FILE: + result = "File opening error"; + break; + + // + case ERR_FILE_CACHEBUFFER_ERROR: + result = "Not enough memory for cache to read"; + break; + + // + case ERR_CANNOT_DELETE_FILE: + result = "File deleting error"; + break; + + // + case ERR_INVALID_FILEHANDLE: + result = "A file with this handle was closed, or was not opening at all"; + break; + + // + case ERR_WRONG_FILEHANDLE: + result = "Wrong file handle"; + break; + + // + case ERR_FILE_NOTTOWRITE: + result = "The file must be opened for writing"; + break; + + // + case ERR_FILE_NOTTOREAD: + result = "The file must be opened for reading"; + break; + + // + case ERR_FILE_NOTBIN: + result = "The file must be opened as a binary one"; + break; + + // + case ERR_FILE_NOTTXT: + result = "The file must be opened as a text"; + break; + + // + case ERR_FILE_NOTTXTORCSV: + result = "The file must be opened as a text or CSV"; + break; + + // + case ERR_FILE_NOTCSV: + result = "The file must be opened as CSV"; + break; + + // + case ERR_FILE_READERROR: + result = "File reading error"; + break; + + // + case ERR_FILE_BINSTRINGSIZE: + result = "String size must be specified, because the file is opened as binary"; + break; + + // + case ERR_INCOMPATIBLE_FILE: + result = "A text file must be for string arrays, for other arrays - binary"; + break; + + // + case ERR_FILE_IS_DIRECTORY: + result = "This is not a file, this is a directory"; + break; + + // + case ERR_FILE_NOT_EXIST: + result = "File does not exist"; + break; + + // + case ERR_FILE_CANNOT_REWRITE: + result = "File can not be rewritten"; + break; + + // + case ERR_WRONG_DIRECTORYNAME: + result = "Wrong directory name"; + break; + + // + case ERR_DIRECTORY_NOT_EXIST: + result = "Directory does not exist"; + break; + + // + case ERR_FILE_ISNOT_DIRECTORY: + result = "This is a file, not a directory"; + break; + + // + case ERR_CANNOT_DELETE_DIRECTORY: + result = "The directory cannot be removed"; + break; + + // + case ERR_CANNOT_CLEAN_DIRECTORY: + result = "Failed to clear the directory (probably one or more files are blocked and removal operation failed)"; + break; + + // + case ERR_FILE_WRITEERROR: + result = "Failed to write a resource to a file"; + break; + + // + //--- String Casting + + // + case ERR_NO_STRING_DATE: + result = "No date in the string"; + break; + + // + case ERR_WRONG_STRING_DATE: + result = "Wrong date in the string"; + break; + + // + case ERR_WRONG_STRING_TIME: + result = "Wrong time in the string"; + break; + + // + case ERR_STRING_TIME_ERROR: + result = "Error converting string to date"; + break; + + // + case ERR_STRING_OUT_OF_MEMORY: + result = "Not enough memory for the string"; + break; + + // + case ERR_STRING_SMALL_LEN: + result = "The string length is less than expected"; + break; + + // + case ERR_STRING_TOO_BIGNUMBER: + result = "Too large number, more than ULONG_MAX"; + break; + + // + case ERR_WRONG_FORMATSTRING: + result = "Invalid format string"; + break; + + // + case ERR_TOO_MANY_FORMATTERS: + result = "Amount of format specifiers more than the parameters"; + break; + + // + case ERR_TOO_MANY_PARAMETERS: + result = "Amount of parameters more than the format specifiers"; + break; + + // + case ERR_WRONG_STRING_PARAMETER: + result = "Damaged parameter of string type"; + break; + + // + case ERR_STRINGPOS_OUTOFRANGE: + result = "Position outside the string"; + break; + + // + case ERR_STRING_ZEROADDED: + result = "0 added to the string end, a useless operation"; + break; + + // + case ERR_STRING_UNKNOWNTYPE: + result = "Unknown data type when converting to a string"; + break; + + // + case ERR_WRONG_STRING_OBJECT: + result = "Damaged string object"; + break; + + // + //--- Operations with Arrays + + // + case ERR_INCOMPATIBLE_ARRAYS: + result = "Copying incompatible arrays. String array can be copied only to a string array, and a numeric array - in numeric array only"; + break; + + // + case ERR_SMALL_ASSERIES_ARRAY: + result = "The receiving array is declared as AS_SERIES, and it is of insufficient size"; + break; + + // + case ERR_SMALL_ARRAY: + result = "Too small array, the starting position is outside the array"; + break; + + // + case ERR_ZEROSIZE_ARRAY: + result = "An array of zero length"; + break; + + // + case ERR_NUMBER_ARRAYS_ONLY: + result = "Must be a numeric array"; + break; + + // + case ERR_ONEDIM_ARRAYS_ONLY: + result = "Must be a one-dimensional array"; + break; + + // + case ERR_SERIES_ARRAY: + result = "Timeseries cannot be used"; + break; + + // + case ERR_DOUBLE_ARRAY_ONLY: + result = "Must be an array of type double"; + break; + + // + case ERR_FLOAT_ARRAY_ONLY: + result = "Must be an array of type float"; + break; + + // + case ERR_LONG_ARRAY_ONLY: + result = "Must be an array of type long"; + break; + + // + case ERR_INT_ARRAY_ONLY: + result = "Must be an array of type int"; + break; + + // + case ERR_SHORT_ARRAY_ONLY: + result = "Must be an array of type short"; + break; + + // + case ERR_CHAR_ARRAY_ONLY: + result = "Must be an array of type char"; + break; + + // + //--- Operations with OpenCL + + // + case ERR_OPENCL_NOT_SUPPORTED: + result = "OpenCL functions are not supported on this computer"; + break; + + // + case ERR_OPENCL_INTERNAL: + result = "Internal error occurred when running OpenCL"; + break; + + // + case ERR_OPENCL_INVALID_HANDLE: + result = "Invalid OpenCL handle"; + break; + + // + case ERR_OPENCL_CONTEXT_CREATE: + result = "Error creating the OpenCL context"; + break; + + // + case ERR_OPENCL_QUEUE_CREATE: + result = "Failed to create a run queue in OpenCL"; + break; + + // + case ERR_OPENCL_PROGRAM_CREATE: + result = "Error occurred when compiling an OpenCL program"; + break; + + // + case ERR_OPENCL_TOO_LONG_KERNEL_NAME: + result = "Too long kernel name (OpenCL kernel)"; + break; + + // + case ERR_OPENCL_KERNEL_CREATE: + result = "Error creating an OpenCL kernel"; + break; + + // + case ERR_OPENCL_SET_KERNEL_PARAMETER: + result = "Error occurred when setting parameters for the OpenCL kernel"; + break; + + // + case ERR_OPENCL_EXECUTE: + result = "OpenCL program runtime error"; + break; + + // + case ERR_OPENCL_WRONG_BUFFER_SIZE: + result = "Invalid size of the OpenCL buffer"; + break; + + // + case ERR_OPENCL_WRONG_BUFFER_OFFSET: + result = "Invalid offset in the OpenCL buffer"; + break; + + // + case ERR_OPENCL_BUFFER_CREATE: + result = "Failed to create and OpenCL buffer"; + break; + + // + //--- User-Defined Errors + default: + result = "UNKNOWN Erro ..."; + break; + } + + // + return result; +} + +// +// Retrieve Specified Error Code Description ... +string GetTradeServerReturnCodeDescription(int return_code) +{ + // + string result = ""; + + // + switch (return_code) + { + // + case TRADE_RETCODE_REQUOTE: + result = "Requote"; + break; + + // + case TRADE_RETCODE_REJECT: + result = "Request rejected"; + break; + + // + case TRADE_RETCODE_CANCEL: + result = "Request canceled by trader"; + break; + + // + case TRADE_RETCODE_PLACED: + result = "Order placed"; + break; + + // + case TRADE_RETCODE_DONE: + result = "Request completed"; + break; + + // + case TRADE_RETCODE_DONE_PARTIAL: + result = "Only part of the request was completed"; + break; + + // + case TRADE_RETCODE_ERROR: + result = "Request processing error"; + break; + + // + case TRADE_RETCODE_TIMEOUT: + result = "Request canceled by timeout"; + break; + + // + case TRADE_RETCODE_INVALID: + result = "Invalid request"; + break; + + // + case TRADE_RETCODE_INVALID_VOLUME: + result = "Invalid volume in the request"; + break; + + // + case TRADE_RETCODE_INVALID_PRICE: + result = "Invalid price in the request"; + break; + + // + case TRADE_RETCODE_INVALID_STOPS: + result = "Invalid stops in the request"; + break; + + // + case TRADE_RETCODE_TRADE_DISABLED: + result = "Trade is disabled"; + break; + + // + case TRADE_RETCODE_MARKET_CLOSED: + result = "Market is closed"; + break; + + // + case TRADE_RETCODE_NO_MONEY: + result = "There is not enough money to complete the request"; + break; + + // + case TRADE_RETCODE_PRICE_CHANGED: + result = "Prices changed"; + break; + + // + case TRADE_RETCODE_PRICE_OFF: + result = "There are no quotes to process the request"; + break; + + // + case TRADE_RETCODE_INVALID_EXPIRATION: + result = "Invalid order expiration date in the request"; + break; + + // + case TRADE_RETCODE_ORDER_CHANGED: + result = "Order state changed"; + break; + + // + case TRADE_RETCODE_TOO_MANY_REQUESTS: + result = "Too frequent requests"; + break; + + // + case TRADE_RETCODE_NO_CHANGES: + result = "No changes in request"; + break; + + // + case TRADE_RETCODE_SERVER_DISABLES_AT: + result = "Autotrading disabled by server"; + break; + + // + case TRADE_RETCODE_CLIENT_DISABLES_AT: + result = "Autotrading disabled by client terminal"; + break; + + // + case TRADE_RETCODE_LOCKED: + result = "Request locked for processing"; + break; + + // + case TRADE_RETCODE_FROZEN: + result = "Order or position frozen"; + break; + + // + case TRADE_RETCODE_INVALID_FILL: + result = "Invalid order filling type"; + break; + + // + case TRADE_RETCODE_CONNECTION: + result = "No connection with the trade server"; + break; + + // + case TRADE_RETCODE_ONLY_REAL: + result = "Operation is allowed only for live accounts"; + break; + + // + case TRADE_RETCODE_LIMIT_ORDERS: + result = "The number of pending orders has reached the limit"; + break; + + // + case TRADE_RETCODE_LIMIT_VOLUME: + result = "The volume of orders and positions for the symbol has reached the limit"; + break; + + // + default: + result = "Invalid return code of the trade server"; + break; + } + + // + return result; +} diff --git a/MQLTestWorkspace/X121/Old/Libraries/x-saherelm.models.lib.ex5 b/MQLTestWorkspace/X121/Old/Libraries/x-saherelm.models.lib.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..358e61cd53809e9f51c3220a599ceb649ab391e4 GIT binary patch literal 4976 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 +void Add( + T &item, + T &buffer[]) +{ + // + ArrayResize( + buffer, + ArraySize(buffer) + 1); + + // + buffer[ArraySize(buffer) - 1] = item; +} + +template +void Clean(T &buffer[]) +{ + // + ArrayFree(buffer); + ArrayResize(buffer, 0); +} + +template +void Copy( + T &source[], // Source Buffer ... + T &dest[], // Dest Buffer ... + bool cleanDest = true // Force Clen Dest Buffer ... +) +{ + // + if (cleanDest) + { + Clean(dest); + } + + // + int sourceCount = ArraySize(source); + if (sourceCount <= 0) + { + return; + } + + // + for (int i = 0; i < sourceCount; i++) + { + // + T iSource = source[i]; + + // + Add( + iSource, + dest); + } +} + +// +// END Provided Functions ... +// diff --git a/MQLTestWorkspace/X121/Old/Libraries/x-saherelm.seriallizer.lib.ex5 b/MQLTestWorkspace/X121/Old/Libraries/x-saherelm.seriallizer.lib.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..57aca8624923ed5c001f4c780b23914f3cf76cb8 GIT binary patch literal 7124 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 0; + + // + return result; +} + +// +// Extract Period String ... +string ExtractPeriodString(string comment) +{ + // + string result = ""; + + // + bool hasPeriod = HasPeriod(comment); + if (!hasPeriod) + { + return result; + } + + // + result = ExtractString( + comment, + XPeriodToken + "(", + ")"); + + // + return result; +} + +// +// Extract Time Frame From Comment ... +ENUM_TIMEFRAMES ExtractPeriod(string comment) +{ + // + ENUM_TIMEFRAMES result = NULL; + + // + if (StringLen(comment) <= 0) + { + return result; + } + + // + string periodStr = ExtractPeriodString(comment); + if (StringLen(periodStr) <= 0) + { + return result; + } + + // + result = ToPeriod(periodStr); + + // + return result; +} + +// +// PROVIDER ... + +// +// Extract a Provider name if exists from a Comment ... +string ExtractProvider(string comment) +{ + // + string result = ""; + if (StringLen(comment) <= 0) + { + return result; + } + + // + result = ExtractString( + comment, + XProviderToken + "(", + ")"); + + // + return result; +} + +// +// Generate Provider String for Using in Positions Comment ... +// NOTE: if there is more than One Provider, it takes first +// provider as main and the others used to increase volume ... +string GenerateProvidersString(XSignal &signal) +{ + // + string result = ""; + + // + int providersCount = ArraySize(signal.providers); + if (providersCount <= 0) + { + return result; + } + + // + result = XProviderToken + "(" + signal.providers[0] + ")"; + + // + return result; +} + +// +// SLTRAIL ... + +// +string GenerateSLTrailComment(int level) +{ + // + string result = ""; + + // + if (level <= 0) + { + return result; + } + + // + result = XSLTrailToken + "(" + ToString(level) + ")"; + + // + return result; +} + +// +int ExtractSLTrailLevel(string comment) +{ + // + int result = 0; + + // + if (StringLen(comment) == 0) + { + return result; + } + + // + string levelStr = ExtractString( + comment, + XSLTrailToken + "(", + ")"); + if (StringLen(levelStr) == 0) + { + return result; + } + + // + result = (int)levelStr; + + // + return result; +} + +// +string PrepareSLTrailComment( + const string comment // Original Position Comment ... +) +{ + // + string result = ""; + + // + if (StringLen(comment) == 0) + { + return result; + } + + // + int level = 0; + result = comment; + + // + // Check Comment Contains SL Trailing or not ... + int lastTrailLevel = ExtractSLTrailLevel(comment); + if (lastTrailLevel <= 0) + { + level++; + } + else + { + // + level = lastTrailLevel + 1; + string lastLevelStr = GenerateSLTrailComment(lastTrailLevel); + StringReplace( + result, + lastLevelStr, + ""); + } + + // + // Generate level Comment ... + string levelStr = GenerateSLTrailComment(level); + result += levelStr; + + // + return result; +} + +// +// SUPPORT ... + +// +// Generate Specific Position's Support Comment +// index is number of Supports ... +string GenerateSupportSignalComment( + ulong ticket, // Position/Order Ticket + int index // Support Index ... +) +{ + // + string result = ""; + + // + result = XSupportToken + "(" + (string)ticket + "," + ToString(index) + ")"; + + // + return result; +} + +// +// Extract Support Parameters String from specified Comment ... +string ExtractSupportParam(string comment) +{ + // + string result = ""; + if (StringLen(comment) <= 0) + { + return result; + } + + // + result = ExtractString( + comment, + XSupportToken + "(", + ")"); + + // + return result; +} + +// +// Extract Support Info as String array for Specific Comment ... +bool ExtractSupportParams( + string comment, // Specified Comment ... + string ¶ms[] // Hold Result ... +) +{ + // + bool result = false; + + // + string supParam = ExtractSupportParam(comment); + if (StringLen(supParam) == 0) + { + return result; + } + + // + SplitContent( + params, + supParam); + int paramsCount = ArraySize(params); + + // + result = paramsCount == 2; + + // + return result; +} + +// +// Extract Support Parent Ticket ... +ulong ExtractParentTicket(string comment) +{ + // + ulong result = 0; + + // + string params[]; + bool isSupport = ExtractSupportParams( + comment, + params); + if (!isSupport) + { + return result; + } + + // + result = (ulong)params[0]; + + // + return result; +} + +// +// Extract Support Index ... +int ExtractSupportIndex(string comment) +{ + // + int result = -1; + + // + string params[]; + bool isSupport = ExtractSupportParams( + comment, + params); + if (!isSupport) + { + return result; + } + + // + result = (int)params[1]; + + // + return result; +} diff --git a/MQLTestWorkspace/X121/Old/Libraries/x-saherelm.x121.draw.lib.ex5 b/MQLTestWorkspace/X121/Old/Libraries/x-saherelm.x121.draw.lib.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..9f87861f2d15ee7c984760057496fecf5c0eec44 GIT binary patch literal 6782 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 literal 0 HcmV?d00001 diff --git a/MQLTestWorkspace/X121/Old/Libraries/x-saherelm.x121.draw.lib.mq5 b/MQLTestWorkspace/X121/Old/Libraries/x-saherelm.x121.draw.lib.mq5 new file mode 100644 index 0000000..941d61b --- /dev/null +++ b/MQLTestWorkspace/X121/Old/Libraries/x-saherelm.x121.draw.lib.mq5 @@ -0,0 +1,241 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 X12 Draw Library +// ------------------------------------------ +// Name: X121Draw +// Description: provides Draw Requirements ... +// +// +// 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 "../Libraries/x-saherelm.draw.lib.mq5" +#include "../Libraries/x-saherelm.common.lib.mq5" +#include "../Libraries/x-saherelm.models.lib.mq5" + +// +// START Draw Functions ... +// + +// +// Draw Signal ... +void DrawSignal(const ulong ticket, XSignal &signal) +{ + // + bool isLong = IsLong(signal.type); + + // + string prefix = (string)ticket + "_" + ToString(signal.period); + + // + // Retrieve Time ... + datetime time = iTime( + signal.symbol, + signal.period, + 0); + + // + // Retrieve 3 Time ... + datetime time3 = iTime( + signal.symbol, + signal.period, + 3); + + // + color posColor = isLong + ? clrSpringGreen + : clrTomato; + color tpColor = clrSpringGreen; + color slColor = clrTomato; + color entryColor = clrGold; + + // + ENUM_LINE_STYLE vLineStyle = STYLE_DOT; + ENUM_LINE_STYLE tpLineStyle = STYLE_SOLID; + ENUM_LINE_STYLE slLineStyle = STYLE_SOLID; + ENUM_LINE_STYLE entryLineStyle = STYLE_SOLID; + + // + int lineWidth = 2; + + // + long chartID = ChartID(); + + // + // Vertical Line ... + string vlName = prefix + "_" + (string)time; + + // + DrawVerticalLine( + chartID, + vlName, + 0, + time, + posColor, + vLineStyle, + lineWidth); + + // + // TP ... + double profit = (MathAbs(signal.tp - signal.entry)) * signal.volume; + string tpName = prefix + "_TP_" + (string)profit; + + // + DrawTrendLine( + chartID, + tpName, + 0, + time3, + signal.tp, + time, + signal.tp, + tpColor, + tpLineStyle, + lineWidth); + + // + // SL ... + double lost = (MathAbs(signal.sl - signal.entry)) * signal.volume; + string slName = prefix + "_SL_" + (string)lost; + + // + DrawTrendLine( + chartID, + slName, + 0, + time3, + signal.sl, + time, + signal.sl, + slColor, + slLineStyle, + lineWidth); + + // + // ENTRY ... + string entryName = prefix + "_ENTRY_" + (string)lost; + + // + DrawTrendLine( + chartID, + entryName, + 0, + time3, + signal.entry, + time, + signal.entry, + entryColor, + entryLineStyle, + lineWidth); +} + +// +// Draw Support and Resistance ... +void DrawSupportResistance( + int bar_index, + XOHCLSupRes &data, + string prefix = "", + color supportColor = clrOrange, + color resistanceColor = clrOrange) +{ + // + datetime barTime = GetCandleTime( + _Symbol, + _Period, + bar_index); + + // + datetime prevBarTime = GetCandleTime( + _Symbol, + _Period, + bar_index + 5); + + // + long chID = ChartID(); + int subWindiw = 0; + int lineWidth = 1; + + // + string mPrefix = prefix + "_" + (string)barTime + "_"; + + // + // SUPPORTS ... + + // + int supCount = ArraySize(data.sup); + if (supCount > 0) + { + // + for (int i = 0; i < supCount; i++) + { + // + double iSup = data.sup[i]; + + // + string supTlName = mPrefix + "SUP[" + (string)(i + 1) + "]_(" + (string)iSup + ")"; + + // + // Draw Support ... + DrawTrendLine( + chID, + supTlName, + subWindiw, + prevBarTime, + iSup, + barTime, + iSup, + supportColor, + STYLE_DOT, + lineWidth, + true); + } + } + + // + // RESISTANCES ... + + // + int resCount = ArraySize(data.res); + if (resCount > 0) + { + // + for (int i = 0; i < resCount; i++) + { + // + double iRes = data.res[i]; + + // + string resTlName = mPrefix + "RES[" + (string)(i + 1) + "]_(" + (string)iRes + ")"; + + // + // Draw Support ... + DrawTrendLine( + chID, + resTlName, + subWindiw, + prevBarTime, + iRes, + barTime, + iRes, + resistanceColor, + STYLE_DOT, + lineWidth, + true); + } + } +} + +// +// END Draw Functions ... +// diff --git a/MQLTestWorkspace/X121/Old/Libraries/x-saherelm.x121.signaller.lib.ex5 b/MQLTestWorkspace/X121/Old/Libraries/x-saherelm.x121.signaller.lib.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..25845efb393c430302521a15e378d76dbb6d545a GIT binary patch literal 10570 zcmdURWl$YJv*pEtyX(c>HNoB8-QC^YA-IN%yW2%VaCdhC!6CT2Zoaqs{=KT*zk9l7 zy65!FRCRaFR7+@cLAd}*(1f7@{{R8l|1bR?`+oy_cCIFpV3@fJFg4%#p{e`d{Qp(| zpL@Jv0f7IE{|VFDEv`^bl8SUnh{nNmhEnkKv1qO02l6QD1I{N@h>9XCUfvv0%$EN- zD+X`^I0JkDt^gZ=6~G$c4j=`v16cnJ4gljnTMc0HkG1&cmjKuU9R4vf0QG;f*gwwk z-|qi-{(r`QB6k0m0XG0IfaRZf{g*KRTmN_57XKAD^S}K3{~hW7TqQOD^S^4d{?E?; z2lnk7?iU&qSZYbS21#U1YQR2(8$^cgDghK>0*Pq3C=d*l7d;hOlgwym$+u{v>zO0$ z{GDGaFH)gyU~H33j^B?7w&_}a!$S1pTqG`X3o-wfW$6Vf*>TV|LFh@q^2!2H`cSto zZsEYMNAN^g;AiAKuHMdO;RA_B; z?SLSP&6bKEBrfMrtMrv<*WKDM8TnR@op-H*Q_bDTtG&Sv8| zoZ=YEB)H7uC77sY{(<#J?MwnjyTS+jW<|d!C0)k&2U$7Pu$a6?ecn!$vH;e~d>a+A zZ&+BSf96GuN*%Sr8Ai$53=1w;3Q{Jkj=<7gW}ZWa@axkaI$vPa|lUZf6o*1wnf}}Z1S^uVS2KL?2-xMrL_4C+Y=xTH@Zf>sKx~Kp`zpP`j!`79 zK@BDqOx*mWp#GA~Wx52E7oJ+!$9;Rf(_6Rk)S{`1C=)xYB_!(YH7*cPVJc7Jcc@_E zk^Bnid=xn=ym+F8Af3IJCg~WWa-#p5446&U#)%nEC!H+!v9!Zf-r|)@JwQ$CuAS#2 z&Z$(u{+9V}iO8e1gUP>CQ|@6yM~y{Tyt2dZ55xih599n`{*Xhx*{$kU+4>O}i@Ihw zc@aNW(db1^8$d98Y-ziKQ{?JBZIpCX!u||zW%jVpGB~Xwu$dRmquce4LttB(aXqM| z6koI*pbAh(D|G7SKEhf?r%&*u+IKj=s&fA+W`OQ+!PgVawdRJ1F{QGVn2SoJhq)W# zKRAf`Q)?~`gU3|8>sr?7yhi{c!HL9uu&aaOR~uG^f>!U&1pC-1M4pX=&b~$x3rEdL z%`HJ`tpsuOA$2O@VbR2xni83ph10(T$_B^k_j3CnWhnL3fCPt^udV{qN7%ZZRZ| zI5)B4kuygsP#3~xqhp#(R!5hECPgpXWG}*ZT};_TU1c53hd0?3#`u+3DV&U2@2i>s zb|{gPEqOg32})|0YPi|luLOn`AKs#3syv+SiTFJ@ zGaN2m5ge7jmJ2eX4T_0iEzP7u66%*fr0UZhvsu>rFydV2&n(C8aiuX*V1g7wLfhds znZ1ZEMA;M$p{)-UruM@~vsP5eagk4UQbLue>-YA>3AMF6lyOVUE-&WuT{*{KG>>7j zK%EjyX7(0--0TqI*+JMX5>DejQlhW7TpYvT%Ws@qB^bIcf=^S?SIs)XsiP3kmbxROw1mkC#LyXYdy}+n0vxyXR&HoClq$&}- zrX`#3)Qo90Y2#dURP8?>mRUX)@1gy8E!<^OMaC#j5it`C;6?-_18juSDMtxwxcDv- z1IQC(6|9Q*1NP#WTd?HpHE483y~w`bGY|#oKGIh@eOu`747t)f9A=h0XfG7#jB-C* ztg^z(MR+@)>#_5!z*74Ssg~Za)&QsVg)biVjrWpMN5~8>2=7+(I0ds1^b#yV zzunasNSfdEQLjaZL2%atAf)zu~tS(Bqc+xw#3OR_xTr?$Ea~3NA*x zH^2Pp@AbaJkqKH|KwU#ACruJRroFLC!cb*=UqoDa@O5nWQ&lD5*VdC)AxUiZ1E!P5fgSmejo1uT1-Yg* za{S%l#o?vKV4$I&R4M$6m%HW|GD7hlwC`X;7{+q`J(bbykP}nCm!<5F-dykH*UvfZ z{wA}VIp^v9QzAV^%(j-1Vfr3DbEy8NqNDp|$!fR@J!*npx-NQ}{GKqvb0W$G?(}9T z`U0OhzhFxsI|O#95lW&p*}K`=HV?ZL6rZ4ZJRQc)t1q zGX5XzNtCf~LIu*pMESqkiT9U~Vfa`*_8PI>D{_l0B6zvBP% zyyr&)mVNPK6KF^!vlCX~;=G0Y!|&(nm>Y$mdE;XEOZ^yu3wwWfoJjii``RLz=NC`s z${y~h@?3bhCb-{ra%+10F@C^n;*&!0h_cS-*ZVrawm;8Q%x1EclN)0%Y4I)#xe7@cgNQ63B=2)9ZOZH!Xa4GZ84m9a2 z%@BjdiY3IAtAZC$xVxQqHlJfMS=Kh_q58*HG+WyUd7u@a?Axh%e(vN#-pRJY583L9 z?LTtl!_*Xa6dprnqCWMzr5_KvWQ{s}GQD=SlAt$n3y?wMgXyJ~FnRaat8Q+~XCwn) zxMIYx?k{^?mQ?PO-&P3?+W8t?zLyk?qH9ok3QW3J7w~aJsu8Dz8C7S9JG-?GJPiql zO$bYc#?X=w-?y@zoA)aH@T@&;6LX}JTB#*rhqD#d5pUwXJyW?`c7Gx)8$Go=z4di? z+{JiXR@@+SI}-1|c&HdYr@{Dp&ff5)^9(mK*%eOGDlDRU^%0kSXcNDr7qMqftV&1% zXt4J%41OS1$FKc0p>#f>29xW*JS9q#9670m_!*d7tX>_>dF|pkg zCTxS$<2go!AH~xqWJBL^C)8KM;gL*N8so__6^T@q!;6OudIQpTq3geWViSPJCW|y% z$Sin|vSo~4qw>9Hg=7hO?)?8Cb*~S#stTNoU)DdiZmNr4vuT<&pY%CwdWup?WR?xX z5KpHQnQdS+%TeQcyEb33@h4;=T+@gxQ`6lscy;grJGz}in0^Zg4rM;}joXMsI@(Ll%DUmVEq6l4nr!r57R zsu}c}eRv1s8w+!L!o||d>KQ5y#lH29ok2|=kB%UNtmu`+*>|epDwSOCd;< zI3EjB6nj`D7W{j|7))}g7T9ucoo@ebtx*(nSpVmjS639xcY_BP_A@p9tMfL~0Orqt zrheT^|DWopoIRzk1jR?N#B8|s!-m9lnUt>c(|uk?>C#_dKPQ&wlP=@j8{y4M+s({K z>{a5Gz8u+XAXpS<=drsU87cVV?_VSc$!|ppG#^2DV<0NykrLV(gsK3;*VQ|oi#$NE zttE~PKPsXD^J7`00(k3u?9``<#+~J!Px>K$ZEaAi@39b@@}Q}Xxv_6^#{*4eE2F1?Jpjh!)jp{OqXu(09{PXCF-YR|i?`SBzW-Vk-f~q};U%jv_TaXVS`HK`v3# zZTeW`U$cTJCUffa^xS1Uv)WIx>ps0iC$)nsY&7d zaD`mU5zdrQCVM**o?eikJ-T(q(-Xgo_`|z%nEnB3`LHSAHp=XsTXMCU8T^BWe!;Q- z+iFli_?uxWx7JbEgP7&zo2N($*FF{uZbFYqAh}BHck8E3tU%{e?_2nC8llFXCaX2f zacyW+Ti(cp6h~iVnUR~R)H}uSEABpX*0R%$!reokki%f-^?GkwjYgXC{o4rPpY_sY zGWKP1)ENC6YoapGE#T=ctmC;Igb_SqJv{ zYg_jgX%Cshs5(2Q{VLlrawsgeJqekTaO{EQ{6ogUF|cm>{jDUpa0n@$k(FYrsb*7A zOgFTc-3S0qZe;yk=J2$QuF}URVQ&Y8-#e z&iRj)^|c-yqQe%sLn}`DsjRmA&4+so{SEG7cR2&+a2_gA>nyn)XJ9*<_EKv)c{^!> z3@`i8-3rdUMCDLm%~?x|4@>Of3`??oGAil=Ap^P9v7$!H7=rPRUMwyO4K1p--ERxh zeTHV}b$Mq8NxaoZGMG&z$`+y)yO%}GUFx+tz;aJ^n#;_uYXHFS#RJD8`sDC^(SUYKB z?dYnji*qqO3_V!2X>rU*s~V!t|MD%@ZTv|~m7}!@KaTSeN6TZ>#cU}@m3jv>vlFwP zj7EJcXMW|zV;4({m|W#4(5ax?f8{Y}i)p`oP8tR*-h-cid*g0LbRtyR6W>KOR`EbN zlK-m4XEj}`*A|td$?KNH`@a2DpUzk1D|6@3MSd$df1vajaOgEgz8sKa*Ccgl*ywI&dgdG$YOhIJ`FoJMwn& znXkLaS)n)YSkF!(SoN$QSQ=_!1PdnA%6s`9irvW22F1FOUr>l|_x}n0UDr~0Tprqn zRv51CK2v~cHwDAS$7m>u{jn(qciin!9E1i{-jfe+3J+u?cle#HZ@Kns3Y3tdWtiDb zX2pxOT5K>ZxfRi2STxnH@6ji7ZnZ2lK+hOFJm}Qgk#B`l+jv1W6)XyW+zi}C!@O5K zQ*W2@PqjBnWaR(c#Rb}1nd;lsvkuMV-bg{H$%~>A2r*Oyy?_GbJl{szT`Q-C)LKIp|!R14IcvHF66XeQWoGp_#Ov+A? zg;6lkE8ARC?%C;M7Ml326U?5lU>$nS79o{3o&5q$Hkpw~vN6-uFiI*5wgI8W2ly}M z`_pjSCZcm9pM=i8H5K{gy}i|%w^s3dIv2Kzi^?$5HOO>`Rrqvz^8e60LS7kT!6dVy zUcML3Tr~FEP-tvSbN4YJse{9*p_P6wX}x=3FzFrU_fNPrnuZu2lEOLuoy-I8O3b~m z&>bLk2)t72$##8C;ZQvsH29Gkcr8_;tD^XOiMRvJ+YK6vaPAx0jKycRT5B3k3O#Kw87&C^fE<)E|Ds}2JKE7MF3&uL&M)tAohsc6-O zaO3imFG(wg8O$uB8@MEU&W!!S&1e|R9Mb%16BS*J_#dp6^o2e3G7r;YMAb`_BTk${ z2}+czm>kK7Qz6WuCg$`v`^45_QyLr$o@Wp|lKR)Vjs=^VZF2?R1gg-Yu zQa(2{o+ww^({bvJFE3M?zIxDb6gobM@q5&)u-T$6EUWj~*JE{79AqeXF=GiE_%u}3 zsM1*SnfdYdvpa7Qo+c40<-!xR=5q^c`q4-;D2gh{UEJ%!FS#l-ax1?x#{N;2ppXHd zZpcN-xFFi6o_S&%m#gN1H5uB5JEUu4hInnm0_DHwTm}<&{NVW^@`V5ojqqv^iiL_Q zF!qAz=kP5lvxSY~vQ{Mi@dv_#;apz>;iTIO&rW;zYV@5yo2-}d@F%eOG{~uRl3Cqf zKYopddyJ@g%K^h-(n6LAU1sF^>&*Z)%j8XsZC?~If2Ws69`7wt4hwwJhpXgl*1FZ| z*B;U?UF?2sLOjyP-^pbU!6t{25zphwsj!CQT)9Y2Gg2!Idg=GzM#Wo1 zeR{T?-Xs|$FL=^l*S`2(KXQ!Ry#Ap>y`Es*6U5uwegi>f_C*jDmB|aekgaz@DRo^~ zo?RIz=%YSB272PM_Bx}<`IGcY3?ui` zC1Tiwc86MVDn1ZeIqf^^UzgG6{rkbFo?m~2%!|KCodWGfL*5gsks@Rg?WeqFA#;{t zxV9{~%}VU6ni_FW668zuYVfYw&lDpuh5W(}NbtD^fPT80zZK{CZ{a;}GjFT>=$FPJ zCQNu0b9Jb{#+_**U`uW+X1}ecup&3){Vf=T2u1+2jx~gSSPbZ??#2~DG= z&_>T}IrhyOL&O~9>dUJwlxtzsUlm-G?#p8yrB@>r_A@mfZUVddN|p-ZX_AdQ^wk;W zgkoECo`X+g`;XbF*LQw|fNr0Bc)ST83*gR;P#v|1(HGZ&7($VdAs-ASN&U9t$hD#o zV?*+89tuvBhtYJUC9@vNvQ<_pZ@YkxMF?tdQ0R@JPKQ+Y|V!DKbz$qvaCTh!p~609@XcYba`&M6p!dv(NseAJ07P zCb~AnTedl6z7mP?XxP6~*?+K3tcdhIwFJ>`-p3kb&V(?n`S3oIOi08?dgE zq)?n(5==aPD~&2E@)EL(l&bLNM;^+bq#?$*rJG${4DKYkPteV6eUaP8nSM2}lAw|Q z-6S8rv9tJo6%x)<3>>(XiaGslu507_dQx?p;I}sZave|U_saoi3S)7sy)VC@+qnaK`krr%S>bet-iGNs+W2V)A|H`XU?9ME@t`OJOZOZBBr zep%{o-IXfn0s{gb`@P#U{A3;-L~NM|9%Y&|N%qww#3YwcYo)6IEe?aM+rP?b?)n?% zvjR}dq!4;;I@ZuC_j%57T??e55_d;n%xYePa{FbC7xv%FoI#=n5wF7h*)39<-j@v} zowzs_8^75*JaWN6B<)Jf#hEKiYwCnJXSF`#GFLBgo+kf~1Zb7?FgDIDVKU!p(GduV z7duEZro3EyBHYob^r<+KhL{(l+S1?ogiKo&l_s&_P1c3d0S~ITYAASPWNz5>(GqY{ zMhJdAx&jd(7_Z)HUSC{EI41Ud(z%tr=yOSnNyZ&#sCc4{DwhYRzgz}8E=3p_r~^6o zO+SC`#QzNV{EV-k^Naga;re3YURJ@0 z1FYq`o*kiVIBiY7^4Do*tfBegBx=dUzsW}HpzKRjlW;;^mx9e zbCU=&+7tjoJ}m2x4*CnJWBz-uGkHZS8_<=z~g-pO_40`_M~8zhoL+Ou2rDC%ZoA285Xy}fhJXCALo}~ zS;+lT?vQl|4iSnZ{NTX%5>vvA^WI_nzC+W^B`8cr!|6|{nO=h8i9JZ}KfWQ7ffc4S zNb;}=iBa-b+^ge7gF!s+PDO2{L5z`k_hy~2b+l}ILv~RpK}0JRwgo$QXwoNh%+qAC zr(Ga;grFl%OkDK)w0-~`jw(}Nloh(mwnd>EPf4+b$%h2P+lPth-UD@;zvwMa2)V7N zZ?*~%WL0^3*_xG{?6CdcIjI!qSdh&0?@ccO^2UwtJq3_4zbK|aN^ozp*krSVMV+`HKXu^savs>cMjsJ|sI>)q_!&o&ER{dVYuW@IP4OBF zzNUCbtD<{#AcgxhL^%|$jwCYW{(T&${-K;T2QjyamgQbthah9X+{QOesZ4C5w;SNQ z#!L$|y3?jQy!h9vKv%b#nqDr|wug~ztRNhF!Alk8@a>wINR7bbc1c>lhU$<22eVsl@*A(<{HZKORF@hZrw3{rpA-oGjW;w^InMR zakCKJ!Lu$7Dhgbm?1CH5H|J95Myu7W&pFOJ{o6`kl1g6!-<<|KJJH6O8lcRqlEpJ; z{jlGrWgF2^Vt>`xIj`$0hHTH{U8cq~|J+bFp94=Z~p z){bug#(5mt-F;`u>oP0vN%(g_RkiPsDj_(I@;tyYacS7+;OW)^=In-2$kxG}f z`_Y&BXUlo_h^H`XV$Q(89!->boJ3d;k^HltdTQUsUiA|~$*TGHhmVi8Ks9LzS>C=< zcP2s$aq=ytNAD3Gu-aWzsO=l*{EKVXyF=XOhSe5Q8do%>@m%)yYd^#RFa+khI+{s*Vk-=ph zqmO$l>Pd9xtCb<+&~}Q}jI&RNYL%89bFY>+0hA=)aPWcl0c`&`RHaB~Fdwg(Og>tK zoKxcII*G3>v(Jo6(~eJRvS#0iP|D(Bm0Y{*DP5qb)T3Xsu1KRAJmVIA6J4HV?lM}R zx0z6|+eH2q1QZUqF$DAtnzh(w%eMNHccCCFk?`&<_zxIy zLggEk^d?e%=12*~<4If2H)DTOr-AL@9ixx5Di|#DjA52Sc>VtLK7_}i0z?49HO$@4 zE=g%xwvl!%zepyFNJ?-rZR+n{#q<|;Psc{|cRYl&F2O#(;T6QV8q;Ywb}0QMgI!wk z#2su;7sgcq|4vHO;qI=iRFgq9OU|G*!IW|t8eooUy^;!Kvk??voTFKfxYI}oEvtNT z_7J(1g&JMch;(6D00-(TLZ&4tu#SKfo%ZAMGq*AE3OxGt%$qL(E*DflKW#}I;>*w$`;p$5g}+u7kebey zOVRxj7s1H`Rq8{G&jh2~l-X=lz1y9^ozeZzghbDnCxrtjbGWxJbsO0{oP}6Wr~^f7 z+m<8`Rr(tc79i@Lt5YiwO~B}tS+LZJD^|X+X0!|q@TO+w1Z(-A^qrUL_awpqMg)!t zH7dYSh_2<+_-H5O`o}V>I$u^`_tRTyl?UzyHi9m{9rholN?6n2S+K+q)CX1d)X#;k zqot6}j;;Q9Qo}e`0dTatZrdA>66%=i31^ZT+J0GS`95~6=WiMRPwNT3k5PgS#u(Zh zktEOEkRf!E2N_})1zD8I_;nOlY+7v_-dCe@5H4S+whkyG%u}9($K3fRPMMvY6pUiO L-wZ< conditions.xcheInfo.le1[1] || + ll5 > conditions.xcheInfo.le1[2]) + // + ; + + // + bool isCandleBullish = + // + IsBullishCandle(conditions.candles[1]) + // + ; + + // + result = + // + isXCHELongSign && + isCandleBullish + // + ; + + // + if (result) + { + // + conditions.hasSignal = true; + + // + Add( + "XTMP", + conditions.signal.providers); + + // + conditions.signal.type = POSITION_TYPE_BUY; + conditions.signal.mode = X_ORDER_MODE_MARKET; + + // + conditions.signal.symbol = conditions.symbol; + conditions.signal.period = conditions.period; + + // + conditions.signal.r2r = 1; + conditions.signal.volume = 0.01; + conditions.signal.ignoreTP = false; + conditions.signal.ignoreSL = false; + conditions.signal.riskAmount = 0.01; + conditions.signal.calculateTP = false; + conditions.signal.useRiskAmountAsVolume = false; + conditions.signal.useSupportAndResistance = false; + + // + Clean( + conditions.signal.supports); + + // + double tp = 0; + double sl = 0; + + // + // TODO: + // Calculate TP and SL ... + + // + conditions.signal.tp = tp; + conditions.signal.sl = sl; + conditions.signal.entry = entry; + } + + // + return result; +} + +// +bool XTMPGetShortSignal( + X121MarketConditions &conditions, // Market Conditions, Result + XSCX121Provider *analyzer // Market Analyzer +) +{ + // + bool result = false; + + // + double entry = GetEntry( + conditions.symbol, + POSITION_TYPE_SELL); + + // + result = + // + false + // + ; + + // + if (result) + { + // + conditions.hasSignal = true; + + // + Add( + "XTMP", + conditions.signal.providers); + + // + conditions.signal.type = POSITION_TYPE_BUY; + conditions.signal.mode = X_ORDER_MODE_MARKET; + + // + conditions.signal.symbol = conditions.symbol; + conditions.signal.period = conditions.period; + + // + conditions.signal.r2r = 1; + conditions.signal.volume = 0.01; + conditions.signal.ignoreTP = false; + conditions.signal.ignoreSL = false; + conditions.signal.riskAmount = 0.01; + conditions.signal.calculateTP = false; + conditions.signal.useRiskAmountAsVolume = false; + conditions.signal.useSupportAndResistance = false; + + // + Clean( + conditions.signal.supports); + + // + double tp = 0; + double sl = 0; + + // + // TODO: + // Calculate TP and SL ... + + // + conditions.signal.tp = tp; + conditions.signal.sl = sl; + conditions.signal.entry = entry; + } + + // + return result; +} + +// +bool XTMPProcessSignal( + X121MarketConditions &conditions, // Market Conditions, Result + XSCX121Provider *analyzer // Market Analyzer +) +{ + // + bool result = false; + + // + X121MarketConditions mConditions = analyzer.GetMarketConditions(0); + + // + bool hasLong = XTMPGetLongSignal( + mConditions, + analyzer); + if (hasLong) + { + // + conditions = mConditions; + return true; + } + + // + bool hasShort = XTMPGetShortSignal( + mConditions, + analyzer); + if (hasShort) + { + // + conditions = mConditions; + return true; + } + + // + return result; +} \ No newline at end of file diff --git a/MQLTestWorkspace/X121/Old/Libraries/x-saherelm.x121.support.lib.ex5 b/MQLTestWorkspace/X121/Old/Libraries/x-saherelm.x121.support.lib.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..93661ef5f2a998f05fa5c481fe33760a969bf2cb GIT binary patch literal 11408 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 Qsn68GU= 0; + + // + return result; +} + +// +// Select EQM Support Orders ... +int GetEQMSupportOrders( + XOrder &supports[], // Hold Result ... + XOrder &orders[], // List of All Orders ... + ENUM_TIMEFRAMES period = NULL // Specified Period ... +) +{ + // + int result = 0; + + // + Clean(supports); + + // + int ordersCount = ArraySize(orders); + if (ordersCount <= 0) + { + return result; + } + + // + // Loop through Orders ... + for (int i = 0; i < ordersCount; i++) + { + // + XOrder iOrder = orders[i]; + + // + // Check Order is Support or not ... + bool isSupport = IsEQMSupport(iOrder.comment); + if (!isSupport) + { + continue; + } + + // + // Check Order is not Triggered ... + if (iOrder.state != ORDER_STATE_PLACED) + { + continue; + } + + // + // Check Period ... + if (period != NULL && iOrder.period != period) + { + continue; + } + + // + // we now sure this order is EQM Support ... + Add( + iOrder, + supports); + } + + // + // Count Result ... + result = ArraySize(supports); + + // + return result; +} + +// +// Select EQM Support Orders by Type ... +int GetEQMSupportsByType( + XOrder &supports[], // Hold Result ... + XOrder &orders[], // List of All Orders ... + ENUM_TIMEFRAMES period = NULL, // Specified Period ... + ENUM_X121EQM_SUPPORT_TYPES type = NULL // EQM Support Type ... +) +{ + // + int result = 0; + + // + XOrder mOrders[]; + result = GetEQMSupportOrders(mOrders, orders, period); + if (result <= 0) + { + return result; + } + + // + if (type == NULL) + { + // + Copy( + mOrders, + supports); + } + else + { + // + for (int i = 0; i < result; i++) + { + // + XOrder iOrder = mOrders[i]; + + // + if (iOrder.tp > 0 && type == XEQM_INBOUND) + { + // + Add( + iOrder, + supports); + } + else if (iOrder.tp == 0 && type == XEQM_UNBOUND) + { + // + Add( + iOrder, + supports); + } + } + } + + // + result = ArraySize(supports); + + // + return result; +} + +// +// NOTE: +// here we add all Supporting Signals preparations ... +// 1- must have at least TWO Support Signal without tp ... +// 2- there are some signals by providing tp ... +// 3- Trend base and Conditional Supports by tp ... + +// +// UNBOUND Support => Support Signals with TP ... +// INBOUND Support => Support Signals without TP ... + +// +// in each time when there are an open positions in DrawDown and it's passed +// a certain candles ... +// we Have to Placed atleast 2 UNBOUND Support Signals ... + +// +// LIFETIME of Supports ... +// Each Support Signal must be Cancel if their doesn't triggered +// for an specific Number of Candels ... + +// +// SUPPORT GENERATORs ... + +// +// Generate Supports Signal For Market ... +int GenerateMarketSupports( + XSignal &supports[], // Hold Result + string symbol, // Trading Symbol + ENUM_TIMEFRAMES period, // Trading Timeframe + XSCX121Provider *analyzer, // Market Analizer + double volume = 0.01 // Provided Volume +) +{ + // + int result = 0; + + // + // TODO: Variable ... + int numberOfItems = 10; + + // + Clean(supports); + + // + // Calculate Lng Exit Price ... + double longExit = GetExit(symbol, POSITION_TYPE_BUY); + + // + // Generate Support and Resistances ... + XOHCLSupRes longSupRes = analyzer.GenerateSupportAndResistance( + longExit, + numberOfItems); + + // + // Calculate Short Exit Price ... + double shortExit = GetExit(symbol, POSITION_TYPE_SELL); + + // + // Generate Support and Resistances ... + XOHCLSupRes shortSupRes = analyzer.GenerateSupportAndResistance( + shortExit, + numberOfItems); + + // + X121MarketConditions mConditions = analyzer.GetMarketConditions(1); + + // + double tp = 0; + double sl = 0; + double max = 0; + double med = 0; + double min = 0; + double entry = 0; + double tpPointPrice = PointToPrice( + symbol, + supportsSginalTpPoint); + + // + XSignal mSignal; + Clean(mSignal); + + // + // 1- Breakout PEAK to UP ... + // 2- Breakout PEAK to Down ... + // 3- Breakeout VALE Down ... + + // + mSignal.ignoreTP = false; + mSignal.ignoreSL = false; + mSignal.calculateTP = false; + mSignal.useRiskAmountAsVolume = true; + + // + mSignal.symbol = symbol; + mSignal.period = period; + mSignal.riskAmount = volume; + + // + // 1 + + // + mSignal.mode = X_ORDER_MODE_LIMIT; + mSignal.type = POSITION_TYPE_SELL; + + // + entry = mConditions.xpvInfo.peak; + tp = entry - tpPointPrice; + + // + mSignal.tp = tp; + mSignal.entry = entry; + + // + Add( + mSignal, + supports); + + // + Clean(mSignal); + + // + mSignal.ignoreTP = false; + mSignal.ignoreSL = false; + mSignal.calculateTP = false; + mSignal.useRiskAmountAsVolume = true; + + // + mSignal.symbol = symbol; + mSignal.period = period; + mSignal.riskAmount = volume; + + // + // 2 + + // + mSignal.mode = X_ORDER_MODE_STOP; + mSignal.type = POSITION_TYPE_BUY; + + // + entry = mConditions.xpvInfo.peak; + tp = entry + tpPointPrice; + + // + mSignal.tp = tp; + mSignal.entry = entry; + + // + Add( + mSignal, + supports); + + // + Clean(mSignal); + + // + mSignal.ignoreTP = false; + mSignal.ignoreSL = false; + mSignal.calculateTP = false; + mSignal.useRiskAmountAsVolume = true; + + // + mSignal.symbol = symbol; + mSignal.period = period; + mSignal.riskAmount = volume; + + // + // 3 + + // + mSignal.mode = X_ORDER_MODE_STOP; + mSignal.type = POSITION_TYPE_SELL; + + // + entry = mConditions.xpvInfo.vale; + tp = entry + tpPointPrice; + + // + mSignal.tp = tp; + mSignal.entry = entry; + + // + Add( + mSignal, + supports); + + // + Clean(mSignal); + + // + result = ArraySize(supports); + + // + return result; +} + +// +// Generate Support Signal for Specific Signal ... +bool GenerateSignalSupports( + XSignal &signal, // Source Signal + XSCX121Provider *analyzer // Market Analizer +) +{ + // + bool result = false; + + // + Clean(signal.supports); + + // + string providerStr = signal.providers[0]; + if (StringLen(providerStr) == 0) + { + return result; + } + + // + ENUM_X121_SIGNAL_PROVIDERS provider = ToProvider(providerStr); + bool isAllowed = analyzer.IsAllowdSignaller(provider); + if (!isAllowed) + { + return result; + } + + // + bool isLong = IsLong( + signal.type); + bool isLongSupport = !isLong; + + // + ENUM_POSITION_TYPE type = + isLong + ? POSITION_TYPE_SELL + : POSITION_TYPE_BUY; + + // + double tp = 0; + double sl = 0; + double volume = signal.volume * 2; + double entry = GetEntry( + type); + + // + double tpPriceDistance = MathAbs(signal.entry - signal.tp); + double tpPoint = PriceToPoint( + signal.symbol, + tpPriceDistance); + + // + double ll3 = GetLowestLow( + signal.symbol, + signal.period, + 3, + 0); + + // + double hh3 = GetHighestHigh( + signal.symbol, + signal.period, + 3, + 0); + + // + // XPV ... + double fl1 = analyzer.mXPVHelper.fl1Buffer[0]; + double fl2 = analyzer.mXPVHelper.fl2Buffer[0]; + double fl3 = analyzer.mXPVHelper.fl3Buffer[0]; + double peak = analyzer.mXPVHelper.peaksBuffer[0]; + double vales = analyzer.mXPVHelper.valesBuffer[0]; + + // + double distancePrice = + isLong + ? MathAbs(signal.entry - ll3) + : MathAbs(signal.entry - hh3); + double distancePoint = + PriceToPoint( + signal.symbol, + distancePrice); + double supportTpPrice = + PointToPrice( + signal.symbol, + distancePoint + tpPoint); + + entry = + isLongSupport + ? hh3 + : ll3; + tp = + isLongSupport + ? entry + supportTpPrice + : entry - supportTpPrice; + + // + XSignal tmpSignal; + Clean(tmpSignal); + + // + tmpSignal.r2r = 0; + tmpSignal.volume = volume; + tmpSignal.ignoreTP = false; + tmpSignal.ignoreSL = false; + tmpSignal.riskAmount = volume; + tmpSignal.calculateTP = false; + tmpSignal.symbol = signal.symbol; + tmpSignal.period = signal.period; + tmpSignal.useRiskAmountAsVolume = true; + tmpSignal.useSupportAndResistance = false; + + // + tmpSignal.type = type; + + // + Add( + providerStr, + tmpSignal.providers); + + // + switch (provider) + { + // + // X92 ... + case X92: + // + tmpSignal.tp = tp; + tmpSignal.sl = sl; + tmpSignal.entry = entry; + tmpSignal.mode = X_ORDER_MODE_STOP; + + // + Add( + tmpSignal, + signal.supports); + + // + break; + } + + // + result = ArraySize(signal.supports) > 0; + + // + return result; +} \ No newline at end of file