From 65ca188e834f40c37277dcc4d7ecc3ce42a28ae2 Mon Sep 17 00:00:00 2001 From: Hadi Khazaee Asl Date: Sat, 24 Feb 2024 07:26:34 +0330 Subject: [PATCH] last ... --- .../EX5/Experts/x-saherelm.test.ea.ex5 | Bin 0 -> 201454 bytes .../x-saherelm.xchlh.oscillator.ex5 | Bin 0 -> 48004 bytes .../x-saherelm.xchma.oscillator.ex5 | Bin 0 -> 49154 bytes .../Indicators/x-saherelm.xobd.oscillator.ex5 | Bin 0 -> 11052 bytes .../Indicators/x-saherelm.xrsi.oscillator.ex5 | Bin 0 -> 17482 bytes .../Indicators/x-saherelm.xtd.oscillator.ex5 | Bin 0 -> 18384 bytes .../Indicators/x-saherelm.xtm.indicator.ex5 | Bin 0 -> 12832 bytes .../EX5/Libraries/x-saherelm.alert.lib.ex5 | Bin 0 -> 7392 bytes .../EX5/Libraries/x-saherelm.class.lib.ex5 | Bin 0 -> 7564 bytes .../EX5/Libraries/x-saherelm.common.lib.ex5 | Bin 0 -> 4944 bytes .../EX5/Libraries/x-saherelm.draw.lib.ex5 | Bin 0 -> 6304 bytes .../EX5/Libraries/x-saherelm.http.lib.ex5 | Bin 0 -> 4574 bytes .../EX5/Libraries/x-saherelm.log.lib.ex5 | Bin 0 -> 5906 bytes .../EX5/Libraries/x-saherelm.models.lib.ex5 | Bin 0 -> 4932 bytes .../EX5/Libraries/x-saherelm.nn.lib.ex5 | Bin 0 -> 4374 bytes ...x-saherelm.xchlh.oscillator.helper.lib.ex5 | Bin 0 -> 33778 bytes ...x-saherelm.xchma.oscillator.helper.lib.ex5 | Bin 0 -> 32648 bytes .../x-saherelm.xobd.oscillator.helper.lib.ex5 | Bin 0 -> 6726 bytes .../x-saherelm.xrsi.oscillator.helper.lib.ex5 | Bin 0 -> 14368 bytes .../x-saherelm.xtd.oscillator.helper.lib.ex5 | Bin 0 -> 7998 bytes ...saherelm.xtest.provider.indicators.lib.ex5 | Bin 0 -> 79708 bytes .../x-saherelm.xtest.provider.inputs.lib.ex5 | Bin 0 -> 11266 bytes .../x-saherelm.xtest.provider.lib.ex5 | Bin 0 -> 83324 bytes .../x-saherelm.xtm.indicator.helper.lib.ex5 | Bin 0 -> 8864 bytes .../MQ5/Experts/x-saherelm.test.ea.mq5 | 192 + .../x-saherelm.xchlh.oscillator.mq5 | 838 + .../x-saherelm.xchma.oscillator.mq5 | 1153 ++ .../Indicators/x-saherelm.xobd.oscillator.mq5 | 328 + .../Indicators/x-saherelm.xrsi.oscillator.mq5 | 358 + .../Indicators/x-saherelm.xtd.oscillator.mq5 | 465 + .../Indicators/x-saherelm.xtm.indicator.mq5 | 349 + .../MQ5/Libraries/x-saherelm.alert.lib.mq5 | 197 + .../MQ5/Libraries/x-saherelm.class.lib.mq5 | 3991 +++++ .../MQ5/Libraries/x-saherelm.common.lib.mq5 | 3584 ++++ .../MQ5/Libraries/x-saherelm.draw.lib.mq5 | 2220 +++ .../MQ5/Libraries/x-saherelm.http.lib.mq5 | 177 + .../MQ5/Libraries/x-saherelm.log.lib.mq5 | 161 + .../MQ5/Libraries/x-saherelm.models.lib.mq5 | 187 + .../MQ5/Libraries/x-saherelm.nn.lib.mq5 | 258 + ...x-saherelm.xchlh.oscillator.helper.lib.mq5 | 925 ++ ...x-saherelm.xchma.oscillator.helper.lib.mq5 | 1535 ++ .../x-saherelm.xobd.oscillator.helper.lib.mq5 | 417 + .../x-saherelm.xrsi.oscillator.helper.lib.mq5 | 424 + .../x-saherelm.xtd.oscillator.helper.lib.mq5 | 917 ++ ...saherelm.xtest.provider.indicators.lib.mq5 | 2316 +++ .../x-saherelm.xtest.provider.inputs.lib.mq5 | 82 + .../x-saherelm.xtest.provider.lib.mq5 | 1073 ++ .../x-saherelm.xtm.indicator.helper.lib.mq5 | 319 + BKPS/OLD/EURUSD-5M-V0.1/Version.txt | 1 + .../OLD/XAU5/Classes/x-saherelm.class.lib.ex5 | Bin 0 -> 9752 bytes BKPS/OLD/XAU5/Classes/x-saherelm.nn.lib.ex5 | Bin 0 -> 4016 bytes .../XAU5/Classes/x-saherelm.provider.lib.ex5 | Bin 0 -> 11550 bytes BKPS/OLD/XAU5/Experts/x-saherelm.xau5.ea.ex5 | Bin 0 -> 279900 bytes .../x-saherelm.xama.indicator.helper.lib.ex5 | Bin 0 -> 8296 bytes ...x-saherelm.xchlh.oscillator.helper.lib.ex5 | Bin 0 -> 8402 bytes ...x-saherelm.xchma.oscillator.helper.lib.ex5 | Bin 0 -> 7812 bytes .../x-saherelm.xfi.oscillator.helper.lib.ex5 | Bin 0 -> 7484 bytes .../x-saherelm.xlh.indicator.helper.lib.ex5 | Bin 0 -> 7200 bytes .../x-saherelm.xobd.indicator.helper.lib.ex5 | Bin 0 -> 7406 bytes .../x-saherelm.xrsi.oscillator.helper.lib.ex5 | Bin 0 -> 8538 bytes .../x-saherelm.xtd.oscillator.helper.lib.ex5 | Bin 0 -> 8052 bytes .../x-saherelm.xtm.indicator.helper.lib.ex5 | Bin 0 -> 7186 bytes .../x-saherelm.xts.oscillator.helper.lib.ex5 | Bin 0 -> 7796 bytes .../Indicators/x-saherelm.xama.indicator.ex5 | Bin 0 -> 14216 bytes .../x-saherelm.xchlh.oscillator.ex5 | Bin 0 -> 47602 bytes .../x-saherelm.xchma.oscillator.ex5 | Bin 0 -> 51260 bytes .../x-saherelm.xctimer.indicator.ex5 | Bin 0 -> 11804 bytes .../Indicators/x-saherelm.xfi.oscillator.ex5 | Bin 0 -> 12306 bytes .../Indicators/x-saherelm.xlh.indicator.ex5 | Bin 0 -> 15364 bytes .../Indicators/x-saherelm.xobd.indicator.ex5 | Bin 0 -> 16678 bytes .../Indicators/x-saherelm.xrsi.oscillator.ex5 | Bin 0 -> 19320 bytes .../Indicators/x-saherelm.xtd.oscillator.ex5 | Bin 0 -> 19266 bytes .../Indicators/x-saherelm.xtm.indicator.ex5 | Bin 0 -> 14342 bytes .../Indicators/x-saherelm.xts.oscillator.ex5 | Bin 0 -> 36878 bytes .../XAU5/Libraries/x-saherelm.alert.lib.ex5 | Bin 0 -> 8240 bytes .../XAU5/Libraries/x-saherelm.common.lib.ex5 | Bin 0 -> 6444 bytes .../XAU5/Libraries/x-saherelm.draw.lib.ex5 | Bin 0 -> 8358 bytes .../XAU5/Libraries/x-saherelm.http.lib.ex5 | Bin 0 -> 3290 bytes .../OLD/XAU5/Libraries/x-saherelm.log.lib.ex5 | Bin 0 -> 7132 bytes .../XAU5/Libraries/x-saherelm.models.lib.ex5 | Bin 0 -> 6566 bytes ...-saherelm.xau5.provider.indicators.lib.ex5 | Bin 0 -> 36934 bytes .../x-saherelm.xau5.provider.inputs.lib.ex5 | Bin 0 -> 27698 bytes .../x-saherelm.xau5.provider.lib.ex5 | Bin 0 -> 36854 bytes .../Ex4/Experts/x-saherelm.ea.ex4 | Bin 0 -> 122876 bytes .../Ex4/Indicators/x-saherelm.ma.ex4 | Bin 0 -> 9556 bytes .../Ex4/Indicators/x-saherelm.xrange.ex4 | Bin 0 -> 10704 bytes .../Ex4/Indicators/x-saherelm.xtpow.ex4 | Bin 0 -> 12694 bytes .../Ex4/Libraries/x-saherelm.dialog.ex4 | Bin 0 -> 21464 bytes .../Ex4/Libraries/x-saherelm.draw.lib.ex4 | Bin 0 -> 7218 bytes .../Libraries/x-saherelm.indicator.lib.ex4 | Bin 0 -> 8046 bytes .../Ex4/Libraries/x-saherelm.lib.ex4 | Bin 0 -> 7270 bytes .../Ex4/Libraries/x-saherelm.log.lib.ex4 | Bin 0 -> 5064 bytes .../Ex4/Libraries/x-saherelm.models.lib.ex4 | Bin 0 -> 4890 bytes .../Ex4/Libraries/x-saherelm.signal.lib.ex4 | Bin 0 -> 19232 bytes .../Ex4/Libraries/x-saherelm.x.signal.lib.ex4 | Bin 0 -> 11452 bytes .../Libraries/x-saherelm.xr.signal.lib.ex4 | Bin 0 -> 10450 bytes .../Libraries/x-saherelm.xtpw.signal.lib.ex4 | Bin 0 -> 11350 bytes .../MQ4/Experts/x-saherelm.ea.mq4 | 1116 ++ .../MQ4/Indicators/x-saherelm.ma.mq4 | 173 + .../MQ4/Indicators/x-saherelm.xrange.mq4 | 294 + .../MQ4/Indicators/x-saherelm.xtpow.mq4 | 275 + .../MQ4/Libraries/x-saherelm.dialog.mq4 | 110 + .../MQ4/Libraries/x-saherelm.draw.lib.mq4 | 2010 +++ .../Libraries/x-saherelm.indicator.lib.mq4 | 450 + .../MQ4/Libraries/x-saherelm.lib.mq4 | 1695 ++ .../MQ4/Libraries/x-saherelm.log.lib.mq4 | 91 + .../MQ4/Libraries/x-saherelm.models.lib.mq4 | 155 + .../MQ4/Libraries/x-saherelm.signal.lib.mq4 | 1756 ++ .../MQ4/Libraries/x-saherelm.x.signal.lib.mq4 | 1063 ++ .../Libraries/x-saherelm.xr.signal.lib.mq4 | 1142 ++ .../Libraries/x-saherelm.xtpw.signal.lib.mq4 | 1332 ++ BKPS/OLD/XAUUSD-15M-V1.0/Version.txt | 1 + BKPS/OLD/XEU5-0/Classes/.gitkeep | 0 .../XEU5-0/Classes/x-saherelm.class.lib.mq5 | 10286 ++++++++++++ BKPS/OLD/XEU5-0/Classes/x-saherelm.nn.lib.mq5 | 258 + BKPS/OLD/XEU5-0/Documents/.gitkeep | 0 BKPS/OLD/XEU5-0/Documents/Reports/.gitkeep | 0 BKPS/OLD/XEU5-0/Documents/Settings/.gitkeep | 0 BKPS/OLD/XEU5-0/Documents/Settings/xeu5ea.set | Bin 0 -> 7562 bytes .../XEU5-0/Documents/Settings/xeu5ea.vbb.set | Bin 0 -> 7562 bytes .../XEU5-0/Documents/Settings/xeu5ea.vbd.set | Bin 0 -> 7562 bytes .../Settings/xeu5ea_just_xtam_and_xstfi.set | Bin 0 -> 18988 bytes ...5ea_just_xtam_and_xstfi_xtam_signaller.set | Bin 0 -> 18988 bytes .../Settings/xeu5ea_xtam_signaller.final.set | Bin 0 -> 18990 bytes .../xeu5ea_xtam_signaller_longs.final.set | Bin 0 -> 18992 bytes .../xeu5ea_xtam_signaller_shorts.final.set | Bin 0 -> 18992 bytes .../Settings/xeu5ea_xtsfi_signaller.final.set | Bin 0 -> 7576 bytes .../xeu5ea_xtsfi_signaller_longs.final.set | Bin 0 -> 8324 bytes .../xeu5ea_xtsfi_signaller_shorts.final.set | Bin 0 -> 7578 bytes BKPS/OLD/XEU5-0/Documents/Settings/xts.tpl | Bin 0 -> 7966 bytes BKPS/OLD/XEU5-0/Experts/.gitkeep | 0 .../OLD/XEU5-0/Experts/x-saherelm.xeu5.ea.ex5 | Bin 0 -> 191218 bytes .../OLD/XEU5-0/Experts/x-saherelm.xeu5.ea.mq5 | 347 + BKPS/OLD/XEU5-0/Helpers/.gitkeep | 0 .../x-saherelm.xama.indicator.helper.lib.mq5 | 607 + ...x-saherelm.xchlh.oscillator.helper.lib.mq5 | 1032 ++ ...x-saherelm.xchma.oscillator.helper.lib.mq5 | 2229 +++ .../x-saherelm.xfi.oscillator.helper.lib.mq5 | 358 + .../x-saherelm.xlh.indicator.helper.lib.mq5 | 668 + .../x-saherelm.xobd.indicator.helper.lib.mq5 | 249 + .../x-saherelm.xrsi.oscillator.helper.lib.mq5 | 433 + .../x-saherelm.xtd.oscillator.helper.lib.mq5 | 931 ++ .../x-saherelm.xtm.indicator.helper.lib.mq5 | 598 + .../x-saherelm.xts.oscillator.helper.lib.mq5 | 1179 ++ BKPS/OLD/XEU5-0/Indicators/.gitkeep | 0 .../Indicators/x-saherelm.xama.indicator.mq5 | 353 + .../x-saherelm.xchlh.oscillator.mq5 | 753 + .../x-saherelm.xchma.oscillator.mq5 | 1153 ++ .../Indicators/x-saherelm.xfi.oscillator.mq5 | 317 + .../Indicators/x-saherelm.xlh.indicator.mq5 | 346 + .../Indicators/x-saherelm.xobd.indicator.mq5 | 390 + .../Indicators/x-saherelm.xrsi.oscillator.mq5 | 397 + .../Indicators/x-saherelm.xtd.oscillator.mq5 | 465 + .../Indicators/x-saherelm.xtm.indicator.mq5 | 349 + .../Indicators/x-saherelm.xts.oscillator.mq5 | 558 + BKPS/OLD/XEU5-0/Libraries/.gitkeep | 0 .../XEU5-0/Libraries/x-saherelm.alert.lib.mq5 | 200 + .../Libraries/x-saherelm.common.lib.mq5 | 4429 +++++ .../XEU5-0/Libraries/x-saherelm.draw.lib.mq5 | 2345 +++ .../XEU5-0/Libraries/x-saherelm.http.lib.mq5 | 177 + .../XEU5-0/Libraries/x-saherelm.log.lib.mq5 | 261 + .../Libraries/x-saherelm.models.lib.mq5 | 438 + BKPS/OLD/XEU5-0/Providers/.gitkeep | 0 ...-saherelm.xeu5.provider.indicators.lib.mq5 | 9201 +++++++++++ .../x-saherelm.xeu5.provider.inputs.lib.mq5 | 321 + .../x-saherelm.xeu5.provider.lib.mq5 | 1370 ++ BKPS/OLD/XEU5-0/Settings/.gitkeep | 0 BKPS/OLD/XEU5-0/Templates/.gitkeep | 0 .../FundedNext.XEU5.Guarded.Signals.txt | 548 + BKPS/OLD/XEU5/Classes/.gitkeep | 0 .../OLD/XEU5/Classes/x-saherelm.class.lib.mq5 | 10316 ++++++++++++ BKPS/OLD/XEU5/Classes/x-saherelm.nn.lib.mq5 | 258 + .../XEU5/Classes/x-saherelm.provider.lib.mq5 | 4430 +++++ BKPS/OLD/XEU5/Documents/.gitkeep | 0 BKPS/OLD/XEU5/Documents/Reports/.gitkeep | 0 BKPS/OLD/XEU5/Documents/Settings/.gitkeep | 0 BKPS/OLD/XEU5/Experts/.gitkeep | 0 BKPS/OLD/XEU5/Experts/x-saherelm.xeu5.ea.mq5 | 347 + BKPS/OLD/XEU5/Helpers/.gitkeep | 0 .../x-saherelm.xama.indicator.helper.lib.mq5 | 607 + ...x-saherelm.xchlh.oscillator.helper.lib.mq5 | 1032 ++ ...x-saherelm.xchma.oscillator.helper.lib.mq5 | 2229 +++ .../x-saherelm.xfi.oscillator.helper.lib.mq5 | 358 + .../x-saherelm.xlh.indicator.helper.lib.mq5 | 668 + .../x-saherelm.xobd.indicator.helper.lib.mq5 | 249 + .../x-saherelm.xrsi.oscillator.helper.lib.mq5 | 433 + .../x-saherelm.xtd.oscillator.helper.lib.mq5 | 931 ++ .../x-saherelm.xtm.indicator.helper.lib.mq5 | 598 + .../x-saherelm.xts.oscillator.helper.lib.mq5 | 1179 ++ BKPS/OLD/XEU5/Indicators/.gitkeep | 0 .../Indicators/x-saherelm.xama.indicator.mq5 | 353 + .../x-saherelm.xchlh.oscillator.mq5 | 753 + .../x-saherelm.xchma.oscillator.mq5 | 1153 ++ .../Indicators/x-saherelm.xfi.oscillator.mq5 | 317 + .../Indicators/x-saherelm.xlh.indicator.mq5 | 346 + .../Indicators/x-saherelm.xobd.indicator.mq5 | 390 + .../Indicators/x-saherelm.xrsi.oscillator.mq5 | 397 + .../Indicators/x-saherelm.xtd.oscillator.mq5 | 465 + .../Indicators/x-saherelm.xtm.indicator.mq5 | 349 + .../Indicators/x-saherelm.xts.oscillator.mq5 | 558 + BKPS/OLD/XEU5/Libraries/.gitkeep | 0 .../XEU5/Libraries/x-saherelm.alert.lib.mq5 | 200 + .../XEU5/Libraries/x-saherelm.common.lib.mq5 | 4429 +++++ .../XEU5/Libraries/x-saherelm.draw.lib.mq5 | 2345 +++ .../XEU5/Libraries/x-saherelm.http.lib.mq5 | 177 + .../OLD/XEU5/Libraries/x-saherelm.log.lib.mq5 | 261 + .../XEU5/Libraries/x-saherelm.models.lib.mq5 | 438 + BKPS/OLD/XEU5/Providers/.gitkeep | 0 ...-saherelm.xeu5.provider.indicators.lib.mq5 | 13599 ++++++++++++++++ .../x-saherelm.xeu5.provider.inputs.lib.mq5 | 280 + .../x-saherelm.xeu5.provider.lib.mq5 | 1370 ++ BKPS/OLD/XEU5/Settings/.gitkeep | 0 BKPS/OLD/XEU5/Settings/xeu5.longs.vbb.set | Bin 0 -> 7584 bytes BKPS/OLD/XEU5/Settings/xeu5.shorts.vbb.set | Bin 0 -> 7584 bytes BKPS/OLD/XEU5/Settings/xeu5.vbb.set | Bin 0 -> 7566 bytes BKPS/OLD/XEU5/Templates/.gitkeep | 0 .../XUSCHF5/Classes/x-saherelm.class.lib.ex5 | Bin 0 -> 9642 bytes .../XUSCHF5/Classes/x-saherelm.nn.lib.ex5 | Bin 0 -> 4622 bytes .../Classes/x-saherelm.provider.lib.ex5 | Bin 0 -> 12298 bytes .../XUSCHF5/Experts/x-saherelm.xuschf5.ea.ex5 | Bin 0 -> 262270 bytes .../x-saherelm.xama.indicator.helper.lib.ex5 | Bin 0 -> 7932 bytes ...x-saherelm.xchlh.oscillator.helper.lib.ex5 | Bin 0 -> 7842 bytes ...x-saherelm.xchma.oscillator.helper.lib.ex5 | Bin 0 -> 8014 bytes .../x-saherelm.xfi.oscillator.helper.lib.ex5 | Bin 0 -> 7592 bytes .../x-saherelm.xlh.indicator.helper.lib.ex5 | Bin 0 -> 7750 bytes .../x-saherelm.xobd.indicator.helper.lib.ex5 | Bin 0 -> 7530 bytes .../x-saherelm.xrsi.oscillator.helper.lib.ex5 | Bin 0 -> 8180 bytes .../x-saherelm.xtd.oscillator.helper.lib.ex5 | Bin 0 -> 7938 bytes .../x-saherelm.xtm.indicator.helper.lib.ex5 | Bin 0 -> 7640 bytes .../x-saherelm.xts.oscillator.helper.lib.ex5 | Bin 0 -> 7548 bytes .../Indicators/x-saherelm.xama.indicator.ex5 | Bin 0 -> 12944 bytes .../x-saherelm.xchlh.oscillator.ex5 | Bin 0 -> 46938 bytes .../x-saherelm.xchma.oscillator.ex5 | Bin 0 -> 50722 bytes .../x-saherelm.xctimer.indicator.ex5 | Bin 0 -> 10820 bytes .../Indicators/x-saherelm.xfi.oscillator.ex5 | Bin 0 -> 12570 bytes .../Indicators/x-saherelm.xlh.indicator.ex5 | Bin 0 -> 15234 bytes .../Indicators/x-saherelm.xobd.indicator.ex5 | Bin 0 -> 16438 bytes .../Indicators/x-saherelm.xrsi.oscillator.ex5 | Bin 0 -> 19554 bytes .../Indicators/x-saherelm.xtd.oscillator.ex5 | Bin 0 -> 19390 bytes .../Indicators/x-saherelm.xtm.indicator.ex5 | Bin 0 -> 13428 bytes .../Indicators/x-saherelm.xts.oscillator.ex5 | Bin 0 -> 37722 bytes .../Libraries/x-saherelm.alert.lib.ex5 | Bin 0 -> 8844 bytes .../Libraries/x-saherelm.common.lib.ex5 | Bin 0 -> 6322 bytes .../XUSCHF5/Libraries/x-saherelm.draw.lib.ex5 | Bin 0 -> 8008 bytes .../XUSCHF5/Libraries/x-saherelm.http.lib.ex5 | Bin 0 -> 4344 bytes .../XUSCHF5/Libraries/x-saherelm.log.lib.ex5 | Bin 0 -> 7802 bytes .../Libraries/x-saherelm.models.lib.ex5 | Bin 0 -> 5924 bytes ...herelm.xuschf5.provider.indicators.lib.ex5 | Bin 0 -> 34150 bytes ...herelm.xuschf5.provider.indicators.lib.mq5 | 9466 ++++++++++- ...x-saherelm.xuschf5.provider.inputs.lib.ex5 | Bin 0 -> 27664 bytes ...x-saherelm.xuschf5.provider.inputs.lib.mq5 | 10 +- .../x-saherelm.xuschf5.provider.lib.ex5 | Bin 0 -> 33186 bytes Projects/XUSCHF5/Settings/XCHMACC.set | Bin 0 -> 8182 bytes Projects/XUSCHF5/Settings/XCHMAMN.set | Bin 0 -> 8186 bytes Projects/XUSCHF5/Settings/XCHMAMX.set | Bin 0 -> 8184 bytes Projects/XUSCHF5/Settings/XOBDLH.set | Bin 0 -> 8172 bytes Projects/XUSCHF5/Settings/XSI.set | Bin 0 -> 8176 bytes Projects/XUSCHF5/Settings/XTAM.set | Bin 0 -> 8180 bytes Projects/XUSCHF5/Settings/XTD.set | Bin 0 -> 8184 bytes Projects/XUSCHF5/Settings/XTSFI.set | Bin 0 -> 8172 bytes Projects/XUSCHF5/Settings/longs.vbb.set | Bin 8156 -> 8140 bytes 261 files changed, 138615 insertions(+), 352 deletions(-) create mode 100644 BKPS/OLD/EURUSD-5M-V0.1/EX5/Experts/x-saherelm.test.ea.ex5 create mode 100644 BKPS/OLD/EURUSD-5M-V0.1/EX5/Indicators/x-saherelm.xchlh.oscillator.ex5 create mode 100644 BKPS/OLD/EURUSD-5M-V0.1/EX5/Indicators/x-saherelm.xchma.oscillator.ex5 create mode 100644 BKPS/OLD/EURUSD-5M-V0.1/EX5/Indicators/x-saherelm.xobd.oscillator.ex5 create mode 100644 BKPS/OLD/EURUSD-5M-V0.1/EX5/Indicators/x-saherelm.xrsi.oscillator.ex5 create mode 100644 BKPS/OLD/EURUSD-5M-V0.1/EX5/Indicators/x-saherelm.xtd.oscillator.ex5 create mode 100644 BKPS/OLD/EURUSD-5M-V0.1/EX5/Indicators/x-saherelm.xtm.indicator.ex5 create mode 100644 BKPS/OLD/EURUSD-5M-V0.1/EX5/Libraries/x-saherelm.alert.lib.ex5 create mode 100644 BKPS/OLD/EURUSD-5M-V0.1/EX5/Libraries/x-saherelm.class.lib.ex5 create mode 100644 BKPS/OLD/EURUSD-5M-V0.1/EX5/Libraries/x-saherelm.common.lib.ex5 create mode 100644 BKPS/OLD/EURUSD-5M-V0.1/EX5/Libraries/x-saherelm.draw.lib.ex5 create mode 100644 BKPS/OLD/EURUSD-5M-V0.1/EX5/Libraries/x-saherelm.http.lib.ex5 create mode 100644 BKPS/OLD/EURUSD-5M-V0.1/EX5/Libraries/x-saherelm.log.lib.ex5 create mode 100644 BKPS/OLD/EURUSD-5M-V0.1/EX5/Libraries/x-saherelm.models.lib.ex5 create mode 100644 BKPS/OLD/EURUSD-5M-V0.1/EX5/Libraries/x-saherelm.nn.lib.ex5 create mode 100644 BKPS/OLD/EURUSD-5M-V0.1/EX5/Libraries/x-saherelm.xchlh.oscillator.helper.lib.ex5 create mode 100644 BKPS/OLD/EURUSD-5M-V0.1/EX5/Libraries/x-saherelm.xchma.oscillator.helper.lib.ex5 create mode 100644 BKPS/OLD/EURUSD-5M-V0.1/EX5/Libraries/x-saherelm.xobd.oscillator.helper.lib.ex5 create mode 100644 BKPS/OLD/EURUSD-5M-V0.1/EX5/Libraries/x-saherelm.xrsi.oscillator.helper.lib.ex5 create mode 100644 BKPS/OLD/EURUSD-5M-V0.1/EX5/Libraries/x-saherelm.xtd.oscillator.helper.lib.ex5 create mode 100644 BKPS/OLD/EURUSD-5M-V0.1/EX5/Libraries/x-saherelm.xtest.provider.indicators.lib.ex5 create mode 100644 BKPS/OLD/EURUSD-5M-V0.1/EX5/Libraries/x-saherelm.xtest.provider.inputs.lib.ex5 create mode 100644 BKPS/OLD/EURUSD-5M-V0.1/EX5/Libraries/x-saherelm.xtest.provider.lib.ex5 create mode 100644 BKPS/OLD/EURUSD-5M-V0.1/EX5/Libraries/x-saherelm.xtm.indicator.helper.lib.ex5 create mode 100644 BKPS/OLD/EURUSD-5M-V0.1/MQ5/Experts/x-saherelm.test.ea.mq5 create mode 100644 BKPS/OLD/EURUSD-5M-V0.1/MQ5/Indicators/x-saherelm.xchlh.oscillator.mq5 create mode 100644 BKPS/OLD/EURUSD-5M-V0.1/MQ5/Indicators/x-saherelm.xchma.oscillator.mq5 create mode 100644 BKPS/OLD/EURUSD-5M-V0.1/MQ5/Indicators/x-saherelm.xobd.oscillator.mq5 create mode 100644 BKPS/OLD/EURUSD-5M-V0.1/MQ5/Indicators/x-saherelm.xrsi.oscillator.mq5 create mode 100644 BKPS/OLD/EURUSD-5M-V0.1/MQ5/Indicators/x-saherelm.xtd.oscillator.mq5 create mode 100644 BKPS/OLD/EURUSD-5M-V0.1/MQ5/Indicators/x-saherelm.xtm.indicator.mq5 create mode 100644 BKPS/OLD/EURUSD-5M-V0.1/MQ5/Libraries/x-saherelm.alert.lib.mq5 create mode 100644 BKPS/OLD/EURUSD-5M-V0.1/MQ5/Libraries/x-saherelm.class.lib.mq5 create mode 100644 BKPS/OLD/EURUSD-5M-V0.1/MQ5/Libraries/x-saherelm.common.lib.mq5 create mode 100644 BKPS/OLD/EURUSD-5M-V0.1/MQ5/Libraries/x-saherelm.draw.lib.mq5 create mode 100644 BKPS/OLD/EURUSD-5M-V0.1/MQ5/Libraries/x-saherelm.http.lib.mq5 create mode 100644 BKPS/OLD/EURUSD-5M-V0.1/MQ5/Libraries/x-saherelm.log.lib.mq5 create mode 100644 BKPS/OLD/EURUSD-5M-V0.1/MQ5/Libraries/x-saherelm.models.lib.mq5 create mode 100644 BKPS/OLD/EURUSD-5M-V0.1/MQ5/Libraries/x-saherelm.nn.lib.mq5 create mode 100644 BKPS/OLD/EURUSD-5M-V0.1/MQ5/Libraries/x-saherelm.xchlh.oscillator.helper.lib.mq5 create mode 100644 BKPS/OLD/EURUSD-5M-V0.1/MQ5/Libraries/x-saherelm.xchma.oscillator.helper.lib.mq5 create mode 100644 BKPS/OLD/EURUSD-5M-V0.1/MQ5/Libraries/x-saherelm.xobd.oscillator.helper.lib.mq5 create mode 100644 BKPS/OLD/EURUSD-5M-V0.1/MQ5/Libraries/x-saherelm.xrsi.oscillator.helper.lib.mq5 create mode 100644 BKPS/OLD/EURUSD-5M-V0.1/MQ5/Libraries/x-saherelm.xtd.oscillator.helper.lib.mq5 create mode 100644 BKPS/OLD/EURUSD-5M-V0.1/MQ5/Libraries/x-saherelm.xtest.provider.indicators.lib.mq5 create mode 100644 BKPS/OLD/EURUSD-5M-V0.1/MQ5/Libraries/x-saherelm.xtest.provider.inputs.lib.mq5 create mode 100644 BKPS/OLD/EURUSD-5M-V0.1/MQ5/Libraries/x-saherelm.xtest.provider.lib.mq5 create mode 100644 BKPS/OLD/EURUSD-5M-V0.1/MQ5/Libraries/x-saherelm.xtm.indicator.helper.lib.mq5 create mode 100644 BKPS/OLD/EURUSD-5M-V0.1/Version.txt create mode 100644 BKPS/OLD/XAU5/Classes/x-saherelm.class.lib.ex5 create mode 100644 BKPS/OLD/XAU5/Classes/x-saherelm.nn.lib.ex5 create mode 100644 BKPS/OLD/XAU5/Classes/x-saherelm.provider.lib.ex5 create mode 100644 BKPS/OLD/XAU5/Experts/x-saherelm.xau5.ea.ex5 create mode 100644 BKPS/OLD/XAU5/Helpers/x-saherelm.xama.indicator.helper.lib.ex5 create mode 100644 BKPS/OLD/XAU5/Helpers/x-saherelm.xchlh.oscillator.helper.lib.ex5 create mode 100644 BKPS/OLD/XAU5/Helpers/x-saherelm.xchma.oscillator.helper.lib.ex5 create mode 100644 BKPS/OLD/XAU5/Helpers/x-saherelm.xfi.oscillator.helper.lib.ex5 create mode 100644 BKPS/OLD/XAU5/Helpers/x-saherelm.xlh.indicator.helper.lib.ex5 create mode 100644 BKPS/OLD/XAU5/Helpers/x-saherelm.xobd.indicator.helper.lib.ex5 create mode 100644 BKPS/OLD/XAU5/Helpers/x-saherelm.xrsi.oscillator.helper.lib.ex5 create mode 100644 BKPS/OLD/XAU5/Helpers/x-saherelm.xtd.oscillator.helper.lib.ex5 create mode 100644 BKPS/OLD/XAU5/Helpers/x-saherelm.xtm.indicator.helper.lib.ex5 create mode 100644 BKPS/OLD/XAU5/Helpers/x-saherelm.xts.oscillator.helper.lib.ex5 create mode 100644 BKPS/OLD/XAU5/Indicators/x-saherelm.xama.indicator.ex5 create mode 100644 BKPS/OLD/XAU5/Indicators/x-saherelm.xchlh.oscillator.ex5 create mode 100644 BKPS/OLD/XAU5/Indicators/x-saherelm.xchma.oscillator.ex5 create mode 100644 BKPS/OLD/XAU5/Indicators/x-saherelm.xctimer.indicator.ex5 create mode 100644 BKPS/OLD/XAU5/Indicators/x-saherelm.xfi.oscillator.ex5 create mode 100644 BKPS/OLD/XAU5/Indicators/x-saherelm.xlh.indicator.ex5 create mode 100644 BKPS/OLD/XAU5/Indicators/x-saherelm.xobd.indicator.ex5 create mode 100644 BKPS/OLD/XAU5/Indicators/x-saherelm.xrsi.oscillator.ex5 create mode 100644 BKPS/OLD/XAU5/Indicators/x-saherelm.xtd.oscillator.ex5 create mode 100644 BKPS/OLD/XAU5/Indicators/x-saherelm.xtm.indicator.ex5 create mode 100644 BKPS/OLD/XAU5/Indicators/x-saherelm.xts.oscillator.ex5 create mode 100644 BKPS/OLD/XAU5/Libraries/x-saherelm.alert.lib.ex5 create mode 100644 BKPS/OLD/XAU5/Libraries/x-saherelm.common.lib.ex5 create mode 100644 BKPS/OLD/XAU5/Libraries/x-saherelm.draw.lib.ex5 create mode 100644 BKPS/OLD/XAU5/Libraries/x-saherelm.http.lib.ex5 create mode 100644 BKPS/OLD/XAU5/Libraries/x-saherelm.log.lib.ex5 create mode 100644 BKPS/OLD/XAU5/Libraries/x-saherelm.models.lib.ex5 create mode 100644 BKPS/OLD/XAU5/Providers/x-saherelm.xau5.provider.indicators.lib.ex5 create mode 100644 BKPS/OLD/XAU5/Providers/x-saherelm.xau5.provider.inputs.lib.ex5 create mode 100644 BKPS/OLD/XAU5/Providers/x-saherelm.xau5.provider.lib.ex5 create mode 100644 BKPS/OLD/XAUUSD-15M-V1.0/Ex4/Experts/x-saherelm.ea.ex4 create mode 100644 BKPS/OLD/XAUUSD-15M-V1.0/Ex4/Indicators/x-saherelm.ma.ex4 create mode 100644 BKPS/OLD/XAUUSD-15M-V1.0/Ex4/Indicators/x-saherelm.xrange.ex4 create mode 100644 BKPS/OLD/XAUUSD-15M-V1.0/Ex4/Indicators/x-saherelm.xtpow.ex4 create mode 100644 BKPS/OLD/XAUUSD-15M-V1.0/Ex4/Libraries/x-saherelm.dialog.ex4 create mode 100644 BKPS/OLD/XAUUSD-15M-V1.0/Ex4/Libraries/x-saherelm.draw.lib.ex4 create mode 100644 BKPS/OLD/XAUUSD-15M-V1.0/Ex4/Libraries/x-saherelm.indicator.lib.ex4 create mode 100644 BKPS/OLD/XAUUSD-15M-V1.0/Ex4/Libraries/x-saherelm.lib.ex4 create mode 100644 BKPS/OLD/XAUUSD-15M-V1.0/Ex4/Libraries/x-saherelm.log.lib.ex4 create mode 100644 BKPS/OLD/XAUUSD-15M-V1.0/Ex4/Libraries/x-saherelm.models.lib.ex4 create mode 100644 BKPS/OLD/XAUUSD-15M-V1.0/Ex4/Libraries/x-saherelm.signal.lib.ex4 create mode 100644 BKPS/OLD/XAUUSD-15M-V1.0/Ex4/Libraries/x-saherelm.x.signal.lib.ex4 create mode 100644 BKPS/OLD/XAUUSD-15M-V1.0/Ex4/Libraries/x-saherelm.xr.signal.lib.ex4 create mode 100644 BKPS/OLD/XAUUSD-15M-V1.0/Ex4/Libraries/x-saherelm.xtpw.signal.lib.ex4 create mode 100644 BKPS/OLD/XAUUSD-15M-V1.0/MQ4/Experts/x-saherelm.ea.mq4 create mode 100644 BKPS/OLD/XAUUSD-15M-V1.0/MQ4/Indicators/x-saherelm.ma.mq4 create mode 100644 BKPS/OLD/XAUUSD-15M-V1.0/MQ4/Indicators/x-saherelm.xrange.mq4 create mode 100644 BKPS/OLD/XAUUSD-15M-V1.0/MQ4/Indicators/x-saherelm.xtpow.mq4 create mode 100644 BKPS/OLD/XAUUSD-15M-V1.0/MQ4/Libraries/x-saherelm.dialog.mq4 create mode 100644 BKPS/OLD/XAUUSD-15M-V1.0/MQ4/Libraries/x-saherelm.draw.lib.mq4 create mode 100644 BKPS/OLD/XAUUSD-15M-V1.0/MQ4/Libraries/x-saherelm.indicator.lib.mq4 create mode 100644 BKPS/OLD/XAUUSD-15M-V1.0/MQ4/Libraries/x-saherelm.lib.mq4 create mode 100644 BKPS/OLD/XAUUSD-15M-V1.0/MQ4/Libraries/x-saherelm.log.lib.mq4 create mode 100644 BKPS/OLD/XAUUSD-15M-V1.0/MQ4/Libraries/x-saherelm.models.lib.mq4 create mode 100644 BKPS/OLD/XAUUSD-15M-V1.0/MQ4/Libraries/x-saherelm.signal.lib.mq4 create mode 100644 BKPS/OLD/XAUUSD-15M-V1.0/MQ4/Libraries/x-saherelm.x.signal.lib.mq4 create mode 100644 BKPS/OLD/XAUUSD-15M-V1.0/MQ4/Libraries/x-saherelm.xr.signal.lib.mq4 create mode 100644 BKPS/OLD/XAUUSD-15M-V1.0/MQ4/Libraries/x-saherelm.xtpw.signal.lib.mq4 create mode 100644 BKPS/OLD/XAUUSD-15M-V1.0/Version.txt create mode 100644 BKPS/OLD/XEU5-0/Classes/.gitkeep create mode 100644 BKPS/OLD/XEU5-0/Classes/x-saherelm.class.lib.mq5 create mode 100644 BKPS/OLD/XEU5-0/Classes/x-saherelm.nn.lib.mq5 create mode 100644 BKPS/OLD/XEU5-0/Documents/.gitkeep create mode 100644 BKPS/OLD/XEU5-0/Documents/Reports/.gitkeep create mode 100644 BKPS/OLD/XEU5-0/Documents/Settings/.gitkeep create mode 100644 BKPS/OLD/XEU5-0/Documents/Settings/xeu5ea.set create mode 100644 BKPS/OLD/XEU5-0/Documents/Settings/xeu5ea.vbb.set create mode 100644 BKPS/OLD/XEU5-0/Documents/Settings/xeu5ea.vbd.set create mode 100644 BKPS/OLD/XEU5-0/Documents/Settings/xeu5ea_just_xtam_and_xstfi.set create mode 100644 BKPS/OLD/XEU5-0/Documents/Settings/xeu5ea_just_xtam_and_xstfi_xtam_signaller.set create mode 100644 BKPS/OLD/XEU5-0/Documents/Settings/xeu5ea_xtam_signaller.final.set create mode 100644 BKPS/OLD/XEU5-0/Documents/Settings/xeu5ea_xtam_signaller_longs.final.set create mode 100644 BKPS/OLD/XEU5-0/Documents/Settings/xeu5ea_xtam_signaller_shorts.final.set create mode 100644 BKPS/OLD/XEU5-0/Documents/Settings/xeu5ea_xtsfi_signaller.final.set create mode 100644 BKPS/OLD/XEU5-0/Documents/Settings/xeu5ea_xtsfi_signaller_longs.final.set create mode 100644 BKPS/OLD/XEU5-0/Documents/Settings/xeu5ea_xtsfi_signaller_shorts.final.set create mode 100644 BKPS/OLD/XEU5-0/Documents/Settings/xts.tpl create mode 100644 BKPS/OLD/XEU5-0/Experts/.gitkeep create mode 100644 BKPS/OLD/XEU5-0/Experts/x-saherelm.xeu5.ea.ex5 create mode 100644 BKPS/OLD/XEU5-0/Experts/x-saherelm.xeu5.ea.mq5 create mode 100644 BKPS/OLD/XEU5-0/Helpers/.gitkeep create mode 100644 BKPS/OLD/XEU5-0/Helpers/x-saherelm.xama.indicator.helper.lib.mq5 create mode 100644 BKPS/OLD/XEU5-0/Helpers/x-saherelm.xchlh.oscillator.helper.lib.mq5 create mode 100644 BKPS/OLD/XEU5-0/Helpers/x-saherelm.xchma.oscillator.helper.lib.mq5 create mode 100644 BKPS/OLD/XEU5-0/Helpers/x-saherelm.xfi.oscillator.helper.lib.mq5 create mode 100644 BKPS/OLD/XEU5-0/Helpers/x-saherelm.xlh.indicator.helper.lib.mq5 create mode 100644 BKPS/OLD/XEU5-0/Helpers/x-saherelm.xobd.indicator.helper.lib.mq5 create mode 100644 BKPS/OLD/XEU5-0/Helpers/x-saherelm.xrsi.oscillator.helper.lib.mq5 create mode 100644 BKPS/OLD/XEU5-0/Helpers/x-saherelm.xtd.oscillator.helper.lib.mq5 create mode 100644 BKPS/OLD/XEU5-0/Helpers/x-saherelm.xtm.indicator.helper.lib.mq5 create mode 100644 BKPS/OLD/XEU5-0/Helpers/x-saherelm.xts.oscillator.helper.lib.mq5 create mode 100644 BKPS/OLD/XEU5-0/Indicators/.gitkeep create mode 100644 BKPS/OLD/XEU5-0/Indicators/x-saherelm.xama.indicator.mq5 create mode 100644 BKPS/OLD/XEU5-0/Indicators/x-saherelm.xchlh.oscillator.mq5 create mode 100644 BKPS/OLD/XEU5-0/Indicators/x-saherelm.xchma.oscillator.mq5 create mode 100644 BKPS/OLD/XEU5-0/Indicators/x-saherelm.xfi.oscillator.mq5 create mode 100644 BKPS/OLD/XEU5-0/Indicators/x-saherelm.xlh.indicator.mq5 create mode 100644 BKPS/OLD/XEU5-0/Indicators/x-saherelm.xobd.indicator.mq5 create mode 100644 BKPS/OLD/XEU5-0/Indicators/x-saherelm.xrsi.oscillator.mq5 create mode 100644 BKPS/OLD/XEU5-0/Indicators/x-saherelm.xtd.oscillator.mq5 create mode 100644 BKPS/OLD/XEU5-0/Indicators/x-saherelm.xtm.indicator.mq5 create mode 100644 BKPS/OLD/XEU5-0/Indicators/x-saherelm.xts.oscillator.mq5 create mode 100644 BKPS/OLD/XEU5-0/Libraries/.gitkeep create mode 100644 BKPS/OLD/XEU5-0/Libraries/x-saherelm.alert.lib.mq5 create mode 100644 BKPS/OLD/XEU5-0/Libraries/x-saherelm.common.lib.mq5 create mode 100644 BKPS/OLD/XEU5-0/Libraries/x-saherelm.draw.lib.mq5 create mode 100644 BKPS/OLD/XEU5-0/Libraries/x-saherelm.http.lib.mq5 create mode 100644 BKPS/OLD/XEU5-0/Libraries/x-saherelm.log.lib.mq5 create mode 100644 BKPS/OLD/XEU5-0/Libraries/x-saherelm.models.lib.mq5 create mode 100644 BKPS/OLD/XEU5-0/Providers/.gitkeep create mode 100644 BKPS/OLD/XEU5-0/Providers/x-saherelm.xeu5.provider.indicators.lib.mq5 create mode 100644 BKPS/OLD/XEU5-0/Providers/x-saherelm.xeu5.provider.inputs.lib.mq5 create mode 100644 BKPS/OLD/XEU5-0/Providers/x-saherelm.xeu5.provider.lib.mq5 create mode 100644 BKPS/OLD/XEU5-0/Settings/.gitkeep create mode 100644 BKPS/OLD/XEU5-0/Templates/.gitkeep create mode 100644 BKPS/OLD/XEU5-0/Templates/FundedNext.XEU5.Guarded.Signals.txt create mode 100644 BKPS/OLD/XEU5/Classes/.gitkeep create mode 100644 BKPS/OLD/XEU5/Classes/x-saherelm.class.lib.mq5 create mode 100644 BKPS/OLD/XEU5/Classes/x-saherelm.nn.lib.mq5 create mode 100644 BKPS/OLD/XEU5/Classes/x-saherelm.provider.lib.mq5 create mode 100644 BKPS/OLD/XEU5/Documents/.gitkeep create mode 100644 BKPS/OLD/XEU5/Documents/Reports/.gitkeep create mode 100644 BKPS/OLD/XEU5/Documents/Settings/.gitkeep create mode 100644 BKPS/OLD/XEU5/Experts/.gitkeep create mode 100644 BKPS/OLD/XEU5/Experts/x-saherelm.xeu5.ea.mq5 create mode 100644 BKPS/OLD/XEU5/Helpers/.gitkeep create mode 100644 BKPS/OLD/XEU5/Helpers/x-saherelm.xama.indicator.helper.lib.mq5 create mode 100644 BKPS/OLD/XEU5/Helpers/x-saherelm.xchlh.oscillator.helper.lib.mq5 create mode 100644 BKPS/OLD/XEU5/Helpers/x-saherelm.xchma.oscillator.helper.lib.mq5 create mode 100644 BKPS/OLD/XEU5/Helpers/x-saherelm.xfi.oscillator.helper.lib.mq5 create mode 100644 BKPS/OLD/XEU5/Helpers/x-saherelm.xlh.indicator.helper.lib.mq5 create mode 100644 BKPS/OLD/XEU5/Helpers/x-saherelm.xobd.indicator.helper.lib.mq5 create mode 100644 BKPS/OLD/XEU5/Helpers/x-saherelm.xrsi.oscillator.helper.lib.mq5 create mode 100644 BKPS/OLD/XEU5/Helpers/x-saherelm.xtd.oscillator.helper.lib.mq5 create mode 100644 BKPS/OLD/XEU5/Helpers/x-saherelm.xtm.indicator.helper.lib.mq5 create mode 100644 BKPS/OLD/XEU5/Helpers/x-saherelm.xts.oscillator.helper.lib.mq5 create mode 100644 BKPS/OLD/XEU5/Indicators/.gitkeep create mode 100644 BKPS/OLD/XEU5/Indicators/x-saherelm.xama.indicator.mq5 create mode 100644 BKPS/OLD/XEU5/Indicators/x-saherelm.xchlh.oscillator.mq5 create mode 100644 BKPS/OLD/XEU5/Indicators/x-saherelm.xchma.oscillator.mq5 create mode 100644 BKPS/OLD/XEU5/Indicators/x-saherelm.xfi.oscillator.mq5 create mode 100644 BKPS/OLD/XEU5/Indicators/x-saherelm.xlh.indicator.mq5 create mode 100644 BKPS/OLD/XEU5/Indicators/x-saherelm.xobd.indicator.mq5 create mode 100644 BKPS/OLD/XEU5/Indicators/x-saherelm.xrsi.oscillator.mq5 create mode 100644 BKPS/OLD/XEU5/Indicators/x-saherelm.xtd.oscillator.mq5 create mode 100644 BKPS/OLD/XEU5/Indicators/x-saherelm.xtm.indicator.mq5 create mode 100644 BKPS/OLD/XEU5/Indicators/x-saherelm.xts.oscillator.mq5 create mode 100644 BKPS/OLD/XEU5/Libraries/.gitkeep create mode 100644 BKPS/OLD/XEU5/Libraries/x-saherelm.alert.lib.mq5 create mode 100644 BKPS/OLD/XEU5/Libraries/x-saherelm.common.lib.mq5 create mode 100644 BKPS/OLD/XEU5/Libraries/x-saherelm.draw.lib.mq5 create mode 100644 BKPS/OLD/XEU5/Libraries/x-saherelm.http.lib.mq5 create mode 100644 BKPS/OLD/XEU5/Libraries/x-saherelm.log.lib.mq5 create mode 100644 BKPS/OLD/XEU5/Libraries/x-saherelm.models.lib.mq5 create mode 100644 BKPS/OLD/XEU5/Providers/.gitkeep create mode 100644 BKPS/OLD/XEU5/Providers/x-saherelm.xeu5.provider.indicators.lib.mq5 create mode 100644 BKPS/OLD/XEU5/Providers/x-saherelm.xeu5.provider.inputs.lib.mq5 create mode 100644 BKPS/OLD/XEU5/Providers/x-saherelm.xeu5.provider.lib.mq5 create mode 100644 BKPS/OLD/XEU5/Settings/.gitkeep create mode 100644 BKPS/OLD/XEU5/Settings/xeu5.longs.vbb.set create mode 100644 BKPS/OLD/XEU5/Settings/xeu5.shorts.vbb.set create mode 100644 BKPS/OLD/XEU5/Settings/xeu5.vbb.set create mode 100644 BKPS/OLD/XEU5/Templates/.gitkeep create mode 100644 Projects/XUSCHF5/Classes/x-saherelm.class.lib.ex5 create mode 100644 Projects/XUSCHF5/Classes/x-saherelm.nn.lib.ex5 create mode 100644 Projects/XUSCHF5/Classes/x-saherelm.provider.lib.ex5 create mode 100644 Projects/XUSCHF5/Experts/x-saherelm.xuschf5.ea.ex5 create mode 100644 Projects/XUSCHF5/Helpers/x-saherelm.xama.indicator.helper.lib.ex5 create mode 100644 Projects/XUSCHF5/Helpers/x-saherelm.xchlh.oscillator.helper.lib.ex5 create mode 100644 Projects/XUSCHF5/Helpers/x-saherelm.xchma.oscillator.helper.lib.ex5 create mode 100644 Projects/XUSCHF5/Helpers/x-saherelm.xfi.oscillator.helper.lib.ex5 create mode 100644 Projects/XUSCHF5/Helpers/x-saherelm.xlh.indicator.helper.lib.ex5 create mode 100644 Projects/XUSCHF5/Helpers/x-saherelm.xobd.indicator.helper.lib.ex5 create mode 100644 Projects/XUSCHF5/Helpers/x-saherelm.xrsi.oscillator.helper.lib.ex5 create mode 100644 Projects/XUSCHF5/Helpers/x-saherelm.xtd.oscillator.helper.lib.ex5 create mode 100644 Projects/XUSCHF5/Helpers/x-saherelm.xtm.indicator.helper.lib.ex5 create mode 100644 Projects/XUSCHF5/Helpers/x-saherelm.xts.oscillator.helper.lib.ex5 create mode 100644 Projects/XUSCHF5/Indicators/x-saherelm.xama.indicator.ex5 create mode 100644 Projects/XUSCHF5/Indicators/x-saherelm.xchlh.oscillator.ex5 create mode 100644 Projects/XUSCHF5/Indicators/x-saherelm.xchma.oscillator.ex5 create mode 100644 Projects/XUSCHF5/Indicators/x-saherelm.xctimer.indicator.ex5 create mode 100644 Projects/XUSCHF5/Indicators/x-saherelm.xfi.oscillator.ex5 create mode 100644 Projects/XUSCHF5/Indicators/x-saherelm.xlh.indicator.ex5 create mode 100644 Projects/XUSCHF5/Indicators/x-saherelm.xobd.indicator.ex5 create mode 100644 Projects/XUSCHF5/Indicators/x-saherelm.xrsi.oscillator.ex5 create mode 100644 Projects/XUSCHF5/Indicators/x-saherelm.xtd.oscillator.ex5 create mode 100644 Projects/XUSCHF5/Indicators/x-saherelm.xtm.indicator.ex5 create mode 100644 Projects/XUSCHF5/Indicators/x-saherelm.xts.oscillator.ex5 create mode 100644 Projects/XUSCHF5/Libraries/x-saherelm.alert.lib.ex5 create mode 100644 Projects/XUSCHF5/Libraries/x-saherelm.common.lib.ex5 create mode 100644 Projects/XUSCHF5/Libraries/x-saherelm.draw.lib.ex5 create mode 100644 Projects/XUSCHF5/Libraries/x-saherelm.http.lib.ex5 create mode 100644 Projects/XUSCHF5/Libraries/x-saherelm.log.lib.ex5 create mode 100644 Projects/XUSCHF5/Libraries/x-saherelm.models.lib.ex5 create mode 100644 Projects/XUSCHF5/Providers/x-saherelm.xuschf5.provider.indicators.lib.ex5 create mode 100644 Projects/XUSCHF5/Providers/x-saherelm.xuschf5.provider.inputs.lib.ex5 create mode 100644 Projects/XUSCHF5/Providers/x-saherelm.xuschf5.provider.lib.ex5 create mode 100644 Projects/XUSCHF5/Settings/XCHMACC.set create mode 100644 Projects/XUSCHF5/Settings/XCHMAMN.set create mode 100644 Projects/XUSCHF5/Settings/XCHMAMX.set create mode 100644 Projects/XUSCHF5/Settings/XOBDLH.set create mode 100644 Projects/XUSCHF5/Settings/XSI.set create mode 100644 Projects/XUSCHF5/Settings/XTAM.set create mode 100644 Projects/XUSCHF5/Settings/XTD.set create mode 100644 Projects/XUSCHF5/Settings/XTSFI.set diff --git a/BKPS/OLD/EURUSD-5M-V0.1/EX5/Experts/x-saherelm.test.ea.ex5 b/BKPS/OLD/EURUSD-5M-V0.1/EX5/Experts/x-saherelm.test.ea.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..107055b8c3356c0897ed861f4586269c997a5860 GIT binary patch literal 201454 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 D17;-} literal 0 HcmV?d00001 diff --git a/BKPS/OLD/EURUSD-5M-V0.1/EX5/Indicators/x-saherelm.xchlh.oscillator.ex5 b/BKPS/OLD/EURUSD-5M-V0.1/EX5/Indicators/x-saherelm.xchlh.oscillator.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..619de7708e427b11442ebbc93ff9a8c4945effa9 GIT binary patch literal 48004 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%0D0*h)S{{?%LcDA+LhWr=^Y)4HI{xa< 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 literal 0 HcmV?d00001 diff --git a/BKPS/OLD/EURUSD-5M-V0.1/EX5/Indicators/x-saherelm.xchma.oscillator.ex5 b/BKPS/OLD/EURUSD-5M-V0.1/EX5/Indicators/x-saherelm.xchma.oscillator.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..abeb89c824680295ad92b50047bcd75767ce529a GIT binary patch literal 49154 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

bjWqAw zgm`1I2^ao@9h+D-nPJAUhHi?$qdQLQk@T_z!Fr8{tK5dpc4MWDchvjzGrwr>3k_1& zK(4k4pOUCs64;c3D3z)53PAXYX0gAOyXQ0eUTE+qTx{{HRN|N$x^3b}^%^QlP_kDd zp`TqUE?_a#CkvPZDq@T`q8Je&mm_ zst$Qg+R1k-Y?lK*N9Uf^=%et5h=mt?2yADoOLq3y?__mK9{b+TDEnvGvrz~37+nox z;I2*JAIvu&v1N44s~NIv2O_*-byq>|YdDN;qD7N~kZaq5d22n9 z&o}rahsp-FoN4v!NpFoC-9hgs3OTY)&20^*LQR|_uZIOg#vz;g+@1LKD=XuX4V`}Q7 zgG$R*#NAZPhrJxPmeCR%b2C!i%VvWCl&HQJMKG_u~xM<%=vMfRo3u3tn#?k zuG88l4}lfk@^>LfxD1(E(C-*CT2!NbUl1x@F_F~t#7iQSs4)Q1ExAmQV};Y!p(^}g zywq8Dora7+bF9L+hqydv$o_p}eBdQ=!ElX6T8pHEnY>H7qLk#S^3iw2==vlC!3gQM zl%bxu@;Nt-&d59XQ+SKd=&~!qMDWE5^^kV4x<5l?eGC2yLd|0Q$VM8&*dN6;bbWn6K}s89TJd~hrM=~81&U!-%FHXKMRhtJ=S4b;Qnb9Nu4k1 zN$+=e{W_m@-^`dhutQt4ZpO8?uk8SOae6(xh-NEe#7$212Oy{EbdBCcI-6ai=!v=< zocq)hvmxq+4hoiOp%LHWc0d+*2)kBCnysv@jCgZBDlzK8_zyF*hOyaP&+o2KcPgqT z4c)EmzlUEYS27deFC8*JiZ-K@nY&Qw>1_*8l&i%vBT)5E$GgzwjGQV;QNEG;*?SgnjG>XZB!6G{oiQ%R4NNB-S2N~sC;{fGC{iuAv5vYSOJ7tnQWFJ9g=*|#K2vAeU45F|(%$;I*2yGO^My-ay`MI}Oe4-<_K1>btn5S^;r2H)%%JQS;TPc;5%`=Bb z_+js!Pvb>fMf&8RpEQeWZho6CHEy0CbE09_HAsUs4tT%788DivS*m&9tU`6?iSG%1 za9U4%xUf~Fcq?tqyzkv$E5LnqjQCmggs-kSvx_U zM79g7^H~~JNYJy7L80ong{euA@A5AC`!Z*vt6s$(nyDJuQU~i+k+shtdaP>q=LM^+ z;uRf}G#w^%>c`>k3!2)aCwa&Mq8g_oT8>RabLY&QV2UWAik?_~hEj4CTmhO>G`)mjYLiFk zYA3ZkkF=?CVT-K%d^gDU*L_F-D1CP+2bw5MyXO)Z=@u7*XLvL``as*ESjA_lckaB; zBtX_pq)Og8$?-YsrAixnf}B(lDHS+|oj|awJWUfU$*;0+fMw8fVLawe2Jbh=r3#&W zn?DO?sZu%GuHFsjMypSR6uUB8L0DLZoG1LkvIFBVpDbX*9NK)Y@A5kGLiP2J^opqO zSqzf>rSJL@T+@7BZb~(0& zqHZS$(0tK5^!@9y8cP<*pq96t@F;yt5eplE5s$zG{8hjeS`MR^2D96_;Y8cExj2Wx zcXI9HsCyT`Dz-smNp*PJMg_{ek_$krA(x6azK^-$YtI>S{pHt-y&CCDzyG3=U-)5} zG|g;RJWFo=p_5pus|Ezx#)^$eAw0wCqOPCIx;@eX&z|rm<9^Rf8wfYd#^bz#TbfGV zSzmU>2|r4V-)EA7ceAC(A2;+i8@>Fr9&y5)bWD4#Lk%t?BFR+4E_6u4zEvFyvdV=prSzLBlDbXqx{q#vJ2xk-_B=3K&{q=OPWwMw%v< z+EE#?)gYcm+_PK}mlwng-HZSQv&G(cUI{m}%0?h?m zoH8a%A<`OKg!(a+Do>2|M52=R)dY3PlTlX>6Vi(1hObfe5R=z#_r#r>Z89Q(sNTtu z3p19=_m!U>_UmSr^9Dw?kSxZ!6$H^6w5orBZg|w{o60{7utr+cuT4Cv!MkRGVE+g6 CMKERn literal 0 HcmV?d00001 diff --git a/BKPS/OLD/EURUSD-5M-V0.1/EX5/Libraries/x-saherelm.xchlh.oscillator.helper.lib.ex5 b/BKPS/OLD/EURUSD-5M-V0.1/EX5/Libraries/x-saherelm.xchlh.oscillator.helper.lib.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..94b7af104509f8bbaecd21ab63dc4bc40e09d256 GIT binary patch literal 33778 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 YSWX)5sp$p9#hyX1Lr8IuPqEhj0y%b!#{d8T literal 0 HcmV?d00001 diff --git a/BKPS/OLD/EURUSD-5M-V0.1/EX5/Libraries/x-saherelm.xchma.oscillator.helper.lib.ex5 b/BKPS/OLD/EURUSD-5M-V0.1/EX5/Libraries/x-saherelm.xchma.oscillator.helper.lib.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..e40f6e6bc1c63c20c476ee4bf5075a6457225e00 GIT binary patch literal 32648 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 RW=$q=;OPZVsc_cX{tt|I4yFJA literal 0 HcmV?d00001 diff --git a/BKPS/OLD/EURUSD-5M-V0.1/EX5/Libraries/x-saherelm.xobd.oscillator.helper.lib.ex5 b/BKPS/OLD/EURUSD-5M-V0.1/EX5/Libraries/x-saherelm.xobd.oscillator.helper.lib.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..3a03aa3aad8148c593edf07cb823ce6295c158b6 GIT binary patch literal 6726 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 B$)ErL literal 0 HcmV?d00001 diff --git a/BKPS/OLD/EURUSD-5M-V0.1/EX5/Libraries/x-saherelm.xrsi.oscillator.helper.lib.ex5 b/BKPS/OLD/EURUSD-5M-V0.1/EX5/Libraries/x-saherelm.xrsi.oscillator.helper.lib.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..a2ea18d8512b3a9d5b59f2a4c8a47140437122ba GIT binary patch literal 14368 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 gMC<6XR%7oob+Nak85beV3N9=Tzl_| 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

rvUgX>2#eEm%Mb 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 literal 0 HcmV?d00001 diff --git a/BKPS/OLD/EURUSD-5M-V0.1/EX5/Libraries/x-saherelm.xtest.provider.lib.ex5 b/BKPS/OLD/EURUSD-5M-V0.1/EX5/Libraries/x-saherelm.xtest.provider.lib.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..1e5fed57d6237ccc227fef5d89dd1f15f1f9ef1d GIT binary patch literal 83324 zcmdSAV~{98(x)zuxD zRhgBQPq(ldGq63tJv<)>z;6NsIQp;hKlT4k4eN#l^8lX7&d`3qSa z|EHrMfGvO>fIEN#fH{CEfEj=j009640NwAw2tf5)R|L@ir5gXX3jqPQ?3VWMg+g0n2cRPZlVfkf^gBosxZM}q@BS6x6Mq{cV-!yFC*@bId`)&VuQB0 zRDxF!(bJcq66>zn#r*M8Bdn3rw@hXg<~#L4z>%PtfT#di!Ah0Q zU`{f?18RV5f~PTgLc7OER40X7q-H`Z_SokQbWph1Pr8ipuN}k~Axwl94Vy&Mi0FXf zc4$69lSFa_?Sccmt`Tx_#CyGYrHS0*lekO&Fg=;N}L-YfEQOr5tMP*qvdX6AAM|G!G4n zJsWhzOdYCZ>gsfyNX9Hjux@Oq(GFpJ8scW|PIMI-q+2+m-KBh(R^ogkae(~Fxxx`~ z)6%<2$$PUWoDkxyq#RH-i-6%+(qU&<%PP_`Vpzuz8T~5_Ao%f8gtBHz>d5nni6AgL{5GT5XX_ho4f zKHbhK2elLYzO0X$V&g7cXvn`8sv0QMx^^l1dMqK`VEchl-L#Smo#mK8W~dCu4;FSv zf(JZ#o$7J*vP`>vfL!0In}8WDR26fr&w)|@W}n+`&pEBI7?=X72PtP*HU9K_cH|6Ibl(KpfqCHrd3_AX6V2a*>sb;E*k$6{)%1E4zg^ZiBS<_A`Tv-%zAD zDHq^nHaX5m*>;mR_cM_$yujMI*G&n$yCcG0g~S&6vL(^DMYw-w7bTx62B!xKq8P~$ zBnF67uL^p0E2$whe+C$nQ{4Z?zznnwuHKutGy>O}20u8fo|zS;$aI5BG8+y;2ugr` z{Ov-9Ewc-T*Oy$bqqeZ5>*b!?Wf)#8Sfq}>u*cJ!bs}8aPO<6WF>j@wRf@zXgSOm2W_6IEt z$EksZ?bTV9f}1d!79YXgaRzJNWnT0J`AX(@>CYVr3LFQg?Q2>b2{YZ`G<2=#2T(DT z-r8;Ju||Iv%7)I(RIekWnzkF&&KUFvXkM~%Z?03zwYWp({31#Oczn)&{XT4iYcnmW zOCt)LNbp%D=AO(Tu0CfQdas)^q|+J1r0$Y2DCZI-o3DMkYz3orS5*=Fin$i6OSPHe zdcJ@kcfo~?dx~=BQBj6dV>Yg6Q7TDi85}kP1uDf;>!q06s)M)~^vkoOsS{_QBB;=0 z0FdVf>SENsY!IFb*!a`!WY;rxr*Ihv8`zynS171rb?2XjpB^JhwB9gr=9j<;WAPA> z=7|F5oMpnBMNf$Ic&Rtc)+qw3*L9kCme?`S>{tcqF*)+j0_gxWV8FRhlP-K-LZs!@ zfnnpl-Z?=;lcQQ^ZnS%_zJKY{rWyVE<5Qg@>~$^Y6?G4ldJ&^1jf2P{4jSGhY-DaSO4HPe0z}NF7+PV#ywVj?^>4>fv!WoI5$GBPr#+qKu8JD*4XkX-~_* z-ai4yzGMV@&c!U{w@FB)QEt}2dg%4Mc1cfO=#NE~{?rYmRc;9NDNs6C+1&O0yBRL0 z6x%5Mb_iOI8-x?+Jw!drj?}Evy4I=~W)U4jXy)6-Iwxt#e&fd1!YSCTWx2-BWGYan z(RIZpY}m+@2D~xWW(Ob2>jM*fzTL6TM23g6PT+M?{EuK z!d?^m!>7A$?{eq8{579rqBR7o@Fcezj2Qw03KZqu33|`xbxTTF6q2NaBuo7|GV5|+ zE5!fWv2azbH`G)YQ&1=l3a-M<$`&;VF(S!c5ghtWWJu7U+{YtiMA!5d6>9A#>cP{HsIZT0Vgj@`9n zHVhyn#lZIwatbpbD_f|a_7h8-J`5qaZX z!8wQIBhE793k*M?3@}!tm$<`0E80Uh0OO^c$QvrABnQj6+G{cG@WofEDb*65QkTO@ zv%>_)(GykuP;fUHC1b1g!REXKUo__LS2R)VUqPhT9NXsQ3jsBC}OK`35Nsqks zg_5dKX)^vZv$;L0x?WK7rAY-xm}*vP7=ov|lCTsuBzsZSz9KX6G4l %*7zifhbB zCI@F!r*nHMjM9vfx4qU~Q!gb4-2yPJPaU8N2e+}zbB~p_mQn|5VWE64YP!I-nn_y> z6>^yu_h767expT(@!h2b5Gi?=iye%)%8ouXL<^#gh`qpFmK9`Y3QU>NoY@+UVd&x} zZfWr)eXtr;%<)B}wU>y{)$B3VD#%aBLq8%;pQHxn1oU`f&*0q=Qqv*#rY)t0c}El4 zyY-~C@q@;#zMA_#IKbaD%e!l}^|o)AR5)wSgF^ox_8=t$a4n`i|7>GH-1Z)-hv?bJ zd>^|DAWX{C+WOrJ@{|J*E#TG;-Z-JA>~Z$gn{*8T@y_%-Tiqw~=-E8G5P6UbF5!=u4g7cB;&IP z@rwHFm!}NN&+*x4Op`r6_71|XJTXz>PqlK4)jvUhLjz!;T5;|_!1$dktxjb^Oh(Dj zR@KJUq@1Be56=PQt+asVx!Cb#UccP&_50>3pLL(NS`k*OT1SAbqiWd`>~|11Z|aBK zG4{FUuVs69X6K#4?s3aF%udChNIa$&rMvDiq>qsEFl5iECKh^Xv`RQ24he2zb_x3PG%N_BQ$UK^GL-U>s$qG=zeeREL~YxQ%4vYEFd95&bUQ?*jif4BxlIO z4ag9&z@ZjqO*NhXOGB|-nOZ1a4Y~_;k1aJRr!+VgXi!hSvSfhZ>6;GZ(3RU5$@ObQ z^qJQ&eO5$0(=h`?Y#K$L7TvUf@~%_dC}I%Sfly1D{QL#f#&OlYmG{Vjw61i0p>^IR z@?LWCfJl+4Q2upEfR<+|=u})6n@iS56`L%DNbpJpiB&_gO2J7w)3hY_oGxH?p6ep?JbH=6m*%us2cuCz7PszYM zh`+ufkx%Ob@S>Q){)M?_+?YQ|sx5-%g(wruUqi#a+J}5MlmL=56brp3O^blL@;WN? zRE}|98{6)%FzY!Gb_7zu8CNiTyE-+2W22Xn?-@hz~9RzJo3X!U4roLjsJfsjd^UzR#`GQcg?-tim7r z89vbj3fsuRIFE0mKdi_$yW)hv6{>kG-|EnYot)F96UofQSSgu=5TPX{BOC~l=&20a zO5rePLVHBFUN)_Y)?0M5=t)*`W#@6<_kXFu>)&Tu30%&CO1Zfs={;#Ru9@!itxZ1r zuS?8YPOyct5`3@;cqgd(`)7+*_~d@L92Dr6!4R096%;STv4WGgl$}THO_>=D*=J|} zK?rz48&AnHs&IQ=QH+PiCSp~zkhFw0y_GhW;Dwz9;u?v`G^$EaQM+r^ z+QY-#b)!lO@=-y=TsE;(AXNV;v0^wwG~B>lnskpVCb=-o&lEHBQLF7{m)zc!Ush$SJNTQxZ;cEK|$};-6z)GI8E;8%MWMVuNQw1;X=R*te1W$R9 z5un|ffQ9zFk!L=%!sX@{!HHAPx=D6r@EQ%A+rSKTug`~%z;D2!T%4s)ji!)DPv@{@ z@kk2iT%xWX1Hcx{xQo3!h$)sx%H)Es^tFgM$2>DAaETYy{7XmBEDJPojx6}Dgx$%Ch~#{CM>K~oUxIlI+mo{Kg*U~o%-GW76 zHt+sCA47D0gd)E&MW$f9K z%LAy3{Hu&^A^u4jtQXq1S)=!ig%GH`bmIZPyD#|uR?EzXwoq&EXC$;zvl6Ym@O+qA zvVF#o;>tn1rVa#HN_6XI!Ce&hSPoX757wN{B>(k5`q9KMZ~plPg_d}bk~K=)VM+X) z&S$b`+#DEY&0F?`V|E)|Zg2NC$Kl-h+5#YIPqL>|c#Ujy%SKx++-0a!>o72}duOE} z#a*FYTuPO$OlD-DAlv2~Ta!2vz2%*oxQ6c z_V`XopI}UtU|ge^ClCk6j*?N7jPC>H1&YDTj;C<5z-C7JoMdsz7{kNYp^ z_3cm_=ID7~?u!&0LkIt;U|K0zl(QafYw21Qc#H`x_V>sG_m)-pHy)Gb=0li9-AJgno_bnJ-J3i@cZ;Othx5!**BX6RF;*nnNP=!c= z_MgKEd$Bj2$cMuQ)%)z!`ZouE?tq)#0(q6amBU(`(l994u$^uSvkLt+KebCVq}IKR zEt;KvZTa)M9wk>1`F`)2mmuQh2|LoQ(#Ggg5A({=!|{pu0ysh)~VA>cD;$IpB9YL zuQEZ=j$BR7Y$*IsB6;gQ1GI~wLxA}ZyGN492S^LXW33Q4I1HlYIXUO2=Zg~(iMYS| zDHBhKWaG@qE3~XafI=8Fs9kt4b>; zE=T(wB7#Ex47WW#CJgqeV)YB0h(nm8TmDyQ35~-z3YZV^NX>Qz(mEAoeSjs@dDl))o)+@9M!Q&1*0SFn0PI zSBQWe)okRsl$ahUlotF&5Q%$KlO9~=Ll_ejF`XJ@HZ{=bK{;BEyq;b@=#o~Uubna$ zWB=4dzHb6R*CkqHBuT{KWy8Jcjz$Eppb$>ej@30c7wB`@T19a;QiQD-2uu$Sk%Vw% zt2v3xRU__wzXr$itY}N*%$g-`os19zh|}AhyCZS?>emea?^nTLI)huzoOwvW;H34t zRySeBTDxp)sNU-aGel5N9}P7|eB4VQK_z6(6ILDfAEGX{wq*nX1lG2{vd%s4teuUh zrLa~97VDbXh*UJu6qnoTlCgOq1%r7vJ*Ts|?Zz((@t_Si zf>MDFqerdDTP!96~a5t)wLi3*9Q%3FUk(v$-6qiK568ggKfnR;)BL=J1da= zm)DFCe=?T^c7zkcO@v##GUe4_`X5-$-~)~AWSDx{SqGgg1l2kWww4J2;fQ1Uj^2V` zQhHhk>Oa=KC2@TEaQrm$Xo>FeLqI``UbvT$555@gSZ~fVdUcMKYWYx{5Be^N* z7ao0Q{puNOC=%)Yv?oiW6Z*>V5ke43{cDfu$@%~;VSk5P?r-O?g3DwQg~SSn$(4Nw z7Iy3YX;_mmKC{H0=mH)i+gNXU5xeM7h}l>qQ94#m3^KrA?w-I&1)z%a50;0_ptjL9B5YNOjmLZfj7GL0t2rEo%<*PnpqCXnYtDEh zwtI6lb#PVfDg}=?h5e)fYPXmD!t5q4YBA9Fqj(+$r{HK`5~US!eSYOCY|UBP%zY0r z*itbr;m#?!1U%zh=*Fc-1?augrIkmW2bc#0Yr zWE+ia>#>l|Kmoy|i|WUYT5F+mQr0fud6h!rfQ@%(WVCRh84+sIZx6}wHF5Ja>_qMe|3%u-cO*otKp=a*O|s?<&? zUvxvfv9Of))oEpBu|;*aS-csTQpWU{^M~FiO5jO!-j@C*X809)Q#wn;7 z<_$S-)Uq{MxJ|W?o>%16ol=FWqhwr0Kj%G$>u1S!ngws@nG3#u#i+gUyrhcXk6mH| zc5mhM#Ak`}nQi_NRXnG^I4>M`j`17>!j6M*kqvXnduhGrVFUAPdXcRLUI z;48Z`KG;Ac>CNYCSI1m8*xmceIe>V}vGSF&?is#TJJ+bGcaJ?q9#5MFjdf9<8%ndT znv86*d7j-eS19p^i}9$rH80`qV8SduD0}WZeN|&)HcD9fs3N93D5nthS&y&GKBI7* zv7)KxF-WAMi+KUqe)wy_7>%$zhh6erR%X;^whax4pFTS9M5P6!HAijvZe|RFU}upT z`HgQ`Ir`5cf=jJzz8KyfO5qfcdvS`m2>|V1v3_WULsW}M9B5juWZ{-(>YkdE&oqdv zK@w=t>W&}5q|cq&OvBkBS1h+xe#b&4>aW~6 z)DsP*mJ`>g#Ob1XpnEHx^}UN&X}D7GfjXm0K6~vu)24PNaIWeb;+0d|Wjw{W4N*dX44)NrC*kipNWP!Zz-bH`s8+T)FyTqe3c@wgfdslXuUY4o6<%B$$+EKmV<5_@u`3y-ee2vXPIe? z+x19T^IPWPSSQ>Hw-D`PwUqP%mqZ;?++vn=u!~jvl==R$qFqjDiT-_Gp&Z!9sZr6G zoqa7ASxR*fM)F+uS&Bh=uAW9LDqgo!FTh1qVONn6=b0Hy`+iY0avk^q=p2FHutlhM zDDD26Jn(8iE9N;`WTyJh?-}DlYYjmjjSmccnkUh|j@FHS~a*>vrbAP2apRF#4W$IPBp6h( z^Yzg^>-UY64H?qgA;7s%(uaq}^HBdS-9r7a3y`XgxzHl(&CHp9Qb4s+kNDm~!u3vQ zkLC^&A)U~>^S{r{Ex`LFPN-w=nl1SewQgMHq%)|#)k5tgA-^yuQRUW{XX7o{YBXz! zUMX|x+dDps)V;$!X|cU>Ds3hY)922HZ!3Aqaa$y19214$uMg)9^k7q(HfQxRPL}L+ z0A-VL5GQ?4LS5(o*qvu<4mkLMV6eN8{|R;jXFPY6_<;EDvf{bv_Rf8H+xklMu2 z{#~dB2&OBwkJ)x5n+_5j7vl)O_RTINi{q|DLrLKi&f&yw@>)Bhpeo zK-M@-fYs0ykTu#@8<4v1>1%T5MIjv|ywDr!eY1=W#Zug7iV?+hv*~O;&CvJk!J*O0 z)Uo4=m4kN*f)*oW;P@F}XF}Nt8A0p}?)wgXFrnN9USaI#r<}$I8ImvPz)=#@S&u^%wsX#RSqm?H;2U4%?}-n2eaE#FwN! z%|f1g4Q$c&iHfQ{a-AD6IFGlcSc?gfP=&p9Z7s_$lp)2OUwAq#Qq##EWL+f^HeeMK z;Br$hmgBh{Q6Mk(mMHi$-H{$^AIU@dkLHW3Z|IA)`8rBT#9BL0C5`K$4KXPQ=w#4i-$on-P zKV@3-TDmK64J`aD|3V>tzgfGm&~1}=?6roekN6YGc6xoN6Xp#T>z5R<*=?A~d|5ZA zcwE{GPeg>L>LYQ={B3;lD1g$bgXPqP@m9$O+tK~Bu zNu5B`8uL{{CFh~4$6U}LH{_>Jm^ZpguZDe!}iq${?{TRTpE`r&%O_fagqiAl?-nPKZtE)n9 zcP&*)z7gpAVI#b>f=1!}F&+r>1N9CqI)W|ij4E{T>=w{Q0e@5>;&TH)T4MPipoa$$ zXJ92f-waU;g!P#1m6;oLRO89yhB@AQQe6(>0eqVW5RGWCp=`Ai81XH*=E=Qojtkt( zxHOK;Is{sT-fdVTT4KIHNrECWHJ%m~VU+b)CFgF7yaZYwJz0Fa*PU@@N3mkSZe=@3 z@jrM%$3TJ67=%Q}A4WT{LaejSSxV0pPO~ch(#0tmD6r0CXgcQAp&5r;a(}IB09O;3 zoGy}!83$_);^B`=dI(&?Hk*BwG&kG)W!EjjR}g(4j>x%rL3wfaJ6kO)_zaLv$vj2f zCHN%WPi9oEblG=vl`lUc@zWNa;CUi}`d3b2pp2H}c!WC9xuljZymGZ)pc_}g+Ov-0 z`{J>(*3IwE@Kvq^#{q2(mMTZZvg!W*0~?;I7a8#&9-09wYVww2ISjP{**_H&VuE_J zb0@HD6i_}SVFMlrOrRO984$#@F|xFoqJczDA>}4o8yvdPi;07=^JMElV}FID=NUgf z8S!rw{iOhnkS}ysBf~bljeLkRj#LjiPIcl3#9Me3=7KMR9>{Jk6LmsHk*pO)$*)TL z@kq-cG4D8zKAomFZ85k?ez-Kj{rjA6m_34R8^A23PKO$~S#5rLPa}VD4Z2ieTk(K-b;4Yvi;XPv`9E#-LaR;s z&*Z;iksAC0uU2w5+<0SSsri4-?>4bewF@*FRZ)9LnuU1ITCj68eWuZGmuZ-C7`wU9 zwPoni+8YSP=qCcw9CPQhz@87{vNDfEw8HU$r`9%);XIcluHuN|!t&?9fB?33QT zXKTMuw2M7H50f$@a0V$^$d<#Rl&~RRvyvHBP7HS$i=ALh6wjYWKOB>vKR+Ui9nNmL z5i?`+6b^P+856LsjIJtyms%7xvrlYeYof^ThLSt@GV_rhUZ>qEAMnMqnTUN3Q3%&A zqaGcjO!CS9PV#n6H?c#(CV-_=&OIy}wWKKAa|U*V+Tbslz2}2V^ZvVI`5qRnk`qV5 zrLK^xCA>{(%ws9#v^_FTGJ zA5o-WHelc;;iiwKc{mP$NcWWt7iv?^7l=}a#h5yK$f8Xk@qi(fr(?FBJ>?t*{mbu3 zTXbh!ld`*9P;KZIXkk?UCWQ4{Xuzv_;+AXAlb_qQ#{jw7jiUdZ|76CHK!g4BG9k}q ztli*`5$A@f@bF6;>o>phhXm6&>YEQlHow1-p)12H4P=G9#DS4bJGP6l3K_NHu10ro zgN;wIe3wlfyvbuF%`ILzBwKXanis@XqmaHgX~_?RU88Lxb0?j;QH|X07EjzF_AFO> zC`P+YwJloogVMHV1ItE)LbboPyz>fGq0=Mlfp0$7&t_m_T^B(P--S1J`oO0zp1pkdVWk*%mkyVyA4Lh(>=h zYb%U^-=J@y@Fbsq)QUS8kV)Go_p3=3slE%O*hT`W??>4xtQY%tERa(}DY_tpjL1(j z6iBYUjQE#|a+(9&d!`pTo4@Y&dyeZ1ad3}251L>7Pxpf=_XhD)$F@@>&VgX%UQoff zLN?omRD+!DRo9KnCI&6RM*-WzzCvgwcQ=xp%e;5J>-HgHg#m%c2kMlEuzPGgYf%*%1GT{0hx@Yo*Ai z*hw}K6Q^_NOhTfEM>K)io?wbi7Mq$YW(uGGBHysrU*AQ*HGr)_gZ5TUFbbv0yWJcR zMKZrOXw(NIj~_;V37kgLX+8uJm$m9NFw4HqL^IbWc7;obY(r65^n-@psNb*P%isg^ z>6l$!ayhK~>uS~|a-j~L37eXDUq_Tdv>Kzy%|r4SXVSUeS`Ad@{wK=Rd*r0R1ymzp zmC{pFVqnbE#(2Z?`EtAUe&{p`K#ucIsl&L;0CK-c_#KI>>LIm52O{sM4cP$IB9R(= z*9c~_7wrhh7ia3Q07JI~rl>1g6-Y%H0kZ@XV;yc9oUU9w=dO&@mdx4;^MlE@3D$f; zP_R|a%bbk0B!3DQYzu*>KTAh%5|LZqKa6obxv`la82Qg^(03~l|3Izp=(IqPaONn- zQzf8*W9$5u6s4Si30ZH1e$8COHe3a=p>tvPbCQm} zUj3O&L<7ZA`emW#kk#PFRU`V_4kDw2SAmaFt=D+ zot3R#itz7TJY-PYI7j+iBrMQ2Zs{VAYfH=zyfYm58%)DK2o5v2UWpjte+TH^6n2A= z3MyCe5zUB%IX&XbMFk7J$|xPzCIzkCT{@Hh;lGGxf&U@!$=7ou4LSh2*F}_^0#Px` z`2p$ngp>W&gm!2GD&~6;K>3yU&!Pm!7qEhE5N$i5!O|pH^BP>h{dNj=;08~FDe5i| zoIq2Od1Jx`BCjC|mQEr^%jH+aDn+IN;{@opW~*tQopy+lLcn-?zyVsqjN$r0axrHe z;JwJ4(_u16Dj|p=VG?wb*w0);W5yQAw^ydS?T`iMk<9$+nilcfCLNX9gr})$L0RXR z8S)5?)y@uP!7yGzr~^~`i%j4P_2xY)x%Nnjd}iz_jg}IqRUKrVQn)6>KGWym{~!IE z@vXIC#bfeDjz8=_Wc!|_N(l_tJ&e*%zTmS;6E9CgK*OEF2gpZ*{#r#k0Y@S)LLk$^`8$!IYNBw-RE<@lg(HFt-O@O|wbwy{=OA8f)Bb*c zV%26)f9-$ROF4TbGku&)KU=>u)z|LcD5L^q`B+KTU8))4@A@B)ign|&h%M?!+*vtE zSt#3Q>2uOSWsnU;orfYsD?ITg*F|@i%cQ!41bhgklzq%)F^S)@X@lB+y%%lL4!Fi( z%*U2|7cW#5FM)w3A`QCIav|i0S{X;gDm{PaeFTXNRwkvBVPiT(KvzAkG?JV+SSJEnxvQF3R#Pq875*c~ zpNv1qaO8Aimj%ctl}Q{WD9>mrGXy&##ER-ZgL-nQyu4Y*$7Xa_pd(XQ-a2H3 zzQQBgo;XwQC_jYqb7IL7jTEvP%&gY;DDt=AQ#kqv>8%1$`80;XR2^)W;l00BMo ztBPEBP5=>}SAb_%HgF!c0E2qx->qp|`Bx}q#((VJB*mHLf+osjmJcJARDFdzf}9i7Q8b=mZ^hI&>xQO6|JA8Vs*vncU0emBODRVTKiSNVV}|;a^Y~@GBhg$ zpwg3XsbaB<SNoV_Z?LI)^o&5#O?31;f<(la+?mjURxt0uR`_*+N0>L-yQpD4QkRv0(u_9jt^^ zzA|KL1TA1ydun0Xg$4ha|InZEo4(h1bOlsop~7vnZB|5&E2}*K;(zjbvlGu^bRit3 z7sFr>Pn>`K9}Db;0xW`ZDVviK8rl9A2FnI7 z7ixRp3YkFXKOZtF(z6q!ggzT*rv7jNii-YjXIJXc%=Ta~(A8L{+BLZk-h^=i3qms! z|HJ=C6q#8(+FcWFCfsO>S;#GQk>WJLZ}&^hN+6qgfr&>Ta<7C;1-*Z zU8GW_OA8ea>As`8Pq$lh@WSVHX8w#$BkUd3OsdPy~_ zqcIJu9wpuN5Z$_Dp3<4uJn-z*@SS1e!b^dDKb?N?uCk`K9F#xcLsP5zdI79;miXwO z{XiUrmKeIyUQX2OIRZIsR~V=(ns|qk8V)k)1IW0WlPi{&KppUt{p>54DljiSd&H=t zh*Qn)C;VA4IS3iOINFK=5KY{~GeO}|i^!;f;!kKaLRe>dShz$Re*F(FdLrqDWc=v= z#s9+N|Dqo$(XY%qbI3bM4Vl0l0$~?@EO?rT$Ev5NSfXQY=nnR^Hv@__RH-CEBQrj&W`USXXsX`fvFMMeq)eWmEZ&KM^jNtIw}O zplX1YzyUkUMripmDQdMXs0wD7Zo+h+vCjfKD;M8LB!snGWQs&MVvT?2NP?(JA~`@# z4T}`4Dgnn3+*EDV2${g}wLON%#?WP3?9u;m0VqNqRvwj?uCmxx+Kv~){Q)@bkut&M z#YHxQ+YP&)9*pV=)4JpiVGcMXgtj1jb`zXA8LLVhD16 zZ#6qA2CIYuGbT!bO_2axXll;dAqDWs_Ou_d;y#h9tT(y18B#2}#Swdp^Lzbf?fp^GA&q z|HdjtJvu<5|6@4tOl9^}$lxxcFpdSi>wf-t<8$lbyp#ay^i^ldfs03CS{DwUQgM-B zFZfTTzSZjXX+ph*#TnPEr4*keOA6lJVj&SUWBC#NOzY>Om?G&C#4S%Iu2I^*D@!P* z;DSnnc$v$OZq>8yz0_|p%TWF-D)@j$CbE>F$k9GOhWIeNo7p}jDv~@hcx; zKw(HmqTF;tej`R0?RA|qfJt*b)frsNRV)h(1S*%vn4=4kS^uqq3}f%aGptB9`OEKq z3jALIT;O64Nr$~r9;yjS$F{KhWF<@9B|~_s4{gc@PCv~|I4go7<^7&3Hj4dpb`&Vv zVPpM19g*EO;w*ID2yuj*(j*S-zUSrhzTJV9QOb z3+#XqwV%SZ30Jv7O9p~gO{IER+>93f#sI&%Y{vVvDIve)%nYt_9a`Vm8n$k#5|%I| z?JoF$aHJM%c}5XxY$LUmcw6BNw9_B+vKq9E`%%WQTO5pW&?kHnm%uF144@QFmr& z6-bLs_-V)-YxH1U;|)q2hy;WA5tU35=cQeRGWu*K7d0wm5*ya$&h#&ZC~d=ODFylE z<_PBr)5L{9U)$F1$h2CGT6CY=%9E|1e&(sxTW1)<&=0ngSM0!6YS{Ecr!HiE+C9-o z+#$2PaFW_x`lykM}{OL%ph610Uxox0oa9b!Zm-@x$dy|p+ zOFPa4okijWr_>+DVB=d3|8W8vWiaddK*}H#*{>DyyS5VU{SDT{Lk39pgSwg>WjNpK zKT8P3nNfNFwf`95Ls*>Bo>f&J7VvM6s$J4RoUo_lPwBw zP85pu4UXKtkbJ(^0CVGV#pDY6O*vqq+l4_^+%MG=9obpN^HsPi8<|&9EZXG%VwZtvB-{j^YVa@mU&I$dIqk_x z+xC!Q)w5G${4zy*1Yd=X6J+#KxkPS2O|Km(`pG{>zvDRl@l|of7-W`B+1!Xbli@nA zJAvDjc0%RSP$aKWIOE0)$%f~#Pp1C&65oXkec6+Uz&$P){FLwpKc5;@nc1FuHYdp5 zAXeb?|JwgmVCK>u*|4VpIroSrh?`52!lCI(j0Na1hIvSa+)~i_gW3w^JvrqSD0Wmx z%HRL69t2*FupvoH+o6VUk5w~#DXmNANZp}$)d3yYv;m6e%`}@#BNj?r6QK@dUblE# z0+r-`s+k=FMtx6Dev}P+?&z+1#D2VYkr!dX{SenM7W{3ITDg}u-{KmE9%xJ+uF5=` zmc)AXUxC~GG}%8LlOlRO;XFmwfG$XYLKtMO%HqB~UZt45pSPGr*piw)F>rE?3+*!NK$u#DT5li=&V!k|zC#=2KiwdH!|Jm>Xjfr3j^MW@fw3d5{_o}nZ(yDY0U z>mk|L&*Ad$GqpeOpOTgbfS*IcSZ?I#BRmBdCL zbMfw)h!>};9qoZI>s(H#?LfB_4w(Q!M+g?jR|^nl^&EdY$&-v1!0x8OfXU|1+x@vw z^mf}X(ZnYb32!gbiQrZg$kbD#qV)wuFo_oe@9){N^|K=JaZ*l`^`JJT1T_B7sjMQx zcif=DAup6I_pn)8Vj-Fn#gz8>$P*vKd7dyF6NnoYnlt20WAcaE{9Bvq{(h8uV^ZU2 zQ=*LREfC6Fb%MSFuh+Jv!9%f%{kgWSCE+Dp;Nx)nLt?SZd zgCn3-&x!p(-lG!B(OQMYUCh+-E|942k|voV&?R_SEsl*bh-4P z3Q}wegsh!m9Op<7x$uBKM9`21?bUU9RI3pGQP4*s0%EzP>MtEBYaHi^^;4P&Q5RU` z9!-6|GYUhD7gJ(U;Rcs8J24lPFCluoP@0(AH>LsJW5y8!Zi4^8z+)3Wiq#uilTe9g z)rbb9!#25Gq}Y->OHp>KJJRLt1mzCif?5l|Wy%pg$3q{=zHRfh1`+ewWECCSv)rz# z_>KSL3_ROZ^bQZ1Eav?$@wdQ(Jmd)E+-m=<$%f3Md0FhYfK`n11{@APKM-S%ZX`zC zk1AUHZxA`{IZv*lAA4e5K@-Z{?y?h0;Vg+B+U=oJZu^oD*M2C4^3@*O6|5@77b?8T zqLhl>wculq9 zHAYBh{>DG*m$>W(3TWN?AatvfgsW~3I7Jqt*bt4V9`@aEP#tD+;8H^Ce7veo(}W4A zikikF!rhKfv@W*1aUbZqu{$55vpmg8L42-DF82;67DR!8WLF0Sm^;jRR3 zu*o+_P=7#Gji%kajw*1T>B%H-jsC6n2tw)|t5>Lf5ttP|E$df4awYbcsrP}TaPOo2 z!ub2;b~;b#2{)3OYmdHneLdHk_H-)-gau;2K+_!NyXq1T-b#ZQWgJ5R```9Kuz9K? zWD@jfx)>>o^<%j80npC5#S}Fwl}hFFU*0sWr9MIPJ0f@c;yiT`!>Jv*i$riw9>Q6K z$tOwdT0^fA6fFSK$^Wq0DOx&YpEG9rZA3E;+7(3#v)@%*)ao;YQIQ385bqU3ljluP zkoRSDmRwA4+;wO6?PD>W7JnQfkPFnUWN1*Cy#M6Q)vQpan)#g3vlfzS(HFl{sm=LY zXf(F}NB;_-e(X&PoKjscIsZ~OcrU3>Z*u9d^t*>(klZIDTp?w*qQCf; zQ(MF+;YZQ0|1AXl7RN*#al%sMm9Ihe_xG2^&=af!yhccd;bh9Zy91U!qs3s;5jj1FtqDxW9E6c1`5$U`bKL) zw2rT_Cm?P$S|;IXQ+9HlpfV|gcWdFDKk;mz^h9&zzxa>)Fa8K+;_?8W0kgRd`5YyA zN0PmM{rHd!G%K7Ex@ipQM$tjl(ttQC&|jZX!$Tm=gsdex9A|@Wg>)G8JU<$i_peX3 z=%0#=dV3kcU+vh4?_4Ky&EWU#Qc$J)bS33Fsq3kW#;%M7!Z3yn}P9Q*VO>hWK2rj|hgF|q4cXxujyL*t} z7Tn$4zv?G%X5N`Sdya4af;zgp>aOcr>s+gSDsKwDRWi&F%ITvPK304OPm&fJr;{1k zvnzFRDlExmCX{V|h@@;jzX<`C7s9E^Zl$WHt}a6y;;rR93smFfgA$7}-Tkf%bG}lp z(v|iSTDa9HmX<5J`Z2)q^qO$QbKNIB#?SK2eHBT}#wc5nm#ai8Qj31T3Aw%EIxU*& z3Sx}VAmT;x*KoeW!pD3Inod+WEF13^+Is5Srv2G(G-GdE>W3%BZC6Xl?Fguwn&W~VBC+0%7? zrY}HG{TsVvu+s87y!T{JA~P9J0Y@PVU8qDWYpWdWVq3fa0P4Q6XfYdEgcgjA6!PPI zoXM@!9R>f{+Bh5v9VbCQmOHc)nFfPg@5dlJ>{O#Rfm+CF6_*Wc6Y*(c;|gdtf)Q3n zkpAvU4X#MIIbnhbrPu!Jv+;!iE3>Zj)(;8y>n8SIo{-yY9DD?pRyZf&X{xF&(ifW| zmJmTlRcaJUOSbBXioAy`8+^aj?G)m-fc`}x>qg&OOUEKu67Z1fVQ1(u8;5^m-ja{x z)6@zJ=+AFO%Qx6C!PWCmL=?CVh%e+RY$(wO2p+fEtnEW;;N3kqV_}LYS530;iQf z`BEXuQC_=!0h)i;Ukb&$7Qgjx!mvX$v%FPZ^smDE{h? z+9f5W1jh+rYC2fS8Fp_}95Eh{j+YeGLK2q(siXXFClFV_PxY$P{o!ZmswlrxI6oJ; z`Wc>c`;St{a~|+`+2PM2#_+3_;;t6*M~B3ohQU!*VsCF^NNr?`IiJ%Biiz$iktgl{ zW@ywHc1QArgEAnGM~s&Mo2aQxU4HlKp5|iRXU?-NQ(S4df6_CwH3jBIUzKfU{d1Q4 zAN})%(>aa3=s)$}H3@edQtd9Mac~h**iiQ2mAEdk5J_~j^o+VL(@-O}Z z6JGT8@emc8k*CxA&-{hM1@d1Up9YBcG|JRTg-TYL(b9LBoW`EF;-3U2or&ay&xeS% zOH-IZ)VIi8VLxlzK z2l;Q%Ba7Jb9c+F?Q|*LxezXs^B18FoVpw1B;76S(vG953T)*14hWEVCNlpEe-)KGs zfuz5iIiNrN`TgY!P6@>B`WqP8jqRHZpe*#JwV;{rrX`a7WM{H&8FDVOKN83 zg7l}SGR&_B(d=d#a2xE;z10%OJ3^TibmCJYnCPDv`~2Q(&7xD$(^-2-`tY3MGx%4fo4_wszQ^XjukbGBS-z8*M;gizq4EOr=?>%;Cf4ZEUtQQKjf*yu;dmY=}-<=|O6 z>G`$9mXoSoPrVT{&a5U@3LjUTZ77&ge-Vf76OM!M*D+EwgOeEW8lgJ=&rjcFBJoE3 z6gfT+>lFEbkvv~Yo^_dwzh~MuwG^79O5{mwsM4Yt2Sbv7&VYWj2uv>c_H~p9_QZ}a z9zS9={6g9V7URNW5cO-ta;t?`FF`l04(r+huLaxZjkN_3f8YY;C@SV?_}FfcjP^y( z#2D_oP!s&4%!2z-21C~Scm6{4^z~+B7t=GXFJhz_ZK=^aVVcm^!xI7U9ai8)t$Q}) zqive{kFbB3KlYSu!3Z7##&LBTwnyBzsPWUnj8R+T_o|$X zp0iVK6?%xS-%Vs^jglk}=s!L`ju7|JuXb1OsWlUf2~M?4-eSn|2u!gz2A@Q;dTtu`zZjQfklk+p^G{ZGS2wC6rqW3O2duSLWZ4? z%NI6as4(L)-;p$=yw>!1vVbFW>XmlMPJeM7ox}j85*Nu+HO?rQA?ISbR|3=g%%Dym zmNs?(@7{mx&-YIe``g2%;yQ;v#zj!)c5hv?DT_#HjStBz(Y+{HfEd!V`e`>b!@6}qNBvKo>TwCD!7^H@% zRd~o=DSO}f%YgG&XfXD`YLjh4OvMfy|1ofaK)-o!%xjm{9k1;Iq<`SAj~OAunDx&p zSUr5><}_74Dv|Sl=9E@cxYlFLyV>RLGo25?55q>cVa&nHQAS$n>?%B99jRix$b0CD zk*F~=7x~#7$rqd06T;nEDkOnS09&KjTJ`o>Z7mPtdw*4uXTU%6*I)lRn%7trE(dN@ zyS>1La;o$-P?~4T(R!4I)6b*AgoDjs!uZ_?m{aY~vG2?O_@968zbTe8{aB)jAXP4I za)Yt}$hVrbUbaGo=wwt)yma8VQfr8^;7LKklCDACbffIlDfSiKxe{$icdG`B0SKPs z9)ISKtOHipNwD3dSD_go*bM0%dTX zKjH@E8{QRjt(YK~X-{(XI5NDftq;O0&=qq^hKc3c69sPWXOL4pg|5x3N@z5fyroe$ zDf@b_t2}ryBi2uzxI5X%3#+{a%zszqQ`ya_R5mRTYC%?{fy0`Rh06gf2wGGpOLjP@ z7C&ho7ds{KgzPAqc{dH0ox-;^`&n)Gl*RUJ4W~El5=aSM-A;{8k8>SVB$yIb8#$C% zX*?*dGhp>iiE|3v5OfNs!K%bRR@U!cac=n^ZzwXDa%(|24pb)-?+akr@?hN)-n_@S zL{vUvD_MvXn84~b^{fqG{gQ>h-lmusm2&g$$5UW}AGCrku7U9q#{36spBt&0o;BJj-eOKt8PS6lPPdN_G`{YZS$-tFIo?_#{i=G3Yn5= zIk-4|7A75pY#nIxO%gT+`mr9XZ4Rox_rH9V)rRUu!k53#|NcN5dSft4+U;{S2RCZw z6_1G&v|gFfx6>zv1vne5KtVTfiVoJDi6I%TXq910!kSq*|12-M?@z*4crr## z-n1DFz<)N3#H>h>*8U= zeWn>vyx6A9cRTK6_>NPXI&Lt|;-cU6?;EvZ;6>Gg?G6e#N+Z2mL{i`ezaH3A`q5?D zJ`Q=4zIh9eq^!9ZWW*Yz`u+uLO!g}?}FOkgZ*Y?*|k!bO+ToO!R5?_YXU0DJ@VT^MrF@o8 z>2ERvKbMg43ZHZ*4sbmlcr$&QhN|H_hfK(kp3F*i}KI@GiFzqB1URA zY+BgK!`?~g`6Rbw$!njx;iUK=){$7cvP>LGmy;GAOVq`*VY_7+gUqVRCo z7=4kdNGE}DQmx7HK=&X+=^ZQ_!2c>vo{#n6cSdvNqMT@uxXD$+5Q_7jvb8Cll{2k!`96PXuX_tfo*B!TZsAwOnocQT`O?2Dw zABg|!^Jj#pXX<$+!V!wqME%=r$*9`tVHg3}fBy1kp9LQF`xE$!pb$ERC5SgZc$WBc zjJ7d>~kZ^jGJ!KA>0Vppy9boVDV+)?YCM4PSS~wZpd}25uoR9 zLchEj0}<8$+V{#cP9IAIy^wZ7XWk|9;(S+8q5~CNamDBS2WuW90R|Dr);H3*qR=qA zx|ca6;m_g1KOBgIHuloV-aUq_u3oKL-DBGXHTJ>RDYw^9K64>6&x)r6T3vNur=sW} zW2hl-d1@W7{k{L&;dGhI@h(IVr@FrSxd&|(P{74W;@Re`JIdW^&$&h=#2Zg%UU9BmJshEzFbmeE}kJ@m{TEmFs-n*>5luL`yr=9cq#d#^tedU(PJuSI^FnV_P4!% z_<>|f==yodLM>sSz*-2U17 z0+x_vIL@A1n5(3rPN5vrCKa2MzQdRy|+NbkmBx{Drn-+D8cw466inu-gaNm1w3@cm5cJZqJAe@mWH zGx%$ir|A39H_a;UVJ?gxSedC0jkGzms|m&ulFW9k@fa+q(CXlmuG<2lkDh)2f9PMe z96^Z{9@{&C-DSqGR5gzgUddG+=J>ust;%j!8FCp6UwWa*u%h;f!+`gM$=(bte(1II zfY+4C26knRE$Zw0rj|*qA9R2DCnG3xk2lUkEyzhcC7Q?D`|)uZ4aVnr8g$4gHy^## z=C3FEa9bm}^1+~6_=WKbpX&lVf=$1U&q8B-g~&w&w_~?PWet6WJ`Y8$fnQUc^Vjk& zUDM!ch356oo4POd=>E8RM5c?p%cV?&kRv0W3x*k8_OaO6vEc9g9}~@*WwFUd=?qbT zJ@|D1iL>WQu|3O5kUOPYQA z>Vj?`)M8;+i2m+h0$HO4mC;1TRrj(UhS=_13J)3o_#gCF8_q=7c4JoU*f2~lPyg}x z^KX?5oK6Lp{gA84ru1jD4{`Bn4;^UMDq~_@TA@}nh97y^Vhz8qnOZqMN)W#&T#``C z5F=mQeRCdnH5qT9aj6?Vd9WOB8ITfARUFhoUVVci6z`yzvCBC6xDoq*=fAE)CC@0* z=8rEg;=q3i#|Qj2fOVv4qOB{s`oe$W=*%R~=BDre>&o_iF6Z{NlPIuz@MCLJg#Ay$ z=r&6!fWJ9@;6Dhx+*7kJs^IZzBqSW6fMWrBVZg7n!jkBEMyIx&-@Lc%sDz4S%~9M^UOOU2rA(uY6vesE2_D8g zFbOnNuT-XrYsVv*{;J8+g{>7*Z~Ss%^ew&kG==*|68sj)Ic5{RyNS$n=8fyAz)7gQ zNIkdHG<8u<@OBi^AO4cQ$A?;D8kN!<_q&MtI2ro8 z?&6M*Ke_w7W73LDFAKD+-tL)hyoc~!8$s?P2lPi$#lF+FSaQeLf6f2+O3DS`CYob= zZ?AFNn7zMs=a!6>Kq~pp^XoA^{ATlrTXHE}3Qt=j>cy8~-*}PJrS`=BHDLRzgNLm{ z7{fj{nhL}pS^5SC@s$KVSLNJzQN)VOh)s;r9cWH#q75dyy6NYg42T$f`WVg%3Cds4 zSJj8&TQzK=bULOUAz8T0`AF3+eo=@J(Erk9swh7;F4D$rNf4wd8iX5lkOvOX zMDFHc<*#_wQEm#9Q|P8VYI5Zmyg#FZC33SxA3wV!kj3ihM7d*3I+arBIJmkH1}l#c zA?qDQy;cd<@Ny<8{}lM?&PIQUfJA7hJe}t9MkQG7ZFpG?YTQ{LsYCkDe3g_CSMQZW zC9rI`7i+UI3yv5Vl~2@VPGgFLcmq;U*>+(T_d?+_bZUYZs_7_8QdF`}Gt__i6JImQ zfBc8P&wuq|RpW?Iod3KYv;$QGO--a@ohI?TTq%peEik3(mOjoJ<;eGh>A6@mcE zY9qo_N)Sm;E1rY@8{#4YfIo*yRRd!y-Ft?3lZ$qegnfsZf$FJuLEjL2@njW@UZ}0Y zi4P7fBiftjfM;pJw<~vY6^w+w`+XRL*POT^kLazEUV;3jx@`BiKJ|IFqWi5O8GM@? zvli1AA!FYD0#^3{6r(s-y4bm7a`@zKz<<<#k6WPty#Kbr#-HC^U63Q^>cjEYokKq* z-*)%&MtDwXst>s#zN;)n_$AmVcwOqQt@V%p0=@N{aVB4;2@`)z;VXSBnyP=5-u*t% z=9YI5&yf)ewTgd);s;q`N|+6yRz-={A#5Dd?xB^jCls3cGfHradNn{JdM6eP$RCXx zBS7l5wJEio(A?irVU?Jn3b)=N=_Bd?<9}dh3D+228=t4grq>%BWvS30AYQV2sLc2w zjrr)ZE{WDOo!B}`EiyR`b4wN`qv1#>r;6^%2-mOKhalX4Yc05O#WeqcLpJtN9d!Oz z+{4HW-V~|T+@2*`u$ z6vuj1#p==@jl%~!l9oJZ8+>p@b<{4@Vu zrwKS1V;&3q)nA)GD6Ghm5CQqWNOse8qW_Y=V)*p=z1hz_^;VG#CFs4<*cQklDmHYR zekr2(R|d8yOb1EO?{Dv`@Ts};?D^Ai#Lb~5zl)R=PUvEPDbu6;+~+jO(=M>sQh@(0 zyOwg%MR#tq`grQgv)6^WoEt+k+W*#*|2LO@nwd$GAO3=84Xv@8kN4Xs%_#~jlZynX z2C*g~v3!mqyQllg(Tdf6ql#0Dp9PoVDdtAw@?Qn}emI%7>qqV-3$x8E>R8PAybWEJ zp)qjJ5^18reDwO9LzQ}z!ml^7ksB|`Cd4#`#&g;4`*1NV`^{yJ{ZSj#qo%x6O9B5w0Tx`Vc}PtEM2C@HQ*td+#QB{5lepNv z^4sKtMaCx05f5aqf8%ernZjwLNBs0SLY1k`)Xr|ERM_Ev4f(t~?D$Xj4xCpuK< zE|HNjlqnnQ+t}_E-fn6*T1o!&!8D9H?`d~Tk-+xawAloSDQSfGC1je&u=QZVXP>^q z2%evLr2&32Igq%!1=rpWoTw0ge-{TbMfKI3Bv%yd^%u9%k|cKpXA(@8Trr#Q55Za| z@Gd7NbWbBt{)q6065`|N_qCEeIXh;Ugu@>R$awdAIz}*Gv?}nt9Cqbq%&GnECD=kG z=7YtW5t{Njbj^g85{Yk(Y&cB;{uQs&AUPD^Z)nl-&f{gvg7 zZ*^soUwg(%=gvo>5i(BqFb8~qYhG6uH!pB~(4cHncdBZNx*B9u9cZ!yw_!G2?fBeW1&rMxno%6if8soRmZUEt4hvqj;rOhM^gf2(Hxa z{ck~kF`t8`jR@oB$?HuQ(Ee+A2onP~=3kfd@iu)z!apS|Q?T6i{1a;+S{=o#(Y&5k zo9l_;Nsj7!M5HSY&#$xBQ$K{6)HK;}DNtI?Veq zp;(U@W+t*zAb(k3JzLt4K>iKtU6nHpz`qqzKxWSSX;uzy5o5gEC{&1X7mjpU#qg%6 z&;Awz{Lj39o&RMTBk9lpe-M6BPL@J87hzXFsF#bly&3a{jWO*TmZv0n1*@Y}@`-Im zz=x7lci*WsxuxhKmnI16zNp1X${U|fFS5^vbhv<_U)+w2dS|vEH#-G9TS!MG2hyNRcgG7Y$YMlV(AEzWz zLSKXF)1+5qfB*l_e{$lA$`MD=7({E!Wh>fDn zx_|M(>OTFX|K1UKX+|);?7eTH!do&qzUf#_i)}IvUY?cDxDl)4lobly_K@Gfp49Qe zAi@N02a8K$ripIsh0e(*_>ddO+2PAc=~Tyb}+|B=6bRkg)>gJW-JyW0J6Z$WTark!_G zZ7c3_L8_EJTo~(?*C%|gl0kxs$QBoP|EOr9CrswEhv>z&{iMN-N&xNO#$&x4Sq(Y= z@V5>z-_7y~zTu0-zxlbv{n338)i~aUJa|;@E^VU6S|ZKhm;m$qP&~Jm`OCZ{9*$Vr zrg2FE3adC0;*P?%4cBk6M1?rzd@CkU2GU*MuEztZ;VqRC*Jc!KWs&q?7jh7dEy(jr zyig2E=OOE)cxsyu?|Aou&v(AESn%t?xDMB+lOGHJClJ;**Fh<$M zn$GE>YuSPMd)PNr*y~#KD!r3hqau>Pu>9tWEA6syP_vcLOavE(5s3cylRf4%pmN)Vryoc^2tf)CqUfksqE}@K~#IjQv1n#NUqm)WHoPmEzzG$gGfjll%VdwQ>;O|h~_x;O>L_L=A?Y4Er8*BA5< z|CF&`gu$E@w)zc%+d%&ZY>c$?MUUNcl?gWyF_cJz@wVRs*!?W9|0wo_Ur9uJ{JkH8KPGEvP#u%)Vo7G!uw(@9ViTDbgykm-)Z# z|0-e~eK!!|mvK+$`n*n(7U%)9U8Jguqxcb(T8=5?%3HmJMv-%%{IOdn@760Dbj=vK zzm(SX)3tng2hZ0{m3I`1;9o|j1skv6P>?H$4s@z=kd3d>s@li$vtHYn3YfN1EoJ3C zy7Z*sli^(-EtV;F5|GWRX|wg^P z!R0=E%S*IQOQ8SjsX`}ojC24`nq_tFy}y(*>f*FgRW2FtAn5lucxciNeC=HzCFx># zwCS#aiDu7L-ub$*!ux2sZArdR92Rb0|2nVipdbPCZ?seU2J>|fq_rFk!@ALzq#9ea z4{N||N$E}tX zo#MBBsHis+W3NXh%ao|WeZSXMy-!-0ee66}MKQvNBJr^7S@MVr)X_Kl`pZr~q5=IQ zK6CEUx4Oc0@jIB4peJ9UrXHhrP2 z15o}D#Q*bc2ey04^ct_xml3Rd3Y6m#umBaQ zdJjL9#XyZ=Qd*UV5;C;yL+60u?|T*MEMcfrNAq9OgHC^x9;kMs#;E~^n0dP;vZQ93M^4S3;_+0NH@MDm&H#my0| zGrl#wjAVyeAq4o_oxz`#w*q*HwJ|}10ejF9A*`0=ybev&{gOmv%mSyUbqiK0V=5MtkYb_qwYG-%C?tjqdSY?#;jZ7&lo=o^Srue~_8~cm0V{%m0)e(k$gVlyS!8 zLR1|YsfQ^UMSyukISwM8azKv4mpRu2(BDU$n_3`& zlJ87Eey(_f>Am^&xh%5xoj3bYTPBFVJ~Rz7(x_6Qp5RVMlbiWn!56y-!@A{au8>Fb z^V9LVghb03ZA2A$LVwk?>gOEUUiQu5lMm(-Ra%99BQow#^`>RY&%Yp2#laQjaP=P! zHmUs{oz7g3TSY?b;eT3X<0+Zh*Y{zj7f)}{I#Za)eODE}8c zMQ8w;zj(bdnzds60siIP@uDp@kbj+5vU#%Pjg2y#(l?;@UlKMOI;7wC!MsbTPRFid;Og=5eH<2EE zm^X!0?hCC%Z|5~kct^fT$T^8y+>-ObFr={!r!|SwuV<&1)sF8AOcT8q1->WgK3%!Y? z#XtEI%ljLaf7^c)L{!NHFV!+w7Tl}z73e$*s&(XAYtby8lk8P}fc#PHtl8;O3GQT) z1Ou-S(0_s~%J}gIOD+RL_-CO1%$DY1X}MP>+4f9(lW>j=@IUOF8LI0-@GNg`(+(dF z$f!_>7#3Jkdf2}e@ai}os)?wty(;Hm52o=RJsx(dys^n`IKLvw@!W|IS)m(M71)2CXfOcnAa@qs&c z%|1QOd;;lDyEg2(Sb0uwV$M5R=XJ40h{&diu(dwaO;;B_{{Z+m{8e+*0|6!%7H^Xd z66AoeFa9WmSHSrXy8kRU{`jBHN4$rF%&N3(SlNdl{(C*zq64Eg+fpFb7Mcx#?fTV zGw*%)mp=||*o>nkh)o84|0d&oAJC+T1$WenLOn=GY^F2$n;uA>A8 z5DucTBt7ZO+V(5YgFyR_4%DCgk6NiF&4M_h~JJ8tK6N7R(b)wsZ zoP81=!@IEV_;tG38O8bI-N+yPiQ70H!~Vt|O*1)V?O=O&gQ{(?6z1#yS$61#=b(@btQ`_3K6KgTzcD&_~EYvdgZ z+p5Cb)QO$M3^W<7{xTiAj}qm7RwYhNBws4&JZqLUMxsb7>8!4@TiaIetGBql)Wgih z&RSZK|A+qs8apEj3lMx&ASjxjcTYqnfIp9{A} z=5DMHe}r!|Al`5%^#Z^pQCMegc%*5DuEs<-osb&XXc%LGV@MY&$9X8 z%uUeq&wJR5b2<+XvjODaV?C6`&e~g#_R$CpCdB=cD>}>DdOilbyzKnhKPV3jY_b9V zBGbbwi84C=h}$t+wgcd=##&nc^skLGi6sWSKtj185#MMl_DAKlI2kUODcRo#tSSy-ZGkZ~*<65%kC zwEgFqPQ!^>Qk#KZ%bXJZ8x{!$dNEXX7ku2+ClGM3#W*_}Wf>Q4q>+Mv{`-@9M|E5k zsn?=Xdgv0^KU_ThhA-zF6wXY6ob!gWpU&U|K42UjL#!}c)L_wI8XWbU(dg>*1T%^R)$75K2G>SApa6%W-cGM z{7Z@&x)yG;7Rxg+ow@F2m_M$1#e%r2N>I$nU-~}fO$FH_2MWuUd5{2RaelX03u3dj z&jGQu?9w}{24tSM)7+kDjT+IuOmG?$hYQx2NPqbAxJ*3@jN5`yVSH>qpw_FiY8f7GZ2f>9mu2f#nR|JV2b z8*3N7jLb&kFaI7`j4ql4@Sj%VIyMCb=R;2-bOUE;4uec+T#oXR1rRuKmE2`+F2$$* zFl9w#XzvX4#p~8po{nj1DC6GND6iFGv@`d9F(k|l*dPBCiWK_0ahYYlXihLK2i!kY z=TIP|ek1lheoWHOS%Q9${)+mUNMKtP#J>)c7XbQe$A+ZGcqLB&(EpL<%a*!ov;AEW zx#d~bQ&i*f;*dLWN>*wPe7s=p2WJ$AWOv(SQzOR@jNpo_B=Q36R;f8%mT0m#+FHt` z!Q$0^ouXs&laX$mE0F#+&V{Q8^xuN|kNPF}T0s6Ii2r_X_(AQ}uBV(`vbex-o@Q|`z97fHIS>d3+L#}K^oqxz)2$4s0={2vF&DtLcv7Dft z&Cg*}<-wGogs9-hn@-kZ*4+#%IeAXk-gE*kTx5N?-@eD<(hz}Rx`6)Hw4Fdt6rVb> zfXzeh@GgnytEQJgt)m`qcNt_K=XR`&?E^#459y@v85wu9ZjoRYvZ|dbt*<3STNlAP zs#A=g2g7i7>gIs{QHj&HsdGmc=dnQlYMeirB1~{^$wutztejpH?uaiW@(>Q{SLO;( z{vz27!+m}w7DtJ;8RbK$t-q3RYxl*g@M+9LB3#zuHtf36@%)7&nNt-d*Iwr)#n)fu z+C>*!ApR6qYQ-Opk7>CcZXzjwsH+*r&KHcZ0B>&x8zTAZ3rq3NBRE(N%98w#xIJ5J z{|^J4JsreLGP5~Fnbh#&jGR6=@lU_cMDiW=M`4kpFfBe6KGP^|#nS=v-|#%qAZf72 z8CQC-x#|cZ%&9$p0$%t^nB2p1g8*6Ctw7K!(p4U!EIuDmna%~9lS#i#IRTJ=ze%zC z>Z>5qB(Wzrihuo^Kg=Ay zE#zk`C|fyXT6Ei5_)Mw8qV!TIyXD_PPm&lwXfx1`J556~ z_)22iMmdZhy;SFJriVxd0R8|P zu}egfq#WY2;}6BdMFmw`FD`sxg@)NmaO_MZukn_gQBCv}g#TlE$e329@W5i zbGG$h1<>5mk5QWoS*HP-%3A`Q_4R_l$VG=&u^ZmS=^m4u#8=`B@NfPoHRRIivA+5FL(z|wEtnaJ z{pl5b2LI~>Tu$lKevRFJ`7{R=bABtbpb<6jyx$|v@_80)N3* z|DWgI|DL}=@r1K5B+T^Q9CGb##&I9ESLH$Ks~ zBK`)|%LTr0rWEgIH_){7QG zFF2^_(biHW$Q|;$O18TG<-gx><{d%@dJMMK_t zu^k?djW+;)NMadou3N7`KMV9v|H)siA%5KVvfeu(p|c@uqr?aLr|lBBD_##Kl*yc) zZ7wvQR}uJMR)~yeh+x=F@UphJ)(=RGFh)pn%{fMiunC<&{WBo`;K=Im137U1ot;L% z{N#`FzMcg2pNNbhr0%@(1N_@F=?d`vzl<0az26&1{#0u0^~Zln>A(2F^**O?VTX2> zuOJOMiElIwe=Fj^`=_~3i5Py;cH7TAPvSNbhO5euVREG)jAMPu?^$k9U&sNY&y(e|}bNdE z81;YhpK#;tO7|BsB|`kU<85{kf`9X;fBTnfe0DC6+)tfnLW9+kNT)+FahD8FI8cE8 zb*~v`$xF?~cDviB37tB-%wacenSs$KIGKl3z<(C@l(WYRUmmPrdsSWp{Qtk_55(u3 z@dlGIj6A6`%0K-tN@$X;noTVq**irrS@dAi*%wXL?1K;X?+is->4~{|!L3DR{`2!s zD3`JD2I{PoS!O6z`_RTycUH!%R0}4oz;o=necL)9ptitmBEt^SOSg*oQ1ZCLE^^w` zHMC{%X6QCN0qCC%_?Q1N{h8{l7EKQRrE0%&z`dM?3cs$k^_MMk5Cf&?cq4h zL@JUUQU~~d0#JYacjJHQPayq&>D!8l9}@%2hkxsTWje==88AN0-v_gnC%*8Wy&2{C zT#|y0`$a8N@=!s%Ic_Ywmo$ERd`wZJ#(K+{%CF$l_mWVB^tdH?FVrrB!tX>~H%^o< za`JdE8KC?vMRuEbb8uioF4ukL)aSsooNS>=_e){+V2p-$Apb$9!~M+oELZ&x|BY^8 zSNu)q}Y+-gXRcO#;8egvMXP=aD`t+vkL*}h1qnWB38E}0S&fYczk1_XdPF>cK zGEQF&zn4(%W5pzf8Rv4){+nN=E!)tyb~^Q3e&2P}y9hQU|GJ^^F`JbVGFyF_ckJpH?x=>$y1x%; zf&SlY+j?#`H>D}i`?n9szd*uw2!R9hufB&>fTBoS56J&Zc)2u`p(5Sx0s1$CO8?CN zUK-p{L~m?_u}b^pt%3YuU%KFTQ2*c0C=aZ*dQ5AtXS`fc{{UEm(j#NR=H1J4CgK8+ zf7`ag@L}ua=xilekm`{FYxpz&zj$kRUrB_hn@x*LJ3fN+N1A$a2NAZ?YN48sA{9XY zcmc+r>#MF5fdxKFJ@9+eJVI{Uv_MMzm}oQ|$JBbzHO(z|VteVUkvswX-%5IkX;Gm6 z<_r%P7wX^qcb^wyYx9S1Hy3g!K97DMPdjsdgp6RFdwx{g_DR9p1P_$I&z>E0kj^$` zBCb=FuRtJ3s^zZ&`qzfja_idI@fbu!d``ziUQX%iIr3P0ureo^y{|q`&qu-?rul;W zM|*kkbV2kMKxbn@*ZMd9+%TM;>Vr=4W*Y)-I)cZqrmR^5qC>3;&42G-A9CGzSJ;~8 zMm19o4*LFE0R7Yb0UP-Li8a*cSou4}kk|Sg?@yf2tTo3O8zGu^ zf0oB*?3U9J+y^Y4cjNjjZz4v;n^i!5an6jk30 zRxG^{>?ZHOg<%zFp`3T*htDpmqMn4VZPaM=uYb$%>je7O!HUersum(mQYp4bi-siALgLwTaL|FdB$d(rP8T|eIj53M0gVxuMabm>|A z1ut=T5b_l8N$F4j z$L+%JE^x`W*`4;qs`UYk$@Y0EjaNYa2XO%L)4Tl)b$bWTFoV%iSw;oLEZ#aSH9yI9MB({{$09`527k^<8w}@bDgx!7N1gDz zzwdE{{NN-r6B(=Jgj8P#`u9Nnk8l8g_0?gwdK}1qTXcV+)PmpSFq((pDf$7X0pj1F zf%%tIht2)YrmWkk)X)LJYodD=&qlOLpql57fs}n4&|l5j?nQ$pcw2rqKFQq#1*1Halh~+t5iL^#2P<-$kxLzrU2l zon2c3CTnNH|3}$d@MZO`>)LckcS=jQgp_nQg0yr=cc-+ZNK1(z-QC@Slyrx5BO>*V z0e|Ln?zP^%*8T*~k9fwo@9R3x-%g3 z^a{BDqo4GXYsYLe(Ojt)p)9==(f(k?Fb^S?E}k3nQEPf z66<|zg^1fcPuBWtV*z(pdTTO3)FhMe)6g#+Dcm8Q_I~;N61msWL-#OeNDA9dwk*x*5 zz#nh3G)}_o>uXPWOkzc*`-CK1-t{?JO@v>k&-{GyQ~UQ?K65knuHLBcE0^#V3+bFg zaQ_g>lez9oJqYnD+h;UcUtuFGV2Mw*Z{7BPozHwSK0{#02C{4is z5fRaFn?=) zJmCKlz$d~g(ByP|PTG$%MsZaM{&rFQPyYtY-;j(iFbCiBUj+33yZjqs$)71&@shnNiRBJ4ii=u7>Ykz`=0Dx(jV;j*4qBG6bFM8Gdiq{n^R>mAglY%vYsb zVd}jI`2Oui{b>?oldAN{|3F)J>_g`_Cn(FrCsEYNlG|64X-XK)?y+2AA%qN8&ST0t z$rLx&u;*W+w4NbH6A(V3w{arMm&MA*B>i9=*tEBb87@khqH1FtEQN6C+?<>!2T5m&_CJT+BJfG;_X#f zcatYm@s;2g8#LhGiS{5D|L(5{_&=x%#xfgI-sDyMA&@l0Vt3Jo>i&}{|F*d&61$L+ z7}w#*It&}kKPzs0k$K?H4D%uQjI?2=ie*^>lS7`=DEVXpkbB=I33ki@v{-HK;vXD2LJGt8hj*&mhxP*L~VQz1d2d$=e%nvBpu7_8l_Be!?EX44e9SuaD9fT)>Tn5L=Hfdgxc_9K z4O;o%zJF&Lo3b~U;e);eOn(o{!Szc@2du;`$Od86C3->5Q6G!yKL}J1+AM?ooBR9^ z3GRojY$S;t6zBY_IkWOB(UiVY{az#i9jWi{c`!{P_dWy~0QVmlFI|N&P4$q+{Dqw@ zhL3DJCbarW&{;0PfBP}uisJ|^1u@^!n!C-86!s;+?VF?6zB-t{!`^oL#%b{XmVYGf z?1e;@kW3-pO6U9-SqRTvl|=cczjEy;7^a|z3YJha$N z{`{Z)V{rZ^Nn8jaY@IB#GAgaO%+=UN8yo!l|5XF{$7=Kb=D*Au;SFc_2UrxIeUp7Fm5wUA z*2jJaJEw=WrC!vu<;ht4RS?k6U*%GSlf)3H!qKH+;6sNXS0mp#l@};OY)?X63yn!5bi98;!k@XZ!cNk28D1AZ!}$Z@9{fcya4!=xeP;Oh z!V=^!g8qRbtvia;k?tHe&n{%6SU0+u2~(8v&FP>wJE|gjM zA*e?trz&r?X`$a{%tUZJ=1Gq(5shTV*1Pgzu=H=&f+%|!dNV#*eZ;y>p1OsZ_1 z3-|LLr}qTZb_%5Uln;fv^sf<$o$?H>*>Tp0PXwH80Yz#aEZw`Y<#gg&6y!COpD@uN z1bXp9lvf;Y>hQi2u30Ix2M^7*6;GGA~pe!~~`-gPaiEM>Z*rxWnq29W9f&2r> z(l5AW(q9Y|J1}p)yx-oWNZd+jT=c_aLQYzxcj&*Ek34%39v4a^cGOS2UI_O8=!0#r zM{>5L>Tx|W;&`5=eat`D@8z&r7iRBL2>I2eTEL-M2kRDs9>ni!fPV2h11<9KTM^{o zC;E?R*&6e5 zw?HU?AKG*2Y<7nCE1XwrndSL`E=#M!b>gq@qD$s9fPYUVBk!nRvWIBY&sKOx_2Sx9 zmjNYfKX|@HqeV?k1LD1NN^ODYx;% z_xW$_lgVMD)_^;$4bp>ml@o6*G02jt2R>(k=bxId4Pq&X{hD8xb(?sK^%CqK6X$-0JTqG~<2&ih$&DPrKemmsGOX2Q2KRsJbIa9Y$$#hn zTBwO4LH;g(8N@E3;n)vo*Y`XL^;Vgcae`s#n<{>Y4HDt}Yh9Ng1U-lUv_J4?dc^>^ z5+l8q?Tk%DDYc=in=3)E`Zp3ZgWYJrzgWSKUKyg3Lh&PVk!0KDm=F8IN|TeV4&$U? zQu?c@#Y&MxJvG-TE8WSt>&ZQ~RHzG!MntN*&)Yo;Y&HJVx}zV2HW2u1+p|#AGq(h- zLI0M>c4SAD0dJ%l@e{y5m|LDk z0$&0C3qed5(eogQ??ViY%sI@PX$rvpMf;2Q72)p#(d`DKZ?w#7W>&)ApIHOvFO(Z+ z&!YO8% z=$6r`lar*fuC%SCG)y`c;QUFwU-WCe$Lm2NxP1qKj|P(_SVve~Z*LZ!+0Ie&zhzzF z^EE-fW|KJmd_J3X^#RNueL!QV0ngw1zs~=k_&ay7Z?S%g`u}i9&v~5^PC<)90aZ*E zN*IAD@0uc534QR$KO5vzW9iH1^bJMGx5wzDw~1j#U;89Q?gaAJ83F%9$>}ATOTn@=1^{5@ou^al|(aQ;_0z-(u}{fbf5S`jl} zCi&^>c&&NGXKjPU-B-6m9OAXNJYE?HUilw!QlK;oNZ_lrykCdUH_65?(Rk!V3Fhv2 zQTARRq&oFJ@&|-lW=*DYzf82N;{yK6FZHc0`rlH}4ODVjCq$Wqpi)O=*Is5IfrMcFc&>s88rI%}cj-tZ$Bvudke`tZ{*Bs9HYo`FBC7aQ7kL3X)wgkmdUerVRJ0;Cuz( z{j+Yt@g6;J@*S;gQ?Pq!FjBMr&$Q$&+1*;*shcsL;5i;ztyndN?-A3r z(tii}XDRM;2PYN{g-a1f_xm@7$jDq(z`sRsb-hMoC*9j4e6cfAsQNGdMJ`irUYp{J z_Q(D;r=5t&6JY-6hr5(&@z?wh-^>l71jxUpifj_00sO}@*QZrP*gWxDCT+6EZ3`%k z%KC6J9Us1Sb%OpSd&3zcco)z=XY=j-t=i%TX~OH9b!uCwo{dhBzsZ~g`k%OwQ;%K% zzh`j%;2PNPgyZe7-f}s35C`9?-d;cd{K__zE1_QhV^6M6pGwN;UA1Zb&95{jL$LpP zqUi7i@=BwsM^ta;4HJX*R@6iOC(I+eW&k*UvPj@~j-?$1g>Qc)jQNYdxuh8_lI2Jo zyh4u4k1%i9X8!5n{*#cs6?e}cn784MN6-+ZFZCE*R?T?@-v3)O=$)Ejb;7~^n;u-j z(x{Jm!6X0kzu!L;>C4iGU(Q%Gh;b)4{Y3o0vN>Mek^gQehw@}>``*6;37cAZ-21vv z)Vi)42gWM^8q+1xY#0E>{ocLz-{2&P-1i?FmQ3&YYiMebc(uU%8@E+tE)dASeAG0( z&%b_?68HM*3cLmzG*m_;0un!AdfxkgFhw&^-(h`IC-L^!r!9wT9w=Jsv8cHA7%mzl z`|M~wCN2vR_!8^$1-DU@;8+Kru!C=xExMcaQvF%ab`+F~09C%zpi&o3r}_I+8h6bN z7PmG$aYmqjM%ZqW62Y_DXWM@ouA?^2BGuh4w^KiSo5~gs_-`p+l;~4X)&usF~ zKL-1Mf)xx^=A=hs;|IcYCM{3g|z>VZ5MPDlJ|Z&?oJ_1m>Tt z-y>m}bX1y1^5h!zj|}%#h3_1;9jF&dUMEh!N^?0IR|@ui%ey9T=XJ4A=#Op!-akSA z6yx;6{O4%IfFcUu&+4uohzI<7Qb#PfONx2I8`ugjXiYg`ULPc^*PI6t&@YfvtmswPaz)o*C789cSk- zBY*7Ic_PeA`3(kF8-lCE55fKoG2tq)Z~I>eucKY+AZImP)nqdz@Y?8u-V1g0r!xhx zXR#B@b#`$Y+E(d7Tk4OM?ldh0{+4=P@!f!AN3ZP7+H!@^T!Tc6ayU!uvDhcR^GGMrj=P2mY9`Z1|K?lKtV6t;Odv1+SX% zNygQ2c0ER1ONcFH0sb`DzXkbAXZ_>a(oM)0FP~;=B>?$v^&rgpGX^PZF#l}_bf$})J!2}rh-+GiPDYa zFbV1zLpF^uPtdGU^hKVIoL_MFm*nQSfIrRK8omPd&xDNrcl-~oq4#Vi z3k1v@&%brq5YZBl<};@94iM)aD;Z8w7J>7JZv>cH&&&IcAO8QV88LWV<>%Slb4CLQ z5dA}hDiGu_gMtu1|8o_so6)2HIZ@~3gss9Xm4LqdLL_khu_A^`>v51xH)AHQR8uH~ zmn82!W4XIwdgNa%lL@FT6a~42VcpqS-!RwxR(IK^D#jZ4GhYzv*FP)=vkLmJQ(*K= z!2HQW{=mm(bMGm=Eny=iez(bDzwS<&&F2zP!!b99ATKLJc? zpM~jXJagQ}MG23gq899md~zL|EEGovQEOVOx5?;o_E zQe3}`c>iYb#u1$Vfc%|PZ};hk{MrAsf9V*(Zq@H=W(1^b7fe?)KXfq##R-7l{K_$Lc#3$wdr1e!qqBgnt`xBrpx z9fDUd$IP{u+du)AUq6OD%NAdP8 zEKDxesz!cFOL5`7|DyzD@MZPOll*{GqiTc_H$-M+DD}$$#|3^7u>ZZzvm%gxJv%5W z-EeUYxeN49*N`9f@6)=L9cb^8C5yj1=O?*|L{wdqDF~n7Xhw0??$w*hrlU@FYVmV^ zH~{^-5;$Q0{XBI<@?BDTnqblYoIgYkC0=M3r@q?YJtwy&x!i_%qGs4;>9!31|NXe< zpF$b#uQF$!eU@~mxq@#kp;U~x-9U!I1p~!SRBne0 z^6$X;+l6&Y>1kGFpzmM&n-trJ{KwI77eR9rcb1oq#eR9PZbj{y!rj~;88r+B@5Z(= zTQ-}OwvT+fivfT8I$s-y#949^jdoE4u_?$OFvRj`QMyR|-eD`1`pEx!>>tH5?8J2O zyG6!*;K;H8_~Rn%bY@yR0==cEr4)P4;@3q{SF7>~5I(1)Klw}j6&dsupzB7C-+l5%d==3)dY?c4yMI+vf@D_O zo)|5Ki!J6p1`F+T@m$Jg;M2YT5A=`kdlzwe%*@IMp+-wMy(WaDw&iaqkKPgVSGh6) z^Di=_r7%)XSt{Ez%Icx`1)~3Y|FBN+0dTW@ zAvZzYv$K6l-yO4`4qb8G=aH1FpXpK>m5S=<`LI4W9q}Y9bLCFbgG@cc*VJr(@B#uF$aWOZTjg3I*PcAi4O zA1+yCrG^TV@=Gv|3Y ze{js}=ENY1YZ)3q+X+_t*!n%$RFj!SNn8|2Lh4bpr%m!eJ~b=^^Y=AK;Q0&m-!MQ# zt+8l7_;;;6THgZwyV&HClA$XKGT48DIhP*y*-vNw!u-GWZ!5paRyb6bYiWa}t$G?8 z=K~W)>9O?cBIl(+*}4{Q_CA*n&PEV-`l>OOJw&60NW3l;X1=0S4kSiY0q0j2kbn8$ zKXDD4XmP?xb{=~D#{xf(@XKTWfOH#Od6weJ-K|XLzW?yneD1O~lGwg(9lc#krlXIb z?GAZeUZg6jKedG@`cnvXA>W7B1FvBQ_A$gax>-G{t|6EWFd@Vm4D{neIJ)qbazXzo z;NO@4`_BzKQ`U@Qa6SzqlM^m$Wx)KeNn%G6DHSC#?xc(|g>ouNPgsP`vMLfu=Erka zZN@5+C+Ovzgogqjs#gp!duntH<1#7Dg#i8q*gxt3@^{nk>Hu@@zn?!Y!e(zvGJgY| zQd_8IOR+@38+_;kz`w#$)c2|_I#UAC$I?0HE>76(_*C1jx(@7S$D|0l>FHf|KE!e~ux zq1Gyjz&9*Bm2uNUcWsnEOZwJoC7$$e|4boQ9x#9SKnv#Yox^`4s=m}1b~K(ca9F7n z{pE+{pff^O0s7~CO$$zkWaySC7r$jlRcyS3W$}Ks${ivX(wk*Nu#7`thFL*~=C2WF z63UcyJf9u2o@Tkovas5mVtxwne=fD1U_PtV-$ZfFphA^~&ULb9#CQYwQ=#S=;~zQM z<1g6IWc=ZpnHkxq znya6|K6fU!!fYtOABh}{;T`w=3Of|%kKa^{Y2$m1pAGt_mlTJ`6nmiX1mMga5rOv%7Np9-kZ3$2>gkVtbb@R3k3?G`&fbM2e?%byOMd0|8n?igb ze$VkI&(DZbJlQnh{r_p5&q4{(ya?ozd|!L&~WJ;^u5 z3HA(-zKTwQNH7=!8*{BPts&mzbfKNE*@>u1#KE3C(`|H*lAJqrerSw{AZ;l>k531scY64 zemnqw_`$!3){ulJ5P zj+azEM@Ae-7~(tf;Xd*&2C?2I`LZU?;WSZdK$UjmXPFaKa59fDNcX%$z32(4{b41x zW4)nbh5$b+i5-p&tGPDBx9>fosaEB%p|g>!L=FwJ%jBZ?ZEv6rr!j&v;}1kN4>*4m zv`my*8j+OudH>y$IM97p-lg{02RIyvQjQA55z#6`RoB{G74{)q2FD%zChOwkv{8v$NWW_*w)jB z`S(Nr$#Cf^_;+vj`KlZD0tUeUF;DIq?&RrjkoeA%M^q@#8*_MI@Y~;w#XywnDTnv- zaxj0v`=s*e?*k)Yv<;{JSR?m{x7y<~s6_fmrFh6b+6m_GS-+euN#NiP5=1P#SIXOL zlBBM%ap%f^};Yzwe{|OEen7=!CE!#|! zt26=W9Bhvs&lD)t^agqCoJg@PQ!hVw*dmc=NHm6=72LQ>12RRtMNvLN4^IW(VeXXlxyQL6enNFz*kYhs@DT#)do)ev zYvqAo!Y8u>%p6bf7=G|&-`LU^zH+f$)0SYWD1i;XmHU(4&SX&WfyDf8{(Cnt|1o7E zs(7tfgz)(Jf6u?Rvrr&$GoO8=Z%~}cyc-ppH8LU$Fn)5Zo2$1_9=*(2>L*-iVf!%u z9QZ{s{#I*j`WUi4wR3_?9pn!o0sPr7bZ4^P#o|TXw%woLocRr`70?}}D^y<+tqI@f zk3jz}37*q;bYuv|sjoSc9U2e$=NEnPH=L?kRd#q?_oWvt)idkkq^dH<( zp}E5>&IRox4eauAPx{}$j>0vXBkEYN>iz2P@S4u2W^dMG7P8|Q*!%FA5DL%19?LHY z@UI`bKaC(MAuGs*?c^%v+R1WIRpa*o_P+u|7^cVz!AG*naN*I$09K-DE18unDSc#~ ze8_szkp8N_bF+`Xt8`BPZM*5L8+B;mbF-ZR3acS(cusfv*hw?gik~yVdKCdR+9(Qj zJM|rc+MD41|B=5wmuG111@vF)xlVf6+Sr?ZJDs)LUzM72;S)dzg&8i7OmBWd`s?$} zEzLIrBLCd+NkzT@zyIL;ISs==4)mXe-6-CC?q)Kmj3c$E_@nG=is#b-_J4aE8p+h;mSP=j zjO!W5K>r>5`N903g0n#t6u_VPTzZxvl$VBvQR!j$JC6AGv@WeLluNHOvEbJ^CY0p0 zBHUtcCV;oyzQlAFCBb6ket}7%Eft~Kkw_s@Imkiaq~wy(AC)! z=ndKYA)Q5^uWu?v2G8WeS6>ztIFkqT{|?U!Sy*A?ci7*A^Nn@z3fcQ~+Mu~wE!LfO zZ$&~X^Hb(I4k&hFcbJ8rP`hcYGe7uePW!)95i7GT{-6t%C#rzDBKN-WIQ2PdZQf5| z8T=vI@CykCyM_|XKM7+AGQz+VUh)=*W5}1A?ew>=|1wt z0a}9CM7LKqt#p9@liV!=@h89^@rL?FRY+<_;wbcnW2A&P@EeX*ia&euLSp+<75J)d z{9-4{1{6359nilqnz>D&vb7l4Cj`!)Q9LA@;eX3d`5t7lerEiCxqqn(_jk?W#Mkkc zxf)s=>xW$OLZ!I)_FWS z(#=8)ucnVAODS0wkFlRBPgG&)ju9eo*;DMXc34axUgdqK+^wjR62!P zw_IVTbcM{p?s?s(qEKwP__%-G993gP+4Y-5nE9ojnuU{m+`|(E`mYL8u?P$+QAxv& zHq;;Iug16};YX=hFIQo$vrfnL@=y6bw0+fRg^r);P<~Pqy;|^5z(G&51~XvhIeuqc zY&*!mUQ&uNkTMXIDW7^8eX?M#4R<{TwkcNJYP71op2i z6FZ%dt{mN;Mj!s_>Zho-(J|& z#iHGIetKOU!kTh?QN+p$`*9m%Yn3y|Y42nZ<;!*_J!xzl+x4;sM!Jj2)aOgzQ?ZkT zdU7=||0R(nIerTC?^nZ)sqwqVp6ypg`ISr@#{QpvTO*XBbad5sCO!)l`-@5nIhowAA&*TDzcjH7$ zv0cLdl?(X$KXiKVkFu*ZAB%$hmvGR(fvWO2f4^uc68#C}-}9+Oz6qit^V7BFRuI@6 zKzn+4@3e7!O=^|)Kl-No;6IT39>}+cIZljcz*|?V5a??K_=i=#W=~Tfn2Ur}uY3Uc zOCbNiVzlQ4`#=42v|bgo1*I&-GXW#EfkJNo$NAF`*#rN2y5BVq_D-jcRV8+|L z>7B|Mo^K`mKlA@K`_v_#<^J39H^#NZYw?VqQ?#rTjmaNIXIKIw`<1p zaolMAGjy2nL`$5p+-qE8=;@$c+!c#IaQ`Z9L!~ z%v^imzvBrIkbNPt(gpcbH<5Q?IsbhB9{ppbN@dv)K>vwH@XXBznEyQPKVyU+K40%=jA%ac^RLcL2x3`+sQAdN!BX z`b`D@vZ55=KMrGOh2?B@qzC!?fA??3rXw+Mf&KU4`k@{ooWC2G|C6oEBfMaTp&1g2 z@q|KWVEzN_KOG^H4gLW6dxwOF{!xa+4k=b!^4(O?_<*>_#vxw1PPkblaMag_eRKW#-6nIqo{=1N=XRM}|W1b+YNQb*(w zfhz)X{Tp`6rA71odfJfk-S)w2tDyhfRDH?9czoR{92?!1DHAVK6=}Aq`O78?LNF{e z4{eAhlvVGy063&&+b*kW8Xq0`?!jwBh07#}b2DKt1$*4^+3q5?>sQlqX|f0tod`J| zmralT+Xw!B#z~698;xopf1%McKj17b>e%PV`r}E!K9q^E#g8G8pVMN)c)>b*Z?@J& zA)R)eXqW0lD+K!h|2&v~)nlCzeaydZ5B<|W;dc$RnjGNY{Ad4`MSUy<_P@SjMwlLd z*U3HPj%vzQZM?HMw0cvT{f_RktwbE`|JHFT&nrA7lGSkU1MdI!!1K>w_{4mw&mFpl zGyYkvuuMLba}a8djyR2u=rWz@I`oP;Q7CZ#c-a`ehf1vaI<9s16UaZASfL(um>m(G z1MdH}0DrD4ud>K(|K%PAq1d83aQ<^{#ufqngEI!*I`BaLBP_c4WNC)$gBERL{e(^q zJ!YO6iV(m*MtV|0w5D!?SJs!sM@X%r`X)6 z@ajJJU(NGE&*EL)>Tm_Q-us8>v|x|;LH>Tk#Fy4|Ab)mje$U@gLx`}(?MOYS2~!s- z1^nX>2V}tGf{w-HLHp=%o5pnhDA!aRur>QZ=yQcvj1HVz)5Mm0$arJrZ zw;Hwp|E)Oj^1c56laAX^5%7-(pds;YR9CJEQFr%N0R9!smF%WA?ofAKywqHbOw3OR ziJ*Upb8n*Ndu{A&9EK2yX(PhSifm`U&;9*h(IZ#=VDYt1sloRuVt*I&&nHm#{8Ln` zzU7qT=8x?}UW#wpE1>1$_Xt7$?qLG2E$Cl^>aSHe0r>MD$*;)f3iD@rbcot7Yzy0Z zx0$ozxc{!Z%cnhh!|T6meK5~P4*PW^S4FX*0?iVfe`2q# zVBCIub!iObKelL&{zSpPmQ11Qthmc3BbE*zijgOV0(d%$aTvl*2Q-%5A(lnj66G%VNUl`lV1}&1SlC9$!G+ds z(+??`AlDSdP6IiurGBzDj-clnQZC4NzXFDEbgNbe|C;|j&i{k2e?~&Ej^1Lu-m%qT zNK(<%_+!RVaJ83dMJHGXoIkQ81n&D6;@A)8zp3g%2+)7^=)a~_^<(R+W97`e_RI}fqvg89EPk%cCy4_B5@2^{OP(QJFKnO;N9F`qT&3vDj(CxtSF zRagW3-)V=VUTV3S^n`Q_>NBeS5ywAMZw(7-$2gM>x)}UUV9nKf2 zwTk?czXbWGVE^ynN@zFYZ12qrM+Amyx~B-iNVTXp_Ny`C=AVBElMmxRzW;(lKHAbw z6hlarP!fl|Tjt->ZQaBBxq$=nzgU6(weQkPlsE)UnRHrk{(a~kiN*YeUhYnMm9JCH zTwyvNeHQnA{`EH?X{HA{O7Mwrz1Yh;J z+*Vj<<>G6O5uVzc*DGn=vC!DC^#xo)(n%T>{D7*I0rG#+R6l6^w-yw`YQX#f$UjXz z!3=J(a!IyGOZ7A?ik(4!sRl=C^hq?Z9_&9SX4(BV%D(#|$5q_h^EUAXRf9X}t3i0; z&vhwTG@tetE1n@P&H((C%mD?nM8JQcD=0(*?my`fZeM}f-IfE2}`ZMhC zR(IhmvzljFb-C9R!zTN3P#(Hif{SwM`*8^;_BCb)m_o%skbnE=Uw-Vr zv=$_EBKV5ssuq>6D8Fz?DuOU{)d$Ys;NSn;=fS@f4dnmg%F|UVf&BT&?_xF%#H9V| z0WRTKpnvE# z75{t-@{e+z9kXMoH{Q2$JBCI@vV5{wVkM8m9a)_MgiCu@{7s1a{r4>@_2Gh2=6i>W z4uVhU2541Nf{y?0AI42tpdUSRp^RSb2*WBMCxq6s-9w0jofv~U98*>v0{zcJ5ByOV z?x*zeRG@#Jr-;1Z4Gx%pI|2Gf<_#5eSNK8+X!zBR_``*XkN zoy$c4|Ex(tImg*}{$KxpBj+!^)J)FulI7U-%C%v%8WRdk=?j0u)8~BN`!g9rOk%QC z1*I|VsNT;KDmUX=!+b+!f$Y$~{34Qe7|Nq&kZvj%nc7IU^Dua_@xww{cN^(~QZK;2 zWb8h1x|62JB;~?yV}UHdt_`}THstCiG>mGnggE-I{M-CdBXQ2x8keRnTe$T zx4kW|@A;dRg~i)lfd4Uvh^zfMl$aAl0`-vjGBKO$S8qw(F-q)5|6T8lIh8Rc4;nt~ zC22Z7s$-nJS(72)KNOx}!%_zFhn2!(&(7C%46oSAZl+#7&+%=DD1ALZ2)k#`ABPX@ zpZ@>OKac(w2!Z5)=E$)6T>e&*Up9-Um%nvvoq_yk0CE{A=$|DLX^R&hdB@8@xo*7) z^q+OQ#Y|86h&-5vd~R--M9m)gb4;+|aozxb&?M=Be~A0}!9M}c-``ta2oKN;_g@xb zzTS#{ZmtEt{2ZEdJ_7h^z9<{RFrtUMn&31d@4a%|g)lSq+*)|mR{r*EPa7o-Eg3TX z!T&v4S(Um#edk?7$Hkaxjq5kN98W-U8Zh;9@243gs=J?bK87ffSJYkBrVspvMqZo` z^zbuq{@S^z5Rm4DppsoRmEGw)PgbFM!%jV3bk`f@g;iUIV&VP^GYt*!UqhNt`^yM; ze@II7-uWSSu%x}QuVZkGmvyP(z6ajFuDL_{L?cbt$KOlx=6g~_J?1Z2bwYW*x4n32 z>(y?B;{0}A0oZ?XzSeBiBE$Z;nS&?=@`pkGJU`|`|Eld+jZqzTk!>YT(oOB3{ZEmn zdwv4rZfv)Jd(_7`{(RScK1RPMB~M560+7vmwzM0?KE0xXgFj$(SNWb{Ep`9-$Y*Mk}i&o8$<*7 zj3p$QqiOB}H2Z`tj$Yz>KjzP39je0RJ>>B;w`ByKF={G$_+^j95(O!d{gwVE!8QPyYuo@4Rao;7=`R z^Pq;|hht;fgZE$b-iw)%_$jhW*B=ZI{56DQO^Rt1k_g7Hj1&_6Eqsspt3Zg$MmnJX z#f)}*C{PAjIx%=2ofn3qS8yWjs)OQGH!Cop0bL%xa1PmZy}c&%NtL;}b=WY2btAAT zjal=p-(&x=2+`WZ1jxTJR)O>XlY9>y0tiYguByi5U7;{7*A;#d?x&VO|4?3CR3$SO z5v`8bZz3G!CgubC6_CG6b4{uHcm7X^tmqd_hyk4@kUt|Nd`{HhtNNwQZO{o%56J?>s!@>STIEKAU`UU57rciF^KW?SKSkB;a4zs{)2V`)_tcXQ|Hm_ebQdWyO*O z(d#LF0^c5dvbSp2kC>07!jAaB02>kOxjH2c`p?cS>c4n)W|zNpMb zi6`Wx(NVk=ZO2E1C@A%vYFWV_Qc|P8QMsZa8wH=gdZ)i(4}tx&ItuA}8)uLmOL&}I z63QFo@(F&s|BinjQDg$GQF8V#{~klTAGOvPDka^DC~g73U#kt>yV-Qzb}VJ36}Sm` z=>LNL#fZ21)!IP+HYHPSX0cKzegV;*;zy5+l7AEGD$Yp?q=w=6Hq9 zs(QM&&5>CW2cO=Ajq3yutoT1qSv-n5@#o!a#T4OMT^a!RGvV-*B^1Ypq!E0)63_qQ z-=drRN~vrb{h}dt8F%hK;G@9GhOd?F^@pxJLL$eNESxjST$bR_XZ#93Al^i^Z}<)w zrwziKITKUfGo3Lr(3ZV+U#yuefR(9qYi&S{BoRLYu}|qXg}hAtij`s{?`kbwPCPT| zTv<5WRNYTO&PzBkCMFU_NDaJya24Gg7*01uy1=_b-|59y8zf@Og8i$a zpY`+p=i;o1N2zZLfcJ05hP?lH<;&1f0%DmrXdwRqDzyvn4^}1S+~@ydRu;N^73IAf znzW1afag!1?6(B^tdq5$X$D?qfPdhnJsR^KFn`o9iJn!nEKY4|ip75*L5By$=$yg)q zgy2*J{NM06`9X9MTU|~hg!lgW#((B-vs}OXmjM5g4BuUcz|hM+W5$7d{?S)c$$S6e zJ{2#epVFlf$zWz^R}zhvvG4mB8@;K864m;9{_`OG%ykxyiBeC@ZIbFRsXUY!;=TV( zM_WGdV*`ch?+h|EhUrDNhyKZ~r27AnKi&8mt!1;pMdJyZkKd;;psG}Ay{x|cQ5N)% z)7s1QkwU>|*SIa#?x67rHP}HE{44(h5tQKbb6!EJM5voGVRN(%4zCZ!eZURezq6pF zZYVT9THE5D4!@K+8vM|Uf_1^S2Q?zpRdK>o}cyKa9W+@#J=QexqFhcmWIn7$UDm(wp>PCZf`X=Vf!(d?l@r>P-qLYE_!$;Pe zB~SDW=Py6r$gpa^y3Ool&?}F9YK9(c$fXKnS=wH`c|U(A$pZcBmc11$^wqM2FU%?H z@tV_csCZPA6QI9KB!*HcKMC&5+lX;u#Bs$i*))9QuL_h9{osTzBdkXC%3ZAyPl0-? zbe}%~^RMLusD4`UX5lQ^r;FV(I9A6dHO9xgMWj)&tK;kAlh?%TrfSO}4Eibnf4>u( z&P;^2{V8L9hkR>PL{q+CEH_bHL2F@wTz%jlS^ms_e*coW##12wYnOdU&R%>aQ*xHY zb5RK{dUY#}ocbz!$xPzgG&SHKqQ1F7-30yTZ+^8hWggA7iKCkx0RGv{-iP_0wwv9H z*KpS5jcF~&kjj%&W}`y1&&Nk5ej58BdCSRoNFoi|=RD<<5qy~lGb))BW>OHUEHfuR zHO6*mIA@GMLbgDXU3Aaic^St8BV7=4*t3^N&E#{FBo!NQzlGzaqI-8&SEg>4Bd=@$@Q02j96-A}ngooPODf96j=stWGDg8BaqEjJE?#61rE2!V+%ev$WPuOM}K zzc<^eO~btA^hoi8{Z3OvW>4C6_tiVt>{KB5$A0sE2Aqssb%q1eTowFCLLgCd4VLX= z{`D?i^$&CI>ILi-`24*FoYx%L)HU)`->MTo%LT5!=W#sk&YUe7cKFUic@SRm^A%>+ zKmH5-qMyvTJxsRMwO;s&my>kgMBxRJqPC@7Ymqs2TbsAP*s*>>4QQVlq+8y&cI>Ez zkCv{7jy2ed+zG#diBLv-m$dxBv~t%n+)S@ln{iUeY_x4H&mBouo!tHx{~lLNs{qr* za=v!2V+G8=O!k!)7*9X=WWiD?vCt-$KpS_jS@*E$AO7l1PmSy@kU#f%;8tPI$NQ4T zkl1R|AfsBE3Fq^^NnPP>7`Xos>aWGg#ou(0{#hCs<@{5MJX2zx*?UeEHV%K)6n{;U z$){t7@B`?7_VIq@XF1W&hpR{-zVW;)IapylN@tW}#6IDg%@^Q*F3iNlRppO>8f7yk3^SWVNYL}D;e%Jnc$|Kouk>Uadg9IoxLns|>v+yH0=M)eXQ z3^0G7GCfx%oIq1a!}xf-Ui`JG8k8R2cuVp`e!tZs8!?s1OWbiF|29BBoAVyv|8a2K z`G-9ydoTYx{sbQzmaIQ~8}lH~1Izxd9V)PY)1%g>jFzlBCN&x>1M(MWZIDAi|9r%A zcw5kah_T|(uM~nte6?j{c7HZ^yO)_VK9Tk3w^x|iPI)uB@~qEQZVLw3OzHvua~(m2 z2R+dLaQ;v(;lqNU%_n>KFg@`|5%dq9_4OS4b%}}!)*T|Cp_UV^1N~!Ei^Hsn&Y@ym z@t;wbuSVVP_;W7DxQC@squCE)!=fby0=3o!SGDi%AEJu!k3s%$eX07wFtGnLTCYKl z0{9nt-uG*+Xp~Gf4P?Ti+dnV6l69SJCfRnSbtXob>NOMa;-UQd{MjiD4Ae23dHMTM z$LN2eBk(M^d;b5|=MU&#B?21X_tLgI=se42Er`MXk*_%KulH}^+ZK0CVEzE|PeA|B z zew8X-aWm!zb7cgR<6{mBWmJwPGL1_2{c(dZuO9FJ+W-E@GTk;Q3xcJFK2td8w3u4( z<7{Y&HEXp>X)ufM%*cJ$=|rA`91nlXZxgH9Z>%WRf2LT^h~F(^S-mDkHGm@&)U@7W zU9{~*gR%BTj@m^S;W&bYE?^-#UD~_p5B{}IVZ)pz$E!FpO}N*c6$?p8C$)5$bYEf} zjz_VHj0BqA($RhW2=KpEaiFOUdBOS9RT(?w_Tdv9kbel{#OuJI5RdqX8suMElf`tt zd93Xquo_JV;g9YnUW9Tky+=>1rog^Fep*gC&V=y`kJZVE_fhLShbp?z67K6|{?4@pv7Q=*~YgR&AxZbXqg%h~{L&IU@CGH~) zB8~*}M>F#2!PZBuc&WedUtPHm-T1s2i|pr{p)B^Sb*pj%=|TU@65u~lRaE}Pzc4Z- zH(Jn$E6N;u7eX4hGDTmb(d!KF3VrjOC=w3vPyL<$7HWywMJH9&OzPUp;-O2;8k;vn z>tb|V8$+#}(ER9SMpsH?pN7G+x{iV`o9>DD^nK-NDBZM>-(*CLG08yAvBWW{Jl1L1 z*=>LUo_m8_kUe6bRW_lTd9+b;6i(QekGC)G@^8Inizl>|#zdPRhiXCpsK%_lffC?9 z#KcBmc2k&R^Hud7Npr?oU&PTzDaDnjzu>ZtQSRX)f3Y>sHLI|n$)ml555I<`GkzbI zo$v#j6J-AFj4f=Z3;LHA1PszG%~QR%)#3U(VAt`t9Vl>Id1oj~mD=o}9IhXkroYwr zgTGSu?T)_#@;7Qj39J&V&FkU*@gF52EtBT;!MK#C5M{~bNH!T^O`WkAg8uVfba+lD z+70FjcenDLREJ*t*rwA-fPa>N&C*DJc0#KH{nXPJ61xk zF)yQVYmk@Jr~DBae{$>&^ZHeuDZa|6`ThyQziYa8$KN!!Q?M^_b17^l|Cj#_e*YT9 zzN;f9BgaSYm60crPlo4t1ST*D-w9W7c9y)s{edA2O{LbzN_!sn5H1pAb z`CFgTdKqElbmv=^W}I`YaUXe`{8^MOGP79dBtZp{MI~0-`r!vqNpNL}c(t5v?TkeH*;BsPj_A zYah?b&dm=fAA(kxpS>BGqxfhw^+CY-1I^MX(EotD{6JA~pJ4`<=ZKEr>`)+ohe}!U zl-1D!yX)+Oi(vG_lPKEKe4D{~PNgrkUV-u*#mQaB-jW3+#qy0oR|-Pdq~7xHBpXCq z)7G!~yIff6XZ}5Z382-Hd-!rUwZ&7pwr>**fc^u7osr<#c6qVY#V64pJN9YO<8WYM+fJUjYLG9CwNw{McFsn?p`%%k^p}_`>nz+{*_ru z@9+zn@IVT6gz)aNr38roe7?@*%Bdw0_h=INe5P2XWi&0U^kP)6_L5Eo7W7Y@A>Pe@ zsP))X&#hXDT;SN;V8Upb8EV1rpF~t6lz_SL0j>F*zhVH%hjE$|eX1sY&gI9fWd&^h zPg!(Xdk>OYx$zj}WP^^f@ZnAb`_Me)=jdy`3WVP{-6&piZsEZ--7sjmsL5qX0{qq0 z&x%fLK>uA?LrlFO0S$-A%(99Q;9qzD9Q%=mp(m?+`+NWJD}S7{$Y3AQH0m2Mic!a8 z;6U#G>9~31g`?G5IL8CDWDy|$X3nUg(+~6?Xr0E=DS`b9OT)84Z=ioIWfz;P4CL?d zPS3tkn2U8hxWr6vv-@6oged-~%M2+OJpV;`pI(<&aZ6PI{SUVW*+IJW?Pk~fTibSbBj#8Dh(TZnMsiH^;Ocg~g6R{YKb+cN2Rold0^Os($@n8K%(Ku1`XYVHID#cyr{q7y7I+Xk5N;jjP zk_rtpxdQW7#l0k}vuUF;uLPExa{U?Na<%4zNPeG*la^UqPUbBs-gj-X3l$v)jf&nh zT4O(e^RE#bOvrL(wMdW^{Xo>g4yjt5~`*wGeO0Q^~{tFvrEQciI}s6^jOTXO zpej88X_B!V@UI4m;qM~>{BQ-mrA>dq-#bAPO6opGohcXd>sT- zDI1@w*I<0lkY+I$8@}1{1^G+qRo~``L;0(mP2WopG9}O^QoFQ+LtB&1Zn;~#wUC6;bLI_I{y3qxsaZUX-N^)9it%c%W~w$ z<=#ms#qv!u?5ZG)Q2cO^v^TVVyRVJd^})g559Z5rdb|>IOwp#i#`ZQy{^%Wb0e6=I zU66SFM1E0Dc)VpfR-rF6ari6JLD`^v`noI3yDTuVLm|`lkec`!AaS|B}*F z)~V;d$X}R|X7`0Tw zx(&8MsiBPQ9D9Z41G%l6-U`@%Qo70e?cd-kWJr9)7^}WM`>%f<2H?Lz_)`*JQiUD2 z9|($xt|*hnuYO{v)$DTv{I?<>K>z%Jk06PE*{tl05R8@;3;22*jN zv{P^9wtf23W13Chj#LhHn^$54K5}}%{ioEp^H=`rj(<26@%*to2dU}vFL8EK>AXna zWJW*T2CThj_WN*xfVH=vsT-BP7{QzncEysMB!%bt=xv%P`R@B#N_QWIW$ouRl|GNK_ zZoYi=UhK3yIQeBYT1g-b?d-wDnxFQVJ^4u{TILdPpA`M|M_V-gum4u(b7{*Z{qIb zO%bUxMv0?W^{;;}7x16Hl$B$51kN8ESjq)*#N8~RQR4kWIr{HjH~MiDC1c|A5Eq_} z1N=p=#_)2LzI)Ic){mlf$0$dSmF!_jfc*!FN%Q7Jz}CZ#m#88f3yr9gY2f_tzOxtn zx1=+^0mOq~$!+rF$&Ibei1S{7*Iw?ccl-su6fpnj#Wj5PIN{_Gg8Rkfc>*Eh=+KG)hwOaSQnw z%1h#R5=J=gt@1}nA3^`99xZMOBDCIn4v{6>$?1;M|?2_210DJ-*0V@?pODp-P*)H`K~4VCLLrj^cnD z#A8n(9&q+jMQQ3lIvWqG4TJrf&EIJ6k>3YE-~jl?s0VHG62*vZMl6at)2w)`hq1OM z(Z0+gN%{qcpV^eOcXk+!X5bjB0p#_&`FBf8nCxW8WAy!l8DbNmW+J)Uqwze2`f8`7 zmeA+hB6h}h-@=1n&c;GeaBocX$4kF|+*{H7)X^pFI0)vy#Z5=Z?^p}4&1`g5TkLT}re#2*{tGE?R zZf=YrHKcYC_ZD~z4c793!i>XYGi=Z4ud(>542|fKtJJ^tFK2MF$N%yd##?e9K>U-~ zlIOE1YUd)!y>GQU;Ntk^ao~XcdqHqifQ@N4xjxsOe~@(F>}?{NjP4zO1>sD9g-Ngo z;NL_1?=ZwG+@TN8!v-#SSkeIhXXElyM|Q-dZC>MOkr~kc5-{MX+tbA4ymRNj743`N zuwCI=b{*rhZqIsI9Y6Ox9Iuzz?o#h&SOfdhgW+i>Ag>3h|Fpe6~k9;OB8tph;R{2l}7FSn(-#pGQQ< zw3!rtyllt~!}!d0ZQo^w{{l5NHvm=r&3BuO@5z}bRN{vr8~tN=BoZ^~b$0gC9nDbe^=tXgK$w+3!?P6ltfvuu#Eyexre{8)1%UtsVQ|ptZe#@gL!X~yhE{$uz+OHoRw|G{dIt%XsP7n*dGJfJFfla_Qg zxopypN0ol=uY33WgZQVqyzlZ)lXdl(VE*Y^s1wCO~~xQgRp9c5A*_d~;8 zEc?3YqxJLIq_G&RdEH(Q*MAR~@B$(*9+ zi|Z}&*;>|Z1NRVpg6g}GYSmh*so~pgY<9A+;K2DWY3y)aM^Dvy65&q`PAjr^7|XBm#c% zKVX+;m?wbeFE+uDGRc9@R1Yca{fi9)(*^cr+Gv2kM{vS>Iw76xZ@$-rm58i^q#lCR ze8eJU`?vpRlwoFomi*Q1#*0wgAT=^Ym5m{XZUIdzY^*QR&fAK@>-OCF+`Sr$HQ1$O z7yha!Z^I)TW!TurW-+=hvV)3vN z9fAE5QlwTT*V~Jtp(wU4UBLky?VNKu%#H_^nOSuTu0Z}B8~XmeAG>meid>bw17@i_ zw9R1uv1PomfjbwKWfCm%hSbT?C}{xX9S z_RVL&f9WC0+Gl3iMl_gUryH!M;%^JzWAWymo};^)cHgx_Wp+AkGvoE^EC$Vb1otfZ zQX|}xAgdXQ1RPa%nM_uwVq6}*Pq$B~YY-KI{>jc)HJu1;N(-^lY@D437bKlP{>Nul z9i>m;H9y#Y-5-5cu+16Xn5EosRS@&L|7)**nihYca7}#Y|2+zo-Ua>B4wcV8B%zUE zq9tkc623J%8evI6UAL3|*_;XThsZNq(qh)Y{SV5asRH4S=NO@c9cANN3cB`+yZH~e z{{{I+)K0g*`aj$OOcyXKwoR9<+uu1zUI`ywY169${*h0&OeUfNDaTM=sWeGI|IYW` zC(rNt=~Yo8R1EE05wFH{TA8aw7tB%2)d$Gma&3QV_*monVOSo0JAPxo1I}i1zfX?w z_EKpPO&6o1N=iZ3V%W`Us**BucJydX8|;7a^PT|r4-EFyVKD!5ox*xms@sD^M2(o% z3-tdX{R5KAu^T$z{MpXK>2v8=*)uY1`?Z+d&ah4x%wH-@x02K|jB0sv(;+$PoIJMM zb5&>b5yJ)j8-g9ZX$;=?(%B{A0rC;-c_YdFZ$SRQkDR3WWlr&~3noG0&ha_$F zmBN7^audKmEO~muNcJ)RY{4rt&c}V4<4dHz!WqC{AyPUtGp5Os2mMp51*hwve=39^ zm73h!=LjL1_51Am4^so15Vgmk;^7pqTVE+%T(fQ?% z6oMPje+&9Y=wz$ccnR`$r_bvoUjY1rcdh9zltBLInbZ+$THHP`fBE5k)Y-l-$c2pT zw9D{VLVQhyJn{QXcgkQEVKH$*8S1QjmwbyO6S|S?DvQ$*JEmzf)Ht4ZYd2oX`7mqX z(D_~enDU_`8R-9|Yw|)^)+~zqkdi1D4EQe}B;VyfiuR?Pv{CHqB(|e_>Wu}X_bn?I zhx=)KW6&Ai(VhIDepFg^Y&eU@0P^=x0snXMt-6u!Km9w(*|*_Q&J9qXHC@#1+juIZ z!tx5;@dv>CO%E`C0sT`l!2IW@#p7Xtil3WbVea@xs?=fFjHt;=bV#}nq%REeN5aQ1 z@E&jU&_umIn;3i$ATTd%mHhHWVlc^^Umc6NcVGapDF*mc=^|9T+3a~NAb)_R-hwi2 z1y6JAm;b`JQI9nP0SaM2fe$0|2;9Ga2Il|Z`3s!?XQDG~^$A3{=q{JTh21D#=j09* zR>zQ-mY*ni7~^@iV;kJ%&p4QOXnoy2u{V7n(&4;;``D_A)42O0r@pa4yAQm7wkvbN z|BQx?c==h=s)XZvCY{Y){}%Lrcf>x*y@9><-D>BLo`Ky*nCcb!Xa9STcT}wk$UpWo zax$M=w^`vo%ATS_i2F)w-E;IA;Q!y6#M&^-RKc!bEdSy^q3s9N8?v+N(+%D-J8 zY6zaj6aN7DlZn9m3(UV$ml+TYGzIpFMwl#9?tJ~l--y3$5D>v%lwXgS&}1HX|@OEY>_B^nHi1=g|Y{pH#f=(?zI>_*Q8B>?kREN5(DAOg-wk zPB_?qDkRgf#UBk((E$7(wX1jY|K2%MIwL$@?DtpvA-)4SDI_;qyZ}{BLhERa_&mQL3ul*whG*WJZ>q0##_3U$y zKVTHKlgUk+mOcKBdc<}n4?pY6hn-u;?h5O~!e9C0&Q%59u`0pf{V1J>&(RzkWDgQP zG@FSgfc(EFQhB$3-+$53Du_4qDzlHhsba+e|22evmF(_en77j_J~0x5tgZgjtZTpv zT8g;jR@yO3d3{DnJve?gfabOD(GX(YEKYFFYsd3$qAXk!oQ5xAE(345y!$at6FiyY zXCVG%%O|#5ZWxyR)2gX)OxBO~N=z7s&qQC#v#Q2Hb_Eq_46g;p=x<`%YSw&w=@aQ}Qim z(C_}kqfO<62cwQ})1)aJot7typD31wgjg&6+J9QyiW1gN?O#Ddn60*Dgqw@L&GHKSHWh4F&m2#LHtZQQ-_*hviHUjXBs1Ap9A5xgBjfp#L*iTD52m z6S4JO64qtcg>k7SA@Nlk;-a3{v!{g$q6Sq$?DnZDj>)ba6qUb)J!i&fg)-*I^*>Yc7D`Y?{*KmCzE zTK{Uwnu%o~KUft=qrvSyi{8y_P!nfWpSG+O3|+(Lg5B&77Z>Y>M*{>84YF80{*dq@``0kxUiksZdsyP1H6wWO_GyaLpl#!-fEy<0{yEF zK5UDawCSlb+SHxFW=_611D#6~&YAjb7O?*X@MnLBzQlFoA+Dm=V&uj<6$u@K%s-%c zwBVaD8hxzcG%J5pRZah=|N7pRBRQ_iqv?sf##!gf_~pIoq81OBdh0&TB6|gkmfk6` zgOv`Te~j=$lV)0tB+Ar6uNe8<&P6}|0Smin{-&eWavro(Po)hSz3*i#Dc9!to&Uj8 z(CS5P`b}GQjpl1_CbQ<9TF`%(f@+DqHVr*KdJE~Ft`j-^>c7OSxe##*KBbu*aL09q zmiwpwBtDMWMfoEGA=O|j*1WUws+J~Yf3%H9Fi}_c>?PZmTA{FbtZVzuGD}R_fU^W5 zUMmmAU;ej?wykw`Qcn>oF3^8N?eZ8touj?cVFaAN!UO(WB*O)dr#z9ms)fGtPx}av z^2fswr0HK^y<)w~-#%Kqf7^EcP&GW+;SnXetO6njAF;Xc2sOxG5#ubaCYoJ#*eTV2 z_$WL9`_`eW+zNxv|2&?UhpB2Tw>5*_LEMQe({r--w6VYsOa5Yl7M~h?{&kRuwAPDu zL~jtnrx&~Er?#>)-7*%7`uo-9yo+{O?T zZnlLkMjk|#q~1x_bM+L)msM;Te`fMC|s3+ScO6CMRmWYH!J$g#p~>A^nH{oy4KqO_o$Ukeg#Xwrw~+qBx7}COyMk zUxPg=)&$JI^`4Nu&D-sh2>9(kiM(;rWBeJp{7@&D_fP*?G3?#_FPrv2dPpQzcooq$ z@8pwV>4{K6SFuhfyzQogR$XQo^`HJbkUv9O>p`JD3}`*LXC$ygk^ui0Kx6(R|4Vuc zwa(xm|6!xA1-l`XJso3PpX8eYO)zBs0QL_{a1h;9qYMH-|53XHrs+1|zksES>cRu~ zZ#X*D3w^HNsKEXK*nfifH+*51;xBnV!a?TWd%MxsAB1E5rwwEppkk~}!Ti;m2Xk>o z5|Yd|4KWxjsL&eM!!C>bA}8)3|HG$rCX^iD4@;F{ND=x({L?>?`k1uq@SS%py!t5+fjg zeAh+%GCz284BS71{<-}Q^GR0jEgMIf8D^*KAum9p>Hjx>Gvk|v3cayBLg@&PMGNr# z`}_V6IsZ^(Hc8Y61=Qy7o@R{61g2)a5h?dL5akHLuA`YY1#ZFZ+;3fOJ6ys2(@$xY zu_!A{6UM79=98-hWB4z!Z!!jA#Y)p(`PX*9S3Pa2pt$5lWE>Tb_x_vzDdNhW?Ka(Y z5y3HydQ%cGon@-F9UZzR`gCN=dAX<3*$6MFh0m%L9-Q(q_u<`KG5nJUH$rKr? zPgunn2@TaJ@AyL*2%^$&sKf{+9uP|4_dTK?nWE*u@4$OS5C$*en)amA=m}R-;GDq} z?IeVM7dB3>A+)ES$~56pnhE63`W&)8#5p~54uT;oCf?d0giF)DsL;Q0|Bi z2u2Dl!dhk>j_Vd3^2M|jXtYAd^MAvI2hP7mHqU<~$Lz{#Pak>hx3%n0%A6ZokQPeF z$!=?b{d>0eApa7`|NibjO}wj3`%0TnMURkvu+xfYUs`Rtwcn%q_JHKhzw%JPmuZNL zAw81!^t%&5$}33z5%iBXBvV^A+-d|`k_7Z?L*4ant+}Y0bTw)*$ukjM32-f;c+ z5C59yr6DWXQ$arN1eIRFUUxRA<&{A+b%vt8{Lc@YUu$>UyXr0XXFSObsBAEc4~R=C zdiO?l3-Axbk7Re7ePt#9`7a=U@;#NahUP#iifZ~11!5z)G35J4&l~*7-D9S9lKRfS z7D_fB(7?9H>@sL++9v0q}qP zW&)-9Bhs;Fvm$8*I>|i1{tw0eE-7k`0Rn#wn7=L|Sk)=bIP@fs68R(lkm%y7m%Z5~ zqA$c5`tUXf)zr%RFw4oT)!=oCY=C1x*xZIb%7QdW6snYa25VljKYTb_2*}?`eov+G zHWW{f|lo|AObpo==>wg}Kz-Q@YE88Ce$Y z`^i(`M8CPy?2&bfl?Y;YABYLMYD_*&-g^@jl-^ zZ^hRpi+AVeS{3x2jG98x&mz9!mCEtMjWqFxm zbLdYc5eWaz>SNfoBapx6BPM~BjC#3tO}p9`pWgh1i+|tI?H~Wm>$vVQ4d`KRsm7Z} zZs`V7nqms$w;Gkyq#wz}dd}q->!D;~*72{)@wB#Lxh16i3ms$}1OW;ZlUIgBN&r?n=V%8aNU+VKENeWo^7PHU3lPK7B5k{??*ob z{Uh6bDDk=6Qjqr?uXN9%<$PJmm%o31HA;SsGdFyL=gt4g{{!bAUGaj2pnqACsQ4!$ zr#=?A|K6cYiD1r*3w(@mfZNC{%;*i9dx0I4uQGE9#kJl~X$iUinq$4&oC`I4=Ow}M z!5Y}Vf&BU2gt#t{e>krmTUb{5v>= zj`RTUzYK)@E^?nAI=mV5{F8qjL<8oZ!27rF3};b-SZJwXVtb5N-c?w_?ZFHAX$FSj2LSj|O}M&Exy;3)DlnE&u^ z|Efu1T_4w}2b){|m>(gMZ!l#4aPtU-WkM>+&wQ^6F%nu69`ye;r#rQoRavHProAW@ zSPpJ3*WnCSx(Amo{3!A8B20(Ku~j0%9dpF#E#Mz@bs-E=0rJoKn~~QQkE{535>@+z z`aIbG_HRJ?hjCVqWs6g=?zMA<496nCg~gM|{F=XwYf!q~fcw8+^QZWEIvXGY`}S1_ z|5DKVGJt=hfD4@h`e%N6CQ~IC8^-$JPkB@T{?{PSCCFbksiQbDW3xUxBvY9`Gqv~q1I~x{Kv6bw6K?781dm;+O}e@YTr!K-p!w3<+DfX zOv8rRW-ui{|K)UM1XUm4zc?>?q2UMkzpP=q%rfwlUszh8xk~~4N7Z@1gItdMhZ7@? z_iYg+;HK&u-Yhb}_-1)I4%i59sFc;b+&<`4D?TKZy^IC?L+p(pjVba{-UJn#pWK+{~@4$<*Ntg zZ_Ul>$b&t1g`x0beU8Lfuo4X#gh2k6+ajK+)C9@J@A>;(|2}rL+{yGNC+$qtc(Ibd zH{q7m3Z`6jStqHqx=N+}HH@l6Ds?~4hTE2tf%U)sPg)!4-oN)x5dS7*{@QvzxEqI{ zAxdBFHmWvozaR8Jd+Ba+zUm>CWdr=*WWDBZVubFQv!8$Wq9k&iTru!M@{on$czHAA z@Ie%pUS7_Bf8g==8M&!n`2*3&~d&%Zny~^LNj`^2fJmPp>lp{~O4k zBnJAI)jZHz^G|b?!TBe`cZYxYbA?Yp{^pxQaQ^T%=ckV4CVULcIG8`Q!ePp*>dnt% ze*^1Ynf(ucst?S6l^WGogpM>zQH&7jmE4S46UCWB_-`;rPMKxD&9oL5@%sFNPjg& zwNUDM`sK2E{lgu9fX;&^ad;{GSVnSMac_)BBfZ`k;K*n5rPy&*h5^XD4)`MJ#5@N4ZlNd8UoSN@HbUsMF#KY;v~ z`=J`&c{@i~qM)^w)-uSUEmh7$UR~Zl+ZEerG8&>|UV35id;S3OUm^L=BbHmLeqjFo ze5njJ^!mvar2qIgfBbL$^Pl{2(7*Qz;Vr=j?LZ8V&qpt61V)1&AiL=gV22@!QxaI= zth_!|)I7=)AEA}$GI^v5={mL(7zXqI?Yl;=SmCa59XSsW9O*B z`~ld18MxWca2|-&lA8Ae@+aaQUtfNHTR08jk9V{ij->zIzn=shdwYCdP|0R^Z_kLv zf=6e|-`JLMC>5pyYyG$XQ$hPb&)>I!N`;X8jT%=6ib~ocIYI-O(Q&%4lPT_wFv4)N z%IUtsTL^!UZ#0SvfejX$*e$ry|^Ui+;9qz!8=!$ttXec+3=m@2rVh-{j z?)+nZ<)6bTvBRP}M{wKpLI0IF{-gP)Ij=$f&Kn$K?E255&izH4UVp!TZMgIJzs+#P zWRvps@W8`zQZ~4dC=bBh2l*S9cAYhdvE2C@-?f(S_V1woeWA~~e%pMheTpH+L7>3S zMSDKN;PsM%TfRED|Ag#+LH=DKk%cFJib@!oQz7Miae$rXA*r4(4xlY@MC%1tFh`j9QmQH9s|upEkppS1M$>fI=Uy^dG%1_O zUfD>3Q8t$n4A}obFU)g%E)gw7K>lUbl-Lc{o`)Xbyk98%e$lp z_y0HfGG4YMCo&NJShvXYb!~b&4YAo|A$y>ICnCJ0NDTCq>8jKKSJA)ytAUczxGB<8 zCkTHiyYShJ^k=mh1ncCdni@5>w_cMm@PIUG3 zH4y)wr>>r42*7`mq9L-y{~mpz{tPQ272t2C^&RE$GiDdgtQw;AFst-z(WW#bdN$>6 z*=knchO}832m94o$eoJ(5ICdtX1x#^bsDM?|S9AXGc#Ch1n^gI78-h76J zgI!CpYy7U@+@CH{dPa6~^x=;Fv_9@&+AA-U!uSGB%`s=3yD z*WoYzp`5Z$3Rg#BaFi>6^zY(!=b4`n51cmy0{9c1dHE54@=wxpK>w(C$|BmMO<$mYMaE=D+(L6d;zhPovS5{t zq~zd{>^lI;0pX93zG&GR_uph`H$@Q!{ofO*A!J?6gie9bq;H7;|Ks2Dr%gwK;70@e zJrMrZYa3gQl%@BN?j3Iluhr{+Xvaa4l*7$+-OoZN{0{8@5OB3%^8x+^Gj{mUYLBB+ z(LeaW1M5E6jFBQ(s=KSdxh4VQyyMKUSQQuV(E|VNxu>>Lz8rDS!@K-3ThQXhTp%!fz$dI`^+a`{nyR5ODs_7Bd3V!~!IF>MzW#%dSZ8%;EY-IoV5QCmC zBl_kNB_!`*wykyM-}^5QxVQKIr}^*MO%0C#R@SkgS%T!(AqhE;kRjJ!`QPi2Ly-T> zQsXtHJxtJR5!tk>!BhN0J7*RlN_YgP*UBjQrX=rlKL1C!2;Y$+M`Z=yEa3m>)+TH_ zvM6kZ6~gMtS}yIKlLHJ=S~{SsHIf#O=2|AK)0 zz^d(1RmC@me|wU*$pmbkJ%p{%iaXzRDb&M9&MnuZb`ACAOMPM(7`| zyae;F)~UTN=r_)uko?CnD>Tgqp~!#w2Y3DpJiVfQcur@!CE8h^r@>nA^~jArWOXcb zJ2Jv8CER_9KOYK=pJwC|@hS2>x_qhFV`td^G!3~~zExU0*I-f($p8NBKZW=QnKT2q zJ_7rHGuxCK5UJWfa9|p8D+?eYs3Yv~-UA%+S?z zLh%s;R=p^g6#hk*JxLu%|NH0_MYQO+`0xk%@7iP9=sgMlF@JlDW99Imv?>VCym}t_ z{Zqhyb@)?!59~iYas>0gVE*<*^gFVB!P$&)`Ca~O1Semkp1h> zLrERt6WyN{XDdt$ZkJ6(8rCi0Qh!GhO;-usc>S#@J8-yL z6z3puD+b{2j7){0O|)*Z}-zxG=R+w)~Sk8OupT zZN6Sit?V;ev{o9k%N$7$tNS;~gbPu$g;_B>@mPABo^l*UbS)%Zui+?pp6Ohh`y5O1 zpd>sh(*A@0Qy%r7{_((Y;qHMV0hVXi$sgM9B9LJ=mMi*kgnFKz1P)O%qR!|yt! z+CM47S}}qCJEmsE*KWZ7R;_i-PCZt9-TT@Cy5LPCp8P;4?p9OpNtc#0@x#KHg4r4O z@3jE`s!isOf0uY%Lksrb4aCG5t?EGk!mZlnN2hNP{-#&)r(ja_porE%%=gcL{41O= zHW!$GwfWJ8pN652Uh_%FzB`ZAy&Kgi#+5#L@&#Je+DxEsmAlBpUUQ=g6r$tk6=mN$|GA>ExtU_~rhfOk|MUF$ zjz35)?@Hee@b~nss-NGy&>1RRs-5=S7iI+S|AGL2PR(@z_l4v*@r!aej{Ae`&WIH% zA?|dyDu3rM6qa+OJ%6wQ`;Scx>ePy?47%U^<=^*T2!G~gZk%oi=>MZ&^~x#&`9~$s zBCUO(e-xdu^qK|8pH5@1Ae55Z>WK8ltXnOzF9a50iYGcl%O}or8OdH67Vv)aZvguT z@;Fe*0$j1XHy%lp@kR!J&ELtfO!lTFljydc@4Kn=s(xKfw^CH%aqCPY->T$&WlrE*vCX*eS1dkiQ=S^e;l+ zEymIl#w7Jk5_X#mb#kK15D6`76vn#$1pC((gsqD*uSNj>&JdnusxN!WR~!7My~Rk= zCSPgpAv^OvD$qYP0Qd)LWsxfWoWG<{^>MGeZaLYHf&JrZGd^M^9&8=GuMy^)q4FfX ztdRWo=+%Q+TY&!r`rpd%kUhct>n4!Du%Rg#crr?%2wO5$Axr=6C!$i}R5RdzD^@;c zAO`pYg0P37%(VXB_AEni0#%>--Q{0ZURqmWc*?Y4La8kT9OZKrvN1=g1DQ{9Q+meyZ1rmzeIx4(%*ShJ(x->^|EHhttMQ!I0B!9N^g#WS z!!7ANPWJ6F)Va^dXORj=bZ@@wpB&%upXOhpdN8*>VH{1v)U$+YOv+9xV{M&A29lI0T;Rz+Bx&8+{GziROImIV*!pTHD9@dx?G zcyk{N;BIv45nvkE$bQYAozO|F+_j{pSo>2TNRSM&khh|HQL&bQLE}5q_rW zea;Fqd;o{x;o@kH+&c`s4^LD8{w($5p*aD@oTAw^BlLb&@w#=Ysk0q}uJRlIhe2Tf zCZq&MD#Z;>G3gt(u^h<%`9^cwXd)Ezcm6A!Vj-xB-P-?=lp<*!p}9^a-@L-lD5!8L z8VT%9`P=$nGjrv*xpy2-S!q2e4%6WDOzvmqx*|Nw8@(zM2l6*72kc+H){>AS2X=wn zKLcJEMit_|@wg9-bma;+e$Fy?ikKqef;z*Z`y&$ohzc;yZ`?CldVl! zU?7@wj6E?wHs$6t{`>FG-EKS)h!>0n>EC=ZTt<}5ba9%b7z;1}{2Sj^Q%R}Lg6F7} zJej*|nb?>2xfXl@{x^dO$Y0o)?3OWpuQBKbEa|l)Zx@JPe5Jt=kvQS=!mQVc2K%qn zTeG&fXy(12RBSFR`5&37Z51m8T=6P^`D>QE$D4RhALEL9YUf21J5eZ)y} zPphWU`tbClPURW35>#@?Ej+J87}qBuj(qQ?hziwytgGdhFIs3)d>_7>(Tpe#vwQ!t zl1@$j8e2Vz`~7|(JBlvN_Gddhbc;Sn{!;U={N?}M{?)hYH`nMaEnOw8u55v<4INR86Z&-+{ z?e58S{lvXb`2NAMMRVET{-=VFP}}Ou$)|RTcl=YIApW*)fdAKXKr(EiHZ%c)sdk%< zbYm+UsNqf)w>(_O5C42gy-@9fB(M=>%e50lWeqo8q8IsRfvmS3>8UK%4CtT!Kkq-F z^hsk7V%p%@dk3=~27ElDp0Wh|qo{#1LeL4?paQ_nyPhCc`xkdn=t^>tYws8XuQ;7Xl zIWGx#^M~>e3ifr7epc*Pfop=~Pu19HJgHAJ;SFDsWEXfK>*Y^eS4sf+tJOoECI793 zr%a}go@{;|x7avhO)*3$^8oV1{&7<7qI zLpB*Vf^yj6DtZZRTADnpO4@(jpMJfHAo=K#(XC+ro$FZpKh?Z zSKy+hE#m(%pGusX*nwy>=3GS!JvPbmQYo=}H-nuz^`HF{-V;)>^=G9?ub_vh-va#Q zjum;I@oJ$E(7zf4_4tnYLWzk%k5 zWm`Gq`SXeA)N;|1bhwo&^^QRo9?M<1yHjz$I z3KIhKAF_V;&&rPF-3_qaS`<%GM>?#fQt$lZIXCFxYj%;(c}xW-R>Cszc@+fst4M>d zY48zaRXQDEoo_F6h@#=5MK1@-$`hu^&s~yTZToD5Ruu}%4A-{W74tR;L=S>ocMqxA zoGCgP$YRWL?34H^Z?@(Pm;#Vq4SQ0Emd>+arY&|6nlI=id8TEUQ-+_}Ms1(+EGp;7S@;q42%Egv*Fx!aOSZD#`M>g0XBzb`6@u z;$&U41gY=oKdPT;s6?pnqInIOKQL(evGq2vu!H>%Xmh=>w@cO2?)yUj+&?rtmk2Cn zXQ-{~(D*4Q_`J~TwW0$!ke}1;e6hy|^6xWhc30Md{1zHJ;QhnOZ)1H;#qPT#PYKsM z>K27D9nLuAZvJl9hd&pW22fO)OFk539;KOMxk3C}_~OtjOsJyO)XKe$cB@#%Ix&Zv$VPd;83M z6($;XVhn1>Uv!-~espzfGvv6F_hX9>awl6P=}kx;Ob*_Kzr5- zlvdZj{!6rWHK~>k2>+7XLCO**aJsuuD0IPOmSN^qCL&*$<%v+pD4m+Xj%qT~m`ic0 z1i2j_)Lsw+mCxL!i9cq5vVyk-RQrom>?cNMFOglun-I?xrup7-_dZ*T+WoAsVx@}G z_P;ti3%97+eGL6-H4==gp>#r=9(4n`~IHizTdXzr>*C)uw!2K&-zD0u<-%@JLsPS`6r-%8RXw2 zj=XKNm|-J4@sWRf^VMe3U6a03rQ5ZL{LOkezl{;rBBFno$0{{+kC<4Bv(=kXXYe`` zJIC-HEZ>nf(ll`X#osg`m`1c_ua0>#Tlu>3ESp(~#Ihb^>bv3e!ijf=n?;>PRF8+X zPC;2vbglV~m&@Av@yItynaPlo>0j--Y>2H#mQg9C_+Y9fEecyIomu3G%mvn$=<)c= z;h)8c@J4JNyG7H*n41In+YcVaH%(o=JSc-S`|1AVznbM_GMVDdw+8|tw6>a6=fxb% z$Wg0%?byzFCFWnY+tjkZQpz5NdmsGb67yy6=VwcHF7?lnZ^At`PUf|s-xlABuB1@| z`~QAD^vVLON>L1*PcssvD4y^ft$Hy~x{fUxd!WM<6+NuaF8Mo_7U)ir)fmSrQ(jvj ze?f4ojx&=pQ(uNfk&oI!b#S1do%~brjfhMB_r1i0>%!~40RM=d(~$=3e_5qFB|u6q zHm~v@+0_a$MB$X?VE^ea&z}+N&L<~wf@i(6`p#$1BqVHgcZxMbFCc1K>U)nkG7ncp zJFF+31N?hJC|@p3t^)E{<>8z|-MQC~v3mS?E87XRhn5>~U0@s-o^2 zxefLEwK0Qf?bfrG{%y9DudgM|`!Cdan=r2C4^V4k_Y@&~Gxog&S26ym?Q@SrhA2Zl zME=Ibl`2^6JvkzOBM`0J4(W2|x_bZg7iRvJh zA0jgKfGlEe;EKQZ(}4OV@^gu!EB;^{^l_89z}$n({6~wc^|)r8dza^*Ab$$U@Qvf~GO*4M~Tl61~^^H+bOpyrY-X=f#FI#Yy-_Ch*4 z7(OX?DWldtw|S}&H&-p7&c*0Vv6X;gXikxm?h5XIS{$q%Hg%-r!v*UY&BjYM8s-C! z9`I4TdE6pXi&gW;_Y3ti}e!v>WKA!Zm92skMfU4 z)s2n^KLP&R39AlfTBNi*H5*+oiVdWAo!LK&D?K&rKcBzu%i@l=>zy5HmR|8+#7ASq zY}Xisy*z2*Iza!;NTOmpMWU=e#Pebt1uk)b*#G_c{a5)bCMDRd_A(CO`*(Hzwuss$ zxc;F})pby~@U%b`I)i5-IY4HVbH+i`!ET3?tLO)%KUO4~?luDXL+_;w*Y$6)>d4L} zOFD0}iA&vEQ>Teqp5Um`>w#f=p(7bmMqtFqob(r8=0D;bEE>#(=6?6zLH_g#(VcHW zuG_l|SI>VYIRBF6vHvm5@?PXiym3HKt&dUQpj*rTCI4XZn?G<6eB|%@DG4h8s|9iX zin}q#GoGu_O!0^RWE@swgSz+BDf`_~hBVNB-r=}l=oSV0m*?6w9K>x{oQouQJM>Q` z=v*@4kc>63|G$~&&;eJ!I{|YV;k;A#(PS(=Z5ZrdZd<&qYN!YM&xR_QT%(fv0Y7}) zKSrbbVmCTU-(+E(v;K*HwnV#$l73v*kgtvG5xmm+bjRXxQub!NP--mN9MukS zJ*Ur8&8fFXUc0yrSe!p^uXggl%1<0p_cQG)I6n}`8skK-^hQyYYpWDukjIrlioIY3 z|L~s(X4nJ#b71}jmOW#-45CKhq& zYtekkk;v0zoA}jiFzZYH*1g@h8VaRUACSM{Q*=@0-YCBEl}TW!k2cZhW+Uq9oun)O z+N~Cle}}`!%F-i<;@(@2|4O{bXvYN6f2)X3@NU6eGWOC{%2cH5#{HmmTSkVM}3adf{fQPT6KeUf zc(ZvKeyRdt$aUzHYsRgkzgIBNLy)pI*%$7tN9iZ?&=~Z8g8f^vVgarl1^%*Pk@vCX zOU+uQ7#e++u+^22@2x_i?x25-rid;t3$;z4P+&dHQBw=z-IYdrhl;@R`lsM;it6a_ zNQ>`sQH|@bco>pW2BztHZ9x9D5{>xc!>n+ZpPe-6q*f$#^D?lZBC(JmvS+UY0RIM* zx@mVY(xxRuS$y2xG5OH<^znC`+4{|DC2L&MX-nAt-cM_tK~LLOg&jluG{V<^w|~Gh9i+&{*r&c_IZlyLzZ$4 zG3Ahk4rc>_Zcv%&F~A>5$Xt&VNQp+Bqu9iK$Kq-#KXkeN4KJfm$?(I|&)Af*e~4lC z?*6yv_m$=ni2ei4i)_9eH@EEATk8?+Vy-V@ql7XY)-1FK9=^gHGOCkSD@AqvJN+xf z{}1qQW>wP={KYH(TPLnXj0b!4M@zi2FSBsd>Z|+{|GNS0&V&R+{;4QmzB2Ha%H3Gn zu;UKRYDu|VZ0}f_3_V3IX?CS}%#g{d_mpFqwiAl#=3i2sp0#5OnGqKx6H&-%C(Ev> zNLNMnrL~b{wrQXuZf;gjS4bt3^K9(S;@Ww@ z=NdNeRYGHevGzx12PjN~G(rF9AGZSjgKd*?<7=#u9i#{T{h#t23D)myF1m1TDB#hqW*XzTVu!syZA%yPA;K;5@-SlZ#A_XYeLZ03TxXF&gyILW;JZpF2C zIK)XIu>|c;QH+y3rBMkWe2GnVsj%}Ns67atsW<(C3WPH-P^D*Qr zZ-)(@v>@Prm`r`i+}%p+5r)oGOuw^DgPCfGDqOmSgpN^2wW^l~@Gmd>7u`1&)%(;j z8eiI3t3*wod+m=DqYS26kE&{$t-*~`_LMz>g-X+0y%x6beT@M4KY#Y$ZTYuP)IR>j zKXNMby0^@<2Pai_gN~pnVWZ5=^7QSiLk+WqUm?c;e`MK1WS$7#HM_JJ@U2-W*tu8p z$ciG5DhuhHien3r{{iP;*YpysJy&mXw92qwtU*5G$(^i>+d^9ho#;kI6&imEngxUW zyB#Nqc&dnna6av(J!$6B6X_S936ApcHCJE$z5J2#q(R?r{*Nhb%=HAhv*Gf0uV!zY zc_ul7{;32c0kJ>~bCD`+Xljm5sGEQ2+$Q&o=kk;Si@C7wg=0ri4Ebl#X1+k)@dM-N zCBVP7bPMDU7w-kK51}4pcn&2RDJ_Tk&56o)eSWr3QuL|Eh_>Ue{^cT}8TsG*z0Vos zFUflYGz0``jB@?X=`W5{4m&M}*?DrMI{{S%_9l$6YA_{59 zDdu~XXN-zYi68L4GWOV}$4XM#3Z8EI-=y=Lyz-A&oi>=p}OR-qs1En~Q{)v{ND{IwduKkRL6@*r%i@RkBFf1_NFy)ZDPO3ieac@;;3WmOrr)%SUYHrC{=f!@W?eEfKdw26;S@qLzKYFzb z_UW+dC2seP*m=G)oWCzuzXuqn2!k7Qm#mDdA*Cqqv|)>6HgXe8Pbx44D0{e^Fp4yS zT^N2Tku3~bU;_NbEB>qH?cw?zr&1Z4_Kf_ym1u{3TF2Iu0DmSOshKyAcQxhNKhNJ0 z{jcDP(Ev)U_MU{yAnq1cyT#;>!~5sZ@{}VlHed5eeawMxVs?wIx81Y0g)Jf5La-+U zGx&@{ofPqpI6IJk@x~3%TcKY@R9af;5+;mef{{^WbaQ^FVOyJg_e3&%c0hLd^%AZpwSBe+= z`24@upAhR?pfWxbLvo(NSHuuGc0|S&7m@dBSzIn zBI1`dR%bIxnys?SO5K-!*b?G=y)+Na)M+0l9&KU*(ZAl_2>a0i@JC1V&!5qkG8X2d zzZWhM-pYV#Y2WebeoH4#O=yKP7qY9Mh87lKzW*Sy;Y$+tKlNYOmA_lRdlQ5;&QW%Q zWt>cO5Lt|>9Y_1k4<@X7M$3a#Nw=p|d-w4t-WyyTYnON2d$g*}!lETP5f8Bk_?ve` zr)7v=%nvdYfZt!oUq=r~LeByJU3*sc%OUbzyYQ!`)sF!F+2mA>jWa{k|cwQf1V`#5QMY1^9QZV_O_Bj_h4>D^Idyi!(@e zZvCR`5Dtav&gESM9m^l3G_e{Kha2XmeNp&Z_g`EzZ_3kUp_}d~Ii%e>y_(7;cFVfU z@&9)J^ZWkmmzMW@KIl#f@aNmlhW8V%8{FqC_xhkaK-=#S`-|J(6y%Ru#8C7~hdNSB z;YNv@RbBP(xbnI*yW^q|{kxJ<&Gv9)HR*WT4xUBm8q~Ho_@~o(nWX>;`RScdv(Ko@ z)3?U~{=>hnKNGVy;soEsTuYlN8g^b6VP^Igl%XL59LES4~)`t;BS0(o*Zf7Q|YVa``@vW}R)I&x)D=jh^I@o(~i+=ty1_Vh0K zLx%4_{(mwY1ye*8E;#YWKdaS4fx6`Yi6MXS3C^uizXSR&B|_$|?`M)5fb$p8AUAyQ v`~TPThei#;8XxA1p!kRWu{#GOx{Q%z`JvIC*X&1nBGZ1oaV|{%dhLGzFQk)} literal 0 HcmV?d00001 diff --git a/BKPS/OLD/EURUSD-5M-V0.1/EX5/Libraries/x-saherelm.xtm.indicator.helper.lib.ex5 b/BKPS/OLD/EURUSD-5M-V0.1/EX5/Libraries/x-saherelm.xtm.indicator.helper.lib.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..23fbab8ccfa96e70122b0c740037db14c4a69c7a GIT binary patch literal 8864 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 0 && !IsStopped(); i--) + { + // + CalculateBuffers(i); + } + + // + return rates_total; +} +// +// END Event Handlers ... +// + +// +// START Functions ... +// +// +// Validate Input Args for Initialization ... +bool ValidateInputs() +{ + // + bool result = false; + + // + // Validate Args ... + bool isLCInputsValid = + lcLength >= 4 && + lcLength > mcLength && + lcLength > scLength; + bool isMCInputsValid = + mcLength >= 4 && + mcLength > scLength && + mcLength < lcLength; + bool isSCInputsValid = + scLength >= 4 && + scLength < mcLength && + scLength < lcLength; + if ( + isLCInputsValid && + isMCInputsValid && + isSCInputsValid) + { + result = true; + } + + // + return result; +} + +// +// Define Indexes and Styles ... +void DefineBuffers() +{ + // + // LC ... + LCDefineBuffers(); + + // + // MC ... + MCDefineBuffers(); + + // + // SC ... + SCDefineBuffers(); + + // + // SIGNAL ... + SignalDefineBuffers(); + + // + // Hot State Buffer ... + HotStateDefineBuffers(); +} + +// +// Set Indicator Short Name and also we can define Buffers Labels ... +void SetIndicatorName() +{ + // + string indicatorShortName = ""; + StringConcatenate(indicatorShortName, ShortName, ""); + + // + IndicatorSetString(INDICATOR_SHORTNAME, indicatorShortName); +} + +// +// Calculate Buffers ... +void CalculateBuffers( + int bar_index // Current Candle Index ... +) +{ + // + // LC ... + LCCalculateBuffers(bar_index); + + // + // MC ... + MCCalculateBuffers(bar_index); + + // + // SC ... + SCCalculateBuffers(bar_index); + + // + // SIGNAL ... + SignalCalculateBuffers(bar_index); + + // + // HOT State Buffer ... + HotStateCalculateBuffers(bar_index); + + // + // After all Calculations we are ready to Draw what we want ... + DrawBuffers(bar_index); +} + +// +// LC Buffers Definitions ... +void LCDefineBuffers() +{ + // + // LC HH Buffer ... + string lcHHBufferLabel = ShortName + " LC HH (" + (string)lcLength + ")"; + ENUM_DRAW_TYPE lcHHDrawType = lcDrawHH ? lcDrawType : DRAW_NONE; + ArraySetAsSeries(lcHHBuffer, true); + SetIndexBuffer(lcHHBufferIndex, lcHHBuffer, INDICATOR_DATA); + PlotIndexSetInteger(lcHHBufferIndex, PLOT_DRAW_BEGIN, lcLength); + PlotIndexSetString(lcHHBufferIndex, PLOT_LABEL, lcHHBufferLabel); + PlotIndexSetInteger(lcHHBufferIndex, PLOT_LINE_COLOR, lcHHColor); + PlotIndexSetInteger(lcHHBufferIndex, PLOT_LINE_STYLE, lcDrawStyle); + PlotIndexSetInteger(lcHHBufferIndex, PLOT_LINE_WIDTH, lcDrawWidth); + PlotIndexSetInteger(lcHHBufferIndex, PLOT_DRAW_TYPE, lcHHDrawType); + + // + // LC LL Buffer ... + string lcLLBufferLabel = ShortName + " LC LL (" + (string)lcLength + ")"; + ENUM_DRAW_TYPE lcLLDrawType = lcDrawLL ? lcDrawType : DRAW_NONE; + ArraySetAsSeries(lcLLBuffer, true); + SetIndexBuffer(lcLLBufferIndex, lcLLBuffer, INDICATOR_DATA); + PlotIndexSetInteger(lcLLBufferIndex, PLOT_DRAW_BEGIN, lcLength); + PlotIndexSetString(lcLLBufferIndex, PLOT_LABEL, lcLLBufferLabel); + PlotIndexSetInteger(lcLLBufferIndex, PLOT_LINE_COLOR, lcLLColor); + PlotIndexSetInteger(lcLLBufferIndex, PLOT_LINE_STYLE, lcDrawStyle); + PlotIndexSetInteger(lcLLBufferIndex, PLOT_LINE_WIDTH, lcDrawWidth); + PlotIndexSetInteger(lcLLBufferIndex, PLOT_DRAW_TYPE, lcLLDrawType); +} + +// +// MC Buffers Definitions ... +void MCDefineBuffers() +{ + // + // MC HH Buffer ... + string mcHHBufferLabel = ShortName + " MC HH (" + (string)mcLength + ")"; + ENUM_DRAW_TYPE mcHHDrawType = mcDrawHH ? lcDrawType : DRAW_NONE; + ArraySetAsSeries(mcHHBuffer, true); + SetIndexBuffer(mcHHBufferIndex, mcHHBuffer, INDICATOR_DATA); + PlotIndexSetInteger(mcHHBufferIndex, PLOT_DRAW_BEGIN, mcLength); + PlotIndexSetString(mcHHBufferIndex, PLOT_LABEL, mcHHBufferLabel); + PlotIndexSetInteger(mcHHBufferIndex, PLOT_LINE_COLOR, mcHHColor); + PlotIndexSetInteger(mcHHBufferIndex, PLOT_LINE_STYLE, mcDrawStyle); + PlotIndexSetInteger(mcHHBufferIndex, PLOT_LINE_WIDTH, mcDrawWidth); + PlotIndexSetInteger(mcHHBufferIndex, PLOT_DRAW_TYPE, mcHHDrawType); + + // + // MC LL Buffer ... + string mcLLBufferLabel = ShortName + " MC LL (" + (string)mcLength + ")"; + ENUM_DRAW_TYPE mcLLDrawType = mcDrawLL ? lcDrawType : DRAW_NONE; + ArraySetAsSeries(mcLLBuffer, true); + SetIndexBuffer(mcLLBufferIndex, mcLLBuffer, INDICATOR_DATA); + PlotIndexSetInteger(mcLLBufferIndex, PLOT_DRAW_BEGIN, mcLength); + PlotIndexSetString(mcLLBufferIndex, PLOT_LABEL, mcLLBufferLabel); + PlotIndexSetInteger(mcLLBufferIndex, PLOT_LINE_COLOR, mcLLColor); + PlotIndexSetInteger(mcLLBufferIndex, PLOT_LINE_STYLE, mcDrawStyle); + PlotIndexSetInteger(mcLLBufferIndex, PLOT_LINE_WIDTH, mcDrawWidth); + PlotIndexSetInteger(mcLLBufferIndex, PLOT_DRAW_TYPE, mcLLDrawType); +} + +// +// SC Buffers Definitions ... +void SCDefineBuffers() +{ + // + // SC HH Buffer ... + string scHHBufferLabel = ShortName + " SC HH (" + (string)scLength + ")"; + ENUM_DRAW_TYPE scHHDrawType = scDrawHH ? lcDrawType : DRAW_NONE; + ArraySetAsSeries(scHHBuffer, true); + SetIndexBuffer(scHHBufferIndex, scHHBuffer, INDICATOR_DATA); + PlotIndexSetInteger(scHHBufferIndex, PLOT_DRAW_BEGIN, scLength); + PlotIndexSetString(scHHBufferIndex, PLOT_LABEL, scHHBufferLabel); + PlotIndexSetInteger(scHHBufferIndex, PLOT_LINE_COLOR, scHHColor); + PlotIndexSetInteger(scHHBufferIndex, PLOT_LINE_STYLE, scDrawStyle); + PlotIndexSetInteger(scHHBufferIndex, PLOT_LINE_WIDTH, scDrawWidth); + PlotIndexSetInteger(scHHBufferIndex, PLOT_DRAW_TYPE, scHHDrawType); + + // + // SC LL Buffer ... + string scLLBufferLabel = ShortName + " SC LL (" + (string)scLength + ")"; + ENUM_DRAW_TYPE scLLDrawType = scDrawLL ? lcDrawType : DRAW_NONE; + ArraySetAsSeries(scLLBuffer, true); + SetIndexBuffer(scLLBufferIndex, scLLBuffer, INDICATOR_DATA); + PlotIndexSetInteger(scLLBufferIndex, PLOT_DRAW_BEGIN, scLength); + PlotIndexSetString(scLLBufferIndex, PLOT_LABEL, scLLBufferLabel); + PlotIndexSetInteger(scLLBufferIndex, PLOT_LINE_COLOR, scLLColor); + PlotIndexSetInteger(scLLBufferIndex, PLOT_LINE_STYLE, scDrawStyle); + PlotIndexSetInteger(scLLBufferIndex, PLOT_LINE_WIDTH, scDrawWidth); + PlotIndexSetInteger(scLLBufferIndex, PLOT_DRAW_TYPE, scLLDrawType); +} + +// +// SIGNAL Buffers Definitions ... +void SignalDefineBuffers() +{ + // + // SIGNAL T Buffer ... + string signalTBufferLabel = ShortName + " Signal T"; + ArraySetAsSeries(signalTBuffer, true); + SetIndexBuffer(signalTBufferIndex, signalTBuffer, INDICATOR_DATA); + PlotIndexSetInteger(signalTBufferIndex, PLOT_DRAW_BEGIN, lcLength); + PlotIndexSetString(signalTBufferIndex, PLOT_LABEL, signalTBufferLabel); + + // + // SIGNAL B Buffer ... + string signalBBufferLabel = ShortName + " Signal B"; + ArraySetAsSeries(signalBBuffer, true); + SetIndexBuffer(signalBBufferIndex, signalBBuffer, INDICATOR_DATA); + PlotIndexSetInteger(signalBBufferIndex, PLOT_DRAW_BEGIN, lcLength); + PlotIndexSetString(signalBBufferIndex, PLOT_LABEL, signalBBufferLabel); +} + +// +// Hot State Buffer ... +void HotStateDefineBuffers() +{ + // + // Hot State Buffer ... + ArraySetAsSeries(hotStateBuffer, true); + SetIndexBuffer(hotStateBufferIndex, hotStateBuffer, INDICATOR_CALCULATIONS); +} + +// +// LC Calculations ... +void LCCalculateBuffers( + int bar_index // Current Candle Index ... +) +{ + // + // Detect Cycle HH and LL ... + int length = lcLength; + ENUM_SERIESMODE hhMode = lcHHMode; + ENUM_SERIESMODE llMode = lcLLMode; + double threshold = PipsToPrice(lcThresholdInPips); + double hh = GetHighestHigh( + length, + bar_index, + hhMode); + double hhValue = hh + threshold; + double ll = GetLowestLow( + length, + bar_index, + llMode); + double llValue = ll - threshold; + + // + lcHHBuffer[bar_index] = hhValue; + lcLLBuffer[bar_index] = llValue; +} + +// +// MC Calculations ... +void MCCalculateBuffers( + int bar_index // Current Candle Index ... +) +{ + // + // Detect Cycle HH and LL ... + int length = mcLength; + ENUM_SERIESMODE hhMode = mcHHMode; + ENUM_SERIESMODE llMode = mcLLMode; + double threshold = PipsToPrice(mcThresholdInPips); + double hh = GetHighestHigh( + length, + bar_index, + hhMode); + double hhValue = hh + threshold; + double ll = GetLowestLow( + length, + bar_index, + llMode); + double llValue = ll - threshold; + + // + mcHHBuffer[bar_index] = hhValue; + mcLLBuffer[bar_index] = llValue; +} + +// +// SC Calculations ... +void SCCalculateBuffers( + int bar_index // Current Candle Index ... +) +{ + // + // Detect Cycle HH and LL ... + int length = scLength; + ENUM_SERIESMODE hhMode = scHHMode; + ENUM_SERIESMODE llMode = scLLMode; + double threshold = PipsToPrice(scThresholdInPips); + double hh = GetHighestHigh( + length, + bar_index, + hhMode); + double hhValue = hh + threshold; + double ll = GetLowestLow( + length, + bar_index, + llMode); + double llValue = ll - threshold; + + // + scHHBuffer[bar_index] = hhValue; + scLLBuffer[bar_index] = llValue; +} + +// +// SIGNAL Calculations ... +void SignalCalculateBuffers( + int bar_index // Current Candle Index ... +) +{ + // + // LC Values ... + double lcHH = lcHHBuffer[bar_index]; + double lcLL = lcLLBuffer[bar_index]; + double lcDelta = lcHH - lcLL; + double lcAvg = lcDelta / 2; + + // + // MC Values ... + double mcHH = mcHHBuffer[bar_index]; + double mcLL = mcLLBuffer[bar_index]; + double mcDelta = mcHH - mcLL; + double mcAvg = mcDelta / 2; + + // + // SC Values ... + double scHH = scHHBuffer[bar_index]; + double scLL = scLLBuffer[bar_index]; + double scDelta = scHH - scLL; + double scAvg = scDelta / 2; + + // + // Min Value ... + double minValue = MathMin( + scLL, mcLL); + minValue = MathMin( + lcLL, minValue); + + // + // Max Value ... + double maxValue = MathMin( + scHH, mcHH); + maxValue = MathMin( + lcHH, maxValue); + + // + double operationalValue = 0; + switch(signalType) { + // + case X_XCHLH_DELTA_SIGNAL: + operationalValue = ((lcDelta + mcDelta + scDelta) / 3); + break; + + // + case X_XCHLH_AVG_SIGNAL: + default: + operationalValue = ((lcAvg + mcAvg + scAvg) / 3); + break; + } + + // + double signalTValue = minValue + operationalValue; + double signalBValue = maxValue - operationalValue; + + // + signalTBuffer[bar_index] = signalTValue; + signalBBuffer[bar_index] = signalBValue; +} + +// +// HOT State Calculate Buffers ... +void HotStateCalculateBuffers( + int bar_index // Current Candle Index ... +) +{ + // + // LC ... + double lcHH = lcHHBuffer[bar_index]; + double lcLL = lcLLBuffer[bar_index]; + // + double lcHH1 = lcHHBuffer[bar_index + 1]; + double lcLL1 = lcLLBuffer[bar_index + 1]; + + // + // MC ... + double mcHH = mcHHBuffer[bar_index]; + double mcLL = mcLLBuffer[bar_index]; + // + double mcHH1 = mcHHBuffer[bar_index + 1]; + double mcLL1 = mcLLBuffer[bar_index + 1]; + + // + // SC ... + double scHH = scHHBuffer[bar_index]; + double scLL = scLLBuffer[bar_index]; + // + double scHH1 = scHHBuffer[bar_index + 1]; + double scLL1 = scLLBuffer[bar_index + 1]; + + // + bool isHotLLState = scLL == mcLL && mcLL == lcLL; + bool isHotLLState1 = scLL1 == mcLL1 && mcLL1 == lcLL1; + // + bool isHotHHState = scHH == mcHH && mcHH == lcHH; + bool isHotHHState1 = scHH1 == mcHH1 && mcHH1 == lcHH1; + + // + bool isHotLL = isHotLLState && !isHotLLState1; + bool isHotHH = isHotHHState && !isHotHHState1; + + // + double hotStateValue = X_XCHLH_NEUTURAL; + if (isHotHH) + { + hotStateValue = X_XCHLH_HOT_HH; + } + else if (isHotLL) + { + hotStateValue = X_XCHLH_HOT_LL; + } + + // + hotStateBuffer[bar_index] = hotStateValue; +} + +// +// Draw Buffers ... +void DrawBuffers( + int bar_index // Current Candle Index ... +) +{ + // + // General Requirements ... + + // + // Retrieve Candle Model ... + XOHCL candle = GetCandle(bar_index); + datetime time = iTime(_Symbol, _Period, bar_index); + + // + // Draw Arrow on Hot Areas ... + if (drawHotAreas) + { + // + double hotStateValue = hotStateBuffer[bar_index]; + bool isHotHHArea = hotStateValue == 1; + bool isHotLLArea = hotStateValue == -1; + if (isHotHHArea || isHotLLArea) + { + // + bool isHH = isHotHHArea; + + // + double price = isHH ? candle.high : candle.low; + ENUM_ARROW_ANCHOR anchor = isHH ? ANCHOR_BOTTOM : ANCHOR_TOP; + color clr = isHH ? hotHHArrowColor : hotLLArrowColor; + uchar arrowCode = isHH ? hotHHArrowCode : hotLLArrowCode; + string name = "HOT " + (isHH ? "HH" : "LL") + "_" + (string)price + "_" + (string)time; + + // + DrawArrow( + 0, + name, + 0, + time, + price, + arrowCode, + anchor, + clr, + STYLE_SOLID, + 1); + } + } +} +// +// END Functions ... +// diff --git a/BKPS/OLD/EURUSD-5M-V0.1/MQ5/Indicators/x-saherelm.xchma.oscillator.mq5 b/BKPS/OLD/EURUSD-5M-V0.1/MQ5/Indicators/x-saherelm.xchma.oscillator.mq5 new file mode 100644 index 0000000..8f64a40 --- /dev/null +++ b/BKPS/OLD/EURUSD-5M-V0.1/MQ5/Indicators/x-saherelm.xchma.oscillator.mq5 @@ -0,0 +1,1153 @@ +/////////////////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 Cycle Channel Moving Averages Oscillator +// ---------------------------------------------------------------- +// Name: XCHMA +// Description: trend detecting based on cycles ... +// +// +// 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 XCHMA Oscillator" +#property strict + +// +// START Constants ... +// +#define ShortName "XCHMA" + +// +// XCHMA Oscillator Cycles State Presentation ... +enum ENUM_XCHMA_CYCLE_STATES +{ + X_XCHMA_FAST_CROSSED_OVER_SLOW = 2, + X_XCHMA_FAST_OVER_SLOW = 1, + X_XCHMA_NEUTURAL = 0, + X_XCHMA_FAST_UNDER_SLOW = -1, + X_XCHMA_FAST_CROSSED_UNDER_SLOW = -2, +}; +// +// END Constants ... +// + +// +// START Inputs ... +// +// +// Common ... +input group "Hot Areas"; +input bool drawHotAreas = true; // Draw Hot Areas Symbol +input uchar hotBullishArrowCode = 228; // Hot Bullish Arrow Code +input color hotBullishArrowColor = clrAqua; // Hot Bullish Arrow Color +input uchar hotBearishArrowCode = 230; // Hot Bearish Arrow Code +input color hotBearishArrowColor = clrFuchsia; // Hot Bearish Arrow Color + +// +// LC Inputs ... +input group "Long Cycle"; +input group "LC Market"; +input int lcFastLength = 20; // Fast Length +input int lcSlowLength = 50; // Slow Length +input ENUM_MA_METHOD lcMethod = MODE_EMA; // Calculation Method +input ENUM_APPLIED_PRICE lcAppliedTo = PRICE_CLOSE; // Applied To +input group "LC Style"; +input int lcDrawWidth = 1; // Draw Width +input ENUM_DRAW_TYPE lcDrawType = DRAW_LINE; // Draw Type +input ENUM_LINE_STYLE lcDrawStyle = STYLE_DOT; // Draw Style +input color lcFastColor = clrAqua; // Fast Color +input color lcSlowColor = clrFuchsia; // Slow Color +input group "LC Drawings"; +input bool lcDrawFast = true; // Draw Fast +input bool lcDrawSlow = true; // Draw Slow +input bool lcDrawCrosses = true; // Draw Cross Lines + +// +// MC Inputs ... +input group "Medium Cycle"; +input group "MC Market"; +input int mcFastLength = 10; // Fast Length +input int mcSlowLength = 30; // Slow Length +input ENUM_MA_METHOD mcMethod = MODE_EMA; // Calculation Method +input ENUM_APPLIED_PRICE mcAppliedTo = PRICE_CLOSE; // Applied To +input group "MC Style"; +input int mcDrawWidth = 1; // Draw Width +input ENUM_DRAW_TYPE mcDrawType = DRAW_LINE; // Draw Type +input ENUM_LINE_STYLE mcDrawStyle = STYLE_DOT; // Draw Style +input color mcFastColor = clrLime; // Fast Color +input color mcSlowColor = clrRed; // Slow Color +input group "MC Drawings"; +input bool mcDrawFast = true; // Draw Fast +input bool mcDrawSlow = true; // Draw Slow +input bool mcDrawCrosses = false; // Draw Cross Lines + +// +// SC Inputs ... +input group "Short Cycle"; +input group "SC Market"; +input int scFastLength = 7; // Fast Length +input int scSlowLength = 14; // Slow Length +input ENUM_MA_METHOD scMethod = MODE_EMA; // Calculation Method +input ENUM_APPLIED_PRICE scAppliedTo = PRICE_CLOSE; // Applied To +input group "SC Style"; +input int scDrawWidth = 1; // Draw Width +input ENUM_DRAW_TYPE scDrawType = DRAW_LINE; // Draw Type +input ENUM_LINE_STYLE scDrawStyle = STYLE_SOLID; // Draw Style +input color scFastColor = clrLightBlue; // Fast Color +input color scSlowColor = clrLightSalmon; // Slow Color +input group "SC Drawings"; +input bool scDrawFast = true; // Draw Fast +input bool scDrawSlow = true; // Draw Slow +input bool scDrawCrosses = false; // Draw Cross Lines +// +// END Inputs ... +// + +// +// Includes Logging Library ... +#include "../Libraries/x-saherelm.log.lib.mq5"; + +// +// Includes Common Library ... +#include "../Libraries/x-saherelm.common.lib.mq5"; + +// +// Includes Draw Library ... +#include "../Libraries/x-saherelm.draw.lib.mq5"; + +// +// START Buffers ... +// +#property indicator_separate_window + +// +#property indicator_buffers 7 +#property indicator_plots 6 + +// +// LC ... +#define lcFastBufferIndex 0 +#define lcSlowBufferIndex 1 + +// +double lcFastBuffer[]; +double lcSlowBuffer[]; + +// +// MC ... +#define mcFastBufferIndex 2 +#define mcSlowBufferIndex 3 + +// +double mcFastBuffer[]; +double mcSlowBuffer[]; + +// +// SC ... +#define scFastBufferIndex 4 +#define scSlowBufferIndex 5 + +// +double scFastBuffer[]; +double scSlowBuffer[]; + +// +// Hot State ... +// +#define hotStateBufferIndex 6 + +// +double hotStateBuffer[]; +// +// END Buffers ... +// + +// +// START Global Definitions: Variables, Properties and etc ... +// +// +// LC ... +int lcFastHandler = INVALID_HANDLE; +int lcSlowHandler = INVALID_HANDLE; + +// +// MC ... +int mcFastHandler = INVALID_HANDLE; +int mcSlowHandler = INVALID_HANDLE; + +// +// SC ... +int scFastHandler = INVALID_HANDLE; +int scSlowHandler = INVALID_HANDLE; +// +// END Global Definitions: Variables, Properties and etc ... +// + +// +// START Event Handlers ... +// +// +// Initialization ... +int OnInit() +{ + // + // Validate Inputs ... + if (!ValidateInputs()) + { + return INIT_PARAMETERS_INCORRECT; + } + + // + logTag = ShortName; + drawPrefix = ShortName; + + // + // Define Index Buffers ... + DefineBuffers(); + + // + // Set Indicator ShortName ... + SetIndicatorName(); + + // + // Init All Required Handlers ... + if (!InitHandlers()) + { + 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 ... + + // + // ReDraw Chart ... + ChartRedraw(); + + // + // De Init Draw Library ... + OnDeinitDrawLibrary(); + + // + Comment(""); +} + +// +// Calculations ... +// +// 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; + + // + // 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 ... + int maxLength = MathMax(lcFastLength, lcSlowLength); + + // + // Get Retrieved Values from indicators ... + // + // LC ... + int lcFastCalculatedBars = BarsCalculated(lcFastHandler); + int lcSlowCalculatedBars = BarsCalculated(lcSlowHandler); + + // + // MC ... + int mcFastCalculatedBars = BarsCalculated(mcFastHandler); + int mcSlowCalculatedBars = BarsCalculated(mcSlowHandler); + + // + // SC ... + int scFastCalculatedBars = BarsCalculated(scFastHandler); + int scSlowCalculatedBars = BarsCalculated(scSlowHandler); + + // + // Check Calculated Bars ... + if ( + // + // LC ... + lcFastCalculatedBars < maxLength || + lcSlowCalculatedBars < maxLength || + // + // MC ... + mcFastCalculatedBars < maxLength || + mcSlowCalculatedBars < maxLength || + // + // SC ... + scFastCalculatedBars < maxLength || + scSlowCalculatedBars < maxLength) + { + return prev_calculated; + } + + // + limit = prev_calculated < maxLength ? rates_total - (maxLength + 1) : rates_total - prev_calculated; + + // + // Copy Buffers from indicators ... + // + // LC ... + int lcFastCopiedItems = CopyBuffer(lcFastHandler, 0, 0, limit + 1, lcFastBuffer); + int lcSlowCopiedItems = CopyBuffer(lcSlowHandler, 0, 0, limit + 1, lcSlowBuffer); + + // + // MC ... + int mcFastCopiedItems = CopyBuffer(mcFastHandler, 0, 0, limit + 1, mcFastBuffer); + int mcSlowCopiedItems = CopyBuffer(mcSlowHandler, 0, 0, limit + 1, mcSlowBuffer); + + // + // SC ... + int scFastCopiedItems = CopyBuffer(scFastHandler, 0, 0, limit + 1, scFastBuffer); + int scSlowCopiedItems = CopyBuffer(scSlowHandler, 0, 0, limit + 1, scSlowBuffer); + + // + // Check Copied Items Number ... + if ( + // + // LC ... + lcFastCopiedItems <= 0 || + lcSlowCopiedItems <= 0 || + // + // MC ... + mcFastCopiedItems <= 0 || + mcSlowCopiedItems <= 0 || + // + // MC ... + mcFastCopiedItems <= 0 || + mcSlowCopiedItems <= 0) + { + return prev_calculated; + } + + // + // Main Loop ... + for (int i = limit; i >= 0 && !IsStopped(); i--) + { + // + CalculateBuffers(i); + } + + // + return rates_total; +} +// +// END Event Handlers ... +// + +// +// START Functions ... +// +// +// Validate Input Args for Initialization ... +bool ValidateInputs() +{ + // + bool result = false; + + // + // Validate Args ... + bool isLCInputsValid = lcFastLength >= 4 && lcSlowLength > lcFastLength; + bool isMCInputsValid = mcFastLength >= 4 && mcSlowLength > mcFastLength; + bool isSCInputsValid = scFastLength >= 4 && scSlowLength > scFastLength; + if ( + isLCInputsValid && + isMCInputsValid && + isSCInputsValid && + lcFastLength > mcFastLength && + mcFastLength > scFastLength) + { + result = true; + } + + // + return result; +} + +// +// Define Indexes and Styles ... +void DefineBuffers() +{ + // + // LC ... + LCDefineBuffers(); + + // + // MC ... + MCDefineBuffers(); + + // + // SC ... + SCDefineBuffers(); + + // + // Hot State Buffer ... + HotStateDefineBuffers(); +} + +// +// Init Handlers ... +bool InitHandlers() +{ + // + bool result = false; + + // + // LC ... + result = LCInitHandlers(); + if (!result) + { + return result; + } + + // + // MC ... + result = MCInitHandlers(); + if (!result) + { + return result; + } + + // + // SC ... + result = SCInitHandlers(); + if (!result) + { + return result; + } + + // + return result; +} + +// +// Set Indicator Short Name and also we can define Buffers Labels ... +void SetIndicatorName() +{ + // + string indicatorShortName = ""; + StringConcatenate(indicatorShortName, ShortName, ""); + + // + IndicatorSetString(INDICATOR_SHORTNAME, indicatorShortName); +} + +// +// Calculate Buffers ... +void CalculateBuffers( + int bar_index // Current Candle Index ... +) +{ + // + // HOT State Buffer ... + HotStateCalculateBuffers(bar_index); + + // + // After all Calculations we are ready to Draw what we want ... + DrawBuffers(bar_index); +} + +// +// LC Buffers Definitions ... +void LCDefineBuffers() +{ + // + // LC Fast Buffer ... + string lcFastBufferLabel = ShortName + " LC Fast (" + (string)lcFastLength + ")"; + ENUM_DRAW_TYPE lcFastDrawType = lcDrawFast ? lcDrawType : DRAW_NONE; + ArraySetAsSeries(lcFastBuffer, true); + SetIndexBuffer(lcFastBufferIndex, lcFastBuffer, INDICATOR_DATA); + PlotIndexSetString(lcFastBufferIndex, PLOT_LABEL, lcFastBufferLabel); + PlotIndexSetInteger(lcFastBufferIndex, PLOT_LINE_COLOR, lcFastColor); + PlotIndexSetInteger(lcFastBufferIndex, PLOT_LINE_STYLE, lcDrawStyle); + PlotIndexSetInteger(lcFastBufferIndex, PLOT_LINE_WIDTH, lcDrawWidth); + PlotIndexSetInteger(lcFastBufferIndex, PLOT_DRAW_BEGIN, lcFastLength); + PlotIndexSetInteger(lcFastBufferIndex, PLOT_DRAW_TYPE, lcFastDrawType); + + // + // LC Slow Buffer ... + string lcSlowBufferLabel = ShortName + " LC Slow (" + (string)lcSlowLength + ")"; + ENUM_DRAW_TYPE lcSlowDrawType = lcDrawSlow ? lcDrawType : DRAW_NONE; + ArraySetAsSeries(lcSlowBuffer, true); + SetIndexBuffer(lcSlowBufferIndex, lcSlowBuffer, INDICATOR_DATA); + PlotIndexSetString(lcSlowBufferIndex, PLOT_LABEL, lcSlowBufferLabel); + PlotIndexSetInteger(lcSlowBufferIndex, PLOT_LINE_COLOR, lcSlowColor); + PlotIndexSetInteger(lcSlowBufferIndex, PLOT_LINE_STYLE, lcDrawStyle); + PlotIndexSetInteger(lcSlowBufferIndex, PLOT_LINE_WIDTH, lcDrawWidth); + PlotIndexSetInteger(lcSlowBufferIndex, PLOT_DRAW_BEGIN, lcSlowLength); + PlotIndexSetInteger(lcSlowBufferIndex, PLOT_DRAW_TYPE, lcSlowDrawType); +} + +// +// MC Buffers Definitions ... +void MCDefineBuffers() +{ + // + // MC Fast Buffer ... + string mcFastBufferLabel = ShortName + " MC Fast (" + (string)mcFastLength + ")"; + ENUM_DRAW_TYPE mcFastDrawType = mcDrawFast ? lcDrawType : DRAW_NONE; + ArraySetAsSeries(mcFastBuffer, true); + SetIndexBuffer(mcFastBufferIndex, mcFastBuffer, INDICATOR_DATA); + PlotIndexSetString(mcFastBufferIndex, PLOT_LABEL, mcFastBufferLabel); + PlotIndexSetInteger(mcFastBufferIndex, PLOT_LINE_COLOR, mcFastColor); + PlotIndexSetInteger(mcFastBufferIndex, PLOT_LINE_STYLE, mcDrawStyle); + PlotIndexSetInteger(mcFastBufferIndex, PLOT_LINE_WIDTH, mcDrawWidth); + PlotIndexSetInteger(mcFastBufferIndex, PLOT_DRAW_BEGIN, mcFastLength); + PlotIndexSetInteger(mcFastBufferIndex, PLOT_DRAW_TYPE, mcFastDrawType); + + // + // MC Slow Buffer ... + string mcSlowBufferLabel = ShortName + " MC Slow (" + (string)mcSlowLength + ")"; + ENUM_DRAW_TYPE mcSlowDrawType = mcDrawSlow ? lcDrawType : DRAW_NONE; + ArraySetAsSeries(mcSlowBuffer, true); + SetIndexBuffer(mcSlowBufferIndex, mcSlowBuffer, INDICATOR_DATA); + PlotIndexSetString(mcSlowBufferIndex, PLOT_LABEL, mcSlowBufferLabel); + PlotIndexSetInteger(mcSlowBufferIndex, PLOT_LINE_COLOR, mcSlowColor); + PlotIndexSetInteger(mcSlowBufferIndex, PLOT_LINE_STYLE, mcDrawStyle); + PlotIndexSetInteger(mcSlowBufferIndex, PLOT_LINE_WIDTH, mcDrawWidth); + PlotIndexSetInteger(mcSlowBufferIndex, PLOT_DRAW_BEGIN, mcSlowLength); + PlotIndexSetInteger(mcSlowBufferIndex, PLOT_DRAW_TYPE, mcSlowDrawType); +} + +// +// SC Buffers Definitions ... +void SCDefineBuffers() +{ + // + // SC Fast Buffer ... + string scFastBufferLabel = ShortName + " SC Fast (" + (string)scFastLength + ")"; + ENUM_DRAW_TYPE scFastDrawType = scDrawFast ? lcDrawType : DRAW_NONE; + ArraySetAsSeries(scFastBuffer, true); + SetIndexBuffer(scFastBufferIndex, scFastBuffer, INDICATOR_DATA); + PlotIndexSetString(scFastBufferIndex, PLOT_LABEL, scFastBufferLabel); + PlotIndexSetInteger(scFastBufferIndex, PLOT_LINE_COLOR, scFastColor); + PlotIndexSetInteger(scFastBufferIndex, PLOT_LINE_STYLE, scDrawStyle); + PlotIndexSetInteger(scFastBufferIndex, PLOT_LINE_WIDTH, scDrawWidth); + PlotIndexSetInteger(scFastBufferIndex, PLOT_DRAW_BEGIN, scFastLength); + PlotIndexSetInteger(scFastBufferIndex, PLOT_DRAW_TYPE, scFastDrawType); + + // + // SC Slow Buffer ... + string scSlowBufferLabel = ShortName + " SC Slow (" + (string)scSlowLength + ")"; + ENUM_DRAW_TYPE scSlowDrawType = scDrawSlow ? lcDrawType : DRAW_NONE; + ArraySetAsSeries(scSlowBuffer, true); + SetIndexBuffer(scSlowBufferIndex, scSlowBuffer, INDICATOR_DATA); + PlotIndexSetString(scSlowBufferIndex, PLOT_LABEL, scSlowBufferLabel); + PlotIndexSetInteger(scSlowBufferIndex, PLOT_LINE_COLOR, scSlowColor); + PlotIndexSetInteger(scSlowBufferIndex, PLOT_LINE_STYLE, scDrawStyle); + PlotIndexSetInteger(scSlowBufferIndex, PLOT_LINE_WIDTH, scDrawWidth); + PlotIndexSetInteger(scSlowBufferIndex, PLOT_DRAW_BEGIN, scSlowLength); + PlotIndexSetInteger(scSlowBufferIndex, PLOT_DRAW_TYPE, scSlowDrawType); +} + +// +// Hot State Buffer ... +void HotStateDefineBuffers() +{ + // + // Hot State Buffer ... + ArraySetAsSeries(hotStateBuffer, true); + SetIndexBuffer(hotStateBufferIndex, hotStateBuffer, INDICATOR_CALCULATIONS); +} + +// +// LC Init Handlers ... +bool LCInitHandlers() +{ + // + ResetLastError(); + + // + // LC Fast Handler ... + lcFastHandler = iMA( + _Symbol, + _Period, + lcFastLength, + 0, + lcMethod, + lcAppliedTo); + if (lcFastHandler == INVALID_HANDLE) + { + // + LogMessage("LC Fast Indicator initialization failed: " + (string)GetLastError()); + + // + return false; + } + + // + // LC Slow Handler ... + lcSlowHandler = iMA( + _Symbol, + _Period, + lcSlowLength, + 0, + lcMethod, + lcAppliedTo); + if (lcSlowHandler == INVALID_HANDLE) + { + // + LogMessage("LC Slow Indicator initialization failed: " + (string)GetLastError()); + + // + return false; + } + + // + return true; +} + +// +// MC Init Handlers ... +bool MCInitHandlers() +{ + // + ResetLastError(); + + // + // MC Fast Handler ... + mcFastHandler = iMA( + _Symbol, + _Period, + mcFastLength, + 0, + mcMethod, + mcAppliedTo); + if (mcFastHandler == INVALID_HANDLE) + { + // + LogMessage("MC Fast Indicator initialization failed: " + (string)GetLastError()); + + // + return false; + } + + // + // MC Slow Handler ... + mcSlowHandler = iMA( + _Symbol, + _Period, + mcSlowLength, + 0, + mcMethod, + mcAppliedTo); + if (mcSlowHandler == INVALID_HANDLE) + { + // + LogMessage("MC Slow Indicator initialization failed: " + (string)GetLastError()); + + // + return false; + } + + // + return true; +} + +// +// SC Init Handlers ... +bool SCInitHandlers() +{ + // + ResetLastError(); + + // + // SC Fast Handler ... + scFastHandler = iMA( + _Symbol, + _Period, + scFastLength, + 0, + scMethod, + scAppliedTo); + if (scFastHandler == INVALID_HANDLE) + { + // + LogMessage("SC Fast Indicator initialization failed: " + (string)GetLastError()); + + // + return false; + } + + // + // SC Slow Handler ... + scSlowHandler = iMA( + _Symbol, + _Period, + scSlowLength, + 0, + scMethod, + scAppliedTo); + if (scSlowHandler == INVALID_HANDLE) + { + // + LogMessage("SC Slow Indicator initialization failed: " + (string)GetLastError()); + + // + return false; + } + + // + return true; +} + +// +// LC State ... +double GetLCState( + int bar_index // Current Candle Index ... +) +{ + // + // Fast Cross Over Slow Detection ... + bool isFastCrossedOverSlow = IsCrossOver( + lcFastBuffer, + lcSlowBuffer, + bar_index); + + // + // Fast Over Slow Detection ... + bool isFastOverSlow = IsOver( + lcFastBuffer, + lcSlowBuffer, + bar_index); + + // + // Fast Cross Under Slow Detection ... + bool isFastCrossedUnderSlow = IsCrossUnder( + lcFastBuffer, + lcSlowBuffer, + bar_index); + + // + // Fast Under Slow Detection ... + bool isFastUnderSlow = IsUnder( + lcFastBuffer, + lcSlowBuffer, + bar_index); + + // + // Generate state value which represent curren bar index + // state between fast and slow lines ... + double result = X_XCHMA_NEUTURAL; + + // + // Filling state value based on Market Conditions ... + if (isFastCrossedOverSlow) + { + result = X_XCHMA_FAST_CROSSED_OVER_SLOW; + } + else if (isFastCrossedUnderSlow) + { + result = X_XCHMA_FAST_CROSSED_UNDER_SLOW; + } + else if (isFastOverSlow) + { + result = X_XCHMA_FAST_OVER_SLOW; + } + else if (isFastUnderSlow) + { + result = X_XCHMA_FAST_UNDER_SLOW; + } + + // + return result; +} + +// +// MC State ... +double GetMCState( + int bar_index // Current Candle Index ... +) +{ + // + // Fast Cross Over Slow Detection ... + bool isFastCrossedOverSlow = IsCrossOver( + mcFastBuffer, + mcSlowBuffer, + bar_index); + + // + // Fast Over Slow Detection ... + bool isFastOverSlow = IsOver( + mcFastBuffer, + mcSlowBuffer, + bar_index); + + // + // Fast Cross Under Slow Detection ... + bool isFastCrossedUnderSlow = IsCrossUnder( + mcFastBuffer, + mcSlowBuffer, + bar_index); + + // + // Fast Under Slow Detection ... + bool isFastUnderSlow = IsUnder( + mcFastBuffer, + mcSlowBuffer, + bar_index); + + // + // Generate state value which represent curren bar index + // state between fast and slow lines ... + double result = X_XCHMA_NEUTURAL; + + // + // Filling state value based on Market Conditions ... + if (isFastCrossedOverSlow) + { + result = X_XCHMA_FAST_CROSSED_OVER_SLOW; + } + else if (isFastCrossedUnderSlow) + { + result = X_XCHMA_FAST_CROSSED_UNDER_SLOW; + } + else if (isFastOverSlow) + { + result = X_XCHMA_FAST_OVER_SLOW; + } + else if (isFastUnderSlow) + { + result = X_XCHMA_FAST_UNDER_SLOW; + } + + // + return result; +} + +// +// SC State ... +double GetSCState( + int bar_index // Current Candle Index ... +) +{ + // + // Fast Cross Over Slow Detection ... + bool isFastCrossedOverSlow = IsCrossOver( + scFastBuffer, + scSlowBuffer, + bar_index); + + // + // Fast Over Slow Detection ... + bool isFastOverSlow = IsOver( + scFastBuffer, + scSlowBuffer, + bar_index); + + // + // Fast Cross Under Slow Detection ... + bool isFastCrossedUnderSlow = IsCrossUnder( + scFastBuffer, + scSlowBuffer, + bar_index); + + // + // Fast Under Slow Detection ... + bool isFastUnderSlow = IsUnder( + scFastBuffer, + scSlowBuffer, + bar_index); + + // + // Generate state value which represent curren bar index + // state between fast and slow lines ... + double result = X_XCHMA_NEUTURAL; + + // + // Filling state value based on Market Conditions ... + if (isFastCrossedOverSlow) + { + result = X_XCHMA_FAST_CROSSED_OVER_SLOW; + } + else if (isFastCrossedUnderSlow) + { + result = X_XCHMA_FAST_CROSSED_UNDER_SLOW; + } + else if (isFastOverSlow) + { + result = X_XCHMA_FAST_OVER_SLOW; + } + else if (isFastUnderSlow) + { + result = X_XCHMA_FAST_UNDER_SLOW; + } + + // + return result; +} + +// +// HOT State Calculate Buffers ... +void HotStateCalculateBuffers( + int bar_index // Current Candle Index ... +) +{ + // + // LC ... + double lcFast = lcFastBuffer[bar_index]; + double lcSlow = lcSlowBuffer[bar_index]; + // + double lcFastPrev = lcFastBuffer[bar_index + 1]; + double lcSlowPrev = lcSlowBuffer[bar_index + 1]; + // + double lcState = GetLCState(bar_index); + + // + // MC ... + double mcFast = mcFastBuffer[bar_index]; + double mcSlow = mcSlowBuffer[bar_index]; + // + double mcFastPrev = mcFastBuffer[bar_index + 1]; + double mcSlowPrev = mcSlowBuffer[bar_index + 1]; + // + double mcState = GetMCState(bar_index); + + // + // SC ... + double scFast = scFastBuffer[bar_index]; + double scSlow = scSlowBuffer[bar_index]; + // + double scFastPrev = scFastBuffer[bar_index + 1]; + double scSlowPrev = scSlowBuffer[bar_index + 1]; + // + double scState = GetSCState(bar_index); + + // + // Detect HOT Bearish Area ... + bool isHotBearishArea = + lcFast < lcSlow && + mcFast < mcSlow && + scFast < scSlow; + // + bool isPrevHotBearishArea = + lcFastPrev < lcSlowPrev && + mcFastPrev < mcSlowPrev && + scFastPrev < scSlowPrev; + + // + // Detect HOT Bearish Area ... + bool isHotBullishArea = + lcFast > lcSlow && + mcFast > mcSlow && + scFast > scSlow; + // + bool isPrevHotBullishArea = + lcFastPrev > lcSlowPrev && + mcFastPrev > mcSlowPrev && + scFastPrev > scSlowPrev; + + // + // Generate HotState Value ... + double hotStateValue = + isHotBullishArea && !isPrevHotBullishArea + ? 1 + : isHotBearishArea && !isPrevHotBearishArea + ? -1 + : 0; + hotStateBuffer[bar_index] = hotStateValue; +} + +// +// Draw Buffers ... +void DrawBuffers( + int bar_index // Current Candle Index ... +) +{ + // + // General Requirements ... + + // + // Retrieve Candle Model ... + XOHCL candle = GetCandle(bar_index); + datetime time = iTime(_Symbol, _Period, bar_index); + + // + // Draw Arrow on Hot Areas ... + if (drawHotAreas) + { + // + double hotStateValue = hotStateBuffer[bar_index]; + bool isHotBullishArea = hotStateValue == 1; + bool isHotBearishArea = hotStateValue == -1; + if (isHotBullishArea || isHotBearishArea) + { + // + bool isBull = isHotBullishArea; + + // + double price = isBull ? candle.low : candle.high; + ENUM_ARROW_ANCHOR anchor = isBull ? ANCHOR_TOP : ANCHOR_BOTTOM; + color clr = isBull ? hotBullishArrowColor : hotBearishArrowColor; + uchar arrowCode = isBull ? hotBullishArrowCode : hotBearishArrowCode; + string name = "HOT " + (isBull ? "Bullish" : "Bearish") + "_" + (string)price + "_" + (string)time; + + // + DrawArrow( + 0, + name, + 0, + time, + price, + arrowCode, + anchor, + clr); + } + } + + // + // Draw LC Crosses ... + if (lcDrawCrosses) + { + // + double lcStateValue = GetLCState(bar_index); + bool isLcFastCrossedOverSlow = lcStateValue == X_XCHMA_FAST_CROSSED_OVER_SLOW; + bool isLcFastCrossedUnderSlow = lcStateValue == X_XCHMA_FAST_CROSSED_UNDER_SLOW; + if (isLcFastCrossedOverSlow || isLcFastCrossedUnderSlow) + { + // + bool isBull = isLcFastCrossedOverSlow; + + // + color clr = isBull ? lcFastColor : lcSlowColor; + string name = "LC Fast Cross " + (isBull ? "Over" : "Under") + "_" + (string)time; + + // + DrawVerticalLine( + 0, + name, + 0, + time, + clr); + } + } + + // + // Draw MC Crosses ... + if (mcDrawCrosses) + { + // + double mcStateValue = GetMCState(bar_index); + bool isMcFastCrossedOverSlow = mcStateValue == X_XCHMA_FAST_CROSSED_OVER_SLOW; + bool isMcFastCrossedUnderSlow = mcStateValue == X_XCHMA_FAST_CROSSED_UNDER_SLOW; + if (isMcFastCrossedOverSlow || isMcFastCrossedUnderSlow) + { + // + bool isBull = isMcFastCrossedOverSlow; + + // + color clr = isBull ? mcFastColor : mcSlowColor; + string name = "MC Fast Cross " + (isBull ? "Over" : "Under") + "_" + (string)time; + + // + DrawVerticalLine( + 0, + name, + 0, + time, + clr); + } + } + + // + // Draw SC Crosses ... + if (scDrawCrosses) + { + // + double scStateValue = GetSCState(bar_index); + bool isScFastCrossedOverSlow = scStateValue == X_XCHMA_FAST_CROSSED_OVER_SLOW; + bool isScFastCrossedUnderSlow = scStateValue == X_XCHMA_FAST_CROSSED_UNDER_SLOW; + if (isScFastCrossedOverSlow || isScFastCrossedUnderSlow) + { + // + bool isBull = isScFastCrossedOverSlow; + + // + color clr = isBull ? scFastColor : scSlowColor; + string name = "SC Fast Cross " + (isBull ? "Over" : "Under") + "_" + (string)time; + + // + DrawVerticalLine( + 0, + name, + 0, + time, + clr); + } + } +} +// +// END Functions ... +// diff --git a/BKPS/OLD/EURUSD-5M-V0.1/MQ5/Indicators/x-saherelm.xobd.oscillator.mq5 b/BKPS/OLD/EURUSD-5M-V0.1/MQ5/Indicators/x-saherelm.xobd.oscillator.mq5 new file mode 100644 index 0000000..c7907ce --- /dev/null +++ b/BKPS/OLD/EURUSD-5M-V0.1/MQ5/Indicators/x-saherelm.xobd.oscillator.mq5 @@ -0,0 +1,328 @@ +///////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 OrderBlock Detector Oscillator +// ------------------------------------------------------ +// Name: XOBD +// Description: detect Order Blocks based on Swings ... +// +// +// 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 XOBD Oscillator" +#property strict + +// +// START Constants ... +// + +#define ShortName "XOBD" + +// +// END Constants ... +// + +// +// START Inputs ... +// + +// +input int length = 288; // Market Length + +// +// START Inputs ... +// + +// +// Includes Logging Library ... +#include "../Libraries/x-saherelm.log.lib.mq5"; + +// +// Include Common and Models Library ... +#include "../Libraries/x-saherelm.common.lib.mq5"; + +// +// START Buffers ... +// + +// +#property indicator_separate_window + +// +#property indicator_buffers 3 +#property indicator_plots 3 + +// +#define swingHighBufferIndex 0 +#define swingLowBufferIndex 1 +#define signalBufferIndex 2 + +// +double swingHighBuffer[]; +double swingLowBuffer[]; +double signalBuffer[]; + +// +#property indicator_label1 "XSwing High" +#property indicator_type1 DRAW_LINE +#property indicator_color1 clrAqua +#property indicator_style1 STYLE_SOLID +#property indicator_width1 1 + +// +#property indicator_label2 "XSwing Low" +#property indicator_type2 DRAW_LINE +#property indicator_color2 clrFuchsia +#property indicator_style2 STYLE_SOLID +#property indicator_width2 1 + +// +#property indicator_label3 "XSignal" +#property indicator_type3 DRAW_LINE +#property indicator_color3 clrGold +#property indicator_style3 STYLE_DOT +#property indicator_width3 1 + +// +// 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 (!ValidateInputs()) + { + return INIT_PARAMETERS_INCORRECT; + } + + // + logTag = ShortName; + + // + // 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 ... +} + +// +// Calculations ... +// +// 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; + + // + // 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 ... + int maxLength = MathMax(0, length); + + // + limit = prev_calculated < maxLength ? rates_total - (maxLength + 1) : rates_total - prev_calculated; + + // + // Main Loop ... + for (int i = limit; i >= 0 && !IsStopped(); i--) + { + // + 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; +} + +// +// Define Indexes and Styles ... +void DefineBuffers() +{ + // + // Swing High ... + string swingHighBufferLabel = ShortName + " Swing H (" + (string) length + ")"; + ArraySetAsSeries(swingHighBuffer, true); + SetIndexBuffer(swingHighBufferIndex, swingHighBuffer, INDICATOR_DATA); + PlotIndexSetInteger(swingHighBufferIndex, PLOT_DRAW_BEGIN, length); + PlotIndexSetString(swingHighBufferIndex, PLOT_LABEL, swingHighBufferLabel); + + // + // Swing Low ... + string swingLowBufferLabel = ShortName + " Swing L (" + (string) length + ")"; + ArraySetAsSeries(swingLowBuffer, true); + SetIndexBuffer(swingLowBufferIndex, swingLowBuffer, INDICATOR_DATA); + PlotIndexSetInteger(swingLowBufferIndex, PLOT_DRAW_BEGIN, length); + PlotIndexSetString(swingLowBufferIndex, PLOT_LABEL, swingLowBufferLabel); + + // + // Signal ... + string signalBufferLabel = ShortName + " Signal (" + (string) length + ")"; + ArraySetAsSeries(signalBuffer, true); + SetIndexBuffer(signalBufferIndex, signalBuffer, INDICATOR_DATA); + PlotIndexSetInteger(signalBufferIndex, PLOT_DRAW_BEGIN, length); + PlotIndexSetString(signalBufferIndex, PLOT_LABEL, signalBufferLabel); +} + +// +// Set Indicator Short Name and also we can define Buffers Labels ... +void SetIndicatorName() +{ + // + string indicatorShortName = ""; + StringConcatenate(indicatorShortName, ShortName, " ", "( ", length, " )"); + + // + IndicatorSetString(INDICATOR_SHORTNAME, indicatorShortName); +} + +// +// Calculate Buffers ... +void CalculateBuffers(int bar_index) +{ + // + int inCycleSwingHighCount = 0; + int inCycleSwingLowCount = 0; + + // + // Loop Back Through Cycle ... + for (int i = bar_index; i < bar_index + length; i++) { + // + ENUM_X_SWING_TYPE iSwingType = GetCandleSwing(i); + if (iSwingType == X_NO_SWING) { + continue; + } + + // + if (iSwingType == X_SWING_HIGH) { + inCycleSwingHighCount++; + } else if (iSwingType == X_SWING_LOW) { + inCycleSwingLowCount++; + } + } + + // + swingHighBuffer[bar_index] = inCycleSwingHighCount; + swingLowBuffer[bar_index] = inCycleSwingLowCount; + + // + signalBuffer[bar_index] = inCycleSwingLowCount - inCycleSwingHighCount; +} + +// +// END Functions ... +// diff --git a/BKPS/OLD/EURUSD-5M-V0.1/MQ5/Indicators/x-saherelm.xrsi.oscillator.mq5 b/BKPS/OLD/EURUSD-5M-V0.1/MQ5/Indicators/x-saherelm.xrsi.oscillator.mq5 new file mode 100644 index 0000000..dda4f63 --- /dev/null +++ b/BKPS/OLD/EURUSD-5M-V0.1/MQ5/Indicators/x-saherelm.xrsi.oscillator.mq5 @@ -0,0 +1,358 @@ +///////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 OrderBlock Detector Oscillator +// ------------------------------------------------------ +// Name: XRSI +// Description: detect market conditions based on RSI ... +// +// +// 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 XRSI Oscillator" +#property strict + +// +// START Constants ... +// + +#define ShortName "XRSI" + +// +// END Constants ... +// + +// +// START Inputs ... +// + +// +input group "Market"; +input int length = 14; // Market Length +input ENUM_APPLIED_PRICE appliedTo = PRICE_CLOSE; // Applied To + +// +input group "Short Entry"; +input double shortEntryValue = 70; // Short Entry Level +input color shortEntryColor = clrRed; // Short Entry Level Color +input ENUM_LINE_STYLE shortEntryLineStyle = STYLE_SOLID; // Short Entry Style + +// +input group "Short Exit"; +input double shortExitValue = 40; // Short Exit Level +input color shortExitColor = clrFuchsia; // Short Exit Level Color +input ENUM_LINE_STYLE shortExitLineStyle = STYLE_DOT; // Short Exit Style + +// +input group "Long Entry"; +input double longEntryValue = 30; // Long Entry Level +input color longEntryColor = clrGreen; // Long Entry Level Color +input ENUM_LINE_STYLE longEntryLineStyle = STYLE_SOLID; // Long Entry Style + +// +input group "Long Exit"; +input double longExitValue = 60; // Long Exit Level +input color longExitColor = clrAqua; // Long Exit Level Color +input ENUM_LINE_STYLE longExitLineStyle = STYLE_DOT; // Long Exit Style + +// +// START Inputs ... +// + +// +// Includes Logging Library ... +#include "../Libraries/x-saherelm.log.lib.mq5"; + +// +// Include Common and Models Library ... +#include "../Libraries/x-saherelm.common.lib.mq5"; + +// +// START Buffers ... +// + +// +#property indicator_separate_window +#property indicator_buffers 1 +#property indicator_plots 1 + +// +#define rsiBufferIndex 0 + +double rsiBuffer[]; + +#property indicator_label1 "XRSI" +#property indicator_type1 DRAW_LINE +#property indicator_color1 clrAqua +#property indicator_style1 STYLE_DOT +#property indicator_width1 1 + +// +// END Buffers ... +// + +// +// START Global Definitions: Variables, Properties and etc ... +// + +// +int rsiHandler = INVALID_HANDLE; + +// +// END Global Definitions: Variables, Properties and etc ... +// + +// +// START Event Handlers ... +// +// +// Initialization ... +int OnInit() +{ + // + // Validate Inputs ... + if (!ValidateInputs()) + { + return INIT_PARAMETERS_INCORRECT; + } + + // + logTag = ShortName; + + // + rsiHandler = iRSI( + _Symbol, + _Period, + length, + appliedTo); + if (rsiHandler == 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(rsiHandler); +} + +// +// Calculations ... +// +// 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; + + // + // 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 ... + int maxLength = MathMax(0, length); + + // + int rsiCalculatedBars = BarsCalculated(rsiHandler); + if (rsiCalculatedBars < maxLength) + { + return prev_calculated; + } + + // + limit = prev_calculated < maxLength ? rates_total - (maxLength + 1) : rates_total - prev_calculated; + + // + int rsiCopiedItems = CopyBuffer(rsiHandler, 0, 0, limit, rsiBuffer); + if (rsiCopiedItems <= 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 = false; + + // + // Validate Args ... + if (length >= 2) + { + result = true; + } + + // + return result; +} + +// +// Define Indexes and Styles ... +void DefineBuffers() +{ + // + // RSI ... + string rsiBufferLabel = ShortName + " (" + (string)length + ")"; + ArraySetAsSeries(rsiBuffer, true); + SetIndexBuffer(rsiBufferIndex, rsiBuffer, INDICATOR_DATA); + PlotIndexSetInteger(rsiBufferIndex, PLOT_DRAW_BEGIN, length); + PlotIndexSetString(rsiBufferIndex, PLOT_LABEL, rsiBufferLabel); + + // + // Set Indicator Levels here ... + // OB, ExitLong, ExitShort, OS ... + IndicatorSetInteger(INDICATOR_LEVELS, 4); + + // + // SHORTENTRY ... + IndicatorSetDouble(INDICATOR_LEVELVALUE, 0, shortEntryValue); + IndicatorSetInteger(INDICATOR_LEVELCOLOR, 0, shortEntryColor); + IndicatorSetInteger(INDICATOR_LEVELSTYLE, 0, shortEntryLineStyle); + IndicatorSetString(INDICATOR_LEVELTEXT, 0, "Short Entry"); + + // + // LONGEXIT ... + IndicatorSetDouble(INDICATOR_LEVELVALUE, 1, longExitValue); + IndicatorSetInteger(INDICATOR_LEVELCOLOR, 1, longExitColor); + IndicatorSetInteger(INDICATOR_LEVELSTYLE, 1, shortExitLineStyle); + IndicatorSetString(INDICATOR_LEVELTEXT, 1, "Long Exit"); + + // + // SHORTEXIT ... + IndicatorSetDouble(INDICATOR_LEVELVALUE, 2, shortExitValue); + IndicatorSetInteger(INDICATOR_LEVELCOLOR, 2, shortExitColor); + IndicatorSetInteger(INDICATOR_LEVELSTYLE, 2, longEntryLineStyle); + IndicatorSetString(INDICATOR_LEVELTEXT, 2, "Short Exit"); + + // + // LONGENTRY ... + IndicatorSetDouble(INDICATOR_LEVELVALUE, 3, longEntryValue); + IndicatorSetInteger(INDICATOR_LEVELCOLOR, 3, longEntryColor); + IndicatorSetInteger(INDICATOR_LEVELSTYLE, 3, longExitLineStyle); + IndicatorSetString(INDICATOR_LEVELTEXT, 3, "Long Entry"); + + // + // Set Maximum and Minimum for subwindow + IndicatorSetInteger(INDICATOR_DIGITS, 2); + IndicatorSetDouble(INDICATOR_MINIMUM, 0); + IndicatorSetDouble(INDICATOR_MAXIMUM, 100); +} + +// +// Set Indicator Short Name and also we can define Buffers Labels ... +void SetIndicatorName() +{ + // + string indicatorShortName = ""; + StringConcatenate(indicatorShortName, ShortName, " ", "( ", length, " )"); + + // + IndicatorSetString(INDICATOR_SHORTNAME, indicatorShortName); +} + +// +// Calculate Buffers ... +void CalculateBuffers(int bar_index) +{ +} + +// +// END Functions ... +// diff --git a/BKPS/OLD/EURUSD-5M-V0.1/MQ5/Indicators/x-saherelm.xtd.oscillator.mq5 b/BKPS/OLD/EURUSD-5M-V0.1/MQ5/Indicators/x-saherelm.xtd.oscillator.mq5 new file mode 100644 index 0000000..675c149 --- /dev/null +++ b/BKPS/OLD/EURUSD-5M-V0.1/MQ5/Indicators/x-saherelm.xtd.oscillator.mq5 @@ -0,0 +1,465 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 Trend Detector Oscillator +// -------------------------------------------------- +// Name: XTD +// Description: trend detecting in both sides ... +// +// +// 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 XTD Oscillator" +#property strict + +// +// START Constants ... +// +#define ShortName "XTD" + +// +// XTD Oscillator States ... +enum ENUM_X_XTD_STATES +{ + X_XTD_BULLISH_CROSSED_OVER_BEARISH = 2, + X_XTD_BULLISH_OVER_BEARISH = 1, + X_XTD_NEUTURAL = 0, + X_XTD_BULLISH_UNDER_BEARISH = -1, + X_XTD_BULLISH_CROSSED_UNDER_BEARISH = -2 +}; +// +// END Constants ... +// + +// +// Include Models Library ... +#include "../Libraries/x-saherelm.models.lib.mq5"; + +// +// START Inputs ... +// +input int length = 14; // Market Length +input bool drawCrosses = true; // Draw Cross Arrows + +// +// Bullish ... +input uchar bullishArrowCode = 228; // Cross Over Arrow Code +input color bullishArrowColor = clrAqua; // Cross Over Arrow Color + +// +// Bearish ... +input uchar bearishArrowCode = 230; // Cross Under Arrow Code +input color bearishArrowColor = clrMagenta; // Cross Under Arrow Color +// +// END Inputs ... +// + +// +// Includes Logging Library ... +#include "../Libraries/x-saherelm.log.lib.mq5"; + +// +// Includes Common Library ... +#include "../Libraries/x-saherelm.common.lib.mq5"; + +// +// Includes Draw Library ... +#include "../Libraries/x-saherelm.draw.lib.mq5"; + +// +// START Buffers ... +// +#property indicator_separate_window + +// +#property indicator_buffers 3 +#property indicator_plots 3 + +// +#define bullishBufferIndex 0 +#define bearishBufferIndex 1 +#define signalBufferIndex 2 + +// +double bullishBuffer[]; +double bearishBuffer[]; +double signalBuffer[]; + +// +#property indicator_label1 "XBullPower" +#property indicator_type1 DRAW_LINE +#property indicator_color1 clrLime +#property indicator_style1 STYLE_SOLID +#property indicator_width1 1 + +// +#property indicator_label2 "XBearPower" +#property indicator_type2 DRAW_LINE +#property indicator_color2 clrRed +#property indicator_style2 STYLE_SOLID +#property indicator_width2 1 + +// +#property indicator_label3 "XSignal" +#property indicator_type3 DRAW_LINE +#property indicator_color3 clrGold +#property indicator_style3 STYLE_DOT +#property indicator_width3 1 +// +// END Buffers ... +// + +// +// START Global Definitions: Variables, Properties and etc ... +// +// +int xtdBullishCandleCount = 0; +int xtdBearishCandleCount = 0; +// +// END Global Definitions: Variables, Properties and etc ... +// + +// +// START Event Handlers ... +// +// +// Initialization ... +int OnInit() +{ + // + // Validate Inputs ... + if (!ValidateInputs()) + { + return INIT_PARAMETERS_INCORRECT; + } + + // + logTag = ShortName; + drawPrefix = ShortName; + + // + // 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 ... + + // + // De Init Draw Library ... + OnDeinitDrawLibrary(); +} + +// +// Calculations ... +// +// 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; + + // + // 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 ... + int maxLength = MathMax(0, length); + + // + limit = prev_calculated < maxLength ? rates_total - (maxLength + 1) : rates_total - prev_calculated; + + // + // Main Loop ... + for (int i = limit; i >= 0 && !IsStopped(); i--) + { + // + CalculateBuffers(i, close); + } + + // + return rates_total; +} +// +// END Event Handlers ... +// + +// +// START Functions ... +// +// +// Validate Input Args for Initialization ... +bool ValidateInputs() +{ + // + bool result = false; + + // + // Validate Args ... + if (length >= 5) + { + result = true; + } + + // + return result; +} + +// +// Define Indexes and Styles ... +void DefineBuffers() +{ + // + // Bullish Buffer ... + string bullishBufferLabel = ShortName + "BullPow " + "(" + (string)length + ")"; + ArraySetAsSeries(bullishBuffer, true); + SetIndexBuffer(bullishBufferIndex, bullishBuffer, INDICATOR_DATA); + PlotIndexSetInteger(bullishBufferIndex, PLOT_DRAW_BEGIN, length); + PlotIndexSetString(bullishBufferIndex, PLOT_LABEL, bullishBufferLabel); + + // + // Bearish Buffer ... + string bearishBufferLabel = ShortName + "BearPow " + "(" + (string)length + ")"; + ArraySetAsSeries(bearishBuffer, true); + SetIndexBuffer(bearishBufferIndex, bearishBuffer, INDICATOR_DATA); + PlotIndexSetInteger(bearishBufferIndex, PLOT_DRAW_BEGIN, length); + PlotIndexSetString(bearishBufferIndex, PLOT_LABEL, bearishBufferLabel); + + // + // Signal Buffer ... + string signalBufferLabel = ShortName + "Signal " + "(" + (string)length + ")"; + ArraySetAsSeries(signalBuffer, true); + SetIndexBuffer(signalBufferIndex, signalBuffer, INDICATOR_DATA); + PlotIndexSetInteger(signalBufferIndex, PLOT_DRAW_BEGIN, length); + PlotIndexSetString(signalBufferIndex, PLOT_LABEL, signalBufferLabel); +} + +// +// Set Indicator Short Name and also we can define Buffers Labels ... +void SetIndicatorName() +{ + // + string indicatorShortName = ""; + StringConcatenate(indicatorShortName, ShortName, " ", "( ", length, " )"); + + // + IndicatorSetString(INDICATOR_SHORTNAME, indicatorShortName); +} + +// +// Calculate Buffers ... +void CalculateBuffers( + int bar_index, + const double &close[]) +{ + // + // Reset Global Counters ... + xtdBullishCandleCount = 0; + xtdBearishCandleCount = 0; + + // + // Loop through Closes ... + for (int i = bar_index; i <= bar_index + length; i++) + { + for (int j = i + 1; j <= bar_index + length; j++) + { + // + if (close[i] > close[j]) + { + xtdBullishCandleCount++; + } + + // + if (close[i] < close[j]) + { + xtdBearishCandleCount++; + } + } + } + + // + // Bullish Power Buffer ... + bullishBuffer[bar_index] = MathAbs(xtdBullishCandleCount); + + // + // Bearish Power Buffer ... + bearishBuffer[bar_index] = MathAbs(xtdBearishCandleCount); + + // + // Signal Buffer ... + signalBuffer[bar_index] = bullishBuffer[bar_index] - bearishBuffer[bar_index]; + + // + // Check and Draw Crosses if it's Specified ... + if (drawCrosses) + { + DrawCrosses(bar_index); + } +} + +// +// +double GetState( + int bar_index // Specified Bar Index +) +{ + // + // Check Cross Points ... + // bullishCrossedOverBearish = 2; + // bullishOverBearish = 1; + // bullishCrossedUnderBearish = -2; + // bullishUnderBearish = -1; + // OtherWise = 0; + bool isBullishCrossedOverBearish = IsCrossOver( + bullishBuffer, + bearishBuffer, + bar_index); + bool isBullishCrossedUnderBearish = IsCrossUnder( + bullishBuffer, + bearishBuffer, + bar_index); + bool isBullishOverBearish = IsOver( + bullishBuffer, + bearishBuffer, + bar_index); + bool isBullishUnderBearish = IsUnder( + bullishBuffer, + bearishBuffer, + bar_index); + + // + double result = X_XTD_NEUTURAL; + if (isBullishCrossedOverBearish) + { + result = X_XTD_BULLISH_CROSSED_OVER_BEARISH; + } + else if (isBullishCrossedUnderBearish) + { + result = X_XTD_BULLISH_CROSSED_UNDER_BEARISH; + } + else if (isBullishOverBearish) + { + result = X_XTD_BULLISH_OVER_BEARISH; + } + else if (isBullishUnderBearish) + { + result = X_XTD_BULLISH_UNDER_BEARISH; + } + else + { + result = X_XTD_NEUTURAL; + } + + // + return result; +} + +// +// Draw Crosses ... +void DrawCrosses( + int bar_index // the bars which required to draw cross arrow on it ... +) +{ + // + double stateValue = GetState(bar_index); + + // + bool isOver = stateValue == 2; + double low = iLow(_Symbol, _Period, bar_index); + double high = iHigh(_Symbol, _Period, bar_index); + + // + double price = isOver ? low : high; + datetime time = iTime(_Symbol, _Period, bar_index); + ENUM_ARROW_ANCHOR anchor = isOver ? ANCHOR_TOP : ANCHOR_BOTTOM; + uchar arrowCode = isOver ? bullishArrowCode : bearishArrowCode; + color arrowColor = isOver ? bullishArrowColor : bearishArrowColor; + string crossName = "Trend " + (isOver ? "Up" : "Down") + "_" + (string)time + "_" + (string)price; + + // + DrawArrow( + 0, + crossName, + 0, + time, + price, + arrowCode, + anchor, + arrowColor); +} +// +// END Functions ... +// diff --git a/BKPS/OLD/EURUSD-5M-V0.1/MQ5/Indicators/x-saherelm.xtm.indicator.mq5 b/BKPS/OLD/EURUSD-5M-V0.1/MQ5/Indicators/x-saherelm.xtm.indicator.mq5 new file mode 100644 index 0000000..fac9877 --- /dev/null +++ b/BKPS/OLD/EURUSD-5M-V0.1/MQ5/Indicators/x-saherelm.xtm.indicator.mq5 @@ -0,0 +1,349 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 Candle Indicator +// --------------------------------------------- +// Name: XTM +// 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 XTM Indicator" +#property strict + +// +// START Constants ... +// +#define ShortName "XTM" + +// +// XTM Indicator States ... +enum ENUM_X_XTM_STATES +{ + X_XTM_BULLISH = 1, + X_XTM_BEARISH = -1, + X_XTM_NEUTURAL = 0, +}; +// +// END Constants ... +// + +// +// START Inputs ... +// +input int maPeriod = 14; // Period +input int maShift = 0; // Shift +input ENUM_MA_METHOD maMethod = MODE_SMA; // Method +input ENUM_APPLIED_PRICE maAppliedTo = PRICE_CLOSE; // Applied To +// +// END Inputs ... +// + +// +// Includes Logging Library ... +#include "../Libraries/x-saherelm.log.lib.mq5"; + +// +// 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 +#define stateBufferIndex 2 + +double maBuffer[]; +double maColorBuffer[]; +double stateBuffer[]; + +#property indicator_label1 "XTM" +#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 maHandler = INVALID_HANDLE; +// +// END Global Definitions: Variables, Properties and etc ... +// + +// +// START Event Handlers ... +// +// +// Initialization ... +int OnInit() +{ + // + // Validate Inputs ... + if (!ValidateInputs()) + { + return INIT_PARAMETERS_INCORRECT; + } + + // + logTag = ShortName; + + // + // Initializing MA Handler ... + maHandler = iMA( + _Symbol, + _Period, + maPeriod, + maShift, + maMethod, + maAppliedTo); + if (maHandler == INVALID_HANDLE) + { + // + string message = "Error Initializing Ma Handler ..."; + LogMessage(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 ... +} + +// +// Calculations ... +// +// 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; + + // + // 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 ... + int maxLength = MathMax(0, maPeriod); + + // + // 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 (maPeriod >= 2) + { + result = true; + } + + // + return result; +} + +// +// Define Indexes and Styles ... +void DefineBuffers() +{ + // + string maBufferLabel = "XTM " + "(" + (string)maPeriod + ")"; + + // + // Ma Buffer ... + ArraySetAsSeries(maBuffer, true); + SetIndexBuffer(maBufferIndex, maBuffer, INDICATOR_DATA); + PlotIndexSetString(maBufferIndex, PLOT_LABEL, maBufferLabel); + + // + // Ma Color Buffer ... + ArraySetAsSeries(maColorBuffer, true); + SetIndexBuffer(maColorBufferIndex, maColorBuffer, INDICATOR_COLOR_INDEX); + + // + // State Buffer ... + ArraySetAsSeries(stateBuffer, true); + SetIndexBuffer(stateBufferIndex, stateBuffer, INDICATOR_CALCULATIONS); +} + +// +// Set Indicator Short Name and also we can define Buffers Labels ... +void SetIndicatorName() +{ + // + string indicatorShortName = ""; + StringConcatenate(indicatorShortName, ShortName, " ", "(", maPeriod, ")"); + + // + IndicatorSetString(INDICATOR_SHORTNAME, indicatorShortName); +} + +// +// 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; + + // + // Define State Value ... + // lineColorIndex == 0 => Bullish => 1; + // lineColorIndex == 1 => Neutural => 0; + // lineColorIndex == 2 => Bearish => -1; + double stateValue = + lineColorIndex == 0 ? X_XTM_BULLISH : lineColorIndex == 2 ? X_XTM_BEARISH + : X_XTM_NEUTURAL; + + // + // Set Ma Buffer Color Index ... + maColorBuffer[bar_index] = lineColorIndex; + + // + // Set State Buffer Value ... + stateBuffer[bar_index] = stateValue; +} + +// +// END Functions ... +// diff --git a/BKPS/OLD/EURUSD-5M-V0.1/MQ5/Libraries/x-saherelm.alert.lib.mq5 b/BKPS/OLD/EURUSD-5M-V0.1/MQ5/Libraries/x-saherelm.alert.lib.mq5 new file mode 100644 index 0000000..9ccf667 --- /dev/null +++ b/BKPS/OLD/EURUSD-5M-V0.1/MQ5/Libraries/x-saherelm.alert.lib.mq5 @@ -0,0 +1,197 @@ +/////////////////////////////////////////////////////// +// +// 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 = true; // Terminal Alerts +input bool mailAlerts = true; // Mail Alerts +input bool pushAlerts = true; // 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) +{ + // + 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); + } +} +void SendAlert( + XSignal &signal, // the Signal Object which requred to Alert + bool asExecuted = true // determines Alert Signal as Executed Signal or not +) +{ + // + // Prepare Message ... + string message = asExecuted ? ExecutedSignalToString(signal) : SignalToString(signal); + + // + // Do Alerting ... + SendAlert(message); +} +// +// END Provided Functions ... +// diff --git a/BKPS/OLD/EURUSD-5M-V0.1/MQ5/Libraries/x-saherelm.class.lib.mq5 b/BKPS/OLD/EURUSD-5M-V0.1/MQ5/Libraries/x-saherelm.class.lib.mq5 new file mode 100644 index 0000000..4ede425 --- /dev/null +++ b/BKPS/OLD/EURUSD-5M-V0.1/MQ5/Libraries/x-saherelm.class.lib.mq5 @@ -0,0 +1,3991 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 Class Library +// -------------------------------------- +// Name: XClass +// Description: provides all classes for use ... +// +// +// Maintainer: +// ------------ +// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) +// +////////////////////////////////////////////////////// +// +// Global Properties ... +#property library +#property copyright "Copyright 2023, SaherElm IT Center" +#property link "https://www.saherelm.ir" +#property version "1.00" +#property strict + +// +#include +#include +#include +#include +#include "x-saherelm.draw.lib.mq5" +#include "x-saherelm.models.lib.mq5" +#include "x-saherelm.common.lib.mq5" +#include + +// +// START Model Definitions ... +// +// +// END Model Definitions ... +// + +// +// START Overrides ... +// +class XSCTrade : public CTrade +{ +public: + // + // Specific Position Close ... + bool PositionClose( + const ulong ticket, // Position Ticket + const ulong deviation, // Deviation + const string comment // Comment For Close + ) + { + // + bool result = false; + + // + // check stopped ... + if (IsStopped(__FUNCTION__)) + { + return result; + } + + // + // check position existence + if (!PositionSelectByTicket(ticket)) + { + return result; + } + + // + string symbol = PositionGetString(POSITION_SYMBOL); + + // + // Clean ... + ClearStructures(); + + // + // Check Position Type ... + // BUY / LONG ... + 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); + } + // + // SELL / Short ... + else + { + // + // Prepare Request for Close SELL Position ... + m_request.type = ORDER_TYPE_BUY; + m_request.price = SymbolInfoDouble(symbol, SYMBOL_ASK); + } + + // + // Setting Request Fields ... + m_request.symbol = symbol; + m_request.magic = m_magic; + m_request.position = ticket; + m_request.action = TRADE_ACTION_DEAL; + m_request.volume = PositionGetDouble(POSITION_VOLUME); + m_request.deviation = (deviation == ULONG_MAX) ? m_deviation : deviation; + + // + // Specify Comment ... + m_request.comment = comment; // PositionGetString(POSITION_COMMENT); // "Comment anything"; + + // + // Log Info on Screen ... + PrintFormat("PositionClose #%I64d %s %.2f", ticket, EnumToString((ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE)), m_request.volume); + + // + // Close Position ... + result = (OrderSend(m_request, m_result)); + + // + return result; + } + + // + // Specific Position Close ... + bool PositionClose( + const ulong ticket, // Position Ticket + const string comment = "" // Comment For Close + ) + { + // + bool result = false; + + // + // check stopped ... + if (IsStopped(__FUNCTION__)) + { + return result; + } + + // + // check position existence + if (!PositionSelectByTicket(ticket)) + { + return result; + } + + // + string symbol = PositionGetString(POSITION_SYMBOL); + + // + // Clean ... + ClearStructures(); + + // + // Check Position Type ... + // BUY / LONG ... + 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); + } + // + // SELL / Short ... + else + { + // + // Prepare Request for Close SELL Position ... + m_request.type = ORDER_TYPE_BUY; + m_request.price = SymbolInfoDouble(symbol, SYMBOL_ASK); + } + + // + // Setting Request Fields ... + m_request.symbol = symbol; + m_request.magic = m_magic; + m_request.position = ticket; + m_request.deviation = m_deviation; + m_request.action = TRADE_ACTION_DEAL; + m_request.volume = PositionGetDouble(POSITION_VOLUME); + + // + // Specify Comment ... + m_request.comment = comment; // PositionGetString(POSITION_COMMENT); // "Comment anything"; + + // + // Log Info on Screen ... + PrintFormat("PositionClose #%I64d %s %.2f", ticket, EnumToString((ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE)), m_request.volume); + + // + // Close Position ... + result = (OrderSend(m_request, m_result)); + + // + return result; + } +}; +// +// END Overrides ... +// + +// +// XSaherElm Account Info Class ... +class XCAccountInfo +{ + // + // Public properties ... +public: + // + // Constructro ... + void XCAccountInfo() + { + // + mAccountInfo = new CAccountInfo(); + + // + mInitialBalance = mAccountInfo.Balance(); + } + + // + // Deconstructor ... + void ~XCAccountInfo() + { + // + mInitialBalance = 0; + } + + // + // 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) ... + ENUM_ACCOUNT_TRADE_MODE GetTradeMode() + { + return mAccountInfo.TradeMode(); + } + + // + // Get Account Balance ... + double GetBalance() + { + return mAccountInfo.Balance(); + } + + // + // Get Initial Deposit Balance ... + double GetInitialBalance() + { + return mInitialBalance; + } + + // + // 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; + } + + // + // Protected properties ... +protected: + // + // Private properties ... +private: + // + // Initial Account Balance ... + double mInitialBalance; + + // + // Account Info ... + CAccountInfo mAccountInfo; +}; + +// +// START Global Definitions: Variables, Properties and etc ... +// +// +// XSaherElm Trade Class ... +class XCTrade +{ + // + // all public features ... +public: + // + // Constructor ... + void XCTrade( + string tag, // Specify a Tag for Trader instance + string symbol, // Specify Trader Symbol + int slippage, // Specify Slippage + ulong magicNumber, // Specify Magic Number + int maxAllowedTrades, // Specify Max Allowed Trades + int maxAllowedSupportTrades, // Specify Max Allowed Support Trades for each Trade + double minTradeProfitsInPips, // Minimum Profit of each Trade in Pips + double supportTradesPriceDistanceInPips, // Support Trades Price Distance in Pips + double minAllowedFreeMarginForOpenTrades, // Minimum Free Marging for Open Trades + double minBallanceForOpenTrades // Minimum Balance for Open Trades + ) + { + // + mTag = tag; + mSymbol = symbol; + mSlippage = slippage; + mMagicNumber = magicNumber; + mMaxAllowedTrades = maxAllowedTrades; + mMinTradeProfitsInPips = minTradeProfitsInPips; + mMaxAllowedSupportTrades = maxAllowedSupportTrades; + mMinBallanceForOpenTrades = minBallanceForOpenTrades; + mSupportTradesPriceDistanceInPips = supportTradesPriceDistanceInPips; + mMinAllowedFreeMarginForOpenTrades = minAllowedFreeMarginForOpenTrades; + + // + mTrader = new XSCTrade(); + + // + mTrader.SetAsyncMode(false); + mTrader.SetDeviationInPoints(mSlippage); + mTrader.SetExpertMagicNumber(mMagicNumber); + } + + // + // Deconstructor ... + void ~XCTrade() + { + } + + // + // Count Open Positions ... + int Count() + { + // + int result = 0; + + // + int total = PositionsTotal(); + for (int i = 0; i < total; i++) + { + // + if (!mPositionInfo.SelectByIndex(i)) + { + continue; + } + + // + if (mPositionInfo.Magic() != mMagicNumber) + { + continue; + } + + // + if (mPositionInfo.Symbol() != mSymbol) + { + continue; + } + + // + result++; + } + + // + return result; + } + + // + // Count Longs ... + int CountLongs() + { + int result = CountByType(X_SIGNAL_LONG); + return result; + } + + // + // Count Shorts ... + int CountShorts() + { + int result = CountByType(X_SIGNAL_SHORT); + return result; + } + + // + // Count By Type ... + int CountByType(ENUM_X_SIGNAL_TYPE type) + { + // + // Validate Args ... + ENUM_POSITION_TYPE mType = POSITION_TYPE_BUY; + if (type == X_SIGNAL_LONG) + { + mType = POSITION_TYPE_BUY; + } + else if (type == X_SIGNAL_SHORT) + { + mType = POSITION_TYPE_SELL; + } + + // + int result = CountByType(mType); + return result; + } + + // + // Count By Type and Kind ... + int CountByKind( + ENUM_X_SIGNAL_TYPE type, // Specify Type of Positions + ENUM_X_SIGNAL_KIND kind // Specify Kind of Positions + ) + { + // + int result = 0; + + // + XSignal trades[]; + GetPositionsByKind( + type, + kind, + trades); + + // + result = ArraySize(trades); + + // + return result; + } + int CountByKind( + ENUM_X_SIGNAL_KIND kind // Specify Kind of Positions + ) + { + // + int result = 0; + + // + // Count Longs ... + result = CountByKind( + X_SIGNAL_UNKNOWN, + kind); + + // + return result; + } + + // + // Count Supported Positions belongs to Specified Parent Signal ... + int CountSupportedPositions( + XSignal &parent // Specified Parent Signal + ) + { + // + int result = 0; + + // + XSignal supports[]; + GetSupportedPositions(parent, supports); + result = ArraySize(supports); + + // + return result; + } + + // + // Retrieve Specified Position by it's Ticket ... + XSignal GetPosition( + ulong ticket // Specified Ticket + ) + { + // + XSignal result = {}; + + // + result = PositionToSignal(ticket); + + // + return result; + } + + // + // Retrieve all Positions ... + void GetAllPositions( + XSignal &result[] // Holds Result ... + ) + { + // + CleanBuffer(result); + + // + int totalPositions = PositionsTotal(); + for (int i = 0; i < totalPositions; i++) + { + // + if (!mPositionInfo.SelectByIndex(i)) + { + continue; + } + + // + if (mPositionInfo.Magic() != mMagicNumber) + { + continue; + } + + // + if (mPositionInfo.Symbol() != mSymbol) + { + continue; + } + + // + // Position to Signal ... + XSignal signal = PositionToSignal(i); + Add( + signal, + result); + } + } + + // + // Retrieve all Long Positions ... + void GetLongPositions( + XSignal &result[] // Holds Result ... + ) + { + GetAllPositionsByType(POSITION_TYPE_BUY, result); + } + + // + // Retrieve all Short Positions ... + void GetShortPositions( + XSignal &result[] // Holds Result ... + ) + { + GetAllPositionsByType(POSITION_TYPE_SELL, result); + } + + // + // Get Positions by Specified Type ... + void GetPositionsByType( + ENUM_X_SIGNAL_TYPE type, // Specify Type of Positions + XSignal &result[] // Holds Result ... + ) + { + // + CleanBuffer(result); + + // + switch (type) + { + // + case X_SIGNAL_LONG: + GetLongPositions(result); + break; + + // + case X_SIGNAL_SHORT: + GetShortPositions(result); + break; + + // + case X_SIGNAL_UNKNOWN: + default: + GetAllPositions(result); + break; + } + } + + // + // Get Positions by Specified Type and Kind ... + void GetPositionsByKind( + ENUM_X_SIGNAL_TYPE type, // Specify Type of Positions + ENUM_X_SIGNAL_KIND kind, // Specify Kind of Positions + XSignal &result[] // Holds Result ... + ) + { + // + CleanBuffer(result); + + // + XSignal trades[]; + switch (type) + { + // + case X_SIGNAL_LONG: + GetLongPositions(trades); + break; + + // + case X_SIGNAL_SHORT: + GetShortPositions(trades); + break; + + // + case X_SIGNAL_UNKNOWN: + default: + GetAllPositions(trades); + break; + } + + // + int count = ArraySize(trades); + if (count <= 0) + { + return; + } + + // + for (int i = 0; i < count; i++) + { + // + XSignal trade = trades[i]; + if (trade.kind != kind) + { + continue; + } + + // + Add( + trade, + result); + } + } + + // + // Retrieve List Of Supported Positions belongs to Specified Parent Signal ... + void GetSupportedPositions( + XSignal &parent, // Specified Parent Signal + XSignal &result[] // Holds Result ... + ) + { + // + CleanBuffer(result); + + // + // Validate Signal ... + bool isValidSignal = IsValid(parent, mMagicNumber); + if (!isValidSignal) + { + return; + } + + // + // Validate Signal is Parent Signal ... + bool isParentSignal = parent.kind == X_KIND_TRADE; + if (!isParentSignal) + { + return; + } + + // + // Retrieve All Support Signals ... + XSignal supports[]; + GetPositionsByKind( + X_SIGNAL_UNKNOWN, + X_KIND_SUPPORT, + supports); + int supportsCount = ArraySize(supports); + if (supportsCount <= 0) + { + return; + } + + // + // Loop Through Supports ... + for (int i = 0; i < supportsCount; i++) + { + // + XSignal support = supports[i]; + + // + bool isBelongsToParent = support.parent == parent.ticket; + if (isBelongsToParent) + { + // + Add( + support, + result); + } + } + } + + // + // Get All Trades Which Candle Passed after Open ... + void GetLongTimeTrades( + int life, // Max Candle Passed after Trades Open + ENUM_TIMEFRAMES period, // Calculate Candles based on time frame + ENUM_X_SIGNAL_TYPE type, // Specify Type of Positions + ENUM_X_SIGNAL_KIND kind, // Specify Kind of Positions + XSignal &result[] // Holds Result + ) + { + // + CleanBuffer(result); + + // + // Normalize Period ... + if (period == EMPTY_VALUE) + { + period = _Period; + } + + // + XSignal positions[]; + GetPositionsByKind( + type, + kind, + positions); + int count = ArraySize(positions); + if (count <= 0) + { + return; + } + + // + // Current Time Frame Candle Index ... + int currentBarIndex = 0; + + // + // Loop through Positions ... + for (int i = 0; i < count; i++) + { + // + XSignal trade = positions[i]; + + // + // Retrieve Trade Open Bar Index based on Current Period ... + int tradeOpenBarIndex = iBarShift( + mSymbol, + period, + trade.time); + + // + // Calculate Trade Life ... + int diff = MathAbs(currentBarIndex - tradeOpenBarIndex); + if (diff >= life) + { + // + Add( + trade, + result); + } + } + } + + // + // Get In DrawDown Trades ... + void GetInDrawDownTrades( + double maxDrawDown, // Maximum DrawDown of Trades + ENUM_X_SIGNAL_TYPE type, // Specify Type of Positions + ENUM_X_SIGNAL_KIND kind, // Specify Kind of Positions + XSignal &result[] // Holds Result + ) + { + // + CleanBuffer(result); + + // + // Validate Args ... + if (maxDrawDown <= 0) + { + maxDrawDown = 0; + } + + // + XSignal trades[]; + + // + // Retrieve Signals ... + GetPositionsByKind( + type, + kind, + trades); + + // + // Check Trades Count ... + int count = ArraySize(trades); + if (count <= 0) + { + return; + } + + // + // Loop through all retrieved trades ... + for (int i = 0; i < count; i++) + { + // + XSignal trade = trades[i]; + if (trade.profit > 0) + { + continue; + } + + // + bool isPassed = maxDrawDown == 0 ? true : (-1 * trade.profit) >= maxDrawDown; + if (isPassed) + { + // + Add( + trade, + result); + } + } + } + + // + // Get In Profit Trades ... + void GetInProfitTrades( + double minProfit, // Minimum Profit To Close Trades + ENUM_X_SIGNAL_TYPE type, // Specify Type of Positions + ENUM_X_SIGNAL_KIND kind, // Specify Kind of Positions + XSignal &result[] // Holds Result + ) + { + // + CleanBuffer(result); + + // + XSignal trades[]; + GetPositionsByKind( + type, + kind, + result); + + // + // Check Trades Count ... + int count = ArraySize(trades); + if (count <= 0) + { + return; + } + + // + // Loop through all retrieved trades ... + for (int i = 0; i < count; i++) + { + // + XSignal trade = trades[i]; + if (trade.profit < 0) + { + continue; + } + + // + bool isPassed = minProfit <= 0 ? true : trade.profit >= minProfit; + if (isPassed) + { + // + Add( + trade, + result); + } + } + } + + // + // Filter Trades by Searching Comments ... + void FilterTrades( + string query, // Search String + ENUM_X_SIGNAL_TYPE type, // Specify Type of Positions + ENUM_X_SIGNAL_KIND kind, // Specify Kind of Positions + XSignal &result[] // Holds Result + ) + { + // + // Free Buffer ... + CleanBuffer(result); + + // + XSignal source[]; + GetPositionsByKind( + type, + kind, + source); + int sourceCount = ArraySize(source); + + // + if (sourceCount <= 0) + { + return; + } + + // + // Do Filtering Signals ... + FilterSignals( + query, + source, + result); + } + + // + // Filter In DrawDown Trades by Searching Comments ... + void FilterInDrawDowntTrades( + string query, // Search String + double maxDrawDown, // Maximum DrawDown of Trades + ENUM_X_SIGNAL_TYPE type, // Specify Type of Positions + ENUM_X_SIGNAL_KIND kind, // Specify Kind of Positions + XSignal &result[] // Holds Result + ) + { + // + // Free Buffer ... + CleanBuffer(result); + + // + XSignal source[]; + GetInDrawDownTrades( + maxDrawDown, + type, + kind, + source); + int sourceCount = ArraySize(source); + + // + if (sourceCount <= 0) + { + return; + } + + // + // Do Filtering Signals ... + FilterSignals( + query, + source, + result); + } + + // + // Filter In DrawDown Trades by Searching Comments ... + void FilterInProfitTrades( + string query, // Search String + double minProfit, // Minimum Profit of Trades + ENUM_X_SIGNAL_TYPE type, // Specify trades type to act + ENUM_X_SIGNAL_KIND kind, // Specify Kind of Positions + XSignal &result[] // Holds Result + ) + { + // + // Free Buffer ... + CleanBuffer(result); + + // + XSignal source[]; + GetInProfitTrades( + minProfit, + type, + kind, + source); + int sourceCount = ArraySize(source); + + // + if (sourceCount <= 0) + { + return; + } + + // + // Do Filtering Signals ... + FilterSignals( + query, + source, + result); + } + + // + // Filter Trades by Searching Comments ... + void FilterTrades( + string query, // Search String + XSignal &source[], // Source Buffer to Filter + XSignal &result[] // Holds Result + ) + { + // + // Free Buffer ... + CleanBuffer(result); + + // + // Do Filtering Signals ... + FilterSignals( + query, + source, + result); + } + + // + // Force Open a Buy/Long Position ... + bool Buy( + double volume, // position volume + double price, // execution price + double sl = 0, // stop loss price + double tp = 0, // take profit price + const string comment = "" // comment + ) + { + // + bool result = false; + + // + result = mTrader.Buy( + volume, + mSymbol, + price, + sl, + tp, + comment); + + // + return result; + } + + // + // Force Open a Sell/Short Position ... + bool Sell( + double volume, // position volume + double price, // execution price + double sl = 0, // stop loss price + double tp = 0, // take profit price + const string comment = "" // comment + ) + { + // + bool result = false; + + // + result = mTrader.Sell( + volume, + mSymbol, + price, + sl, + tp, + comment); + + // + return result; + } + + // + // Validate Signal ... + bool ValidateSignal( + XSignal &signal // Specify Signal for Execution + ) + { + // + bool result = false; + + // + // Validate Signal Type ... + result = signal.type != X_SIGNAL_UNKNOWN; + if (!result) + { + return result; + } + + // + // Check Symbol ... + result = StringLen(signal.symbol) == 0 ? true : signal.symbol == mSymbol; + if (!result) + { + return result; + } + + // + // Check magic number ... + result = signal.magicNumber <= 0 ? true : signal.magicNumber == mMagicNumber; + if (!result) + { + return result; + } + + // + // Check Entry ... + result = signal.entry > 0; + if (!result) + { + return result; + } + + // + // Check SL ... + result = signal.sl == 0 ? true : signal.type == X_SIGNAL_LONG ? signal.sl < signal.entry + : signal.sl > signal.entry; + if (!result) + { + return result; + } + + // + // Check TP ... + result = signal.tp == 0 ? true : signal.type == X_SIGNAL_LONG ? signal.tp > signal.entry + : signal.tp < signal.entry; + if (!result) + { + return result; + } + + // + // Check Volume ... + result = signal.volume > 0; + if (!result) + { + return result; + } + + // + // Check Time ... + result = signal.time > 0; + if (!result) + { + return result; + } + + // + return result; + } + + // + // Execute an Specific XSignal instance ... + bool ExecuteSignal( + XSignal &signal, // Specify Signal for Execution + int &error // Error code if Happens + ) + { + // + bool result = false; + + // + // Validate Signal ... + result = ValidateSignal(signal); + if (!result) + { + // + error = X_INVALID_SIGNAL_ERROR; + return result; + } + + // + signal.symbol = mSymbol; + + // + bool isTrade = signal.kind == X_KIND_TRADE; + + // + // Check Account Balance ... + result = IsAccountBalanceReadyForTrade(); + if (!result) + { + // + error = X_XTRADER_NOT_ENOUGH_BALANCE_ERROR; + return result; + } + + // + // Check Account Free Margin ... + result = IsFreeMarginReadyForTrade(); + if (!result) + { + // + error = X_XTRADER_NOT_ENOUGH_MARIGIN_ERROR; + return result; + } + + // + // Check Can Open Trades ... + result = CanOpenNewTrade( + signal.type, + signal.kind); + if (!result) + { + error = isTrade ? + // + X_XTRADER_MAX_ALLOWED_TRADE_KIND_REACHED_ERROR + : + // + X_XTRADER_MAX_ALLOWED_SUPPORT_KIND_REACHED_ERROR + // + ; + } + + // + ResetLastError(); + + // + // Execute Signal Trade ... + result = + // + signal.type == X_SIGNAL_LONG + // + ? + // + Buy( + signal.volume, + signal.entry, + signal.sl, + signal.tp, + signal.comment) + // + : + // + signal.type == X_SIGNAL_SHORT + // + ? + // + Sell( + signal.volume, + signal.entry, + signal.sl, + signal.tp, + signal.comment) + // + : + // + false + // + ; + + // + // if (!result) + // { + // // + // int errorCode = GetLastError(); + + // // + // // Not Enough Money, since Volume is High ... + // if (errorCode == 4756) + // { + // // + // signal.volume = NormalizeVolume(signal.volume / 3); + // result = ExecuteSignal( + // signal, + // error); + // } + // } + + // + if (result) + { + // + error = X_SUCCEED_EXECUTION; + + // + ulong positionTicket = 0; + if (mPositionInfo.SelectByIndex(PositionsTotal() - 1)) + { + positionTicket = mPositionInfo.Ticket(); + } + + // + signal.id = positionTicket; + signal.ticket = positionTicket; + + // + // Draw Signal On Chart ... + DrawSignalEvent(signal); + } + else + { + error = X_UNKNOWN_ERROR; + } + + // + return result; + } + + // + // Execute Support Signal ... + bool ExecuteSupportSignal( + XSignal &signal, // Specify Signal for Execution + int &error // Error code if Happens + ) + { + // + bool result = false; + error = X_UNKNOWN_ERROR; + + // + // Validate Signal ... + result = ValidateSignal(signal); + if (!result) + { + // + error = X_INVALID_SIGNAL_ERROR; + return result; + } + + // + // Determines Signal is Long or Short ... + bool isLong = signal.type == X_SIGNAL_LONG; + + // + // Check Signal Kind ... + result = signal.kind == X_KIND_SUPPORT; + if (!result) + { + // + error = X_INVALID_SIGNAL_ERROR; + return result; + } + + // + // Check Signal Kind Based Properties ... + result = signal.parent > 0; + if (!result) + { + // + error = X_INVALID_SIGNAL_ERROR; + return result; + } + + // + // Check Support Trade Parent Position Existance ... + XSignal parent = GetPosition(signal.parent); + result = IsValid(parent, mMagicNumber); + if (!result) + { + // + error = X_INVALID_SIGNAL_ERROR; + return result; + } + + // + // Check Max Number Of Support Trades which belongs to Parent ... + int supportsCount = CountSupportedPositions(parent); + result = supportsCount < mMaxAllowedSupportTrades; + if (!result) + { + // + error = X_XTRADER_MAX_ALLOWED_SUPPORT_KIND_REACHED_ERROR; + return result; + } + + // + // Check Support Trade Price Distance Passed ... + double supportTradesPriceDistance = PipsToPrice(mSupportTradesPriceDistanceInPips); + double supportPriceDistance = MathAbs(parent.entry - signal.entry); + result = supportPriceDistance >= supportTradesPriceDistance; + if (!result) + { + // + error = X_TRADER_SUPPORT_DISTANCE_NOT_HAPPENS_ERROR; + return result; + } + + // + // Check Account Balance ... + result = IsAccountBalanceReadyForTrade(); + if (!result) + { + // + error = X_XTRADER_NOT_ENOUGH_BALANCE_ERROR; + return result; + } + + // + ResetLastError(); + + // + // Execute Signal Trade ... + result = + // + signal.type == X_SIGNAL_LONG + // + ? + // + Buy( + signal.volume, + signal.entry, + signal.sl, + signal.tp, + signal.comment) + // + : + // + signal.type == X_SIGNAL_SHORT + // + ? + // + Sell( + signal.volume, + signal.entry, + signal.sl, + signal.tp, + signal.comment) + // + : + // + false + // + ; + + // + // if (!result) + // { + // // + // int errorCode = GetLastError(); + + // // + // // Not Enough Money, since Volume is High ... + // if (errorCode == 4756) + // { + // // + // signal.volume = NormalizeVolume(signal.volume / 3); + // result = ExecuteSupportSignal( + // signal, + // error); + // } + // } + + // + if (result) + { + // + error = X_SUCCEED_EXECUTION; + + // + ulong positionTicket = 0; + if (mPositionInfo.SelectByIndex(PositionsTotal() - 1)) + { + positionTicket = mPositionInfo.Ticket(); + } + + // + signal.id = positionTicket; + signal.ticket = positionTicket; + + // + // Draw Signal On Chart ... + DrawSignalEvent(signal); + } + else + { + error = X_UNKNOWN_ERROR; + } + + // + return result; + } + + // + // Modify Position ... + bool Modify( + const ulong ticket, // position ticket + double sl = 0, // stop loss price + double tp = 0 // take profit + ) + { + // + bool result = false; + + // + // Validate Args ... + if (tp <= 0 && sl <= 0) + { + result = false; + return result; + } + + // + result = mTrader.PositionModify( + ticket, + sl, + tp); + + // + 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, + comment); + if (result) + { + RemoveSignal(ticket); + } + + // + return result; + } + + // + // Close Partial By Ticket ... + bool ClosePartial(ulong ticket, double volume) + { + // + bool result = false; + + // + if (!mPositionInfo.SelectByTicket(ticket)) + { + return result; + } + + // + result = mTrader.PositionClosePartial( + ticket, + volume); + + // + return result; + } + + // + // Partial Close all Reached Signals ... + void RiskFreeSignals( + ENUM_X_SIGNAL_TYPE type, // Specify Type of Positions + ENUM_X_SIGNAL_KIND kind, // Specify Kind of Positions + XSignal &riskFrees[] // Holds all Executed Signals + ) + { + // + CleanBuffer(riskFrees); + + // + XSignal trades[]; + GetPositionsByKind( + type, + kind, + trades); + int count = ArraySize(trades); + if (count <= 0) + { + return; + } + + // + // Loop ... + for (int i = 0; i < count; i++) + { + // + XSignal trade = trades[i]; + + // + // Ignore Not Risk Free Signal ... + if ( + trade.riskFree <= 0 || + (trade.riskFree > 0 && trade.riskFreeRate <= 0)) + { + continue; + } + + // + bool isLong = trade.type == X_SIGNAL_LONG; + + // + // Check Exit Price reached Risk Free ... + double exitPrice = GetExit(trade.type); + double isPriceReachedRiskFree = isLong ? exitPrice >= trade.riskFree : exitPrice <= trade.riskFree; + if (!isPriceReachedRiskFree) + { + continue; + } + + // + double volume = trade.volume; + double riskFreeRate = trade.riskFreeRate; + double riskFreeVolume = riskFreeRate * volume; + riskFreeVolume = NormalizeVolume(riskFreeVolume); + + // + // Check Trade Doesnt Closed Partial Before ... + // Check Volume is Enough for Partial Closing ... + if ( + trade.sl > 0 || + riskFreeVolume == volume) + { + continue; + } + + // + bool isPartialClosed = ClosePartial(trade.ticket, riskFreeVolume); + if (isPartialClosed) + { + // + bool isLong = trade.type == X_SIGNAL_LONG; + double entry = GetEntry(trade.symbol, trade.type); + + // + double tpValue = trade.tp; + double slDistance = 0; // PipsToPrice(2); + double slValue = isLong ? trade.entry - slDistance : trade.entry + slDistance; + + // + ResetLastError(); + bool isModified = Modify(trade.ticket, slValue, tpValue); + if (isModified) + { + // + Add( + trade, + riskFrees); + + // + LogMessage("Order: " + (string)trade.ticket + " Modification Succeed ..."); + } + else + { + LogMessage("Order: " + (string)trade.ticket + " Modification Failed: " + (string)GetLastError() + ", Desc: " + GetErrorDescription(GetLastError())); + } + } + } + } + void RiskFreeSignals( + XSignal &riskFrees[] // Holds all Executed Signals + ) + { + // + CleanBuffer(riskFrees); + + // + XSignal trades[]; + RiskFreeSignals( + X_SIGNAL_UNKNOWN, + X_KIND_TRADE, + trades); + int tradesCount = ArraySize(trades); + if (tradesCount > 0) + { + // + // Loop ... + for (int i = 0; i < tradesCount; i++) + { + // + XSignal fTrade = trades[i]; + + // + Add( + fTrade, + riskFrees); + } + } + + // + XSignal supports[]; + RiskFreeSignals( + X_SIGNAL_UNKNOWN, + X_KIND_SUPPORT, + supports); + int supportsCount = ArraySize(supports); + if (supportsCount > 0) + { + // + // Loop ... + for (int i = 0; i < supportsCount; i++) + { + // + XSignal fTrade = supports[i]; + + // + Add( + fTrade, + riskFrees); + } + } + } + + // + // Close All Open Positions ... + void CloseAllPositions( + XSignal &closed[] // Holds Closed Positions + ) + { + // + CleanBuffer(closed); + + // + XSignal allPositions[]; + GetAllPositions(allPositions); + + // + // Count all Specified Positions ... + int total = ArraySize(allPositions); + if (total <= 0) + { + return; + } + + // + for (int i = 0; i < total; i++) + { + // + XSignal signal = allPositions[i]; + string comment = GetSignalForceClosedComment(signal); + bool isClosed = Close( + signal.ticket, + comment); + if (isClosed) + { + // + Add( + signal, + closed); + } + } + } + + // + // Close Positions By Type ... + void ClosePositionsByType( + ENUM_X_SIGNAL_TYPE type, // Specify Type of Positions + XSignal &closed[] // Holds Closed Positions + ) + { + // + CleanBuffer(closed); + + // + XSignal allPositions[]; + GetPositionsByType( + type, + allPositions); + + // + // Count all Specified Positions ... + int total = ArraySize(allPositions); + if (total <= 0) + { + return; + } + + // + for (int i = 0; i < total; i++) + { + // + XSignal signal = allPositions[i]; + string comment = GetSignalForceClosedComment(signal); + bool isClosed = Close( + signal.ticket, + comment); + if (isClosed) + { + // + Add( + signal, + closed); + } + } + } + + // + // Close Positions By Kind ... + void ClosePositionsByKind( + ENUM_X_SIGNAL_TYPE type, // Specify Type of Positions + ENUM_X_SIGNAL_KIND kind, // Specify Kind of Positions + XSignal &closed[] // Holds Closed Positions + ) + { + // + CleanBuffer(closed); + + // + XSignal allPositions[]; + GetPositionsByKind( + type, + kind, + allPositions); + + // + // Count all Specified Positions ... + int total = ArraySize(allPositions); + if (total <= 0) + { + return; + } + + // + for (int i = 0; i < total; i++) + { + // + XSignal signal = allPositions[i]; + string comment = GetSignalForceClosedComment(signal); + bool isClosed = Close( + signal.ticket, + comment); + if (isClosed) + { + // + Add( + signal, + closed); + } + } + } + + // + // Close All Trades Which Candle Passed after Open ... + void CloseLongTimeTrades( + int life, // Max Candle Passed after Trades Open + ENUM_TIMEFRAMES period, // Calculate Candles based on time frame + ENUM_X_SIGNAL_TYPE type, // Specify Type of Positions + ENUM_X_SIGNAL_KIND kind, // Specify Kind of Positions + XSignal &closed[] // Holds Closed Trades + ) + { + // + CleanBuffer(closed); + + // + // Normalize Period ... + if (period == EMPTY_VALUE) + { + period = _Period; + } + + // + XSignal positions[]; + GetLongTimeTrades( + life, + period, + type, + kind, + positions); + int count = ArraySize(positions); + if (count <= 0) + { + return; + } + + // + // Loop through Positions ... + for (int i = 0; i < count; i++) + { + // + XSignal trade = positions[i]; + string comment = GetSignalForceClosedComment(trade); + bool isClosed = Close( + trade.ticket, + comment); + if (isClosed) + { + // + Add( + trade, + closed); + } + } + } + void CloseLongTimeTrades( + int life, // Max Candle Passed after Trades Open + ENUM_TIMEFRAMES period, // Calculate Candles based on time frame + XSignal &closed[] // Holds Closed Trades + ) + { + // + CleanBuffer(closed); + + // + XSignal trades[]; + CloseLongTimeTrades( + life, + period, + X_SIGNAL_UNKNOWN, + X_KIND_TRADE, + trades); + int tradesCount = ArraySize(trades); + if (tradesCount > 0) + { + // + // Loop ... + for (int i = 0; i < tradesCount; i++) + { + // + XSignal fTrade = trades[i]; + + // + Add( + fTrade, + closed); + } + } + + // + XSignal supports[]; + CloseLongTimeTrades( + life, + period, + X_SIGNAL_UNKNOWN, + X_KIND_SUPPORT, + supports); + int supportsCount = ArraySize(supports); + if (supportsCount > 0) + { + // + // Loop ... + for (int i = 0; i < supportsCount; i++) + { + // + XSignal fTrade = supports[i]; + + // + Add( + fTrade, + closed); + } + } + } + + // + // Close In DrawDown Trades ... + void CloseInDrawDownTrades( + double maxDrawDown, // Maximum DrawDown of Trades + ENUM_X_SIGNAL_TYPE type, // Specify Type of Positions + ENUM_X_SIGNAL_KIND kind, // Specify Kind of Positions + XSignal &closed[] // Holds Closed Trades + ) + { + // + CleanBuffer(closed); + + // + // Validate Args ... + if (maxDrawDown <= 0) + { + return; + } + + // + XSignal trades[]; + GetInDrawDownTrades( + maxDrawDown, + type, + kind, + trades); + + // + // Check Trades Count ... + int count = ArraySize(trades); + if (count <= 0) + { + return; + } + + // + // Loop through all retrieved trades ... + for (int i = 0; i < count; i++) + { + // + XSignal trade = trades[i]; + string comment = GetSignalInDistanceClosedComment(trade); + bool isClosed = Close( + trade.ticket, + comment); + if (isClosed) + { + Add( + trade, + closed); + } + } + } + void CloseInDrawDownTrades( + double maxDrawDown, // Maximum DrawDown of Trades + XSignal &closed[] // Holds Closed Trades + ) + { + // + CleanBuffer(closed); + + // + XSignal trades[]; + CloseInDrawDownTrades( + maxDrawDown, + X_SIGNAL_UNKNOWN, + X_KIND_TRADE, + trades); + int tradesCount = ArraySize(trades); + if (tradesCount > 0) + { + // + // Loop ... + for (int i = 0; i < tradesCount; i++) + { + // + XSignal fTrade = trades[i]; + + // + Add( + fTrade, + closed); + } + } + + // + XSignal supports[]; + CloseInDrawDownTrades( + maxDrawDown, + X_SIGNAL_UNKNOWN, + X_KIND_SUPPORT, + supports); + int supportsCount = ArraySize(supports); + if (supportsCount > 0) + { + // + // Loop ... + for (int i = 0; i < supportsCount; i++) + { + // + XSignal fTrade = supports[i]; + + // + Add( + fTrade, + closed); + } + } + } + + // + // Close All In Profit Trades ... + void CloseInProfitTrades( + double minProfit, // Minimum Profit To Close Trades + ENUM_X_SIGNAL_TYPE type, // Specify trades type to act + ENUM_X_SIGNAL_KIND kind, // Specify Kind of Positions + XSignal &closed[] // Holds Closed Trades + ) + { + // + CleanBuffer(closed); + + // + XSignal trades[]; + GetInProfitTrades( + minProfit, + type, + kind, + trades); + + // + // Check Trades Count ... + int count = ArraySize(trades); + if (count <= 0) + { + return; + } + + // + // Loop through all retrieved trades ... + for (int i = 0; i < count; i++) + { + // + XSignal trade = trades[i]; + string comment = GetSignalInDistanceClosedComment(trade); + bool isClosed = Close( + trade.ticket, + comment); + if (isClosed) + { + Add( + trade, + closed); + } + } + } + void CloseInProfitTrades( + double minProfit, // Minimum Profit To Close Trades + XSignal &closed[] // Holds Closed Trades + ) + { + // + CleanBuffer(closed); + + // + XSignal trades[]; + CloseInProfitTrades( + minProfit, + X_SIGNAL_UNKNOWN, + X_KIND_TRADE, + trades); + int tradesCount = ArraySize(trades); + if (tradesCount > 0) + { + // + // Loop ... + for (int i = 0; i < tradesCount; i++) + { + // + XSignal fTrade = trades[i]; + + // + Add( + fTrade, + closed); + } + } + + // + XSignal supports[]; + CloseInProfitTrades( + minProfit, + X_SIGNAL_UNKNOWN, + X_KIND_SUPPORT, + supports); + int supportsCount = ArraySize(supports); + if (supportsCount > 0) + { + // + // Loop ... + for (int i = 0; i < supportsCount; i++) + { + // + XSignal fTrade = supports[i]; + + // + Add( + fTrade, + closed); + } + } + } + + // + // Pyramid Open Trades ... + void PyramidTrades( + XSignal &closed[] // Holds Closed Trades + ) + { + // + CleanBuffer(closed); + + // + // Check Open Positions In DrawDown Values ... + + // + // Trades ... + XSignal inDDTrades[]; + GetInDrawDownTrades( + 0, + X_SIGNAL_UNKNOWN, + X_KIND_TRADE, + inDDTrades); + int inDDTradesCount = ArraySize(inDDTrades); + + // + // Supports ... + XSignal inDDSupports[]; + GetInDrawDownTrades( + 0, + X_SIGNAL_UNKNOWN, + X_KIND_SUPPORT, + inDDSupports); + int inDDSupportsCount = ArraySize(inDDSupports); + + // + // Prevent Going Forward ... + if (inDDTradesCount == 0 && inDDSupportsCount == 0) + { + return; + } + + // + // Number Of In DD Trades ... + int count = inDDTradesCount + inDDSupportsCount; + if (count <= 1) + { + return; + } + + // + // Select Longest inDD ... + XSignal longestDD = {}; + + // + // Trades ... + if (inDDTradesCount > 0) + { + // + for (int i = 0; i < inDDTradesCount; i++) + { + // + XSignal iSignal = inDDTrades[i]; + + // + longestDD = longestDD.profit == 0 || longestDD.profit > iSignal.profit ? iSignal : longestDD; + } + } + + // + // Supports ... + if (inDDSupportsCount > 0) + { + // + for (int i = 0; i < inDDSupportsCount; i++) + { + // + XSignal iSignal = inDDSupports[i]; + + // + longestDD = longestDD.profit == 0 || longestDD.profit > iSignal.profit ? iSignal : longestDD; + } + } + + // + // Check Longest In DD ... + LogMessage("Longest (" + (string)count + ") inDD: " + (string)longestDD.ticket + ", Profit: " + (string)longestDD.profit); + + // + // Close Longest In DD ... + Close(longestDD.ticket, "Longets In Drawdown Position"); + + // + Add( + longestDD, + closed); + } + + // + // START Signal Related ... + // + + // + // Prepare a Signall ... + XSignal GenerateSignal( + ENUM_X_SIGNAL_TYPE type, // Signal Type + double tp = 0, // Take Profit + double sl = 0, // Stop Loss + double volume = 0, // Volume + double riskFree = 0, // Risk Free Price + double riskFreeRate = 0, // Risk Free Rate + ENUM_X_SIGNAL_KIND kind = X_KIND_TRADE, // Signal Kind + ulong parent = 0 // Support Kind Signal Parent + ) + { + // + XSignal result = {}; + + // + // Validate Arg ... + if (type == X_SIGNAL_UNKNOWN) + { + return result; + } + + // + // Check Signal Type ... + bool isLong = type == X_SIGNAL_LONG; + + // + // Retrieve entry Price ... + double entry = GetEntry(mSymbol, type); + double spread = GetSpread(mSymbol); + + // + double tpPrice = 0; + double slPrice = 0; + double riskFreePrice = 0; + + // + // Normalize TP Value ... + if (tp <= 0) + { + // + double minReward = PipsToPrice(mMinTradeProfitsInPips); + tp = minReward; + } + + // + if (riskFree > 0 && riskFreeRate > 0) + { + // + riskFreePrice = type == X_SIGNAL_LONG ? entry + riskFree : entry - riskFree; + riskFreePrice = NormalizePrice(riskFreePrice, mSymbol); + } + + // + if (tp > 0) + { + // + tp += spread; + + // + tpPrice = isLong ? entry + tp : entry - tp; + tpPrice = NormalizePrice(tpPrice, mSymbol); + } + + // + if (sl > 0) + { + // + sl += spread; + + // + slPrice = isLong ? entry - sl : entry + sl; + slPrice = NormalizePrice(slPrice, mSymbol); + } + + // + result.type = type; + result.kind = kind; + result.tp = tpPrice; + result.sl = slPrice; + result.entry = entry; + result.parent = parent; + result.symbol = mSymbol; + result.riskFree = riskFreePrice; + result.magicNumber = mMagicNumber; + result.riskFreeRate = riskFreeRate; + result.time = iTime(mSymbol, _Period, 0); + result.volume = NormalizeVolume(volume, mSymbol); + + // + // Since we Use signal instance to Generate Comment, this must be at the end ... + result.comment = GetSignalComment(result); + + // + return result; + } + XSignal GenerateTradeSignal( + ENUM_X_SIGNAL_TYPE type, // Signal Type + double tp, // Take Profit + double sl, // Stop Loss + double volume, // Volume + double riskFree = 0, // Risk Free Price + double riskFreeRate = 0 // Risk Free Rate + ) + { + // + XSignal result = GenerateSignal( + type, + tp, + sl, + volume, + riskFree, + riskFreeRate, + X_KIND_TRADE, + 0 + // + ); + + // + return result; + } + XSignal GenerateSupportSignal( + ENUM_X_SIGNAL_TYPE type, // Signal Type + double tp, // Take Profit + double sl, // Stop Loss + double volume, // Volume + double riskFree, // Risk Free Price + double riskFreeRate, // Risk Free Rate + ulong parent // Support Kind Signal Parent + ) + { + // + XSignal result = GenerateSignal( + type, + tp, + sl, + volume, + riskFree, + riskFreeRate, + X_KIND_SUPPORT, + parent + // + ); + + // + return result; + } + + // + // Calculate SignalAge ... + int GetSignalAge( + datetime time // Signal Execution Time + ) + { + // + int result = 0; + + // + // Validate Arg ... + if (time <= 0) + { + return result; + } + + // + int sIndex = iBarShift( + mSymbol, + _Period, + time); + + // + datetime cTime = iTime( + mSymbol, + _Period, + 0); + int cIndex = iBarShift( + mSymbol, + _Period, + cTime); + + // + result = MathAbs(cIndex - sIndex); + + // + return result; + } + int GetSignalAge( + datetime time, // Signal Execution Time + ENUM_TIMEFRAMES period // Specify Time Frame + ) + { + // + int result = 0; + + // + // Validate Arg ... + if (time <= 0) + { + return result; + } + + // + int sIndex = iBarShift( + mSymbol, + period, + time); + + // + datetime cTime = iTime( + mSymbol, + period, + 0); + int cIndex = iBarShift( + mSymbol, + _Period, + cTime); + + // + result = MathAbs(cIndex - sIndex); + + // + return result; + } + int GetSignalAge( + XSignal &signal // Specify Signal + ) + { + // + int result = 0; + + // + // Validate Arg ... + if ( + signal.time <= 0 || + !IsValid(signal, mMagicNumber)) + { + return result; + } + + // + result = GetSignalAge(signal.time); + + // + return result; + } + int GetSignalAge( + XSignal &signal, // Specify Signal + ENUM_TIMEFRAMES period // Specify Time Frame + ) + { + // + int result = 0; + + // + // Validate Arg ... + if ( + signal.time <= 0 || + !IsValid(signal, mMagicNumber)) + { + return result; + } + + // + result = GetSignalAge( + signal.time, + period); + + // + return result; + } + + // + // Generate a Signal Object name for Draw Events On Chart ... + string GetSignalObjectName( + ulong ticket // Specify Ticket + ) + { + // + string result = ""; + + // + // Validate Arg ... + if (ticket <= 0) + { + return result; + } + + // + // TICKET ... + // it is very importants since they hold position info ... + result += "T(" + (string)ticket + ")"; + + // + return result; + } + string GetSignalObjectName( + XSignal &signal // Specify Signal + ) + { + // + string result = ""; + + // + // Validate Arg ... + if (!IsValid(signal, mMagicNumber)) + { + return result; + } + + // + result = GetSignalObjectName(signal.ticket); + + // + return result; + } + + // + // Convert a Signal to String Representation ... + string ToString( + XSignal &signal // Specify Signal + ) + { + // + string result = ""; + + // + if (!IsValid(signal, mMagicNumber) || signal.ticket <= 0) + { + return result; + } + + // + // TICKET ... + // it is very importants since they hold position info ... + result += "T(" + (string)signal.ticket + ")"; + + // + // TYPE ... + string typeStr = GetSignalType(signal.type); + result += "_TY(" + typeStr + ")"; + + // + // KIND ... + string kindStr = GetSignalKind(signal.kind); + result += "_K(" + kindStr + ")"; + + // + // PARENT ... + result += "_PR(" + (string)signal.parent + ")"; + + // + // ENTRY ... + result += "_E(" + (string)signal.entry + ")"; + + // + // RISKFREE ... + result += "_RF(" + (string)signal.riskFree + ")"; + + // + // RISKFREERATE ... + result += "_RR(" + (string)signal.riskFreeRate + ")"; + + // + // VOLUME ... + result += "_V(" + (string)signal.volume + ")"; + + // + // TYPE ... + // KIND ... + // ENTRY ... + // TICKET ... + // PARENT ... + // VOLUME ... + // RISKFREE ... + // VIRTUALTP ... + // VIRTUALSL ... + // RISKFREERATE ... + // an String Representation of a Signal Carry above fields ... + + // + // ID ... + // TP ... + // SL ... + // TIME ... + // SYMBOL ... + // PROFIT ... + // COMMENT ... + // MAGICNUMBER ... + // these above items can read using PositionInfo instance ... + // so they are not necessary ... + + // + return result; + } + + // + // Convert an string to signal ... + XSignal FromString( + string represent // String Represenation of a Signal + ) + { + // + XSignal result = {}; + + // + // Validate Arg ... + if (StringLen(represent) == 0) + { + return result; + } + + // + // TICKET ... + string ticketStr = ExtractString( + represent, + "T(", + ")"); + if (StringLen(ticketStr) > 0) + { + result.ticket = (ulong)ticketStr; + } + + // + // TYPE ... + string typeStr = ExtractString( + represent, + "_TY(", + ")"); + if (StringLen(typeStr) > 0) + { + // + ENUM_X_SIGNAL_TYPE type = GetSignalType(typeStr); + result.type = type; + } + + // + // KIND ... + string kindStr = ExtractString( + represent, + "_K(", + ")"); + if (StringLen(kindStr) > 0) + { + // + ENUM_X_SIGNAL_KIND kind = GetSignalKind(kindStr); + result.kind = kind; + } + + // + // PARENT ... + string parentStr = ExtractString( + represent, + "_PR(", + ")"); + if (StringLen(parentStr) > 0) + { + result.parent = (ulong)parentStr; + } + + // + // ENTRY ... + string entryStr = ExtractString( + represent, + "_E(", + ")"); + if (StringLen(entryStr) > 0) + { + result.entry = (double)entryStr; + } + + // + // RISKFREE ... + string riskFreeStr = ExtractString( + represent, + "_RF(", + ")"); + if (StringLen(riskFreeStr) > 0) + { + result.riskFree = (double)riskFreeStr; + } + + // + // RISKFREERATE ... + string riskFreeRateStr = ExtractString( + represent, + "_RR(", + ")"); + if (StringLen(riskFreeRateStr) > 0) + { + result.riskFreeRate = (double)riskFreeRateStr; + } + + // + // VOLUME ... + string volumeStr = ExtractString( + represent, + "_V(", + ")"); + if (StringLen(volumeStr) > 0) + { + result.volume = (double)volumeStr; + } + + // + return result; + } + void FromString( + XSignal &result, // Holds Result + string represent // String Represenation of a Signal + ) + { + // + // Validate Arg ... + if (StringLen(represent) == 0) + { + return; + } + + // + // TICKET ... + string ticketStr = ExtractString( + represent, + "T(", + ")"); + if (StringLen(ticketStr) > 0) + { + result.ticket = (ulong)ticketStr; + } + + // + // TYPE ... + string typeStr = ExtractString( + represent, + "_TY(", + ")"); + if (StringLen(typeStr) > 0) + { + // + ENUM_X_SIGNAL_TYPE type = GetSignalType(typeStr); + result.type = type; + } + + // + // KIND ... + string kindStr = ExtractString( + represent, + "_K(", + ")"); + if (StringLen(kindStr) > 0) + { + // + ENUM_X_SIGNAL_KIND kind = GetSignalKind(kindStr); + result.kind = kind; + } + + // + // PARENT ... + string parentStr = ExtractString( + represent, + "_PR(", + ")"); + if (StringLen(parentStr) > 0) + { + result.parent = (ulong)parentStr; + } + + // + // ENTRY ... + string entryStr = ExtractString( + represent, + "_E(", + ")"); + if (StringLen(entryStr) > 0) + { + result.entry = (double)entryStr; + } + + // + // RISKFREE ... + string riskFreeStr = ExtractString( + represent, + "_RF(", + ")"); + if (StringLen(riskFreeStr) > 0) + { + result.riskFree = (double)riskFreeStr; + } + + // + // RISKFREERATE ... + string riskFreeRateStr = ExtractString( + represent, + "_RR(", + ")"); + if (StringLen(riskFreeRateStr) > 0) + { + result.riskFreeRate = (double)riskFreeRateStr; + } + + // + // VOLUME ... + string volumeStr = ExtractString( + represent, + "_V(", + ")"); + if (StringLen(volumeStr) > 0) + { + result.volume = (double)volumeStr; + } + } + + // + // END Signal Related ... + // + + // + // all protected features ... +protected: + // + // all private features ... +private: + // + // Specified Unique Tag ... + string mTag; + + // + // which Symbol ... + string mSymbol; + + // + // using deviation, it must be in Point ... + int mSlippage; + + // + // using magic number ... + ulong mMagicNumber; + + // + // Specify Max Allowed Trades + int mMaxAllowedTrades; + + // + // Specify Max Allowed Support Trades for each Trade + int mMaxAllowedSupportTrades; + + // + // Minimum Profit of each Trade in Pips + double mMinTradeProfitsInPips; + + // + // Support Trades Price Distance in Pips + double mSupportTradesPriceDistanceInPips; + + // + // Minimum Free Marging for Open Trades + double mMinAllowedFreeMarginForOpenTrades; + + // + // Minimum Balance for Open Trades + double mMinBallanceForOpenTrades; + + // + // using CTrade instance ... + XSCTrade mTrader; + + // + // An Instance Of XCAccount Info for Handling Account Related Actions ... + XCAccountInfo mAccountInfo; + + // + // using PositionInfo instance ... + CPositionInfo mPositionInfo; + + // + // For Manage Deals ... + CDealInfo mDealInfo; + + // + // using OrderInfo instance ... + COrderInfo mPendingInfo; + + // + // using HistoryOrderInfo instance ... + CHistoryOrderInfo mHistoryInfo; + + // + // Count Specific Type Of Positions ... + int CountByType(ENUM_POSITION_TYPE type) + { + // + int result = 0; + + // + int total = PositionsTotal(); + for (int i = 0; i < total; i++) + { + // + if (!mPositionInfo.SelectByIndex(i)) + { + continue; + } + + // + if (mPositionInfo.Symbol() != mSymbol) + { + continue; + } + + // + if (mPositionInfo.PositionType() != type) + { + continue; + } + + // + result++; + } + + // + return result; + } + + // + // Convert Position to Signal by Index ... + XSignal PositionToSignal(int index) + { + // + XSignal result = {}; + + // + if (!mPositionInfo.SelectByIndex(index)) + { + return result; + } + + // + ulong ticket = mPositionInfo.Ticket(); + string signalContent = RetrieveSignalContent(ticket); + if (StringLen(signalContent) > 0) + { + // + // Fill Additional Contents ... + FromString( + result, + signalContent); + } + + // + // Ticket ... + result.ticket = mPositionInfo.Ticket(); + + // + // ID ... + result.id = mPositionInfo.Identifier(); + + // + // Symbol ... + result.symbol = mPositionInfo.Symbol(); + + // + // Type ... + ENUM_POSITION_TYPE pType = (ENUM_POSITION_TYPE)mPositionInfo.PositionType(); + ENUM_X_SIGNAL_TYPE type = pType == POSITION_TYPE_BUY ? X_SIGNAL_LONG : X_SIGNAL_SHORT; + result.type = type; + + // + // MagicNumber ... + result.magicNumber = mPositionInfo.Magic(); + + // + // Entry/Open Price ... + result.entry = mPositionInfo.PriceOpen(); + + // + // Take Profit ... + result.tp = mPositionInfo.TakeProfit(); + + // + // Stop Loss ... + result.sl = mPositionInfo.StopLoss(); + + // + // Profit ... + result.profit = mPositionInfo.Profit(); + + // + // Time ... + result.time = mPositionInfo.Time(); + + // + // Volume ... + result.volume = mPositionInfo.Volume(); + + // + // Comment ... + result.comment = mPositionInfo.Comment(); + + // + return result; + } + + // + // Position To Signal by Ticket ... + XSignal PositionToSignal(ulong ticket) + { + // + XSignal result = {}; + + // + if (!mPositionInfo.SelectByTicket(ticket)) + { + return result; + } + + // + string signalContent = RetrieveSignalContent(ticket); + if (StringLen(signalContent) > 0) + { + // + // Fill Additional Contents ... + FromString( + result, + signalContent); + } + + // + // Ticket ... + result.ticket = mPositionInfo.Ticket(); + + // + // ID ... + result.id = mPositionInfo.Identifier(); + + // + // Symbol ... + result.symbol = mPositionInfo.Symbol(); + + // + // Type ... + ENUM_POSITION_TYPE pType = (ENUM_POSITION_TYPE)mPositionInfo.PositionType(); + ENUM_X_SIGNAL_TYPE type = pType == POSITION_TYPE_BUY ? X_SIGNAL_LONG : X_SIGNAL_SHORT; + result.type = type; + + // + // MagicNumber ... + result.magicNumber = mPositionInfo.Magic(); + + // + // Entry/Open Price ... + result.entry = mPositionInfo.PriceOpen(); + + // + // Take Profit ... + result.tp = mPositionInfo.TakeProfit(); + + // + // Stop Loss ... + result.sl = mPositionInfo.StopLoss(); + + // + // Profit ... + result.profit = mPositionInfo.Profit(); + + // + // Time ... + result.time = mPositionInfo.Time(); + + // + // Volume ... + result.volume = mPositionInfo.Volume(); + + // + // Comment ... + result.comment = mPositionInfo.Comment(); + + // + return result; + } + + // + // Convert Position to Signal by Index ... + XSignal OrderToSignal(int index) + { + // + XSignal result = {}; + + // + if (!mHistoryInfo.SelectByIndex(index)) + { + return result; + } + + // + // ID ... + result.id = mHistoryInfo.PositionId(); + + // + // Symbol ... + result.symbol = mHistoryInfo.Symbol(); + + // + // Type ... + ENUM_ORDER_TYPE pType = (ENUM_ORDER_TYPE)mHistoryInfo.OrderType(); + ENUM_X_SIGNAL_TYPE type = X_SIGNAL_UNKNOWN; + switch (pType) + { + // + case ORDER_TYPE_BUY: + case ORDER_TYPE_BUY_LIMIT: + case ORDER_TYPE_BUY_STOP: + case ORDER_TYPE_BUY_STOP_LIMIT: + type = X_SIGNAL_LONG; + break; + + // + case ORDER_TYPE_SELL: + case ORDER_TYPE_SELL_LIMIT: + case ORDER_TYPE_SELL_STOP: + case ORDER_TYPE_SELL_STOP_LIMIT: + type = X_SIGNAL_SHORT; + break; + + // + // Default ... + default: + type = X_SIGNAL_UNKNOWN; + break; + } + result.type = type; + + // + // MagicNumber ... + result.magicNumber = mHistoryInfo.Magic(); + + // + // Ticket ... + result.ticket = mHistoryInfo.Ticket(); + + // + // Entry/Open Price ... + result.entry = mHistoryInfo.PriceOpen(); + + // + // Take Profit ... + result.tp = mHistoryInfo.TakeProfit(); + + // + // Stop Loss ... + result.sl = mHistoryInfo.StopLoss(); + + // + // Profit ... + // TODO Calculate it ... + // result.profit = mHistoryInfo.Profit(); + + // // + // // Time ... + // result.time = mHistoryInfo.Time(); + + // // + // // Volume ... + // result.volume = mHistoryInfo.Volume(); + + // + // Comment ... + result.comment = mHistoryInfo.Comment(); + + // + return result; + } + + // + // Draw a Signal on Screen ... + void DrawSignalEvent( + XSignal &signal, // Specify Draw which Signal on Screen + color longColor = clrAqua, // Long Signal Object Color + color shortColor = clrFuchsia, // Short Signal Object Color + int chartId = -1, // Specify Chart ID + int subWindow = -1 // Specify SubWindow ID + ) + { + // + // Validate Args ... + if ( + signal.ticket <= 0 || + !IsValid(signal, mMagicNumber) || + signal.type == X_SIGNAL_UNKNOWN) + { + return; + } + + // + // Normalize Chart and SubWindow ID ... + if (chartId == -1) + { + chartId = 0; + } + if (subWindow == -1) + { + subWindow = 0; + } + + // + bool isLong = signal.type == X_SIGNAL_LONG; + + // + // Simply Draw an Arrow on Chart for Representing Signal Info ... + string name = GetSignalObjectName(signal); + string content = ToString(signal); + if (StringLen(content) == 0) + { + return; + } + + // + color signalColor = isLong ? longColor : shortColor; + + // + // Create an Event On Chart ... + bool isCreated = EventCreate( + chartId, + name, + subWindow, + content, + signal.time, + signalColor); + if (isCreated) + { + // + DrawSignalShape( + signal, + longColor, + shortColor); + } + } + + // + // Filter Trades Buffer ... + void FilterSignals( + string query, // Search String + XSignal &source[], // Source Buffer to Filter + XSignal &result[] // Holds Result + ) + { + // + // Free Buffer ... + CleanBuffer(result); + + // + int sourceCount = ArraySize(source); + + // + // Check Conditions and Validate Args ... + if ( + sourceCount == 0 || + StringLen(query) == 0) + { + return; + } + + // + // Loop Through Source ... + for (int i = 0; i < sourceCount; i++) + { + // + // Retrieve Indexed Item ... + XSignal trade = source[i]; + + // + // Check Query Exists or not ... + int pos = StringFind( + trade.comment, + query); + + // + // Continue if nothing found ... + if (pos <= -1) + { + continue; + } + + // + // Resize the result array ... + ArrayResize( + result, + ArraySize(result) + 1); + result[ArraySize(result) - 1] = trade; + } + } + + // + // Get all Positions based on Position Type ... + void GetAllPositionsByType(ENUM_POSITION_TYPE type, XSignal &result[]) + { + // + int existsTotal = CountByType(type); + + // + CleanBuffer(result); + ArrayResize(result, existsTotal); + + // + int filledIndex = 0; + int total = PositionsTotal(); + for (int i = 0; i < total; i++) + { + // + if (!mPositionInfo.SelectByIndex(i)) + { + continue; + } + + // + if (mPositionInfo.Magic() != mMagicNumber) + { + continue; + } + + // + if (mPositionInfo.Symbol() != mSymbol) + { + continue; + } + + // + if (mPositionInfo.PositionType() != type) + { + continue; + } + + // + result[filledIndex] = PositionToSignal(i); + filledIndex++; + } + } + + // + // Retrieve Signal Specified Object Text ... + string RetrieveSignalContent( + ulong ticket, // Specify Position Ticket + int chartId = -1, // Specify Chart ID + int subWindow = -1 // Specify SubWindow ID + ) + { + // + string result = ""; + + // + // Validate Arg ... + if (ticket <= 0) + { + return result; + } + + // + string signalObjectName = GetSignalObjectName(ticket); + if (StringLen(signalObjectName) == 0) + { + return result; + } + + // + // Normalize Chart and SubWindow ID ... + if (chartId == -1) + { + chartId = 0; + } + if (subWindow == -1) + { + subWindow = 0; + } + + // + // Search For Signal Object Name ... + int objectIndex = ObjectFind( + chartId, + signalObjectName); + if (objectIndex < 0) + { + return result; + } + + // + // Loop Through Objects ... + int count = ObjectsTotal( + chartId, + subWindow); + for (int i = count - 1; i >= 0; i--) + { + // + // Retrieve Object Name ... + string objectName = ObjectName(chartId, i, subWindow); + + // + // Find Signal Ticket Position in Object Name ... + int stPos = StringFind( + objectName, + signalObjectName); + if (stPos < 0) + { + continue; + } + + // + // Retrieve Object Type and Check it Event ... + int oType = (int)ObjectGetInteger(chartId, objectName, OBJPROP_TYPE); + if (oType != OBJ_EVENT) { + continue; + } + + // + // Retrieve Object Text as String Representation OF Signal ... + result = ObjectGetString(chartId, objectName, OBJPROP_TEXT); + break; + } + + // + return result; + } + string RetrieveSignalContent( + XSignal &signal, // Specify Signal + int chartId = -1, // Specify Chart ID + int subWindow = -1 // Specify SubWindow ID + ) + { + // + string result = ""; + + // + result = RetrieveSignalContent( + signal.ticket, + chartId, + subWindow); + + // + return result; + } + + // + // Remove Signal Object from Chart ... + bool RemoveSignal( + ulong ticket, // Specify Position Ticket + int chartId = -1 // Specify Chart ID + ) + { + // + bool result = false; + + // + // Validate Arg ... + if (ticket <= 0) + { + return result; + } + + // + // Normalize Chart Id ... + if (chartId <= 0) + { + chartId = 0; + } + + // + // Generate Signal Object Name ... + string signalObjectName = GetSignalObjectName(ticket); + + // + // Remove Object from Chart ... + result = ObjectDelete(chartId, signalObjectName); + + // + return result; + } + bool RemoveSignal( + XSignal &signal, // Specify Signal + int chartId = -1 // Specify Chart ID + ) + { + // + bool result = false; + + // + result = RemoveSignal( + signal.ticket, + chartId); + + // + return result; + } + + // + // Generate Comments for Specific Signal ... + string GetSignalComment( + ENUM_X_SIGNAL_KIND kind, // Specify Kind + ENUM_X_SIGNAL_TYPE type, // Specify Kind Signal Type + ulong parentTicket, // Parent Signal Ticket + double volume, // Signal Volume + double riskFree, // Risk Free Price + double riskFreeRate // Risk Free Volume Multiplier + ) + { + // + string result = ""; + + // + string kindStr = GetSignalKind(kind); + string typeStr = GetSignalType(type); + if ( + volume <= 0 || + StringLen(kindStr) == 0 || + StringLen(typeStr) == 0 || + (parentTicket <= 0 && kind == X_KIND_SUPPORT)) + { + return result; + } + + // + // Normalize Data ... + // + if (riskFreeRate < 0) + { + riskFreeRate = 0; + } + else if (riskFreeRate > 1) + { + riskFreeRate = 0.75; + } + + // + volume = NormalizeVolume(volume, mSymbol); + riskFree = NormalizePrice(riskFree, mSymbol); + + // + if (riskFree > 0 && riskFreeRate == 0) + { + riskFreeRate = 0.75; + } + else if (riskFree <= 0 && riskFreeRate > 0) + { + riskFreeRate = 0; + } + + // + string kindTitle = kind == X_KIND_TRADE ? kindStr : kindStr + "_For_" + (string)parentTicket; + result = mTag + "_" + typeStr + "_" + kindTitle; + + // + return result; + } + string GetSignalComment( + XSignal &signal // Specify Signal + ) + { + // + string result = GetSignalComment( + signal.kind, + signal.type, + signal.parent, + signal.volume, + signal.riskFree, + signal.riskFreeRate + // + ); + + // + return result; + } + + // + // Generate TP Comment For Closing Signal ... + string GetSignalClosedOnTPComment( + XSignal &signal // Model Signal to Use + ) + { + // + string result = ""; + + // + if (signal.ticket <= 0 || + !IsValid(signal, mMagicNumber)) + { + return result; + } + + // + double exitPrice = GetExit(signal.type); + string prefix = GetSignalObjectName(signal); + + // + // "_E(" + (string)signal.entry + ")" ... + result = prefix + "_TP(" + (string)exitPrice + ")"; + + // + return result; + } + + // + // Generate SL Comment For Closing Signal ... + string GetSignalClosedOnSLComment( + XSignal &signal // Model Signal to Use + ) + { + // + string result = ""; + + // + if (signal.ticket <= 0 || + !IsValid(signal, mMagicNumber)) + { + return result; + } + + // + double exitPrice = GetExit(signal.type); + string prefix = GetSignalObjectName(signal); + + // + // "_E(" + (string)signal.entry + ")" ... + result = prefix + "_SL(" + (string)exitPrice + ")"; + + // + return result; + } + + // + // Generate Comment For Force Closing Signal ... + string GetSignalForceClosedComment( + XSignal &signal // Model Signal to Use + ) + { + // + string result = ""; + + // + if (signal.ticket <= 0 || + !IsValid(signal, mMagicNumber)) + { + return result; + } + + // + double exitPrice = GetExit(signal.type); + string prefix = GetSignalObjectName(signal); + + // + // "_E(" + (string)signal.entry + ")" ... + result = "F_" + prefix + "_P(" + (string)exitPrice + ")"; + + // + return result; + } + + // + // Generate Comment For In DrawDown and In Profit Closing Signal ... + string GetSignalInDistanceClosedComment( + XSignal &signal // Model Signal to Use + ) + { + // + string result = ""; + + // + if (signal.ticket <= 0 || + !IsValid(signal, mMagicNumber)) + { + return result; + } + + // + double exitPrice = GetExit(signal.type); + string prefix = GetSignalObjectName(signal); + string distanceStr = signal.profit > 0 ? "InP" : "InDD"; + + // + // "_E(" + (string)signal.entry + ") ... + // "_P(" + (string)exitPrice + ")" ... + result = distanceStr + "_" + prefix + "_D(" + (string)signal.profit + ")"; + + // + return result; + } + + // + // Generate Comment For Long Time Closing Signal ... + string GetSignalLongTimeClosedComment( + XSignal &signal // Model Signal to Use + ) + { + // + string result = ""; + + // + if (signal.ticket <= 0 || + !IsValid(signal, mMagicNumber)) + { + return result; + } + + // + double exitPrice = GetExit(signal.type); + string prefix = GetSignalObjectName(signal); + + // + int signalAge = GetSignalAge(signal); + + // + // "_E(" + (string)signal.entry + ")" ... + // "_P(" + (string)exitPrice + ")" ... + result = "LT_" + prefix + "_A(" + (string)signalAge + ")" + "_D(" + (string)signal.profit + ")"; + + // + return result; + } + + // + // Check Number Of Trades is Valid ... + bool CanOpenNewTrade( + ENUM_X_SIGNAL_TYPE type, // Specify Type of Positions + ENUM_X_SIGNAL_KIND kind // Specify Kind of Positions + ) + { + // + bool result = false; + + // + int tradesCount = CountByKind( + type, + kind); + + // + result = tradesCount <= 0; + if (!result) + { + return result; + } + + // + bool isTradeKind = kind == X_KIND_TRADE; + + // + // Check based on Trade Kind ... + result = + // + isTradeKind + // + ? + // + tradesCount < mMaxAllowedTrades + // + : + // + tradesCount < mMaxAllowedSupportTrades + // + ; + + // + return result; + } + + // + // Check Account Has Minimum Balance For Trade ... + bool IsAccountBalanceReadyForTrade() + { + // + bool result = false; + + // + result = mAccountInfo.GetBalance() >= mMinBallanceForOpenTrades; + + // + return result; + } + + // + // Check Free Margin Has Enough For Trade ... + bool IsFreeMarginReadyForTrade() + { + // + bool result = false; + + // + double freeMargin = mAccountInfo.GetFreeMargin(); + + // + result = freeMargin >= mMinAllowedFreeMarginForOpenTrades; + + // + return result; + } +}; +// +// END Global Definitions: Variables, Properties and etc ... +// diff --git a/BKPS/OLD/EURUSD-5M-V0.1/MQ5/Libraries/x-saherelm.common.lib.mq5 b/BKPS/OLD/EURUSD-5M-V0.1/MQ5/Libraries/x-saherelm.common.lib.mq5 new file mode 100644 index 0000000..e94b782 --- /dev/null +++ b/BKPS/OLD/EURUSD-5M-V0.1/MQ5/Libraries/x-saherelm.common.lib.mq5 @@ -0,0 +1,3584 @@ +/////////////////////////////////////////////////////// +// +// 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; +} + +// +// 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_X_SIGNAL_TYPE type = X_SIGNAL_UNKNOWN // Get entry price for Which direction trade ... +) +{ + // + double result = 0; + + // + // Validate Arg ... + if (type == X_SIGNAL_UNKNOWN) + { + return result; + } + + // + bool isLong = type == X_SIGNAL_LONG; + result = isLong ? GetAsk() : GetBid(); + result = NormalizePrice(result); + + // + return result; +} +double GetEntry( + string symbol, // Specified Symbol + ENUM_X_SIGNAL_TYPE type = X_SIGNAL_UNKNOWN // Get entry price for Which direction trade ... +) +{ + // + double result = 0; + + // + // Validate Arg ... + if (type == X_SIGNAL_UNKNOWN) + { + return result; + } + + // + bool isLong = type == X_SIGNAL_LONG; + result = isLong ? GetAsk(symbol) : GetBid(symbol); + result = NormalizePrice(result, symbol); + + // + return result; +} + +// +// Get Signal Exit ... +double GetExit( + ENUM_X_SIGNAL_TYPE type = X_SIGNAL_UNKNOWN // Get entry price for Which direction trade ... +) +{ + // + double result = 0; + + // + // Validate Arg ... + if (type == X_SIGNAL_UNKNOWN) + { + return result; + } + + // + bool isLong = type == X_SIGNAL_LONG; + result = isLong ? GetBid() : GetAsk(); + result = NormalizePrice(result); + + // + return result; +} +double GetExit( + string symbol, // Specified Symbol + ENUM_X_SIGNAL_TYPE type = X_SIGNAL_UNKNOWN // Get entry price for Which direction trade ... +) +{ + // + double result = 0; + + // + // Validate Arg ... + if (type == X_SIGNAL_UNKNOWN) + { + return result; + } + + // + bool isLong = type == X_SIGNAL_LONG; + result = isLong ? GetBid(symbol) : GetAsk(symbol); + result = NormalizePrice(result, symbol); + + // + 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; +} + +// +// 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; +} + +// +// 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; +} + +// +// 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; +} + +// +// 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 HasStrongBody(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 = HasStrongBody(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 = HasStrongBody(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 = HasStrongBody(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; +} + +// +// 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; +} + +// +// 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; +} +// +// END Provided Functions ... +// + +// +// Find Farest Time Frame ... +ENUM_TIMEFRAMES GetFarestTimeFrame() +{ + // + ENUM_TIMEFRAMES result = PERIOD_MN1; + + // + switch (_Period) + { + // + // M1-M30 ... + 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_D1; + break; + + // + // H1-H12 ... + case PERIOD_H1: + case PERIOD_H2: + case PERIOD_H3: + case PERIOD_H4: + case PERIOD_H6: + case PERIOD_H8: + case PERIOD_H12: + result = PERIOD_W1; + break; + + // + // D!, W1 ... + case PERIOD_D1: + case PERIOD_W1: + result = PERIOD_MN1; + break; + + // + // Otherwise ... + default: + result = PERIOD_MN1; + } + + // + return result; +} + +// +// Find Medium Time Frame ... +ENUM_TIMEFRAMES GetMediumTimeFrame() +{ + // + ENUM_TIMEFRAMES result = PERIOD_D1; + + // + switch (_Period) + { + // + // M1-M30 ... + 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; + + // + // H1-H12 ... + case PERIOD_H1: + case PERIOD_H2: + case PERIOD_H3: + case PERIOD_H4: + case PERIOD_H6: + case PERIOD_H8: + case PERIOD_H12: + result = PERIOD_D1; + break; + + // + // D!, W1 ... + case PERIOD_D1: + result = PERIOD_W1; + break; + + // + // Otherwise ... + default: + result = PERIOD_MN1; + } + + // + return result; +} + +// +// Find Smallest Time Frame ... +ENUM_TIMEFRAMES GetSmallestTimeFrame() +{ + // + ENUM_TIMEFRAMES result = PERIOD_M5; + + // + switch (_Period) + { + // + // M1-M5 ... + case PERIOD_M1: + case PERIOD_M2: + case PERIOD_M3: + case PERIOD_M4: + case PERIOD_M5: + result = _Period; + break; + + // + // M6-M30 ... + case PERIOD_M6: + case PERIOD_M10: + case PERIOD_M12: + case PERIOD_M15: + case PERIOD_M20: + case PERIOD_M30: + result = PERIOD_M5; + break; + + // + // H1-H12 ... + case PERIOD_H1: + case PERIOD_H2: + case PERIOD_H3: + case PERIOD_H4: + case PERIOD_H6: + case PERIOD_H8: + case PERIOD_H12: + result = PERIOD_H1; + break; + + // + // D! ... + case PERIOD_D1: + result = PERIOD_H2; + break; + + // + // Otherwise ... + default: + result = PERIOD_H4; + } + + // + 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; +} + +// +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; +} + +// +// Validate Struct ... +bool IsValid(XSignal &model, ulong magicNumber) +{ + // + bool result = false; + + // + // Validate Signal Type ... + result = model.type != X_SIGNAL_UNKNOWN; + if (!result) + { + return result; + } + + // + // Check Symbol ... + result = StringLen(model.symbol) == 0 ? true : model.symbol == _Symbol; + if (!result) + { + return result; + } + + // + // Check magic number ... + result = model.magicNumber <= 0 ? true : model.magicNumber == magicNumber; + if (!result) + { + return result; + } + + // + // Check Entry ... + result = model.entry > 0; + if (!result) + { + return result; + } + + // + // Check SL ... + result = model.sl == 0 ? true : model.type == X_SIGNAL_LONG ? model.sl < model.entry + : model.sl > model.entry; + if (!result) + { + return result; + } + + // + // Check TP ... + result = model.tp == 0 ? true : model.type == X_SIGNAL_LONG ? model.tp > model.entry + : model.tp < model.entry; + if (!result) + { + return result; + } + + // + // Check Volume ... + result = model.volume > 0; + if (!result) + { + return result; + } + + // + // Check Time ... + result = model.time > 0; + if (!result) + { + return result; + } + + // + return result; +} +bool IsValid(XTPSL &model) +{ + // + bool result = false; + + // + result = model.entry > 0 && model.type != X_SIGNAL_UNKNOWN; + + // + return result; +} + +// +void CleanBuffer(int &buffer[]) +{ + // + ArrayFree(buffer); + ArrayResize(buffer, 0); +} +void CleanBuffer(double &buffer[]) +{ + // + ArrayFree(buffer); + ArrayResize(buffer, 0); +} +void CleanBuffer(XSignal &buffer[]) +{ + // + ArrayFree(buffer); + ArrayResize(buffer, 0); +} + +// +void Add( + int item, // item want to add + int &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( + XSignal &item, // item want to add + XSignal &buffer[] // Destination buffer +) +{ + // + ArrayResize( + buffer, + ArraySize(buffer) + 1); + + // + buffer[ArraySize(buffer) - 1] = item; +} + +// +// Check a Signal is Long or not ... +bool IsLong(ENUM_X_SIGNAL_TYPE type) +{ + return type == X_SIGNAL_LONG; +} +bool IsLong(XSignal &signal) +{ + // + bool result = IsLong(signal.type); + + // + return result; +} + +// +// Check a Signal is Short or not ... +bool IsShort(ENUM_X_SIGNAL_TYPE type) +{ + return type == X_SIGNAL_SHORT; +} +bool IsShort(XSignal &signal) +{ + // + bool result = IsShort(signal.type); + + // + return result; +} + +// +// Retrieve a Signal Type String Value ... +string GetSignalType(ENUM_X_SIGNAL_TYPE type) +{ + // + string result = ""; + + // + if (type == X_SIGNAL_UNKNOWN) + { + return result; + } + + // + result = type == X_SIGNAL_LONG ? "Long" : "Short"; + + // + return result; +} +string GetSignalType(XSignal &signal) +{ + // + string result = ""; + + // + result = GetSignalType(signal.type); + + // + return result; +} +ENUM_X_SIGNAL_TYPE GetSignalType(string typeStr) +{ + // + ENUM_X_SIGNAL_TYPE result = X_SIGNAL_UNKNOWN; + + // + if (typeStr == GetSignalType(X_SIGNAL_LONG)) + { + result = X_SIGNAL_LONG; + } + else if (typeStr == GetSignalType(X_SIGNAL_SHORT)) + { + result = X_SIGNAL_SHORT; + } + + // + return result; +} + +// +// Retrieve a Signal Kind String Value ... +string GetSignalKind(ENUM_X_SIGNAL_KIND kind) +{ + // + string result = ""; + + // + if (kind != X_KIND_TRADE && kind != X_KIND_SUPPORT) + { + return result; + } + + // + result = kind == X_KIND_TRADE ? "Trade" : "Support"; + + // + return result; +} +string GetSignalKind(XSignal &signal) +{ + // + string result = ""; + + // + result = GetSignalKind(signal.kind); + + // + return result; +} +ENUM_X_SIGNAL_KIND GetSignalKind(string kindStr) +{ + // + ENUM_X_SIGNAL_KIND result = X_KIND_TRADE; + + // + if (kindStr == GetSignalKind(X_KIND_TRADE)) + { + result = X_KIND_TRADE; + } + else if (kindStr == GetSignalKind(X_KIND_SUPPORT)) + { + result = X_KIND_SUPPORT; + } + + // + return result; +} + +// +// Retrieve Signal Execution String ... +string GetSignalExecutionError(int error) +{ + // + string result = ""; + + // + switch (error) + { + // + case X_INVALID_SIGNAL_ERROR: + result = "Invalid Signal ..."; + break; + + // + case X_XTRADER_NOT_ENOUGH_BALANCE_ERROR: + result = "Not Enough Balance for Trade ..."; + break; + + // + case X_XTRADER_NOT_ENOUGH_MARIGIN_ERROR: + result = "Not Enough Marigin For Trade ..."; + break; + + // + case X_XTRADER_MAX_ALLOWED_TRADE_KIND_REACHED_ERROR: + result = "Max Allowed Trade Reached ..."; + break; + + // + case X_XTRADER_MAX_ALLOWED_SUPPORT_KIND_REACHED_ERROR: + result = "Max Allowed Support Trade Reached ..."; + break; + + // + case X_UNKNOWN_ERROR: + default: + result = "Unknown Issue ..."; + break; + } + + // + return 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 normalization +) +{ + // + double result = volume; + + // + // Normalize Volume ... + result = NormalizeDouble(result, 2); + + // + 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; +} +double NormalizeVolume( + double volume, // desired volume to normalize + string symbol // Specified Symbol for Normalization +) +{ + // + double result = volume; + + // + // Normalize Volume ... + result = NormalizeDouble(result, 2); + + // + 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 +) +{ + // + double result = 0; + + // + result = NormalizeDouble(price, _Digits); + + // + return result; +} +double NormalizePrice( + double price, // desired Price for normalization + string symbol // Specified Symbol for Normalization +) +{ + // + double result = 0; + + // + int digits = GetDigits(symbol); + result = NormalizeDouble(price, digits); + + // + return result; +} + +// +// START Error Descriptions ... +// + +// +// 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/BKPS/OLD/EURUSD-5M-V0.1/MQ5/Libraries/x-saherelm.draw.lib.mq5 b/BKPS/OLD/EURUSD-5M-V0.1/MQ5/Libraries/x-saherelm.draw.lib.mq5 new file mode 100644 index 0000000..e904cd6 --- /dev/null +++ b/BKPS/OLD/EURUSD-5M-V0.1/MQ5/Libraries/x-saherelm.draw.lib.mq5 @@ -0,0 +1,2220 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 Draw Library +// -------------------------------------- +// Name: XDraw +// Description: provides Draw 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 ... +// +// +// END Inputs ... +// + +// +// Include Logger Library ... +#include "x-saherelm.log.lib.mq5" + +// +// START Global Definitions: Variables, Properties and etc ... +// +string drawPrefix = "X-OBJ"; +// +// END Global Definitions: Variables, Properties and etc ... +// + +// +// START Provided Functions ... +// +// +// DeInitial Library if required ... +void OnDeinitDrawLibrary() +{ + RemoveDraws(); +} + +// +void DrawSignalShape( + XSignal &signal, // Specify Signal to Draw + color longColor = clrAqua, // Long Signals Color + color shortColor = clrFuchsia, // Short Signal Color + color entryColor = clrGold // Signal Entry Price Color +) { + // + // Draw Signal Info : + // - Draw Entry Price Line; + // - Draw SL; + // - Draw TP; + // - Risk Free; + + // + bool isLong = signal.type == X_SIGNAL_LONG; + + // + color tpColor = longColor; + color slColor = shortColor; + + // + string name = "T(" + (string) signal.ticket + ")" + "_" + "TY(" + EnumToString(signal.type) + ")" + "_" + "KI(" + EnumToString(signal.kind) + ")"; + string tpName = "TP_" + name; + string slName = "SL_" + name; + string riskFreeName = "RF_" + name; + string entryName = "Entry_" + name; + + // + int signalBarIndex = iBarShift( + signal.symbol, + _Period, + signal.time + ); + + // + datetime time1 = iTime( + signal.symbol, + _Period, + signalBarIndex + 1 + ); + datetime time2 = iTime( + signal.symbol, + _Period, + signalBarIndex - 1 + ); + + // + // Entry ... + bool isTrendLineDrawn = DrawTrendLine( + 0, + entryName, + 0, + time1, + signal.entry, + time2, + signal.entry, + entryColor + ); + + // + // TP ... + bool isTPDrawn = false; + if (signal.tp > 0) { + // + isTPDrawn = DrawTrendLine( + 0, + tpName, + 0, + time1, + signal.tp, + time2, + signal.tp, + tpColor, + STYLE_SOLID, + 1, + false, + true + ); + } + + // + // RISKFREE ... + bool isRFDrawn = false; + if (signal.riskFree > 0) { + // + isRFDrawn = DrawTrendLine( + 0, + riskFreeName, + 0, + time1, + signal.riskFree, + time2, + signal.riskFree, + tpColor, + STYLE_DOT, + 1, + false, + true + ); + } + + // + // SL ... + bool isSLDrawn = false; + if (signal.sl > 0) { + // + isSLDrawn = DrawTrendLine( + 0, + slName, + 0, + time1, + signal.sl, + time2, + signal.sl, + slColor, + STYLE_SOLID, + 1, + false, + true + ); + } +} + +// +// remove drawn objects ... +void RemoveDraws( + string tag = NULL, + int chartId = -1, + int subWindow = -1) +{ + // + // Normalize Args ... + // + if (tag == NULL) + { + tag = drawPrefix; + } + + // + 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); + if (StringFind(on, tag) == 0) + { + ObjectDelete(chartId, on); + } + } + + // + // Redraw Chart ... + ChartRedraw(); +} +// +// 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 sub_window = 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, sub_window, 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 back_clr = 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, back_clr); + + // + // 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 ... +// + +// +// END Regular Draws ... +// + +// +// START Chart Style Drawers ... +// +// +// Apply Styles On Chart ... +void ApplyChartStyle( + int chartId = -1, // chart's ID + ENUM_CHART_MODE mode = CHART_CANDLES, // chart's mode + bool showBidLine = true, // show bid line + bool showAskLine = true, // show ask line + bool showGrid = false, // show grids on chart + bool showVolumes = false, // show volumes + bool showTradeLevels = true, // Displaying trade levels in the chart (levels of open positions, Stop Loss, Take Profit and pending orders) + bool autoScroll = true, // chart autoscroll + bool quickNavigation = true, // chart quick navigation state + color foreGroundColor = clrWhite, // chart's foreground color + color backGroundColor = clrBlack, // chart's background color + color upColor = clrGreen, // Up Color + color downColor = clrRed, // Down Color + color bullishColor = clrGreen, // Bullish color + color bearishColor = clrRed, // Bearish color + color gridColor = clrGray, // grid color + color bidLineColor = clrGray, // bid line color + color askLineColor = clrRed, // ask line color + color lineColor = clrLime, // line mode and doji candlestick color + color stopColor = clrGold, // Color of stop order levels (Stop Loss and Take Profit) + color volumesColor = clrGreen // volumes color +) +{ + // + // Validate Args ... + if (chartId == -1) + { + chartId = 0; + } + + // + ChartSetInteger(chartId, CHART_MODE, mode); + ChartSetInteger(chartId, CHART_SHOW_BID_LINE, showBidLine); + ChartSetInteger(chartId, CHART_SHOW_ASK_LINE, showAskLine); + ChartSetInteger(chartId, CHART_SHOW_GRID, showGrid); + ChartSetInteger(chartId, CHART_SHOW_VOLUMES, showVolumes); + ChartSetInteger(chartId, CHART_SHOW_TRADE_LEVELS, showTradeLevels); + ChartSetInteger(chartId, CHART_AUTOSCROLL, autoScroll); + ChartSetInteger(chartId, CHART_QUICK_NAVIGATION, quickNavigation); + ChartSetInteger(chartId, CHART_COLOR_FOREGROUND, foreGroundColor); + ChartSetInteger(chartId, CHART_COLOR_BACKGROUND, backGroundColor); + ChartSetInteger(chartId, CHART_COLOR_CHART_UP, upColor); + ChartSetInteger(chartId, CHART_COLOR_CHART_DOWN, downColor); + ChartSetInteger(chartId, CHART_COLOR_CANDLE_BULL, bullishColor); + ChartSetInteger(chartId, CHART_COLOR_CANDLE_BEAR, bearishColor); + ChartSetInteger(chartId, CHART_COLOR_GRID, gridColor); + ChartSetInteger(chartId, CHART_COLOR_BID, bidLineColor); + ChartSetInteger(chartId, CHART_COLOR_ASK, askLineColor); + ChartSetInteger(chartId, CHART_COLOR_STOP_LEVEL, stopColor); + ChartSetInteger(chartId, CHART_COLOR_CHART_LINE, lineColor); + ChartSetInteger(chartId, CHART_COLOR_VOLUME, volumesColor); +} +// +// END Chart Style Drawers ... +// \ No newline at end of file diff --git a/BKPS/OLD/EURUSD-5M-V0.1/MQ5/Libraries/x-saherelm.http.lib.mq5 b/BKPS/OLD/EURUSD-5M-V0.1/MQ5/Libraries/x-saherelm.http.lib.mq5 new file mode 100644 index 0000000..97f7ac0 --- /dev/null +++ b/BKPS/OLD/EURUSD-5M-V0.1/MQ5/Libraries/x-saherelm.http.lib.mq5 @@ -0,0 +1,177 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 Http Library +// ------------------------------------------ +// Name: XHttp +// Description: provide http communication +// 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 Model Definition ... +// +enum X_HTTP_METHOD +{ + X_HTTP_GET, + X_HTTP_POST +}; +// +// END Model Definition ... +// + +// +// START Inputs ... +// +// +// END Inputs ... +// + +// +// START Global Definitions: Variables, Properties and etc ... +// +// +// END Global Definitions: Variables, Properties and etc ... +// + +// +// START Provided Functions ... +// +// +// Initial Library if required ... +bool OnInInitHttpLibrary() +{ + return false; +} + +// +// DeInitial Library if required ... +void OnDeinitHttpLibrary() +{ +} + +// +// 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; +} + +// +// 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; + } + + // + result = WebRequest( + strMethod, + url, + headers, + timeout, + payload, + response, + responseHeaders + ); + + // + 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; +} +// +// END Provided Functions ... +// diff --git a/BKPS/OLD/EURUSD-5M-V0.1/MQ5/Libraries/x-saherelm.log.lib.mq5 b/BKPS/OLD/EURUSD-5M-V0.1/MQ5/Libraries/x-saherelm.log.lib.mq5 new file mode 100644 index 0000000..e74039e --- /dev/null +++ b/BKPS/OLD/EURUSD-5M-V0.1/MQ5/Libraries/x-saherelm.log.lib.mq5 @@ -0,0 +1,161 @@ +/////////////////////////////////////////////////////// +// +// 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 +// +// 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); +} + +// +// 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); +} + +// +// Convert a Signal to String Message ... +string SignalToString(XSignal &signal) +{ + // + string result = ""; + + // + result += (signal.type == X_SIGNAL_LONG ? "Buy" : "Sell") + " Signal provided on (" + signal.symbol + " _ " + EnumToString(_Period) + ") by this comment: " + signal.comment; + + // + return result; +} + +// +// Convert an Executed Signal to String Message ... +string ExecutedSignalToString(XSignal &signal) +{ + // + string result = ""; + + // + result += (signal.type == X_SIGNAL_LONG ? "Buy" : "Sell") + " Signal Executed provided on (" + signal.symbol + " _ " + EnumToString(_Period) + ") by this comment: " + signal.comment; + + // + return result; +} + +// +// Logging Signal ... +void LogSignal(XSignal &signal) +{ + // + string message = SignalToString(signal); + + // + LogMessage(message); +} + +// +// Log Signal Execution ... +void LogExecutedSignal(XSignal &signal) +{ + // + string message = ExecutedSignalToString(signal); + + // + LogMessage(message); +} +// +// END Provided Functions ... +// diff --git a/BKPS/OLD/EURUSD-5M-V0.1/MQ5/Libraries/x-saherelm.models.lib.mq5 b/BKPS/OLD/EURUSD-5M-V0.1/MQ5/Libraries/x-saherelm.models.lib.mq5 new file mode 100644 index 0000000..52e4050 --- /dev/null +++ b/BKPS/OLD/EURUSD-5M-V0.1/MQ5/Libraries/x-saherelm.models.lib.mq5 @@ -0,0 +1,187 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 Models Library +// --------------------------------------- +// Name: XModels +// Description: provides all required models ... +// +// +// 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 ... +// + +// +// START Global Definitions: Variables, Properties and etc ... +// +// +// END Global Definitions: Variables, Properties and etc ... +// + +// +// START Provided Functions ... +// + +// +// START Model Definitions ... +// +// +// OHCL Candel Model ... +enum ENUM_X_PRICE +{ + X_PRICE_HIGH, + X_PRICE_OPEN, + X_PRICE_CLOSE, + X_PRICE_LOW +}; + +// +// Describe an Specific Candle ... +struct XOHCL +{ + double high; + double open; + double close; + double low; +}; + +// +// Swing Types Enum ... +enum ENUM_X_SWING_TYPE +{ + X_NO_SWING = 0, + X_SWING_HIGH = 1, + X_SWING_LOW = -1, +}; + +// +// XTrader Execution Signal Result ... +enum ENUM_EXECUTION_SIGNAL_RESULT +{ + // + X_INVALID_SIGNAL_ERROR, + X_XTRADER_NOT_ENOUGH_BALANCE_ERROR, + X_XTRADER_NOT_ENOUGH_MARIGIN_ERROR, + X_XTRADER_MAX_ALLOWED_TRADE_KIND_REACHED_ERROR, + X_XTRADER_MAX_ALLOWED_SUPPORT_KIND_REACHED_ERROR, + // + X_TRADER_SUPPORT_DISTANCE_NOT_HAPPENS_ERROR, + // + X_UNKNOWN_ERROR, + X_SUCCEED_EXECUTION +}; + +// +// Signal Types ... +enum ENUM_X_SIGNAL_TYPE +{ + X_SIGNAL_LONG, + X_SIGNAL_SHORT, + X_SIGNAL_UNKNOWN, +}; + +// +// Represent a Signal issued for Trade or Support a Trade ... +enum ENUM_X_SIGNAL_KIND +{ + X_KIND_TRADE, + X_KIND_SUPPORT +}; + +// +// Signal Structure ... +struct XSignal +{ + // + // Identifier ... + ulong id; + + // + // Which Symbol used for Signal ... + string symbol; + + // + // Which Type of operations ... + ENUM_X_SIGNAL_TYPE type; + + // + // Signal Kind ... + ENUM_X_SIGNAL_KIND kind; + + // + // Parent Ticket ... + ulong parent; + + // + // Magic Number ... + ulong magicNumber; + + // + // Ticket ... + ulong ticket; + + // + // Entry/Open Price ... + double entry; + + // + // TP ... + double tp; + + // + // SL ... + double sl; + + // + // Make Risk Free Trade on this Value if provided ... + double riskFree; + + // + // a Multiplier for determines how much trade volume exit on risk free time ... + double riskFreeRate; + + // + // Trade Profit ... + double profit; + + // + // Time of Operation ... + datetime time; + + // + // Volume ... + double volume; + + // + // Comment ... + string comment; +}; + +// +// TP/SL Struct ... +struct XTPSL +{ + ENUM_X_SIGNAL_TYPE type; + double tp; + double sl; + double entry; + double r2r; +}; +// +// END Provided Functions ... +// diff --git a/BKPS/OLD/EURUSD-5M-V0.1/MQ5/Libraries/x-saherelm.nn.lib.mq5 b/BKPS/OLD/EURUSD-5M-V0.1/MQ5/Libraries/x-saherelm.nn.lib.mq5 new file mode 100644 index 0000000..8fa40f5 --- /dev/null +++ b/BKPS/OLD/EURUSD-5M-V0.1/MQ5/Libraries/x-saherelm.nn.lib.mq5 @@ -0,0 +1,258 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 NN Class Library +// ---------------------------------------- +// Name: XNNClass +// Description: provides all classes for implementing +// Neural Network ... +// +// +// 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 Global Definitions: Variables, Properties and etc ... +// +class XCNNBase +{ + // + // Public Definitions ... +public: + // + // Constructor ... + void XCNNBase( + int nodes = 10, // Number of Input Nodes + double starterWeight = 0.5, // start weight for each input + double coEfficient = 0.1, // COEfficient Multiplier + double upperRange = 1, // Upper Normal Range Value + double lowerRange = -1, // Lower Normal Range Value + double learningRates = 0.1 // Back Propagation Learning Rate + ) { + // + mNodes = nodes; + mUpperRange = upperRange; + mLowerRange = lowerRange; + mCoEfficient = coEfficient; + mLearningRates = learningRates; + mStarterWeight = starterWeight; + + // + ReConstructWeights(); + } + + // + // Deconstructor ... + void ~XCNNBase() {} + + // + // Protected Definitions ... + void NormalizeInputs(double &inputs[], double &result[]) + { + // + ArrayFree(result); + ArrayResize(result, 1); + + // + // Validate inputs ... + if (ArraySize(inputs) != mNodes) + { + return; + } + + // + // Prepare Result ... + ArrayResize(result, mNodes); + + // + // Calculating min and max range value ... + double minRangeValue = inputs[ArrayMinimum(inputs)]; + double maxRangeValue = inputs[ArrayMaximum(inputs)]; + + // + // Loop through Inputs nd Normalize them ... + for (int i = 0; i < mNodes; i++) + { + // + double normalValue = (((inputs[i] - minRangeValue) * (mUpperRange - mLowerRange)) / (maxRangeValue - minRangeValue)) + mLowerRange; + result[i] = normalValue; + } + } + + // + // Hyperbolic Tangent Activation Function ... + double TanHActivationFunction(double weightedInputs) + { + // + double result = (exp(weightedInputs) - exp(-weightedInputs)) / (exp(weightedInputs) + exp(-weightedInputs)); + return result; + } + + // + // Calculate Weighted Inputs ... + double CalculateWeightedInputs( + double &inputs[], + bool applyCOEfficient = true) + { + // + double result = 0; + + // + // Validate Inputs ... + if (ArraySize(inputs) != mNodes) + { + // + result = -1; + return result; + } + + // + for (int i = 0; i < mNodes; i++) + { + result += inputs[i] * mWeights[i]; + } + + // + // Multiply if required ... + if (applyCOEfficient) + { + result *= mCoEfficient; + } + + // + return result; + } + + // + // Calculate Hidden Layers ... + virtual double CalculateHiddenLayer(double &inputs[]) + { + // + // this is Default Activation Function which used ... + // you can override this by writing your own ... + double totalWeightedInputs = CalculateWeightedInputs(inputs); + double result = TanHActivationFunction(totalWeightedInputs); + + // + return result; + } + + // + // Calculate Output Layers ... + double CalculateOutputLayer(double &inputs[]) + { + // + double result = -1; + + // + // Validate Inputs ... + if (ArraySize(inputs) != mNodes) { + return result; + } + + // + double normalizedInputs[]; + NormalizeInputs(inputs, normalizedInputs); + if (ArraySize(normalizedInputs) != mNodes) { + return result; + } + + // + double hiddenLayerResult = CalculateHiddenLayer(normalizedInputs); + + // + result = 1 * hiddenLayerResult; + + // + return result; + } + + // + // Basck Propaggation Learning ... + void BackPropagation( + double &inputs[], + double &outputs, + double targetOutput + ) { + // + // Validate Inputs ... + if (ArraySize(inputs) != mNodes) { + return; + } + + // + double normalizedInputs[]; + NormalizeInputs(inputs, normalizedInputs); + if (ArraySize(normalizedInputs) != mNodes) { + return; + } + + // + double error = targetOutput - outputs; + double derivative = 1 - MathPow(outputs, 2); + + // + for (int i = 0; i < mNodes; i++) { + // + double gradient = error * derivative * inputs[i]; + mWeights[i] = mLearningRates * gradient; + } + } + +protected: + // + // Private Definitions ... +private: + // + // Number of Input Nodes ... + int mNodes; + + // + // Specify Upper range of Normal Values ... + double mUpperRange; + + // + // Specify Lower range of Normal Values ... + double mLowerRange; + + // + // Starter Weight for each input node ... + double mStarterWeight; + + // + // double Input Node Weights ... + double mWeights[]; + + // + // CoEfficient is a multiplyer for weighted inputs ... + double mCoEfficient; + + // + // Back Propagation Learning Rates ... + double mLearningRates; + + // + // ReConstruct Weights ... + void ReConstructWeights() { + // + ArrayFree(mWeights); + ArrayResize(mWeights, mNodes); + + // + for (int i = 0; i< mNodes; i++) { + mWeights[i] = mStarterWeight; + } + } +} +// +// END Global Definitions: Variables, Properties and etc ... +// diff --git a/BKPS/OLD/EURUSD-5M-V0.1/MQ5/Libraries/x-saherelm.xchlh.oscillator.helper.lib.mq5 b/BKPS/OLD/EURUSD-5M-V0.1/MQ5/Libraries/x-saherelm.xchlh.oscillator.helper.lib.mq5 new file mode 100644 index 0000000..75f8068 --- /dev/null +++ b/BKPS/OLD/EURUSD-5M-V0.1/MQ5/Libraries/x-saherelm.xchlh.oscillator.helper.lib.mq5 @@ -0,0 +1,925 @@ +///////////////////////////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 XCHLH Oscillator Helper for Signal Providers +// -------------------------------------------------------------------------- +// +// 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 + +// +// Includes ... +#include "..\Libraries\x-saherelm.log.lib.mq5" +#include "..\Libraries\x-saherelm.common.lib.mq5" + +// +// START Enum Definitions ... +// + +// +// XCHLH Hot States ... +enum ENUM_X_XCHLH_HOT_STATES +{ + X_XCHLH_HOT_HH = 1, + X_XCHLH_NEUTURAL = 0, + X_XCHLH_HOT_LL = -1, +}; + +// +// XCHLH Signal Calculation Types ... +enum ENUM_X_XCHLH_SIGNAL_TYPES +{ + X_XCHLH_AVG_SIGNAL, + X_XCHLH_DELTA_SIGNAL, +}; + +// +// XCHLH Buffer Lines ... +enum ENUM_X_XCHLH_BUFFER_LINES +{ + X_XCHLH_LC_HH_LINE = 0, + X_XCHLH_LC_LL_LINE = 1, + X_XCHLH_MC_HH_LINE = 2, + X_XCHLH_MC_LL_LINE = 3, + X_XCHLH_SC_HH_LINE = 4, + X_XCHLH_SC_LL_LINE = 5, + X_XCHLH_SIGNAL_T_LINE = 6, + X_XCHLH_SIGNAL_B_LINE = 7, + X_XCHLH_HOT_STATE_LINE = 8, +}; + +// +// END Enum Definitions ... +// + +// +// START Inputs ... +// + +// +input group "XCHLH Oscillator"; + +// +// Signal Calculations ... +input group "XCHLH Signal Calculations"; +input ENUM_X_XCHLH_SIGNAL_TYPES xCHLHSignalType = X_XCHLH_AVG_SIGNAL; // Signal Method + +// +// Common ... +input group "XCHLH Hot Areas"; +input bool xCHLHDrawHotAreas = false; // Draw Hot Areas Symbol +input uchar xCHLHHotHHArrowCode = 234; // Hot HH Arrow Code +input color xCHLHHotHHArrowColor = clrAqua; // Hot HH Arrow Color +input uchar xCHLHHotLLArrowCode = 233; // Hot LL Arrow Code +input color xCHLHHotLLArrowColor = clrFuchsia; // Hot LL Arrow Color + +// +// LC Inputs ... +input group "XCHLH Long Cycle"; +input group "XCHLH LC Market"; +input int xCHLHLcLength = 288; // Length +input double xCHLHLcThresholdInPips = 0.3; // Threshold In Pips +input ENUM_SERIESMODE xCHLHLcHHMode = MODE_HIGH; // Highest High Calculation Method +input ENUM_SERIESMODE xCHLHLcLLMode = MODE_LOW; // Lowest Low Calculation Method +input group "XCHLH LC Style"; +input int xCHLHLcDrawWidth = 1; // Draw Width +input ENUM_DRAW_TYPE xCHLHLcDrawType = DRAW_LINE; // Draw Type +input ENUM_LINE_STYLE xCHLHLcDrawStyle = STYLE_DOT; // Draw Style +input color xCHLHLcHHColor = clrAqua; // Highest High Color +input color xCHLHLcLLColor = clrFuchsia; // Lowest Low Color +input group "XCHLH LC Drawings"; +input bool xCHLHLcDrawHH = true; // Draw Highest High +input bool xCHLHLcDrawLL = true; // Draw Lowest Low + +// +// MC Inputs ... +input group "XCHLH Medium Cycle"; +input group "XCHLH MC Market"; +input int xCHLHMcLength = 72; // Length +input double xCHLHMcThresholdInPips = 0.3; // Threshold In Pips +input ENUM_SERIESMODE xCHLHMcHHMode = MODE_HIGH; // Highest High Calculation Method +input ENUM_SERIESMODE xCHLHMcLLMode = MODE_LOW; // Lowest Low Calculation Method +input group "XCHLH MC Style"; +input int xCHLHMcDrawWidth = 1; // Draw Width +input ENUM_DRAW_TYPE xCHLHMcDrawType = DRAW_LINE; // Draw Type +input ENUM_LINE_STYLE xCHLHMcDrawStyle = STYLE_DOT; // Draw Style +input color xCHLHMcHHColor = clrLime; // Highest High Color +input color xCHLHMcLLColor = clrRed; // Lowest Low Color +input group "XCHLH MC Drawings"; +input bool xCHLHMcDrawHH = true; // Draw Highest High +input bool xCHLHMcDrawLL = true; // Draw Lowest Low + +// +// SC Inputs ... +input group "XCHLH Short Cycle"; +input group "XCHLH SC Market"; +input int xCHLHScLength = 7; // Length +input double xCHLHScThresholdInPips = 0.3; // Threshold In Pips +input ENUM_SERIESMODE xCHLHScHHMode = MODE_HIGH; // Highest High Calculation Method +input ENUM_SERIESMODE xCHLHScLLMode = MODE_LOW; // Lowest Low Calculation Method +input group "XCHLH SC Style"; +input int xCHLHScDrawWidth = 1; // Draw Width +input ENUM_DRAW_TYPE xCHLHScDrawType = DRAW_LINE; // Draw Type +input ENUM_LINE_STYLE xCHLHScDrawStyle = STYLE_DOT; // Draw Style +input color xCHLHScHHColor = clrLightBlue; // Highest High Color +input color xCHLHScLLColor = clrLightSalmon; // Lowest Low Color +input group "XCHLH SC Drawings"; +input bool xCHLHScDrawHH = true; // Draw Highest High +input bool xCHLHScDrawLL = true; // Draw Lowest Low + +// +// END Inputs ... +// + +// +// START Definitions ... +// + +int xCHLHHandler = INVALID_HANDLE; +double xCHLHLcHHBuffer[]; +double xCHLHLcLLBuffer[]; +double xCHLHMcHHBuffer[]; +double xCHLHMcLLBuffer[]; +double xCHLHScHHBuffer[]; +double xCHLHScLLBuffer[]; +double xCHLHSignalTBuffer[]; +double xCHLHSignalBBuffer[]; + +// +// END Definitions ... +// + +// +// START Handler Functions ... +// + +// +// Init Oscillators ... +bool XCHLHInitHandlers() +{ + // + bool result = false; + + // + // Initialize Indicator/Oscillator Handlers ... + ResetLastError(); + + // + // XCHLH Handler ... + ArraySetAsSeries(xCHLHLcHHBuffer, true); + ArraySetAsSeries(xCHLHLcLLBuffer, true); + ArraySetAsSeries(xCHLHMcHHBuffer, true); + ArraySetAsSeries(xCHLHMcLLBuffer, true); + ArraySetAsSeries(xCHLHScHHBuffer, true); + ArraySetAsSeries(xCHLHScLLBuffer, true); + ArraySetAsSeries(xCHLHSignalTBuffer, true); + ArraySetAsSeries(xCHLHSignalBBuffer, true); + xCHLHHandler = iCustom( + _Symbol, + _Period, + "x-saherelm.xchlh.oscillator", + // + // Inputs ... + // + // Signal Calculations ... + "", + xCHLHSignalType, + // + // Commons ... + "", + xCHLHDrawHotAreas, + xCHLHHotHHArrowCode, + xCHLHHotHHArrowColor, + xCHLHHotLLArrowCode, + xCHLHHotLLArrowColor, + // + // LC ... + "", + "", + xCHLHLcLength, + xCHLHLcThresholdInPips, + xCHLHLcHHMode, + xCHLHLcLLMode, + "", + xCHLHLcDrawWidth, + xCHLHLcDrawType, + xCHLHLcDrawStyle, + xCHLHLcHHColor, + xCHLHLcLLColor, + "", + xCHLHLcDrawHH, + xCHLHLcDrawLL, + // + // MC ... + "", + "", + xCHLHMcLength, + xCHLHMcThresholdInPips, + xCHLHMcHHMode, + xCHLHMcLLMode, + "", + xCHLHMcDrawWidth, + xCHLHMcDrawType, + xCHLHMcDrawStyle, + xCHLHMcHHColor, + xCHLHMcLLColor, + "", + xCHLHMcDrawHH, + xCHLHMcDrawLL, + // + // SC ... + "", + "", + xCHLHScLength, + xCHLHScThresholdInPips, + xCHLHScHHMode, + xCHLHScLLMode, + "", + xCHLHScDrawWidth, + xCHLHScDrawType, + xCHLHScDrawStyle, + xCHLHScHHColor, + xCHLHScLLColor, + "", + xCHLHScDrawHH, + xCHLHScDrawLL); + if (xCHLHHandler == INVALID_HANDLE) + { + // + LogMessage("failed to Initialize XCHLH Indicator: " + (string)GetLastError()); + return result; + } + + // + result = true; + + // + return result; +} + +// +// Release Oscillators ... +void XCHLHReleaseHandlers() +{ + IndicatorRelease(xCHLHHandler); +} + +// +// Handle Reading Buffers ... +void XCHLHReadBuffers( + int xCHLHItemsPerTick // Number Of Reading Buffer Items Per Tick +) +{ + // + // XCHLH LC HH Buffer ... + CopyBuffer( + xCHLHHandler, + X_XCHLH_LC_HH_LINE, + 0, + xCHLHItemsPerTick, + xCHLHLcHHBuffer); + + // + // XCHLH LC LL Buffer ... + CopyBuffer( + xCHLHHandler, + X_XCHLH_LC_LL_LINE, + 0, + xCHLHItemsPerTick, + xCHLHLcLLBuffer); + + // + // XCHLH MC HH Buffer ... + CopyBuffer( + xCHLHHandler, + X_XCHLH_MC_HH_LINE, + 0, + xCHLHItemsPerTick, + xCHLHMcHHBuffer); + + // + // XCHLH MC LL Buffer ... + CopyBuffer( + xCHLHHandler, + X_XCHLH_MC_LL_LINE, + 0, + xCHLHItemsPerTick, + xCHLHMcLLBuffer); + + // + // XCHLH SC HH Buffer ... + CopyBuffer( + xCHLHHandler, + X_XCHLH_SC_HH_LINE, + 0, + xCHLHItemsPerTick, + xCHLHScHHBuffer); + + // + // XCHLH SC LL Buffer ... + CopyBuffer( + xCHLHHandler, + X_XCHLH_SC_LL_LINE, + 0, + xCHLHItemsPerTick, + xCHLHScLLBuffer); + + // + // XCHLH Signal T Buffer ... + CopyBuffer( + xCHLHHandler, + X_XCHLH_SIGNAL_T_LINE, + 0, + xCHLHItemsPerTick, + xCHLHSignalTBuffer); + + // + // XCHLH Signal B Buffer ... + CopyBuffer( + xCHLHHandler, + X_XCHLH_SIGNAL_B_LINE, + 0, + xCHLHItemsPerTick, + xCHLHSignalBBuffer); +} + +// +// END Handler Funcions ... +// + +// +// START Signal Related Conditions ... +// + +// +// XCHLH Long Conditions ... +bool XCHLHHasLongConditions( + int xCHLHItemsPerTick // Number Of Reading Buffer Items Per Tick +) +{ + // + bool result = false; + + // + bool isSignalBCrossedOverLCLL = XCHLHIsSignalBCrossedOverLCLL(1); + + // + result = + // + isSignalBCrossedOverLCLL + // + ; + + // + return result; +} + +// +// XCHLH Close Long Conditions ... +bool XCHLHHasLongCloseConditions( + int xCHLHItemsPerTick // Number Of Reading Buffer Items Per Tick +) { + // + bool result = false; + + // + bool isSignalBCrossedOverSignalT = XCHLHIsSignalBCrossedOverSignalT(1); + + // + result = + // + isSignalBCrossedOverSignalT + // + ; + + // + return result; +} + +// +// XCHLH Short Conditions ... +bool XCHLHHasShortConditions( + int xCHLHItemsPerTick // Number Of Reading Buffer Items Per Tick +) +{ + // + bool result = false; + + // + bool isSignalBCrossedUnderSignalT = XCHLHIsSignalBCrossedUnderSignalT(1); + + // + result = + // + isSignalBCrossedUnderSignalT + // + ; + + // + return result; +} + +// +// XCHLH Close Short Conditions ... +bool XCHLHHasShortCloseConditions( + int xCHLHItemsPerTick // Number Of Reading Buffer Items Per Tick +) +{ + // + bool result = false; + + // + bool isSignalBCrossedUnderLCLL = XCHLHIsSignalBCrossedUnderLCLL(1); + + // + result = + // + isSignalBCrossedUnderLCLL + // + ; + + // + return result; +} + +// +// END Signal Related Conditions ... +// + +// +// START XCHLH Custom Functions ... +// + +// +// Check Signal B Crossed Over LC LL ... +bool XCHLHIsSignalBCrossedOverLCLL( + int bar_index // Specified Bar Index ... +) +{ + // + bool result = false; + + // + // Validate Args ... + if (!XCHLHIsValidBufferSizes(bar_index + 2)) + { + return result; + } + + // + result = IsCrossOver( + xCHLHSignalBBuffer, + xCHLHLcLLBuffer, + bar_index); + + // + return result; +} + +// +// Check Signal B Over LC LL ... +bool XCHLHIsSignalBOverLCLL( + int bar_index // Specified Bar Index ... +) +{ + // + bool result = false; + + // + // Validate Args ... + if (!XCHLHIsValidBufferSizes(bar_index + 2)) + { + return result; + } + + // + result = IsOver( + xCHLHSignalBBuffer, + xCHLHLcLLBuffer, + bar_index); + + // + return result; +} + +// +// Check Signal B Crossed Under LC LL ... +bool XCHLHIsSignalBCrossedUnderLCLL( + int bar_index // Specified Bar Index ... +) +{ + // + bool result = false; + + // + // Validate Args ... + if (!XCHLHIsValidBufferSizes(bar_index + 2)) + { + return result; + } + + // + result = IsCrossUnder( + xCHLHSignalBBuffer, + xCHLHLcLLBuffer, + bar_index); + + // + return result; +} + +// +// Check Signal B Under LC LL ... +bool XCHLHIsSignalBUnderLCLL( + int bar_index // Specified Bar Index ... +) +{ + // + bool result = false; + + // + // Validate Args ... + if (!XCHLHIsValidBufferSizes(bar_index + 2)) + { + return result; + } + + // + result = IsUnder( + xCHLHSignalBBuffer, + xCHLHLcLLBuffer, + bar_index); + + // + return result; +} + +// +// Check Signal B Crossed Over Signal T ... +bool XCHLHIsSignalBCrossedOverSignalT( + int bar_index // Specified Bar Index ... +) +{ + // + bool result = false; + + // + // Validate Args ... + if (!XCHLHIsValidBufferSizes(bar_index + 2)) + { + return result; + } + + // + result = IsCrossOver( + xCHLHSignalBBuffer, + xCHLHSignalTBuffer, + bar_index); + + // + return result; +} + +// +// Check Signal B Over Signal T ... +bool XCHLHIsSignalBOverSignalT( + int bar_index // Specified Bar Index ... +) +{ + // + bool result = false; + + // + // Validate Args ... + if (!XCHLHIsValidBufferSizes(bar_index + 2)) + { + return result; + } + + // + result = IsOver( + xCHLHSignalBBuffer, + xCHLHSignalTBuffer, + bar_index); + + // + return result; +} + +// +// Check Signal B Crossed Under Signal T ... +bool XCHLHIsSignalBCrossedUnderSignalT( + int bar_index // Specified Bar Index ... +) +{ + // + bool result = false; + + // + // Validate Args ... + if (!XCHLHIsValidBufferSizes(bar_index + 2)) + { + return result; + } + + // + result = IsCrossUnder( + xCHLHSignalBBuffer, + xCHLHSignalTBuffer, + bar_index); + + // + return result; +} + +// +// Check Signal B Under Signal T ... +bool XCHLHIsSignalBUnderSignalT( + int bar_index // Specified Bar Index ... +) +{ + // + bool result = false; + + // + // Validate Args ... + if (!XCHLHIsValidBufferSizes(bar_index + 2)) + { + return result; + } + + // + result = IsUnder( + xCHLHSignalBBuffer, + xCHLHSignalTBuffer, + bar_index); + + // + return result; +} + +// +// Check LC and MC has Same HH ... +bool XCHLHIsLCMCHasSameHH( + int bar_index // Specified Bar Index ... +) +{ + // + bool result = false; + + // + // Validate Args ... + if (!XCHLHIsValidBufferSizes(bar_index + 1)) + { + return result; + } + + // + double lcValue = xCHLHLcHHBuffer[bar_index]; + double mcValue = xCHLHMcHHBuffer[bar_index]; + + // + result = lcValue == mcValue; + + // + return result; +} + +// +// Check LC and MC has Same LL ... +bool XCHLHIsLCMCHasSameLL( + int bar_index // Specified Bar Index ... +) +{ + // + bool result = false; + + // + // Validate Args ... + if (!XCHLHIsValidBufferSizes(bar_index + 1)) + { + return result; + } + + // + double lcValue = xCHLHLcLLBuffer[bar_index]; + double mcValue = xCHLHMcLLBuffer[bar_index]; + + // + result = lcValue == mcValue; + + // + return result; +} + +// +// Check LC and SC has Same HH ... +bool XCHLHIsLCSCHasSameHH( + int bar_index // Specified Bar Index ... +) +{ + // + bool result = false; + + // + // Validate Args ... + if (!XCHLHIsValidBufferSizes(bar_index + 1)) + { + return result; + } + + // + double lcValue = xCHLHLcHHBuffer[bar_index]; + double scValue = xCHLHScHHBuffer[bar_index]; + + // + result = lcValue == scValue; + + // + return result; +} + +// +// Check LC and SC has Same LL ... +bool XCHLHIsLCSCHasSameLL( + int bar_index // Specified Bar Index ... +) +{ + // + bool result = false; + + // + // Validate Args ... + if (!XCHLHIsValidBufferSizes(bar_index + 1)) + { + return result; + } + + // + double lcValue = xCHLHLcLLBuffer[bar_index]; + double scValue = xCHLHScLLBuffer[bar_index]; + + // + result = lcValue == scValue; + + // + return result; +} + +// +// Check MC and SC has Same HH ... +bool XCHLHIsMCSCHasSameHH( + int bar_index // Specified Bar Index ... +) +{ + // + bool result = false; + + // + // Validate Args ... + if (!XCHLHIsValidBufferSizes(bar_index + 1)) + { + return result; + } + + // + double mcValue = xCHLHMcHHBuffer[bar_index]; + double scValue = xCHLHScHHBuffer[bar_index]; + + // + result = mcValue == scValue; + + // + return result; +} + +// +// Check MC and SC has Same LL ... +bool XCHLHIsMCSCHasSameLL( + int bar_index // Specified Bar Index ... +) +{ + // + bool result = false; + + // + // Validate Args ... + if (!XCHLHIsValidBufferSizes(bar_index + 1)) + { + return result; + } + + // + double mcValue = xCHLHMcLLBuffer[bar_index]; + double scValue = xCHLHScLLBuffer[bar_index]; + + // + result = mcValue == scValue; + + // + return result; +} + +// +// Check Is Same Highest Highs ... +bool XCHLHIsSameHHs( + int bar_index // Specified Bar Index ... +) +{ + // + bool result = false; + + // + // Validate Args ... + if (!XCHLHIsValidBufferSizes(bar_index + 1)) + { + return result; + } + + // + double lcValue = xCHLHLcHHBuffer[bar_index]; + double mcValue = xCHLHMcHHBuffer[bar_index]; + double scValue = xCHLHScHHBuffer[bar_index]; + + // + result = + // + lcValue == mcValue && + mcValue == scValue + // + ; + + // + return result; +} + +// +// Check Is Same Lowest Lows ... +bool XCHLHIsSameLLs( + int bar_index // Specified Bar Index ... +) +{ + // + bool result = false; + + // + // Validate Args ... + if (!XCHLHIsValidBufferSizes(bar_index + 1)) + { + return result; + } + + // + double lcValue = xCHLHLcLLBuffer[bar_index]; + double mcValue = xCHLHMcLLBuffer[bar_index]; + double scValue = xCHLHScLLBuffer[bar_index]; + + // + result = + // + lcValue == mcValue && + mcValue == scValue + // + ; + + // + return result; +} + +// +// Check and Validate Buffer Sizes ... +bool XCHLHIsValidBufferSizes( + int size // Specified Min Size +) +{ + // + bool result = false; + + // + result = + // + ArraySize(xCHLHLcHHBuffer) > size && + ArraySize(xCHLHLcLLBuffer) > size && + // + ArraySize(xCHLHMcHHBuffer) > size && + ArraySize(xCHLHMcLLBuffer) > size && + // + ArraySize(xCHLHScHHBuffer) > size && + ArraySize(xCHLHScLLBuffer) > size; + + // + return result; +} + +// +// END XCHLH Custom Functions ... +// diff --git a/BKPS/OLD/EURUSD-5M-V0.1/MQ5/Libraries/x-saherelm.xchma.oscillator.helper.lib.mq5 b/BKPS/OLD/EURUSD-5M-V0.1/MQ5/Libraries/x-saherelm.xchma.oscillator.helper.lib.mq5 new file mode 100644 index 0000000..b028bb9 --- /dev/null +++ b/BKPS/OLD/EURUSD-5M-V0.1/MQ5/Libraries/x-saherelm.xchma.oscillator.helper.lib.mq5 @@ -0,0 +1,1535 @@ +///////////////////////////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 XCHMA Oscillator Helper for Signal Providers +// -------------------------------------------------------------------------- +// +// 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 + +// +// Includes ... +#include "..\Libraries\x-saherelm.log.lib.mq5" +#include "..\Libraries\x-saherelm.common.lib.mq5" + +// +// START Enum Definitions ... +// + +// +// XCHMA Cycles ... +enum ENUM_XCHMA_CYCLES +{ + X_XCHMA_CYCLE_LONG, + X_XCHMA_CYCLE_MEDIUM, + X_XCHMA_CYCLE_SHORT, +}; + +// +// XCHMA Oscillator Hot State Presentation ... +enum ENUM_XCHMA_HOT_STATES +{ + X_XCHMA_HOT_BULLISH = 1, + X_XCHMA_HOT_NEUTURAL = 0, + X_XCHMA_HOT_BEARISH = -1, +}; + +// +// XCHMA Oscillator Cycles State Presentation ... +enum ENUM_XCHMA_CYCLE_STATES +{ + X_XCHMA_FAST_CROSSED_OVER_SLOW = 2, + X_XCHMA_FAST_OVER_SLOW = 1, + X_XCHMA_NEUTURAL = 0, + X_XCHMA_FAST_UNDER_SLOW = -1, + X_XCHMA_FAST_CROSSED_UNDER_SLOW = -2, +}; + +// +// XCHMA Oscillator Buffer Lines ... +enum ENUM_X_XCHMA_BUFFER_LINES +{ + X_XCHMA_LC_FAST_LINE = 0, + X_XCHMA_LC_SLOW_LINE = 1, + X_XCHMA_LC_STATE_LINE = 6, + X_XCHMA_MC_FAST_LINE = 2, + X_XCHMA_MC_SLOW_LINE = 3, + X_XCHMA_MC_STATE_LINE = 7, + X_XCHMA_SC_FAST_LINE = 4, + X_XCHMA_SC_SLOW_LINE = 5, + X_XCHMA_SC_STATE_LINE = 8, + X_XCHMA_HOT_STATE_LINE = 9, +}; + +// +// END Enum Definitions ... +// + +// +// START Inputs ... +// + +input group "XCHMA Oscillator"; + +// +// Commons ... +input group "XCHMA Hot Areas"; +input bool xCHMADrawHotAreas = false; // Draw Hot Areas Symbol; +input uchar xCHMAHotBullishArrowCode = 228; // Hot Bullish Arrow Code; +input color xCHMAHotBullishArrowColor = clrAqua; // Hot Bullish Arrow Color; +input uchar xCHMAHotBearishArrowCode = 230; // Hot Bearish Arrow Code; +input color xCHMAHotBearishArrowColor = clrFuchsia; // Hot Bearish Arrow Color; + +// +// LC Inputs ... +input group "XCHMA Long Cycle"; +input group "XCHMA LC Market"; +input int xCHMALcFastLength = 288; // Fast Length +input int xCHMALcSlowLength = 576; // Slow Length +input ENUM_MA_METHOD xCHMALcMethod = MODE_EMA; // Calculation Method +input ENUM_APPLIED_PRICE xCHMALcAppliedTo = PRICE_CLOSE; // Applied To +input group "XCHMA LC Style"; +input int xCHMALcDrawWidth = 1; // Draw Width +input ENUM_DRAW_TYPE xCHMALcDrawType = DRAW_LINE; // Draw Type +input ENUM_LINE_STYLE xCHMALcDrawStyle = STYLE_DOT; // Draw Style +input color xCHMALcFastColor = clrAqua; // Fast Color +input color xCHMALcSlowColor = clrFuchsia; // Slow Color +input group "XCHMA LC Drawings"; +input bool xCHMALcDrawFast = true; // Draw Fast +input bool xCHMALcDrawSlow = true; // Draw Slow +input bool xCHMALcDrawCrosses = false; // Draw Cross Lines + +// +// MC Inputs ... +input group "XCHMA Medium Cycle"; +input group "XCHMA MC Market"; +input int xCHMAMcFastLength = 72; // Fast Length +input int xCHMAMcSlowLength = 144; // Slow Length +input ENUM_MA_METHOD xCHMAMcMethod = MODE_EMA; // Calculation Method +input ENUM_APPLIED_PRICE xCHMAMcAppliedTo = PRICE_CLOSE; // Applied To +input group "XCHMA MC Style"; +input int xCHMAMcDrawWidth = 1; // Draw Width +input ENUM_DRAW_TYPE xCHMAMcDrawType = DRAW_LINE; // Draw Type +input ENUM_LINE_STYLE xCHMAMcDrawStyle = STYLE_DOT; // Draw Style +input color xCHMAMcFastColor = clrLime; // Fast Color +input color xCHMAMcSlowColor = clrRed; // Slow Color +input group "XCHMA MC Drawings"; +input bool xCHMAMcDrawFast = true; // Draw Fast +input bool xCHMAMcDrawSlow = true; // Draw Slow +input bool xCHMAMcDrawCrosses = false; // Draw Cross Lines + +// +// SC Inputs ... +input group "XCHMA Short Cycle"; +input group "XCHMA SC Market"; +input int xCHMAScFastLength = 7; // Fast Length +input int xCHMAScSlowLength = 14; // Slow Length +input ENUM_MA_METHOD xCHMAScMethod = MODE_EMA; // Calculation Method +input ENUM_APPLIED_PRICE xCHMAScAppliedTo = PRICE_CLOSE; // Applied To +input group "XCHMA SC Style"; +input int xCHMAScDrawWidth = 1; // Draw Width +input ENUM_DRAW_TYPE xCHMAScDrawType = DRAW_LINE; // Draw Type +input ENUM_LINE_STYLE xCHMAScDrawStyle = STYLE_SOLID; // Draw Style +input color xCHMAScFastColor = clrLightBlue; // Fast Color +input color xCHMAScSlowColor = clrLightSalmon; // Slow Color +input group "XCHMA SC Drawings"; +input bool xCHMAScDrawFast = true; // Draw Fast +input bool xCHMAScDrawSlow = true; // Draw Slow +input bool xCHMAScDrawCrosses = false; // Draw Cross Lines + +// +// END Inputs ... +// + +// +// START Definitions ... +// + +int xCHMAHandler = INVALID_HANDLE; +double xCHMALcFastBuffer[]; +double xCHMALcSlowBuffer[]; +double xCHMAMcFastBuffer[]; +double xCHMAMcSlowBuffer[]; +double xCHMAScFastBuffer[]; +double xCHMAScSlowBuffer[]; + +// +// END Definitions ... +// + +// +// START Handler Functions ... +// + +// +// Init Oscillators ... +bool XCHMAInitHandlers() +{ + // + bool result = false; + + // + // Initialize Indicator/Oscillator Handlers ... + ResetLastError(); + + // + // XCHMA Handler ... + ArraySetAsSeries(xCHMALcFastBuffer, true); + ArraySetAsSeries(xCHMALcSlowBuffer, true); + ArraySetAsSeries(xCHMAMcFastBuffer, true); + ArraySetAsSeries(xCHMAMcSlowBuffer, true); + ArraySetAsSeries(xCHMAScFastBuffer, true); + ArraySetAsSeries(xCHMAScSlowBuffer, true); + xCHMAHandler = iCustom( + _Symbol, + _Period, + "x-saherelm.xchma.oscillator", + // + // Inputs ... + "", + xCHMADrawHotAreas, + xCHMAHotBullishArrowCode, + xCHMAHotBullishArrowColor, + xCHMAHotBearishArrowCode, + xCHMAHotBearishArrowColor, + // + // Long Cycle ... + "", + "", + xCHMALcFastLength, + xCHMALcSlowLength, + xCHMALcMethod, + xCHMALcAppliedTo, + "", + xCHMALcDrawWidth, + xCHMALcDrawType, + xCHMALcDrawStyle, + xCHMALcFastColor, + xCHMALcSlowColor, + "", + xCHMALcDrawFast, + xCHMALcDrawSlow, + xCHMALcDrawCrosses, + // + // Medium Cycle ... + "", + "", + xCHMAMcFastLength, + xCHMAMcSlowLength, + xCHMAMcMethod, + xCHMAMcAppliedTo, + "", + xCHMAMcDrawWidth, + xCHMAMcDrawType, + xCHMAMcDrawStyle, + xCHMAMcFastColor, + xCHMAMcSlowColor, + "", + xCHMAMcDrawFast, + xCHMAMcDrawSlow, + xCHMAMcDrawCrosses, + // + // Short Cycle ... + "", + "", + xCHMAScFastLength, + xCHMAScSlowLength, + xCHMAScMethod, + xCHMAScAppliedTo, + "", + xCHMAScDrawWidth, + xCHMAScDrawType, + xCHMAScDrawStyle, + xCHMAScFastColor, + xCHMAScSlowColor, + "", + xCHMAScDrawFast, + xCHMAScDrawSlow, + xCHMAScDrawCrosses); + if (xCHMAHandler == INVALID_HANDLE) + { + // + LogMessage("failed to Initialize XCHMA Oscillator: " + (string)GetLastError()); + return result; + } + + // + result = true; + + // + return result; +} + +// +// Release Oscillators ... +void XCHMAReleaseHandlers() +{ + IndicatorRelease(xCHMAHandler); +} + +// +// Handle Reading Buffers ... +void XCHMAReadBuffers( + int xCHMAItemsPerTick // Number Of Reading Buffer Items Per Tick +) +{ + // + // XCHMA Long Cycle ... + // + // XCHMA Fast ... + CopyBuffer( + xCHMAHandler, + X_XCHMA_LC_FAST_LINE, + 0, + xCHMAItemsPerTick, + xCHMALcFastBuffer); + + // + // XCHMA Slow ... + CopyBuffer( + xCHMAHandler, + X_XCHMA_LC_SLOW_LINE, + 0, + xCHMAItemsPerTick, + xCHMALcSlowBuffer); + + // + // XCHMA Medium Cycle ... + // + // XCHMA Fast ... + CopyBuffer( + xCHMAHandler, + X_XCHMA_MC_FAST_LINE, + 0, + xCHMAItemsPerTick, + xCHMAMcFastBuffer); + + // + // XCHMA Slow ... + CopyBuffer( + xCHMAHandler, + X_XCHMA_MC_SLOW_LINE, + 0, + xCHMAItemsPerTick, + xCHMAMcSlowBuffer); + + // + // XCHMA Short Cycle ... + // + // XCHMA Fast ... + CopyBuffer( + xCHMAHandler, + X_XCHMA_SC_FAST_LINE, + 0, + xCHMAItemsPerTick, + xCHMAScFastBuffer); + + // + // XCHMA Slow ... + CopyBuffer( + xCHMAHandler, + X_XCHMA_SC_SLOW_LINE, + 0, + xCHMAItemsPerTick, + xCHMAScSlowBuffer); +} + +// +// END Handler Funcions ... +// + +// +// START Signal Related Conditions ... +// + +// +// XCHMA Long Conditions ... +bool XCHMAHasLongConditions( + int xCHMAItemsPerTick // Number Of Reading Buffer Items Per Tick +) +{ + // + bool result = false; + + // + bool isSCVale = XCHMAIsSCVale(); + bool isSCFastOverSlow = XCHMAIsSCFastOverSlow(1); + bool isScFastCrossedOver = XCHMAIsSCFastCrossedOverSlow(1); + + // + bool isMcVale = XCHMAIsMCVale(); + bool isMCFastOverSlow = XCHMAIsMCFastOverSlow(1); + bool isMcFastCrossedOver = XCHMAIsMCFastCrossedOverSlow(1); + + // + bool isLcVale = XCHMAIsLCVale(); + bool isLCFastOverSlow = XCHMAIsLCFastOverSlow(1); + bool isLcFastCrossedOver = XCHMAIsLCFastCrossedOverSlow(1); + + // + bool scHasSignal = + // isSCVale && + isScFastCrossedOver && + ( + // + isMCFastOverSlow || + isMcFastCrossedOver + // + ) && + ( + // + isLCFastOverSlow || + isLcFastCrossedOver + // + ); + + // + bool mcHasSignal = + // isMcVale && + isMcFastCrossedOver && + ( + // + isSCFastOverSlow || + isScFastCrossedOver + // + ) && + ( + // + isLCFastOverSlow || + isLcFastCrossedOver + // + ); + ; + + // + bool lcHasSignal = + // isLcVale && + isLcFastCrossedOver && + ( + // + isSCFastOverSlow || + isScFastCrossedOver + // + ) && + ( + // + isMCFastOverSlow || + isMcFastCrossedOver + // + ); + + // + // Signal ... + bool hasSignal = + // + scHasSignal + // + || + // + mcHasSignal + // + || + // + lcHasSignal + // + ; + + // + result = + // + hasSignal + // + ; + + // + return result; +} + +// +// XCHMA Short Conditions ... +bool XCHMAHasShortConditions( + int xCHMAItemsPerTick // Number Of Reading Buffer Items Per Tick +) +{ + // + bool result = false; + + // + bool scHasSignal = false; // XCHMAIsSCPeak(); + bool mcHasSignal = false; // XCHMAIsMCPeak(); + bool lcHasSignal = false; // XCHMAIsLCPeak(); + + // + // Signal ... + bool hasSignal = + // + scHasSignal + // + || + // + mcHasSignal + // + || + // + lcHasSignal + // + ; + + // + // Very Strong Signal ... + bool hasVeryStrongSignal = + // + scHasSignal + // + && + // + mcHasSignal + // + && + // + lcHasSignal + // + ; + + // + // Strong Signal ... + bool hasStrongSignal = + // + !hasVeryStrongSignal + // + && + // + ( + // + // SC and MC Provide Signal ... + ( + // + scHasSignal + // + && + // + mcHasSignal + // + ) + // + || + // + // MC and LC Provide Signal ... + ( + // + mcHasSignal + // + && + // + lcHasSignal + // + ) + // + || + // + // SC and LC Provide Signal ... + ( + // + scHasSignal + // + && + // + lcHasSignal + // + ) + // + ) + // + ; + + // + // Has Regular Signal ... + bool hasRegularSignal = + hasSignal && !hasStrongSignal && !hasVeryStrongSignal; + + // + result = + // + lcHasSignal + // + || + // + mcHasSignal + // + || + // + scHasSignal + // + ; + + // + return result; +} + +// +// END Signal Related Conditions ... +// + +// +// START XCHMA Custom Functions ... +// + +// +// Retrieve Max Cycles Value ... +double XCHMAGetMax( + int bar_index // Specified Index ... +) +{ + // + double result = 0; + + // + // Validate Args ... + if (!XCHMAIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + // SC Fast ... + result = MathMax( + result, + xCHMAScFastBuffer[bar_index]); + + // + // SC Slow ... + result = MathMax( + result, + xCHMAScSlowBuffer[bar_index]); + + // + // MC Fast ... + result = MathMax( + result, + xCHMAMcFastBuffer[bar_index]); + + // + // MC Slow ... + result = MathMax( + result, + xCHMAMcSlowBuffer[bar_index]); + + // + // LC Fast ... + result = MathMax( + result, + xCHMALcFastBuffer[bar_index]); + + // + // LC Slow ... + result = MathMax( + result, + xCHMALcSlowBuffer[bar_index]); + + // + return result; +} + +// +// Retrieve Max Cycles Value ... +double XCHMAGetMin( + int bar_index // Specified Index ... +) +{ + // + double result = 0; + + // + // Validate Args ... + if (!XCHMAIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + result = xCHMAScFastBuffer[bar_index]; + + // + // SC Fast ... + result = MathMin( + result, + xCHMAScFastBuffer[bar_index]); + + // + // SC Slow ... + result = MathMin( + result, + xCHMAScSlowBuffer[bar_index]); + + // + // MC Fast ... + result = MathMin( + result, + xCHMAMcFastBuffer[bar_index]); + + // + // MC Slow ... + result = MathMin( + result, + xCHMAMcSlowBuffer[bar_index]); + + // + // LC Fast ... + result = MathMin( + result, + xCHMALcFastBuffer[bar_index]); + + // + // LC Slow ... + result = MathMin( + result, + xCHMALcSlowBuffer[bar_index]); + + // + return result; +} + +// +// Long Cycle ... +// + +// +// Check LC is Peak ... +bool XCHMAIsLCPeak() +{ + // + bool result = false; + + // + bool isIncreasing = IsIncreasing( + 30, + 9, + xCHMALcFastBuffer); + + // + bool isDecreasing = IsDecreasing( + 9, + 1, + xCHMALcFastBuffer); + + // + // Generating Result ... + result = + // + isIncreasing + // + && + // + isDecreasing + // + ; + + // + return result; +} + +// +// Check LC is Vale ... +bool XCHMAIsLCVale() +{ + // + bool result = false; + + // + bool isIncreasing = IsIncreasing( + 9, + 1, + xCHMALcFastBuffer); + + // + bool isDecreasing = IsDecreasing( + 30, + 9, + xCHMALcFastBuffer); + + // + // Generating Result ... + result = + // + isIncreasing + // + && + // + isDecreasing + // + ; + + // + return result; +} + +// +// Check LC Fast Crossed Over Slow ... +bool XCHMAIsLCFastCrossedOverSlow( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XCHMAIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + result = IsCrossOver( + xCHMALcFastBuffer, + xCHMALcSlowBuffer, + bar_index); + + // + return result; +} + +// +// Check LC Fast Over Slow ... +bool XCHMAIsLCFastOverSlow( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XCHMAIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + result = IsOver( + xCHMALcFastBuffer, + xCHMALcSlowBuffer, + bar_index); + + // + return result; +} + +// +// Check LC Fast Crossed Under Slow ... +bool XCHMAIsLCFastCrossedUnderSlow( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XCHMAIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + result = IsCrossUnder( + xCHMALcFastBuffer, + xCHMALcSlowBuffer, + bar_index); + + // + return result; +} + +// +// Check LC Fast Under Slow ... +bool XCHMAIsLCFastUnderSlow( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XCHMAIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + result = IsUnder( + xCHMALcFastBuffer, + xCHMALcSlowBuffer, + bar_index); + + // + return result; +} + +// +// Medium Cycle ... +// + +// +// Check MC is Peak ... +bool XCHMAIsMCPeak() +{ + // + bool result = false; + + // + bool isIncreasing = IsIncreasing( + 20, + 6, + xCHMAMcFastBuffer); + + // + bool isDecreasing = IsDecreasing( + 6, + 1, + xCHMAMcFastBuffer); + + // + // Generating Result ... + result = + // + isIncreasing + // + && + // + isDecreasing + // + ; + + // + return result; +} + +// +// Check MC is Vale ... +bool XCHMAIsMCVale() +{ + // + bool result = false; + + // + bool isIncreasing = IsIncreasing( + 6, + 1, + xCHMAMcFastBuffer); + + // + bool isDecreasing = IsDecreasing( + 20, + 6, + xCHMAMcFastBuffer); + + // + // Generating Result ... + result = + // + isIncreasing + // + && + // + isDecreasing + // + ; + + // + return result; +} + +// +// Check MC Fast Crossed Over Slow ... +bool XCHMAIsMCFastCrossedOverSlow( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XCHMAIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + result = IsCrossOver( + xCHMAMcFastBuffer, + xCHMAMcSlowBuffer, + bar_index); + + // + return result; +} + +// +// Check MC Fast Over Slow ... +bool XCHMAIsMCFastOverSlow( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XCHMAIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + result = IsOver( + xCHMAMcFastBuffer, + xCHMAMcSlowBuffer, + bar_index); + + // + return result; +} + +// +// Check MC Fast Crossed Under Slow ... +bool XCHMAIsMCFastCrossedUnderSlow( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XCHMAIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + result = IsCrossUnder( + xCHMAMcFastBuffer, + xCHMAMcSlowBuffer, + bar_index); + + // + return result; +} + +// +// Check MC Fast Under Slow ... +bool XCHMAIsMCFastUnderSlow( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XCHMAIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + result = IsUnder( + xCHMAMcFastBuffer, + xCHMAMcSlowBuffer, + bar_index); + + // + return result; +} + +// +// Short Cycle ... +// + +// +// Check SC is Peak ... +bool XCHMAIsSCPeak() +{ + // + bool result = false; + + // + bool isIncreasing = IsIncreasing( + 10, + 3, + xCHMAScFastBuffer); + + // + bool isDecreasing = IsDecreasing( + 3, + 1, + xCHMAScFastBuffer); + + // + // Generating Result ... + result = + // + isIncreasing + // + && + // + isDecreasing + // + ; + + // + return result; +} + +// +// Check SC is Vale ... +bool XCHMAIsSCVale() +{ + // + bool result = false; + + // + bool isIncreasing = IsIncreasing( + 3, + 1, + xCHMAScFastBuffer); + + // + bool isDecreasing = IsDecreasing( + 10, + 3, + xCHMAScFastBuffer); + + // + // Generating Result ... + result = + // + isIncreasing + // + && + // + isDecreasing + // + ; + + // + return result; +} + +// +// Check SC Fast Crossed Over Slow ... +bool XCHMAIsSCFastCrossedOverSlow( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XCHMAIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + result = IsCrossOver( + xCHMAScFastBuffer, + xCHMAScSlowBuffer, + bar_index); + + // + return result; +} + +// +// Check SC Fast Over Slow ... +bool XCHMAIsSCFastOverSlow( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XCHMAIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + result = IsOver( + xCHMAScFastBuffer, + xCHMAScSlowBuffer, + bar_index); + + // + return result; +} + +// +// Check SC Fast Crossed Under Slow ... +bool XCHMAIsSCFastCrossedUnderSlow( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XCHMAIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + result = IsCrossUnder( + xCHMAScFastBuffer, + xCHMAScSlowBuffer, + bar_index); + + // + return result; +} + +// +// Check SC Fast Under Slow ... +bool XCHMAIsSCFastUnderSlow( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XCHMAIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + result = IsUnder( + xCHMAScFastBuffer, + xCHMAScSlowBuffer, + bar_index); + + // + return result; +} + +// +// Utility Functions ... +// + +// +// Check all Buffers has valid Size ... +bool XCHMAIsValidBuffersSize( + int size // the size of buffers which min size for requirements +) +{ + // + bool result = false; + + // + if ( + size <= 0 || + // + ArraySize(xCHMALcFastBuffer) < size || + ArraySize(xCHMALcSlowBuffer) < size || + // + ArraySize(xCHMAMcFastBuffer) < size || + ArraySize(xCHMAMcSlowBuffer) < size || + // + ArraySize(xCHMAScFastBuffer) < size || + ArraySize(xCHMAScSlowBuffer) < size + // + ) + { + result = false; + } + else + { + result = true; + } + + // + return result; +} + +// +// Get Cycle Fast Length ... +int XCHMAGetCycleFastLength( + ENUM_XCHMA_CYCLES cycle // Specified Cycle +) +{ + // + int result = 0; + + // + switch (cycle) + { + // + case X_XCHMA_CYCLE_LONG: + result = xCHMALcFastLength; + break; + + // + case X_XCHMA_CYCLE_MEDIUM: + result = xCHMAMcFastLength; + break; + + // + case X_XCHMA_CYCLE_SHORT: + result = xCHMAScFastLength; + break; + } + + // + return result; +} + +// +// Get Cycle Slow Length ... +int XCHMAGetCycleSlowLength( + ENUM_XCHMA_CYCLES cycle // Specified Cycle +) +{ + // + int result = 0; + + // + switch (cycle) + { + // + case X_XCHMA_CYCLE_LONG: + result = xCHMALcSlowLength; + break; + + // + case X_XCHMA_CYCLE_MEDIUM: + result = xCHMAMcSlowLength; + break; + + // + case X_XCHMA_CYCLE_SHORT: + result = xCHMAScSlowLength; + break; + } + + // + return result; +} + +// +// Retrieve Cycle Fast Buffer ... +void XCHMAGetCycleFastBuffer( + ENUM_XCHMA_CYCLES cycle, // Specified Cycle + double &result[] // Specified Result buffer to Hold Values ... +) +{ + // + CleanBuffer(result); + ArraySetAsSeries(result, true); + + // + switch (cycle) + { + // + case X_XCHMA_CYCLE_LONG: + // + ArrayCopy( + result, + xCHMALcFastBuffer); + break; + + // + case X_XCHMA_CYCLE_MEDIUM: + // + ArrayCopy( + result, + xCHMAMcFastBuffer); + break; + + // + case X_XCHMA_CYCLE_SHORT: + // + ArrayCopy( + result, + xCHMAScFastBuffer); + break; + } +} + +// +// Retrieve Cycle Fast Buffer ... +void XCHMAGetCycleSlowBuffer( + ENUM_XCHMA_CYCLES cycle, // Specified Cycle + double &result[] // Specified Result buffer to Hold Values ... +) +{ + // + CleanBuffer(result); + ArraySetAsSeries(result, true); + + // + switch (cycle) + { + // + case X_XCHMA_CYCLE_LONG: + // + ArrayCopy( + result, + xCHMALcSlowBuffer); + break; + + // + case X_XCHMA_CYCLE_MEDIUM: + // + ArrayCopy( + result, + xCHMAMcSlowBuffer); + break; + + // + case X_XCHMA_CYCLE_SHORT: + // + ArrayCopy( + result, + xCHMAScSlowBuffer); + break; + } +} + +// +// Check a Cycle is vale ... +bool XCHMAIsCycleVale( + ENUM_XCHMA_CYCLES cycle // Specified Cycle +) +{ + // + bool result = false; + + // + // Retrieve Length ... + int length = XCHMAGetCycleFastLength(cycle); + int halfLength = length / 2; + int thirdLength = length / 3; + int qLength = length / 4; + qLength = qLength < 3 ? 3 : qLength > 7 ? 7 + : qLength; + + // + double buffer[]; + XCHMAGetCycleFastBuffer( + cycle, + buffer); + + // + bool isIncreasing = IsIncreasing( + qLength, + 1, + buffer); + + // + bool isDecreasing = IsDecreasing( + thirdLength, + qLength, + buffer); + + // + // Generating Result ... + result = + // + isIncreasing + // + && + // + isDecreasing + // + ; + + // + return result; +} + +// +// Check a Cycle is peak ... +bool XCHMAIsCyclePeak( + ENUM_XCHMA_CYCLES cycle // Specified Cycle +) +{ + // + bool result = false; + + // + // Retrieve Length ... + int length = XCHMAGetCycleFastLength(cycle); + int halfLength = length / 2; + int thirdLength = length / 3; + int qLength = length / 4; + qLength = qLength < 3 ? 3 : qLength > 7 ? 7 + : qLength; + + // + double buffer[]; + XCHMAGetCycleFastBuffer( + cycle, + buffer); + + // + bool isIncreasing = IsIncreasing( + thirdLength, + qLength, + buffer); + + // + bool isDecreasing = IsDecreasing( + qLength, + 1, + buffer); + + // + // Generating Result ... + result = + // + isIncreasing + // + && + // + isDecreasing + // + ; + + // + return result; +} +// +// END XCHMA Custom Functions ... +// diff --git a/BKPS/OLD/EURUSD-5M-V0.1/MQ5/Libraries/x-saherelm.xobd.oscillator.helper.lib.mq5 b/BKPS/OLD/EURUSD-5M-V0.1/MQ5/Libraries/x-saherelm.xobd.oscillator.helper.lib.mq5 new file mode 100644 index 0000000..75543de --- /dev/null +++ b/BKPS/OLD/EURUSD-5M-V0.1/MQ5/Libraries/x-saherelm.xobd.oscillator.helper.lib.mq5 @@ -0,0 +1,417 @@ +///////////////////////////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 XOBD Oscillator Helper for Signal Providers +// -------------------------------------------------------------------------- +// +// 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 + +// +// Includes ... +#include "..\Libraries\x-saherelm.log.lib.mq5" +#include "..\Libraries\x-saherelm.common.lib.mq5" + +// +// START Enum Definitions ... +// + +// +// XOBD Oscillator Buffer Lines ... +enum ENUM_X_XOBD_BUFFER_LINES +{ + X_XOBD_SWING_HIGH_LINE = 0, + X_XOBD_SWING_LOW_LINE = 1, + X_XOBD_SIGNAL_LINE = 2, +}; + +// +// END Enum Definitions ... +// + +// +// START Inputs ... +// + +input group "XOBD Oscillator"; +input int xOBDLength = 72; // Market Length + +// +// END Inputs ... +// + +// +// START Definitions ... +// + +int xOBDHandler = INVALID_HANDLE; +double xOBDSwingHighBuffer[]; +double xOBDSwingLowBuffer[]; +double xOBDSignalBuffer[]; + +// +// END Definitions ... +// + +// +// START Handler Functions ... +// + +// +// Init Oscillators ... +bool XOBDInitHandlers() +{ + // + bool result = false; + + // + // Initialize Indicator/Oscillator Handlers ... + ResetLastError(); + + // + // XOBD Handler ... + ArraySetAsSeries(xOBDSwingHighBuffer, true); + ArraySetAsSeries(xOBDSwingLowBuffer, true); + ArraySetAsSeries(xOBDSignalBuffer, true); + xOBDHandler = iCustom( + _Symbol, + _Period, + "x-saherelm.xobd.oscillator", + // + // Inputs ... + xOBDLength + // + ); + if (xOBDHandler == INVALID_HANDLE) + { + // + LogMessage("failed to Initialize XOBD Oscillator: " + (string)GetLastError()); + return result; + } + + // + result = true; + + // + return result; +} + +// +// Release Oscillators ... +void XOBDReleaseHandlers() +{ + IndicatorRelease(xOBDHandler); +} + +// +// Handle Reading Buffers ... +void XOBDReadBuffers( + int xOBDItemsPerTick // Number Of Reading Buffer Items Per Tick +) +{ + // XOBD Swing High ... + CopyBuffer( + xOBDHandler, + X_XOBD_SWING_HIGH_LINE, + 0, + xOBDItemsPerTick, + xOBDSwingHighBuffer); + + // + // XOBD Swing Low ... + CopyBuffer( + xOBDHandler, + X_XOBD_SWING_LOW_LINE, + 0, + xOBDItemsPerTick, + xOBDSwingLowBuffer); + + // + // XOBD Signal ... + CopyBuffer( + xOBDHandler, + X_XOBD_SIGNAL_LINE, + 0, + xOBDItemsPerTick, + xOBDSignalBuffer); +} + +// +// END Handler Funcions ... +// + +// +// START Signal Related Conditions ... +// + +// +// XOBD Long Conditions ... +bool XOBDHasLongConditions( + int xOBDItemsPerTick // Number Of Reading Buffer Items Per Tick +) +{ + // + bool result = false; + + // + bool isVale = XOBDIsVale(); + bool isInPeak = IsInPeak( + xOBDItemsPerTick, + xOBDSignalBuffer); + + // + result = + // + isVale + // + && + // + !isInPeak + // + ; + + // + return result; +} + +// +// XOBD Short Conditions ... +bool XOBDHasShortConditions( + int xOBDItemsPerTick // Number Of Reading Buffer Items Per Tick +) +{ + // + bool result = false; + + // + return result; +} + +// +// END Signal Related Conditions ... +// + +// +// START XOBD Custom Functions ... +// + +// +// Check all Buffers has valid Size ... +bool XOBDIsValidBuffersSize( + int size // the size of buffers which min size for requirements +) +{ + // + bool result = false; + + // + if ( + size <= 0 || + // + ArraySize(xOBDSignalBuffer) < size || + ArraySize(xOBDSwingLowBuffer) < size || + ArraySize(xOBDSwingHighBuffer) < size + // + ) + { + result = false; + } + else + { + result = true; + } + + // + return result; +} + +// +// Check SC is Peak ... +bool XOBDIsPeak() +{ + // + bool result = false; + + // + bool isIncreasing = IsIncreasing( + 10, + 3, + xOBDSignalBuffer); + + // + bool isDecreasing = IsDecreasing( + 3, + 1, + xOBDSignalBuffer); + + // + // Generating Result ... + result = + // + isIncreasing + // + && + // + isDecreasing + // + ; + + // + return result; +} + +// +// Check SC is Vale ... +bool XOBDIsVale() +{ + // + bool result = false; + + // + bool isIncreasing = IsIncreasing( + 5, + 1, + xOBDSignalBuffer); + + // + bool isDecreasing = IsDecreasing( + 20, + 5, + xOBDSignalBuffer); + + // + // Generating Result ... + result = + // + isIncreasing + // + && + // + isDecreasing + // + ; + + // + return result; +} + +// +// Check Signal Crossed Over Swing High ... +bool XOBDIsSignalCrossedOverSwingHigh( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XOBDIsValidBuffersSize(bar_index + 2)) + { + return result; + } + + // + result = IsCrossOver( + xOBDSignalBuffer, + xOBDSwingHighBuffer, + bar_index); + + // + return result; +} + +// +// Check Signal Over Swing High ... +bool XOBDIsSignalOverSwingHigh( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XOBDIsValidBuffersSize(bar_index + 2)) + { + return result; + } + + // + result = IsOver( + xOBDSignalBuffer, + xOBDSwingHighBuffer, + bar_index); + + // + return result; +} + +// +// Check Signal Crossed Under Swing High ... +bool XOBDIsSignalCrossedUnderSwingHigh( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XOBDIsValidBuffersSize(bar_index + 2)) + { + return result; + } + + // + result = IsCrossUnder( + xOBDSignalBuffer, + xOBDSwingHighBuffer, + bar_index); + + // + return result; +} + +// +// Check Signal Under Swing High ... +bool XOBDIsSignalUnderSwingHigh( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XOBDIsValidBuffersSize(bar_index + 2)) + { + return result; + } + + // + result = IsUnder( + xOBDSignalBuffer, + xOBDSwingHighBuffer, + bar_index); + + // + return result; +} + +// +// END XOBD Custom Functions ... +// diff --git a/BKPS/OLD/EURUSD-5M-V0.1/MQ5/Libraries/x-saherelm.xrsi.oscillator.helper.lib.mq5 b/BKPS/OLD/EURUSD-5M-V0.1/MQ5/Libraries/x-saherelm.xrsi.oscillator.helper.lib.mq5 new file mode 100644 index 0000000..c1eb3f2 --- /dev/null +++ b/BKPS/OLD/EURUSD-5M-V0.1/MQ5/Libraries/x-saherelm.xrsi.oscillator.helper.lib.mq5 @@ -0,0 +1,424 @@ +///////////////////////////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 XRSI Oscillator Helper for Signal Providers +// -------------------------------------------------------------------------- +// +// 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 + +// +// Includes ... +#include "..\Libraries\x-saherelm.log.lib.mq5" +#include "..\Libraries\x-saherelm.common.lib.mq5" + +// +// START Enum Definitions ... +// + +// +// XRSI Oscillator Buffer Lines ... +// + +// +// END Enum Definitions ... +// + +// +// START Inputs ... +// + +input group "XRSI Oscillator"; + +// +input group "XRSI Market"; +input int xRSILength = 14; // Market Length +input ENUM_APPLIED_PRICE xRSIAppliedTo = PRICE_CLOSE; // Applied To + +// +input group "XRSI Short Entry"; +input double xRSIShortEntryValue = 70; // Short Entry Level +input color xRSIShortEntryColor = clrRed; // Short Entry Level Color +input ENUM_LINE_STYLE xRSIShortEntryLineStyle = STYLE_SOLID; // Short Entry Style + +// +input group "XRSI Short Exit"; +input double xRSIShortExitValue = 40; // Short Exit Level +input color xRSIShortExitColor = clrFuchsia; // Short Exit Level Color +input ENUM_LINE_STYLE xRSIShortExitLineStyle = STYLE_DOT; // Short Exit Style + +// +input group "XRSI Long Entry"; +input double xRSILongEntryValue = 30; // Long Entry Level +input color xRSILongEntryColor = clrGreen; // Long Entry Level Color +input ENUM_LINE_STYLE xRSILongEntryLineStyle = STYLE_SOLID; // Long Entry Style + +// +input group "XRSI Long Exit"; +input double xRSILongExitValue = 60; // Long Exit Level +input color xRSILongExitColor = clrAqua; // Long Exit Level Color +input ENUM_LINE_STYLE xRSILongExitLineStyle = STYLE_DOT; // Long Exit Style + +// +// END Inputs ... +// + +// +// START Definitions ... +// + +int xRSIHandler = INVALID_HANDLE; +double xRSIBuffer[]; + +// +// END Definitions ... +// + +// +// START Handler Functions ... +// + +// +// Init Oscillators ... +bool XRSIInitHandlers() +{ + // + bool result = false; + + // + // Initialize Indicator/Oscillator Handlers ... + ResetLastError(); + + // + // XRSI Handler ... + ArraySetAsSeries(xRSIBuffer, true); + xRSIHandler = iCustom( + _Symbol, + _Period, + "x-saherelm.xrsi.oscillator", + // + // Inputs ... + // + // Market ... + "", + xRSILength, + xRSIAppliedTo, + // + // Short Entry ... + "", + xRSIShortEntryValue, + xRSIShortEntryColor, + xRSIShortEntryLineStyle, + // + // Short Exit ... + "", + xRSIShortExitValue, + xRSIShortExitColor, + xRSIShortExitLineStyle, + // + // Long Entry ... + "", + xRSILongEntryValue, + xRSILongEntryColor, + xRSILongEntryLineStyle, + // + // Long Exit ... + "", + xRSILongExitValue, + xRSILongExitColor, + xRSILongExitLineStyle + // + ); + if (xRSIHandler == INVALID_HANDLE) + { + // + LogMessage("failed to Initialize XRSI Oscillator: " + (string)GetLastError()); + return result; + } + + // + result = true; + + // + return result; +} + +// +// Release Oscillators ... +void XRSIReleaseHandlers() +{ + IndicatorRelease(xRSIHandler); +} + +// +// Handle Reading Buffers ... +void XRSIReadBuffers( + int xRSIItemsPerTick // Number Of Reading Buffer Items Per Tick +) +{ + // + // XRSI Signal ... + CopyBuffer( + xRSIHandler, + 0, + 0, + xRSIItemsPerTick, + xRSIBuffer); +} + +// +// END Handler Funcions ... +// + +// +// START Signal Related Conditions ... +// + +// +// XRSI Long Conditions ... +bool XRSIHasLongConditions( + int xRSIItemsPerTick // Number Of Reading Buffer Items Per Tick +) +{ + // + bool result = false; + + // + return result; +} + +// +// XRSI Short Conditions ... +bool XRSIHasShortConditions( + int xRSIItemsPerTick // Number Of Reading Buffer Items Per Tick +) +{ + // + bool result = false; + + // + return result; +} + +// +// END Signal Related Conditions ... +// + +// +// START XRSI Custom Functions ... +// + +// +// Check SC is Peak ... +bool XRSIIsPeak() +{ + // + bool result = false; + + // + bool isIncreasing = IsIncreasing( + 11, + 3, + xRSIBuffer); + + // + bool isDecreasing = IsDecreasing( + 3, + 1, + xRSIBuffer); + + // + // Generating Result ... + result = + // + isIncreasing + // + && + // + isDecreasing + // + ; + + // + return result; +} + +// +// Check SC is Vale ... +bool XRSIIsVale() +{ + // + bool result = false; + + // + bool isIncreasing = IsIncreasing( + 3, + 1, + xRSIBuffer); + + // + bool isDecreasing = IsDecreasing( + 11, + 3, + xRSIBuffer); + + // + // Generating Result ... + result = + // + isIncreasing + // + && + // + isDecreasing + // + ; + + // + return result; +} + +// +// RSI Value GO Up from Long Entry ... +bool XRSIIsCrossedOverLongEntry( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XRSIIsValidBuffersSize(bar_index + 2)) + { + return result; + } + + // + result = + xRSIBuffer[bar_index + 1] > xRSILongEntryValue && + xRSIBuffer[bar_index + 2] <= xRSILongEntryValue; + + // + return result; +} + +// +// RSI Value GO Up from Long Exit ... +bool XRSIIsCrossedOverLongExit( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XRSIIsValidBuffersSize(bar_index + 2)) + { + return result; + } + + // + result = + xRSIBuffer[bar_index + 1] > xRSILongExitValue && + xRSIBuffer[bar_index + 2] <= xRSILongExitValue; + + // + return result; +} + +// +// RSI Value Go Down Short Entry ... +bool XRSIIsCrossedUnderShortEntry( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XRSIIsValidBuffersSize(bar_index + 2)) + { + return result; + } + + // + result = + xRSIBuffer[bar_index + 1] < xRSIShortEntryValue && + xRSIBuffer[bar_index + 2] >= xRSIShortEntryValue; + + // + return result; +} + +// +// RSI Value Go Down Short Exit ... +bool XRSIIsCrossedUnderShortExit( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XRSIIsValidBuffersSize(bar_index + 2)) + { + return result; + } + + // + result = + xRSIBuffer[bar_index + 1] < xRSIShortExitValue && + xRSIBuffer[bar_index + 2] >= xRSIShortExitValue; + + // + return result; +} + +// +// Check all Buffers has valid Size ... +bool XRSIIsValidBuffersSize( + int size // the size of buffers which min size for requirements +) +{ + // + bool result = false; + + // + if ( + size <= 0 || + // + ArraySize(xRSIBuffer) < size + // + ) + { + result = false; + } + else + { + result = true; + } + + // + return result; +} + +// +// END XRSI Custom Functions ... +// diff --git a/BKPS/OLD/EURUSD-5M-V0.1/MQ5/Libraries/x-saherelm.xtd.oscillator.helper.lib.mq5 b/BKPS/OLD/EURUSD-5M-V0.1/MQ5/Libraries/x-saherelm.xtd.oscillator.helper.lib.mq5 new file mode 100644 index 0000000..ba6d60b --- /dev/null +++ b/BKPS/OLD/EURUSD-5M-V0.1/MQ5/Libraries/x-saherelm.xtd.oscillator.helper.lib.mq5 @@ -0,0 +1,917 @@ +///////////////////////////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 XTD Oscillator Helper for Signal Providers +// -------------------------------------------------------------------------- +// +// 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 + +// +// Includes ... +#include "..\Libraries\x-saherelm.log.lib.mq5" +#include "..\Libraries\x-saherelm.common.lib.mq5" + +// +// START Enum Definitions ... +// + +// +// XTD Oscillator States ... +enum ENUM_X_XTD_STATES +{ + X_XTD_BULLISH_CROSSED_OVER_BEARISH = 2, + X_XTD_BULLISH_OVER_BEARISH = 1, + X_XTD_NEUTURAL = 0, + X_XTD_BULLISH_UNDER_BEARISH = -1, + X_XTD_BULLISH_CROSSED_UNDER_BEARISH = -2 +}; + +// +// XTD Oscillator Buffer Lines ... +enum ENUM_X_XTD_BUFFER_LINES +{ + X_XTD_BULLISH_POWER_LINE = 0, + X_XTD_BEARISH_POWER_LINE = 1, + X_XTD_SIGNAL_LINE = 2, +}; + +// +// END Enum Definitions ... +// + +// +// START Inputs ... +// + +input group "XTD Oscillator"; +input int xTDLength = 14; // Market Length +input bool xTDDrawCrosses = false; // Draw Cross Arrows +input uchar xTDBullishArrowCode = 228; // Cross Over Arrow Code +input color xTDBullishArrowColor = clrAqua; // Cross Over Arrow Color +input uchar xTDBearishArrowCode = 230; // Cross Under Arrow Code +input color xTDBearishArrowColor = clrMagenta; // Cross Under Arrow Color + +// +// END Inputs ... +// + +// +// START Definitions ... +// + +int xTDHandler = INVALID_HANDLE; +double xTDBullishBuffer[]; +double xTDBearishBuffer[]; +double xTDSignalBuffer[]; +// +// END Definitions ... +// + +// +// START Handler Functions ... +// + +// +// Init Oscillators ... +bool XTDInitHandlers() +{ + // + bool result = false; + + // + // Initialize Indicator/Oscillator Handlers ... + ResetLastError(); + + // + // XTD Handler ... + ArraySetAsSeries(xTDBullishBuffer, true); + ArraySetAsSeries(xTDBearishBuffer, true); + ArraySetAsSeries(xTDSignalBuffer, true); + xTDHandler = iCustom( + _Symbol, + _Period, + "x-saherelm.xtd.oscillator", + // + // Inputs ... + xTDLength, + xTDDrawCrosses, + xTDBullishArrowCode, + xTDBullishArrowColor, + xTDBearishArrowCode, + xTDBearishArrowColor); + if (xTDHandler == INVALID_HANDLE) + { + // + LogMessage("failed to Initialize XTD Oscillator: " + (string)GetLastError()); + return result; + } + + // + result = true; + + // + return result; +} + +// +// Release Oscillators ... +void XTDReleaseHandlers() +{ + IndicatorRelease(xTDHandler); +} + +// +// Handle Reading Buffers ... +void XTDReadBuffers( + int xTDItemsPerTick // Number Of Reading Buffer Items Per Tick +) +{ + // + // XTD Bullish Buffer ... + CopyBuffer( + xTDHandler, + X_XTD_BULLISH_POWER_LINE, + 0, + xTDItemsPerTick, + xTDBullishBuffer); + + // + // XTD Bullish Buffer ... + CopyBuffer( + xTDHandler, + X_XTD_BEARISH_POWER_LINE, + 0, + xTDItemsPerTick, + xTDBearishBuffer); + + // + // XTD Signal Buffer ... + CopyBuffer( + xTDHandler, + X_XTD_SIGNAL_LINE, + 0, + xTDItemsPerTick, + xTDSignalBuffer); +} + +// +// END Handler Funcions ... +// + +// +// START Signal Related Conditions ... +// + +// +// XTD Long Conditions ... +bool XTDHasLongConditions( + int xTDItemsPerTick // Number Of Reading Buffer Items Per Tick +) +{ + // + bool result = false; + + // + bool isVale = XTDIsSignalVale(); + + // + bool isInPeak = IsInPeak( + 15, + xTDSignalBuffer); + + // + bool isSharpChanged = IsSharpChanged( + 15, + 1, + xTDSignalBuffer); + + // + double entry = GetEntry(X_SIGNAL_LONG); + double maxPrice = GetHighestHigh( + 7, + 0); + double minPrice = GetLowestLow( + 7, + 0); + double priceDelta = maxPrice - minPrice; + double priceStep = priceDelta / 7; + + // + bool isPricePassed = + entry < maxPrice && + maxPrice - entry < (priceDelta / 4) * 3; + + // + result = + // + isVale + // + && + // + !isInPeak + // + && + // + !isSharpChanged + // + && + // + isPricePassed + // + ; + + // + return result; +} + +// +// XTD Short Conditions ... +bool XTDHasShortConditions( + int xTDItemsPerTick // Number Of Reading Buffer Items Per Tick +) +{ + // + bool result = false; + + // + bool isPeak = XTDIsSignalPeak(); + + // + bool isInVale = IsInVale( + 15, + xTDSignalBuffer); + + // + bool isSharpChanged = IsSharpChanged( + 15, + 1, + xTDSignalBuffer); + + // + double entry = GetEntry(X_SIGNAL_SHORT); + double maxPrice = GetHighestHigh( + 7, + 0); + double minPrice = GetLowestLow( + 7, + 0); + double priceDelta = maxPrice - minPrice; + double priceStep = priceDelta / 7; + + // + bool isPricePassed = + entry > minPrice && + minPrice + entry > (priceDelta / 4); + + // + result = + // + isPeak + // + && + // + !isInVale + // + && + // + !isSharpChanged + // + && + // + isPricePassed + // + ; + + // + return result; +} + +// +// END Signal Related Conditions ... +// + +// +// START XTD Custom Functions ... +// + +// +// Check Signal Vale ... +bool XTDIsSignalVale() +{ + // + bool result = false; + + // + // Must Decreasing ... + bool isIncreasing = IsIncreasing( + 3, + 1, + xTDSignalBuffer); + + // + // Must Increasing ... + bool isDecreasing = IsDecreasing( + 15, + 3, + xTDSignalBuffer); + + // + // Generating Result ... + result = + // + isIncreasing + // + && + // + isDecreasing + // + ; + + // + return result; +} + +// +// Check Signal Peak ... +bool XTDIsSignalPeak() +{ + // + bool result = false; + + // + // Must Decreasing ... + bool isIncreasing = IsIncreasing( + 15, + 3, + xTDSignalBuffer); + + // + // Must Increasing ... + bool isDecreasing = IsDecreasing( + 3, + 1, + xTDSignalBuffer); + + // + // Generating Result ... + result = + // + isIncreasing + // + && + // + isDecreasing + // + ; + + // + return result; +} + +// +// Check Signal Peak ... + +// +// Check Bullish Crossed Over Bearish ... +bool XTDIsBullCrossedOverBear( + int bar_index // Specified Bar Index +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XTDIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + result = IsCrossOver( + xTDBullishBuffer, + xTDBearishBuffer, + 1); + + // + return result; +} + +// +// Check Bullish Over Bearish ... +bool XTDIsBullOverBear( + int bar_index // Specified Bar Index +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XTDIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + result = IsOver( + xTDBullishBuffer, + xTDBearishBuffer, + 1); + + // + return result; +} + +// +// Check Bullish Crossed Under Bearish ... +bool XTDIsBullCrossedUnderBear( + int bar_index // Specified Bar Index +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XTDIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + result = IsCrossUnder( + xTDBullishBuffer, + xTDBearishBuffer, + 1); + + // + return result; +} + +// +// Check Bullish Under Bearish ... +bool XTDIsBullUnderBear( + int bar_index // Specified Bar Index +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XTDIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + result = IsUnder( + xTDBullishBuffer, + xTDBearishBuffer, + 1); + + // + return result; +} + +// +// Check Signal Crossed Over Bearish ... +bool XTDIsSignalCrossedOverBear( + int bar_index // Specified Bar Index +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XTDIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + result = IsCrossOver( + xTDSignalBuffer, + xTDBearishBuffer, + 1); + + // + return result; +} + +// +// Check Signal Over Bearish ... +bool XTDIsSignalOverBear( + int bar_index // Specified Bar Index +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XTDIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + result = IsOver( + xTDSignalBuffer, + xTDBearishBuffer, + 1); + + // + return result; +} + +// +// Check Signal Crossed Under Bearish ... +bool XTDIsSignalCrossedUnderBear( + int bar_index // Specified Bar Index +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XTDIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + result = IsCrossUnder( + xTDSignalBuffer, + xTDBearishBuffer, + 1); + + // + return result; +} + +// +// Check Signal Under Bearish ... +bool XTDIsSignalUnderBear( + int bar_index // Specified Bar Index +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XTDIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + result = IsUnder( + xTDSignalBuffer, + xTDBearishBuffer, + 1); + + // + return result; +} + +// +// Check all Buffers has valid Size ... +bool XTDIsValidBuffersSize( + int size // the size of buffers which min size for requirements +) +{ + // + bool result = false; + + // + if ( + size <= 0 || + ArraySize(xTDBullishBuffer) < size || + ArraySize(xTDBullishBuffer) < size || + ArraySize(xTDSignalBuffer) < size) + { + result = false; + } + else + { + result = true; + } + + // + return result; +} + +// +// Count Signal Crossed Over Bear ... +int XTDCountSignalCrossedOverBearIndex( + int bar_index // Specified Bar Index +) +{ + // + int result = 0; + + // + int count = ArraySize(xTDSignalBuffer) - 1; + if ( + bar_index <= 0 || + count <= bar_index + 1) + { + return result; + } + + // + // Loop Through ... + for (int i = bar_index + 1; i < count && result == -1; i++) + { + // + // Check Cross On i Point ... + bool isCrossedOnI = XTDIsSignalCrossedOverBear(i); + if (isCrossedOnI) + { + result++; + } + } + + // + return result; +} + +// +// Count Signal Crossed Under Bear ... +int XTDCountSignalCrossedUnderBearIndex( + int bar_index // Specified Bar Index +) +{ + // + int result = 0; + + // + int count = ArraySize(xTDSignalBuffer) - 1; + if ( + bar_index <= 0 || + count <= bar_index + 1) + { + return result; + } + + // + // Loop Through ... + for (int i = bar_index + 1; i < count && result == -1; i++) + { + // + // Check Cross On i Point ... + bool isCrossedOnI = XTDIsSignalCrossedUnderBear(i); + if (isCrossedOnI) + { + result++; + } + } + + // + return result; +} + +// +// Count Bull Crossed Over Bear ... +int XTDCountBullCrossedOverBearIndex( + int bar_index // Specified Bar Index +) +{ + // + int result = 0; + + // + int count = ArraySize(xTDSignalBuffer) - 1; + if ( + bar_index <= 0 || + count <= bar_index + 1) + { + return result; + } + + // + // Loop Through ... + for (int i = bar_index + 1; i < count && result == -1; i++) + { + // + // Check Cross On i Point ... + bool isCrossedOnI = XTDIsBullCrossedOverBear(i); + if (isCrossedOnI) + { + result++; + } + } + + // + return result; +} + +// +// Count Bull Crossed Under Bear ... +int XTDCountBullCrossedUnderBearIndex( + int bar_index // Specified Bar Index +) +{ + // + int result = 0; + + // + int count = ArraySize(xTDSignalBuffer) - 1; + if ( + bar_index <= 0 || + count <= bar_index + 1) + { + return result; + } + + // + // Loop Through ... + for (int i = bar_index + 1; i < count && result == -1; i++) + { + // + // Check Cross On i Point ... + bool isCrossedOnI = XTDIsBullCrossedUnderBear(i); + if (isCrossedOnI) + { + result++; + } + } + + // + return result; +} + +// +// Find Last Signal Crossed Over Bear ... +int XTDFindLastSignalCrossedOverBearIndex( + int bar_index // Specified Bar Index +) +{ + // + int result = -1; + + // + int count = ArraySize(xTDSignalBuffer) - 1; + if ( + bar_index <= 0 || + count <= bar_index + 1) + { + return result; + } + + // + // Loop Through ... + for (int i = bar_index + 1; i < count && result == -1; i++) + { + // + // Check Cross On i Point ... + bool isCrossedOnI = XTDIsSignalCrossedOverBear(i); + if (isCrossedOnI) + { + // + result = i; + break; + } + } + + // + return result; +} + +// +// Find Last Signal Crossed Onder Bear ... +int XTDFindLastSignalCrossedUnderBearIndex( + int bar_index // Specified Bar Index +) +{ + // + int result = -1; + + // + int count = ArraySize(xTDSignalBuffer) - 1; + if ( + bar_index <= 0 || + count <= bar_index + 1) + { + return result; + } + + // + // Loop Through ... + for (int i = bar_index + 1; i < count && result == -1; i++) + { + // + // Check Cross On i Point ... + bool isCrossedOnI = XTDIsSignalCrossedUnderBear(i); + if (isCrossedOnI) + { + // + result = i; + break; + } + } + + // + return result; +} + +// +// Find Last Bull Crossed Over Bear ... +int XTDFindLastBullCrossedOverBearIndex( + int bar_index // Specified Bar Index +) +{ + // + int result = -1; + + // + int count = ArraySize(xTDSignalBuffer) - 1; + if ( + bar_index <= 0 || + count <= bar_index + 1) + { + return result; + } + + // + // Loop Through ... + for (int i = bar_index + 1; i < count && result == -1; i++) + { + // + // Check Cross On i Point ... + bool isCrossedOnI = XTDIsBullCrossedOverBear(i); + if (isCrossedOnI) + { + // + result = i; + break; + } + } + + // + return result; +} + +// +// Find Last Bull Crossed Under Bear ... +int XTDFindLastBullCrossedUnderBearIndex( + int bar_index // Specified Bar Index +) +{ + // + int result = -1; + + // + int count = ArraySize(xTDSignalBuffer) - 1; + if ( + bar_index <= 0 || + count <= bar_index + 1) + { + return result; + } + + // + // Loop Through ... + for (int i = bar_index + 1; i < count && result == -1; i++) + { + // + // Check Cross On i Point ... + bool isCrossedOnI = XTDIsBullCrossedUnderBear(i); + if (isCrossedOnI) + { + // + result = i; + break; + } + } + + // + return result; +} + +// +// END XTD Custom Functions ... +// diff --git a/BKPS/OLD/EURUSD-5M-V0.1/MQ5/Libraries/x-saherelm.xtest.provider.indicators.lib.mq5 b/BKPS/OLD/EURUSD-5M-V0.1/MQ5/Libraries/x-saherelm.xtest.provider.indicators.lib.mq5 new file mode 100644 index 0000000..7e3ec99 --- /dev/null +++ b/BKPS/OLD/EURUSD-5M-V0.1/MQ5/Libraries/x-saherelm.xtest.provider.indicators.lib.mq5 @@ -0,0 +1,2316 @@ +/////////////////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 XTEST Signal Provider Indicators Library +// ---------------------------------------------------------------- +// +// 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 Provider Inputs ... +#include "x-saherelm.xtest.provider.inputs.lib.mq5"; + +// +// START Define Enums ... +// + +// +// Represent Signals Methods ... +enum ENUM_X_SIGNAL_METHODS +{ + X_SIGNAL_METHOD_1, + X_SIGNAL_METHOD_2, + X_SIGNAL_METHOD_3, +}; + +// +// Represent Market Conditions ... +struct X_TEST_MARKET_CONDITIONS +{ + // + // XTM ... + bool isXTMPeak; + bool isXTMVale; + + // + // XTD ... + bool isXTDSignalPeak; + bool isXTDSignalVale; + bool isXTDSignalOverBear; + bool isXTDSignalUnderBear; + bool isXTDSignalCrossedOverBear; + bool isXTDSignalCrossedUnderBear; + + // + // XRSI ... + bool isXRSIPeak; + bool isXRSIVale; + bool isXRSICrossedOverLongExit; + bool isXRSICrossedOverLongEntry; + bool isXRSICrossedUnderShortExit; + bool isXRSICrossedUnderShortEntry; + + // + // XOBD ... + bool isXOBDPeak; + bool isXOBDVale; + bool isXOBDSignalOverSwingHigh; + bool isXOBDSignalUnderSwingHigh; + bool isXOBDSignalCrossedOverSwingHigh; + bool isXOBDSignalCrossedUnderSwingHigh; + + // + // XCHLH ... + // + bool isXCHLHSignalBOverSignalT; + bool isXCHLHSignalBUnderSignalT; + bool isXCHLHSignalBCrossedOverSignalT; + bool isXCHLHSignalBCrossedUnderSignalT; + // + bool isXCHLHSignalBOverLCLL; + bool isXCHLHSignalBUnderLCLL; + bool isXCHLHSignalBCrossedOverLCLL; + bool isXCHLHSignalBCrossedUnderLCLL; + // + bool isXCHLHSCMCHHSame; + bool isXCHLHSCMCLLSame; + // + bool isXCHLHSCLCHHSame; + bool isXCHLHSCLCLLSame; + // + bool isXCHLHMCLCHHSame; + bool isXCHLHMCLCLLSame; + + // + // XCHMA ... + // + bool isXCHMASCPeak; + bool isXCHMASCVale; + bool isXCHMASCFastOverSlow; + bool isXCHMASCFastUnderSlow; + bool isXCHMASCFastCrossedOverSlow; + bool isXCHMASCFastCrossedUnderSlow; + // + bool isXCHMAMCPeak; + bool isXCHMAMCVale; + bool isXCHMAMCFastOverSlow; + bool isXCHMAMCFastUnderSlow; + bool isXCHMAMCFastCrossedOverSlow; + bool isXCHMAMCFastCrossedUnderSlow; + // + bool isXCHMALCPeak; + bool isXCHMALCVale; + bool isXCHMALCFastOverSlow; + bool isXCHMALCFastUnderSlow; + bool isXCHMALCFastCrossedOverSlow; + bool isXCHMALCFastCrossedUnderSlow; +}; + +// +// END Define Enums ... +// + +// +// Imports all Indicators Helper here ... +input group "XTEST Provider Indicators"; +// +#include "x-saherelm.xtm.indicator.helper.lib.mq5"; +#include "x-saherelm.xtd.oscillator.helper.lib.mq5"; +#include "x-saherelm.xrsi.oscillator.helper.lib.mq5"; +#include "x-saherelm.xobd.oscillator.helper.lib.mq5"; +#include "x-saherelm.xchlh.oscillator.helper.lib.mq5"; +#include "x-saherelm.xchma.oscillator.helper.lib.mq5"; + +// +int xTESTMaxLengthOfInputs = 0; +int xTESTCalculatedBars = 0; + +// +// Here we Define some Global Market Variables to Analyse MArket Conditions +// using them at each time ... +X_TEST_MARKET_CONDITIONS conditions = {}; + +// +// Init Indicators ... +bool XTESTInitIndicators() +{ + // + bool result = false; + + // + // Check and Calculate Max Length in Inputs ... + // + + // + // XTM ... + xTESTMaxLengthOfInputs = MathMax( + xTMMaPeriod, + xTESTNumberOfItemsPerTick); + + // + // XTD ... + xTESTMaxLengthOfInputs = MathMax( + xTDLength, + xTESTMaxLengthOfInputs); + + // + // XRSI ... + xTESTMaxLengthOfInputs = MathMax( + xRSILength, + xTESTMaxLengthOfInputs); + + // + // XOBD ... + xTESTMaxLengthOfInputs = MathMax( + xOBDLength, + xTESTMaxLengthOfInputs); + + // + // XCHLH ... + xTESTMaxLengthOfInputs = MathMax( + xCHLHLcLength, + xTESTMaxLengthOfInputs); + xTESTMaxLengthOfInputs = MathMax( + xCHLHMcLength, + xTESTMaxLengthOfInputs); + xTESTMaxLengthOfInputs = MathMax( + xCHLHScLength, + xTESTMaxLengthOfInputs); + + // + // XCHMA ... + xTESTMaxLengthOfInputs = MathMax( + xCHMAScFastLength, + xTESTMaxLengthOfInputs); + xTESTMaxLengthOfInputs = MathMax( + xCHMAScSlowLength, + xTESTMaxLengthOfInputs); + xTESTMaxLengthOfInputs = MathMax( + xCHMAMcFastLength, + xTESTMaxLengthOfInputs); + xTESTMaxLengthOfInputs = MathMax( + xCHMAMcSlowLength, + xTESTMaxLengthOfInputs); + xTESTMaxLengthOfInputs = MathMax( + xCHMALcFastLength, + xTESTMaxLengthOfInputs); + xTESTMaxLengthOfInputs = MathMax( + xCHMALcSlowLength, + xTESTMaxLengthOfInputs); + + // + // Initialize Indicator/Oscillator Handlers ... + ResetLastError(); + + // + // XTM Init ... + result = XTMInitHandlers(); + if (!result) + { + return result; + } + + // + // XTD Init ... + result = XTDInitHandlers(); + if (!result) + { + return result; + } + + // + // XRSI Init ... + result = XRSIInitHandlers(); + if (!result) + { + return result; + } + + // + // XOBD Init ... + result = XOBDInitHandlers(); + if (!result) + { + return result; + } + + // + // XCLH Init ... + result = XCHLHInitHandlers(); + if (!result) + { + return result; + } + + // + // XCHMA Init ... + result = XCHMAInitHandlers(); + if (!result) + { + return result; + } + + // + result = true; + + // + return result; +} + +// +// Release Indicators ... +void XTESTReleaseIndicators() +{ + // + // Release Handlers ... + XTMReleaseHandlers(); + XTDReleaseHandlers(); + XRSIReleaseHandlers(); + XOBDReleaseHandlers(); + XCHMAReleaseHandlers(); + XCHLHReleaseHandlers(); +} + +// +// Handle Reading Buffers ... +void XTESTHandleReadingBuffers() +{ + // + // Reading Calculated Bars for a Simple Handler ... + xTESTCalculatedBars = BarsCalculated(xTMHandler); + + // + // Read Indicators Buffers ... + XTMReadBuffers(xTESTNumberOfItemsPerTick); + XTDReadBuffers(xTESTNumberOfItemsPerTick); + XRSIReadBuffers(xTESTNumberOfItemsPerTick); + XOBDReadBuffers(xTESTNumberOfItemsPerTick); + XCHMAReadBuffers(xTESTNumberOfItemsPerTick); + XCHLHReadBuffers(xTESTNumberOfItemsPerTick); + + // + XTESTReadConditions(); +} + +// +// +// START Combination Functions ... +// +// + +// +// Can Open Long Trade ... +// this is a Function will Check all market Conditions and get all +// Strategy requirement Verifications for Long Signals ... +bool XTESTCanOpenLongTrade( + double &providedSignals // Recieve Which Number of Providers has Conditions here, used for Volume Increasing +) +{ + // + bool result = false; + + // + bool hasSignal = XTESTHasLongSignal(providedSignals); + + // + result = + // + hasSignal + // + ; + + // + // TODO: Remove this On Production ... + if (result) + { + // + string message = XTESTGetConditionsString("\n"); + + // + XTESTClearConditions(); + + // + if (StringFind(message, "true") >= 0) + { + LogMessage(message); + } + } + + // + return result; +} + +// +// Can Close Long Trade ... +// this is a Function will Check all market Conditions and get all +// Strategy requirement Verifications for Long Signals ... +bool XTESTCanCloseLongTrade() +{ + // + bool result = false; + + // + // TODO: Check Market Conditions for Close Long Trades ... + // result = isXCHMASCFastCrossedUnderMax; + + // + return result; +} + +// +// Can Open Short Trade ... +// this is a Function will Check all market Conditions and get all +// Strategy requirement Verifications for Short Signals ... +bool XTESTCanOpenShortTrade( + double &providedSignals // Recieve Which Number of Providers has Conditions here, used for Volume Increasing +) +{ + // + bool result = false; + + // + bool hasSignal = XTESTHasShortSignal(providedSignals); + + // + result = + // + hasSignal + // + ; + + // + // TODO: Remove this On Production ... + if (result) + { + // + string message = XTESTGetConditionsString("\n"); + + // + XTESTClearConditions(); + + // + if (StringFind(message, "true") >= 0) + { + LogMessage(message); + } + } + + // + return result; +} + +// +// Can Close Short Trade ... +// this is a Function will Check all market Conditions and get all +// Strategy requirement Verifications for Short Signals ... +bool XTESTCanCloseShortTrade() +{ + // + bool result = false; + + // + // TODO: Check Market Conditions for Close Short Trades ... + // result = XTESTHasShortCloseConditions(xTESTNumberOfItemsPerTick); + + // + return result; +} + +// +// +// END Combination Functions ... +// +// + +// +// +// START Combination Signaling ... +// +// + +// +// TODO: Works i Had To Do: +// +// - [] Test All Strategies in All Available Brokers; +// - [] Find a Good Age for Closing Long Time Trades; +// - [] Find a Good Value for Closing Max DrawDown Equity Trades; +// - [] For All Strategies, Find Desired Long/Short Exit Points; +// - [] Find a Combination Point for Close All Trades; +// - [x] Try to Increase Trade Volume on Giving Multiple Signals at Same Time; +// - [] Prepare Signal and Event Alerts and Test Them for Production Environment; +// - [] Add SUpport for Daily and Hourly Alerts and also Make Report of Account State in Start Of Each Day; +// - [] Test All Methods for Find other Assets to Trade On them; +// - [] Do R&D about Multi Asset Trading in MT5; +// - [] Test Other Indicators/Oscillators or Exists Examples to Check and Found Market Conditions; +// + +// +// Read All Globally Required Conditions ... +void XTESTReadConditions() +{ + // + XTESTClearConditions(); + + // + // XTM ... + conditions.isXTMPeak = XTMIsPeak(); + conditions.isXTMVale = XTMIsVale(); + + // + // XTD ... + conditions.isXTDSignalPeak = XTDIsSignalPeak(); + conditions.isXTDSignalVale = XTDIsSignalVale(); + conditions.isXTDSignalOverBear = XTDIsSignalOverBear(1); + conditions.isXTDSignalUnderBear = XTDIsSignalUnderBear(1); + conditions.isXTDSignalCrossedOverBear = XTDIsSignalCrossedOverBear(1); + conditions.isXTDSignalCrossedUnderBear = XTDIsSignalCrossedUnderBear(1); + + // + // XRSI ... + conditions.isXRSIPeak = XRSIIsPeak(); + conditions.isXRSIVale = XRSIIsVale(); + conditions.isXRSICrossedOverLongExit = XRSIIsCrossedOverLongExit(1); + conditions.isXRSICrossedOverLongEntry = XRSIIsCrossedOverLongEntry(1); + conditions.isXRSICrossedUnderShortExit = XRSIIsCrossedUnderShortExit(1); + conditions.isXRSICrossedUnderShortEntry = XRSIIsCrossedUnderShortEntry(1); + + // + // XOBD ... + conditions.isXOBDPeak = XOBDIsPeak(); + conditions.isXOBDVale = XOBDIsVale(); + conditions.isXOBDSignalOverSwingHigh = XOBDIsSignalOverSwingHigh(1); + conditions.isXOBDSignalUnderSwingHigh = XOBDIsSignalUnderSwingHigh(1); + conditions.isXOBDSignalCrossedOverSwingHigh = XOBDIsSignalCrossedOverSwingHigh(1); + conditions.isXOBDSignalCrossedUnderSwingHigh = XOBDIsSignalCrossedUnderSwingHigh(1); + + // + // XCHLH ... + // + conditions.isXCHLHSignalBOverSignalT = XCHLHIsSignalBOverSignalT(1); + conditions.isXCHLHSignalBUnderSignalT = XCHLHIsSignalBUnderSignalT(1); + conditions.isXCHLHSignalBCrossedOverSignalT = XCHLHIsSignalBCrossedOverSignalT(1); + conditions.isXCHLHSignalBCrossedUnderSignalT = XCHLHIsSignalBCrossedUnderSignalT(1); + // + conditions.isXCHLHSignalBOverLCLL = XCHLHIsSignalBOverLCLL(1); + conditions.isXCHLHSignalBUnderLCLL = XCHLHIsSignalBUnderLCLL(1); + conditions.isXCHLHSignalBCrossedOverLCLL = XCHLHIsSignalBCrossedOverLCLL(1); + conditions.isXCHLHSignalBCrossedUnderLCLL = XCHLHIsSignalBCrossedUnderLCLL(1); + // + conditions.isXCHLHSCMCHHSame = XCHLHIsMCSCHasSameHH(1); + conditions.isXCHLHSCMCLLSame = XCHLHIsMCSCHasSameLL(1); + // + conditions.isXCHLHSCLCHHSame = XCHLHIsLCSCHasSameHH(1); + conditions.isXCHLHSCLCLLSame = XCHLHIsLCSCHasSameLL(1); + // + conditions.isXCHLHMCLCHHSame = XCHLHIsLCMCHasSameHH(1); + conditions.isXCHLHMCLCLLSame = XCHLHIsLCMCHasSameLL(1); + + // + // XCHMA ... + // + conditions.isXCHMASCPeak = XCHMAIsSCPeak(); + conditions.isXCHMASCVale = XCHMAIsSCVale(); + conditions.isXCHMASCFastOverSlow = XCHMAIsSCFastOverSlow(1); + conditions.isXCHMASCFastUnderSlow = XCHMAIsSCFastUnderSlow(1); + conditions.isXCHMASCFastCrossedOverSlow = XCHMAIsSCFastCrossedOverSlow(1); + conditions.isXCHMASCFastCrossedUnderSlow = XCHMAIsSCFastCrossedUnderSlow(1); + // + conditions.isXCHMAMCPeak = XCHMAIsMCPeak(); + conditions.isXCHMAMCVale = XCHMAIsMCVale(); + conditions.isXCHMAMCFastOverSlow = XCHMAIsMCFastOverSlow(1); + conditions.isXCHMAMCFastUnderSlow = XCHMAIsMCFastUnderSlow(1); + conditions.isXCHMAMCFastCrossedOverSlow = XCHMAIsMCFastCrossedOverSlow(1); + conditions.isXCHMAMCFastCrossedUnderSlow = XCHMAIsMCFastCrossedUnderSlow(1); + // + conditions.isXCHMALCPeak = XCHMAIsLCPeak(); + conditions.isXCHMALCVale = XCHMAIsLCVale(); + conditions.isXCHMALCFastOverSlow = XCHMAIsLCFastOverSlow(1); + conditions.isXCHMALCFastUnderSlow = XCHMAIsLCFastUnderSlow(1); + conditions.isXCHMALCFastCrossedOverSlow = XCHMAIsLCFastCrossedOverSlow(1); + conditions.isXCHMALCFastCrossedUnderSlow = XCHMAIsLCFastCrossedUnderSlow(1); +} + +// +// Cleanup Conditions ... +void XTESTClearConditions() +{ + // + X_TEST_MARKET_CONDITIONS mConditions = {}; + + // + conditions = mConditions; +} + +// +// Converts Market Conditions to Specific String Representation ... +string XTESTGetConditionsString( + string separator = ",", // Specify Separator + bool ignoreFalses = true // Ignore False Conditions +) +{ + // + string result = ""; + + // + // XTM ... + result += + "| XTM |" + separator; + + // + if ( + !ignoreFalses || + (ignoreFalses && conditions.isXTMPeak)) + { + result += "isXTMPeak: " + (string)conditions.isXTMPeak + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && conditions.isXTMVale)) + { + result += "isXTMVale: " + (string)conditions.isXTMVale + separator; + } + + // + // Separator ... + result += separator; + + // + // XTD ... + result += + "| XTD |" + separator; + + // + if ( + !ignoreFalses || + (ignoreFalses && conditions.isXTDSignalPeak)) + { + result += "isXTDSignalPeak: " + (string)conditions.isXTDSignalPeak + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && conditions.isXTDSignalVale)) + { + result += "isXTDSignalVale: " + (string)conditions.isXTDSignalVale + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && conditions.isXTDSignalOverBear)) + { + result += "isXTDSignalOverBear: " + (string)conditions.isXTDSignalOverBear + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && conditions.isXTDSignalUnderBear)) + { + result += "isXTDSignalUnderBear: " + (string)conditions.isXTDSignalUnderBear + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && conditions.isXTDSignalCrossedOverBear)) + { + result += "isXTDSignalCrossedOverBear: " + (string)conditions.isXTDSignalCrossedOverBear + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && conditions.isXTDSignalCrossedUnderBear)) + { + result += "isXTDSignalCrossedUnderBear: " + (string)conditions.isXTDSignalCrossedUnderBear + separator; + } + + // + // Separator ... + result += separator; + + // + // XRSI ... + result += + "| XRSI |" + separator; + + // + if ( + !ignoreFalses || + (ignoreFalses && conditions.isXRSIPeak)) + { + result += "isXRSIPeak: " + (string)conditions.isXRSIPeak + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && conditions.isXRSIVale)) + { + result += "isXRSIVale: " + (string)conditions.isXRSIVale + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && conditions.isXRSICrossedOverLongExit)) + { + result += "isXRSICrossedOverLongExit: " + (string)conditions.isXRSICrossedOverLongExit + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && conditions.isXRSICrossedOverLongEntry)) + { + result += "isXRSICrossedOverLongEntry: " + (string)conditions.isXRSICrossedOverLongEntry + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && conditions.isXRSICrossedUnderShortExit)) + { + result += "isXRSICrossedUnderShortExit: " + (string)conditions.isXRSICrossedUnderShortExit + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && conditions.isXRSICrossedUnderShortEntry)) + { + result += "isXRSICrossedUnderShortEntry: " + (string)conditions.isXRSICrossedUnderShortEntry + separator; + } + + // + // Separator ... + result += separator; + + // + // XOBD ... + result += + "| XOBD |" + separator; + + // + if ( + !ignoreFalses || + (ignoreFalses && conditions.isXOBDPeak)) + { + result += "isXOBDPeak: " + (string)conditions.isXOBDPeak + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && conditions.isXOBDVale)) + { + result += "isXOBDVale: " + (string)conditions.isXOBDVale + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && conditions.isXOBDSignalOverSwingHigh)) + { + result += "isXOBDSignalOverSwingHigh: " + (string)conditions.isXOBDSignalOverSwingHigh + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && conditions.isXOBDSignalUnderSwingHigh)) + { + result += "isXOBDSignalUnderSwingHigh: " + (string)conditions.isXOBDSignalUnderSwingHigh + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && conditions.isXOBDSignalCrossedOverSwingHigh)) + { + result += "isXOBDSignalCrossedOverSwingHigh: " + (string)conditions.isXOBDSignalCrossedOverSwingHigh + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && conditions.isXOBDSignalCrossedUnderSwingHigh)) + { + result += "isXOBDSignalCrossedUnderSwingHigh: " + (string)conditions.isXOBDSignalCrossedUnderSwingHigh + separator; + } + + // + // Separator ... + result += separator; + + // + // XCHLH ... + result += + "| XCHLH |" + separator; + + // + if ( + !ignoreFalses || + (ignoreFalses && conditions.isXCHLHSignalBOverSignalT)) + { + result += "isXCHLHSignalBOverSignalT: " + (string)conditions.isXCHLHSignalBOverSignalT + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && conditions.isXCHLHSignalBUnderSignalT)) + { + result += "isXCHLHSignalBUnderSignalT: " + (string)conditions.isXCHLHSignalBUnderSignalT + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && conditions.isXCHLHSignalBCrossedOverSignalT)) + { + result += "isXCHLHSignalBCrossedOverSignalT: " + (string)conditions.isXCHLHSignalBCrossedOverSignalT + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && conditions.isXCHLHSignalBCrossedUnderSignalT)) + { + result += "isXCHLHSignalBCrossedUnderSignalT: " + (string)conditions.isXCHLHSignalBCrossedUnderSignalT + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && conditions.isXCHLHSignalBOverLCLL)) + { + result += "isXCHLHSignalBOverLCLL: " + (string)conditions.isXCHLHSignalBOverLCLL + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && conditions.isXCHLHSignalBUnderLCLL)) + { + result += "isXCHLHSignalBUnderLCLL: " + (string)conditions.isXCHLHSignalBUnderLCLL + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && conditions.isXCHLHSignalBCrossedOverLCLL)) + { + result += "isXCHLHSignalBCrossedOverLCLL: " + (string)conditions.isXCHLHSignalBCrossedOverLCLL + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && conditions.isXCHLHSignalBCrossedUnderLCLL)) + { + result += "isXCHLHSignalBCrossedUnderLCLL: " + (string)conditions.isXCHLHSignalBCrossedUnderLCLL + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && conditions.isXCHLHSCMCHHSame)) + { + result += "isXCHLHSCMCHHSame: " + (string)conditions.isXCHLHSCMCHHSame + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && conditions.isXCHLHSCMCLLSame)) + { + result += "isXCHLHSCMCLLSame: " + (string)conditions.isXCHLHSCMCLLSame + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && conditions.isXCHLHSCLCHHSame)) + { + result += "isXCHLHSCLCHHSame: " + (string)conditions.isXCHLHSCLCHHSame + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && conditions.isXCHLHSCLCLLSame)) + { + result += "isXCHLHSCLCLLSame: " + (string)conditions.isXCHLHSCLCLLSame + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && conditions.isXCHLHMCLCHHSame)) + { + result += "isXCHLHMCLCHHSame: " + (string)conditions.isXCHLHMCLCHHSame + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && conditions.isXCHLHMCLCLLSame)) + { + result += "isXCHLHMCLCLLSame: " + (string)conditions.isXCHLHMCLCLLSame + separator; + } + + // + // Separator ... + result += separator; + + // + // XCHMA ... + result += + "| XCHMA |" + separator; + + // + if ( + !ignoreFalses || + (ignoreFalses && conditions.isXCHMASCPeak)) + { + result += "isXCHMASCPeak: " + (string)conditions.isXCHMASCPeak + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && conditions.isXCHMASCVale)) + { + result += "isXCHMASCVale: " + (string)conditions.isXCHMASCVale + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && conditions.isXCHMASCFastOverSlow)) + { + result += "isXCHMASCFastOverSlow: " + (string)conditions.isXCHMASCFastOverSlow + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && conditions.isXCHMASCFastUnderSlow)) + { + result += "isXCHMASCFastUnderSlow: " + (string)conditions.isXCHMASCFastUnderSlow + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && conditions.isXCHMASCFastCrossedOverSlow)) + { + result += "isXCHMASCFastCrossedOverSlow: " + (string)conditions.isXCHMASCFastCrossedOverSlow + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && conditions.isXCHMASCFastCrossedUnderSlow)) + { + result += "isXCHMASCFastCrossedUnderSlow: " + (string)conditions.isXCHMASCFastCrossedUnderSlow + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && conditions.isXCHMAMCPeak)) + { + result += "isXCHMAMCPeak: " + (string)conditions.isXCHMAMCPeak + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && conditions.isXCHMAMCVale)) + { + result += "isXCHMAMCVale: " + (string)conditions.isXCHMAMCVale + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && conditions.isXCHMAMCFastOverSlow)) + { + result += "isXCHMAMCFastOverSlow: " + (string)conditions.isXCHMAMCFastOverSlow + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && conditions.isXCHMAMCFastUnderSlow)) + { + result += "isXCHMAMCFastUnderSlow: " + (string)conditions.isXCHMAMCFastUnderSlow + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && conditions.isXCHMAMCFastCrossedOverSlow)) + { + result += "isXCHMAMCFastCrossedOverSlow: " + (string)conditions.isXCHMAMCFastCrossedOverSlow + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && conditions.isXCHMAMCFastCrossedUnderSlow)) + { + result += "isXCHMAMCFastCrossedUnderSlow: " + (string)conditions.isXCHMAMCFastCrossedUnderSlow + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && conditions.isXCHMALCPeak)) + { + result += "isXCHMALCPeak: " + (string)conditions.isXCHMALCPeak + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && conditions.isXCHMALCVale)) + { + result += "isXCHMALCVale: " + (string)conditions.isXCHMALCVale + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && conditions.isXCHMALCFastOverSlow)) + { + result += "isXCHMALCFastOverSlow: " + (string)conditions.isXCHMALCFastOverSlow + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && conditions.isXCHMALCFastUnderSlow)) + { + result += "isXCHMALCFastUnderSlow: " + (string)conditions.isXCHMALCFastUnderSlow + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && conditions.isXCHMALCFastCrossedOverSlow)) + { + result += "isXCHMALCFastCrossedOverSlow: " + (string)conditions.isXCHMALCFastCrossedOverSlow + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && conditions.isXCHMALCFastCrossedUnderSlow)) + { + result += "isXCHMALCFastCrossedUnderSlow: " + (string)conditions.isXCHMALCFastCrossedUnderSlow + separator; + } + + // + // Separator ... + result += separator; + + // + return result; +} + +// +// Check Market Conditions by Combination of Power of All tools for LONGs ... +bool XTESTHasLongSignal( + double &providedSignals // Recieve Which Number of Providers has Conditions here, used for Volume Increasing +) +{ + // + bool result = false; + ENUM_X_SIGNAL_METHODS methods[]; + + // + // START Custom Mechanism ... + // + + // + // Required Data ... + double entry = GetEntry(X_SIGNAL_LONG); + double nearHH = GetHighestHigh(3, 1); + double nearLL = GetLowestLow(3, 1); + XOHCL candle1 = GetCandle(1); + + // + bool isSharpChanged = IsSharpChanged( + 5, + 1, + xTMMaBuffer); + + // + bool isCandleSharpChanged = IsSharpChanged( + 5, + 1, + PRICE_CLOSE); + + // + // XRSI ... + bool isXRSIOverLongExit = + xRSIBuffer[1] > xRSILongExitValue; + + // + // XTD ... + // bool isXTDSignalIncreasing = + // xTDSignalBuffer[1] > xTDSignalBuffer[2] && + // xTDSignalBuffer[1] > xTDSignalBuffer[3]; + + // + // XCHLH ... + bool isDecreasingMCHH = IsDecreasing( + 12, + 1, + xCHLHMcHHBuffer); + + // + // XCHMA ... + // + double xCHMAMin1 = XCHMAGetMin(1); + double xCHMAMin2 = XCHMAGetMin(2); + + // + double xCHMAMax1 = XCHMAGetMax(1); + double xCHMAMax2 = XCHMAGetMax(2); + + // + // Calculate Non SC Max ... + double xCHMANonSCMax1 = MathMax(xCHMAMcFastBuffer[1], xCHMAMcSlowBuffer[1]); + xCHMANonSCMax1 = MathMax(xCHMANonSCMax1, xCHMALcFastBuffer[1]); + xCHMANonSCMax1 = MathMax(xCHMANonSCMax1, xCHMALcSlowBuffer[1]); + + // + // Calculate Non SC Min ... + double xCHMANonSCMin1 = MathMin(xCHMAMcFastBuffer[1], xCHMAMcSlowBuffer[1]); + xCHMANonSCMin1 = MathMin(xCHMANonSCMin1, xCHMALcFastBuffer[1]); + xCHMANonSCMin1 = MathMin(xCHMANonSCMin1, xCHMALcSlowBuffer[1]); + + // + double xCHMASCMin1 = MathMin(xCHMAScFastBuffer[1], xCHMAScSlowBuffer[1]); + double xCHMASCMin2 = MathMin(xCHMAScFastBuffer[2], xCHMAScSlowBuffer[2]); + + // + double xCHMASCMax1 = MathMax(xCHMAScFastBuffer[1], xCHMAScSlowBuffer[1]); + double xCHMASCMax2 = MathMax(xCHMAScFastBuffer[2], xCHMAScSlowBuffer[2]); + + // + double xCHMAMCTrend1 = MathAbs(xCHMAMcFastBuffer[1] - xCHMAMcSlowBuffer[1]); + double xCHMAMCTrend5 = MathAbs(xCHMAMcFastBuffer[5] - xCHMAMcSlowBuffer[5]); + double xCHMAMCTrend10 = MathAbs(xCHMAMcFastBuffer[10] - xCHMAMcSlowBuffer[10]); + + // + double xCHMALCTrend1 = MathAbs(xCHMALcFastBuffer[1] - xCHMALcSlowBuffer[1]); + double xCHMALCTrend5 = MathAbs(xCHMALcFastBuffer[5] - xCHMALcSlowBuffer[5]); + double xCHMALCTrend10 = MathAbs(xCHMALcFastBuffer[10] - xCHMALcSlowBuffer[10]); + + // + bool isXCHMASCCrossedOverMin = + // + xCHMASCMin2 <= xCHMAMin2 && + xCHMASCMin1 > xCHMAMin1 + // + ; + + // + bool isXCHMASCFastCrossedOverMax = + xCHMASCMax2 < xCHMAMax2 && + xCHMASCMax1 >= xCHMAMax1; + + // + bool isXCHMASCFastCrossedUnderMin = + xCHMASCMin2 > xCHMAMin2 && + xCHMASCMin1 <= xCHMAMin1; + + // + bool isXCHMASCFastCrossedUnderMax = + xCHMASCMax2 >= xCHMAMax2 && + xCHMASCMax1 < xCHMAMax1; + + // + // Condition 1 ... + // this Method waits for XCHMA Short Cycle's Fast to Going down + // of all Cycles Minimum Value, then Check when its Crossed Over + // min value and then start to Open Long Trades based On Conditions, + // and Recieved Verifications from other Indicator/Oscillator(s) ... + bool customMethodCond1 = + // + isXCHMASCCrossedOverMin + // + && + // + entry < nearHH + // + && + // + candle1.high != nearHH + // + && + // + !isCandleSharpChanged + // + && + // + !( + // + ( + // + conditions.isXCHMASCFastUnderSlow || + conditions.isXCHMASCFastCrossedUnderSlow + // + ) + // + && + // + ( + // + conditions.isXCHMAMCFastUnderSlow || + conditions.isXCHMAMCFastCrossedUnderSlow + // + ) + // + && + // + ( + // + conditions.isXCHMALCFastUnderSlow || + conditions.isXCHMALCFastCrossedUnderSlow + // + ) + // + ) + // + && + // + ( + // + conditions.isXCHMAMCFastOverSlow + // + ? + // + xCHMAMCTrend1 >= xCHMAMCTrend5 && + xCHMAMCTrend5 >= xCHMAMCTrend10 + // + : + // + xCHMAMCTrend1 < xCHMAMCTrend5 && + xCHMAMCTrend5 < xCHMAMCTrend10 + // + ) + // + && + // + !( + // + ( + // + conditions.isXCHMAMCFastUnderSlow || + conditions.isXCHMAMCFastCrossedUnderSlow + // + ) + // + && + // + ( + // + conditions.isXCHMALCFastUnderSlow || + conditions.isXCHMALCFastCrossedUnderSlow + // + ) + // + ) + // + && + // + ( + // + conditions.isXCHMAMCFastUnderSlow && + xTDSignalBuffer[1] < xTDSignalBuffer[2] + // + ? + // + xCHMAMcFastBuffer[1] > xCHMANonSCMin1 + // + && + // + !( + // + xCHLHSignalTBuffer[1] > xCHLHScHHBuffer[1] && + xCHLHSignalBBuffer[1] < xCHLHLcLLBuffer[1] + // + ) + // + : + // + true + // + ) + // + && + // + !( + // + conditions.isXCHMASCVale && + conditions.isXCHMASCFastUnderSlow + // + && + // + ( + // + ( + // + conditions.isXCHLHMCLCHHSame + // + && + // + ( + // + conditions.isXCHLHMCLCLLSame || + conditions.isXCHLHSCMCLLSame + // + ) + // + ) + // + ) + // + ) + // + && + // + !( + // + ( + // + xRSIBuffer[1] > xRSILongExitValue || + conditions.isXRSICrossedOverLongExit + // + ) + // + && + // + conditions.isXCHLHSCMCHHSame && + conditions.isXCHLHSCMCLLSame && + // + conditions.isXCHMAMCFastUnderSlow + // + ) + // + && + // + !( + // + ( + // + conditions.isXCHLHSignalBOverLCLL || + conditions.isXCHLHSignalBCrossedOverLCLL + // + ) + // + && + conditions.isXCHLHMCLCLLSame && + // + conditions.isXCHMAMCFastUnderSlow + // + ) + // + && + // + !( + // + conditions.isXTDSignalOverBear && + // + conditions.isXOBDSignalUnderSwingHigh && + // + conditions.isXCHLHSignalBUnderSignalT && + conditions.isXCHLHSignalBOverLCLL && + conditions.isXCHLHMCLCLLSame && + // + conditions.isXCHMAMCFastUnderSlow + // + ) + // + && + // + !( + // + conditions.isXTDSignalOverBear && + // + conditions.isXOBDSignalUnderSwingHigh && + // + conditions.isXCHLHSignalBUnderSignalT && + conditions.isXCHLHSignalBUnderLCLL && + conditions.isXCHLHMCLCLLSame && + // + conditions.isXCHMASCFastOverSlow && + conditions.isXCHMAMCFastUnderSlow && + conditions.isXCHMALCFastOverSlow + // + ) + // + && + // + !( + // + conditions.isXTDSignalOverBear && + // + conditions.isXOBDSignalUnderSwingHigh && + // + conditions.isXCHLHSignalBOverSignalT && + conditions.isXCHLHSignalBOverLCLL && + conditions.isXCHLHMCLCHHSame && + // + conditions.isXCHMASCFastOverSlow && + conditions.isXCHMAMCFastOverSlow && + conditions.isXCHMALCFastUnderSlow + // + ) + // + ; + + // + // Filling Methods ... + if (customMethodCond1) + { + // + ArrayResize( + methods, + ArraySize(methods) + 1); + + // + methods[ArraySize(methods) - 1] = X_SIGNAL_METHOD_1; + } + + // + // Condition 2 ... + // this Method waits for XCHMA Medium Cycles Fast Line Crossed Over Slow, + // then start to Open Long Trades based On Conditions, and Recieved Verifications from + // other Indicator/Oscillator(s) ... + bool customMethodCond2 = + // + // MCFast Based ... + ( + // + conditions.isXCHMAMCFastCrossedOverSlow && + // + ( + // + conditions.isXCHMASCFastOverSlow + // + && + // + conditions.isXCHMALCFastOverSlow + // + ) + // + ) + // + && + // + !( + // + ( + // + conditions.isXOBDSignalUnderSwingHigh || + conditions.isXOBDSignalCrossedUnderSwingHigh + // + ) + // + && + // + conditions.isXCHLHSignalBOverSignalT && + conditions.isXCHLHSignalBOverLCLL && + conditions.isXCHLHSCMCHHSame + // + ) + // + && + // + !( + // + conditions.isXTDSignalCrossedOverBear && + // + conditions.isXOBDSignalUnderSwingHigh && + // + conditions.isXCHLHSignalBUnderSignalT && + conditions.isXCHLHSignalBOverLCLL && + conditions.isXCHLHMCLCLLSame + // + ) + // + && + // + !( + // + xCHLHScHHBuffer[1] > xCHLHSignalTBuffer[1] && + xCHLHScLLBuffer[1] > xCHLHSignalTBuffer[1] && + xCHLHSignalBBuffer[1] < xCHLHSignalTBuffer[1] && + xCHLHSignalBBuffer[1] < xCHLHMcLLBuffer[1] + // + ) + // + && + // + !( + // + conditions.isXTDSignalOverBear && + // + conditions.isXOBDSignalUnderSwingHigh && + // + conditions.isXCHLHSignalBCrossedOverSignalT && + conditions.isXCHLHSignalBOverLCLL && + conditions.isXCHLHSCMCHHSame && + conditions.isXCHLHMCLCLLSame + // + ) + // + && + // + !( + // + conditions.isXTDSignalUnderBear && + // + conditions.isXOBDSignalUnderSwingHigh && + // + conditions.isXCHLHSignalBUnderSignalT && + conditions.isXCHLHSignalBOverLCLL && + conditions.isXCHLHMCLCHHSame && + conditions.isXCHLHMCLCLLSame + // + ) + // + && + // + !( + // + conditions.isXTDSignalOverBear && + // + conditions.isXRSICrossedOverLongExit && + // + conditions.isXOBDSignalUnderSwingHigh && + // + conditions.isXCHLHSignalBOverSignalT && + conditions.isXCHLHSignalBOverLCLL + // + ) + // + && + // + !( + // + conditions.isXTDSignalCrossedUnderBear && + // + conditions.isXOBDSignalUnderSwingHigh && + // + conditions.isXCHLHSignalBOverSignalT && + conditions.isXCHLHSignalBOverLCLL + // + ) + // + // + && + // + entry < nearHH + // + && + // + nearHH != candle1.high + // + && + // + !isXRSIOverLongExit + // + ; + + // + // Filling Methods ... + if (customMethodCond2) + { + // + ArrayResize( + methods, + ArraySize(methods) + 1); + + // + methods[ArraySize(methods) - 1] = X_SIGNAL_METHOD_2; + } + + // + // Condition 3 ... + // this Method waits for XCHMA Short Cycle's Fast to Crossed Over all Cycles max value + // and then start to Open Long Trades based On Conditions, + // and Recieved Verifications from other Indicator/Oscillator(s) ... + bool customMethodCond3 = + // + isXCHMASCFastCrossedOverMax + // + && + // + conditions.isXCHMALCFastOverSlow + // + && + // + !( + // + xCHLHScLLBuffer[1] > xCHLHMcLLBuffer[1] && + xCHLHMcLLBuffer[1] > xCHLHSignalBBuffer[1] && + xCHLHSignalBBuffer[1] > xCHLHSignalTBuffer[1] && + xCHLHSignalTBuffer[1] > xCHLHLcLLBuffer[1] + // + ) + // + && + // + !( + conditions.isXCHLHSignalBUnderSignalT && + conditions.isXCHLHSignalBOverLCLL && + ( + // + conditions.isXCHLHSCMCHHSame || + conditions.isXCHLHMCLCLLSame + // + ) + // + ) + // + && + // + !( + // + conditions.isXCHLHSignalBOverSignalT && + conditions.isXCHLHSignalBOverLCLL && + // + ( + // + conditions.isXCHLHSCMCHHSame || + conditions.isXCHLHMCLCLLSame || + conditions.isXCHLHMCLCHHSame || + conditions.isXCHLHSCMCLLSame + // + ) + // + ) + // + && + // + !isSharpChanged + // + && + // + !isCandleSharpChanged + // + && + // + entry < nearHH + // + && + // + candle1.close > xTMMaBuffer[1]; + // + ; + + // + // Filling Methods ... + if (customMethodCond3) + { + // + ArrayResize( + methods, + ArraySize(methods) + 1); + + // + methods[ArraySize(methods) - 1] = X_SIGNAL_METHOD_3; + } + + // + // Combine Custom Methods together ... + bool isCustomMethodHasSignal = + // + customMethodCond1 + // + || + // + customMethodCond2 + // + || + // + customMethodCond3 + // + ; + + // + // END Custom Mechanism ... + // + + // + result = + // + // isXTMHasSignal + // isXTDHasSignal + // isXCHMAHasSignal + // + // isXTMMethodHasSignal + // + // || + // + // isXTDMethodHasSignal + // + // || + // // + // isXOBDMethodHasSignal + // // + // || + // // + // isXCHMAMethodHasSignal + // // + // || + // // + // isXCHLHMethodHasSignal + // // + // || + // // + // isXRSIMethodHasSignal + // + // || + isCustomMethodHasSignal + // + ; + + // + if (result) + { + // + // Set Number of Occured Conditions for Increasing Volume ... + providedSignals = ArraySize(methods); + } + + // + return result; +} + +// +// Check Market Conditions by Combination of Power of All tools for SHORTs ... +bool XTESTHasShortSignal( + double &providedSignals // Recieve Which Number of Providers has Conditions here, used for Volume Increasing +) +{ + // + bool result = false; + ENUM_X_SIGNAL_METHODS methods[]; + + // + // START Custom Mechanism ... + // + + // + // Required Data ... + double entry = GetEntry(X_SIGNAL_SHORT); + double nearHH = GetHighestHigh(3, 1); + double nearLL = GetLowestLow(3, 1); + XOHCL candle1 = GetCandle(1); + + // + bool isSharpChanged = IsSharpChanged( + 5, + 1, + xTMMaBuffer); + + // + bool isCandleSharpChanged = IsSharpChanged( + 5, + 1, + PRICE_CLOSE); + + // + // XRSI ... + bool isXRSIOverLongExit = + xRSIBuffer[1] > xRSILongExitValue; + + // + // XCHLH ... + bool isIncreasingMCHH = IsIncreasing( + 12, + 1, + xCHLHMcHHBuffer); + + // + double xCHLHLCRange1 = xCHLHLcHHBuffer[1] - xCHLHLcLLBuffer[1]; + double xCHLHMCRange1 = xCHLHMcHHBuffer[1] - xCHLHMcLLBuffer[1]; + double xCHLHSCRange1 = xCHLHScHHBuffer[1] - xCHLHScLLBuffer[1]; + + // + double xCHLHNonLCMax1 = MathMax(xCHLHScHHBuffer[1], xCHLHMcHHBuffer[1]); + double xCHLHNonLCMin1 = MathMin(xCHLHScLLBuffer[1], xCHLHMcLLBuffer[1]); + double xCHLHNonLCRange1 = xCHLHNonLCMax1 - xCHLHNonLCMin1; + + // // + // bool isIncreasingMCLL = IsIncreasing( + // 12, + // 1, + // xCHLHMcLLBuffer); + + // // + // bool isDecreasingSCHH = IsDecreasing( + // 12, + // 1, + // xCHLHScHHBuffer); + + // // + // bool isDecreasingSCLL = IsDecreasing( + // 12, + // 1, + // xCHLHScLLBuffer); + + // + // XCHMA ... + // + double xCHMAMin1 = XCHMAGetMin(1); + double xCHMAMin2 = XCHMAGetMin(2); + + // + double xCHMAMax1 = XCHMAGetMax(1); + double xCHMAMax2 = XCHMAGetMax(2); + + // + // Calculate Non SC Max ... + double xCHMANonSCMax1 = MathMax(xCHMAMcFastBuffer[1], xCHMAMcSlowBuffer[1]); + xCHMANonSCMax1 = MathMax(xCHMANonSCMax1, xCHMALcFastBuffer[1]); + xCHMANonSCMax1 = MathMax(xCHMANonSCMax1, xCHMALcSlowBuffer[1]); + + // + // Calculate Non SC Min ... + double xCHMANonSCMin1 = MathMin(xCHMAMcFastBuffer[1], xCHMAMcSlowBuffer[1]); + xCHMANonSCMin1 = MathMin(xCHMANonSCMin1, xCHMALcFastBuffer[1]); + xCHMANonSCMin1 = MathMin(xCHMANonSCMin1, xCHMALcSlowBuffer[1]); + + // + // Calculate Non LC Max ... + double xCHMANonLCMax1 = MathMax(xCHMAScFastBuffer[1], xCHMAScSlowBuffer[1]); + xCHMANonLCMax1 = MathMax(xCHMANonLCMax1, xCHMAMcFastBuffer[1]); + xCHMANonLCMax1 = MathMax(xCHMANonLCMax1, xCHMAMcSlowBuffer[1]); + + // + // Calculate Non LC Min ... + double xCHMANonLCMin1 = MathMin(xCHMAScFastBuffer[1], xCHMAScSlowBuffer[1]); + xCHMANonLCMin1 = MathMin(xCHMANonLCMin1, xCHMAMcFastBuffer[1]); + xCHMANonLCMin1 = MathMin(xCHMANonLCMin1, xCHMAMcSlowBuffer[1]); + + // + // Check LC On Top Of Others ... + double xCHMALCMin1 = MathMin(xCHMALcFastBuffer[1], xCHMALcSlowBuffer[1]); + + // + double xCHMASCMin1 = MathMin(xCHMAScFastBuffer[1], xCHMAScSlowBuffer[1]); + double xCHMASCMin2 = MathMin(xCHMAScFastBuffer[2], xCHMAScSlowBuffer[2]); + + // + double xCHMASCMax1 = MathMax(xCHMAScFastBuffer[1], xCHMAScSlowBuffer[1]); + double xCHMASCMax2 = MathMax(xCHMAScFastBuffer[2], xCHMAScSlowBuffer[2]); + + // + double xCHMAMCTrend1 = MathAbs(xCHMAMcFastBuffer[1] - xCHMAMcSlowBuffer[1]); + double xCHMAMCTrend5 = MathAbs(xCHMAMcFastBuffer[5] - xCHMAMcSlowBuffer[5]); + double xCHMAMCTrend10 = MathAbs(xCHMAMcFastBuffer[10] - xCHMAMcSlowBuffer[10]); + + // + double xCHMALCTrend1 = MathAbs(xCHMALcFastBuffer[1] - xCHMALcSlowBuffer[1]); + double xCHMALCTrend5 = MathAbs(xCHMALcFastBuffer[5] - xCHMALcSlowBuffer[5]); + double xCHMALCTrend10 = MathAbs(xCHMALcFastBuffer[10] - xCHMALcSlowBuffer[10]); + + // + bool isXCHMASCCrossedOverMin = + // + xCHMASCMin2 <= xCHMAMin2 && + xCHMASCMin1 > xCHMAMin1 + // + ; + + // + bool isXCHMASCFastCrossedOverMax = + xCHMASCMax2 < xCHMAMax2 && + xCHMASCMax1 >= xCHMAMax1; + + // + bool isXCHMASCFastCrossedUnderMin = + xCHMASCMin2 > xCHMAMin2 && + xCHMASCMin1 <= xCHMAMin1; + + // + bool isXCHMASCFastCrossedUnderMax = + xCHMASCMax2 >= xCHMAMax2 && + xCHMASCMax1 < xCHMAMax1; + + // + // Condition 1 ... + // this Method waits for XCHMA Short Cycle's Fast to Going up + // of all Cycles Maximum Value, then Check when its Crossed Under + // max value and then start to Open Short Trades based On Conditions, + // and Recieved Verifications from other Indicator/Oscillator(s) ... + bool customMethodCond1 = + // + isXCHMASCFastCrossedUnderMax + // + && + // + entry > nearLL + // + && + // + !isSharpChanged + // + && + // + !isCandleSharpChanged + // + && + // + candle1.low != nearLL + // + && + // + !conditions.isXCHLHMCLCLLSame + // + && + // + ( + // + xCHLHNonLCRange1 > (xCHLHLCRange1 / 2) + // + ? + // + true + // + : + // + xCHLHMcHHBuffer[1] > (xCHLHLcHHBuffer[1] - (xCHLHLCRange1 / 2)) && + MathAbs(xCHLHMcLLBuffer[1] - xCHLHLcLLBuffer[1]) > (MathAbs(xCHLHMcHHBuffer[1] - xCHLHLcHHBuffer[1]) / 2) + // + ) + // + && + // + !( + // + xCHLHMcLLBuffer[1] > (xCHLHLcHHBuffer[1] - (xCHLHLCRange1 / 2)) && + xCHLHSignalTBuffer[1] < xCHLHSignalBBuffer[1] && + MathAbs(xCHLHScLLBuffer[1] - xCHLHMcLLBuffer[1]) > MathAbs(xCHLHScHHBuffer[1] - xCHLHMcHHBuffer[1]) + // + ) + // + && + // + !( + // + xTDSignalBuffer[1] > xTDSignalBuffer[2] && + xTDSignalBuffer[2] > xTDSignalBuffer[3] && + xTDSignalBuffer[1] > xTDSignalBuffer[3] + // + ) + // + && + // + !( + // + ( + // + conditions.isXCHMASCFastOverSlow || + conditions.isXCHMASCFastCrossedOverSlow + // + ) + // + && + // + ( + // + conditions.isXCHMAMCFastOverSlow || + conditions.isXCHMAMCFastCrossedOverSlow + // + ) + // + && + // + ( + // + conditions.isXCHMALCFastOverSlow || + conditions.isXCHMALCFastCrossedOverSlow + // + ) + // + ) + // + && + // + !( + // + ( + // + conditions.isXCHMAMCFastOverSlow || + conditions.isXCHMAMCFastCrossedOverSlow + // + ) + // + && + // + ( + // + conditions.isXCHMALCFastOverSlow || + conditions.isXCHMALCFastCrossedOverSlow + // + ) + // + ) + // + && + // + ( + // + conditions.isXCHMAMCFastOverSlow + // + ? + // + xCHMAMCTrend1 < xCHMAMCTrend5 + // + && + // + ( + // + xCHMAMCTrend1 < xCHMAMCTrend10 || + xCHMAMCTrend5 < xCHMAMCTrend10 + // + ) + // + : + // + true + // + ) + // + && + // + ( + // + conditions.isXCHMALCFastOverSlow + // + ? + // + xCHMALCTrend1 <= xCHMALCTrend5 + // + && + // + ( + // + xCHMALCTrend1 <= xCHMALCTrend10 || + xCHMALCTrend5 <= xCHMALCTrend10 + // + ) + // + : + // + true + // + ) + // + && + // + !( + // + conditions.isXCHMASCVale || + conditions.isXCHMAMCVale || + conditions.isXCHMASCPeak || + conditions.isXCHMAMCPeak + // + ) + // + && + // + ( + conditions.isXCHMASCFastOverSlow || + conditions.isXCHMAMCFastOverSlow + // + ? + // + xOBDSwingHighBuffer[1] < xOBDSwingLowBuffer[1] + // + : + // + true) + // + ; + + // + // Filling Methods ... + if (customMethodCond1) + { + // + ArrayResize( + methods, + ArraySize(methods) + 1); + + // + methods[ArraySize(methods) - 1] = X_SIGNAL_METHOD_1; + } + + // + // Condition 2 ... + // this Method waits for XCHMA Medium Cycle Fast Line Crossed Under Slow, + // then start to Open Short Trades based On Conditions, and Recieved Verifications from + // other Indicator/Oscillator(s) ... + bool customMethodCond2 = + // + conditions.isXCHMAMCFastCrossedUnderSlow + // + && + // + entry > nearLL + // + && + // + candle1.low != nearLL + // + && + // + xCHMALCMin1 < xCHMANonLCMax1 + // + && + // + conditions.isXTDSignalUnderBear + // + && + // + ( + // + conditions.isXCHLHMCLCHHSame + // + ? + // + xOBDSwingHighBuffer[1] < xOBDSwingLowBuffer[1] + // + : + // + true + // + ) + // + && + // + !( + conditions.isXCHLHSCMCLLSame || + conditions.isXCHLHSCLCLLSame + // + ) + // + && + // + !( + // + xCHLHMcHHBuffer[1] < xCHLHLcHHBuffer[1] && + // + xCHLHScHHBuffer[1] < xCHLHMcHHBuffer[1] && + xCHLHScLLBuffer[1] > xCHLHMcLLBuffer[1] && + // + xCHLHMcLLBuffer[1] > xCHLHSignalBBuffer[1] && + xCHLHMcLLBuffer[1] > xCHLHSignalTBuffer[1] && + // + xCHLHSignalBBuffer[1] > xCHLHLcLLBuffer[1] && + xCHLHSignalTBuffer[1] > xCHLHLcLLBuffer[1] && + // + MathAbs(xCHLHScLLBuffer[1] - xCHLHMcLLBuffer[1]) < MathAbs(xCHLHScHHBuffer[1] - xCHLHMcHHBuffer[1]) + // + ) + // + ; + + // + // Filling Methods ... + if (customMethodCond2) + { + // + ArrayResize( + methods, + ArraySize(methods) + 1); + + // + methods[ArraySize(methods) - 1] = X_SIGNAL_METHOD_2; + } + + // + // Condition 3 ... + // this Method waits for XCHMA Short Cycle's Fast to Crossed Under all Cycles min value + // and then start to Open Short Trades based On Conditions, + // and Recieved Verifications from other Indicator/Oscillator(s) ... + bool customMethodCond3 = + // + isXCHMASCFastCrossedUnderMin + // + && + // + xCHMAScSlowBuffer[1] < xCHMANonSCMin1 + // + && + // + ( + // + conditions.isXCHMASCFastCrossedUnderSlow || + conditions.isXCHMASCFastUnderSlow + // + ) + // + && + // + ( + // + ( + // + conditions.isXCHMAMCFastCrossedUnderSlow || + conditions.isXCHMAMCFastUnderSlow + // + ) + // + && + // + ( + // + conditions.isXCHMALCFastCrossedUnderSlow || + conditions.isXCHMALCFastUnderSlow + // + ) + // + ) + // + && + // + ( + // + ( + // + conditions.isXTDSignalCrossedUnderBear || + conditions.isXTDSignalUnderBear + // + ) + // + && + // + xTDBullishBuffer[1] < xTDBearishBuffer[1] + // + ) + // + && + // + !( + // + xCHLHMCRange1 < (xCHLHLCRange1 / 2) + // + && + // + xCHLHMcHHBuffer[1] < (xCHLHLcHHBuffer[1] - (xCHLHLCRange1 / 2)) + // + ) + // + && + // + !( + // + conditions.isXCHMAMCFastUnderSlow + // + && + // + ( + // + xCHMAMcFastBuffer[1] > xCHMAMcFastBuffer[5] && + xCHMAMcFastBuffer[1] > xCHMAMcFastBuffer[10] + // + ) + // + && + // + ( + // + xCHMAMCTrend1 < xCHMAMCTrend5 && + xCHMAMCTrend1 < xCHMAMCTrend10 + // + ) + // + ) + // + ; + + // + // Filling Methods ... + if (customMethodCond3) + { + // + ArrayResize( + methods, + ArraySize(methods) + 1); + + // + methods[ArraySize(methods) - 1] = X_SIGNAL_METHOD_3; + } + + // + // Combine Custom Methods together ... + bool isCustomMethodHasSignal = + // + customMethodCond1 + // + || + // + customMethodCond2 + // + || + // + customMethodCond3 + // + ; + + // + // END Custom Mechanism ... + // + + // + // Fill Result ... + result = + // + isCustomMethodHasSignal + // + ; + + // + if (result) + { + // + // Set Number of Occured Conditions for Increasing Volume ... + providedSignals = ArraySize(methods); + } + + // + return result; +} + +// +// +// END Combination Signaling ... +// +// diff --git a/BKPS/OLD/EURUSD-5M-V0.1/MQ5/Libraries/x-saherelm.xtest.provider.inputs.lib.mq5 b/BKPS/OLD/EURUSD-5M-V0.1/MQ5/Libraries/x-saherelm.xtest.provider.inputs.lib.mq5 new file mode 100644 index 0000000..3aba747 --- /dev/null +++ b/BKPS/OLD/EURUSD-5M-V0.1/MQ5/Libraries/x-saherelm.xtest.provider.inputs.lib.mq5 @@ -0,0 +1,82 @@ +/////////////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 XTEST Signal Provider Library Inputs +// ----------------------------------------------------------- +// +// 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 + +// +input group "XTEST Provider"; + +// +input group "XTEST Common"; +input bool xTESTEnableProvider = true; // Enable Provider +input bool xTESTEnableAlerts = false; // Enable Events Alert +input int xTESTNumberOfItemsPerTick = 110; // Number Of items Readed In Each Tick + +// +input group "XTEST Trader"; +input int xTESTMagicNumber = 16940567; // Trader MagicNumber +input int xTESTSlippage = 10; // Trader Slippage + +// +input group "XTEST Trade Management"; +input bool xTESTAllowLongTrades = true; // Allow Long Trades +input bool xTESTAllowShortTrades = true; // Allow Short Trades + +// +input group "XTEST Risk Management"; +// +// Trade Count ... +input int xTESTMaxAllowedTrades = 5; // Max Allowed Trades at Same Time +input int xTESTMaxAllowedSupportTrades = 3; // Max Allowed Support Trades for Single Position +// +// Trades Age ... +// 1 Day = 288 +// 14 Day = 4320 +input int xTESTMaxInDrawDownTradeAge = 0; // Max In DrawDown Trades Age +// +// Trade Volume ... +input double xTESTStaticVolume = 0.3; // Static Volume +input double xTESTVolumeMultiplier = 2; // Volume Multiplier +input double xTESTMaxSupportedVolumePerTradeInLots = 2.4; // Max Supported Volume Per Trade in Lot +// +// Trade Profits ... +input double xTESTMinRewardPerTradeInPips = 8; // Min Reward Per Trade In Pips +input double xTESTRiskFreeTradesInPips = 3; // Make Trades Risk Free in Pips +input int xTESTMinRewardPerSupportTradesInPips = 2; // Min Reward for Support Trade +input int xTESTSupportTradesPriceDistanceInPips = 5; // Distance Price to Open Support Trade In Pips +// +// 1000000 Pips = 100$ in EURUSD ... +input double xTESTMaxAllowedDrawDownPerTradesInPips = 0; // Max Allowed Drawdown Per Trade In Pips +input double xTESTRiskFreeRate = 0.5; // Volume Multiplier for Risk Free +// +// Account ... +input double xTESTFreeMarginFactorForOpenTrades = 0.8; // Minimum Free Marging for Open Trades +input double xTESTBalanceFactorForOpenTrades = 0.5; // Minimum Balance for Open Trades + +// +// Validate Inputs before Initialization ... +bool XTESTValidateInputs() +{ + // + bool result = false; + + // + // TODO: Fix this ... + result = true; + + // + return result; +} \ No newline at end of file diff --git a/BKPS/OLD/EURUSD-5M-V0.1/MQ5/Libraries/x-saherelm.xtest.provider.lib.mq5 b/BKPS/OLD/EURUSD-5M-V0.1/MQ5/Libraries/x-saherelm.xtest.provider.lib.mq5 new file mode 100644 index 0000000..e2ba2a0 --- /dev/null +++ b/BKPS/OLD/EURUSD-5M-V0.1/MQ5/Libraries/x-saherelm.xtest.provider.lib.mq5 @@ -0,0 +1,1073 @@ +//////////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 XTEST Signal Provider Library +// -------------------------------------------------------- +// Name: XTESTSignalProvider +// Description: XTEST based 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 + +#define XTESTProviderName "XTEST" + +// +// START Inputs ... +// + +#include "x-saherelm.xtest.provider.inputs.lib.mq5"; + +// +// END Inputs ... +// + +// +// Include Common Library ... +#include "x-saherelm.common.lib.mq5" + +// +// Include Logger Library ... +#include "x-saherelm.log.lib.mq5" + +// +// Include Alert Library ... +#include "x-saherelm.alert.lib.mq5" + +// +// Include Draw Library ... +#include "x-saherelm.draw.lib.mq5" + +// +// Include Class Libraries ... +#include "x-saherelm.class.lib.mq5" + +// +// START Global Definitions: Variables, Properties and etc ... +// + +// +XCTrade *xTESTTrader; +XCAccountInfo xTESTAccountInfo; + +// +#include "x-saherelm.xtest.provider.indicators.lib.mq5" + +// +double xTESTDeposit = 0; +double xTESTBalance = 0; +double xTESTFreeMargin = 0; +double xTESTRiskFreeTrades = 0; +double xTESTMinRewardPerTrade = 0; +double xTESTBalanceForOpenTrades = 0; +double xTESTFreeMarginForOpenTrades = 0; +double xTESTMinRewardPerSupportTrades = 0; +double xTESTSupportTradesPriceDistance = 0; +double xTESTMaxAllowedDrawDownPerTrades = 0; + +// +// END Global Definitions: Variables, Properties and etc ... +// + +// +// START Provided Functions ... +// + +// +// Initial Library if required ... +bool XTESTInitSignalProviderLibrary() +{ + // + bool result = false; + + // + // Validate Inputs ... + result = XTESTValidateInputs(); + if (!result) + { + return result; + } + + // + // Init Indicators ... + result = XTESTInitIndicators(); + if (!result) + { + return result; + } + + // + // Calculate Account Deposit ... + xTESTDeposit = xTESTAccountInfo.GetInitialBalance(); + + // + // Calculate RiskFree Price Distance ... + if (xTESTRiskFreeTradesInPips > 0 && xTESTRiskFreeRate > 0) + { + xTESTRiskFreeTrades = PipsToPrice(xTESTRiskFreeTradesInPips); + } + + // + // Calculate xTESTMinRewardPerTrade ... + if (xTESTMinRewardPerTradeInPips > 0) + { + xTESTMinRewardPerTrade = PipsToPrice(xTESTMinRewardPerTradeInPips); + } + + // + // Calculate Min Balance for Trades ... + if (xTESTBalanceFactorForOpenTrades > 0) + { + xTESTBalanceForOpenTrades = xTESTBalanceFactorForOpenTrades * xTESTDeposit; + } + + // + // Claculate Min Free Marging for Trades ... + if (xTESTFreeMarginFactorForOpenTrades > 0) + { + xTESTFreeMarginForOpenTrades = xTESTFreeMarginFactorForOpenTrades * xTESTDeposit; + } + + // + // Calculate xTESTSupportTradesPriceDistance ... + if (xTESTMaxAllowedSupportTrades > 0 && xTESTSupportTradesPriceDistanceInPips > 0 && xTESTMinRewardPerSupportTradesInPips > 0) + { + xTESTMinRewardPerSupportTrades = PipsToPrice(xTESTMinRewardPerSupportTradesInPips); + xTESTSupportTradesPriceDistance = PipsToPrice(xTESTSupportTradesPriceDistanceInPips); + } + + // + // Calculate xTESTMaxAllowedDrawDownPerTrade ... + if (xTESTMaxAllowedDrawDownPerTradesInPips > 0) + { + // + xTESTMaxAllowedDrawDownPerTrades = PipsToPrice(xTESTMaxAllowedDrawDownPerTradesInPips); + + // + LogMessage("Max Allowed DrawDown per Trade: " + (string)xTESTMaxAllowedDrawDownPerTrades); + } + + // + // Make XCTrader instance ... + xTESTTrader = new XCTrade( + XTESTProviderName, + _Symbol, + xTESTSlippage, + xTESTMagicNumber, + xTESTMaxAllowedTrades, + xTESTMaxAllowedSupportTrades, + xTESTMinRewardPerTradeInPips, + xTESTSupportTradesPriceDistanceInPips, + xTESTFreeMarginForOpenTrades, + xTESTBalanceForOpenTrades); + + // + result = true; + + // + // Logging State ... + XTESTIssueInitializationSucceedAlert(); + + // + return result; +} + +// +// DeInitial Library if required ... +void XTESTDeinitSignalProviderLibrary( + const int reason) +{ + // + // Release Handlers ... + XTESTReleaseIndicators(); + + // + // Logging State ... + XTESTIssueDeinitializationSucceedAlert(); +} + +// +// this is a Globally Function which do all of +// checkings and positions handling ... +void XTESTSignalProviderHandleTick() +{ + // + // Update account Balance ... + xTESTBalance = xTESTAccountInfo.GetBalance(); + xTESTFreeMargin = xTESTAccountInfo.GetFreeMargin(); + + // + // Check Provider is Enable or Not ... + if (!xTESTEnableProvider) + { + return; + } + + // + // Reading Indicator Buffers ... + XTESTHandleReadingBuffers(); + if (xTESTCalculatedBars < xTESTMaxLengthOfInputs) + { + return; + } + + // + // Handle Open Trades ... + XTESTHandleOpenTrades(); + + // + // Handle Close Trades ... + XTESTHandleCloseTrades(); + + // + // Handle Support Trades ... + XTESTHandleSupportTrades(); +} + +// +// Handle Open Trades ... +void XTESTHandleOpenTrades() +{ + // + // Check Can Trade ... + bool canTrade = xTESTAllowLongTrades || xTESTAllowShortTrades; + if (!canTrade) + { + return; + } + + // + // Check Max Open Trades ... + int openPositions = xTESTTrader.Count(); + int openTradeKinds = xTESTTrader.CountByKind( + X_SIGNAL_UNKNOWN, + X_KIND_TRADE); + bool canOpenPositions = openTradeKinds < xTESTMaxAllowedTrades; + if (!canOpenPositions) + { + return; + } + + // + // Check Signals Exists ... + double longsForceVolume = 0; + double shortsForceVolume = 0; + bool hasLongSignal = XTESTCanOpenLongTrade(longsForceVolume); + bool hasShortSignal = XTESTCanOpenShortTrade(shortsForceVolume); + if (!hasLongSignal && !hasShortSignal) + { + return; + } + + // + // Open Long Trades ... + if ( + // + hasLongSignal && + xTESTAllowLongTrades) + { + // + bool isOpened = XTESTOpenLongPosition(longsForceVolume); + } + + // + // Open Short Trades ... + if ( + // + hasShortSignal && + xTESTAllowShortTrades) + { + // + bool isOpened = XTESTOpenShortPosition(shortsForceVolume); + } +} + +// +// Handle Close Trades ... +void XTESTHandleCloseTrades() +{ + // + // All Close Mechanism Handles Here ... + // - Force Close; + // - Partial Close; + // - Risk Free Close; + // - Virtual TP/SL Close; + + // + // Force Close Long Trades ... + bool canCloseLongTrades = XTESTCanCloseLongTrade(); + if (xTESTAllowLongTrades && canCloseLongTrades) + { + // + ENUM_X_SIGNAL_TYPE type = X_SIGNAL_LONG; + + // + XSignal closed[]; + xTESTTrader.ClosePositionsByType( + type, + closed); + + // + bool isClosed = ArraySize(closed) > 0; + if (isClosed) + { + XTESTIssueForceCloseTradesAlert(type); + } + } + + // + // Force Close Short Trades ... + bool canCloseShortTrades = XTESTCanCloseShortTrade(); + if (xTESTAllowShortTrades && canCloseShortTrades) + { + // + ENUM_X_SIGNAL_TYPE type = X_SIGNAL_SHORT; + + // + XSignal closed[]; + xTESTTrader.ClosePositionsByType( + type, + closed); + + // + bool isClosed = ArraySize(closed) > 0; + if (isClosed) + { + XTESTIssueForceCloseTradesAlert(type); + } + } + + // + // Close Risk Free Trades ... + bool canRiskFree = xTESTRiskFreeTradesInPips > 0 && xTESTRiskFreeTrades > 0 && xTESTRiskFreeRate > 0; + if (canRiskFree) + { + XSignal riskFrees[]; + xTESTTrader.RiskFreeSignals(riskFrees); + bool isRiskFree = ArraySize(riskFrees) > 0; + if (isRiskFree) + { + XTESTIssueRiskFreeTradesAlert(); + } + } + + // + XTESTHandleCloseMaxDrawDownTrades(); + + // + XTESTHandleCloseTooOldTrades(); +} + +// +// Handle Supported Trades ... +void XTESTHandleSupportTrades() +{ + // + bool canDoTrade = + xTESTMaxAllowedSupportTrades > 0 && + xTESTMinRewardPerSupportTradesInPips > 0 && + xTESTSupportTradesPriceDistanceInPips > 0; + if (!canDoTrade) + { + return; + } + + // + XSignal supports[]; + bool hasSupportTrade = XTESTOpenSupportTrade(supports); + if (hasSupportTrade) + { + } +} + +// +// Open Long Position ... +bool XTESTOpenLongPosition(double additionalVolumeMultiplier = 0) +{ + // + bool result = false; + + // + // Calculate Required Data for Position ... + double sl = 0; + double tp = xTESTMinRewardPerTrade; + double riskFree = xTESTRiskFreeTrades; + double riskFreeRate = xTESTRiskFreeRate; + double volume = XTESTCalculateVolume(additionalVolumeMultiplier); + + // + XSignal signal = {}; + signal = xTESTTrader.GenerateTradeSignal( + X_SIGNAL_LONG, + tp, + sl, + volume, + riskFree, + riskFreeRate); + bool isValidSignal = IsValid( + signal, + xTESTMagicNumber); + if (!isValidSignal) + { + return result; + } + + // + int error = -1; + result = xTESTTrader.ExecuteSignal(signal, error); + if (result) + { + XTESTIssueSignalExecutionAlert(signal); + } + + // + return result; +} + +// +// Open Short Position ... +bool XTESTOpenShortPosition(double additionalVolumeMultiplier = 0) +{ + // + bool result = false; + + // + // Calculate Required Data for Position ... + double sl = 0; + double tp = xTESTMinRewardPerTrade; + double riskFree = xTESTRiskFreeTrades; + double riskFreeRate = xTESTRiskFreeRate; + double volume = XTESTCalculateVolume(additionalVolumeMultiplier); + + // + XSignal signal = {}; + signal = xTESTTrader.GenerateTradeSignal( + X_SIGNAL_SHORT, + tp, + sl, + volume, + riskFree, + riskFreeRate); + bool isValidSignal = IsValid( + signal, + xTESTMagicNumber); + if (!isValidSignal) + { + return result; + } + + // + int error = -1; + result = xTESTTrader.ExecuteSignal(signal, error); + if (result) + { + XTESTIssueSignalExecutionAlert(signal); + } + + // + return result; +} + +// +// Open a Support Signal ... +bool XTESTOpenSupportTrade( + XSignal &supports[] // Holds Result ... +) +{ + // + bool result = false; + + // + // Check Can Trade ... + result = xTESTAllowLongTrades || xTESTAllowShortTrades; + if (!result) + { + return result; + } + + // + // Check Support Trades is Enable or not ... + bool isSupportTradesEnabled = + // + xTESTMaxAllowedSupportTrades > 0 && + xTESTMinRewardPerSupportTrades > 0 && + xTESTSupportTradesPriceDistance > 0 + // + ; + if (!isSupportTradesEnabled) + { + return result; + } + + // + // Recieve InDD Open Trades ... + XSignal inDDTrades[]; + xTESTTrader.GetInDrawDownTrades( + xTESTSupportTradesPriceDistance, + X_SIGNAL_UNKNOWN, + X_KIND_TRADE, + inDDTrades); + int inDDTradesCount = ArraySize(inDDTrades); + result = inDDTradesCount > 0; + if (!result) + { + return result; + } + + // + // Check Signals Exists ... + double longsForceVolume = 0; + double shortsForceVolume = 0; + bool hasLongSignal = XTESTCanOpenLongTrade(longsForceVolume); + bool hasShortSignal = XTESTCanOpenShortTrade(shortsForceVolume); + result = hasLongSignal || hasShortSignal; + if (!result) + { + return result; + } + + // + // Loop Through In DrawDown Trades ... + XSignal supportedSignals[]; + for (int i = 0; i < inDDTradesCount; i++) + { + // + // Retrieve Parent Signal ... + XSignal parent = inDDTrades[i]; + + // + // Check if Long Signal Happens ... + if (hasLongSignal && parent.type == X_SIGNAL_LONG) + { + // + // Generate Support Signal ... + XSignal sSignal = GenerateSupportSignal( + longsForceVolume, + X_SIGNAL_LONG, + parent); + + // + // Validate it ... + bool isValidSupport = IsValid(sSignal, xTESTMagicNumber); + if (!isValidSupport) + { + continue; + ; + } + + // + // Try To Execute Support Signal ... + int error = 0; + bool isExecuted = xTESTTrader.ExecuteSupportSignal( + sSignal, + error); + if (isExecuted) + { + // + if (!result) + { + result = true; + } + + // + Add( + sSignal, + supports); + + // + XTESTIssueSignalExecutionAlert(sSignal); + } + + // + continue; + } + + // + // Check if Short Signal Happens ... + if (hasShortSignal && parent.type == X_SIGNAL_SHORT) + { + // + // Generate Support Signal ... + XSignal sSignal = GenerateSupportSignal( + shortsForceVolume, + X_SIGNAL_SHORT, + parent); + + // + // Validate it ... + bool isValidSupport = IsValid(sSignal, xTESTMagicNumber); + if (!isValidSupport) + { + continue; + ; + } + + // + // Try To Execute Support Signal ... + int error = 0; + bool isExecuted = xTESTTrader.ExecuteSupportSignal( + sSignal, + error); + if (isExecuted) + { + // + if (!result) + { + result = true; + } + + // + Add( + sSignal, + supports); + + // + XTESTIssueSignalExecutionAlert(sSignal); + } + + // + continue; + } + } + + // + return result; +} + +// +// Close All InDrawDown Trades ... +void XTESTHandleCloseMaxDrawDownTrades() +{ + // + if (xTESTMaxAllowedDrawDownPerTrades > 0) + { + // + XSignal closed[]; + xTESTTrader.CloseInDrawDownTrades( + xTESTMaxAllowedDrawDownPerTrades, + closed); + + // + int count = ArraySize(closed); + if (count > 0) + { + XTESTIssueLongInDrawdownTradeClosed(); + } + } +} + +// +// Close All Too Old Trades ... +void XTESTHandleCloseTooOldTrades() +{ + // + // in DrawDown Trades ... + if (xTESTMaxInDrawDownTradeAge > 0) + { + // + XSignal oldTrades[]; + xTESTTrader.CloseLongTimeTrades( + xTESTMaxInDrawDownTradeAge, + _Period, + oldTrades); + + // + bool hasOldClosedTrades = ArraySize(oldTrades) > 0; + if (hasOldClosedTrades) + { + // + LogMessage("Old Trade Closed ..."); + } + } +} + +// +// END Provided Functions ... +// + +// +// START Private Functions ... +// + +// +// Calculating Volume for Tradings ... +double XTESTCalculateVolume( + double forceMultiplier = 0 // some times we get more than one signal at the same time, here we increase volume using this ... +) +{ + // + // Assign default Value ... + double result = xTESTStaticVolume; + + // + // we can count open trades and in draw down trades + // then do check volume based on it for gridding ... + XSignal openInProfitTrades[]; + xTESTTrader.GetInProfitTrades( + 0, + X_SIGNAL_UNKNOWN, + X_KIND_TRADE, + openInProfitTrades); + int openTrades = ArraySize(openInProfitTrades); + + // + // Calculate Normalized Multiplier ... + double mVolumeMultiplier = xTESTVolumeMultiplier <= 0 ? 1 : xTESTVolumeMultiplier; + double multiplier = mVolumeMultiplier; + multiplier = multiplier * openTrades; + if (multiplier < 1) + { + multiplier = 1; + } + + // + double growRate = xTESTBalance / xTESTDeposit; + if (growRate >= 1 && multiplier == 1) + { + // + double growDiff = growRate - 1; + if (growDiff < 1) + { + growRate = 1 + (growDiff * mVolumeMultiplier); + } + + // + multiplier = multiplier * growRate; + } + + // + result = multiplier * xTESTStaticVolume; + + // + // Apply Force Multiplier ... + if (forceMultiplier > 1) { + result *= forceMultiplier; + } + + // + // Check Max Allowed Lottage ... + double maxAllowedVolume = xTESTMaxSupportedVolumePerTradeInLots; + if (growRate >= 4 * mVolumeMultiplier) { + maxAllowedVolume *= mVolumeMultiplier; + } + + // + if ( + maxAllowedVolume > 0 && + result > maxAllowedVolume) + { + result = maxAllowedVolume; + } + + // + // Normalize Volume ... + result = NormalizeVolume(result); + + // + return result; +} + +// +// Calculate Signal TP and SL ... +XTPSL XTESTCalculateTPSL( + ENUM_X_SIGNAL_TYPE type // Position Type +) +{ + // + XTPSL result = {}; + + // + // Validate Args ... + if ( + type != X_SIGNAL_LONG && + type != X_SIGNAL_SHORT) + { + return result; + } + + // + bool isLong = type == X_SIGNAL_LONG; + + // + double ask = GetAsk(); + double bid = GetBid(); + double spread = GetSpread(); + double entry = isLong ? ask : bid; + + // + // TODO: Find Risk .. + double risk = 0; + + // + // Calculate Reward ... + double reward = PipsToPrice(xTESTMinRewardPerTradeInPips) + spread; + + // + // Calculate TP and SL ... + double tp = isLong ? entry + reward : entry - reward; + double sl = 0; + + // + result.type = type; + result.tp = tp; + result.sl = sl; + result.entry = entry; + // + // TODO: Calculate R2R ... + result.r2r = 0; + + // + return result; +} + +// +// Generate Support Signal for Specific Trade ... +XSignal GenerateSupportSignal( + double forceVolumeMultiplier, // how many time increase volume based on signal providers + ENUM_X_SIGNAL_TYPE type, // which type of support signal issued + XSignal &parent // generate support signal for which Trade Kind Position + ) +{ + // + XSignal result = {}; + + // + // Validate Type ... + bool isTypeValid = type == X_SIGNAL_LONG || type == X_SIGNAL_SHORT; + if (!isTypeValid) + { + return result; + } + + // + // Validate Parent Signal ... + bool isValidSignal = IsValid(parent, xTESTMagicNumber); + if (!isValidSignal) + { + return result; + } + + // + // Validate Parent is Kind ... + bool isKindValid = parent.kind == X_KIND_TRADE; + if (!isKindValid) + { + return result; + } + + // + // Check Parent Ticket ... + bool isValidTicket = parent.ticket > 0; + if (!isValidTicket) + { + return result; + } + + // + // Validate DrawDown ... + bool isInDD = parent.profit < 0; + if (!isInDD) + { + return result; + } + + // + // Calculate What we Want ... + // + bool isLong = type == X_SIGNAL_LONG; + + // + // Entry Price ... + // double entry = GetEntry(parent.symbol, type); + + // + // Required for Calculating RiskFree Level of Support Signals ... + double riskFreeRate = 0; + double riskFreePrice = 0; + bool canRiskFree = xTESTRiskFreeRate > 0; + + // + // TP ... + double tp = MathAbs(parent.tp - parent.entry) / 2; + // PriceToPips(MathAbs(parent.tp - parent.entry) / 2); + if (tp <= xTESTMinRewardPerSupportTrades) + { + tp = xTESTMinRewardPerSupportTrades; + } + else if ( + canRiskFree && + tp > xTESTMinRewardPerSupportTrades) + { + // + // Fill Risk Free Info ... + riskFreeRate = xTESTRiskFreeRate; + riskFreePrice = + isLong ? xTESTMinRewardPerSupportTrades : xTESTMinRewardPerSupportTrades; + } + + // + // SL ... + double sl = isLong ? 0 : 0; + + // + // VOLUME ... + int pOpenSupportCount = xTESTTrader.CountSupportedPositions(parent); + double volume = parent.volume * forceVolumeMultiplier; + + // + // Check and Normalize Volume based on MaxAllowed Volume ... + if (xTESTMaxSupportedVolumePerTradeInLots > 0 && volume > xTESTMaxSupportedVolumePerTradeInLots) { + volume = xTESTMaxSupportedVolumePerTradeInLots; + } + + // + // Normalize Volume ... + volume = NormalizeVolume(volume); + + // + // Generating Support Signal for Parent ... + result = xTESTTrader.GenerateSupportSignal( + type, + tp, + sl, + volume, + riskFreePrice, + riskFreeRate, + parent.ticket); + + // + return result; +} + +void XTESTIssueInitializationSucceedAlert() +{ + // + string message = "Initializion of (" + XTESTProviderName + " Provider" + " _ " + _Symbol + " _ " + EnumToString(_Period) + ") Succeeded ..."; + XTESTIssueAlert(message); +} + +void XTESTIssueDeinitializationSucceedAlert() +{ + // + string message = "De Initializion of (" + XTESTProviderName + " Provider" + ") Succeeded ..."; + XTESTIssueAlert(message); +} + +void XTESTIssueForceCloseTradesAlert(ENUM_X_SIGNAL_TYPE type) +{ + // + string typeStr = GetSignalType(type); + if (StringLen(typeStr) == 0) + { + return; + } + + // + string message = "Force Close " + typeStr + " Trades ..."; + XTESTIssueAlert(message); +} + +void XTESTIssueMaxAllowedTradesReachedAlert() +{ + // + string message = "reached Max Allowed Same Time Trades ..."; + XTESTIssueAlert(message); +} + +void XTESTIssueMaxAllowedFreeMarginReachedAlert() +{ + // + string message = "reached FreeMarigin For Open Trades ..."; + XTESTIssueAlert(message); +} + +void XTESTIssueMinAllowedBalanceReachedAlert() +{ + // + string message = "doesn't have Minimum Balance For Open Trades ..."; + XTESTIssueAlert(message); +} + +void XTESTIssueSignalExecutionAlert( + XSignal &signal // Executed Signal +) +{ + // + XTESTIssueAlert(signal); +} + +void XTESTIssueSignalExecutionError(int error) +{ + // + string message = GetSignalExecutionError(error); + if (StringLen(message) == 0) + { + return; + } + + // + XTESTIssueAlert(message); +} + +void XTESTIssueRiskFreeTradesAlert() +{ + // + string message = "Make Some Trades Risk Free ..."; + XTESTIssueAlert(message); +} + +void XTESTIssueLongInProfitTradeClosed() +{ + // + string message = "Closed Long Time in Profit Trades ..."; + XTESTIssueAlert(message); +} + +void XTESTIssueLongInDrawdownTradeClosed() +{ + // + string message = "Closed Long Time in Profit Trades ..."; + XTESTIssueAlert(message); +} + +void XTESTIssueAlert(string message) +{ + // + if (xTESTEnableAlerts) + { + SendAlert(message); + } + else + { + LogMessage(message); + } +} +void XTESTIssueAlert(XSignal &signal) +{ + // + string signalStr = xTESTTrader.ToString(signal); + XTESTIssueAlert(signalStr); + + // // + // if (xTESTEnableAlerts) + // { + // SendAlert(signal); + // } + // else + // { + // LogSignal(signal); + // } +} + +// +// END Private Functions ... +// diff --git a/BKPS/OLD/EURUSD-5M-V0.1/MQ5/Libraries/x-saherelm.xtm.indicator.helper.lib.mq5 b/BKPS/OLD/EURUSD-5M-V0.1/MQ5/Libraries/x-saherelm.xtm.indicator.helper.lib.mq5 new file mode 100644 index 0000000..02c0a04 --- /dev/null +++ b/BKPS/OLD/EURUSD-5M-V0.1/MQ5/Libraries/x-saherelm.xtm.indicator.helper.lib.mq5 @@ -0,0 +1,319 @@ +///////////////////////////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 XTM Indicator Helper for Signal Providers +// -------------------------------------------------------------------------- +// +// 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 + +// +// Includes ... +#include "..\Libraries\x-saherelm.log.lib.mq5" +#include "..\Libraries\x-saherelm.common.lib.mq5" + +// +// START Enum Definitions ... +// + +// +// XTM Indicator States ... +enum ENUM_X_XTM_STATES +{ + X_XTM_BULLISH = 1, + X_XTM_BEARISH = -1, + X_XTM_NEUTURAL = 0, +}; + +// +// XTM Indicator Buffer Lines ... +enum ENUM_X_XTM_BUFFER_LINES +{ + X_XTM_MA_LINE = 0, + X_XTM_MC_COLOR_LINE = 1, + X_XTM_STATE_LINE = 2, +}; + +// +// END Enum Definitions ... +// + +// +// START Inputs ... +// + +input group "XTM Indicator"; +input int xTMMaPeriod = 14; // Period +input int xTMMaShift = 0; // Shift +input ENUM_MA_METHOD xTMMaMethod = MODE_EMA; // Method +input ENUM_APPLIED_PRICE xTMMaAppliedTo = PRICE_WEIGHTED; // Applied To + +// +// END Inputs ... +// + +// +// START Definitions ... +// + +int xTMHandler = INVALID_HANDLE; +double xTMMaBuffer[]; +double xTMStateBuffer[]; + +// +// END Definitions ... +// + +// +// START Handler Functions ... +// + +// +// Init Indicators ... +bool XTMInitHandlers() +{ + // + bool result = false; + + // + // Initialize Indicator/Oscillator Handlers ... + ResetLastError(); + + // + // XTM Handler ... + ArraySetAsSeries(xTMMaBuffer, true); + ArraySetAsSeries(xTMStateBuffer, true); + xTMHandler = iCustom( + _Symbol, + _Period, + "x-saherelm.xtm.indicator", + // + // Inputs ... + xTMMaPeriod, + xTMMaShift, + xTMMaMethod, + xTMMaAppliedTo); + if (xTMHandler == INVALID_HANDLE) + { + // + LogMessage("failed to Initialize XTM Indicator: " + (string)GetLastError()); + return result; + } + + // + // xTMOHandler ... + // ArraySetAsSeries(xTMOBuffer, true); + // xTMOHandler = iCustom( + // _Symbol, + // _Period, + // "x-saherelm.xma.indicator", + // // + // // Inputs ... + // xTMMaPeriod, + // xTMMaShift, + // MODE_SMA, + // PRICE_OPEN); + // if (xTMOHandler == INVALID_HANDLE) + // { + // // + // LogMessage("failed to Initialize XMA Indicator: " + (string)GetLastError()); + // return result; + // } + + // + result = true; + + // + return result; +} + +// +// Release Indicators ... +void XTMReleaseHandlers() +{ + IndicatorRelease(xTMHandler); + // IndicatorRelease(xTMOHandler); +} + +// +// Handle Reading Buffers ... +void XTMReadBuffers( + int xTMItemsPerTick // Number Of Reading Buffer Items Per Tick +) +{ + // + // Ma Buffer ... + CopyBuffer( + xTMHandler, + X_XTM_MA_LINE, + 0, + xTMItemsPerTick, + xTMMaBuffer); + + // + // State Buffer ... + CopyBuffer( + xTMHandler, + X_XTM_STATE_LINE, + 0, + xTMItemsPerTick, + xTMStateBuffer); + + // + // XTMO Buffer ... + // CopyBuffer( + // xTMOHandler, + // 0, + // 0, + // xTMItemsPerTick, + // xTMOBuffer); +} + +// +// END Handler Funcions ... +// + +// +// START Signal Related Conditions ... +// + +// +// XTM Long Conditions ... +bool XTMHasLongConditions( + int xTMItemsPerTick // Number Of Reading Buffer Items Per Tick +) +{ + // + bool result = false; + + // + bool isVale = XTMIsVale(); + + // + result = + // + isVale + // + ; + + // + return result; +} + +// +// XTM Short Conditions ... +bool XTMHasShortConditions( + int xTMItemsPerTick // Number Of Reading Buffer Items Per Tick +) +{ + // + bool result = false; + + // + bool isPeak = XTMIsPeak(); + + // + result = + // + isPeak + // + ; + + // + return result; +} + +// +// END Signal Related Conditions ... +// + +// +// START XTM Custom Functions ... +// + +// +// Find Peak based On this Indicator ... +bool XTMIsPeak() +{ + // + bool result = false; + + // + // Must Decreasing ... + bool isIncreasing = IsIncreasing( + 20, + 5, + xTMMaBuffer); + + // + // Must Increasing ... + bool isDecreasing = IsDecreasing( + 5, + 1, + xTMMaBuffer); + + // + // Calculate Result ... + result = + // + isIncreasing + // + && + // + isDecreasing + // + ; + + // + return result; +} + +// +// Find Vale based On this Indicator ... +bool XTMIsVale() +{ + // + bool result = false; + + // + // Must Decreasing ... + bool isIncreasing = IsIncreasing( + 5, + 1, + xTMMaBuffer); + + // + // Must Increasing ... + bool isDecreasing = IsDecreasing( + 20, + 5, + xTMMaBuffer); + + // + // Calculate Result ... + result = + // + isIncreasing + // + && + // + isDecreasing + // + ; + + // + return result; +} + +// +// END XTM Custom Functions ... +// diff --git a/BKPS/OLD/EURUSD-5M-V0.1/Version.txt b/BKPS/OLD/EURUSD-5M-V0.1/Version.txt new file mode 100644 index 0000000..15c2a42 --- /dev/null +++ b/BKPS/OLD/EURUSD-5M-V0.1/Version.txt @@ -0,0 +1 @@ +packed at: Sunday, December 3, 2023 7:12:48 PM \ No newline at end of file diff --git a/BKPS/OLD/XAU5/Classes/x-saherelm.class.lib.ex5 b/BKPS/OLD/XAU5/Classes/x-saherelm.class.lib.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..518531315df2b54423a4b1bba88c87e51cdac6ff GIT binary patch literal 9752 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 VTezzW{dhedO&2M|Lb(2j{{{Tih{FH? literal 0 HcmV?d00001 diff --git a/BKPS/OLD/XAU5/Classes/x-saherelm.nn.lib.ex5 b/BKPS/OLD/XAU5/Classes/x-saherelm.nn.lib.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..e6cc8b8c8dadd83dc57c4852d110a2f221f0ec20 GIT binary patch literal 4016 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

KU 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

{^*o40Q3B<*YlF$JTe@ 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

-VAKINa1q0|Mq1Rb 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 WuuAPHOEEIw*qXv#@AlFG@V@~2mzvoC literal 0 HcmV?d00001 diff --git a/BKPS/OLD/XAU5/Helpers/x-saherelm.xchlh.oscillator.helper.lib.ex5 b/BKPS/OLD/XAU5/Helpers/x-saherelm.xchlh.oscillator.helper.lib.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..200475f2e4446b56524010e3f09ea8b8374e76d7 GIT binary patch literal 8402 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 Il*XI?0>TO09RL6T literal 0 HcmV?d00001 diff --git a/BKPS/OLD/XAU5/Helpers/x-saherelm.xfi.oscillator.helper.lib.ex5 b/BKPS/OLD/XAU5/Helpers/x-saherelm.xfi.oscillator.helper.lib.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..9a5cd19d17264d58df1713db1d4c1bc691b5db69 GIT binary patch literal 7484 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 literal 0 HcmV?d00001 diff --git a/BKPS/OLD/XAU5/Helpers/x-saherelm.xlh.indicator.helper.lib.ex5 b/BKPS/OLD/XAU5/Helpers/x-saherelm.xlh.indicator.helper.lib.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..eb64234509e694832e5430226d1f302b01bb1e0c GIT binary patch literal 7200 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 Oxzemta=NsZ;=cgGGqt(^ literal 0 HcmV?d00001 diff --git a/BKPS/OLD/XAU5/Helpers/x-saherelm.xobd.indicator.helper.lib.ex5 b/BKPS/OLD/XAU5/Helpers/x-saherelm.xobd.indicator.helper.lib.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..f0b532aaf4b089012a6fde17406ed2088b62b02c GIT binary patch literal 7406 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 literal 0 HcmV?d00001 diff --git a/BKPS/OLD/XAU5/Helpers/x-saherelm.xtd.oscillator.helper.lib.ex5 b/BKPS/OLD/XAU5/Helpers/x-saherelm.xtd.oscillator.helper.lib.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..1cab5245e4161335432373208434bda3a5114d94 GIT binary patch literal 8052 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 literal 0 HcmV?d00001 diff --git a/BKPS/OLD/XAU5/Helpers/x-saherelm.xtm.indicator.helper.lib.ex5 b/BKPS/OLD/XAU5/Helpers/x-saherelm.xtm.indicator.helper.lib.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..10ba73d830b3ebd7cf8fcdebc33d2c7c5b13d966 GIT binary patch literal 7186 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 Fe*kCjEr$RA literal 0 HcmV?d00001 diff --git a/BKPS/OLD/XAU5/Indicators/x-saherelm.xchlh.oscillator.ex5 b/BKPS/OLD/XAU5/Indicators/x-saherelm.xchlh.oscillator.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..1b23bc0fea505a643dc8d22285aedac2391fdd72 GIT binary patch literal 47602 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 literal 0 HcmV?d00001 diff --git a/BKPS/OLD/XAU5/Indicators/x-saherelm.xchma.oscillator.ex5 b/BKPS/OLD/XAU5/Indicators/x-saherelm.xchma.oscillator.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..78b7e93300adf7e29e6a404a89d0782c793f836a GIT binary patch literal 51260 zcmdSAW2`Vd&?tCp+qP}nwr$(CZQHi}9NV^SpMAg0?k0DC-2Zo)nRL)5Gt;E)q!ra* z1#twBL=XT0KmY&$1ULo(_+Nm5e2{27{6jSmR9MUX6jR`TQU1q}{r?63FaQ6{;{^c# z@INR30{b8RUm=9|QLz!Vfe^$gUW3)j6nFw!7Xrs}hHRWP9*+W99T-xqjCkc}#Pokg z2?N*zH~@G8I00A!m;+b(zw6g;zfT}ryxVD8~U zww;R2RxTJhy$;!Y_a9=mCX5rGq)XS4&B(QE^tq}8-zK0+%-AhHFh??b73Zr^UHudG zUo>4?GREwn-YCvAKuJE#VK-cK*O=0RVM#iZE*ORjlTuaYsTLUtE%5LK5&KQkuT(;^v|?U(<2Zm|$Q-h;^XMzJUH%-% zo&f0_I7ye2Hy%?h8Uc&0<_C`)g1=c$ed%}oqLAiMHGJfVQ91uCAM_lIz=%PK^Py+J zjR7y_&Mvoa`iN@0fF+<;D}_oxRfmz#R0m+MJ_dLvlWyz)KD4byPU70$W+5P#;f}6| zP7BW)uU@(c-c1bH*cmgho;$#fO1_h+U*+6dGYku9Ms3Q!{%Zl1F;WC%Fo8Yh{POEK zg`!d=pX8Y%%1&>AMLz&RA1An`?ZI$XgmXX3v(1Il1rS~uBJnm2O#v_zXY80TvU??C z`D?qIth*sfF6^Dq5lkJxTZ^;0kTy)}k-M19V5SpEYu0@BJEMe*<3NETUer~8(8qQd zU(}llT}-sbM09f5Pe!C^O0Y|9^=Pv8JK1IhR?y>~E7E;QCg;{zEa`$9qm$Q1dlIEj zMP5;)<-3T~dPBph3nuQ5FZZrl~)ccHv zkWw^1(-I6<^CGJ@DtBj-7k%yc#FZHJPl;eZZ6Qdirlwl#5I0Cw$M7o$bl$p*BG!!0 zNxGs70sVBbHR60y?aczP_}TGp6@MJ7>Le<)fb=;8<-9{AWUI-0s}x>j@aH>l%Ev-Y z03~MmSFec@tg190Po&^Q_NSv>#wkE(IKMbHJl&xKKBa9VnZ`#&t(I)k74IF>sQ_ns zNwCGL*#Pq_V-i}d2Bt)eolv-YPCsTbYvpaJu_ zad0{+o0jLRzP>&>7o$u@=C^2|4Q{pUf*=%s0iqON_sAh}#7rxGTrj$;_mCGV=G}gT zQE+f|4IHsKKCdb$xCC2WjRQG5QUx;(NXBJi(R`f@g9sX#@-8swF<^t*_=-^(^_v3aPCeE* zd(tjcLkT4&38*qUBOjK2T9XF|!O4~j?K6e6^Y-0Bq$aHPm05$CIs%wzTf-TdHugc< zQJ=Xy#0MI~0qECL7)NQ{O`K$ul7A-3x4>Tl#V^l4&pfg~zbj`OAj1Z@j5R;DMQ_mt zv7~E$X|#x7ecuJv!&tMUT3vGm8SU>R%at1_L0on)Gs7WaB^pV6`K`_?vh9i;)nMaN z&`InuYc!Bp#NK{{86#ZTQpymhDt=gZs`V2qpfJom)2~P3ci;wcw1M)IP|p1hB#`4a zf#dUIl-6`Ls?yzSgZqWW_I*pTe-s0pE@xB&VNWeH%7)ubeZ>Qkm3_h8=hCb1KHGED z!9?BA71BN4yX0FfchC(fXa&H~GwvcwF?WhihD{+8ha~L|89q&_=D00j?dsSlP zl^$2sdTnhMOs^J(xy3Du8P$5IDmFvH6$ zT5{M#xOx@$k%(q2UZ29>SBuR=-dUyP^;#H>FWn?<^LvJMz-> z4sRCcx>zsNAc3R#h5>^0x*NdMbu#VvDgkFs`<1PTd4{R_6a*M3l0+ISp__dxU5!*N$Jdm$jbU!hAv;xkPK=k_H5ZW5ZcWoPS^FVa>eU5y+cEmJ z%M9h~3U0aMiGB&jO6{`+X?2+nI4BY>3X5iFy6#_#L|1Tx6%BxG-0^dzeYZ;uuBjUcqX$`R?s$pa{~k=l7>WA2y2|gkhbw4u?#x>YnJwm+nJTlDZ^7w5Vqok5(X%i=o=Khj} zn{X{EPtC-mG1S|uUVLfTG6N}b!;`-7+D`cW6Ecr@V#bQ=7kzDSgOJBA6ax2a85V!| z<4e_7JY!)nzS|D_We#?66hPRLYT)^*;z#NM&Bpq0z?RQ6%UWXJ$|7XQoEEuzb^_S$ zZf#tfYWycmj73?h7%qke86tsPFqg{pd7$N^@JYYW(HY>SWK{rWR|^paF9Y{VTWB$+ zM?Lqtb>p$c@ML@Y0KhF57SA60s4E0Stn+j80kmqpi7A7R4MO42HmBq!nqJrfPHMsy z<#BuS%x#6UaJhA^J8d#GzsE5STErRbbAal_GL=MNtD|$s9Gheph~Qe4HpxW!_hOgp zG$BH~eho6dv~R7h?QBU$wY8@vw--&fWt^LUZ!#BJkUQSReW3 z(|14TLzKb_YtVa%%LOl?XiyQPu(=hUxTPAIls26j!sMIfF9oMy#QxE=Y{Tjofy)o?50 zcdr74)^dloE--&Nvne2zb8F3w7tC=-9*a+Tp4G+!_}$IFH2g$xG_v&oxg;7F}M zJ>l|+ZEu|0E6(acjva759mj;WXu;9CYCi+P>Lyje``U#%$HFs)g~kbr#hs?Lh89Vt z$W?}>-DVBI;cNe_HIEaV8_bf4#jK6&V-k~8f>?1{#PyUR+$8oYe;F2(7B)0>{J;x+ zV{#oT=8Uzsv1H%8;t%eC{ldCu|LDiZQEM74q7xKwy3|j42{A6b#4bx@uq;Yzhg6`7 zl+;+m%R*$rKR<_WIy!jJ`cqQVP2p~DCi^PN6Sdv^f!fR83jV$$M~jPN&)@M4c^43e zha8A2iDB;rQxOL0bDDR~TbZWdZU-4$83Jg_qI2dhwpLzQ1hTMu(`f8r1R_dQ^dG=2 z>gW-D7$+3| z$C#M{td~+0xHwz18 z(YVN*+Uwu?`6Y(WNnY&&%%*#CR1$q_Te_tu)eN3&**zJp**E#o6dZm4j%|%UXN#)9 z6~bpc0FqFi(t8JUmVhf0R(TlVi$ci<(7f#o_uXtEJ^ts&X?nA`sI#*fj<-_40DzJL z_y?VTBpF*a6jAFzh?hYS66g}H56-DGp#>Vq36B?=5uQO+xN4dZzI~HM(gb1w@w1wC z?=QwH>NdJW#zT**EV{5h_c2w^va)L0)0T}YmYJ7}t6##r;>dj^;>oz(N z3jhm5U%2>Wu#T2mrYt*>_y`g&{=8}nJ|0m-Bs5A8P=`^{?VrFRR# zLHymCX9wjtMr)=G9Xy}e`NmyJhwSl+j-Ha9&x{atW`REP$r#E@3Z12y)S0V(`?+b~ zY;kf#LGoG6Jp$V_Z+-Z)k*3dE$({lXFLx{)JyNBG^h^m_vm=_&btNBf($*2OV_{#* zHY@KvQf2fR10~GZu(chLN1!DI)3&pApPdv!d-Z(|1)uIrb5hg{<_j?%rot8D$u~%C zNb94ajBhISt^E`{xxc8}xuYHV6IXXj5hqBy@rk*Msp?WnUZ>KsDB)cb!1*{W{cSS< znHht~{Oxl3U9W`cc@_|_ zT18qlmYNeuC}fJ5>ATvG{P$UOzqFW~9?D=@jtKTL-3)1fIsaUV-i=i!f7Iv039X1- zK2tu^gigu|`dndWQR?pY0#PQh;W&P7=MLh#baY!W0IwjYojkyiS?Vfw699Oz60NBR*|@GilYhd>HwdT-)i+rv19L6Nwizn2Efk?kWcMN z`${-P6L${qUG*xP=TRul(LNnhxnS{7cIT|EX*o})FI8G!$!qmr< zB+$`3L&jlJm>8!S%h#c!2+j-g;AknULf;Q`rm(=!3L$Kc%i3xRU!T7S&69CuRQ)h zbn(Fd8VNWaiK`0AXI6b`a(1%~KX91Av9WfcV>3{Fj*9W*ZVo}k%dK{i4T)kvUp=A0 z&M4XjvvuX?%&uw;bct?)GW=>Q5*RU@H*Jn?9^IMcG%1UG{#dp1W_gH)kM{DW-^gc) z*0F7}0rOozu4|x-531a=?10xR!6!5j&`!jw`cZR6XZV z9gAxn@lv=y0rgn|rsrxu3Zj_R&kmAf@+MWRlY;|VPPF+!kfCx;Fx5!DGORimxPFI+VZ};QL9Hwm#Z}SG{hjD%mFZ}M zv0dEJkX-`825)?}gXa^KMs5+q3YXZ3zhnqwm@EhZtx>s795d%xj#2_)rFer!5A#V@ zs|D@#Em$}#fMwBUgFT;PU#zt@)>jG*_p0;#29+9*f|ygFSdXew0G`yjP(9?7P3Zv{RSrRbR${Cc@`y|Du)3TiRh2Q#5W2k4hZ1E z<5WH!@?o7W=eZc?uS|+kS$JR_2wmJ#24%hy+?aXxx1ymt1iFdkc4;0z{#$OKQBqDI|H_D|QKV`v%amKkWEikO*^hD>GQ^Zty6A zlJ?*pq!u*B;_QoSR}BfC99>MPdyDiAR}LMdp<#}xRxDP z00DJeDiav@Zu?X7HU>dT0qC(*Y<4oJL2|4#)|dY zOsu{2wobHlm%V|@(SbIFsoS3=NN|*R6c9TzCXz_A)E$^&42#Sl%;Ww~QKWcYf%Vn5 zx0)7g^K->R$#Ze&aTIY*v_hK2?5>9JR@bI z4N{U*J_Y0t*?kG}oaBB+K2!+{U{dPWS4Y*&Rca}bn=Vh_6LR&kfm3pgFPF1c(H10S zK0djmhVaU-M4I-HSM4u_c9FT)MNIV15+XFx1wB64i;_*>&mtiP7~`|q?m@0P$ou!5 zG&rO%Idj#JE&pi9uf+|m2H@S%8ie_jG5w6`kj6#hsc}t{p+{u>Kwz=jSe5CKfh^*7 z^Y!N2AA*lAq?{51H8J191%98y$eS3-OAfxa#NOy!)_sY`r+QyL#dkI!n1kpAKE%6_5#$tO;4>VWD)A&fM^_MSgn% z6=Aidl*n83)!^p(M(ZWm^vngqnI` ze@aY>k02Mg5TDZu!Gl|AqLC~y;@C2}Uq_+pfBTle29n_CN+}^;SG%l~Y_MdgwY5B9 zKjc@#GAX_+lCvOSMpBN$oO5RoD|`2!clmw1AYChgv(M2Kx)A?F)a;M7i<3XiHmRW) zM9e}<_!D8@LA3ISULX0`F%sk`=}-&0yCi)AWRu`1uub2q7^R)w8=n#}o zoU-VsB*wknq0rqe1KdA2^{nQ+aai`9nVcYY^m+iIH0HTEFuH`_BSE)T7sY(zEG`;P( z#Fy%&*{nyRNO1kM7Fw-Xn%%4>^dvTxFfW`MgfUTL5d2B%A#24gR~r&xOI(;?fT~3Z zg6B@KMplE6`@9D`PCJjtO3+^GnMRi4F?4^c1!hkqO33IffJ4I`88iJZoEttwQq69w z%K65Dk=*#iKuMVBU$F)R%q~~_DG=~#$yNwE7R{hEG=I8(Hj(1(LK)S9Wmj=~xC{N; z{QW1#wiOD6^=}O7jdl>IpGVthNLt$^$&nVrW7FC~v!_X~cCw@_@-zDEY9+vq$x)V{+u7nt-i zA=^R<1thStoj=DOYI9+8WN_J;OEz%fG}rs2TS1DR9Z;#ARHjG`+qbg~yvz%jCXiK< zDUviAY-gSz{d!p^5ocwYpjB-Vu|qYzMIMP^2(|=S@8U5qs?J9!jem#9%h1mfU&V(f zce~HpVc;t0JWUD-y}Pxj>Uy?N*a|!YP>>*Sv?0?@5Nf5SM4oo7EuNQQyS6OTlIrVz z-}GQkpqmXzsW8QuK|EJpWX}1+0_$z|H(91m3Ov{p<KHmPMOX+`!h|_1Lm_~Kg16`hPIl3z4fT_1p~2FNDTQU#T(jvG*y?}9+!q|Sgkj19lNGSe-{#{MqwJW##wG7TD6|J3 z=U&aF9U{V_j{JH+f0Rrb&=fQ6n}G7cvT<48_Ms(=e7A^XE>FVjAJNt^Fr>gmwvm-U zJ|Ga!p8;Zxqj4Jk{rZ}Carf?fbtOQV!$D;XozU9Qr_eW5Udift)bvgflpKs_&S$;% z2|%!=d(ZZThWUeRcH8X}gDZmSUQ@(hc{vUA%arg)&VfFscO~4R${9bLNTv8>UG9_o_TUA9)Hs*{z5oI1T(zU4JlDECtjU=2{h~ zEPt?*;9T&sP4GAjsH}pIX3QeBDHB-7m7!Ilj3AZ7J&mT-&FFTT@dYL@VYK$IneMcw zFFNsR4P%b%0o(GRO&kovjIs$9y#uoui`+7`YQ83s0%lG6uP|?Z+*Xvz`KN_7i7MD4 zq9Y)d%?)KJX1L3(SB31FmeRU#zI+NgrR#fiSKJ|7cDWb|1&4mW8yi9u5wZ)T0Oaw9=y#*dG7kR5IdB2zqSy%aT%Cqv0b_M^zwO(6a4M9rB zdEqO^&RK{Lv_A+_M@UpgN-H$t;b`XuixD!d;igc`Pd|fO0qYV*RgeR@@$&a2h#|)E$!F1suu7gEg*v4tvzB>`0SStf+HIhx(4-z)dOCG17*r9$a)PkP3#A zzPMiwFau`-`wk|~1md|7&4noVN!7QD?9N^3z(doY1PV-uP_SaqHe-`QJIcn@Ry&O5 zID6Zf8Cu!Y*^d@Tq|xk7^ZH)Vd<<1RyQFusPbtfi_W(9#jf@iNobvcOJ;#7@k_R4B z!DcITmHBUAR@Msxswf>{ntCZzzk?veH{TA&Be z)89C76TlMRUMlBS{AE+L(ceuZVY4$qT(DEcM_uFXc>LbWL<}3KWU4+QbQpIMQh!Qt z&CQ+l(>NQ!OU6`NBW)Fjqg6y3jSC58c?efZA>BL}ir|ifXfn97(*b)Nu0?SW7LtUu zH9GQ^YET{G_?nrWI!|DAmzi-6&r^&NGWJ$T7C}MRi4t{0>xB^h9Nq#+aWW<44?!l=}@N(1X(G%8qk2F+SGYx8n!yTo$Sd}IH(=nVe#YjTb7k}E!b+Ymzm z6Wk)C1c~Ef5o!^Z1z1jEB5i`D6r%6vq*D)h;7ro-iV__v&R1a^{LE@~->8X6W~^$= zM%pio*>fd@Na2nGZ(s4nW6C^7SgX1l@9*5wvdmKm_et%T<7OJ`Rjln>wx`C4u0u=J<8Cwuhw=hz;{21B za}Q_0$#!?(K44zS!Pd3gB}(=dmNKtED>NzMX>fHP^2)N4&Z85VmK@A9=-U zC!7f&IcfDvl#&}X!H@GfdhYqkQ7GlvCe0U*diJqdkk&5wq%1&Xe-FhXe5|4_sGNz( zdq{RaU*aA&axc&^s6(rik|-vwhs z%HGC>h{`IY#=+m5vT{;m98|RTmrvv0tbA^YIU+Zb@AWP* zmz5>PRnBy#cufV%)X7FKm$%cZDTyLeI)9%8XP+8BkQ$kL(q~WhZlSaC`4-wX?o#Xu zYK;m0%Ajj*GVFWCx?85L6*b?#01{2<+F-lReUD03TwP6E2B9bAMWoAK=wBR~PVLjrM5Fwn10z>m{a}yTNPweI!Y|aot4Y+#r<+XsEs)`ZRR+;f zMx&&ORS(u4{Rj@2bpQ05PTlaq#A;v0m>vToLn!I%hs=_H)VsH}KRveoap}XX`+v)L z!7YK*^H=vFufVi1g3Sofw{e@ka3DAm4V0;QpHT+7!F7N(WtR992L1e&fwqAPEHV!Z z@|`K}?9Fh(S5L#CL@$x5i>hO_c^_fch?B);qX^U{CS93^&A9C&HM(jtt{yhsPKdCT zRP{xpY|I?AsJ+$n%aCI=>YanTdB=r00Y3k!Gi#x3ju&%_*{I;fF+xconjgeIs~K;H zRvrvs0UVv;L_8AAjVQ*oGTO~Tb9%o9 z7pKVF()$9T?ffuXMEOn8K+cj!s(jav2wL(nQE&BuHbN;Te+!r1L7b9|%$EGCy0(x% z#y}5Gp*E629(BxFby4V)Ww-g>mC4K*j7Rq3G`PH{RCyEHxA2B6Z-mUc z*%0jlcUdNfSIXEY{IPG{3h768W-js=l5EcndOxSOKT<)uG=q$&XFcY=^TF!?f5qyU zNr~bb=Vwj~kJI%v(W4@yH?)89hG_TOX^JmlB%k@4!x_?PGd9Be^oDl6fS2E#F*ne^(O|!>Lu3B| zD_jdkdQN?*>emv#zLyU+$nvxgN zFY`%)Q@}fRo5*f zrijSE?sj)BNXYiCW5%Rpb<_ppIoW`?9rhilP2J{Bqb;qyITDDEonO3Ynr5#J;>3$s zoql_B4zrgg+ht2!!~+y&%kXf$Mjj-;l_05)Hrv`N@bwwh-vMhWz`eC&dVD&~tz;&X zH-xp|N#?8c>I>I6*eIBT-qFV+Q06@mO?oa@{G`o?JN#nEsJ6=yB7e6fv)Wu^g-?@a5bg@%YwWwVWCRnNVH zT#-%Gv?Vu3Ij-Yh4B|kt?_?H|;|8ef3iFp`XxWd&Yfb$*0IFT=HezD4x7gDHNxv5s zA~a2p0{6-urwMf`Z9zt;7Py5)`5kzv!5pCebKID%RWU|pHkW09Pn{f`A!~>pjODl6 zx$Zmn^0p|DW-ZG}d4o@W;Bzt(sQQqz+Hlt9dwS_@A)sdQn@j<(T3f*Q|@RBThxBRY)hukyU{v)mg{tH zy_0ju>=T1i9=A}8+Vn-R8((!rM7&4g5yh%@h%jq#NIFfrz)p ze;fRjb3sA~me$41H67Nr_Dz;kXM4%oqJlLRS&;th8FO3qx@)yt+zKujBhTr-pxe&z zJ16Seq^%~6&67DiV$quIV&ulE_u?UacttxmeIe)pwdK3C2R~3!YVcyQ6064Fw{t9G zK%mfdH^j)wvJ2>S3;S?ZR+?`wzKLm6enb@zGZkzgGX}>^@JweG8xb0o!tX zUoNeSRF45uKaHf!WCOFcAnMy_Q7#0voAy)R1l)En*??@dbN6`-2_VV&IIYw2I)t67 z3&L04>m^qFagV$@YnDpuSr#NHqhwE(3h1eY*E9|uP6M52+Elt6I47^AC%v`_XWI+; zo7mr16Kcm8=K@gu+RNMz&ajwi@Dn^Y>!*xdg3gWB8x0RnMjs#Uaq`*MBmw<{*Hi)I zV(>Gd{+ybRG1U$B^!%Isa^Zyp@P_&BrX-lgBY4g<@4haeX?A@W7zGnN>O52*Y%#Cg zK+OV}o3HK|mK!B<7?-OJ8vf~iAlXJWYYu9`S3|@c120c%0)AOiz1j;tLb8=+Tv^AO z%Dp2fJmh5a`>LNw_enL*$VIzI`G-$m@opAdl)ystDl7sE4G)hmraAN`I#3bL+TD7T zPd)u~QijRjo1I+j29@wMprmaKbkTl19-8^S62CDu5X;xwI&H_7vOrS^X0r40cok^9gO;H6MxI9W}5jUkG zau~9xO9SOBhxcmPUlyNZWi)BJ$%QTvQEt<7qIV}YGSEQLQtJDPH*NGJi=r<9YM`Jt<7e!&k?*Ej>tM`!kcOV7c|9Hsvj1Ko7a zyDWqkvUQURhp5{#khuwz8!(y!Kvq4RW`8BkSuaW^+G zhyRhhRcguED+F-^C@R9Fqbq;Ku#EYX0BS|f>Yq0-E2Pg=CBg2%XjnYoetrf4@h@nAW#yGP#CE%uUr~&fyD^sN6 zg2lV`95~#P!gHidJ?NW30i-*LmfmE2Pgp7e7POW)3rIWmdHFe$xtND=0#&kVupvbl zJzF}gm5y1Rod?Dia5Ndz<3!sa9#)9S_92pVrg%3_lA@<1eUG1$_o>``#{(I$u(LvD`Ib0rZ83+B>+?H|)$rJk=B3!CoPHzk%0AN} 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 ZYa-OwqgA)&-SUNzK=~VYO$XMn{|6}}&#V9d literal 0 HcmV?d00001 diff --git a/BKPS/OLD/XAU5/Indicators/x-saherelm.xctimer.indicator.ex5 b/BKPS/OLD/XAU5/Indicators/x-saherelm.xctimer.indicator.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..287397a3dd9dcae9d65cf6dfd28d815723737b8f GIT binary patch literal 11804 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 A?f?J) literal 0 HcmV?d00001 diff --git a/BKPS/OLD/XAU5/Indicators/x-saherelm.xfi.oscillator.ex5 b/BKPS/OLD/XAU5/Indicators/x-saherelm.xfi.oscillator.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..726a1687cd747c7293e73e935a59c3734eb5489b GIT binary patch literal 12306 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 TATa0$v{7*^8zmO8el7nCQlh6B literal 0 HcmV?d00001 diff --git a/BKPS/OLD/XAU5/Indicators/x-saherelm.xlh.indicator.ex5 b/BKPS/OLD/XAU5/Indicators/x-saherelm.xlh.indicator.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..e0e1109079bc6dd78008a0510273e0b603acef5b GIT binary patch literal 15364 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 EA1KgrqW}N^ literal 0 HcmV?d00001 diff --git a/BKPS/OLD/XAU5/Indicators/x-saherelm.xobd.indicator.ex5 b/BKPS/OLD/XAU5/Indicators/x-saherelm.xobd.indicator.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..5c52e3298a9cba3f0c9582be62003e8c099362b8 GIT binary patch literal 16678 zcmdUUQ?Mv7ukNyK+qP}n+{^Y}wr$(CZQHhO`|kg0=G=$#e$#2DP1;VsB%NtfQ4LlQ z2LMR~0T2KJ002OMBM^Z9LavwBUI)^pgjG6_TlOp3PX9&uuS53#3jR<3f3M>K0RZry zDgXlekN;QN2I-UhA`P(^V*j#A_LP9mKw9vm5_%`IgwX~V5DRt0Hh~9QI~+3k&n#g8 zI{Mb zB+!IYCysjK zEhwcM5FDB#1aG1inQCq5xLZL!eKQ}ufr1#Q=h}+pStYY@& z33dClEl185+OBj^Ci?B6Q^9Ma837C#(w_lZe;d`o83i`my*?1I8G=HYPX^XoP#!l_ zHc(VRYLTu2B9wy;NJ!X$4+?d`%ad%)G}02+Gug%w$5U2Ao>=FbKNn1ww}p<&qgfH0 zy2$nmUd!&31%la!hZ>H&3c`dMSCu=}BOr<%Zs|8<5eU@d#5Vy89ue-ILnO z8oQhwUOo=Awd$gk{L$@aH9Q`VTh8&!?n3#@5xfL!3%%6Gl7|X-DL5HGW^-bbO|*k8hJ&*H98vHRM+jp>}vl`>IS!e1(`-8oux229RL zyk@(IMg#4pZdorgmbZk!r|t{TsWFKv8FYVdrd8Bf{N36scTN|9VMGn8U{wR@S*R}u=i&(T`^g#8jokvq5fcz*Jiu;f0 z%yqSSc)^(Hdn5XU@dimaxI*3vMyBGP0_jrxLQb>F#re6Hg@ka#&eus zv(KV-2cVQf_>OjJQjizMwfu~WpBk~2#u{}q3sfiKug5%ZL+;$WeHqRj+nZW|0W>5$3qE+RY0AU~d zbm4_t@R^N4n*yr2(M2IDhT3A`PvWR`4I5h;Ll5r{p_S0-v}16(Ymgc!=+$Xy z5eKjJNdE0}B|uRoBYlLe9kzOIg#a*~v-nFFSQX$Pr=@4e-RKN_$biP@DqS0f@59~? z0D0D-UXESJ1HmSGUz1Nhl#!T`1BMA(B)8qPLa{6jUZzdQ0BBRCCckrv(m|st^e;l0 za7tTCONO%^Nd&?+sMe0|U`{kP)%aal{>@2v7-O?t^(;vQMCzZH`bXUk-#ul@0xPBy zNL4{{py#yH4t)c=;|Y1@d%QfV#O7M1^fY`~ro!U%W#0bzvXZBM{&0b+uI zzXVDDOeu=pUZ&8!Vh-5_6%kXLzo=n{DSOy5A{-$hi z67DXXra%rqZ)V|=T5o$RVAm;+h_TqV@9P&$$X9W5g@&ZfQMaWj@Da3XPRKF8^q&c7iwMw>(LP zh4yf1U&P+?jrkcF)`7#&4kOx_ z>kH>1<|Li-x{QSCZYmu1_OY=DGCiE8DR7MyWJh11+Fyz7PkIkFj`CG_3=X_&8J|h8 zdt1VNy!E5OT2}OVp8~t@rFG(0nfz>*s?TqHp##XAb*~7;4r|8o(~AlH27>A)yEr z>~zC~5&2nN#agc&fab;~KRB;1Gf74gjPaxj_FpCY(f-oewz9I;b9xcng7<_KGUZI^ zofAt*)dm_#W_73sW$u3H`y=NDB>sV;He{CQKur)< z89LsY>X@j6o3(S@btKF?SNubjTz-Sql_r&nYL>c`oe(11N-k^puZLIWTVxeXy&1Ew z(c&aHLD?YQ0WUfa=8Z{j)i3@O6jbPIC8T1EQx#m}L!G8f!Qu87O&(nz2xnm_}a6B8L^mucy4Cp(Y>B;TB3o zXCn>~LjM)_I59pRz3`;JXSn_p*qb|b05i_@uYWuS16?+b=P-QA!*;WuJoR!w5;O%}iXZaeGdjgPn6(uabE06&y^8t+X{olL1nirseb z;I^-~>#D`pcWGI7A+Z6t{3e8(y z+N8HY4K-~Xuz!vk)M|~qL$a=5$ z;+RX#ePHYx$g@>|?*blLh)aGibQBo@zmV@V9yNX<+_TIBWxa#uS@gH?qH2ub5Wyx3 z959s&Le1jF%UNbEx2Y)H!Y2tlxU)*7SiX) zu(0`!^#TORC(e271)t@enW(Bz72FNaI1sA^ueRi3LWwEWVxYomr0cLJl*kk_y)Ugx zs8Uf!(q6jo7VsftzkX?P&T%}W+f>w#gwKV>U?~Z+|yjmrKIDJOOPF^ z!h)P!Ij|4Kkx1rm?9>SKSF__=FgNRCpHjBuIRVi%YUR`~bhqijBFn&a5g{>QM$@NG z?CY|o^i;PczvmGt7f_|=gn7adO4HfVeU)Ye=$(>h(L4$d{5HVST8U^+J+Vx(wI_|$ zBC&HVx;QK>EEf$jddIzh%zjtQKWh1f><6ofj-;sk&VE1aqL3 zc>VfZ6jUVc3o!$h^I{r~9A#2jT#5>PE#iZ!d`JMa0OJFJKp~&kR}upCeYsxR=e$Wq z$%yn!=rN&1_-DW2C$R6(dNBSIZfet!L)ZceyEBi||HnFUHq zc#>Hp%Phz~YxSRIN=-RO6*uNd9#XHXS7t$kq8Q(!YBv;o@8qMvO*LMOTx^9-vf@&^ zeQXmURK}qAWbcC`b2mvIqOnw;L?gy8k|!7S*=odn@Nd<3_RiDy5m)^s1+??FvOpW8 zYr0ESY`JYSC&?Dhn%^JS-59O2T!HziY&?;FDZ%2J$r;#NmD6`v5%oLxdMx}3O9ymD z-02XNrU1O1f76VFZFepdn-xr|-}L-81KPDS8j#HW1;4mf8GWjB0hjH#R)^Jr+kaEM zis~Vtv@ItE-E!M2{`T;E=@PzxFQrYb_Uok!GJmP_hybb4Vf)3u!N& zinR#)hgklL=B{cZ*U!c!8siuomPOCgRj`O7niWPtS`{u`B2G)(C?E7!mfMrRX)S}+ z@LRX8L@HgY-i zE~ya}uN@z4=iMN@9Zh)d3Awbf42q&VTZ;jm<5Wl29o@s2DYj%b6djFGr$fbAR{h#I zF1jGkJ>^lDM6aPfhZ*af3&Z~ToXBlN2R_52YG(=J4?5>QG|GvEyuk?m*z`uGg_Z%q zp2G^j+FJSH=5DhsI)-zwUWvPCXAp&Km+O{DHF4U(j(mCEo_u3o3_LKs{GC)Go zJ;H}7@d3O>LDrj{XaJGMyoh|U%*k$O?DR`7IJ8UzL~Fzvz z3??00G7E4PhcEzG4l0Yaju)GvbLJa1^CRx-*$Nwvixh#77W8HCkX9w;RrIr8EKXR_ z&Vl@gOZ~Dw*qlv#b?c}f zpT(7WFOsOCC@{nb>buJLt!tNqufXBXA8^kQ^k;wW5b4S_6XoUF?7$ILq+N)@*qTAQ zwA!(Ef>T^^-_#0U40V1N@LO}HY1#MmN*u1S;rNV=i>G;;#4LvYVnWWWy*{>{4b>|MF0)^kaB2$`S`lW{HAgI<1}@T-W_cN&BV|L!eQZ8f>~R-QTMt}b(uff@vLdVpvi10N$bSO=0QmtzuIj(pX*Ca1H!O`l@W(yjK8=ZZ5j$@tK;c-09C)TkK|WiTV@YL$3_}fdk;nN zTM!O(WrjVUP9@`!BgpIdS8W%|;-^X?#YX^YAkIwxT)7{9%p`KD_-+V@Bd^K75^T}{hi zf9{(=K8caLs6yd^n*em{xr|-HmEQ8UkYspBM5L3;byFuQsw$zvw&#EUY7fVM7z|>P z44(|)zSBY_;-T`MlFP{yrL5N(R1`2Tm$OPF(_hHzdTj)}45arhs_FJ?Fc$zd!bCY4 zY{>Eb@kXQdi(|@kPTWYImd`5-ve#G#QRMAAbPdv{2$agaXV7?DQY8nX>EeaxUvg^) z!raBVGldE-@I_l;ggP$cqk92W^rl2hW={B7&2B^z=N$Z63sI)$#PS|u)Gk=j0=OTqF|cKsWu-3FKXj-wgkCf5s{0eu1IhY;}% zjp9jlKl|KthLM2P>d0f$HB@R_Xe8%x#DitpVUbbjp(tp@{DMVxh=euW?tlU-<8BJA zQPVsqV9mNDJPEyo6xJ|+Cmo<348I#OHj2~i%Z7Ws3Ti$93tyYfezQ#8So%5H$@p$j z%*@{w5kV>V)I4vU4ntJ?F@#D{_jG`d3?{O}qcFfWy%OF?vY`R>)g4mxia6QIP0g9D{cQUdNzy+3_Ix#Jb(bvm39hq&}_6QIzZyTrvAI$x6~-R zIE(t%q#RdYyx4NHjK-@ty=vxQ;8*QI0Yq6Z7T!VD5;#K_2yfbBFPZ&Sf5>JN6Hkh& z7hMcbYYX;{JZ2y%7-{h^!in1_#XY1=cr_gKB$<}UNU2aC-ce=8#?7mtlkqL}y`ZD7 z>r=YNgB?2Zp}SMg8_{)nV)mnREpkz!}Z zAhyje)a1T(W5Q?MqBs6|%ddhe>&fLggp$UFU}v_^Z$~3s0yf6*ii!dotsI1=JBr}m z%~DT+cE4OxHBCYbo!UDQvWEBUT0tqs7pD~uBH?Ii;8f##ae&~I>&$N1%k?(#Zy1TD zg`lW*0Zf3QCj%Yr<#GhZj(bKV?H_Vi(M=C*wrx0AmR6}tJkhF|^M!p$&*kCh!}*n_ zfB)dR9{R#paJsl=@+{??#&xBe8%~7Eh^A-~P8Hx-@s!F1%-})g?;(t0n;Lwn_v6Q~?ms-Y?2V;9O)N z?^QdumGh-8ftb2zP)OMyf5aqF?0@ zL4v&o!(NHFh(81?28j*%rav1TCE-1Yp(5NN2=x>1Vl`-!k2e&Cv6cwCjCp2J zweQcQr9~@_$}*u}B9Ed)tGzdw=qCAG5euX=G2(5<3a= zUZ#RPps|?9`-VqG5=tu?WHMnuB;xIae7f~Ql&uxH~aE5~LmO6oEuYYUNQAm6A9rr>X#7=|T(9eJlT6!*( zw`Vs*OC3QhD3Tq4H%@cbfruDsB2e3-uAn*?4*0l=d&W}W@=l&pghGwdRwGIB98xc7VkDJzT}hq#>$NA#~}6ilL|4Mav>dX!@^WD&Y#1Cse3yxgL$2m6Y>Wz4eT=b2p>{>^D>s6z7BCe`bjC!!a zIFVS6NFkSUbb?sGkXE4qVbFAapsmuVpvFf1u5FxxfPT~?+k(vvN)amSl_YUh2T8Fe&N61B{m0H0clm7 zumvOL>Ah?v!Rfwm7fLkBPkov{@to_-9@kqU5HRjPSSEj#q+S4?{_dZHIy@t}d=K;?vu(bm|vX#}x# zv{~V2Biz~#E}7W6)B1QCLQu5fsdBeUA3zYFSQku=W zqjldSluasblgGKxUWbxA?Ipgyw<=ke+l*Eao8XsmS|q*!U)VvIL{uae1yb2GRZJ*Y z)pI0g$+nM7Cl05rCq=ff8RshaYBbJ5xMVQI{R0PPg15m_NsFtsHs(@}nKNPgC zr|iX;Xs9TvE}}Y<8QW{RqVb##-9ryIMsNKw3Ti#FmMILxXT?&+B<+A26_-O`V^H!( z+7X_E-qc6hS`=9ZL1|#RA1Dd9Lh4-wm!%aPfQMgbochBbpMA_kmxXt!w-=v0F#393 z{?hjD4G_U6!dV1WNM~wh7mzo(x%Me_sUQ@m*0pZd>6GIyiTGHIrkiO>)u_{BU=tn* zZs~)OBto9WI9_Nnx|FdWV_Gwfx@Hoqwxb@6R#vrERh<-Il{UTAVfL5{sVxjGZsSO7QK-EO3Us0?EVMeD2joL*7dCcwYSkv)46k` zV-t1FF+nY@KD~kjn^5;jpZzC1;-qWcqSsEdr! zV=WoUATOr$i?u73{kEyD;$LwnN@UHxX-=cjlm&>n?HTk4GR^qO1^>BUHimz>(n)1e zSTr6v`uxC1;RrZ+#~m}QI;hGdrG-f?$@wsWALAW~yF_53tPMtCVTXM4rS{RME@8gi zo+pbMcf86N<6nd919zzjmY+W{^bn_W+v1kFR$RfXJ{GeceYEqlhGIUwK(g`u_rib6 zuW)~?q*jU$*4+I=me(~)cUB0VVpg3@Qy0hdL15j)r&jw|$t&-q2cy5#Bn|F|NtaxJ`#X6E=5G+rQXve7hPEcGvtPhgOTGoisZq(_M;vn$ z!A?CIT^@aFf`+n1M5(YgP10Zs@6B8ob}%Y+?GGA!{1#;&w@R)X7cHF2h_-(SnOCKA&XZ~sOg4$3QB^Xdu0xfvwMx7kBBMODinb1EIDTm!*&$EEW6r+fA=fvkcc;KmR)3Tjxbp0cfSXCbflYqSW6&Shm+nH@GQtW3u~8 zdvQdF`a`I+(|BoF>$tpqR-G)9;*D^*h*#MPHKPmoo8VG&%j8|VHzSQ@F9eA|hbI>- zuKa9$$eL9iY=(6Uk$y13RGjK>)GSNCjb8Cl1FDQZe=X+ zE{ZbGb0hI1;Kx9zg!xRfWJ2det)hH}2^Ml`zb2rMzwwE}1t(329Xk(54id(z^Nw<} z0IX8#hAJHTJ%F1vO0!7;OBw(rN2TH zzhl@#1C7s1Bq2FAnC^NNJSdaQXszZ70u2BCf}>DRr5XdtR~@K;t|PNap~<9zZ*c@g z@x13>laVxxv%fGF_tMee$)C-!1Jnt}>9Ie9qtf>4w4vYp03+AtHN&n=^SqdaRhWFM z&8IS@#3369t-t}gS3|<*MoWG12kK1;$&kJ+3}bl!E};HwsM}gyVx_MB1UXXDcJJiA zog*i)^Fd2WwwpkcRy^xil5?7~a>}51m~I#vW|(Jwtj}^Pkc-&~a(=0lz{A2S| z(4PgP(^wm(i!NC{ClX?V1IHkXXg^>7zL3r3jxQZhO9U;pDE33@QxbRRnl`aLZ?s@7 z)7P#Fa4j>&^akO1B~;|Eb)Rz2X7WdGepZ(8`Q9;UE)_vJ^6tnJ=UvQFkCxA@VNs+P zj=$j&JDX%d-U3@VA9tt~NmN{>jv9h%wP+itQW4m&bPF7Tt)8%cV<=Clrn<(2z0~C$ zH;E9FeeJ*oCZ$vU0mZ|36O=a@6N!|xf5>pGc>SXbzs}Pp$4)oGf2jEa3`0MH&I~-9 zQ_u6iYZ#GT<4kcdQf*`l0mR$KAUcL(aaVUaHb@`lEA87fL3J?)ouS-GB7t}0s+qd= zPW@|Vd~VT?C%o#^I}Xw6owKA<#!FhxB^Ig(vwS$a{HX7RJUyODSR2Hfdnamag@_^l z5+Zm*-E<$Yi*sxx!>nD6l&e;n*m+%5=@N`2M8*s1bCchGscYKPmGXF9*HQsVAS1ULGRRHyfBU=^9e5~>r+z_9HffMG(i#o z&Zcc8=KP%1iLtfkfbP!(y{1>WE`GdRKppN;BTJnN8I<`krYBwtFCoUU*3#9-phd2( zNZN$f?Tx%Czz#$=F0D~HtUqhK(;d`E8e!9z5W`FAV#Rxr8{DSk%)YoBizI2wH#yYr zSIz9}kRtq-^3ohFmL$0h&7NrJ);VLkq}2Z&DHn}~>=&xcS^$|!Aj}NuR~b8Ik?WsT zYu+T{;KeK#{q+ZkLjhFsmj+sb`krBFu|p!kegI`}3q zG}+u78?mCp%#%n6hT-wg&{=QTBSzsI1kN;3iS2eH35~C+RQWzmV!Hz=*|S2NXH0qQ zjHo~!)^G?NdTc zdZCHoTvF=jJzWhqoC`h9;HL({JbF9;%0J$)KyO6fHPd>VU5kOQO^|+(J>&juARl#? zSc6@-eI4vE)u+Z+krbLzCa((1h6A$PaHvr}a+f2+nRoM$JVZ7NE6Fy_$WAAbdh|`d zjtu)FPC`Xy0|R&q0~%WX1)*;8as<*qLS_t?b}BWgfA;pk(e6|A*U}Z0rQ-?*m)G?Q z;$&tuyL{oSftOV8$yg#VKU43ItuV?{<7kEGE@{D0ppr3emRsw-`>^I%&RC0VKur81 zcLvdlstOAiB#7vgD?^i|jlQ2X-0jAVsRg9=Rk9^8=%0LFrgrx z#~D4terc7dW|y3jF5&W=m)Gnpt~&;Q!$NIl-uY>fjW+uZg)hvp0n8L zDH#NS%RM0Q!-_49ly)#l2JR!qg$LPbksMaA6^K4JMoO^7z>1=1j&w#q+(443SBZC# z)!=LHy1 z7@R;4OdZ_yJ67iqOC8#zhzch%DBrWa^eDP*>&33oOU%PZ3nM51GYSi5m4-i?VF=8A zeQwl-i!|ZrkO(U%w!+K4-4Am-)#tW~mS2BMwnlO&b(_3b8^H~D~wP%%NGeU`w4@ZPQJ@dxOvQ?`O5Bu!Y zEupSZEP4BKenLYJV9|Q=q)W6C{WGKWtWn<_-#a^Xq)!r--6}xVVcrHG?;V%eZ{kZjpMi!v88i!#ZL%y;is4zJzAJi!8P07bV*@4m{r7P ze#FIQlFW%b`sLRwh!#!qHIA?`kxG~*tW10AUdHa}ryfZv0g5@wC1rmi~Ofl?@36QX&cHziDs{ z94W(4+w=-pbwHm$MbQc3gRkxGElD!s8Q5H{OR{Binr6nF71rf9qkz)+=%G0dNq6U$ z&_7SCsi|^)D{^vWLh9c6x8$Jsczl2mZ4Tcjl1^FU5+et1sTK1Y%_A(oh#IkJ0w$q$ ztYI7h)q84S4s$xLtUO;CLh0e1C|A6mugf!iUML$dB(FRH%Nidr0JmHbbGoMJoexlp zMZUWU!zr-0&V57-pM|o>-!pAVM; z)=GveiW)MKQ)3cm&cnHCpFHX0m+{Y{O&JsEeL`-i(cmP1AUpFA!wroBbz!;b+8NKH z*N@&#{x*LV7=_r{k~ZcA&*a6?he2z->MwGTThL661>^pum5 zK>`*L=*Pg>U~eg7HMQ4$aVAm@Cu=2u89Y+pt$>;$U5YBawy~1Q@0*WrfaE~AYB(y zXNd&`rYw!Fg|zVZ1|>{!wmT0{NCQ{*^i0~JugJSg!*xN?C{fAb4rdeZ$!?Uv?EpIP zimB3rD)2eut3zSeDiUX{Qx8p{!atxF<@~euJHxXd^>N1a$Si1aS4TGPb4xIE->Cfj z#gge9J1v8L>Zvj(OYvB8byZ%Y0D{rsi5P*g^H*FCW}6xEAvDrAkr_3R?eUZO>T^sE zzptkqk6gMe>ua-2fO3p;%*HWb{+hU8L+w&fxrnJMO|b2xenZrNAEqodtCXz)3TDX& zu>o(Ow4SM{Ze3AaeV^l3w%7AYFk$kh*?hJ@$^jV7uIH=Nj5n^==PcRY!i1*%%BYTc z&HlZ}6>+|E1qbu7m8>&pO(*^ZX4=W=dYvw50kgR?e5$Nir`;ZYejH)cd3;U}oeei$|EIN!maUa9_Hp%+}x;h&oW%TOAFDMCn99Iw$Vc)55+VOVz zRgp26UkR4+Eyl|-Hp2h`ZQHciR!AUXTZ9Rqj0+pEOFAbZpF6(&z9Jk$hDPqEY+WXs z$|wdP-eqFj(W-jZ>iYM`xuvRDAu;Xap0tn{Iumsvpaykb7{2kurXP@)Z5@*@AWb2> znDF;f;rTXlC4*d3i5FGxnTNE*od16NVi~M;tpkYD2Qj&QC1!>y+Px53ZT{Bo%tWC4 ztakHY5-jC<3Uc9sn+7g*&R#Kr_T@{YEFGt`D7t4OgPq4H@8wXgOqR%S!NHc(m1@RQ zs`gDLH=O&Szx#UM{)#F?GCO=m1pYg?vQAbp|6X;C)r1-1d&uB>4#8A8Of8vgcl4jm z4~27Rv8ezpmCOxM)yg0s7jWhq$>@q|0tcw_#x-)J#l=SYnB7lTr_oc7bPPiTw19>? zq3OYM2Hp&L?W4v6Vt1zCf}e9$woNbsHX0cm0$;=mL_AI*g+bk=V5vz@i46SyV8?WF zzi$#-U4&%b>g6JBWv-_`Ugvk8T7tSW!s>s%T^0j_IBy)L{VAO> zC>m!=dpNY$!28K5GaqT-OY{#30z1$3Aqk1qE3;JT@6?44t+<;ND(M*|y;?xzXvU$6 zV?5>q-QjqpN{5p8yxYhwy;E{krt-|4d?oG}88n3y7jqdg=GtB#)ENndmAL#%p&PftAE(DuW?vstMSA691 zjbr>bDGIcd@s=$&Hlb2VF~_$8sLd*}={g5ut~*z0^5@oFZY?n|XD*{;e}1J!RpGf& ztpO-cSh-C)UG$RY&95C+I1OS!YfH+u7zo!J|8}=)?$=R|5Z*0Z;Hu_djx+qZz`7KF zzfG7;77x(@6FphZpc!2X2P}4i9y2gJmdFHDjp zKa=O)G-9rnD4e6|M8q&1E!LLqyxd_Q?~O`lI}<@GI|XuZgw{y5jH>i#0axb0{Bf>OR^(@2S@x1WeL@H}f7^ z?BDhj+4fEw*Lw}sR8Z85ECJZ$T$$?f)5TW!gM%md_nP}+jFE8WXNt7HwQGDQZZcar zVS3ONGOt{3rP4is*GFzP0Uau6K2e(bB?8~fyj3_6w6tT!RV8)Re0l5if5v~N7KBe2 zha9lv#jp#6imi`V+BeF;alt&A*P0q2@$<&DVRk_mZ9z@TIG!#%!tjG) zHxsP3s>!Oq#yHK7uTZP0&|;&7BuW`?cFwhX@N0V2 zfR$v_l-JEeVI*r$^lWi*PD z;6SjHs{MX2KmJ8dSHLbr%83S*^4fORHg3)3eRxy%rc8hE1HEN>2U&DY6(}7tW;u#qr+5=d5?C#RDrM20wDFgK6wsC0v}A zPJ2mG&mA1xwU6l{;{cQBc}Cc^b&k^jTZs~3HFiNi**gq=4nYayPk7Y}|EsRj5tUy2 zNWjnW8nZIfC0Ih1i&W_IgstV=bzxMZl9Snhgv}Mgr*sy4h|I3Ap`KfeiDtf3Vv3(w zksZ*`UJv%x*7=k^L@}5cOPjFOBGhn0)xO-!)>m-U6K}H(s(EaYjdlwln_}mF{Ay)_ z60FKG3^-7-RQgzs*SO+qp3LT)UhOurAc&{AQrmn>N^V!MMRmfOr+0>N!he5y_1^1H zj0qY%vmypQTa{dmXr!7xrmt0h@G@FuKz?^5qmD)>vqBtSXn}!NhqvW0adtTYnTMhOSoc2Eeuy0M_ literal 0 HcmV?d00001 diff --git a/BKPS/OLD/XAU5/Indicators/x-saherelm.xrsi.oscillator.ex5 b/BKPS/OLD/XAU5/Indicators/x-saherelm.xrsi.oscillator.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..c8420b8e7e07a9a71b6faf68dbbda596c0743232 GIT binary patch literal 19320 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 HgBT1fd;C{_ literal 0 HcmV?d00001 diff --git a/BKPS/OLD/XAU5/Indicators/x-saherelm.xtd.oscillator.ex5 b/BKPS/OLD/XAU5/Indicators/x-saherelm.xtd.oscillator.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..3f8ea0d993788e08acdb392005aed8386ffa6312 GIT binary patch literal 19266 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 literal 0 HcmV?d00001 diff --git a/BKPS/OLD/XAU5/Libraries/x-saherelm.draw.lib.ex5 b/BKPS/OLD/XAU5/Libraries/x-saherelm.draw.lib.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..fdfd9cf65fe241aad78065ac1ddae457929d186e GIT binary patch literal 8358 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 Jk&dZx_dl~09y|a5 literal 0 HcmV?d00001 diff --git a/BKPS/OLD/XAU5/Libraries/x-saherelm.log.lib.ex5 b/BKPS/OLD/XAU5/Libraries/x-saherelm.log.lib.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..f60ac0bc623dac385c959320331f5ec878a352f9 GIT binary patch literal 7132 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 literal 0 HcmV?d00001 diff --git a/BKPS/OLD/XAU5/Libraries/x-saherelm.models.lib.ex5 b/BKPS/OLD/XAU5/Libraries/x-saherelm.models.lib.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..c44f384f2e77b25f263ae3dc30234992310057f1 GIT binary patch literal 6566 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 N%Y_ngr@&E;{{bvDluiHu literal 0 HcmV?d00001 diff --git a/BKPS/OLD/XAU5/Providers/x-saherelm.xau5.provider.indicators.lib.ex5 b/BKPS/OLD/XAU5/Providers/x-saherelm.xau5.provider.indicators.lib.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..3e2a65875aa3c476d0a20c18156d0fff264dab47 GIT binary patch literal 36934 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 literal 0 HcmV?d00001 diff --git a/BKPS/OLD/XAU5/Providers/x-saherelm.xau5.provider.inputs.lib.ex5 b/BKPS/OLD/XAU5/Providers/x-saherelm.xau5.provider.inputs.lib.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..c79c0355e5d6e86ca789324e04b4c2a4ec9f22b8 GIT binary patch literal 27698 zcmdSAW3(tS(=NDe<80fuZQHhO+qP}nwr$(i+18x*-uun`m~YM8zc*RkNmsgitx8g< z)Ke7^brxU;00{(s5P*LP5a9TKl>e#!&onVoNrD1dJ!b30F_e_**Z*Ji|KIX|{l^mm z0N_8@f0y9lwNwUiiP`qGK`fyqlUXhy^E85?$s~1L4)FuMw9w92)!7b@hE4wStq_16 zfIWZ*fFpnffEj=}fHMF-03!hXzl#Zg`d?iMz~CR%4KZ*o^^1r*#Kbq~o zxBt`fe{%W{$IkzHzzKj8fbL&*`yZM1-}8U*ZSp_(rv2AH|7Uah-;WXl0PVlgrvL97 z|2L?zM6ysi0tP_q+TQpgXw&lLLgB)0+=Hss7mn+w0JREZU%(d852mW$;h0ey-PU1i9#}J*2^L5*vf@kJn%K zi8E1w2>Dp~wD5kzb??c|!XR>Ue(Rd=$}%)Tkq59?k&Y`}-Z+pvDbF4RSA(CwYnj@_ z@&gYI5H^XZ7e!J$=pf)|Yu!@iu@N+4Egr~OiU7vx@PZ8nt6<%eXoI!(6q*PQBd}tv zQ>c+P6K~=KGcmzj!f4u_i#O;!+DscHxb=d|QRRzwx)@;fq0`H@_}u9X$fvnRyZcJ1 zD38&eab-yWtFIE$>+#Fu8fM78SOMVuFc45nOiQy&b1L4}JD$h2e&XR$ZPG%&FocnC*p( z=r0>`QiAK#>t(p3$Dt4wzQCyDfj;lnr#?&~%Pho7e2+oLh(KVlHLvNG{q5RWB0MyD z^Yp*fd+&o7Stzi=#6`KI)?fz92^VB2&#C_X3uE>eWh+Lmuh?C47ph_fcXEx#pwn_L ztB?{k5El$_1qCJoDb6h}hysYU0j<~0kmR050Y{fe&Ei;pd!-bv%ky;B!mU%`^L8;l zC}NV1Hx*x2oVmOF;#FFWnYo%qKfYL*Dap25(r&D{T+~DA*mLe*u-udIt`cobF5LJc z0)0-=e^ym(iE^7kZ?-7dKD-`J3YInGzEcBimO#tq?Q?w2`a>a|FZ6K-R4~B2A+p#}>~`~@4l0bTQufElr*P<^74+##(UTUAEB45sZIM}0X;Ck> zlZMjeSes7u`-l2(9-nPmtuQ0l#P{ly9b!#**^d0~Q|243RZOFZ*MWVgQTEr?>^rN9 z!WHHewe}0WB`V5n2R$`$@HRwq8WLp!Q0}qwpu3pt6qP9jgs1 z`uhHH)IEtS>F;Da!=R(iPFvx5u>8QnPMr2)3@;84-!#%M)wnX>`w($*4j+K~j5ZzI z(t^eV#Oky6Cu?WcxR;3l_wK3tC_eWlN0Udvq`^msj+wGx*hU?FbxqG7qi!z8EIi50 zP=4?Ts!Y0;n4$1>VB87Ii_sbriw2#woNj8d6y%*!f_vI7mq4`8^42KGE)H!8vp#@( z_ipR-0cb^h7RCI_oWr@L1z_OLSc2ucCtI}7G9(&~eP?u^2{YOA!(zQ=3Q0&2JPF{< zQ$T*0gnA)+5^lg3@zL_a%fx#{97d!99D?QTAgw|bhsPUt^Xd;E4RJCJxY#M-!w{ok zEKo=>5RZ=|Rs4{7cq~MwXH@D%QBlZnGQ3~J@WbK z#(8DrH}!Xoa92xrm8y>xU?|f^Rs(*td&#?Ir;pmthE9Dc4+^NVph%1VlLuoIdknUPrm>0;S zim=@QNauwbX`TdN$?X#FjWbNDR4{VWXD*AInkMfHRDpzfA$&Z*-P`0Pj4>pS#~3@? zQ#wg&+FxQ`eUo@A<&Qo{z_6x9RnQ-ExuV|aX@kMW-P{GzY(uCy3xilw2RQ05+ z)3Xiddh)fYzwgI1CiC1e3Df=>`Z2l=Z}Vj(HFYyGm4qq1*&ttac`%Esgt?9$lrg4JX6 zgNO`uz+m=PJA<4jt-OYvMCmgk8qjbWTjNqIx<&*0GyHXTL5)Gk3+1%9y zfwchz3=G7HqAE+MX?JnPa}C!KOD#&MyV>ktEe5N}sBHz!GKfb`gE{MOMp7p)H$NLq zI&f|blZGsOfa`wrg@KQqhZ4OrgXh}`DZ8Vv3$K{NY3~-s%w#cFF!+d3s=A6`7)Kkx zg410vMrCo3C;V^^KF7`Eo5FhIniUgbS-B9v5*|E}I|$$z=^dnx`iXm>h6yIuq%y%v zrV6TdK!FI@q}r`{-LiU5>zWUr1j`s3 zS)Ig3gfA8m#Qq}e5E)MoAACo$M@w8m-mKWYT>>tH|NS|NO_c1N>ADTSP*uWOpw0wu zb!Kt%OIKk8%ef~G)=z)+nHl=@jX<(?tn3bPMe0p(&Sxe&k9a zHA3J9s!oQ-hW@@dZfP1FDC(^V4uHKpJwJ3b$|jDhmX<(9|9vU_BeRBl-bHlr+>!3m zdSKL8CrFSPH*UpytF5jAznR6&_Qlk=R83+h1CX+>*W`B^k1TtBA`dO{4)hKO6aCG* zE1AF@_(Q2Eo43_67eq@Nl>t8LfRG%lahVO2OS5ZG-I`+=fR!HOH<($K)GmY--{J>x zc>vR5-0R!}yQp?Ess*}Vvq@J4in62EshCJo)@9*l=>V?}0fsL0vS~@&ScHht%njV( z-F2&h*y(O?LOhLQt#3Cv{eNTB0uN-{5`AsPbeoQuA*@Nw%X5VK~WumQF=VCUbeS%Es)!->|fqrx*1iA^^UXy~Z2jSkG2apwd*66{LK+7&9 zt+g{ETSk^k$G$1oi`b8u+IM#DymU=HgX17IPYB>hQJ*0OfAM~4c^7v_IUY($Kwhh0z zvA`$$-(Z#w9!(C8#^sA$x6=3_PK;s2tyr*zP(P(hnawYuEo*Qpe<<7^L*e?=t!2{x z>Kr>FO_2|ok8X`$rz^m)rBlD3*3t-fSI?!$hYk0YHrdI!go3#UPnJZikH`~rAbB*L zS@x5OH&wm(qt+)p@yRI~YTQ}*YzBUAL`xPiq%eEwazW($YVY2YCyE+g+_YWZYyc(Z zMGmE;-1pnu6XH30yJsy@BerHP`XslWbouKyq&;7`0(UPS5VL~_6W$vqLwg0cP~v}c zNq|=lK^!?bFJK+&zdyRumGuO|Awg7eDU@$uy6Bb&Mz$`DxM^-Tu;0j`HO$u{ho+^; z90$4^};X#EB5=oOCDoBN{z_`qP4vT$^N09U!+<%;^_=aUe=o05&0Nwy zLbg60Z!W#i7ix4A5K;#hDiwL*!?vmcijc-HxlBVX2_wecc2;m3@#HGzXKTEr;!%Kf z{5BaW=4i90#MdnvE92OD(nr0DG1`R8ACaU0(2q3C(So9Ig2Y-4*oXGEnR~N+L^=yU z=>#+9B@PG{j*F_{9S^Wmd%77BjJI|h$ zdoXE8@I}Qiw49U8s3b(SN)M^zV8ogcNq5kDY4lJ|e--d~aZpNW`cT;n^5j#g1)1qL zXIbGLUvoNb9umeM&c0=^A8AM^+~8MBN_ zn$`Ua;mRT)3|fX~0Sk=K!&(X10J1Afa}%`}1+s3?xpSyx(x#Xd)4mgg;qUCa8kRv8 zNFjCwSa8~foH5J0*UE^#xb9B+tNo+urwXY~9tSH!(BArLi>2?^v7Ss&9jSSyZFowH z3vyVjs6Z0Ib-H7~k+R49rP#5;2|YlE!$O9cA?vE60ZbQ!zW7-8^LxRSSUzUBBlM^X z{0=~YpZp|>WJ2yH)P;i?Lk=aI*1~wSG4ngk(0Q}R$f_@0D#>2~pvii5=ftKC*EbXJ*+DpZ6r zL_?)*y1L5G%{N2Z-2NdoA^^SdaZ7`aI~{XDW!fiuUU+>@zvxcMevv*qCluXac3 zKThm-z+)RI_l3(vOMvu6D)6UIUbIIp+m-RpNdz33+@kv>H>jSDHzuf}33rJItUnpi z&n6uUe>%x>CJm16ooqYym4YQ7gL1i$%-^LOf%P^XC#y54duGXXnsrBZKLn=2aV*FP z{Xuo+`;gYpEbcOjwlpq&qccguaO1#u&+yUFNdD`RSxupSO8NMes;)GQasK1Kp;J)c zy$jqAilMcX3iAR%;B{Bqx!5*DK?q{E5PNRD2-iMzyR^F~h!9JQ1EB9onfFU*m}Ja{ z2BVNTOyiOCA<_HE-y9nS6ztHRQA5Z^=OyEXX?=F}B_W|(;SV~0aIur{nWFbK;_{a5 zi>ec=g12{Fr(yY=+s@Ht5?5WRi~0<`I}VrjFFO5kFMBYqHgC8msGz)`IxLW=d0MIH=PFLPx2)7Ti9y zn+;6d>7P^?U{&aLB42$eMAO8F!-+}j2HF%wuE(=0JRCnpbFL}BAGgOp8Lv@W6BHPv zKY1j0+X*8O>;k-)bRe(J62ROX@1ImJZoP-x<03R&){0QLpEx~;j)b<1X{fI97>;>7 zGKm!4<0V*1q{JMp#jn@9gsNl;9r%r(^9>H0CJEUXk>$0C$s$Gs{fAk*2zs$I>41fa zT&AacNftZx!gYgc$Pi~>3teFIvmO-*!)B7mCj;S*1)Ox#GI@vY)vVW6l{X%Tzpq=7 zG&Kg|QMY;Ocd84eiQebwhn1ai!&BTkdj-di)gs=_F4?~Ghea4YZI2k|bt;PTIvVM`94iE*2#n_6{H_7$Wm%9(wv*n|@s0OoX}$Fn)wWy0Tl}0w{%c`7Wg_d;>`5FDwARvT1$f?Fv zhvw8m3kOvYptCbvQEkg=)yVxG7CH{jRnDo6t0GgQ!QlM88;?-8`bRB?EF}OY`*xyZ z-&guX+ALzbIC`~Hj^EACiuW>yki$U`S?;J79qY1jU3JM6TCdnAB%PC z2is(1fDJNpqR_Z0OY>6CId#{4|F6y)BcCDL)8CE=Is0XDukQ`g^Ik3gttLtm(R;wb7+C*VwV z;kgj>6fxtcw_fOLBx$7>C~EwNFt+9A9~#S8dtVd*KI?R5cV^!s@XLbheO21Vi&3Z^ zMe;TlfTrDnYJ%}aZ7tQITAMs}6v;xOh=X!KM^r4LSWhaVMaaaEAW~yYsqEq^pwr9L ztnQN9c;*Tc8pW^*)PMUI*K`Z1-iR(SZaqj}+1>C5X~7SWEe^9~?P|&%wgOXlGW}vF zU%~aPI7INt0K5X{fV=oVj?L;GEF$?-U5z$3S#ed2T_5U{0rM3)l~5xHh-{BY&wmO@ zDZ=A->g!GDb>fRd4{nyX_>KC?gGXW=n`p?LnjcbXz3CoTjC$^AJ<8aLAYlxw+ z`%DLCU}I)=y2+9)D_bpgAu;XZ-*+71{=9G$S(vR1wL1CGN&?U?z`lwESwsExjy1{t zGsSZ>=Hm&{Ua5Ho5aI}P03cb&*q zql}1BNtW2DNpqSh8TEOF7OIm37X6wOkHQ2hQ;?aVnXI8{z6knrV!(PPwMvx})O7xN zJ67<-8M#gjoAUc;T&>{V%0PPId~GzQl#-63FNhfx9tXyf4(-|1i1+tyJH%L7w>5(f zrze>>hm3GZk0~s_>qs0g8)E|j`logXrG9>tqT9aq4wf!CY8yqUuQ}15Vgn`X?&Dnw zRcwi|UH8BvZJG6pRqFRo{9wj}{aU%3D2vvnv~aqJ8jZT_JcEPjE&y6PC8;fRS5RF1 z1q$MQtd!~pGa&d#1uX3z;Q+TVY2k6wrC3+*uHr*dE+Zzs@P7^w>CN1~TA z#8HlpQA^|XX?5m~85>%B(q(pyoTL+k;dsW^t>TarHV%RHQIR~gy)3I#ndc!IiyIxs zy(a{Q(Zrx?gK77kZ$^&{ylabPwz&L^VG~9MXBu|88PV))kZS{Ya22!+stK;ELUqix z35KkIya zT%E>)RAYaC;fQN0>riq90v1pYs+4++st?Tc>pL1U4AIk%>0b+HMghBzM2CncyN>S6 zj?I9NAFq^DOY_JJbxuN%>>kIpw675cxGng}oz~m?R`qhS94J>$+hd54u zgf;nEWszHB5r|Bkypw~zjnVWYvA>@2CR`k=ORY6?$X?gvl`6GudMPx+PU01PxO10M zHdJu5|Ngx$gi77WzXg0BZJJuy{5cwE-Mt(E&$gWVRsYP5#Ww|pf7|4InID|1+NAi+ zx<-J7u9;rxs#vYA=5b2NGeq-WkR3Mo9LXletI#obqKZZ+48XUP_LOD;qHI%#?~V&l z6Np-z@&IJpkYGgk7QrK8YF5yG)Fdv?6$Vg9+zQ8fNgz{gIp2az2|e7IdngsY8;-`~ z;5hcFgq@!oDmAoCfo*%s(8D64xZzSwG^>p@VsVq~B?aLwA!tE2sC$&49dOaIw9Y@! z`;GiaQw4rJX;GVNvo(Cq19rp%;wj~l@*At}XD~f8II;D}U)E~!M}@?Kkx`E1JRZb1 z5OGvI)CVV)h8tPQ+zRD2bl`^}*i30BU4F8-RPh^d@?yC_sXPJbIMv!Tq=uP3;RC*Q zE3lvgV42<(K%xb=zru!p##Xkyo>$4T_@u4X+iz_UOUAShX)ugyDTp7MlO1$9*Qn1Y zDBg8SftSlnI3mS1orU_&Z&T11rZ%<8lWy7iCL~^Fyl6lOK6OQKYE7iO`{h?WsLDVM zUrUUYT!A$7ZGGhonRuu0sy-lAp(ffltt2#982L6T+0Z2kP+9SQ-X~H3*_P+12xWx? z*3a4uc5X3ck02YzfdlI1ZR=4Z0j#w^?>?bK17SRV7HzQa2vM%62WcnJ`5wu~T8i=j zm3sUrzj&%&%5gyQJy>e~+R>M`Dxo>}CBoSG1Z;C<$=tqVFzz-crzja4Vr8v1yk+l( z66Dxy{yPdOZaYRHlV~bj^4aiQ7RD5NJOHJXrV<=i&E&ma%C{Cc%#sxiLP8bBHZwK; zeCY}yjk4{>MCeEDiBsaeRp;`PspK~tBbWi6u)0G{FB#VFW5QE~#T0W5O|zfecrtP+ zs0%tAbW2F@X1(ewcxIm%>tnH(qR=m#SRPIRjDJFI#vgl+a#a>`S|||0mZMY)k}v=z ztDltH^`X%c1Qg2Pw685QvO7+^99dJjh8u#WmEepv_2qzTjT)fd7UcY$L2B3RW1I*O zc{lb4vv?YGP?@<9iMa}jf@mk9ZuOVg+tL7k4_-m9^j+b-rYn1^G~Nq z!wNg(Y6#XSg#FSmH!_X~1tc^iYZh_q2QNsOR^eO8lP}zf@O~}Z61h~oMkllf@bokm z9)V$&`e6-L)D2H|*FaDnf3ejHjSg~?W6P^WedunfC0S8rsjqL6g!nXX^wEZ=vX_jx zdN84vzUBhjW}77PaIw6W?DFCA8D%NK#ViBDUMw+ND6Vh(>j^^gt(xyCk{f`bhT&Ss z=wlo4tLTq-sUU*IM?H0H`Aa+4!dZV}TE^y)-XB~i>;T%FA=oo85`KF6@cmTgCr_@jgfs zrbBlklYSzU=(-Nnk+O=?CH4WOw5Wf8H=(6bl48dQ5;z9XSvr3(SOr&g9ld-C z4DI!f)v@!}EE9NLpY(7Q#j?WO!nYBso3eGB{R5piXY{keGXGDx)}>pd8~=IcC@3sUOv! z!67~ao%wmuFJn|wDX_1nnG~~eaM3*D@SA~MzW2IRaZNB(E3V)fM1c7$)(fo54)Y%k zV}9+%74X~36JVOQ6Un6%(v;%%B$D6-d%iQGAiSHA{m-lYF-9~Bv>?uNsZLHmL7_gx$4nDq5+IM9h~rJvJ2#128t#8?lgkWDksd;&8ZX={s;Hk>)J-c_KV{#hir=)96q9_~k>Vk?2@P%HxPIe!mxZ(lpq z2mU^z-VG#Qv^A!kD8ln9y)&NBWzNYZ#?ElV zA0=1e$7&$^<^8d!*!YDDjv*aIyC9{sEpcZTh*+ zxb!1FqNLizn&ncAG8PBwI%s@az$63qt0^~1zar!!^!K$$ucno1FUtNb!az*FSHFlf zF=0_kwMDJyd3WA?mcBV<&-0)8a9h70)S-q1f1+gCk-c%woG8nYv$HpCFNU zG)6+Pyb>+U4PO7)6$pKZ=@|(tv&~I;uwBDbW@QrnQnDhR(NPZhcUl<@ zv7hbzuEXZcjhq(-m6yp2$?3o%6|pDIcwDpkzk?577}}*k^FGME09w6uWRlAD`hvm& zwoBT#jIP{!Nt^ULRIQ>o-sq=x(E35+36DYzTp%DyY8siqJnUbbl^zpXp68Xm*)OMN zefg?pq`v~(L9K99xBvVKp(leR5=n-oI6P<(ZP+Dq*K?MS8hVm1IEYHNu%8(BLc0AA7@ z(k*MQ;ms#+nZQp(vlUat$(QLu46FXKld9oZ$0fD9+Ui+{#gu@Ad<8Qb~X@gO07%<>EP>U zC|J(O{L?Qa(YoZ?F!_i2^e@B_)b`m1aM8!Xh9Z0Apgd$}rl^AYf8FYrP=?{KT3%$aQ4X?HBr}sZ``-Do-0%k3YojppI}6o#{IE8OTPVB zzHN(8S3r#){{kb#7vPm1+r8*Wy|pT|u9}fYlRZ%38ULeyR9(K7dxu8A=A3{S_2_K` z6(niK4}LHpcPHpE$S?x9D%(Cy{{~<9%c9i=+Ksz9-2YcTYf6tcGZ&z=l zWqx)eQIliIV`+}B)Ao>@WiTi79;Y^jq`31{COj~)r9G~kg~Cd#?1&(A&00uWwz*22 zlIR{$nZ7t8bI1Y%7gj#GT^MgW$kM)L8W+|wWUNA6v!34TY-tjg4=J>pwebmZ`nqUo zi!~WrIm7*3(H_t*X{_VUC2gC+La<`H8jM&E5C>Nr)jjpUA`5$5umvy`HspmsFRlQlwA;p@U_*pI}q5~<4WyY{!4@FPCZtO_#@edpV;br?y{w#zg4*8$*XTjSQ z+ZYSeP?rek5G)}%itvnK;ip}KSZQW4?Od@{=|SF`K0z8-InMThsX(-3LrxOMfG1{J!G{*Jgzw zf#%cuYzU(u1+v8I`S%wK4@G4v+*@o}co+qbm*8mW!A9pwh-B-iP&E8Q0MWvTOnW^d zA^z5d#1c4#R(aUx78Kg(z1M{2l91JwHLrP?&3c7EAIW&^I6~ScaQC{D@3Z; z+j=maXE|Is^3P(<1c<2~^_Ii&#?%6jWTKH8_vT;g^zYF9Ei;+~kqx>FwlFmRJY6JvkcGa{B(+2O*7oM2ho;D9%@3gR-=g$W2PyNEicbX8IhezA^=-*!# zD&R0^4F$3D!HcdR9{mn1zF>9Mw40){3=b0j)uu0z2)ELP*_n$@Hy7w7RNR0+u?bnN zro^P8PL)gz&lr0*1)|Zj|s(gGyW2I-Z&(ZJkyDqa9jzJ=~7#}Jo&b*ic`0$ zc#lFOa#mKIy^l=R6u*<~Z$HgWjAM zF(F>qFF1FM4#_uiPVLd2B*7z^FcB<2$||{I&{doMImfgoO$enVW``mg3z^0E^J^Pz z$COPp4k=pk!neYq%YN{MfM1i8qgcG&oyU{m7B9Q?Ep2ZT9$)MltY+eFlx@0k)njeM zL9R?*0kFtfEp4v=%>X6QrV0|w|JDC_3ijB9?)nvNpJA=} zJ*)T#yXU?(byl;hvN&WPmAm`xC!9l^zV)s)1X%y*|7okidZzgF>TH66XTrSA2V^|=qA^E-(pSw39-sTsa)(mxk5xQB zAcC@?DH&hHoUE=rL-7Dg-NZc(;|g34S<<~7A?}YwYl5J%=g7R$II6Dx`~?*BVjqn8 zw3@;3&MGiMW0B`K={YjnFv~lLT(BI3TYRz`>QhteaUw4Nr*uZe2*}+w{J8o^oe9v^8d}5qek2ObqszS^EH>kdRW(47%o#lE{~jVzi1LJ$yOMN?h98Nt z)h%wbpHEItyl5S}cK!^TVHviYH1W=s{M&!MCY?jeWBkYdh>qUcJ0R3TkE}YaP%08K zdFm-Si-F4-E@ShEajhtLeZuY7wg0(uPHqh^< zWZM+8$_p5iu`7CzL!k`0BoUGY>OePMcOjGH8z}usL;6nnh$%1&w78`mUAT;_Px2w@ zsykic5{(h8PKYF;4~^#`>2n_a65Ba_-yveK@tHXUz@JE!A*PfQVIvEwy>D~~nvf^~ zfIebV=dN4P+r}n31)2VS*6U&MX-p)Dil9pGz8?b5Z2%DrG_sF0(f5rI07!!vsaOyu zzwA*24YDkTo?o8)H~ae!^zprerhT${GOL{;(GS;Yk1>FFvr$v#Hl^|@gbmK9_aJHM zth|CltaU@0ENGh^Y%T%dww3#RP#q(T^|UWu>7-HI(a0!pjH?1&e^zgR6DB#4Af1@!S{P(xzV*ArX_%h_g2A zp)WAn6X$UX27bSH%+Y%(EPvTNPHDjP3`r$NV;WN!PNDZBYu+I@bA?oY!E!ZmZYf7Ls8iC$M&qXmEJ7kpxl zo_R;1l7|ZWHi#frC-h9ptmn$`{@}y)4h$79C~e~ylvpvJ(}nm>tDSXYwFbjh{1BMZ z#UIFR6c#=_zp^{fwg){J3?Vxvq-nrXiLz=nb=c9~C?*$PU^`>)7aV;+^6>1X0EU=0 zZ!IWN11$P<*F$3PyiA5)SP`I2j5}8Wc7gB)+UHe{^+Fgk9=H)2_YopT)wZJymzI|- zvh^#bZsrTU@+J$!VO9q0drL0a4WCgztCpeWnVYwD_585?^_6HNi`ZaS)4^MMfcYZu z@MHPggsy2`cgT5IT1F%yFg*?2F)aQr=IiXC^ygeSXn}GM82@h%E?BoSsp1b+0AF~^ zdtk%d^$|^@KivqI&pH=Oa9IOvPhLUp6n%$O+)@VjJzETCIC7Ea#=qzg^PYW@Te*C= zbOVF>=GIsG8#lpv{K?~PVn^nRv9_{z1vi>rpQxGgJBb1d8lydZ?ScYVYNInaZ4SDY zxb@16^-ty2O}wWC#&F(1W|V#`2idfJVk7}+3;jy4fB4HVn89!hjl5>7sko$=^M>JH zc5lIxjD6N4hHh!1K-_B=MAL}bv^R-10VpVqfB5G{D*lzm1eMq3`|p5+S)k(x4$(%o z)+7w3LGpF7y2i@uld0);qUEh)e|xPQg*>52@fdz!=~Z9Ok1~`jz<%@@52jJ|eJWQ6 zg-x3ye;Umj=Q5jccTZZs!-UKN9vWYz65>7babb^sYX;XC=ViGgp{3(2#Jn1!%4-wWJdtI8VOQ)Vc|>P z{6V|Q2jsk003Nc-{abXcoPLPtk@_QE>`2gNSo~|KGe@LW_QDnOJ znVYKu?GN%LNkvc-)}Oe7;x^ByI+W(JN_7D7K9Y&1g=Adwum^|1O5?UvAb*;$M4J%! zfkPI=go=hDP)audDgobUS_54F6M>Nqskz29C-1aT=r*o*v9JIDBA-xV=r1+R{UkJY zIvtD8%T7-2|6Bz(gQN_rd?7FqGc67c{^!q45o(6-bU_+B5(l(wOg*Gk+;Vy78P5~j z#e~Z|DX?_P#@GuWE~;Kv1pBN<*B=kdLr{1ttnc41ideLY8-~|R*_5mFQwP9xwxt5a zTOblX2<;m2#k)H_BSgi+JW13Qk#Te^PL|iv_o*yUe* z+B-NQ`%a<4Q>c0HE}J3wT+5Go_^}ip3@qNecJ~RPnWra1Q!eiTUkm0{(E&tcM)b|~ z7hl_7HS*p2y8k!+gJGtp@-qKA0VDO_`9DLN`?i;GJj7n2**uon$n%G0C^ou!2JcXF zO)A!Nkw!h{aI6B6{P)mLIaWl>2O@Lt=sQnO-Mz824|4gT|AaMDr?*CUJk#=4fN2{mufS&b4LccV?1GA)7d6mO53+Yn2qBuqfb_?~z*U=A z;qz#f*l^{s#LUSx27Rg-ECqo7!w#bYKU z>>rEo0+?#nj<8Tf~ae_^taNEVjs;%o~9C9FdmLC?)g+gk4IC_x^WT(HrRjOLGJ zY-91Jz2g|NqPR>2jJT-*>ozBB5}Bz4zoJMcmpGx-z{wAjIbVAQ$MAT1GaEE<7oO@8 z*BWln)&K0<69(Avj2iw$(=*Ga3ZDF4~H2K6ZLtYv`X9RSy9-93)tF z@yhEk;lRS$xI8Z;)L|z!C6|*DRqd`nqYyuY4abOe*NiF!h&(ds+JhW2>)AW;M#S$q ztU}bQ95o|Qe4=yx!gW<%xdJ3MPw%{u$9kz;={CYR_@?GB+bBDB3BRsd<^_6t>lbuP z!gz;%#8>Ay_`kdV9s@HUaLv5z-QhjXtktJpm&~VfUi@R8w)Qu4UIHzOpyQJ>=fm*} z3~6wDvUZE4meKWV5Trf(@rt90OTSNx;wAA63T_`&rFsAkghCz150w49gVw!sR6 zN`qy#X}UzLtv7d*md#0~Qi+o@E=WbJXo?1UYI^_pFlB2Mouuv{m?JE&C^*?29;(Bg zTHbOqQ%;pMhlY>!q02cvPmGd*c2(<2y%M^U*sf!{myI6%I|(^Q-U}u^$EZ4+U229_ zQ8n{H(~7OX`cJX)B#}6^i~H_io`V)-bUSh9++q}2TOXZWP#P0dxgIOGf|&$IN(10> zP{@{68xrh`gr#i5o5BCXpB!xu4%A>zEN-}%C?<=ia`y2SSH_VMPio-6dz?u0VZgK{ zlRCbqKEzFU!m=#bXDO{4QC)8htjg8JC7JZ|DfWoOU{5n+kH4jgn9N4OS9~#H=}~rM zaxI?L*TJC;iyG}Visk!-l5%?rja`$cyMwn6)7AcX^-Lj&MS0ZLPa@zj`Hg9*lwW#hQ*%V{daUq zegi{iB})sQG2Ey@>1dUu*fEvy5ET7@$T=1NKlbl`_TTiM78~5rS5OFxp~g5ej+67D zA|Mu39RN&GOs{XwsfnPVUJQ^ih=AU6YV(#u~`FLDk8=~JkzlriPul)0W zT~W%ELQp%15Cw0>SL^ywE&X4moCQ-IVY;nxch}(VuEE{iHMqMw!7aGEvvIfJE+JTe z;2vCekd0lqQ>Sj-sX0|M=lp`M>i)X>U28q-rQ`6AnqGh~3#M|a^EbG87CKeZU+9~V ze~SNhfB~DRn)bT@x)V%Gzlw7>_bJ2TB4!H$KKWLnNe~)ZLq{)XF^TX{W0>0W7ZCK_ zIiV`67l&v*Nu~83S|MmTNPItEc-YrBN!tAZ-zvyMjED`A#`0Y1$F(H>@;e#Z=R!Us zmZ_OvbWk+gyVedKAYUb%zil)y$j{8%V$Q-Q;&9_kpZzb=&Uq5q@G2O5`{IZvvrf1nbZXIy6J8?1ot(9uWz!NUb( zW=Bzu{FOj_1a1{m9{8fvKtcVb z)ll0A{7+YEhau-)+20MQ)jkmUw>bKg;Y$)T85xHsXH1q9wcdwX9dK3=lz1F<1>e>< zG!gp(6K1<1upM-WtoLm#Yis4eDjC=5nncsAc5lo1$7Xsrk`-gv12WHC$te%Ge$D&G2nd-$?E>ulr>7`3#C|r-)*( zHs1LgcDEXv+g`@pSEbtN`BWLp$7AJ+hdLcxW@lWZUH)iAxUj`pYU;=OU%KBBJngN; zYy@~bvu==BJ!DBk_Nz8a8l3P|m^}L+uSpqXgrg6dzdV#2h?JxvvGAoy($G<>cZe?F z>XQw7_hApBF-Y$95F9}k)xXinFr1I}%gq@3iBNQR2E^2dRp}o1%@L0%T(!gwbs*=p+Y{;=#ZKZzh!_l4C=t!N_j8Ju@c)hdlVRk3Lg1d~eNMr1_{^ zaE@N|DZqp|gX8Co7$UM!uZ)Ms{!#Ur6y)Qu{*+j9LGOM!mpa%LSNv=Q&mFt_-Di9k zUm>H_#JH_3^s#f7)ZN+=QjiiUmO7rx!o48cg>spGfhyYuZ-QORizthcO+>&L#dRU~ z4n^S3yqtsA!dD9`^Q5~Vbj_U##6I;Zv&JCQ)Z4=r*#mXYl_IkirIo`&5eXXWg~UMF zJIm@PW<~zztrt(r*u7#M+$FQJW)OX7!?~9&b`&{riY!?fotKjZ%r@+ABK^Q+KEq;9 zjaI~gf1ZD3kF6lK$%%sCg1^RB>S*ckS(Y-5BXK=}>V7fgp1@|HItIu$D9l`oB0y{H zJG!_Ol?_A7!M;vNw(>-Vm5j$I+U+gm0#_4Bx9IKliqbFcyJr{-a$`D&cUH&)6`qnLA_^gk@ZmAZ=YK8N{0@S< zIOOFWe&z9nvX+2J`RHvRO3gyzXBEA`X zxSaZB=Io((fHSf%q_D^&fS#;8oz{d}@G$MgY*^*%7So)mcAFqVv+~r1A$7$ALn{dh z4uN36eTy3LAMGXT8+2FBIKaWLUK~ftP|-O|$+%hC3Ok6v!dz6;Z~@E=LK{=JTJ#KR#Z&8*0_&ZW2|E3P>!GURgCcOKZEDIR1n`tD`rVQ_aCJbagvj6U(Q2 z0!=(e92PFDyciohRun&v%*o2|b>(diOWpG)o2J~hs38!Lqp0ve=Edr>OD*mB7sIl_ zUoM@ocwfG*k4HfAM*s&GhVYe-Pmc+8t?3Vnl52xA0Q^uA|B_{Ny?4=#$mIOIqN;H4 zQi?6tDEG5MECASs$IVL09s>lxj2IRSArO1mFp2g6%6)w^mBhzb0zB-H4w1LWO~W>X z%_{x%x@}0v7kA<}IJ66Mx9c}^I;OD6uTDe6!xL{~A=M3kybt;=`7WSiChRrgTZ1MB zAJgkD{GEF3+s`JW-!hNczu(BbexmOCm5T3hM0t4H|eZl?8 z5B<^B#<<%hG>8WGTHsUY+6u&Vp1%`7<+2uq18)YEJB>_XvAW|*3Fn zBsaGEFv(kL`7QkZriAR;G6*l2D)^rN7v!Lzgz;mf6Ih#Q-OoKtA}ctJ(<`M|NtQo1 zC5V_Je@>B1Nc&y>E3Rq)5q|l=PdvOFJ_l3N_-7CbT2PJlHnHh)9_oF z@_kBNeUjcdek6KY+Wt|~E#tAfFpm%)+FhIskyyf(#&+^G5#3Ru$Ftn5z z8OTF9Bqi6!Tfy)7Px`M1RrP2#P}&{UnhS+34v{PW*P?@4a=R#G?WI!gY3-~|BKv)h zpzroHbTS^GuWs$Bdf&tWV7shS`u{lpSD5s-ToH)`5fSBpnse$s2i|fV?{OL_1(d;e z{tV69k#esXR#rQIj&3e39fOm#qy+zG1w;MI-_tnDc;n(7D8s%z+UH_Oycy}ov&>e+ z>^<4|Pm0*=GRe8Nfmlm;#KAoE%{{*K-oAK}E2gcFYIqX?u{*B{O=4b4)Iii~)3934 zCP;`lO-fx0xifw_I!r1KOrI^?7L_^f*u6ZHMapY1b)ysNG)^EQWbuX6-}EIznn+ zg(n6El+|IRCnB`TH^-3B`A zRp?bIEX&5pzE+&|=f7zpDueID9|;lu+y29q@^QP!x=mby_LIVqtGjz*>IjSpF|f~k z(Ph9fem)h7{EHe#>`DU3CX5WW!5T-h7GCNDkeBzl>8E<)=2ssrR-7ZBj<5~S>?8|V z>-*XgO=lv`7!Loq*=tgZP-^FJb>)M82n-L-nw&C`tK9sb&!#8-{ZNw*WY)cQof3=H z2<7km?>U<0CmQcgab@M{*}P2&@Rbs!Ubi8;nB^=;vH*uoZZrH`{phLKd67)Wv0OYi zr`lQvic;DG4oidD$erfWJ+*2D=ck{KdY5H|YW}oi#LdsR`bYxM6>W&p6-rwE*Lg`+m%HCFXZ(^1@T)ZpO6)L%Hns||;R#IU88`h)& z%0>2Hd0LmQ*E2$DasIIFI>X!iZGrr6u=JdXBIJ~0O3i{Z7+OSqZe3_Si0RZX1`ngk zry^#RF7p&gggZN|oR0PF?mbbZSbWjltIZyssn2IR4c8U4e~^{Ybru;DHHb2g_AxM~ zLXeXT0Oxy?rKy%r{CF;@9hLq#UU6cJ@BF31P~kDVr};a7-Sn(O{mTwVrx^z}sJI5M zBRe;1l%Yi`W+s*Als$^;D@wk{qO;JLS;rdbv0M&(ih)6OeftC31?ee_XU-`ek1J>Q z?~05)0gUmP_||**0)F-rYiS z0maQ?tp>1p&-hJf>~|CVcln2A88oH9OXJUz)i-VEZmNA06-2dRqI5lyoZU@q?Dx`5 zl77|2{#BBv#yRh9{g@-3yI(O-WZ79dOP$B2{+2CG$_=o=c-#`Dx8-^p-cm6-% z2cx_y=GXz)6}E#L-BAUKicwkc%2vsq@!~851pW4NuzuC<3Ky!6{05Qlf^9;+E4pi< z)UQb9Rlm7w{xQU!vwJK=&Bh?+VW&nUCzF*YXjAmtzc(ad$OU^e=ZO-rI|=Jn_cQPO zDd~4~P9L!n;Fq)3Rwy_G`7qI`bSU>F>hMy4J*kkctmEi(s3@34Me8$T7~@qH6&_Z9 zzZrf5=LxU7tp+pnvVQiZ%quxFL=gnmq$*^g!l|fgb_1|tsdug57;65vlVoHyN+TU6 z@#pi{_+JoOTQ04SeP3`4n@#HYCJNtjY(DsJc`T1n&fdt#rFZ^c3p3ApNviTe+tXj@ z291GGBr{(FbDqa1at2%%d}L6_#2_O>4X%O#Bm;gwS^CZNi67ZAy0*|A#tI0iH%0E0 zFZvwubqqvj6($tb9qoa5&o|8ybgyoBU$L~3)N6IML8eXI@7|5xiZ8n+u$P!!j{-eAj0SG)mbT3>zxVzn zUomZe@)PZL3SWy_GQA$B8A>8(LuCH&e+&-m>t7+DBm)IT5?>u>NrUoBEeUwl#jX2C z{RKeAMfG=dA#~>#wsBEUPcAf%0pQ9c*vCV)K^aRO=wy;J#akky{vjNq=R~eB%D;)F zJvW~kp9qha9pvL{(TtW_di4=o+fVU0d%z`^a{XA?qij1oVKxL;%2}p9_`fDdm#5)j zOk8}u6qVI7%&!Mrsm+~!Ebr}xfM07#DyZ&l!-zuZLJ*KaMR{mw5rSBmM79?C&r4-q z2b5sC7Z^Av*-zM0DiBRZ4@y3R#w9DT>dp)v2?jEoBd|<~^K!K8b0N&E_F3gD`MXYB z>2foaX?yftGfWSoL4?jJD@73M1M*l{W>z+Uy+ZoGW(!>5`;hQcL3tgOKd2aX3XO+h zu=EoS6V%jyUZ0zoEXA20*>^Qn%2J47X{Yb-5B;$dmZ|D>Kgs3YH)$I}!qUMKC*ZMa zR3Hc^%v$qU34d|&iQqOghGbnaZMyqHn<_I(6!}Z|=dNg$RlR&t%XHeEbgM8NoVLDU z{&MQ4W9>0IpOyQUKDVTr+yQ)&U#aRHAUNgF)lezvp@SU_jsKs2{f_OG(-Fs&UTu0+ zJmi#l@ogn=a2r+M`*UP_cmU>`=q!idt)}sP#prnYki*?FA;t>-g~Jd_fau(zWN)16 zISd^e$fgUg_=A7y2j{;JQRt%o@V`ySmw>46{hLtU`!+&DyQYKB2UP%S8Hx6GroC?A zA$0h+Lf;~{w!a_xmmA?ob}S%Y#fyR=gv5G}Mm2cxx&wmbe8yZquMtb)drDrpmR|t3 zStQyummmbFt^)-m6H8c&v{Ubi!K=StE0?3Sos+Y*cR+1SRPM5++z4(G^r8PaDP@Z) z42jl6LKBw}z97u}ly|UMUsr?MHb3HKrW`34&0Hh+oc=&$%7y7Z;MMJbJs_UN=9|76 z-H}wc!?02godYX-r~4`W3WPg$@TdC-CBves*jfh($6hK`ZTCUD+Q;w_mY(bc%OZoU zuCBN|XPs)-o~I1kYm8b_9(iC3bb@N-K(Si{Bcqi!OFNsIhR(rKT#PqUPG9#7Jc+f4 zGb-AKH0a%>dHT(tC>104!9QZ?KMC7rU86`ObVRtop0m6+iT~()ImzbY@hFyGLu zsn9UL7>fJxyg5aUA~Q?3*F&7r?9^jd4In z_UBi0%JC}ga~$h8N5O3F(PJmx0gNphKfkc3UpR>4I6G*;%QXKf|6nsox95b9-%zomtKyF;)a1?D-=E8n^K2HSBK$cKEYP^^=y z#JtKCYuyMEV$`?%`oUlJYZ(=OCz0$as@8-qDSM&cvhIFEUuNDlX(M-TmliDyQq1Na z{u3l~_8Az6fPhCN6BV*Xw?ZSGgkzRWG$@A0ho^eRP)s-a? z(EC|VjQ4l*YRx6HD&WI^qlwx~U5T;9aTzN;=k~SEDDGcH zA1*?oFp%4ir%SFyjMt)pd1sZp)hDGS_V_|hqJWPH-FVM@y#J?iosm+z-Z?cMUl&oc zXlUq|9O}x=dZU}j`_WjH3D!5CWq9#j*pKepG}7;dcoXee*=m1I2?@2>ijB%;CPvVJ z(}F(x7d+?%e&nBwyVNTk=6%>V0%7BA2Uo~YN&s(~9%}%!weB47RS)6p;uOyxI%7>5 z`Ld)F^@uwdtr_D_YXCl*#?Q<)SiYg(zb$N-o$g!wrGe&Y2jHY%C?m_h1)YfD{+Nkx z{;QlGwLKa$EYA?)O?M8MQhi5iw!=IlVL1-AcJv4S;qTYk$VwWM&`%t^7zr-J9^l(volB zFtiKvpC-pmRO1tPX?P%pnYwUBo;t=Hw|B%3FdeYr5m7Va`FWYwCB02XN`mgR?+J5g z9B~&I+6?fv{hnR+3J>a45kK(^Y~;^K*-+koZW8e6`*OOotYqVUg7IK@;we92myAjN^#IDxL zyw#HK+dY$cSY7`OV+V|wL|OD=a2@v;Qrc|AY6yfa0TF*;SfrZP($TrO>jas8I&1em zK{dWX*CEL3PWgJTj5jkKTX|A(Vck!C(!z>^F)+Y$J|g>r5EC8{Rvpm)M((!(E=BO5 zTW?XNFYre!)1wzwp3mAXF>;RS2_SOH6m`0;;T5tG@8sf`0~SqaTw;UN|Ihpdk;9sW zr)PHlA6m|9erU3!c33_gl-ZHJn%uPWE@wxkO;VSRO0fOP!!OGVkdV~tj{zbHn~U^N zUpV=^hlvG@w_AQNx7yX4ik{2l`wb(j3Oo9w$1ih$H%MJ`BwX+61w`(pczC%N!F(gL zsB*#>MK(h-I`&bim&Y#_N@;rYe{@{LA-Ntd)0L zc;N%TExcC6K0_fDtI-PM{yO&Fza=tES6?f~3hPB-S4Ep&xK{kk8Z{YgLb8ZsQ4@dg zJ8xN?llAhF|0))Bi^hO(X9Z4uACvux<%6L^U|H)Bj=L$ogmrX`1!=||B8L^O$ z`OB0`tyvWoYxFXw1Eu8!Ldv<|F9vVu#dkaKnhV*QJZxUEd?i+P7J~t~by9QsA0gwP zrtnKS5p7`>4Ihn>926rwSExwMng{_zAE2FTx&*Gw3 zs$xqGmK8}!9pwuT!DxWpjTgrlEMWL9SjNN{nGI_rqYZ+}japX7D6QdnVJVHP^k@(L zF*NEiApP2(*|i8#3CjWIsPz*u>~PyyUg124;i;C6CFrpK!4NGsi>~KpxJli ztHAY{pp{lc9oqSOfbfO&5Y(xg^DNHu&4SMHL|r*KS@ta){x^-5LQTX@bJdYdk+R$U z6i6QkXf#9V(g1AHGP~00Fv)$g4p!<^F8kxW0JQ&>^|vfCI-(h`h{LNpgmQ(%gWUNk z_RD}FLyJn;IPwxt)LpQwY-Vo$7Tzyo`b;?6E__}gu$KAr4G2A3(ye^`JfHwwh`$J! z|MYlJ5WvLxj4gb-1px95`K-q{M=3Y#ku`Z z=n!!0G&AYzTc+=NN9##Xn(zIysBB-ePQv;le;)MSOXJ>k89U`Xd z_1C9QsdB!r8w}=pbx{}ns)_e1=jbr2k9xbAQT*y}gf0;BQ>eY?Epw4`feO7Eg}crR z;V<5yA#8dExDt0knps)KhUkvN|8xHHWBzLw=tDMCuMR)$(M-Kl-h+i(KaiRZjpUQR zhcR&O6p!SyW|W0gJZNSb`W#dMQA3G<#kP}^H*)i-!mGQ`QV|^Ki%R~dx_|ut9tch7 zV%B6Aa&u2Fui5Qrn*vVtdyws8lhk3UL|8Rzn{8FEc@r;HZlHC_jr?XZ^Nv5Md%{PfBd zwPxfyQc?e!|IlM}tQ{cmFFfeXc)*!f1}|58P_k{VyD41=$)6+Sg*gefs8DS9>#(xx zMI$W>&YVJ2cf2p0#V|2?c`ab=j1llpaRe#+aO<&ywKH z9J1wX?0C$>kT=PNpdMZTRJ+(#Z_&}*CYBZGT_q#$u*~2`lYHzSAzWyir>UP>-F1^ zPB{Gg@2H&OhEar(UsCMr6dPVWCl(w(scAs7Z(4OcBhAxqT7IW;YZR3SK+ZuIb#MM- z{?gJqy{x;mr@J3?+H&qE5t4xETDjeWGqEIE%YGA8PM;u~h)+OZq|M1eA1k1!_a|_s4MOxuFrXS&FxoglslYnbXk3p3;0VE| zE)r9xwqw!b+B$j#neJ}3KYik3*vOEjfn{D@k3=5JPa;@1>Q%-inp``A$xa>Mk{n+g zV!~$VAKubPOrMMhl7X*q9h=*s^%6fmeF1jC_b8U28<%sdHKMH3jc9sbv>Vom|5#hI zbE30-?nL;791uKf7qgg-%@N>`eDdLcMo;}FRj*cm-@nn;L`9XON>|GkJmpFFIH)HT!{RP7=ejZ(@MAkacv?}Qlpd6 zlLq(~ot8@`4JuB8ug?UwdIBjMDag}cVkQ-j)sJm37i_Ov?%2&wn};T9K$e(BK?G#V47<7B4v zM${x#l+QKRCtv!H`Ey3Q4df%-Zg(qNdh_9b0K7%k%_0h{gXaR_KF%LVfcG!!6F)#U zt70@nylt_)BIUHh(TseBz`nT{^fGW|-`mB+RHDn)$`={rfpdj>%xIVJN7kV!!hD2q z4tuQPegDi3y<2b13K8i)@|Q09Axtt6$PsD@3<%5KTs0+Rfq)StlMc$GS~@JW#zu_s zLdwd!i~Vrp2%VhO7p;zUvcC(QF(P5yID^D)Dp|YKSmGc2Gu;2(|6(@U&Z1_}VJ)X1 z>$zrr$N$m430YpFyZwslD35;?S2nIj$QS_Ntgi>uJ@T_(a)GfGi6oW`M#|Pr7bhQy zAPx)!_q?fPg>OuK`zcRHwZ4u#RLK}TGy2_-$B5Of=@)Zi%j1t~q%U~?e*V;k)CoJO z=lFy9dDcF-r0Z+pHCPNJBqpwWT#{0fLF^N{X+dwKY~##kYVYf#v|ptSCVP&+YeBBpB9-2#RxG^qIJ^Ph4C?qWK=MUz@Yp7V_^q?RP-0FYz-z`Ro=5fX= zHR_>v8QeR{e{H`2g|e-2Yjv{!>c|f4U&w*hH`m}C?xLpAmVB7pC%r~gw%c(&_;-V# z9P`ixtbA%}8U`D{cOUgnKR*8;rj>>o70~6S#jxc#-Y=1k9!B(Apgbxig?yu@e`_6< z37yS|x0PT4C)ATK<<={3Q*DClg=k3?$+@1vH7QLVm_FX7kI;b3l8D%m;HsTnin%i1+Hmn>^XnhNE8$vq(lnBj zGqbz3ba?bemtk{!?OAVfw~4&kR;@bBCHU>ylDDr>gSVcHVrKl2f7G%8#lGm22Ve9n z#$Cx?ViH{?-2`zdyzf6a5Wq79T&yGFaL~KY<}2-=>P zGX!yB;^Y4t(6&t&{it89>g>sThCqeQpPZ?LJk92I@}1TfTQCC*CA>efgko~22=oL} Qgc2$e3h4C~xOtuYKa%5^uK)l5 literal 0 HcmV?d00001 diff --git a/BKPS/OLD/XAU5/Providers/x-saherelm.xau5.provider.lib.ex5 b/BKPS/OLD/XAU5/Providers/x-saherelm.xau5.provider.lib.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..e57eb7d8c02370b77690c09e0ba24ca21abf1f19 GIT binary patch literal 36854 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 literal 0 HcmV?d00001 diff --git a/BKPS/OLD/XAUUSD-15M-V1.0/Ex4/Experts/x-saherelm.ea.ex4 b/BKPS/OLD/XAUUSD-15M-V1.0/Ex4/Experts/x-saherelm.ea.ex4 new file mode 100644 index 0000000000000000000000000000000000000000..e277c985573de099881549d3fc5236df07246c52 GIT binary patch literal 122876 zcmdS7Q?M{R5G8nR+qP}nwr$(~u5H`4ZQHhO-~DH{YG-O6=6yPqq;tAcmD8PvbVN01 zfgAvgApsBo000~S0FFWaoBubFr_5Rqo{A%VdLa-Md*569-%S5gg(Cm}palB=qyK9i z0sQ~!0TBEM0HFU1m;GD;CqRM2a2aC6uXieeL*JZ4fIRSn&{Y&Ca3bvi0DubvS_zcI z8RQ@_{U5u80qp-fo+p44fF*!AfCYdH0096K0K1tDBvnIEbDKyIS%ht<~SDCU*>qKkWpbs>|xY?tE?7TazPdx?})) zQy#;QEWB`>3eIuW^%crgzm(gEkROk&TN0l;$yT#NcJCJ1b2l~^FojF(^~kZNy#?<+ zxkMOMAjTUrpS=fgzV#Iw{ceD^KVK2*&KMJ0Avh97q3;V8V+F*zW`YGm+xO=Z9%#(TetmkAnCTEeLOjgyF`fS>_=$;p;6y1BOJU+t)_CgI|L)(X z%>F#Jrx=65IaRd7#K0@(HDR{mkDXk8%>A`dl*~-MK@0%J7vHeMxh*}P(Vww}-8T;t z`THHKj~O1v_W-ls+yb#AM$^=RjLx6!y^toud6Y!q;(^`j&=V*j)L&NOgWkdH7Y!my zv#p436TE@WcfMz~M5@O1brh#Nw(d#&@urYd=!*on9z3%`;!33 z55z&ST&VTg7zU%z>O>TN+)pQVnx_KWoqlWj#$n~tZ^>U@?}Ou zeOr>edslS4ZcFbd2rqlyBMA>Q}-$s{faiU|4{4$t&xlfZW)4=nXmUiI`dJSic8Lx zfi&*REIrB!hAqm>JiVi8JSOiswtxjHF)WdZw=I{NbWZM)uGp z2k!K#{v&%Zg{^Y+$B;l#v|W1}a;E>#&I3}0AD({IeK$2A);`h1h_}WbhfX`7Oie&c zYXEl*rVv@|%-Y)^vZR_vwv=4B3_r@4KwpuWR8!^^Y zQ^xc)C`4Mpy=pVlr@1kguXwxf^;VCv@s52YS~tOvDG+$e(;WqP)nINp zop7kyjg`qoui75If}J|P(3r3B_IO*LEN+hjiAd!hsFKhf0NvVN>03epH9+qN6st;U zC^9?QRAncLAnxBUyOc0tgq}2eAcXj4M6P{*xCpuEv*}`+t4?HK*VJxpx@FBg%hgT$ zIg>%53vp4IKKF zl(ifJR_*RM@7K9Ky?iACBgvD|an4^^y_~9XG_vEN#sZO|I+OJ1NG}jkcX(up^$g^Z zX=`xx-5xl=?%1l``kOi@l`t_}voTx4o)ySH?V0tbJ5jDZxsXS;CgY z40830sX{!{i0~ja;~m>}uy|5wVbFkPxk_&v@sza=%Y2b-E^HWV`BS*XO=Vp$$4BX$ z$-g$VOZbe|FT6JWyr<-Z!IW0x6#8(v1J5Py{=#72!p*^+<=PUk9(mbjg(J{Kog)%k zAiyi|CQ%+aZ{(3#$21=NTl6cXXrgnilr9rx?bP#ahQv;0UzJ$Z$q$mr20&9{rla+MSp{%nm??z*Lx! zsK;y7TRt&Y7_QpmdtkePj017b+9C(DRbGhoG1f zPac=az1$)?vIr@TVOR{xk6Ia+D-=0s@|0FH74p<{9u*-WXslDLx1P)5v?lpraVXK7 z1`S)%*jozPnrV|~*T5vl@2rn@xH}i3QgT0S`}91V;wT+x{?r=2o7_+P7>F`?KWM%1 zmi(atI^>IpAxKsg4t^kz8LP(ZA21-$kiy;Ii|QK_MPhNq%I^xkb=`fkv1iH+uCX_~ z>WnM4$im|v^xr_+be&c=PVt#+M@vLs)_1x;CD>=!lnPzc)=M~*03T6LczBL7Od4g& zPW51e%p@nW8I!-k;zhGvT4xLC6Tj0c+CcV3vUU7k!h!ENRS#1In5X21v-goP@L6ps zHsvG_HY3+lAp^SwF*p^0A>%TQ(emofw{o;G6&jFb0BE;V~L#VOxjyuDnK!Pv5z9vP~(ylRjjBW2{vq)`jj=ya|+F%_?s3}9_*y0iFVbJv4rbM+YGFU@LZBG8{~ua z%YIWDNj~QVANy}WtaTq>7wmAKo>A4`eqOO6gMPlR`u4((chx~SZmya*3Z-F$dig*@ zPj}ksUS|{NEa)KL@LeJ^Y0)uV+`RELcZr!9S?Pa$@%FlAp{t4TVcc0<ep_DD-XW#;9M zy1{^+%iDsu>5k@XqT8m(P<*R(CAPL}zpAkRlq&qVih%vpg#*{hh}dH?@x{tMp2ENP zPl0$;+IkUOw{x*x`^L^X;BP{f#l|QLc&!>A0}yn8Xr&=HGF3ZWpnX0U%)B7*ddNOF z&!1+>bdob^Xyb-u@wG_srnHbi7O?*~C(I>P{ZZ{NbQVu4VwA#nm$}7Fd;Hr!-&e~H z?wLF+e_e!U0J1dArT3TBvcNI{dX2zkH`uQ9F0Dk@k!@*ai)#vj+NHUXdH{L3G3Uye z1dqStYIPAsHIN)P5>X!ueXXb`;eh0i$m5*^-gq1{IIxl-3`CoV`e3GwNd~zMW{4q~Y?mU@K8Eh!41O36RxfaMZ!0*=)0#t^ zFIO8b)xZc#5&~thL7zHTXcBUa&_z`BFoYOeFPSh+qIPkntB<}p=N0ptPAMw#?MvQ# ziDJHxB!9U7h_Zal`w`E-zRhM@9)QU)Jp>d{Uy$kq;9b@r!83VC};RYeIipNSNsiRExC{_ z4n^6TS3#;Xw$?bpo(=??*`Ef8I%q@Noj(;0Y{!+~`uwN5>3Yef>-N{g#Pf>}Hm$G6(Qw+j_&y^w_fp!!g$$d*YSxqwyUO!MnrakrWjc&i zD56){Dia{B!YaD$u(fVY0Udjc(joz!eODX&9kgMZG?t9(9w6etOwVpT#Q_lH`=^mF zn*zi!FfL#`?NGQ3rzdSaS)Q4a;H?m<@{FnX63tZ#N*&jct*RQ$fFWeA!3IPn0V3Cd z$iN|!oPvZ{Gzo0RU#@OHse{j9i;y0*KKV=%@kXQh{zNWzJT~*7=$S^AlE6eRRVhA> zhi}E>Oy|7vren5(4JE7b>9Y$JB@w^|JV?Z3>R$>heH*JD6IT`5BWs3K$75dFXmjE_C>GBj`2u8^*$aJ$}*(xE({pr zs|tdOa6$o!7r%y_hO-uQt}qy{w& zT40j!4sMy42UcT~5NY)`Mm94lz$h5RI#-Wxw-b8-qAO+vU? z39z*PjP2ouWtb6HzyXvzYvC^g%*&8+t|&GmQcxRr*3GyeR%eAzb}F9?s~bz@1-bYw z1U_A}$>f^yK2eXS@eVtYG(l!7GT(}xRjZU`~E9^Idl53W{znARE;sNswUb%G@I^9byld z*R}11+owseAH4?s`d`csTBw5j_W%5?Mf{;SM7A_~WgvbFJv~iJVh3ldbyRl}a+njB zh_Mn-F8*;-MxeUu)-9!&5lJlLUiXFwNufXSooNY60Y{^E?3rJCgMqvK?%K5{8>e-F z*>|vqj z?p|Lb_m=9jAyZ;yz;GOQrE`}AbK>)}x-DtCQiRWpr*_nt8P#V42+e7Qr2!h|rlb*W zl;QStnP{%k=58>W^mt6`1GO`TW*grl?Ei;wiX(l7Kpn`pCB8jqnHu{hRvG`6&Z7pO z-WS*ibW}e;!SG!C(V5Z-MPJsjc85*hhG>P{&zk5XFwz6%_k+3-`ulS)l5dHuj{p)7 zA+gXAi2F^=ejy6ft{8x*8HXFEcU2qWfnNacvHMd2#=s=fM9exPNFprvYs&=DZ@<0a z0)6&q{mLd(CQ-yUdiuCXz9Qx>(c9nUvv|+$>5j?k93LbCT<}W~eYIVRS{{adoG3?~ zl#K}pJX(x9QI~-J{wpBxp5Xd{RsB(Sb*@5;M^>vCCqd^KE99jpWpX3z4vc2&qlTR^ zF#@Csa^OMZYz|sFVQe|~$5bBE)6pFj$w|Axdq72n z;f}&`Lr;|)Gq;Sl=Ti{QHZE$M>8RTQdi@4N7ufp&_m7-k8TXKZrpwk6pf!bAH;Zu# z&tagyCR8sYgFU5pR=5g6{wgM zG%%ShO7(OP-zs~7>V!dQw}a-_Y07HJE`jPSNs+q7tvU(~CZd4)=~7jWK`%FYn$H6I z7s-f!>b!+Gw$Un_7CsX7+I>)@EVg>O&I4|)V@-w_#u5~81E!>83U$igiryHAxt0|B z8>4U=(=S?4G0QENYTTciA`zKD5$7Ro!yhX z*p>Plz50z)X6gb?-P!~AI^G4GXFoKMV2(SIPCn&D4aSbd=+I3_@_BNKR?gI8qht$F zoLaieyzl**mFnw}!{3sS`)`;naB-PTW-aWP`Festn=Lg*cwF~u)(;OcY0X{ScA)Kx ziG=avDNqM=b;JTo@CQi0*3hOZqEQTcG_K1ZIp*L1oMO78vHX^9eE9c>v8JM=6Xz-b ziz&_awxL65$Q)KpC<-9|!rFku@P|w`;xg!UAGWf#%f9yNY5K@K@wY#LZBwf15Zfmd z>50u#>pibgl4~v|Zzoj(x8(k6W&hFis!90G=1oxU{@)z$`{E1Y3Y;puS@bsqN(Ymi zqaXL{D_73StVMP(Gm_)mM$mfEkTcbjR!7KFisjKv;R>k|=@K*S%F zB|A`0cvO_HQtsEk2DSBWib$BYBh}xmp;G(0aA_pY(Y~__qjhJw@i4T|o#<{L5j*!a zx7D*@uGOjRb7>6$LiVN$6`6a1P5<~U<~#8X%DFPklW=_%z-@+Y4;`@;_k4*WA_sjH z`shN4@LjhH>JmaJG5mz?`x^4zLh`KK+4(P^eJ%6dlIF9c3!v&ZaSV zJW*lNJyo@0m*0-U>(X?qntZzqmOW0P&YiixD@&P^4kFP}EI$*iR{rh4z`7*txU|U| zJ;lv|R~8O2TNf?A9xoKR--N=UqB9fKI-!Lk3FPpEfH4VAvmYtCV7Tx(0@ezf3R}?U zr2iBN`oR0Q^~=iMof{$bj`>$R?06lSbA<9#xACLMW-s@ZAiys$PY6eJ_#;N|5Gb?; zEo5u{*wf!FT}33ONucofvRq`>jc_WzkrEzTaG?TK#H-qM+?_hmQSj|SPk9r7tk>B| zn<;eDCat$_o5Nb;AJ^5HNW+_F0k|lkuwC9r5yV(sdd`mP1s{D8=SKIE@^~E}NX7}# zzz&UtEu`x&_UV*C#u{#hO8Q>FEVm`gdr?g)lL2-MJmxaSEV8vymvgz`^j_X{4ihr# zzvBd&lxXIg-cVOH#OqyjQNig--yg7^dMpRq4hp}iA9)?*?$#OFcj|K0L{u$0)`3cP z7I&N%cwATTpzFGObRy2)=7|4RW9Y0s=12tP5#fM>!wbfDu1QQ!n*XX&jKRLA4bvaG4yL%1`;8soV0{ zO{b(}j#b_JLFd2oD*nkR(fhsu>WD+anj?=US zQGGxmd?RG7O~^XWB?By8iVXq1ZE^Q5$L+Zi7_iwnC{>=jy|lUWD__Yke2#PNGzRSL zlZep(mz%F#KF3VoqRXHSfVe?=_Kn~N3^2P^lDG?AY!mjxws@}3cq4M{eVZ4^^yK5<;J-;sNj4SZD4IV14L7c@I~k4R=mZ?8Aam>>BFmJ9 z%`&@rF2csrsmCaIKVX>)zrEd|MB>lBzZ3(86)&Q--|v!?a}}6tpl(XH3rb%=u1~~e z_c?5U*xvha+$*$Lo9tJx`CvdL_L>mLRoc?1*KsQ_10=3u*X218#t%9X{<@bW5l{eT zCQ87TJ#h3)&$lshX$!*8*5qEM;{EuOy-OrOqG4)#2mmwl4d4W;Lp~iT75-SuC7XS< zKwgxlflQnt9uY>bZ*z)h2V`V#5HAPm1P|9HB1P{?jX^A8=OT0o;40=f3wtY*SmE_r z!3&OFuJ2H0hz!;iZ5$PIjllppKJZpuLUtg=Z>RdbnisQV#xw;Oze)e?1-C?}WWOzZ zjSa&w8+GXKAU5*i1pk>`&Fk+gZG(s(WD`Qs6P2F9JwIxOUDEdjJXC}@x(Wir8(%9$ zvjdek4rOuZ;PZjGM8q6g3bx*Sc6hSm?JG=3`G0r;NG zx-zJh`1yZNSDw9$%1ijs3;QH^VW^Osf1@gJ07G84QC?@h#K0=``;P$Y==-XoHoxPs z>A7^RRhI{3RHaVzlWrIjO%jVybuua%!r!q#1@44}@Gizyvu;4hny0Tk;Y7&Ez)5$# zi$%VVdUx#4Q}sy)zk%b3G~%Bc39>uR{rR^#LxDwV68bTgOC}=L=(jTB;<{Ov7@1Bl z1gy6;P`)}UX+f&TyD43tv{poo7_|!i<=Ns0{N5QwqQld}WD0Ucrdgv1217BocU}ZO zrV%xwAt_F<{r+vC7f;D|XBBDT~rx@Hxh!(4+ z%|&nKehv}b{2bxb^c=vC3hTAyuwFs`Ceo$Ih`i#M0uI<959U&PMzIM^Ngj7e@p7R@b(FjVnZ6 zXNHwz&xY-W)JjKq5Rv3n$(63T2YW2YrP4*e9!u#Va7)~s33KXApSGpnme+UQhjIiX z|4#blQ|(ieNB|NsrM9q+IX-?zHjg^EVY?^bMUj@9!&deo2jbSN%U10h)e2G0w4R{c ze+{idBuL9qt(bcyK%r~GM2^CA*Fo@$a%58XvEkWxQF!iFVW+zo*3q#-(gpDZ3c6;A z#l6J)TQZZ@9-fCe#ZNH|HT)s3A7>MQHtHAfXbR4iw&FIFhlAr6R8BZF><2`l!T+iw zGS}zhS*KMp@oC@wS{16>$B2yk5u(MLzW`^n&2xGr>X;F^IX)rJR*&5^ne9Bn0yzrW zd0*Qb7X6$Rjy|;(+@f1VXW^7PeGO}5jA4yY`t)#=U*Gs1r7mr8X)r~J+vh7x$akQ! zIhNN8^)K^bj(#=ek2w_(vtqA3W&>V!SqQ0GH{G$N4ibu*RLP8rhCMJbt}ElAD68$; zKX$Gd&J6aK!*-d8KcIiIlXg~!0j|VPQscArJd0mUT)&fe_YHQZ3Dr&Hui%KGqfXbE zhv*o(B>oxjEs6vKfuCxBw*+6R$o%|?5u=JlLwUy@0?n}!4JMcUlz1h9na6ix2&RVm z9zZdK4Hg{ggQ$2fWS0D?feyaI)0u_0Vtesg-*s*{Y$Jp=woz4)1QffQ?>UREE|)xn zz-`0UZ9OP=i_tHwgO4To8n2B_!nbj|E--g`S&n7K;Ck0CS7olkRwWfz(QPl$P_qB+ z4Z3%W!gAP)ozM?Im`)td~0+ItKbJP^i;C+%y=v>4F=km%C48){e1WQ==$ys4VY-4G~lBGh>eIPf+T*|(pc9K4povvZj-!Y(Q2_;}Eupl1+!3NO{nIG^}@sKxR@Z@(sO zhb);A$z)QPeW-dIDbd? z6yX`}AwOawh-Q>F7ER?4!Cb-}=713hQ8Lr!`uZsHbZz7v$;iqAMhZ%#dt${IwZ#Lv z__^b-+pxe*!rs*qAt!&I_nq;zKt(kSr*!Ueqs8I!5ti^tnl{#kjOI2&B`1#u_5Fo2 zIwvzYm+2OWsMJ&w6CJn;)0uLq57SCX?+#{#fYDeN{PN~xbnmf{IMn8hBYz)1jUU}K zT+T7>pv^@`xG_;F5RoiXI=u4Oh`bR&%v`dP)~eyIIJhK5W$PQcA!eXL^gCW}qtQ4g z)H$;I!DH>0r&o~I4qUSaS^FmEtgv7 zc#>zt-uE|2kjLx$L!*Rl7vG(Il=_8u=}VFc^WZg-LNE0k#1>&VV7+Ags1j_#Uf|ev z{S^`{>QZ9(?UJkqQ9bq!@(Tq7&{btnz^H%f4WKMyB?d!<4!4vl9CvQjJzT|6^#^V% zCz>tP!Bsb*#!~i`UjGlafPL%f*)2RCHbfx=03hlv3N0b0U^C!878UCQWzZLokROyf zck337{lR6McXoiI5yA9plQ72jR@h*pI30?)1wYQ2i8G9^P2Z&dVV7m{lsOOYFxOJM zEw~)6B`kl`y8H~S?qJRBbquVG_?~(!;<}>+&a0NC%|K*v>@&_L ziE>VfF6;Wr&-D^*Z$eCq2t@>ayLGGd=bWk25I(sNVF zY0_72iR`9i)ZRU2gC*02Ai%@mrc!$L8WR4cGHlI}gYeje>xhuy+5@ceS*sx@To?y` zmc*IOGI)8 z?TX;12`##ajgnCLe#sf%F~mZ^{wv3xMGEk7r$i>POIyg{lIJN$u?hoLgTV~wG^f=k z<9gzcZc#*BG3m$u%6Fl03K?}mfO`=UuJn=T`e)SGyZygJSU1V)bpWZ ztp1_Y|D$Lwc+gfkedx9tb8CKjXnQro=@CmMTU5|TJXHi_`PQ)ZOgt`n^)%j!>9q*6D3FO z7~chB3jbzRBTpl6goc!T)3V>0;gAX__+h@og5i@2=(`ku!|Xx0)W?}M>fPF_P&DVW zH>4mz5}GzPoM~nm(_6-SG3;#0HzpzA<9*N>oYtg$-3W zqDa?ki20`6A8F6ls$sGr!=n=d+H8`%7JTigGflfAtLRO>m_tKb4uBGm}9oGCe7phm?U+3zSdO(}CIC5!q- zo8`@H&Sufu)ra{lu(}nM29g6uzR+_QGBO<+ozSNeZu>6U>9a|yvCS~<#|5eT?5-FW ztS8T%HA-7678|%KaQyqoYt_e)mkGY)b6}%1_U{A!VzTXF8s-j1#)@)eN8TLZ)rpr+ z+jr}lLacCz_zM`$k?{0}1x{jde#;9TZXVIAW5h&EOPft9iJyZ}E9rR>J+W2wXr0*n zhkNt`UMizfOZSmQ@UcunA!s@$H#!3dl5cZ-F$M zPwYZ4r^55?I1I?C z(VZs4Domi(9K9**H%JE?wmzykxKd6wqoDkx&eZ^)Um+%1D(XYy2rDjlt|%cbr=S{%ni+^r1P?<6!uNE&eo-%~kOqDA{uzD^LyE$em~?U0n!-Z>J}^jZ5!cKNXh; zlVAnP{avmu0H`ikeenj79}5~n)C1KH>(?wrE>ItnA`%4T@o7jmrx3hOL4g3FMxMPVb{v0o-2%^wR|3a@6Z8d z4FPBy%t;wfmO}f1*b?&KfJ}MaPjAZc!5xntDMxH3_#^Bd>ISuKn9v)7QAOi!Z;HvA z;!{(-%SU_1o7b4owSl$Hn*WJ37OrSgDTbh#`q_KBWKcN!C_)VrlKO66t$^11$}^4p z%BYSd8hsOe&RJYqVkfw)*v6Q9Jw=vSrpv@D0>R08cB7l&L%ta66$f>SZw(G$U=*o| zwctPZ6)Mj`=cB^)IQn}60cM+^<^DF>7|01gSu|Y9;Q9k}vt+ghx|Ql;AeZ~!%T@+2 z(^x!PmC6Dp;UL|sIy|TzetKYUh7Ko=m-Pe5^a3HCyiM{fJjc*r0VY6E@8%K+^4U8Z zkF8;yxJADj#G=r4W{!o`u(i8?omIK7f{h+pK~ez;i~_O9m0Zq&v(-^;Rx?}myKQEC zC%ZQacBVjWy9hY2btnHT(=bH(r)JTmzY61GMC==;iV_O)NG*8*Z zCP@iWiAEi#1CmGEct6Erj%jUs^X!xxmUQlY1G+NMUBXg3i0QJY`$I;r0^_3ak1F-d zT{2gCG%0;&7khc0J*$!bcXi=Ot^f|0>)xa!iWU+x9Qq5ZP!9I5 zJPz!>Qa{%w5nEkBHM&6LrHJ)7zRFYYva;r#B5wDS+N{M{=D0t`$V?z1gpmd0v8sY| z2Jf!}CHzsI*`1j34YFR6u?3E-l~Er;;bDG*FM=5S*qbtut2sJEY%s&;ZRB6Fva-9w z=zHe}mp2<9-f#klOr{^-q>DjE^Zlg%LO)^3IafRAX9o2P4Ul|GKt+D(PTwo1M`?(jcU1H^2uQhAJ?LHoqTCBh;EBx=95E#|vJ zR3+QCBqpJ7bvW?u8583kDdEQ~AS0%eg8;&qGLqmt31@02(_O z;=9(<|04qy}FYd_gdTYELrS8!Cf&56FrLmf)B>f6?*1^OPlklFLc z{7|$~-*Z&#EYgid2-k2Ao-quLNHN7`FQYm}@i1=T1$l*0kN~MoUN!bX<6jlLW5Bd+ zt7Q{$fqbD~XH0UO{Gw0>UG}n~rF~w)NRVZ!o1=y(q8G`<5`U&l7cD1|fwn!q_>`tM zgPLk1+U1GbM0me)IPEF{t5RK27u!2j|G9Hav0)UQCzPD`qz2l}@sFI=XB289w(Mfd-NaLgk4qYeK;ez?$(xhHMX%Gkmwh^}zeSpx74>5}X<4*4db*Xx)8mq$k%d&Prf{{Z zU>@4}dbxUuIG6uHY=|`@!?XiCe9HHn6rsguT}Xk!kmS20H2FKjHxD{l%`_<*%J*Hn zEj7HHBdx|a;Ov**!*&u}syOagyQm!B5O>kG?v84OWQrihwhl!XP_+4_|!FEM4W?E8S2l;$?u+k1S=>(!pNviJ~c%DM}OmQ|$KF z*!0s%3OuGN-hSjI>yx3{gc`!v{pef!`xgPX>5Kecy#HH3#@xQR;DzE0p#o`h?I#-ZYoUjWO^z z>Cwx$u)8&kQo0)|wcbGNVQ5tY|Jx7$yWLE@5kRFw9ht>=u;q%?wuv)Q*hX1t9UA)K z2jm@_IV*$ner@;@ElAbHu4euOy8Dwf5bf@Tu^Hw(ny0^9pMgT}wWM!#71@tJ=ntEF z*(H+jLm^RCnet*6uXd)T?XgirIj6;Oc65Qgf8M;D0_9fgyMF~s8NTu{0ELikQ-?K4 zwezdI-v)6C^5cE=ur!sRREAn|Pk^B;vEBxkpZB@XHG39M@yCL>6gs_Tyh}^a6gLgk z8W(`LiGREGxd{O*(+6Y52nwR87z6>Qjs3M#dXlJ0uQbIv;n1dq=4Mo zOk}KUvr?9v-B?4nt$#q2okAQ6eHLw&F&y=Ffza0FPGm<^Trj{)G~X)o*kZf`3e6%m zRJNX+hLofK7A^!Qi0#2x#s}$8M@)KqW64&JdJOGftiYGD7qhGug=?G5W{l`u1fOvE zC&ft?$az$teFhAN82h7k6@ic><_<<@L2!T&dOKs4!cdV70Eau}( z^Al=kSH;q>n+YqZ&_MD1D+NGMx4S(bkHKqcSW;vExbuC{t< z75*ZdjBvInK10wPNl*SdffvM8ar->NXj!ePwXlrAL9&56ib1K=5x#urxLW-=G6Kji z=QTS2@6M+zj2M#S!!1+!>;;tedDy331G4mrj0Y~iUqhXMl&e`=%5unIQspiIqmw)V zWR6j7PNrhZtm3e@WGjdUYxsh-pe&)DGnB^9tDe5~@5YtU%WkSK$VAC=AdP%_S(pPq zE&VI5Wl-wlqGxaV4yy{?@yKn7Uwh`x49*q$HIU7qqH!_z$z|lrG~0q}FdlF)?r()P zuetE_9G~sqZHrJA84a#N#S2SySYYr@7I+>Xer>Ux8g!Ii_dRGLusT?T$zGZzmAWzb z*3lmT`9e{+kE$YYP^cr1SDok*_0&HKQidwLn=CGkA%F71B-;rEXy0)1&BnLP3)O zs{4E3$IfZ{J8~F`L->h<{+$Ze|G{%6jQv-2$roC>4)BMLqT3mXX2moL;y6O)vEL#-bOIa@3UdH zufVeNRMI$`8~7wc_~4gG7s>^-ohk=^CaVD(Kiq1~ik7G-0WX{RGW^262#u;;>DY@B zrDUqp>A&-12^2Z?e(B_vW}(pj#Mhi|MjYPHW5PHu>T^k2()xza0@*t+hpRSoRt z5y|AH_`sm_sN2hXk%0i)WiIinfh4cQZKjUQbdU&I?;SVV0g8OJ_DXNLQov6<%0{Po z{sK6%RU70_Ru4w^OR>D0e?ho29YKCVNHyhqzu8=t?}wXp(6jez3ZK+6Y(~eN)(i26 ztm;ph^)bD?+=fMO@lD{`n{E7YQTiMr5uslUq*??ta%OSEn`;+Mp!MMSUqU#P4|MzM zxcgZ1dmK9f8!|)84ue`V<#oLm7>!@8)$|8|mT6@1MoXHw7S&_l0O=uDA2v4E+O!RI z$}4F%@QYV>U7>v1wlannnXH|70OOgHFp3&1M%{TQJ3K05R zrb`)nVnZ)~#+(>}FH{%id$v6wrl}kWVX*J*(9RnplLc+u56aYoO_i1cF|`gjUbCtD zM_(n~&>>~&Z)kj`&u`ZN6*FEa-um%L*)n-(jq6B^qO^jOe0t8w1UYz2DtkS3!Lqaw z@5E+!vbRfwniWWAg6PU{J~4UIJp3~Os*i&a+{ZV){)#mO0H-?X`>Y+m>&*_N(dt=0 zB=}A81on-t)<8IK|xM&ci`+T*dK`d@`PBq{>6_HP{|>9PK#4!)`(dd zL!2#?i_isaK_Z3ybY`WfsM}kzV#~}0qdsQ*xVpd`JmK$L=|eUsbCN$Gi?bvOs&8wg zr>eNhHaqs8X|gjzF#*8R;Z14}`V)K9CgObz8^PC{4WXcFxymfma21k``K{4Xx@-N^uvlsqgABtYqvrlq+ zCGDXYw9VI>QZ;-1DCMw?(FzdZl|IDm2XQ)4|Gd;UaTX`3pv`#com_%wdszaW5paHS z>I8H|ML19Gh9AEhWa$WouM8;rNN0lbYC?(<%~~ zT7AqbtrT!P^`QY&GX^?aK}5W93g?h=*Cbr@Kj0e$*`ROR)42^-AjoG0JIa&|g+;qx zlV8K6+{`(Wog0}cn>$T`6=#KE8Hg@h!$*U-=vRv!w}#=`j7v9!A`ohBRDljc=BXEs zK59#JO$%*5+S(%cp~wm#EfuRo%i)-d=mUE_QX3B+8gisj6oFRTBM-Q(+iM!^rxhim zCxNHWV-Rn{CO~Lt>l)Z~Beap+XrQR%Wmw@EJl}hCN7qLVhwrNwcWVpWel5_mp=mmf zaNq$Qx6N^8nZ)ErHj0r7$??kp#nJ|+Y<*wkKTfHFay-n)7el*30q1>pIgpjL+CkS5 zHs$?xmpDE&C>#Dris)*XR0u77Xz*6XtmpKn9Zvi0KP$|Kt3I&<&r64*6UabiG|&{f z822GstC~SMZ1=`rBLji3H^*GI641UFr^2N8UG;AN40UMN0QEr)HRtn}ydV!^T21$Z zkaQ30&Su-U#7+VCxB+_nLZ^7b+3G98!7z@fNXFo>=A5zsw;+C7LFD$r=Yv#pN-41a z!A$fN$5Sx_pvU`3^jWFe_{#Otl>1nwYv47O5J|+WtqvB?L4iqiu3AfP<7216*I>Vt zPep3ZUbaVu7W2*S1n~xbyUwgvY1e59p<;SfvWN-o6v~PRzG`L!^l1O>4J}}{Ch$33 zi9&L*U>v(DM_OQrC>aJe?;^-8P|!uYG+%XI29O&<#8SC4^~Kb~^*}$G47#BtD%>{# zfNMMHUMou8JBc3|9EewOmF@S=eB-E7VVfvAJ+?xf{J<~uxhuVIiV>vda*eX{hVIE2 z{q8CZj{S@n2iqX0#0go$o|mqM_zm{tdt#NXu)bO|nJE3jhwSa8mZZDaCao3bJ8@3WJo``vUz$+UP(sAuhOwUt=|l?D-TtaDF6qh)fzAbY&oGhFz{ zTbau$&;BWGLCYQW;A4rqNK{4~>NCyxu*t)_p8Y0m!b0eJ0HpG1JTMo9j^Vnk)OAkD`Iv)c?`J8k%?%2>(ywvO= zZ%sB9vf{hIN;CYv)gVokNk3kI4)Kmu5~e-g@45o*2Hf-CJJ(uSUYJUAa00rp9+#GVtr8&6Y&22vZ>+qK1(#y*mOKjgo5bmAAZ(p4YFu#dlpHpFO=`|Bc zAn{VdqUSoCFdKJcM17D*n!?hzl%lw!f4grSuaGQXK-|A~phl78@hW943P>W0sspj7Am@vY6TtHj-ClZaD1B*EuKx1m zwpkg7>q26ijtS`sJ@Ov2xE&wRe=|{k4WUtxd}aKOgkMQImt<4nPFX#rKe3Ti>22tP zd<3L{MS3af716W;#=|G4;9wOWt)8;5wqT!g>Y|iwmGqQdp%LHR#@wuSjdcnVnCjeZ zWL(WtRwOyt*|9!!|A7mq#8VFsG1tQYLwB#~_b)dQE4J*T;4aFX z`Rn7YfYW;+T_v1UO88ox)a`L^1|GSh!=|pF)5Tub3wNDkGv*u)L8!r^JSORGGr1EP z`_e$Ny=g1DI^$iJBH}-O`V8lT*CU!;t0U;cMkrUE zmn_e5;hc*LBM4Vt+JxAnC?{3g`6@SBBQ&E?F9oI;0} z+9BI!dyqO2c-h?i$vvp-VrP=$hU{%TunFzP20iw zCVnMQ$>am{5pk|TFd|~12KuW>2i;-b42(7E*~;jnhI$ur3fC^@MY>9+o??~QV`lZQ zQYN?W$wZQ%HRuE8D@=Rz@n+E(8@g8G#vvSwOmLrHrUe4F&n#~N-yO2*&#Mam5m_fj z>}D3nZUO6taHmyfesnH@&lXZqzEX)TtuNO{!e)cZ-lEcx?bCCFhH?y@hNAo2cqq0v zlic^bk!GKl3^W~x@axMiy2KL!(43RB1({k;JX$WV=4qWSYFDwY*!r?6l@(<#4h&F& zK|O7tAIRJ4b>2i%wxeU)qm*ylWP-@aW|PUWON^9mg1x`y>l+nr+FsIF9`p z42oUiGHsNx?Kw6OR{s!lnnagPzK+WuU@+*od$OfKvh~Hz4m-@1aO8BOlgA7cEOLL? zb~n#M3hfg_Q{5?uiwg8@f}kt7D57uXPj5l^R-1f)8VIGM?xn6$FMhtYkaAv@jwo^)P7nU21kw5N7z=|Qj34d_A&JhxjGX@fYYj5=weXo|xv6a%z-Et*@FCUdSLm$+ErKFZxfjF+?pjL;Mh{`L7 zOjRq7eaXCaU!oz^6NA1ZFN~-=N19X=(fq&_$HF2of6jF_n2h*o(M;FNgH0iXDTpg! z{!$UN&NpE4qhH1h+$24HHNE^i8dH1esP=+V*F!q?HnSb)ZMa7XgK8+h)QKghH#!&s z^?Cb|50Fob0gqM~4y;((Q3LpJg$D2fae$VU@52D?vG{+d266RQeTXXHb*|7GDA zOcB+MQ;24J$vZ}CQ5eGT^mEMpe`gyj2#-nJ)rKEx_8obygf3U7`KC2m^7J-WdbPH6 zLVnDPkw)YVj2aovXR>z$OTh(HI|tF?tgO+vbA)7^>!h5V(Y|5bNZ)D*nntcBKY@ql zHw6H4gvsWf>_6=AbJ$)eh)8p?U;Lnr#hcMqTSj%yVN&@j4kNCqVA42&3%adxVDX=d zf~|0=VOt@gRy_E_*Ry6*%IoL4KH~ykL0E5eJ9wwj(S4sRqUpM61|`3F53$NA*>5+y zmX&J4T@>7ZDGxMe~*#SHMO0){8aaqBno-A*9H0X0)n0UE{a3h*`lU{wZXH z)A$F^21q6_sG{#*lf?Y_Pb(3@?_q=NjPCB{fL;eKF@7t4u$a;gQaqL)Ay7tyoPUb!lqA_; zJB9RsOIH;=9Y3|mPy9W?C>#xw6%-8IV1A1^#80)f@uQD{D$erOAYX;Q@f_@<_A&`j zEjQl!(^;rKLT~ObK3?RWe>dm!_D1fK5MDauuceYzo80bfzGZof^SBDD*TrK|813ncno@ z4H8}|)deiK4w8!ljL7sF;5^qa@E6+h9Qcy+QtN!29=#ImZ6rSFxa!52v0|Bf#nqRx zy7gsWw!sB`s2+sGB%V4#@J(-y4vYw#mv80`oy}k&qLF5JRpZM+OIj419sl3}WC_&3 zs&w^zQ-9`XbjSfB6Z#BMX~+|urJGj=^d4z2Hd0`fBm}Q+d=p47d+{M5S~>cT98Wzm zcjCBnP8jwfMtREltLAygyR<_cVUV1iwr1+7v$Y@_k4dgaoFuMFk(LXN#ZCrz!3BL} z^kgpYr=^V>a_0f@@~ha5AEZ5vh<(=gXt@N*U0i;gQpv%Oq>T^Y0?%vee1DStKv0;Q zzMOp|hZ$Ah0Q)xTtY(XiEg*f6$Y*N)Yq1!uM;HkzXt5MOX6~PjqJyp!R_Is-6#i(O4C!sVitzDvJyy4z)ZC~w% zp+fWF_6SbS(Q3E)R<$FK|_E=)~U6c;k3;3c$r(4ft)lRcq#^H|L{+vly=E^zg=l0VjYjC3s!?w zH+eT-QOeSbuAAO%%RM%HZ#xHmuz-t@h2!M{5l=wb#$^xvx{ozgjW`)%@~&CySidnY zQvC2ot4P9kX^4BuG!5|lYe!h2DbN$LYb7B)t@;N`_&k&riCQ^4pDEHQ*kybNfG$ij zvh9lHoO1yZT9M7`EtOeDW-dgPlv$Imtav}_(=gkr3gQ4u#hy4hK=`KlYVhRY@=2&2 zZ^2shbVNZ>q$zvSXCftl5Fe74>h0R$Qu{LL8})*M?{dXLkg&wUw0O8H^H*~?7`b3> zP&fp3uyh{dF;m>K*zaKm=0divWrM$!ToYUskLZTqAxCss_KwC}ZcZ}XfQm5J-XC8( zEa&D5r5(FaT?E^W-2o@kPKveT4)Wx2F5NnO@S-iK{gVDz-mcZrI(=5FC$1TQKJSsUJPSA4(U%WiAj3 z4$Uy-7bP49T;F6VFF7Zrr4E#bQz%_HtY4j$1+y4GY!cxRHr$2VeweAGiYk*5KeWbU zUyIT~L*bvnEs=GS2}SPx%uh`E!D|55*(F3Rr_+O!%h-mV;tpoCac{Fn{%|v?Q(feH zEYpE^LZeTquwqJIOSjcRSYIB6GuKO$X#sv8M?G`-cV)h9+oD_-86GscQ~k~1i}pTm zd^%8Xs}f_5^8&?O-}<@kdc0v%;OX4faUGT9`brW_eTUhmiwjw_p_WJ^9bzx8zf?zo zMawJVWo#DL47K!J{z#T{pHF#d-%wKIA*Zbnw);$%{(W`2`t-wDBE(KlE#4uz!yMRq zKln;(X(|#yb8X{y#)2e?XwH>hRREW=ET^|e(C^mx!4zT?JyD1)8sb%hDfGO6t#W`P z`x3VY_jjd>C5y19O1KE~h-BwmGbS8FLe$sz5?bP&{ifw}`%%TJ#r>~U-lRdz@XHB+ zgA(L+1adz6>u)xWZXrTV^q+D`=`FH^pTC9Gak@W18^bB4Go|f~vNE-+sO{`$s$-!N z;18t-ZjJW%Kac|~mSER~SP@MSUxGjDwOyUsjQ}SRDg#sA1VtHsFnFiw#s{vpxkK!X{6{WHhrI- z&a3-ZQWTE6$rf+xden)ox2-8!R5}ZiXeIz_yi2%kuTCa>5%8cJUDb7 z#1;`YR<4`UC0_!Yo295&$a)#+37?A3ra`mg^pr5W9K#<-)2m(mR}@~Cs=1nebh+Vl zPJE1rcqX*I&+HJ6ZSSV0C#%<|kIoQLWR01PTpG0$&+y1;dRz_{ue7}w+-{CKow05T z!?Bd8YB;DKAJT^decD>;7*$2%`IZl{UEjs8NG#8*q;Cc8vDqW++@IMB0HQtr^p|oi z4Gpf!_r>#Y#ZNL*(Yq7!5hwDd+}iF)&3a!|bZ*jAOyat@_k2fu`{&(`a+zXYp+ocr zZ1f{!t)e5pGb|BjjoC*461}Dx;Xal!R_-DmLX7t(Fs4X#eFLi4beW~3vtGN^5BcU? zoG!_Q85ql-V7B3JZZKiEDsDIYjdH7K!wY*LMlDlhpY_swXV~-JUO{v3D%&i<2E1^8 z25L0SxBbC*$8fnCK)Y$0*d9h=`CiR_hpvLA*MBX507n4+a)~*;SJo&h^kklQ2IiJM zK=-QbGV}sfvVyf&GJp3LloBhgA<5l8_bqo{7O8U)I5yOY;Vv{LZ3r1LdQgChOO@MT z1rK~>l&C7wYjzG1CpE^J{TEMhe?(yQ6eMp?i{3bCh|_ zc_nZH8eoqV-xPJ*Du~%>pwHb>Jad}4Z1TBY@drn^qLU;RcnUF#)4D(1yNQbjI-hF@}X$vNlWbY7OnOxl)h z{p_~gXp&fbBEUK%H6d2ikTEvBJPNM$J#tzkjTL+)Li~DdR{3}t3P8nV`8n@>3KrT~ z+itw)$GENW$%$G@E+#U*5W+mtcy}S>!sUqbMmmDpWOglaYR|5M;OP+{q51~*9BR#J zd(Y`96nJ%w6i0ycv`sYjNH+xLhd82VI5{^H@y*OGilz3;RS7XU#gQW_*|X+>(*oxs zDa{{};Oi0*_0HvcYQyqY%veA^Q!@1!T%SO3n#}A>S(esE5nd3lbv9j@N!7Rkgz?(N|3^*F;9lD+R|E* z{(r@p3jzp9HZ)S2fDzJYSHtCCaByy05h!v2SL<8D;pmsW4t7~&(`2y8uZX!)8(4^E z7BO-HUsL!#;MCZ+4}erhxkzk(XBiOL7F0rautQd-&H#iUrP#0%8V}%tMVjmKs}T7{ zOJ>J;3Yv@C0U2VXll0;-xJctee$WZ^J+WoPQ-pT+uTp2ly2GY@Rf=&fnoI3WXgOgQ zvW};G%*+zazfKq%I#J*9SGiCLmju&}x>b7eT~{{=5ZInv%})fUy`{md!$7adGrnQL z0+Q9e#4LOvy3wwfJ|Flo!P?Z2{^26uScB~wyVy&FTqz$?uEj54HjHQ~=f@eU)*?sM zA6fkp)f2E*{jE^*y?)D(xAcXj`DdwzLiDGRI5GlrRSQ#*`JfC_2x= zl(X&*T0(d#WhazDJo=x^zHH2+SZ`bx)m0UV8+Z!FXX zNou#gv?{WA*Gkrp7Zy8eev!#y$l^4R|H1%jKdAU|;9 z4yl=g1(F1XSb%Y)MPQdINxQ9CHUBDswUU?>Gyss?2qQy&X-m!ov zZBjWOooN(6LyyM^N8dih2thOgWK#p*dG4UooJ>Bkqv^ft@{ur&*_(6ools79L(@a) z(F)%>-tClKuU3yW@xdkeJ@3t7UUp zk1a~!&y%&Z)hRkMogtugLX=Ry$R25HjAec7pAVKC06{L8~*D7m5oT7IPTztP{rzt^p+NkCuz+f!M3y6g1=f& zyhp^+vNvMWhE3_N?VPrfRDZr{C!4U2L)Bg6+UI77Lo9LnJ55nKZaA7M4N_y%Ti^RFW71?Jpul;^=rGedYH;hrz|3PCm-9GKQ?@FEeAi(ncN$9w!^z%-> z4U_LMJzhrD_a~jzdF8Tf_eHqg-n(KP%E)5@1Y}ZncL|Zv)8(JTy;cld6HjH|>TT4i zMVWRz31HYSitfy$Zq}vj%HaD)z*#tNW%PTsm_$gADh)4S7K`Mg0lJ6JR}8!~|Idd_ zTw)QWjxz%<|G_wQoHhdd{Wf5DsH3HgQ2UiE2?ci$^~N6@UVa{q6#k%m;0;0y8nTg& zW(d=eLnL`NdsMvxoE#np$Hes;hLckyIs(sE3Ks3=6*pUQ0_(1n(iEh2?&F`zuDI-f zT*;Lh`+Nm(|JU512-P$OA22FHqLT4zYt{_l;f)VUUFbjI0i1T#TTE|XU=X!tC-cB@ z5fMjN>UB=rJmiC9UAXCbcJqO}(aHki__mJsdiD=&7G@^*3M$&{kU}-;GC1$Nq1rH2{5J(%CI<-;Gsa*meo7Bz@@|D7G3lOSv&XuQb)+$N-jrMc#6w7Q3p^LdZZ&!6J-xlZDLHGV(`d*Vh-Kzsyapd=duN}#2 zvn9+6;pCIWLZ2E{=5To;+DB{BQGaaK;}Wo*!BZ--ig3CY%291Jz}9z?PWR4UWm`dYc#0awPP7v7{)f|-51+W-H2zm_N) z6;Wrlm^j-J?xb4Q#^t9}pKH>xB(Ot&54ule-g3X^z^OP1;b>-KubMe!|C$J2uH|Fm zG`Bi0jN@Qdh@;H8kV)PtBOfFc*MLGlF6^++c62kYf6C0Xb}FMhNFzXqzIl0?MK!p`iu%s zP=*);3~UnQVDv}x;Ts@BC)opZTHf`##cg_9^c4rVuz5ECw`ab)_qShs$&iKjVk`}@a=x=Y9|*_C~y{Y@pbOt z#yluJwz(YsIEq11Mn%w_L46N_^pZ`XCrfQ^P&Q|5HYCZ_VDTCvCUzW42hKOBS@47R z0AYwyx5JJDr3*@a1Gy*mah4%-q{5{VmX_;Hl<(Xe7bD%0uu`07{mj!i4W+6%+D5P> zMdEKq-yZRG#F2iC*0IM>czVBAzszt!1bCWc0MtG~BwK6ZQAF&*=D_DBvw-wh!Rs(@ zu0QjaJpdnzRr=cN2JR!x^Twj|qpGWNy~FJhiz*PK6))j-TdspbDZ+$vd@#7-eQFvrk*y*Ip4Q zh{_$0Km%>c3cQ}ecp4ZaFTH>0Ad)}cY@)ef!6?QaJ2hetmR850?nDh&K(nX^dqyNo ze6tSayuF5d9jLl5y4n{^bjDorUVsN9ajjZ4UO+t3lk6J;Tjv-nSTsiV3=s$qLC9O3 zNG;>SK#udB=Z7+S z21?`e`c|>_q)>$4*JhWZhz#HW4NgfwqfU4sn;^`ww{x5B zmA`~bFo+bF%+fwEyDpa9w0IdvK zHg!>?hI$A6dL$+@K1=VP{-9pL(M)a>PDDBudPnp0pzt6z_TC7fc z4X*CMD;4&K_a^E-QE$v*?imG6u~Our!Ypyuu}6CKMaC5AHHl=pB?~d0xvYN9nd8+H z*Gtx2<*H`wTp@!b2~iQxt5Y$CpPdhu_}Z6;pO@ZxM4V3ypPZ_^W1Ay2?S1gE#NB9TPF zlX-@{&eIP}U)Qi3S-2_53CTCen4kS6-=i|tK5REpo=@Zjv9xjRM%pU8cM)%rp1F_4 zf64c+Z&aQGqI~tW>RJt!$niW!pgD0xiP>ShUJ$CMOZqC?jQFE^N;prpk{3(X1-OUP-7sUgvC*^SCKBpgI9U-6r^YmfkG2t{+!$@a~U@!B~oLR67rSQKPbnfCzb73Iu zmC#uLR581zqC+w;8UeNrnA4=Q1`@4fhR>j`zvpas;S9V!e_Qpm#W`XE+r49qBeCe6 zT9eB29k zoHw;O0L|Cv>v=us$xo|d9fi5Rl63!FEX-VnCGy2@9o9I9a5+jjI%PlhTDF~;I~z&j z>f|OIE>VMaM@OlH4ak)?`aimh6^6|A+z}>?nOIXz5?!@c;SYhrrAz=IbSK?Yw~W)%Ot`yRa{5fEhsoIZROj^bGH0AyJ^%JHhyBuM}N<stp51hpmBa3l6RM;VP2S*M8IEyR_ zSs!nDro_&h`(1xT_RiXH;i#s{!;Gm@=HoV4dG}th{k;oXOOOWC-9nw+h8u=H2AdA+ zdPn;!7lTg4Oq0@-;eIxfWxP*73)pY#COULkXk7@T<)@$zUL=Bwx7|7t!oFaw0b9)( zKv5Clye1Zx`$X+tuI&c(!pA$Yvn<5DLX4A?4bCzRJHcrpR=ecw=MQM6ET;3#lB41AVfV01tm$NAzR zP+F`N)=(`t=|r=hx093iTxf2nzCaE26SK^2*Tj_oo0S3dx{PwWYt|1NDP)&+Lem2L zHtihrI3|}jXf3W#=NlmGMxkj0MW?&?gdyS8w#sO_2TnzmJ^bDs%q&ZvHh4qOJ)F?T zo3LZUVlyLhW|p}%haPVVbFFufwvib~)VRmj3W>hH*J53vxOEIbG-QJO#Q+6)iypFxhV zQ#Thxz*sQQQ_&Yv5b0f6Fvg5rNFN!VwS;YA75R2Im&O?<^oH@0NZ;L2=Lhh3PmOo^i2)akP!N(e(duQJgh0u||aZ zu2~ywRf^khA>HVcAkU9cncY>5;3Sl3xxeE#tAmJiF~GLex~x9Iz~%l-CwwYsuQyWb_lN zvEfFI+J#wTg&n0QlVf80lQ#PO6uhbLdw3TUN0K$l~i&dO`%wHsoBf_P= zFS4mIALLXkGJ!<~Tffv}R60qS?)-K`TWgmUR~u^?c6-+GMdzTx8qK!#YxT-327Ucr z6i`b{GLDt4WE*UuWl&smmQ>ik2J2C>!el@JLs!3OCo%OkhCBpY`Hr2oqV>^R;F*eAM2Ctbv6N(N6^?J>F$}s1_&Hsji%V zY9qY*8+hOMEPFWJ5<=bR=0`W@6heJyfZubk_oiju zpm?R&z7p`cLZeN{*g^*{pQkRLp6!t5v*yLd?j=uSaovicg57W4cbxtjjxM+NA)iOr zt;CdvFo4p1Hl-+R(0EGu)rPC7&v=fwxA}ZDLqXJ^H|lGPJw>=+j{FHcEFz8()s?3R z46q9_aUm#a%WM74QUhQhMKI^p-lfOjxJv>(rXP}(>8eBZi)#Zca@n9q3flQ2MIC}l zOV)?RUbfPoOXmdv`5n4)3Fsll-(DXyaA>DSm8iTmIaBBbj2hheqFKsTlCSILeoPT* z)tgD=a`9+Qt&r}Gtujht+j+&fMDNuIyxHGOZ0k`XPo3v7Krb6{#`l>=hw_K?h(h;( zATFc@4xQ)+H$xhrt-;oYAzW<2H2j=Zh?1VT&*9!~MgPpy{J2=V)~`fGu8kxdj~p`6 z<`KWGO*(epB&#MU9H5uIZ^gf%J@yZoayP>oQp0FkWJ*s@p^E=uUsweVJvQGg27VHn5B zkFXli5WgNpuH{wGd+nK^tgoSMEb(3H$QW7QcdTu$ zBYOXUZN?|CoMj|{M~m{813%tR1opeqCc2ri5Eu(;0nUz$cb&2mc+C=Rj|fyk;bz=o z{uE7ZV*}=!WX=Wa&C97zYT@HK`6;?P7M3<3sh=T)Gnc`P|ecE@y^dw=r>J()o@nm$YI_lVuoK z7t{M^IU!)Rt>=BMv2Epamid5*tGGoQt8F75Jay7v%24sD{oubzEXd^2DdV_gv~{a! zaSWtlTxly|R-G^2;>YIT9bj4GX)D`Pt2{Q$jH7qjYrg!jt)+qG9G9A-ZtB*yn}2(t zkBRj$mdw(OEkMo@AI-y2R5+8VlK+n$cr&WWa>DsQCJO6Fd;@bW^}#t2Tq|0<8}aLX z+@n{eju&nZ(HPaKP|rPei2UB*ksD$iH9eq5K*|D2hYhwIhe z2?wq$4AWCK$&d7hb(K(rPru$Uicx#9EpyY9G{ctwMbua4T$-H=umIv%&t~+pX<*j7 zj=;jr>bq~c9Xt(WGYHxYQ->%DVCMt4;Lg`o?c&g(qtIlh;T&u~w#NkIJF?@4&tL=c z#?-5^OY5x&p03a8W#iIaG!6D88iEy}(#BzN#_7lyl7)d_Ksju7Zw;&hYnhibzo2&J1NOy%pJ)~ z(sCnKh&jOb1-@vd<(`!hqB9F0oIH}-@T+pORiZ^Ov6^?-g)11Iu*Kb;vO|sZrsDS4 z+4jJ$j;(W;ihlSP)lgXXV3@z3eNu{BfYnuKcxzT5dy@WFSL_3t<6wFj6)!zMul*Hv znWcd7Q1H3+qL#<_?0HS7-&E;W-bYPl%aS%bKA6~UD3A8l_gG7o!8Dp$m#PP!c5Plr zi%LAyk9p%-G2FQKXO((m{kCt&BPAm5BEgA_P^B6(dC~4*9D<3sMzm4yP0v(b<24s- zeID4zJ|E>FfJVbZ{mp5X1a3)vzIS|6AdK}U&BCMwoGe*{Z6y!}Pu!YN{@mpQWMUZG zrTG49cjRRMnuy5_w@OYddg4ZChJoORe_O_Z%C!`jv9-ekw^x}&ScBbY=+{AH`SZQ{ zyCdMtAW_8n*GOa@TEO~9reH^m+RjQ(x-b=sNKq8ZN#(J|i&+*Sk-BW@EP{2g;?mt@ z#pyet%0nD8#KY?d$OM@!@(HG|H-Z#Xkw&?fcAI(%kREVz0H5{58CBd7qY_}j)cxaF z8>_G6@Ma_NV}28IQ#8POEqivei7LYv(X7kSn(*u$T1CFT@eFrlO=Qp*88@Plvj?dv zpGwdm6`2R7ExsogMz~vxzj92ub2Q>j`rs@}=0pzvKV_^F%UONIS~h^h_}wRL=CSfq zr-q33EWe{d-C)~z`n`;9_&SubV_jC}t$;H-%ad(PkI`5Jim9)6Toa;!4OA(fhCA>(>g}Gp9?-&0zCD@Jx;<+(Ep`toptC0d8^zg5AXD zW4%XG3*)IO`;+9Zri&m6@AnItG#6V>Oq|saFo#OzvV%u?*MSN{@_`P!J>Z}$yR=|} z=rK`LikN=$r>G+c{CUA@)5_@Fh4uI1!MqltQ| zi}PHB?3TYVjR{3-MvV#eiSU3dl63j$N9{an+1i*E>n#ay$!IVgIV%+OL8jO?y&UC{ zJjtOfye0O;DkW>O-) zAn>zh*l6@n`=2sUI#fpUf6^h=trA?RN zsp(pi(6#y8)*?vW#+zL)MRK{?L^D`;3j7ggOG>&LjGa1TRvv8$puGJdYhowc>pG-% z)6x=4XUv|V;(H5#IK&m$mT67LEL5j z^z&Rk!ab&#m`#Jua5PwujG#Vo!CfTwW?FV23p`#(d)Zc;7F;>l6+T(S*Iw>_$nCi) zST@aP(ePLZO8TO(*hrY&3c6X&IAv2O_=djfo>RkaoX7nY(VwMoUcT!+mBkEKn=BK~ zd9CPTS70_A_MX&HyeT=U*jA4CgYp3wn`oMD79&@uSIL;HEhFFn6v7IN{%E&HXmo8K z*5=j*b6QBjmkyzptkvbf7aMN8yb6cR>r}PnV9MTpyE)S`$_V-U;PF7bg}f8)bY}}w z@Z~i1D%;mmDRV*<55RAAft|odtOohg@+Fg zS}>|g7jrnpxgs$&QLV?{oIs;x1zBbaH3dV{3?4eaAMXP}Ah<7l?6|Gfa&25ut?ie8 z)Qa>&Y~Vbin*Q@8oK|RoSK?J5VEqV(QZc zw-X};(rk|&Nr$X{zkj0ngHWESNEf)WA|yjm$HDP)a!LL}s!^#0uV3cJvcrPugbhMT zHMApK8KK43G-WeGypOe&n`OQ2hC+kah2@Q_?u6s4JD~NE#W2gjM>|=?)B@Xc;59Zy z2fFT(Ky&@AXlJFKTkRYI#Qjg)ITrz|XLE3~Jt2CjZk#<{ZC z1b#HxJ+@$uLP=t;*o@CczA;V*$kQY~v+MTGh`CFOv}Q9J%Ireycc zfGRMDSe}$n+Izj*X8E-iL08AA1j2b(xpy}y80HV>-Mku;^R8Et-(Rj8c#<8Jxp*-~ z$RH|YZMt09D+4{UUQrjKIL$Pv;+9iG0p$ygY}Sbjc?3)APtwqLj4ww_bn6RF%Jy#M)w*-M1o<_Xa-`cy}HgI6; z06VTNqQdeJF0nIeZIxIVpkjkuM|etZ6tRGvnvcZTrTP=z_?|jw*Y2u8gbz<3L?2+n zcs3>vTq|%R;fL=EaGn;AIV6Z@R*joOAZvc^HnaUQtms2ckUD;C;j?od0kSBIerlDO~Z)t;E6E?k;APIPA=|AHo$Tj@kM&^Qd zZ1tB^#iu;!dVu|6c+CGaVfo!NQ^Q4z-NR|D8AQQcqzIYdAD+q6TdOCf`D3aUgIlY_ zEhDGGr4yR|VdP_85e@G!@I5srZpnUC(q+@}dfoM6EjRzVnz8)O?LQOgh2T8!!pq^O zQdF@tr9IN>Sd_${oK0z+47Fj~jq~JrXBs`sX4f1~7diW;m0%xN+0npY%l8J-To;eG zxCW9@Ulg}SE=ytgx!_3bZHE6+D)zoZW4Oq&wxI+@a47IsSAN4aok5VTH}Fo9#2~5c zc{!S(DG`?+t&UxQ#%RU%E{P`&!*zl@Y0OB zt;$JsW+x6V+Jwx;*gc?!X!AoP{qU9cGcmM4_b9jjIAZt2BHOaouWAgj{b95T{I&4V zPZ_ns36O5y*L~Y4h_fG0i))<`NGfVNj9SP1(wFz}J%f|;fqnJky>%s#ph;m7vq z00V>Cv4w3eQy`r~+EP&E~CFxS&mX&+6vys$X)8*mo5V+K=Z&t+-$yv`usL<8%~mmtc*deiuDmR8gH(ueab;*Ex{)0h1r! z@1pwOPf9PRFi480=0m9rH2ecWLeXT^9BX4F=%M;1L`ykNL=;ZVSP&N;<`w2QRHuC- z($%~t5IvSJh80gFd5OlRzB4-@18s;8`UGSGa%I; zlCIO!w;HLgMBkp?IfVK-TPT0NFoq$>o*G~rdi7NZe>P&GEIzzwTU^8X81p_T$f4tz zA+J~}t&}ml;Y;ZZ;=tHc&7z4O=WM!(QSDt3B*6}kIA6ArbI8h0e*T4fFECpaMfjW# z8w~KLGb)GEYGPc$m>@2GLxa7sZKe(=noZ=pbXA5}@a9nu?}JsA=F3>3S!BO$aH9Jk33zK(pwSOr$ICg zo8aQBYnFdWdmAeM4<>+7+S$UIIGh1#ODnjgtrvi})Q=#HT>Md{ch!`o7m9IumskCZ zo{exLn7o@?!Uz@EuRUb5QgQ4IkO^dbe#W*rkD37i`s&%Kc6L{Ke6IA0{HnqINY^47 zP3jYAq0iqz7>*FB>30uqP03K-nAH~3S2qwSJrN2xYoM+B^SanxHO5FgY_sH=HTouw zk&}1JQNoFweETNR!%Rd#r1942d<(Dpr}+t%9Pp_>XR~ z248Y0B%w`qqa)`Q8||KtO`KOQFXuuIsLHuN^RVPdDlI7}-Q4S7v>10`bwI?#yNg(t z8!Zle2E?ShEci0aE!L5E%Bb7NHK-=~38|&;*oTT3L^R_tV}k86y6R@`o^c$! zwKZ>#j6_jM7}eG?(`Cyg#op={C5n$5n{z&0ZSVQIbYV-lRbL4RuDD|# z21+XV?ET@+Z#}e_)*p6`LL>ANZWbRiJfHTFURlBI8qG z+<(mT!j(=_S8SF;ESNW}#%E81>Zm&}DT7MQ#HI*T$ zMYRAmK+3=FS>qQTVAd*a+z||3UiH-316!DP?q#SAT1ORpL^L?tf1b_v#n{ zzTa;_>RM)XXt|rk`g#sSG@NnLb)lvhdC&*xNqv=cym9As#K9HFaktSFk|mC1_5mw+ zDQ(WAmAlS8F(Gr()fcejjl>hCQl2SivM8*J$@Pp>pH*&WqtNWzvsq!3XAW=5x7`BI z?M_P>ROeUW2A4~W;rpbFxiw{SJkCU>%|LBQ%KqPq;!l-uNXyP+^KHGslOz++6QEgDu|Hb8mT@ z6hZju7euFP^oPm{wFN~~9n>t5-K%bA#`kxP+UX_4Is5O8T6bNGcEg?1Baj>V-wZV4_8${mvpfLM1{uRFQj)l7vx&5ro2f@?2V^;I zbJ*uMcN<`yNJ8#tKemZpMa-!Cbu=%FreLr%=>e!{EMta`&)`*9w#^wKBn!465aua? zRn_coQP;p;7ibDUMySr7=WLvqr?zGrRgk(OIGFrRWprSY1`?%rZxpKaWxx=mOK zJJ$eW&=c{z#Oh2D$4DouNQ0Oz{@~bZebbhW14UPNm)v1McPe!qz@k#SLLV9 z9FdM#o z27UU0-8`T4V&3{*Z?iPi#<>U;j1r@DiVfd+2Qs!q76gucBgFkZkNqN|FcF>+muhdn%m&tlY=FuU!NF4yLbQKq{6cWh$wRCztx9Vt-)_`EX40SDom3 zokXeV=dN@=@Wzj%j9gD$TX>Q0!T1y9%!HaXRY+er)=P#5?Wan_I6_-NQI^;Oq79VG;OW*21jVH&Ergt8rU3W1K@6&Oc+%8ZH|YgF|HzKEw~~D-jlrf{FZ*M5 z0y09+Bkf=bSyoKGsYJT?-;r0~?4p~-0gv1x9#GmGqFD2C(%uqrTDf%xmad3YD6dRs zmWoJE7`4>5>@a7gj#upaGR^`^1c}ZapWJ;=@DjMmDtt7>YW@r0`rp#cS=0(54}6oW z%yX-Px=Iz)INJwzRi>D)vqSP`!f4p8F=?YLiIy|_gt=3*D3<0OvMj| zaHt$Di9P{GLU2Gl9^IV?9sYJ!Vbe2Q4oULECLV5+_#T zTo&p^8@%P_$AV?9-eb=XV)od9g08#rqgxM`IqJ)PH7%oBk*bJm=c zjWO0@?*~%Y_iA7*i-W8{*wQ9#fgzyRmbRvv0a^wu^xKosWo``=8v;oIKZyn0T|xS+ zB||DFD!sGd=0W=KuH-u{o299rv6R#Y4{6$xmLHAN_Wxd5ti?Bc(nuNN-PNNx5O+l| z3I?V|`?B6#P+mLVo$DHooU+E|*nvRnEMe{9$pWCEoBX19TcCS-#aIViP?74g8duRr zM1jKZq^@=$gx#cd(Ng*KpkySjm)%gFTZnG+6sz+JUE#aMwgkSAY@(iu3|;zf5M#am zkZSqn^|UBd$nG2qLCC*D@5(!v8O7Ssz6cV99AqXI4;1o^BBT#tYOfgoGnsmf4Yp3O zS6E3>*D=%--fl~f!k!7b@1;i8&lVjTqD6l|DOkdc(M~?{otcDqsx~~m!M$5=xFf1L zDkBuj>&L~>*>J$fS%t`Gpa=AX3i0&57KpIsA{P4vh3uTyWV_gxa z1qy{UpQEEs#k4dFQ7v(G*TIW}eanAr1mUEezvC+7&Ok{?so1vcmL201j16}A0FNFX zUVn5}Q$T9OD@&wVgqm3+l!LouPj*lsFTCZcmtv$Yvrm>6fw%O@PR~o2+@au%S&P3I zd;dHAJH1RC*f5+Tp@ITOOTG$C6?cMB{q{TtiX`AW-k0jDh|GJ_O}y_k@7}{u>Y|zU zmiDWR$?ep;hvYSbwx^2DgCe-RXEY2@%7BBw3m`>9nQpKCQwNISHtH8PfoTROo#wkG zkU`8f7nm6o{KbDVI`J&Z*fiY*y4oKt&z`Y1Ci(;)^2$?BeE$Wy>X|>JQ!C<{?q5z0 zjpt6H^8q}Z!6Ok_tsGd|o)2EfC;uFJeV%mL?N&)E3<5h=?2Xd@;kb&VlR?b5FR6uO zVTC+TZeAVK%T7@%HJ2g8uobf+mweTi!)p_Cc>#vo^D!>imHhE{&JE7>kv001A*nar z1stoR3Mi7@O-3|&=D!f4^*SWZKb_oo`SphCGb4$C4O~|K90Xish0P+=;Moi)s5TvrndG>e-sIn;ND?P| z>wv9|QmOq%Mn-q)uF`3|w^5Eq#9#`uujk6~f%n&$kZ-pJq8dUNXN=FMDli3jSsZPh zAZrMW?eT&8eXlf>4w%yLqA z;>hA5!GwCt<=CmHI*}AbDEQ~ljWs-L6t_90zYmX@FRn8Uwo=8Z@?lpJnC45z3;;m07^_fX62U z>deR@$;OH6tush81EFk05fdAG8>o`?tfqd$^&xHVgi3KL%e>bG+lmIneSK#+39sXq ziI^jhDU3TLFLrA;a-tN|_d;|LZ+hZ>v(RSI=^KodMDI*NueQQ?PDryd(VeIL)WiZp zLIg3WNYv6;k5MZDf2Fqv*$v(%p^}#@@HL z9L9yi=9NOsBW>q)EBstZ|8|?;HI<&4Z)Q_<)S6uWz6HL0)+I*j)@$Gj%txGDXz_OW z@~e@~Y067Johll8UA$!jLJ+O$^#@`x>b{=HE+9B3t7GUvRKYzi$3~}r(IF&fnIT5< z@cv$=}s-E{xGZS{8QctZ(g>b|7)H2d){ zL=fp6&lLgnp{~_)FvkE$3(e~&=IBYM?@luU2GAAqVCuL0S+o`;O^2@PI6 zIVD_wLRkC-#a!A5p)(geUx#OR;JPE+U-`4N%UW#e&~VKAWClO#huwYBoR6y^G*34+ zr@D!W&l9n1%qlZ0{WL<@I^f~0q2G~ap%@hd9&UO3)O`x&N_HIfgBc%7UpN*n)En#n zx<*f><^#HGMd9%6l?fOiE3ddMFcsQQaShe#XTXOl)g9j(G1AUF;h~Ah3UmS^*&w^& z4kI*`2lr{(D0dtO$>Ah58{j$_jZ`My;gw-SYT)Q7UyEeL(er=>Wcz(fKTFf+hIC7p z&vo0}6*j-nUhmFo-+8S`^`lJ2R;7k+L_tPRNq}?$qCG!;DVV83=RN>4VNT*vSwhOM zQKGoIelD`9kLD?;oV#z77pzIbP(&mLYJ`1H{?4;uG*0|@&K8E-GCHW^&XeLdawyx~ z^`9a}@aEMi+izt5S_Uq$l1xW5fSyk4J6jQ{u1!MUW#o4~Oe851ocP=UCq)!-uQ?tE z6t1SV-Ungrb~KLdplu>!L#bpRYOl}9cIi4Ax#l~(-JX(9TLrrC2$&H|tz&OS%8fXh zdE!2~_`>|&M4OnjR$VAwYdMPwIgViqi|UD=&{}ncv>9n{c#g~MWfGE>JwYnj7JvXI zqkSwYOY5A!I93x9Jox6mTK?;lwv4DT5FldHVf%$YW6B-xg@H{b@UpWda-0W_|g);uushUs4j@(#Vd*#h2p5)y-1!t?o6mI zJ3OjTPqrN_cw>)ZA<$;c6e1%E&O}q*zDEKDNg@Ccr%{vtyVNYwv*&C_zskFjM9oef z&Mshxh%80RxNA$+IMQM-(JsWQ(<~m#=|ihA#`W-zewURAW=L@rSSI)?8hh*ZM7=_+ zNct?(4_vKd0-87>aG(lZ?>SRVPM;jL*8ccq!7>9r+j!zR!~()13~o9wBdL`Lc}O#0 z1{_caKf|Wl!C{P=rf!$1m^*Z;hck3Hc))A&<;7%dkg5Pk5g1@Ms+?X*X+Zqz@)VV9 zqUgWp*qn5u0gT1am|zX32?9?u5b{v6z#xAone5u9LWbuFF+$X|%}f*sgQ70uC{HI& zgIRcsDDt=q0`!`^ywP!&Bfd7Jc7PTRSG{QCoZW5{0|SG?@XvdXHzJvaLiua*ldHxO z3qF5PbO{1eZlBB$`JVvhD5%kJxFYCtFym+CKUNJ#tKBl1>q1OEp^;17Kn>#eUjf3~ zh}yC5I4R-uI&zA@YUBNPAq_nIL!>Hc4anh3gX{3MW0c8KbbneOJ%&mLc+^ZH>-yVk zr<(O6oaTwqoV&WXACFItb+}Q3y4u&)?qCCj-x=d}5{V1L@ZtPPX@QHdi`;~acn4NE z$DNk_UI*&n&{=1Nsxbh?x}|gCr`E@pcGLvjCXBRPYMpb7OfGUdLhO4@ks3gQimXE8 z_cP7*MOkeY^qmW*lOXWX85R>t>39Oai^zo+D1yqFA$m3xU6fEtBl1 z{ZM6tw7`6Ivk($}V>?C3k9}s}wXXfBK{@Cme#|CZ^*K`h>8`6{G8HTQsqYUAkr2pV zd)1g!9Wz9|i>2H`({%jg?2HMsn7SkQFvX`-c`|c%1ub(x(<@v}Ld!?|ng~5FNxArP zla%gfWhmVgXrOxUcS!Ft#zCqi;Jb$a8Pc=AA9un2if#yYVcwDCNm zr{#eNRd_JtE=K00^Y%@~_4AOsFAT48F{Wnr-VR5}Se*^4Q7;wMYBF#zCS{>f6JlgTJxYWn4W>Cz~jzim@UJFxka=xbNm z|IW;k39-~W_#7hEKLWG!bRm>gQ-92Qll}_ceDo}q@+OZhfexfP1fbmnl6+`BRa-f+ zINBe=fO|C}=v~Quwh^`h_3Ej3Yq0zTBYTE~^N2KM`7NbS zmX3X*{tOx=>%hwbbX=1Rut==D=(xFKq&X*rh$6SS9)UR1E9-m4YE&L%>*S}n)iMwc zPNPGUNnuY1&a%&RT;y_!l&n%D2(nEyHrH?Kl zhos(0VgOBMuP84FrAI)(k${$-`0r6Ntr?X>mlYNo#Z&c=d)zqCs8(7y=ASQSFt=dE zr7b_-pE;zv#I56aQDCL^LiHRA*2B~}Qig&my7q|o{`RTainnMj&>oEKN*>W?FSJ9G zxuo4GLJ))Nj$syj)iZH^M83d1rU}se>jV~b0zjRv^`-;%oN8EO`Kq9CA`iK8{#uQU zY(;ez2XXS^Od(h6Cfwb;g@S#P8Db#Kd9|6}W4>ldRP=4>G9tx5^VZAgmg%*U70A&$ zt-O`tT-+D9lTLqr-BCgEe~smT`@&9{#u*?^*V`6dds+#EktTW?Ym{YWDulF#T7w(H z_@xN>S&BY`h&;K)AZ@*?^s6D@SVUjE0zWZkW!SF>}tkwdly8Mkx)gKbNC!S zLXqrMUkS0PI>V3LCAZ4?I__@%WEtFQjghC~ z-w;6}epQQJEZInpQXamXHsM!uQ4aE%dO<-twfOT6pQFA>Y_C2MHK|0j7V#lIdcNvi^B$SDreEw{{wp@|+(4!^x9#XcxT7b(bbLb2+5^6yny&1ymt zQ*o-POzq*`_*aje0={fh=Pq3^g|{W^Fx-8lsur|-=#Emy@;Y@_ZcS0d{iH}O(MU0Z zd}cHrKNAlbz4?j7d%fw(w+FY_F_AX(Q?+o#Vis4F%l+O&hmD5X6%q9MrGC-QXnVF+ zKQD~O`nUZam`(`~i2Kpg6OSAR#!dA(;iLl(0<(!<=+F;F#;=NPB%zgcoDYKpD}?tR zF;!#H^6~%-dR_GmPv7zwwYa|=K#~7Y<0jrtS#PD0Hh~QD*U4DMOkJjaFL`TlDY%#T zw%6l)v^lscRzkXM_JW5SfzR;sT1|1O3YR-S%k)yQI)Ul7_V|HxcDYrqN!)eso?wCP z^M_w<1TUyx3+`t<1)Mv-GC--#R^f+hov{=!Yq*N<;d$VDnWcV)O-ZBu?cxkysFTY5 z4$gPxJKMPwUMoqMCJM>DZ+v#u+dq|uBbs5h7Qb5kCedD+H~ps4I{S3Os5Z65DJIHY z>1q^5A1Gz;m=US+p9q&t1y#b$b+OO!rTd6H-elxQrBos7%UAX8^@OQsJ}(z@yIuu} zx2J)Bam=gOZ!TWU>?CkJHQ4DU{ejo+j^j9MMynsl%cm4AipX{Fs@p)YiR85-BFqp* z*C3EDDK@dUIs)jaHaBXCCzhW2nQn_fBc__#ugWMyGX&IFzEFQHS$cqpUqXza3Yfe! zCo-jFpB;0l8V{xr3CoX-Fvp}qvYv}mbes(eQ@)pRB^*U638J?A#Hgqr0dUMsdK{$i_BbsNO?FH`0qXde`?4UXkIZd z!TZu+V>D_cLvU6Wg6hj}k1R-c#x=(Z$Vfu3 zE&d)M5H_(vcF%Lza8(x?m?>x*G|$bfZO66+(6Q`jP9&8~;C7Gr+cEdVvP%Hso~(MO z#jmvj>^8^A?#1vN#Pz}iw5#=pC=54jeO1w$j^Drywpf|q48?KI;;N3clHUVTI%-a4 zcG0~85$q{oqcfheEK@ok!S1Kx;O?lTj4{z)CD}m=z|_abpl2Q@ba4tg_w8u=fNK9F zhJ*l$^1q+cGU7P_*A#}H9FN)bcXR}MFf!-?+;t&>)+5?A<=kKH-$v#LEn5#cChEwx zK7@K%Fp$;(z7_8wSY=SHBc#$;lkhn7*Xin!Ou0(M6N>wg1M*x+dZ1cMi9fc)S($xJ zc*x_8t;Uh$+af;V#p%aSbD6CE%L!~G4T@ia~_+Hl-t`5q<76J?9xpy`nfW8Nw91bPMBs&r5Kzwdj>n}~g}HFyIv z|IWyB1`F~jBQeHLr9;v*>MsItczkvNw&ydpZ&_QllZ-F+Ka*EZd6}!hE|9SXk|}B& zTmjVP$o4PGKo_Jlp-8KCp+F2Oc>w&to!@i$q|B%^u!Nk~gyT3#FF>^@yA#eenVFQS z#H^V6Y#l0tcAq;_dr9dkWwBd=Cl1USTxQ+1akf~PS=QF7?N2Q-9JTVd;%g=2+JaVR zDL~8Z`{aQ>b~VMRpM4~L_=9x~67_#MD%Gg~F0v%Raaq~V7-D1@tL}sD^F}(*e2twN z%3xw0w&k1$vw4IB_c%J-h^}hLsY-;@3ZV=UF;I5s@kjR^thmZPr&N#;6O(^qgBKsM zTMvg??)^DVxC~M=a3+WvTaI`h|F&d(_hvqHm{x%k$O(7!qxkdATjHeOYwTRQR3i2~ zn_SLNBeug*>C#=gqs2+f9FUQ>#M_8%JxQ9764MEL7YQD3M{iZc zv}^w^Wp{VPW0wFiZ17l>GiClxK`dA$iQMu}#v^$(Kx*j~{=gWb=ryS*6ZGw!vHy4p zsCn(;c3CsaX58N%%Ieu2@6WtgQDDHctahYh-0uvp*7qG33^7VwJILrT@W-g?>sKr} zEtJ}|{BJs)QYwO{R6s^Y97_?%wNDjjSxCGte4(QAhT5^&anU9Mw75Kd82D2-V{B=k+8i%KTlr?ECxj>4 zB#-2!87J&B{s<8`elcMH*|i?5)_1|=fMQ>h6qiPzCa<%Xg(ZjW6SUb@x28*2enL&A zWUolXi6oKGwUz!Bq!L|B5SzJXA+hPUomNY-gDJNpvn9Tj6!u1UP>`I2Gd_^gp(c8X z@EATAYN9#FFgos7#rXt)hpM&IS{{%1QiH(k>MllfR13JM-5cpl?g{tBqM2Y$>kHZ% zT9&)QvXh;M`$gH|<1~S5{NTR*EN_y@8}583yVr)C;fU-R;}JY7JtkfnG1vPTUx_Kv zi}7js=^b(0?(Br4~jk?=HIgdS7kexjiR2rpJb3(+iXj9Ff zb;G1V_{|8qW*Y|6?E5rR*q2);TabtkaFkf>c+dJqBQ>a^z55R#DyEfa7ZNU`{nXi3 z)jmSpWNRu5iW_SnRshOia@$ct6QXv0=a$MVnwMS(K<;h>t4$;g*SvQIz38?A*je^G zY+cPt2kDj-_yN%~0BJFl5JOGvRpkY~C+y9i$2II{V{kSRLbY)?2%?q` z%p7Bv&!M`^{X%3=o80)IvbpkZ!4qvnjXDW2*{gV^)#|T!LvkDJf$p=exigKmH$oGC zQf5f$!XedNzV6LRJ0!*zxlQWQ1UKmpjwgAQ=Nl_gf?udJslm|$YYMHOfGoZL@ z(BaGBVf}j^V6&!f1f>j$$2Z}oRtm>&`(fNL=bHz=#1WStZ8%*NdnuEjC{MfFY7YH9 z@|y#%KX7Oz(N+PM0eDF7^%tM}TdN-^!DDXVixq|z?z_n7%Byp4QwkGrB7ufTnlC<^ z!cP!7ctM*Q#EHN%-ldVSZn77c|IA)6J?ix00>Q13ePXP3cA&oHc{3u;B_>?avkdDa zOo-~f;-~)6>z?~syqcB6PuzjOT$y+_F0=t1%tm8!NM~XJqy=`Axk*BqYDQa1Yu0>TAcV42vY!l{`}33 zX&vfDMK&-j6#W>?z?{7kaZs!d;v!4>81x~6qX$nPU_8G-ud+q$Z;G8vX~%jt?vSeR zb??xbXaL0Y*t~C%^8Z-L(H$(zbeJE7ChP&y`ZVN`7$iWrX-*Che zfW^)o8#ehbaS;#yHfcI7(Jm{K>?X8n$wvn#ykxm(rOrUYd?2a6Vz8i zJEIStZ8@L`05hH~jI^NHAR3;=UMqd>)Ney-(+O{%@zdqJpDiZvnC96eNE<)Wb6E)I zbl))cIMcQ?Qvh{F>MJViKRo+#fgU@3v?Uuoxa3yHSO-~130YA`Q-vLugUjc&w zNoT@rF7I5;QS)q=QMi#pAQ3L^-f~jhpG(Nt(u%OsHWd27Q@}b{e!u0&IYK`h(ZtOP zPYbS7zp*vDqnf6fO4DOhl1xbf@1C0xo|5ZZM4r)!O1K37$fFWy&HPg@R5>$ehGT%- zK~SEGEx8-^7h9+vCJKl>H&o}>cUcV+*gK&z@1CzJAQN%y51L~bmyr5o?==YW-Bvj_ zvfO*BP{7CVzoWVu$HZ_s07hE#rR%kd;`$_8+xbpp&iJ7|>z!r-08e){49TskuQ3QH zc;06HS9s)k7+tE9>RYxi5t&M{)g=)>uwj<}K-#i{#n0Of=z{lBu zkCjs$lK~$uL)yj+1I2!ary;ZWf%Haw9(Et#%fBVB+PtIOJz)CUjo`=-n9%?l@8}gX zGQmqt?q|sFABCz&@Yb$Y*hrN9W*(YuS6g+L(P!1etGPwgh$^37_Vdb{KPph=p>WY{K8(b@?!T2qpjvYywU1uNupL=t@(ar>1dVLnasCzuO{RMY$ z-YJhP$X-bXE?St$7#XI}Y$AkU_@iu@^Dna*fOzU>L!RttH!{BGkU4rp_y5yO##0J8 zw*dsZ?=t}h)iVd<&1VK<6;BJhaJ0>yy zX#zI}Ahz>Gy18{_MWYcIj>F=IAe(tn$bBRL*^#vR;^it6F{Y&v3JiuTiNxPfJraTe zFp1}tybLhoDO#cDhHk)WSKEj6$*H4oN(FBaw+>rZl?npPQ0gu2c1m&Xs5chV)*6*h zL%OpNrgHZHr52~*Yy7e@+u%+%*~*b2kp-(EqEBF-^u=~VrA_&-a3yG{XEK0JVTciG zYVzxodpoS~yqSo6MZBB@c`<7E#-&Ea6El%2X&qBM=aeWW1b-vGDM@=aLCYDKn`SR|gS}IKS4ws|yXU8Qpa5l~>7|5QK9}ntOOi5~E)dffKl0qJMMxEUYAY~_d zhQ*PzOt0lTi#|`w>@_=_8w>Q~9VfDBunFPSbK(y=3btZde=P}<01usBRz1V#CWp`S z_&1qcw!q&8c=me2am1;(#r{d#xGmcXx`h8GJCNYfJ>bOxc_d9LhRa$CRFN9Lh*%88XmHRXv4tMQB{H{#%8NP#)T95}RX zfECtL>>l^vkSkj85j{%P4n?)Ih(s2Nz_~P}q$^JFT5o~aLj%W|vE@wi3#8>tm|3A` zuHu~NRFWi)DHfEO9W8k}4;Dw{mxVUdXTv{lkton+`|7Y16~gUC$Ah#$0e~x2tactj z9Tsm(3-ZYZWdZv&hj!Wbph#0YW+#gH9?jTrv3ZAnl5=>}Z*&RvnYw}|{;36#jc+OC zvs508`iaLT74kIlxVgbha1GWKMm848Wpaq1D~jDwRJdZmFimt9ynbDEOW0^SOg!Y$ z46d{^gviMn(__G)mN3<4rhefhD{SyuuF_o^I?&}YoqV~9iX87z5AmM04qNSkSPuhD zA0AWFhs;*-42l<~>~TD0umtos@PDnUYUVwIHT^5LrFY_Zw3??y&KpYL0bx zA0ZCH1gTxImmhT?*iTFP?QCrhzigkKdhJSKfVAKCHl8$wXiQkd%Fa!HqVEtt^T{m) zOyNdgbDo0f`P&qTFdDKg%-yvF@{PArP|tv$#>RUmi;3febh!6~wKT(iv^P2|Iug{T zmvJ`ZvA|_f@jEa&+ccW!SKenZJ>RjoZTvQFm=4{qik*)1(N9bu1}Tk}LbC@1sUN^L zsTnGZmM(Zsx$1KRksp~?7w??W)KiyJS$>Hv`z5|ekj{a_BT-hRX~46Q6yNz@A^9)B zX^*R{G1PQc{dMh{ zTp9OplX7lLrOvWY@?a3JEHkTj#^|{Er7Q$5Z zVfdpyIC{e=tr>JGoVKNsQCq7S2~08Kc?K@YxFKT0FB)r*ne=!H)W0(fgvEbfLATx1 zSu=VH$VqH?ciC@UK&J9`D-vGUf4rr=kXAM^Q|a z#(^To=EB!K0*j)pOsM02a^Kug-0_c933fUw}x>V_-3H+rLz* zyP$Oi?N6Ks$rt8|wGmn3qC=D$9O3k~b%$C!-w`N$oV#bSyx4PrZ0}^7fx3sf>%^VM zLeH*kCmKY^5pf%JE`i|S_Y1Uf3)zd6RHOs31bvC>8pZ_~9As-9WN5l^l%%~Og^mvI zn5k3(Wgx%W1Cc-yPb>-|;nSbh2s16E8Y%#?bWRW`Nm{Y%lxo{C-~{Z{l%OAR+}I<& z&u<8*PM;RhH1bs^KN?g&{X9NY_%1BW_?>7tlm7_rZX{@uJl9VLrx*Guo5>MPW?Sa0 zoRx~&sI71?dYw5U8f(qYZKwTqDdy8ZjFHx%zy17-72~#fx6SJ-orQY~&*E3d=n;I- znMk0Qi-w$uro?!_-g(jsg3;tJcFWcJNX9Lu8wa% zsdDCi#PpHx^pO9~c>#-3YVhJbB(LM&eE#6?vm^=!y=KMPeh=pe(kdK zwZWC45nQlT7E?E&@YZ)RVgR;4jw#}x@Mn0mxHiylTWD5cQV)X$ABs9lk5umaW(KPy zMaq``1{_uv3rjS5b{$=zqbT1Qd>qQcUlZ9T-vYCf3yRzkxKN5<=UM)*_(`P}x)9Os znrCAEDl!vs%+K~tu?qmO&Pu4Q3`*4#^Ks-a%lhMyPFDJ#3S|uHpZ~OdY#Mzk+>cUF zt$0zo#TmuS>Y4UzA6qb>M+c~bWo$~EJr`oSu{vYxf00FeCnx++8sYpD46%Sc6V+;uC??hM zDim`Cie1a0m^(+9(>=;`<{`{wX92hB%V(mQD*{usm1cK*JXO}xF2r$ulnqt(Cd&RK za*^Kp7#~OK$NSifl#G_t5fmvRCW5g`R?%}MGALVEP7)WRG4-c+xKNE(g&k)Jp*=;` zlFF_^-`nRW-09W0ww`a?VT_R!k(JAz1RHsp27HLm5swXl6wq@-=`yi2)Vb2A>gbBN z#r;9$8GON#7kR08eooL@JRL5VCg5yTKAlQ;pT6_xrfPz_k;O-Qt3&8@uy_dBUzocM zt)RXx?k!&7c!&!X^oq{22JfZwSgaR>-wY15}2SjC9#mb%sPl|t%^dUh<`i$ao8f}KBP&T)+ngx~bJ|I|MWf!^zVp$FTU zuus}5oZ&e+7UiXwT1Cs=kc&NHqnM^Ky2!8B<+BK>z{kALp5cr|alExO zO6C2#GN0Y%xlZ(^wy>AzxMQrDpJydtaVPytUBK?mx?I=>XeY?EaGY1KTF8|X-dPi0 z`VFOdw~fKZciqtR*mwenB4Am|w;Ot&euN%UWuU}zie~32D-k$HjExx(@*Ms%lMiDX z1IFj;DniN^x3M}|nv^Hj9ebn67E=|23?7W=x*wS|Q{vk&Zn(Z<;48-$Bz;vl&ihhpxiFu}kWvH=VhUVGT}3wxCYR zdKS>!8u@E1*hl!1=?vB=YiHWc=2ibX6wK&`!n}OT|LKb!$q?WFg=XaI0)N;z8YKV%YgxVFt8t7od1-qeq7Jp&L-UeE5 zovzxj$(4AJl}Eopd?}n4-YuU#7#s>BeYOUJr7b~?1MsPx2XAb=3VVlWCA103Ie@4v zQ^(p$sq|9CW1xW8wkX!VDki>*co`)26Y^79V#Ed6Xhvp33AH#!I=h721WAq#MkPak zB)RU}xe(Xd*}CK9i>1dxSF|Th@Qpt$s=N$24Ob+|fpkGOH;DmJSFW3Z ze6WG5p&wle_a%9PeO%9ZU9jiWE^YX@b*m7dxdF<~axT?mf?6z-`J^ov{#3#vp0Msl zA;F79i?tF35OmlzCA)#ace?601)GFEcq7y>p`7Qj7#u#~m;a$@0Vh0oa{A-9a-ALrt06=*C8eStQ66TIvswpB zXeptm9XdaMvYHSQkAJ>XCkg-wd6gP-U1)2&hsO6WC@vl`^`@` zalaP{&P7&yaZ-eD)@X7V2jOtA?*8XPA)fZ58oannbDWc zS%$>ptXlfz6-UONI~bB*n0cYGLYdpijI8X{Q%!8^?Qk>NNPeUs+kWyD`)lGj9g_;w z`1e%`d9ievxVtS!B_0jU;m$`t{-NkJBVbd7C$rlxZx9{GfSs>CAHku6pfWod7>V7d;}B%s zWbD$U%vkYe;%(M6zD3@2Gd_2XlW>$cJwOtQQ~pO^bzAp66F$9~M@I%QQGlqO&S|RO zlHcswQw4cJ#zKwKR=tn+HDwX>wY0kMpGcpuXwWg`e=%>*@huw$$-LKkq0?YK1x4n^ ziWND!iZx4ya$$D*C?SdFmgyr!RrW-_yd<@+ zU+71_?q1Y$JecASsaJ6jRjI95TAsAHL zJ{ShaUS@Ps4!vmmbXccvF1sV86Q?hiFLMY@X(yYINjvA`Fr*EM4p<5Q2_9QTe5L9Y zk*eWU4zy;O5;Lo0cgSxqUWP*Vz}vaj$0x5Kc-k7hJ=wIyMVZcsk+LbWpgqwD_{}?h zGa(}cuelJiU@0mY@5>zUX_vbpQNO6yMR5Q_4+=HAt7LsDhc#zxI%DXuWEPV|mq$yj z-|d5)X?FEf+va9eEfS}$91*BdHHqpCbffHhi*H5~Z7z}4AGW<_%{9}j+0p_#s0}KmCx)Jg z7`w98ZP$oS55Y!7=JqKa6tFW|AF8unT!J&~9LCe{kVpqh;|j^#gOK-YZ|KyaJP4%( zE~P}UF^C8%htKe|@9IejIFs3MzJ{|dEu%WP9I7Bmj-N zmS$frZN2pK&xqcMUSxp>=qzoxj+e(x@$jKQ(z8stJr{N+I7%lRIKWgY91&iz7v|LT zj75onH_Tuni|C5jRrY`h%S$DLl2pq$Ha@s$3f0=nA0cg8FWx~}3E|Cqo0e*~DsO(CJ0>P^NbHw~ioL!K)aG6aK=S|82dx=A!buMSPzNMvEi{eW$$GBnGs1qt6_Mkq!a8Yk;jjRSRS%pq# zqaPDc-JG+2n38Zua_h1H3D( zT1DV@^a5qDYC!a5jkmQiGhn#9fLW zn6y#oC@7iD8$rfN;IvRMB`K9lbrdg`D&Z8cBl)%$R)_s@qp<@jJf(MPAj}*{32V*? zX`!Y?lA5~4cbC$XLS!axTmJlb6ZyBDrE~G=r~@^}7DUJwbK`tsx!*T3leYk{5$R_J zE`#amzz9@eJGgXKn45r}94M7c*YB&vX?dmnb6md4Xd@<0JYF4S z2@T1YTK=wU_Ra(aFMOa68|y-nS5O@S`dwt&0^YPSSL^@(C69lrWr1hG&Iz$j|!q z?NQz(f;!wxf)Qv6sW;;Q^~DK%Oo6VZ1>LF&JP3%fu8=W{+CDIq1QM|rkW4$zhbVii)}Pal4RE7b_P+_(T{6Xspuv@F8T*M&DuOPQtRLa zF`z#%Xoyx`17(3>nc#KTN`+kOor0&m)PA6$f}y{~M^VL%NbJ$raXQ0y`YJcs+~5^hdg;lH0Hd0P>1xU0@*0Q6TWn#!Su z&N1GL{4p63T-%6()^%27oqy~Ul5f*O-El-FbeiCF!>)X>ciZ0UC&gQE2?Scn&tR0Z zP-Cim{$fi!-s}L2ije8@wMxWFv5 z9UD15q-vz`m7kCmZ#zq^B6zzuI}wYGJ{h4#h$G1-Ahj%k>nDxBcD@4d2ZXcF`MQ#{ zu`*29Z{>iH|2`Dlg;8+79CLvyHX07q)Ruyyq`{%g!;6N4$J|g1MyAi1-7g=H1uoy1 zG=a;^<2~4Q4@9rj(xB_ti?2Qe?%gr(3>oyZw+j5~4MN&t8>N@l_<6+7(%xqefuV_q z&qYksA(c9wyBn5mxn|`#R(A25>BmYW{@U7hyISCW#LQ_CV5)7(Nqu-vNHs0Oi~lLo zDmdVENYpMK^r2;_9@my&ECSJG)KkKwTwEw0|2<*VnBXDmnG!Zj%GaAg*km1urVQq9 zp@)I-Jk34XS zt<|p1wOF79o#H@ZqLbbqQpLXrrI0h;SGt}|-%FnM{bE4%@TSEhlnmd7cm0+Qwz6K7 zJXUm=d*!#+5M3;nRLk|GWC6(r2{wnHg^8mD(fGv_0y@&i0wijWODP&Yqo5XKM2|eW z1*rxyN76-F*46u=hW=GHL=!`EZ%(a8g%FQnRi&-B{o0m)RGyL;yMW(wEggLh{nwc0 zmMz@wQq=!s=mrAilijXD)l)PPR0dThzU@Y%520&7vmT*B2$h#B`Ql=j?G^xTMA!?| z!zvS$vd$P$xP^l9lhV=aL^3>Q*QPxG``=V877s&R4ZM*;DC>^!Ac{3}?vlpcGsXK> z%LgASQ^wp@kavc{Tz?w+BKQXXM9ubZy<>q+hMj|*7jZ^T88hNK1NO`?JVF+VX$d1I zn=Nq9l~Dpy7TP)Lxd#(o!=pGWZcL(nz-NyjS)y1j&|s)n$3qmWXrX>(nSQxpCzpv7 z2_sP7G|hicxd1Q)}$_&8E*Ko-<>@mp|~;%;-w1rWaE!un#0Nb_~v;= za&iZ{S#0*k$YNDYZ3D9g4j*cf*T|oEF}P$0ewJFrM3$A8POe&iKw+;x5ae{ zm#Tbl6c=B@qpjgv^|A58!As5Iy)~}%WiT_@(qJf}XHwBFat~7~^|%JOW%+nx`4;@9 zSAhG)rF{)$%XMdq@t8Z-1_l2f;2t#TR7+WUOS@7^0qERcD4&D9NF-}vG&JC4A^TuP zC8c~GU+PGVhGoh*+Bn^3d-$2$k`cqcd~6MZMD?tbZAsYW`Y(jNl-kPb^pkX;O;W@2 zd>=ebQ^u=2_4pF~``(-PjClLRuhLKr5|E15GEv`^WGVyM?Qd^Efe-qgSB$~4fmG=G zp&{rczo1#)Jn@P7G|-7=s8QP~j*aKKFl4QX1?dQ>{0!XKyuYzVnoCE3CS6%e&mW4` z_Jd-#(X+cX_}doJkDx8{_ff;V-NAD;XvIi`sNwX*A1hDZqY(5vwC2wcT*b(~dl*Ac=v^EzCipt~H*=$!48UU&by! zv_$8UJhBFz**XMw=>07|4Hh3+p>7tlSKP2|XbT{K6Xeu*6&$zSfCKCUHrRLswlgj+4$7~U3Pw8s|`j_qrsg!-R0 z>tg3NaZsi1y+g!Sc5X%z=h8jKsnk7+YR&Ze#YOp1VWx_1Ag(0VC1cID#H_|$R2|V? z8PSyP358&U@DCCm{F(jY?R--nuO#qC4yi zu28E1O8iIlb7npC4f96ndX04x3gzBd1J45aopMBYvRyyu+sbW+(h^@+J*5-AdbHOE zWpFD(ayQ+6%EWuHW(XiLr^rrn!0Y(Oei$#;6=HRv?RoW^{uVf8ShZg ziM)n{L_Uj#bLYkCs2PyTbJ(@e#4uWr%ImhUzN%uAK|VJNm0eP_IRD*ORo<0MG)}h8 z@q-L$t#n21%N_Dpe5VDG^g&4k*lhvmMmEX~BcdLkQ*RJs8XwNzRV^#63Gs{0vPst8 zWUZQDEEuF`7pU2KYn9h_GgoP#sJC5@@nw|%D*YxdK}4v6WMHryXSyg?yAdd(IC=t1 z6k(dF#usZ_XjH8M9jrq2;>dgEI|s`tC8|`h{H}^_c8el>Xn&q8a6ft7ggAX10}sJ{ z5{)O2LleYhBZT)TKAD=m0|~|dGC!Pe`@{UpQAMdrMprx7$b}ET)u=GU7emT#a6Z-K z2DFcMdSp$TYoLI(nKwnj;BP_{Zh4B{XUzMT&oR?BX#jZD&O09;RO6=U8)!HXNSH;s zw&-5tNZU|e!{=duvriV5sbzBNq_qMRtP{ZL?04^Xl?JKb!PiA{{))$KM7EsEA*6^) zEzUwPQVV@N(Eps^iY^E^rCX46o!j~8oT+B$lrD<59mhe54a0ssoTctD^mB?ne)MUF zF8i)l@iW+80D_TaXg)Uzz=DfUUjSz|qm~{ri8@sT9zGw@P&-pXJ@LEuG0{0#VHGqm z9OPp8ti8g>dh!`J-YPOkQ_B2{Csw4VH}O7#Z-o)4K9E)sd41dHD}XJPRcCjb6{bM* zV+fE%`uple7ESh_*&hKrAoBm9Eo0*Otw*FV{B8zV$pzKBmxRnma1AP%`NTDjo7;!9 zuMn5xa3|y-!<4x?l)j`4oj&lI2%|yXh0moO$eA&V10xP(1yPa+BM7J76T*e&{kDyB z)7kDrptDV_8JCncp5ibprcPSkiZ#eFP53#RF>u)u6L;%!=<9BnqLV`%zh53EA6QI2 zJut8XYmeFi8HLsv7g5KvH{s2BVY#Un#VXw}5oUrGau>fet%Wov`J+5`B@~XsCy80V z)_NN)GC{4^MDO4W)?GEMC&X*H66sCmFj^8^?J2sPxq&`?EwQ9`^@wKifU17T1aH*pDw6 zc~w>dviA0p%lk{wJSqsdJ>B%w6|}^$f(Nh+x0;=TF1KjQG{*VJ3K;O@HafVb-#I;Z2!QRF@rc(V02`xUEMpxSUaUd_AhNvMb)dtGXt5E%2~ z@Bf%aC%l_S)|FdaOMH*+L8V~NBS|z8_)@Z?*dXW+Z3g=ZBaT}3@2?#XS(Cq&vuAKM zTjyC4b^k2otIxno8z*TdE!GdRU*i2sFpo%5PsxJe&7pbhd-nX7{_Ye=`Nh8VTR*JO z&Pl_V0{~l`%s;uEwj4m71`zw>P~)44sS5hILw8gyAy!FK+Mm1S`aioeXlBW>^JsMD z#?8ZP_lva2>C&NVl${YEG(>*wdV^s-!%^Ef`&%Qwk| zV72oY@yR|Fg*@l8pS!FAzAlT|u{>oTEW8p0xgcQHyj5WNtFaE;vVzl2;@$B@apy!x zYqb)eVPklUNPy=A|khu0SRWnyrCB}ISJ{ek())F%!W9+38nIg87(Q)%o!9d*2$$F;tsuV*w-PV&GwzDswnUpmRkBPHYNIEh<&b; zS7mfn2>gm#k6In*8tQ@F#}8Ak&KFe8+1J`YhtN|GLO>G~xGrW9H+qeMi+RV3-U8il z$Ql*;)7gOxR1j&G1U^X`)$m8Y9%iwkL{)gzJ*yEQ*i(Qd@7%rMKB{4&4R8KglY)&U zi(#DnwM!%YT2f4=>HVi8&9z#rl8PAYm!ajY8!DxQ+t>Dd5_PygIl!KN%3w(4KICw5 z(O92+&Rp^;Xj>psY@(?*ZyCrCD-z2q$ErJ_{CUktw7dJ6i@tF0LE!pSxa1TRwt12K zTv=_pKhWL}ZaWN9n2=KQZf+c>jm2;6;Bw+2Br(#%oJ8FboTC4~q$J}QTH=*b&g@oh z+^!e`qA6}Fp^^&OTl=XL*dL)PyX$4ZR?)n zP@cmsQvpdQs%)$|sLqX~w1h)4&c z?R>_hoM0ZLj-V{4t~v@QZf(pFKYyMmnC-g*2QkmvjXOFlkDqb^#@l5>Bi zSoY#|ml{1Gb&>Ov+m(zTiu<%X)vB)4BT zRwg@0Rl_%5PP7--m2lqDFgr2x_2OpF=btV?fav^!3dB4Ws9tFLTO0TAV-dh#=)c9X zMzJf<{WF@&wf5&EZJGxEV{M>A+0=%hm!+a?{ICFWc=Vllw^umS7D^C&1xxW*9O|VQ z^1Sn8uxj)DKLiU<>hH26*}E3bBV@ewL^`B3e1r|2fmr?-iHEA}C6+5Yt8U860UJPGH52viG3kWg*r5(}vJ9#*!xD z!_%;Ohx+?#)%M#lWXHB6f-(QeDI#=G4n)k>xpu2}-AyA-#}nGZ z^NX)SdtpPggdI@-ab|Q)bh{E$6Q85;x{q`^;62;Q>&4XR&n7(f2x3M_KSx=sGwn$d z{ozgpJO|Ey#RCOfjI2ukAva0v5Y6{w7<2bkfRNPaG-;WX{URKXlE`-7FhwztO}wOO zPIzFw-fA;U-f}Fs_YdGrkkzfNd`qk^4 zINH@5usBji31VN9|K7|T10rMH#n!Y62YWcb4Ih~+3bdcbo4nPwH{GUnNslg}6~`4; zJb33vk3j{>S{U?7-4HLUX!1Vq$f>t-syi02JmXlAT*NNk&cZ6-0W7eT!nkr8T2FJ^ z7{HLEPG+agm9O9HC(3pqwrdQ7Nab5Z4hEa=q04FJpZ zDhNiQ`j5OcvR&RlStv(KUv@FLos0~xT3*L?_2Weuh@ho7&=~H8Lu^t$T~z)1UkD6$+F9~4a@?= z6<4}qu9r9`Q~`Yuugu;JxnEl_LV!u8K4$2%SqHzTV3H2b3Ungl84Nyom^scABcDHHf_SBt6>D;-8sEL8gOF2_U9=^Vx$n}qXkgc^K6ykLbu^ugZChsZ9<$#T6 zvsnUSG1EOv_-*|LhAC1hUNA!`wyzlU>r^N<*N09thWl?MmEM; z!i*wYu7~x|!9#)<+<}w*L9a;l4Wl)An-ffd9ecLQYICN>p(y^Gg~iuKn&<_s5xJWd zgn-LogZv?-Mxgd`6-k>~bm7skzS4X9FgyjSRM(L)sm@jE(_$IKafb}eps8<|kzrhM zl?brdx{Cov%{Y(TIujdu+nZ#CGO=v+oY!b#DGD$K4LdkeKvz);Tr$60tEGV+6=SUk zAv9+ENJ0ia)J*E#V551y6pMqXS2)ul6zY)k^y2skrWWa#z^B6c)-T4V)|S z4Nd(zBq8=t6>w~du!)N*;f>pLjTsei$ z7m)mtFvnifh0z+d#)28IE4aw{f)BLlviJw61LBUI3ni`6Q-V)2l7xV7y+Gb)o}v3{ z&|^abwoZ{JxEJ&-S)$@24Ib0K;px2PIehF}39KQS987av3wtWi!27t=Q80=~K+I&W z^Vggj&6DwUZ{Z3N%{;2;%(cYslvs24z5dl(UB z97Y6~4Adr;x9#Y!F>#thUFFo}86ycO8KC^v&fmvwX`7v<1Il_>k=7re_l`x+F&s8j zy+LPy_zI!akz5a2u79Z`&5Vx}inzeyuWNL^jKgIsCBY^)r2}l?bvW0A@_NLczaW7y zs1#FX17U&YkQ&ZHRYWq&P#u$paUR$k)1(2~-kpjq#FjHF`dcYCtJuG^ea8~om;*`{ zY=Akon0{4G7^(8rrp2BrHFmb~DyT7{vl`r~Y$0irzg3y0>W(b(l=l|%$(We$!bQO5qS7-1u0~) zY^rvUm!9}+b7juVH#KvB2_T;03i-6WSG2`nB{7!J1v)(vWGl#V#K;^xA1}j}CO=Z7 z2H-(qP~>Fy&4zS?)B*~kR4T)&qVP?6d&Q2CR9x_IX}3rNBk?utoWsNIDFbnC0g7@XwLaeLN&~QZFC}8)bPz z&~jmdAM~c01VtM+Sq5BYZcNk55^d{BO6rC@J58N}LzWwp)lDD6OFP^(r34Wnxp6vY zbRanLF{-g^LHkwCZ&{1Y_v5~6vinx6V=HU}lH*y^^&Mu-r?BbRug)X12f$WzKOhi2 zJ$kz&+Z#Ya9$FM<&)Mb8$Te;^Ow)dVA`>)H#u)!8dC-^}&%}wK(k0JWg$roAZH^f=Zi5$Q~9$`dZoGD5;g0Eg;HrellLcyV^r2$ww|EkYg zDdr%nhz5QYc~6@eX9^h9%s`I?ifqY=)6VWnU0d_d!_Q1b-I(79GA&O!CRyNSYv`j{ zmvJbO!X?G*o6A-?PIDfO_j2WM#uNsS#kRhzQTGfP%eC-jU}FC0&l;^= z<|UNqt2?|4?oVN9zoO6)AlN=sI;Fe&tHxkvc@|BlU zjD&QEjabUX#iwd&n$c>irr@2_8g+k)izh0LHB_fLa4-?Q7;JjB?#!coS_|kxB#+{7 z;^!aSizdj(lNHGY^i?_%?(__rD`oe9H~s{=Qjj9dU5=qDKiR-@t!!*2ypZR>o?te} z$-8c3_C~Hi5-h1+8#~}PajsVcyLubu&q->^u~bH~ZGqn*viv$x?EVHG!rCAEp)nP- zo&IJoCl+q_sRxOr+g>(zyEieOmsO!N#HfIz(G}~OWyl}FD+6Phk60p_7Sf}sPbGSL zX3T@M4iB{mQF2bMoDB_fC31(IAeq?Zrzh8Wa5gZXV*16zsEF3+Q^K4`fe;hxY*~bRnY~rwQEkGO6mTLMxqoM_te~ zD%j|AcwvKXcH*dRcq2tI5@A0Uc92CKoNxBKJ&(u@FbyIZ<9^}#4un8rRKUO-$e5F? z)Bp}4$E-{6fr@H9s2`S}+x!zi4T>Pp82-p#B-9`$$rTc_0OL*0cl<+c>+(u-r3Lz8 zxy_Xd3G0fkW8^cN_Q zDig@@NKUQfCZ4aL#5kF+L|Oi;s%?3ar6z(a?cLh1mTW7PukB_?cUO3~#3rYyFNX0l%(Dn}TY|IlSjw~C3&*;=gCCet;$1(5ge?PCu6Y)`| zia#WGM|KJKPPs0#V!>GoLg+8x%B2GDj(EdO5myr@4Q*uY=BRi;Q;yEQ2X0HX0H?n2 zX!(@qZxKB@d)nMl2`zw*-_L<_hk;XONjZFYgA@0BrVpuHssuKI40(|;84}{|*>rN0 zdC}&fV7Kfwa(cWDI6gR%YD3g;E|Bp9hcGod^#%<-0?Hw*(eAmA2C|D zb$*|$X5N)f$)oo$OYwcE2`!(S=gKLPN6Sg0*+sWOWs_+1Z@&`K52vNlQE#+vC>Ssm zf$r1qyFslfR(n03QqYQ^X4gEn4JLa=o7um{OwtakWdG^Q8yN zWRdnbgcW~+jxt;iVlVT^nNH|{7I0zWEbi>741Y-nQfog^n)rx)dNvD=#N8$+RQh38 zIR^S9-!tI9e*ZtQiEs?dj`D^%@@LS_B*kB)+t;Z_C;9jl(-kl#rq0Ns$||3(&+#Oi zz3bki43M!F_>i)k*ZZG+((+N@c156Oxy17 ztTSifxANy>@+59JfUQ0Lyt3;|6QHbcmJRsT0?zAf9*Gp<$Av)|AAF)@&8}1sGH;V5 z&(|oN`5IsnEaL+x(lDI>?7!x^PI5j(Jm8R?Q`*7H{S}ru7MyASY^9pJN@GY^#Q;B& zAXIiv)XEG9*qKYBVs{;D=PWJj^v^V;oXcY`ipMRjm6NUrw6i@$+Y2Stz|a1?l?cLV zB-Wf>XGbIJiH!?EvH%QosRdFbgsW&Y^C&TiAXy`YGx6!x_kx|Khh+y6@@sDiHEbSX zL>Gf`w!@oLr=%|6jaN(m7DulOtdZ!L>%`#tYcul2HdIrnt22lABvvcJrv8RT?G-W? zp`e=CBb|4=n8>CMj_Bcr>4FPAlq9x^mOW|?)z1WmHUU&;AmAHb{`?_2aiD@eOi>nm zCB#+#*cG^BKbfI`eg4aJaEF$g30Aitn4J9UD{QkEnMbju-3XBvYuK4Q0dut`a=qB02(1D?SIII9zwf7W$Ox+@2bPXIE#8U5M`L3D(pl`V zu9GPz3uft0R$piDJqmac2IJuMj}j{f$Iz{)(fTL|qfpZ&rg{N#DUvvFt!%%MQ{!~I zHb;FEwG2KBIk4KNuE~qSGIJz3TQ<&?KVU-K(4W5nqvKE;D0we!_;o}Kq2F5tZFM@J z6kYxJfYQF=C||3*GQXF>G^gugch|7`2!d98z|Q#Yp-c`bY2c%_ zs(dujO4mU&d0LE^20cDcVQ~&hoH*`H*_91X6(C|IDv{)dzKmlH9enmaDyn{Qlt#;<<)09n!Oox8K_$y52DLk_;4YBZ%k(ZnpdeelvTzRA? zvT*8~-7dfogB?-=VV}v1fNMvV`*y0d%GzK^5tIglW6rc%2#%ubY1utt@ zZ4XnBT$*_VfJe#sz5bR5TPGULU+hf^fgXgZcmzZ{7D+WzKEX7?^=B$g}c^+)GdQ#vG2-9sQaB zRe@!+#3TnYvdwvZ`8(2dxN$S^IWvtl&3pa%B2dkjFHJ6dW6HUTF5ytDXH_Pfh~&c3PrIK)h@nQ%$TpeOI!~&7NIf z_R>m6-OQgXf|LbGa^F=iD~g5|miX7#CF^G;M4N+ZiX0t8!G}y-Phx)e8$fKh6D9#J zXe8pfc62GhO~!(9N(%k{jI$8BUd^n_(lowyS2A8EwmBp6(IAMI2tLtcLZ0p5X_ zVlzX<=X{8hQ+qw?dVEjnS9XD&%NAl(Jzr#p;=+PMXZ(fWxWoN#**2%y9u65lSTO9t zPokWNgr!Y$jiR+FscOVkqW)QRh&8JAt_#I~eqC+Qf^N-~2E*gt4Jt`(oR|HD!G(?p zVtAwL1g$Z3Awo9+H4aK9dLk}qS`5h#KjY=)Zl9mpq>LsUMQXD+bM@pe2Ku8FqFTx+ zLzv(nZtjimD2K2IRErAGp&+G9nR=#E{d9TTI3iEN1C@O%tMx-xS_+-bn%V3>Bf9!p zXm}nTe%P@0OAiokZ-o2|kLZ_#3>w;ws85s+G!}QZLxCfxx)<=o5oOQ@uZQtPUU+$v zuBq&PFvSiPiz9xRmMq@%cL9)SwYCbCop2x{KMD*rFiV$hUgYnw&>A|*@eJCtLB8wK zb}?W#isJoEi#~knLxr5Z07~PlmXU`(U;wIceIJLv#2HvWc68l$gz00+IeMs|Y-G%$ zc-qGN8O8jN$`$6T7g53Tf!~O$A5>*9w_b6v35_%Zdrfiw8_cuDsMV0Frb{=Ai-N#itp zY#=p&G&W#9s9;HmWOlJSLXYMRQM6W?u%M8&tUXwM$%6_Wx^>CmqnEm>{@^a~s4d$v z!AM{6^N)X6Jjb)WTaht0TFQqMv(}BADT!*cUQ9XMWWIsl&_LqGHJ%54^y)~a5o-Ah z>$I~y)j|r4DtVYBnEwxKGA7o3iFg52lBCj(^r5*$l_ozKGs#6N>zM@q_~c8X_axg9 zXfE#Jr)F|i=}Qz<9#6Ol5QPEo{A8@ZR-^I_$hv(e_UOjCm)#0D*zN$<+fKb!?OzZD zcNL|(Z$@@w_S!HmIS-hUn##DcKx?P+U0hV!)_nJ|V3o9F^5llJE51jknZ!KcQDqzv zk7kqtAJPR+9iqnHc=9GCG_59i&FyG=pUb*(=U}v?9YKQP>C1qt#cEw7^Z5m=pFSd9 zI?uX%NoQ?=$|A?3HYzR3U3NQEaW?6*13;bEo(@5FyqSyDRGngb|MZgS*K#=ayxpQ6 zFIkq*d*xE1dG8faV|2k;V5Ez7PBS|R;|e%=Wcxh7a9l{$b*mgX_{4<>By9mj8SG$l zX2C=@2`;33$nt0MjO9g|mbie&%=Mtr3)_Yee~PDCWnIRxix8tz`7y6aeTjb3yx)MO z-#*97`)}z8K)?uCxOCXJsFrrFY9gKA!Yn4Q#Dfd-pJ`rJZMM0E)0fW-Fpmt}lV~TmB z5%Za!stMCBGSq7??Q^qyqZ7)0VAQkVeQPDX$$}|o+|=+1eqewW zKOb~-jBNzpv<+lzW>*BIJ%K*ohYKV^h+nzQ`u9ob@>dNK>(i2my$yW=?c5&=a(H~= z^TsQgtRnFX#C|l^4rEJN_xGi1>b;vj^K?R%o!p#}&}wdX8q9TDL5=l^ja;nm!QnYY zwjS?FfIpX_^JsM%ue^`8qIiN&(pDV$CEX~Es7&co1KOo>?vdT|6QCg07?q3CRk^kQ zuSlBmk1E-L&+h%Fa;Og)XESZrH6>(%SDZ)8kENXPOl=NazJ==Bsk_S{YOrz*cS{6u z#U7i=S=H8H4{xqku0XM9fLAiRs4?;t*%z-Et#lUHs!|*$q3oSXNsJ{y;bJNtGKkH>2K9duU%+9E{~{qGuZR%A;wn z?fp;TYQl?~hMg>yqk1@iYEzFR*pfTaCYNHaqOk78q5d>l!tCO{eA%=5Tqys8zYQ@P ze}7v|ABezQrT+?UA(y&Ulq(AjQylSVJ7^oTENt*cg!a zg)wR?zwFFQHR)&$^aQkTzQHW)Ie$*&@qj;()HNmt2J z;}#fM&ba@anZtenf155`uGiv}!Mx3F5p&{;zz*|NwjY^U1DgV=eSLfH&c58*sat*6 z;jc^o-snWYzyJa5NXo%x!4rh*Npw~WzKGxI9O*!MgS9Ll79q<3&HZ%O1X8D;N!&eE zI3|Sq`;y3jBWL|WG%DfH1y10+{$KwVe?ecd7k5U_z5Av;% zCJraGW6r%ZRPpd3?~+QVJh5RXvdGUj$lExvY4!87!xJ4k(pM&t`SOdJJQEX4f$9F0 zx*B3BB0#S#H`C2HK@lE3ER{LrHkI;hWR|bi7O4Qt?~G-YQH3jbS-7&kspI1^VQfO zDlHrV4G#;L{{Ni7cqCF8CSE{jzr>|D*lqk?qw+#*`MeZ>gIPoSzwtVBc||V6g-6jEPd+52?a2 z<&fGqpdmvyK+74T(z=Rl)~|sh;MuxtvjEs-_)25zMk#q6P4}UD9|$=cmBW-L%Q+UK z$|%s=QK+6+6gW5`soQ8@URbvd4WKs~65Ugg! z`ezV|Ookiz%Cn@PnFfp-4IyX6c&%W2W6lqTeSB%xju;ZBVlbGfW$T5!{Imf^)-W80G!&+d92&<{Wr3`3?PWG$_rwLhuwtN{*Fc$$ zfC}_(n2pZYCYf@Y3Y7rol%t>a!F2urUVLP}1gmDCR_Tc@E5(^LMRMh=BzY$+;niM) zUW4P}vKFSF7T=CX3@D{`fednY+7p8{0xOM56W!hCn-)AvL#jyM5q=j;6!HAC*(v2Y z&N+?@hYIFh0OrG6b;bg~+H5bV!~(a17r)uOfj$FpFO8IY6jq6@{OE|NsV90 zKpTMp&uk=-zU5orWhyk@7?6?nl|y>EqA}sKf#h{6ha(odkQCA^fq-0;vA|$7@~8aa z9a6-79c!tX<2qDV-ayx51VB2^*eeDABt`Z`qCmedC7-|@U&|ymqTp6vUu~IMB^FS| zPKPCGb?;*|U&IzNN#Hz-*+{lm?PO?D}t!X-z*Gifsl z?P4Aic_)5cEs~#J4tnFhy23aV#WC*e1r{^ zE>8Yv14)nPzGs#~@=Su}_N4!uCXpM%DrJN|cGDhxx_PaSXklk?1rn8g`Au{GraFQ~ zg?3Dbk31NZY>@-J-xmO}4Ib%LzlZURL*okSv*_g=I=2$1H)l4LsQ#~9#l=s-CSIq; z)aD$~Q7+ks$;ei6_c5~y03kBDtjXb?Zz9S%|YwV~RA#;oCw63y;<4@6uNwpi|JGQ^NrW zZAK!;%2jD+QN%;lt4v-ft?NMXz2t3BlRaLP%BoISv6Zf&-jg%p;U001Q9_~DdS5`2 zjpA7(6WB`sxg~PJs9M8p}$KyG-$dpz!Bag z+}{{%COtJn*oXX{3EKGaympYT8eqO6nm^rAvKi}2#Yj~+M4}7(deQynn(%n}LC~03 z5_2ZhfW@r12Abyo#b4e6^)hYbTdW_M9C?n&B7rLFW+$#aF7@IvoQ+kQl~9orjk_;~ zV%6go(ys}+>XT3!oP)h8-EZ=*1*^c0v(nN*K;dyBR7FBq8;g#g{H0wK#PRO%Bg|H2 zHgg`2hc8E@G32-&vyL_lD6YQzX2@0o1-zfV80bC`9Cp+|GR`6>0%A>0_fF2}p&7(65!-(m86u%RbGj75wWfmceRV^zQw=OPJ9E0}+HJkI+RjlxkF`q3{D`TcGzt z0}lWOuc6jpvE;$vQxy>$V|?vVW*4wN2lSv9139gDK3{)~6aEM!v>0@o8=m>fA`dVt_P#%9MHaT>kV!BKHPVLl9E0_(1`L5YW;irFfoJxK z+g@{lY>>?T-cKw0h46%y2;X01tY?7yLY>&avXZ)0T>L-&@b<9pw( zxpVIipd4_N+>>V%#%reUjsVlasQTzn!XgGCg8f5i8z=EIuzpP3SNtNaxvcrKOE#+to>tH zNw9!01%sL)eP9z(IjbbJVByqrC86?wY$ppXcweSbXXg5^u!AU|f;D15xcKNPGzjDPiBf&yTffKAOyjk{+G51K)I;xJ42R-_Y($7Z2%)OEGI zEYe^G($yn2&j7}JxJoe(f5T~-Z`71#Mi=*(r@~<^Od}@y-s2xWJPjn)OLMev zUAJ`131qlodROEgd0j@vfO9c*gkvlR=8kW2|8A_?9W;T`K=HCVtRED5NMx4ubdbvd ziWpkkpzDSg^>>US&c2MY`5wnUU=8-hj&D$(Pa zwCJb?b52sC>*nfGE4tPv8}4%_9j%)4x4TmYi^}i{xdE-tsMTu6S>LSx)=$SVfY+rl zRxBeEEU8HO60A)RIp<`A44XZ{kiwsDadkvm^6xk^Sn6@)27oRdi1o9DluFz~RIX2R zLQxEtxR_&d&zg8P*)y~&o-pOhbrEgNy+gH>emFWdsT8}P0Fg7HGL2@gm*>-j9P#ZC z%r#f7(!MW_!k6OSr55o3H5-b|3AqH>v`{yt1JmQt(?42UfKZ?xAhECjydT$;v%yl z)d%?XxnkcznI^(nU}*i$2d5*rczWgW^0({(DIH7_yc|eouBX80St{Q3(rZhEy3#Z~ z%mwD))E_385LvKIxwblcopr&kpu4g2Dzk+`AxU!3RnEdQi*1lPH>80M{;sWdUhCPU z*`meG=1g|JI$2#vUrKl*a4jTiKU97U5arNcTEbl=dg9M{=xEh<5YQK-pJtuBd<=#} z)j6O?lGr=iOqh_)%+r+8_(^8oS!cdazLfaKF2x)C6pBr#qv1(a}?BfQgKp+<3`CL=e$f8d1 z3oai@qFZxi`Nfsk1E*BMDe~R_ir(P;a9{}-EqY-Gi%ZN&P)ym+45|mPSA`hb(z7G- z33F(v!Urt9G2y}O`ymnX9}LfcQ;wwKGa>#Q>Tw@AD6f`Hew|yM zEqSq)qx)IF_uvHQe9yL!Aeyl8on11c$jHse-lqsGt#RI=qJ7xYK@`L;pTs~OYB4uT(+%Kjwb+ypQ>2I^jC#@-<39uC}$G6Vr_)P<-JOEjAyG zxlqvx5q?LsYy3Dm9#`TDio<0Bt99hXMRZj{<9D|q7dG7a`T6EbtP8g*eryHPs`lE0 zk|vM1t4w%iU$o`XeF$0YbQY};|R0yV&K+(AbL8fwT2p^6l~;O?%d)M zdSV3q_|oU^Ut_*e!$vb*(C3Pbc4EUD02;dQSVg#&UOyN*s?K__UlSknpO?VBi8|Dr zOVIdHbPtpWWUrqEUGLP=_@4__3pTRIStwXL{q7u=$PPCvasf1DRY$8)CG#rINC8DB z-EMZT-n-WYVx?p=N=(d z`Koa4bB_@HeClLZmndPE7ilVCx&-!vZufX7CzyGmBXUQY^bgCugoZ%YSLZlmvL*g} zTJ#f&p~F>{Z7&899U-$)HccLkR{yr%SHCMY1{S&bEv3q>IixRG)^T}1bY}#M7()3C zi9v=gB%i@3*45W67j*%fsUUW&BboLtY|a8Nb6#tR0J@4kHhP^BHxuQ+Z%d6w-p5mE zo@f8tKL&Ieb6t^yE{E`Uxt#3?kkNf&F4S!a=zID@v9>s)2#5#!b(WsLy(zGsU+$GP zGqs2bALPXEtHj%cvMZSSp50ogGajN(+oq&AqH*bAmzuf`3gVWjW>|THxbUE>Mr2Li zC+Fd;M}xxK=jh`W5Co(;Wd0zty)mQ)qk=4^R?L6VAH0+>_ zgw6l{b%GNwkHIAsfosbb0VD5EYlXFY-;&(s7%|zM8`#w(dR3<3I$GDq}z^yP` z#%RgK{P+a-)^aPUW#5y5^OX?1uiH1u8}&* zh#EJ-&n2CW4j;Envt3CLbrx?_@a`Dl#FcsZE)dmsWI*H$bCaL0n6l7m=Fk@Bt*dW;nf8YR;#?B%J#H+@})1ZTvo}g@A#((a$ zY(zca3N?>VF@oGsloIdvPxukx20Q*y=&VA)Q}EgO2L+95NWLW9{YfDZ;`w!qt5bjn zIg?cLle4vZM7qIm^Pr%`L;EO8CgC3PEX_$_m|Hbb^UM3X*X9p9t;eKOJhi-@G?LBj z&iS}DC{2(>lHv^7RIxwcmn@Q7JNA>eqdKDb59>@?{rK#P@(W}^uK>6;)To66A-9~y zQ;s#q%I|&p?^~PviW#M<(X0{Dv_sZEk^V-uxy0i5!Ri1(K)%0H!0T~fO^pH|N{2ls zQ^>7n8+GKQO?sMPLB~&6c4v>$E}@tX6m)9YjI4!Pr_50m_EmcATQmuuc=)fu4rP}x?# zsVJ$zJYY7MQNE1mW9$_V7yenH_O0kWc*SjkVmM*!tX{UikE%v3piKTQW{GVee0e&K zv?;Y4l@@u+WwNU_0%Zn{;`8qNxT4~)0Ko2J+^C_!Yl7XJ6?r{$M~i_D^2pf3S`=B? zx;D?$+BHkb@T2NISJBGZE>}<5{{0O#R%H>0PMIkwXu*)E^&yLq6zUsYFxv?4W0OZb ziroqrC<==E8&L+kG$|bC0*GR=PIys|h`!wt5Z@$o*PR#x)Rridm_2C+w0oQ#V%A^1PsIVEnZ zT@?9C36F8hGkG^0e`GWBJi9?&K@6s1K3ja~HcsW`Y0KR<3`YGrs+QN6T@wc^YuVFE zcbJHG^|WaqqnBL2uSbW?v+V$P0+IODu?1444~x6mU5%$M0*`{dP?ohNoghm)lFgTE zh!_G5zbYzmqVFH83Z#<%htkSb&jXV=-+eoGL@rmXk@68q_IhuagQH!d)h3coTo-y7 zkTF$Jl#SoA9l+8YbYl+aUX50WF z%Sy-ufSBv5mpNhyv~wjVu;b@9+Mom5^Fr{TJc~{*W6C6BeB$KipuWYuq^|u%vxyJ(9I@%9^{1?Hh>c6 zf?BtXD1+y))C+;L%^bn6bAW)3h=>%iy{W!uTH-ePAv;URjO70kJf zDCe|duQjo)e*Ynm|HQAJp;yW!hq0jC=_M?J`h)^$C)8q%WZ(x?BHzMoLb~-|2LQ~+ zBUUJ$s2tUsst?F^_kLR8H>!r~Del3D>9Y9CV3s?u?&DxGV_;r8;oqK9qN#YBHmG=q zY@e(3uM;y|a~BtMF9bR{#&UY3$q>BzTwE#*c`Yaw(k%eb7D7F;ZS(ZL2h2>RvRL?5DAzCn5eFrGKrnzZ~muN6h_leefHTj zj@`FtwN*f7is+kRZOz#YHa#E`hInvYMz3nB0Xg_pltKfV5Q~U;$OT&n{2unN+C6*1 zp0WIn)-WEG;Yz=;D0YAI=>{c0{URWHJI!W}mdOhcfE{M~I!|13>EunKv?lq;#uqk` z5dlwE>FJT(JPff0Cj58P*K}v_LLLs(_697BDv}NkPP4z%z6;})^PhL|%%Ke3+>8Jc zQHyIX5swA6cCaEXl;EoQRoatFf9#JSO{4OdWSVK82`-VQ4Q~cBtLXG&u2M2!!=6LK z{!Y0REN{m0_40$|BIV(x@=V~6knDtKjJseYD@xPxK{dFm z10Cy%?a&zlrEk6L@*=8RwTTD5$OfXQ-zH74Ef8d?Q*jYNAyoba)0%MAPJje)U=El9 zZ5CkqZ(R?9&FQed7@u{V@&hGvoec48TpjjV8sTdtzoA;Y#T6HY6~Dhte%A|LFiwHC9=!xn(eV z>r}ET|9ODQs0K3`{l7ZJ)OwfvOZj32)$x58Jxs3Jt<#9=%EqO6*rF`p6`_?|w74sg z2;0&PGT-(d&fdSQRo^~S_ICOhf0;hVy~rEcY9}aBv7lUDL856Fn6B+}(ko=6@pN}d zCexuPcgyqR;_W6kzKSk^M;Dq#=1HHDE$=g%sms1Dvj1Z~Ps1pEJ=L3mC7=kW_l!;+ z{h(tTRbgc!%BB!gx4-4@=EFNk*wbA>md?0$(?D4DDf0jT##5?o^!0!RX}WQvVz2MN zvzyY|M7T`*PoDhesLvj_Lzu2)L7q~s%2N(^XVS0(;B8%yWIQ`CxrEggq(R>RI7r!k zuE{HfX=f&WO3W()3-98cLdWmgDAU0qyU~6y*Q4xp2{%ZD_`bxMHY}+J{twB#BVbG!~FC5H<<9GJA83QIHpAueW zUy#IvV$OsV_?Nw8Gda9IeC9&IFXMp7;)L|nzn6t)dx>hf0f@3EceQOEF21f!HvSi& zv_}t(BuKTU$AGSCV1ZMzgRL4o#KI<&dtJ%}cluoX#FkFpH$VCnLZm*{_o0FZ#FmJa zW8T7=hH061E}BAQ*0@q$khIJ*LK7Z0aFc8ip7|P;Jm&bS!2WRj$IjbX9EZfB@c*P= zTW4Ey_e>y6>6P*x0eHF8xw`vW8Lz^L{Eh)(;Jm^aCX-pG0se&(J^LR6+EKNM+RIoM zN&+8fI#l87#z&e>v8j_njJQ0FJMvQbFj)c-#=5>Sha&tAj*cll5PB*18$H|U=mOqk z#hgbpAD$)f)5<1llNG;a8UtlePwULr{eu zp}Gp-cE<$ynrf-Q58!!A>hR!mC9{trRw+n--!R%LAVF_j`w6kD77`xi<4Fn4Ycle) zb};(t64@$crKbSksRH?655!(6lk<*UfGpDR6~i9+Y0ofp4?@pmZgrgvP`3KTE=Yg% z(wQK9Y1{P6_l|4sd#);cx@bRrIp+C9Y1xnIv;(`=A_ecfHhVW2hfBNh(5PA?bgwnp zi~^Pz+s8oCw+@JWC_T#-e9y62X|@^tLU!`~KW!S&Xf(34RJv}Qr%EoC9nkj1DDMRq zsC>)C>{ejl%3@`j8nZRsrLUMP=(-T4j~6g#vTE-vwn-y+%YV5xDZj!tPkqnJ|4{Pe zMI3bnG?s68zHp&@1U=aKNv1U^^n?p6W!-??VC>?a(xOMkuSyV012A7LOWj?`CyL%E zF-_;ha(d{PyTz2Jh0Jq~*Ussy_mECa@&b^=DykSiPzB;M?p{zIH=neD+Yqvt`ymx# zq(TDdJyyRf73Z+wcRmb=2OPE%gvv#C8)`iAeK5utRHH??${Q_l*D7h_<8DdGSLD=^ zS>`{Sm#CS>N1n{AYYOScHdHE-1B~$5TUC|iw-1%Q7Ye4I^^fv#J7%?yO5kU}8FmnS z&4Z~RV1lru^93xT7jb{VP5}L{ZD+=-a$y{5DRv1dqDXEl8l!d)UBD|wootyTNey>ug-Avj?0&BMm|UApe58F7Y?o6 zDA|?o+Y#%3tzX;ux&47Z%9$Pp;d6iNo4#lFUee$yoz+Ly_r*e0PleiA6azfi3wg zjk5-uZRucnDLQPEJKDyxTNvB8*0c0|7BR?93CkHRe={nd0S2OEp7@lqSH3b4tY<

>?tGROrLv!MVg0>1a2(2+I(xC=5*TMaI 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

ar`_E`wULgu{sL>t5{b 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 literal 0 HcmV?d00001 diff --git a/BKPS/OLD/XAUUSD-15M-V1.0/Ex4/Indicators/x-saherelm.xtpow.ex4 b/BKPS/OLD/XAUUSD-15M-V1.0/Ex4/Indicators/x-saherelm.xtpow.ex4 new file mode 100644 index 0000000000000000000000000000000000000000..6e81928a2d799ddf83dc1eb5a0b432e4ce65b64a GIT binary patch literal 12694 zcmdUUQ;;q&knTUW&)BwS&e*o+jBV?TZQHhO+qP}nyl3xL-L1V3`@Wq@s{8wrs&prL zNVkX@EvOy95DI|!uMq$MhoFG}CT-MJCdxN6cj!I=YYNE$mH&4{70;Li&(HwfsXD^bCnO-31P%B{r7|d>b|cb+ z6JX>2SSJLq1=s=H01g0ifGNNX;Ph{^OaO*|of$y$Pgery|3i)c@ge{#fb~B_0-*eF z6#9qR{G0tB%>QQj509PxMZgij384Si9RHuc#{bt}x_@!`-|gZ5d^(H(x__t5@IO!b zA6Vs54cN}pF{pjKIRKTj46>)AEaFYeH`rSjm;y|~{I@L~hkYeh;DGON$_su;Aw0;( zBagWc{r%iwb%-fZXkWVRdaI<2_it!~kwW=Lc=5z6fsmmid?l+*xx0hXT$bDSUkcxY zkq~;i`}(Us3S1^?#+wybP<=QStN2iC>3e!aaxx}0nM3e!ZuV=K5!84Zx*Y*5>=*dv z!8%e|3uX_;q&J&lYoZtL%rkAK$w8kU>Wy?gnewuQ3>_aYooVd}c`8Qi_jR6joLB^j zPzW^8pYYu>Iq+8dDVU{&aIm?Ky@a_GWWesDt+2qSBqA5Q6F?)WVazrD_=}y7y(?^rV%Jt&Mlbr&le(;4VMNbTep0WV}@Y@ z=!?1&2AOb8lkW_n{J`x`jC+YarH#sIOay#iDJNv#J4Y2fHGTex6lb*6K4v-UgM zOGA8S_Y*nGDyr4Ij>jHsV221cH_9T@1RjeGX z7rOQ8zjm`DA~4}{7TLADB*SWn`f^7pkYVtdQ%?#e}J3qJpxo}2|>=U%CtY{+08|H3o#|40QKUDA2w?ea%R;{|oRS94a}7_8Oo4hQyk<@&SE5Mu zF#mV+VwxlNCZ*PkHW4;66&;1LI`@!t2PcaqFQ<5ti(%pNw;#Q-9jx%2Rx2clZAh$u ze9RpwTzVd!Cdf?-xk1Qy^CRdA6H~^fg;lzv`I1V>-#N za_nCr`Jen-T!)>L;A@R65clBGI%fqtGhRu}c$&-`TRM*nxFrJj=r-EW-xEG9 z5;cXgb`NXjwuO`O&U^}RFxa=J*dB4sl?l9if=I)8V%*jh1b5g07>E-YaP(94^8DX- zpEA;0ftNPFZJ826(bz>ZYz`scxnHpKd)kN|<&pi%U_pc+cg#SoG@ac(s)u+Pu+6&- zA9#V@jstoW2aPtMzByFTx7b_bWZI#VpWXJP+}O^2s3*M>cXu=aQ=H@bFa_;{4nB1sl%m$cj*R|X%AQnj zLz>9np1wo;X}g@PCigF%LifmkDHn$qD%B=HSdv8;J$T5uZ`%z8VwW&`Rxx;lR=1%M z2ox@y-?fGbq%L);a#_OHne5ztxItS#+AqDrKcYn9SJNbry_?B>+mFoFrXN`<-; zydhOvhT|07Mg1v~ZiefiUJ`s>UShdbyraA(w%jG9k>=6*Vq7%*P>y}&y0qSi*tAEOY>*oQrM)%(?^ve`M1+vF>?;N61N5Q5J~2BRWVnzoqZX? z1Y84`LY+b%5z47R%vx+&54S2MS(MN=%*q6G_`iZVbDb=5wPc2i%QO0%}PUM*9ul=3%G@}{-EJMm)n>l zEs0@N&{z_-6^SnGzJt5c;^JTz->kS^M3$qBK34Jo60xRjZlVVqwYx~=yGAxEhIVDX zBH=lIsMgr*zc$eKQ&)-_$4jY}#R{fnrW2ZL1*2XZ`bdcnY#8hQ@+W@xvnL9fb4d)# zC^ob4{{kh+Z%l8eDAR~H%lJg--6WKgk3m!QZwqy2MLa@?K#!ZO(%bt&G0_8yIi36J8X&m=0Z34<}{r_CBCpHxOCPVPl{YSJg|YyKmp4T3OO0 zwjVT3qnV$X>q!f<$;_88)~>J(6Ll~s(e=-;w*63$Zg4&P`fnFuM!ycEB*}!S5Nron zE$PUxU^h@fhN{^K=${5GuY&ssFTVg3=9o{p3R5^Ld+I;}woR?}KP)5IPeKh5owe&y zz_arLw62Ru04d60QMWN|j(<1nyjIEnV4qrkFz-iSCz05AeCK>m!$_!8i)D#^nc&RL ztLb;P*5(Ge@~^^U8^HB~KWpfP$2uhRc20L$rj+?)w`gRU0h(CF#4w~2ie*Z6VDE>WG3PFw zprTQvnZ9qLI1fS%i>hF>$E;ZS+Q~Q%|RH!v}Y}>;mb?s67bhL|Ov+X+a zDQyHw-L_{ekJz>r&5~tJ9VG=G#)NQ#YFGFCo#!xlfu>m{p!$5)|AF*mRp$edDOFzjmRz zVAGL)n3+1=_qZ#iVECEYBZR;!IC7N6JS8T2MaGi~Jpt2jM7>KqO=~^-Pz#8ipskD^ z&EC(EoV}dL@isF^*K)d7Q-k^B2wWpE8kOO--ft8(#S9Bnv`B+)KVP|9)mb1x9!V4z zAdfGI@1lYi4%n*c+}{;OiSjOj@#vsE8=ge&bSm+Z^;R7InAz7 z7{wE$l=DmS60!oVnEjx@$q1~@F37EU2q>|BMq8?eC;$r-m&C<_dRt1IG=yABXRq2B zgqQOS)$sPtpIm!x9WOe4=Jk8X#o5bMj`M2t32}zj>;%tld-K(G69ZcuMr9S8E#>o{ zYM3K1(|1z|2sjIL=I5yTzbU{ov-sUY0oCo8H~{+@HHR@f4WX#-;1sA-%6%pKJzRE< z<<{j`ZkxXcA@XJ)ZF!MZ)C2!|zt-$|h&l40$NnI

$P=NX)>YYboER686u0X;C8m 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 Div*MF literal 0 HcmV?d00001 diff --git a/BKPS/OLD/XAUUSD-15M-V1.0/Ex4/Libraries/x-saherelm.dialog.ex4 b/BKPS/OLD/XAUUSD-15M-V1.0/Ex4/Libraries/x-saherelm.dialog.ex4 new file mode 100644 index 0000000000000000000000000000000000000000..b92c87635b2b8e3da13af40f13aaf5b3d16f3094 GIT binary patch literal 21464 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 literal 0 HcmV?d00001 diff --git a/BKPS/OLD/XAUUSD-15M-V1.0/Ex4/Libraries/x-saherelm.draw.lib.ex4 b/BKPS/OLD/XAUUSD-15M-V1.0/Ex4/Libraries/x-saherelm.draw.lib.ex4 new file mode 100644 index 0000000000000000000000000000000000000000..99f8ece5d9578976dfbd6c7860500ddfe7cd657f GIT binary patch literal 7218 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 literal 0 HcmV?d00001 diff --git a/BKPS/OLD/XAUUSD-15M-V1.0/Ex4/Libraries/x-saherelm.indicator.lib.ex4 b/BKPS/OLD/XAUUSD-15M-V1.0/Ex4/Libraries/x-saherelm.indicator.lib.ex4 new file mode 100644 index 0000000000000000000000000000000000000000..56a524ea077289099117aa3fb0a6f000f10a6254 GIT binary patch literal 8046 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 V!y42r>8b}~RK9JM1X}7={~zp|gINFo literal 0 HcmV?d00001 diff --git a/BKPS/OLD/XAUUSD-15M-V1.0/Ex4/Libraries/x-saherelm.models.lib.ex4 b/BKPS/OLD/XAUUSD-15M-V1.0/Ex4/Libraries/x-saherelm.models.lib.ex4 new file mode 100644 index 0000000000000000000000000000000000000000..aac8c2fc8a41a7f45ba016bb4d1de8fd54d12474 GIT binary patch literal 4890 zcmdT>XEYq#)*ds0QG?NiQDdU_I!22ih~7nK22m#xC5T?4cTqx;(W3WG5G8sE(K})E z7Q*X#?^@qocddJWe1GrW>+JKK=Q(Gs^X&cDh!^ArumJ<^0{{Rh0I-gGxBpw)pr*7Z_>XY4EQhjA0QI+AJjjInX?3fRMtM)6`Da zKmXfK|NE2#0epAU7WnVt|AS3yeu5_l8RLNDB~s|srBS5iy0Cc_EEBkM_m6R0Nn^;2 zFWM#c(Y_g%iE!bgdmfjloEj!7B$2U)HNNUotBfmJh}U9cY^?Rl$sQ={b_%c1DVAlf zN~8rPPx|K9^CvWY`cZL-({R!?6CCoAMO;aXrzQGwqh=)@^*U=tSn2fSK{d`{8lbi{PO}jehFtnx)dBMaSSLsD?EzOdl z-#NSP`d)4m2;OEd1)9iQk;{3mQxLj^l59u$-B->X#ffCC6{ZhiBIJvm7wh956!wQG zgE&3H0n3cpK*P{mP+&G%4$Hs@FowwzR62Bnk9S#!gNy;5m{4sxuB{xbXqINa zZM=d<3|{m2m#;rGifDZ{!_&hGP+8FC{q}o2G?J3pD@3U$pJK7=y;;cRR*WaOl=1aD z?>`}ap>8V&;CoU=?l6VYnud(NAGD~rextRI^S$ zMw{=%Wr0`q2cp~evNqCe)LYVV_j6*Ct-f2XssWFyJhix11I32AjDKSwE@*>agZAE7 zpvO7cj#}Pez3wpo$`}Ft`+~@;diB?Qt`Ey_D^FGiiirap-qlS!`JT&uKwdiw%57@H z+y=cm;PSX`XQ$KW)4Rg*cGfKGwyyyhjAUC+6Th*jBU13+de&1kj8>?A zH_jTo)(oh*;4+FCr&jo+>)BRlC+r#>D-Kl$|~a7c!#HKEf!#dH z{OuLE+j!WmoxT@({qihM_CqMG@msR!?)MTK-eEtilDC~N@Ka9Ogoz{!sT)C9`Iu?_ zb7E)bwkAJX0z`hLNXjsEW*+asFP406HXfP?B;uW)16-}?X+=!8BPWq2-RyZR|3wnf zGR|fv>A*6vIq&4LLWl2gq8?Z)`L^#ZlJ9axT;~N&`u3ICinir`87pe9{TP{WAmIFr zPJkTex1k!(0W0gNn68MTG1!0WgM+&BC%z9?L?!^3nx>z7r~;W-&t~eP6_UzzB0hJ; zRPy^#bGjC4axO$$DcEQa3ni)f!buKs4s~F&9Gw{^OxV_HBOK%wXJzegY;}2{Ie!S; znBv8Jp1&UiHC6Q#+QT_r=>y1zj8G~@nA<(bQOUo0FBh+VE zF1;#z^5&zee(sqC490qI;FhNTh#WcZ%d1u4tm!?mWy6c?@o9$AQp z*}JN6zp5XJUt%)qRx~18UhJ#3IE24==8#)r>wV5l`5+@>Jxrs3GFw0AEnDgwF9KL# zngKk>4sz~~w0gzshUth}%at9kDq2Um;jafv%?Yrid;B^V!1jCZW97wWN)DeKIKbF$ zm3_?XmWT2)9RvzG&^+r+{HW;2wpVsnAH)O5|0-|G^B#C>R2;=S+*!e{hwo%n+$OA9 z`ZZPC@nlga0XRSwr5qW&S;+11<{O3FWM%rZ{`h@cSo7`y#LRbLDF@3E72NeL@Z=GS z-ayE)G>@=%T8mrI>C==w1zn%W1Z{M`unH<3H)S91xQH~DTdOW)@gT*>YGGKJY$4 z+tzKTyFV9!x(s-#gZXoeY>t291WatId+u=CDg z6;v`LZhoTl=_en88%=AFVWLK@ELjhEY$*TuRd!1=`M&3nypST-51D@I#hua7(BE#h zMCo7IQzep+|Z`hbLwFS#j^XYBymatq6xo_RdJ`&f*E;K`RaQU$Ig?G>n=0PmDU5 z*Y~MNv#>9Z^Id5zX($n>V&Bx8FVG z9{H4)5TO~WO{9*(V6AtE3pLC@j3z=gh*u zSY6jePL|Cm<)HT0DUfX@RsnY@pJA}_W&Hlmw+=A7LbPqrpQ7a6)?iuBzjQ6Auy(~b z&WB^mn4&(b9yaj`&`h)i-Cyq!YDmzbRx2H-f9tH*wI%muVu_94)_$6;VX710Rv6lg zEnoPkS$!MiY$X;f)22#b(04`J#d<|Piy3x4I__Tk4ks2FWUguj(G=Ol&ZdkK8t4c% zS5n&=J0UNshN%dbRc))A=Jn&`C{(mVoZj^!jTloI zKgO!Qu%F-aCfe-Mhdjoi?|w4oe=^IQX)rIw_yxC=Fy(@Nb)irAwL#L7Dm|TCk$#0l zwDzAd6e5Xwgo+HrZ4^C~1?qN5Q_NIk@p^((OcQ7a6f`-GGeP)X0gd0Msr?mH zKK>%yhN~CM63xZaC!;9E!M{f`KznuY1!>jC*4kX@2%0<*1@>2$7c_{_${ehp zmgpsa&ro-bWIb6oAB9p?V&Ze_Y>$cmFwK1UGb|)UOkb6k0WG9|TB9AempTC{EXqu{ z;w#@zPu!#C&T^I{73nh-t@*Ic1c9atWUYc8gbbo~AdT_KX5nbQTyZ)*DX7djm^F zeDjaly<}Dk-F!2K6NyAs$Gb}HTW$KpkKpRm+g z#mCip^``;OlJedtS&r}Xd*iu618p+T$6`o{JJ2qZ&qu$S^U_`o)atO+G?tU%H7T93 zjaQc096Am&88))Y8`H3TEyo0RTPM^|@f*jDRjxSpTit?*cs_$_*UYw@Zc}6!t9^dz zRu|f2&M~1%7f3APdk7>^IcpE&RRwI1BS-`_6ob}DG}tFBkooTkEYh;s2kvj}nMmi< zKm)2wT5ht+M~d)v2@9M^ojU-jr~3EjW55b}CNkTdKYNEfjFM?peKXF8zcdQc<7(e; z*90!)vD&Jhxld-OKFm=iCK@Sp=34R}6UiPy&pi2KuKW{2{H%9ih5bRib822T;e%F8jvLUw$WsyYrCYR|*TTsbS(pZwg|$LKjFL+d9|7-q;?C9Nr>(na(P4<@oG zGVAf`bl=S@kaFw=qJOj^d^YO+g5=lIsl zZ2~#>0_8j5?H@x6$>iGx%e1RkSDLZ=1XWqB<@}G+FuB+X?DN>-7SO2H;ZO0=_{e zhr-r{bB-`BM;^ORJ=vl(u>AaSIuBeec*$!6a=2=vf1B_GNy8%CGc*wAcb>SI7TC~t zU}7$Js>XCe6vb9Rmaj69#YIg6gyHCjJZ5=V@`u_j?WvS2RAy*)|lFMzHnuH1>uOcY6`6I=&<2@nBWy0?u9G znCrjg0M5fLm|k38$XUG?a*0lLgH1OPHgAU*bRCO&QDivx_rLEsOtPn6jC2Oi{Ccp# F{0}TrG;aU^ literal 0 HcmV?d00001 diff --git a/BKPS/OLD/XAUUSD-15M-V1.0/Ex4/Libraries/x-saherelm.signal.lib.ex4 b/BKPS/OLD/XAUUSD-15M-V1.0/Ex4/Libraries/x-saherelm.signal.lib.ex4 new file mode 100644 index 0000000000000000000000000000000000000000..ac56a7dfa8bb52ae6ae105b1eacdd4fd6a4b3b7d GIT binary patch literal 19232 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 EFDD%*tYGRXSepPt@^gUdjIa}>h9Cm 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 literal 0 HcmV?d00001 diff --git a/BKPS/OLD/XAUUSD-15M-V1.0/MQ4/Experts/x-saherelm.ea.mq4 b/BKPS/OLD/XAUUSD-15M-V1.0/MQ4/Experts/x-saherelm.ea.mq4 new file mode 100644 index 0000000..7af93af --- /dev/null +++ b/BKPS/OLD/XAUUSD-15M-V1.0/MQ4/Experts/x-saherelm.ea.mq4 @@ -0,0 +1,1116 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center XST Strategy Expert Advisor +// --------------------------------------------- +// saherelm implementation of strategy expert advisor ... +// in this EA, we try to combine multiple tools, to ashive best +// results ... +// +// ShortName: XST +// +// Maintainer: +// ------------ +// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) +// +989121694056 +// +////////////////////////////////////////////////////// +// +// Global Properties ... +#property copyright "Copyright 2023, SaherElm IT Center" +#property link "https://saherelm.ir" +#property version "1.00" +#property description "SaherElm XST Strategy Expert Advisor" +#property strict + +// +// START Inputs ... +// +// +// Signal Prefixe ... +input string signalPrefix = "XST_EA"; // Signal Prefix + +// +// Signal Draw Specifications ... +input string bullishSignalLabel = "X_BUY"; // Bullish Signal Label +input color bullishSignalColor = clrAqua; // Bullish Signal Color + +// +input string bearishSignalLabel = "X_SELL"; // Bearish Signal Label +input color bearishSignalColor = clrFuchsia; // Bearish Signal Color + +// +input color signalEntryColor = clrAquamarine; // Signal Entry Ptice Color +input color signalSLColor = clrRed; // Signal SL Color +input color signalTPColor = clrGreen; // Signal TP Color + +// +input int candleGapBetweenSignals = 7; // How many Candle waits to new Signal from last one + +// +// Trade ... +input bool allowTrade = true; // Allow Trade Based on given Signals +input bool allowLongTrades = true; // Allow Long Trades +input bool allowShortTrades = true; // Allow Short Trades + +// +// Balance and Finanical Specifications ... +input double lotsPerTradePercent = 0.00001; // Lots Per Trade Percent +input int maxOpenTrades = 4; // Maximum Open Trade +input double maxDrawdownPercentPerPTrade = 0.1; // Maximum DrawDown Per Trade +input double minBalancePercent = 0.5; // Minimum Balance for Trading +input double maxEquityPercent = 0.1; // Maximum Trade Equity + +// +// START Global Definitions: Variables, Properties and etc ... +// +int lastSignalledBar = 0; + +// +// Includes our shared library ... +#include "../Libraries/x-saherelm.lib.mq4" + +// +// TODO: Complete this ... +// Include Dialog Handler ... +// #include "../Libraries/x-saherelm.dialog.mq4" + +// +// Includes our shared library ... +#include "../Libraries/x-saherelm.signal.lib.mq4" + +// +// Add Logging Inputs ... +// +input string xAlertingLabel = "- Alerts -"; // --> Alerts <-- + +// +// Alerts ... + +// +// Alert Bot Events ... +input bool logEvents = true; // Log Events +input bool alertEvents = true; // Alert Events + +// +// Alert Types ... +input bool terminalAlert = false; // Terminal Alert +input bool pushAlert = false; // Push Notification Alerts + +// +// Positions ... +input bool alertPositions = true; // Alert Positions +input bool longPositionAlerts = true; // Alert Long Positions +input bool shortPositionAlerts = true; // Alert Short Positions + +// +input bool enableNewDayAlert = true; // New Day Alert +input bool enableNewHourAlert = true; // New Hour Alert + +// +int maxMarketLength = 0; +// +// END Global Definitions: Variables, Properties and etc ... +// + +// +// Start Event Handlers ... +// +// +// Initialization ... +int OnInit() { + // + // Validate Inputs ... + bool inputsNotValiid = + // + // EA ... + maxOpenTrades <= 0 + || maxEquityPercent < 0 + || minBalancePercent < 0 + || lotsPerTradePercent < 0 + || maxDrawdownPercentPerPTrade < 0 + ; + + // + if (inputsNotValiid) { + return INIT_PARAMETERS_INCORRECT; + } + + // + totalSignals = 0; + totalLongSignals = 0; + totalShortSignals = 0; + + // + initialBalance = 0; + + // + // START Define Array Series ... + // + // + // END Define Array Series ... + // + + // + // here we specify logging enabled or not ... + enableLogging = true; + + // + // this is a Tag which attached to our Logger ... + logTag = "XST"; + + // + ClearSignalConditions(); + + // + maxMarketLength = MathMax(0, GetDailyCandleCount()); + + // + // TODO: Complete this ... + // try to Create App Window ... + // CreateDialog(logTag); + + // + return INIT_SUCCEEDED; +} + +// +// DeInitialization ... +void OnDeinit(const int reason) { + // + // TODO: Complete this ... + // Destroy Dialog ... + // DestroyDialog(reason); +} + +// +// Handling Chart Events ... +void OnChartEvent( + const int id, // event ID + const long& lparam, // event parameter of the long type + const double& dparam, // event parameter of the double type + const string& sparam // event parameter of the string type +) { + // + // TODO: Complete this ... + // DialogChartEvent( + // id, + // lparam, + // dparam, + // sparam + // ); +} + +// +// Ticker Event Handler ... +void OnTick() { + // + isNewDay = IsNewDay(); + if ( + isNewDay + && enableNewDayAlert + ) { + // + SendAlert( + StringConcatenate( + "New Day ..." + ) + ); + } + + // + isNewHour = IsNewHour(); + if ( + isNewHour + && enableNewHourAlert + ) { + // + SendAlert( + StringConcatenate( + "New Hour ..." + ) + ); + } + + // + // Process Signals to Open Positions ... + ProcessSignals(); + + // + // Checking State for Signal Handling ... + CheckState(); + + // + // Process Open Positions for Trailing Stop Loss or Close ... + ProcessOpenPositions(); +} +// +// END Event Handlers ... +// + +// +// START Functions ... +// +// +// Check State for Signal Handling ... +void CheckState() { + // + // Here we Must to Check Market State for enable or disable + // Signal Handlers and also make dection to close all long/short + // trades ... +} + +// +// Calculate Signals and Process Based on Exists Signals ... +void ProcessSignals() { + // + XSignalRequest request = {}; + request.type = X_SIGNAL_NONE; + request.hasSignal = false; + + // + // Prevent Multiple Calculating on Same Bars ... + isNewBar = IsNewBar(); + if (isNewBar) { + countedBars++; + } + + // + if (countedBars < maxMarketLength) { + return; + } + + // + bool allowDoTrade = true; + + // + // Check Balance ... + if (initialBalance > 0) { + // + // Retrieve Account Balance ... + double balance = AccountInfoDouble(ACCOUNT_BALANCE); + double minimumBalanceForTrade = + balance > initialBalance + ? + minBalancePercent * balance + : + minBalancePercent * initialBalance; + + // + // Retrieve Account Equity ... + double equity = AccountInfoDouble(ACCOUNT_EQUITY); + double maxAllowedEquity = balance - (balance * maxEquityPercent); + + // + // Retrieve Free Marigin ... + double freeMargin = AccountFreeMargin(); + double maximumMariginRisk = balance - (balance * maxEquityPercent); + + // + if ( + // + // Do not Open Positions if equity not passed ... + equity < maxAllowedEquity || + // + // Do not Open Positions if free margin not passed ... + freeMargin <= maximumMariginRisk || + // + // Do not open positions if balance less than minimum ... + balance <= minimumBalanceForTrade + ) { + // + static bool tradingPauseAlerted; + + // + allowDoTrade = false; + + // + if (!tradingPauseAlerted) { + // + string message = StringConcatenate( + "Trading Pause => ", + "Balance: ", balance, + ", Equity: ", equity, + ", FreeMargin: ", freeMargin + ); + + // + LogMessage(message); + SendAlert(message); + + // + tradingPauseAlerted = true; + } + } + } + + // + // Retrieve Signal Exists ... + request = GenerateSignal(0); + + // + // Prevent doing anything else, if there is no signals ... + if ( + !allowDoTrade || + !request.hasSignal || + request.type == X_SIGNAL_NONE + ) { + return; + } + + // + bool hasLongSignal = request.type == X_SIGNAL_LONG; + + // + // Check last Signalled Bar with Counted Bars ... + // Prevent Multiple Signalling on Same Bar ... + bool isInLastSignalledBars = false; + for (int i=0; i < candleGapBetweenSignals; i++) { + // + isInLastSignalledBars = + isInLastSignalledBars + || lastSignalledBar == countedBars - i + ; + } + if (isInLastSignalledBars) { + // + // Clear Signal Conditions ... + if (hasLongSignal) { + ClearLongSignalConditions(); + } else { + ClearShortSignalConditions(); + } + + // + return; + } + + // + // increase last signalled bar ... + lastSignalledBar = countedBars; + + // + // Calculate Can Trade or not ... + allowDoTrade = allowTrade + && ( + hasLongSignal ? + allowLongTrades : + allowShortTrades + ); + + // + // Chack Maximum Open Positions ... + int openTrades = CountOpenTrades(); + if (maxOpenTrades > 0) { + // + if (openTrades >= maxOpenTrades) { + // + allowDoTrade = false; + + // + if (!allowDoTrade) { + // + string message = StringConcatenate( + "Trading Pause => ", + "Max Open Trades (", + maxOpenTrades, + ") reached ..." + ); + + // + LogMessage(message); + SendAlert(message); + } + } + } + + // + // Check Trading is Enable or not ... + // nothing to do if trading is disabled ... + if (!allowDoTrade) { + // + // Clear Signal Conditions ... + if (hasLongSignal) { + ClearLongSignalConditions(); + } else { + ClearShortSignalConditions(); + } + + // + string message = StringConcatenate( + "Trading Not Allowed ..." + ); + + // + LogMessage(message); + SendAlert(message); + return; + } + + // + // Retrieve Signal Lots Per Trade ... + double lPTradePercent = GetSignalLottage( + request.signal, + lotsPerTradePercent + ); + + // + bool isPositionOpened = TradeSignal( + request.signal, + lPTradePercent, + // + bullishSignalLabel, + bullishSignalColor, + bearishSignalLabel, + bearishSignalColor + ); + + // + totalSignals++; + if (hasLongSignal) { + // + totalLongSignals++; + ClearLongSignalConditions(); + } else { + // + totalShortSignals++; + ClearShortSignalConditions(); + } + + // + if (isPositionOpened) { + // + bool canAlert = + alertPositions + && ( + hasLongSignal ? + longPositionAlerts + : + shortPositionAlerts + ); + + // + if (canAlert) { + // + // Alert Message ... + string message = StringConcatenate( + "Trade on Signal ID: ", request.signal.id, + ", ProvidedBy: ", GetSignalProviderIdentifier(request.signal.provider), + ", Entry: ", request.signal.entry, + ", TP: ", request.signal.tp + ); + + // + // Terminal Alert ... + if (terminalAlert) { + Alert(message); + } + + // + // Push Alert ... + if (pushAlert) { + SendNotification(message); + } + } + } +} + +// +// Process All Open Positions ... +void ProcessOpenPositions() { + // + // XSignalling ... + if (enableXSignalling) { + // + // Close All XXX Provided Signals on it's Specific Condition ... + if (xCloseLongTrades) { + // + CloseAllProviderLongTrades(X_XXX_PROVIDER); + + // + xCloseLongTrades = false; + } + + // + if (xCloseShortTrades) { + // + CloseAllProviderShortTrades(X_XTPW_PROVIDER); + + // + xCloseShortTrades = false; + } + + // + // Close Maximum DrawDown Passed Trades ... + + // + // Longs ... + bool hasClosedLongInDrawDownLongTrade = CloseAllMaximumDrawDownPassedTrades( + xLongMaxDrawdownPerTradePercent, + X_SIGNAL_LONG, + X_XXX_PROVIDER + ); + + // + // Shorts ... + bool hasClosedShortInDrawDownLongTrade = CloseAllMaximumDrawDownPassedTrades( + xShortMaxDrawdownPerTradePercent, + X_SIGNAL_SHORT, + X_XXX_PROVIDER + ); + + // + // Close All Long Time Trades based on Provider provided Length ... + bool hasClosedLongTimeTrade = CloseAllLongTimeTrades( + xMaximumCandlesPerTrade, + X_XXX_PROVIDER + ); + + // + if ( + hasClosedLongTimeTrade + || hasClosedLongInDrawDownLongTrade + || hasClosedShortInDrawDownLongTrade + ) { + xFailedSignals++; + } + } + + // + // XR Signalling ... + if (enableXRSignalling) { + // + if (xRCloseLongTrades) { + // + CloseAllProviderLongTrades(X_XR_PROVIDER); + + // + xRCloseLongTrades = false; + } + + // + if (xRCloseShortTrades) { + // + CloseAllProviderShortTrades(X_XR_PROVIDER); + + // + xRCloseShortTrades = false; + } + + // + // Close Maximum DrawDown Passed Trades ... + + // + // Longs ... + bool hasClosedLongInDrawDownLongTrade = CloseAllMaximumDrawDownPassedTrades( + xRLongMaxDrawdownPerTradePercent, + X_SIGNAL_LONG, + X_XR_PROVIDER + ); + + // + // Shorts ... + bool hasClosedShortInDrawDownLongTrade = CloseAllMaximumDrawDownPassedTrades( + xRShortMaxDrawdownPerTradePercent, + X_SIGNAL_SHORT, + X_XR_PROVIDER + ); + + // + // Close All Long Time Trades based on Provider provided Length ... + bool hasClosedLongTimeTrade = CloseAllLongTimeTrades( + xRMaximumCandlesPerTrade, + X_XR_PROVIDER + ); + + // + if ( + hasClosedLongTimeTrade + || hasClosedLongInDrawDownLongTrade + || hasClosedShortInDrawDownLongTrade + ) { + xRFailedSignals++; + } + } + + // + // XTPW Signalling ... + if (enableXTPWSignalling) { + // + if (xTPWCloseLongTrades) { + // + CloseAllProviderLongTrades(X_XTPW_PROVIDER); + + // + xTPWCloseLongTrades = false; + } + + // + if (xTPWCloseShortTrades) { + // + CloseAllProviderShortTrades(X_XTPW_PROVIDER); + + // + xTPWCloseShortTrades = false; + } + + // + // Close Maximum DrawDown Passed Trades ... + + // + // Longs ... + bool hasClosedLongInDrawDownLongTrade = CloseAllMaximumDrawDownPassedTrades( + xTPWLongMaxDrawdownPerTradePercent, + X_SIGNAL_LONG, + X_XTPW_PROVIDER + ); + + // + // Shorts ... + bool hasClosedShortInDrawDownLongTrade = CloseAllMaximumDrawDownPassedTrades( + xTPWShortMaxDrawdownPerTradePercent, + X_SIGNAL_SHORT, + X_XTPW_PROVIDER + ); + + // + // Close All Long Time Trades based on Provider provided Length ... + bool hasClosedLongTimeTrade = CloseAllLongTimeTrades( + xTPWMaximumCandlesPerTrade, + X_XTPW_PROVIDER + ); + + // + if ( + hasClosedLongTimeTrade + || hasClosedLongInDrawDownLongTrade + || hasClosedShortInDrawDownLongTrade + ) { + xTPWFailedSignals++; + } + } + + // + // Close Maximum DrawDown Passed Trades ... + // this is the Maximum Controller ... + // + double maxOfXPercent = enableXSignalling ? + MathMax( + xLongMaxDrawdownPerTradePercent, + xShortMaxDrawdownPerTradePercent + ) : 0 + ; + + // + double maxOfXRPercent = enableXRSignalling ? + MathMax( + xRLongMaxDrawdownPerTradePercent, + xRShortMaxDrawdownPerTradePercent + ) : 0 + ; + + // + double maxOfXTPWPercent = enableXTPWSignalling ? + MathMax( + xTPWLongMaxDrawdownPerTradePercent, + xTPWShortMaxDrawdownPerTradePercent + ) : 0 + ; + + // + double maxDrawDownPercent = MathMax( + maxOfXPercent, + maxOfXRPercent + ); + maxDrawDownPercent = MathMax( + maxDrawDownPercent, + maxOfXTPWPercent + ); + maxDrawDownPercent = MathMax( + maxDrawDownPercent, + maxDrawdownPercentPerPTrade + ); + + // + // we Calculate Max DrawDown Percent Per Trade ... + // then try to Close based on them ... + bool hasClosedInDrawDownLongTrade = CloseAllMaximumDrawDownPassedTrades( + maxDrawDownPercent + ); +} + +// +// Send Special Type of Alerts ... +void SendAlert(string message) { + // + if ( + !logEvents + && !alertEvents + ) { + return; + } + + // + // Log Handling ... + if (logEvents) { + LogMessage(message); + } + + // + // Alert Handling ... + if (alertEvents) { + // + // Terminal Alert ... + if (terminalAlert) { + Alert(message); + } + + // + // Push Alert ... + if (pushAlert) { + SendNotification(message); + } + } +} +// +// END Functions ... +// + +// +// +// Calculate Signal ... +// in this function we calculate a signal exists in +// specific bar or not ... +XSignalRequest GenerateSignal( + const int bar_index // Bar Index ... +) { + // + // create temp result ... + XSignalRequest result = {}; + result.hasSignal = false; + result.type = X_SIGNAL_NONE; + result.provider = X_UNKNOWN_PROVIDER; + + // + bool hasSignal = false; + bool hasLongSignal = false; + bool hasShortSignal = false; + + // + XSignal signal = {}; + + // + // Define Template Signal Requests for Managing Multiple Signals ... + // + // X ... + XSignalRequest xLongSignalRequest = {}; + XSignalRequest xShortSignalRequest = {}; + // + // XR ... + XSignalRequest xrLongSignalRequest = {}; + XSignalRequest xrShortSignalRequest = {}; + // + // XTPW ... + XSignalRequest xTPWLongSignalRequest = {}; + XSignalRequest xTPWShortSignalRequest = {}; + + // + // START XR Signal Handler ... + // + // + if (enableXRSignalling) { + // + CheckXRSignalHandler( + bar_index + ); + + // + // Long Trades ... + if (allowTrade && allowLongTrades) { + // + if (xRWaitForLongSignals) { + // + CheckXRLongSignalConditions( + bar_index + ); + + // + xrLongSignalRequest = GenerateXRSignal( + X_SIGNAL_LONG, + signalPrefix, + bar_index + ); + + // + if (xrLongSignalRequest.hasSignal) { + // + // Here we can Check and Filter Signals Based On State ... + bool isReady = IsReadyForXRSignals( + xrLongSignalRequest.signal + ); + + // + if (isReady && xRWaitForLongSignals) { + // + hasLongSignal = true; + signal = xrLongSignalRequest.signal; + } else { + ClearXRLongSignalConditions(); + } + } + } else { + ClearXRLongSignalConditions(); + } + } + + // + // Short Trades ... + if (allowTrade && allowShortTrades) { + // + if (xRWaitForShortSignals) { + // + CheckXRShortSignalConditions( + bar_index + ); + + // + xrShortSignalRequest = GenerateXRSignal( + X_SIGNAL_SHORT, + signalPrefix, + bar_index + ); + + // + if (xrShortSignalRequest.hasSignal) { + // + // Here we can Check and Filter Signals Based On State ... + bool isReady = IsReadyForXRSignals( + xrShortSignalRequest.signal + ); + + // + if (isReady && xRWaitForShortSignals) { + // + hasShortSignal = true; + signal = xrShortSignalRequest.signal; + } else { + ClearXRShortSignalConditions(); + } + } + } else { + ClearXRShortSignalConditions(); + } + } + } + // + // END XR Signal Handler ... + // + + // + // START XTPW Signal Handler ... + // + if (enableXTPWSignalling) { + // + CheckXTPWSignalHandler( + bar_index + ); + + // + // Long Trades ... + if (allowTrade && allowLongTrades) { + // + if (xTPWWaitForLongSignals) { + // + CheckXTPWLongSignalConditions( + bar_index + ); + + // + xTPWLongSignalRequest = GenerateXTPWSignal( + X_SIGNAL_LONG, + signalPrefix, + bar_index + ); + + // + if (xTPWLongSignalRequest.hasSignal) { + // + // Here we can Check and Filter Signals Based On State ... + bool isReady = IsReadyForXTPWSignals( + xTPWLongSignalRequest.signal + ); + + // + if (isReady && xTPWWaitForLongSignals) { + // + hasLongSignal = true; + signal = xTPWLongSignalRequest.signal; + } else { + ClearXTPWLongSignalConditions(); + } + } + } else { + ClearXTPWLongSignalConditions(); + } + } + + // + // Short Trades ... + if (allowTrade && allowShortTrades) { + // + if (xTPWWaitForShortSignals) { + // + CheckXTPWShortSignalConditions( + bar_index + ); + + // + xTPWShortSignalRequest = GenerateXTPWSignal( + X_SIGNAL_SHORT, + signalPrefix, + bar_index + ); + + // + if (xTPWShortSignalRequest.hasSignal) { + // + // Here we can Check and Filter Signals Based On State ... + bool isReady = IsReadyForXTPWSignals( + xTPWShortSignalRequest.signal + ); + + // + if (isReady && xTPWWaitForShortSignals) { + // + hasShortSignal = true; + signal = xTPWShortSignalRequest.signal; + } else { + ClearXTPWShortSignalConditions(); + } + } + } else { + ClearXTPWShortSignalConditions(); + } + } + } + // + // END XTPW Signal Handler ... + // + + // + // START X Signal Handler ... + // + // + if (enableXSignalling) { + // + CheckXSignalHandler( + bar_index + ); + + // + // Long Trades ... + if (allowTrade && allowLongTrades) { + // + if (xWaitForLongSignals) { + // + CheckXLongSignalConditions( + bar_index + ); + + // + xLongSignalRequest = GenerateXSignal( + X_SIGNAL_LONG, + signalPrefix, + bar_index + ); + + // + if (xLongSignalRequest.hasSignal) { + // + // Here we can Check and Filter Signals Based On State ... + bool isReady = IsReadyForXSignals( + xLongSignalRequest.signal + ); + + // + if (isReady && xWaitForLongSignals) { + // + hasLongSignal = true; + signal = xLongSignalRequest.signal; + } else { + ClearXLongSignalConditions(); + } + } + } else { + ClearXLongSignalConditions(); + } + } + + // + // Short Trades ... + if (allowTrade && allowShortTrades) { + // + if (xWaitForShortSignals) { + // + CheckXShortSignalConditions( + bar_index + ); + + // + xShortSignalRequest = GenerateXSignal( + X_SIGNAL_SHORT, + signalPrefix, + bar_index + ); + + // + if (xShortSignalRequest.hasSignal) { + // + // Here we can Check and Filter Signals Based On State ... + bool isReady = IsReadyForXSignals( + xShortSignalRequest.signal + ); + + // + if (isReady && xWaitForShortSignals) { + // + hasShortSignal = true; + signal = xShortSignalRequest.signal; + } else { + ClearXShortSignalConditions(); + } + } + } else { + ClearXShortSignalConditions(); + } + } + } + // + // END XR Signal Handler ... + // + + // + hasSignal = hasLongSignal || hasShortSignal; + + // + if (!hasSignal) { + // + signal.type = X_SIGNAL_NONE; + result.type = X_SIGNAL_NONE; + } + + // + // Normalize TP, SL and Entry Price ... + signal.tp = NormalizeDouble(signal.tp, _Digits); + signal.sl = NormalizeDouble(signal.sl, _Digits); + signal.entry = NormalizeDouble(signal.entry, _Digits); + + // + result.signal = signal; + result.type = signal.type; + result.hasSignal = hasSignal; + result.provider = signal.provider; + + // + // Return Result ... + return result; +} diff --git a/BKPS/OLD/XAUUSD-15M-V1.0/MQ4/Indicators/x-saherelm.ma.mq4 b/BKPS/OLD/XAUUSD-15M-V1.0/MQ4/Indicators/x-saherelm.ma.mq4 new file mode 100644 index 0000000..e3a5737 --- /dev/null +++ b/BKPS/OLD/XAUUSD-15M-V1.0/MQ4/Indicators/x-saherelm.ma.mq4 @@ -0,0 +1,173 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MA Indicator +// --------------------------------------------- +// saherelm implementation of above indicator ... +// this indicator uses two ma line: +// - fast ma; +// - slow ma; +// +// 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 MA Indicator" +#property strict + +// +// START Inputs ... +// +// +// Fast MA ... +input int maLength = 20; // MA Length +input int maShift = 0; // MA Shift +input ENUM_MA_METHOD maMethod = MODE_EMA; // MA Method +input ENUM_APPLIED_PRICE maAppliedPrice = PRICE_CLOSE; // MA Applied Price + +// +// START Global Definitions: Variables, Properties and etc ... +// +#property indicator_chart_window + +// +#property indicator_buffers 1 + +// +#property indicator_plots 1 + +// +// Start Define Indicator Buffer Styles ... +// +// +// Fast Ma Buffer ... +#property indicator_label1 "Ma" +#property indicator_type1 DRAW_LINE +#property indicator_color1 clrYellow +#property indicator_style1 STYLE_DOT +#property indicator_width1 2 + +// +// End Define Indicator Buffer Styles ... +// + +// +// Buffers ... +#define maBufferIndex 0 + +double maBuffer[]; +// +// END Global Definitions: Variables, Properties and etc ... +// + +// +// Start Event Handlers ... +// +// +// Initialization ... +int OnInit() { + // + // Initialize what we want ... + if (maLength <= 0) { + return INIT_PARAMETERS_INCORRECT; + } + + // + // Start Set Index Buffers ... + // + // + // Ma ... + SetIndexBuffer(maBufferIndex, maBuffer); + SetIndexDrawBegin(maBufferIndex, maLength + 1); + // + // End Set Index Buffers ... + // + + // + return INIT_SUCCEEDED; +} + +// +// Calculating what we want ... +int OnCalculate(const int rates_total, + const int prev_calculated, + const datetime &time[], + const double &open[], + const double &high[], + const double &low[], + const double &close[], + const long &tick_volume[], + const long &volume[], + const int &spread[] +) { + // + // this counts Available Bars ... + int limit; + + // + // 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 ... + int maxLength = MathMax(0, maLength); + + // + // input variable, we return 0 means nothing passed ... + if (rates_total < maxLength) { + return 0; + } + + // + // found which candles calculated before ... + limit = (prev_calculated == 0) ? rates_total - maxLength - 1 : rates_total - prev_calculated + 1; + + // + // this is the main loop of calculations, for each bar index ... + for (int i = limit - 1; i >= 0; i--) { + // + // Start Calculation here ... + // i is bar_index ... + + // + // Calculate Ma ... + CalculateMa(i); + } + + // + return rates_total; +} +// +// END Event Handlers ... +// + +// +// START Functions ... +// +// +// Calculating Ma ... +void CalculateMa( + const int &bar_index +) { + // + // Calculating Fast Ma ... + double ma = iMA( + _Symbol, + _Period, + maLength, + maShift, + maMethod, + maAppliedPrice, + bar_index + ); + + // + maBuffer[bar_index] = ma; +} +// +// END Functions ... +// \ No newline at end of file diff --git a/BKPS/OLD/XAUUSD-15M-V1.0/MQ4/Indicators/x-saherelm.xrange.mq4 b/BKPS/OLD/XAUUSD-15M-V1.0/MQ4/Indicators/x-saherelm.xrange.mq4 new file mode 100644 index 0000000..1359f57 --- /dev/null +++ b/BKPS/OLD/XAUUSD-15M-V1.0/MQ4/Indicators/x-saherelm.xrange.mq4 @@ -0,0 +1,294 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center XRange Indicator +// --------------------------------------------- +// saherelm implementation of above 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 XRange Indicator" +#property strict + +// +// START Inputs ... +// +input int marketLength = 14; +// +// END Inputs ... +// + +// +// START Global Definitions: Variables, Properties and etc ... +// +#property indicator_chart_window + +// +#property indicator_buffers 3 + +// +#property indicator_plots 3 + +// +// Start Define Indicator Buffer Styles ... +// +// +// Highest High Buffer ... +#property indicator_type1 DRAW_LINE +#property indicator_color1 clrGreen +#property indicator_style1 STYLE_DOT +#property indicator_width1 1 + +// +// Lowest Low Buffer ... +#property indicator_type2 DRAW_LINE +#property indicator_color2 clrRed +#property indicator_style2 STYLE_DOT +#property indicator_width2 1 + +// +// Middle Buffer ... +#property indicator_type3 DRAW_LINE +#property indicator_color3 clrYellow +#property indicator_style3 STYLE_DASH +#property indicator_width3 1 +// +// End Define Indicator Buffer Styles ... +// + +// +// Buffers ... +// +#define highestHighBufferIndex 0 +#define lowestLowBufferIndex 1 +#define middleBufferIndex 2 + +// +double highestHighBuffer[]; +double lowestLowBuffer[]; +double middleBuffer[]; + +// +datetime startTime; +// +// END Global Definitions: Variables, Properties and etc ... +// + +// +// Start Event Handlers ... +// +// +// Initialization ... +int OnInit() { + // + // Initialize what we want ... + if ( + marketLength <= 0 + ) { + return INIT_PARAMETERS_INCORRECT; + } + + // + string hhLbl = StringConcatenate( + "XR HH(", marketLength, ")" + ); + SetIndexBuffer(highestHighBufferIndex, highestHighBuffer); + SetIndexLabel(highestHighBufferIndex, hhLbl); + + // + string llLbl = StringConcatenate( + "XR LL(", marketLength, ")" + ); + SetIndexBuffer(lowestLowBufferIndex, lowestLowBuffer); + SetIndexLabel(lowestLowBufferIndex, llLbl); + + // + string midLbl = StringConcatenate( + "XR Mid(", marketLength, ")" + ); + SetIndexBuffer(middleBufferIndex, middleBuffer); + SetIndexLabel(middleBufferIndex, midLbl); + + // + return INIT_SUCCEEDED; +} + +// +// Calculating what we want ... +int OnCalculate(const int rates_total, + const int prev_calculated, + const datetime &time[], + const double &open[], + const double &high[], + const double &low[], + const double &close[], + const long &tick_volume[], + const long &volume[], + const int &spread[] +) { + // + // this counts Available Bars ... + int limit; + + // + // 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 ... + int maxLength = MathMax(0, marketLength); + + // + // input variable, we return 0 means nothing passed ... + if (rates_total < maxLength) { + return 0; + } + + // + // found which candles calculated before ... + limit = (prev_calculated == 0) ? rates_total - maxLength - 1 : rates_total - prev_calculated + 1; + + // + // this is the main loop of calculations, for each bar index ... + for (int i = limit - 1; i >= 0; i--) { + // + // Start Calculation here ... + // i is bar_index ... + + // + // Calculations ... + CalculateBuffers(i); + } + + // + return rates_total; +} +// +// END Event Handlers ... +// + +// +// START Functions ... +// +// +// Calculations ... +void CalculateBuffers( + const int &bar_index +) { + // + // Retrieve Bar Time ... + datetime barTime = iTime( + _Symbol, + _Period, + bar_index + ); + + // + if (startTime == 0) { + // + startTime = barTime; + SetIndicatorBuffersNone(bar_index); + return; + } + + // + int startBarIndex = iBarShift( + _Symbol, + _Period, + startTime + ); + + // + int startDistance = startBarIndex - bar_index; + if (startDistance < marketLength) { + // + SetIndicatorBuffersNone(bar_index); + return; + } + + // + // Highest High ... + int hhIdx = iHighest( + _Symbol, + _Period, + MODE_HIGH, + marketLength, + bar_index + ); + double hh = iHigh( + _Symbol, + _Period, + hhIdx + ); + highestHighBuffer[bar_index] = hh; + + // + // Lowest Low ... + int llIdx = iLowest( + _Symbol, + _Period, + MODE_LOW, + marketLength, + bar_index + ); + double ll = iLow( + _Symbol, + _Period, + llIdx + ); + lowestLowBuffer[bar_index] = ll; + + // + // Middle Buffer ... + double mid = (hh + ll) / 2; + middleBuffer[bar_index] = mid; + + // + // Reset Start Time ... + startTime = 0; +} + +// +void SetIndicatorBuffersNone( + const int bar_index +) { + // + int lastBarIndex = bar_index + 1; + + // + double lastHighestHigh; + double lastLowestLow; + + // + // Highest High ... + if (ArraySize(highestHighBuffer) > lastBarIndex) { + lastHighestHigh = highestHighBuffer[lastBarIndex]; + } else { + lastHighestHigh = 0; + } + + // + // Lowest Low ... + if (ArraySize(lowestLowBuffer) > lastBarIndex) { + lastLowestLow = lowestLowBuffer[lastBarIndex]; + } else { + lastLowestLow = 0; + } + + // + highestHighBuffer[bar_index] = lastHighestHigh; + lowestLowBuffer[bar_index] = lastLowestLow; + + // + double mid = (lastHighestHigh + lastLowestLow) / 2; + middleBuffer[bar_index] = mid; +} +// +// END Functions ... +// \ No newline at end of file diff --git a/BKPS/OLD/XAUUSD-15M-V1.0/MQ4/Indicators/x-saherelm.xtpow.mq4 b/BKPS/OLD/XAUUSD-15M-V1.0/MQ4/Indicators/x-saherelm.xtpow.mq4 new file mode 100644 index 0000000..46ff59e --- /dev/null +++ b/BKPS/OLD/XAUUSD-15M-V1.0/MQ4/Indicators/x-saherelm.xtpow.mq4 @@ -0,0 +1,275 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center Trend Power Indicator +// --------------------------------------------- +// saherelm implementation of above indicator ... +// this indicator uses two ma line: +// - fast ma; +// - slow ma; +// +// 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 MA Indicator" +#property strict + +// +// START Inputs ... +// +input int marketLength = 7; // Market Length +// +// END Inputs ... +// + +// +// START Global Definitions: Variables, Properties and etc ... +// +#property indicator_separate_window + +// +#property indicator_plots 3 +#property indicator_buffers 3 +#property indicator_minimum 0 +#property indicator_maximum 100 + +// +#property indicator_levelcolor clrGray +#property indicator_levelstyle STYLE_DOT + +// +// Start Define Indicator Buffer Styles ... +// +#property indicator_type1 DRAW_HISTOGRAM +#property indicator_color1 clrLime +#property indicator_style1 STYLE_DOT +#property indicator_width1 1 + +// +#property indicator_type2 DRAW_HISTOGRAM +#property indicator_color2 clrRed +#property indicator_style2 STYLE_DOT +#property indicator_width2 1 + +// +#property indicator_type3 DRAW_LINE +#property indicator_color3 clrYellow +#property indicator_style3 STYLE_DOT +#property indicator_width3 1 +// +// End Define Indicator Buffer Styles ... +// + +// +// Buffers ... +#define powerUpBufferIndex 0 +#define powerDownBufferIndex 1 +#define signalBufferIndex 2 + +double powerUpBuffer[]; +double powerDownBuffer[]; +double signalBuffer[]; + +// +#include "../Libraries/x-saherelm.lib.mq4" +// +// END Global Definitions: Variables, Properties and etc ... +// + +// +// Start Event Handlers ... +// +// +// Initialization ... +int OnInit() { + // + // Initialize what we want ... + if (marketLength <= 0) { + return INIT_PARAMETERS_INCORRECT; + } + + // + SetLevelValue(0, 0.0); + IndicatorSetString(INDICATOR_LEVELTEXT,0,""); + + // + SetLevelValue(1, 20.0); + IndicatorSetString(INDICATOR_LEVELTEXT,1,""); + + // + SetLevelValue(2, 50); + IndicatorSetString(INDICATOR_LEVELTEXT,2,""); + + // + SetLevelValue(3, 100); + IndicatorSetString(INDICATOR_LEVELTEXT,3,""); + + // + string pUpLbl = StringConcatenate( + "P Up (", marketLength, ")" + ); + SetIndexLabel(powerUpBufferIndex, pUpLbl); + SetIndexBuffer(powerUpBufferIndex, powerUpBuffer); + SetIndexDrawBegin(powerUpBufferIndex, marketLength + 1); + + // + string pDownLbl = StringConcatenate( + "P Down (", marketLength, ")" + ); + SetIndexLabel(powerDownBufferIndex, pDownLbl); + SetIndexBuffer(powerDownBufferIndex, powerDownBuffer); + SetIndexDrawBegin(powerDownBufferIndex, marketLength + 1); + + // + string pSignalLbl = StringConcatenate( + "P Signal (", marketLength, ")" + ); + SetIndexLabel(signalBufferIndex, pSignalLbl); + SetIndexBuffer(signalBufferIndex, signalBuffer); + SetIndexDrawBegin(signalBufferIndex, marketLength + 1); + + // + // here we specify logging enabled or not ... + enableLogging = true; + + // + // this is a Tag which attached to our Logger ... + logTag = "X_TPW_OSC"; + + // + return INIT_SUCCEEDED; +} + +// +// Calculating what we want ... +int OnCalculate(const int rates_total, + const int prev_calculated, + const datetime &time[], + const double &open[], + const double &high[], + const double &low[], + const double &close[], + const long &tick_volume[], + const long &volume[], + const int &spread[] +) { + // + // this counts Available Bars ... + int limit; + + // + // 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 ... + int maxLength = MathMax(0, marketLength); + + // + // input variable, we return 0 means nothing passed ... + if (rates_total < maxLength) { + return 0; + } + + // + // found which candles calculated before ... + limit = (prev_calculated == 0) ? rates_total - maxLength - 1 : rates_total - prev_calculated + 1; + + // + // this is the main loop of calculations, for each bar index ... + for (int i = limit - 1; i >= 0; i--) { + // + // Start Calculation here ... + // i is bar_index ... + + // + // Calculate Buffers ... + CalculateBuffers(i); + } + + // + return rates_total; +} +// +// END Event Handlers ... +// + +// +// START Functions ... +// +// +// Calculating Ma ... +void CalculateBuffers( + const int &bar_index +) { + // + double powerUp = 0; + double powerDown = 0; + + // + int dailyCount = GetDailyCandleCount(); + double dailyHH = GetMarketHighestHigh( + bar_index, + dailyCount + ); + double dailyLL = GetMarketLowestLow( + bar_index, + dailyCount + ); + double dailyDiff = dailyHH - dailyLL; + double rate = dailyDiff / 100; + + // + for (int i = bar_index; i < bar_index + marketLength; i++) { + // + XOHCL c = GetCandleModel(i); + + // + double cRange = + MathAbs(c.open - c.close) + // MathAbs(c.high - c.low) + ; + bool isBullish = c.open < c.close; + + // + if (isBullish) { + powerUp += cRange; + } else { + powerDown += cRange; + } + } + + // + powerUp = powerUp / rate; + powerDown = powerDown / rate; + + // + int doubleMarketLength = (marketLength * 2); + double ema = GetMA( + bar_index, + doubleMarketLength, + 0, + MODE_EMA, + PRICE_WEIGHTED + ); + + // + double emaRate = GetMarketHighestHigh(bar_index, doubleMarketLength) - GetMarketLowestLow(bar_index, doubleMarketLength) / 100; + + // + double signal = (ema / 100) * rate; + double signalAddition = MathMin(powerUp, powerDown); + + // + powerUpBuffer[bar_index] = powerUp; + powerDownBuffer[bar_index] = powerDown; + signalBuffer[bar_index] = signal + signalAddition; +} +// +// END Functions ... +// \ No newline at end of file diff --git a/BKPS/OLD/XAUUSD-15M-V1.0/MQ4/Libraries/x-saherelm.dialog.mq4 b/BKPS/OLD/XAUUSD-15M-V1.0/MQ4/Libraries/x-saherelm.dialog.mq4 new file mode 100644 index 0000000..c00318e --- /dev/null +++ b/BKPS/OLD/XAUUSD-15M-V1.0/MQ4/Libraries/x-saherelm.dialog.mq4 @@ -0,0 +1,110 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL4 Dialog Library +// --------------------------------------------- +// saherelm useful tools and definitions +// for handling dialogs ... +// +// +// Maintainer: +// ------------ +// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) +// +////////////////////////////////////////////////////// +#property library +#property copyright "Copyright 2023, SaherElm IT Center" +#property link "https://www.saherelm.ir" +#property version "1.00" +#property strict + +// +// Includes Logger library ... +// #include "../Libraries/x-saherelm.lib.mq4" +#include "../Libraries/x-saherelm.log.lib.mq4" + +// +#include + +// +CAppDialog AppWindow; + +// +// Prefix for Created Dialogs ... +string windowPrefix = "XWinD"; + +// +// Generate a random number for dialogs ... +int GenerateWindowNumber() { + // + int result = MathRand() + 1; + + // + return result; +} + +// +// Generate a Window Prefix ID ... +string GenerateWindowID() { + // + string result = windowPrefix; + + // + // Generate INT ID ... + int idNum = GenerateWindowNumber(); + + // + result += "_" + StringConcatenate(idNum); + + // + return result; +} + +// +bool CreateDialog( + const string title = "" +) { + // + // string windowID = GenerateWindowID(); + + // + // Try to Create Window ... + bool result = AppWindow.Create( + 0, + title, + 0, + 20, + 20, + 360, + 324 + ); + + // + if (result) { + AppWindow.Run(); + } + + // + return result; +} + +// +void DestroyDialog(const int reason) { + AppWindow.Destroy(reason); +} + +// +// Apply Chart Event on Created Window ... +void DialogChartEvent( + const int id, // event ID + const long& lparam, // event parameter of the long type + const double& dparam, // event parameter of the double type + const string& sparam // event parameter of the string type +) { + // + AppWindow.ChartEvent( + id, + lparam, + dparam, + sparam + ); +} \ No newline at end of file diff --git a/BKPS/OLD/XAUUSD-15M-V1.0/MQ4/Libraries/x-saherelm.draw.lib.mq4 b/BKPS/OLD/XAUUSD-15M-V1.0/MQ4/Libraries/x-saherelm.draw.lib.mq4 new file mode 100644 index 0000000..776cde4 --- /dev/null +++ b/BKPS/OLD/XAUUSD-15M-V1.0/MQ4/Libraries/x-saherelm.draw.lib.mq4 @@ -0,0 +1,2010 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL4 Draw Global Library +// --------------------------------------------- +// saherelm useful tools and definitions ... +// +// +// Maintainer: +// ------------ +// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) +// +////////////////////////////////////////////////////// +#property library +#property copyright "Copyright 2023, SaherElm IT Center" +#property link "https://www.saherelm.ir" +#property version "1.00" +#property strict + +// +// Includes our shared library ... +#include "../Libraries/x-saherelm.log.lib.mq4" + +// +// Draw Highest High ... +bool DrawHighestHigh( + const int bar_index, + const int marketLen, + const string tag, + const int drawUntilBarIndex = 0, + const long chartID = 0, + const int subWindow = 0, + const color clr = clrAqua, + const ENUM_LINE_STYLE style = STYLE_DOT, + const int width = 1, + const bool back = false, + const bool selection = false, + const bool hidden = false, + const long zOrder = 0 +) { + // + bool result = false; + + // + // Calculate Highest High ... + int hhIdx = iHighest( + _Symbol, + _Period, + MODE_HIGH, + marketLen, + bar_index + ); + + // + datetime hhTime = iTime( + _Symbol, + _Period, + hhIdx + ); + + // + datetime barTime = iTime( + _Symbol, + _Period, + bar_index + ); + + // + datetime drawUntilTime = + drawUntilBarIndex != bar_index ? + iTime( + _Symbol, + _Period, + drawUntilBarIndex + ) : + barTime + ; + + // + double hh = iHigh( + _Symbol, + _Period, + hhIdx + ); + + // + int rnd = rand(); + + // + // Define Label ... + string lbl = StringConcatenate( + tag, + "_HH(", marketLen ,")_", + hh, + "_", rnd + ); + + // + result = ObjectDelete( + chartID, + lbl + ); + + // + // Draw a Trend Line ... + result = DrawTrendLine( + chartID, + lbl, + subWindow, + hhTime, + hh, + drawUntilTime, + hh, + clr, + style, + width, + back, + selection, + hidden, + zOrder + ); + + // + return result; +} + +// +// Draw Lowest Low ... +bool DrawLowestLow( + const int bar_index, + const int marketLen, + const string tag, + const int drawUntilBarIndex = 0, + const long chartID = 0, + const int subWindow = 0, + const color clr = clrFuchsia, + const ENUM_LINE_STYLE style = STYLE_DOT, + const int width = 1, + const bool back = false, + const bool selection = false, + const bool hidden = false, + const long zOrder = 0 +) { + // + bool result = false; + + // + // Calculate Highest High ... + int llIdx = iLowest( + _Symbol, + _Period, + MODE_LOW, + marketLen, + bar_index + ); + + // + datetime llTime = iTime( + _Symbol, + _Period, + llIdx + ); + + // + datetime barTime = iTime( + _Symbol, + _Period, + bar_index + ); + + // + datetime drawUntilTime = + drawUntilBarIndex != bar_index ? + iTime( + _Symbol, + _Period, + drawUntilBarIndex + ) : + barTime + ; + + // + double ll = iLow( + _Symbol, + _Period, + llIdx + ); + + // + int rnd = rand(); + + // + // Define Label ... + string lbl = StringConcatenate( + tag, + "_LL(", marketLen ,")_", + ll, + "_", rnd + ); + + // + result = ObjectDelete( + chartID, + lbl + ); + + // + // Draw a Trend Line ... + result = DrawTrendLine( + chartID, + lbl, + subWindow, + llTime, + ll, + drawUntilTime, + ll, + clr, + style, + width, + back, + selection, + hidden, + zOrder + ); + + // + return result; +} + +// +// Draw Market Middle ... +bool DrawMarketMiddle( + const int bar_index, + const int marketLen, + const string tag, + const int drawUntilBarIndex = 0, + const long chartID = 0, + const int subWindow = 0, + const color clr = clrYellow, + const ENUM_LINE_STYLE style = STYLE_DOT, + const int width = 1, + const bool back = false, + const bool selection = false, + const bool hidden = false, + const long zOrder = 0 +) { + // + bool result = false; + + // + // Calculate Highest High ... + int llIdx = iLowest( + _Symbol, + _Period, + MODE_LOW, + marketLen, + bar_index + ); + + // + datetime llTime = iTime( + _Symbol, + _Period, + llIdx + ); + + // + double ll = iLow( + _Symbol, + _Period, + llIdx + ); + + // + // Calculate Highest High ... + int hhIdx = iHighest( + _Symbol, + _Period, + MODE_HIGH, + marketLen, + bar_index + ); + + // + datetime hhTime = iTime( + _Symbol, + _Period, + hhIdx + ); + + // + double hh = iHigh( + _Symbol, + _Period, + hhIdx + ); + + // + double middle = ll + ((hh - ll) / 2); + datetime middleTime = hhIdx < llIdx + ? hhTime + : llTime + ; + + // + datetime barTime = iTime( + _Symbol, + _Period, + bar_index + ); + + // + datetime drawUntilTime = + drawUntilBarIndex != bar_index ? + iTime( + _Symbol, + _Period, + drawUntilBarIndex + ) : + barTime + ; + + // + int rnd = rand(); + + // + // Define Label ... + string lbl = StringConcatenate( + tag, + "_MID(", marketLen ,")_", + middle, + "_", rnd + ); + + // + result = ObjectDelete( + chartID, + lbl + ); + + // + // Draw a Trend Line ... + result = DrawTrendLine( + chartID, + lbl, + subWindow, + middleTime, + middle, + drawUntilTime, + middle, + clr, + style, + width, + back, + selection, + hidden, + zOrder + ); + + // + return result; +} + +// +// 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 = OBJ_ARROW_UP, // 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(); + + // + // create an arrow ... + if(!ObjectCreate(chartID, name, OBJ_ARROW, subWindow, time, price)) { + // + string message = StringConcatenate(__FUNCTION__, + ": failed to create an arrow! Error code = ", + GetLastError() + ); + + // + LogMessage(message); + + // + return(false); + } + + // + // set the arrow code ... + ObjectSetInteger(chartID, name, OBJPROP_ARROWCODE, arrowCode); + + // + // set anchor type ... + ObjectSetInteger(chartID, name, OBJPROP_ANCHOR, anchor); + + // + // set the arrow color ... + ObjectSetInteger(chartID, name, OBJPROP_COLOR, clr); + + // + // set the border line style ... + ObjectSetInteger(chartID, name, OBJPROP_STYLE, style); + + // + // set the arrow's size ... + 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 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,name, OBJPROP_SELECTABLE, true); + 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); +} + +// +// 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 = StringConcatenate( + __FUNCTION__, + ": failed to move the anchor point! Error code = ",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 = StringConcatenate( + __FUNCTION__, + ": failed to delete an arrow! Error code = ",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 = StringConcatenate( + __FUNCTION__, + ": failed to change the arrow code! Error code = ",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 = StringConcatenate( + __FUNCTION__, + ": failed to change anchor type! Error code = ",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(); + + // + // create a horizontal line ... + if(!ObjectCreate(chartID, name, OBJ_HLINE, subWindow, 0, price)) { + // + string message = StringConcatenate( + __FUNCTION__, + ": failed to create a horizontal line! Error code = ",GetLastError() + ); + + // + LogMessage(message); + + // + return(false); + } + + // + // set line color ... + ObjectSetInteger(chartID, name, OBJPROP_COLOR, clr); + + // + // set line display style ... + ObjectSetInteger(chartID, name, OBJPROP_STYLE, style); + + // + // set line width ... + 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 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, 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); +} + +// +// 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 = StringConcatenate( + __FUNCTION__, + ": failed to move the horizontal line! Error code = ",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 = StringConcatenate( + __FUNCTION__, + ": failed to delete a horizontal line! Error code = ",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 sub_window = 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(); + + // + // create a vertical line ... + if (!ObjectCreate(chartID, name, OBJ_VLINE, sub_window, time, 0)) { + // + string message = StringConcatenate( + __FUNCTION__, + ": failed to create a vertical line! Error code = ", GetLastError() + ); + + // + LogMessage(message); + + // + return false; + } + + // + // set line color ... + ObjectSetInteger(chartID, name, OBJPROP_COLOR, clr); + + // + // set line display style ... + ObjectSetInteger(chartID, name, OBJPROP_STYLE, style); + + // + // set line width ... + 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 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, name, OBJPROP_SELECTABLE, true); + 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; +} + +// +// 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 = StringConcatenate( + __FUNCTION__, + ": failed to move the vertical line! Error code = ", 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 = StringConcatenate( + __FUNCTION__, + ": failed to delete the vertical line! Error code = ", 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 back_clr = C'236,233,216', // 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(); + + // + //--- create a rectangle label + if(!ObjectCreate(chartID, name, OBJ_RECTANGLE_LABEL, subWindow, 0, 0)) { + // + string message = StringConcatenate( + __FUNCTION__, + ": failed to create a rectangle label! Error code = ",GetLastError() + ); + + // + LogMessage(message); + + // + return(false); + } + + // + // set label coordinates ... + ObjectSetInteger(chartID, name, OBJPROP_XDISTANCE, x); + ObjectSetInteger(chartID, name, OBJPROP_YDISTANCE, y); + + // + // set label size ... + ObjectSetInteger(chartID, name, OBJPROP_XSIZE, width); + ObjectSetInteger(chartID, name, OBJPROP_YSIZE, height); + + // + // set background color ... + ObjectSetInteger(chartID, name, OBJPROP_BGCOLOR, back_clr); + + // + // set border type ... + ObjectSetInteger(chartID, name, OBJPROP_BORDER_TYPE, border); + + // + // set the chart's corner, relative to which point coordinates are defined ... + ObjectSetInteger(chartID, name, OBJPROP_CORNER, corner); + + // + // set flat border color (in Flat mode) ... + ObjectSetInteger(chartID, name, OBJPROP_COLOR, clr); + + // + // set flat border line style ... + ObjectSetInteger(chartID, name, OBJPROP_STYLE, style); + + // + // set flat border width ... + ObjectSetInteger(chartID, name, OBJPROP_WIDTH, lineWidth); + + // + // display in the foreground (false) or background (true) ... + ObjectSetInteger(chartID, name, OBJPROP_BACK, back); + + // + // enable (true) or disable (false) the mode of moving the label 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); +} + +// +// 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 = StringConcatenate( + __FUNCTION__, + ": failed to move X coordinate of the label! Error code = ",GetLastError() + ); + + // + LogMessage(message); + + // + return(false); + } + + // + if(!ObjectSetInteger(chartID, name, OBJPROP_YDISTANCE, y)) { + // + string message = StringConcatenate( + __FUNCTION__, + ": failed to move Y coordinate of the label! Error code = ",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 = StringConcatenate( + __FUNCTION__, + ": failed to delete a rectangle label! Error code = ",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 = StringConcatenate( + __FUNCTION__, + ": failed to change the label's width! Error code = ",GetLastError() + ); + + // + LogMessage(message); + + // + return(false); + } + + // + if(!ObjectSetInteger(chartID, name, OBJPROP_YSIZE, height)) { + // + string message = StringConcatenate( + __FUNCTION__, + ": failed to change the label's height! Error code = ",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 = StringConcatenate( + __FUNCTION__, + ": failed to change the border type! Error code = ",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(); + + // + // create a trend line by the given coordinates ... + if(!ObjectCreate(chartID, name, OBJ_TREND, subWindow, time1, price1, time2, price2)) { + // + string message = StringConcatenate( + __FUNCTION__, + ": failed to create a trend line! Error code = ", GetLastError() + ); + + // + LogMessage(message); + + // + return(false); + } + + // + // set line color ... + ObjectSetInteger(chartID, name, OBJPROP_COLOR, clr); + + // + // set line display style ... + ObjectSetInteger(chartID, name, OBJPROP_STYLE, style); + + // + // set line width ... + 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 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, name, OBJPROP_SELECTABLE, true); + ObjectSetInteger(chartID, name, OBJPROP_SELECTED, selection); + + // + // enable (true) or disable (false) the mode of continuation of the line's display to the right ... + ObjectSetInteger(chartID, name, OBJPROP_RAY_RIGHT, rayRight); + + // + // 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); +} + +// +// 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 = StringConcatenate( + __FUNCTION__, + ": failed to move the anchor point! Error code = ", 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 = StringConcatenate( + __FUNCTION__, + ": failed to delete a trend line! Error code = ", 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(); + + // + //--- create Text object + if(!ObjectCreate(chartID, name, OBJ_TEXT, subWindow, time, price)) { + // + string message = StringConcatenate( + __FUNCTION__, + ": failed to create \"Text\" object! Error code = ", GetLastError() + ); + + // + LogMessage(message); + + // + return(false); + } + + // + // 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 the slope angle of the text ... + ObjectSetDouble(chartID, name, OBJPROP_ANGLE, angle); + + // + // set anchor type ... + ObjectSetInteger(chartID, name, OBJPROP_ANCHOR, anchor); + + // + // set color ... + ObjectSetInteger(chartID, name, OBJPROP_COLOR, clr); + + // + // display in the foreground (false) or background (true) ... + ObjectSetInteger(chartID, name, OBJPROP_BACK, back); + + // + // enable (true) or disable (false) the mode of moving the object by mouse ... + ObjectSetInteger(chartID, name, OBJPROP_SELECTABLE, true); + 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); +} + +// +// 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 = StringConcatenate( + __FUNCTION__, + ": failed to move the anchor point! Error code = ", 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 = StringConcatenate( + __FUNCTION__, + ": failed to change the text! Error code = ", 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 = StringConcatenate( + __FUNCTION__, + ": failed to delete \"Text\" object! Error code = ", 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(); + + // + // Create Fibonacci Retracement by the given coordinates ... + if (!ObjectCreate(chartID, name, OBJ_FIBO, subWindow, time1, price1, time2, price2)) { + // + string message = StringConcatenate( + __FUNCTION__, + ": failed to create \"Fibonacci Retracement\"! Error code = " , GetLastError() + ); + + // + LogMessage(message); + + // + return(false); + } + + // + // set color ... + ObjectSetInteger(chartID, name, OBJPROP_COLOR, clr); + + // + // set line style ... + ObjectSetInteger(chartID, name, OBJPROP_STYLE, style); + + // + // set line width ... + 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 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, name, OBJPROP_SELECTABLE, true); + ObjectSetInteger(chartID, name, OBJPROP_SELECTED, selection); + + // + // enable (true) or disable (false) the mode of continuation of the object's display to the right ... + ObjectSetInteger(chartID, name, OBJPROP_RAY_RIGHT, rayRight); + + // + // 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); +} + +// +// 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(); + + // + // Create Fibonacci Retracement by the given coordinates ... + if (!ObjectCreate(chartID, name, OBJ_FIBO, subWindow, time1, price1, time2, price2)) { + // + string message = StringConcatenate( + __FUNCTION__, + ": failed to create \"Fibonacci Retracement\"! Error code = " , GetLastError() + ); + + // + LogMessage(message); + + // + return(false); + } + + // + // set color ... + ObjectSetInteger(chartID, name, OBJPROP_COLOR, clr); + + // + // set line style ... + ObjectSetInteger(chartID, name, OBJPROP_STYLE, style); + + // + // set line width ... + 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 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, name, OBJPROP_SELECTABLE, true); + ObjectSetInteger(chartID, name, OBJPROP_SELECTED, selection); + + // + // enable (true) or disable (false) the mode of continuation of the object's display to the right ... + ObjectSetInteger(chartID, name, OBJPROP_RAY_RIGHT, rayRight); + + // + // 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); + + // + // Change Levels Of Fibonacci ... + bool result = FibonacciLevelsSet( + levels, + values, + colors, + styles, + widths, + descriptions, + chartID, + name + ); + + // + // 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 = StringConcatenate( + __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 = StringConcatenate( + __FUNCTION__, + ": failed to move the anchor point! Error code = ", 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 = StringConcatenate( + __FUNCTION__, + ": failed to delete \"Fibonacci Retracement\"! Error code = ", 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 General Functions ... +// +// +// Remove all Drawn Objects ... +void RemoveDraws(const string &tag) { + // + for(int iObj=ObjectsTotal()-1; iObj >= 0; iObj--) { + // + string on = ObjectName(iObj); + if (StringFind(on, tag) == 0) { + ObjectDelete(on); + } + } +} +// +// End General Functions ... +// \ No newline at end of file diff --git a/BKPS/OLD/XAUUSD-15M-V1.0/MQ4/Libraries/x-saherelm.indicator.lib.mq4 b/BKPS/OLD/XAUUSD-15M-V1.0/MQ4/Libraries/x-saherelm.indicator.lib.mq4 new file mode 100644 index 0000000..0e4b162 --- /dev/null +++ b/BKPS/OLD/XAUUSD-15M-V1.0/MQ4/Libraries/x-saherelm.indicator.lib.mq4 @@ -0,0 +1,450 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL4 Indicator Global Library +// --------------------------------------------------- +// saherelm useful tools and definitions ... +// +// +// Maintainer: +// ------------ +// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) +// +////////////////////////////////////////////////////// +#property library +#property copyright "Copyright 2023, SaherElm IT Center" +#property link "https://www.saherelm.ir" +#property version "1.00" +#property strict + +// +// Includes library ... +#include "../Libraries/x-saherelm.lib.mq4" + +// +// Includes Models library ... +#include "../Libraries/x-saherelm.models.lib.mq4" + +// +// START Global Requirement Functions ... +// +// +// Reading specified Buffer From ADX Indicator ... +double ReadXMABuffer( + const int bar_index, + const int buffer_index, + // + const int marketLen, + // + const double stp, + const double mxm, + // + const int shortCycleMult, + const int mediumCycleMult, + const int longCycleMult +) { + // + string xmaIndicatorName = "x-saherelm.x.xma"; + + // + double result = iCustom( + _Symbol, + _Period, + xmaIndicatorName, + // + // Inputs ... + marketLen, + stp, + mxm, + shortCycleMult, + mediumCycleMult, + longCycleMult, + MODE_SMA, + // + buffer_index, + bar_index + ); + + // + return result; +} + +// +// Reading specified Buffer from XHL Indicator ... +double ReadXHLBuffer( + const int bar_index, + const int buffer_index, + // + const int marketLen, + // + const int shortCycleMult, + const int mediumCycleMult, + const int longCycleMult +) { + // + string xhlIndicatorName = "x-saherelm.x.hl"; + + // + double result = iCustom( + _Symbol, + _Period, + xhlIndicatorName, + // + // Inputs ... + marketLen, + shortCycleMult, + mediumCycleMult, + longCycleMult, + MODE_SMA, + // + buffer_index, + bar_index + ); + + // + return result; +} + +// +// Reading ADX Values ... +double ReadADX( + const int bar_index, + const int marketLen, + const int mult +) { + // + double result; + + // + int period = marketLen * mult; + + // + result = iADX( + _Symbol, + _Period, + period, + PRICE_CLOSE, + MODE_MAIN, + bar_index + ); + + // + return result; +} + +// +// Reading Pivot States ... +XPvtState GetPVTState( + const int bar_index, + const int marketLen +) { + // + XPvtState result = {}; + + // + double hh = GetMarketHighestHigh( + bar_index, + marketLen + ); + + // + double ho = GetMarketHighestOpen( + bar_index, + marketLen + ); + + // + double hc = GetMarketHighestClose( + bar_index, + marketLen + ); + + // + double hl = GetMarketHighestLow( + bar_index, + marketLen + ); + + // + double ll = GetMarketLowestLow( + bar_index, + marketLen + ); + + // + double lo = GetMarketLowestOpen( + bar_index, + marketLen + ); + + // + double lc = GetMarketLowestClose( + bar_index, + marketLen + ); + + // + double lh = GetMarketLowestHigh( + bar_index, + marketLen + ); + + // + // Filling Result ... + // + result.hh = hh; + result.ho = ho; + result.hc = hc; + result.hl = hl; + + // + result.ll = ll; + result.lo = lo; + result.lc = lc; + result.lh = lh; + + // + return result; +} + +// +// Calculate XRange from Market ... +static XRState lastXRState; +XRState GetXRange( + const int bar_index, + const int rangeMarketLength +) { + // + XRState result = {}; + + // + datetime barTime = iTime( + _Symbol, + _Period, + bar_index + ); + + // + int marketBarIndex = bar_index + rangeMarketLength; + + // + // Highest High ... + // + int hhIdx = iHighest( + _Symbol, + _Period, + MODE_HIGH, + marketBarIndex, + bar_index + ); + + // + double hh = iHigh( + _Symbol, + _Period, + hhIdx + ); + + // + // Lowest Low ... + // + int llIdx = iLowest( + _Symbol, + _Period, + MODE_LOW, + marketBarIndex, + bar_index + ); + + // + double ll = iLow( + _Symbol, + _Period, + llIdx + ); + + // + if (lastXRState.start == 0) { + // + lastXRState.start = barTime; + lastXRState.length = rangeMarketLength; + + // + lastXRState.hh = hh; + lastXRState.ll = ll; + + // + // Middle ... + double mid = (hh + ll) / 2; + lastXRState.mid = mid; + } else { + // + int startBarIndex = iBarShift( + _Symbol, + _Period, + lastXRState.start + ); + + // + if (startBarIndex - bar_index >= rangeMarketLength) { + // + lastXRState.start = barTime; + lastXRState.length = rangeMarketLength; + + // + lastXRState.hh = hh; + lastXRState.ll = ll; + + // + // Middle ... + double mid = (hh + ll) / 2; + lastXRState.mid = mid; + } + } + + // + result = lastXRState; + + // + return result; +} + +// +// Reading XTPowState from Indicatoe ... +XTPOWState GetXTPowState( + const int bar_index, + const int marketLen +) { + // + XTPOWState result = {}; + + // + // + double powerUp = 0; + double powerDown = 0; + double signal = 0; + + // + string indicatorName = "x-saherelm.xtpow"; + + // + int pUpIndex = 0; + int pDownIndex = 1; + int signalIndex = 2; + + // + powerUp = iCustom( + _Symbol, + _Period, + indicatorName, + // + marketLen, + // + pUpIndex, + bar_index + ); + + // + powerDown = iCustom( + _Symbol, + _Period, + indicatorName, + // + marketLen, + // + pDownIndex, + bar_index + ); + + // + signal = iCustom( + _Symbol, + _Period, + indicatorName, + // + marketLen, + // + signalIndex, + bar_index + ); + + // + result.signal = signal; + result.powerUp = powerUp; + result.powerDown = powerDown; + + // + return result; +} + +// +// Reading XRState From Indicator ... +XRState ReadXRange( + const int bar_index, + const int marketLen +) { + // + XRState result = {}; + + // + // Define Buffer Indexes ... + int hhBufferIndex = 0; + int llBufferIndex = 1; + int midBufferIndex = 2; + + // + string indicatorName = "x-saherelm.xrange"; + + // + // Read Values From XRange Indicator ... + + // + double hh = iCustom( + _Symbol, + _Period, + indicatorName, + // + // Inputs ... + marketLen, + // + hhBufferIndex, // Buffer Index ... + bar_index + ); + + // + double ll = iCustom( + _Symbol, + _Period, + indicatorName, + // + // Inputs ... + marketLen, + // + llBufferIndex, // Buffer Index ... + bar_index + ); + + // + double mid = iCustom( + _Symbol, + _Period, + indicatorName, + // + // Inputs ... + marketLen, + // + midBufferIndex, // Buffer Index ... + bar_index + ); + + // + // Filling Result ... + result.hh = hh; + result.ll = ll; + result.mid = mid; + + // + return result; +} +// +// END Indicator Reading Data ... +// diff --git a/BKPS/OLD/XAUUSD-15M-V1.0/MQ4/Libraries/x-saherelm.lib.mq4 b/BKPS/OLD/XAUUSD-15M-V1.0/MQ4/Libraries/x-saherelm.lib.mq4 new file mode 100644 index 0000000..9cbc3d6 --- /dev/null +++ b/BKPS/OLD/XAUUSD-15M-V1.0/MQ4/Libraries/x-saherelm.lib.mq4 @@ -0,0 +1,1695 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL4 Global Library +// --------------------------------------------- +// saherelm useful tools and definitions ... +// +// +// Maintainer: +// ------------ +// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) +// +////////////////////////////////////////////////////// +#property library +#property copyright "Copyright 2023, SaherElm IT Center" +#property link "https://www.saherelm.ir" +#property version "1.00" +#property strict + +// +// Includes Logger library ... +#include "../Libraries/x-saherelm.log.lib.mq4" + +// +// Includes Drawing library ... +#include "../Libraries/x-saherelm.draw.lib.mq4" + +// +static datetime lastBarTime; + +// +struct XOHCL { + double high; + double open; + double close; + double low; +}; + +// +struct XRange { + // + datetime time; + + // + double highestHigh; + double lowestLow; + + // + int levels; + int marketLength; + + // + double rate; +}; + +// +struct XPrice { + // + double askPrice; + double bidPrice; + double priceGap; + + // + double longEntry; + double longExit; + + // + double shortEntry; + double shortExit; +}; + +// +// START Functions ... +// + +// +// Determines current working is New Bar or not ... +bool IsNewBar() { + // + // Reading Last Bar Date ... + datetime curbar = (datetime)SeriesInfoInteger( + _Symbol, + _Period, + SERIES_LASTBAR_DATE + ); + + // + if(lastBarTime != curbar) { + // + lastBarTime = curbar; + return true; + } + + // + return false; +} + +// +// Determines we are in new Day or not ... +bool IsNewDay() { + // + bool result = false; + + // + // Reading Last Bar Date ... + datetime curbar = (datetime)SeriesInfoInteger( + _Symbol, + _Period, + SERIES_LASTBAR_DATE + ); + + // + if (lastBarTime == 0) { + lastBarTime = curbar; + } + + // + if (curbar == lastBarTime) { + return result; + } + + // + // Retrieve Day and Month and Year for Last Bar Time ... + int lastBarDay = TimeDay(lastBarTime); + int lastBarMonth = TimeMonth(lastBarTime); + int lastBarYear = TimeYear(lastBarTime); + + // + // Retrieve Day and Month and Year for Current Bar Time ... + int curBarDay = TimeDay(curbar); + int curBarMonth = TimeMonth(curbar); + int curBarYear = TimeYear(curbar); + + // + result = curBarDay > lastBarDay + || curBarMonth > lastBarMonth + || curBarYear > lastBarYear; + + // + return result; +} + +// +// Determines we are in new Hour or not ... +bool IsNewHour() { + // + // Save Last Hour value ... + static int lastHour = 0; + + // + bool isInNewDay = IsNewDay(); + if (isInNewDay) { + // + // Reset Last Hour if it's in New Day ... + lastHour = 0; + } + + // + // Retrieve Current Hour value ... + int currentHour = Hour(); + + // + // Check values ... + bool result = currentHour > lastHour; + if (result) { + // + // Update Last Hour value ... + lastHour = currentHour; + } + + // + // returns result ... + return result; +} + +// +// Retrieve Number of Candles in a Day ... +int GetDailyCandleCount() { + // + int seconds = PeriodSeconds(_Period); + + // + int daySeconds = 24 * 60 * 60; + + // + int result = daySeconds / seconds; + + // + return result; +} + +// +// XRange Detector ... +XRange GetMarketRange( + const int bar_index, + const int marketLen, + const int levels +) { + // + XRange result = {}; + + // + result.levels = levels; + result.marketLength = marketLen; + + // + datetime time = iTime( + _Symbol, + _Period, + bar_index + ); + result.time = time; + + // + double highestHigh = GetMarketHighestHigh( + bar_index, + marketLen + ); + result.highestHigh = highestHigh; + + // + double lowestLow = GetMarketLowestLow( + bar_index, + marketLen + ); + result.lowestLow = lowestLow; + + // + double diff = highestHigh - lowestLow; + double rate = diff / levels; + + // + result.rate = rate; + + // + return result; +} + +// +// Retrieve RMA on Specific Candle ... +double GetRMA( + int bar_index, + int length +) { + // + double shortSMA = iMA(_Symbol, _Period, length, 0, MODE_SMA, PRICE_CLOSE, bar_index); + double mediumSMA = iMA(_Symbol, _Period, length * 2, 0, MODE_SMA, PRICE_CLOSE, bar_index); + double longSMA = iMA(_Symbol, _Period, length * 3, 0, MODE_SMA, PRICE_CLOSE, bar_index); + + // + double result = longSMA - mediumSMA + shortSMA; + + // + return result; +} + +// +// Retrieve Moving Average ... +double GetMA( + const int bar_index, + const int maLength, + const int maShift, + const ENUM_MA_METHOD maMethod, + const ENUM_APPLIED_PRICE appliedPrice +) { + // + double result = iMA( + _Symbol, + _Period, + maLength, + maShift, + maMethod, + appliedPrice, + bar_index + ); + + // + 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; +} + +// +// Retrieve True Range ... +double GetTR( + const int bar_index +) { + // + double result = 0; + + // + double high = iHigh( + _Symbol, + _Period, + bar_index + ); + + // + double low = iLow( + _Symbol, + _Period, + bar_index + ); + + // + double prevClose = iClose( + _Symbol, + _Period, + bar_index + 1 + ); + + // + double highLowDif = high - low; + double hpCDif = MathAbs(high - prevClose); + double lpCDiff = MathAbs(low - prevClose); + + // + result = MathMax(highLowDif, hpCDif); + result = MathMax(result, lpCDiff); + + // + return result; +} + +// +// Calculate True Range Simple Moving Average ... +double GetMarketTRSMA( + const int bar_index, + const int marketLen +) { + // + double result = 0; + + // + // Create Barket Length Trs ... + double trs[]; + ArrayResize( + trs, + marketLen + ); + int index = 0; + double trSum = 0; + for (int i = bar_index; i < bar_index + marketLen; i++) { + // + double tr = GetTR(i); + trs[index] = tr; + + // + trSum += tr; + + // + index++; + } + + // + result = trSum / marketLen; + + // + return result; +} + +// +// Retrieve Commodity Channel ... +double GetMarketCCI( + const int bar_index, + const int marketLen, + const ENUM_APPLIED_PRICE appliedPrice = PRICE_CLOSE +) { + // + double result = 0; + + // + result = iCCI( + _Symbol, + _Period, + marketLen, + appliedPrice, + bar_index + ); + + // + return result; +} + +// +// this function check crossing up two Buffers ... +bool IsCrossedOver( + double &arr1[], + double &arr2[], + int index1, + int index2 = -1 +) { + // + // Normalize Index 2 Value ... + if (index2 < 0) { + index2 = index1 + 1; + } + + // + bool result = (arr1[index1] > arr2[index1]) && !(arr1[index2] > arr2[index2]); + + // + return result; +} + +// +// this function check crossing down two Buffers ... +bool IsCrossedUnder( + double &arr1[], + double &arr2[], + int index1, + int index2 = -1 +) { + // + // Normalize Index 2 Value ... + if (index2 < 0) { + index2 = index1 + 1; + } + + // + bool result = (arr1[index1] < arr2[index1]) && !(arr1[index2] < arr2[index2]); + + // + return result; +} + +// +// Convert points to Actual Point ... +double PointsToDouble(int points) { + // + double result = points * _Point; + return result; +} + +// +// Converts Pips to Points ... +int PipsToPoints(int pips) { + // + int result = pips * ((_Digits == 3 || _Digits == 5) ? 10 : 1); + return result; +} + +// +// Converts Pips to Double ... +double PipsToDouble(int pips) { + // + double result = PointsToDouble(PipsToPoints(pips)); + return result; +} + +// +// Converts Double Value to Pips ... +int PriceToPips(double value) { + // + if (value <= 0) { + return 0; + } + + // + double pipValue = _Point * MathPow(10, _Digits); + int result = (int)(value / pipValue); + + // + return result; +} + +// +// Converts Pips to Double ... +double PipsToPrice(int pips) { + // + if (pips <= 0) { + return 0; + } + + // + double pipValue = _Point * MathPow(10, _Digits); + double result = pipValue * pips; + + // + return result; +} + +// +// Generate ATR StopLoss Value ... +double CalculateATRSL( + int period, + double multiplier +) { + // + if (period <= 0 || multiplier <= 0) { + return 0; + } + + // + double atrValue = iATR( + _Symbol, + _Period, + period, + 0 + ); + + // + double result = atrValue * multiplier; + + // + return result; +} + +// +// Detect Candle Type ... +// Bullish => means close > open ... +bool IsBullishCandle( + const int bar_index +) { + // + // Temp Result ... + bool result = false; + + // + if (bar_index < 0) { + return result; + } + + // + double open = iOpen( + _Symbol, + _Period, + bar_index + ); + + // + double close = iClose( + _Symbol, + _Period, + bar_index + ); + + // + result = IsBullishCandle( + open, + close + ); + + // + return result; +} + +bool IsBullishCandle( + const double open, + const double close +) { + // + // Temp Result ... + bool result = false; + + // + result = open < close; + + // + return result; +} + +// +// Detect Candle Type ... +// Bearish => means close < open ... +bool IsBearishCandle( + const int bar_index +) { + // + // Temp Result ... + bool result = false; + + // + if (bar_index < 0) { + return result; + } + + // + double open = iOpen( + _Symbol, + _Period, + bar_index + ); + + // + double close = iClose( + _Symbol, + _Period, + bar_index + ); + + // + result = IsBearishCandle( + open, + close + ); + + // + return result; +} + +bool IsBearishCandle( + const double open, + const double close +) { + // + // Temp Result ... + bool result = false; + + // + result = open > close; + + // + return result; +} + +// +// Retrieve a Candle Info ... +XOHCL GetCandleModel( + const int bar_index +) { + // + XOHCL result = {}; + + // + double high = iHigh( + _Symbol, + _Period, + bar_index + ); + result.high = high; + + // + double open = iOpen( + _Symbol, + _Period, + bar_index + ); + result.open = open; + + // + double close = iClose( + _Symbol, + _Period, + bar_index + ); + result.close = close; + + // + double low = iLow( + _Symbol, + _Period, + bar_index + ); + result.low = low; + + // + return result; +} + +// +// Retrieve Market Current Prices for Signals ... +XPrice GetPrice() { + // + XPrice result = {}; + + // + RefreshRates(); + + // + double askPrice = SymbolInfoDouble( + _Symbol, + SYMBOL_ASK + ); + + // + double bidPrice = SymbolInfoDouble( + _Symbol, + SYMBOL_BID + ); + + // + double priceGap = MathAbs(bidPrice - askPrice); + + // + result.askPrice = askPrice; + result.bidPrice = bidPrice; + result.priceGap = priceGap; + + // + result.longEntry = askPrice; + result.longExit = bidPrice; + + // + result.shortEntry = bidPrice; + result.shortExit = askPrice; + + // + return result; +} + +// +// Detect Market Has Sharp Bullish or not ... +bool IsSharpBullishDetected( + const int bar_index, // Bar Index ... + const int marketLen, // Market Length ... + // + const double shpDetectMultipliers // Sharp Detect Multiplier +) { + // + bool result = false; + + // + double open = iOpen( + _Symbol, + _Period, + bar_index + ); + + // + double close = iClose( + _Symbol, + _Period, + bar_index + ); + + // + double high = iHigh( + _Symbol, + _Period, + bar_index + ); + + // + double low = iLow( + _Symbol, + _Period, + bar_index + ); + + // + double minValue = 0; + double maxValue = 0; + int positionedLength = bar_index + marketLen; + + // + for (int i = bar_index; i < positionedLength; i++) { + // + double cHigh = iHigh( + _Symbol, + _Period, + i + ); + + // + double cLow = iLow( + _Symbol, + _Period, + i + ); + + // + minValue += MathMin(cLow, cHigh); + maxValue += MathMax(cLow, cHigh); + } + + // + double minAvg = minValue / positionedLength; + double maxAvg = maxValue / positionedLength; + + // + double shpValue = shpDetectMultipliers * _Point; + + // + result = (low - minAvg) > shpValue; + + // + int index = bar_index; + while ( + index < positionedLength + || !result + ) { + // + low = iLow( + _Symbol, + _Period, + index + ); + + // + result = result + || (low - minAvg) > shpValue; + + // + index++; + }; + + // + return result; +} + +// +// Detect Market Has Sharp Bullish or not ... +bool IsSharpBearishDetected( + const int bar_index, // Bar Index ... + const int marketLen, // Market Length ... + // + const double shpDetectMultipliers // Sharp Detect Multiplier +) { + // + bool result = false; + + // + double open = iOpen( + _Symbol, + _Period, + bar_index + ); + + // + double close = iClose( + _Symbol, + _Period, + bar_index + ); + + // + double high = iHigh( + _Symbol, + _Period, + bar_index + ); + + // + double low = iLow( + _Symbol, + _Period, + bar_index + ); + + // + double minValue = 0; + double maxValue = 0; + int positionedLength = bar_index + marketLen; + + // + for (int i = bar_index; i < positionedLength; i++) { + // + double cHigh = iHigh( + _Symbol, + _Period, + i + ); + + // + double cLow = iLow( + _Symbol, + _Period, + i + ); + + // + minValue += MathMin(cLow, cHigh); + maxValue += MathMax(cLow, cHigh); + } + + // + double minAvg = minValue / positionedLength; + double maxAvg = maxValue / positionedLength; + + // + double shpValue = shpDetectMultipliers * _Point; + + // + result = (high - maxAvg) > shpValue; + + // + int index = bar_index; + while ( + index < positionedLength + || !result + ) { + // + high = iHigh( + _Symbol, + _Period, + index + ); + + // + result = result + || (high - maxAvg) > shpValue; + + // + index++; + }; + + // + return result; +} + +// +// Retrieve Highest High Value based on Given Market ... +double GetMarketHighestHigh( + // + const int bar_index, // Bar Index ... + const int marketLen // Market Length ... +) { + // + // Empty Result ... + double result = 0.0; + + // + // Retrieve Desired Bar Index ... + int foundedBarIndex = iHighest( + _Symbol, + _Period, + MODE_HIGH, + marketLen, + bar_index + ); + + // + // Retrieve Price ... + result = iHigh( + _Symbol, + _Period, + foundedBarIndex + ); + + // + return result; +} + +// +// Retrieve Highest Low Value based on Given Market ... +double GetMarketHighestLow( + // + const int bar_index, // Bar Index ... + const int marketLen // Market Length ... +) { + // + // Empty Result ... + double result = 0.0; + + // + // Retrieve Desired Bar Index ... + int foundedBarIndex = iHighest( + _Symbol, + _Period, + MODE_LOW, + marketLen, + bar_index + ); + + // + // Retrieve Price ... + result = iLow( + _Symbol, + _Period, + foundedBarIndex + ); + + // + return result; +} + +// +// Retrieve Highest Open Value based on Given Market ... +double GetMarketHighestOpen( + // + const int bar_index, // Bar Index ... + const int marketLen // Market Length ... +) { + // + // Empty Result ... + double result = 0.0; + + // + // Retrieve Desired Bar Index ... + int foundedBarIndex = iHighest( + _Symbol, + _Period, + MODE_OPEN, + marketLen, + bar_index + ); + + // + // Retrieve Price ... + result = iOpen( + _Symbol, + _Period, + foundedBarIndex + ); + + // + return result; +} + +// +// Retrieve Highest Close Value based on Given Market ... +double GetMarketHighestClose( + // + const int bar_index, // Bar Index ... + const int marketLen // Market Length ... +) { + // + // Empty Result ... + double result = 0.0; + + // + // Retrieve Desired Bar Index ... + int foundedBarIndex = iHighest( + _Symbol, + _Period, + MODE_CLOSE, + marketLen, + bar_index + ); + + // + // Retrieve Price ... + result = iClose( + _Symbol, + _Period, + foundedBarIndex + ); + + // + return result; +} + +// +// Retrieve Lowest Low Value based on Given Market ... +double GetMarketLowestLow( + // + const int bar_index, // Bar Index ... + const int marketLen // Market Length ... +) { + // + // Empty Result ... + double result = 0.0; + + // + // Retrieve Desired Bar Index ... + int foundedBarIndex = iLowest( + _Symbol, + _Period, + MODE_LOW, + marketLen, + bar_index + ); + + // + // Retrieve Price ... + result = iLow( + _Symbol, + _Period, + foundedBarIndex + ); + + // + return result; +} + +// +// Retrieve Lowest High Value based on Given Market ... +double GetMarketLowestHigh( + // + const int bar_index, // Bar Index ... + const int marketLen // Market Length ... +) { + // + // Empty Result ... + double result = 0.0; + + // + // Retrieve Desired Bar Index ... + int foundedBarIndex = iLowest( + _Symbol, + _Period, + MODE_HIGH, + marketLen, + bar_index + ); + + // + // Retrieve Price ... + result = iHigh( + _Symbol, + _Period, + foundedBarIndex + ); + + // + return result; +} + +// +// Retrieve Lowest Open Value based on Given Market ... +double GetMarketLowestOpen( + // + const int bar_index, // Bar Index ... + const int marketLen // Market Length ... +) { + // + // Empty Result ... + double result = 0.0; + + // + // Retrieve Desired Bar Index ... + int foundedBarIndex = iLowest( + _Symbol, + _Period, + MODE_OPEN, + marketLen, + bar_index + ); + + // + // Retrieve Price ... + result = iOpen( + _Symbol, + _Period, + foundedBarIndex + ); + + // + return result; +} + +// +// Retrieve Lowest Close Value based on Given Market ... +double GetMarketLowestClose( + // + const int bar_index, // Bar Index ... + const int marketLen // Market Length ... +) { + // + // Empty Result ... + double result = 0.0; + + // + // Retrieve Desired Bar Index ... + int foundedBarIndex = iLowest( + _Symbol, + _Period, + MODE_CLOSE, + marketLen, + bar_index + ); + + // + // Retrieve Price ... + result = iClose( + _Symbol, + _Period, + foundedBarIndex + ); + + // + return result; +} + +// +// Find last Candle which it's Low Price is +// less than given price ... +double GetLowLessCandlePrice( + // + const int bar_index, // Bar Index ... + const double price // Position Open Price ... +) { + // + int index = bar_index + 1; + double result = iLow( + _Symbol, + _Period, + index + ); + + // + while (result >= price) { + // + index++; + + // + result = iLow( + _Symbol, + _Period, + index + ); + } + + // + return result; +} +int GetLowLessCandleIndex( + // + const int bar_index, // Bar Index ... + const double price // Position Open Price ... +) { + // + int result = bar_index + 1; + double cP = iLow( + _Symbol, + _Period, + result + ); + + // + while (cP >= price) { + // + result++; + + // + cP = iLow( + _Symbol, + _Period, + result + ); + } + + // + return result; +} + +// +// Find last Candle which it's Low Price is +// great than given price ... +double GetLowGreatCandlePrice( + // + const int bar_index, // Bar Index ... + const double price // Position Open Price ... +) { + // + int index = bar_index + 1; + double result = iLow( + _Symbol, + _Period, + index + ); + + // + while (result >= price) { + // + index++; + + // + result = iLow( + _Symbol, + _Period, + index + ); + } + + // + return result; +} +int GetLowGreatCandleIndex( + // + const int bar_index, // Bar Index ... + const double price // Position Open Price ... +) { + // + int result = bar_index + 1; + double cP = iLow( + _Symbol, + _Period, + result + ); + + // + while (cP >= price) { + // + result++; + + // + cP = iLow( + _Symbol, + _Period, + result + ); + } + + // + return result; +} + +// +// Find last Candle which it's High Price is +// less than given price ... +double GetHighLessCandlePrice( + // + const int bar_index, // Bar Index ... + const double price // Position Open Price ... +) { + // + int index = bar_index + 1; + double result = iHigh( + _Symbol, + _Period, + index + ); + + // + while (result >= price) { + // + index++; + + // + result = iLow( + _Symbol, + _Period, + index + ); + } + + // + return result; +} +int GetHighLessCandleIndex( + // + const int bar_index, // Bar Index ... + const double price // Position Open Price ... +) { + // + int result = bar_index + 1; + double cP = iHigh( + _Symbol, + _Period, + result + ); + + // + while (cP >= price) { + // + result++; + + // + cP = iLow( + _Symbol, + _Period, + result + ); + } + + // + return result; +} + +// +// Find last Candle which it's High Price is +// great than given price ... +double GetHighGreatCandlePrice( + // + const int bar_index, // Bar Index ... + const double price // Position Open Price ... +) { + // + int index = bar_index + 1; + double result = iHigh( + _Symbol, + _Period, + index + ); + + // + while (result <= price) { + // + index++; + + // + result = iLow( + _Symbol, + _Period, + index + ); + } + + // + return result; +} +int GetHighGreatCandleIndex( + // + const int bar_index, // Bar Index ... + const double price // Position Open Price ... +) { + // + int result = bar_index + 1; + double cP = iHigh( + _Symbol, + _Period, + result + ); + + // + while (cP <= price) { + // + result++; + + // + cP = iLow( + _Symbol, + _Period, + result + ); + } + + // + return result; +} + +// +// Find last Candle which it's Open Price is +// less than given price ... +double GetOpenLessCandlePrice( + // + const int bar_index, // Bar Index ... + const double price // Position Open Price ... +) { + // + int index = bar_index + 1; + double result = iOpen( + _Symbol, + _Period, + index + ); + + // + while (result >= price) { + // + index++; + + // + result = iLow( + _Symbol, + _Period, + index + ); + } + + // + return result; +} +int GetOpenLessCandleIndex( + // + const int bar_index, // Bar Index ... + const double price // Position Open Price ... +) { + // + int result = bar_index + 1; + double cP = iOpen( + _Symbol, + _Period, + result + ); + + // + while (cP >= price) { + // + result++; + + // + cP = iLow( + _Symbol, + _Period, + result + ); + } + + // + return result; +} + +// +// Find last Candle which it's Open Price is +// less than given price ... +double GetOpenGreatCandlePrice( + // + const int bar_index, // Bar Index ... + const double price // Position Open Price ... +) { + // + int index = bar_index + 1; + double result = iOpen( + _Symbol, + _Period, + index + ); + + // + while (result <= price) { + // + index++; + + // + result = iLow( + _Symbol, + _Period, + index + ); + } + + // + return result; +} +int GetOpenGreatCandleIndex( + // + const int bar_index, // Bar Index ... + const double price // Position Open Price ... +) { + // + int result = bar_index + 1; + double cP = iOpen( + _Symbol, + _Period, + result + ); + + // + while (cP <= price) { + // + result++; + + // + cP = iLow( + _Symbol, + _Period, + result + ); + } + + // + return result; +} + +// +// Find last Candle which it's Close Price is +// less than given price ... +double GetCloseLessCandlePrice( + // + const int bar_index, // Bar Index ... + const double price // Position Open Price ... +) { + // + int index = bar_index + 1; + double result = iClose( + _Symbol, + _Period, + index + ); + + // + while (result >= price) { + // + index++; + + // + result = iLow( + _Symbol, + _Period, + index + ); + } + + // + return result; +} +int GetCloseLessCandleIndex( + // + const int bar_index, // Bar Index ... + const double price // Position Open Price ... +) { + // + int result = bar_index + 1; + double cP = iClose( + _Symbol, + _Period, + result + ); + + // + while (cP >= price) { + // + result++; + + // + cP = iLow( + _Symbol, + _Period, + result + ); + } + + // + return result; +} + +// +// Find last Candle which it's Close Price is +// great than given price ... +double GetCloseGreatCandlePrice( + // + const int bar_index, // Bar Index ... + const double price // Position Open Price ... +) { + // + int index = bar_index + 1; + double result = iClose( + _Symbol, + _Period, + index + ); + + // + while (result <= price) { + // + index++; + + // + result = iLow( + _Symbol, + _Period, + index + ); + } + + // + return result; +} +int GetCloseGreatCandleIndex( + // + const int bar_index, // Bar Index ... + const double price // Position Open Price ... +) { + // + int result = bar_index + 1; + double cP = iClose( + _Symbol, + _Period, + result + ); + + // + while (cP <= price) { + // + result++; + + // + cP = iLow( + _Symbol, + _Period, + result + ); + } + + // + return result; +} + +// +// Get Slope of a Line by it's two Point ... +double GetSlope( + double x1, + double y1, + double x2, + double y2 +) { + // + double result = (y2 - y1)/MathAbs(x2 - x1); + return result; +} +// +// END Functions ... +// \ No newline at end of file diff --git a/BKPS/OLD/XAUUSD-15M-V1.0/MQ4/Libraries/x-saherelm.log.lib.mq4 b/BKPS/OLD/XAUUSD-15M-V1.0/MQ4/Libraries/x-saherelm.log.lib.mq4 new file mode 100644 index 0000000..066b3f7 --- /dev/null +++ b/BKPS/OLD/XAUUSD-15M-V1.0/MQ4/Libraries/x-saherelm.log.lib.mq4 @@ -0,0 +1,91 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL4 Draw Global Library +// --------------------------------------------- +// saherelm useful tools and definitions ... +// +// +// Maintainer: +// ------------ +// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) +// +////////////////////////////////////////////////////// +#property library +#property copyright "Copyright 2023, SaherElm IT Center" +#property link "https://www.saherelm.ir" +#property version "1.00" +#property strict + +// +// Log Tag ... +static string logTag = ""; + +// +// Enable or Disable Logging ... +static bool enableLogging = false; + +// +// Start Log Messages ... +// + +// +// Logging a Message, specified for this EA ... +// using provided LogTag ... +void LogMessage(string message) { + // + if (!enableLogging) { + return; + } + + // + Print(logTag, " > ", message); +} + +// +// this used for logging series ... +void LogSeries( + double &series[], // which series to Log ... + int length = 0, // number of items to Log, 0 means all ... + int skip = 0 // number of items which skip before logging ... +) { + // + string msg = ""; + + // + int seriesSize = ArraySize(series); + if ( + skip < 0 + || length < 0 + || seriesSize == 0 + || skip > seriesSize + || skip + length > seriesSize + ) { + return; + } + + // + length = length == 0 ? + seriesSize : + length; + int start = skip > 1 ? + skip - 1 : + skip == 1 ? + 1 : + 0; + + // + // Loop through series items ... + for (int i = start; i < start + length; i++) { + // + msg += StringConcatenate( + "i[", i, "]: ", series[i], ", " + ); + } + + // + LogMessage(msg); +} +// +// End Log Messages ... +// + diff --git a/BKPS/OLD/XAUUSD-15M-V1.0/MQ4/Libraries/x-saherelm.models.lib.mq4 b/BKPS/OLD/XAUUSD-15M-V1.0/MQ4/Libraries/x-saherelm.models.lib.mq4 new file mode 100644 index 0000000..6899040 --- /dev/null +++ b/BKPS/OLD/XAUUSD-15M-V1.0/MQ4/Libraries/x-saherelm.models.lib.mq4 @@ -0,0 +1,155 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL4 Models Global Library +// --------------------------------------------- +// saherelm useful tools and definitions ... +// +// +// Maintainer: +// ------------ +// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) +// +////////////////////////////////////////////////////// +#property library +#property copyright "Copyright 2023, SaherElm IT Center" +#property link "https://www.saherelm.ir" +#property version "1.00" +#property strict + +// +// START STATIC Variables ... +// +// +static int totalSignals = 0; +static int totalLongSignals = 0; +static int totalShortSignals = 0; + +// +static double initialBalance = 0; + +// +static int countedBars = 0; +static bool isNewBar = false; +static bool isNewDay = false; +static bool isNewHour = false; +// +// END STATIC Variables ... +// + +// +// Start Models ... +// +// +// Signal Providers ... +enum ENUM_X_SIGNAL_PROVIDER { + X_UNKNOWN_PROVIDER, + X_XXX_PROVIDER, + X_XR_PROVIDER, + X_XTPW_PROVIDER +}; + +// +// these are different signal types ... +enum ENUM_X_SIGNAL_TYPE { + X_SIGNAL_NONE, + X_SIGNAL_LONG, + X_SIGNAL_SHORT, +}; + +// +// Model Market Highs and Lows ... +struct XPvtState { + // + double hh; + double ho; + double hc; + double hl; + + // + double ll; + double lo; + double lc; + double lh; +}; + +// +// we Model each signals as this type ... +struct XSignal { + // + // Signal Symbol ... + string symbol; + + // + // Signal Type ... + ENUM_X_SIGNAL_TYPE type; + + // + // Signal ID ... + int id; + + // + // Signal Ticket Number, when Opening Trade ... + int ticket; + + // + // Signal Provider ... + ENUM_X_SIGNAL_PROVIDER provider; + + // + // Target Point ... + double tp; + + // + // Stop Loss ... + double sl; + + // + // Signal Entry Price ... + double entry; + + // + // Signalling Time ... + datetime time; + + // + // Signal Comments ... + string comment; + + // + // Signal TAG ... + string tag; +}; + +// +// this is Signal Request Response model ... +struct XSignalRequest { + bool hasSignal; + XSignal signal; + ENUM_X_SIGNAL_TYPE type; + ENUM_X_SIGNAL_PROVIDER provider; +}; + +// +struct XRState { + // + datetime start; + int length; + + // + double hh; + double ll; + double mid; +}; + +// +struct XTPOWState { + // + double powerUp; + double powerDown; + + // + double signal; +}; +// +// End Models ... +// diff --git a/BKPS/OLD/XAUUSD-15M-V1.0/MQ4/Libraries/x-saherelm.signal.lib.mq4 b/BKPS/OLD/XAUUSD-15M-V1.0/MQ4/Libraries/x-saherelm.signal.lib.mq4 new file mode 100644 index 0000000..097ce74 --- /dev/null +++ b/BKPS/OLD/XAUUSD-15M-V1.0/MQ4/Libraries/x-saherelm.signal.lib.mq4 @@ -0,0 +1,1756 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL4 Signal Draw Global Library +// --------------------------------------------------- +// saherelm useful tools and definitions ... +// +// +// Maintainer: +// ------------ +// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) +// +////////////////////////////////////////////////////// +#property library +#property copyright "Copyright 2023, SaherElm IT Center" +#property link "https://www.saherelm.ir" +#property version "1.00" +#property strict + +// +// Includes library ... +#include "../Libraries/x-saherelm.lib.mq4" + +// +// Includes Indicator library ... +#include "../Libraries/x-saherelm.indicator.lib.mq4" + +// +// Includes Models library ... +#include "../Libraries/x-saherelm.models.lib.mq4" + +// +// Includes Drawing library ... +#include "../Libraries/x-saherelm.draw.lib.mq4" + +// +#include "../Libraries/x-saherelm.x.signal.lib.mq4" +#include "../Libraries/x-saherelm.xr.signal.lib.mq4" +#include "../Libraries/x-saherelm.xtpw.signal.lib.mq4" + +// +// START Global Requirement Functions ... +// +// +// END Global Requirement Functions ... +// + +// +// START Signal Related Functions ... +// +// +// Retrieve Signal Bar Index ... +int GetSignalBarIndex(XSignal &signal) { + // + // Temp Result ... + int result = -1; + + // + // Retriev Signal Bar Index ... + result = iBarShift( + _Symbol, + _Period, + signal.time + ); + + // + return result; +} + +// +string GetSignalProviderIdentifier( + ENUM_X_SIGNAL_PROVIDER provider +) { + // + string result = ""; + + // + switch (provider) { + // + case X_XXX_PROVIDER: + result = "XXX"; + break; + + // + case X_XR_PROVIDER: + result = "XR"; + break; + + // + case X_XTPW_PROVIDER: + result = "XTPW"; + break; + + // + default: + result = ""; + break; + } + + // + return result; +} + +// +ENUM_X_SIGNAL_PROVIDER GetSignalProvider(string identifier) { + // + ENUM_X_SIGNAL_PROVIDER result = X_UNKNOWN_PROVIDER; + + // + if ( + StringFind( + identifier, + GetSignalProviderIdentifier(X_XXX_PROVIDER) + ) > -1 + ) { + result = X_XXX_PROVIDER; + } else if ( + StringFind( + identifier, + GetSignalProviderIdentifier(X_XR_PROVIDER) + ) > -1 + ) { + result = X_XR_PROVIDER; + } else if ( + StringFind( + identifier, + GetSignalProviderIdentifier(X_XTPW_PROVIDER) + ) > -1 + ) { + result = X_XTPW_PROVIDER; + } + + // + return result; +} + +// +// Retrieve Signal Lots Per Trade ... +double GetSignalLottage( + const XSignal &signal, + const double defLotsPerTrade +) { + // + double result = defLotsPerTrade; + + // + bool isLong = signal.type == X_SIGNAL_LONG; + + // + switch (signal.provider) { + // + case X_XR_PROVIDER: + // + result = isLong ? + xRLongLotsPerTradePercent : + xRShortLotsPerTradePercent + ; + break; + + // + case X_XXX_PROVIDER: + // + result = isLong ? + xLongLotsPerTradePercent : + xShortLotsPerTradePercent + ; + break; + + // + case X_XTPW_PROVIDER: + // + result = isLong ? + xTPWLongLotsPerTradePercent : + xTPWShortLotsPerTradePercent + ; + break; + } + + // + return result; +} + +// +// Draw Specific Range On Chart ... +void DrawRange( + const XRange &range, + const long chartID = 0, + const int subWindowID = 0, + const string tag = "", + const color clr = clrYellow +) { + // + // Loop through Levels Count ... + for (int i = 0; i <= range.levels; i++) { + // + datetime time1 = iTime( + _Symbol, + _Period, + 1 + ); + + // + datetime time2 = iTime( + _Symbol, + _Period, + 0 + ); + + // + double price = range.lowestLow + (i * range.rate); + + // + string lbl = StringConcatenate( + tag, + "_XRL_", + price + ); + + // + DrawTrendLine( + chartID, + lbl, + subWindowID, + time1, + price, + time2, + price, + clr, + STYLE_DOT + ); + } +} + +// +// Draw Signal Shapes on Chart ... +bool DrawSignal( + const XSignal &signal, + long chartID = 0, + int subWindowID = 0, + const double positionThresholdFactor = 10, + string longSignalLabel = "X-Long", + color longSignalColor = clrAqua, + string shortSignalLabel = "X-Short", + color shortSignalColor = clrFuchsia +) { + // + // Generate isLongSignal Var ... + bool isLongSignal = signal.type == X_SIGNAL_LONG; + + // + // Signal Bar Index ... + int bar_index = iBarShift( + _Symbol, + _Period, + signal.time + ); + + // + // START Draw Signal Arrow ... + // + // + // Arrow Shape Name ... + string arrowName = StringConcatenate(signal.tag, "_Arrow_", signal.id); + + // + // Arrow Price ... + double arrowPrice = 0; + if (isLongSignal) { + // + arrowPrice = iLow( + _Symbol, + _Period, + bar_index + 1 + ); + + // + arrowPrice = arrowPrice - (positionThresholdFactor * _Point); + } else { + // + arrowPrice = iHigh( + _Symbol, + _Period, + bar_index + 1 + ); + + // + arrowPrice = arrowPrice + (positionThresholdFactor * _Point); + } + + // + // Arrow Code ... + uchar arrowCode = isLongSignal ? SYMBOL_ARROWUP : SYMBOL_ARROWDOWN; + + // + // Arrow Anchor Point ... + ENUM_ARROW_ANCHOR arrowAnchorPoint = isLongSignal ? ANCHOR_BOTTOM : ANCHOR_TOP; + + // + // Arrow Color ... + color arrowColor = isLongSignal ? longSignalColor : shortSignalColor; + + // + // Draw Signal Arrow Shape ... + bool result = DrawArrow( + chartID, + arrowName, + subWindowID, + signal.time, + arrowPrice, + arrowCode, + arrowAnchorPoint, + arrowColor + ); + // + // END Draw Signal Arrow ... + // + + // + // START Draw Signal SL/TP ... + // + string slLineName = StringConcatenate(signal.tag, "_SL_", signal.id); + string tpLineName = StringConcatenate(signal.tag, "_TP_", signal.id); + string entryLineName = StringConcatenate(signal.tag, "_ENTRY_", signal.id); + + // + color slColor = shortSignalColor; // isLongSignal ? shortSignalColor : longSignalColor; + color tpColor = longSignalColor; // isLongSignal ? shortSignalColor : longSignalColor; + color entryColor = clrGreen; + + // + datetime time1 = iTime( + _Symbol, + _Period, + bar_index + 1 + ); + + // + // Draw Enrty Price ... + result = DrawTrendLine( + chartID, + entryLineName, + subWindowID, + time1, + signal.entry, + signal.time, + signal.entry, + entryColor, + STYLE_SOLID, + 2 + ); + + // + // Draw Signal SL ... + if (signal.sl > 0) { + // + result = DrawTrendLine( + chartID, + slLineName, + subWindowID, + time1, + signal.sl, + signal.time, + signal.sl, + slColor, + STYLE_SOLID, + 2 + ); + } + + // + // Draw Signal TP ... + if (signal.tp > 0) { + // + result = DrawTrendLine( + chartID, + tpLineName, + subWindowID, + time1, + signal.tp, + signal.time, + signal.tp, + tpColor, + STYLE_SOLID, + 2 + ); + } + // + // END Draw Signal SL/TP ... + // + + // + // Start Draw Signal Label ... + // + // + string labelName = StringConcatenate(signal.tag, "_Label_", signal.id); + + // + double labelPrice = isLongSignal ? arrowPrice - (positionThresholdFactor * _Point) : arrowPrice + (positionThresholdFactor * _Point); + + // + string labelText = isLongSignal ? longSignalLabel : shortSignalLabel; + labelText = StringConcatenate( + labelText, + "_", + GetSignalProviderIdentifier(signal.provider) + ); + + // + result = DrawText( + chartID, + labelName, + subWindowID, + signal.time, + labelPrice, + labelText, + "Arial", + 8, + arrowColor, + 0, + ANCHOR_CENTER + ); + // + // End Draw Signal Label ... + // + + // + return result; +} + +// +// Trade on Specific Signal ... +bool TradeSignal( + XSignal &signal, + // + double volumePercent, + // + // Long ... + const string longSignalLabel, + const color longSignalColor, + // + // Short ... + const string shortSignalLabel, + const color shortSignalColor +) { + // + // Temp Result ... + bool result = false; + + // + if (initialBalance == 0) { + initialBalance = AccountInfoDouble(ACCOUNT_BALANCE); + } + + // + double balance = AccountInfoDouble(ACCOUNT_BALANCE); + int openPositions = CountOpenTrades(); + double volume = (volumePercent * initialBalance); + + // + if ( + signal.type != X_SIGNAL_LONG && + signal.type != X_SIGNAL_SHORT + ) { + return result; + } + + // + bool hasLongSignal = signal.type == X_SIGNAL_LONG; + + // + // Check TP and Entry Price ... + if ( + ( + hasLongSignal + && signal.entry > signal.tp + ) || + ( + !hasLongSignal + && signal.entry < signal.tp + ) + ) { + return result; + } + + // + // Order Operation ... + int operation = hasLongSignal ? + OP_BUY : + OP_SELL; + + // + // Detect Trade Color ... + color clr = hasLongSignal ? + longSignalColor : + shortSignalColor; + + // + // Generate Signal Comment ... + string label = hasLongSignal ? + longSignalLabel : + shortSignalLabel; + + // + // Generate Signal Comment ... + string comment = StringConcatenate( + signal.tag, + "_", signal.id, + "_", GetSignalProviderIdentifier(signal.provider), + "_", label + ); + + // + // Placing Order ... + int orderTicket = OrderSend( + _Symbol, + operation, + volume, + signal.entry, + 3, + signal.sl, + signal.tp, + comment, + signal.id, + 0, + clr + ); + + // + // Draw Signal Shape if Order Opened Successfully ... + if (orderTicket >= 0) { + // + signal.ticket = orderTicket; + + // + // Here i must to Draw Signal Shapes ... + bool isDrawn = DrawSignal( + signal, + 0, + 0, + 50, + longSignalLabel, // Long Signal Label ... + longSignalColor, + shortSignalLabel, // Short Signal Label ... + shortSignalColor + ); + + // + LogMessage( + StringConcatenate( + "Order [", orderTicket ,"]: Provided by: ", GetSignalProviderIdentifier(signal.provider) + ) + ); + + // + // TODO: here we have to check if there are another + // open positions which their entry price is bigger + // than current signal entry price, for long trades and + // their tp is high than current tp, ... + // close in profit trades or modify orders tp to current ... + // // + // if (CountOpenTrades() > 0) { + // // + // // Here we have to + // ModifyOpenTradesBasedOnCurrentTrade(signal); + // } + + // + result = true; + } + + // + return result; +} +// +// END Signal Related Functions ... +// + +// +// START Orders Functions ... +// +// +// Convert To XSignal Model ... +XSignal OrderToSignal() { + // + // Temp Result ... + XSignal result = {}; + result.type = X_SIGNAL_NONE; + + // + // Here we can get some usefull info based on selected order ... + double swap = OrderSwap(); + double lots = OrderLots(); + int ticket = OrderTicket(); + double profit = OrderProfit(); + double stopLoss = OrderStopLoss(); + double openPrice = OrderOpenPrice(); + datetime openTime = OrderOpenTime(); + int magicNumber = OrderMagicNumber(); + double takeProfit = OrderTakeProfit(); + string comment = OrderComment(); + + // + ENUM_X_SIGNAL_PROVIDER provider = GetSignalProvider(comment); + + // + // find order type ... + bool isLongOrder = OrderType() == OP_BUY; + + // + // Conver Position to Signal ... + result.sl = stopLoss; + result.tp = takeProfit; + result.time = openTime; + result.symbol = _Symbol; + result.id = magicNumber; + result.comment = comment; + result.entry = openPrice; + result.provider = provider; + result.type = isLongOrder ? X_SIGNAL_LONG : X_SIGNAL_SHORT; + + // + return result; +} + +// +// START Count Orders ... +// +// +// Count Open Positions ... +int CountOpenTrades() { + // + int result = 0; + + // + // Loop through Orders ... + for (int i = 0; i < OrdersTotal(); i++) { + // + // Select indexed Order ... + if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { + // + // Check Order ... + if (OrderSymbol() == _Symbol) { + result++; + } + } + } + + // + // Return Result ... + return result; +} + +// +// Count Open Long Positions ... +int CountOpenLongTrades() { + // + int result = 0; + + // + // Loop through Orders ... + for (int i = 0; i < OrdersTotal(); i++) { + // + // Select indexed Order ... + if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { + // + // Check Order ... + if ( + OrderSymbol() == _Symbol + && OrderType() == OP_BUY + ) { + result++; + } + } + } + + // + // Return Result ... + return result; +} + +// +// Count Open Short Positions ... +int CountOpenShortTrades() { + // + int result = 0; + + // + // Loop through Orders ... + for (int i = 0; i < OrdersTotal(); i++) { + // + // Select indexed Order ... + if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { + // + // Check Order ... + if ( + OrderSymbol() == _Symbol + && OrderType() == OP_SELL + ) { + result++; + } + } + } + + // + // Return Result ... + return result; +} +// +// END Count Orders ... +// + +// +// START Close Orders ... +// +// +// Close All Open Trades ... +bool CloseAllTrades() { + // + // Loop through all Positions ... + bool result = false; + for (int i = OrdersTotal(); i >= 0; i--) { + // + // Check Order Selected or not ... + if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { + // + // Check Order Symbol is same as Current Symbol ... + if (OrderSymbol() == _Symbol) { + // + double lots = OrderLots(); + int ticket = OrderTicket(); + + // + // find order type ... + bool isLongOrder = OrderType() == OP_BUY; + + // + // find close price ... + double closePrice = isLongOrder ? + SymbolInfoDouble(_Symbol, SYMBOL_BID) : + SymbolInfoDouble(_Symbol, SYMBOL_ASK); + + // + // Since because of equity ... + // we have to ckose allpositions ... + bool isOrderClosed = OrderClose( + ticket, + lots, + closePrice, + clrYellow + ); + + // + if (isOrderClosed) { + // + LogMessage( + StringConcatenate( + "Order [", ticket, "] Closed because of All Trade Closing issue ..." + ) + ); + } + + // + result = + result + || isOrderClosed; + } + } + } + + // + return result; +} + +// +bool CloseAllProviderTrades( + ENUM_X_SIGNAL_PROVIDER provider +) { + // + bool result = false; + + // + // Loop through Signals ... + for (int i = OrdersTotal(); i >= 0; i--) { + // + // Check Order Selected or not ... + if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { + // + // Check Order Symbol is same as Current Symbol ... + if (OrderSymbol() == _Symbol) { + // + XSignal signal = OrderToSignal(); + + // + if (signal.provider == provider) { + // + double lots = OrderLots(); + int ticket = OrderTicket(); + + // + // find order type ... + bool isLongOrder = OrderType() == OP_BUY; + + // + // find close price ... + double closePrice = isLongOrder ? + SymbolInfoDouble(_Symbol, SYMBOL_BID) : + SymbolInfoDouble(_Symbol, SYMBOL_ASK); + + // + // Since because of equity ... + // we have to ckose allpositions ... + bool isOrderClosed = OrderClose( + ticket, + lots, + closePrice, + clrYellow + ); + + // + if (isOrderClosed) { + // + LogMessage( + StringConcatenate( + "Order [", ticket, "] Closed because of All Provider Long Trades Closing issue ..." + ) + ); + } + + // + result = + result + || isOrderClosed; + } + } + } + } + + // + return result; +} + +// +bool CloseAllProviderLongTrades( + ENUM_X_SIGNAL_PROVIDER provider +) { + // + bool result = false; + + // + // Loop through Signals ... + for (int i = OrdersTotal(); i >= 0; i--) { + // + // Check Order Selected or not ... + if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { + // + // Check Order Symbol is same as Current Symbol ... + if (OrderSymbol() == _Symbol) { + // + XSignal signal = OrderToSignal(); + + // + if ( + signal.provider == provider + && signal.type == X_SIGNAL_LONG + ) { + // + double lots = OrderLots(); + int ticket = OrderTicket(); + + // + // find order type ... + bool isLongOrder = OrderType() == OP_BUY; + + // + // find close price ... + double closePrice = isLongOrder ? + SymbolInfoDouble(_Symbol, SYMBOL_BID) : + SymbolInfoDouble(_Symbol, SYMBOL_ASK); + + // + // Since because of equity ... + // we have to ckose allpositions ... + bool isOrderClosed = OrderClose( + ticket, + lots, + closePrice, + clrYellow + ); + + // + if (isOrderClosed) { + // + LogMessage( + StringConcatenate( + "Order [", ticket, "] Closed because of All Provider Long Trades Closing issue ..." + ) + ); + } + + // + result = + result + || isOrderClosed; + } + } + } + } + + // + return result; +} + +// +bool CloseAllProviderShortTrades( + ENUM_X_SIGNAL_PROVIDER provider +) { + // + bool result = false; + + // + // Loop through Signals ... + for (int i = OrdersTotal(); i >= 0; i--) { + // + // Check Order Selected or not ... + if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { + // + // Check Order Symbol is same as Current Symbol ... + if (OrderSymbol() == _Symbol) { + // + XSignal signal = OrderToSignal(); + + // + if ( + signal.provider == provider + && signal.type == X_SIGNAL_SHORT + ) { + // + double lots = OrderLots(); + int ticket = OrderTicket(); + + // + // find order type ... + bool isLongOrder = OrderType() == OP_BUY; + + // + // find close price ... + double closePrice = isLongOrder ? + SymbolInfoDouble(_Symbol, SYMBOL_BID) : + SymbolInfoDouble(_Symbol, SYMBOL_ASK); + + // + // Since because of equity ... + // we have to ckose allpositions ... + bool isOrderClosed = OrderClose( + ticket, + lots, + closePrice, + clrYellow + ); + + // + if (isOrderClosed) { + // + LogMessage( + StringConcatenate( + "Order [", ticket, "] Closed because of All Provider Long Trades Closing issue ..." + ) + ); + } + + // + result = + result + || isOrderClosed; + } + } + } + } + + // + return result; +} + +// +// Close All Open Long Trades ... +bool CloseAllLongTrades() { + // + // Loop through all Positions ... + bool result = false; + for (int i = OrdersTotal(); i >= 0; i--) { + // + // Check Order Selected or not ... + if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { + // + // Check Order Symbol is same as Current Symbol ... + if (OrderSymbol() == _Symbol) { + // + double lots = OrderLots(); + int ticket = OrderTicket(); + + // + // find order type ... + bool isLongOrder = OrderType() == OP_BUY; + if (isLongOrder) { + // + // find close price ... + double closePrice = isLongOrder ? + SymbolInfoDouble(_Symbol, SYMBOL_BID) : + SymbolInfoDouble(_Symbol, SYMBOL_ASK); + + // + // Since because of equity ... + // we have to ckose allpositions ... + bool isOrderClosed = OrderClose( + ticket, + lots, + closePrice, + clrYellow + ); + + // + if (isOrderClosed) { + // + LogMessage( + StringConcatenate( + "Order [", ticket, "] Closed because of All Long Trade Closing issue ..." + ) + ); + } + + // + result = + result + || isOrderClosed; + } + } + } + } + + // + return result; +} + +// +// Close All Open Short Trades ... +bool CloseAllShortTrades() { + // + // Loop through all Positions ... + bool result = false; + for (int i = OrdersTotal(); i >= 0; i--) { + // + // Check Order Selected or not ... + if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { + // + // Check Order Symbol is same as Current Symbol ... + if (OrderSymbol() == _Symbol) { + // + double lots = OrderLots(); + int ticket = OrderTicket(); + + // + // find order type ... + bool isLongOrder = OrderType() == OP_BUY; + if (!isLongOrder) { + // + // find close price ... + double closePrice = isLongOrder ? + SymbolInfoDouble(_Symbol, SYMBOL_BID) : + SymbolInfoDouble(_Symbol, SYMBOL_ASK); + + // + // Since because of equity ... + // we have to ckose allpositions ... + bool isOrderClosed = OrderClose( + ticket, + lots, + closePrice, + clrYellow + ); + + // + if (isOrderClosed) { + // + LogMessage( + StringConcatenate( + "Order [", ticket, "] Closed because of All Short Trade Closing issue ..." + ) + ); + } + + // + result = + result + || isOrderClosed; + } + } + } + } + + // + return result; +} + +// +// Close All In Profit Trades ... +bool CloseAllInProfitTrades() { + // + // Loop through all Positions ... + bool result = false; + for (int i = OrdersTotal(); i >= 0; i--) { + // + // Check Order Selected or not ... + if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { + // + // Check Order Symbol is same as Current Symbol ... + if (OrderSymbol() == _Symbol) { + // + double lots = OrderLots(); + int ticket = OrderTicket(); + double profit = OrderProfit(); + + // + // find order type ... + bool isLongOrder = OrderType() == OP_BUY; + + // + // find close price ... + double closePrice = isLongOrder ? + SymbolInfoDouble(_Symbol, SYMBOL_BID) : + SymbolInfoDouble(_Symbol, SYMBOL_ASK); + + // + if ( + profit > 0 + && profit > 50 * _Point + ) { + // + // Since because of equity ... + // we have to ckose allpositions ... + bool isOrderClosed = OrderClose( + ticket, + lots, + closePrice, + clrYellow + ); + + // + if (isOrderClosed) { + // + LogMessage( + StringConcatenate( + "Order [", ticket, "] Closed because of InProfit Trade Closing issue ..." + ) + ); + } + + // + result = + result + || isOrderClosed; + } + } + } + } + + // + return result; +} + +// +// Close All In DrawDown Trades ... +bool CloseAllInDrawDownTrades() { + // + // Loop through all Positions ... + bool result = false; + for (int i = OrdersTotal(); i >= 0; i--) { + // + // Check Order Selected or not ... + if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { + // + // Check Order Symbol is same as Current Symbol ... + if (OrderSymbol() == _Symbol) { + // + double lots = OrderLots(); + int ticket = OrderTicket(); + double profit = OrderProfit(); + + // + // find order type ... + bool isLongOrder = OrderType() == OP_BUY; + + // + // find close price ... + double closePrice = isLongOrder ? + SymbolInfoDouble(_Symbol, SYMBOL_BID) : + SymbolInfoDouble(_Symbol, SYMBOL_ASK); + + // + if (profit < 0) { + // + // Since because of equity ... + // we have to ckose allpositions ... + bool isOrderClosed = OrderClose( + ticket, + lots, + closePrice, + clrYellow + ); + + // + if (isOrderClosed) { + // + LogMessage( + StringConcatenate( + "Order [", ticket, "] Closed because of InDrawDown Trade Closing issue ..." + ) + ); + } + + // + result = + result + || isOrderClosed; + } + } + } + } + + // + return result; +} + +// +// Close Biggest In DrawDown Trades ... +bool CloseBiggestDrawDownTrade() { + // + // Loop through all Positions ... + bool result = false; + double drawDown = 0; + + // + // Find Biggest In DrawDown ... + for (int i = OrdersTotal(); i >= 0; i--) { + // + // Check Order Selected or not ... + if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { + // + // Check Order Symbol is same as Current Symbol ... + if (OrderSymbol() == _Symbol) { + // + double lots = OrderLots(); + int ticket = OrderTicket(); + double profit = OrderProfit(); + + // + // find order type ... + bool isLongOrder = OrderType() == OP_BUY; + + // + // find close price ... + double closePrice = isLongOrder ? + SymbolInfoDouble(_Symbol, SYMBOL_BID) : + SymbolInfoDouble(_Symbol, SYMBOL_ASK); + + // + if ( + profit < 0 + && MathAbs(profit) > drawDown + ) { + drawDown = profit; + } + } + } + } + + // + // Close Biggest In DrawDown ... + for (int i = OrdersTotal(); i >= 0; i--) { + // + // Check Order Selected or not ... + if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { + // + // Check Order Symbol is same as Current Symbol ... + if (OrderSymbol() == _Symbol) { + // + double lots = OrderLots(); + int ticket = OrderTicket(); + double profit = OrderProfit(); + + // + // find order type ... + bool isLongOrder = OrderType() == OP_BUY; + + // + // find close price ... + double closePrice = isLongOrder ? + SymbolInfoDouble(_Symbol, SYMBOL_BID) : + SymbolInfoDouble(_Symbol, SYMBOL_ASK); + + // + if ( + profit < 0 + && MathAbs(profit) >= drawDown + ) { + // + // Since because of equity ... + // we have to ckose allpositions ... + bool isOrderClosed = OrderClose( + ticket, + lots, + closePrice, + clrYellow + ); + + // + if (isOrderClosed) { + // + LogMessage( + StringConcatenate( + "Order [", ticket, "] Closed because of Max InDrawDown Trade Closing issue ..." + ) + ); + } + + // + result = + result + || isOrderClosed; + } + } + } + } + + // + return result; +} + +// +// Close All Long Time Trades ... +bool CloseAllLongTimeTrades( + const int passedCandles, + const ENUM_X_SIGNAL_PROVIDER provider = X_UNKNOWN_PROVIDER +) { + // + bool result = false; + + // + if (passedCandles <= 0) { + return result; + } + + // + int currentBarIndex = iBarShift( + _Symbol, + _Period, + TimeCurrent() + ); + + // + int openTrades = CountOpenTrades(); + + // + // Loop through all Positions ... + for (int i = OrdersTotal(); i >= 0; i--) { + // + // Check Order Selected or not ... + if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { + // + // Check Order Symbol is same as Current Symbol ... + if (OrderSymbol() == _Symbol) { + // + double lots = OrderLots(); + int ticket = OrderTicket(); + double profit = OrderProfit(); + datetime openTime = OrderOpenTime(); + int openBarIndex = iBarShift( + _Symbol, + _Period, + openTime + ); + string comment = OrderComment(); + + // + ENUM_X_SIGNAL_PROVIDER orderProvider = GetSignalProvider(comment); + bool isProviderVerified = + provider == X_UNKNOWN_PROVIDER ? + true : + orderProvider != X_UNKNOWN_PROVIDER + && orderProvider == provider + ; + + // + if ( + profit < 0 + && isProviderVerified + && openBarIndex - currentBarIndex >= passedCandles + // || ( + // profit > 0.5 + // && openBarIndex - currentBarIndex >= passedCandles - (passedCandles / 3) + // ) + ) { + // + // find order type ... + bool isLongOrder = OrderType() == OP_BUY; + + // + // find close price ... + double closePrice = isLongOrder ? + SymbolInfoDouble(_Symbol, SYMBOL_BID) : + SymbolInfoDouble(_Symbol, SYMBOL_ASK); + + // + // Since because of equity ... + // we have to ckose allpositions ... + bool isOrderClosed = OrderClose( + ticket, + lots, + closePrice, + clrYellow + ); + + // + if (isOrderClosed) { + // + LogMessage( + StringConcatenate( + "Order [", ticket, "] Closed because of Long Time issue ..." + ) + ); + } + + // + result = + result + || isOrderClosed; + } + // else if ( + // openTrades > 0 + // && openBarIndex - currentBarIndex >= passedCandles - (passedCandles / 2) + // ) { + // result = CloseAllInProfitTrades() + // && CloseBiggestDrawDownTrade(); + // } + } + } + } + + // + return result; +} + +// +// Close all trades which passed Maximum Drawdown ... +bool CloseAllMaximumDrawDownPassedTrades( + const double maxDrDownPercentPerPTrade, + const ENUM_X_SIGNAL_TYPE type = X_SIGNAL_NONE, + const ENUM_X_SIGNAL_PROVIDER provider = X_UNKNOWN_PROVIDER +) { + // + if ( + initialBalance <= 0 + || maxDrDownPercentPerPTrade <= 0 + ) { + return false; + } + + // + // Retrieve Account Balance ... + double balance = AccountInfoDouble(ACCOUNT_BALANCE); + double maxAllowedDrawDown = -1 * (initialBalance * maxDrDownPercentPerPTrade); + + // + // Loop through all Positions ... + bool result = false; + for (int i = OrdersTotal(); i >= 0; i--) { + // + // Check Order Selected or not ... + if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { + // + // Check Order Symbol is same as Current Symbol ... + if (OrderSymbol() == _Symbol) { + // + double lots = OrderLots(); + int ticket = OrderTicket(); + double profit = OrderProfit(); + string comment = OrderComment(); + + // + // find order type ... + bool isLongOrder = OrderType() == OP_BUY; + bool isTypeVerified = + type == X_SIGNAL_NONE ? + true : + ( isLongOrder + && type == X_SIGNAL_LONG + ) || ( + !isLongOrder + && type == X_SIGNAL_SHORT + ) + ; + + // + ENUM_X_SIGNAL_PROVIDER orderProvider = GetSignalProvider(comment); + bool isProviderVerified = + provider == X_UNKNOWN_PROVIDER ? + true : + orderProvider != X_UNKNOWN_PROVIDER + && orderProvider == provider + ; + + // + if ( + profit < 0 + && isTypeVerified + && isProviderVerified + && MathAbs(profit) >= MathAbs(maxAllowedDrawDown) + ) { + // + // find close price ... + double closePrice = isLongOrder ? + SymbolInfoDouble(_Symbol, SYMBOL_BID) : + SymbolInfoDouble(_Symbol, SYMBOL_ASK); + + // + // Since because of equity ... + // we have to ckose allpositions ... + bool isOrderClosed = OrderClose( + ticket, + lots, + closePrice, + clrYellow + ); + + // + if (isOrderClosed) { + // + LogMessage( + StringConcatenate( + "Order [", ticket, "] Closed because of Maximum DarwDown issue ..." + ) + ); + } + + // + result = + result + || isOrderClosed; + } + } + } + } + + // + return result; +} + +// +// Close All Trades Which Opens before Specified Length ... +bool CloseAllTradesWhichOpenInPastMarketLength( + const int marketLen +) { + // + bool result = false; + + // + if (marketLen <= 0) { + return result; + } + + // + int currentBarIndex = iBarShift( + _Symbol, + _Period, + TimeCurrent() + ); + + // + int openTrades = CountOpenTrades(); + + // + // Loop through all Positions ... + for (int i = OrdersTotal(); i >= 0; i--) { + // + // Check Order Selected or not ... + if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { + // + // Check Order Symbol is same as Current Symbol ... + if (OrderSymbol() == _Symbol) { + // + double lots = OrderLots(); + int ticket = OrderTicket(); + double profit = OrderProfit(); + datetime openTime = OrderOpenTime(); + int openBarIndex = iBarShift( + _Symbol, + _Period, + openTime + ); + + // + if (openBarIndex <= currentBarIndex + marketLen) { + // + // find order type ... + bool isLongOrder = OrderType() == OP_BUY; + + // + // find close price ... + double closePrice = isLongOrder ? + SymbolInfoDouble(_Symbol, SYMBOL_BID) : + SymbolInfoDouble(_Symbol, SYMBOL_ASK); + + // + // Since because of equity ... + // we have to ckose allpositions ... + bool isOrderClosed = OrderClose( + ticket, + lots, + closePrice, + clrYellow + ); + + // + if (isOrderClosed) { + // + LogMessage( + StringConcatenate( + "Order [", ticket, "] Closed because of Market Reverse issue ..." + ) + ); + } + + // + result = + result + || isOrderClosed; + } else if (openTrades > 0) { + // + // Close all InProfit Trdes and Biggest InDrawDown Trades ... + // result = CloseAllInProfitTrades(); + // && CloseBiggestDrawDownTrade(); + } + } + } + } + + // + return result; +} +// +// END Close Orders ... +// + +// +// START Modify Orders ... +// +// +void ModifyAllPriceLesserOpenTrades( + const XSignal &signal +) { + // + // Loop through all Open Trades ... + for (int i = OrdersTotal(); i >= 0; i--) { + // + // Check Order Selected or not ... + if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { + // + // Check Order Symbol is same as Current Symbol ... + if (OrderSymbol() == _Symbol) { + // + double lots = OrderLots(); + int ticket = OrderTicket(); + double profit = OrderProfit(); + double stopLoss = OrderStopLoss(); + double openPrice = OrderOpenPrice(); + datetime openTime = OrderOpenTime(); + double takeProfit = OrderTakeProfit(); + + // + // find order type ... + bool isLongOrder = OrderType() == OP_BUY; + + // + // find close price ... + double closePrice = isLongOrder ? + SymbolInfoDouble(_Symbol, SYMBOL_BID) : + SymbolInfoDouble(_Symbol, SYMBOL_ASK); + + // + // When new Signal Comming with price less than + // currently open trade and tp less than currently + // open trade, this means a market change happens ... + // here we can Close InProfit Trades or Modify Trades TP ... + if ( + ( + openPrice < signal.entry + || MathAbs(openPrice - signal.entry) < 300 * _Point + ) + && takeProfit > signal.tp + ) { + bool result = OrderModify( + ticket, + openPrice, + signal.sl, + signal.tp, + clrYellow + ); + } + } + } + } +} + +// +void ModifyOpenTradesBasedOnCurrentTrade( + const XSignal &signal +) { + // + ModifyAllPriceLesserOpenTrades(signal); +} +// +// END Modify Orders ... +// +// +// END Orders Functions ... +// + +// +// START Signal Conditions ... +// +// +// Clear Signal Conditions ... +void ClearSignalConditions() { + // + ClearLongSignalConditions(); + ClearShortSignalConditions(); +} + +// +// Clear all Conditions Waiter for Long Signals ... +void ClearLongSignalConditions() { + // + ClearXLongSignalConditions(); + ClearXRLongSignalConditions(); + ClearXTPWLongSignalConditions(); +} + +// +// Clear all Conditions Waiter for Short Signals ... +void ClearShortSignalConditions() { + // + ClearXShortSignalConditions(); + ClearXRShortSignalConditions(); + ClearXTPWShortSignalConditions(); +} +// +// END Signal Conditions ... +// diff --git a/BKPS/OLD/XAUUSD-15M-V1.0/MQ4/Libraries/x-saherelm.x.signal.lib.mq4 b/BKPS/OLD/XAUUSD-15M-V1.0/MQ4/Libraries/x-saherelm.x.signal.lib.mq4 new file mode 100644 index 0000000..834ddb1 --- /dev/null +++ b/BKPS/OLD/XAUUSD-15M-V1.0/MQ4/Libraries/x-saherelm.x.signal.lib.mq4 @@ -0,0 +1,1063 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL4 X Signal Global Library +// --------------------------------------------------- +// saherelm useful tools and definitions ... +// +// +// Maintainer: +// ------------ +// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) +// +////////////////////////////////////////////////////// +#property library +#property copyright "Copyright 2023, SaherElm IT Center" +#property link "https://www.saherelm.ir" +#property version "1.00" +#property strict + +// +// Includes library ... +#include "../Libraries/x-saherelm.lib.mq4" + +// +// Includes Indicator library ... +#include "../Libraries/x-saherelm.indicator.lib.mq4" + +// +// Includes Models library ... +#include "../Libraries/x-saherelm.models.lib.mq4" + +// +// START Inputs ... +// +// +input string xStarter = "- X Signal Provider -"; // ---> X Signal Provider <--- + +// +input bool enableXSignalling = true; // X Signalling Enable + +// +input bool enableXLong = true; // X Signalling Enable Long +input bool enableXShort = true; // X Signalling Enable Short + +// +input double xShortR2R = 3; // X Short Risk To Reward Ratio +input double xShortLotsPerTradePercent = 0.0002; // X Lots Percent per Short Trades +input double xShortMaxDrawdownPerTradePercent = 0.4; // X Max Allowed DrawDown Percent per Short Trade + +// +input double xLongR2R = 3; // X Long Risk To Reward Ratio +input double xLongLotsPerTradePercent = 0.0002; // X Lots Percent per Short Trades +input double xLongMaxDrawdownPerTradePercent = 0.4; // X Max Allowed DrawDown Percent per Long Trade + +// +input double xSharpDetectorFactor = 700; // X Sharp Detection Factor + +// +input int xMaximumCandlesPerTrade = 206; // X Maximum Candles which a Trade can open + +// +input int xOscillatorLength = 7; // X Oscillator Length + +// +input double xPSarStep = 0.02; // X Parabolic Sar Step +input double xPSarMaximum = 0.2; // X Parabolic Sar Maximum + +// +input int xRangeMarketLength = 5; // X Range Detector Length + +// +input int xSwingLength = 7; // X Signal Swing Length +// +// END Inputs ... +// + +// +// START Global Requirement Functions ... +// +// +// X Based Signal Conditions ... +struct XSignalConditions { + datetime startTime; + datetime signalTime; + datetime entryTime; +}; + +// +struct XMarketState { + double psar; + double fast; + double slow; + double open; + double verifier; + double oscillator; + double oscillatorVerifier; +}; + +// +static XSignalConditions xLongConds; +static bool xCloseLongTrades = false; +static bool xWaitForLongSignals = true; + +// +static XSignalConditions xShortConds; +static bool xCloseShortTrades = false; +static bool xWaitForShortSignals = true; + +// +// Count Number of Closed Maximum DrawDown Trades ... +static int xFailedSignals = 0; + +// +datetime lastVerifierTouched; +// +// END Global Requirement Functions ... +// + +// +// START Functions ... +// +// +// Check and Fill Long and Short Signal Handlers ... +void CheckXSignalHandler( + const int bar_index +) { + // + // Check Market For Enable/Disable Signal Handlers ... + // Checking Market for Long Signals ... + // + if ( + !enableXSignalling + || !(enableXLong || enableXShort) + ) { + return; + } + + // + datetime barTime = iTime( + _Symbol, + _Period, + bar_index + ); + + // + XOHCL candle = GetCandleModel(bar_index); + XOHCL pCandle = GetCandleModel(bar_index + 1); + XTPOWState tPowState = GetXTPowState( + bar_index + 1, + xSwingLength + ); + + // + XMarketState state = GetXMarketState( + bar_index + 1 + ); + + // + // Check Verifier Last Touched ... + bool isVerifierTouched = pCandle.high > state.verifier + && pCandle.low < state.verifier; + + // + // Disable Signals if a signal Failed ... + if (xFailedSignals) { + // + // TODO: Complete this ... + } + + // + // Enable Or Disable Signalling ... + if (isVerifierTouched) { + // + lastVerifierTouched = barTime; + + // + if (xWaitForLongSignals) { + xWaitForLongSignals = false; + } + + // + if (xWaitForShortSignals) { + xWaitForShortSignals = false; + } + } else { + // + int lastVerifierTouchedBarIndex = iBarShift( + _Symbol, + _Period, + lastVerifierTouched + ); + + // + int distance = MathAbs(lastVerifierTouchedBarIndex - bar_index); + + // + if ( + !xWaitForLongSignals + && distance > (xSwingLength * 2) + ) { + xWaitForLongSignals = true; + } + + // + if ( + !xWaitForShortSignals + && ( + distance > (xSwingLength * 2) + || ( + tPowState.powerDown > tPowState.powerUp + && tPowState.powerDown < 49 + ) + ) + ) { + xWaitForShortSignals = true; + } + } + + // + // Close All Long Open Trades ... + if ( + tPowState.powerDown > 55 + && tPowState.powerDown > tPowState.powerUp + ) { + // xCloseLongTrades = true; + } +} + +// +// Check and Fill Long Signal Conditions ... +void CheckXLongSignalConditions( + const int bar_index +) { + // + if ( + !enableXLong + || !enableXSignalling + || !xWaitForLongSignals + ) { + return; + } + + // + datetime barTime = iTime( + _Symbol, + _Period, + bar_index + ); + + // + bool isCrossOver = false; + bool isCrossUnder = false; + + // + XMarketState cState = GetXMarketState(1); + XMarketState pState = GetXMarketState(2); + + // + isCrossUnder = + cState.fast < cState.slow + && !(pState.fast < pState.slow) + ; + + // + isCrossOver = + cState.fast > cState.slow + && !(pState.fast > pState.slow) + ; + + // + if ( + isCrossUnder + && xLongConds.startTime == 0 + ) { + // + xLongConds.startTime = barTime; + return; + } + + // + if ( + isCrossOver + && xLongConds.startTime > 0 + && xLongConds.signalTime == 0 + ) { + // + xLongConds.signalTime = barTime; + xLongConds.entryTime = barTime; + return; + } +} + +// +// Check and Fill Short Signal Conditions ... +void CheckXShortSignalConditions( + const int bar_index +) { + // + if ( + !enableXShort + || !enableXSignalling + || !xWaitForShortSignals + ) { + return; + } + + // + datetime barTime = iTime( + _Symbol, + _Period, + bar_index + ); + + // + bool isCrossOver = false; + bool isCrossUnder = false; + + // + XMarketState cState = GetXMarketState(1); + XMarketState pState = GetXMarketState(2); + + // + isCrossUnder = + cState.fast < cState.slow + && !(pState.fast < pState.slow) + ; + + // + isCrossOver = + cState.fast > cState.slow + && !(pState.fast > pState.slow) + ; + + // + if ( + isCrossOver + && xShortConds.startTime == 0 + ) { + // + xShortConds.startTime = barTime; + return; + } + + // + if ( + isCrossUnder + && xShortConds.startTime > 0 + && xShortConds.signalTime == 0 + ) { + // + xShortConds.signalTime = barTime; + xShortConds.entryTime = barTime; + return; + } +} + +// +// Convert Long Signal Conditions to XSignal ... +XSignalRequest GenerateXSignal( + const ENUM_X_SIGNAL_TYPE type, // Signal Type ... + const string signalTag , // Signal Tag ... + const int bar_index +) { + // + XSignalRequest result = {}; + + // + result.hasSignal = false; + result.type = X_SIGNAL_NONE; + result.provider = X_UNKNOWN_PROVIDER; + + // + if ( + !enableXSignalling + || !(enableXLong || enableXShort) + ) { + return result; + } + + // + bool requestLong = type == X_SIGNAL_LONG; + + // + if (requestLong) { + // + if ( + !ValidateXLongConditions() + ) { + return result; + } + } else { + // + if ( + !ValidateXShortConditions() + ) { + return result; + } + } + + // + // Price Calculations ... + // + RefreshRates(); + + // + double askPrice = SymbolInfoDouble( + _Symbol, + SYMBOL_ASK + ); + + // + double bidPrice = SymbolInfoDouble( + _Symbol, + SYMBOL_BID + ); + + // + double entryPrice = requestLong ? + askPrice : + bidPrice; + + // + double exitPrice = requestLong ? + bidPrice : + askPrice; + + // + double priceGap = MathAbs(entryPrice - exitPrice); + + // + double ll = + // + GetMarketLowestLow( + bar_index, + xSwingLength + ) + ; + + // + double hh = + // + GetMarketHighestHigh( + bar_index, + xSwingLength + ) + ; + + // + double openPrice = iOpen( + _Symbol, + _Period, + bar_index + ); + + // + double closePrice = iClose( + _Symbol, + _Period, + bar_index + ); + + // + double risk = requestLong ? + MathMin(openPrice, closePrice) - ll : + hh - MathMax(openPrice, closePrice) + ; + + // + double reward = + requestLong ? + risk * xLongR2R : + risk * xShortR2R + ; + + // + double sl = requestLong ? + 0 : + 0; + double tp = requestLong ? + entryPrice + reward : + entryPrice - reward + ; + + // + XRState range = GetXRange( + bar_index, + xRangeMarketLength + ); + + // + datetime barTime = iTime( + _Symbol, + _Period, + bar_index + ); + + // + result.signal.tp = tp; + result.signal.sl = sl; + result.signal.type = type; + result.signal.time = barTime; + result.signal.tag = signalTag; + result.signal.symbol = _Symbol; + result.signal.entry = entryPrice; + result.signal.id = totalSignals + 1; + result.signal.provider = X_XXX_PROVIDER; + + // + result.hasSignal = true; + result.type = type; + result.provider = X_XXX_PROVIDER; + + // + return result; +} + +// +// Validate Signal Conditions ... +bool ValidateXLongConditions() { + // + if ( + !enableXLong + || !enableXSignalling + ) { + return false; + } + + // + bool isConditionsFilled = + xLongConds.startTime > 0 + && xLongConds.signalTime > 0 + && xLongConds.entryTime > 0 + ; + + // + bool isBLFilled = false; + if (isConditionsFilled) { + // + int startBarIndex = iBarShift( + _Symbol, + _Period, + xLongConds.startTime + ); + + // + int signalBarIndex = iBarShift( + _Symbol, + _Period, + xLongConds.signalTime + ); + + // + int entryBarIndex = iBarShift( + _Symbol, + _Period, + xLongConds.entryTime + ); + + // + isBLFilled = + // + xLongConds.signalTime > xLongConds.startTime + && xLongConds.entryTime >= xLongConds.signalTime + // && MathAbs(signalBarIndex - startBarIndex) >= 1 + ; + } + + // + bool result = + isBLFilled + && isConditionsFilled + && xWaitForLongSignals + ; + + // + // Since maybe Conditions Filled but + // Slope is Negative, for Handling Next Signals and + // Prevent from infinity loop, here we Clear Signal Conditions ... + if ( + !result + && isConditionsFilled + ) { + ClearXLongSignalConditions(); + } + + // + return result; +} + +// +// Validate Signal Conditions ... +bool ValidateXShortConditions() { + // + if ( + !enableXShort + || !enableXSignalling + ) { + return false; + } + + // + bool isConditionsFilled = + xShortConds.startTime > 0 + && xShortConds.signalTime > 0 + && xShortConds.entryTime > 0 + ; + + // + bool isBLFilled = false; + if (isConditionsFilled) { + // + int startBarIndex = iBarShift( + _Symbol, + _Period, + xShortConds.startTime + ); + + // + int signalBarIndex = iBarShift( + _Symbol, + _Period, + xShortConds.signalTime + ); + + // + int entryBarIndex = iBarShift( + _Symbol, + _Period, + xShortConds.entryTime + ); + + // + isBLFilled = + // + xShortConds.signalTime > xShortConds.startTime + && xShortConds.entryTime >= xShortConds.signalTime + ; + } + + // + bool result = + isBLFilled + && isConditionsFilled + && xWaitForShortSignals + ; + + // + // Since maybe Conditions Filled but + // Slope is Negative, for Handling Next Signals and + // Prevent from infinity loop, here we Clear Signal Conditions ... + if ( + !result + && isConditionsFilled + ) { + ClearXShortSignalConditions(); + } + + // + return result; +} + +// +// Clear Long Signal Conditions for New One ... +void ClearXLongSignalConditions() { + // + xLongConds.startTime = 0; + xLongConds.entryTime = 0; + xLongConds.signalTime = 0; +} + +// +// Clear Short Signal Conditions for New One ... +void ClearXShortSignalConditions() { + // + xShortConds.startTime = 0; + xShortConds.entryTime = 0; + xShortConds.signalTime = 0; +} + +// +// Check State for Long Signals ... +bool IsReadyForXSignals( + const XSignal &signal +) { + // + bool result = false; + + // + if ( + !enableXSignalling + || !(enableXLong || enableXShort) + ) { + return result; + } + + // + int signalBarIndex = iBarShift( + _Symbol, + _Period, + signal.time + ); + + // + // XOHCL candle = GetCandleModel(0); + XOHCL candle = GetCandleModel(signalBarIndex); + XOHCL pCandle = GetCandleModel(signalBarIndex + 1); + + // + // Retrieve Range ... + XRState range = GetXRange( + signalBarIndex, + xRangeMarketLength + ); + + // + // Retrive XMarket States ... + XMarketState xState0 = GetXMarketState(signalBarIndex); + XMarketState xState1 = GetXMarketState(signalBarIndex + 1); + XMarketState xState2 = GetXMarketState(signalBarIndex + 2); + XMarketState xStateLast = GetXMarketState(signalBarIndex + xSwingLength); + + // + // Retrieve Trend Powers ... + XTPOWState xTPow0 = GetXTPowState( + signalBarIndex, + xSwingLength + ); + XTPOWState xTPow1 = GetXTPowState( + signalBarIndex + 1, + xSwingLength + ); + + // + double hh = GetMarketHighestHigh( + signalBarIndex, + xSwingLength + ); + double ll = GetMarketLowestLow( + signalBarIndex, + xSwingLength + ); + double diffChange = (hh - ll); + bool isBigSharpOccured = + diffChange > (xSharpDetectorFactor * _Point) + ; + + // + bool isPSarVerified = false; + bool isTPowVerified = false; + bool isStateVerified = false; + bool isPriceVerified = false; + + // + // Verify Long Signals ... + if (signal.type == X_SIGNAL_LONG) { + // + // Get Price Verification for Long ... + isPriceVerified = + // + // Starter ... + true + // + && !isBigSharpOccured + // + && signal.entry < hh + // + // && signal.entry < range.hh + // && signal.entry > range.mid + // // + // && candle.high > xState0.verifier + // && signal.entry > xState0.verifier + // + // && pCandle.low != ll + && pCandle.high != hh + ; + + // + int above20TPowers = 0; + double signalSlope = 0; + int tPowUnverifyConditions = 0; + int tPowUnverifyConditionsIdx = 0; + for (int i = signalBarIndex; i < signalBarIndex + xSwingLength; i++) { + // + XTPOWState iTPowState = GetXTPowState( + i, + xSwingLength + ); + + // + // Calculate Signal Slope ... + if (i == signalBarIndex) { + // + signalSlope = iTPowState.signal; + } else if (i == signalBarIndex + 1) { + // + signalSlope = GetSlope( + 1, + iTPowState.signal, + 2, + signalSlope + ); + } + + // + if ( + iTPowState.powerUp > iTPowState.powerDown + && MathMax(iTPowState.powerUp, iTPowState.powerDown) > 20 + ) { + above20TPowers++; + } + + // + if (tPowUnverifyConditionsIdx < 3) { + // + if ( + iTPowState.powerUp < iTPowState.powerDown + || iTPowState.signal > MathMax(iTPowState.powerUp, iTPowState.powerDown) + ) { + tPowUnverifyConditions++; + } + + // + tPowUnverifyConditionsIdx++; + } + } + + // + isTPowVerified = + above20TPowers > 1 + && tPowUnverifyConditions == 0 + ; + + // + isPSarVerified = + xState0.psar < signal.entry + && xState0.psar < candle.low; + + // + isStateVerified = + // + // Start ... + true + // + // && xState0.open < xState0.slow + ; + + // + result = + // + // Starter ... + true + // + && isPSarVerified + // + && isTPowVerified + // + && isStateVerified + // + && isPriceVerified + ; + } else + // + // Verify Short Signals ... + if (signal.type == X_SIGNAL_SHORT) { + // + isPSarVerified = + xState0.psar > signal.entry + && xState0.psar > candle.high + ; + + // + // Get Price Verification for Short ... + isPriceVerified = + // + // Starter ... + true + // + && !isBigSharpOccured + // + && signal.entry > ll + && pCandle.low != ll + ; + + // + int above20TPowers = 0; + double signalSlope = 0; + int tPowUnverifyConditions = 0; + int tPowUnverifyConditionsIdx = 0; + for (int i = signalBarIndex; i < signalBarIndex + xSwingLength; i++) { + // + XTPOWState iTPowState = GetXTPowState( + i, + xSwingLength + ); + + // + // Calculate Signal Slope ... + if (i == signalBarIndex) { + // + signalSlope = iTPowState.signal; + } else if (i == signalBarIndex + 1) { + // + signalSlope = GetSlope( + 1, + iTPowState.signal, + 2, + signalSlope + ); + } + + // + if ( + iTPowState.powerUp > iTPowState.powerDown + && MathMax(iTPowState.powerUp, iTPowState.powerDown) > 20 + ) { + above20TPowers++; + } + + // + if (tPowUnverifyConditionsIdx < 3) { + // + if ( + iTPowState.powerUp > iTPowState.powerDown + || iTPowState.signal < MathMax(iTPowState.powerUp, iTPowState.powerDown) + ) { + tPowUnverifyConditions++; + } + + // + tPowUnverifyConditionsIdx++; + } + } + + // + isTPowVerified = + above20TPowers < 1 + && tPowUnverifyConditions == 0 + && MathAbs(xTPow0.powerUp - xTPow0.powerDown) > 50 * _Point + ; + + // + isStateVerified = + // + // Start ... + true + // + // && (xStateLast.verifier - xState0.verifier) >= 0 + // + && xState0.verifier > signal.entry + // + && MathAbs(signal.entry - xState0.verifier) < (xSharpDetectorFactor * _Point) + ; + + // + result = + // + // Starter Condition ... + true + // + && isPSarVerified + // + && isTPowVerified + // + && isStateVerified + // + && isPriceVerified + ; + } + + // + return result; +} +// +// END Functions ... +// + +// +// START Data Provider ... +// +XMarketState GetXMarketState( + const int bar_index +) { + // + XMarketState result = {}; + + // + double fast = GetMA( + bar_index, + xSwingLength, + 0, + MODE_SMA, + PRICE_CLOSE + ); + + // + double open = GetMA( + bar_index, + xSwingLength, + 0, + MODE_SMA, + PRICE_OPEN + ); + + // + double slow = GetMA( + bar_index, + xSwingLength * 2, + 0, + MODE_SMA, + PRICE_CLOSE + ); + + // + double oscillator = GetMA( + bar_index, + xSwingLength, + 0, + MODE_EMA, + PRICE_CLOSE + ); + + // + double oscillatorVerifier = GetMA( + bar_index, + xSwingLength, + 0, + MODE_EMA, + PRICE_WEIGHTED + ); + + // + int dailyCount = GetDailyCandleCount(); + double verifier = GetMA( + bar_index, + dailyCount, + 0, + MODE_EMA, + PRICE_MEDIAN + ); + + // + double psar = iSAR( + _Symbol, + _Period, + xPSarStep, + xPSarMaximum, + bar_index + ); + + // + result.psar = psar; + result.fast = fast; + result.open = open; + result.slow = slow; + result.verifier = verifier; + result.oscillator = oscillator; + result.oscillatorVerifier = oscillatorVerifier; + + // + return result; +} +// +// END Data Provider ... +// diff --git a/BKPS/OLD/XAUUSD-15M-V1.0/MQ4/Libraries/x-saherelm.xr.signal.lib.mq4 b/BKPS/OLD/XAUUSD-15M-V1.0/MQ4/Libraries/x-saherelm.xr.signal.lib.mq4 new file mode 100644 index 0000000..53785cf --- /dev/null +++ b/BKPS/OLD/XAUUSD-15M-V1.0/MQ4/Libraries/x-saherelm.xr.signal.lib.mq4 @@ -0,0 +1,1142 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL4 X Signal Global Library +// --------------------------------------------------- +// saherelm useful tools and definitions ... +// +// +// Maintainer: +// ------------ +// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) +// +////////////////////////////////////////////////////// +#property library +#property copyright "Copyright 2023, SaherElm IT Center" +#property link "https://www.saherelm.ir" +#property version "1.00" +#property strict + +// +// Includes library ... +#include "../Libraries/x-saherelm.lib.mq4" + +// +// Includes Indicator library ... +#include "../Libraries/x-saherelm.indicator.lib.mq4" + +// +// Includes Models library ... +#include "../Libraries/x-saherelm.models.lib.mq4" + +// +// START Inputs ... +// +// +input string xRStarter = "- XR Signal Provider -"; // --> XR Signal Provider <-- + +// +input bool enableXRSignalling = false; // XR Signalling Enable + +// +input bool enableXRLong = true; // XR Signalling Enable Long +input bool enableXRShort = true; // XR Signalling Enable Short + +// +input double xRShortR2R = 1.5; // XR Short Risk To Reward Ratio +input double xRShortLotsPerTradePercent = 0.0002; // XR Lots Percent per Short Trades +input double xRShortMaxDrawdownPerTradePercent = 0.15; // XR Max Allowed DrawDown Percent per Short Trade + +// +input double xRLongR2R = 1.5; // XR Long Risk To Reward Ratio +input double xRLongLotsPerTradePercent = 0.0002; // XR Lots Percent per Short Trades +input double xRLongMaxDrawdownPerTradePercent = 0.15; // XR Max Allowed DrawDown Percent per Long Trade + +// +input int xRMaximumCandlesPerTrade = 96; // XR Maximum Candles which a Trade can open + +// +input int xRSwingLength = 48; // XR Swing Length +// +// END Inputs ... +// + +// +input double xRSharpDetectionFactor = 1350; // XR Sharp Detection Factor + +// +// START Global Requirement Functions ... +// +// +// XR Market State ... +struct XRMarketState { + // + double fast; + double slow; + double open; + + // + double range; + double rangeFast; + double rangeSlow; + double rangeOpen; + + // + double verifier; +}; + +// +// XR Based Signal Conditions ... +struct XRSignalConditions { + datetime startTime; + datetime signalTime; + datetime entryTime; +}; + +// +static XRSignalConditions xRLongConds; +static bool xRCloseLongTrades = false; +static bool xRWaitForLongSignals = true; + +// +static XRSignalConditions xRShortConds; +static bool xRCloseShortTrades = false; +static bool xRWaitForShortSignals = true; + +// +// Count Number of Closed Maximum DrawDown Trades ... +static int xRFailedSignals = 0; + +// +double xRMaximumDrawDown = 0; + +// +int fastLength = 0; +int slowLength = 0; + +// +int verifierLength = 0; + +// +int rangeFastLength = 0; +int rangeSlowLength = 0; +// +// END Global Requirement Functions ... +// + +// +// START Functions ... +// +// +// Check and Fill Long and Short Signal Handlers ... +void CheckXRSignalHandler( + const int bar_index +) { + // + // Check Market For Enable/Disable Signal Handlers ... + // Checking Market for Long Signals ... + + // + if ( + !enableXRSignalling + || !(enableXRLong || enableXRShort) + ) { + return; + } +} + +// +// Check and Fill Long Signal Conditions ... +void CheckXRLongSignalConditions( + const int bar_index +) { + // + if ( + !enableXRLong + || !enableXRSignalling + ) { + return; + } + + // + datetime barTime = iTime( + _Symbol, + _Period, + bar_index + ); + + // + // Read Prices ... + XPrice prices = GetPrice(); + + // + // Read XPVTState ... + XPvtState pvt0 = GetPVTState( + bar_index, + xRSwingLength + ); + + // + // Double Length Pivots ... + XPvtState dblPvt0 = GetPVTState( + bar_index, + (xRSwingLength * 2) + ); + + // + // Reading Required Candles ... + XOHCL candle0 = GetCandleModel(bar_index); + XOHCL candle1 = GetCandleModel(bar_index + 1); + XOHCL candle2 = GetCandleModel(bar_index + 2); + XOHCL candle3 = GetCandleModel(bar_index + 3); + + // + // Reding Required XRMarketStates ... + XRMarketState state0 = GetXRMarketState(bar_index); + XRMarketState state1 = GetXRMarketState(bar_index + 1); + XRMarketState state2 = GetXRMarketState(bar_index + 2); + XRMarketState state3 = GetXRMarketState(bar_index + 3); + + // + // Reading required XRangeStates ... + XRState range0 = ReadXRange( + bar_index + xRSwingLength, + xRSwingLength + ); + XRState range1 = ReadXRange( + bar_index + xRSwingLength + 1, + xRSwingLength + ); + XRState range2 = ReadXRange( + bar_index + xRSwingLength + 2, + xRSwingLength + ); + + // + XRState cRange0 = ReadXRange( + bar_index, + xRSwingLength + ); + + // + // Validate Farest Range Values ... + if ( + range2.hh == 0 + || + range2.ll == 0 + || + range2.mid == 0 + ) { + return; + } + + // + // Reading Required XTPowStates ... + XTPOWState tPow0 = GetXTPowState( + bar_index, + xRSwingLength + ); + XTPOWState tPow1 = GetXTPowState( + bar_index + 1, + xRSwingLength + ); + XTPOWState tPow2 = GetXTPowState( + bar_index + 2, + xRSwingLength + ); + + // + // if state verifier below range middle + // this means market is bullish ... + // + // if state verifier above range middle + // this means market is bearish ... + // + + // + bool isMarketBullish = + state0.verifier < range0.mid + && state1.verifier < range1.mid; + bool isMarketBearish = + state0.verifier > range0.mid + && state1.verifier > range1.mid; + bool isMarketGoingBullish = + state0.verifier > range0.mid + && !(state1.verifier > range1.mid); + bool isMarketGoingBearish = + state0.verifier < range0.mid + && !(state1.verifier < range1.mid); + + // + // Check Highest High Conditions ... + bool isHHVerified = + !( + pvt0.hh == dblPvt0.hh + ) + ; + + // + int sharpDetectionLength = 7; + double sharpDetectionValue = xRSharpDetectionFactor * _Point; + + // + int sharpHHIdx = iHighest( + _Symbol, + _Period, + MODE_HIGH, + sharpDetectionLength, + bar_index + ); + double sharpHH = iHigh( + _Symbol, + _Period, + sharpHHIdx + ); + + // + int sharpLLIdx = iLowest( + _Symbol, + _Period, + MODE_LOW, + sharpDetectionLength, + bar_index + ); + double sharpLL = iLow( + _Symbol, + _Period, + sharpLLIdx + ); + + // + double sharpDiff = sharpHH - sharpLL; + bool isSharpOccered = + sharpDiff > sharpDetectionValue; + + // + XRMarketState lastState = GetXRMarketState( + bar_index + sharpDetectionLength + ); + + // + double stateFSDiff = (state0.fast - state0.slow) - (lastState.fast - lastState.slow); + + // + // Start Calculating Long Conditions ... + bool longCondition1 = + // + // Starter ... + true + // + && isMarketBullish + // + && + ( + candle2.high < range2.mid + || ( + candle2.high > range2.mid + && candle2.low < range2.mid + ) + ) + && candle1.low > range1.mid + ; + + // + if ( + // + ( + longCondition1 + ) + // + && xRLongConds.startTime == 0 + && xRLongConds.entryTime == 0 + && xRLongConds.signalTime == 0 + ) { + // + xRLongConds.startTime = barTime; + xRLongConds.entryTime = barTime; + xRLongConds.signalTime = barTime; + + // + return; + } +} + +// +// Check and Fill Short Signal Conditions ... +void CheckXRShortSignalConditions( + const int bar_index +) { + // + if ( + !enableXRShort + || !enableXRSignalling + ) { + return; + } + + // + datetime barTime = iTime( + _Symbol, + _Period, + bar_index + ); + + // + // Read Prices ... + XPrice prices = GetPrice(); + + // + // Read XPVTState ... + XPvtState pvt0 = GetPVTState( + bar_index, + xRSwingLength + ); + + // + // Double Length Pivots ... + XPvtState dblPvt0 = GetPVTState( + bar_index, + (xRSwingLength * 2) + ); + + // + // Reading Required Candles ... + XOHCL candle0 = GetCandleModel(bar_index); + XOHCL candle1 = GetCandleModel(bar_index + 1); + XOHCL candle2 = GetCandleModel(bar_index + 2); + XOHCL candle3 = GetCandleModel(bar_index + 3); + + // + // Reding Required XRMarketStates ... + XRMarketState state0 = GetXRMarketState(bar_index); + XRMarketState state1 = GetXRMarketState(bar_index + 1); + XRMarketState state2 = GetXRMarketState(bar_index + 2); + XRMarketState state3 = GetXRMarketState(bar_index + 3); + + // + // Reading required XRangeStates ... + XRState range0 = ReadXRange( + bar_index + xRSwingLength, + xRSwingLength + ); + XRState range1 = ReadXRange( + bar_index + xRSwingLength + 1, + xRSwingLength + ); + XRState range2 = ReadXRange( + bar_index + xRSwingLength + 2, + xRSwingLength + ); + + // + XRState cRange0 = ReadXRange( + bar_index, + xRSwingLength + ); + + // + // Validate Farest Range Values ... + if ( + range2.hh == 0 + || + range2.ll == 0 + || + range2.mid == 0 + ) { + return; + } + + // + // Reading Required XTPowStates ... + XTPOWState tPow0 = GetXTPowState( + bar_index, + xRSwingLength + ); + XTPOWState tPow1 = GetXTPowState( + bar_index + 1, + xRSwingLength + ); + XTPOWState tPow2 = GetXTPowState( + bar_index + 2, + xRSwingLength + ); + + // + // if state verifier below range middle + // this means market is bullish ... + // + // if state verifier above range middle + // this means market is bearish ... + // + + // + bool isMarketBullish = + state0.verifier < range0.mid + && state1.verifier < range1.mid; + bool isMarketBearish = + state0.verifier > range0.mid + && state1.verifier > range1.mid; + bool isMarketGoingBullish = + state0.verifier > range0.mid + && !(state1.verifier > range1.mid); + bool isMarketGoingBearish = + state0.verifier < range0.mid + && !(state1.verifier < range1.mid); + + // + // Check Highest High Conditions ... + bool isHHVerified = + !( + pvt0.hh == dblPvt0.hh + ) + ; + + // + int sharpDetectionLength = 7; + double sharpDetectionValue = xRSharpDetectionFactor * _Point; + + // + int sharpHHIdx = iHighest( + _Symbol, + _Period, + MODE_HIGH, + sharpDetectionLength, + bar_index + ); + double sharpHH = iHigh( + _Symbol, + _Period, + sharpHHIdx + ); + + // + int sharpLLIdx = iLowest( + _Symbol, + _Period, + MODE_LOW, + sharpDetectionLength, + bar_index + ); + double sharpLL = iLow( + _Symbol, + _Period, + sharpLLIdx + ); + + // + double sharpDiff = sharpHH - sharpLL; + bool isSharpOccered = + sharpDiff > sharpDetectionValue; + + // + XRMarketState lastState = GetXRMarketState( + bar_index + sharpDetectionLength + ); + + // + double stateFSDiff = (state0.fast - state0.slow) - (lastState.fast - lastState.slow); + + // + // Start Calculating Long Conditions ... + bool shortCondition1 = + // + // Starter ... + true + // + && isMarketBearish + // + && + ( + candle2.low > range2.mid + || ( + candle2.high > range2.mid + && candle2.low < range2.mid + ) + ) + && candle1.high < range1.mid + ; + + // + if ( + // + ( + shortCondition1 + ) + // + && xRShortConds.startTime == 0 + && xRShortConds.entryTime == 0 + && xRShortConds.signalTime == 0 + ) { + // + xRShortConds.startTime = barTime; + xRShortConds.entryTime = barTime; + xRShortConds.signalTime = barTime; + + // + return; + } +} + +// +// Convert Long Signal Conditions to XSignal ... +XSignalRequest GenerateXRSignal( + const ENUM_X_SIGNAL_TYPE type, // Signal Type ... + const string signalTag , // Signal Tag ... + const int bar_index +) { + // + XSignalRequest result = {}; + + // + result.hasSignal = false; + result.type = X_SIGNAL_NONE; + result.provider = X_UNKNOWN_PROVIDER; + + // + if ( + !enableXRSignalling + || !(enableXRLong || enableXRShort) + ) { + return result; + } + + // + bool requestLong = type == X_SIGNAL_LONG; + + // + if (requestLong) { + // + if ( + !ValidateXRLongConditions() + ) { + return result; + } + } else { + // + if ( + !ValidateXRShortConditions() + ) { + return result; + } + } + + // + // Price Calculations ... + XPvtState pvts = GetPVTState( + bar_index, + xRSwingLength + ); + XPrice prices = GetPrice(); + + // + double entryPrice = requestLong ? + prices.longEntry : + prices.shortEntry + ; + + // + double openPrice = iOpen( + _Symbol, + _Period, + bar_index + ); + + // + double closePrice = iClose( + _Symbol, + _Period, + bar_index + ); + + // + double risk = requestLong ? + MathMin(openPrice, closePrice) - pvts.ll : + pvts.hh - MathMax(openPrice, closePrice); + if (risk <= 0) { + // + risk = requestLong ? + MathAbs(pvts.hh - entryPrice) : + MathAbs(pvts.ll - entryPrice) + ; + } + + // + double reward = + requestLong ? + risk * xRLongR2R : + risk * xRShortR2R + ; + + // + double sl = requestLong ? + 0 : + 0; + + // + double tp = requestLong ? + entryPrice + reward : + entryPrice - reward + ; + + // + datetime barTime = iTime( + _Symbol, + _Period, + bar_index + ); + + // + result.signal.tp = tp; + result.signal.sl = sl; + result.signal.type = type; + result.signal.time = barTime; + result.signal.tag = signalTag; + result.signal.symbol = _Symbol; + result.signal.entry = entryPrice; + result.signal.id = totalSignals + 1; + result.signal.provider = X_XR_PROVIDER; + + // + result.hasSignal = true; + result.type = type; + result.provider = X_XR_PROVIDER; + + // + return result; +} + +// +// Validate Long Signal Conditions ... +bool ValidateXRLongConditions() { + // + if ( + !enableXRLong + || !enableXRSignalling + ) { + return false; + } + + // + bool isConditionsFilled = + xRLongConds.startTime > 0 + && xRLongConds.signalTime > 0 + && xRLongConds.entryTime > 0 + ; + + // + bool isBLFilled = false; + if (isConditionsFilled) { + // + isBLFilled = + // + xRLongConds.signalTime >= xRLongConds.startTime + && xRLongConds.entryTime >= xRLongConds.signalTime + ; + } + + // + bool result = + isBLFilled + && isConditionsFilled + && xRWaitForLongSignals + ; + + // + // Since maybe Conditions Filled but + // Slope is Negative, for Handling Next Signals and + // Prevent from infinity loop, here we Clear Signal Conditions ... + if ( + !result + && isConditionsFilled + ) { + ClearXRLongSignalConditions(); + } + + // + return result; +} + +// +// Validate Short Signal Conditions ... +bool ValidateXRShortConditions() { + // + if ( + !enableXRShort + || !enableXRSignalling + ) { + return false; + } + + // + bool isConditionsFilled = + xRShortConds.startTime > 0 + && xRShortConds.signalTime > 0 + && xRShortConds.entryTime > 0 + ; + + // + bool isBLFilled = false; + if (isConditionsFilled) { + // + isBLFilled = + // + xRShortConds.signalTime >= xRShortConds.startTime + && xRShortConds.entryTime >= xRShortConds.signalTime + ; + } + + // + bool result = + isBLFilled + && isConditionsFilled + && xRWaitForShortSignals + ; + + // + // Since maybe Conditions Filled but + // Slope is Negative, for Handling Next Signals and + // Prevent from infinity loop, here we Clear Signal Conditions ... + if ( + !result + && isConditionsFilled + ) { + ClearXRShortSignalConditions(); + } + + // + return result; +} + +// +// Clear Long Signal Conditions for New One ... +void ClearXRLongSignalConditions() { + // + xRLongConds.startTime = 0; + xRLongConds.signalTime = 0; + xRLongConds.entryTime = 0; +} + +// +// Clear Short Signal Conditions for New One ... +void ClearXRShortSignalConditions() { + // + xRShortConds.startTime = 0; + xRShortConds.signalTime = 0; + xRShortConds.entryTime = 0; +} + +// +// Check State for Long Signals ... +bool IsReadyForXRSignals( + const XSignal &signal +) { + // + bool result = false; + + // + if ( + !enableXRSignalling + || !(enableXRLong || enableXRShort) + ) { + return result; + } + + // + // Find Signal Bar Index ... + int signalBarIndex = iBarShift( + _Symbol, + _Period, + signal.time + ); + + // + // Read Prices ... + XPrice prices = GetPrice(); + + // + // Read XPVTState ... + XPvtState pvt0 = GetPVTState( + signalBarIndex, + xRSwingLength + ); + + // + // Reading Required Candles ... + XOHCL candle0 = GetCandleModel(signalBarIndex); + XOHCL candle1 = GetCandleModel(signalBarIndex + 1); + XOHCL candle2 = GetCandleModel(signalBarIndex + 2); + XOHCL candle3 = GetCandleModel(signalBarIndex + 3); + + // + // Reding Required XRMarketStates ... + XRMarketState state0 = GetXRMarketState(signalBarIndex); + XRMarketState state1 = GetXRMarketState(signalBarIndex + 1); + XRMarketState state2 = GetXRMarketState(signalBarIndex + 2); + XRMarketState state3 = GetXRMarketState(signalBarIndex + 3); + + // + // Reading required XRangeStates ... + XRState range0 = ReadXRange( + signalBarIndex + xRSwingLength, + xRSwingLength + ); + XRState range1 = ReadXRange( + signalBarIndex + xRSwingLength + 1, + xRSwingLength + ); + XRState range2 = ReadXRange( + signalBarIndex + xRSwingLength + 2, + xRSwingLength + ); + + // + // Reading Required XTPowStates ... + XTPOWState tPow0 = GetXTPowState( + signalBarIndex, + xRSwingLength + ); + XTPOWState tPow1 = GetXTPowState( + signalBarIndex + 1, + xRSwingLength + ); + XTPOWState tPow2 = GetXTPowState( + signalBarIndex + 2, + xRSwingLength + ); + + // + double hhllDiff = MathAbs(pvt0.hh - pvt0.ll); + double sharpDetectionValue = xRSharpDetectionFactor * _Point; + bool isSharpOccured = hhllDiff > sharpDetectionValue; + + // + // Calculate State Min Max Diff ... + // + double state0Min = MathMin(state0.fast, state0.slow); + state0Min = MathMin(state0Min, state0.open); + state0Min = MathMin(state0Min, state0.rangeFast); + state0Min = MathMin(state0Min, state0.rangeSlow); + state0Min = MathMin(state0Min, state0.rangeOpen); + state0Min = MathMin(state0Min, state0.verifier); + + // + double state0Max = MathMax(state0.fast, state0.slow); + state0Max = MathMax(state0Max, state0.open); + state0Max = MathMax(state0Max, state0.rangeFast); + state0Max = MathMax(state0Max, state0.rangeSlow); + state0Max = MathMax(state0Max, state0.rangeOpen); + state0Max = MathMax(state0Max, state0.verifier); + + // + double state0MinMaxDiff = (state0Max - state0Min); + + // + bool isTPowValid = false; + bool isStateValid = false; + bool isRangeValid = false; + + // + // Verify Long Signals ... + if (signal.type == X_SIGNAL_LONG) { + // + // Retrieve TPow Verifications ... + isTPowValid = + // + // Starter ... + true + ; + + // + // Retrieve XMarket Verifications ... + isStateValid = + // + // Starter ... + true + // + // && !(state0MinMaxDiff > sharpDetectionValue) + ; + + // + // Retrieve XRange Verifications ... + isRangeValid = + // + // Starter ... + true + ; + + // + result = + // + // Starter ... + true + // + && isTPowValid + && isStateValid + && isRangeValid + ; + } else + // + // Verify Short Signals ... + if (signal.type == X_SIGNAL_SHORT) { + // + // Retrieve TPow Verifications ... + isTPowValid = + // + // Starter ... + true + ; + + // + // Retrieve XMarket Verifications ... + isStateValid = + // + // Starter ... + true + ; + + // + // Retrieve XRange Verifications ... + isRangeValid = + // + // Starter ... + true + ; + + // + result = + // + // Starter ... + true + // + && isTPowValid + && isStateValid + && isRangeValid + ; + } + + // + return result; +} +// +// END Functions ... +// + +// +// START Data Providers ... +// +// +XRMarketState GetXRMarketState( + const int bar_index +) { + // + XRMarketState result = {}; + + // + // Calculate Market Lengths ... + + // + if (fastLength == 0) { + fastLength = xRSwingLength; + } + + // + if (slowLength == 0) { + slowLength = xRSwingLength * 2; + } + + // + if (verifierLength == 0) { + verifierLength = (GetDailyCandleCount() * 2); + } + + // + if (rangeFastLength == 0) { + rangeFastLength = (int)(verifierLength / 2); + } + + // + if (rangeSlowLength == 0) { + rangeSlowLength = verifierLength; + } + + // + // Reading Values ... + + // + double fast = GetMA( + bar_index, + fastLength, + 0, + MODE_SMA, + PRICE_CLOSE + ); + + // + double slow = GetMA( + bar_index, + slowLength, + 0, + MODE_SMA, + PRICE_CLOSE + ); + + // + double open = GetMA( + bar_index, + fastLength, + 0, + MODE_SMA, + PRICE_OPEN + ); + + // + double rangeFast = GetMA( + bar_index, + rangeFastLength, + 0, + MODE_SMA, + PRICE_CLOSE + ); + + // + double rangeSlow = GetMA( + bar_index, + rangeSlowLength, + 0, + MODE_SMA, + PRICE_CLOSE + ); + + // + double rangeOpen = GetMA( + bar_index, + rangeFastLength, + 0, + MODE_SMA, + PRICE_OPEN + ); + + // + double verifier = GetMA( + bar_index, + verifierLength, + 0, + MODE_EMA, + PRICE_MEDIAN + ); + + // + // Filling Result ... + result.fast = fast; + result.slow = slow; + result.open = open; + result.verifier = verifier; + result.rangeFast = rangeFast; + result.rangeSlow = rangeSlow; + result.rangeOpen = rangeOpen; + + // + return result; +} +// +// END Data Providers ... +// \ No newline at end of file diff --git a/BKPS/OLD/XAUUSD-15M-V1.0/MQ4/Libraries/x-saherelm.xtpw.signal.lib.mq4 b/BKPS/OLD/XAUUSD-15M-V1.0/MQ4/Libraries/x-saherelm.xtpw.signal.lib.mq4 new file mode 100644 index 0000000..4bf02ce --- /dev/null +++ b/BKPS/OLD/XAUUSD-15M-V1.0/MQ4/Libraries/x-saherelm.xtpw.signal.lib.mq4 @@ -0,0 +1,1332 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL4 XTPW Signal Global Library +// --------------------------------------------------- +// XSaherElm EA Signal Provider based on +// XTPow Indicator... +// +// +// Maintainer: +// ------------ +// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) +// +////////////////////////////////////////////////////// +#property library +#property copyright "Copyright 2023, SaherElm IT Center" +#property link "https://www.saherelm.ir" +#property version "1.00" +#property strict + +// +// Includes library ... +#include "../Libraries/x-saherelm.lib.mq4" + +// +// Includes Indicator library ... +#include "../Libraries/x-saherelm.indicator.lib.mq4" + +// +// Includes Models library ... +#include "../Libraries/x-saherelm.models.lib.mq4" + +// +// START Inputs ... +// +// +input string xTPWStarter = "- XTPW Signal Provider -"; // ---> XTPW Signal Provider <--- + +// +input bool enableXTPWSignalling = true; // XTPW Signalling Enable + +// +input bool enableXTPWLong = true; // XTPW Signalling Enable Long +input bool enableXTPWShort = true; // XTPW Signalling Enable Short + +// +input double xTPWShortR2R = 2; // XTPW Short Risk To Reward Ratio +input double xTPWShortLotsPerTradePercent = 0.0002; // XTPW Lots Percent per Short Trades +input double xTPWShortMaxDrawdownPerTradePercent = 0.3; // XTPW Max Allowed DrawDown Percent per Short Trade + +// +input double xTPWLongR2R = 2; // XTPW Long Risk To Reward Ratio +input double xTPWLongLotsPerTradePercent = 0.0002; // XTPW Lots Percent per Short Trades +input double xTPWLongMaxDrawdownPerTradePercent = 0.3; // XTPW Max Allowed DrawDown Percent per Long Trade + +// +input int xTPWMaximumCandlesPerTrade = 206; // XTPW Maximum Candles which a Trade can open + +// +input double xTPWPSarStep = 0.02; // XTPW Parabolic Sar Step +input double xTPWPSarMaximum = 0.2; // XTPW Parabolic Sar Maximum + +// +input int xTPWSwingLength = 7; // XTPW Signal Swing Length +// +// END Inputs ... +// + +// +input double xTPWSharpDetectionFactor = 650; // XTPW Sharp Detection Factor + +// +// START Global Requirement Functions ... +// +// +// XTPW Based Signal Conditions ... +struct XTPWSignalConditions { + datetime startTime; + datetime signalTime; + datetime entryTime; +}; + +// +struct XTPWMarketState { + // + double psar; + + // + double scFast; + double scSlow; + double scWeight; + + // + double mcFast; + double mcSlow; + double mcWeight; + + // + double lcFast; + double lcSlow; + double lcWeight; +}; + +// +struct XLHS { + // + double scHH; + double scLL; + + // + double mcHH; + double mcLL; + + // + double lcHH; + double lcLL; +}; + +// +static XTPWSignalConditions xTPWLongConds; +static bool xTPWCloseLongTrades = false; +static bool xTPWWaitForLongSignals = true; + +// +static XTPWSignalConditions xTPWShortConds; +static bool xTPWCloseShortTrades = false; +static bool xTPWWaitForShortSignals = true; + +// +// Count Number of Closed Maximum DrawDown Trades ... +static int xTPWFailedSignals = 0; + +// +double tPowerVerifier = 20; +double tPowerMaxVerifier = 55; + +// +int scFastLength = 0; +int scSlowLength = 0; + +// +int mcFastLength = 0; +int mcSlowLength = 0; + +// +int lcFastLength = 0; +int lcSlowLength = 0; + +// +datetime lastTurnOffLongTradesTime; +datetime lastTurnOffShortTradesTime; +// +// END Global Requirement Functions ... +// + +// +// START Functions ... +// +// +// Check and Fill Long and Short Signal Handlers ... +void CheckXTPWSignalHandler( + const int bar_index +) { + // + // Check Market For Enable/Disable Signal Handlers ... + // Checking Market for Long Signals ... + + // + if ( + !enableXTPWSignalling + || !(enableXTPWLong || enableXTPWShort) + ) { + return; + } + + // + datetime barTime = iTime( + _Symbol, + _Period, + bar_index + ); + + // + XOHCL candle0 = GetCandleModel(bar_index); + XOHCL candle1 = GetCandleModel(bar_index + 1); + XOHCL candle2 = GetCandleModel(bar_index + 1); + + // + XTPOWState tPow0 = GetXTPowState( + bar_index, + xTPWSwingLength + ); + XTPOWState tPow1 = GetXTPowState( + bar_index + 1, + xTPWSwingLength + ); + XTPOWState tPow2 = GetXTPowState( + bar_index + 2, + xTPWSwingLength + ); + + // + XTPWMarketState state0 = GetXTPWMarketState( + bar_index + ); + XTPWMarketState state1 = GetXTPWMarketState( + bar_index + 1 + ); + XTPWMarketState state2 = GetXTPWMarketState( + bar_index + 2 + ); + + // // + // // Disable Long Conditions ... + // if ( + // xTPWWaitForLongSignals + // && + // ( + // isRangeCrossOverRangeWeight + // || + // isRangeCrossUnderRangeWeight + // || + // isTPowUpperAboveMaxVerifier + // ) + // ) { + // // + // xTPWWaitForLongSignals = false; + // lastTurnOffLongTradesTime = barTime; + // } + + // // + // // Enable Long Conditions ... + // if ( + // !xTPWWaitForLongSignals + // && lastTurnOffLongTradesTime > 0 + // && ( + // // isFastCrossOverSlow + // // || + // // isFastCrossUnderSlow + // isRangeCrossOverRangeWeight + // || + // isRangeCrossUnderRangeWeight + // || + // isTPowUpperBelowMaxVerifier + // ) + // ) { + // // + // // Find Last Turn Off Bar Index ... + // int lastTurnOffLongTradesBarIndex = iBarShift( + // _Symbol, + // _Period, + // lastTurnOffLongTradesTime + // ); + + // // + // // the Distance must be bigger than market length ... + // if (MathAbs(lastTurnOffLongTradesBarIndex - bar_index) > xTPWSwingLength) { + // // + // xTPWWaitForLongSignals = true; + // lastTurnOffLongTradesTime = 0; + // } + // } +} + +// +// Check and Fill Long Signal Conditions ... +void CheckXTPWLongSignalConditions( + const int bar_index +) { + // + if ( + !enableXTPWLong + || !enableXTPWSignalling + || !xTPWWaitForLongSignals + ) { + return; + } + + // + datetime barTime = iTime( + _Symbol, + _Period, + bar_index + ); + + // + // Retrieve TPow States ... + XTPOWState tPow0 = GetXTPowState( + bar_index, + xTPWSwingLength + ); + XTPOWState tPow1 = GetXTPowState( + bar_index + 1, + xTPWSwingLength + ); + XTPOWState tPow2 = GetXTPowState( + bar_index + 2, + xTPWSwingLength + ); + + // + // Retrieve TPowMarket State ... + XTPWMarketState state0 = GetXTPWMarketState( + bar_index + ); + XTPWMarketState state1 = GetXTPWMarketState( + bar_index + 1 + ); + XTPWMarketState state2 = GetXTPWMarketState( + bar_index + 2 + ); + + // + // Retrieve XPrice Model ... + XPrice prices = GetPrice(); + + // + // Retrieve Candles ... + XOHCL candle0 = GetCandleModel(bar_index); + XOHCL candle1 = GetCandleModel(bar_index + 1); + XOHCL candle2 = GetCandleModel(bar_index + 2); + + // + XLHS lhs = GetXTPWLHS(bar_index); + + // + bool isHHSame = + lhs.scHH == lhs.mcHH + && lhs.mcHH == lhs.lcHH + ; + + // + bool isLLSame = + lhs.scLL == lhs.mcLL + && lhs.mcLL == lhs.lcLL + ; + + // + bool startCondition = false; + bool signalCondition = false; + bool entryCondition = false; + + // + bool longCondition1 = + // + true + // + && !isHHSame + // + && !( + lhs.scLL == lhs.mcLL + ) + // + && !( + lhs.scHH == lhs.mcHH + ) + // + && !( + prices.longEntry + && candle0.high < state0.scFast + && candle0.high < state0.scSlow + && candle0.high < state0.mcFast + && candle0.high < state0.mcSlow + && candle0.high < state0.lcFast + && candle0.high < state0.lcSlow + ) + // + && tPow0.powerDown > tPowerMaxVerifier + && tPow1.powerDown > tPowerMaxVerifier + && tPow0.powerDown < MathMax(tPow1.powerUp, tPow1.powerDown) + && MathMax(tPow1.powerUp, tPow1.powerDown) > tPowerMaxVerifier + ; + + // + // Start Conditions ... + startCondition = ( + longCondition1 + ) + ; + + // + if ( + startCondition + && xTPWLongConds.startTime == 0 + && xTPWLongConds.signalTime == 0 + && xTPWLongConds.entryTime == 0 + ) { + // + xTPWLongConds.startTime = barTime; + xTPWLongConds.signalTime = barTime; + xTPWLongConds.entryTime = barTime; + + // + return; + } +} + +// +// Check and Fill Short Signal Conditions ... +void CheckXTPWShortSignalConditions( + const int bar_index +) { + // + if ( + !enableXTPWShort + || !enableXTPWSignalling + || !xTPWWaitForShortSignals + ) { + return; + } + + // + datetime barTime = iTime( + _Symbol, + _Period, + bar_index + ); + + // + // Retrieve TPower State ... + XTPOWState tPow0 = GetXTPowState( + bar_index, + xTPWSwingLength + ); + XTPOWState tPow1 = GetXTPowState( + bar_index + 1, + xTPWSwingLength + ); + XTPOWState tPow2 = GetXTPowState( + bar_index + 2, + xTPWSwingLength + ); + + // + // Retrieve TPWMarket State ... + XTPWMarketState state0 = GetXTPWMarketState( + bar_index + ); + XTPWMarketState state1 = GetXTPWMarketState( + bar_index + 1 + ); + XTPWMarketState state2 = GetXTPWMarketState( + bar_index + 2 + ); + + // + // Retrieve Candles ... + XOHCL candle0 = GetCandleModel(bar_index); + XOHCL candle1 = GetCandleModel(bar_index + 1); + XOHCL candle2 = GetCandleModel(bar_index + 2); + + // + XPrice prices = GetPrice(); + XLHS lhs = GetXTPWLHS(bar_index); + + // + double sharpDetectionValue = + xTPWSharpDetectionFactor * _Point; + + // + bool isHHSame = + lhs.scHH == lhs.mcHH + && lhs.mcHH == lhs.lcHH + ; + + // + bool isLLSame = + lhs.scLL == lhs.mcLL + && lhs.mcLL == lhs.lcLL + ; + + // + bool startCondition = false; + bool signalCondition = false; + bool entryCondition = false; + + // + bool shortCondition1 = + // + true + // + && tPow1.powerDown > tPowerMaxVerifier + && tPow2.powerDown < tPowerMaxVerifier + ; + + // + startCondition = ( + shortCondition1 + ) + ; + + // + if ( + startCondition + && xTPWShortConds.startTime == 0 + && xTPWShortConds.signalTime == 0 + && xTPWShortConds.entryTime == 0 + ) { + // + xTPWShortConds.startTime = barTime; + xTPWShortConds.signalTime = barTime; + xTPWShortConds.entryTime = barTime; + + // + return; + } +} + +// +// Convert Long Signal Conditions to XSignal ... +XSignalRequest GenerateXTPWSignal( + const ENUM_X_SIGNAL_TYPE type, // Signal Type ... + const string signalTag , // Signal Tag ... + const int bar_index +) { + // + XSignalRequest result = {}; + + // + result.hasSignal = false; + result.type = X_SIGNAL_NONE; + result.provider = X_UNKNOWN_PROVIDER; + + // + if ( + !enableXTPWSignalling + || !(enableXTPWLong || enableXTPWShort) + ) { + return result; + } + + // + bool requestLong = type == X_SIGNAL_LONG; + + // + // Check Condition Validations ... + if (requestLong) { + // + // Check Long Condtion is Valid, if Long Requested ... + if ( + !ValidateXTPWLongConditions() + ) { + return result; + } + } else { + // + // Check Short Condtion is Valid, if Short Requested ... + if ( + !ValidateXTPWShortConditions() + ) { + return result; + } + } + + // + double ll = + // + GetMarketLowestLow( + bar_index, + xTPWSwingLength + ) + ; + + // + double hh = + // + GetMarketHighestHigh( + bar_index, + xTPWSwingLength + ) + ; + + // + double openPrice = iOpen( + _Symbol, + _Period, + bar_index + ); + + // + double closePrice = iClose( + _Symbol, + _Period, + bar_index + ); + + // + // Price Calculations ... + XPrice prices = GetPrice(); + + // + // Read State ... + XTPWMarketState state0 = GetXTPWMarketState(bar_index); + + // + XOHCL candle0 = GetCandleModel(bar_index); + XOHCL candle1 = GetCandleModel(bar_index + 1); + XOHCL candle2 = GetCandleModel(bar_index + 2); + XOHCL candle3 = GetCandleModel(bar_index + 2); + + // + double risk = requestLong ? + // + MathMin(openPrice, closePrice) - ll : + hh - MathMax(openPrice, closePrice) + ; + + // + double longR2R = xTPWLongR2R; + double shortR2R = xTPWShortR2R; + + // + double sharpDetectorValue = xTPWSharpDetectionFactor * _Point; + + // + if ( + risk > 0 + && requestLong + ) { + return result; + } + + // + // Define Entry Price ... + double entryPrice = requestLong + ? + prices.longEntry + : + prices.shortEntry + ; + + // + // Fix TP Detects for Short Signals ... + if (!requestLong) { + risk = 0; + } + + // + double reward = requestLong ? + risk * longR2R : + risk * shortR2R + ; + + // + if (risk == 0) { + // + // Calculate Reward ... + reward = requestLong + ? + MathAbs(hh - entryPrice) + : + MathAbs(hh - entryPrice) + ; + + // + // Detect Sharp Change Occured or not ... + bool isSharpOccured = reward > sharpDetectorValue + || MathAbs(reward - sharpDetectorValue) < (50 * _Point); + + // + // Change Rewards on Special Conditions ... + if ( + ( + requestLong + && isSharpOccured + && ( + state0.lcFast < state0.lcSlow + || ( + state0.mcFast > state0.mcSlow + && state0.mcWeight < state0.mcSlow + ) + ) + ) + ) { + reward = reward / 2; + } + + // + if (reward < 50 * _Point) { + reward = (50 * _Point) + prices.priceGap; + } + + // // + // if (!requestLong) { + // reward = reward * shortR2R; + // } + } + + // + double sl = requestLong ? + 0 : + 0; + double tp = requestLong ? + entryPrice + reward : + entryPrice - reward + ; + + // + datetime barTime = iTime( + _Symbol, + _Period, + bar_index + ); + + // + result.signal.tp = tp; + result.signal.sl = sl; + result.signal.type = type; + result.signal.time = barTime; + result.signal.tag = signalTag; + result.signal.symbol = _Symbol; + result.signal.entry = entryPrice; + result.signal.id = totalSignals + 1; + result.signal.provider = X_XTPW_PROVIDER; + + // + result.hasSignal = true; + result.type = type; + result.provider = X_XTPW_PROVIDER; + + // + return result; +} + +// +// Validate Signal Conditions ... +bool ValidateXTPWLongConditions() { + // + if ( + !enableXTPWLong + || !enableXTPWSignalling + ) { + return false; + } + + // + bool isConditionsFilled = + xTPWLongConds.startTime > 0 + && xTPWLongConds.signalTime > 0 + && xTPWLongConds.entryTime > 0 + ; + + // + bool isBLFilled = false; + if (isConditionsFilled) { + // // + // int startBarIndex = iBarShift( + // _Symbol, + // _Period, + // xTPWLongConds.startTime + // ); + + // // + // int signalBarIndex = iBarShift( + // _Symbol, + // _Period, + // xTPWLongConds.signalTime + // ); + + // // + // int entryBarIndex = iBarShift( + // _Symbol, + // _Period, + // xTPWLongConds.entryTime + // ); + + // // + // int startSignalDiff = (signalBarIndex - startBarIndex); + // int entrySignalDiff = (entryBarIndex - signalBarIndex); + // int maxDiff = MathMax(startSignalDiff, entrySignalDiff); + + // + isBLFilled = + // + // Starter ... + true + // + && xTPWLongConds.signalTime >= xTPWLongConds.startTime + && xTPWLongConds.entryTime >= xTPWLongConds.signalTime + // + // && maxDiff < (xTPWSwingLength * 2) + ; + } + + // + bool result = + isBLFilled + && isConditionsFilled + && xTPWWaitForLongSignals + ; + + // + // Since maybe Conditions Filled but + // Slope is Negative, for Handling Next Signals and + // Prevent from infinity loop, here we Clear Signal Conditions ... + if ( + !result + && isConditionsFilled + ) { + ClearXTPWLongSignalConditions(); + } + + // + return result; +} + +// +// Validate Signal Conditions ... +bool ValidateXTPWShortConditions() { + // + if ( + !enableXTPWShort + || !enableXTPWSignalling + ) { + return false; + } + + // + bool isConditionsFilled = + xTPWShortConds.startTime > 0 + && xTPWShortConds.signalTime > 0 + && xTPWShortConds.entryTime > 0 + ; + + // + bool isBLFilled = false; + if (isConditionsFilled) { + // // + // int startBarIndex = iBarShift( + // _Symbol, + // _Period, + // xTPWShortConds.startTime + // ); + + // // + // int signalBarIndex = iBarShift( + // _Symbol, + // _Period, + // xTPWShortConds.signalTime + // ); + + // // + // int entryBarIndex = iBarShift( + // _Symbol, + // _Period, + // xTPWShortConds.entryTime + // ); + + // + isBLFilled = + // + // Starter ... + true + // + && xTPWShortConds.signalTime >= xTPWShortConds.startTime + && xTPWShortConds.entryTime >= xTPWShortConds.signalTime + ; + } + + // + bool result = + isBLFilled + && isConditionsFilled + && xTPWWaitForShortSignals + ; + + // + // Since maybe Conditions Filled but + // Slope is Negative, for Handling Next Signals and + // Prevent from infinity loop, here we Clear Signal Conditions ... + if ( + !result + && isConditionsFilled + ) { + ClearXTPWShortSignalConditions(); + } + + // + return result; +} + +// +// Clear Long Signal Conditions for New One ... +void ClearXTPWLongSignalConditions() { + // + xTPWLongConds.startTime = 0; + xTPWLongConds.entryTime = 0; + xTPWLongConds.signalTime = 0; +} + +// +// Clear Short Signal Conditions for New One ... +void ClearXTPWShortSignalConditions() { + // + xTPWShortConds.startTime = 0; + xTPWShortConds.entryTime = 0; + xTPWShortConds.signalTime = 0; +} + +// +// Check State for Long Signals ... +bool IsReadyForXTPWSignals( + const XSignal &signal +) { + // + bool result = false; + + // + if ( + !enableXTPWSignalling + || !(enableXTPWLong || enableXTPWShort) + ) { + return result; + } + + // + int signalBarIndex = iBarShift( + _Symbol, + _Period, + signal.time + ); + + // + // XOHCL candle = GetCandleModel(0); + XOHCL candle0 = GetCandleModel(signalBarIndex); + XOHCL candle1 = GetCandleModel(signalBarIndex + 1); + + // + // Retrieve TPow State ... + XTPOWState tPow0 = GetXTPowState( + signalBarIndex, + xTPWSwingLength + ); + XTPOWState tPow1 = GetXTPowState( + signalBarIndex + 1, + xTPWSwingLength + ); + + // + // Retrive XMarket States ... + XTPWMarketState state0 = GetXTPWMarketState(signalBarIndex); + XTPWMarketState state1 = GetXTPWMarketState(signalBarIndex + 1); + XTPWMarketState state2 = GetXTPWMarketState(signalBarIndex + 2); + + // + bool isPSarVerified = false; + bool isTPowVerified = false; + bool isStateVerified = false; + bool isPriceVerified = false; + + // + // Calculate Sharp Detection Value ... + double sharpDetectionValue = + xTPWSharpDetectionFactor * _Point; + + // + // Find State0 Min ... + double state0Min = MathMin(state0.scFast, state0.scSlow); + state0Min = MathMin(state0Min, state0.mcFast); + state0Min = MathMin(state0Min, state0.mcSlow); + state0Min = MathMin(state0Min, state0.lcFast); + state0Min = MathMin(state0Min, state0.lcSlow); + + // + // Find State0 Min ... + double state0Max = MathMax(state0.scFast, state0.scSlow); + state0Max = MathMax(state0Max, state0.mcFast); + state0Max = MathMax(state0Max, state0.mcSlow); + state0Max = MathMax(state0Max, state0.lcFast); + state0Max = MathMax(state0Max, state0.lcSlow); + + // + // Find Distance Between State0 Min and Max ... + double state0MinMaxDistance = MathAbs(state0Max - state0Min); + + // + // Verify Long Signals ... + if (signal.type == X_SIGNAL_LONG) { + // + // Get Price Verification for Long ... + isPriceVerified = + // + // Starter ... + true + // + ; + + // + isTPowVerified = + // + // Starter ... + true + // + && tPow0.powerDown > tPowerMaxVerifier + && tPow1.powerDown > tPowerMaxVerifier + && tPow0.powerDown < MathMax(tPow1.powerUp, tPow1.powerDown) + && MathMax(tPow1.powerUp, tPow1.powerDown) > tPowerMaxVerifier + ; + + // + isPSarVerified = + // + // Starter ... + true + // + ; + + // + isStateVerified = + // + // Start ... + true + // + && state0.mcFast > state0.mcSlow + && state1.mcFast > state1.mcSlow + // + && !( + state0.lcFast > state0.mcSlow + && state0.lcFast < state0.mcFast + ) + // + && MathAbs(state1.mcFast - state1.mcSlow) > (50 * _Point) + ; + + // + result = + // + // Starter ... + true + // + && isPSarVerified + // + && isTPowVerified + // + && isStateVerified + // + && isPriceVerified + ; + } else + // + // Verify Short Signals ... + if (signal.type == X_SIGNAL_SHORT) { + // + isPSarVerified = + // + // Starter ... + true + ; + + // + // Get Price Verification for Short ... + isPriceVerified = + // + // Starter ... + true + ; + + // + isTPowVerified = + // + // Starter ... + true + // + && tPow0.signal > MathMax(tPow0.powerUp, tPow0.powerDown) + ; + + // + isStateVerified = + // + // Start ... + true + // + && ( + // + state0.scFast < state0.scSlow + && state0.mcFast < state0.mcSlow + && state0.lcFast < state0.lcSlow + ? + signal.entry > state0.scFast + : + // + // Find Minimum and Maximum Distance of State ... + state0MinMaxDistance > sharpDetectionValue + ? + signal.entry > state0Min + : + true + ) + // + && MathAbs(state0.mcFast - state0.mcSlow) > 50 * _Point + ; + + // + result = + // + // Starter Condition ... + true + // + && isPSarVerified + // + && isTPowVerified + // + && isStateVerified + // + && isPriceVerified + ; + } + + // + return result; +} +// +// END Functions ... +// + +// +// START Data Provider ... +// +// +// Retrieve Market State ... +XTPWMarketState GetXTPWMarketState( + const int bar_index +) { + // + XTPWMarketState result = {}; + + // + int dayCount = GetDailyCandleCount(); + int halfDayCount = (int)(dayCount / 2); + + // + if (scFastLength == 0) { + scFastLength = xTPWSwingLength; + } + + // + if (scSlowLength == 0) { + scSlowLength = xTPWSwingLength * 2; + } + + // + if (mcFastLength == 0) { + mcFastLength = halfDayCount; + } + + // + if (mcSlowLength == 0) { + mcSlowLength = dayCount; + } + + // + if (lcFastLength == 0) { + lcFastLength = halfDayCount * 3; + } + + // + if (lcSlowLength == 0) { + lcSlowLength = dayCount * 3; + } + + // + double scFast = GetMA( + bar_index, + scFastLength, + 0, + MODE_SMA, + PRICE_CLOSE + ); + + // + double scSlow = GetMA( + bar_index, + scSlowLength, + 0, + MODE_SMA, + PRICE_CLOSE + ); + + // + double scWeight = GetMA( + bar_index, + scSlowLength, + 0, + MODE_EMA, + PRICE_MEDIAN + ); + + // + double mcFast = GetMA( + bar_index, + mcFastLength, + 0, + MODE_SMA, + PRICE_CLOSE + ); + + // + double mcSlow = GetMA( + bar_index, + mcSlowLength, + 0, + MODE_SMA, + PRICE_CLOSE + ); + + // + double mcWeight = GetMA( + bar_index, + mcSlowLength, + 0, + MODE_EMA, + PRICE_MEDIAN + ); + + // + double lcFast = GetMA( + bar_index, + lcFastLength, + 0, + MODE_SMA, + PRICE_CLOSE + ); + + // + double lcSlow = GetMA( + bar_index, + lcSlowLength, + 0, + MODE_SMA, + PRICE_CLOSE + ); + + // + double lcWeight = GetMA( + bar_index, + lcSlowLength, + 0, + MODE_EMA, + PRICE_MEDIAN + ); + + // + double psar = iSAR( + _Symbol, + _Period, + xTPWPSarStep, + xTPWPSarMaximum, + bar_index + ); + + // + result.psar = psar; + result.scFast = scFast; + result.scSlow = scSlow; + result.mcFast = mcFast; + result.mcSlow = mcSlow; + result.lcFast = lcFast; + result.lcSlow = lcSlow; + result.scWeight = scWeight; + result.mcWeight = mcWeight; + result.lcWeight = lcWeight; + + // + return result; +} + +// +// Retrieve Highest Highs and Lowest Lows in Cycles ... +XLHS GetXTPWLHS( + const int bar_index +) { + // + XLHS result = {}; + + // + // Retrieve LL and HH (s) ... + + // + // SC HH ... + double scHH = GetMarketHighestHigh( + bar_index, + scFastLength + ); + + // + // SC LL ... + double scLL = GetMarketHighestHigh( + bar_index, + scFastLength + ); + + // + // MC HH ... + double mcHH = GetMarketHighestHigh( + bar_index, + mcFastLength + ); + + // + // MC LL ... + double mcLL = GetMarketHighestHigh( + bar_index, + mcFastLength + ); + + // + // LC HH ... + double lcHH = GetMarketHighestHigh( + bar_index, + lcFastLength + ); + + // + // LC LL ... + double lcLL = GetMarketHighestHigh( + bar_index, + lcFastLength + ); + + // + result.scHH = scHH; + result.scLL = scLL; + result.mcHH = mcHH; + result.mcLL = mcLL; + result.lcHH = lcHH; + result.lcLL = lcLL; + + // + return result; +} +// +// END Data Provider ... +// diff --git a/BKPS/OLD/XAUUSD-15M-V1.0/Version.txt b/BKPS/OLD/XAUUSD-15M-V1.0/Version.txt new file mode 100644 index 0000000..630faf8 --- /dev/null +++ b/BKPS/OLD/XAUUSD-15M-V1.0/Version.txt @@ -0,0 +1 @@ +packed at: Tue Oct 10 2023 01:05:43 GMT+0330 (Iran Standard Time) \ No newline at end of file diff --git a/BKPS/OLD/XEU5-0/Classes/.gitkeep b/BKPS/OLD/XEU5-0/Classes/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/BKPS/OLD/XEU5-0/Classes/x-saherelm.class.lib.mq5 b/BKPS/OLD/XEU5-0/Classes/x-saherelm.class.lib.mq5 new file mode 100644 index 0000000..4cfbd0e --- /dev/null +++ b/BKPS/OLD/XEU5-0/Classes/x-saherelm.class.lib.mq5 @@ -0,0 +1,10286 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 Class Library +// -------------------------------------- +// Name: XClass +// Description: provides all classes for use ... +// +// +// Maintainer: +// ------------ +// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) +// +////////////////////////////////////////////////////// +// +// Global Properties ... +#property library +#property copyright "Copyright 2023, SaherElm IT Center" +#property link "https://www.saherelm.ir" +#property version "1.00" +#property strict + +// +#include +#include +#include +#include +#include +#include +// +#include "../Libraries/x-saherelm.draw.lib.mq5" +#include "../Libraries/x-saherelm.alert.lib.mq5" +#include "../Libraries/x-saherelm.models.lib.mq5" +#include "../Libraries/x-saherelm.common.lib.mq5" + +// +// START Constant Definitions ... +// + +static uchar _md5_PADDING[64] = + { + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; + +#define _md5_F(x, y, z) (((x) & (y)) | ((~x) & (z))) +#define _md5_G(x, y, z) (((x) & (z)) | ((y) & (~z))) +#define _md5_H(x, y, z) ((x) ^ (y) ^ (z)) +#define _md5_I(x, y, z) ((y) ^ ((x) | (~z))) +#define _md5_ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32 - (n)))) + +#define _md5_FF(a, b, c, d, x, s, ac) \ + { \ + (a) += _md5_F((b), (c), (d)) + (x) + (uint)(ac); \ + (a) = _md5_ROTATE_LEFT((a), (s)); \ + (a) += (b); \ + } +#define _md5_GG(a, b, c, d, x, s, ac) \ + { \ + (a) += _md5_G((b), (c), (d)) + (x) + (uint)(ac); \ + (a) = _md5_ROTATE_LEFT((a), (s)); \ + (a) += (b); \ + } +#define _md5_HH(a, b, c, d, x, s, ac) \ + { \ + (a) += _md5_H((b), (c), (d)) + (x) + (uint)(ac); \ + (a) = _md5_ROTATE_LEFT((a), (s)); \ + (a) += (b); \ + } +#define _md5_II(a, b, c, d, x, s, ac) \ + { \ + (a) += _md5_I((b), (c), (d)) + (x) + (uint)(ac); \ + (a) = _md5_ROTATE_LEFT((a), (s)); \ + (a) += (b); \ + } + +#define _md5_INIT_STATE_0 0x67452301 +#define _md5_INIT_STATE_1 0xefcdab89 +#define _md5_INIT_STATE_2 0x98badcfe +#define _md5_INIT_STATE_3 0x10325476 + +#define _md5_S11 7 +#define _md5_S12 12 +#define _md5_S13 17 +#define _md5_S14 22 + +#define _md5_S21 5 +#define _md5_S22 9 +#define _md5_S23 14 +#define _md5_S24 20 + +#define _md5_S31 4 +#define _md5_S32 11 +#define _md5_S33 16 +#define _md5_S34 23 + +#define _md5_S41 6 +#define _md5_S42 10 +#define _md5_S43 15 +#define _md5_S44 21 + +// +// END Constant Definitions ... +// + +// +// START Model Definitions ... +// + +// +string X_SIGNAL_TP = "TP"; +string X_SIGNAL_SL = "SL"; +string X_SIGNAL_TYPE = "TY"; +string X_SIGNAL_TICKET = "T"; +string X_SIGNAL_RISKFREE_STEP = "RFS"; +string X_SIGNAL_RISKFREE_RATE = "RFR"; + +// +// Model Signal Handler Result on XCTrade Class ... +struct XTraderHandlerResult +{ + // + // List Of Closed On SL Signals ... + XSignal sl[]; + + // + // List Of Closed On TP Signals ... + XSignal tp[]; + + // + // List Of Risk Free Signals ... + XSignal rf[]; +}; + +// +// Model OnTrade Event Handler Result on XCTrade Class ... +struct XOnTradeHandlerResult +{ + // + bool hasNewDeal; + int newDeals; + + // + bool hasNewOrder; + int newOrders; + + // + bool hasNewPosition; + int newPositions; + + // + bool hasNewHistoryOrder; + int newHistoryOrders; +}; + +// +// Model Guard Action Applied Signals ... +struct XGuardHandlerResult +{ + // + // Critical Guard ... + XSignal criticals[]; + + // + // Max Guard ... + XSignal maxes[]; + + // + // Old ... + XSignal olds[]; + + // + // Determines Stopout Action Cals or not ... + bool isStopOut; +}; + +// +// Define Volume States ... +struct XVolumeInfo +{ + // + // Current Available Static Volume ... + double staticVolume; + + // + // Static Volume Calculation Method ... + string staticVolumeCalculationMethod; + + // + // Current Maximum Appliable Volume ... + double maxAllowedVolume; + + // + // Static Volume Increase Multiplier ... + double volumeIncreaseMultiplier; + + // + // Multiply Volume Based On Balance Growing ... + double balanceGowingToApplyMultiplier; + + // + // Where to Increase MaxAllowed Volume ... + double balanceGrowingToIncreaseMaxAllowedVolume; +}; + +// +// Model a Simple Provider Status ... +struct XSignallerInfo +{ + // + // Provider Name ... + string name; + + // + // Number of Longs ... + int longs; + + // + // Number of Shorts ... + int shorts; +}; + +// +// Model Some of Usefull Signals and Market Data ... +struct XSummaryInfo +{ + // + // Define Max Signal Volume ... + double maxSignalVolume; + + // + // Max DrawDown ... + double maxDrawDown; + + // + // Max DrawUp ... + double maxDrawUp; + + // + // Max Number of Same Time Signals ... + int maxSameTimeSignals; + + // + // Number of Long Trades ... + int longSignals; + + // + // Number of Short Trades ... + int shortSignals; + + // + // Number of TPs Attached ... + int numberOfTPs; + + // + // Number of SLs Attached ... + int numberOfSLs; +}; + +// +// Model Account info ... +struct XAccountInfo +{ + // + // User Account ... + string user; + + // + // Name of Client ... + string name; + + // + // Trade Server Name ... + string server; + + // + // Broker Name ... + string broker; + + // + // Account Trade Mode ... + ENUM_ACCOUNT_TRADE_MODE mode; + + // + // Account Leverage ... + long leverage; + + // + // Currency ... + string currency; + + // + // Deposit ... + double deposit; + + // + // Balance ... + double balance; + + // + // Min Balance for Open Trades ... + double minBalanceForOpenTrades; +}; + +// +// this is a Model Which holds Reports for Specific Time Periods ... +struct XReport +{ + // + datetime start; + + // + datetime end; + + // + XAccountInfo accountInfo; + + // + XVolumeInfo volumeInfo; + + // + XSignallerInfo signallersInfo[]; + + // + XSummaryInfo summaryInfo; +}; + +// +// an Enumeration Object which determines Report Type ... +enum ENUM_XREPORT_TYPES +{ + // + // Main Report ... + XREPORT_MAIN, + // + // Daily Report ... + XREPORT_DAILY, + // + // Weekly Report ... + XREPORT_WEEKLY, + // + // Monthly Report ... + XREPORT_MONTHLY, +}; + +// +// a Signal Protection Structure ... +struct XProtectedSignal +{ + // + ulong ticket; + + // + datetime time[]; + + // + double profit[]; +}; + +// +// Represent Collector State Based on Time ... +struct XCollector +{ + // + // time in checking ... + datetime time; + + // + // Signal Volume ... + double volume; + + // + // Max DrawDown in Check Time ... + double maxDrawDown; + + // + // Max Allowed Volume in Check Time ... + double maxAllowedVolume; + + // + // Minimum required Balance for Opening Trades at Check Time ... + double minBalanceForOpenTrade; +}; + +// +// the Action which Guard Handler Can Done when Attacked ... +enum ENUM_X_GUARD_ACTIONS +{ + // + // Do Nothing ... + X_GUARD_DO_NOTHING, + // + // Close All Open Positions ... + X_GUARD_CLOSE_ALL, + // + // Close Max In Drawdown Position ... + X_GUARD_CLOSE_MAX_IN_DD, + // + // Partial Close Max In Drawdown Position by 1% of Volume ... + X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_1, + // + // Partial Close Max In Drawdown Position by 2% of Volume ... + X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_2, + // + // Partial Close Max In Drawdown Position by 3% of Volume ... + X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_3, + // + // Partial Close Max In Drawdown Position by 5% of Volume ... + X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_5, + // + // Partial Close Max In Drawdown Position by 10% of Volume ... + X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_10, + // + // Partial Close Max In Drawdown Position by 15% of Volume ... + X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_15, + // + // Partial Close Max In Drawdown Position by 20% of Volume ... + X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_20, + // + // Partial Close Max In Drawdown Position by 25% of Volume ... + X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_25, + // + // Partial Close Max In Drawdown Position by 30% of Volume ... + X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_30, + // + // Partial Close Max In Drawdown Position by 40% of Volume ... + X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_40, + // + // Partial Close Max In Drawdown Position by 50% of Volume ... + X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_50, + // + // Partial Close Max In Drawdown Position by 60% of Volume ... + X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_60, + // + // Partial Close Max In Drawdown Position by 70% of Volume ... + X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_70, + // + // Partial Close Max In Drawdown Position by 75% of Volume ... + X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_75, +}; + +// +// Guard Reason ... +enum ENUM_X_GUARD_REASONS +{ + // + // Critical ... + X_GUARDED_CRITICAL, + // + // Max ... + X_GUARDED_MAX, + // + // Old ... + X_GUARDED_OLD +}; + +// +// All Suuported Support Positions Guard ... +enum ENUM_X_GUARD_SUPPORT_METHODS +{ + // + // Ignore Supporting ... + X_SUPPORT_DO_NOTHING, + // + // Full Both Side Support ... + X_SUPPORT_FULL, + // + // Indirectional Supports On Drawing Down ... + X_SUPPORT_IN_DRAWDOWN_INDIRECTIONAL, + // + // Directional Supports On Drawing Up ... + X_SUPPORT_IN_DRAWUP_DIRECTIONAL, +}; + +// +// END Model Definitions ... +// + +// +// START Overrides ... +// + +// +// XBase Class ... +class XCBase +{ + // + // Public ... +public: + // + // Protected ... +protected: + // + void AddItemToBuffer( + double item, // Specified Item + double &buffer[] // Specified Buffer + ) + { + // + int bufferSize = ArraySize(buffer); + + // + ArrayResize( + buffer, + bufferSize + 1); + + // + buffer[bufferSize] = item; + } + void AddItemToBuffer( + datetime item, // Specified Item + datetime &buffer[] // Specified Buffer + ) + { + // + int bufferSize = ArraySize(buffer); + + // + ArrayResize( + buffer, + bufferSize + 1); + + // + buffer[bufferSize] = item; + } + void AddItemToBuffer( + XSignal &item, + XSignal &buffer[]) + { + // + ArrayResize( + buffer, + ArraySize(buffer) + 1); + + // + buffer[ArraySize(buffer) - 1] = item; + } + void AddItemToBuffer( + XCollector &item, // Specified Item + XCollector &buffer[] // Specified Buffer + ) + { + // + int bufferSize = ArraySize(buffer); + + // + ArrayResize( + buffer, + bufferSize + 1); + + // + buffer[bufferSize] = item; + } + void AddItemToBuffer( + XSignallerInfo &item, + XSignallerInfo &buffer[]) + { + // + ArrayResize( + buffer, + ArraySize(buffer) + 1); + + // + buffer[ArraySize(buffer) - 1] = item; + } + void AddItemToBuffer( + XProtectedSignal &item, // Item ... + XProtectedSignal &buffer[] // Buffer ... + ) + { + // + int bufferSize = ArraySize(buffer); + + // + ArrayResize( + buffer, + bufferSize + 1); + buffer[bufferSize] = item; + } + + // + void CleanBuffer(double &buffer[]) + { + // + ArrayFree(buffer); + ArrayResize(buffer, 0); + } + void CleanBuffer(XDeal &buffer[]) + { + // + ArrayFree(buffer); + ArrayResize(buffer, 0); + } + void CleanBuffer(XOrder &buffer[]) + { + // + ArrayFree(buffer); + ArrayResize(buffer, 0); + } + void CleanBuffer(XSignal &buffer[]) + { + // + ArrayFree(buffer); + ArrayResize(buffer, 0); + } + void CleanBuffer(XCollector &buffer[]) + { + // + ArrayFree(buffer); + ArrayResize(buffer, 0); + } + void CleanBuffer(XSignallerInfo &buffer[]) + { + // + ArrayFree(buffer); + ArrayResize(buffer, 0); + } + void CleanBuffer(XProtectedSignal &buffer[]) + { + // + ArrayFree(buffer); + ArrayResize(buffer, 0); + } + + // + void CopyBuffer( + const XSignallerInfo &source[], // Source Buffer ... + XSignallerInfo &dest[] // Dest Buffer ... + ) + { + // + CleanBuffer(dest); + + // + int sourceCount = ArraySize(source); + if (sourceCount <= 0) + { + return; + } + + // + // Loop ... + for (int i = 0; i < sourceCount; i++) + { + // + XSignallerInfo iInfo = source[i]; + + // + AddItemToBuffer( + iInfo, + dest); + } + } + void CopyBuffer( + XProtectedSignal &source[], // Source Buffer to Copy + XProtectedSignal &dest[] // Fill this buffer using source + ) + { + // + CleanBuffer(dest); + + // + int sourceCount = ArraySize(source); + if (sourceCount <= 0) + { + return; + } + + // + for (int i = 0; i < sourceCount; i++) + { + // + XProtectedSignal iItem = source[i]; + + // + AddItemToBuffer( + iItem, + dest); + } + } + + // + // Private ... +private: +}; + +// +// XCTrade Base Class ... +class XSCTrade : 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 ... +// + +// +// START Global Definitions: Variables, Properties and etc ... +// + +// +// XCMD5 a library for Hashing ... +class XCMD5 : public XCBase +{ + // + // Public Provides ... +public: + // + // Protected Provides ... + + // + // Constructor ... + XCMD5(void) {} + + // + // Deconstructor ... + ~XCMD5(void) {} + + // + // Hash Specified Char Array ... + string Hash( + uchar &source[], // Specify Char Array to Hash + int length = 0 // Specify Length of Char Array which required to hash + ) + { + // + string result = ""; + + // + int sourceCount = ArraySize(source); + + // + // Validate Args ... + if ( + sourceCount <= 0 || + (sourceCount > 0 && length > sourceCount)) + { + return result; + } + + // + // Normalize Args ... + if (length == 0) + { + length = sourceCount; + } + + // + // Init MD5 ... + MD5Init(); + + // + // Update Buffer ... + MD5Update(source, length); + + // + // Calculate Result ... + result = MD5Final(); + + // + return result; + } + + // + // Hash Specified String ... + string Hash( + string source // Specified String + ) + { + // + string result = ""; + + // + // Converts String to Char Array ... + uchar bytes[]; + StringToCharArray( + source, + bytes, + 0, + StringLen(source)); + + // + result = Hash( + bytes, + ArraySize(bytes)); + + // + return result; + } + +protected: + // + // Private Provides ... +private: + // + uint m_lMD5[4]; + uint m_nCount[2]; + uchar m_lpszBuffer[64]; + + // + // Convert Byte to DWord ... + void ByteToDWord(int &out[], uint &in[], uint len) + { + // + uint i = 0; + uint j = 0; + + // + for (; j < len; i++, j += 4) + { + out[i] = (int)in[j] | (int)in[j + 1] << 8 | (int)in[j + 2] << 16 | (int)in[j + 3] << 24; + } + } + + // + // Convert DWord to Byte ... + void DWordToByte(uchar &out[], int &in[], uint len) + { + // + uint i = 0; + uint j = 0; + + // + for (; j < len; i++, j += 4) + { + // + out[j] = (uchar)(in[i] & 0xff); + out[j + 1] = (uchar)((in[i] >> 8) & 0xff); + out[j + 2] = (uchar)((in[i] >> 16) & 0xff); + out[j + 3] = (uchar)((in[i] >> 24) & 0xff); + } + } + + // + // Init MD5 Array ... + void MD5Init() + { + // + ArrayInitialize(m_lpszBuffer, 64); + + // + m_nCount[0] = m_nCount[1] = 0; + m_lMD5[0] = _md5_INIT_STATE_0; + m_lMD5[1] = _md5_INIT_STATE_1; + m_lMD5[2] = _md5_INIT_STATE_2; + m_lMD5[3] = _md5_INIT_STATE_3; + } + + // + // Update MD5 ... + void MD5Update(uchar &inBuf[], uint inLen) + { + // + int i, ii; + int mdi; + + // + uint in[16]; + int i0 = 0; + + // + mdi = (int)((m_nCount[0] >> 3) & 0x3F); + + // + if ((m_nCount[0] + ((uint)inLen << 3)) < m_nCount[0]) + { + m_nCount[1]++; + } + + // + m_nCount[0] += ((uint)inLen << 3); + m_nCount[1] += ((uint)inLen >> 29); + + // + while ((inLen--) > 0) + { + // + m_lpszBuffer[mdi++] = inBuf[i0++]; + if (mdi == 0x40) + { + // + for (i = 0, ii = 0; i < 16; i++, ii += 4) + { + in[i] = (((uint)m_lpszBuffer[ii + 3]) << 24) | (((uint)m_lpszBuffer[ii + 2]) << 16) | (((uint)m_lpszBuffer[ii + 1]) << 8) | ((uint)m_lpszBuffer[ii]); + } + + // + Transform(m_lMD5, in); + + // + mdi = 0; + } + } + } + + // + // Finalize an MD5 Expression ... + string MD5Final() + { + // + uchar bits[8]; + int nIndex; + uint nPadLen; + const int nMD5Size = 16; + uchar lpszMD5[16]; + string temp; + string out = ""; + int i; + + // + DWordToByte(bits, m_nCount, 8); + nIndex = (int)((m_nCount[0] >> 3) & 0x3f); + nPadLen = (nIndex < 56) ? (56 - nIndex) : (120 - nIndex); + MD5Update(_md5_PADDING, nPadLen); + MD5Update(bits, 8); + DWordToByte(lpszMD5, m_lMD5, nMD5Size); + + // + for (i = 0; i < nMD5Size; i++) + { + // + if (lpszMD5[i] == 0) + { + temp = "00"; + } + else if (lpszMD5[i] <= 15) + { + temp = StringFormat("0%x", lpszMD5[i]); + } + else + { + temp = StringFormat("%x", lpszMD5[i]); + } + + // + out += temp; + } + + // + lpszMD5[0] = '\0'; + + // + return (out); + } + + // + // Transform Buffers ... + void Transform(uint &buf[], uint &in[]) + { + // + uint a = buf[0], b = buf[1], c = buf[2], d = buf[3]; + + // + _md5_FF(a, b, c, d, in[0], _md5_S11, 0xD76AA478); + _md5_FF(d, a, b, c, in[1], _md5_S12, 0xE8C7B756); + _md5_FF(c, d, a, b, in[2], _md5_S13, 0x242070DB); + _md5_FF(b, c, d, a, in[3], _md5_S14, 0xC1BDCEEE); + _md5_FF(a, b, c, d, in[4], _md5_S11, 0xF57C0FAF); + _md5_FF(d, a, b, c, in[5], _md5_S12, 0x4787C62A); + _md5_FF(c, d, a, b, in[6], _md5_S13, 0xA8304613); + _md5_FF(b, c, d, a, in[7], _md5_S14, 0xFD469501); + _md5_FF(a, b, c, d, in[8], _md5_S11, 0x698098D8); + _md5_FF(d, a, b, c, in[9], _md5_S12, 0x8B44F7AF); + _md5_FF(c, d, a, b, in[10], _md5_S13, 0xFFFF5BB1); + _md5_FF(b, c, d, a, in[11], _md5_S14, 0x895CD7BE); + _md5_FF(a, b, c, d, in[12], _md5_S11, 0x6B901122); + _md5_FF(d, a, b, c, in[13], _md5_S12, 0xFD987193); + _md5_FF(c, d, a, b, in[14], _md5_S13, 0xA679438E); + _md5_FF(b, c, d, a, in[15], _md5_S14, 0x49B40821); + + // + _md5_GG(a, b, c, d, in[1], _md5_S21, 0xF61E2562); + _md5_GG(d, a, b, c, in[6], _md5_S22, 0xC040B340); + _md5_GG(c, d, a, b, in[11], _md5_S23, 0x265E5A51); + _md5_GG(b, c, d, a, in[0], _md5_S24, 0xE9B6C7AA); + _md5_GG(a, b, c, d, in[5], _md5_S21, 0xD62F105D); + _md5_GG(d, a, b, c, in[10], _md5_S22, 0x02441453); + _md5_GG(c, d, a, b, in[15], _md5_S23, 0xD8A1E681); + _md5_GG(b, c, d, a, in[4], _md5_S24, 0xE7D3FBC8); + _md5_GG(a, b, c, d, in[9], _md5_S21, 0x21E1CDE6); + _md5_GG(d, a, b, c, in[14], _md5_S22, 0xC33707D6); + _md5_GG(c, d, a, b, in[3], _md5_S23, 0xF4D50D87); + _md5_GG(b, c, d, a, in[8], _md5_S24, 0x455A14ED); + _md5_GG(a, b, c, d, in[13], _md5_S21, 0xA9E3E905); + _md5_GG(d, a, b, c, in[2], _md5_S22, 0xFCEFA3F8); + _md5_GG(c, d, a, b, in[7], _md5_S23, 0x676F02D9); + _md5_GG(b, c, d, a, in[12], _md5_S24, 0x8D2A4C8A); + + // + _md5_HH(a, b, c, d, in[5], _md5_S31, 0xFFFA3942); + _md5_HH(d, a, b, c, in[8], _md5_S32, 0x8771F681); + _md5_HH(c, d, a, b, in[11], _md5_S33, 0x6D9D6122); + _md5_HH(b, c, d, a, in[14], _md5_S34, 0xFDE5380C); + _md5_HH(a, b, c, d, in[1], _md5_S31, 0xA4BEEA44); + _md5_HH(d, a, b, c, in[4], _md5_S32, 0x4BDECFA9); + _md5_HH(c, d, a, b, in[7], _md5_S33, 0xF6BB4B60); + _md5_HH(b, c, d, a, in[10], _md5_S34, 0xBEBFBC70); + _md5_HH(a, b, c, d, in[13], _md5_S31, 0x289B7EC6); + _md5_HH(d, a, b, c, in[0], _md5_S32, 0xEAA127FA); + _md5_HH(c, d, a, b, in[3], _md5_S33, 0xD4EF3085); + _md5_HH(b, c, d, a, in[6], _md5_S34, 0x04881D05); + _md5_HH(a, b, c, d, in[9], _md5_S31, 0xD9D4D039); + _md5_HH(d, a, b, c, in[12], _md5_S32, 0xE6DB99E5); + _md5_HH(c, d, a, b, in[15], _md5_S33, 0x1FA27CF8); + _md5_HH(b, c, d, a, in[2], _md5_S34, 0xC4AC5665); + + // + _md5_II(a, b, c, d, in[0], _md5_S41, 0xF4292244); + _md5_II(d, a, b, c, in[7], _md5_S42, 0x432AFF97); + _md5_II(c, d, a, b, in[14], _md5_S43, 0xAB9423A7); + _md5_II(b, c, d, a, in[5], _md5_S44, 0xFC93A039); + _md5_II(a, b, c, d, in[12], _md5_S41, 0x655B59C3); + _md5_II(d, a, b, c, in[3], _md5_S42, 0x8F0CCC92); + _md5_II(c, d, a, b, in[10], _md5_S43, 0xFFEFF47D); + _md5_II(b, c, d, a, in[1], _md5_S44, 0x85845DD1); + _md5_II(a, b, c, d, in[8], _md5_S41, 0x6FA87E4F); + _md5_II(d, a, b, c, in[15], _md5_S42, 0xFE2CE6E0); + _md5_II(c, d, a, b, in[6], _md5_S43, 0xA3014314); + _md5_II(b, c, d, a, in[13], _md5_S44, 0x4E0811A1); + _md5_II(a, b, c, d, in[4], _md5_S41, 0xF7537E82); + _md5_II(d, a, b, c, in[11], _md5_S42, 0xBD3AF235); + _md5_II(c, d, a, b, in[2], _md5_S43, 0x2AD7D2BB); + _md5_II(b, c, d, a, in[9], _md5_S44, 0xEB86D391); + + // + buf[0] += a; + buf[1] += b; + buf[2] += c; + buf[3] += d; + } +}; + +// +// XSaherElm Account Info Class ... +class XCAccountInfo : public XCBase +{ + // + // Public properties ... +public: + // + // Constructro ... + void XCAccountInfo() + { + // + mAccountInfo = new CAccountInfo(); + + // + mInitialBalance = mAccountInfo.Balance(); + } + + // + // Deconstructor ... + void ~XCAccountInfo() + { + // + mInitialBalance = 0; + } + + // + // 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 Initial Deposit Balance ... + double GetInitialBalance() + { + return mInitialBalance; + } + + // + // 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; + } + + // + // Protected properties ... +protected: + // + // Private properties ... +private: + // + // Initial Account Balance ... + double mInitialBalance; + + // + // Account Info ... + CAccountInfo mAccountInfo; +}; + +// +// XSaherElm Report Info Class ... +class XCReporter : public XCBase +{ + // + // Public Provided ... +public: + // + // Constructro ... + void XCReporter() + { + // + mAccountInfo = new XCAccountInfo(); + + // + Reset(); + } + + // + // Deconstructor ... + void ~XCReporter() + { + } + + // + // Reset Specific Report ... + void Reset( + ENUM_XREPORT_TYPES type // Specify Report Type + ) + { + CleanReport(type); + } + + // + // Reset All Reports ... + void Reset() + { + // + CleanReport(XREPORT_MAIN); + CleanReport(XREPORT_MONTHLY); + CleanReport(XREPORT_WEEKLY); + CleanReport(XREPORT_DAILY); + } + + // + // Update Volume Info ... + void UpdateReportVolumeInfo( + ENUM_XREPORT_TYPES type, // Specified Report Type + // + double staticVolume, // Current Available Static Volume + string staticVolumeCalculationMethod, // Static Volume Calculation Method + double maxAllowedVolume, // Current Maximum Appliable Volume + double volumeIncreaseMultiplier, // Static Volume Increase Multiplier + double balanceGowingToApplyMultiplier, // Multiply Volume Based On Balance Growing + double balanceGrowingToIncreaseMaxAllowedVolume // Where to Increase MaxAllowed Volume + ) + { + // + // Filling Account Info ... + FillReportAccountInfo(type); + + // + switch (type) + { + // + // Main ... + case XREPORT_MAIN: + // + FillingVolumeInfo( + mMainReport, + staticVolume, + staticVolumeCalculationMethod, + maxAllowedVolume, + volumeIncreaseMultiplier, + balanceGowingToApplyMultiplier, + balanceGrowingToIncreaseMaxAllowedVolume); + break; + + // + // Monthly ... + case XREPORT_MONTHLY: + // + FillingVolumeInfo( + mMonthlyReport, + staticVolume, + staticVolumeCalculationMethod, + maxAllowedVolume, + volumeIncreaseMultiplier, + balanceGowingToApplyMultiplier, + balanceGrowingToIncreaseMaxAllowedVolume); + break; + + // + // Weekly ... + case XREPORT_WEEKLY: + // + FillingVolumeInfo( + mWeeklyReport, + staticVolume, + staticVolumeCalculationMethod, + maxAllowedVolume, + volumeIncreaseMultiplier, + balanceGowingToApplyMultiplier, + balanceGrowingToIncreaseMaxAllowedVolume); + break; + + // + // Daily ... + case XREPORT_DAILY: + // + FillingVolumeInfo( + mDailyReport, + staticVolume, + staticVolumeCalculationMethod, + maxAllowedVolume, + volumeIncreaseMultiplier, + balanceGowingToApplyMultiplier, + balanceGrowingToIncreaseMaxAllowedVolume); + break; + } + } + + // + // Update Volume Info on All Reports ... + void UpdateReportsVolumeInfo( + double staticVolume, // Current Available Static Volume + string staticVolumeCalculationMethod, // Static Volume Calculation Method + double maxAllowedVolume, // Current Maximum Appliable Volume + double volumeIncreaseMultiplier, // Static Volume Increase Multiplier + double balanceGowingToApplyMultiplier, // Multiply Volume Based On Balance Growing + double balanceGrowingToIncreaseMaxAllowedVolume // Where to Increase MaxAllowed Volume + ) + { + // + // Main ... + UpdateReportVolumeInfo( + XREPORT_MAIN, + staticVolume, + staticVolumeCalculationMethod, + maxAllowedVolume, + volumeIncreaseMultiplier, + balanceGowingToApplyMultiplier, + balanceGrowingToIncreaseMaxAllowedVolume); + + // + // Monthly ... + UpdateReportVolumeInfo( + XREPORT_MONTHLY, + staticVolume, + staticVolumeCalculationMethod, + maxAllowedVolume, + volumeIncreaseMultiplier, + balanceGowingToApplyMultiplier, + balanceGrowingToIncreaseMaxAllowedVolume); + + // + // Weekly ... + UpdateReportVolumeInfo( + XREPORT_WEEKLY, + staticVolume, + staticVolumeCalculationMethod, + maxAllowedVolume, + volumeIncreaseMultiplier, + balanceGowingToApplyMultiplier, + balanceGrowingToIncreaseMaxAllowedVolume); + + // + // Daily ... + UpdateReportVolumeInfo( + XREPORT_DAILY, + staticVolume, + staticVolumeCalculationMethod, + maxAllowedVolume, + volumeIncreaseMultiplier, + balanceGowingToApplyMultiplier, + balanceGrowingToIncreaseMaxAllowedVolume); + } + + // + // Add Specific Signal to Report ... + void AddSignalToReport( + ENUM_XREPORT_TYPES type, // Specified Report Type + const XSignal &signal, // Specified Signal + const string &providers[] // Specified Signal Providers + ) + { + // + // + // Filling Account Info ... + FillReportAccountInfo(type); + + // + switch (type) + { + // + // Main ... + case XREPORT_MAIN: + AddSignalToReport( + mMainReport, + signal, + providers); + break; + + // + // Monthly ... + case XREPORT_MONTHLY: + AddSignalToReport( + mMonthlyReport, + signal, + providers); + break; + + // + // Weekly ... + case XREPORT_WEEKLY: + AddSignalToReport( + mWeeklyReport, + signal, + providers); + break; + + // + // Daily ... + case XREPORT_DAILY: + AddSignalToReport( + mDailyReport, + signal, + providers); + break; + } + } + + // + // Add Specific Signal to All Reports ... + void AddSignalToReports( + const XSignal &signal, // Specified Signal + const string &providers[] // Specified Signal Providers + ) + { + // + // Main ... + AddSignalToReport( + XREPORT_MAIN, + signal, + providers); + + // + // Monthly ... + AddSignalToReport( + XREPORT_MONTHLY, + signal, + providers); + + // + // Weekly ... + AddSignalToReport( + XREPORT_WEEKLY, + signal, + providers); + + // + // Daily ... + AddSignalToReport( + XREPORT_DAILY, + signal, + providers); + } + + // + // Report a TP for Specific Report ... + void AddTradeTPInReport( + ENUM_XREPORT_TYPES type // Specified Report Type + ) + { + // + switch (type) + { + // + // Main ... + case XREPORT_MAIN: + AddTradeTPInReport(mMainReport); + break; + + // + // Monthly ... + case XREPORT_MONTHLY: + AddTradeTPInReport(mMonthlyReport); + break; + + // + // Weekly ... + case XREPORT_WEEKLY: + AddTradeTPInReport(mWeeklyReport); + break; + + // + // Daily ... + case XREPORT_DAILY: + AddTradeTPInReport(mDailyReport); + break; + } + } + + // + // Report a TP for All Reports ... + void AddTradeTPInReports() + { + // + // Main ... + AddTradeTPInReport(XREPORT_MAIN); + + // + // Monthly ... + AddTradeTPInReport(XREPORT_MONTHLY); + + // + // Weekly ... + AddTradeTPInReport(XREPORT_WEEKLY); + + // + // Daily ... + AddTradeTPInReport(XREPORT_DAILY); + } + + // + // Report a SL for Specific Report ... + void AddTradeSLInReport( + ENUM_XREPORT_TYPES type // Specified Report Type + ) + { + // + switch (type) + { + // + // Main ... + case XREPORT_MAIN: + AddTradeSLInReport(mMainReport); + break; + + // + // Monthly ... + case XREPORT_MONTHLY: + AddTradeSLInReport(mMonthlyReport); + break; + + // + // Weekly ... + case XREPORT_WEEKLY: + AddTradeSLInReport(mWeeklyReport); + break; + + // + // Daily ... + case XREPORT_DAILY: + AddTradeSLInReport(mDailyReport); + break; + } + } + + // + // Report a SL for All Reports ... + void AddTradeSLInReports() + { + // + // Main ... + AddTradeSLInReport(XREPORT_MAIN); + + // + // Monthly ... + AddTradeSLInReport(XREPORT_MONTHLY); + + // + // Weekly ... + AddTradeSLInReport(XREPORT_WEEKLY); + + // + // Daily ... + AddTradeSLInReport(XREPORT_DAILY); + } + + // + // Update Number of Same Time Trades in Specific Report ... + void UpdateMaxSameTimeTradesInReport( + ENUM_XREPORT_TYPES type, // Specified Report Type + int value // number of same time trades + ) + { + // + switch (type) + { + // + // Main ... + case XREPORT_MAIN: + UpdateMaxSameTimeTradesInReport( + mMainReport, + value); + break; + + // + // Monthly ... + case XREPORT_MONTHLY: + UpdateMaxSameTimeTradesInReport( + mMonthlyReport, + value); + break; + + // + // Weekly ... + case XREPORT_WEEKLY: + UpdateMaxSameTimeTradesInReport( + mWeeklyReport, + value); + break; + + // + // Daily ... + case XREPORT_DAILY: + UpdateMaxSameTimeTradesInReport( + mDailyReport, + value); + break; + } + } + + // + // Update Number of Same Time Trades in All Report ... + void UpdateMaxSameTimeTradesInReports( + int value // number of same time trades + ) + { + // + // Main ... + UpdateMaxSameTimeTradesInReport( + XREPORT_MAIN, + value); + + // + // Monthly ... + UpdateMaxSameTimeTradesInReport( + XREPORT_MONTHLY, + value); + + // + // Weekly ... + UpdateMaxSameTimeTradesInReport( + XREPORT_WEEKLY, + value); + + // + // Daily ... + UpdateMaxSameTimeTradesInReport( + XREPORT_DAILY, + value); + } + + // + // Update Max DrawDown in Specific Report ... + void UpdateMaxDrawDownInReport( + ENUM_XREPORT_TYPES type, // Specified Report Type + double value // draw down value + ) + { + // + switch (type) + { + // + // Main ... + case XREPORT_MAIN: + UpdateMaxDrawDownInReport( + mMainReport, + value); + break; + + // + // Monthly ... + case XREPORT_MONTHLY: + UpdateMaxDrawDownInReport( + mMonthlyReport, + value); + break; + + // + // Weekly ... + case XREPORT_WEEKLY: + UpdateMaxDrawDownInReport( + mWeeklyReport, + value); + break; + + // + // Daily ... + case XREPORT_DAILY: + UpdateMaxDrawDownInReport( + mDailyReport, + value); + break; + } + } + + // + // Update Max DrawDown in All Report ... + void UpdateMaxDrawDownInReports( + double value // draw down value + ) + { + // + // Main ... + UpdateMaxDrawDownInReport( + XREPORT_MAIN, + value); + + // + // Monthly ... + UpdateMaxDrawDownInReport( + XREPORT_MONTHLY, + value); + + // + // Weekly ... + UpdateMaxDrawDownInReport( + XREPORT_WEEKLY, + value); + + // + // Daily ... + UpdateMaxDrawDownInReport( + XREPORT_DAILY, + value); + } + + // + // Update Max DrawUp in Specific Report ... + void UpdateMaxDrawUpInReport( + ENUM_XREPORT_TYPES type, // Specified Report Type + double value // draw up value + ) + { + // + switch (type) + { + // + // Main ... + case XREPORT_MAIN: + UpdateMaxDrawUpInReport( + mMainReport, + value); + break; + + // + // Monthly ... + case XREPORT_MONTHLY: + UpdateMaxDrawUpInReport( + mMonthlyReport, + value); + break; + + // + // Weekly ... + case XREPORT_WEEKLY: + UpdateMaxDrawUpInReport( + mWeeklyReport, + value); + break; + + // + // Daily ... + case XREPORT_DAILY: + UpdateMaxDrawUpInReport( + mDailyReport, + value); + break; + } + } + + // + // Update Max DrawUp in All Report ... + void UpdateMaxDrawUpInReports( + double value // draw up value + ) + { + // + // Main ... + UpdateMaxDrawUpInReport( + XREPORT_MAIN, + value); + + // + // Monthly ... + UpdateMaxDrawUpInReport( + XREPORT_MONTHLY, + value); + + // + // Weekly ... + UpdateMaxDrawUpInReport( + XREPORT_WEEKLY, + value); + + // + // Daily ... + UpdateMaxDrawUpInReport( + XREPORT_DAILY, + value); + } + + // + // Update Min Balance for Open Trades in Specific Report ... + void UpdateMinBalanceForOpenTradesInReport( + ENUM_XREPORT_TYPES type, // Specified Report Type + double value // min balance for open trades + ) + { + // + switch (type) + { + // + // Main ... + case XREPORT_MAIN: + UpdateMinBalanceForOpenTradesInReport( + mMainReport, + value); + break; + + // + // Monthly ... + case XREPORT_MONTHLY: + UpdateMinBalanceForOpenTradesInReport( + mMonthlyReport, + value); + break; + + // + // Weekly ... + case XREPORT_WEEKLY: + UpdateMinBalanceForOpenTradesInReport( + mWeeklyReport, + value); + break; + + // + // Daily ... + case XREPORT_DAILY: + UpdateMinBalanceForOpenTradesInReport( + mDailyReport, + value); + break; + } + } + + // + // Update Min Balance for Open Trades in All Report ... + void UpdateMinBalanceForOpenTradesInReports( + double value // min balance for open trades + ) + { + // + // Main ... + UpdateMinBalanceForOpenTradesInReport( + XREPORT_MAIN, + value); + + // + // Monthly ... + UpdateMinBalanceForOpenTradesInReport( + XREPORT_MONTHLY, + value); + + // + // Weekly ... + UpdateMinBalanceForOpenTradesInReport( + XREPORT_WEEKLY, + value); + + // + // Daily ... + UpdateMinBalanceForOpenTradesInReport( + XREPORT_DAILY, + value); + } + + // + // Gnerate Specific Type Of Report String Representation ... + string GenerateReportString( + ENUM_XREPORT_TYPES type, // Specified Report Type + string separator = "\n" // Separator + ) + { + // + string result = ""; + + // + switch (type) + { + // + // Main ... + case XREPORT_MAIN: + result = GenerateReportString( + mMainReport, + separator); + break; + + // + // Monthly ... + case XREPORT_MONTHLY: + result = GenerateReportString( + mMonthlyReport, + separator); + break; + + // + // Weekly ... + case XREPORT_WEEKLY: + result = GenerateReportString( + mWeeklyReport, + separator); + break; + + // + // Daily ... + case XREPORT_DAILY: + result = GenerateReportString( + mDailyReport, + separator); + break; + } + + // + return result; + } + + // + // Protected Provided ... +protected: + // + // Private Provided ... +private: + // + // Account Info Instance ... + XCAccountInfo mAccountInfo; + + // + // Main Report ... + XReport mMainReport; + + // + // Monthly Report ... + XReport mMonthlyReport; + + // + // Weekly Report ... + XReport mWeeklyReport; + + // + // Daily Report ... + XReport mDailyReport; + + // + // Clean Specific Report ... + void CleanReport( + XReport &report // Specified Report + ) + { + // + datetime time = TimeCurrent(); + + // + // Reset Times ... + report.start = time; + report.end = -1; + + // + // Reset Account Info ... + FillReportAccountInfo(report); + + // + // Reset Summary Info ... + report.summaryInfo.maxDrawUp = 0; + report.summaryInfo.maxDrawDown = 0; + report.summaryInfo.longSignals = 0; + report.summaryInfo.numberOfTPs = 0; + report.summaryInfo.numberOfSLs = 0; + report.summaryInfo.shortSignals = 0; + report.summaryInfo.maxSignalVolume = 0; + report.summaryInfo.maxSameTimeSignals = 0; + + // + // Reset Volume Info ... + report.volumeInfo.staticVolume = 0; + report.volumeInfo.maxAllowedVolume = 0; + report.volumeInfo.volumeIncreaseMultiplier = 0; + report.volumeInfo.balanceGowingToApplyMultiplier = 0; + report.volumeInfo.staticVolumeCalculationMethod = NULL; + report.volumeInfo.balanceGrowingToIncreaseMaxAllowedVolume = 0; + + // + // Reset Signallers Info ... + CleanBuffer(report.signallersInfo); + } + void CleanReport( + ENUM_XREPORT_TYPES type // Specify Report Type + ) + { + // + switch (type) + { + // + // Main ... + case XREPORT_MAIN: + CleanReport(mMainReport); + break; + + // + // Monthly ... + case XREPORT_MONTHLY: + CleanReport(mMonthlyReport); + break; + + // + // Weekly ... + case XREPORT_WEEKLY: + CleanReport(mWeeklyReport); + break; + + // + // Daily ... + case XREPORT_DAILY: + CleanReport(mDailyReport); + break; + } + } + + // + // Update Specific Reports End Time ... + void FillReportEndTime( + XReport &report // Specified Report + ) + { + // + datetime time = TimeCurrent(); + report.end = time; + } + + // + // Filleing Report Account Info ... + void FillReportAccountInfo( + XReport &report // Specified Report + ) + { + // + FillReportEndTime(report); + + // + report.accountInfo.user = (string)mAccountInfo.GetUserAccount(); + report.accountInfo.name = mAccountInfo.GetName(); + report.accountInfo.server = mAccountInfo.GetServerName(); + report.accountInfo.broker = mAccountInfo.GetCompany(); + report.accountInfo.mode = mAccountInfo.GetTradeMode(); + report.accountInfo.leverage = mAccountInfo.GetLeverage(); + report.accountInfo.currency = mAccountInfo.GetCurrency(); + report.accountInfo.deposit = mAccountInfo.GetInitialBalance(); + report.accountInfo.balance = mAccountInfo.GetBalance(); + } + void FillReportAccountInfo( + ENUM_XREPORT_TYPES type // Specify Report Type + ) + { + // + switch (type) + { + // + // Main ... + case XREPORT_MAIN: + FillReportAccountInfo(mMainReport); + break; + + // + // Monthly ... + case XREPORT_MONTHLY: + FillReportAccountInfo(mMonthlyReport); + break; + + // + // Weekly ... + case XREPORT_WEEKLY: + FillReportAccountInfo(mWeeklyReport); + break; + + // + // Daily ... + case XREPORT_DAILY: + FillReportAccountInfo(mDailyReport); + break; + } + } + + // + // Filling Volume Info ... + void FillingVolumeInfo( + XReport &report, // Specified Report + // + double staticVolume, // Current Available Static Volume + string staticVolumeCalculationMethod, // Static Volume Calculation Method + double maxAllowedVolume, // Current Maximum Appliable Volume + double volumeIncreaseMultiplier, // Static Volume Increase Multiplier + double balanceGowingToApplyMultiplier, // Multiply Volume Based On Balance Growing + double balanceGrowingToIncreaseMaxAllowedVolume // Where to Increase MaxAllowed Volume + ) + { + // + FillReportEndTime(report); + + // + report.volumeInfo.staticVolume = staticVolume; + report.volumeInfo.maxAllowedVolume = maxAllowedVolume; + report.volumeInfo.volumeIncreaseMultiplier = volumeIncreaseMultiplier; + report.volumeInfo.staticVolumeCalculationMethod = staticVolumeCalculationMethod; + report.volumeInfo.balanceGowingToApplyMultiplier = balanceGowingToApplyMultiplier; + report.volumeInfo.balanceGrowingToIncreaseMaxAllowedVolume = balanceGrowingToIncreaseMaxAllowedVolume; + } + + // + // Add Signal to Report ... + void AddSignalToReport( + XReport &report, // Specified Report + const XSignal &signal, // Specified Signal + const string &providers[] // Specified Signal Providers + ) + { + // + FillReportEndTime(report); + + // + double volume = signal.volume; + bool isLong = signal.type == X_SIGNAL_LONG; + + // + // Update Longs and Shorts ... + if (isLong) + { + report.summaryInfo.longSignals++; + } + else + { + report.summaryInfo.shortSignals++; + } + + // + // Chack Max Volume ... + if (volume > report.summaryInfo.maxSignalVolume) + { + report.summaryInfo.maxSignalVolume = volume; + } + + // + // Update Signallers Info ... + for (int i = 0; i < ArraySize(providers); i++) + { + // + string iProvider = providers[i]; + + // + AddOrUpdateSignaller( + report, + iProvider, + signal); + } + } + + // + // Add or Update Signaller Info of Specific Report ... + void AddOrUpdateSignaller( + XReport &report, // Specified Report + const string provider, // Signal Provider name + const XSignal &signal // Specified Signal + ) + { + // + int providerIdx = -1; + int signallersInfoCount = 0; + bool isLong = signal.type == X_SIGNAL_LONG; + + // + // Prepare New One Provider ... + XSignallerInfo info = {}; + info.name = provider; + if (isLong) + { + info.longs = 1; + } + else + { + info.shorts = 1; + } + + // + // Find Provider idx if Exists ... + providerIdx = FindProviderInSignallersInfo( + provider, + report.signallersInfo); + + // + // Check IDX ... + if (providerIdx > -1) + { + // + // Update Exists ... + if (isLong) + { + report.signallersInfo[providerIdx].longs++; + } + else + { + report.signallersInfo[providerIdx].shorts++; + } + } + else + { + // + // Add New One ... + AddItemToBuffer( + info, + report.signallersInfo); + } + } + + // + // Add TP in Report ... + void AddTradeTPInReport( + XReport &report // Specified Report + ) + { + // + FillReportEndTime(report); + + // + report.summaryInfo.numberOfTPs++; + } + + // + // Add SL in Report ... + void AddTradeSLInReport( + XReport &report // Specified Report + ) + { + // + FillReportEndTime(report); + + // + report.summaryInfo.numberOfSLs++; + } + + // + // Update Number of Same Time Trades in Report ... + void UpdateMaxSameTimeTradesInReport( + XReport &report, // Specified Report + int value // number of same time trades + ) + { + // + // Validate Args ... + if (value <= report.summaryInfo.maxSameTimeSignals) + { + return; + } + + // + FillReportEndTime(report); + + // + report.summaryInfo.maxSameTimeSignals = value; + } + + // + // Update Number of Same Time Trades in Report ... + void UpdateMaxDrawUpInReport( + XReport &report, // Specified Report + double value // draw up value + ) + { + // + // Validate Args ... + if (value <= report.summaryInfo.maxDrawUp) + { + return; + } + + // + FillReportEndTime(report); + + // + report.summaryInfo.maxDrawUp = value; + } + + // + // Update Number of Same Time Trades in Report ... + void UpdateMaxDrawDownInReport( + XReport &report, // Specified Report + double value // draw down value + ) + { + // + // Validate Args ... + if (value <= report.summaryInfo.maxDrawDown) + { + return; + } + + // + FillReportEndTime(report); + + // + report.summaryInfo.maxDrawDown = value; + } + + // + // Update Min Balance for Open Trades Value in Report ... + void UpdateMinBalanceForOpenTradesInReport( + XReport &report, // Specified Report + double value // min balance for open trades + ) + { + // + // Validate Arg ... + if (value <= 0) + { + return; + } + + // + FillReportEndTime(report); + + // + report.accountInfo.minBalanceForOpenTrades = value; + } + + // + // Generate Specific Report String Representation ... + string GenerateReportString( + XReport &report, // Specified Report + string separator = "\n" // Separator + ) + { + // + string result = ""; + + // + // Start and End Date ... + result += "Start: " + (string)report.start + separator; + result += "End: " + (string)report.end + separator; + + // + // Account Info ... + string accountStr = GenerateAccountInfoReportString(report.accountInfo); + result += "Account: " + separator + accountStr + separator; + + // + // Summary Info ... + string summaryStr = GenerateSummaryInfoReportString(report.summaryInfo); + result += "Summary: " + separator + summaryStr + separator; + + // + // Volume Info ... + string volumeStr = GenerateVolumeInfoReportString(report.volumeInfo); + result += "Volume: " + separator + volumeStr + separator; + + // + // Signallers Info ... + string signallersStr = GenerateSignallersInfoReportString(report.signallersInfo); + result += "Signallers: " + separator + signallersStr + separator; + + // + return result; + } + + // + // Generate Account info String Representation ... + string GenerateAccountInfoReportString( + XAccountInfo &info, // Specified Account Info + string separator = "\n" // Separator + ) + { + // + string result = ""; + + // + // Generate Report ... + result += "user: " + info.user + separator; + result += "name: " + info.name + separator; + result += "server: " + info.server + separator; + result += "broker: " + info.broker + separator; + result += "mode: " + EnumToString(info.mode) + separator; + result += "leverage: " + (string)info.leverage + separator; + result += "currency: " + info.currency + separator; + result += "deposit: " + (string)info.deposit + separator; + result += "balance: " + (string)info.balance + separator; + result += "minBalanceForTrading: " + (string)info.minBalanceForOpenTrades + separator; + + // + return result; + } + + // + // Generate Summary info String Representation ... + string GenerateSummaryInfoReportString( + XSummaryInfo &info, // Specified Summary Info + string separator = "\n" // Separator + ) + { + // + string result = ""; + + // + // Generate Report ... + result += "longSignals: " + (string)info.longSignals + separator; + result += "shortSignals: " + (string)info.shortSignals + separator; + result += "numberOfTps: " + (string)info.numberOfTPs + separator; + result += "numberOfSLs: " + (string)info.numberOfSLs + separator; + result += "maxDrawUp: " + (string)info.maxDrawUp + separator; + result += "maxDrawDown: " + (string)info.maxDrawDown + separator; + result += "maxSignalVolume: " + (string)info.maxSignalVolume + separator; + result += "maxSameTimeSignals: " + (string)info.maxSameTimeSignals + separator; + + // + return result; + } + + // + // Generate Volume info String Representation ... + string GenerateVolumeInfoReportString( + XVolumeInfo &info, // Specified Volume Info + string separator = "\n" // Separator + ) + { + // + string result = ""; + + // + // Generate Report ... + result += "staticVolume: " + (string)info.staticVolume + separator; + result += "staticVolumeCalculationMethod: " + info.staticVolumeCalculationMethod + separator; + result += "maxAllowedVolume: " + (string)info.maxAllowedVolume + separator; + result += "volumeIncreaseMultiplier: " + (string)info.volumeIncreaseMultiplier + separator; + result += "balanceGowingToApplyMultiplier: " + (string)info.balanceGowingToApplyMultiplier + separator; + result += "balanceGrowingToIncreaseMaxAllowedVolume: " + (string)info.balanceGrowingToIncreaseMaxAllowedVolume + separator; + + // + return result; + } + + // + // Generate Signallers info String Representation ... + string GenerateSignallersInfoReportString( + XSignallerInfo &infos[], // Specified Signallers Info + string separator = "\n" // Separator + ) + { + // + string result = ""; + + // + // Validate Signallers Array Size ... + int signallersCount = ArraySize(infos); + if (signallersCount <= 0) + { + // + result += "EMPTY" + separator; + return result; + } + + // + // Generate Report ... + for (int i = 0; i < signallersCount; i++) + { + // + XSignallerInfo iSignaller = infos[i]; + + // + result += "name: " + iSignaller.name + separator; + result += "longs: " + (string)iSignaller.longs + separator; + result += "shorts: " + (string)iSignaller.shorts + separator; + + // + if (i < signallersCount - 1) + { + result += separator; + } + } + // + return result; + } + + // + // Find a Provider Index in SignallersInfo ... + int FindProviderInSignallersInfo( + string provider, // Specified Provider Name ... + XSignallerInfo &infoBuffer[] // Specified XSignallerInfo Buffer ... + ) + { + // + int result = -1; + + // + int bufferSize = ArraySize(infoBuffer); + if (bufferSize <= 0) + { + return result; + } + + // + // Loop through buffer to find provider index ... + for (int i = 0; i < bufferSize; i++) + { + // + XSignallerInfo iInfo = infoBuffer[i]; + + // + if (iInfo.name != provider) + { + continue; + } + + // + result = i; + } + + // + return result; + } +}; + +// +// a Class For Collectiong Info ... +class XCCollector : public XCBase +{ + // + // Public ... +public: + // + // Constructor ... + XCCollector() + { + Reset(); + } + + // + // Deconstructor ... + ~XCCollector() {} + + // + // Reset All Collectors ... + void Reset() + { + Clean(); + } + + // + // Count Data ... + int Count() + { + // + int result = 0; + + // + result = ArraySize(mTimes); + + // + return result; + } + + // + // TODO: Implement Business Logic here ... + + // + // Add Specific item to Collection ... + bool Add( + XCollector &item // Specified Info + ) + { + // + bool result = false; + + // + // Validate Args ... + result = IsValid( + item, + false); + if (!result) + { + return result; + } + + // + // Add Items Values to Buffers ... + // + AddItemToBuffer( + item.time, + mTimes); + + // + AddItemToBuffer( + item.volume, + mVolumes); + + // + AddItemToBuffer( + item.maxDrawDown, + mMaxDrawDowns); + + // + AddItemToBuffer( + item.maxAllowedVolume, + mMaxAllowedVolumes); + + // + AddItemToBuffer( + item.minBalanceForOpenTrade, + mMinBalanceForTradePrices); + + // + return result; + } + + // + // Retrieve Specific Item ... + bool Get( + XCollector &item, // Hold's Result + int index = 0 // Specified Index to Retrieve + ) + { + // + bool result = false; + + // + result = IsValidIndex(index); + if (!result) + { + return result; + } + + // + // Filling Item ... + item.time = mTimes[index]; + item.volume = mVolumes[index]; + item.maxDrawDown = mMaxDrawDowns[index]; + item.maxAllowedVolume = mMaxAllowedVolumes[index]; + item.minBalanceForOpenTrade = mMinBalanceForTradePrices[index]; + + // + return result; + } + XCollector Get( + int index = 0 // Specified Index to Retrieve + ) + { + // + XCollector result = {}; + + // + bool isValidIndex = IsValidIndex(index); + if (!isValidIndex) + { + return result; + } + + // + // Filling Item ... + result.time = mTimes[index]; + result.volume = mVolumes[index]; + result.maxDrawDown = mMaxDrawDowns[index]; + result.maxAllowedVolume = mMaxAllowedVolumes[index]; + result.minBalanceForOpenTrade = mMinBalanceForTradePrices[index]; + + // + return result; + } + bool Get( + XCollector &item, // Hold's Result + datetime time // Specified Index to Retrieve + ) + { + // + bool result = false; + + // + if (time <= 0) + { + return result; + } + + // + int timesCount = ArraySize(mTimes); + result = timesCount > 0; + if (!result) + { + return result; + } + + // + int index = -1; + for (int i = 0; i < timesCount; i++) + { + // + datetime iTime = mTimes[i]; + + // + if (iTime == time) + { + // + index = i; + break; + } + } + + // + result = index >= 0; + if (!result) + { + return result; + } + + // + result = Get( + item, + index); + + // + return result; + } + XCollector Get( + datetime time // Specified Index to Retrieve + ) + { + // + XCollector result = {}; + + // + if (time <= 0) + { + return result; + } + + // + int timesCount = ArraySize(mTimes); + if (timesCount <= 0) + { + return result; + } + + // + int index = -1; + for (int i = 0; i < timesCount; i++) + { + // + datetime iTime = mTimes[i]; + + // + if (iTime == time) + { + // + index = i; + break; + } + } + + // + if (index <= -1) + { + return result; + } + + // + result = Get( + index); + + // + return result; + } + + // + // Retrieve All ... + void GetAll( + XCollector &result[], // Hold's Result + bool reversal = false // Extract Direction + ) + { + // + CleanBuffer(result); + + // + int timesCount = ArraySize(mTimes); + if (timesCount <= 0) + { + return; + } + + // + if (!reversal) + { + // + for (int i = 0; i < timesCount; i++) + { + // + XCollector iCollector = Get(i); + + // + AddItemToBuffer( + iCollector, + result); + } + } + else + { + // + for (int i = timesCount - 1; i >= 0; i--) + { + // + XCollector iCollector = Get(i); + + // + AddItemToBuffer( + iCollector, + result); + } + } + } + + // + // Extract History ... + void Extract( + XCollector &result[], // Hold's Result + int start, // Start Index + int end // End Index + ) + { + // + CleanBuffer(result); + + // + // Validate Args ... + if ( + end < 0 || + start < 0 || + (start == 0 && end == 0) || + MathAbs(start - end == 0)) + { + return; + } + + // + // Validate Start and End Index ... + bool isValidEnd = IsValidIndex(end); + bool isValidStart = IsValidIndex(start); + if (!isValidEnd || !isValidStart) + { + return; + } + + // + bool direction = end > start; + if (direction) + { + // + for (int i = start; i < end - 1; i++) + { + // + XCollector iCollect = Get(i); + + // + AddItemToBuffer( + iCollect, + result); + } + } + else + { + // + for (int i = end - 1; i >= start; i--) + { + // + XCollector iCollect = Get(i); + + // + AddItemToBuffer( + iCollect, + result); + } + } + } + + // + // Validate an Item ... + bool IsValid( + XCollector &item, // Specified Info + bool ignoreTime = true // Ignore Times Checking ... + ) + { + // + bool result = false; + + // + // Check Each Items contains Correct Value ... + // + result = item.volume >= 0; + if (!result) + { + return result; + } + + // + result = item.maxDrawDown >= 0; + if (!result) + { + return result; + } + + // + result = item.maxAllowedVolume >= 0; + if (!result) + { + return result; + } + + // + result = item.minBalanceForOpenTrade >= 0; + if (!result) + { + return result; + } + + // + // Check Time has Proper Value ... + result = item.time > 0; + if (!result) + { + return result; + } + + // + // Check time bigger than last Time ... + int timesCount = ArraySize(mTimes); + if ( + !ignoreTime && + timesCount >= 0) + { + // + // Retrieve Last Added Times ... + datetime lastTime; + result = GetLastItem(lastTime, mTimes); + if (!result) + { + return result; + } + + // + // Compare Last Time by current Time ... + result = item.time > lastTime; + if (!result) + { + return result; + } + } + + // + return result; + } + + // + // Generate Logging String Representation ... + string GenerateString( + XCollector &item, // Specified Info + string separator = "\n" // Separator Character + ) + { + // + string result = ""; + + // + result += "time: " + (string)item.time + separator; + result += "volume: " + (string)item.volume + separator; + result += "maxDrawDown: " + (string)item.maxDrawDown + separator; + result += "maxAllowedVolume: " + (string)item.maxAllowedVolume + separator; + result += "minBalanceForOpenTrade: " + (string)item.minBalanceForOpenTrade + separator; + + // + return result; + } + + // + // Protected ... +protected: + // + // Private ... +private: + // + // Max Draw Up touched till now ... + double mMaxDrawUp; + + // + // Max Draw Down touched till now ... + double mMaxDrawDown; + + // + // Last Time for Checks ... + datetime mTimes[]; + + // + // Volume at the Check Time ... + double mVolumes[]; + + // + // DrawDown for each Check ... + double mMaxDrawDowns[]; + + // + // Max Allowed Volume for each check ... + double mMaxAllowedVolumes[]; + + // + // Min Balance for Open Trades for Each Check ... + double mMinBalanceForTradePrices[]; + + // + // Reset ... + void Clean() + { + // + mMaxDrawUp = 0; + mMaxDrawDown = 0; + + // + CleanBuffer(mTimes); + CleanBuffer(mVolumes); + CleanBuffer(mMaxDrawDowns); + CleanBuffer(mMaxAllowedVolumes); + CleanBuffer(mMinBalanceForTradePrices); + } + + // + // Validate Index ... + bool IsValidIndex( + int index // Specified Index + ) + { + // + bool result = false; + + // + int bufferSize = ArraySize(mTimes); + if (bufferSize <= 0) + { + return result; + } + + // + result = index <= bufferSize - 1; + + // + return result; + } +}; + +// +// a Class for Managing Volumes ... +class XCVolumeManager : public XCBase +{ + // + // Public ... +public: + // + // Constructor ... + XCVolumeManager( + double staticVolumeRate, // Static Volume Calculation Mutiplier + ENUM_STATIC_VOLUME_METHODS volumeMethod = X_STATIC_VOLUME_BASED_ON_DEPOSIT, // How to Calculate Static Volume + double volumeMultiplier = 0, // Volume Multiplier + double volumeMultiplierAppliedRate = 0, // Apply Volume Multiplier when Balance Increased by this rate + double maxAllowedVolume = 0, // Max Allowed Volume + double increaseMaxAllowedVolumeRate = 0 // Increase Max Allowed Volumes when Balance Increased by this rate + ) + { + // + mAccountInfo = new XCAccountInfo(); + + // + ResetForceVolumeMultiplier(); + + // + mVolumeMethod = volumeMethod; + mStaticVoluemRate = staticVolumeRate; + mVolumeMultiplier = volumeMultiplier; + mMaxAllowedVolume = maxAllowedVolume; + mVolumeMultiplierAppliedRate = volumeMultiplierAppliedRate; + mIncreaseMaxAllowedVolumeRate = increaseMaxAllowedVolumeRate; + } + + // + // Deconstructor ... + ~XCVolumeManager(void) {} + + // + // Check Volume Multiplier ... + bool CanUseVolumeMultiplier() + { + // + bool result = false; + + // + result = + mVolumeMultiplier > 0 && + mVolumeMultiplierAppliedRate > 0; + + // + return result; + } + + // + // Check Max Volume ... + bool CanUseMaxVolume() + { + // + bool result = false; + + // + result = + mMaxAllowedVolume > 0; + + // + return result; + } + + // + // Calculate Volume for Position ... + double CalculateVolume( + int numberOfOpenPositions = 0, // Number Of Open Signals + string symbol = NULL // Specify Symbol + ) + { + // + double result = 0; + + // + // Normalize Symbol ... + if (StringLen(symbol) == 0) + { + symbol = _Symbol; + } + + // + // Static Volume ... + result = GetStaticVolume(); + + // + double multiplier = GetVolumeMultiplier(); + result *= multiplier; + + // + // Check Max Allowed Volume Exists ... + double maxAllowedVolume = GetMaxAllowedVolume(); + if (maxAllowedVolume > 0) + { + // + result = + result > maxAllowedVolume + ? maxAllowedVolume + : result; + } + + // + // Check Number of Open Positions ... + if (numberOfOpenPositions >= 0) + { + // + // Decrease Volume ... + result /= (1 + numberOfOpenPositions); + } + + // + // Apply Force Volume Multiplier ... + result *= mForceVolumeMultiplier; + + // + // Retrieve Symbol Volume Info ... + result = NormalizeVolume(result, symbol, 2); + + // + return result; + } + + // + // Calculate Volume Multiplier ... + double GetVolumeMultiplier() + { + // + double result = 1; + + // + double deposit = mAccountInfo.GetInitialBalance(); + double balance = mAccountInfo.GetBalance(); + bool canUseVolumeMultiplier = CanUseVolumeMultiplier(); + if ( + balance < deposit || + !canUseVolumeMultiplier) + { + return result; + } + + // + // Apply Multiplier to Volume ... + double baseGrowBalance = deposit * mVolumeMultiplierAppliedRate; + double balanceGrows = balance - deposit; + if (balanceGrows < baseGrowBalance) + { + return result; + } + + // + double applyMultiplierTimes = balanceGrows / baseGrowBalance; + double roundedApplyMultiplierTimes = MathRound(applyMultiplierTimes); + + // + if (applyMultiplierTimes < roundedApplyMultiplierTimes) + { + applyMultiplierTimes -= (1 - (roundedApplyMultiplierTimes - applyMultiplierTimes)); + } + + // + // Calculate result ... + result = applyMultiplierTimes * mVolumeMultiplier; + + // + return result; + } + + // + // Retrieve Required Balance Grows for Increase Max Allowed Volume ... + double GetIncreaseMaxAllowedVolumeBalance() + { + // + double result = 0; + + // + if ( + mMaxAllowedVolume <= 0 || + mIncreaseMaxAllowedVolumeRate <= 0) + { + return result; + } + + // + result = mAccountInfo.GetInitialBalance() * mIncreaseMaxAllowedVolumeRate; + + // + return result; + } + + // + // Calculate Max Allowed Volume ... + double GetMaxAllowedVolume() + { + // + double result = 0; + + // + // Validate Args ... + result = + mMaxAllowedVolume <= 0 + ? 0 + : mMaxAllowedVolume; + + // + double deposit = mAccountInfo.GetInitialBalance(); + double balance = mAccountInfo.GetBalance(); + bool canUseMaxAllowedVolume = CanUseMaxVolume(); + if ( + balance <= deposit || + !canUseMaxAllowedVolume || + mIncreaseMaxAllowedVolumeRate <= 0) + { + // + return result; + } + + // + // Apply Multiplier to Volume ... + double baseGrowBalance = GetIncreaseMaxAllowedVolumeBalance(); + double balanceGrows = balance - deposit; + if (balanceGrows < baseGrowBalance) + { + return result; + } + + // + double applyMultiplierTimes = balanceGrows / baseGrowBalance; + double roundedApplyMultiplierTimes = MathRound(applyMultiplierTimes); + + // + if (applyMultiplierTimes < roundedApplyMultiplierTimes) + { + applyMultiplierTimes -= (1 - (roundedApplyMultiplierTimes - applyMultiplierTimes)); + } + + // + result *= applyMultiplierTimes; + + // + return result; + } + + // + // Get Static Volume ... + double GetStaticVolume() + { + // + double result = 0; + + // + double deposit = mAccountInfo.GetInitialBalance(); + double balance = mAccountInfo.GetBalance(); + + // + switch (mVolumeMethod) + { + // + case X_STATIC_VOLUME_BASED_ON_DEPOSIT: + result = mStaticVoluemRate * deposit; + break; + + // + case X_STATIC_VOLUME_BASED_ON_BALANCE: + result = mStaticVoluemRate * balance; + break; + } + + // + return result; + } + + // + // Reset Froce Volume Multiplier ... + void ResetForceVolumeMultiplier() + { + mForceVolumeMultiplier = 1; + } + + // + // Retrieve Current Force Volume Multiplier ... + double GetCurrentForceVolumeMultiplier() + { + return mForceVolumeMultiplier; + } + + // + // Retrieve Next Increase Multiplier Price ... + double GetIncreaseMultiplierBalance() + { + return mAccountInfo.GetInitialBalance() * mVolumeMultiplierAppliedRate; + } + + // + // Change Force Volume Multiplier ... + void ChangeForceVolumeMultiplier( + double rate // Change rate + ) + { + // + // Normalize rate ... + if (rate <= 1) + { + rate = 1; + } + + // + mForceVolumeMultiplier = rate; + } + + // + // Increase Force Volume Multiplier ... + void IncreaseForceVolumeMultiplier() + { + mForceVolumeMultiplier += 0.5; + } + + // + // Decrease Force Volume Multiplier ... + void DecreaseForceVolumeMultiplier() + { + // + if (mForceVolumeMultiplier <= 1) + { + return; + } + + // + mForceVolumeMultiplier -= 0.5; + } + + // + // Generate Current State Log String ... + string GenerateStateString( + string separator = "\n" // Log Separator ... + ) + { + // + string result = ""; + + // + // Normallize Separator ... + if (StringLen(separator) == 0) + { + separator = "\n"; + } + + // + result += "ForceVolumeMultiplier: " + (string)mForceVolumeMultiplier + separator; + // + result += "StaticVoluemRate: " + (string)mStaticVoluemRate + separator; + result += "StaticVoluem: " + (string)GetStaticVolume() + separator; + result += "VolumeMethod: " + EnumToString(mVolumeMethod) + separator; + // + result += "VolumeMultiplier: " + (string)mVolumeMultiplier + separator; + result += "VolumeMultiplierAppliedRate: " + (string)mVolumeMultiplierAppliedRate + separator; + // + result += "MaxAllowedVolume: " + (string)mMaxAllowedVolume + separator; + result += "IncreaseMaxAllowedVolumeRate: " + (string)mIncreaseMaxAllowedVolumeRate + separator; + + // + return result; + } + + // + // Protected ... +protected: + // + // Private ... +private: + // + // an Instance of Account Info for reading Balance and Deposit and etc ... + XCAccountInfo mAccountInfo; + + // + // Force Volume Rate Multiplier ... + double mForceVolumeMultiplier; + + // + // Static Volume Calculation Mutiplier ... + double mStaticVoluemRate; + + // + // How to Calculate Static Volume ... + ENUM_STATIC_VOLUME_METHODS mVolumeMethod; + + // + // Volume Multiplier ... + double mVolumeMultiplier; + + // + // Apply Volume Multiplier when Balance Increased by this rate ... + double mVolumeMultiplierAppliedRate; + + // + // Max Allowed Volume + double mMaxAllowedVolume; + + // + // Increase Max Allowed Volumes when Balance Increased by this rate + double mIncreaseMaxAllowedVolumeRate; +}; + +// +// a Class For Managing Signals Additional Data ... +class XCSignalManager : public XCBase +{ + // + // Public ... +public: + // + // Constructor ... + XCSignalManager(void) + { + CleanData(); + } + + // + // Deconstructor ... + ~XCSignalManager(void) {} + + // + void Reset() + { + CleanData(); + } + + // + // Retrieve All Signals ... + void GetAll( + XSignal &result[] // Hold's Result + ) + { + // + CleanBuffer(result); + + // + int signalsCount = ArraySize(mSignals); + if (signalsCount <= 0) + { + return; + } + + // + for (int i = 0; i < signalsCount; i++) + { + // + XSignal iSignal = mSignals[i]; + + // + AddItemToBuffer( + iSignal, + result); + } + } + + // + // Count Items ... + int Count() + { + return ArraySize(mSignals); + } + + // + // Retrieve Specific Signal by Ticket ... + XSignal Get( + ulong ticket // Signals Ticket ... + ) + { + // + XSignal result = {}; + + // + // Check Exists ... + bool isExists = IsExists(ticket); + if (!isExists) + { + return result; + } + + // + int signalsCount = ArraySize(mSignals); + if (signalsCount <= 0) + { + return result; + } + + // + for (int i = 0; i < signalsCount; i++) + { + // + XSignal iSignal = mSignals[i]; + + // + if (iSignal.ticket == ticket) + { + // + result = iSignal; + break; + } + } + + // + return result; + } + + // + // Check Signal Exists or not ... + bool IsExists( + ulong ticket // Specified Signal Ticket + ) + { + // + bool result = false; + + // + int signalsCount = ArraySize(mSignals); + if (signalsCount <= 0) + { + return result; + } + + // + for (int i = 0; i < signalsCount; i++) + { + // + XSignal iSignal = mSignals[i]; + + // + if (iSignal.ticket == ticket) + { + // + result = true; + break; + } + } + + // + return result; + } + bool IsExists( + XSignal &signal // Specified Signal + ) + { + // + bool result = false; + + // + int signalsCount = ArraySize(mSignals); + if (signalsCount <= 0) + { + return result; + } + + // + for (int i = 0; i < signalsCount; i++) + { + // + XSignal iSignal = mSignals[i]; + + // + if (iSignal.ticket == signal.ticket) + { + // + result = true; + break; + } + } + + // + return result; + } + + // + // Add Signal ... + bool Add( + XSignal &signal // Specified Signal + ) + { + // + bool result = false; + + // + // Validate Args ... + if (signal.ticket <= 0) + { + return result; + } + + // + // Chekc Signal Exists ... + bool isExists = IsExists(signal); + if (isExists) + { + return result; + } + + // + AddItemToBuffer( + signal, + mSignals); + result = true; + + // + return result; + } + + // + // Update Specific Buffer ... + bool Update( + XSignal &signal // Specified Signal + ) + { + // + bool result = false; + + // + // Validate Args ... + if (signal.ticket <= 0) + { + return result; + } + + // + // Chekc Signal Exists ... + bool isExists = IsExists(signal); + if (!isExists) + { + return result; + } + + // + // Remove Signal ... + Remove(signal); + + // + // Add new One ... + AddItemToBuffer( + signal, + mSignals); + + // + result = true; + + // + return result; + } + + // + // Remove Signal ... + bool Remove( + ulong ticket // Specified Signal Ticket + ) + { + // + bool result = false; + + // + // Check Signal Exists ... + bool isExists = IsExists(ticket); + if (!isExists) + { + return result; + } + + // + int signalsCount = ArraySize(mSignals); + if (signalsCount <= 0) + { + return result; + } + + // + XSignal signals[]; + + // + for (int i = 0; i < signalsCount; i++) + { + // + XSignal iSignal = mSignals[i]; + + // + if (iSignal.ticket != ticket) + { + AddItemToBuffer( + iSignal, + signals); + } + } + + // + // Now we have to Clean All Signals and Replace them by signals[] buffer ... + UpdateData(signals); + + // + result = true; + return result; + } + bool Remove( + XSignal &signal // Specified Signal + ) + { + // + bool result = false; + + // + // Check Signal Exists ... + bool isExists = IsExists(signal); + if (!isExists) + { + return result; + } + + // + int signalsCount = ArraySize(mSignals); + if (signalsCount <= 0) + { + return result; + } + + // + XSignal signals[]; + + // + for (int i = 0; i < signalsCount; i++) + { + // + XSignal iSignal = mSignals[i]; + + // + if (iSignal.ticket != signal.ticket) + { + AddItemToBuffer( + iSignal, + signals); + } + } + + // + // Now we have to Clean All Signals and Replace them by signals[] buffer ... + UpdateData(signals); + + // + result = true; + return result; + } + + // + // Add Or Update ... + bool AddOrUpdate( + XSignal &signal // Specified Signal + ) + { + // + bool result = false; + + // + // Validate Args ... + if (signal.ticket <= 0) + { + return result; + } + + // + // Chekc Signal Exists ... + bool isExists = IsExists(signal); + if (!isExists) + { + result = Add(signal); + } + else + { + result = Update(signal); + } + + // + return result; + } + + // + // Protected ... +protected: + // + // Private ... +private: + // + // Holds Signals ... + XSignal mSignals[]; + + // + // Clean All Exists Data ... + void CleanData() + { + CleanBuffer(mSignals); + } + + // + // Update Data ... + void UpdateData( + XSignal &source[] // a Buffer which needs to Replace ... + ) + { + // + CleanData(); + + // + int sourceCount = ArraySize(source); + if (sourceCount <= 0) + { + return; + } + + // + for (int i = 0; i < sourceCount; i++) + { + // + XSignal iSignal = source[i]; + + // + AddItemToBuffer( + iSignal, + mSignals); + } + } +}; + +// +// XSaherElm Trade Class ... +class XCTrade : public XCBase +{ + // + // all public features ... +public: + // + // Constructor ... + void XCTrade( + string tag, // Specify a Tag for Trader instance + string symbol, // Specify Trader Symbol + int slippage, // Specify Slippage + ulong magicNumber, // Specify Magic Number + bool useVirtualTPSL, // Use Virtual TP SL + int maxAllowedTrades, // Specify Max Allowed Trades + double minBallanceForOpenTrades, // Specify Minimum Balance for Open Trades + double minAllowedFreeMarginForOpenTrades, // Specify Minimum Free Marging for Open Trades + bool useSignalProtector = true // Specify Use Signal Protector or not + ) + { + // + mTag = tag; + mSymbol = symbol; + mSlippage = slippage; + mMagicNumber = magicNumber; + mUseVirtualTPSL = useVirtualTPSL; + mMaxAllowedTrades = maxAllowedTrades; + mMinBallanceForOpenTrades = minBallanceForOpenTrades; + mMinAllowedFreeMarginForOpenTrades = minAllowedFreeMarginForOpenTrades; + + // + mTrader = new XSCTrade(); + + // + mTrader.SetAsyncMode(false); + mTrader.SetDeviationInPoints(mSlippage); + mTrader.SetExpertMagicNumber(mMagicNumber); + + // + // Setting Log Level ... + mTrader.LogLevel(LOG_LEVEL_ERRORS); + + // + mSignalManager = new XCSignalManager(); + + // + Reset(); + } + + // + // Deconstructor ... + void ~XCTrade() + { + } + + // + // START Configuring Class Functions ... + // + + // + // Reset all Variables ... + void Reset() + { + // + mSignalManager.Reset(); + + // + mDaysForRead = 1; + mScanStarted = false; + + // + // Reset On Trade Counter ... + ResetOnTradeContext(); + + // + // Init On Trade Context ... + InitOnTradeContext(); + } + + // + // END Configuring Class Functions ... + // + + // + // START Count ... + // + + // + // Count Open Positions ... + int Count() + { + // + int result = 0; + + // + int total = PositionsTotal(); + for (int i = 0; i < total; i++) + { + // + if (!mPositionInfo.SelectByIndex(i)) + { + continue; + } + + // + if (mPositionInfo.Magic() != mMagicNumber) + { + continue; + } + + // + if (mPositionInfo.Symbol() != mSymbol) + { + continue; + } + + // + result++; + } + + // + return result; + } + + // + // Count Longs ... + int CountLongs() + { + int result = CountByType(X_SIGNAL_LONG); + return result; + } + + // + // Count Shorts ... + int CountShorts() + { + int result = CountByType(X_SIGNAL_SHORT); + return result; + } + + // + // Count Specific Type Of Positions ... + int CountByType(ENUM_POSITION_TYPE type) + { + // + int result = 0; + + // + int total = PositionsTotal(); + for (int i = 0; i < total; i++) + { + // + if (!mPositionInfo.SelectByIndex(i)) + { + continue; + } + + // + if (mPositionInfo.Symbol() != mSymbol) + { + continue; + } + + // + if (mPositionInfo.PositionType() != type) + { + continue; + } + + // + result++; + } + + // + return result; + } + + // + // Count By Type ... + int CountByType(ENUM_X_SIGNAL_TYPE type) + { + // + // Validate Args ... + ENUM_POSITION_TYPE mType = POSITION_TYPE_BUY; + if (type == X_SIGNAL_LONG) + { + mType = POSITION_TYPE_BUY; + } + else if (type == X_SIGNAL_SHORT) + { + mType = POSITION_TYPE_SELL; + } + + // + int result = CountByType(mType); + return result; + } + + // + // END Count ... + // + + // + // START Retrieve ... + // + + // + // Retrieve Specified Position by it's Ticket ... + XSignal GetSignal( + ulong ticket // Specified Ticket + ) + { + // + XSignal result = {}; + + // + result = PositionToSignal(ticket); + + // + return result; + } + + // + // Get Last Signal ... + XSignal GetLastSignal() + { + // + XSignal result = {}; + + // + XSignal signals[]; + GetSignals(signals); + int signalsCount = ArraySize(signals); + if (signalsCount <= 0) + { + return result; + } + + // + result = signals[0]; + + // + return result; + } + + // + // Retrieve Last Executed Signal ... + bool GetLastSignal(XSignal &signal) + { + // + bool result = false; + + // + XSignal signals[]; + GetSignals(signals); + int signalsCount = ArraySize(signals); + if (signalsCount <= 0) + { + return result; + } + + // + signal = signals[0]; + result = true; + + // + return result; + } + + // + // Retrieve All Positions ... + void GetSignals( + XSignal &result[] // Holds Result ... + ) + { + // + CleanBuffer(result); + + // + int totalPositions = PositionsTotal(); + for (int i = 0; i < totalPositions; i++) + { + // + if (!mPositionInfo.SelectByIndex(i)) + { + continue; + } + + // + if (mPositionInfo.Magic() != mMagicNumber) + { + continue; + } + + // + if (mPositionInfo.Symbol() != mSymbol) + { + continue; + } + + // + // Position to Signal ... + XSignal signal = PositionToSignal(i); + Add( + signal, + result); + } + } + + // + // Retrieve Type Specific Signals ... + void GetSignals( + XSignal &result[], // Holds Result ... + ENUM_X_SIGNAL_TYPE type // Specified Sginal Type ... + ) + { + // + CleanBuffer(result); + + // + XSignal signals[]; + GetSignals(signals); + + // + int signalsCount = ArraySize(signals); + if (signalsCount <= 0) + { + return; + } + + // + // Loop ... + for (int i = signalsCount - 1; i >= 0; i--) + { + // + XSignal iSignal = signals[i]; + + // + if (type == X_SIGNAL_UNKNOWN) + { + Add( + iSignal, + result); + } + else if (iSignal.type == type) + { + Add( + iSignal, + result); + } + } + } + + // + // Filter Signals By Searching Comments ... + void FilterSignals( + XSignal &result[], // Holds Result ... + const string query, // Search in Comment Qeury ... + ENUM_X_SIGNAL_TYPE type = X_SIGNAL_UNKNOWN // Specified Sginal Type ... + ) + { + // + CleanBuffer(result); + + // + XSignal signals[]; + GetSignals( + signals, + type); + int signalsCount = ArraySize(signals); + + // + // Validate Args ... + if ( + StringLen(query) <= 0 || + signalsCount <= 0) + { + return; + } + + // + // Loop ... + for (int i = 0; i < signalsCount; i++) + { + // + XSignal iSignal = signals[i]; + + // + int queryPos = StringFind( + iSignal.comment, + query); + bool isContains = queryPos > -1; + if (!isContains) + { + continue; + } + + // + Add( + iSignal, + result); + } + } + + // + // Get All Trades Which Candle Passed after Open ... + void GetOldSignals( + XSignal &result[], // Holds Result + int life, // Max Candle Passed after Trades Open + ENUM_TIMEFRAMES period = NULL, // Calculate Candles based on time frame + ENUM_X_SIGNAL_TYPE type = X_SIGNAL_UNKNOWN // Specify Type of Positions + ) + { + // + CleanBuffer(result); + + // + // Normalize Period ... + if (period == NULL) + { + period = _Period; + } + + // + XSignal signals[]; + GetSignals( + signals, + type); + int signalsCount = ArraySize(signals); + if (signalsCount <= 0) + { + return; + } + + // + // Current Time Frame Candle Index ... + int currentBarIndex = 0; + + // + // Loop through Positions ... + for (int i = 0; i < signalsCount; i++) + { + // + XSignal iSignal = signals[i]; + + // + // Retrieve Trade Open Bar Index based on Current Period ... + int tradeOpenBarIndex = iBarShift( + mSymbol, + period, + iSignal.time); + + // + // Calculate Trade Life ... + int diff = MathAbs(currentBarIndex - tradeOpenBarIndex); + + // + bool isPassed = diff >= life; + if (isPassed) + { + // + Add( + iSignal, + result); + } + } + } + + // + // Get In Profit Signals ... + void GetInProfitSignals( + XSignal &result[], // Holds Result + double minProfit = 0, // Minimum Profit To Close Trades + ENUM_X_SIGNAL_TYPE type = X_SIGNAL_UNKNOWN // Specify Type of Positions + ) + { + // + CleanBuffer(result); + + // + XSignal signals[]; + GetSignals( + signals, + type); + int signalsCount = ArraySize(signals); + if (signalsCount <= 0) + { + return; + } + + // + // Loop ... + for (int i = 0; i < signalsCount; i++) + { + // + XSignal iSignal = signals[i]; + + // + bool isPassed = minProfit <= 0 && iSignal.profit > 0 + ? true + : iSignal.profit >= minProfit; + if (isPassed) + { + Add( + iSignal, + result); + } + } + } + + // + // Get In Drawdown Signals ... + void GetInDrawdownSignals( + XSignal &result[], // Holds Result + double maxDrawDown = 0, // Minimum Profit To Close Trades + ENUM_X_SIGNAL_TYPE type = X_SIGNAL_UNKNOWN // Specify Type of Positions + ) + { + // + CleanBuffer(result); + + // + XSignal signals[]; + GetSignals( + signals, + type); + int signalsCount = ArraySize(signals); + if (signalsCount <= 0) + { + return; + } + + // + // Loop ... + for (int i = 0; i < signalsCount; i++) + { + // + XSignal iSignal = signals[i]; + + // + bool isPassed = maxDrawDown <= 0 && iSignal.profit < 0 + ? true + : iSignal.profit >= (-1 * maxDrawDown); + if (isPassed) + { + Add( + iSignal, + result); + } + } + } + + // + // Retrieve Max In Draw Down Trade ... + XSignal GetMaxInDrawdownSignal( + ENUM_X_SIGNAL_TYPE type = X_SIGNAL_UNKNOWN // Specify Type of Positions + ) + { + // + XSignal result = {}; + + // + XSignal signals[]; + GetInDrawdownSignals( + signals, + 0, + type); + int signalsCount = ArraySize(signals); + if (signalsCount <= 0) + { + return result; + } + + // + // Loop ... + for (int i = 0; i < signalsCount; i++) + { + // + XSignal iSignal = signals[i]; + + // + result = + (result.ticket <= 0 && + result.profit == 0) || + result.profit > iSignal.profit + ? iSignal + : result; + } + + // + return result; + } + + // + // Calculate Profits Of all Open Signals ... + double GetSignalsProfit( + ENUM_X_SIGNAL_TYPE type = X_SIGNAL_UNKNOWN // Specify Type of Positions + ) + { + // + double result = 0; + + // + XSignal signals[]; + GetSignals(signals, type); + int signalsCount = ArraySize(signals); + if (signalsCount <= 0) + { + return result; + } + + // + // Loop ... + for (int i = 0; i < signalsCount; i++) + { + // + XSignal iSignal = signals[i]; + + // + result += iSignal.profit; + } + + // + return result; + } + + // + // END Retrieve ... + // + + // + // START Signal Execution Actions ... + // + + // + // Execute a Signal in Market ... + ENUM_EXECUTION_SIGNAL_RESULT ExecuteSignal( + XSignal &signal, // Specified Signal + bool ignoreNumberOfTraes = false, // Ignore Number of Trades + bool checkAccountConditions = true // Check Account Balance, Equity and Free Margin for Signal Execution + ) + { + // + ENUM_EXECUTION_SIGNAL_RESULT result = X_TRADER_UNKNOWN_ERROR; + + // + // Validate Signal ... + bool isValid = IsValidSignal(signal); + if (!isValid) + { + // + result = X_TRADER_INVALID_SIGNAL_ERROR; + return result; + } + + // + // Check Account Equity ... + bool isEquityPassed = !checkAccountConditions + ? true + : IsEquityReadyForTrade(); + if (!isEquityPassed) + { + // + result = X_TRADER_NOT_ENOUGH_EQUITY_ERROR; + return result; + } + + // + // Check Account Balance ... + bool isBalancePassed = !checkAccountConditions + ? true + : IsBalanceReadyForTrade(); + if (!isBalancePassed) + { + // + result = X_TRADER_NOT_ENOUGH_BALANCE_ERROR; + return result; + } + + // + // Check Account FreeMargin ... + bool isFreeMarginPassed = !checkAccountConditions + ? true + : IsFreeMarginReadyForTrade(); + if (!isFreeMarginPassed) + { + // + result = X_TRADER_NOT_ENOUGH_MARIGIN_ERROR; + return result; + } + + // + // Check Number of Open Trades ... + int openTradesCount = Count(); + bool isTradeCountPassed = ignoreNumberOfTraes + ? true + : openTradesCount < mMaxAllowedTrades; + if (!isTradeCountPassed) + { + // + result = X_TRADER_MAX_TRADES_REACHED_ERROR; + return result; + } + + // + bool isExecuted = + signal.type == X_SIGNAL_LONG + ? Buy( + signal.volume, + signal.entry, + mUseVirtualTPSL + ? 0 + : signal.sl, + mUseVirtualTPSL + ? 0 + : signal.tp, + signal.comment) + : signal.type == X_SIGNAL_SHORT + ? Sell( + signal.volume, + signal.entry, + mUseVirtualTPSL + ? 0 + : signal.sl, + mUseVirtualTPSL + ? 0 + : signal.tp, + signal.comment) + : false; + if (isExecuted) + { + // + ulong ticket = PositionGetTicket(PositionsTotal() - 1); + + // + signal.id = ticket; + signal.ticket = ticket; + + // + AddOrUpdateSignalInfo(signal); + + // + result = X_TRADER_SUCCEED_EXECUTION; + } + + // + return result; + } + + // + // This Function, Handling Following Works on Open Positions: + // - Close On SL if Reached ... + // - Close On TP if Reached ... + // - Make Risk Free Trades ... + bool HandleSignals( + XTraderHandlerResult &handlerResult, // Holds Result + bool ignoreRiskFree = false // Ignore Risk Free Trdaes + ) + { + // + bool result = false; + + // + // Cleanup Result ... + CleanBuffer(handlerResult.sl); + CleanBuffer(handlerResult.tp); + CleanBuffer(handlerResult.rf); + + // + // Reading Open Positions ... + XSignal signals[]; + GetSignals(signals); + int signalsCount = ArraySize(signals); + if (signalsCount <= 0) + { + return result; + } + + // + double deviation = mSlippage * GetPoints(mSymbol); + + // + // Loop ... + for (int i = 0; i < signalsCount; i++) + { + // + XSignal iSignal = signals[i]; + + // + bool isLong = iSignal.type == X_SIGNAL_LONG; + double entry = GetEntry(iSignal.symbol, iSignal.type); + double exit = GetExit(iSignal.symbol, iSignal.type); + double spread = GetSpread(iSignal.symbol); + double appliedTPPrice = + iSignal.tp > 0 + ? isLong + ? iSignal.tp - deviation + : iSignal.tp + deviation + : 0; + double appliedSLPrice = + iSignal.sl > 0 + ? isLong + ? iSignal.sl + deviation + : iSignal.sl - deviation + : 0; + + // + double usedPrice = exit; + + // + bool isSLTouched = + isLong + ? usedPrice <= appliedSLPrice + : usedPrice >= appliedSLPrice; + + // + bool isTPTouched = + isLong + ? usedPrice >= appliedTPPrice + : usedPrice <= appliedTPPrice; + + // + // Handle SL ... + if ( + // + iSignal.sl > 0 + // + && + // + isSLTouched + // + && + // + mUseVirtualTPSL) + { + // + string comment = GenerateSignalSLComment(iSignal); + + // + bool isClosed = Close( + iSignal.ticket, + comment); + if (isClosed) + { + AddItemToBuffer( + iSignal, + handlerResult.sl); + } + } + + // + // Handle TP ... + if ( + // + iSignal.tp > 0 + // + && + // + isTPTouched + // + && + // + mUseVirtualTPSL) + { + // + string comment = GenerateSignalTPComment(iSignal); + + // + bool isClosed = Close( + iSignal.ticket, + comment); + if (isClosed) + { + AddItemToBuffer( + iSignal, + handlerResult.tp); + } + } + + // + // Handle Risk Free ... + if ( + // + !ignoreRiskFree + // + && + // + iSignal.riskFreeStep > 0 + // + && + // + iSignal.riskFreeRate > 0 + // + ) + { + // + // Make Signals Risk Free Only if Signal In Profit ... + if (iSignal.profit <= 0) + { + continue; + } + + // + // Base Price is ENTRY, then Last Level, in each level SL is Last Level ... + // + // Calculate Risk Free Level/Multiplier ... + double level = 0; + double roundedLevel = 0; + double rStepPrice = PipsToPrice(iSignal.riskFreeStep); + double rBasePrice = + iSignal.sl > 0 && + iSignal.sl > iSignal.entry + ? iSignal.sl + : iSignal.entry; + + // + double exit = GetExit(iSignal.type); + + // + // Check Base Price for Signal reached with Exit Price ... + bool isExitPriceReachedBasePrice = + isLong + ? exit > rBasePrice + : exit < rBasePrice; + if (!isExitPriceReachedBasePrice) + { + continue; + } + + // + // Calculate Risk Free Step Multiplier ... + level = MathAbs(exit - rBasePrice) / rStepPrice; + + // + // Check Level Must Bigger than 1 ... + if (level < 1) + { + continue; + } + + // + // Normalize Level ... + roundedLevel = MathRound(level); + if (level < roundedLevel) + { + level -= (1 - (roundedLevel - level)); + } + else if (level > roundedLevel) + { + level -= (level - roundedLevel); + } + + // + // Generate Comment ... + string comment = GenerateSignalRFComment(iSignal, (int)level); + + // + // Calculate SL ... + double slDistance = spread; + double sl = + isLong + ? exit - slDistance + : exit + slDistance; + + // + // Increase TP One Level if Exists ... + double tp = iSignal.tp; + if (iSignal.tp > 0 && (isLong + ? iSignal.tp < rBasePrice + rStepPrice + : iSignal.tp > rBasePrice - rStepPrice)) + { + // + tp = + isLong + ? iSignal.tp + rStepPrice + : iSignal.tp - rStepPrice; + } + + // + double rVolume = NormalizeVolume((iSignal.volume * iSignal.riskFreeRate), iSignal.symbol); + + // + // Update Signal Volume ... + double volume = iSignal.volume - rVolume; + + // + bool isClosedPartial = + ClosePartial( + iSignal.ticket, + rVolume, + comment); + if (isClosedPartial) + { + // + bool isModified = true; + if (!mUseVirtualTPSL) + { + // + isModified = Modify( + iSignal.ticket, + sl, + tp, + comment); + } + + // + if (isModified) + { + // + // Try to Update Signal ... + XSignal s = mSignalManager.Get(iSignal.ticket); + + // + // Apply Changes on Signal ... + s.sl = sl; + s.tp = tp; + s.volume = volume; + + // + // Update Signal ... + bool isUpdated = false; + bool isRemoved = false; + if (volume == 0) + { + isRemoved = mSignalManager.Remove(s); + } + else if (volume > 0) + { + isUpdated = mSignalManager.AddOrUpdate(s); + } + if ( + isUpdated || + isRemoved) + { + // + AddItemToBuffer( + s, + handlerResult.rf); + } + } + } + else + { + mSignalManager.Remove(iSignal.ticket); + } + } + } + + // + result = + ArraySize(handlerResult.tp) > 0 || + ArraySize(handlerResult.sl) > 0 || + ArraySize(handlerResult.rf) > 0; + + // + return result; + } + + // + // Close All Trades ... + void CloseSignals( + XSignal &result[], // Holds Result + ENUM_X_SIGNAL_TYPE type = X_SIGNAL_UNKNOWN // Specify Type of Positions + ) + { + // + CleanBuffer(result); + + // + XSignal signals[]; + GetSignals( + signals, + type); + int signalsCount = ArraySize(signals); + if (signalsCount <= 0) + { + return; + } + + // + for (int i = 0; i < signalsCount; i++) + { + // + XSignal iSignal = signals[i]; + + // + string comment = GenerateSignalForceCloseComment(iSignal); + + // + bool isClosed = Close( + iSignal.ticket, + comment); + if (isClosed) + { + Add( + iSignal, + result); + } + } + } + + // + // Close Pyramid Signals ... + void CloseInPyramidSignals( + XSignal &result[], // Holds Result + double pyramid = 0, // Close Pyramid Profit + ENUM_X_SIGNAL_TYPE type = X_SIGNAL_UNKNOWN // Specify Type of Positions + ) + { + // + CleanBuffer(result); + + // + XSignal signals[]; + GetSignals( + signals, + type); + int signalsCount = ArraySize(signals); + if (signalsCount <= 0) + { + return; + } + + // + double profit = 0; + for (int i = 0; i < signalsCount; i++) + { + // + XSignal iSignal = signals[i]; + + // + profit += iSignal.profit; + } + + // + // Normalize Pyramid ... + if (pyramid < 0) + { + pyramid = 0; + } + + // + if (profit > pyramid) + { + CloseSignals(result); + } + } + + // + // Close All Trades Which Candle Passed after Open ... + void CloseOldSignals( + XSignal &result[], // Holds Result + int life, // Max Candle Passed after Trades Open + ENUM_TIMEFRAMES period = NULL, // Calculate Candles based on time frame + ENUM_X_SIGNAL_TYPE type = X_SIGNAL_UNKNOWN // Specify Type of Positions + ) + { + // + CleanBuffer(result); + + // + XSignal signals[]; + GetOldSignals( + signals, + life, + period, + type); + int signalsCount = ArraySize(signals); + if (signalsCount <= 0) + { + return; + } + + // + for (int i = 0; i < signalsCount; i++) + { + // + XSignal iSignal = signals[i]; + + // + string comment = GenerateSignalAgeComment(iSignal); + + // + bool isClosed = Close( + iSignal.ticket, + comment); + if (isClosed) + { + Add( + iSignal, + result); + } + } + } + + // + // Close In Profit Signals ... + void CloseInProfitSignals( + XSignal &result[], // Holds Result + double minProfit = 0, // Minimum Profit To Close Trades + ENUM_X_SIGNAL_TYPE type = X_SIGNAL_UNKNOWN // Specify Type of Positions + ) + { + // + CleanBuffer(result); + + // + XSignal signals[]; + GetInProfitSignals( + signals, + minProfit, + type); + int signalsCount = ArraySize(signals); + if (signalsCount <= 0) + { + return; + } + + // + for (int i = 0; i < signalsCount; i++) + { + // + XSignal iSignal = signals[i]; + + // + string comment = GenerateSignalProfitComment(iSignal); + + // + bool isClosed = Close( + iSignal.ticket, + comment); + if (isClosed) + { + Add( + iSignal, + result); + } + } + } + + // + // Close In Drawdown Signals ... + void CloseInDrawdownSignals( + XSignal &result[], // Holds Result + double maxDrawDown = 0, // Minimum Profit To Close Trades + ENUM_X_SIGNAL_TYPE type = X_SIGNAL_UNKNOWN // Specify Type of Positions + ) + { + // + CleanBuffer(result); + + // + XSignal signals[]; + GetInDrawdownSignals( + signals, + maxDrawDown, + type); + int signalsCount = ArraySize(signals); + if (signalsCount <= 0) + { + return; + } + + // + for (int i = 0; i < signalsCount; i++) + { + // + XSignal iSignal = signals[i]; + + // + string comment = GenerateSignalProfitComment(iSignal); + + // + bool isClosed = Close( + iSignal.ticket, + comment); + if (isClosed) + { + Add( + iSignal, + result); + } + } + } + + // + // END Signal Execution Actions ... + // + + // + // START Actions ... + // + + // + // Force Open a Buy/Long Position ... + bool Buy( + double volume, // position volume + double price, // execution price + double sl = 0, // stop loss price + double tp = 0, // take profit price + const string comment = "" // comment + ) + { + // + bool result = false; + + // + result = mTrader.Buy( + volume, + mSymbol, + price, + sl, + tp, + comment); + + // + return result; + } + + // + // Send BUY LIMIT order ... + bool BuyLimit( + 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; + + // + result = mTrader.BuyLimit( + volume, + price, + mSymbol, + sl, + tp, + typeTime, + expiration, + comment); + + // + return result; + } + + // + // Send BUY STOP order ... + bool BuyStop( + 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; + + // + result = mTrader.BuyStop( + volume, + price, + mSymbol, + sl, + tp, + typeTime, + expiration, + comment); + + // + return result; + } + + // + // Force Open a Sell/Short Position ... + bool Sell( + double volume, // position volume + double price, // execution price + double sl = 0, // stop loss price + double tp = 0, // take profit price + const string comment = "" // comment + ) + { + // + bool result = false; + + // + result = mTrader.Sell( + volume, + mSymbol, + price, + sl, + tp, + comment); + + // + return result; + } + + // + // Send SELL LIMIT order ... + bool SellLimit( + 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; + + // + result = mTrader.SellLimit( + volume, + price, + mSymbol, + sl, + tp, + typeTime, + expiration, + comment); + + // + return result; + } + + // + // Send SELL STOP order ... + bool SellStop( + 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; + + // + result = mTrader.SellStop( + volume, + price, + mSymbol, + 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 + const string comment = "" // comment + ) + { + // + bool result = false; + + // + // Validate Args ... + if (tp <= 0 && sl <= 0) + { + result = false; + return result; + } + + // + result = mTrader.PositionModify( + ticket, + sl, + tp, + comment); + if (result) + { + // + if (mSignalManager.IsExists(ticket)) + { + // + XSignal signal = GetSignal(ticket); + + // + mSignalManager.Update(signal); + } + } + + // + 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); + if (result) + { + // + if (mSignalManager.IsExists(ticket)) + { + mSignalManager.Remove(ticket); + } + } + + // + return result; + } + + // + // 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); + if (result) + { + // + if (mSignalManager.IsExists(ticket)) + { + // + XSignal signal = GetSignal(ticket); + + // + mSignalManager.Update(signal); + } + } + + // + return result; + } + + // + // END Actions ... + // + + // + // START Account Related ... + // + + // + // Retrieve Minimum Balance For Open Trades ... + double GetMinBalanceForOpenTrades() + { + // + double result = mMinBallanceForOpenTrades; + + // + double balance = mAccountInfo.GetBalance(); + double deposit = mAccountInfo.GetInitialBalance(); + if (balance > deposit) + { + // + double rate = mMinBallanceForOpenTrades / deposit; + + // + double ratedBalance = balance * rate; + + // + result = MathMax(mMinBallanceForOpenTrades, ratedBalance); + } + + // + return result; + } + + // + // Check Account Has Minimum Balance For Trade ... + bool IsBalanceReadyForTrade() + { + // + bool result = false; + + // + double minBalance = GetMinBalanceForOpenTrades(); + result = mAccountInfo.GetBalance() >= minBalance; + + // + return result; + } + + // + // Check Free Margin Has Enough For Trade ... + bool IsFreeMarginReadyForTrade() + { + // + bool result = false; + + // + double freeMargin = mAccountInfo.GetFreeMargin(); + + // + result = freeMargin >= mMinAllowedFreeMarginForOpenTrades; + + // + return result; + } + + // + // Check Equity Has Enough For Trade ... + bool IsEquityReadyForTrade() + { + // + bool result = false; + + // + double equity = mAccountInfo.GetEquity(); + + // + result = equity >= mMinAllowedFreeMarginForOpenTrades; + + // + return result; + } + + // + // END Account Related ... + // + + // + // START Signal Related ... + // + + // + // Validate Signal ... + bool IsValidSignal( + XSignal &signal // Specified Signal for Execution + ) + { + // + bool result = false; + + // + // Validate Signal Type ... + result = signal.type != X_SIGNAL_UNKNOWN; + if (!result) + { + return result; + } + + // + // Check Symbol ... + result = StringLen(signal.symbol) == 0 ? true : signal.symbol == mSymbol; + if (!result) + { + return result; + } + + // + // Check magic number ... + result = signal.magicNumber <= 0 ? true : signal.magicNumber == mMagicNumber; + if (!result) + { + return result; + } + + // + // Check Entry ... + result = signal.entry > 0; + if (!result) + { + return result; + } + + // // + // // Check SL ... + // // For Fix RiskFree Issues Ignore this ... + // result = signal.sl == 0 ? true : signal.type == X_SIGNAL_LONG ? signal.sl < signal.entry + // : signal.sl > signal.entry; + // if (!result) + // { + // return result; + // } + + // + // Check TP ... + result = signal.tp == 0 ? true : signal.type == X_SIGNAL_LONG ? signal.tp > signal.entry + : signal.tp < signal.entry; + if (!result) + { + return result; + } + + // + // Check Volume ... + result = signal.volume > 0; + if (!result) + { + return result; + } + + // + // Check Time ... + result = signal.time > 0; + if (!result) + { + return result; + } + + // + return result; + } + + // + // Get Signal InDirection (Reversal) Type ... + ENUM_X_SIGNAL_TYPE GetSignalIndirectionType( + XSignal &signal // Specified Signal + ) + { + // + ENUM_X_SIGNAL_TYPE result = X_SIGNAL_UNKNOWN; + + // + switch (signal.type) + { + // + case X_SIGNAL_LONG: + result = X_SIGNAL_SHORT; + break; + + // + case X_SIGNAL_SHORT: + result = X_SIGNAL_LONG; + break; + } + + // + return result; + } + + // + // Get Signal InDirection (Reversal) Type ... + ENUM_X_SIGNAL_TYPE GetIndirectionSignalType( + ENUM_X_SIGNAL_TYPE type // Specified Type + ) + { + // + ENUM_X_SIGNAL_TYPE result = X_SIGNAL_UNKNOWN; + + // + switch (type) + { + // + case X_SIGNAL_LONG: + result = X_SIGNAL_SHORT; + break; + + // + case X_SIGNAL_SHORT: + result = X_SIGNAL_LONG; + break; + } + + // + return result; + } + + // + // Calculate SignalAge ... + int GetSignalAge( + datetime time // Signal Execution Time + ) + { + // + int result = 0; + + // + // Validate Arg ... + if (time <= 0) + { + return result; + } + + // + int sIndex = iBarShift( + mSymbol, + _Period, + time); + + // + datetime cTime = iTime( + mSymbol, + _Period, + 0); + int cIndex = iBarShift( + mSymbol, + _Period, + cTime); + + // + result = MathAbs(cIndex - sIndex); + + // + return result; + } + int GetSignalAge( + datetime time, // Signal Execution Time + ENUM_TIMEFRAMES period // Specify Time Frame + ) + { + // + int result = 0; + + // + // Validate Arg ... + if (time <= 0) + { + return result; + } + + // + int sIndex = iBarShift( + mSymbol, + period, + time); + + // + datetime cTime = iTime( + mSymbol, + period, + 0); + int cIndex = iBarShift( + mSymbol, + _Period, + cTime); + + // + result = MathAbs(cIndex - sIndex); + + // + return result; + } + int GetSignalAge( + XSignal &signal // Specified Signal + ) + { + // + int result = 0; + + // + // Validate Arg ... + if ( + signal.time <= 0 || + !IsValid(signal, mMagicNumber)) + { + return result; + } + + // + result = GetSignalAge(signal.time); + + // + return result; + } + int GetSignalAge( + XSignal &signal, // Specify Signal + ENUM_TIMEFRAMES period // Specify Time Frame + ) + { + // + int result = 0; + + // + // Validate Arg ... + if ( + signal.time <= 0 || + !IsValid(signal, mMagicNumber)) + { + return result; + } + + // + result = GetSignalAge( + signal.time, + period); + + // + return result; + } + + // + // Prepare a Signall ... + XSignal GenerateSignal( + ENUM_X_SIGNAL_TYPE type, // Signal Type + double tp = 0, // Take Profit + double sl = 0, // Stop Loss + double volume = 0, // Volume + double riskFreeStep = 0, // Risk Free Step Price + double riskFreeRate = 0 // Risk Free Rate + ) + { + // + XSignal result = {}; + + // + // Validate Arg ... + if (type == X_SIGNAL_UNKNOWN) + { + return result; + } + + // + // Check Signal Type ... + bool isLong = type == X_SIGNAL_LONG; + + // + // Retrieve entry Price ... + double entry = GetEntry(mSymbol, type); + double spread = GetSpread(mSymbol); + + // + result.tp = tp; + result.sl = sl; + result.type = type; + result.entry = entry; + result.symbol = mSymbol; + result.magicNumber = mMagicNumber; + result.riskFreeStep = riskFreeStep; + result.riskFreeRate = riskFreeRate; + result.time = iTime(mSymbol, _Period, 0); + result.volume = NormalizeVolume(volume, mSymbol); + + // + // Since we Use signal instance to Generate Comment, this must be at the end ... + result.comment = GenerateSignalComment(result); + + // + return result; + } + + // + // Convert a Signal to String Representation ... + string ToString( + XSignal &signal // Specified Signal + ) + { + // + string result = ""; + + // + if (!IsValid(signal, mMagicNumber) || signal.ticket <= 0) + { + return result; + } + + // + // TICKET ... + // it is very importants since they hold position info ... + result += X_SIGNAL_TICKET + "(" + (string)signal.ticket + ")"; + + // + // TYPE ... + string typeStr = GetSignalType(signal.type); + result += "_" + X_SIGNAL_TYPE + "(" + typeStr + ")"; + + // + // TP ... + result += "_" + X_SIGNAL_TP + "(" + (string)signal.tp + ")"; + + // + // SL ... + result += "_" + X_SIGNAL_SL + "(" + (string)signal.sl + ")"; + + // + // RFS ... + result += "_" + X_SIGNAL_RISKFREE_STEP + "(" + (string)signal.riskFreeStep + ")"; + + // + // RFR ... + result += "_" + X_SIGNAL_RISKFREE_RATE + "(" + (string)signal.riskFreeRate + ")"; + + // + return result; + } + + // + // Generate Comments for Specific Signal ... + string GenerateSignalComment( + ENUM_X_SIGNAL_TYPE type, // Specify Kind Signal Type + double volume, // Signal Volume + bool isCrossSignal = false // Specify Signal Cross + ) + { + // + string result = ""; + + // + string typeStr = GetSignalType(type); + if ( + volume <= 0 || + StringLen(typeStr) == 0) + { + return result; + } + + // + volume = NormalizeVolume(volume, mSymbol); + + // + result = mTag + (!isCrossSignal ? "" : "_Cross_") + "_" + typeStr; + + // + return result; + } + string GenerateSignalComment( + XSignal &signal, // Specified Signal + bool isCrossSignal = false // Specify Signal Cross + ) + { + // + string result = GenerateSignalComment( + signal.type, + signal.volume, + isCrossSignal + // + ); + + // + return result; + } + + // + // Generate Signal RF TP Comment ... + string GenerateSignalRFComment( + XSignal &signal, // Specified Signal + int level // Which Step of RFS + ) + { + // + string result = ""; + + // + // Validate Signal and it's Ticket ... + if (!IsValidSignal(signal) || signal.ticket <= 0) + { + return result; + } + + // + double exit = NormalizePrice(GetExit(signal.symbol, signal.type), signal.symbol); + + // + string prefix = X_SIGNAL_RISKFREE_STEP + "(" + (string)signal.ticket + ")"; + // + result = + // + level > 0 + ? prefix + "_" + (string)level + ": " + (string)exit + : prefix + ": " + (string)exit; + // + ; + + // + return result; + } + + // + // Generate Signal TP Comment ... + string GenerateSignalTPComment( + XSignal &signal // Specified Signal + ) + { + // + string result = ""; + + // + // Validate Signal and it's Ticket ... + if (!IsValidSignal(signal) || signal.ticket <= 0) + { + return result; + } + + // + double exit = NormalizePrice(GetExit(signal.symbol, signal.type), signal.symbol); + + // + result = + // + X_SIGNAL_TP + "(" + (string)signal.ticket + "): " + (string)exit; + // + ; + + // + return result; + } + + // + // Generate Signal SL Comment ... + string GenerateSignalSLComment( + XSignal &signal // Specified Signal + ) + { + // + string result = ""; + + // + // Validate Signal and it's Ticket ... + if (!IsValidSignal(signal) || signal.ticket <= 0) + { + return result; + } + + // + double exit = NormalizePrice(GetExit(signal.symbol, signal.type), signal.symbol); + + // + result = + // + X_SIGNAL_SL + "(" + (string)signal.ticket + "): " + (string)exit; + // + ; + + // + return result; + } + + // + // Generate Signal Profit Comment ... + string GenerateSignalProfitComment( + XSignal &signal // Specified Signal + ) + { + // + string result = ""; + + // + // Validate Signal and it's Ticket ... + if (!IsValidSignal(signal) || signal.ticket <= 0) + { + return result; + } + + // + result = + // + "Profit(" + (string)signal.ticket + "): " + (string)signal.profit; + // + ; + + // + return result; + } + + // + // Generate Signal Force Close Comment ... + string GenerateSignalForceCloseComment( + XSignal &signal // Specified Signal + ) + { + // + string result = ""; + + // + // Validate Signal and it's Ticket ... + if (!IsValidSignal(signal) || signal.ticket <= 0) + { + return result; + } + + // + result = + // + "FC(" + (string)signal.ticket + "): " + (string)signal.profit; + // + ; + + // + return result; + } + + // + // Generate Signal Age Comment ... + string GenerateSignalAgeComment( + XSignal &signal // Specified Signal + ) + { + // + string result = ""; + + // + // Validate Signal and it's Ticket ... + if (!IsValidSignal(signal) || signal.ticket <= 0) + { + return result; + } + + // + int age = GetSignalAge(signal); + + // + result = + // + "(" + (string)signal.ticket + ") A: " + (string)age + ", P:" + (string)signal.profit; + // + ; + + // + return result; + } + + // + // Generate a Signal Object name for Draw Events On Chart ... + string GenerateSignalObjectName( + ulong ticket // Specify Ticket + ) + { + // + string result = ""; + + // + // Validate Arg ... + if (ticket <= 0) + { + return result; + } + + // + // TICKET ... + // it is very importants since they hold position info ... + result += "T(" + (string)ticket + ")"; + + // + return result; + } + string GenerateSignalObjectName( + XSignal &signal // Specified Signal + ) + { + // + string result = ""; + + // + // Validate Arg ... + if (!IsValid(signal, mMagicNumber)) + { + return result; + } + + // + result = GenerateSignalObjectName(signal.ticket); + + // + return result; + } + + // + // Genrate a Signal Event Object Name ... + string GenerateSignalEventObjectName( + ulong ticket // Specify Ticket + ) + { + // + string result = ""; + + // + result = GenerateSignalObjectName(ticket) + "_Event"; + + // + return result; + } + string GenerateSignalEventObjectName( + XSignal &signal // Specified Signal + ) + { + // + string result = ""; + + // + result = GenerateSignalEventObjectName(signal.ticket); + + // + return result; + } + + // + // END Signal Related ... + // + + // + // START Deals ... + // + + // + // Count Deals ... + int DealsCount( + datetime start = -1, // Start Date + datetime end = -1 // End Date + ) + { + // + int result = 0; + + // + XDeal deals[]; + GetDeals( + deals, + start, + end); + result = ArraySize(deals); + + // + return result; + } + + // + // Retrieve All Deals ... + void GetDeals( + XDeal &result[], // Hold's Result + datetime start = -1, // Start Date + datetime end = -1 // End Date + ) + { + // + CleanBuffer(result); + + // + // Select History if Start and End date provided ... + if (start > -1) + { + // + // Normalize End date ... + if (end == -1) + { + end = TimeCurrent(); + } + + // + bool isSelect = HistorySelect(start, end); + if (!isSelect) + { + return; + } + } + + // + int total = HistoryDealsTotal(); + if (total <= 0) + { + return; + } + + // + // Loop ... + for (int i = total - 1; i >= 0; i--) + { + // + // Select by Index ... + bool isSelect = mDealInfo.SelectByIndex(i); + if (!isSelect) + { + continue; + } + + // + // Check Magic ... + ulong magic = mDealInfo.Magic(); + bool isMagicSame = magic == mMagicNumber; + if (!isMagicSame) + { + continue; + } + + // + // Check Symbol ... + string symbol = mDealInfo.Symbol(); + bool isSymbolSame = symbol == mSymbol; + if (!isSymbolSame) + { + continue; + } + + // + XDeal deal = ToXDealByIndex(i); + + // + Add( + deal, + result); + } + } + + // + // Retrieve Last Deal ... + XDeal GetLastDeal() + { + // + XDeal result = {}; + + // + XDeal deals[]; + GetDeals(deals); + int dealsCount = ArraySize(deals); + if (dealsCount <= 0) + { + return result; + } + + // + result = deals[0]; + + // + return result; + } + + // + // END Deals ... + // + + // + // START Orders ... + // + + // + // Count Orders ... + int OrdersCount( + datetime start = -1, // Start Date + datetime end = -1 // End Date + ) + { + // + int result = 0; + + // + XOrder orders[]; + GetOrders( + orders, + start, + end); + result = ArraySize(orders); + + // + return result; + } + + // + // Retrieve Orders ... + void GetOrders( + XOrder &result[], // Hold's Result + datetime start = -1, // Start Date + datetime end = -1 // End Date + ) + { + // + CleanBuffer(result); + + // + // Select History if Start and End date provided ... + if (start > -1) + { + // + // Normalize End date ... + if (end == -1) + { + end = TimeCurrent(); + } + + // + bool isSelect = HistorySelect(start, end); + if (!isSelect) + { + return; + } + } + + // + int total = HistoryOrdersTotal(); + if (total <= 0) + { + return; + } + + // + // Loop ... + for (int i = total - 1; i >= 0; i--) + { + // + // Select by Index ... + bool isSelect = mOrderInfo.SelectByIndex(i); + if (!isSelect) + { + continue; + } + + // + // Check Magic ... + ulong magic = mOrderInfo.Magic(); + bool isMagicSame = magic == mMagicNumber; + if (!isMagicSame) + { + continue; + } + + // + // Check Symbol ... + string symbol = mOrderInfo.Symbol(); + bool isSymbolSame = symbol == mSymbol; + if (!isSymbolSame) + { + continue; + } + + // + XOrder order = ToXOrderByIndex(i); + + // + Add( + order, + result); + } + } + + // + // Retrieve Last Order ... + XOrder GetLastOrder() + { + // + XOrder result = {}; + + // + XOrder orders[]; + GetOrders(orders); + int ordersCount = ArraySize(orders); + if (ordersCount <= 0) + { + return result; + } + + // + result = orders[0]; + + // + return result; + } + + // + // END Orders ... + // + + // + // START OnTrade Handlers ... + // + + // + // Handle OnTrade Event ... + void HandleOnTradeEvent( + XOnTradeHandlerResult &result // Hold's Result + ) + { + // + if (mScanStarted) + { + ProcessOnTradeContext(result); + } + else + { + InitOnTradeContext(); + } + } + + // + // END OnTrade Handlers ... + // + + // + // Retrieve Magic Number ... + ulong GetMagicNumber() + { + return mMagicNumber; + } + + // + // all protected features ... +protected: + // + // all private features ... +private: + // + // Specified Unique Tag ... + string mTag; + + // + // which Symbol ... + string mSymbol; + + // + // using deviation, it must be in Point ... + int mSlippage; + + // + // using magic number ... + ulong mMagicNumber; + + // + // Detect Using Virtual TP or SL ... + bool mUseVirtualTPSL; + + // + // Specify Max Allowed Trades + int mMaxAllowedTrades; + + // + // Minimum Free Marging for Open Trades + double mMinAllowedFreeMarginForOpenTrades; + + // + // Minimum Balance for Open Trades + double mMinBallanceForOpenTrades; + + // + // using CTrade instance ... + XSCTrade mTrader; + + // + // Deals Info ... + CDealInfo mDealInfo; + + // + // Order Info ... + COrderInfo mOrderInfo; + + // + // An Instance Of XCAccount Info for Handling Account Related Actions ... + XCAccountInfo mAccountInfo; + + // + // using PositionInfo instance ... + CPositionInfo mPositionInfo; + + // + // Signal Manager ... + XCSignalManager mSignalManager; + + // + // START OnTrade Handlers ... + // + + // + 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( + XOnTradeHandlerResult &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) + { + // + LogMessage("Failed to Load OnTrade Context History ..."); + + // + 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(); + + // + // load history ... + bool selected = HistorySelect(mStartDate, mEndDate); + if (!selected) + { + // + LogMessage("Failed to Load OnTrade Context History ..."); + + // + return; + } + + // + // get the current value ... + mOrdersCount = OrdersTotal(); + mPositionsCount = PositionsTotal(); + mDealsCount = HistoryDealsTotal(); + mHistoryOrdersCount = HistoryOrdersTotal(); + + // + mScanStarted = true; + } + + // + // END OnTrade Handlers ... + // + + // + // START Signal Private ... + // + + // + // Add Or Update Signal ... + void AddOrUpdateSignalInfo( + XSignal &signal // Specified Signal + ) + { + // + bool isExists = mSignalManager.IsExists(signal); + if (isExists) + { + mSignalManager.Remove(signal.ticket); + } + + // + bool isAddOrUpdated = mSignalManager.AddOrUpdate(signal); + if (isAddOrUpdated) + { + // + color longColor = clrAqua; + color shortColor = clrFuchsia; + + // + DrawSignalShape( + signal, + longColor, + shortColor); + } + } + + // + // Retrieve Signal String From Chart Event ... + XSignal RetrieveSignal( + ulong ticket // Specify Position Ticket + ) + { + // + XSignal result = {}; + + // + if (ticket <= 0) + { + return result; + } + + // + result = mSignalManager.Get(ticket); + + // + return result; + } + void RetrieveSignal( + XSignal &signal // Specified Signal + ) + { + + // + XSignal tSignal = mSignalManager.Get(signal.ticket); + + // + // Fill signal by tSignal Data ... + // since tese properties may change in signal manipulation times ... + signal.tp = tSignal.tp; + signal.sl = tSignal.sl; + signal.riskFreeStep = tSignal.riskFreeStep; + signal.riskFreeRate = tSignal.riskFreeRate; + } + + // + // Convert Position to Signal by Index ... + XSignal PositionToSignal(int index) + { + // + XSignal result = {}; + + // + if (!mPositionInfo.SelectByIndex(index)) + { + return result; + } + + // + ulong ticket = mPositionInfo.Ticket(); + result = PositionToSignal(ticket); + + // + return result; + } + + // + // Position To Signal by Ticket ... + XSignal PositionToSignal(ulong ticket) + { + // + XSignal result = {}; + + // + if (!mPositionInfo.SelectByTicket(ticket)) + { + return result; + } + + // + bool isExists = mSignalManager.IsExists(ticket); + if (isExists) + { + result = RetrieveSignal(ticket); + } + + // + // Ticket ... + result.ticket = mPositionInfo.Ticket(); + + // + // ID ... + result.id = mPositionInfo.Identifier(); + + // + // Symbol ... + result.symbol = mPositionInfo.Symbol(); + + // + // Type ... + ENUM_POSITION_TYPE pType = (ENUM_POSITION_TYPE)mPositionInfo.PositionType(); + ENUM_X_SIGNAL_TYPE type = pType == POSITION_TYPE_BUY ? X_SIGNAL_LONG : X_SIGNAL_SHORT; + result.type = type; + + // + // MagicNumber ... + result.magicNumber = mPositionInfo.Magic(); + + // + // Entry/Open Price ... + result.entry = mPositionInfo.PriceOpen(); + + // + // Take Profit ... + result.tp = result.tp <= 0 && mPositionInfo.TakeProfit() > 0 + ? mPositionInfo.TakeProfit() + : result.tp; + + // + // Stop Loss ... + result.sl = result.sl <= 0 && mPositionInfo.StopLoss() > 0 + ? mPositionInfo.StopLoss() + : result.sl; + + // + // Profit ... + result.profit = mPositionInfo.Profit(); + + // + // Time ... + result.time = mPositionInfo.Time(); + + // + // Volume ... + result.volume = mPositionInfo.Volume(); + + // + // Comment ... + result.comment = mPositionInfo.Comment(); + + // + return result; + } + + // + // Converts a Deal to XDeal by Index ... + XDeal ToXDealByIndex(int index) + { + // + XDeal result = {}; + + // + bool isSelect = mDealInfo.SelectByIndex(index); + if (!isSelect) + { + return result; + } + + // + // Read Deal Ticket ... + ulong ticket = mDealInfo.Ticket(); + result = ToXDealByTicket(ticket); + + // + return result; + } + + // + // Converts a Deal to XDeal by Ticket ... + XDeal ToXDealByTicket(ulong ticket) + { + // + XDeal result = {}; + + // + mDealInfo.Ticket(ticket); + + // + result.time = mDealInfo.Time(); + result.swap = mDealInfo.Swap(); + result.magic = mDealInfo.Magic(); + result.order = mDealInfo.Order(); + result.entry = mDealInfo.Entry(); + result.price = mDealInfo.Price(); + result.ticket = mDealInfo.Ticket(); + result.symbol = mDealInfo.Symbol(); + result.type = mDealInfo.DealType(); + result.profit = mDealInfo.Profit(); + result.volume = mDealInfo.Volume(); + result.comment = mDealInfo.Comment(); + result.positionId = mDealInfo.PositionId(); + result.commission = mDealInfo.Commission(); + result.reason = (ENUM_DEAL_REASON)HistoryDealGetInteger( + ticket, + DEAL_REASON); + + // + return result; + } + + // + // Convert an Order to XOrder by Index ... + XOrder ToXOrderByIndex(int index) + { + // + XOrder result = {}; + + // + bool isSelect = mOrderInfo.SelectByIndex(index); + if (!isSelect) + { + return result; + } + + // + ulong ticket = mOrderInfo.Ticket(); + result = ToXOrderByTicket(ticket); + + // + return result; + } + + // + // Convert an Order to XOrder by Ticket ... + XOrder ToXOrderByTicket(ulong ticket) + { + // + XOrder result = {}; + + // + bool isSelect = mOrderInfo.Select(ticket); + if (!isSelect) + { + return result; + } + + // + result.state = mOrderInfo.State(); + result.magic = mOrderInfo.Magic(); + result.ticket = mOrderInfo.Ticket(); + result.symbol = mOrderInfo.Symbol(); + result.type = mOrderInfo.OrderType(); + result.comment = mOrderInfo.Comment(); + result.stopLoss = mOrderInfo.StopLoss(); + result.typeTime = mOrderInfo.TypeTime(); + result.timeDone = mOrderInfo.TimeDone(); + result.timeSetup = mOrderInfo.TimeSetup(); + result.positionId = mOrderInfo.PositionId(); + result.priceOpen = mOrderInfo.PriceOpen(); + result.takeProfit = mOrderInfo.TakeProfit(); + result.typeFilling = mOrderInfo.TypeFilling(); + result.priceCurrent = mOrderInfo.PriceCurrent(); + result.volumeInitial = mOrderInfo.VolumeInitial(); + result.volumeCurrent = mOrderInfo.VolumeCurrent(); + result.timeExpiration = mOrderInfo.TimeExpiration(); + result.priceStopLimit = mOrderInfo.PriceStopLimit(); + result.reason = (ENUM_ORDER_REASON)HistoryOrderGetInteger( + ticket, + ORDER_REASON); + + // + return result; + } + // + // END Signal Private ... + // +}; + +// +// a Class For Guard Account ... +class XCGuard : public XCBase +{ + // + // Public ... +public: + // + // Constructor ... + XCGuard( + int oldAge, // Age for Old Trades + ENUM_X_GUARD_ACTIONS oldGuardAction, // Guard Action for Too Old State + double criticalFactor, // Critical DrawDown Factor based On Balance + ENUM_X_GUARD_ACTIONS criticalAction, // Guard Action for Critical State + double maxFactor, // Max DrawDown Factor based on Balance + ENUM_X_GUARD_ACTIONS maxAction, // Guard Action for Max State + int GuardStopoutFiredAfterTouches, // Guard Stopout if Max State touched + ENUM_X_GUARD_SUPPORT_METHODS supportMethod // How to Support Signals + ) + { + // + mSupportPrefix = "SPT"; + mDirectional = "SPD"; + mInDirectional = "SPIND"; + + // + mOldAge = oldAge; + mOldGuardAction = oldGuardAction; + + // + mMaxFactor = maxFactor; + mMaxAction = maxAction; + mCriticalFactor = criticalFactor; + mCriticalAction = criticalAction; + mGuardStopoutFiredAfterTouches = GuardStopoutFiredAfterTouches; + + // + mSupportMethod = supportMethod; + + // + mAccountInfo = new XCAccountInfo(); + + // + double deposit = mAccountInfo.GetInitialBalance(); + + // + if ( + maxFactor > 0 && + maxFactor < 1) + { + mMaxValue = maxFactor * deposit; + } + + // + if ( + criticalFactor > 0 && + criticalFactor < 1) + { + mCriticalValue = criticalFactor * deposit; + } + + // + Reset(); + ResetMaxDrawDownTouches(); + } + + // + // Deconstructor ... + ~XCGuard() {} + + // + // Reset List ... + void Reset() + { + // + CleanBuffer(mGuardedSignals); + CleanBuffer(mSupportedSignals); + } + + // + // Reset Consecutive Max DrawDown Touches ... + void ResetMaxDrawDownTouches() + { + mOccuredconsecutiveMaxDraDownTouches = 0; + } + + // + // Calculate and Retrieve Critical DrawDown Value ... + double GetCriticalValue() + { + // + double result = mCriticalValue; + if (mCriticalFactor <= 0) + { + return result; + } + + // + double deposit = mAccountInfo.GetInitialBalance(); + double balance = mAccountInfo.GetBalance(); + + // + if (balance > deposit) + { + // + double balanceBasedCriticalDrawDown = mCriticalFactor * balance; + + // + result = MathMax( + mCriticalValue, + balanceBasedCriticalDrawDown); + } + + // + return result; + } + + // + // Calculate and Retrieve Max Allowed DrawDown Value ... + double GetMaxValue() + { + // + double result = mMaxValue; + if (mMaxValue <= 0) + { + return result; + } + + // + double deposit = mAccountInfo.GetInitialBalance(); + double balance = mAccountInfo.GetBalance(); + + // + if (balance > deposit) + { + // + double balanceBasedMaxAllwedDrawDown = mMaxFactor * balance; + + // + result = MathMax( + mMaxValue, + balanceBasedMaxAllwedDrawDown); + } + + // + return result; + } + + // + // Guard Account Protection ... + bool Guard( + XGuardHandlerResult &guardResult, // Hold's Message + string &message, // Hold's Message + XCTrade &trader, // Specified Trader + ENUM_TIMEFRAMES period = NULL // Specified Time Frame for Detecting Signal Ages + ) + { + // + message = ""; + + // + // Clean Result of Guard ... + CleanBuffer(guardResult.olds); + CleanBuffer(guardResult.maxes); + CleanBuffer(guardResult.criticals); + + // + bool result = false; + + // + // So Important is to Guard DrawDowns ... + result = GuardDrawDown( + guardResult, + message, + trader); + if (result) + { + return result; + } + + // + // Then we have to Guard Old Trades ... + result = GuardOlds( + guardResult, + message, + trader); + + // + return result; + } + + // + // Handle Guard Old Trades ... + bool GuardOlds( + XGuardHandlerResult &guardResult, // Hold's Message + string &message, // Hold's Message + XCTrade &trader, // Specified Trader + ENUM_TIMEFRAMES period = NULL // Specified Time Frame for Detecting Signal Ages + ) + { + // + // Cleanup Message ... + message = ""; + + // + // Clean Result of Guard ... + CleanBuffer(guardResult.olds); + + // + bool result = false; + + // + // Validate Args ... + if ( + mOldAge <= 0 || + mOldGuardAction == X_GUARD_DO_NOTHING) + { + return result; + } + + // + // Normalize Args ... + if (period == NULL) + { + period = _Period; + } + + // + // Retrieve Old Trades ... + XSignal oldSignals[]; + trader.GetOldSignals( + oldSignals, + mOldAge, + period); + int oldSignalsCount = ArraySize(oldSignals); + if (oldSignalsCount <= 0) + { + return result; + } + + // + result = DoGuardAction( + guardResult, + message, + trader, + mOldGuardAction, + X_GUARDED_OLD, // Specify Guard Reason + period // Specified Running Time Frame for Signal Age Calculations + ); + + // + return result; + } + + // + // Hnadle Guard DrawDown ... + bool GuardDrawDown( + XGuardHandlerResult &guardResult, // Hold's Message + string &message, // Hold's Message + XCTrade &trader // Specified Trader + ) + { + // + message = ""; + + // + // Clean Result of Guard ... + CleanBuffer(guardResult.maxes); + CleanBuffer(guardResult.criticals); + + // + bool result = false; + + // + // Check State for Guard ... + bool isCriticalGuardEnabled = mCriticalFactor > 0; + bool isMaxGuardEnabled = mMaxFactor > 0; + bool isGuardEnabled = + isMaxGuardEnabled; + + // + if (!isGuardEnabled) + { + return result; + } + + // + double maxValue = GetMaxValue(); + double criticalValue = GetCriticalValue(); + + // + double profitSums = trader.GetSignalsProfit(); + + // + bool isMaxReached = + profitSums < 0 && + isMaxGuardEnabled && + MathAbs(profitSums) >= maxValue; + bool isCriticalReached = + profitSums < 0 && + isCriticalGuardEnabled && + MathAbs(profitSums) >= criticalValue; + + // + if (!isMaxReached && !isCriticalReached) + { + // + // Reset Consecutive Max DrawDown Touches ... + ResetMaxDrawDownTouches(); + + // + return result; + } + + // + // Check For Critical Guard ... + if (isCriticalReached && !isMaxReached) + { + // + result = DoGuardAction( + guardResult, + message, + trader, + mCriticalAction, + X_GUARDED_CRITICAL); + } + else if (isMaxReached) + { + // + result = DoGuardAction( + guardResult, + message, + trader, + mMaxAction, + X_GUARDED_MAX); + + // + // Handle Guard StopOut Action ... + mOccuredconsecutiveMaxDraDownTouches++; + if ( + mMaxAction != X_GUARD_DO_NOTHING && + mMaxAction != X_GUARD_CLOSE_ALL && + mGuardStopoutFiredAfterTouches > 0 && + mOccuredconsecutiveMaxDraDownTouches >= mGuardStopoutFiredAfterTouches) + { + // + XSignal closed[]; + trader.CloseSignals(closed); + int closedCount = ArraySize(closed); + if (closedCount > 0) + { + // + for (int i = 0; i < closedCount; i++) + { + // + XSignal iSignal = closed[i]; + + // + AddItemToBuffer( + iSignal, + guardResult.maxes); + } + + // + message = "Guard StopOut Action Closed (" + (string)closedCount + ") Signals and Release Account ..."; + + // + guardResult.isStopOut = true; + + // + result = true; + } + } + } + + // + return result; + } + + // + // Do Signal Protections and apply Support ... + bool ProtectSignals( + XSignal &mResult[], // Hold's Result + XCTrade &trader, // Specified Trader + int numberOfItemsCheck = 30 // Number of Items to check + ) + { + // + bool result = false; + + // + CleanBuffer(mResult); + + // + // Check Supports Enabled ... + result = IsSupportEnabled(); + if (!result) + { + return result; + } + + // + // Update Supports ... + XSignal signals[]; + trader.GetSignals(signals); + int signalsCount = ArraySize(signals); + if (signalsCount > 0) + { + // + for (int i = 0; i < signalsCount; i++) + { + // + XSignal iSignal = signals[i]; + + // + bool isExists = IsSupportExists(iSignal.ticket); + if (isExists) + { + UpdateSupport(iSignal); + } + } + } + + // + // Count Supporteds ... + XProtectedSignal supporteds[]; + GetAllSupports(supporteds); + int supportedCount = ArraySize(supporteds); + result = supportedCount > 0; + if (!result) + { + return result; + } + + // + // Loop through ... + for (int i = 0; i < supportedCount; i++) + { + // + XProtectedSignal iP = supporteds[i]; + + // + bool canDoDirectional = CanDoDirectionalSupport( + trader, + iP.ticket, + numberOfItemsCheck); + bool canDoInDirectional = CanDoInDirectionalSupport( + trader, + iP.ticket, + numberOfItemsCheck); + + // + if ( + !canDoDirectional && + !canDoInDirectional) + { + continue; + } + + // + // Do Directional ... + if (canDoDirectional) + { + // + // Generate Propper Signal ... + XSignal sdSignal = GenerateDirectionalSupportSignal( + iP.ticket, + trader); + + // + ENUM_EXECUTION_SIGNAL_RESULT executionResult = trader.ExecuteSignal( + sdSignal, + true, + false); + bool isExecuted = executionResult == X_TRADER_SUCCEED_EXECUTION; + if (isExecuted) + { + // + XSignal eSignal = trader.GetSignal(sdSignal.ticket); + + // + AddItemToBuffer( + eSignal, + mResult); + } + } + // + // Do Indirectional ... + else if (canDoInDirectional) + { + // + // Generate Propper Signal ... + XSignal sindSignal = GenerateDirectionalSupportSignal( + iP.ticket, + trader); + + // + ENUM_EXECUTION_SIGNAL_RESULT executionResult = trader.ExecuteSignal( + sindSignal, + true, + false); + bool isExecuted = executionResult == X_TRADER_SUCCEED_EXECUTION; + if (isExecuted) + { + // + XSignal eSignal = trader.GetSignal(sindSignal.ticket); + + // + AddItemToBuffer( + eSignal, + mResult); + } + } + } + + // + result = ArraySize(mResult) > 0; + + // + return result; + } + + // + // Validate State ... + bool Validate() + { + // + bool result = false; + + // + result = + mMaxFactor > 0 && + (mCriticalFactor > 0 + ? mCriticalFactor < mMaxFactor + : true); + + // + return result; + } + + // + // START Guarded Signals Functions ... + // + + // + // Add new Protecte Signal ... + bool Add( + XSignal &signal // Specified Signal + ) + { + // + bool result = false; + + // + bool isExists = IsExists(signal.ticket); + if (isExists) + { + return result; + } + + // + XProtectedSignal item; + + // + datetime time = TimeCurrent(); + + // + item.ticket = signal.ticket; + + // + AddItemToBuffer( + time, + item.time); + + // + AddItemToBuffer( + signal.profit, + item.profit); + + // + AddItemToBuffer( + item, + mGuardedSignals); + + // + return result; + } + + // + // Get All ... + void GetAll( + XProtectedSignal &result[] // Hold's Result + ) + { + // + CopyBuffer( + mGuardedSignals, + result); + } + + // + // Get ... + XProtectedSignal Get( + ulong ticket // Specified Signal Ticket + ) + { + // + XProtectedSignal result; + + // + bool isExists = IsExists(ticket); + if (!isExists) + { + return result; + } + + // + int protectedCounts = ArraySize(mGuardedSignals); + if (protectedCounts <= 0) + { + return result; + } + + // + for (int i = 0; i < protectedCounts; i++) + { + // + XProtectedSignal iProtected = mGuardedSignals[i]; + + // + if (iProtected.ticket == ticket) + { + // + result = iProtected; + break; + } + } + + // + return result; + } + + // + // Remove ... + bool Remove( + ulong ticket // Specified Signal Ticket + ) + { + // + bool result = false; + + // + result = IsExists(ticket); + if (!result) + { + return result; + } + + // + int protectedCounts = ArraySize(mGuardedSignals); + result = protectedCounts > 0; + if (!result) + { + return result; + } + + // + XProtectedSignal cleared[]; + for (int i = 0; i < protectedCounts; i++) + { + // + XProtectedSignal iProtected = mGuardedSignals[i]; + + // + if (iProtected.ticket != ticket) + { + AddItemToBuffer( + iProtected, + cleared); + } + } + + // + // Update Source by Cleared ... + CopyBuffer( + cleared, + mGuardedSignals); + + // + result = true; + + // + return result; + } + + // + // Update ... + bool Update( + ulong ticket, // Specified Signal Ticket + datetime time, // Specified Last Checked time + double profit // Specified Signal Profit + // XProtectedSignal &item // Specified which object to Update + ) + { + // + bool result = false; + + // + int protectedCounts = ArraySize(mGuardedSignals); + result = protectedCounts > 0; + if (!result) + { + return result; + } + + // + result = IsExists(ticket); + if (!result) + { + return result; + } + + // + // Retrieve Struct ... + XProtectedSignal item = Get(ticket); + AddItemToBuffer( + time, + item.time); + AddItemToBuffer( + profit, + item.profit); + + // + result = Remove(ticket); + if (!result) + { + return result; + } + + // + AddItemToBuffer( + item, + mGuardedSignals); + result = true; + + // + return result; + } + bool Update( + XProtectedSignal &item // Specified Protected Item + ) + { + // + bool result = false; + + // + datetime time; + result = GetLastItem( + time, + item.time); + if (!result) + { + return result; + } + + // + double profit; + result = GetLastItem( + profit, + item.profit); + if (!result) + { + return result; + } + + // + result = Update( + item.ticket, time, profit); + + // + return result; + } + bool Update( + XSignal &signal // Specified Signal + ) + { + // + bool result = false; + + // + ulong ticket = signal.ticket; + datetime time = TimeCurrent(); + double profit = signal.profit; + + // + result = Update( + ticket, + time, + profit); + + // + return result; + } + + // + // Add Or Update ... + bool AddOrUpdate( + XSignal &signal // Specified Signal + ) + { + // + bool result = false; + + // + bool isExists = IsExists(signal.ticket); + if (!isExists) + { + result = Add(signal); + } + else + { + result = Update(signal); + } + + // + return result; + } + + // + // Check Exists ... + bool IsExists( + ulong ticket // Specified Signal Ticket + ) + { + // + bool result = false; + + // + // Validate Args ... + if (ticket <= 0) + { + return result; + } + + // + int protectedCounts = ArraySize(mGuardedSignals); + if (protectedCounts <= 0) + { + return result; + } + + // + for (int i = 0; i < protectedCounts; i++) + { + // + XProtectedSignal iProtected = mGuardedSignals[i]; + + // + if (iProtected.ticket == ticket) + { + // + result = true; + break; + } + } + + // + return result; + } + + // + // Count Protecteds ... + int Count() + { + // + int result = 0; + + // + result = ArraySize(mGuardedSignals); + + // + return result; + } + + // + // END Guarded Signals Functions ... + // + + // + // START Supported Signals Functions ... + // + + // + // Check can Handle Support Signals or not ... + bool IsSupportEnabled() + { + // + bool result = false; + + // + result = + mSupportMethod != X_SUPPORT_DO_NOTHING; + + // + return result; + } + + // + // Retrieve List Of Supported Signals ... + void GetSupportSignals( + XSignal &result[], // Hold's Result ... + XCTrade &trader // Specified Trader class Instance ... + ) + { + // + CleanBuffer(result); + + // + XSignal signals[]; + trader.GetSignals(signals); + int signalsCount = ArraySize(signals); + if (signalsCount <= 0) + { + return; + } + + // + for (int i = -0; i < signalsCount; i++) + { + // + XSignal iSignal = signals[i]; + + // + bool isSupport = IsSupport(iSignal.comment); + if (isSupport) + { + AddItemToBuffer( + iSignal, + result); + } + } + } + + // + // Retrieve List Of Specific Signals Supported Signals ... + void GetSignalSupports( + XSignal &result[], // Hold's Result ... + XCTrade &trader, // Specified Trader class Instance ... + ulong ticket // Specified Signal Ticket ... + ) + { + // + CleanBuffer(result); + + // + // Validate Args ... + if (ticket <= 0) + { + return; + } + + // + // Check Signal Exists using Trader ... + XSignal parentSignal = trader.GetSignal(ticket); + bool isValid = + parentSignal.ticket > 0 && + parentSignal.ticket == ticket && + StringLen(parentSignal.comment) > 0; + if (!isValid) + { + return; + } + + // + XSignal supportSignals[]; + GetSupportSignals( + supportSignals, + trader); + int supportSignalsCount = ArraySize(supportSignals); + if (supportSignalsCount <= 0) + { + return; + } + + // + for (int i = 0; i < supportSignalsCount; i++) + { + // + XSignal iSignal = supportSignals[i]; + + // + bool isBelongsToParent = IsBelongsToParent( + ticket, + iSignal.comment); + if (isBelongsToParent) + { + AddItemToBuffer( + iSignal, + result); + } + } + } + + // + // Check Specific Support Conditions for Opening Directional Support ... + bool CanDoDirectionalSupport( + XCTrade &trader, // Specified Trader class Instance ... + ulong ticket, // Specified Signal Ticket ... + int numberOfItemsCheck = 30 // Number of Items to check ... + ) + { + // + bool result = false; + + // + // Check Supports Enabled ... + result = IsSupportEnabled(); + if (!result) + { + return result; + } + + // + // Check Support Method Allows Directional ... + result = + mSupportMethod == X_SUPPORT_FULL || + mSupportMethod == X_SUPPORT_IN_DRAWUP_DIRECTIONAL; + if (!result) + { + return result; + } + + // + // Validate Ticket ... + result = ticket > 0; + if (!result) + { + return result; + } + + // + // Check Supports Count ... + int supportedCount = ArraySize(mSupportedSignals); + result = supportedCount > 0; + if (!result) + { + return result; + } + + // + // Check Ticket Exists in Supports ... + result = IsSupportExists(ticket); + if (!result) + { + return result; + } + + // + // Check signal Doesn't have any Support ... + XSignal supports[]; + GetSignalSupports( + supports, + trader, + ticket); + int supportsCount = ArraySize(supports); + result = supportsCount <= 0; + if (!result) + { + return result; + } + + // + // Retrieve Support Model ... + XProtectedSignal sInfo = GetSupport(ticket); + + // + // Validate Model ... + int sTimesCount = ArraySize(sInfo.time); + int sProfitsCount = ArraySize(sInfo.profit); + result = + sInfo.ticket == ticket && + sTimesCount == sProfitsCount && + sTimesCount >= numberOfItemsCheck && + sProfitsCount >= numberOfItemsCheck; + if (!result) + { + return result; + } + + // + // Validate Signal Age ... + XSignal sSignal = trader.GetSignal(ticket); + int sSignalAge = trader.GetSignalAge(sSignal.time); + result = sSignalAge >= numberOfItemsCheck; + if (!result) + { + return result; + } + + // + // Extrat Profits ... + double lastProfits[]; + for (int i = sProfitsCount - 1; i >= (sProfitsCount - numberOfItemsCheck); i++) + { + // + double iProfit = sInfo.profit[i]; + + // + AddItemToBuffer( + iProfit, + lastProfits); + } + + // + string logMsg = ToString(lastProfits); + LogMessage("" + (string)ticket + " lastProfits: \n" + logMsg); + + // + result = false; + + // + // Now implement Business Logics ... + + // + return result; + } + + // + // Check Specific Support Conditions for Opening InDirectional Support ... + bool CanDoInDirectionalSupport( + XCTrade &trader, // Specified Trader class Instance ... + ulong ticket, // Specified Signal Ticket ... + int numberOfItemsCheck = 30 // Number of Items to check ... + ) + { + // + bool result = false; + + // + // Check Supports Enabled ... + result = IsSupportEnabled(); + if (!result) + { + return result; + } + + // + // Check Support Method Allows Directional ... + result = + mSupportMethod == X_SUPPORT_FULL || + mSupportMethod == X_SUPPORT_IN_DRAWDOWN_INDIRECTIONAL; + if (!result) + { + return result; + } + + // + // Validate Ticket ... + result = ticket > 0; + if (!result) + { + return result; + } + + // + // Check Supports Count ... + int supportedCount = ArraySize(mSupportedSignals); + result = supportedCount > 0; + if (!result) + { + return result; + } + + // + // Check Ticket Exists in Supports ... + result = IsSupportExists(ticket); + if (!result) + { + return result; + } + + // + // Check signal Doesn't have any Support ... + XSignal supports[]; + GetSignalSupports( + supports, + trader, + ticket); + int supportsCount = ArraySize(supports); + result = supportsCount <= 0; + if (!result) + { + return result; + } + + // + // Retrieve Support Model ... + XProtectedSignal sInfo = GetSupport(ticket); + + // + // Validate Model ... + int sTimesCount = ArraySize(sInfo.time); + int sProfitsCount = ArraySize(sInfo.profit); + result = + sInfo.ticket == ticket && + sTimesCount == sProfitsCount && + sTimesCount >= numberOfItemsCheck && + sProfitsCount >= numberOfItemsCheck; + if (!result) + { + return result; + } + + // + // Validate Signal Age ... + XSignal sSignal = trader.GetSignal(ticket); + int sSignalAge = trader.GetSignalAge(sSignal.time); + result = sSignalAge >= numberOfItemsCheck; + if (!result) + { + return result; + } + + // + // Extrat Profits ... + double lastProfits[]; + for (int i = sProfitsCount - 1; i >= (sProfitsCount - numberOfItemsCheck); i++) + { + // + double iProfit = sInfo.profit[i]; + + // + AddItemToBuffer( + iProfit, + lastProfits); + } + + // + string logMsg = ToString(lastProfits); + LogMessage("" + (string)ticket + " lastProfits: \n" + logMsg); + + // + result = false; + + // + // Now implement Business Logics ... + + // + return result; + } + + // + // Generate Directional Support Signal for Parent Signal ... + XSignal GenerateDirectionalSupportSignal( + ulong ticket, // Specified Parent Signal Ticket ... + XCTrade &trader // Specified Trader Class ... + ) + { + // + XSignal result = {}; + + // + // Validate Args ... + if (ticket <= 0) + { + return result; + } + + // + XSignal pSignal = trader.GetSignal(ticket); + bool isValidParent = + pSignal.ticket > 0 && + pSignal.ticket == ticket && + StringLen(pSignal.comment) > 0; + if (!isValidParent) + { + return result; + } + + // + ENUM_X_SIGNAL_TYPE type = pSignal.type; + bool isLong = IsLong(type); + + // + double entry = GetEntry( + pSignal.symbol, + type); + double exit = GetExit( + pSignal.symbol, + type); + + // + double reward = PipsToPrice( + pSignal.symbol, + 6); + double risk = PipsToPrice( + pSignal.symbol, + 1); + + // + double tp = + isLong + ? entry + reward + : entry - reward; + + // + double sl = + isLong + ? exit - risk + : exit + risk; + + // + double rfStep = 2; + double rfRate = 0.5; + + // + double volume = NormalizeVolume( + pSignal.volume / 2, + pSignal.symbol, + 2); + + // + // Generate Signal using Trader Class Instance ... + result = trader.GenerateSignal( + // + type, + tp, + sl, + volume, + rfStep, + rfRate + // + ); + + // + return result; + } + + // + // Generate InDirectional Support Signal for Parent Signal ... + XSignal GenerateInDirectionalSupportSignal( + ulong ticket, // Specified Parent Signal Ticket ... + XCTrade &trader // Specified Trader Class ... + ) + { + // + XSignal result = {}; + + // + // Validate Args ... + if (ticket <= 0) + { + return result; + } + + // + XSignal pSignal = trader.GetSignal(ticket); + bool isValidParent = + pSignal.ticket > 0 && + pSignal.ticket == ticket && + StringLen(pSignal.comment) > 0; + if (!isValidParent) + { + return result; + } + + // + ENUM_X_SIGNAL_TYPE type = trader + .GetIndirectionSignalType(pSignal.type); + bool isLong = IsLong(type); + + // + double entry = GetEntry( + pSignal.symbol, + type); + double exit = GetExit( + pSignal.symbol, + type); + + // + double reward = PipsToPrice( + pSignal.symbol, + 6); + double risk = PipsToPrice( + pSignal.symbol, + 1); + + // + double tp = + isLong + ? entry + reward + : entry - reward; + + // + double sl = + isLong + ? exit - risk + : exit + risk; + + // + double rfStep = 2; + double rfRate = 0.5; + + // + double volume = NormalizeVolume( + pSignal.volume / 2, + pSignal.symbol, + 2); + + // + // Generate Signal using Trader Class Instance ... + result = trader.GenerateSignal( + // + type, + tp, + sl, + volume, + rfStep, + rfRate + // + ); + + // + return result; + } + + // + // Generate Specific Signals Support Signal Comment ... + string GenerateSupportSignalComment( + ulong ticket, // Specified Parent Signal Ticket + ENUM_X_SIGNAL_TYPE type, // Specified Support Signal Type + bool isInDirectional = false // Specified Support Signal Direction + ) + { + // + string result = ""; + + // + if (ticket <= 0) + { + return result; + } + + // + string typeString = GetSignalType(type); + string directionStr = GenerateSupportDirection(isInDirectional); + + // + result = + mSupportPrefix + "(" + (string)ticket + ")_" + + X_SIGNAL_TYPE + "(" + typeString + ")_" + + directionStr; + + // + return result; + } + + // + // Get Support Direction String Representation ... + string GenerateSupportDirection( + bool isInDirectional = false // Specified Support Signal Direction + ) + { + // + string result = ""; + + // + result = + isInDirectional + ? mInDirectional + : mDirectional; + + // + return result; + } + + // + // Check an String Is Directional Or not ... + bool IsDirectionalSupport( + string comment // Specified Comment ... + ) + { + // + bool result = false; + + // + result = IsSupport(comment); + if (!result) + { + return result; + } + + // + int sPos = StringFind( + comment, + mDirectional); + result = sPos >= 0; + + // + return result; + } + + // + // Check an String Is In Directional Or not ... + bool IsInDirectionalSupport( + string comment // Specified Comment ... + ) + { + // + bool result = false; + + // + result = IsSupport(comment); + if (!result) + { + return result; + } + + // + int sPos = StringFind( + comment, + mInDirectional); + result = sPos >= 0; + + // + return result; + } + + // + // Check an String Is Support or not ... + bool IsSupport( + string comment // Specified Comment ... + ) + { + // + bool result = false; + + // + int sPos = StringFind( + comment, + mSupportPrefix); + result = sPos >= 0; + + // + return result; + } + + // + // Extract Parent of Support Signal Ticket from a comment ... + ulong ExtractParentTicket( + string comment // Specified Comment ... + ) + { + // + ulong result = 0; + + // + bool isSupport = IsSupport(comment); + if (!isSupport) + { + return result; + } + + // + // TICKET ... + string ticketStr = ExtractString( + comment, + mSupportPrefix + "(", + ")"); + if (StringLen(ticketStr) > 0) + { + result = (ulong)ticketStr; + } + + // + return result; + } + + // + // Check a Comment belongs to Support Signal or not ... + bool IsBelongsToParent( + ulong ticket, // Specified Parent Signal Ticket + string comment // Specified Support Signal Comment + ) + { + // + bool result = false; + + // + // Validate Arg ... + if (ticket <= 0) + { + return result; + } + + // + result = IsSupport(comment); + if (!result) + { + return result; + } + + // + ulong spTicket = ExtractParentTicket(comment); + result = spTicket == ticket; + + // + return result; + } + + // + // Add new Protecte Signal ... + bool AddSupport( + XSignal &signal // Specified Signal + ) + { + // + bool result = false; + + // + bool isExists = IsSupportExists(signal.ticket); + if (isExists) + { + return result; + } + + // + XProtectedSignal item; + + // + datetime time = TimeCurrent(); + + // + item.ticket = signal.ticket; + + // + AddItemToBuffer( + time, + item.time); + + // + AddItemToBuffer( + signal.profit, + item.profit); + + // + AddItemToBuffer( + item, + mSupportedSignals); + + // + return result; + } + + // + // Get All ... + void GetAllSupports( + XProtectedSignal &result[] // Hold's Result + ) + { + // + CopyBuffer( + mSupportedSignals, + result); + } + + // + // Get ... + XProtectedSignal GetSupport( + ulong ticket // Specified Signal Ticket + ) + { + // + XProtectedSignal result; + + // + bool isExists = IsSupportExists(ticket); + if (!isExists) + { + return result; + } + + // + int protectedCounts = ArraySize(mSupportedSignals); + if (protectedCounts <= 0) + { + return result; + } + + // + for (int i = 0; i < protectedCounts; i++) + { + // + XProtectedSignal iProtected = mSupportedSignals[i]; + + // + if (iProtected.ticket == ticket) + { + // + result = iProtected; + break; + } + } + + // + return result; + } + + // + // Remove ... + bool RemoveSupport( + ulong ticket // Specified Signal Ticket + ) + { + // + bool result = false; + + // + result = IsSupportExists(ticket); + if (!result) + { + return result; + } + + // + int protectedCounts = ArraySize(mSupportedSignals); + result = protectedCounts > 0; + if (!result) + { + return result; + } + + // + XProtectedSignal cleared[]; + for (int i = 0; i < protectedCounts; i++) + { + // + XProtectedSignal iProtected = mSupportedSignals[i]; + + // + if (iProtected.ticket != ticket) + { + AddItemToBuffer( + iProtected, + cleared); + } + } + + // + // Update Source by Cleared ... + CopyBuffer( + cleared, + mSupportedSignals); + + // + result = true; + + // + return result; + } + + // + // Update ... + bool UpdateSupport( + ulong ticket, // Specified Signal Ticket + datetime time, // Specified Last Checked time + double profit // Specified Signal Profit + ) + { + // + bool result = false; + + // + int protectedCounts = ArraySize(mSupportedSignals); + result = protectedCounts > 0; + if (!result) + { + return result; + } + + // + result = IsSupportExists(ticket); + if (!result) + { + return result; + } + + // + // Retrieve Struct ... + XProtectedSignal item = GetSupport(ticket); + AddItemToBuffer( + time, + item.time); + AddItemToBuffer( + profit, + item.profit); + + // + result = RemoveSupport(ticket); + if (!result) + { + return result; + } + + // + AddItemToBuffer( + item, + mSupportedSignals); + result = true; + + // + return result; + } + bool UpdateSupport( + XProtectedSignal &item // Specified Protected Item + ) + { + // + bool result = false; + + // + datetime time; + result = GetLastItem( + time, + item.time); + if (!result) + { + return result; + } + + // + double profit; + result = GetLastItem( + profit, + item.profit); + if (!result) + { + return result; + } + + // + result = UpdateSupport( + item.ticket, time, profit); + + // + return result; + } + bool UpdateSupport( + XSignal &signal // Specified Signal + ) + { + // + bool result = false; + + // + ulong ticket = signal.ticket; + datetime time = TimeCurrent(); + double profit = signal.profit; + + // + result = UpdateSupport( + ticket, + time, + profit); + + // + return result; + } + + // + // Add Or Update ... + bool AddOrUpdateSupport( + XSignal &signal // Specified Signal + ) + { + // + bool result = false; + + // + bool isExists = IsSupportExists(signal.ticket); + if (!isExists) + { + result = Add(signal); + } + else + { + result = Update(signal); + } + + // + return result; + } + + // + // Check Exists ... + bool IsSupportExists( + ulong ticket // Specified Signal Ticket + ) + { + // + bool result = false; + + // + // Validate Args ... + if (ticket <= 0) + { + return result; + } + + // + int protectedCounts = ArraySize(mSupportedSignals); + if (protectedCounts <= 0) + { + return result; + } + + // + for (int i = 0; i < protectedCounts; i++) + { + // + XProtectedSignal iProtected = mSupportedSignals[i]; + + // + if (iProtected.ticket == ticket) + { + // + result = true; + break; + } + } + + // + return result; + } + + // + // Count Protecteds ... + int CountSupports() + { + // + int result = 0; + + // + result = ArraySize(mSupportedSignals); + + // + return result; + } + + // + // END Suppoprted Signals Functions ... + // + + // + // START Getter/Setter(s) ... + // + + // + int GetOldAge() + { + return mOldAge; + } + + // + bool SetOldAge(int value) + { + // + bool result = false; + + // + result = + value > 0 && + mOldAge != value; + if (!result) + { + return result; + } + + // + mOldAge = value; + + // + return result; + } + + // + ENUM_X_GUARD_ACTIONS GetOldGuardAction() + { + return mOldGuardAction; + } + + // + bool SetOldGuardAction(ENUM_X_GUARD_ACTIONS value) + { + // + bool result = false; + + // + result = value != mOldGuardAction; + if (!result) + { + return result; + } + + // + mOldGuardAction = value; + + // + return result; + } + + // + double GetCriticalFactor() + { + return mCriticalFactor; + } + + // + bool SetCriticalFactor(bool value) + { + // + bool result = false; + + // + result = + value > 0 && + value < 1 && + mCriticalFactor != value; + if (!result) + { + return result; + } + + // + mCriticalFactor = value; + + // + double deposit = mAccountInfo.GetInitialBalance(); + mCriticalValue = deposit * value; + + // + return result; + } + + // + ENUM_X_GUARD_ACTIONS GetCriticalAction() + { + return mCriticalAction; + } + + // + bool SetCriticalAction(ENUM_X_GUARD_ACTIONS value) + { + // + bool result = false; + + // + result = + value != mCriticalAction; + if (!result) + { + return result; + } + + // + mCriticalAction = value; + + // + return result; + } + + // + double GetMaxFactor() + { + return mMaxFactor; + } + + // + bool SetMaxFactor(bool value) + { + // + bool result = false; + + // + result = + value > 0 && + value < 1 && + mMaxFactor != value; + if (!result) + { + return result; + } + + // + mMaxFactor = value; + + // + double deposit = mAccountInfo.GetInitialBalance(); + mMaxValue = deposit * value; + + // + return result; + } + + // + ENUM_X_GUARD_ACTIONS GetMaxAction() + { + return mMaxAction; + } + + // + bool SetMaxAction(ENUM_X_GUARD_ACTIONS value) + { + // + bool result = false; + + // + result = + value != mMaxAction; + if (!result) + { + return result; + } + + // + mMaxAction = value; + + // + return result; + } + + // + ENUM_X_GUARD_SUPPORT_METHODS GetSupportMethod() + { + return mSupportMethod; + } + + // + bool SetSupportMethod(ENUM_X_GUARD_SUPPORT_METHODS value) + { + // + bool result = false; + + // + result = + value != mSupportMethod; + if (!result) + { + return result; + } + + // + mSupportMethod = value; + + // + return result; + } + + // + // END Getter/Setter(s) ... + // + + // + // Generate Signal Guard Attacked Message ... + string GenerateGuardedSignalComment( + XSignal &signal, // Specified Signal + ENUM_X_GUARD_REASONS reason // Specified Guard Reason + ) + { + // + string result = ""; + + // + string reasonMessage = + ( + // + reason == X_GUARDED_OLD + ? "Because of Old Issue" + : reason == X_GUARDED_CRITICAL + ? "Because Of Crtical Drawdown Isuue" + : reason == X_GUARDED_MAX + ? "Because of Max Drawdown Issue" + : "" + // + ) + + " On Profit: " + (string)signal.profit; + + // + result += "Guard Attacked (" + (string)signal.ticket + "), " + reasonMessage + " ..."; + + // + return result; + } + + // + // Protected ... +protected: + // + // Private ... +private: + // + string mSupportPrefix; + string mDirectional; + string mInDirectional; + + // + XProtectedSignal mGuardedSignals[]; + XProtectedSignal mSupportedSignals[]; + + // + int mOldAge; + ENUM_X_GUARD_ACTIONS mOldGuardAction; + + // + // Critical DrawDown Factor based On Balance ... + double mCriticalFactor; + double mCriticalValue; + + // + // Guard Action for Critical State ... + ENUM_X_GUARD_ACTIONS mCriticalAction; + + // + // Max DrawDown Factor based on Balance ... + double mMaxFactor; + double mMaxValue; + // + // Guard Stopout if Max State touched ... + int mOccuredconsecutiveMaxDraDownTouches; + int mGuardStopoutFiredAfterTouches; + + // + // Guard Action for Max State ... + ENUM_X_GUARD_ACTIONS mMaxAction; + + // + // How to Support Signals ... + ENUM_X_GUARD_SUPPORT_METHODS mSupportMethod; + + // + // Account Info Instance ... + XCAccountInfo mAccountInfo; + + // + // Get Volume Multiplier for Specified Guard Action ... + double GetGuardActionVolumeMultiplier( + ENUM_X_GUARD_ACTIONS action = X_GUARD_DO_NOTHING // Specified Action + ) + { + // + // Partial Close Max In Drawdown Trade ... + double result = 0.0; + if (action == X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_1) + { + result = 0.01; + } + else if (action == X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_2) + { + result = 0.02; + } + else if (action == X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_3) + { + result = 0.03; + } + else if (action == X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_5) + { + result = 0.05; + } + else if (action == X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_10) + { + result = 0.10; + } + else if (action == X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_15) + { + result = 0.15; + } + else if (action == X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_20) + { + result = 0.20; + } + else if (action == X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_25) + { + result = 0.25; + } + else if (action == X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_30) + { + result = 0.30; + } + else if (action == X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_40) + { + result = 0.40; + } + else if (action == X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_50) + { + result = 0.50; + } + else if (action == X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_60) + { + result = 0.60; + } + else if (action == X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_70) + { + result = 0.70; + } + else if (action == X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_75) + { + result = 0.75; + } + + // + return result; + } + + // + // Do Specified Guard Action ... + bool DoGuardAction( + XGuardHandlerResult &guardResult, // Hold's Result ... + string &message, // Hold's Message ... + XCTrade &trader, // Specified Trader Class ... + ENUM_X_GUARD_ACTIONS action, // Specified Which Action to Do ... + ENUM_X_GUARD_REASONS reason, // Specified Guard Reason ... + ENUM_TIMEFRAMES period = NULL // Specified Time Frame for Detecting Signal Ages ... + ) + { + // + bool result = false; + + // + message = ""; + + // + string reasonString = + reason == X_GUARDED_OLD + ? "Because of Age Issue" + : "Because of DD " + ( + // + reason == X_GUARDED_CRITICAL ? "Critical" : "Max" + // + ) + + " Issue"; + + // + // Validate Args ... + if (action == X_GUARD_DO_NOTHING) + { + // + message = "Max Allowed Drawdown Reached, but nothing Happens ..."; + + // + return result; + } + + // + // Normalize Period ... + if (period == NULL) + { + period = _Period; + } + + // + // Close All Signals ... + XSignal closed[]; + XSignal maxInDDSignal; + + // + // Handle Perform Guard Action ... + switch (action) + { + // + // Close All ... + case X_GUARD_CLOSE_ALL: + { + // + trader.CloseSignals(closed); + int closedCount = ArraySize(closed); + result = closedCount > 0; + if (!result) + { + break; + } + + // + message = "Closed (" + (string)closedCount + ") Trades by Guard, " + reasonString + " ..."; + } + break; + + // + case X_GUARD_CLOSE_MAX_IN_DD: + case X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_1: + case X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_2: + case X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_3: + case X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_5: + case X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_10: + case X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_15: + case X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_20: + case X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_25: + case X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_30: + case X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_40: + case X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_50: + case X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_60: + case X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_70: + case X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_75: + { + // + // Retrieve Max In Drawdown Trade ... + maxInDDSignal = trader.GetMaxInDrawdownSignal(); + bool isValid = IsValid(maxInDDSignal, trader.GetMagicNumber()) && maxInDDSignal.ticket > 0; + if (!isValid) + { + break; + } + + // + // Close Max In Drawdown Trade ... + if (action == X_GUARD_CLOSE_MAX_IN_DD) + { + // + string comment = "Signal (" + (string)maxInDDSignal.ticket + ") Closed by Guard ..."; + result = trader.Close( + maxInDDSignal.ticket, + comment); + if (result) + { + message = comment; + } + + // + break; + } + + // + int signalAge = 0; + bool canGuard = true; + bool isGuardedBefore = false; + + // + // Do Some Additional Verifications if Guard for Olds Trades ... + if (reason == X_GUARDED_OLD) + { + // + // Retrieve Signal Age ... + signalAge = trader.GetSignalAge( + maxInDDSignal, + period); + + // + // Check Guarded Before Or Not ... + isGuardedBefore = IsExists(maxInDDSignal.ticket); + if (isGuardedBefore) + { + // + // Now We Have to Check Signal Age growse required times to apply Guard Action again ... + // First Calculate Guard Grow Step ... + int ageGrowStep = mOldAge / 10; + + // + XProtectedSignal guardItem = Get(maxInDDSignal.ticket); + datetime lastGuardTime = 0; + if (GetLastItem(lastGuardTime, guardItem.time)) + { + // + int lastGuardIndex = iBarShift( + maxInDDSignal.symbol, + period, + lastGuardTime); + + // + canGuard = + MathAbs(lastGuardIndex) >= ageGrowStep; + } + } + else + { + // + // Check Signal age ... + canGuard = signalAge >= mOldAge; + } + } + + // + // Prevent Moving Forward ... + if (!canGuard) + { + // + result = false; + break; + } + + // + // Partial Close Max In Drawdown Trade ... + double volumeRate = GetGuardActionVolumeMultiplier(action); + + // + double volume = NormalizeVolume( + maxInDDSignal.volume * volumeRate, + maxInDDSignal.symbol); + + // + string commentPrefix = "Signal (" + (string)maxInDDSignal.ticket + ") Partial Closed (" + (string)volumeRate + ") by Guard"; + string comment = commentPrefix + " ..."; + + // + result = trader.ClosePartial( + maxInDDSignal.ticket, + volume, + comment); + if (result) + { + // + reasonString = + reasonString + + (reason == X_GUARDED_OLD + ? " (" + (string)signalAge + ")" + : " (" + (string)maxInDDSignal.profit + ")"); + + // + // Update Guarded Signals ... + if (isGuardedBefore) + { + // + XSignal tSignal = trader.GetSignal(maxInDDSignal.ticket); + + // + if (tSignal.ticket > 0 && tSignal.volume > 0) + { + // + // Update In Guardeds ... + Update(tSignal); + } + else + { + // + // Remove From Guardeds ... + Remove(tSignal.ticket); + } + } + else if (reason == X_GUARDED_OLD) + { + // + // Added to Guardeds ... + Add(maxInDDSignal); + } + + // + message = commentPrefix + reasonString + " ..."; + } + } + break; + + // + // Nothing ... + // Default ... + default: + message = "Max Allowed Drawdown Reached ..."; + break; + } + + // + result = StringLen(message) > 0; + if (!result) + { + return result; + } + + // + if (result) + { + // + if (reason == X_GUARDED_OLD) + { + // + int closedCount = ArraySize(closed); + if (closedCount > 0) + { + // + for (int i = 0; i < closedCount; i++) + { + AddItemToBuffer( + closed[i], + guardResult.olds); + } + } + + // + if (maxInDDSignal.ticket > 0) + { + AddItemToBuffer( + maxInDDSignal, + guardResult.olds); + } + } + else if (reason == X_GUARDED_CRITICAL) + { + // + int closedCount = ArraySize(closed); + if (closedCount > 0) + { + // + for (int i = 0; i < closedCount; i++) + { + AddItemToBuffer( + closed[i], + guardResult.criticals); + } + } + + // + if (maxInDDSignal.ticket > 0) + { + AddItemToBuffer( + maxInDDSignal, + guardResult.criticals); + } + } + else if (reason == X_GUARDED_MAX) + { + // + int closedCount = ArraySize(closed); + if (closedCount > 0) + { + // + for (int i = 0; i < closedCount; i++) + { + AddItemToBuffer( + closed[i], + guardResult.maxes); + } + } + + // + if (maxInDDSignal.ticket > 0) + { + AddItemToBuffer( + maxInDDSignal, + guardResult.maxes); + } + } + } + + // + return result; + } +}; + +// +// END Global Definitions: Variables, Properties and etc ... +// diff --git a/BKPS/OLD/XEU5-0/Classes/x-saherelm.nn.lib.mq5 b/BKPS/OLD/XEU5-0/Classes/x-saherelm.nn.lib.mq5 new file mode 100644 index 0000000..8fa40f5 --- /dev/null +++ b/BKPS/OLD/XEU5-0/Classes/x-saherelm.nn.lib.mq5 @@ -0,0 +1,258 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 NN Class Library +// ---------------------------------------- +// Name: XNNClass +// Description: provides all classes for implementing +// Neural Network ... +// +// +// 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 Global Definitions: Variables, Properties and etc ... +// +class XCNNBase +{ + // + // Public Definitions ... +public: + // + // Constructor ... + void XCNNBase( + int nodes = 10, // Number of Input Nodes + double starterWeight = 0.5, // start weight for each input + double coEfficient = 0.1, // COEfficient Multiplier + double upperRange = 1, // Upper Normal Range Value + double lowerRange = -1, // Lower Normal Range Value + double learningRates = 0.1 // Back Propagation Learning Rate + ) { + // + mNodes = nodes; + mUpperRange = upperRange; + mLowerRange = lowerRange; + mCoEfficient = coEfficient; + mLearningRates = learningRates; + mStarterWeight = starterWeight; + + // + ReConstructWeights(); + } + + // + // Deconstructor ... + void ~XCNNBase() {} + + // + // Protected Definitions ... + void NormalizeInputs(double &inputs[], double &result[]) + { + // + ArrayFree(result); + ArrayResize(result, 1); + + // + // Validate inputs ... + if (ArraySize(inputs) != mNodes) + { + return; + } + + // + // Prepare Result ... + ArrayResize(result, mNodes); + + // + // Calculating min and max range value ... + double minRangeValue = inputs[ArrayMinimum(inputs)]; + double maxRangeValue = inputs[ArrayMaximum(inputs)]; + + // + // Loop through Inputs nd Normalize them ... + for (int i = 0; i < mNodes; i++) + { + // + double normalValue = (((inputs[i] - minRangeValue) * (mUpperRange - mLowerRange)) / (maxRangeValue - minRangeValue)) + mLowerRange; + result[i] = normalValue; + } + } + + // + // Hyperbolic Tangent Activation Function ... + double TanHActivationFunction(double weightedInputs) + { + // + double result = (exp(weightedInputs) - exp(-weightedInputs)) / (exp(weightedInputs) + exp(-weightedInputs)); + return result; + } + + // + // Calculate Weighted Inputs ... + double CalculateWeightedInputs( + double &inputs[], + bool applyCOEfficient = true) + { + // + double result = 0; + + // + // Validate Inputs ... + if (ArraySize(inputs) != mNodes) + { + // + result = -1; + return result; + } + + // + for (int i = 0; i < mNodes; i++) + { + result += inputs[i] * mWeights[i]; + } + + // + // Multiply if required ... + if (applyCOEfficient) + { + result *= mCoEfficient; + } + + // + return result; + } + + // + // Calculate Hidden Layers ... + virtual double CalculateHiddenLayer(double &inputs[]) + { + // + // this is Default Activation Function which used ... + // you can override this by writing your own ... + double totalWeightedInputs = CalculateWeightedInputs(inputs); + double result = TanHActivationFunction(totalWeightedInputs); + + // + return result; + } + + // + // Calculate Output Layers ... + double CalculateOutputLayer(double &inputs[]) + { + // + double result = -1; + + // + // Validate Inputs ... + if (ArraySize(inputs) != mNodes) { + return result; + } + + // + double normalizedInputs[]; + NormalizeInputs(inputs, normalizedInputs); + if (ArraySize(normalizedInputs) != mNodes) { + return result; + } + + // + double hiddenLayerResult = CalculateHiddenLayer(normalizedInputs); + + // + result = 1 * hiddenLayerResult; + + // + return result; + } + + // + // Basck Propaggation Learning ... + void BackPropagation( + double &inputs[], + double &outputs, + double targetOutput + ) { + // + // Validate Inputs ... + if (ArraySize(inputs) != mNodes) { + return; + } + + // + double normalizedInputs[]; + NormalizeInputs(inputs, normalizedInputs); + if (ArraySize(normalizedInputs) != mNodes) { + return; + } + + // + double error = targetOutput - outputs; + double derivative = 1 - MathPow(outputs, 2); + + // + for (int i = 0; i < mNodes; i++) { + // + double gradient = error * derivative * inputs[i]; + mWeights[i] = mLearningRates * gradient; + } + } + +protected: + // + // Private Definitions ... +private: + // + // Number of Input Nodes ... + int mNodes; + + // + // Specify Upper range of Normal Values ... + double mUpperRange; + + // + // Specify Lower range of Normal Values ... + double mLowerRange; + + // + // Starter Weight for each input node ... + double mStarterWeight; + + // + // double Input Node Weights ... + double mWeights[]; + + // + // CoEfficient is a multiplyer for weighted inputs ... + double mCoEfficient; + + // + // Back Propagation Learning Rates ... + double mLearningRates; + + // + // ReConstruct Weights ... + void ReConstructWeights() { + // + ArrayFree(mWeights); + ArrayResize(mWeights, mNodes); + + // + for (int i = 0; i< mNodes; i++) { + mWeights[i] = mStarterWeight; + } + } +} +// +// END Global Definitions: Variables, Properties and etc ... +// diff --git a/BKPS/OLD/XEU5-0/Documents/.gitkeep b/BKPS/OLD/XEU5-0/Documents/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/BKPS/OLD/XEU5-0/Documents/Reports/.gitkeep b/BKPS/OLD/XEU5-0/Documents/Reports/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/BKPS/OLD/XEU5-0/Documents/Settings/.gitkeep b/BKPS/OLD/XEU5-0/Documents/Settings/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/BKPS/OLD/XEU5-0/Documents/Settings/xeu5ea.set b/BKPS/OLD/XEU5-0/Documents/Settings/xeu5ea.set new file mode 100644 index 0000000000000000000000000000000000000000..1c8b53c6a53f2102bf6ccddc8f557a03dc431b7d GIT binary patch literal 7562 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 Ly*!A^@aO*neWa-s literal 0 HcmV?d00001 diff --git a/BKPS/OLD/XEU5-0/Documents/Settings/xeu5ea_just_xtam_and_xstfi_xtam_signaller.set b/BKPS/OLD/XEU5-0/Documents/Settings/xeu5ea_just_xtam_and_xstfi_xtam_signaller.set new file mode 100644 index 0000000000000000000000000000000000000000..a2caf3482d900be8582db122c01db7dc6dce3590 GIT binary patch literal 18988 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 PXAjZnULM3{`1Ah(Rne&t literal 0 HcmV?d00001 diff --git a/BKPS/OLD/XEU5-0/Documents/Settings/xeu5ea_xtam_signaller.final.set b/BKPS/OLD/XEU5-0/Documents/Settings/xeu5ea_xtam_signaller.final.set new file mode 100644 index 0000000000000000000000000000000000000000..d459e7a03ceb9c43b83d454c14123cdfc3f00a54 GIT binary patch literal 18990 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 IxDJ2*6P1Rko&W#< literal 0 HcmV?d00001 diff --git a/BKPS/OLD/XEU5-0/Documents/Settings/xeu5ea_xtam_signaller_shorts.final.set b/BKPS/OLD/XEU5-0/Documents/Settings/xeu5ea_xtam_signaller_shorts.final.set new file mode 100644 index 0000000000000000000000000000000000000000..243aa1fcd07891ab3fef463bdcc2cc13447678cb GIT binary patch literal 18992 zcmcgzYfl`>746TF@*n00Bo5#Q_C|cbc%5AdY|F!X{nddnMhgZpIL1+ady;eN%%$$_ zuI`@coub%;}bmP^-tAf zoPVmGR=d@ot3Oqoe_MU2&H-goea86$kS5hhf^-YW=YYs}JYQGeFnWUXr|JfOml%7C zznjJED_jxY4EMKb##!|@K)OzMmw58;#nVZ3SN#>EJ^?r9&w%$5l-}X$8>oAP^C!TX z;mI|QH-Ip~lT&a?T8Syse}#A7@RXFFr;(&qobef{A-$yRtoo7Oh(<#G3+_*V{~X6Z zaD52q#3Y_G6q5;QA~odxEAUe4pK+udiS5^WNl|W;;XfC&8pQ{gafu(bHNWSBc+c=7 z?PuvJ;d3^165s9t?hSCys{i2k8KW)||Ge8u&;0v0_c-gpg|5zxp zC)x^mzo;U-$Z5Q55oGig zI{i|>u^ugC8NCND*TAQ!vsa5&!?ob0v?&}>PV2xDJ^vU|VXiT+H)}h>Q)Ysb%6sA- zeC%2E0-1daapM{8tbzcmQ=SdVu>){LRyi#efR`xOU5r|pE_mCJ54xK z%whdUkNSYQ7b(BZs@Hf*c(j#0(8Y?GznukKyJzhzO!-Ok8RagXA{TAg`=ngr#8ZC+ zE-n&R*EpX;XX1jC?j&A}W|O+n$9vC7iR%3n6_|tiaMq=0Scy$Gn6c3gg-y?NZ_lFK zWKmOa$@nCHrnP%|tRAsATB2pVELhW@K)UQo=+~zy%H6?hx@dc!Y>qKCbL{02d1u!{ zIoOXm2(R43g5HEVWIz}(QN62>udyEVj@z^6W5-=ve!u==6^A+stJEU2+pGU~H z7G)km!X7v8GKaJ>yXR9<8}(Pm{SR1=^cbU>aVmaIdQEtxh`S6wnTIF$GTlm5Mdn7U z2f8nFQ^MZHk@AIEM>|J(KCO)_2dw39p%vy)`rSV2NA-xu>D>vk6npu-g=WN?A}6)c zl-kRrch)E;nCbQX8W7p}Nq8jD9yXN?Dl}{6cDyl7i7?_>qOu8e*uxVd`dS_|t^Pye{ew2mRyr{i%%jS|y7vePo!;5Gv2H5Mt3cgt8s#Ii}PO_5job;ePB8jD=UyFQ)?pMIa$9oMBXLhjes7;B3dHmj>+ zMC|4CrIB8u-s2T>$40Lye4g}pEbG&oU~gJ?bu63I-`naX^4Vea%Mu=!$9n0mUx#Hp z>(XL|zF9q%@N80(2hbt&zyW^!(bJFKtTx*)txKOC{$@2=#`G{cJwh&8MXMbDPj(JHxH=Yh-(wtee;0Y^|&^t-TDrs_QFpWYb{!3_5I~>>QlIe z700Nnot@1lx94fiAg{vtdF5GsE3;Y=s^hX1 zQ?A5v)%q%}$z^Q9<=4*DyQ#}4NlTK@`@^&|ge$^cewxSK3a*RUJbpdGQFhi`-j!#sB70#h$xv8yY?Gm?xi(wk+bF-?1^0Fq zblycyIFmo_1ahCwWT#P0YVJ~9d5B}4;VEysT#QDk*mndq787bnv z(+fa->ekQHBev_5@7r|hF-CDl$+!FrUCWN7YqQNMGIbjte#`-^ zf|fu#uMaeb2Q*kj{`?Q9| za}~3SXng`p;2uoW0O^f%jN_bKFmHBq9!IUtd7M9-^9W}g=gelbF=n(jjr%dHbM0pj z=h;IU%CS1?_S(QYZl4*nJJGchqFGbKYwkXrA-{3=zZ}Q8lV{N=U(qx5MmBHWvK-{D z*m;LY!}Xa=-C@csr5rPkwi4V(S`wB*H+Twn9F4x?W zE%{omEn*r?xdWJ_j*2<{$0CzzOdi30TJJx=>-gOSYoJ}&gzfgm>*lU9-*@f(wqs;1 zVfx@+t8(idcEG8D5{-w+p0!u~19Sb}d(I`2vCnX2$=m^2)SAbsw_Yl&yi6+bx+xXD zUrj2)x4cX=z9bRZimb#kR<0PMmD5KUA=)g(-k0r!^_EE_UNn7KH-)|pvY|F}GoNaJTQ2kbS49w&BO)hgaW4OMd zQ8j2ItUuAXJZk99h`|*+_HU)^!Kz=eAYZ8()V(ah?5_{z1$b=lP~vR%hiw$8Y9s}^ z$`o1mQl_X0Gg4IQP>d@5*Mt200J(tw4>5C{j30LZJvOtNjX1>InA_OO03CR9FfA2*9kc{Hh7M{|3_+wmqoV?DSwBuW?&yO6h+V9(JN}dws z_b$p<(K9Fq^N!zp!Z%{IQ)ggK!KS*C{JDyPj=i^_&InK$X1QQ;?}Ft%LZy z8s}58J~oxRc#o0R+?>&8!<3})s>)XDjgcA~L8^v*Z|o^GXry=uH04`^NZ(Rl$N#{X zKn7jjc!c*|-gwmTMqBT)v+SU`?q&24!bAEY@eT7s@jBcOCChB#(GLmTG(F4@J%k~C z=;voDm-j=?ulwOM)YOd1wvOhtUiZLUfj2F--|sy2 z=0HVO9nIs)(VBA~(%*=0n7@h3;r=EmW=oF#M(E@G%|jUCZ+?EJa(RE_{JOt!Rd73b z+%7857mJ?TypA*KUPs@2jFoQo1Nnb;Kf(g72A3R7R^_bcc^U709@=>CsV&j!}#il9&7oyE~V2lX3ei0jxHu3O%6oeZVL zYO34IS@D@1qgPrdV`uqAxuYR2LNd)qNZZKCw*H>4)M4|!?B9ep%)dEvynna%Eyk_c z;V}Oul?GvmfBX4E{G0Pl^WIZSy^C>d`t{>W{foCf^YB#vMOX;O?nxLl`XFig)82L0H)R%g2_doZbq9;|WxSkBO#Io^ZYJ0auK zEN_?x`+9wd2mATngS~uo-CO}Q4outLBip+nn`Qd-v${GW&f{8Ye}48n8ExbI*+VqC K*9UPO{``OAd#S1b literal 0 HcmV?d00001 diff --git a/BKPS/OLD/XEU5-0/Documents/Settings/xeu5ea_xtsfi_signaller.final.set b/BKPS/OLD/XEU5-0/Documents/Settings/xeu5ea_xtsfi_signaller.final.set new file mode 100644 index 0000000000000000000000000000000000000000..c5fadaec790594f9cadc9f74b348fbcbbf6eac15 GIT binary patch literal 7576 zcmcgw+j0^?5bbBH{0BZj5u&-M#RDeBSY=2mB+4to1}Py>Tnt)%yL!&_4l}bXE@872 z1ZynBRylow$JBZuEhr0L7Eah`IeG=ZSLGA?Dk^IKz7OMuv zevT?;&cEMSV$_W+vZ=T}f`4xt`2(YWUMU(+j1}5GkWgM|X*gPE_YiUz*ZCze{-^MA zen~ucEqO0Di1m_O!j~fx*Xf~`GrQRwDfH^Y6Iyep@F6=pa@aKy!JWEae>KWNS^w9o9!D2@QyWRi_*&KP z0&IoW)o~`+TQYyK`Xn`D-C32>#2)s4JW-#qcVOyUB&V3AJjO~5da+~XXD^m($LymO z$<3_Jk@qx~*P&;zoMwry{W+`{7^}v(_Te+Nf|~9bTddBOb*mr8z9nf|*G*Pn4a&ky zvS?9>rZMQy7>A0cb2_$jX%W?gmCR3io*C`FKDHmRc{ELz{9Lf7?|@xCmGE45O_p2W z)cjAkD-(0fsm@}bkI;5L^^gbqA&W^q*cG!1-9z#OT2QY`czz76YUa6*yZEF>S^B?> zk(FuZIFp5DbKR-2JA$q30mliu3Tj50gsEVT{&m&E>n=utn0S8+j9>NnmVs|_>{|-g-L=5Q37%6|SNqSRy2^jL zTV0>8^HBuXe`$r!qUk8~)aD8NcjF5RE)lo$@VU_EO=9L&lGaF(Q$!!x=Dw|oZ zDwbCw6w7LeP%Nj{$Wxo~sw=a&-Tq0hg)^@hMYEekDU#s}d51jvNzOKiUAH!iVRP@%H;6 htaJUYcqi7bm=Cdb#eL&}+&6Z}ePf5*`&f_3{XbOZJ?#Jh literal 0 HcmV?d00001 diff --git a/BKPS/OLD/XEU5-0/Documents/Settings/xeu5ea_xtsfi_signaller_longs.final.set b/BKPS/OLD/XEU5-0/Documents/Settings/xeu5ea_xtsfi_signaller_longs.final.set new file mode 100644 index 0000000000000000000000000000000000000000..d2b9f2984efe16e61217963390888a853463d9cf GIT binary patch literal 8324 zcmcgw+j81S5bftw?LY7VS%RI|@n(w$V#k|Q+1O>AEUzrcgbEmn%bINMx9{ehX$>^sc9m3Q)5 zPUIJPA$)!*Uu6U-HF>~w3`sTV8%aw@9zi1S@j8{e8BH+rPdrRe*8fMPF-`-%fj4XOnaeV~;-gD%Sjs8WYXgo1iX!}?~d7-7@D9i2%1phB?&$^a zpC5ltatD#E5m!`p$k!cwwJ^JcJS#tAT_j(yo^ii|KgO{0R_O0yIY8vKsch;+?)*Y4 zErTasESv=FSuW0@-4vQGpw|dYXwO}ML+?oxj=-5(K~0a1Emmjib*mr8z9nf| zw@g)F56Z(#deNd1O=HlZF%A_?=X7l6LceK5bzmjyljbv{-PgzNM{FHU)1|mCxTo*K zyF8UJuLq{et&uf9)9ud09BZnx*!M?hJ5N3IgZ7w$3|ckK zxsOjBnG=*^^8Dv;>>OwE&}^-{G4vMwuORmfD8=C9(fN^eB&E zRkN0=z1Dl%^3p2qF7`MZ-fVo@FuMw8jlMn5ak@2W=vfwNzp&AfZIOGP(Z)9i+{-V) z3i~MYu7&-ho)PcOy*|1W&+^Tf8MRF-C)wEc+Iz!0_b7cl>GORFi9GM{jl*N2r!sn- z-`qb|IO`>1QqTU=K)UrCJe7^CET&ca9tN4vyDh*BkQ9dy=w*0`!l&M2Rm z@7_F?#TX^$^W|shzHEgE)pB)@n!Ouey3+TkpYvLEi=2A9s8ib*<*}x+t7a~VlFeQi z72zl=qmwoAM&6^NUCGBCGS02d<1o}E9A#-{PvTwdJFHGVPFXxU>D4lshLg?Z{@I>n z@*Etp51iwZUp@WRzL(Q7GUP8D<+GWER2HAU{Aw9ZM>-6r*XTw2u*&s^;x&m?KC?tP e6t^MPq1bKj$!`0A?1orXu-iT$yFON#?EV0o+QwM` literal 0 HcmV?d00001 diff --git a/BKPS/OLD/XEU5-0/Documents/Settings/xeu5ea_xtsfi_signaller_shorts.final.set b/BKPS/OLD/XEU5-0/Documents/Settings/xeu5ea_xtsfi_signaller_shorts.final.set new file mode 100644 index 0000000000000000000000000000000000000000..de350ab10c3fda9507a3ff310808326130d31ce1 GIT binary patch literal 7578 zcmcgw+j8PY5bftwZHvSw5H_9W*_tC<-g zRv1~73Zxm$^yxm`(>t2+d$8+_?_VY zXZc0Gm+yr0=ki$wkW!OJ+=q}%V z(4M;)efbHJCayI?&);cpO_uT_MsU z%xR$i81EM7rRD=SlG>_e?4vf+mzwqEt9zq5Qt}UI_kcgZ|6h3i0O>?ho4pj{ggQ|h zTK@!Gvi^vF@<_DzE2hXBIs7x#)fhj=j1ew+Yqqk3xP4sIz3+M{pR?(c_-zw%r@&6+ zA6$i`}PW>{(&mL@WZ^4>sxu_s2MwzWs&&t!)>$4rJXyPa?IWWEEJ3+On+ zN{{8oGUL{!=*dI4NF%B$`G0`p1i7d>3$DP?6MXtP2jg|T;5oX5Efe5r)@f$4)$U#h zS*i*n=IJ$1;+1~~R#avx!(9pkCtGJV{4n)c}$3`d`) z>oZ=B9YnwY{$Wk;Ll0uuI<~vYsz>uT*-;bf&fHCDS|jJK{+MlCldKibuBNfpc@}2C z-#z}k)Tq2(^o^ihbA4AxABjmf>8X)r0Wj1AzJHOaU z^Wbq13&)Z7%opd-ZVXLl&}#rsXw99$huqnb!v_};eqW(6p-~n`(zo?$rP0N`sYOyY zzK9abyarpbbuFw3?k$0l1`e_T7ld5bT-yaKej_l^0aQb ztiT#ngqda0P>H57=+PL5il%+qw!WA*ji?T+WPZ~1%xDkwvHghU(L7zsbHP1*5A5<( z!gc-NvfL7@=3Bbmx|m~5^%jSG#J2O)LmuoRi&;LnD`pjXhU6)^S!PGwME~)95LkY0QJsfm*J2Z zk7qHnZ__fNE=5<^T+b*lc+V8D-XHFSU*Rm&N`a(W8Ehvzl3| z_8NQZ^71n7HuiWMj#ix3-LAr0qhAlSoo`JZ`X-CCURZQ&w#d(CwDHRU_wsXig>{tc zu7&-ho)PcdyB?|(&+^UGGisY=PI_aVwKvZ1+@tg`GxYZ*B=Wq&FAh(cn#$<)y!j_) zIAe)e#jDuX6ZxB>DsoM~M2oYP&-_ze&LS<&Hm>e?KND7cer4d79Q#UfzdE1ZgNqBC zQ`bj_XHgv$p6=Gim)rR$g5Txwn+W%hAx^m+WER2iBgDdBrGZ_tE8h?%J52;A`=iyYz@wL1`ru`uAwuoLowutB0=D1bNfX6B3I%M)SaH{0`94s^Eo#QIb72)V= x`3{k)Wjr5gKb&9T`}a#&=lFf`PON<~A7kx{`}PaDZ|{-&_8z$pv0jt={{es@K0*Kh literal 0 HcmV?d00001 diff --git a/BKPS/OLD/XEU5-0/Documents/Settings/xts.tpl b/BKPS/OLD/XEU5-0/Documents/Settings/xts.tpl new file mode 100644 index 0000000000000000000000000000000000000000..f5487f1732bbcb3f7e4228d50b8202fe2d107eeb GIT binary patch literal 7966 zcmeI1ZEGVp5Xbep(C?6!EnLz#555GFgX4M!g{G8V3iqO5Hnx+vXU8VC^Ux39_W#qY zqSdZ!CrwSu5zHoDX*4sMhyRS^zy3UOU3cjUckO2Gjr-bta(ZMzT0t! z`uke%Eq&*`rIFX3dg|`o$ep>d8*0^i_pAFw&qw#YpY6H6n@Ym9xK1QtAi670H`mzM zZMYlFZ}=4(S_7A%*9J`{TFuI_H0o&ey&pMt+n#qiI~Cm@qCb{?tnKOjLeEV6!x-|r z?z4DB>TS0re(_^+$DShSi|m1R33rpto(gH&7q4^8-7T5vd+kS}V&^R{59_tOROB_e zg*Aoe%o?a$?qJE9mgaN%oq2mMp6SR3>?P=y+9K+9EdTF#+m5_Putv+jpX>d)Vx0@` zHKNF@b>sayZ&;8Bz~6yxsz@Bjp0mtI)n`QCmi)ZyV{)&QVtz2oO~e_$=e!%DfY=H< z7)$a{K8^2J-nU(iTFe9;iC?@PXF7`hS?OE6d8QRTzYfa4v5-EW8>7VfRI8C<)Ml}s z#_!7=STyJI$acv5OnWILwg140IrC1O!@5YrTlWw1w_bKnqqo`@F|_B7&$g}bJ+!K?0SCqHTWjvVrN(hil0tVy5X@+Ss`08C0X-!|M9QBR=rbj@pl%t__Tb4RhP24T*P|ft!^eG0U^wDm0Oi1bWBp+`X5?eM; z6eTHD^OfGMnx5zzRM1a6)nysyh2AI9GU61~!7vJRWDg;8VvXu}ZfH(EM2#(nRVc=jaKVjtfH?ZYp<-k z+xqs(udv!i=F~Ml@^Ly*K7g`@qG&@`6m&T7x}R&OIah0bEjGv_Gmo_atq-;8vLl)3w^*cIyAaXaL_Do7?A4ye@6z;?gbaV?CP`{ z7fzKw{{|{l^WQpdI$my5+RFMm3eY>-ZA-|X#~=Y&{IhZ{+?9~6h6efkX7oh#AP03l zWH;k)g_HDM)!a7>S$FP(3(YRn?9d!fyAHauW>tD#Z@SLzgZ^ntwx>56$lCP$)*-)i zA9hY$)B|sNPje4R1|61hzPQH?^?ETyy$j|<%+04|(DSZx+0Y2g zsO$0gUWqek#6auxa=nkuyx?DYmcv8w%>J~~7hUX^jDOtN6VISXxDU%C5PkDL4H=Y2ixvb*PmUB}I*p1$A=M@}yA$G_`Fzf+w)HrzWet9t4}Hm8{9pSi3~famm8 z@XejCY`orU#e1qxIt8KWPixe)j?d54^<<5@#*^%GwfwL~Ex9M9Q#epX=iYRYuDOa~ zXy4UYmQ%gm0_J*SJLMZSzu<5Sz;89PY=@mvq&>S;nUrFcL@F4lyjWsNk&~EGtdhw6 c!m=G!=X27k^Q&a7@17xl)?hULvhc?J4c$cMcmMzZ literal 0 HcmV?d00001 diff --git a/BKPS/OLD/XEU5-0/Experts/.gitkeep b/BKPS/OLD/XEU5-0/Experts/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/BKPS/OLD/XEU5-0/Experts/x-saherelm.xeu5.ea.ex5 b/BKPS/OLD/XEU5-0/Experts/x-saherelm.xeu5.ea.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..dcacd4413a739309c74e38eb91c4307fd302d9fb GIT binary patch literal 191218 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%0Ac7>K%&j2k@l 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

7m~*Ys0e2(x6T&$R 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%0A!=t}Du5W2r8{6*;Fu3|;wL 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%0A4yQOE{v78vIpfiyk7nOgqWyds%d<$etM8znmOjd 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%0DtyzCMPVI86IqZdrN7tnM;it+V}dci3d)0UB|cz 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 O-W&J{uh+GWsJ{U}_&o~% literal 0 HcmV?d00001 diff --git a/BKPS/OLD/XEU5-0/Experts/x-saherelm.xeu5.ea.mq5 b/BKPS/OLD/XEU5-0/Experts/x-saherelm.xeu5.ea.mq5 new file mode 100644 index 0000000..8b925ae --- /dev/null +++ b/BKPS/OLD/XEU5-0/Experts/x-saherelm.xeu5.ea.mq5 @@ -0,0 +1,347 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 Expert Advisor +// ---------------------------------------- +// Name: XEU5EA +// 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 XEU5 EA" +#property strict + +// +// START Inputs ... +// + +input group "Commons"; + +// +// END Inputs ... +// + +// +// START Including Providers ... +// + +// +// Logger Library ... +#include "../Libraries/x-saherelm.log.lib.mq5" + +// +// Common Library ... +#include "../Libraries/x-saherelm.common.lib.mq5" + +// +// Alert Library ... +#include "../Libraries/x-saherelm.alert.lib.mq5" + +// +// Draw Library ... +#include "../Libraries/x-saherelm.draw.lib.mq5" + +// +// XEU5 Signal Provider ... +#include "../Providers/x-saherelm.xeu5.provider.lib.mq5" + +// +// END Including Providers ... +// + +// +// START Global Definitions: Variables, Properties and etc ... +// +bool isXEU5NewHour; +bool isXEU5NewDay; +bool isXEU5NewWeek; +bool isXEU5NewMonth; +// +// END Global Definitions: Variables, Properties and etc ... +// + +// +// START Event Handlers ... +// + +// +// Initialization ... +int OnInit() +{ + // + logTag = "XEU5EA"; + drawPrefix = logTag; + alertPrefix = logTag; + + // + // Apply default Chart Style for EA ... + ApplyChartStyle(); + + // + // Reset Timings ... + ResetTiming(); + + // + // Validate Inputs ... + if (!ValidateInputs()) + { + return INIT_PARAMETERS_INCORRECT; + } + + // + // Initialize XEU5 Provider ... + if (!XEU5InitSignalProviderLibrary()) + { + return INIT_PARAMETERS_INCORRECT; + } + + // + // 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 ... + + // + // De Initialize XEU5 Provider ... + XEU5DeinitSignalProviderLibrary(reason); + + // + // De Init XDraw Library ... + // OnDeinitDrawLibrary(); +} + +// +// On Tick Handler ... +void OnTick() +{ + // + // Handle Monthly Alert ... + bool isFirstMonth = xMonth == -1; + isXEU5NewMonth = IsNewMonth(); + bool canMonthlyAlert = + isXEU5NewMonth && + xEU5EnableAlerts && + xEU5EnableMonthlyAlerts; + bool canMonthlyReport = + !isFirstMonth && + canMonthlyAlert && + xEU5EnableMonthlyReports; + if (canMonthlyAlert) + { + // + string message = "New Month ..."; + + // + // Prepare Monthly Report ... + if (canMonthlyReport) + { + // + string report = xEU5Reporter.GenerateReportString(XREPORT_MONTHLY); + + // + message = "Last Month Report:\n" + report; + } + + // + // Reset Report ... + xEU5Reporter.Reset(XREPORT_MONTHLY); + + // + SendAlert(message); + } + + // + // Handle Weekly Alert ... + bool isFirstWeek = xDayOfWeek == -1; + isXEU5NewWeek = IsNewWeek(); + bool canWeeklyAlert = + isXEU5NewWeek && + xEU5EnableAlerts && + xEU5EnableWeeklyAlerts; + bool canWeeklyReport = + !isFirstWeek && + canWeeklyAlert && + xEU5EnableWeeklyReports; + if (canWeeklyAlert) + { + // + string message = "New Week ..."; + + // + // Prepare Weekly Report ... + if (canWeeklyReport) + { + // + string report = xEU5Reporter.GenerateReportString(XREPORT_WEEKLY); + + // + message = "Last Week Report:\n" + report; + } + + // + // Reset Report ... + xEU5Reporter.Reset(XREPORT_WEEKLY); + + // + SendAlert(message); + } + + // + // Handle Daily Alert ... + bool isFirstDay = xDay == -1; + isXEU5NewDay = IsNewDay(); + bool canDailyAlert = + isXEU5NewDay && + xEU5EnableAlerts && + xEU5EnableDailyAlerts; + bool canDailyReport = + !isFirstDay && + canDailyAlert && + xEU5EnableDailyReports; + if (canDailyAlert) + { + // + string message = "New Day ..."; + + // + // Prepare Daily Report ... + if (canDailyReport) + { + // + string report = xEU5Reporter.GenerateReportString(XREPORT_DAILY); + + // + message = "Last Week Report:\n" + report; + } + + // + // Reset Report ... + xEU5Reporter.Reset(XREPORT_DAILY); + + // + SendAlert(message); + } + + // + // Handle Hourly Alert ... + bool isFirstHour = xHour == -1; + isXEU5NewHour = IsNewHour(); + bool canHourlyAlert = + isXEU5NewHour && + xEU5EnableAlerts && + xEU5EnableHourlyAlerts; + if (canHourlyAlert) + { + // + string message = "New Hour ..."; + + // + SendAlert(message); + } + + + // + // Prevent Going Forward if user Disable it ... + if (xEU5EnableProvider) + { + // + // Handle Processing on XEU5 Signal Provider ... + XEU5SignalProviderDoControlState(); + } + + // + if (!IsNewCandle()) + { + return; + } + + // + // Prevent Going Forward if user Disable it ... + if (xEU5EnableProvider) + { + // + // Handle Processing on XEU5 Signal Provider ... + XEU5SignalProviderHandleTick(); + } +} + +// +// Handle Trade Events ... +void OnTrade() +{ + + // + // Prevent Going Forward if user Disable it ... + if (xEU5EnableProvider) + { + // + // Handle Processing Trades on XEU5 Signal Provider ... + XEU5SignalProviderHandleTrade(); + } +} + +// +// END Event Handlers ... +// + +// +// START Functions ... +// + +// +// Validate Input Args for Initialization ... +bool ValidateInputs() +{ + // + bool result = false; + + // + // Validate Args ... + + // + // Validate XEU5 Provider Inputs ... + result = XEU5ValidateInputs(); + if (!result) + { + return false; + } + + // + // Logging State ... + string message = "Validation of (" + logTag + ") Inputs " + (result ? "Succeeded" : "Failed") + " ..."; + LogMessage(message); + + // + return result; +} + +// +// END Functions ... +// diff --git a/BKPS/OLD/XEU5-0/Helpers/.gitkeep b/BKPS/OLD/XEU5-0/Helpers/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/BKPS/OLD/XEU5-0/Helpers/x-saherelm.xama.indicator.helper.lib.mq5 b/BKPS/OLD/XEU5-0/Helpers/x-saherelm.xama.indicator.helper.lib.mq5 new file mode 100644 index 0000000..f565e41 --- /dev/null +++ b/BKPS/OLD/XEU5-0/Helpers/x-saherelm.xama.indicator.helper.lib.mq5 @@ -0,0 +1,607 @@ +///////////////////////////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 XAMA Indicator Helper for Signal Providers +// -------------------------------------------------------------------------- +// +// 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 + +// +// Includes ... +#include "../Libraries/x-saherelm.log.lib.mq5" +#include "../Libraries/x-saherelm.common.lib.mq5" + +// +// START Enum Definitions ... +// + +// +// XAMA Indicator States ... +enum ENUM_X_XAMA_STATES +{ + X_XAMA_BULLISH = 1, + X_XAMA_BEARISH = -1, + X_XAMA_NEUTURAL = 0, +}; + +// +// XAMA Indicator Buffer Lines ... +enum ENUM_X_XAMA_BUFFER_LINES +{ + X_XAMA_MA_LINE = 0, + X_XAMA_MC_COLOR_LINE = 1, + X_XAMA_STATE_LINE = 2, +}; + +// +// END Enum Definitions ... +// + +// +// START Inputs ... +// + +// input group "XAMA Indicator"; + +// +// input int xAMALength = 18; // Market Length +// input int xAMAFastEMA = 2; // Fast EMA Period +// input int xAMASlowEMA = 30; // Slow EMA Period +// input int xAMAShift = 0; // Shift +// input ENUM_APPLIED_PRICE xAMAAppliedTo = PRICE_CLOSE; // Applied To + +// +// Configurations ... +int xAMALength = 18; // Market Length +int xAMAFastEMA = 2; // Fast EMA Period +int xAMASlowEMA = 30; // Slow EMA Period +int xAMAShift = 0; // Shift +ENUM_APPLIED_PRICE xAMAAppliedTo = PRICE_CLOSE; // Applied To + +// +// END Inputs ... +// + +// +// START Definitions ... +// + +int xAMAHandler = INVALID_HANDLE; +double xAMAMaBuffer[]; +double xAMAStateBuffer[]; + +// +// END Definitions ... +// + +// +// START Handler Functions ... +// + +// +// Validate Inputs ... +bool XAMAValidateInputs() +{ + // + bool result = false; + + // + result = + xAMALength > 2 && + xAMAFastEMA < xAMALength && + xAMAFastEMA < xAMASlowEMA && + xAMAShift >= 0; + + // + if (!result) + { + // + LogMessage("XAMA Indicator Inputs Validation Failed ..."); + } + + // + return result; +} + +// +// Init Indicators ... +bool XAMAInitHandlers() +{ + // + bool result = false; + + // + // Initialize Indicator/Indicator Handlers ... + ResetLastError(); + + // + // XAMA Handler ... + ArraySetAsSeries(xAMAMaBuffer, true); + ArraySetAsSeries(xAMAStateBuffer, true); + xAMAHandler = iCustom( + _Symbol, + _Period, + "x-saherelm.xama.indicator", + // + // Inputs ... + xAMALength, + xAMAFastEMA, + xAMASlowEMA, + xAMAShift, + xAMAAppliedTo + // + ); + if (xAMAHandler == INVALID_HANDLE) + { + // + LogMessage("failed to Initialize XAMA Indicator: " + (string)GetLastError()); + return result; + } + + // + result = true; + + // + return result; +} + +// +// Release Indicators ... +void XAMAReleaseHandlers() +{ + IndicatorRelease(xAMAHandler); +} + +// +// Handle Reading Buffers ... +void XAMAReadBuffers( + int xAMAItemsPerTick // Number Of Reading Buffer Items Per Tick +) +{ + // + // XAMA Ma Buffer ... + CopyBuffer( + xAMAHandler, + X_XAMA_MA_LINE, + 0, + xAMAItemsPerTick, + xAMAMaBuffer); + + // + // XAMA State Buffer ... + CopyBuffer( + xAMAHandler, + X_XAMA_STATE_LINE, + 0, + xAMAItemsPerTick, + xAMAStateBuffer); +} + +// +// END Handler Funcions ... +// + +// +// START XAMA Custom Functions ... +// + +// +// Check SC is Peak ... +bool XAMAIsPeak( + int bar_index, // Specified Index ... + int length = 10 // Specified Length ... +) +{ + // + bool result = false; + + // + if ( + length <= 0 || + bar_index <= 0 || + !XAMAIsValidBuffersSize(bar_index + length + 1)) + { + return result; + } + + // + // Must Decreasing ... + bool isIncreasing = IsIncreasing( + bar_index + length, + bar_index, + xAMAMaBuffer + // + ); + + // + return result; +} + +// +// Check SC is Vale ... +bool XAMAIsVale( + int bar_index, // Specified Index ... + int length = 10 // Specified Length ... +) +{ + // + bool result = false; + + // + if ( + length <= 0 || + bar_index <= 0 || + !XAMAIsValidBuffersSize(bar_index + length + 1)) + { + return result; + } + + // + result = IsDecreasing( + bar_index + length, + bar_index, + xAMAMaBuffer + // + ); + + // + return result; +} + +// +// Check TM Crossed Up ... +bool XAMAIsStartBullish( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XAMAIsValidBuffersSize(bar_index + 2)) + { + return result; + } + + // + result = + // + xAMAStateBuffer[bar_index] == X_XAMA_BULLISH && + xAMAStateBuffer[bar_index + 1] != X_XAMA_BULLISH + // + ; + + // + return result; +} + +// +// Check TM Crossed Up After Neutural State ... +bool XAMAIsStartBullishAfterNeutural( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XAMAIsValidBuffersSize(bar_index + 2)) + { + return result; + } + + // + result = + // + xAMAStateBuffer[bar_index] == X_XAMA_BULLISH && + xAMAStateBuffer[bar_index + 1] == X_XAMA_NEUTURAL + // + ; + + // + return result; +} + +// +// Check TM In Up State ... +bool XAMAIsBullish( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XAMAIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + result = + // + xAMAStateBuffer[bar_index] == X_XAMA_BULLISH + // + ; + + // + return result; +} + +// +// Check TM Ends Up State ... +bool XAMAIsEndBullish( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XAMAIsValidBuffersSize(bar_index + 2)) + { + return result; + } + + // + result = + // + xAMAStateBuffer[bar_index] != X_XAMA_BULLISH && + xAMAStateBuffer[bar_index + 1] == X_XAMA_BULLISH + // + ; + + // + return result; +} + +// +// Check TM Ends Up State By Neutural ... +bool XAMAIsEndBullishByNeutural( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XAMAIsValidBuffersSize(bar_index + 2)) + { + return result; + } + + // + result = + // + xAMAStateBuffer[bar_index] == X_XAMA_NEUTURAL && + xAMAStateBuffer[bar_index + 1] == X_XAMA_BULLISH + // + ; + + // + return result; +} + +// +// Check TM Crossed Down ... +bool XAMAIsStartBearish( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XAMAIsValidBuffersSize(bar_index + 2)) + { + return result; + } + + // + result = + // + xAMAStateBuffer[bar_index] == X_XAMA_BEARISH && + xAMAStateBuffer[bar_index + 1] != X_XAMA_BEARISH + // + ; + + // + return result; +} + +// +// Check TM Crossed Down After Neutural State ... +bool XAMAIsStartBearishAfterNeutural( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XAMAIsValidBuffersSize(bar_index + 2)) + { + return result; + } + + // + result = + // + xAMAStateBuffer[bar_index] == X_XAMA_BEARISH && + xAMAStateBuffer[bar_index + 1] == X_XAMA_NEUTURAL + // + ; + + // + return result; +} + +// +// Check TM In Down State ... +bool XAMAIsBearish( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XAMAIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + result = + // + xAMAStateBuffer[bar_index] == X_XAMA_BEARISH + // + ; + + // + return result; +} + +// +// Check TM Ends Down State ... +bool XAMAIsEndBearish( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XAMAIsValidBuffersSize(bar_index + 2)) + { + return result; + } + + // + result = + // + xAMAStateBuffer[bar_index] != X_XAMA_BEARISH && + xAMAStateBuffer[bar_index + 1] == X_XAMA_BEARISH + // + ; + + // + return result; +} + +// +// Check TM Ends Down State By Neutural ... +bool XAMAIsEndBearishByNeutural( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XAMAIsValidBuffersSize(bar_index + 2)) + { + return result; + } + + // + result = + // + xAMAStateBuffer[bar_index] == X_XAMA_NEUTURAL && + xAMAStateBuffer[bar_index + 1] == X_XAMA_BEARISH + // + ; + + // + return result; +} + +// +// Check TM In Neutural State ... +bool XAMAIsNeutural( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XAMAIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + result = + // + xAMAStateBuffer[bar_index] == X_XAMA_NEUTURAL + // + ; + + // + return result; +} + +// +// Check all Buffers has valid Size ... +bool XAMAIsValidBuffersSize( + int size // the size of buffers which min size for requirements +) +{ + // + bool result = false; + + // + if ( + size <= 0 || + // + ArraySize(xAMAMaBuffer) < size + // + ) + { + result = false; + } + else + { + result = true; + } + + // + return result; +} + +// +// END XAMA Custom Functions ... +// diff --git a/BKPS/OLD/XEU5-0/Helpers/x-saherelm.xchlh.oscillator.helper.lib.mq5 b/BKPS/OLD/XEU5-0/Helpers/x-saherelm.xchlh.oscillator.helper.lib.mq5 new file mode 100644 index 0000000..d7071b4 --- /dev/null +++ b/BKPS/OLD/XEU5-0/Helpers/x-saherelm.xchlh.oscillator.helper.lib.mq5 @@ -0,0 +1,1032 @@ +///////////////////////////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 XCHLH Oscillator Helper for Signal Providers +// -------------------------------------------------------------------------- +// +// 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 + +// +// Includes ... +#include "../Libraries/x-saherelm.log.lib.mq5" +#include "../Libraries/x-saherelm.common.lib.mq5" + +// +// START Enum Definitions ... +// + +// +// Cycles Enumeration ... +enum ENUM_X_XCHLH_CYCLES +{ + X_XCHLH_CYCLE_LONG, + X_XCHLH_CYCLE_MEDIUM, + X_XCHLH_CYCLE_SHORT, +}; + +// +// XCHLH Hot States ... +enum ENUM_X_XCHLH_HOT_STATES +{ + X_XCHLH_HOT_HH = 1, + X_XCHLH_NEUTURAL = 0, + X_XCHLH_HOT_LL = -1, +}; + +// +// XCHLH Buffer Lines ... +enum ENUM_X_XCHLH_BUFFER_LINES +{ + X_XCHLH_LC_HH_LINE = 0, + X_XCHLH_LC_LL_LINE = 1, + X_XCHLH_MC_HH_LINE = 2, + X_XCHLH_MC_LL_LINE = 3, + X_XCHLH_SC_HH_LINE = 4, + X_XCHLH_SC_LL_LINE = 5, + X_XCHLH_SIGNAL_T_LINE = 6, + X_XCHLH_SIGNAL_B_LINE = 7, + X_XCHLH_HOT_STATE_LINE = 8, +}; + +// +// END Enum Definitions ... +// + +// +// START Inputs ... +// + +// // +// input group "XCHLH Oscillator"; + +// // +// // Common ... +// input group "XCHLH Hot Areas"; +// input bool xCHLHDrawHotAreas = false; // Draw Hot Areas Symbol +// input uchar xCHLHHotHHArrowCode = 234; // Hot HH Arrow Code +// input color xCHLHHotHHArrowColor = clrAqua; // Hot HH Arrow Color +// input uchar xCHLHHotLLArrowCode = 233; // Hot LL Arrow Code +// input color xCHLHHotLLArrowColor = clrFuchsia; // Hot LL Arrow Color + +// // +// // LC Inputs ... +// input group "XCHLH Long Cycle"; +// input group "XCHLH LC Market"; +// input int xCHLHLcLength = 288; // Length +// input double xCHLHLcThresholdInPips = 0.3; // Threshold In Pips +// input ENUM_SERIESMODE xCHLHLcHHMode = MODE_HIGH; // Highest High Calculation Method +// input ENUM_SERIESMODE xCHLHLcLLMode = MODE_LOW; // Lowest Low Calculation Method +// input group "XCHLH LC Style"; +// input int xCHLHLcDrawWidth = 1; // Draw Width +// input ENUM_DRAW_TYPE xCHLHLcDrawType = DRAW_LINE; // Draw Type +// input ENUM_LINE_STYLE xCHLHLcDrawStyle = STYLE_DOT; // Draw Style +// input color xCHLHLcHHColor = clrAqua; // Highest High Color +// input color xCHLHLcLLColor = clrFuchsia; // Lowest Low Color +// input group "XCHLH LC Drawings"; +// input bool xCHLHLcDrawHH = true; // Draw Highest High +// input bool xCHLHLcDrawLL = true; // Draw Lowest Low + +// // +// // MC Inputs ... +// input group "XCHLH Medium Cycle"; +// input group "XCHLH MC Market"; +// input int xCHLHMcLength = 72; // Length +// input double xCHLHMcThresholdInPips = 0.3; // Threshold In Pips +// input ENUM_SERIESMODE xCHLHMcHHMode = MODE_HIGH; // Highest High Calculation Method +// input ENUM_SERIESMODE xCHLHMcLLMode = MODE_LOW; // Lowest Low Calculation Method +// input group "XCHLH MC Style"; +// input int xCHLHMcDrawWidth = 1; // Draw Width +// input ENUM_DRAW_TYPE xCHLHMcDrawType = DRAW_LINE; // Draw Type +// input ENUM_LINE_STYLE xCHLHMcDrawStyle = STYLE_DOT; // Draw Style +// input color xCHLHMcHHColor = clrLime; // Highest High Color +// input color xCHLHMcLLColor = clrRed; // Lowest Low Color +// input group "XCHLH MC Drawings"; +// input bool xCHLHMcDrawHH = true; // Draw Highest High +// input bool xCHLHMcDrawLL = true; // Draw Lowest Low + +// // +// // SC Inputs ... +// input group "XCHLH Short Cycle"; +// input group "XCHLH SC Market"; +// input int xCHLHScLength = 7; // Length +// input double xCHLHScThresholdInPips = 0.3; // Threshold In Pips +// input ENUM_SERIESMODE xCHLHScHHMode = MODE_HIGH; // Highest High Calculation Method +// input ENUM_SERIESMODE xCHLHScLLMode = MODE_LOW; // Lowest Low Calculation Method +// input group "XCHLH SC Style"; +// input int xCHLHScDrawWidth = 1; // Draw Width +// input ENUM_DRAW_TYPE xCHLHScDrawType = DRAW_LINE; // Draw Type +// input ENUM_LINE_STYLE xCHLHScDrawStyle = STYLE_DOT; // Draw Style +// input color xCHLHScHHColor = clrLightBlue; // Highest High Color +// input color xCHLHScLLColor = clrLightSalmon; // Lowest Low Color +// input group "XCHLH SC Drawings"; +// input bool xCHLHScDrawHH = true; // Draw Highest High +// input bool xCHLHScDrawLL = true; // Draw Lowest Low + +// +// Configurations ... +// +// Common ... +bool xCHLHDrawHotAreas = false; // Draw Hot Areas Symbol +uchar xCHLHHotHHArrowCode = 234; // Hot HH Arrow Code +color xCHLHHotHHArrowColor = clrAqua; // Hot HH Arrow Color +uchar xCHLHHotLLArrowCode = 233; // Hot LL Arrow Code +color xCHLHHotLLArrowColor = clrFuchsia; // Hot LL Arrow Color + +// +// LC Inputs ... +int xCHLHLcLength = 288; // Length +double xCHLHLcThresholdInPips = 0.3; // Threshold In Pips +ENUM_SERIESMODE xCHLHLcHHMode = MODE_HIGH; // Highest High Calculation Method +ENUM_SERIESMODE xCHLHLcLLMode = MODE_LOW; // Lowest Low Calculation Method +int xCHLHLcDrawWidth = 1; // Draw Width +ENUM_DRAW_TYPE xCHLHLcDrawType = DRAW_LINE; // Draw Type +ENUM_LINE_STYLE xCHLHLcDrawStyle = STYLE_DOT; // Draw Style +color xCHLHLcHHColor = clrAqua; // Highest High Color +color xCHLHLcLLColor = clrFuchsia; // Lowest Low Color +bool xCHLHLcDrawHH = true; // Draw Highest High +bool xCHLHLcDrawLL = true; // Draw Lowest Low + +// +// MC Inputs ... +int xCHLHMcLength = 72; // Length +double xCHLHMcThresholdInPips = 0.3; // Threshold In Pips +ENUM_SERIESMODE xCHLHMcHHMode = MODE_HIGH; // Highest High Calculation Method +ENUM_SERIESMODE xCHLHMcLLMode = MODE_LOW; // Lowest Low Calculation Method +int xCHLHMcDrawWidth = 1; // Draw Width +ENUM_DRAW_TYPE xCHLHMcDrawType = DRAW_LINE; // Draw Type +ENUM_LINE_STYLE xCHLHMcDrawStyle = STYLE_DOT; // Draw Style +color xCHLHMcHHColor = clrLime; // Highest High Color +color xCHLHMcLLColor = clrRed; // Lowest Low Color +bool xCHLHMcDrawHH = true; // Draw Highest High +bool xCHLHMcDrawLL = true; // Draw Lowest Low + +// +// SC Inputs ... +int xCHLHScLength = 7; // Length +double xCHLHScThresholdInPips = 0.3; // Threshold In Pips +ENUM_SERIESMODE xCHLHScHHMode = MODE_HIGH; // Highest High Calculation Method +ENUM_SERIESMODE xCHLHScLLMode = MODE_LOW; // Lowest Low Calculation Method +int xCHLHScDrawWidth = 1; // Draw Width +ENUM_DRAW_TYPE xCHLHScDrawType = DRAW_LINE; // Draw Type +ENUM_LINE_STYLE xCHLHScDrawStyle = STYLE_DOT; // Draw Style +color xCHLHScHHColor = clrLightBlue; // Highest High Color +color xCHLHScLLColor = clrLightSalmon; // Lowest Low Color +bool xCHLHScDrawHH = true; // Draw Highest High +bool xCHLHScDrawLL = true; // Draw Lowest Low + +// +// END Inputs ... +// + +// +// START Definitions ... +// + +int xCHLHHandler = INVALID_HANDLE; +double xCHLHLcHHBuffer[]; +double xCHLHLcLLBuffer[]; +double xCHLHMcHHBuffer[]; +double xCHLHMcLLBuffer[]; +double xCHLHScHHBuffer[]; +double xCHLHScLLBuffer[]; + +// +// END Definitions ... +// + +// +// START Handler Functions ... +// + +// +// Validate Inputs ... +bool XCHLHValidateInputs() +{ + // + bool result = false; + + // + result = + xCHLHScLength >= 2 && + xCHLHMcLength > xCHLHScLength && + xCHLHLcLength > xCHLHMcLength; + + // + if (!result) + { + // + LogMessage("XCHLH Oscillator Inputs Validation Failed ..."); + } + + // + return result; +} + +// +// Init Oscillators ... +bool XCHLHInitHandlers() +{ + // + bool result = false; + + // + // Initialize Indicator/Oscillator Handlers ... + ResetLastError(); + + // + // XCHLH Handler ... + ArraySetAsSeries(xCHLHLcHHBuffer, true); + ArraySetAsSeries(xCHLHLcLLBuffer, true); + ArraySetAsSeries(xCHLHMcHHBuffer, true); + ArraySetAsSeries(xCHLHMcLLBuffer, true); + ArraySetAsSeries(xCHLHScHHBuffer, true); + ArraySetAsSeries(xCHLHScLLBuffer, true); + xCHLHHandler = iCustom( + _Symbol, + _Period, + "x-saherelm.xchlh.oscillator", + // + // Inputs ... + // + // Commons ... + "", + xCHLHDrawHotAreas, + xCHLHHotHHArrowCode, + xCHLHHotHHArrowColor, + xCHLHHotLLArrowCode, + xCHLHHotLLArrowColor, + // + // LC ... + "", + "", + xCHLHLcLength, + xCHLHLcThresholdInPips, + xCHLHLcHHMode, + xCHLHLcLLMode, + "", + xCHLHLcDrawWidth, + xCHLHLcDrawType, + xCHLHLcDrawStyle, + xCHLHLcHHColor, + xCHLHLcLLColor, + "", + xCHLHLcDrawHH, + xCHLHLcDrawLL, + // + // MC ... + "", + "", + xCHLHMcLength, + xCHLHMcThresholdInPips, + xCHLHMcHHMode, + xCHLHMcLLMode, + "", + xCHLHMcDrawWidth, + xCHLHMcDrawType, + xCHLHMcDrawStyle, + xCHLHMcHHColor, + xCHLHMcLLColor, + "", + xCHLHMcDrawHH, + xCHLHMcDrawLL, + // + // SC ... + "", + "", + xCHLHScLength, + xCHLHScThresholdInPips, + xCHLHScHHMode, + xCHLHScLLMode, + "", + xCHLHScDrawWidth, + xCHLHScDrawType, + xCHLHScDrawStyle, + xCHLHScHHColor, + xCHLHScLLColor, + "", + xCHLHScDrawHH, + xCHLHScDrawLL); + if (xCHLHHandler == INVALID_HANDLE) + { + // + LogMessage("failed to Initialize XCHLH Indicator: " + (string)GetLastError()); + return result; + } + + // + result = true; + + // + return result; +} + +// +// Release Oscillators ... +void XCHLHReleaseHandlers() +{ + IndicatorRelease(xCHLHHandler); +} + +// +// Handle Reading Buffers ... +void XCHLHReadBuffers( + int xCHLHItemsPerTick // Number Of Reading Buffer Items Per Tick +) +{ + // + // XCHLH LC HH Buffer ... + CopyBuffer( + xCHLHHandler, + X_XCHLH_LC_HH_LINE, + 0, + xCHLHItemsPerTick, + xCHLHLcHHBuffer); + + // + // XCHLH LC LL Buffer ... + CopyBuffer( + xCHLHHandler, + X_XCHLH_LC_LL_LINE, + 0, + xCHLHItemsPerTick, + xCHLHLcLLBuffer); + + // + // XCHLH MC HH Buffer ... + CopyBuffer( + xCHLHHandler, + X_XCHLH_MC_HH_LINE, + 0, + xCHLHItemsPerTick, + xCHLHMcHHBuffer); + + // + // XCHLH MC LL Buffer ... + CopyBuffer( + xCHLHHandler, + X_XCHLH_MC_LL_LINE, + 0, + xCHLHItemsPerTick, + xCHLHMcLLBuffer); + + // + // XCHLH SC HH Buffer ... + CopyBuffer( + xCHLHHandler, + X_XCHLH_SC_HH_LINE, + 0, + xCHLHItemsPerTick, + xCHLHScHHBuffer); + + // + // XCHLH SC LL Buffer ... + CopyBuffer( + xCHLHHandler, + X_XCHLH_SC_LL_LINE, + 0, + xCHLHItemsPerTick, + xCHLHScLLBuffer); +} + +// +// END Handler Funcions ... +// + +// +// START XCHLH Custom Functions ... +// + +// +// Check LC and MC has Same HH ... +bool XCHLHIsLCMCHasSameHH( + int bar_index // Specified Bar Index ... +) +{ + // + bool result = false; + + // + // Validate Args ... + if (!XCHLHIsValidBufferSizes(bar_index + 1)) + { + return result; + } + + // + double lcValue = xCHLHLcHHBuffer[bar_index]; + double mcValue = xCHLHMcHHBuffer[bar_index]; + + // + result = lcValue == mcValue; + + // + return result; +} + +// +// Check LC and MC has Same LL ... +bool XCHLHIsLCMCHasSameLL( + int bar_index // Specified Bar Index ... +) +{ + // + bool result = false; + + // + // Validate Args ... + if (!XCHLHIsValidBufferSizes(bar_index + 1)) + { + return result; + } + + // + double lcValue = xCHLHLcLLBuffer[bar_index]; + double mcValue = xCHLHMcLLBuffer[bar_index]; + + // + result = lcValue == mcValue; + + // + return result; +} + +// +// Check LC and SC has Same HH ... +bool XCHLHIsLCSCHasSameHH( + int bar_index // Specified Bar Index ... +) +{ + // + bool result = false; + + // + // Validate Args ... + if (!XCHLHIsValidBufferSizes(bar_index + 1)) + { + return result; + } + + // + double lcValue = xCHLHLcHHBuffer[bar_index]; + double scValue = xCHLHScHHBuffer[bar_index]; + + // + result = lcValue == scValue; + + // + return result; +} + +// +// Check LC and SC has Same LL ... +bool XCHLHIsLCSCHasSameLL( + int bar_index // Specified Bar Index ... +) +{ + // + bool result = false; + + // + // Validate Args ... + if (!XCHLHIsValidBufferSizes(bar_index + 1)) + { + return result; + } + + // + double lcValue = xCHLHLcLLBuffer[bar_index]; + double scValue = xCHLHScLLBuffer[bar_index]; + + // + result = lcValue == scValue; + + // + return result; +} + +// +// Check MC and SC has Same HH ... +bool XCHLHIsMCSCHasSameHH( + int bar_index // Specified Bar Index ... +) +{ + // + bool result = false; + + // + // Validate Args ... + if (!XCHLHIsValidBufferSizes(bar_index + 1)) + { + return result; + } + + // + double mcValue = xCHLHMcHHBuffer[bar_index]; + double scValue = xCHLHScHHBuffer[bar_index]; + + // + result = mcValue == scValue; + + // + return result; +} + +// +// Check MC and SC has Same LL ... +bool XCHLHIsMCSCHasSameLL( + int bar_index // Specified Bar Index ... +) +{ + // + bool result = false; + + // + // Validate Args ... + if (!XCHLHIsValidBufferSizes(bar_index + 1)) + { + return result; + } + + // + double mcValue = xCHLHMcLLBuffer[bar_index]; + double scValue = xCHLHScLLBuffer[bar_index]; + + // + result = mcValue == scValue; + + // + return result; +} + +// +// Check Is Same Highest Highs ... +bool XCHLHIsSameHHs( + int bar_index // Specified Bar Index ... +) +{ + // + bool result = false; + + // + // Validate Args ... + if (!XCHLHIsValidBufferSizes(bar_index + 1)) + { + return result; + } + + // + double lcValue = xCHLHLcHHBuffer[bar_index]; + double mcValue = xCHLHMcHHBuffer[bar_index]; + double scValue = xCHLHScHHBuffer[bar_index]; + + // + result = + // + lcValue == mcValue && + mcValue == scValue + // + ; + + // + return result; +} + +// +// Check Is Same Lowest Lows ... +bool XCHLHIsSameLLs( + int bar_index // Specified Bar Index ... +) +{ + // + bool result = false; + + // + // Validate Args ... + if (!XCHLHIsValidBufferSizes(bar_index + 1)) + { + return result; + } + + // + double lcValue = xCHLHLcLLBuffer[bar_index]; + double mcValue = xCHLHMcLLBuffer[bar_index]; + double scValue = xCHLHScLLBuffer[bar_index]; + + // + result = + // + lcValue == mcValue && + mcValue == scValue + // + ; + + // + return result; +} + +// +// Check Medium Cycle is On Top of Long Cycle's Mid ... +bool XCHLHIsMCOnTopOfLC( + int bar_index // Specified Bar Index ... +) +{ + // + bool result = false; + + // + // Validate Args ... + if ( + bar_index < 0 || + !XCHLHIsValidBufferSizes(bar_index + 1)) + { + return result; + } + + // + ENUM_X_XCHLH_CYCLES sCycle = X_XCHLH_CYCLE_MEDIUM; + ENUM_X_XCHLH_CYCLES dCycle = X_XCHLH_CYCLE_LONG; + + // + result = + // + XCHLHCheckCycleIsOnTopOfAnother( + bar_index, + sCycle, + dCycle) + // + ; + + // + return result; +} + +// +// Check Medium Cycle is In Bottom of Long Cycle's Mid ... +bool XCHLHIsMCInBottomOfLC( + int bar_index // Specified Bar Index ... +) +{ + // + bool result = false; + + // + // Validate Args ... + if ( + bar_index < 0 || + !XCHLHIsValidBufferSizes(bar_index + 1)) + { + return result; + } + + // + ENUM_X_XCHLH_CYCLES sCycle = X_XCHLH_CYCLE_MEDIUM; + ENUM_X_XCHLH_CYCLES dCycle = X_XCHLH_CYCLE_LONG; + + // + result = + // + XCHLHCheckCycleIsInBottomOfAnother( + bar_index, + sCycle, + dCycle) + // + ; + + // + return result; +} + +// +// Check and Validate Buffer Sizes ... +bool XCHLHIsValidBufferSizes( + int size // Specified Min Size +) +{ + // + bool result = false; + + // + result = + // + ArraySize(xCHLHLcHHBuffer) > size && + ArraySize(xCHLHLcLLBuffer) > size && + // + ArraySize(xCHLHMcHHBuffer) > size && + ArraySize(xCHLHMcLLBuffer) > size && + // + ArraySize(xCHLHScHHBuffer) > size && + ArraySize(xCHLHScLLBuffer) > size; + + // + return result; +} + +// +// Get Cycle Middle Value ... +double XCHLHGetCycleMid( + int bar_index, // Specified Bar Index ... + ENUM_X_XCHLH_CYCLES cycle // Specified Cycle ... +) +{ + // + double result = 0; + + // + // Validate Args ... + if ( + bar_index < 0 || + !XCHLHIsValidBufferSizes(bar_index + 1)) + { + return result; + } + + // + // Retrieve Cycle Max Value ... + double iMax = XCHLHGetCycleMax( + bar_index, + cycle); + + // + // Retrieve Cycle Min Value ... + double iMin = XCHLHGetCycleMin( + bar_index, + cycle); + + // + result = (iMax - iMin) / 2; + + // + return result; +} + +// +// Get Cycle Max Value ... +double XCHLHGetCycleMax( + int bar_index, // Specified Bar Index ... + ENUM_X_XCHLH_CYCLES cycle // Specified Cycle ... +) +{ + // + double result = 0; + + // + // Validate Args ... + if ( + bar_index < 0 || + !XCHLHIsValidBufferSizes(bar_index + 1)) + { + return result; + } + + // + switch (cycle) + { + // + // Long Cycle ... + case X_XCHLH_CYCLE_LONG: + result = xCHLHLcHHBuffer[1]; + break; + + // + // Medium Cycle ... + case X_XCHLH_CYCLE_MEDIUM: + result = xCHLHMcHHBuffer[1]; + break; + + // + // Short Cycle ... + case X_XCHLH_CYCLE_SHORT: + result = xCHLHScHHBuffer[1]; + break; + } + + // + return result; +} + +// +// Get Specified Cycles Max Value ... +double XCHLHGetCyclesMax( + int bar_index, // Specified Bar Index ... + ENUM_X_XCHLH_CYCLES &cycles[] // Specified Cycle ... +) +{ + // + bool result = 0; + + // + // Validate Args ... + if ( + bar_index < 0 || + ArraySize(cycles) <= 0 || + !XCHLHIsValidBufferSizes(bar_index + 1)) + { + return result; + } + + // + // Loop Through Cycles ... + for (int i = 0; i < ArraySize(cycles); i++) + { + // + ENUM_X_XCHLH_CYCLES iCycle = cycles[i]; + + // + double iValue = XCHLHGetCycleMax( + bar_index, + iCycle); + + // + result = result == 0 || result < iValue ? iValue : result; + } + + // + return result; +} + +// +// Get Cycle Min Value ... +double XCHLHGetCycleMin( + int bar_index, // Specified Bar Index ... + ENUM_X_XCHLH_CYCLES cycle // Specified Cycle ... +) +{ + // + double result = 0; + + // + // Validate Args ... + if ( + bar_index < 0 || + !XCHLHIsValidBufferSizes(bar_index + 1)) + { + return result; + } + + // + switch (cycle) + { + // + // Long Cycle ... + case X_XCHLH_CYCLE_LONG: + result = xCHLHLcLLBuffer[1]; + break; + + // + // Medium Cycle ... + case X_XCHLH_CYCLE_MEDIUM: + result = xCHLHMcLLBuffer[1]; + break; + + // + // Short Cycle ... + case X_XCHLH_CYCLE_SHORT: + result = xCHLHScLLBuffer[1]; + break; + } + + // + return result; +} + +// +// Get Specified Cycles Min Value ... +double XCHLHGetCyclesMin( + int bar_index, // Specified Bar Index ... + ENUM_X_XCHLH_CYCLES &cycles[] // Specified Cycle ... +) +{ + // + bool result = 0; + + // + // Validate Args ... + if ( + bar_index < 0 || + ArraySize(cycles) <= 0 || + !XCHLHIsValidBufferSizes(bar_index + 1)) + { + return result; + } + + // + // Loop Through Cycles ... + for (int i = 0; i < ArraySize(cycles); i++) + { + // + ENUM_X_XCHLH_CYCLES iCycle = cycles[i]; + + // + double iValue = XCHLHGetCycleMin( + bar_index, + iCycle); + + // + result = result == 0 || result > iValue ? iValue : result; + } + + // + return result; +} + +// +// Check a Cycle is On Top of Another Cycle's Mid ... +bool XCHLHCheckCycleIsOnTopOfAnother( + int bar_index, // Specified Bar Index ... + ENUM_X_XCHLH_CYCLES sourceCycle, // Specified Source Cycle which Checks ... + ENUM_X_XCHLH_CYCLES destCycle // Specified Dest Cycle which source Checked based on it ... +) +{ + // + bool result = false; + + // + // Validate Args ... + if ( + bar_index < 0 || + !XCHLHIsValidBufferSizes(bar_index + 1)) + { + return result; + } + + // + // Retrieve Min Value of Source Cycle ... + double iMin = XCHLHGetCycleMin( + bar_index, + sourceCycle); + + // + // Retrieve Mid Value of Dest Cycle ... + double iMid = XCHLHGetCycleMid( + bar_index, + destCycle); + + // + // Generate Result ... + result = + // + iMin >= iMid + // + ; + + // + return result; +} + +// +// Check a Cycle is Under Bottom of Another Cycle's Mid ... +bool XCHLHCheckCycleIsInBottomOfAnother( + int bar_index, // Specified Bar Index ... + ENUM_X_XCHLH_CYCLES sourceCycle, // Specified Source Cycle which Checks ... + ENUM_X_XCHLH_CYCLES destCycle // Specified Dest Cycle which source Checked based on it ... +) +{ + // + bool result = false; + + // + // Validate Args ... + if ( + bar_index < 0 || + !XCHLHIsValidBufferSizes(bar_index + 1)) + { + return result; + } + + // + // Retrieve Max Value of Source Cycle ... + double iMax = XCHLHGetCycleMax( + bar_index, + sourceCycle); + + // + // Retrieve Mid Value of Dest Cycle ... + double iMid = XCHLHGetCycleMid( + bar_index, + destCycle); + + // + // Generate Result ... + result = + // + iMax <= iMid + // + ; + + // + return result; +} + +// +// END XCHLH Custom Functions ... +// diff --git a/BKPS/OLD/XEU5-0/Helpers/x-saherelm.xchma.oscillator.helper.lib.mq5 b/BKPS/OLD/XEU5-0/Helpers/x-saherelm.xchma.oscillator.helper.lib.mq5 new file mode 100644 index 0000000..e84d762 --- /dev/null +++ b/BKPS/OLD/XEU5-0/Helpers/x-saherelm.xchma.oscillator.helper.lib.mq5 @@ -0,0 +1,2229 @@ +///////////////////////////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 XCHMA Oscillator Helper for Signal Providers +// -------------------------------------------------------------------------- +// +// 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 + +// +// Includes ... +#include "../Libraries/x-saherelm.log.lib.mq5" +#include "../Libraries/x-saherelm.common.lib.mq5" + +// +// START Enum Definitions ... +// + +// +// XCHMA Cycles ... +enum ENUM_XCHMA_CYCLES +{ + X_XCHMA_CYCLE_LONG, + X_XCHMA_CYCLE_MEDIUM, + X_XCHMA_CYCLE_SHORT, +}; + +// +// XCHMA Oscillator Hot State Presentation ... +enum ENUM_XCHMA_HOT_STATES +{ + X_XCHMA_HOT_BULLISH = 1, + X_XCHMA_HOT_NEUTURAL = 0, + X_XCHMA_HOT_BEARISH = -1, +}; + +// +// XCHMA Oscillator Cycles State Presentation ... +enum ENUM_XCHMA_CYCLE_STATES +{ + X_XCHMA_FAST_CROSSED_OVER_SLOW = 2, + X_XCHMA_FAST_OVER_SLOW = 1, + X_XCHMA_NEUTURAL = 0, + X_XCHMA_FAST_UNDER_SLOW = -1, + X_XCHMA_FAST_CROSSED_UNDER_SLOW = -2, +}; + +// +// XCHMA Oscillator Buffer Lines ... +enum ENUM_X_XCHMA_BUFFER_LINES +{ + X_XCHMA_LC_FAST_LINE = 0, + X_XCHMA_LC_SLOW_LINE = 1, + X_XCHMA_LC_STATE_LINE = 6, + X_XCHMA_MC_FAST_LINE = 2, + X_XCHMA_MC_SLOW_LINE = 3, + X_XCHMA_MC_STATE_LINE = 7, + X_XCHMA_SC_FAST_LINE = 4, + X_XCHMA_SC_SLOW_LINE = 5, + X_XCHMA_SC_STATE_LINE = 8, + X_XCHMA_HOT_STATE_LINE = 9, +}; + +// +// END Enum Definitions ... +// + +// +// START Inputs ... +// + +// input group "XCHMA Oscillator"; + +// // +// // Commons ... +// input group "XCHMA Hot Areas"; +// input bool xCHMADrawHotAreas = false; // Draw Hot Areas Symbol; +// input uchar xCHMAHotBullishArrowCode = 228; // Hot Bullish Arrow Code; +// input color xCHMAHotBullishArrowColor = clrAqua; // Hot Bullish Arrow Color; +// input uchar xCHMAHotBearishArrowCode = 230; // Hot Bearish Arrow Code; +// input color xCHMAHotBearishArrowColor = clrFuchsia; // Hot Bearish Arrow Color; + +// // +// // LC Inputs ... +// input group "XCHMA Long Cycle"; +// input group "XCHMA LC Market"; +// input int xCHMALcFastLength = 288; // Fast Length +// input int xCHMALcSlowLength = 576; // Slow Length +// input ENUM_MA_METHOD xCHMALcMethod = MODE_EMA; // Calculation Method +// input ENUM_APPLIED_PRICE xCHMALcAppliedTo = PRICE_CLOSE; // Applied To +// input group "XCHMA LC Style"; +// input int xCHMALcDrawWidth = 1; // Draw Width +// input ENUM_DRAW_TYPE xCHMALcDrawType = DRAW_LINE; // Draw Type +// input ENUM_LINE_STYLE xCHMALcDrawStyle = STYLE_DOT; // Draw Style +// input color xCHMALcFastColor = clrAqua; // Fast Color +// input color xCHMALcSlowColor = clrFuchsia; // Slow Color +// input group "XCHMA LC Drawings"; +// input bool xCHMALcDrawFast = true; // Draw Fast +// input bool xCHMALcDrawSlow = true; // Draw Slow +// input bool xCHMALcDrawCrosses = false; // Draw Cross Lines + +// // +// // MC Inputs ... +// input group "XCHMA Medium Cycle"; +// input group "XCHMA MC Market"; +// input int xCHMAMcFastLength = 72; // Fast Length +// input int xCHMAMcSlowLength = 144; // Slow Length +// input ENUM_MA_METHOD xCHMAMcMethod = MODE_EMA; // Calculation Method +// input ENUM_APPLIED_PRICE xCHMAMcAppliedTo = PRICE_CLOSE; // Applied To +// input group "XCHMA MC Style"; +// input int xCHMAMcDrawWidth = 1; // Draw Width +// input ENUM_DRAW_TYPE xCHMAMcDrawType = DRAW_LINE; // Draw Type +// input ENUM_LINE_STYLE xCHMAMcDrawStyle = STYLE_DOT; // Draw Style +// input color xCHMAMcFastColor = clrLime; // Fast Color +// input color xCHMAMcSlowColor = clrRed; // Slow Color +// input group "XCHMA MC Drawings"; +// input bool xCHMAMcDrawFast = true; // Draw Fast +// input bool xCHMAMcDrawSlow = true; // Draw Slow +// input bool xCHMAMcDrawCrosses = false; // Draw Cross Lines + +// // +// // SC Inputs ... +// input group "XCHMA Short Cycle"; +// input group "XCHMA SC Market"; +// input int xCHMAScFastLength = 7; // Fast Length +// input int xCHMAScSlowLength = 14; // Slow Length +// input ENUM_MA_METHOD xCHMAScMethod = MODE_SMA; // Calculation Method +// input ENUM_APPLIED_PRICE xCHMAScAppliedTo = PRICE_CLOSE; // Applied To +// input group "XCHMA SC Style"; +// input int xCHMAScDrawWidth = 1; // Draw Width +// input ENUM_DRAW_TYPE xCHMAScDrawType = DRAW_LINE; // Draw Type +// input ENUM_LINE_STYLE xCHMAScDrawStyle = STYLE_SOLID; // Draw Style +// input color xCHMAScFastColor = clrLightBlue; // Fast Color +// input color xCHMAScSlowColor = clrLightSalmon; // Slow Color +// input group "XCHMA SC Drawings"; +// input bool xCHMAScDrawFast = true; // Draw Fast +// input bool xCHMAScDrawSlow = true; // Draw Slow +// input bool xCHMAScDrawCrosses = false; // Draw Cross Lines + +// +// Configurations ... +// +// Commons ... +bool xCHMADrawHotAreas = false; // Draw Hot Areas Symbol; +uchar xCHMAHotBullishArrowCode = 228; // Hot Bullish Arrow Code; +color xCHMAHotBullishArrowColor = clrAqua; // Hot Bullish Arrow Color; +uchar xCHMAHotBearishArrowCode = 230; // Hot Bearish Arrow Code; +color xCHMAHotBearishArrowColor = clrFuchsia; // Hot Bearish Arrow Color; + +// +// LC Inputs ... +int xCHMALcFastLength = 288; // Fast Length +int xCHMALcSlowLength = 576; // Slow Length +ENUM_MA_METHOD xCHMALcMethod = MODE_EMA; // Calculation Method +ENUM_APPLIED_PRICE xCHMALcAppliedTo = PRICE_CLOSE; // Applied To +int xCHMALcDrawWidth = 1; // Draw Width +ENUM_DRAW_TYPE xCHMALcDrawType = DRAW_LINE; // Draw Type +ENUM_LINE_STYLE xCHMALcDrawStyle = STYLE_DOT; // Draw Style +color xCHMALcFastColor = clrAqua; // Fast Color +color xCHMALcSlowColor = clrFuchsia; // Slow Color +bool xCHMALcDrawFast = true; // Draw Fast +bool xCHMALcDrawSlow = true; // Draw Slow +bool xCHMALcDrawCrosses = false; // Draw Cross Lines + +// +// MC Inputs ... +int xCHMAMcFastLength = 72; // Fast Length +int xCHMAMcSlowLength = 144; // Slow Length +ENUM_MA_METHOD xCHMAMcMethod = MODE_EMA; // Calculation Method +ENUM_APPLIED_PRICE xCHMAMcAppliedTo = PRICE_CLOSE; // Applied To +int xCHMAMcDrawWidth = 1; // Draw Width +ENUM_DRAW_TYPE xCHMAMcDrawType = DRAW_LINE; // Draw Type +ENUM_LINE_STYLE xCHMAMcDrawStyle = STYLE_DOT; // Draw Style +color xCHMAMcFastColor = clrLime; // Fast Color +color xCHMAMcSlowColor = clrRed; // Slow Color +bool xCHMAMcDrawFast = true; // Draw Fast +bool xCHMAMcDrawSlow = true; // Draw Slow +bool xCHMAMcDrawCrosses = false; // Draw Cross Lines + +// +// SC Inputs ... +int xCHMAScFastLength = 7; // Fast Length +int xCHMAScSlowLength = 14; // Slow Length +ENUM_MA_METHOD xCHMAScMethod = MODE_SMA; // Calculation Method +ENUM_APPLIED_PRICE xCHMAScAppliedTo = PRICE_CLOSE; // Applied To +int xCHMAScDrawWidth = 1; // Draw Width +ENUM_DRAW_TYPE xCHMAScDrawType = DRAW_LINE; // Draw Type +ENUM_LINE_STYLE xCHMAScDrawStyle = STYLE_SOLID; // Draw Style +color xCHMAScFastColor = clrLightBlue; // Fast Color +color xCHMAScSlowColor = clrLightSalmon; // Slow Color +bool xCHMAScDrawFast = true; // Draw Fast +bool xCHMAScDrawSlow = true; // Draw Slow +bool xCHMAScDrawCrosses = false; // Draw Cross Lines + +// +// END Inputs ... +// + +// +// START Definitions ... +// + +int xCHMAHandler = INVALID_HANDLE; +double xCHMALcFastBuffer[]; +double xCHMALcSlowBuffer[]; +double xCHMAMcFastBuffer[]; +double xCHMAMcSlowBuffer[]; +double xCHMAScFastBuffer[]; +double xCHMAScSlowBuffer[]; + +// +// END Definitions ... +// + +// +// START Handler Functions ... +// + +// +// Validate Inputs ... +bool XCHMAValidateInputs() +{ + // + bool result = false; + + // + result = + xCHMAScFastLength >= 2 && + xCHMAScSlowLength > xCHMAScFastLength && + xCHMAMcFastLength > xCHMAScSlowLength && + xCHMAMcSlowLength > xCHMAMcFastLength && + xCHMALcFastLength > xCHMAMcSlowLength && + xCHMALcSlowLength > xCHMALcFastLength; + + // + if (!result) + { + // + LogMessage("XCHMA Oscillator Inputs Validation Failed ..."); + } + + // + return result; +} + +// +// Init Oscillators ... +bool XCHMAInitHandlers() +{ + // + bool result = false; + + // + // Initialize Indicator/Oscillator Handlers ... + ResetLastError(); + + // + // XCHMA Handler ... + ArraySetAsSeries(xCHMALcFastBuffer, true); + ArraySetAsSeries(xCHMALcSlowBuffer, true); + ArraySetAsSeries(xCHMAMcFastBuffer, true); + ArraySetAsSeries(xCHMAMcSlowBuffer, true); + ArraySetAsSeries(xCHMAScFastBuffer, true); + ArraySetAsSeries(xCHMAScSlowBuffer, true); + xCHMAHandler = iCustom( + _Symbol, + _Period, + "x-saherelm.xchma.oscillator", + // + // Inputs ... + "", + xCHMADrawHotAreas, + xCHMAHotBullishArrowCode, + xCHMAHotBullishArrowColor, + xCHMAHotBearishArrowCode, + xCHMAHotBearishArrowColor, + // + // Long Cycle ... + "", + "", + xCHMALcFastLength, + xCHMALcSlowLength, + xCHMALcMethod, + xCHMALcAppliedTo, + "", + xCHMALcDrawWidth, + xCHMALcDrawType, + xCHMALcDrawStyle, + xCHMALcFastColor, + xCHMALcSlowColor, + "", + xCHMALcDrawFast, + xCHMALcDrawSlow, + xCHMALcDrawCrosses, + // + // Medium Cycle ... + "", + "", + xCHMAMcFastLength, + xCHMAMcSlowLength, + xCHMAMcMethod, + xCHMAMcAppliedTo, + "", + xCHMAMcDrawWidth, + xCHMAMcDrawType, + xCHMAMcDrawStyle, + xCHMAMcFastColor, + xCHMAMcSlowColor, + "", + xCHMAMcDrawFast, + xCHMAMcDrawSlow, + xCHMAMcDrawCrosses, + // + // Short Cycle ... + "", + "", + xCHMAScFastLength, + xCHMAScSlowLength, + xCHMAScMethod, + xCHMAScAppliedTo, + "", + xCHMAScDrawWidth, + xCHMAScDrawType, + xCHMAScDrawStyle, + xCHMAScFastColor, + xCHMAScSlowColor, + "", + xCHMAScDrawFast, + xCHMAScDrawSlow, + xCHMAScDrawCrosses); + if (xCHMAHandler == INVALID_HANDLE) + { + // + LogMessage("failed to Initialize XCHMA Oscillator: " + (string)GetLastError()); + return result; + } + + // + result = true; + + // + return result; +} + +// +// Release Oscillators ... +void XCHMAReleaseHandlers() +{ + IndicatorRelease(xCHMAHandler); +} + +// +// Handle Reading Buffers ... +void XCHMAReadBuffers( + int xCHMAItemsPerTick // Number Of Reading Buffer Items Per Tick +) +{ + // + // XCHMA Long Cycle ... + // + // XCHMA Fast ... + CopyBuffer( + xCHMAHandler, + X_XCHMA_LC_FAST_LINE, + 0, + xCHMAItemsPerTick, + xCHMALcFastBuffer); + + // + // XCHMA Slow ... + CopyBuffer( + xCHMAHandler, + X_XCHMA_LC_SLOW_LINE, + 0, + xCHMAItemsPerTick, + xCHMALcSlowBuffer); + + // + // XCHMA Medium Cycle ... + // + // XCHMA Fast ... + CopyBuffer( + xCHMAHandler, + X_XCHMA_MC_FAST_LINE, + 0, + xCHMAItemsPerTick, + xCHMAMcFastBuffer); + + // + // XCHMA Slow ... + CopyBuffer( + xCHMAHandler, + X_XCHMA_MC_SLOW_LINE, + 0, + xCHMAItemsPerTick, + xCHMAMcSlowBuffer); + + // + // XCHMA Short Cycle ... + // + // XCHMA Fast ... + CopyBuffer( + xCHMAHandler, + X_XCHMA_SC_FAST_LINE, + 0, + xCHMAItemsPerTick, + xCHMAScFastBuffer); + + // + // XCHMA Slow ... + CopyBuffer( + xCHMAHandler, + X_XCHMA_SC_SLOW_LINE, + 0, + xCHMAItemsPerTick, + xCHMAScSlowBuffer); +} + +// +// END Handler Funcions ... +// + +// +// START XCHMA Custom Functions ... +// + +// +// Retrieve Max Cycles Value ... +double XCHMAGetMax( + int bar_index // Specified Index ... +) +{ + // + double result = 0; + + // + // Validate Args ... + if (!XCHMAIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + // SC Fast ... + result = MathMax( + result, + xCHMAScFastBuffer[bar_index]); + + // + // SC Slow ... + result = MathMax( + result, + xCHMAScSlowBuffer[bar_index]); + + // + // MC Fast ... + result = MathMax( + result, + xCHMAMcFastBuffer[bar_index]); + + // + // MC Slow ... + result = MathMax( + result, + xCHMAMcSlowBuffer[bar_index]); + + // + // LC Fast ... + result = MathMax( + result, + xCHMALcFastBuffer[bar_index]); + + // + // LC Slow ... + result = MathMax( + result, + xCHMALcSlowBuffer[bar_index]); + + // + return result; +} + +// +// Retrieve Max Cycles Value ... +double XCHMAGetMin( + int bar_index // Specified Index ... +) +{ + // + double result = 0; + + // + // Validate Args ... + if (!XCHMAIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + result = xCHMAScFastBuffer[bar_index]; + + // + // SC Fast ... + result = MathMin( + result, + xCHMAScFastBuffer[bar_index]); + + // + // SC Slow ... + result = MathMin( + result, + xCHMAScSlowBuffer[bar_index]); + + // + // MC Fast ... + result = MathMin( + result, + xCHMAMcFastBuffer[bar_index]); + + // + // MC Slow ... + result = MathMin( + result, + xCHMAMcSlowBuffer[bar_index]); + + // + // LC Fast ... + result = MathMin( + result, + xCHMALcFastBuffer[bar_index]); + + // + // LC Slow ... + result = MathMin( + result, + xCHMALcSlowBuffer[bar_index]); + + // + return result; +} + +// +// Short Cycle Over Max Of Cycle Channels ... +bool XCHMAIsSCOverMax( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + // Validate Args ... + if ( + bar_index < 0 || + !XCHMAIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + double shortCycleMax1 = XCHMAGetCycleMaxValue( + bar_index, + X_XCHMA_CYCLE_SHORT); + + // + ENUM_XCHMA_CYCLES cycles[]; + Add( + X_XCHMA_CYCLE_MEDIUM, + cycles); + Add( + X_XCHMA_CYCLE_LONG, + cycles); + + // + double nonOfShortCycleMax1 = XCHMAGetCyclesMaxValue( + bar_index, + cycles); + + // + // Calculate Result ... + result = + // + shortCycleMax1 > nonOfShortCycleMax1 + // + ; + + // + return result; +} + +// +// Short Cycle Under Max Of Cycle Channels ... +bool XCHMAIsSCUnderMax( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + // Validate Args ... + if ( + bar_index < 0 || + !XCHMAIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + double shortCycleMin1 = XCHMAGetCycleMinValue( + bar_index, + X_XCHMA_CYCLE_SHORT); + + // + ENUM_XCHMA_CYCLES cycles[]; + Add( + X_XCHMA_CYCLE_MEDIUM, + cycles); + Add( + X_XCHMA_CYCLE_LONG, + cycles); + + // + double nonOfShortCycleMax1 = XCHMAGetCyclesMaxValue( + bar_index, + cycles); + + // + // Calculate Result ... + result = + // + shortCycleMin1 < nonOfShortCycleMax1 + // + ; + + // + return result; +} + +// +// Short Cycle Over Min Of Cycle Channels ... +bool XCHMAIsSCOverMin( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + // Validate Args ... + if ( + bar_index < 0 || + !XCHMAIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + double shortCycleMax1 = XCHMAGetCycleMaxValue( + bar_index, + X_XCHMA_CYCLE_SHORT); + + // + ENUM_XCHMA_CYCLES cycles[]; + Add( + X_XCHMA_CYCLE_MEDIUM, + cycles); + Add( + X_XCHMA_CYCLE_LONG, + cycles); + + // + double nonOfShortCycleMin1 = XCHMAGetCyclesMinValue( + bar_index, + cycles); + + // + // Calculate Result ... + result = + // + shortCycleMax1 > nonOfShortCycleMin1 + // + ; + + // + return result; +} + +// +// Short Cycle Under Min Of Cycle Channels ... +bool XCHMAIsSCUnderMin( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + // Validate Args ... + if ( + bar_index < 0 || + !XCHMAIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + double shortCycleMin1 = XCHMAGetCycleMinValue( + bar_index, + X_XCHMA_CYCLE_SHORT); + + // + ENUM_XCHMA_CYCLES cycles[]; + Add( + X_XCHMA_CYCLE_MEDIUM, + cycles); + Add( + X_XCHMA_CYCLE_LONG, + cycles); + + // + double nonOfShortCycleMin1 = XCHMAGetCyclesMinValue( + bar_index, + cycles); + + // + // Calculate Result ... + result = + // + shortCycleMin1 < nonOfShortCycleMin1 + // + ; + + // + return result; +} + +// +// Short Cycle Crossed Over Max Of Cycle Channels ... +bool XCHMAIsSCCrossedOverMax( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + // Validate Args ... + if ( + bar_index < 0 || + !XCHMAIsValidBuffersSize(bar_index + 2)) + { + return result; + } + + // + double shortCycleMin1 = XCHMAGetCycleMinValue( + bar_index, + X_XCHMA_CYCLE_SHORT); + double shortCycleMin2 = XCHMAGetCycleMinValue( + bar_index + 1, + X_XCHMA_CYCLE_SHORT); + + // + ENUM_XCHMA_CYCLES cycles[]; + Add( + X_XCHMA_CYCLE_MEDIUM, + cycles); + Add( + X_XCHMA_CYCLE_LONG, + cycles); + + // + double nonOfShortCycleMax1 = XCHMAGetCyclesMaxValue( + bar_index, + cycles); + double nonOfShortCycleMax2 = XCHMAGetCyclesMaxValue( + bar_index + 1, + cycles); + + // + // Calculate Result ... + result = + // + shortCycleMin1 > nonOfShortCycleMax1 && + shortCycleMin2 <= nonOfShortCycleMax2 + // + ; + + // + return result; +} + +// +// Short Cycle Crossed Under Max Of Cycle Channels ... +bool XCHMAIsSCCrossedUnderMax( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + // Validate Args ... + if ( + bar_index < 0 || + !XCHMAIsValidBuffersSize(bar_index + 2)) + { + return result; + } + + // + double shortCycleMax1 = XCHMAGetCycleMaxValue( + bar_index, + X_XCHMA_CYCLE_SHORT); + double shortCycleMax2 = XCHMAGetCycleMaxValue( + bar_index + 1, + X_XCHMA_CYCLE_SHORT); + + // + ENUM_XCHMA_CYCLES cycles[]; + Add( + X_XCHMA_CYCLE_MEDIUM, + cycles); + Add( + X_XCHMA_CYCLE_LONG, + cycles); + + // + double nonOfShortCycleMax1 = XCHMAGetCyclesMaxValue( + bar_index, + cycles); + double nonOfShortCycleMax2 = XCHMAGetCyclesMaxValue( + bar_index + 1, + cycles); + + // + // Calculate Result ... + result = + // + shortCycleMax1 < nonOfShortCycleMax1 && + shortCycleMax2 >= nonOfShortCycleMax2 + // + ; + + // + return result; +} + +// +// Short Cycle Crossed Over Min Of Cycle Channels ... +bool XCHMAIsSCCrossedOverMin( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + // Validate Args ... + if ( + bar_index < 0 || + !XCHMAIsValidBuffersSize(bar_index + 2)) + { + return result; + } + + // + double shortCycleMin1 = XCHMAGetCycleMinValue( + bar_index, + X_XCHMA_CYCLE_SHORT); + double shortCycleMin2 = XCHMAGetCycleMinValue( + bar_index + 1, + X_XCHMA_CYCLE_SHORT); + + // + ENUM_XCHMA_CYCLES cycles[]; + Add( + X_XCHMA_CYCLE_MEDIUM, + cycles); + Add( + X_XCHMA_CYCLE_LONG, + cycles); + + // + double nonOfShortCycleMin1 = XCHMAGetCyclesMinValue( + bar_index, + cycles); + double nonOfShortCycleMin2 = XCHMAGetCyclesMinValue( + bar_index + 1, + cycles); + + // + // Calculate Result ... + result = + // + shortCycleMin1 > nonOfShortCycleMin1 && + shortCycleMin2 <= nonOfShortCycleMin2 + // + ; + + // + return result; +} + +// +// Short Cycle Crossed Under Min Of Cycle Channels ... +bool XCHMAIsSCCrossedUnderMin( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + // Validate Args ... + if ( + bar_index < 0 || + !XCHMAIsValidBuffersSize(bar_index + 2)) + { + return result; + } + + // + double shortCycleMax1 = XCHMAGetCycleMaxValue( + bar_index, + X_XCHMA_CYCLE_SHORT); + double shortCycleMax2 = XCHMAGetCycleMaxValue( + bar_index + 1, + X_XCHMA_CYCLE_SHORT); + + // + ENUM_XCHMA_CYCLES cycles[]; + Add( + X_XCHMA_CYCLE_MEDIUM, + cycles); + Add( + X_XCHMA_CYCLE_LONG, + cycles); + + // + double nonOfShortCycleMin1 = XCHMAGetCyclesMinValue( + bar_index, + cycles); + double nonOfShortCycleMin2 = XCHMAGetCyclesMinValue( + bar_index + 1, + cycles); + + // + // Calculate Result ... + result = + // + shortCycleMax1 < nonOfShortCycleMin1 && + shortCycleMax2 >= nonOfShortCycleMin2 + // + ; + + // + return result; +} + +// +// Long Cycle ... +// + +// +// Check LC is Peak ... +bool XCHMAIsLCPeak( + int bar_index, // Specified Index ... + int length = 10 // Specified Length ... +) +{ + // + bool result = false; + + // + if ( + length <= 0 || + bar_index <= 0 || + !XCHMAIsValidBuffersSize(bar_index + length + 1)) + { + return result; + } + + // + result = IsIncreasing( + bar_index + length, + bar_index, + xCHMALcSlowBuffer + // + ); + + // + return result; +} + +// +// Check LC is Vale ... +bool XCHMAIsLCVale( + int bar_index, // Specified Index ... + int length = 10 // Specified Length ... +) +{ + // + bool result = false; + + // + if ( + length <= 0 || + bar_index <= 0 || + !XCHMAIsValidBuffersSize(bar_index + length + 1)) + { + return result; + } + + // + result = IsDecreasing( + bar_index + length, + bar_index, + xCHMALcSlowBuffer + // + ); + + // + return result; +} + +// +// Check LC Fast Crossed Over Slow ... +bool XCHMAIsLCFastCrossedOverSlow( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XCHMAIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + result = IsCrossOver( + xCHMALcFastBuffer, + xCHMALcSlowBuffer, + bar_index); + + // + return result; +} + +// +// Check LC Fast Over Slow ... +bool XCHMAIsLCFastOverSlow( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XCHMAIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + result = IsOver( + xCHMALcFastBuffer, + xCHMALcSlowBuffer, + bar_index); + + // + return result; +} + +// +// Check LC Fast Crossed Under Slow ... +bool XCHMAIsLCFastCrossedUnderSlow( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XCHMAIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + result = IsCrossUnder( + xCHMALcFastBuffer, + xCHMALcSlowBuffer, + bar_index); + + // + return result; +} + +// +// Check LC Fast Under Slow ... +bool XCHMAIsLCFastUnderSlow( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XCHMAIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + result = IsUnder( + xCHMALcFastBuffer, + xCHMALcSlowBuffer, + bar_index); + + // + return result; +} + +// +// Get Trend Power ... +double XCHMAGetLCTrendPower( + int bar_index // Specified Index ... +) +{ + // + double result = 0; + + // + if ( + bar_index <= 0 || + !XCHMAIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + result = + // + MathAbs(xCHMALcFastBuffer[bar_index] - xCHMALcSlowBuffer[bar_index]) + // + ; + + // + return result; +} + +// +// Check XTM TrendsDown or Up ... +bool XCHMAIsLCTrendsUp( + int bar_index, // Specified Index ... + int length = 10 // Specified Length ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XCHMAIsValidBuffersSize(bar_index + length + 2)) + { + return result; + } + + // + double trend1 = XCHMAGetLCTrendPower(bar_index); + + // + int trendsUpCount = 0; + int trendsDownCount = 0; + for (int i = bar_index + 1; i < bar_index + length + 1; i++) + { + // + double iPrevTrend = XCHMAGetLCTrendPower(i + 1); + double iTrend = XCHMAGetLCTrendPower(i); + + // + if ( + trend1 > iTrend && + iTrend >= iPrevTrend && + trend1 >= iPrevTrend) + { + trendsUpCount++; + } + else if ( + trend1 < iTrend && + iTrend <= iPrevTrend && + trend1 <= iPrevTrend) + { + trendsDownCount++; + } + } + + // + result = + // + trendsUpCount > trendsDownCount + // + ; + + // + return result; +} + +// +// Check XTM TrendsDown or Up ... +bool XCHMAIsLCTrendsDown( + int bar_index, // Specified Index ... + int length = 10 // Specified Length ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XCHMAIsValidBuffersSize(bar_index + length + 2)) + { + return result; + } + + // + double trend1 = XCHMAGetLCTrendPower(bar_index); + + // + int trendsUpCount = 0; + int trendsDownCount = 0; + for (int i = bar_index + 1; i < bar_index + length + 1; i++) + { + // + double iPrevTrend = XCHMAGetLCTrendPower(i + 1); + double iTrend = XCHMAGetLCTrendPower(i); + + // + if ( + trend1 > iTrend && + iTrend >= iPrevTrend && + trend1 >= iPrevTrend) + { + trendsUpCount++; + } + else if ( + trend1 < iTrend && + iTrend <= iPrevTrend && + trend1 <= iPrevTrend) + { + trendsDownCount++; + } + } + + // + result = + // + trendsDownCount > trendsUpCount + // + ; + + // + return result; +} + +// +// Medium Cycle ... +// + +// +// Check MC is Peak ... +bool XCHMAIsMCPeak( + int bar_index, // Specified Index ... + int length = 10 // Specified Length ... +) +{ + // + bool result = false; + + // + if ( + length <= 0 || + bar_index <= 0 || + !XCHMAIsValidBuffersSize(bar_index + length + 1)) + { + return result; + } + + // + result = IsIncreasing( + bar_index + length, + bar_index, + xCHMAMcSlowBuffer + // + ); + + // + return result; +} + +// +// Check MC is Vale ... +bool XCHMAIsMCVale( + int bar_index, // Specified Index ... + int length = 10 // Specified Length ... +) +{ + // + bool result = false; + + // + if ( + length <= 0 || + bar_index <= 0 || + !XCHMAIsValidBuffersSize(bar_index + length + 1)) + { + return result; + } + + // + result = IsDecreasing( + bar_index + length, + bar_index, + xCHMAMcSlowBuffer + // + ); + + // + return result; +} + +// +// Check MC Fast Crossed Over Slow ... +bool XCHMAIsMCFastCrossedOverSlow( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XCHMAIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + result = IsCrossOver( + xCHMAMcFastBuffer, + xCHMAMcSlowBuffer, + bar_index); + + // + return result; +} + +// +// Check MC Fast Over Slow ... +bool XCHMAIsMCFastOverSlow( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XCHMAIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + result = IsOver( + xCHMAMcFastBuffer, + xCHMAMcSlowBuffer, + bar_index); + + // + return result; +} + +// +// Check MC Fast Crossed Under Slow ... +bool XCHMAIsMCFastCrossedUnderSlow( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XCHMAIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + result = IsCrossUnder( + xCHMAMcFastBuffer, + xCHMAMcSlowBuffer, + bar_index); + + // + return result; +} + +// +// Check MC Fast Under Slow ... +bool XCHMAIsMCFastUnderSlow( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XCHMAIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + result = IsUnder( + xCHMAMcFastBuffer, + xCHMAMcSlowBuffer, + bar_index); + + // + return result; +} + +// +// Get Trend Power ... +double XCHMAGetMCTrendPower( + int bar_index // Specified Index ... +) +{ + // + double result = 0; + + // + if ( + bar_index <= 0 || + !XCHMAIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + result = + // + MathAbs(xCHMAMcFastBuffer[bar_index] - xCHMAMcSlowBuffer[bar_index]) + // + ; + + // + return result; +} + +// +// Check XTM TrendsDown or Up ... +bool XCHMAIsMCTrendsUp( + int bar_index, // Specified Index ... + int length = 10 // Specified Length ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XCHMAIsValidBuffersSize(bar_index + length + 2)) + { + return result; + } + + // + double trend1 = XCHMAGetMCTrendPower(bar_index); + + // + int trendsUpCount = 0; + int trendsDownCount = 0; + for (int i = bar_index + 1; i < bar_index + length + 1; i++) + { + // + double iPrevTrend = XCHMAGetMCTrendPower(i + 1); + double iTrend = XCHMAGetMCTrendPower(i); + + // + if ( + trend1 > iTrend && + iTrend >= iPrevTrend && + trend1 >= iPrevTrend) + { + trendsUpCount++; + } + else if ( + trend1 < iTrend && + iTrend <= iPrevTrend && + trend1 <= iPrevTrend) + { + trendsDownCount++; + } + } + + // + result = + // + trendsUpCount > trendsDownCount + // + ; + + // + return result; +} + +// +// Check XTM TrendsDown or Up ... +bool XCHMAIsMCTrendsDown( + int bar_index, // Specified Index ... + int length = 10 // Specified Length ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XCHMAIsValidBuffersSize(bar_index + length + 2)) + { + return result; + } + + // + double trend1 = XCHMAGetMCTrendPower(bar_index); + + // + int trendsUpCount = 0; + int trendsDownCount = 0; + for (int i = bar_index + 1; i < bar_index + length + 1; i++) + { + // + double iPrevTrend = XCHMAGetMCTrendPower(i + 1); + double iTrend = XCHMAGetMCTrendPower(i); + + // + if ( + trend1 > iTrend && + iTrend >= iPrevTrend && + trend1 >= iPrevTrend) + { + trendsUpCount++; + } + else if ( + trend1 < iTrend && + iTrend <= iPrevTrend && + trend1 <= iPrevTrend) + { + trendsDownCount++; + } + } + + // + result = + // + trendsDownCount > trendsUpCount + // + ; + + // + return result; +} + +// +// Short Cycle ... +// + +// +// Check SC is Peak ... +bool XCHMAIsSCPeak( + int bar_index, // Specified Index ... + int length = 10 // Specified Length ... +) +{ + // + bool result = false; + + // + if ( + length <= 0 || + bar_index <= 0 || + !XCHMAIsValidBuffersSize(bar_index + length + 1)) + { + return result; + } + + // + result = IsIncreasing( + bar_index + length, + bar_index, + xCHMAScSlowBuffer + // + ); + + // + return result; +} + +// +// Check SC is Vale ... +bool XCHMAIsSCVale( + int bar_index, // Specified Index ... + int length = 10 // Specified Length ... +) +{ + // + bool result = false; + + // + if ( + length <= 0 || + bar_index <= 0 || + !XCHMAIsValidBuffersSize(bar_index + length + 1)) + { + return result; + } + + // + result = IsDecreasing( + bar_index + length, + bar_index, + xCHMAScSlowBuffer + // + ); + + // + return result; +} + +// +// Check SC Fast Crossed Over Slow ... +bool XCHMAIsSCFastCrossedOverSlow( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XCHMAIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + result = IsCrossOver( + xCHMAScFastBuffer, + xCHMAScSlowBuffer, + bar_index); + + // + return result; +} + +// +// Check SC Fast Over Slow ... +bool XCHMAIsSCFastOverSlow( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XCHMAIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + result = IsOver( + xCHMAScFastBuffer, + xCHMAScSlowBuffer, + bar_index); + + // + return result; +} + +// +// Check SC Fast Crossed Under Slow ... +bool XCHMAIsSCFastCrossedUnderSlow( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XCHMAIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + result = IsCrossUnder( + xCHMAScFastBuffer, + xCHMAScSlowBuffer, + bar_index); + + // + return result; +} + +// +// Check SC Fast Under Slow ... +bool XCHMAIsSCFastUnderSlow( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XCHMAIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + result = IsUnder( + xCHMAScFastBuffer, + xCHMAScSlowBuffer, + bar_index); + + // + return result; +} + +// +// Get SC Trend Power ... +double XCHMAGetSCTrendPower( + int bar_index // Specified Index ... +) +{ + // + double result = 0; + + // + if ( + bar_index <= 0 || + !XCHMAIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + result = + // + MathAbs(xCHMAScFastBuffer[bar_index] - xCHMAScSlowBuffer[bar_index]) + // + ; + + // + return result; +} + +// +// Check SC Trends Up ... +bool XCHMAIsSCTrendsUp( + int bar_index, // Specified Index ... + int length = 10 // Specified Length ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XCHMAIsValidBuffersSize(bar_index + length + 2)) + { + return result; + } + + // + double trend1 = XCHMAGetSCTrendPower(bar_index); + + // + int trendsUpCount = 0; + int trendsDownCount = 0; + for (int i = bar_index + 1; i < bar_index + length + 1; i++) + { + // + double iPrevTrend = XCHMAGetSCTrendPower(i + 1); + double iTrend = XCHMAGetSCTrendPower(i); + + // + if ( + trend1 > iTrend && + iTrend >= iPrevTrend && + trend1 >= iPrevTrend) + { + trendsUpCount++; + } + else if ( + trend1 < iTrend && + iTrend <= iPrevTrend && + trend1 <= iPrevTrend) + { + trendsDownCount++; + } + } + + // + result = + // + trendsUpCount > trendsDownCount + // + ; + + // + return result; +} + +// +// Check SC Trends Down ... +bool XCHMAIsSCTrendsDown( + int bar_index, // Specified Index ... + int length = 10 // Specified Length ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XCHMAIsValidBuffersSize(bar_index + length + 2)) + { + return result; + } + + // + double trend1 = XCHMAGetSCTrendPower(bar_index); + + // + int trendsUpCount = 0; + int trendsDownCount = 0; + for (int i = bar_index + 1; i < bar_index + length + 1; i++) + { + // + double iPrevTrend = XCHMAGetSCTrendPower(i + 1); + double iTrend = XCHMAGetSCTrendPower(i); + + // + if ( + trend1 > iTrend && + iTrend >= iPrevTrend && + trend1 >= iPrevTrend) + { + trendsUpCount++; + } + else if ( + trend1 < iTrend && + iTrend <= iPrevTrend && + trend1 <= iPrevTrend) + { + trendsDownCount++; + } + } + + // + result = + // + trendsDownCount > trendsUpCount + // + ; + + // + return result; +} + +// +// Utility Functions ... +// + +// +// Check a Cycle is Over of Another ... +bool XCHMAIsCycleOverAnother( + int bar_index, // Specified Index ... + ENUM_XCHMA_CYCLES sourceCycle, // Specified Cycle ... + ENUM_XCHMA_CYCLES destCycle // Specified Cycle ... +) +{ + // + bool result = false; + + // + // Validate BufferSize ... + if ( + bar_index <= 0 || + !XCHMAIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + double sourceMinValue = XCHMAGetCycleMinValue(bar_index, sourceCycle); + double destMaxValue = XCHMAGetCycleMaxValue(bar_index, destCycle); + + // + result = + // + sourceMinValue > destMaxValue + // + ; + + // + return result; +} + +// +// Check a Cycle is Under of Another ... +bool XCHMAIsCycleUnderAnother( + int bar_index, // Specified Index ... + ENUM_XCHMA_CYCLES sourceCycle, // Specified Cycle ... + ENUM_XCHMA_CYCLES destCycle // Specified Cycle ... +) +{ + // + bool result = false; + + // + // Validate BufferSize ... + if ( + bar_index <= 0 || + !XCHMAIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + double sourceMaxValue = XCHMAGetCycleMaxValue(bar_index, sourceCycle); + double destMinValue = XCHMAGetCycleMinValue(bar_index, destCycle); + + // + result = + // + sourceMaxValue < destMinValue + // + ; + + // + return result; +} + +// +// Get Cycle Min Value ... +double XCHMAGetCycleMinValue( + int bar_index, // Specified Index ... + ENUM_XCHMA_CYCLES cycle // Specified Cycle ... +) +{ + // + double result = 0; + + // + // Validate BufferSize ... + if ( + bar_index <= 0 || + !XCHMAIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + switch (cycle) + { + // + case X_XCHMA_CYCLE_LONG: + result = MathMin( + xCHMALcFastBuffer[bar_index], + xCHMALcSlowBuffer[bar_index]); + break; + + // + case X_XCHMA_CYCLE_MEDIUM: + result = MathMin( + xCHMAMcFastBuffer[bar_index], + xCHMAMcSlowBuffer[bar_index]); + break; + + // + case X_XCHMA_CYCLE_SHORT: + result = MathMin( + xCHMAScFastBuffer[bar_index], + xCHMAScSlowBuffer[bar_index]); + break; + } + + // + return result; +} + +// +// Get Cycles Min Value ... +double XCHMAGetCyclesMinValue( + int bar_index, // Specified Index ... + ENUM_XCHMA_CYCLES &cycle[] // Specified Cycles ... +) +{ + // + double result = 0; + + // + // Validate Args ... + if ( + // + bar_index <= 0 || + ArraySize(cycle) <= 0 || + !XCHMAIsValidBuffersSize(bar_index + 1) + // + ) + { + return result; + } + + // + // Loop Through Cycles ... + for (int i = 0; i < ArraySize(cycle); i++) + { + // + ENUM_XCHMA_CYCLES iCycle = cycle[i]; + double iValue = XCHMAGetCycleMinValue( + bar_index, + iCycle); + + // + result = result == 0 || result > iValue ? iValue : result; + } + + // + return result; +} + +// +// Get Cycle Max Value ... +double XCHMAGetCycleMaxValue( + int bar_index, // Specified Index ... + ENUM_XCHMA_CYCLES cycle // Specified Cycle ... +) +{ + // + double result = 0; + + // + // Validate BufferSize ... + if ( + bar_index <= 0 || + !XCHMAIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + switch (cycle) + { + // + case X_XCHMA_CYCLE_LONG: + result = MathMax( + xCHMALcFastBuffer[bar_index], + xCHMALcSlowBuffer[bar_index]); + break; + + // + case X_XCHMA_CYCLE_MEDIUM: + result = MathMax( + xCHMAMcFastBuffer[bar_index], + xCHMAMcSlowBuffer[bar_index]); + break; + + // + case X_XCHMA_CYCLE_SHORT: + result = MathMax( + xCHMAScFastBuffer[bar_index], + xCHMAScSlowBuffer[bar_index]); + break; + } + + // + return result; +} + +// +// Get Cycles Max Value ... +double XCHMAGetCyclesMaxValue( + int bar_index, // Specified Index ... + ENUM_XCHMA_CYCLES &cycle[] // Specified Cycles ... +) +{ + // + double result = 0; + + // + // Validate Args ... + if ( + // + bar_index <= 0 || + ArraySize(cycle) <= 0 || + !XCHMAIsValidBuffersSize(bar_index + 1) + // + ) + { + return result; + } + + // + // Loop Through Cycles ... + for (int i = 0; i < ArraySize(cycle); i++) + { + // + ENUM_XCHMA_CYCLES iCycle = cycle[i]; + double iValue = XCHMAGetCycleMaxValue( + bar_index, + iCycle); + + // + result = result == 0 || result < iValue ? iValue : result; + } + + // + return result; +} + +// +// Check all Buffers has valid Size ... +bool XCHMAIsValidBuffersSize( + int size // the size of buffers which min size for requirements +) +{ + // + bool result = false; + + // + if ( + size <= 0 || + // + ArraySize(xCHMALcFastBuffer) < size || + ArraySize(xCHMALcSlowBuffer) < size || + // + ArraySize(xCHMAMcFastBuffer) < size || + ArraySize(xCHMAMcSlowBuffer) < size || + // + ArraySize(xCHMAScFastBuffer) < size || + ArraySize(xCHMAScSlowBuffer) < size + // + ) + { + result = false; + } + else + { + result = true; + } + + // + return result; +} + +// +// Add Specified Object to it's correspond Buffer ... +void Add( + ENUM_XCHMA_CYCLES item, + ENUM_XCHMA_CYCLES &buffer[]) +{ + // + ArrayResize( + buffer, + ArraySize(buffer) + 1); + + // + buffer[ArraySize(buffer) - 1] = item; +} + +// +// END XCHMA Custom Functions ... +// diff --git a/BKPS/OLD/XEU5-0/Helpers/x-saherelm.xfi.oscillator.helper.lib.mq5 b/BKPS/OLD/XEU5-0/Helpers/x-saherelm.xfi.oscillator.helper.lib.mq5 new file mode 100644 index 0000000..19d3417 --- /dev/null +++ b/BKPS/OLD/XEU5-0/Helpers/x-saherelm.xfi.oscillator.helper.lib.mq5 @@ -0,0 +1,358 @@ +///////////////////////////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 XFI Oscillator Helper for Signal Providers +// -------------------------------------------------------------------------- +// +// 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 + +// +// Includes ... +#include "../Libraries/x-saherelm.log.lib.mq5" +#include "../Libraries/x-saherelm.common.lib.mq5" + +// +// START Enum Definitions ... +// + +// +// END Enum Definitions ... +// + +// +// START Inputs ... +// + +// input group "XFI Oscillator"; + +// // +// input int xFILength = 18; // Market Length +// input ENUM_MA_METHOD xFIMethod = MODE_SMA; // MA Method +// input ENUM_APPLIED_VOLUME xFIAppliedTo = VOLUME_TICK; // Applied To + +// +// Configurations ... +int xFILength = 18; // Market Length +ENUM_MA_METHOD xFIMethod = MODE_SMA; // MA Method +ENUM_APPLIED_VOLUME xFIAppliedTo = VOLUME_TICK; // Applied To + +// +// END Inputs ... +// + +// +// START Definitions ... +// + +int xFIHandler = INVALID_HANDLE; +double xFIBuffer[]; + +// +// END Definitions ... +// + +// +// START Handler Functions ... +// + +// +// Validate Inputs ... +bool XFIValidateInputs() +{ + // + bool result = false; + + // + result = xFILength > 2; + + // + if (!result) + { + // + LogMessage("XFI Oscillator Inputs Validation Failed ..."); + } + + // + return result; +} + +// +// Init Oscillators ... +bool XFIInitHandlers() +{ + // + bool result = false; + + // + // Initialize Indicator/Oscillator Handlers ... + ResetLastError(); + + // + // XFI Handler ... + ArraySetAsSeries(xFIBuffer, true); + xFIHandler = iCustom( + _Symbol, + _Period, + "x-saherelm.xfi.oscillator", + // + // Inputs ... + xFILength, + xFIMethod, + xFIAppliedTo + // + ); + if (xFIHandler == INVALID_HANDLE) + { + // + LogMessage("failed to Initialize XFI Oscillator: " + (string)GetLastError()); + return result; + } + + // + result = true; + + // + return result; +} + +// +// Release Oscillators ... +void XFIReleaseHandlers() +{ + IndicatorRelease(xFIHandler); +} + +// +// Handle Reading Buffers ... +void XFIReadBuffers( + int xFIItemsPerTick // Number Of Reading Buffer Items Per Tick +) +{ + // + // XFI Signal ... + CopyBuffer( + xFIHandler, + 0, + 0, + xFIItemsPerTick, + xFIBuffer); +} + +// +// END Handler Funcions ... +// + +// +// START XFI Custom Functions ... +// + +// +// Check SC is Peak ... +bool XFIIsPeak( + int bar_index, // Specified Index ... + int length = 10 // Specified Length ... +) +{ + // + bool result = false; + + // + if ( + length <= 0 || + bar_index <= 0 || + !XFIIsValidBuffersSize(bar_index + length + 1)) + { + return result; + } + + // + // Must Decreasing ... + bool isIncreasing = IsIncreasing( + bar_index + length, + bar_index, + xFIBuffer + // + ); + + // + return result; +} + +// +// Check SC is Vale ... +bool XFIIsVale( + int bar_index, // Specified Index ... + int length = 10 // Specified Length ... +) +{ + // + bool result = false; + + // + if ( + length <= 0 || + bar_index <= 0 || + !XFIIsValidBuffersSize(bar_index + length + 1)) + { + return result; + } + + // + result = IsDecreasing( + bar_index + length, + bar_index, + xFIBuffer + // + ); + + // + return result; +} + +// +// Detect XFI Crossed Over Zero ... +bool XFIIsCrossedOverZero( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + // Validate Args ... + if ( + bar_index < 0 || + !XFIIsValidBuffersSize(bar_index + 2)) + { + return result; + } + + // + result = + xFIBuffer[bar_index] > 0 && + xFIBuffer[bar_index + 1] <= 0; + + // + return result; +} + +// +// Detect XFI Over Zero ... +bool XFIIsOverZero( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + // Validate Args ... + if ( + bar_index < 0 || + !XFIIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + result = + xFIBuffer[bar_index] > 0; + + // + return result; +} + +// +// Detect XFI Crossed Under Zero ... +bool XFIIsCrossedUnderZero( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + // Validate Args ... + if ( + bar_index < 0 || + !XFIIsValidBuffersSize(bar_index + 2)) + { + return result; + } + + // + result = + xFIBuffer[bar_index] < 0 && + xFIBuffer[bar_index + 1] >= 0; + + // + return result; +} + +// +// Detect XFI Under Zero ... +bool XFIIsUnderZero( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + // Validate Args ... + if ( + bar_index < 0 || + !XFIIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + result = + xFIBuffer[bar_index] < 0; + + // + return result; +} + +// +// Check all Buffers has valid Size ... +bool XFIIsValidBuffersSize( + int size // the size of buffers which min size for requirements +) +{ + // + bool result = false; + + // + if ( + size <= 0 || + // + ArraySize(xFIBuffer) < size + // + ) + { + result = false; + } + else + { + result = true; + } + + // + return result; +} + +// +// END XFI Custom Functions ... +// diff --git a/BKPS/OLD/XEU5-0/Helpers/x-saherelm.xlh.indicator.helper.lib.mq5 b/BKPS/OLD/XEU5-0/Helpers/x-saherelm.xlh.indicator.helper.lib.mq5 new file mode 100644 index 0000000..e6a92f6 --- /dev/null +++ b/BKPS/OLD/XEU5-0/Helpers/x-saherelm.xlh.indicator.helper.lib.mq5 @@ -0,0 +1,668 @@ +///////////////////////////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 XLH Indicator Helper for Signal Providers +// -------------------------------------------------------------------------- +// +// 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 + +// +// Includes ... +#include "../Libraries/x-saherelm.log.lib.mq5" +#include "../Libraries/x-saherelm.common.lib.mq5" + +// +// START Enum Definitions ... +// + +// +// XLH Indicator Buffer Lines ... +enum ENUM_X_XLH_BUFFER_LINES +{ + X_XLH_HH_LINE = 0, + X_XLH_LL_LINE = 1, + X_XLH_SIGNAL_LINE = 2, +}; + +// +// END Enum Definitions ... +// + +// +// START Inputs ... +// + +// input group "XLH Indicator"; + +// input int xLHLength = 72; // Length +// input ENUM_SERIESMODE xLHHHMode = MODE_HIGH; // Highest High Calculation Method +// input ENUM_SERIESMODE xLHLLMode = MODE_LOW; // Lowest Low Calculation Method + +// +// Configurations ... +int xLHLength = 72; // Length +ENUM_SERIESMODE xLHHHMode = MODE_HIGH; // Highest High Calculation Method +ENUM_SERIESMODE xLHLLMode = MODE_LOW; // Lowest Low Calculation Method + +// +// END Inputs ... +// + +// +// START Definitions ... +// + +// +int xLHHandler = INVALID_HANDLE; + +// +double xLHHHBuffer[]; +double xLHLLBuffer[]; +double xLHSignalBuffer[]; + +// +// END Definitions ... +// + +// +// START Handler Functions ... +// + +// +// Validate Inputs ... +bool XLHValidateInputs() +{ + // + bool result = false; + + // + result = xLHLength >= 2; + + // + if (!result) + { + // + LogMessage("XLH Indicator Inputs Validation Failed ..."); + } + + // + return result; +} + +// +// Init Indicators ... +bool XLHInitHandlers() +{ + // + bool result = false; + + // + // Initialize Indicator/Oscillator Handlers ... + ResetLastError(); + + // + // XLH Handler ... + ArraySetAsSeries(xLHHHBuffer, true); + ArraySetAsSeries(xLHLLBuffer, true); + ArraySetAsSeries(xLHSignalBuffer, true); + + // + xLHHandler = iCustom( + _Symbol, + _Period, + "x-saherelm.xlh.indicator", + // + // Inputs ... + xLHLength, + xLHHHMode, + xLHLLMode + // + ); + if (xLHHandler == INVALID_HANDLE) + { + // + LogMessage("failed to Initialize XLH Indicator: " + (string)GetLastError()); + return result; + } + + // + result = true; + + // + return result; +} + +// +// Release Indicators ... +void XLHReleaseHandlers() +{ + IndicatorRelease(xLHHandler); +} + +// +// Handle Reading Buffers ... +void XLHReadBuffers( + int xLHItemsPerTick // Number Of Reading Buffer Items Per Tick +) +{ + // + // HH Buffer ... + CopyBuffer( + xLHHandler, + X_XLH_HH_LINE, + 0, + xLHItemsPerTick, + xLHHHBuffer + // + ); + + // + // LL Buffer ... + CopyBuffer( + xLHHandler, + X_XLH_LL_LINE, + 0, + xLHItemsPerTick, + xLHLLBuffer + // + ); + + // + // Signal Buffer ... + CopyBuffer( + xLHHandler, + X_XLH_SIGNAL_LINE, + 0, + xLHItemsPerTick, + xLHSignalBuffer + // + ); +} + +// +// END Handler Funcions ... +// + +// +// START XLH Custom Functions ... +// + +// +// TODO: What we have to Implement ... +// - [] + +// +// Check Candle High is HH ... +bool XLHIsHighAttachedHH( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XLHIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + XOHCL candle = GetCandle(bar_index); + + // + result = + // + candle.high == xLHHHBuffer[bar_index] + // + ; + + // + return result; +} + +// +// Check Candle Low is LL ... +bool XLHIsLowAttachedLL( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XLHIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + XOHCL candle = GetCandle(bar_index); + + // + result = + // + candle.low == xLHLLBuffer[bar_index] + // + ; + + // + return result; +} + +// +// Check Price Jumping Up Signal ... +bool XLHIsPriceCrossedOverSignal( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XLHIsValidBuffersSize(bar_index + 2)) + { + return result; + } + + // + XOHCL candle1 = GetCandle(bar_index); + XOHCL candle2 = GetCandle(bar_index + 1); + + // + result = + // + candle1.low > xLHSignalBuffer[bar_index] && + candle2.low < xLHSignalBuffer[bar_index + 1] + // + ; + + // + return result; +} + +// +// Check Price Over Signal ... +bool XLHIsPriceOverSignal( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XLHIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + XOHCL candle1 = GetCandle(bar_index); + + // + result = + // + candle1.low > xLHSignalBuffer[bar_index] + // + ; + + // + return result; +} + +// +// Check Price Jumping Down Signal ... +bool XLHIsPriceCrossedUnderSignal( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XLHIsValidBuffersSize(bar_index + 2)) + { + return result; + } + + // + XOHCL candle1 = GetCandle(bar_index); + XOHCL candle2 = GetCandle(bar_index + 1); + + // + result = + // + candle1.high < xLHSignalBuffer[bar_index] && + candle2.high > xLHSignalBuffer[bar_index + 1] + // + ; + + // + return result; +} + +// +// Check Price Down Signal ... +bool XLHIsPriceUnderSignal( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XLHIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + XOHCL candle1 = GetCandle(bar_index); + + // + result = + // + candle1.high < xLHSignalBuffer[bar_index] + // + ; + + // + return result; +} + +// +// Check Price Ranging Signal ... +bool XLHIsPriceInSignalRange( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XLHIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + XOHCL candle1 = GetCandle(bar_index); + + // + result = + // + candle1.high > xLHSignalBuffer[bar_index] && + candle1.low < xLHSignalBuffer[bar_index] + // + ; + + // + return result; +} + +// +// Check HH Increased ... +bool XLHIsHHIncreased( + int bar_index, // Specified Index ... + int length = 10 // Specified Length ... +) +{ + // + bool result = false; + + // + if ( + length <= 0 || + bar_index <= 0 || + !XLHIsValidBuffersSize(bar_index + length + 1)) + { + return result; + } + + // + result = IsIncreasing( + bar_index + length, + bar_index, + xLHHHBuffer + // + ); + + // + return result; +} + +// +// Check HH Decreased ... +bool XLHIsHHDecreased( + int bar_index, // Specified Index ... + int length = 10 // Specified Length ... +) +{ + // + bool result = false; + + // + if ( + length <= 0 || + bar_index <= 0 || + !XLHIsValidBuffersSize(bar_index + length + 1)) + { + return result; + } + + // + result = IsDecreasing( + bar_index + length, + bar_index, + xLHHHBuffer + // + ); + + // + return result; +} + +// +// Check LL Increased ... +bool XLHIsLLIncreased( + int bar_index, // Specified Index ... + int length = 10 // Specified Length ... +) +{ + // + bool result = false; + + // + if ( + length <= 0 || + bar_index <= 0 || + !XLHIsValidBuffersSize(bar_index + length + 1)) + { + return result; + } + + // + result = IsIncreasing( + bar_index + length, + bar_index, + xLHLLBuffer + // + ); + + // + return result; +} + +// +// Check LL Decreased ... +bool XLHIsLLDecreased( + int bar_index, // Specified Index ... + int length = 10 // Specified Length ... +) +{ + // + bool result = false; + + // + if ( + length <= 0 || + bar_index <= 0 || + !XLHIsValidBuffersSize(bar_index + length + 1)) + { + return result; + } + + // + result = IsDecreasing( + bar_index + length, + bar_index, + xLHLLBuffer + // + ); + + // + return result; +} + +// +// Check HH Same in Length ... +bool XLHIsHHSameInLength( + int bar_index, // Specified Index ... + int length = 5 // Specified Length ... +) +{ + // + bool result = false; + + // + if ( + length <= 0 || + bar_index <= 0 || + !XLHIsValidBuffersSize(bar_index + length + 1)) + { + return result; + } + + // + double value1 = xLHHHBuffer[bar_index]; + + // + // Loop ... + result = true; + for (int i = bar_index + 1; i < bar_index + length + 1; i++) + { + // + double iValue = xLHHHBuffer[i]; + if (iValue != value1) + { + // + result = false; + + // + break; + } + } + + // + return result; +} + +// +// Check LL Same in Length ... +bool XLHIsLLSameInLength( + int bar_index, // Specified Index ... + int length = 5 // Specified Length ... +) +{ + // + bool result = false; + + // + if ( + length <= 0 || + bar_index <= 0 || + !XLHIsValidBuffersSize(bar_index + length + 1)) + { + return result; + } + + // + double value1 = xLHLLBuffer[bar_index]; + + // + // Loop ... + result = true; + for (int i = bar_index + 1; i < bar_index + length + 1; i++) + { + // + double iValue = xLHLLBuffer[i]; + if (iValue != value1) + { + // + result = false; + + // + break; + } + } + + // + return result; +} + +// +// Check all Buffers has valid Size ... +bool XLHIsValidBuffersSize( + int size // the size of buffers which min size for requirements +) +{ + // + bool result = false; + + // + if ( + size <= 0 || + // + ArraySize(xLHHHBuffer) < size || + ArraySize(xLHLLBuffer) < size || + ArraySize(xLHSignalBuffer) < size + // + ) + { + result = false; + } + else + { + result = true; + } + + // + return result; +} + +// +// END XLH Custom Functions ... +// diff --git a/BKPS/OLD/XEU5-0/Helpers/x-saherelm.xobd.indicator.helper.lib.mq5 b/BKPS/OLD/XEU5-0/Helpers/x-saherelm.xobd.indicator.helper.lib.mq5 new file mode 100644 index 0000000..f90f15b --- /dev/null +++ b/BKPS/OLD/XEU5-0/Helpers/x-saherelm.xobd.indicator.helper.lib.mq5 @@ -0,0 +1,249 @@ +///////////////////////////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 XOBD Indicator Helper for Signal Providers +// -------------------------------------------------------------------------- +// +// 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 + +// +// Includes ... +#include "../Libraries/x-saherelm.log.lib.mq5" +#include "../Libraries/x-saherelm.common.lib.mq5" + +// +// START Enum Definitions ... +// + +// +// END Enum Definitions ... +// + +// +// START Inputs ... +// + +// input group "XOBD Indicator"; + +// input int xOBDLength = 5; // Swing Length +// input uchar xOBDSwingHighArrowCode = 108; // Swing High Arrow Code +// input color xOBDSwingHighArrowColor = clrMagenta; // Swing High Arrow Color +// input uchar xOBDSwingLowArrowCode = 108; // Swing Low Arrow Code +// input color xOBDSwingLowArrowColor = clrAqua; // Swing Low Arrow Color + +// +// Configurations ... +int xOBDLength = 5; // Swing Length +uchar xOBDSwingHighArrowCode = 108; // Swing High Arrow Code +color xOBDSwingHighArrowColor = clrMagenta; // Swing High Arrow Color +uchar xOBDSwingLowArrowCode = 108; // Swing Low Arrow Code +color xOBDSwingLowArrowColor = clrAqua; // Swing Low Arrow Color + +// +// END Inputs ... +// + +// +// START Definitions ... +// + +// +int xOBDHandler = INVALID_HANDLE; + +// +double xOBDBuffer[]; + +// +// END Definitions ... +// + +// +// START Handler Functions ... +// + +// +// Validate Inputs ... +bool XOBDValidateInputs() +{ + // + bool result = false; + + // + result = xOBDLength >= 2; + + // + if (!result) + { + // + LogMessage("XOBD Indicator Inputs Validation Failed ..."); + } + + // + return result; +} + +// +// Init Indicators ... +bool XOBDInitHandlers() +{ + // + bool result = false; + + // + // Initialize Indicator/Oscillator Handlers ... + ResetLastError(); + + // + // XOBD Handler ... + ArraySetAsSeries(xOBDBuffer, true); + + // + xOBDHandler = iCustom( + _Symbol, + _Period, + "x-saherelm.xobd.indicator", + // + // Inputs ... + xOBDLength, + xOBDSwingHighArrowCode, + xOBDSwingHighArrowColor, + xOBDSwingLowArrowCode, + xOBDSwingLowArrowColor + // + ); + if (xOBDHandler == INVALID_HANDLE) + { + // + LogMessage("failed to Initialize XOBD Indicator: " + (string)GetLastError()); + return result; + } + + // + result = true; + + // + return result; +} + +// +// Release Indicators ... +void XOBDReleaseHandlers() +{ + IndicatorRelease(xOBDHandler); +} + +// +// Handle Reading Buffers ... +void XOBDReadBuffers( + int xOBDItemsPerTick // Number Of Reading Buffer Items Per Tick +) +{ + // + // OBD Buffer ... + CopyBuffer( + xOBDHandler, + 0, + 0, + xOBDItemsPerTick, + xOBDBuffer + // + ); +} + +// +// END Handler Funcions ... +// + +// +// START XOBD Custom Functions ... +// + +// +// Check is Swing Low Occured or not ... +bool XOBDIsSwingLow( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XOBDIsValidBuffersSize(bar_index + 2)) + { + return result; + } + + // + result = xOBDBuffer[bar_index] == X_SWING_LOW; + + // + return result; +} + +// +// Check is Swing High Occured or not ... +bool XOBDIsSwingHigh( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XOBDIsValidBuffersSize(bar_index + 2)) + { + return result; + } + + // + result = xOBDBuffer[bar_index] == X_SWING_HIGH; + + // + return result; +} + +// +// Check all Buffers has valid Size ... +bool XOBDIsValidBuffersSize( + int size // the size of buffers which min size for requirements +) +{ + // + bool result = false; + + // + if ( + size <= 0 || + // + ArraySize(xOBDBuffer) < size + // + ) + { + result = false; + } + else + { + result = true; + } + + // + return result; +} + +// +// END XOBD Custom Functions ... +// diff --git a/BKPS/OLD/XEU5-0/Helpers/x-saherelm.xrsi.oscillator.helper.lib.mq5 b/BKPS/OLD/XEU5-0/Helpers/x-saherelm.xrsi.oscillator.helper.lib.mq5 new file mode 100644 index 0000000..e6971b7 --- /dev/null +++ b/BKPS/OLD/XEU5-0/Helpers/x-saherelm.xrsi.oscillator.helper.lib.mq5 @@ -0,0 +1,433 @@ +///////////////////////////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 XRSI Oscillator Helper for Signal Providers +// -------------------------------------------------------------------------- +// +// 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 + +// +// Includes ... +#include "../Libraries/x-saherelm.log.lib.mq5" +#include "../Libraries/x-saherelm.common.lib.mq5" + +// +// START Enum Definitions ... +// + +// +// XRSI Oscillator Buffer Lines ... +// + +// +// END Enum Definitions ... +// + +// +// START Inputs ... +// + +// input group "XRSI Oscillator"; + +// // +// input group "XRSI Market"; +// input int xRSILength = 18; // Market Length +// input ENUM_APPLIED_PRICE xRSIAppliedTo = PRICE_OPEN; // Applied To + +// // +// input group "XRSI Short Entry"; +// input double xRSIShortEntryValue = 70; // Short Entry Level +// input color xRSIShortEntryColor = clrRed; // Short Entry Level Color +// input ENUM_LINE_STYLE xRSIShortEntryLineStyle = STYLE_SOLID; // Short Entry Style + +// // +// input group "XRSI Short Exit"; +// input double xRSIShortExitValue = 40; // Short Exit Level +// input color xRSIShortExitColor = clrRed; // Short Exit Level Color +// input ENUM_LINE_STYLE xRSIShortExitLineStyle = STYLE_DOT; // Short Exit Style + +// // +// input group "XRSI Long Entry"; +// input double xRSILongEntryValue = 30; // Long Entry Level +// input color xRSILongEntryColor = clrRed; // Long Entry Level Color +// input ENUM_LINE_STYLE xRSILongEntryLineStyle = STYLE_SOLID; // Long Entry Style + +// // +// input group "XRSI Long Exit"; +// input double xRSILongExitValue = 60; // Long Exit Level +// input color xRSILongExitColor = clrRed; // Long Exit Level Color +// input ENUM_LINE_STYLE xRSILongExitLineStyle = STYLE_DOT; // Long Exit Style + +// +// Configurations ... +int xRSILength = 18; // Market Length +ENUM_APPLIED_PRICE xRSIAppliedTo = PRICE_OPEN; // Applied To + +// +double xRSIShortEntryValue = 70; // Short Entry Level +color xRSIShortEntryColor = clrRed; // Short Entry Level Color +ENUM_LINE_STYLE xRSIShortEntryLineStyle = STYLE_SOLID; // Short Entry Style + +// +double xRSIShortExitValue = 40; // Short Exit Level +color xRSIShortExitColor = clrRed; // Short Exit Level Color +ENUM_LINE_STYLE xRSIShortExitLineStyle = STYLE_DOT; // Short Exit Style + +// +double xRSILongEntryValue = 30; // Long Entry Level +color xRSILongEntryColor = clrRed; // Long Entry Level Color +ENUM_LINE_STYLE xRSILongEntryLineStyle = STYLE_SOLID; // Long Entry Style + +// +double xRSILongExitValue = 60; // Long Exit Level +color xRSILongExitColor = clrRed; // Long Exit Level Color +ENUM_LINE_STYLE xRSILongExitLineStyle = STYLE_DOT; // Long Exit Style + +// +// END Inputs ... +// + +// +// START Definitions ... +// + +int xRSIHandler = INVALID_HANDLE; +double xRSIBuffer[]; + +// +// END Definitions ... +// + +// +// START Handler Functions ... +// + +// +// Validate Inputs ... +bool XRSIValidateInputs() +{ + // + bool result = false; + + // + result = + xRSILongEntryValue < xRSILongExitValue && + xRSIShortEntryValue > xRSIShortExitValue && + xRSIShortEntryValue > xRSILongExitValue && + xRSIShortExitValue < xRSILongExitValue; + + // + if (!result) + { + // + LogMessage("XRSI Oscillator Inputs Validation Failed ..."); + } + + // + return result; +} + +// +// Init Oscillators ... +bool XRSIInitHandlers() +{ + // + bool result = false; + + // + // Initialize Indicator/Oscillator Handlers ... + ResetLastError(); + + // + // XRSI Handler ... + ArraySetAsSeries(xRSIBuffer, true); + xRSIHandler = iCustom( + _Symbol, + _Period, + "x-saherelm.xrsi.oscillator", + // + // Inputs ... + // + // Market ... + "", + xRSILength, + xRSIAppliedTo, + // + // Short Entry ... + "", + xRSIShortEntryValue, + xRSIShortEntryColor, + xRSIShortEntryLineStyle, + // + // Short Exit ... + "", + xRSIShortExitValue, + xRSIShortExitColor, + xRSIShortExitLineStyle, + // + // Long Entry ... + "", + xRSILongEntryValue, + xRSILongEntryColor, + xRSILongEntryLineStyle, + // + // Long Exit ... + "", + xRSILongExitValue, + xRSILongExitColor, + xRSILongExitLineStyle + // + ); + if (xRSIHandler == INVALID_HANDLE) + { + // + LogMessage("failed to Initialize XRSI Oscillator: " + (string)GetLastError()); + return result; + } + + // + result = true; + + // + return result; +} + +// +// Release Oscillators ... +void XRSIReleaseHandlers() +{ + IndicatorRelease(xRSIHandler); +} + +// +// Handle Reading Buffers ... +void XRSIReadBuffers( + int xRSIItemsPerTick // Number Of Reading Buffer Items Per Tick +) +{ + // + // XRSI Signal ... + CopyBuffer( + xRSIHandler, + 0, + 0, + xRSIItemsPerTick, + xRSIBuffer); +} + +// +// END Handler Funcions ... +// + +// +// START XRSI Custom Functions ... +// + +// +// Check SC is Peak ... +bool XRSIIsPeak( + int bar_index, // Specified Index ... + int length = 10 // Specified Length ... +) +{ + // + bool result = false; + + // + if ( + length <= 0 || + bar_index <= 0 || + !XRSIIsValidBuffersSize(bar_index + length + 1)) + { + return result; + } + + // + // Must Decreasing ... + bool isIncreasing = IsIncreasing( + bar_index + length, + bar_index, + xRSIBuffer + // + ); + + // + return result; +} + +// +// Check SC is Vale ... +bool XRSIIsVale( + int bar_index, // Specified Index ... + int length = 10 // Specified Length ... +) +{ + // + bool result = false; + + // + if ( + length <= 0 || + bar_index <= 0 || + !XRSIIsValidBuffersSize(bar_index + length + 1)) + { + return result; + } + + // + result = IsDecreasing( + bar_index + length, + bar_index, + xRSIBuffer + // + ); + + // + return result; +} + +// +// RSI Value GO Up from Long Entry ... +bool XRSIIsCrossedOverLongEntry( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XRSIIsValidBuffersSize(bar_index + 2)) + { + return result; + } + + // + result = + xRSIBuffer[bar_index + 1] > xRSILongEntryValue && + xRSIBuffer[bar_index + 2] <= xRSILongEntryValue; + + // + return result; +} + +// +// RSI Value GO Up from Long Exit ... +bool XRSIIsCrossedOverLongExit( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XRSIIsValidBuffersSize(bar_index + 2)) + { + return result; + } + + // + result = + xRSIBuffer[bar_index + 1] > xRSILongExitValue && + xRSIBuffer[bar_index + 2] <= xRSILongExitValue; + + // + return result; +} + +// +// RSI Value Go Down Short Entry ... +bool XRSIIsCrossedUnderShortEntry( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XRSIIsValidBuffersSize(bar_index + 2)) + { + return result; + } + + // + result = + xRSIBuffer[bar_index + 1] < xRSIShortEntryValue && + xRSIBuffer[bar_index + 2] >= xRSIShortEntryValue; + + // + return result; +} + +// +// RSI Value Go Down Short Exit ... +bool XRSIIsCrossedUnderShortExit( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XRSIIsValidBuffersSize(bar_index + 2)) + { + return result; + } + + // + result = + xRSIBuffer[bar_index + 1] < xRSIShortExitValue && + xRSIBuffer[bar_index + 2] >= xRSIShortExitValue; + + // + return result; +} + +// +// Check all Buffers has valid Size ... +bool XRSIIsValidBuffersSize( + int size // the size of buffers which min size for requirements +) +{ + // + bool result = false; + + // + if ( + size <= 0 || + // + ArraySize(xRSIBuffer) < size + // + ) + { + result = false; + } + else + { + result = true; + } + + // + return result; +} + +// +// END XRSI Custom Functions ... +// diff --git a/BKPS/OLD/XEU5-0/Helpers/x-saherelm.xtd.oscillator.helper.lib.mq5 b/BKPS/OLD/XEU5-0/Helpers/x-saherelm.xtd.oscillator.helper.lib.mq5 new file mode 100644 index 0000000..6286228 --- /dev/null +++ b/BKPS/OLD/XEU5-0/Helpers/x-saherelm.xtd.oscillator.helper.lib.mq5 @@ -0,0 +1,931 @@ +///////////////////////////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 XTD Oscillator Helper for Signal Providers +// -------------------------------------------------------------------------- +// +// 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 + +// +// Includes ... +#include "../Libraries/x-saherelm.log.lib.mq5" +#include "../Libraries/x-saherelm.common.lib.mq5" + +// +// START Enum Definitions ... +// + +// +// XTD Oscillator States ... +enum ENUM_X_XTD_STATES +{ + X_XTD_BULLISH_CROSSED_OVER_BEARISH = 2, + X_XTD_BULLISH_OVER_BEARISH = 1, + X_XTD_NEUTURAL = 0, + X_XTD_BULLISH_UNDER_BEARISH = -1, + X_XTD_BULLISH_CROSSED_UNDER_BEARISH = -2 +}; + +// +// XTD Oscillator Buffer Lines ... +enum ENUM_X_XTD_BUFFER_LINES +{ + X_XTD_BULLISH_POWER_LINE = 0, + X_XTD_BEARISH_POWER_LINE = 1, + X_XTD_SIGNAL_LINE = 2, +}; + +// +// END Enum Definitions ... +// + +// +// START Inputs ... +// + +// input group "XTD Oscillator"; + +// input int xTDLength = 18; // Market Length +// input bool xTDDrawCrosses = false; // Draw Cross Arrows +// input uchar xTDBullishArrowCode = 228; // Cross Over Arrow Code +// input color xTDBullishArrowColor = clrAqua; // Cross Over Arrow Color +// input uchar xTDBearishArrowCode = 230; // Cross Under Arrow Code +// input color xTDBearishArrowColor = clrMagenta; // Cross Under Arrow Color + +// +// Configurations ... +int xTDLength = 18; // Market Length +bool xTDDrawCrosses = false; // Draw Cross Arrows +uchar xTDBullishArrowCode = 228; // Cross Over Arrow Code +color xTDBullishArrowColor = clrAqua; // Cross Over Arrow Color +uchar xTDBearishArrowCode = 230; // Cross Under Arrow Code +color xTDBearishArrowColor = clrMagenta; // Cross Under Arrow Color + +// +// END Inputs ... +// + +// +// START Definitions ... +// + +int xTDHandler = INVALID_HANDLE; +double xTDBullishBuffer[]; +double xTDBearishBuffer[]; +double xTDSignalBuffer[]; +// +// END Definitions ... +// + +// +// START Handler Functions ... +// + +// +// Validate Inputs ... +bool XTDValidateInputs() +{ + // + bool result = false; + + // + result = xTDLength >= 2; + + // + if (!result) + { + // + LogMessage("XTD Oscillator Inputs Validation Failed ..."); + } + + // + return result; +} + +// +// Init Oscillators ... +bool XTDInitHandlers() +{ + // + bool result = false; + + // + // Initialize Indicator/Oscillator Handlers ... + ResetLastError(); + + // + // XTD Handler ... + ArraySetAsSeries(xTDBullishBuffer, true); + ArraySetAsSeries(xTDBearishBuffer, true); + ArraySetAsSeries(xTDSignalBuffer, true); + xTDHandler = iCustom( + _Symbol, + _Period, + "x-saherelm.xtd.oscillator", + // + // Inputs ... + xTDLength, + xTDDrawCrosses, + xTDBullishArrowCode, + xTDBullishArrowColor, + xTDBearishArrowCode, + xTDBearishArrowColor); + if (xTDHandler == INVALID_HANDLE) + { + // + LogMessage("failed to Initialize XTD Oscillator: " + (string)GetLastError()); + return result; + } + + // + result = true; + + // + return result; +} + +// +// Release Oscillators ... +void XTDReleaseHandlers() +{ + IndicatorRelease(xTDHandler); +} + +// +// Handle Reading Buffers ... +void XTDReadBuffers( + int xTDItemsPerTick // Number Of Reading Buffer Items Per Tick +) +{ + // + // XTD Bullish Buffer ... + CopyBuffer( + xTDHandler, + X_XTD_BULLISH_POWER_LINE, + 0, + xTDItemsPerTick, + xTDBullishBuffer); + + // + // XTD Bullish Buffer ... + CopyBuffer( + xTDHandler, + X_XTD_BEARISH_POWER_LINE, + 0, + xTDItemsPerTick, + xTDBearishBuffer); + + // + // XTD Signal Buffer ... + CopyBuffer( + xTDHandler, + X_XTD_SIGNAL_LINE, + 0, + xTDItemsPerTick, + xTDSignalBuffer); +} + +// +// END Handler Funcions ... +// + +// +// START XTD Custom Functions ... +// + +// +// Check Signal Vale ... +bool XTDIsSignalVale( + int bar_index, // Specified Index ... + int length = 10 // Specified Length ... +) +{ + // + bool result = false; + + // + if ( + length <= 0 || + bar_index <= 0 || + !XTDIsValidBuffersSize(bar_index + length + 1)) + { + return result; + } + + // + result = IsDecreasing( + bar_index + length, + bar_index, + xTDSignalBuffer + // + ); + + // + return result; +} + +// +// Check Signal Peak ... +bool XTDIsSignalPeak( + int bar_index, // Specified Index ... + int length = 10 // Specified Length ... +) +{ + // + bool result = false; + + // + if ( + length <= 0 || + bar_index <= 0 || + !XTDIsValidBuffersSize(bar_index + length + 1)) + { + return result; + } + + // + // Must Decreasing ... + bool isIncreasing = IsIncreasing( + bar_index + length, + bar_index, + xTDSignalBuffer + // + ); + + // + return result; +} + +// +// Check Signal Vale ... +bool XTDIsBullishVale( + int bar_index, // Specified Index ... + int length = 10 // Specified Length ... +) +{ + // + bool result = false; + + // + if ( + length <= 0 || + bar_index <= 0 || + !XTDIsValidBuffersSize(bar_index + length + 1)) + { + return result; + } + + // + result = IsDecreasing( + bar_index + length, + bar_index, + xTDBullishBuffer + // + ); + + // + return result; +} + +// +// Check Signal Peak ... +bool XTDIsBullishPeak( + int bar_index, // Specified Index ... + int length = 10 // Specified Length ... +) +{ + // + bool result = false; + + // + if ( + length <= 0 || + bar_index <= 0 || + !XTDIsValidBuffersSize(bar_index + length + 1)) + { + return result; + } + + // + // Must Decreasing ... + bool isIncreasing = IsIncreasing( + bar_index + length, + bar_index, + xTDBullishBuffer + // + ); + + // + return result; +} + +// +// Check Signal Vale ... +bool XTDIsBearishVale( + int bar_index, // Specified Index ... + int length = 10 // Specified Length ... +) +{ + // + bool result = false; + + // + if ( + length <= 0 || + bar_index <= 0 || + !XTDIsValidBuffersSize(bar_index + length + 1)) + { + return result; + } + + // + result = IsDecreasing( + bar_index + length, + bar_index, + xTDBearishBuffer + // + ); + + // + return result; +} + +// +// Check Signal Peak ... +bool XTDIsBearishPeak( + int bar_index, // Specified Index ... + int length = 10 // Specified Length ... +) +{ + // + bool result = false; + + // + if ( + length <= 0 || + bar_index <= 0 || + !XTDIsValidBuffersSize(bar_index + length + 1)) + { + return result; + } + + // + // Must Decreasing ... + bool isIncreasing = IsIncreasing( + bar_index + length, + bar_index, + xTDBearishBuffer + // + ); + + // + return result; +} + +// +// Check Signal Peak ... + +// +// Check Bullish Crossed Over Bearish ... +bool XTDIsBullCrossedOverBear( + int bar_index // Specified Bar Index +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XTDIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + result = IsCrossOver( + xTDBullishBuffer, + xTDBearishBuffer, + 1); + + // + return result; +} + +// +// Check Bullish Over Bearish ... +bool XTDIsBullOverBear( + int bar_index // Specified Bar Index +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XTDIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + result = IsOver( + xTDBullishBuffer, + xTDBearishBuffer, + 1); + + // + return result; +} + +// +// Check Bullish Crossed Under Bearish ... +bool XTDIsBullCrossedUnderBear( + int bar_index // Specified Bar Index +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XTDIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + result = IsCrossUnder( + xTDBullishBuffer, + xTDBearishBuffer, + 1); + + // + return result; +} + +// +// Check Bullish Under Bearish ... +bool XTDIsBullUnderBear( + int bar_index // Specified Bar Index +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XTDIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + result = IsUnder( + xTDBullishBuffer, + xTDBearishBuffer, + 1); + + // + return result; +} + +// +// Check Signal Crossed Over Bearish ... +bool XTDIsSignalCrossedOverBear( + int bar_index // Specified Bar Index +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XTDIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + result = IsCrossOver( + xTDSignalBuffer, + xTDBearishBuffer, + 1); + + // + return result; +} + +// +// Check Signal Over Bearish ... +bool XTDIsSignalOverBear( + int bar_index // Specified Bar Index +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XTDIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + result = IsOver( + xTDSignalBuffer, + xTDBearishBuffer, + 1); + + // + return result; +} + +// +// Check Signal Crossed Under Bearish ... +bool XTDIsSignalCrossedUnderBear( + int bar_index // Specified Bar Index +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XTDIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + result = IsCrossUnder( + xTDSignalBuffer, + xTDBearishBuffer, + 1); + + // + return result; +} + +// +// Check Signal Under Bearish ... +bool XTDIsSignalUnderBear( + int bar_index // Specified Bar Index +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XTDIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + result = IsUnder( + xTDSignalBuffer, + xTDBearishBuffer, + 1); + + // + return result; +} + +// +// Check all Buffers has valid Size ... +bool XTDIsValidBuffersSize( + int size // the size of buffers which min size for requirements +) +{ + // + bool result = false; + + // + if ( + size <= 0 || + ArraySize(xTDBullishBuffer) < size || + ArraySize(xTDBullishBuffer) < size || + ArraySize(xTDSignalBuffer) < size) + { + result = false; + } + else + { + result = true; + } + + // + return result; +} + +// +// Count Signal Crossed Over Bear ... +int XTDCountSignalCrossedOverBearIndex( + int bar_index // Specified Bar Index +) +{ + // + int result = 0; + + // + int count = ArraySize(xTDSignalBuffer) - 1; + if ( + bar_index <= 0 || + count <= bar_index + 1) + { + return result; + } + + // + // Loop Through ... + for (int i = bar_index + 1; i < count && result == -1; i++) + { + // + // Check Cross On i Point ... + bool isCrossedOnI = XTDIsSignalCrossedOverBear(i); + if (isCrossedOnI) + { + result++; + } + } + + // + return result; +} + +// +// Count Signal Crossed Under Bear ... +int XTDCountSignalCrossedUnderBearIndex( + int bar_index // Specified Bar Index +) +{ + // + int result = 0; + + // + int count = ArraySize(xTDSignalBuffer) - 1; + if ( + bar_index <= 0 || + count <= bar_index + 1) + { + return result; + } + + // + // Loop Through ... + for (int i = bar_index + 1; i < count && result == -1; i++) + { + // + // Check Cross On i Point ... + bool isCrossedOnI = XTDIsSignalCrossedUnderBear(i); + if (isCrossedOnI) + { + result++; + } + } + + // + return result; +} + +// +// Count Bull Crossed Over Bear ... +int XTDCountBullCrossedOverBearIndex( + int bar_index // Specified Bar Index +) +{ + // + int result = 0; + + // + int count = ArraySize(xTDSignalBuffer) - 1; + if ( + bar_index <= 0 || + count <= bar_index + 1) + { + return result; + } + + // + // Loop Through ... + for (int i = bar_index + 1; i < count && result == -1; i++) + { + // + // Check Cross On i Point ... + bool isCrossedOnI = XTDIsBullCrossedOverBear(i); + if (isCrossedOnI) + { + result++; + } + } + + // + return result; +} + +// +// Count Bull Crossed Under Bear ... +int XTDCountBullCrossedUnderBearIndex( + int bar_index // Specified Bar Index +) +{ + // + int result = 0; + + // + int count = ArraySize(xTDSignalBuffer) - 1; + if ( + bar_index <= 0 || + count <= bar_index + 1) + { + return result; + } + + // + // Loop Through ... + for (int i = bar_index + 1; i < count && result == -1; i++) + { + // + // Check Cross On i Point ... + bool isCrossedOnI = XTDIsBullCrossedUnderBear(i); + if (isCrossedOnI) + { + result++; + } + } + + // + return result; +} + +// +// Find Last Signal Crossed Over Bear ... +int XTDFindLastSignalCrossedOverBearIndex( + int bar_index // Specified Bar Index +) +{ + // + int result = -1; + + // + int count = ArraySize(xTDSignalBuffer) - 1; + if ( + bar_index <= 0 || + count <= bar_index + 1) + { + return result; + } + + // + // Loop Through ... + for (int i = bar_index + 1; i < count && result == -1; i++) + { + // + // Check Cross On i Point ... + bool isCrossedOnI = XTDIsSignalCrossedOverBear(i); + if (isCrossedOnI) + { + // + result = i; + break; + } + } + + // + return result; +} + +// +// Find Last Signal Crossed Onder Bear ... +int XTDFindLastSignalCrossedUnderBearIndex( + int bar_index // Specified Bar Index +) +{ + // + int result = -1; + + // + int count = ArraySize(xTDSignalBuffer) - 1; + if ( + bar_index <= 0 || + count <= bar_index + 1) + { + return result; + } + + // + // Loop Through ... + for (int i = bar_index + 1; i < count && result == -1; i++) + { + // + // Check Cross On i Point ... + bool isCrossedOnI = XTDIsSignalCrossedUnderBear(i); + if (isCrossedOnI) + { + // + result = i; + break; + } + } + + // + return result; +} + +// +// Find Last Bull Crossed Over Bear ... +int XTDFindLastBullCrossedOverBearIndex( + int bar_index // Specified Bar Index +) +{ + // + int result = -1; + + // + int count = ArraySize(xTDSignalBuffer) - 1; + if ( + bar_index <= 0 || + count <= bar_index + 1) + { + return result; + } + + // + // Loop Through ... + for (int i = bar_index + 1; i < count && result == -1; i++) + { + // + // Check Cross On i Point ... + bool isCrossedOnI = XTDIsBullCrossedOverBear(i); + if (isCrossedOnI) + { + // + result = i; + break; + } + } + + // + return result; +} + +// +// Find Last Bull Crossed Under Bear ... +int XTDFindLastBullCrossedUnderBearIndex( + int bar_index // Specified Bar Index +) +{ + // + int result = -1; + + // + int count = ArraySize(xTDSignalBuffer) - 1; + if ( + bar_index <= 0 || + count <= bar_index + 1) + { + return result; + } + + // + // Loop Through ... + for (int i = bar_index + 1; i < count && result == -1; i++) + { + // + // Check Cross On i Point ... + bool isCrossedOnI = XTDIsBullCrossedUnderBear(i); + if (isCrossedOnI) + { + // + result = i; + break; + } + } + + // + return result; +} + +// +// END XTD Custom Functions ... +// diff --git a/BKPS/OLD/XEU5-0/Helpers/x-saherelm.xtm.indicator.helper.lib.mq5 b/BKPS/OLD/XEU5-0/Helpers/x-saherelm.xtm.indicator.helper.lib.mq5 new file mode 100644 index 0000000..a871ed4 --- /dev/null +++ b/BKPS/OLD/XEU5-0/Helpers/x-saherelm.xtm.indicator.helper.lib.mq5 @@ -0,0 +1,598 @@ +///////////////////////////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 XTM Indicator Helper for Signal Providers +// -------------------------------------------------------------------------- +// +// 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 + +// +// Includes ... +#include "../Libraries/x-saherelm.log.lib.mq5" +#include "../Libraries/x-saherelm.common.lib.mq5" + +// +// START Enum Definitions ... +// + +// +// XTM Indicator States ... +enum ENUM_X_XTM_STATES +{ + X_XTM_BULLISH = 1, + X_XTM_BEARISH = -1, + X_XTM_NEUTURAL = 0, +}; + +// +// XTM Indicator Buffer Lines ... +enum ENUM_X_XTM_BUFFER_LINES +{ + X_XTM_MA_LINE = 0, + X_XTM_MC_COLOR_LINE = 1, + X_XTM_STATE_LINE = 2, +}; + +// +// END Enum Definitions ... +// + +// +// START Inputs ... +// + +// input group "XTM Indicator"; + +// input int xTMMaPeriod = 18; // Period +// input int xTMMaShift = 0; // Shift +// input ENUM_MA_METHOD xTMMaMethod = MODE_EMA; // Method +// input ENUM_APPLIED_PRICE xTMMaAppliedTo = PRICE_OPEN; // Applied To + +// +// Configurations ... +int xTMMaPeriod = 18; // Period +int xTMMaShift = 0; // Shift +ENUM_MA_METHOD xTMMaMethod = MODE_EMA; // Method +ENUM_APPLIED_PRICE xTMMaAppliedTo = PRICE_OPEN; // Applied To + +// +// END Inputs ... +// + +// +// START Definitions ... +// + +int xTMHandler = INVALID_HANDLE; +double xTMMaBuffer[]; +double xTMStateBuffer[]; + +// +// END Definitions ... +// + +// +// START Handler Functions ... +// + +// +// Validate Inputs ... +bool XTMValidateInputs() +{ + // + bool result = false; + + // + result = xTMMaPeriod >= 2; + + // + if (!result) + { + // + LogMessage("XTM Indicator Inputs Validation Failed ..."); + } + + // + return result; +} + +// +// Init Indicators ... +bool XTMInitHandlers() +{ + // + bool result = false; + + // + // Initialize Indicator/Oscillator Handlers ... + ResetLastError(); + + // + // XTM Handler ... + ArraySetAsSeries(xTMMaBuffer, true); + ArraySetAsSeries(xTMStateBuffer, true); + xTMHandler = iCustom( + _Symbol, + _Period, + "x-saherelm.xtm.indicator", + // + // Inputs ... + xTMMaPeriod, + xTMMaShift, + xTMMaMethod, + xTMMaAppliedTo); + if (xTMHandler == INVALID_HANDLE) + { + // + LogMessage("failed to Initialize XTM Indicator: " + (string)GetLastError()); + return result; + } + + // + result = true; + + // + return result; +} + +// +// Release Indicators ... +void XTMReleaseHandlers() +{ + IndicatorRelease(xTMHandler); +} + +// +// Handle Reading Buffers ... +void XTMReadBuffers( + int xTMItemsPerTick // Number Of Reading Buffer Items Per Tick +) +{ + // + // Ma Buffer ... + CopyBuffer( + xTMHandler, + X_XTM_MA_LINE, + 0, + xTMItemsPerTick, + xTMMaBuffer); + + // + // State Buffer ... + CopyBuffer( + xTMHandler, + X_XTM_STATE_LINE, + 0, + xTMItemsPerTick, + xTMStateBuffer); +} + +// +// END Handler Funcions ... +// + +// +// START XTM Custom Functions ... +// + +// +// Find Peak based On this Indicator ... +bool XTMIsPeak( + int bar_index, // Specified Index ... + int length = 10 // Specified Length ... +) +{ + // + bool result = false; + + // + if ( + length <= 0 || + bar_index <= 0 || + !XTMIsValidBuffersSize(bar_index + length + 1)) + { + return result; + } + + // + // Must Decreasing ... + bool isIncreasing = IsIncreasing( + bar_index + length, + bar_index, + xTMMaBuffer + // + ); + + // + return result; +} + +// +// Find Vale based On this Indicator ... +bool XTMIsVale( + int bar_index, // Specified Index ... + int length = 10 // Specified Length ... +) +{ + // + bool result = false; + + // + if ( + length <= 0 || + bar_index <= 0 || + !XTMIsValidBuffersSize(bar_index + length + 1)) + { + return result; + } + + // + result = IsDecreasing( + bar_index + length, + bar_index, + xTMMaBuffer + // + ); + + // + return result; +} + +// +// Check TM Crossed Up ... +bool XTMIsStartBullish( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XTMIsValidBuffersSize(bar_index + 2)) + { + return result; + } + + // + result = + // + xTMStateBuffer[bar_index] == X_XTM_BULLISH && + xTMStateBuffer[bar_index + 1] != X_XTM_BULLISH + // + ; + + // + return result; +} + +// +// Check TM Crossed Up After Neutural State ... +bool XTMIsStartBullishAfterNeutural( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XTMIsValidBuffersSize(bar_index + 2)) + { + return result; + } + + // + result = + // + xTMStateBuffer[bar_index] == X_XTM_BULLISH && + xTMStateBuffer[bar_index + 1] == X_XTM_NEUTURAL + // + ; + + // + return result; +} + +// +// Check TM In Up State ... +bool XTMIsBullish( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XTMIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + result = + // + xTMStateBuffer[bar_index] == X_XTM_BULLISH + // + ; + + // + return result; +} + +// +// Check TM Ends Up State ... +bool XTMIsEndBullish( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XTMIsValidBuffersSize(bar_index + 2)) + { + return result; + } + + // + result = + // + xTMStateBuffer[bar_index] != X_XTM_BULLISH && + xTMStateBuffer[bar_index + 1] == X_XTM_BULLISH + // + ; + + // + return result; +} + +// +// Check TM Ends Up State By Neutural ... +bool XTMIsEndBullishByNeutural( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XTMIsValidBuffersSize(bar_index + 2)) + { + return result; + } + + // + result = + // + xTMStateBuffer[bar_index] == X_XTM_NEUTURAL && + xTMStateBuffer[bar_index + 1] == X_XTM_BULLISH + // + ; + + // + return result; +} + +// +// Check TM Crossed Down ... +bool XTMIsStartBearish( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XTMIsValidBuffersSize(bar_index + 2)) + { + return result; + } + + // + result = + // + xTMStateBuffer[bar_index] == X_XTM_BEARISH && + xTMStateBuffer[bar_index + 1] != X_XTM_BEARISH + // + ; + + // + return result; +} + +// +// Check TM Crossed Down After Neutural State ... +bool XTMIsStartBearishAfterNeutural( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XTMIsValidBuffersSize(bar_index + 2)) + { + return result; + } + + // + result = + // + xTMStateBuffer[bar_index] == X_XTM_BEARISH && + xTMStateBuffer[bar_index + 1] == X_XTM_NEUTURAL + // + ; + + // + return result; +} + +// +// Check TM In Down State ... +bool XTMIsBearish( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XTMIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + result = + // + xTMStateBuffer[bar_index] == X_XTM_BEARISH + // + ; + + // + return result; +} + +// +// Check TM Ends Down State ... +bool XTMIsEndBearish( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XTMIsValidBuffersSize(bar_index + 2)) + { + return result; + } + + // + result = + // + xTMStateBuffer[bar_index] != X_XTM_BEARISH && + xTMStateBuffer[bar_index + 1] == X_XTM_BEARISH + // + ; + + // + return result; +} + +// +// Check TM Ends Down State By Neutural ... +bool XTMIsEndBearishByNeutural( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XTMIsValidBuffersSize(bar_index + 2)) + { + return result; + } + + // + result = + // + xTMStateBuffer[bar_index] == X_XTM_NEUTURAL && + xTMStateBuffer[bar_index + 1] == X_XTM_BEARISH + // + ; + + // + return result; +} + +// +// Check TM In Neutural State ... +bool XTMIsNeutural( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XTMIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + result = + // + xTMStateBuffer[bar_index] == X_XTM_NEUTURAL + // + ; + + // + return result; +} + +// +// Check all Buffers has valid Size ... +bool XTMIsValidBuffersSize( + int size // the size of buffers which min size for requirements +) +{ + // + bool result = false; + + // + if ( + size <= 0 || + // + ArraySize(xTMMaBuffer) < size || + ArraySize(xTMStateBuffer) < size + // + ) + { + result = false; + } + else + { + result = true; + } + + // + return result; +} + +// +// END XTM Custom Functions ... +// diff --git a/BKPS/OLD/XEU5-0/Helpers/x-saherelm.xts.oscillator.helper.lib.mq5 b/BKPS/OLD/XEU5-0/Helpers/x-saherelm.xts.oscillator.helper.lib.mq5 new file mode 100644 index 0000000..875eec0 --- /dev/null +++ b/BKPS/OLD/XEU5-0/Helpers/x-saherelm.xts.oscillator.helper.lib.mq5 @@ -0,0 +1,1179 @@ +///////////////////////////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 XTS Oscillator Helper for Signal Providers +// -------------------------------------------------------------------------- +// +// 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 + +// +// Includes ... +#include "../Libraries/x-saherelm.log.lib.mq5" +#include "../Libraries/x-saherelm.common.lib.mq5" + +// +// START Enum Definitions ... +// + +// +// Methods to Calculate TimeFrames ... +enum ENUM_X_PERIOD_METHOD +{ + // + X_PERIOD_NOTHING, + // + X_PERIOD_AUTO, + // + X_PERIOD_MANUALLY +}; + +// +// Buffer Lines ... +enum ENUM_X_XTS_BUFFER_LINES +{ + X_XTS_CURRENT_LINE = 0, + X_XTS_NEAREST_LINE = 1, + X_XTS_MEDIEST_LINE = 2, + X_XTS_FAREST_LINE = 3, +}; + +// +// Periods ... +enum ENUM_X_XTS_PERIODS +{ + // + // Current Period ... + X_XTS_PERIOD_CURRENT, + // + // Nearest Period ... + X_XTS_PERIOD_NEAREST, + // + // Mediest Period ... + X_XTS_PERIOD_MEDIEST, + // + // Farest Period ... + X_XTS_PERIOD_FAREST, +}; + +// +// END Enum Definitions ... +// + +// +// START Inputs ... +// + +// // +// input group "XTS Oscillator"; + +// // +// input group "XTS Current Period"; +// input ENUM_APPLIED_PRICE xTSCurrentAppliedTo = PRICE_CLOSE; // Current Applied To +// // +// input group "XTS Nearest Period"; +// input ENUM_X_PERIOD_METHOD xTSNearestMethod = X_PERIOD_AUTO; // How to Find Nearest Period +// input ENUM_TIMEFRAMES xTSNearestPeriod = NULL; // Nearest Time Frame +// input ENUM_APPLIED_PRICE xTSNearestAppliedTo = PRICE_CLOSE; // Nearest Applied To +// // +// input group "XTS Mediest Period"; +// input ENUM_X_PERIOD_METHOD xTSMediestMethod = X_PERIOD_AUTO; // How to Find Mediest Period +// input ENUM_TIMEFRAMES xTSMediestPeriod = NULL; // Mediest Time Frame +// input ENUM_APPLIED_PRICE xTSMediestAppliedTo = PRICE_CLOSE; // Mediest Applied To +// // +// input group "XTS Farest Period"; +// input ENUM_X_PERIOD_METHOD xTSFarestMethod = X_PERIOD_AUTO; // How to Find Farest Period +// input ENUM_TIMEFRAMES xTSFarestPeriod = NULL; // Farest Time Frame +// input ENUM_APPLIED_PRICE xTSFarestAppliedTo = PRICE_CLOSE; // Farest Applied To + +// +// Configurations ... +ENUM_APPLIED_PRICE xTSCurrentAppliedTo = PRICE_CLOSE; // Current Applied To +// +ENUM_X_PERIOD_METHOD xTSNearestMethod = X_PERIOD_AUTO; // How to Find Nearest Period +ENUM_TIMEFRAMES xTSNearestPeriod = NULL; // Nearest Time Frame +ENUM_APPLIED_PRICE xTSNearestAppliedTo = PRICE_CLOSE; // Nearest Applied To +// +ENUM_X_PERIOD_METHOD xTSMediestMethod = X_PERIOD_AUTO; // How to Find Mediest Period +ENUM_TIMEFRAMES xTSMediestPeriod = NULL; // Mediest Time Frame +ENUM_APPLIED_PRICE xTSMediestAppliedTo = PRICE_CLOSE; // Mediest Applied To +// +ENUM_X_PERIOD_METHOD xTSFarestMethod = X_PERIOD_AUTO; // How to Find Farest Period +ENUM_TIMEFRAMES xTSFarestPeriod = NULL; // Farest Time Frame +ENUM_APPLIED_PRICE xTSFarestAppliedTo = PRICE_CLOSE; // Farest Applied To + +// +// END Inputs ... +// + +// +// START Definitions ... +// + +int xTSHandler = INVALID_HANDLE; +double xTSCurrentBuffer[]; +double xTSNearestBuffer[]; +double xTSMediestBuffer[]; +double xTSFarestBuffer[]; + +// +// END Definitions ... +// + +// +// START Handler Functions ... +// + +// +// Validate Inputs ... +bool XTSValidateInputs() +{ + // + bool result = false; + + // + result = true; + + // + if (!result) + { + // + LogMessage("XTS Oscillator Inputs Validation Failed ..."); + } + + // + return result; +} + +// +// Init Oscillators ... +bool XTSInitHandlers() +{ + // + bool result = false; + + // + // Initialize Indicator/Oscillator Handlers ... + ResetLastError(); + + // + // XTS Handler ... + ArraySetAsSeries(xTSCurrentBuffer, true); + ArraySetAsSeries(xTSNearestBuffer, true); + ArraySetAsSeries(xTSMediestBuffer, true); + ArraySetAsSeries(xTSFarestBuffer, true); + xTSHandler = iCustom( + _Symbol, + _Period, + "x-saherelm.xts.oscillator", + // + // Inputs ... + "", + xTSCurrentAppliedTo, + "", + xTSNearestMethod, + xTSNearestPeriod, + xTSNearestAppliedTo, + "", + xTSMediestMethod, + xTSMediestPeriod, + xTSMediestAppliedTo, + "", + xTSFarestMethod, + xTSFarestPeriod, + xTSFarestAppliedTo + // + ); + if (xTSHandler == INVALID_HANDLE) + { + // + LogMessage("failed to Initialize XTS Oscillator: " + (string)GetLastError()); + return result; + } + + // + result = true; + + // + return result; +} + +// +// Release Oscillators ... +void XTSReleaseHandlers() +{ + IndicatorRelease(xTSHandler); +} + +// +// Handle Reading Buffers ... +void XTSReadBuffers( + int xTSItemsPerTick // Number Of Reading Buffer Items Per Tick +) +{ + // + // XTS Current ... + CopyBuffer( + xTSHandler, + X_XTS_CURRENT_LINE, + 0, + xTSItemsPerTick, + xTSCurrentBuffer); + + // + // XTS Nearest ... + CopyBuffer( + xTSHandler, + X_XTS_NEAREST_LINE, + 0, + xTSItemsPerTick, + xTSNearestBuffer); + + // + // XTS Mediest ... + CopyBuffer( + xTSHandler, + X_XTS_MEDIEST_LINE, + 0, + xTSItemsPerTick, + xTSMediestBuffer); + + // + // XTS Farest ... + CopyBuffer( + xTSHandler, + X_XTS_FAREST_LINE, + 0, + xTSItemsPerTick, + xTSFarestBuffer); +} + +// +// END Handler Funcions ... +// + +// +// START XTS Custom Functions ... +// + +// +// Calculate Min Value ... +double XTSGetMinValue( + int bar_index // Specified Index ... +) +{ + // + ENUM_X_XTS_PERIODS periods[]; + XTSGetAllPeriodsEnum(periods); + + // + double result = XTSGetPeriodsMinValue( + periods, + bar_index); + + // + return result; +} + +// +// Calculate Max Value ... +double XTSGetMaxValue( + int bar_index // Specified Index ... +) +{ + // + ENUM_X_XTS_PERIODS periods[]; + XTSGetAllPeriodsEnum(periods); + + // + double result = XTSGetPeriodsMaxValue( + periods, + bar_index); + + // + return result; +} + +// +// Check if all Periods Values are Same ... +bool XTSIsAllSame( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + // Validate Args ... + if ( + bar_index < 0 || + !XTSIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + result = + xTSCurrentBuffer[bar_index] == xTSNearestBuffer[bar_index] && + xTSNearestBuffer[bar_index] == xTSMediestBuffer[bar_index] && + xTSMediestBuffer[bar_index] == xTSFarestBuffer[bar_index]; + + // + return result; +} + +// +// Current ... + +// +// Check Current Buffer is Min Or Not ... +bool XTSIsCurrentMin( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + // Validate Args ... + if ( + bar_index < 0 || + !XTSIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + double minValue = XTSGetMinValue(bar_index); + + // + result = + xTSCurrentBuffer[bar_index] == minValue; + + // + return result; +} + +// +// Check Current Buffer is Max Or Not ... +bool XTSIsCurrentMax( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + // Validate Args ... + if ( + bar_index < 0 || + !XTSIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + double maxValue = XTSGetMaxValue(bar_index); + + // + result = + xTSCurrentBuffer[bar_index] == maxValue; + + // + return result; +} + +// +// Current VS Nearest ... + +// +// Check Current Crossed Over Nearest ... +bool XTSIsCurrentCrossedOverNearest( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + result = XTSIsPeriodCrossedOverAnother( + X_XTS_PERIOD_CURRENT, + X_XTS_PERIOD_NEAREST, + bar_index); + + // + return result; +} + +// +// Check Current Over Nearest ... +bool XTSIsCurrentOverNearest( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + result = XTSIsPeriodOverAnother( + X_XTS_PERIOD_CURRENT, + X_XTS_PERIOD_NEAREST, + bar_index); + + // + return result; +} + +// +// Check Current Crossed Under Nearest ... +bool XTSIsCurrentCrossedUnderNearest( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + result = XTSIsPeriodCrossedUnderAnother( + X_XTS_PERIOD_CURRENT, + X_XTS_PERIOD_NEAREST, + bar_index); + + // + return result; +} + +// +// Check Current Under Nearest ... +bool XTSIsCurrentUnderNearest( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + result = XTSIsPeriodUnderAnother( + X_XTS_PERIOD_CURRENT, + X_XTS_PERIOD_NEAREST, + bar_index); + + // + return result; +} + +// +// Current VS Mediest ... + +// +// Check Current Crossed Over Mediest ... +bool XTSIsCurrentCrossedOverMediest( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + result = XTSIsPeriodCrossedOverAnother( + X_XTS_PERIOD_CURRENT, + X_XTS_PERIOD_MEDIEST, + bar_index); + + // + return result; +} + +// +// Check Current Over Mediest ... +bool XTSIsCurrentOverMediest( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + result = XTSIsPeriodOverAnother( + X_XTS_PERIOD_CURRENT, + X_XTS_PERIOD_MEDIEST, + bar_index); + + // + return result; +} + +// +// Check Current Crossed Under Mediest ... +bool XTSIsCurrentCrossedUnderMediest( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + result = XTSIsPeriodCrossedUnderAnother( + X_XTS_PERIOD_CURRENT, + X_XTS_PERIOD_MEDIEST, + bar_index); + + // + return result; +} + +// +// Check Current Under Mediest ... +bool XTSIsCurrentUnderMediest( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + result = XTSIsPeriodUnderAnother( + X_XTS_PERIOD_CURRENT, + X_XTS_PERIOD_MEDIEST, + bar_index); + + // + return result; +} + +// +// Current VS Farest ... + +// +// Check Current Crossed Over Farest ... +bool XTSIsCurrentCrossedOverFarest( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + result = XTSIsPeriodCrossedOverAnother( + X_XTS_PERIOD_CURRENT, + X_XTS_PERIOD_FAREST, + bar_index); + + // + return result; +} + +// +// Check Current Over Farest ... +bool XTSIsCurrentOverFarest( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + result = XTSIsPeriodOverAnother( + X_XTS_PERIOD_CURRENT, + X_XTS_PERIOD_FAREST, + bar_index); + + // + return result; +} + +// +// Check Current Crossed Under Farest ... +bool XTSIsCurrentCrossedUnderFarest( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + result = XTSIsPeriodCrossedUnderAnother( + X_XTS_PERIOD_CURRENT, + X_XTS_PERIOD_FAREST, + bar_index); + + // + return result; +} + +// +// Check Current Under Farest ... +bool XTSIsCurrentUnderFarest( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + result = XTSIsPeriodUnderAnother( + X_XTS_PERIOD_CURRENT, + X_XTS_PERIOD_FAREST, + bar_index); + + // + return result; +} + +// +// Globally Custom Functions ... + +// +// Check a Period Crossed Over another one ... +bool XTSIsPeriodCrossedOverAnother( + ENUM_X_XTS_PERIODS source, // Specified Source Period which Check it's Crossed ... + ENUM_X_XTS_PERIODS dest, // Specified Dest Period Which used to Check Source Crosses ... + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + // Validate Args ... + if ( + bar_index < 0 || + !XTSIsValidBuffersSize(bar_index + 2)) + { + return result; + } + + // + double sourceValue = XTSGetPeriodValue( + source, + bar_index); + double sourceValue1 = XTSGetPeriodValue( + source, + bar_index + 1); + + // + double destValue = XTSGetPeriodValue( + dest, + bar_index); + double destValue1 = XTSGetPeriodValue( + dest, + bar_index + 1); + + // + result = + sourceValue > destValue && + sourceValue1 <= destValue1; + + // + return result; +} + +// +// Check a Period Over another one ... +bool XTSIsPeriodOverAnother( + ENUM_X_XTS_PERIODS source, // Specified Source Period which Check it's Crossed ... + ENUM_X_XTS_PERIODS dest, // Specified Dest Period Which used to Check Source Crosses ... + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + // Validate Args ... + if ( + bar_index < 0 || + !XTSIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + double sourceValue = XTSGetPeriodValue( + source, + bar_index); + + // + double destValue = XTSGetPeriodValue( + dest, + bar_index); + + // + result = + sourceValue > destValue; + + // + return result; +} + +// +// Check a Period Crossed Under another one ... +bool XTSIsPeriodCrossedUnderAnother( + ENUM_X_XTS_PERIODS source, // Specified Source Period which Check it's Crossed ... + ENUM_X_XTS_PERIODS dest, // Specified Dest Period Which used to Check Source Crosses ... + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + // Validate Args ... + if ( + bar_index < 0 || + !XTSIsValidBuffersSize(bar_index + 2)) + { + return result; + } + + // + double sourceValue = XTSGetPeriodValue( + source, + bar_index); + double sourceValue1 = XTSGetPeriodValue( + source, + bar_index + 1); + + // + double destValue = XTSGetPeriodValue( + dest, + bar_index); + double destValue1 = XTSGetPeriodValue( + dest, + bar_index + 1); + + // + result = + sourceValue < destValue && + sourceValue1 >= destValue1; + + // + return result; +} + +// +// Check a Period Under another one ... +bool XTSIsPeriodUnderAnother( + ENUM_X_XTS_PERIODS source, // Specified Source Period which Check it's Crossed ... + ENUM_X_XTS_PERIODS dest, // Specified Dest Period Which used to Check Source Crosses ... + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + // Validate Args ... + if ( + bar_index < 0 || + !XTSIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + double sourceValue = XTSGetPeriodValue( + source, + bar_index); + + // + double destValue = XTSGetPeriodValue( + dest, + bar_index); + + // + result = + sourceValue < destValue; + + // + return result; +} + +// +// Retrieve Specific Period's Value from Buffer for Specific Bar Index ... +double XTSGetPeriodValue( + ENUM_X_XTS_PERIODS period, // Specified Period to read it's Value ... + int bar_index // Specified Index ... +) +{ + // + double result = 0; + + // + // Validate Args ... + if ( + bar_index < 0 || + !XTSIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + switch (period) + { + // + case X_XTS_PERIOD_CURRENT: + result = xTSCurrentBuffer[bar_index]; + break; + + // + case X_XTS_PERIOD_NEAREST: + result = xTSNearestBuffer[bar_index]; + break; + + // + case X_XTS_PERIOD_MEDIEST: + result = xTSMediestBuffer[bar_index]; + break; + + // + case X_XTS_PERIOD_FAREST: + result = xTSFarestBuffer[bar_index]; + break; + } + + // + return result; +} + +// +// Fill All Exists Periods ... +void XTSGetAllPeriodsEnum( + ENUM_X_XTS_PERIODS &result[] // Hold's Result ... +) +{ + // + CleanBuffer(result); + + // + Add( + X_XTS_PERIOD_CURRENT, + result); + + // + Add( + X_XTS_PERIOD_NEAREST, + result); + + // + Add( + X_XTS_PERIOD_MEDIEST, + result); + + // + Add( + X_XTS_PERIOD_FAREST, + result); +} + +// +// Fill All Exists Periods Except ... +void XTSGetAllPeriodsEnumExcept( + ENUM_X_XTS_PERIODS &result[], // Hold's Result ... + ENUM_X_XTS_PERIODS exception // Excepted Period ... +) +{ + // + CleanBuffer(result); + + // + ENUM_X_XTS_PERIODS allPeriods[]; + XTSGetAllPeriodsEnum(allPeriods); + int periodsCount = ArraySize(allPeriods); + if (periodsCount <= 0) + { + return; + } + + // + // Loop ... + for (int i = 0; i < periodsCount; i++) + { + // + ENUM_X_XTS_PERIODS iPeriod = allPeriods[i]; + + // + if (iPeriod != exception) + { + Add( + iPeriod, + result); + } + } +} + +// +// Fill All Exists Periods Except ... +void XTSGetAllPeriodsEnumExcept( + ENUM_X_XTS_PERIODS &result[], // Hold's Result ... + ENUM_X_XTS_PERIODS &exceptions[] // Excepted Periods ... +) +{ + // + CleanBuffer(result); + + // + ENUM_X_XTS_PERIODS allPeriods[]; + XTSGetAllPeriodsEnum(allPeriods); + int periodsCount = ArraySize(allPeriods); + if (periodsCount <= 0) + { + return; + } + + // + int exceptionsCount = ArraySize(exceptions); + + // + // Loop ... + for (int i = 0; i < periodsCount; i++) + { + // + ENUM_X_XTS_PERIODS iPeriod = allPeriods[i]; + + // + bool canAddIPeriod = false; + if (exceptionsCount <= 0) + { + canAddIPeriod = true; + } + else + { + // + // Loop through Exceptions ... + for (int j = 0; j < exceptionsCount; j++) + { + // + ENUM_X_XTS_PERIODS jException = exceptions[j]; + + // + if (iPeriod == jException) + { + // + canAddIPeriod = false; + break; + } + + // + canAddIPeriod = true; + } + } + + // + if (canAddIPeriod) + { + // + Add( + iPeriod, + result); + } + } +} + +// +// Calculate Periods Min Value ... +double XTSGetPeriodsMinValue( + ENUM_X_XTS_PERIODS &periods[], // Specified Periods ... + int bar_index // Specified Index ... +) +{ + // + double result = 0; + + // + int periodsCount = ArraySize(periods); + + // + // Validate Args ... + if ( + bar_index < 0 || + periodsCount <= 0 || + !XTSIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + // Loop ... + for (int i = 0; i < periodsCount; i++) + { + // + ENUM_X_XTS_PERIODS iPeriod = periods[i]; + + // + double iValue = 0; + + // + switch (iPeriod) + { + // + case X_XTS_PERIOD_CURRENT: + iValue = xTSCurrentBuffer[bar_index]; + break; + + // + case X_XTS_PERIOD_NEAREST: + iValue = xTSNearestBuffer[bar_index]; + break; + + // + case X_XTS_PERIOD_MEDIEST: + iValue = xTSMediestBuffer[bar_index]; + break; + + // + case X_XTS_PERIOD_FAREST: + iValue = xTSFarestBuffer[bar_index]; + break; + } + + // + // Compare iValue to result ... + result = + result == 0 || + result > iValue + ? iValue + : result; + } + + // + return result; +} + +// +// Calculate Periods Max Value ... +double XTSGetPeriodsMaxValue( + ENUM_X_XTS_PERIODS &periods[], // Specified Periods ... + int bar_index // Specified Index ... +) +{ + // + double result = 0; + + // + int periodsCount = ArraySize(periods); + + // + // Validate Args ... + if ( + bar_index < 0 || + periodsCount <= 0 || + !XTSIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + // Loop ... + for (int i = 0; i < periodsCount; i++) + { + // + ENUM_X_XTS_PERIODS iPeriod = periods[i]; + + // + double iValue = 0; + + // + switch (iPeriod) + { + // + case X_XTS_PERIOD_CURRENT: + iValue = xTSCurrentBuffer[bar_index]; + break; + + // + case X_XTS_PERIOD_NEAREST: + iValue = xTSNearestBuffer[bar_index]; + break; + + // + case X_XTS_PERIOD_MEDIEST: + iValue = xTSMediestBuffer[bar_index]; + break; + + // + case X_XTS_PERIOD_FAREST: + iValue = xTSFarestBuffer[bar_index]; + break; + } + + // + // Compare iValue to result ... + result = + result == 0 || + result < iValue + ? iValue + : result; + } + + // + return result; +} + +// +// Check all Buffers has valid Size ... +bool XTSIsValidBuffersSize( + int size // the size of buffers which min size for requirements +) +{ + // + bool result = false; + + // + if ( + size <= 0 || + // + ArraySize(xTSCurrentBuffer) < size + // + ) + { + result = false; + } + else + { + result = true; + } + + // + return result; +} + +// +void Add( + ENUM_X_XTS_PERIODS item, // Specified Item ... + ENUM_X_XTS_PERIODS &buffer[] // Specified Buffer ... +) +{ + // + int bufferSize = ArraySize(buffer); + + // + ArrayResize( + buffer, + bufferSize + 1); + + // + buffer[bufferSize] = item; +} + +void CleanBuffer( + ENUM_X_XTS_PERIODS &buffer[] // Specified Buffer ... +) +{ + // + ArrayFree(buffer); + ArrayResize(buffer, 0); +} + +// +// END XTS Custom Functions ... +// diff --git a/BKPS/OLD/XEU5-0/Indicators/.gitkeep b/BKPS/OLD/XEU5-0/Indicators/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/BKPS/OLD/XEU5-0/Indicators/x-saherelm.xama.indicator.mq5 b/BKPS/OLD/XEU5-0/Indicators/x-saherelm.xama.indicator.mq5 new file mode 100644 index 0000000..14d1ef7 --- /dev/null +++ b/BKPS/OLD/XEU5-0/Indicators/x-saherelm.xama.indicator.mq5 @@ -0,0 +1,353 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 XAMA Indicator +// --------------------------------------------- +// Name: 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 XAMA Indicator" +#property strict + +// +// START Constants ... +// +#define ShortName "XAMA" + +// +// XAMA Indicator States ... +enum ENUM_X_XAMA_STATES +{ + X_XAMA_BULLISH = 1, + X_XAMA_BEARISH = -1, + X_XAMA_NEUTURAL = 0, +}; +// +// END Constants ... +// + +// +// START Inputs ... +// +input int length = 18; // Period +input int fastEMA = 2; // Fast EMA Period +input int slowEMA = 30; // Slow EMA Period +input int maShift = 0; // Shift +input ENUM_APPLIED_PRICE appliedTo = PRICE_CLOSE; // Applied To +// +// END Inputs ... +// + +// +// Includes Logging Library ... +#include "../Libraries/x-saherelm.log.lib.mq5" + +// +// 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 +#define stateBufferIndex 2 + +double maBuffer[]; +double maColorBuffer[]; +double stateBuffer[]; + +#property indicator_label1 "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 maHandler = INVALID_HANDLE; +// +// END Global Definitions: Variables, Properties and etc ... +// + +// +// START Event Handlers ... +// +// +// Initialization ... +int OnInit() +{ + // + // Validate Inputs ... + if (!ValidateInputs()) + { + return INIT_PARAMETERS_INCORRECT; + } + + // + logTag = ShortName; + + // + // Initializing MA Handler ... + maHandler = iAMA( + _Symbol, + _Period, + length, + fastEMA, + slowEMA, + maShift, + appliedTo); + if (maHandler == INVALID_HANDLE) + { + // + string message = "Error Initializing Ma Handler ..."; + LogMessage(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); +} + +// +// Calculations ... +// +// 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; + + // + // 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 ... + int maxLength = MathMax(fastEMA, slowEMA); + maxLength = MathMax(maxLength, length); + + // + // 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; +} + +// +// Define Indexes and Styles ... +void DefineBuffers() +{ + // + string maBufferLabel = "XAMA " + "(" + (string)length + ")"; + + // + // Ma Buffer ... + ArraySetAsSeries(maBuffer, true); + SetIndexBuffer(maBufferIndex, maBuffer, INDICATOR_DATA); + PlotIndexSetString(maBufferIndex, PLOT_LABEL, maBufferLabel); + + // + // Ma Color Buffer ... + ArraySetAsSeries(maColorBuffer, true); + SetIndexBuffer(maColorBufferIndex, maColorBuffer, INDICATOR_COLOR_INDEX); + + // + // State Buffer ... + ArraySetAsSeries(stateBuffer, true); + SetIndexBuffer(stateBufferIndex, stateBuffer, INDICATOR_CALCULATIONS); +} + +// +// Set Indicator Short Name and also we can define Buffers Labels ... +void SetIndicatorName() +{ + // + string indicatorShortName = ""; + StringConcatenate(indicatorShortName, ShortName, " ", "(", length, ")"); + + // + IndicatorSetString(INDICATOR_SHORTNAME, indicatorShortName); +} + +// +// 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; + + // + // Define State Value ... + // lineColorIndex == 0 => Bullish => 1; + // lineColorIndex == 1 => Neutural => 0; + // lineColorIndex == 2 => Bearish => -1; + double stateValue = + lineColorIndex == 0 ? X_XAMA_BULLISH : lineColorIndex == 2 ? X_XAMA_BEARISH + : X_XAMA_NEUTURAL; + + // + // Set Ma Buffer Color Index ... + maColorBuffer[bar_index] = lineColorIndex; + + // + // Set State Buffer Value ... + stateBuffer[bar_index] = stateValue; +} + +// +// END Functions ... +// diff --git a/BKPS/OLD/XEU5-0/Indicators/x-saherelm.xchlh.oscillator.mq5 b/BKPS/OLD/XEU5-0/Indicators/x-saherelm.xchlh.oscillator.mq5 new file mode 100644 index 0000000..5c74787 --- /dev/null +++ b/BKPS/OLD/XEU5-0/Indicators/x-saherelm.xchlh.oscillator.mq5 @@ -0,0 +1,753 @@ +////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 Cycle Channel LH Oscillator +// --------------------------------------------------- +// Name: XCHLH +// Description: detecting HH and LL based on cycles ... +// +// +// 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 XCHLH Oscillator" +#property strict + +// +// START Constants ... +// +#define ShortName "XCHLH" + +// +// XCHLH Hot States ... +enum ENUM_X_XCHLH_HOT_STATES +{ + X_XCHLH_HOT_HH = 1, + X_XCHLH_NEUTURAL = 0, + X_XCHLH_HOT_LL = -1, +}; + +// +// Including Models Library ... +#include "../Libraries/x-saherelm.models.lib.mq5" +// +// END Constants ... +// + +// +// START Inputs ... +// +// +// Common ... +input group "Hot Areas"; +input bool drawHotAreas = true; // Draw Hot Areas Symbol +input uchar hotHHArrowCode = 234; // Hot HH Arrow Code +input color hotHHArrowColor = clrAqua; // Hot HH Arrow Color +input uchar hotLLArrowCode = 233; // Hot LL Arrow Code +input color hotLLArrowColor = clrFuchsia; // Hot LL Arrow Color + +// +// LC Inputs ... +input group "Long Cycle"; +input group "LC Market"; +input int lcLength = 28; // Length +input double lcThresholdInPips = 0.3; // Threshold In Pips +input ENUM_SERIESMODE lcHHMode = MODE_HIGH; // Highest High Calculation Method +input ENUM_SERIESMODE lcLLMode = MODE_LOW; // Lowest Low Calculation Method +input group "LC Style"; +input int lcDrawWidth = 1; // Draw Width +input ENUM_DRAW_TYPE lcDrawType = DRAW_LINE; // Draw Type +input ENUM_LINE_STYLE lcDrawStyle = STYLE_DOT; // Draw Style +input color lcHHColor = clrAqua; // Highest High Color +input color lcLLColor = clrFuchsia; // Lowest Low Color +input group "LC Drawings"; +input bool lcDrawHH = true; // Draw Highest High +input bool lcDrawLL = true; // Draw Lowest Low + +// +// MC Inputs ... +input group "Medium Cycle"; +input group "MC Market"; +input int mcLength = 14; // Length +input double mcThresholdInPips = 0.3; // Threshold In Pips +input ENUM_SERIESMODE mcHHMode = MODE_HIGH; // Highest High Calculation Method +input ENUM_SERIESMODE mcLLMode = MODE_LOW; // Lowest Low Calculation Method +input group "MC Style"; +input int mcDrawWidth = 1; // Draw Width +input ENUM_DRAW_TYPE mcDrawType = DRAW_LINE; // Draw Type +input ENUM_LINE_STYLE mcDrawStyle = STYLE_DOT; // Draw Style +input color mcHHColor = clrLime; // Highest High Color +input color mcLLColor = clrRed; // Lowest Low Color +input group "MC Drawings"; +input bool mcDrawHH = true; // Draw Highest High +input bool mcDrawLL = true; // Draw Lowest Low + +// +// SC Inputs ... +input group "Short Cycle"; +input group "SC Market"; +input int scLength = 7; // Length +input double scThresholdInPips = 0.3; // Threshold In Pips +input ENUM_SERIESMODE scHHMode = MODE_HIGH; // Highest High Calculation Method +input ENUM_SERIESMODE scLLMode = MODE_LOW; // Lowest Low Calculation Method +input group "SC Style"; +input int scDrawWidth = 1; // Draw Width +input ENUM_DRAW_TYPE scDrawType = DRAW_LINE; // Draw Type +input ENUM_LINE_STYLE scDrawStyle = STYLE_DOT; // Draw Style +input color scHHColor = clrLightBlue; // Highest High Color +input color scLLColor = clrLightSalmon; // Lowest Low Color +input group "SC Drawings"; +input bool scDrawHH = true; // Draw Highest High +input bool scDrawLL = true; // Draw Lowest Low +// +// END Inputs ... +// + +// +// Includes Logging Library ... +#include "../Libraries/x-saherelm.log.lib.mq5"; + +// +// Includes Common Library ... +#include "../Libraries/x-saherelm.common.lib.mq5"; + +// +// Includes Draw Library ... +#include "../Libraries/x-saherelm.draw.lib.mq5"; + +// +// START Buffers ... +// +#property indicator_separate_window + +// +#property indicator_buffers 7 +#property indicator_plots 6 + +// +// LC ... +#define lcHHBufferIndex 0 +#define lcLLBufferIndex 1 + +// +double lcHHBuffer[]; +double lcLLBuffer[]; + +// +// MC ... +#define mcHHBufferIndex 2 +#define mcLLBufferIndex 3 + +// +double mcHHBuffer[]; +double mcLLBuffer[]; + +// +// SC ... +#define scHHBufferIndex 4 +#define scLLBufferIndex 5 + +// +double scHHBuffer[]; +double scLLBuffer[]; + +// +// Hot State ... +// +#define hotStateBufferIndex 6 + +// +double hotStateBuffer[]; +// +// 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 (!ValidateInputs()) + { + return INIT_PARAMETERS_INCORRECT; + } + + // + logTag = ShortName; + drawPrefix = ShortName; + + // + // 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 ... + + // + // ReDraw Chart ... + ChartRedraw(); + + // + // De Init Draw Library ... + OnDeinitDrawLibrary(); + + // + Comment(""); +} + +// +// Calculations ... +// +// 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; + + // + // 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 ... + int maxLength = MathMax(lcLength, mcLength); + maxLength = MathMax(maxLength, scLength); + + // + limit = prev_calculated < maxLength ? rates_total - (maxLength + 1) : rates_total - prev_calculated; + + // + // Main Loop ... + for (int i = limit; i >= 0 && !IsStopped(); i--) + { + // + CalculateBuffers(i); + } + + // + return rates_total; +} +// +// END Event Handlers ... +// + +// +// START Functions ... +// +// +// Validate Input Args for Initialization ... +bool ValidateInputs() +{ + // + bool result = false; + + // + // Validate Args ... + bool isLCInputsValid = + lcLength >= 4 && + lcLength > mcLength && + lcLength > scLength; + bool isMCInputsValid = + mcLength >= 4 && + mcLength > scLength && + mcLength < lcLength; + bool isSCInputsValid = + scLength >= 4 && + scLength < mcLength && + scLength < lcLength; + if ( + isLCInputsValid && + isMCInputsValid && + isSCInputsValid) + { + result = true; + } + + // + return result; +} + +// +// Define Indexes and Styles ... +void DefineBuffers() +{ + // + // LC ... + LCDefineBuffers(); + + // + // MC ... + MCDefineBuffers(); + + // + // SC ... + SCDefineBuffers(); + + // + // Hot State Buffer ... + HotStateDefineBuffers(); +} + +// +// Set Indicator Short Name and also we can define Buffers Labels ... +void SetIndicatorName() +{ + // + string indicatorShortName = ""; + StringConcatenate(indicatorShortName, ShortName, ""); + + // + IndicatorSetString(INDICATOR_SHORTNAME, indicatorShortName); +} + +// +// Calculate Buffers ... +void CalculateBuffers( + int bar_index // Current Candle Index ... +) +{ + // + // LC ... + LCCalculateBuffers(bar_index); + + // + // MC ... + MCCalculateBuffers(bar_index); + + // + // SC ... + SCCalculateBuffers(bar_index); + + // + // SIGNAL ... + SignalCalculateBuffers(bar_index); + + // + // HOT State Buffer ... + HotStateCalculateBuffers(bar_index); + + // + // After all Calculations we are ready to Draw what we want ... + DrawBuffers(bar_index); +} + +// +// LC Buffers Definitions ... +void LCDefineBuffers() +{ + // + // LC HH Buffer ... + string lcHHBufferLabel = ShortName + " LC HH (" + (string)lcLength + ")"; + ENUM_DRAW_TYPE lcHHDrawType = lcDrawHH ? lcDrawType : DRAW_NONE; + ArraySetAsSeries(lcHHBuffer, true); + SetIndexBuffer(lcHHBufferIndex, lcHHBuffer, INDICATOR_DATA); + PlotIndexSetInteger(lcHHBufferIndex, PLOT_DRAW_BEGIN, lcLength); + PlotIndexSetString(lcHHBufferIndex, PLOT_LABEL, lcHHBufferLabel); + PlotIndexSetInteger(lcHHBufferIndex, PLOT_LINE_COLOR, lcHHColor); + PlotIndexSetInteger(lcHHBufferIndex, PLOT_LINE_STYLE, lcDrawStyle); + PlotIndexSetInteger(lcHHBufferIndex, PLOT_LINE_WIDTH, lcDrawWidth); + PlotIndexSetInteger(lcHHBufferIndex, PLOT_DRAW_TYPE, lcHHDrawType); + + // + // LC LL Buffer ... + string lcLLBufferLabel = ShortName + " LC LL (" + (string)lcLength + ")"; + ENUM_DRAW_TYPE lcLLDrawType = lcDrawLL ? lcDrawType : DRAW_NONE; + ArraySetAsSeries(lcLLBuffer, true); + SetIndexBuffer(lcLLBufferIndex, lcLLBuffer, INDICATOR_DATA); + PlotIndexSetInteger(lcLLBufferIndex, PLOT_DRAW_BEGIN, lcLength); + PlotIndexSetString(lcLLBufferIndex, PLOT_LABEL, lcLLBufferLabel); + PlotIndexSetInteger(lcLLBufferIndex, PLOT_LINE_COLOR, lcLLColor); + PlotIndexSetInteger(lcLLBufferIndex, PLOT_LINE_STYLE, lcDrawStyle); + PlotIndexSetInteger(lcLLBufferIndex, PLOT_LINE_WIDTH, lcDrawWidth); + PlotIndexSetInteger(lcLLBufferIndex, PLOT_DRAW_TYPE, lcLLDrawType); +} + +// +// MC Buffers Definitions ... +void MCDefineBuffers() +{ + // + // MC HH Buffer ... + string mcHHBufferLabel = ShortName + " MC HH (" + (string)mcLength + ")"; + ENUM_DRAW_TYPE mcHHDrawType = mcDrawHH ? lcDrawType : DRAW_NONE; + ArraySetAsSeries(mcHHBuffer, true); + SetIndexBuffer(mcHHBufferIndex, mcHHBuffer, INDICATOR_DATA); + PlotIndexSetInteger(mcHHBufferIndex, PLOT_DRAW_BEGIN, mcLength); + PlotIndexSetString(mcHHBufferIndex, PLOT_LABEL, mcHHBufferLabel); + PlotIndexSetInteger(mcHHBufferIndex, PLOT_LINE_COLOR, mcHHColor); + PlotIndexSetInteger(mcHHBufferIndex, PLOT_LINE_STYLE, mcDrawStyle); + PlotIndexSetInteger(mcHHBufferIndex, PLOT_LINE_WIDTH, mcDrawWidth); + PlotIndexSetInteger(mcHHBufferIndex, PLOT_DRAW_TYPE, mcHHDrawType); + + // + // MC LL Buffer ... + string mcLLBufferLabel = ShortName + " MC LL (" + (string)mcLength + ")"; + ENUM_DRAW_TYPE mcLLDrawType = mcDrawLL ? lcDrawType : DRAW_NONE; + ArraySetAsSeries(mcLLBuffer, true); + SetIndexBuffer(mcLLBufferIndex, mcLLBuffer, INDICATOR_DATA); + PlotIndexSetInteger(mcLLBufferIndex, PLOT_DRAW_BEGIN, mcLength); + PlotIndexSetString(mcLLBufferIndex, PLOT_LABEL, mcLLBufferLabel); + PlotIndexSetInteger(mcLLBufferIndex, PLOT_LINE_COLOR, mcLLColor); + PlotIndexSetInteger(mcLLBufferIndex, PLOT_LINE_STYLE, mcDrawStyle); + PlotIndexSetInteger(mcLLBufferIndex, PLOT_LINE_WIDTH, mcDrawWidth); + PlotIndexSetInteger(mcLLBufferIndex, PLOT_DRAW_TYPE, mcLLDrawType); +} + +// +// SC Buffers Definitions ... +void SCDefineBuffers() +{ + // + // SC HH Buffer ... + string scHHBufferLabel = ShortName + " SC HH (" + (string)scLength + ")"; + ENUM_DRAW_TYPE scHHDrawType = scDrawHH ? lcDrawType : DRAW_NONE; + ArraySetAsSeries(scHHBuffer, true); + SetIndexBuffer(scHHBufferIndex, scHHBuffer, INDICATOR_DATA); + PlotIndexSetInteger(scHHBufferIndex, PLOT_DRAW_BEGIN, scLength); + PlotIndexSetString(scHHBufferIndex, PLOT_LABEL, scHHBufferLabel); + PlotIndexSetInteger(scHHBufferIndex, PLOT_LINE_COLOR, scHHColor); + PlotIndexSetInteger(scHHBufferIndex, PLOT_LINE_STYLE, scDrawStyle); + PlotIndexSetInteger(scHHBufferIndex, PLOT_LINE_WIDTH, scDrawWidth); + PlotIndexSetInteger(scHHBufferIndex, PLOT_DRAW_TYPE, scHHDrawType); + + // + // SC LL Buffer ... + string scLLBufferLabel = ShortName + " SC LL (" + (string)scLength + ")"; + ENUM_DRAW_TYPE scLLDrawType = scDrawLL ? lcDrawType : DRAW_NONE; + ArraySetAsSeries(scLLBuffer, true); + SetIndexBuffer(scLLBufferIndex, scLLBuffer, INDICATOR_DATA); + PlotIndexSetInteger(scLLBufferIndex, PLOT_DRAW_BEGIN, scLength); + PlotIndexSetString(scLLBufferIndex, PLOT_LABEL, scLLBufferLabel); + PlotIndexSetInteger(scLLBufferIndex, PLOT_LINE_COLOR, scLLColor); + PlotIndexSetInteger(scLLBufferIndex, PLOT_LINE_STYLE, scDrawStyle); + PlotIndexSetInteger(scLLBufferIndex, PLOT_LINE_WIDTH, scDrawWidth); + PlotIndexSetInteger(scLLBufferIndex, PLOT_DRAW_TYPE, scLLDrawType); +} + +// +// Hot State Buffer ... +void HotStateDefineBuffers() +{ + // + // Hot State Buffer ... + ArraySetAsSeries(hotStateBuffer, true); + SetIndexBuffer(hotStateBufferIndex, hotStateBuffer, INDICATOR_CALCULATIONS); +} + +// +// LC Calculations ... +void LCCalculateBuffers( + int bar_index // Current Candle Index ... +) +{ + // + // Detect Cycle HH and LL ... + int length = lcLength; + ENUM_SERIESMODE hhMode = lcHHMode; + ENUM_SERIESMODE llMode = lcLLMode; + double threshold = PipsToPrice(lcThresholdInPips); + double hh = GetHighestHigh( + length, + bar_index, + hhMode); + double hhValue = hh + threshold; + double ll = GetLowestLow( + length, + bar_index, + llMode); + double llValue = ll - threshold; + + // + lcHHBuffer[bar_index] = hhValue; + lcLLBuffer[bar_index] = llValue; +} + +// +// MC Calculations ... +void MCCalculateBuffers( + int bar_index // Current Candle Index ... +) +{ + // + // Detect Cycle HH and LL ... + int length = mcLength; + ENUM_SERIESMODE hhMode = mcHHMode; + ENUM_SERIESMODE llMode = mcLLMode; + double threshold = PipsToPrice(mcThresholdInPips); + double hh = GetHighestHigh( + length, + bar_index, + hhMode); + double hhValue = hh + threshold; + double ll = GetLowestLow( + length, + bar_index, + llMode); + double llValue = ll - threshold; + + // + mcHHBuffer[bar_index] = hhValue; + mcLLBuffer[bar_index] = llValue; +} + +// +// SC Calculations ... +void SCCalculateBuffers( + int bar_index // Current Candle Index ... +) +{ + // + // Detect Cycle HH and LL ... + int length = scLength; + ENUM_SERIESMODE hhMode = scHHMode; + ENUM_SERIESMODE llMode = scLLMode; + double threshold = PipsToPrice(scThresholdInPips); + double hh = GetHighestHigh( + length, + bar_index, + hhMode); + double hhValue = hh + threshold; + double ll = GetLowestLow( + length, + bar_index, + llMode); + double llValue = ll - threshold; + + // + scHHBuffer[bar_index] = hhValue; + scLLBuffer[bar_index] = llValue; +} + +// +// SIGNAL Calculations ... +void SignalCalculateBuffers( + int bar_index // Current Candle Index ... +) +{ + // + // LC Values ... + double lcHH = lcHHBuffer[bar_index]; + double lcLL = lcLLBuffer[bar_index]; + double lcDelta = lcHH - lcLL; + double lcAvg = lcDelta / 2; + + // + // MC Values ... + double mcHH = mcHHBuffer[bar_index]; + double mcLL = mcLLBuffer[bar_index]; + double mcDelta = mcHH - mcLL; + double mcAvg = mcDelta / 2; + + // + // SC Values ... + double scHH = scHHBuffer[bar_index]; + double scLL = scLLBuffer[bar_index]; + double scDelta = scHH - scLL; + double scAvg = scDelta / 2; + + // + // Min Value ... + double minValue = MathMin( + scLL, mcLL); + minValue = MathMin( + lcLL, minValue); + + // + // Max Value ... + double maxValue = MathMin( + scHH, mcHH); + maxValue = MathMin( + lcHH, maxValue); +} + +// +// HOT State Calculate Buffers ... +void HotStateCalculateBuffers( + int bar_index // Current Candle Index ... +) +{ + // + // LC ... + double lcHH = lcHHBuffer[bar_index]; + double lcLL = lcLLBuffer[bar_index]; + // + double lcHH1 = lcHHBuffer[bar_index + 1]; + double lcLL1 = lcLLBuffer[bar_index + 1]; + + // + // MC ... + double mcHH = mcHHBuffer[bar_index]; + double mcLL = mcLLBuffer[bar_index]; + // + double mcHH1 = mcHHBuffer[bar_index + 1]; + double mcLL1 = mcLLBuffer[bar_index + 1]; + + // + // SC ... + double scHH = scHHBuffer[bar_index]; + double scLL = scLLBuffer[bar_index]; + // + double scHH1 = scHHBuffer[bar_index + 1]; + double scLL1 = scLLBuffer[bar_index + 1]; + + // + bool isHotLLState = scLL == mcLL && mcLL == lcLL; + bool isHotLLState1 = scLL1 == mcLL1 && mcLL1 == lcLL1; + // + bool isHotHHState = scHH == mcHH && mcHH == lcHH; + bool isHotHHState1 = scHH1 == mcHH1 && mcHH1 == lcHH1; + + // + bool isHotLL = isHotLLState && !isHotLLState1; + bool isHotHH = isHotHHState && !isHotHHState1; + + // + double hotStateValue = X_XCHLH_NEUTURAL; + if (isHotHH) + { + hotStateValue = X_XCHLH_HOT_HH; + } + else if (isHotLL) + { + hotStateValue = X_XCHLH_HOT_LL; + } + + // + hotStateBuffer[bar_index] = hotStateValue; +} + +// +// Draw Buffers ... +void DrawBuffers( + int bar_index // Current Candle Index ... +) +{ + // + // General Requirements ... + + // + // Retrieve Candle Model ... + XOHCL candle = GetCandle(bar_index); + datetime time = iTime(_Symbol, _Period, bar_index); + + // + // Draw Arrow on Hot Areas ... + if (drawHotAreas) + { + // + double hotStateValue = hotStateBuffer[bar_index]; + bool isHotHHArea = hotStateValue == 1; + bool isHotLLArea = hotStateValue == -1; + if (isHotHHArea || isHotLLArea) + { + // + bool isHH = isHotHHArea; + + // + double price = isHH ? candle.high : candle.low; + ENUM_ARROW_ANCHOR anchor = isHH ? ANCHOR_BOTTOM : ANCHOR_TOP; + color clr = isHH ? hotHHArrowColor : hotLLArrowColor; + uchar arrowCode = isHH ? hotHHArrowCode : hotLLArrowCode; + string name = "HOT " + (isHH ? "HH" : "LL") + "_" + (string)price + "_" + (string)time; + + // + DrawArrow( + 0, + name, + 0, + time, + price, + arrowCode, + anchor, + clr, + STYLE_SOLID, + 1); + } + } +} +// +// END Functions ... +// diff --git a/BKPS/OLD/XEU5-0/Indicators/x-saherelm.xchma.oscillator.mq5 b/BKPS/OLD/XEU5-0/Indicators/x-saherelm.xchma.oscillator.mq5 new file mode 100644 index 0000000..12d6c69 --- /dev/null +++ b/BKPS/OLD/XEU5-0/Indicators/x-saherelm.xchma.oscillator.mq5 @@ -0,0 +1,1153 @@ +/////////////////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 Cycle Channel Moving Averages Oscillator +// ---------------------------------------------------------------- +// Name: XCHMA +// Description: trend detecting based on cycles ... +// +// +// 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 XCHMA Oscillator" +#property strict + +// +// START Constants ... +// +#define ShortName "XCHMA" + +// +// XCHMA Oscillator Cycles State Presentation ... +enum ENUM_XCHMA_CYCLE_STATES +{ + X_XCHMA_FAST_CROSSED_OVER_SLOW = 2, + X_XCHMA_FAST_OVER_SLOW = 1, + X_XCHMA_NEUTURAL = 0, + X_XCHMA_FAST_UNDER_SLOW = -1, + X_XCHMA_FAST_CROSSED_UNDER_SLOW = -2, +}; +// +// END Constants ... +// + +// +// START Inputs ... +// +// +// Common ... +input group "Hot Areas"; +input bool drawHotAreas = true; // Draw Hot Areas Symbol +input uchar hotBullishArrowCode = 228; // Hot Bullish Arrow Code +input color hotBullishArrowColor = clrAqua; // Hot Bullish Arrow Color +input uchar hotBearishArrowCode = 230; // Hot Bearish Arrow Code +input color hotBearishArrowColor = clrFuchsia; // Hot Bearish Arrow Color + +// +// LC Inputs ... +input group "Long Cycle"; +input group "LC Market"; +input int lcFastLength = 20; // Fast Length +input int lcSlowLength = 50; // Slow Length +input ENUM_MA_METHOD lcMethod = MODE_EMA; // Calculation Method +input ENUM_APPLIED_PRICE lcAppliedTo = PRICE_CLOSE; // Applied To +input group "LC Style"; +input int lcDrawWidth = 1; // Draw Width +input ENUM_DRAW_TYPE lcDrawType = DRAW_LINE; // Draw Type +input ENUM_LINE_STYLE lcDrawStyle = STYLE_DOT; // Draw Style +input color lcFastColor = clrAqua; // Fast Color +input color lcSlowColor = clrFuchsia; // Slow Color +input group "LC Drawings"; +input bool lcDrawFast = true; // Draw Fast +input bool lcDrawSlow = true; // Draw Slow +input bool lcDrawCrosses = true; // Draw Cross Lines + +// +// MC Inputs ... +input group "Medium Cycle"; +input group "MC Market"; +input int mcFastLength = 10; // Fast Length +input int mcSlowLength = 30; // Slow Length +input ENUM_MA_METHOD mcMethod = MODE_EMA; // Calculation Method +input ENUM_APPLIED_PRICE mcAppliedTo = PRICE_CLOSE; // Applied To +input group "MC Style"; +input int mcDrawWidth = 1; // Draw Width +input ENUM_DRAW_TYPE mcDrawType = DRAW_LINE; // Draw Type +input ENUM_LINE_STYLE mcDrawStyle = STYLE_DOT; // Draw Style +input color mcFastColor = clrLime; // Fast Color +input color mcSlowColor = clrRed; // Slow Color +input group "MC Drawings"; +input bool mcDrawFast = true; // Draw Fast +input bool mcDrawSlow = true; // Draw Slow +input bool mcDrawCrosses = false; // Draw Cross Lines + +// +// SC Inputs ... +input group "Short Cycle"; +input group "SC Market"; +input int scFastLength = 7; // Fast Length +input int scSlowLength = 14; // Slow Length +input ENUM_MA_METHOD scMethod = MODE_EMA; // Calculation Method +input ENUM_APPLIED_PRICE scAppliedTo = PRICE_CLOSE; // Applied To +input group "SC Style"; +input int scDrawWidth = 1; // Draw Width +input ENUM_DRAW_TYPE scDrawType = DRAW_LINE; // Draw Type +input ENUM_LINE_STYLE scDrawStyle = STYLE_SOLID; // Draw Style +input color scFastColor = clrLightBlue; // Fast Color +input color scSlowColor = clrLightSalmon; // Slow Color +input group "SC Drawings"; +input bool scDrawFast = true; // Draw Fast +input bool scDrawSlow = true; // Draw Slow +input bool scDrawCrosses = false; // Draw Cross Lines +// +// END Inputs ... +// + +// +// Includes Logging Library ... +#include "../Libraries/x-saherelm.log.lib.mq5" + +// +// Includes Common Library ... +#include "../Libraries/x-saherelm.common.lib.mq5" + +// +// Includes Draw Library ... +#include "../Libraries/x-saherelm.draw.lib.mq5" + +// +// START Buffers ... +// +#property indicator_separate_window + +// +#property indicator_buffers 7 +#property indicator_plots 6 + +// +// LC ... +#define lcFastBufferIndex 0 +#define lcSlowBufferIndex 1 + +// +double lcFastBuffer[]; +double lcSlowBuffer[]; + +// +// MC ... +#define mcFastBufferIndex 2 +#define mcSlowBufferIndex 3 + +// +double mcFastBuffer[]; +double mcSlowBuffer[]; + +// +// SC ... +#define scFastBufferIndex 4 +#define scSlowBufferIndex 5 + +// +double scFastBuffer[]; +double scSlowBuffer[]; + +// +// Hot State ... +// +#define hotStateBufferIndex 6 + +// +double hotStateBuffer[]; +// +// END Buffers ... +// + +// +// START Global Definitions: Variables, Properties and etc ... +// +// +// LC ... +int lcFastHandler = INVALID_HANDLE; +int lcSlowHandler = INVALID_HANDLE; + +// +// MC ... +int mcFastHandler = INVALID_HANDLE; +int mcSlowHandler = INVALID_HANDLE; + +// +// SC ... +int scFastHandler = INVALID_HANDLE; +int scSlowHandler = INVALID_HANDLE; +// +// END Global Definitions: Variables, Properties and etc ... +// + +// +// START Event Handlers ... +// +// +// Initialization ... +int OnInit() +{ + // + // Validate Inputs ... + if (!ValidateInputs()) + { + return INIT_PARAMETERS_INCORRECT; + } + + // + logTag = ShortName; + drawPrefix = ShortName; + + // + // Define Index Buffers ... + DefineBuffers(); + + // + // Set Indicator ShortName ... + SetIndicatorName(); + + // + // Init All Required Handlers ... + if (!InitHandlers()) + { + 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 ... + + // + // ReDraw Chart ... + ChartRedraw(); + + // + // De Init Draw Library ... + OnDeinitDrawLibrary(); + + // + Comment(""); +} + +// +// Calculations ... +// +// 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; + + // + // 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 ... + int maxLength = MathMax(lcFastLength, lcSlowLength); + + // + // Get Retrieved Values from indicators ... + // + // LC ... + int lcFastCalculatedBars = BarsCalculated(lcFastHandler); + int lcSlowCalculatedBars = BarsCalculated(lcSlowHandler); + + // + // MC ... + int mcFastCalculatedBars = BarsCalculated(mcFastHandler); + int mcSlowCalculatedBars = BarsCalculated(mcSlowHandler); + + // + // SC ... + int scFastCalculatedBars = BarsCalculated(scFastHandler); + int scSlowCalculatedBars = BarsCalculated(scSlowHandler); + + // + // Check Calculated Bars ... + if ( + // + // LC ... + lcFastCalculatedBars < maxLength || + lcSlowCalculatedBars < maxLength || + // + // MC ... + mcFastCalculatedBars < maxLength || + mcSlowCalculatedBars < maxLength || + // + // SC ... + scFastCalculatedBars < maxLength || + scSlowCalculatedBars < maxLength) + { + return prev_calculated; + } + + // + limit = prev_calculated < maxLength ? rates_total - (maxLength + 1) : rates_total - prev_calculated; + + // + // Copy Buffers from indicators ... + // + // LC ... + int lcFastCopiedItems = CopyBuffer(lcFastHandler, 0, 0, limit + 1, lcFastBuffer); + int lcSlowCopiedItems = CopyBuffer(lcSlowHandler, 0, 0, limit + 1, lcSlowBuffer); + + // + // MC ... + int mcFastCopiedItems = CopyBuffer(mcFastHandler, 0, 0, limit + 1, mcFastBuffer); + int mcSlowCopiedItems = CopyBuffer(mcSlowHandler, 0, 0, limit + 1, mcSlowBuffer); + + // + // SC ... + int scFastCopiedItems = CopyBuffer(scFastHandler, 0, 0, limit + 1, scFastBuffer); + int scSlowCopiedItems = CopyBuffer(scSlowHandler, 0, 0, limit + 1, scSlowBuffer); + + // + // Check Copied Items Number ... + if ( + // + // LC ... + lcFastCopiedItems <= 0 || + lcSlowCopiedItems <= 0 || + // + // MC ... + mcFastCopiedItems <= 0 || + mcSlowCopiedItems <= 0 || + // + // MC ... + mcFastCopiedItems <= 0 || + mcSlowCopiedItems <= 0) + { + return prev_calculated; + } + + // + // Main Loop ... + for (int i = limit; i >= 0 && !IsStopped(); i--) + { + // + CalculateBuffers(i); + } + + // + return rates_total; +} +// +// END Event Handlers ... +// + +// +// START Functions ... +// +// +// Validate Input Args for Initialization ... +bool ValidateInputs() +{ + // + bool result = false; + + // + // Validate Args ... + bool isLCInputsValid = lcFastLength >= 4 && lcSlowLength > lcFastLength; + bool isMCInputsValid = mcFastLength >= 4 && mcSlowLength > mcFastLength; + bool isSCInputsValid = scFastLength >= 4 && scSlowLength > scFastLength; + if ( + isLCInputsValid && + isMCInputsValid && + isSCInputsValid && + lcFastLength > mcFastLength && + mcFastLength > scFastLength) + { + result = true; + } + + // + return result; +} + +// +// Define Indexes and Styles ... +void DefineBuffers() +{ + // + // LC ... + LCDefineBuffers(); + + // + // MC ... + MCDefineBuffers(); + + // + // SC ... + SCDefineBuffers(); + + // + // Hot State Buffer ... + HotStateDefineBuffers(); +} + +// +// Init Handlers ... +bool InitHandlers() +{ + // + bool result = false; + + // + // LC ... + result = LCInitHandlers(); + if (!result) + { + return result; + } + + // + // MC ... + result = MCInitHandlers(); + if (!result) + { + return result; + } + + // + // SC ... + result = SCInitHandlers(); + if (!result) + { + return result; + } + + // + return result; +} + +// +// Set Indicator Short Name and also we can define Buffers Labels ... +void SetIndicatorName() +{ + // + string indicatorShortName = ""; + StringConcatenate(indicatorShortName, ShortName, ""); + + // + IndicatorSetString(INDICATOR_SHORTNAME, indicatorShortName); +} + +// +// Calculate Buffers ... +void CalculateBuffers( + int bar_index // Current Candle Index ... +) +{ + // + // HOT State Buffer ... + HotStateCalculateBuffers(bar_index); + + // + // After all Calculations we are ready to Draw what we want ... + DrawBuffers(bar_index); +} + +// +// LC Buffers Definitions ... +void LCDefineBuffers() +{ + // + // LC Fast Buffer ... + string lcFastBufferLabel = ShortName + " LC Fast (" + (string)lcFastLength + ")"; + ENUM_DRAW_TYPE lcFastDrawType = lcDrawFast ? lcDrawType : DRAW_NONE; + ArraySetAsSeries(lcFastBuffer, true); + SetIndexBuffer(lcFastBufferIndex, lcFastBuffer, INDICATOR_DATA); + PlotIndexSetString(lcFastBufferIndex, PLOT_LABEL, lcFastBufferLabel); + PlotIndexSetInteger(lcFastBufferIndex, PLOT_LINE_COLOR, lcFastColor); + PlotIndexSetInteger(lcFastBufferIndex, PLOT_LINE_STYLE, lcDrawStyle); + PlotIndexSetInteger(lcFastBufferIndex, PLOT_LINE_WIDTH, lcDrawWidth); + PlotIndexSetInteger(lcFastBufferIndex, PLOT_DRAW_BEGIN, lcFastLength); + PlotIndexSetInteger(lcFastBufferIndex, PLOT_DRAW_TYPE, lcFastDrawType); + + // + // LC Slow Buffer ... + string lcSlowBufferLabel = ShortName + " LC Slow (" + (string)lcSlowLength + ")"; + ENUM_DRAW_TYPE lcSlowDrawType = lcDrawSlow ? lcDrawType : DRAW_NONE; + ArraySetAsSeries(lcSlowBuffer, true); + SetIndexBuffer(lcSlowBufferIndex, lcSlowBuffer, INDICATOR_DATA); + PlotIndexSetString(lcSlowBufferIndex, PLOT_LABEL, lcSlowBufferLabel); + PlotIndexSetInteger(lcSlowBufferIndex, PLOT_LINE_COLOR, lcSlowColor); + PlotIndexSetInteger(lcSlowBufferIndex, PLOT_LINE_STYLE, lcDrawStyle); + PlotIndexSetInteger(lcSlowBufferIndex, PLOT_LINE_WIDTH, lcDrawWidth); + PlotIndexSetInteger(lcSlowBufferIndex, PLOT_DRAW_BEGIN, lcSlowLength); + PlotIndexSetInteger(lcSlowBufferIndex, PLOT_DRAW_TYPE, lcSlowDrawType); +} + +// +// MC Buffers Definitions ... +void MCDefineBuffers() +{ + // + // MC Fast Buffer ... + string mcFastBufferLabel = ShortName + " MC Fast (" + (string)mcFastLength + ")"; + ENUM_DRAW_TYPE mcFastDrawType = mcDrawFast ? lcDrawType : DRAW_NONE; + ArraySetAsSeries(mcFastBuffer, true); + SetIndexBuffer(mcFastBufferIndex, mcFastBuffer, INDICATOR_DATA); + PlotIndexSetString(mcFastBufferIndex, PLOT_LABEL, mcFastBufferLabel); + PlotIndexSetInteger(mcFastBufferIndex, PLOT_LINE_COLOR, mcFastColor); + PlotIndexSetInteger(mcFastBufferIndex, PLOT_LINE_STYLE, mcDrawStyle); + PlotIndexSetInteger(mcFastBufferIndex, PLOT_LINE_WIDTH, mcDrawWidth); + PlotIndexSetInteger(mcFastBufferIndex, PLOT_DRAW_BEGIN, mcFastLength); + PlotIndexSetInteger(mcFastBufferIndex, PLOT_DRAW_TYPE, mcFastDrawType); + + // + // MC Slow Buffer ... + string mcSlowBufferLabel = ShortName + " MC Slow (" + (string)mcSlowLength + ")"; + ENUM_DRAW_TYPE mcSlowDrawType = mcDrawSlow ? lcDrawType : DRAW_NONE; + ArraySetAsSeries(mcSlowBuffer, true); + SetIndexBuffer(mcSlowBufferIndex, mcSlowBuffer, INDICATOR_DATA); + PlotIndexSetString(mcSlowBufferIndex, PLOT_LABEL, mcSlowBufferLabel); + PlotIndexSetInteger(mcSlowBufferIndex, PLOT_LINE_COLOR, mcSlowColor); + PlotIndexSetInteger(mcSlowBufferIndex, PLOT_LINE_STYLE, mcDrawStyle); + PlotIndexSetInteger(mcSlowBufferIndex, PLOT_LINE_WIDTH, mcDrawWidth); + PlotIndexSetInteger(mcSlowBufferIndex, PLOT_DRAW_BEGIN, mcSlowLength); + PlotIndexSetInteger(mcSlowBufferIndex, PLOT_DRAW_TYPE, mcSlowDrawType); +} + +// +// SC Buffers Definitions ... +void SCDefineBuffers() +{ + // + // SC Fast Buffer ... + string scFastBufferLabel = ShortName + " SC Fast (" + (string)scFastLength + ")"; + ENUM_DRAW_TYPE scFastDrawType = scDrawFast ? lcDrawType : DRAW_NONE; + ArraySetAsSeries(scFastBuffer, true); + SetIndexBuffer(scFastBufferIndex, scFastBuffer, INDICATOR_DATA); + PlotIndexSetString(scFastBufferIndex, PLOT_LABEL, scFastBufferLabel); + PlotIndexSetInteger(scFastBufferIndex, PLOT_LINE_COLOR, scFastColor); + PlotIndexSetInteger(scFastBufferIndex, PLOT_LINE_STYLE, scDrawStyle); + PlotIndexSetInteger(scFastBufferIndex, PLOT_LINE_WIDTH, scDrawWidth); + PlotIndexSetInteger(scFastBufferIndex, PLOT_DRAW_BEGIN, scFastLength); + PlotIndexSetInteger(scFastBufferIndex, PLOT_DRAW_TYPE, scFastDrawType); + + // + // SC Slow Buffer ... + string scSlowBufferLabel = ShortName + " SC Slow (" + (string)scSlowLength + ")"; + ENUM_DRAW_TYPE scSlowDrawType = scDrawSlow ? lcDrawType : DRAW_NONE; + ArraySetAsSeries(scSlowBuffer, true); + SetIndexBuffer(scSlowBufferIndex, scSlowBuffer, INDICATOR_DATA); + PlotIndexSetString(scSlowBufferIndex, PLOT_LABEL, scSlowBufferLabel); + PlotIndexSetInteger(scSlowBufferIndex, PLOT_LINE_COLOR, scSlowColor); + PlotIndexSetInteger(scSlowBufferIndex, PLOT_LINE_STYLE, scDrawStyle); + PlotIndexSetInteger(scSlowBufferIndex, PLOT_LINE_WIDTH, scDrawWidth); + PlotIndexSetInteger(scSlowBufferIndex, PLOT_DRAW_BEGIN, scSlowLength); + PlotIndexSetInteger(scSlowBufferIndex, PLOT_DRAW_TYPE, scSlowDrawType); +} + +// +// Hot State Buffer ... +void HotStateDefineBuffers() +{ + // + // Hot State Buffer ... + ArraySetAsSeries(hotStateBuffer, true); + SetIndexBuffer(hotStateBufferIndex, hotStateBuffer, INDICATOR_CALCULATIONS); +} + +// +// LC Init Handlers ... +bool LCInitHandlers() +{ + // + ResetLastError(); + + // + // LC Fast Handler ... + lcFastHandler = iMA( + _Symbol, + _Period, + lcFastLength, + 0, + lcMethod, + lcAppliedTo); + if (lcFastHandler == INVALID_HANDLE) + { + // + LogMessage("LC Fast Indicator initialization failed: " + (string)GetLastError()); + + // + return false; + } + + // + // LC Slow Handler ... + lcSlowHandler = iMA( + _Symbol, + _Period, + lcSlowLength, + 0, + lcMethod, + lcAppliedTo); + if (lcSlowHandler == INVALID_HANDLE) + { + // + LogMessage("LC Slow Indicator initialization failed: " + (string)GetLastError()); + + // + return false; + } + + // + return true; +} + +// +// MC Init Handlers ... +bool MCInitHandlers() +{ + // + ResetLastError(); + + // + // MC Fast Handler ... + mcFastHandler = iMA( + _Symbol, + _Period, + mcFastLength, + 0, + mcMethod, + mcAppliedTo); + if (mcFastHandler == INVALID_HANDLE) + { + // + LogMessage("MC Fast Indicator initialization failed: " + (string)GetLastError()); + + // + return false; + } + + // + // MC Slow Handler ... + mcSlowHandler = iMA( + _Symbol, + _Period, + mcSlowLength, + 0, + mcMethod, + mcAppliedTo); + if (mcSlowHandler == INVALID_HANDLE) + { + // + LogMessage("MC Slow Indicator initialization failed: " + (string)GetLastError()); + + // + return false; + } + + // + return true; +} + +// +// SC Init Handlers ... +bool SCInitHandlers() +{ + // + ResetLastError(); + + // + // SC Fast Handler ... + scFastHandler = iMA( + _Symbol, + _Period, + scFastLength, + 0, + scMethod, + scAppliedTo); + if (scFastHandler == INVALID_HANDLE) + { + // + LogMessage("SC Fast Indicator initialization failed: " + (string)GetLastError()); + + // + return false; + } + + // + // SC Slow Handler ... + scSlowHandler = iMA( + _Symbol, + _Period, + scSlowLength, + 0, + scMethod, + scAppliedTo); + if (scSlowHandler == INVALID_HANDLE) + { + // + LogMessage("SC Slow Indicator initialization failed: " + (string)GetLastError()); + + // + return false; + } + + // + return true; +} + +// +// LC State ... +double GetLCState( + int bar_index // Current Candle Index ... +) +{ + // + // Fast Cross Over Slow Detection ... + bool isFastCrossedOverSlow = IsCrossOver( + lcFastBuffer, + lcSlowBuffer, + bar_index); + + // + // Fast Over Slow Detection ... + bool isFastOverSlow = IsOver( + lcFastBuffer, + lcSlowBuffer, + bar_index); + + // + // Fast Cross Under Slow Detection ... + bool isFastCrossedUnderSlow = IsCrossUnder( + lcFastBuffer, + lcSlowBuffer, + bar_index); + + // + // Fast Under Slow Detection ... + bool isFastUnderSlow = IsUnder( + lcFastBuffer, + lcSlowBuffer, + bar_index); + + // + // Generate state value which represent curren bar index + // state between fast and slow lines ... + double result = X_XCHMA_NEUTURAL; + + // + // Filling state value based on Market Conditions ... + if (isFastCrossedOverSlow) + { + result = X_XCHMA_FAST_CROSSED_OVER_SLOW; + } + else if (isFastCrossedUnderSlow) + { + result = X_XCHMA_FAST_CROSSED_UNDER_SLOW; + } + else if (isFastOverSlow) + { + result = X_XCHMA_FAST_OVER_SLOW; + } + else if (isFastUnderSlow) + { + result = X_XCHMA_FAST_UNDER_SLOW; + } + + // + return result; +} + +// +// MC State ... +double GetMCState( + int bar_index // Current Candle Index ... +) +{ + // + // Fast Cross Over Slow Detection ... + bool isFastCrossedOverSlow = IsCrossOver( + mcFastBuffer, + mcSlowBuffer, + bar_index); + + // + // Fast Over Slow Detection ... + bool isFastOverSlow = IsOver( + mcFastBuffer, + mcSlowBuffer, + bar_index); + + // + // Fast Cross Under Slow Detection ... + bool isFastCrossedUnderSlow = IsCrossUnder( + mcFastBuffer, + mcSlowBuffer, + bar_index); + + // + // Fast Under Slow Detection ... + bool isFastUnderSlow = IsUnder( + mcFastBuffer, + mcSlowBuffer, + bar_index); + + // + // Generate state value which represent curren bar index + // state between fast and slow lines ... + double result = X_XCHMA_NEUTURAL; + + // + // Filling state value based on Market Conditions ... + if (isFastCrossedOverSlow) + { + result = X_XCHMA_FAST_CROSSED_OVER_SLOW; + } + else if (isFastCrossedUnderSlow) + { + result = X_XCHMA_FAST_CROSSED_UNDER_SLOW; + } + else if (isFastOverSlow) + { + result = X_XCHMA_FAST_OVER_SLOW; + } + else if (isFastUnderSlow) + { + result = X_XCHMA_FAST_UNDER_SLOW; + } + + // + return result; +} + +// +// SC State ... +double GetSCState( + int bar_index // Current Candle Index ... +) +{ + // + // Fast Cross Over Slow Detection ... + bool isFastCrossedOverSlow = IsCrossOver( + scFastBuffer, + scSlowBuffer, + bar_index); + + // + // Fast Over Slow Detection ... + bool isFastOverSlow = IsOver( + scFastBuffer, + scSlowBuffer, + bar_index); + + // + // Fast Cross Under Slow Detection ... + bool isFastCrossedUnderSlow = IsCrossUnder( + scFastBuffer, + scSlowBuffer, + bar_index); + + // + // Fast Under Slow Detection ... + bool isFastUnderSlow = IsUnder( + scFastBuffer, + scSlowBuffer, + bar_index); + + // + // Generate state value which represent curren bar index + // state between fast and slow lines ... + double result = X_XCHMA_NEUTURAL; + + // + // Filling state value based on Market Conditions ... + if (isFastCrossedOverSlow) + { + result = X_XCHMA_FAST_CROSSED_OVER_SLOW; + } + else if (isFastCrossedUnderSlow) + { + result = X_XCHMA_FAST_CROSSED_UNDER_SLOW; + } + else if (isFastOverSlow) + { + result = X_XCHMA_FAST_OVER_SLOW; + } + else if (isFastUnderSlow) + { + result = X_XCHMA_FAST_UNDER_SLOW; + } + + // + return result; +} + +// +// HOT State Calculate Buffers ... +void HotStateCalculateBuffers( + int bar_index // Current Candle Index ... +) +{ + // + // LC ... + double lcFast = lcFastBuffer[bar_index]; + double lcSlow = lcSlowBuffer[bar_index]; + // + double lcFastPrev = lcFastBuffer[bar_index + 1]; + double lcSlowPrev = lcSlowBuffer[bar_index + 1]; + // + double lcState = GetLCState(bar_index); + + // + // MC ... + double mcFast = mcFastBuffer[bar_index]; + double mcSlow = mcSlowBuffer[bar_index]; + // + double mcFastPrev = mcFastBuffer[bar_index + 1]; + double mcSlowPrev = mcSlowBuffer[bar_index + 1]; + // + double mcState = GetMCState(bar_index); + + // + // SC ... + double scFast = scFastBuffer[bar_index]; + double scSlow = scSlowBuffer[bar_index]; + // + double scFastPrev = scFastBuffer[bar_index + 1]; + double scSlowPrev = scSlowBuffer[bar_index + 1]; + // + double scState = GetSCState(bar_index); + + // + // Detect HOT Bearish Area ... + bool isHotBearishArea = + lcFast < lcSlow && + mcFast < mcSlow && + scFast < scSlow; + // + bool isPrevHotBearishArea = + lcFastPrev < lcSlowPrev && + mcFastPrev < mcSlowPrev && + scFastPrev < scSlowPrev; + + // + // Detect HOT Bearish Area ... + bool isHotBullishArea = + lcFast > lcSlow && + mcFast > mcSlow && + scFast > scSlow; + // + bool isPrevHotBullishArea = + lcFastPrev > lcSlowPrev && + mcFastPrev > mcSlowPrev && + scFastPrev > scSlowPrev; + + // + // Generate HotState Value ... + double hotStateValue = + isHotBullishArea && !isPrevHotBullishArea + ? 1 + : isHotBearishArea && !isPrevHotBearishArea + ? -1 + : 0; + hotStateBuffer[bar_index] = hotStateValue; +} + +// +// Draw Buffers ... +void DrawBuffers( + int bar_index // Current Candle Index ... +) +{ + // + // General Requirements ... + + // + // Retrieve Candle Model ... + XOHCL candle = GetCandle(bar_index); + datetime time = iTime(_Symbol, _Period, bar_index); + + // + // Draw Arrow on Hot Areas ... + if (drawHotAreas) + { + // + double hotStateValue = hotStateBuffer[bar_index]; + bool isHotBullishArea = hotStateValue == 1; + bool isHotBearishArea = hotStateValue == -1; + if (isHotBullishArea || isHotBearishArea) + { + // + bool isBull = isHotBullishArea; + + // + double price = isBull ? candle.low : candle.high; + ENUM_ARROW_ANCHOR anchor = isBull ? ANCHOR_TOP : ANCHOR_BOTTOM; + color clr = isBull ? hotBullishArrowColor : hotBearishArrowColor; + uchar arrowCode = isBull ? hotBullishArrowCode : hotBearishArrowCode; + string name = "HOT " + (isBull ? "Bullish" : "Bearish") + "_" + (string)price + "_" + (string)time; + + // + DrawArrow( + 0, + name, + 0, + time, + price, + arrowCode, + anchor, + clr); + } + } + + // + // Draw LC Crosses ... + if (lcDrawCrosses) + { + // + double lcStateValue = GetLCState(bar_index); + bool isLcFastCrossedOverSlow = lcStateValue == X_XCHMA_FAST_CROSSED_OVER_SLOW; + bool isLcFastCrossedUnderSlow = lcStateValue == X_XCHMA_FAST_CROSSED_UNDER_SLOW; + if (isLcFastCrossedOverSlow || isLcFastCrossedUnderSlow) + { + // + bool isBull = isLcFastCrossedOverSlow; + + // + color clr = isBull ? lcFastColor : lcSlowColor; + string name = "LC Fast Cross " + (isBull ? "Over" : "Under") + "_" + (string)time; + + // + DrawVerticalLine( + 0, + name, + 0, + time, + clr); + } + } + + // + // Draw MC Crosses ... + if (mcDrawCrosses) + { + // + double mcStateValue = GetMCState(bar_index); + bool isMcFastCrossedOverSlow = mcStateValue == X_XCHMA_FAST_CROSSED_OVER_SLOW; + bool isMcFastCrossedUnderSlow = mcStateValue == X_XCHMA_FAST_CROSSED_UNDER_SLOW; + if (isMcFastCrossedOverSlow || isMcFastCrossedUnderSlow) + { + // + bool isBull = isMcFastCrossedOverSlow; + + // + color clr = isBull ? mcFastColor : mcSlowColor; + string name = "MC Fast Cross " + (isBull ? "Over" : "Under") + "_" + (string)time; + + // + DrawVerticalLine( + 0, + name, + 0, + time, + clr); + } + } + + // + // Draw SC Crosses ... + if (scDrawCrosses) + { + // + double scStateValue = GetSCState(bar_index); + bool isScFastCrossedOverSlow = scStateValue == X_XCHMA_FAST_CROSSED_OVER_SLOW; + bool isScFastCrossedUnderSlow = scStateValue == X_XCHMA_FAST_CROSSED_UNDER_SLOW; + if (isScFastCrossedOverSlow || isScFastCrossedUnderSlow) + { + // + bool isBull = isScFastCrossedOverSlow; + + // + color clr = isBull ? scFastColor : scSlowColor; + string name = "SC Fast Cross " + (isBull ? "Over" : "Under") + "_" + (string)time; + + // + DrawVerticalLine( + 0, + name, + 0, + time, + clr); + } + } +} +// +// END Functions ... +// diff --git a/BKPS/OLD/XEU5-0/Indicators/x-saherelm.xfi.oscillator.mq5 b/BKPS/OLD/XEU5-0/Indicators/x-saherelm.xfi.oscillator.mq5 new file mode 100644 index 0000000..cfd393c --- /dev/null +++ b/BKPS/OLD/XEU5-0/Indicators/x-saherelm.xfi.oscillator.mq5 @@ -0,0 +1,317 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 XFI Oscillator +// --------------------------------------------- +// Name: XFI +// Description: Price Momentum Power Detection +// Market Analysor ... +// +// +// 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 XFI Oscillator" +#property strict + +// +// START Constants ... +// +#define ShortName "XFI" +// +// END Constants ... +// + +// +// START Inputs ... +// +input int length = 18; // Length +input ENUM_MA_METHOD method = MODE_SMA; // MA Method +input ENUM_APPLIED_VOLUME appliedTo = VOLUME_TICK; // Applied To +// +// END Inputs ... +// + +// +// Includes Logging Library ... +#include "../Libraries/x-saherelm.log.lib.mq5" + +// +// Includes Common Library ... +#include "../Libraries/x-saherelm.common.lib.mq5" + +// +// START Buffers ... +// +#property indicator_separate_window + +// +#property indicator_buffers 2 +#property indicator_plots 1 + +// +// FI Buffer ... +#define fiBufferIndex 0 +#define fiColorBufferIndex 1 + +// +double fiBuffer[]; +double fiColorBuffer[]; + +// +#property indicator_label1 "XFI" +#property indicator_type1 DRAW_COLOR_LINE +#property indicator_color1 clrAqua, clrGray, clrFuchsia +#property indicator_style1 STYLE_DOT +#property indicator_width1 1 +// +// END Buffers ... +// + +// +// START Global Definitions: Variables, Properties and etc ... +// +int fiHandler = INVALID_HANDLE; +// +// END Global Definitions: Variables, Properties and etc ... +// + +// +// START Event Handlers ... +// +// +// Initialization ... +int OnInit() +{ + // + // Validate Inputs ... + if (!ValidateInputs()) + { + return INIT_PARAMETERS_INCORRECT; + } + + // + logTag = ShortName; + + // + fiHandler = iForce( + _Symbol, + _Period, + length, + method, + appliedTo); + if (fiHandler == INVALID_HANDLE) + { + // + string message = "Error Initializing Handler ..."; + LogMessage(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(fiHandler); +} + +// +// Calculations ... +// +// 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; + + // + // 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 ... + int maxLength = MathMax(0, length); + + // + // Check Calculated Bars ... + int fiCalculatedBars = BarsCalculated(fiHandler); + if (fiCalculatedBars < maxLength) + { + return prev_calculated; + } + + // + limit = (prev_calculated > rates_total || prev_calculated <= 0) ? rates_total : (rates_total - prev_calculated) + 1; + + // + // Buffers Copy ... + int copiedFis = CopyBuffer(fiHandler, 0, 0, limit, fiBuffer); + if (copiedFis <= 0) + { + return prev_calculated; + } + + // + // Main Loop ... + for (int i = 0; i < limit && !IsStopped(); i++) + { + // + 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; +} + +// +// Define Indexes and Styles ... +void DefineBuffers() +{ + // + string fiBufferLabel = "XFI " + "(" + (string)length + ")"; + + // + // FI Buffer ... + ArraySetAsSeries(fiBuffer, true); + SetIndexBuffer(fiBufferIndex, fiBuffer, INDICATOR_DATA); + PlotIndexSetString(fiBufferIndex, PLOT_LABEL, fiBufferLabel); + + // + // FI Color Buffer ... + ArraySetAsSeries(fiColorBuffer, true); + SetIndexBuffer(fiColorBufferIndex, fiColorBuffer, INDICATOR_COLOR_INDEX); +} + +// +// Set Indicator Short Name and also we can define Buffers Labels ... +void SetIndicatorName() +{ + // + string indicatorShortName = ""; + StringConcatenate(indicatorShortName, ShortName, ""); + + // + IndicatorSetString(INDICATOR_SHORTNAME, indicatorShortName); +} + +// +// Calculate Buffers ... +void CalculateBuffers( + int bar_index // Selected Bar Index +) +{ + // + double iValue = fiBuffer[bar_index]; + + // + double iColorIndex = + iValue > 0 ? 0 : iValue < 0 ? 2 + : 1; + + // + // Set Buffer Color Index ... + fiColorBuffer[bar_index] = iColorIndex; +} +// +// END Functions ... +// diff --git a/BKPS/OLD/XEU5-0/Indicators/x-saherelm.xlh.indicator.mq5 b/BKPS/OLD/XEU5-0/Indicators/x-saherelm.xlh.indicator.mq5 new file mode 100644 index 0000000..4dfc64e --- /dev/null +++ b/BKPS/OLD/XEU5-0/Indicators/x-saherelm.xlh.indicator.mq5 @@ -0,0 +1,346 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 XLH Indicator +// --------------------------------------------- +// Name: XLH +// Description: Moving Average Indicator +// Market Analysor ... +// +// +// 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 XLH Indicator" +#property strict + +// +// START Constants ... +// +#define ShortName "XLH" +// +// END Constants ... +// + +// +// START Inputs ... +// +input int length = 14; // Length +input ENUM_SERIESMODE hhMode = MODE_HIGH; // Highest High Calculation Method +input ENUM_SERIESMODE llMode = MODE_LOW; // Lowest Low Calculation Method +// +// END Inputs ... +// + +// +// Includes Logging Library ... +#include "../Libraries/x-saherelm.log.lib.mq5" + +// +// Includes Common Library ... +#include "../Libraries/x-saherelm.common.lib.mq5" + +// +// START Buffers ... +// +#property indicator_chart_window + +// +#property indicator_buffers 3 +#property indicator_plots 3 + +// +// HH Buffer ... +#define hhBufferIndex 0 + +// +double hhBuffer[]; + +// +#property indicator_label1 "XLH HH" +#property indicator_type1 DRAW_LINE +#property indicator_color1 clrAqua +#property indicator_style1 STYLE_DOT +#property indicator_width1 1 + +// +// LL Buffer ... +#define llBufferIndex 1 + +// +double llBuffer[]; + +// +#property indicator_label2 "XLH LL" +#property indicator_type2 DRAW_LINE +#property indicator_color2 clrFuchsia +#property indicator_style2 STYLE_DOT +#property indicator_width2 1 + +// +// Signal Buffer ... +#define signalBufferIndex 2 + +// +double signalBuffer[]; + +// +#property indicator_label3 "XLH S" +#property indicator_type3 DRAW_LINE +#property indicator_color3 clrGold +#property indicator_style3 STYLE_DOT +#property indicator_width3 1 +// +// 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 (!ValidateInputs()) + { + return INIT_PARAMETERS_INCORRECT; + } + + // + logTag = ShortName; + + // + // 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 ... +} + +// +// Calculations ... +// +// 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; + + // + // 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 ... + int maxLength = MathMax(0, length); + + // + 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 = false; + + // + // Validate Args ... + if (length >= 2) + { + result = true; + } + + // + return result; +} + +// +// Define Indexes and Styles ... +void DefineBuffers() +{ + // + // HH Buffer ... + string hhBufferLabel = ShortName + " HH " + "(" + (string)length + ")"; + ArraySetAsSeries(hhBuffer, true); + SetIndexBuffer(hhBufferIndex, hhBuffer, INDICATOR_DATA); + PlotIndexSetInteger(hhBufferIndex, PLOT_DRAW_BEGIN, length); + PlotIndexSetString(hhBufferIndex, PLOT_LABEL, hhBufferLabel); + + // + // LL Buffer ... + string llBufferLabel = ShortName + " LL " + "(" + (string)length + ")"; + ArraySetAsSeries(llBuffer, true); + SetIndexBuffer(llBufferIndex, llBuffer, INDICATOR_DATA); + PlotIndexSetInteger(llBufferIndex, PLOT_DRAW_BEGIN, length); + PlotIndexSetString(llBufferIndex, PLOT_LABEL, llBufferLabel); + + // + // Signal Buffer ... + string signalBufferLabel = ShortName + " S " + "(" + (string)length + ")"; + ArraySetAsSeries(signalBuffer, true); + SetIndexBuffer(signalBufferIndex, signalBuffer, INDICATOR_DATA); + PlotIndexSetInteger(signalBufferIndex, PLOT_DRAW_BEGIN, length); + PlotIndexSetString(signalBufferIndex, PLOT_LABEL, signalBufferLabel); +} + +// +// Set Indicator Short Name and also we can define Buffers Labels ... +void SetIndicatorName() +{ + // + string indicatorShortName = ""; + StringConcatenate(indicatorShortName, ShortName, ""); + + // + IndicatorSetString(INDICATOR_SHORTNAME, indicatorShortName); +} + +// +// Calculate Buffers ... +void CalculateBuffers( + int bar_index // Selected Bar Index +) +{ + // + // Calculate Threshold ... + // + // HH Buffer ... + int hhIndex = iHighest( + _Symbol, + _Period, + hhMode, + length, + bar_index); + double hhValue = GetAppliedPrice( + hhIndex, + hhMode); + + // + hhBuffer[bar_index] = hhValue; + + // + // LL Buffer ... + int llIndex = iLowest( + _Symbol, + _Period, + llMode, + length, + bar_index); + double llValue = GetAppliedPrice( + llIndex, + llMode); + + // + llBuffer[bar_index] = llValue; + + // + XOHCL c = GetCandle(bar_index); + double lhDiff = hhValue - llValue; + double signalValue = (lhDiff / 2); + + // + signalBuffer[bar_index] = (hhValue - signalValue); +} +// +// END Functions ... +// diff --git a/BKPS/OLD/XEU5-0/Indicators/x-saherelm.xobd.indicator.mq5 b/BKPS/OLD/XEU5-0/Indicators/x-saherelm.xobd.indicator.mq5 new file mode 100644 index 0000000..4ac05cf --- /dev/null +++ b/BKPS/OLD/XEU5-0/Indicators/x-saherelm.xobd.indicator.mq5 @@ -0,0 +1,390 @@ +///////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 OrderBlock Detector Indicator +// ----------------------------------------------------- +// Name: XOBD +// Description: detect Order Blocks based on Swings ... +// +// +// 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 XOBD Indicator" +#property strict + +// +// START Constants ... +// +#define ShortName "XOBD" +// +// END Constants ... +// + +// +// START Inputs ... +// +// +input int length = 5; // Swing Length + +// +input uchar swingHighArrowCode = 108; // Swing High Arrow Code +input color swingHighArrowColor = clrMagenta; // Swing High Arrow Color + +// +input uchar swingLowArrowCode = 108; // Swing Low Arrow Code +input color swingLowArrowColor = clrAqua; // Swing Low Arrow Color +// +// END Inputs ... +// + +// +// Includes Logging Library ... +#include "../Libraries/x-saherelm.log.lib.mq5" + +// +// Include Common and Models Library ... +#include "../Libraries/x-saherelm.common.lib.mq5" + +// +// Include Draw Library ... +#include "../Libraries/x-saherelm.draw.lib.mq5" + +// +// START Buffers ... +// +#property indicator_chart_window + +// +#property indicator_buffers 1 +#property indicator_plots 0 + +// +#define swingBufferIndex 0 +double swingBuffer[]; +// +// 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 (!ValidateInputs()) + { + return INIT_PARAMETERS_INCORRECT; + } + + // + logTag = ShortName; + drawPrefix = ShortName; + + // + // 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 ... + OnDeinitDrawLibrary(); +} + +// +// Calculations ... +// +// 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; + + // + // 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 ... + int maxLength = MathMax(0, length * 3); + + // + limit = prev_calculated < maxLength ? rates_total - (maxLength + 1) : rates_total - prev_calculated; + + // + // Main Loop ... + for (int i = limit; i >= 0 && !IsStopped(); i--) + { + // + 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; +} + +// +// Define Indexes and Styles ... +void DefineBuffers() +{ + // + ArraySetAsSeries(swingBuffer, true); + SetIndexBuffer(swingBufferIndex, swingBuffer, INDICATOR_CALCULATIONS); +} + +// +// Set Indicator Short Name and also we can define Buffers Labels ... +void SetIndicatorName() +{ + // + string indicatorShortName = ""; + StringConcatenate(indicatorShortName, ShortName, " ", "( ", length, " )"); + + // + IndicatorSetString(INDICATOR_SHORTNAME, indicatorShortName); +} + +// +// Calculate Buffers ... +void CalculateBuffers(int bar_index) +{ + // + // GetCandleSwing(bar_index); + ENUM_X_SWING_TYPE type = X_NO_SWING; + + // + // Try To Detect Order Blocks ... + bool isSwingLow = false; + bool isSwingHigh = false; + + // + // Reading Candles Data ... + XOHCL candles[]; + for (int i = bar_index; i < bar_index + ((length * 2) + 2); i++) + { + // + XOHCL iCandle = GetCandle( + _Symbol, + _Period, + i); + + // + Add( + iCandle, + candles); + } + + // + // Swing Low ... + isSwingLow = + // + candles[1].close > candles[2].close && + candles[2].close > candles[3].close && + // + candles[3].close < candles[4].close && + // + candles[5].close > candles[4].close && + candles[6].close > candles[5].close + // + ; + + // + if (isSwingLow) + { + type = X_SWING_LOW; + } + + // + if (!isSwingLow) + { + // + // Swing High ... + isSwingHigh = + // + candles[1].close < candles[2].close && + candles[2].close < candles[3].close && + // + candles[3].close > candles[4].close && + // + candles[5].close < candles[4].close && + candles[6].close < candles[5].close + // + ; + + // + if (isSwingHigh) + { + type = X_SWING_HIGH; + } + } + + // + switch (type) + { + // + // Swing High ... + case X_SWING_HIGH: + // + swingBuffer[bar_index] = type; + DrawSwingArrow(1, bar_index); + break; + + // + // Swinmg Low ... + case X_SWING_LOW: + // + swingBuffer[bar_index] = type; + DrawSwingArrow(0, bar_index); + break; + + // + // No Swing ... + default: + case X_NO_SWING: + // + swingBuffer[bar_index] = 0; + break; + } +} + +// +// Draw a Swing Arrow Shape ... +void DrawSwingArrow( + int type, // Swing Type: 0 - Low / 1 - High ... + int bar_index) +{ + // + bool isSwingHigh = type == 1; + XOHCL candle = GetCandle(bar_index + 3); + double arrowDistanceInPoint = 0; + + // + // Define Required Object Properties fro Draw an Arrow ... + datetime time = iTime(_Symbol, _Period, bar_index + 3); + double purePrice = isSwingHigh ? candle.high : candle.low; + color clr = isSwingHigh ? swingHighArrowColor : swingLowArrowColor; + ENUM_ARROW_ANCHOR anchor = isSwingHigh ? ANCHOR_BOTTOM : ANCHOR_TOP; + uchar arrowCode = uchar(isSwingHigh ? swingHighArrowCode : swingLowArrowCode); + double price = isSwingHigh ? purePrice + arrowDistanceInPoint : purePrice - arrowDistanceInPoint; + string name = "Swing " + (isSwingHigh ? "High" : "Low") + "_" + (string)time + "_" + (string)purePrice; + + // + // Draw desired Arrow ... + DrawArrow( + 0, + name, + 0, + time, + price, + arrowCode, + anchor, + clr); +} +// +// END Functions ... +// diff --git a/BKPS/OLD/XEU5-0/Indicators/x-saherelm.xrsi.oscillator.mq5 b/BKPS/OLD/XEU5-0/Indicators/x-saherelm.xrsi.oscillator.mq5 new file mode 100644 index 0000000..5659e07 --- /dev/null +++ b/BKPS/OLD/XEU5-0/Indicators/x-saherelm.xrsi.oscillator.mq5 @@ -0,0 +1,397 @@ +///////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 OrderBlock Detector Oscillator +// ------------------------------------------------------ +// Name: XRSI +// Description: detect market conditions based on RSI ... +// +// +// 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 XRSI Oscillator" +#property strict + +// +// START Constants ... +// + +#define ShortName "XRSI" + +// +// END Constants ... +// + +// +// START Inputs ... +// + +// +input group "Market"; +input int length = 14; // Market Length +input ENUM_APPLIED_PRICE appliedTo = PRICE_CLOSE; // Applied To + +// +input group "Short Entry"; +input double shortEntryValue = 70; // Short Entry Level +input color shortEntryColor = clrRed; // Short Entry Level Color +input ENUM_LINE_STYLE shortEntryLineStyle = STYLE_DOT; // Short Entry Style + +// +input group "Short Exit"; +input double shortExitValue = 40; // Short Exit Level +input color shortExitColor = clrRed; // Short Exit Level Color +input ENUM_LINE_STYLE shortExitLineStyle = STYLE_DOT; // Short Exit Style + +// +input group "Long Entry"; +input double longEntryValue = 30; // Long Entry Level +input color longEntryColor = clrRed; // Long Entry Level Color +input ENUM_LINE_STYLE longEntryLineStyle = STYLE_DOT; // Long Entry Style + +// +input group "Long Exit"; +input double longExitValue = 60; // Long Exit Level +input color longExitColor = clrRed; // Long Exit Level Color +input ENUM_LINE_STYLE longExitLineStyle = STYLE_DOT; // Long Exit Style + +// +// START Inputs ... +// + +// +// Includes Logging Library ... +#include "../Libraries/x-saherelm.log.lib.mq5" + +// +// Include Common and Models Library ... +#include "../Libraries/x-saherelm.common.lib.mq5" + +// +// START Buffers ... +// + +// +#property indicator_separate_window +#property indicator_buffers 2 +#property indicator_plots 1 + +// +#define rsiBufferIndex 0 +#define rsiColorBufferIndex 1 + +// +double rsiBuffer[]; +double rsiColorBuffer[]; + +// +#property indicator_label1 "XRSI" +#property indicator_type1 DRAW_COLOR_LINE +#property indicator_color1 clrAqua, clrGray, clrFuchsia +#property indicator_style1 STYLE_DOT +#property indicator_width1 1 + +// +// END Buffers ... +// + +// +// START Global Definitions: Variables, Properties and etc ... +// + +// +int rsiHandler = INVALID_HANDLE; + +// +// END Global Definitions: Variables, Properties and etc ... +// + +// +// START Event Handlers ... +// +// +// Initialization ... +int OnInit() +{ + // + // Validate Inputs ... + if (!ValidateInputs()) + { + return INIT_PARAMETERS_INCORRECT; + } + + // + logTag = ShortName; + + // + rsiHandler = iRSI( + _Symbol, + _Period, + length, + appliedTo); + if (rsiHandler == 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(rsiHandler); +} + +// +// Calculations ... +// +// 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; + + // + // 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 ... + int maxLength = MathMax(0, length); + + // + int rsiCalculatedBars = BarsCalculated(rsiHandler); + if (rsiCalculatedBars < maxLength) + { + return prev_calculated; + } + + // + limit = prev_calculated < maxLength ? rates_total - (maxLength + 1) : rates_total - prev_calculated; + + // + int rsiCopiedItems = CopyBuffer(rsiHandler, 0, 0, limit, rsiBuffer); + if (rsiCopiedItems <= 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 = false; + + // + // Validate Args ... + if (length >= 2) + { + result = true; + } + + // + return result; +} + +// +// Define Indexes and Styles ... +void DefineBuffers() +{ + // + // RSI ... + string rsiBufferLabel = ShortName + " (" + (string)length + ")"; + ArraySetAsSeries(rsiBuffer, true); + SetIndexBuffer(rsiBufferIndex, rsiBuffer, INDICATOR_DATA); + PlotIndexSetInteger(rsiBufferIndex, PLOT_DRAW_BEGIN, length); + PlotIndexSetString(rsiBufferIndex, PLOT_LABEL, rsiBufferLabel); + + // + // RSI Color Buffer ... + ArraySetAsSeries(rsiColorBuffer, true); + SetIndexBuffer(rsiColorBufferIndex, rsiColorBuffer, INDICATOR_COLOR_INDEX); + + // + // Set Indicator Levels here ... + // OB, ExitLong, ExitShort, OS ... + IndicatorSetInteger(INDICATOR_LEVELS, 4); + + // + // SHORTENTRY ... + IndicatorSetDouble(INDICATOR_LEVELVALUE, 0, shortEntryValue); + IndicatorSetInteger(INDICATOR_LEVELCOLOR, 0, shortEntryColor); + IndicatorSetInteger(INDICATOR_LEVELSTYLE, 0, shortEntryLineStyle); + IndicatorSetString(INDICATOR_LEVELTEXT, 0, "Short Entry"); + + // + // LONGEXIT ... + IndicatorSetDouble(INDICATOR_LEVELVALUE, 1, longExitValue); + IndicatorSetInteger(INDICATOR_LEVELCOLOR, 1, longExitColor); + IndicatorSetInteger(INDICATOR_LEVELSTYLE, 1, shortExitLineStyle); + IndicatorSetString(INDICATOR_LEVELTEXT, 1, "Long Exit"); + + // + // SHORTEXIT ... + IndicatorSetDouble(INDICATOR_LEVELVALUE, 2, shortExitValue); + IndicatorSetInteger(INDICATOR_LEVELCOLOR, 2, shortExitColor); + IndicatorSetInteger(INDICATOR_LEVELSTYLE, 2, longEntryLineStyle); + IndicatorSetString(INDICATOR_LEVELTEXT, 2, "Short Exit"); + + // + // LONGENTRY ... + IndicatorSetDouble(INDICATOR_LEVELVALUE, 3, longEntryValue); + IndicatorSetInteger(INDICATOR_LEVELCOLOR, 3, longEntryColor); + IndicatorSetInteger(INDICATOR_LEVELSTYLE, 3, longExitLineStyle); + IndicatorSetString(INDICATOR_LEVELTEXT, 3, "Long Entry"); + + // + // Set Maximum and Minimum for subwindow + IndicatorSetInteger(INDICATOR_DIGITS, 2); + IndicatorSetDouble(INDICATOR_MINIMUM, 0); + IndicatorSetDouble(INDICATOR_MAXIMUM, 100); +} + +// +// Set Indicator Short Name and also we can define Buffers Labels ... +void SetIndicatorName() +{ + // + string indicatorShortName = ""; + StringConcatenate(indicatorShortName, ShortName, " ", "( ", length, " )"); + + // + IndicatorSetString(INDICATOR_SHORTNAME, indicatorShortName); +} + +// +// Calculate Buffers ... +void CalculateBuffers(int bar_index) +{ + // + double iValue = rsiBuffer[bar_index]; + + // + double iColorIndex = 0; + + // + if ( + iValue >= shortEntryValue || + iValue <= longEntryValue || + (iValue < longExitValue && + iValue > shortExitValue)) + { + iColorIndex = 0; + } + else if ( + iValue <= shortEntryValue && + iValue >= longExitValue) + { + iColorIndex = 2; + } + else if ( + iValue < shortExitValue && + iValue > longEntryValue) + { + iColorIndex = 1; + } + + // + rsiColorBuffer[bar_index] = iColorIndex; +} + +// +// END Functions ... +// diff --git a/BKPS/OLD/XEU5-0/Indicators/x-saherelm.xtd.oscillator.mq5 b/BKPS/OLD/XEU5-0/Indicators/x-saherelm.xtd.oscillator.mq5 new file mode 100644 index 0000000..5f46d18 --- /dev/null +++ b/BKPS/OLD/XEU5-0/Indicators/x-saherelm.xtd.oscillator.mq5 @@ -0,0 +1,465 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 Trend Detector Oscillator +// -------------------------------------------------- +// Name: XTD +// Description: trend detecting in both sides ... +// +// +// 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 XTD Oscillator" +#property strict + +// +// START Constants ... +// +#define ShortName "XTD" + +// +// XTD Oscillator States ... +enum ENUM_X_XTD_STATES +{ + X_XTD_BULLISH_CROSSED_OVER_BEARISH = 2, + X_XTD_BULLISH_OVER_BEARISH = 1, + X_XTD_NEUTURAL = 0, + X_XTD_BULLISH_UNDER_BEARISH = -1, + X_XTD_BULLISH_CROSSED_UNDER_BEARISH = -2 +}; +// +// END Constants ... +// + +// +// Include Models Library ... +#include "../Libraries/x-saherelm.models.lib.mq5" + +// +// START Inputs ... +// +input int length = 14; // Market Length +input bool drawCrosses = true; // Draw Cross Arrows + +// +// Bullish ... +input uchar bullishArrowCode = 228; // Cross Over Arrow Code +input color bullishArrowColor = clrAqua; // Cross Over Arrow Color + +// +// Bearish ... +input uchar bearishArrowCode = 230; // Cross Under Arrow Code +input color bearishArrowColor = clrMagenta; // Cross Under Arrow Color +// +// END Inputs ... +// + +// +// Includes Logging Library ... +#include "../Libraries/x-saherelm.log.lib.mq5"; + +// +// Includes Common Library ... +#include "../Libraries/x-saherelm.common.lib.mq5"; + +// +// Includes Draw Library ... +#include "../Libraries/x-saherelm.draw.lib.mq5"; + +// +// START Buffers ... +// +#property indicator_separate_window + +// +#property indicator_buffers 3 +#property indicator_plots 3 + +// +#define bullishBufferIndex 0 +#define bearishBufferIndex 1 +#define signalBufferIndex 2 + +// +double bullishBuffer[]; +double bearishBuffer[]; +double signalBuffer[]; + +// +#property indicator_label1 "XBullPower" +#property indicator_type1 DRAW_LINE +#property indicator_color1 clrLime +#property indicator_style1 STYLE_SOLID +#property indicator_width1 1 + +// +#property indicator_label2 "XBearPower" +#property indicator_type2 DRAW_LINE +#property indicator_color2 clrRed +#property indicator_style2 STYLE_SOLID +#property indicator_width2 1 + +// +#property indicator_label3 "XSignal" +#property indicator_type3 DRAW_LINE +#property indicator_color3 clrGold +#property indicator_style3 STYLE_DOT +#property indicator_width3 1 +// +// END Buffers ... +// + +// +// START Global Definitions: Variables, Properties and etc ... +// +// +int xtdBullishCandleCount = 0; +int xtdBearishCandleCount = 0; +// +// END Global Definitions: Variables, Properties and etc ... +// + +// +// START Event Handlers ... +// +// +// Initialization ... +int OnInit() +{ + // + // Validate Inputs ... + if (!ValidateInputs()) + { + return INIT_PARAMETERS_INCORRECT; + } + + // + logTag = ShortName; + drawPrefix = ShortName; + + // + // 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 ... + + // + // De Init Draw Library ... + OnDeinitDrawLibrary(); +} + +// +// Calculations ... +// +// 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; + + // + // 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 ... + int maxLength = MathMax(0, length); + + // + limit = prev_calculated < maxLength ? rates_total - (maxLength + 1) : rates_total - prev_calculated; + + // + // Main Loop ... + for (int i = limit; i >= 0 && !IsStopped(); i--) + { + // + CalculateBuffers(i, close); + } + + // + return rates_total; +} +// +// END Event Handlers ... +// + +// +// START Functions ... +// +// +// Validate Input Args for Initialization ... +bool ValidateInputs() +{ + // + bool result = false; + + // + // Validate Args ... + if (length >= 5) + { + result = true; + } + + // + return result; +} + +// +// Define Indexes and Styles ... +void DefineBuffers() +{ + // + // Bullish Buffer ... + string bullishBufferLabel = ShortName + "BullPow " + "(" + (string)length + ")"; + ArraySetAsSeries(bullishBuffer, true); + SetIndexBuffer(bullishBufferIndex, bullishBuffer, INDICATOR_DATA); + PlotIndexSetInteger(bullishBufferIndex, PLOT_DRAW_BEGIN, length); + PlotIndexSetString(bullishBufferIndex, PLOT_LABEL, bullishBufferLabel); + + // + // Bearish Buffer ... + string bearishBufferLabel = ShortName + "BearPow " + "(" + (string)length + ")"; + ArraySetAsSeries(bearishBuffer, true); + SetIndexBuffer(bearishBufferIndex, bearishBuffer, INDICATOR_DATA); + PlotIndexSetInteger(bearishBufferIndex, PLOT_DRAW_BEGIN, length); + PlotIndexSetString(bearishBufferIndex, PLOT_LABEL, bearishBufferLabel); + + // + // Signal Buffer ... + string signalBufferLabel = ShortName + "Signal " + "(" + (string)length + ")"; + ArraySetAsSeries(signalBuffer, true); + SetIndexBuffer(signalBufferIndex, signalBuffer, INDICATOR_DATA); + PlotIndexSetInteger(signalBufferIndex, PLOT_DRAW_BEGIN, length); + PlotIndexSetString(signalBufferIndex, PLOT_LABEL, signalBufferLabel); +} + +// +// Set Indicator Short Name and also we can define Buffers Labels ... +void SetIndicatorName() +{ + // + string indicatorShortName = ""; + StringConcatenate(indicatorShortName, ShortName, " ", "( ", length, " )"); + + // + IndicatorSetString(INDICATOR_SHORTNAME, indicatorShortName); +} + +// +// Calculate Buffers ... +void CalculateBuffers( + int bar_index, + const double &close[]) +{ + // + // Reset Global Counters ... + xtdBullishCandleCount = 0; + xtdBearishCandleCount = 0; + + // + // Loop through Closes ... + for (int i = bar_index; i <= bar_index + length; i++) + { + for (int j = i + 1; j <= bar_index + length; j++) + { + // + if (close[i] > close[j]) + { + xtdBullishCandleCount++; + } + + // + if (close[i] < close[j]) + { + xtdBearishCandleCount++; + } + } + } + + // + // Bullish Power Buffer ... + bullishBuffer[bar_index] = MathAbs(xtdBullishCandleCount); + + // + // Bearish Power Buffer ... + bearishBuffer[bar_index] = MathAbs(xtdBearishCandleCount); + + // + // Signal Buffer ... + signalBuffer[bar_index] = bullishBuffer[bar_index] - bearishBuffer[bar_index]; + + // + // Check and Draw Crosses if it's Specified ... + if (drawCrosses) + { + DrawCrosses(bar_index); + } +} + +// +// +double GetState( + int bar_index // Specified Bar Index +) +{ + // + // Check Cross Points ... + // bullishCrossedOverBearish = 2; + // bullishOverBearish = 1; + // bullishCrossedUnderBearish = -2; + // bullishUnderBearish = -1; + // OtherWise = 0; + bool isBullishCrossedOverBearish = IsCrossOver( + bullishBuffer, + bearishBuffer, + bar_index); + bool isBullishCrossedUnderBearish = IsCrossUnder( + bullishBuffer, + bearishBuffer, + bar_index); + bool isBullishOverBearish = IsOver( + bullishBuffer, + bearishBuffer, + bar_index); + bool isBullishUnderBearish = IsUnder( + bullishBuffer, + bearishBuffer, + bar_index); + + // + double result = X_XTD_NEUTURAL; + if (isBullishCrossedOverBearish) + { + result = X_XTD_BULLISH_CROSSED_OVER_BEARISH; + } + else if (isBullishCrossedUnderBearish) + { + result = X_XTD_BULLISH_CROSSED_UNDER_BEARISH; + } + else if (isBullishOverBearish) + { + result = X_XTD_BULLISH_OVER_BEARISH; + } + else if (isBullishUnderBearish) + { + result = X_XTD_BULLISH_UNDER_BEARISH; + } + else + { + result = X_XTD_NEUTURAL; + } + + // + return result; +} + +// +// Draw Crosses ... +void DrawCrosses( + int bar_index // the bars which required to draw cross arrow on it ... +) +{ + // + double stateValue = GetState(bar_index); + + // + bool isOver = stateValue == 2; + double low = iLow(_Symbol, _Period, bar_index); + double high = iHigh(_Symbol, _Period, bar_index); + + // + double price = isOver ? low : high; + datetime time = iTime(_Symbol, _Period, bar_index); + ENUM_ARROW_ANCHOR anchor = isOver ? ANCHOR_TOP : ANCHOR_BOTTOM; + uchar arrowCode = isOver ? bullishArrowCode : bearishArrowCode; + color arrowColor = isOver ? bullishArrowColor : bearishArrowColor; + string crossName = "Trend " + (isOver ? "Up" : "Down") + "_" + (string)time + "_" + (string)price; + + // + DrawArrow( + 0, + crossName, + 0, + time, + price, + arrowCode, + anchor, + arrowColor); +} +// +// END Functions ... +// diff --git a/BKPS/OLD/XEU5-0/Indicators/x-saherelm.xtm.indicator.mq5 b/BKPS/OLD/XEU5-0/Indicators/x-saherelm.xtm.indicator.mq5 new file mode 100644 index 0000000..eac88e0 --- /dev/null +++ b/BKPS/OLD/XEU5-0/Indicators/x-saherelm.xtm.indicator.mq5 @@ -0,0 +1,349 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 Candle Indicator +// --------------------------------------------- +// Name: XTM +// 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 XTM Indicator" +#property strict + +// +// START Constants ... +// +#define ShortName "XTM" + +// +// XTM Indicator States ... +enum ENUM_X_XTM_STATES +{ + X_XTM_BULLISH = 1, + X_XTM_BEARISH = -1, + X_XTM_NEUTURAL = 0, +}; +// +// END Constants ... +// + +// +// START Inputs ... +// +input int maPeriod = 14; // Period +input int maShift = 0; // Shift +input ENUM_MA_METHOD maMethod = MODE_SMA; // Method +input ENUM_APPLIED_PRICE maAppliedTo = PRICE_CLOSE; // Applied To +// +// END Inputs ... +// + +// +// Includes Logging Library ... +#include "../Libraries/x-saherelm.log.lib.mq5" + +// +// 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 +#define stateBufferIndex 2 + +double maBuffer[]; +double maColorBuffer[]; +double stateBuffer[]; + +#property indicator_label1 "XTM" +#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 maHandler = INVALID_HANDLE; +// +// END Global Definitions: Variables, Properties and etc ... +// + +// +// START Event Handlers ... +// +// +// Initialization ... +int OnInit() +{ + // + // Validate Inputs ... + if (!ValidateInputs()) + { + return INIT_PARAMETERS_INCORRECT; + } + + // + logTag = ShortName; + + // + // Initializing MA Handler ... + maHandler = iMA( + _Symbol, + _Period, + maPeriod, + maShift, + maMethod, + maAppliedTo); + if (maHandler == INVALID_HANDLE) + { + // + string message = "Error Initializing Ma Handler ..."; + LogMessage(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 ... +} + +// +// Calculations ... +// +// 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; + + // + // 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 ... + int maxLength = MathMax(0, maPeriod); + + // + // 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 (maPeriod >= 2) + { + result = true; + } + + // + return result; +} + +// +// Define Indexes and Styles ... +void DefineBuffers() +{ + // + string maBufferLabel = "XTM " + "(" + (string)maPeriod + ")"; + + // + // Ma Buffer ... + ArraySetAsSeries(maBuffer, true); + SetIndexBuffer(maBufferIndex, maBuffer, INDICATOR_DATA); + PlotIndexSetString(maBufferIndex, PLOT_LABEL, maBufferLabel); + + // + // Ma Color Buffer ... + ArraySetAsSeries(maColorBuffer, true); + SetIndexBuffer(maColorBufferIndex, maColorBuffer, INDICATOR_COLOR_INDEX); + + // + // State Buffer ... + ArraySetAsSeries(stateBuffer, true); + SetIndexBuffer(stateBufferIndex, stateBuffer, INDICATOR_CALCULATIONS); +} + +// +// Set Indicator Short Name and also we can define Buffers Labels ... +void SetIndicatorName() +{ + // + string indicatorShortName = ""; + StringConcatenate(indicatorShortName, ShortName, " ", "(", maPeriod, ")"); + + // + IndicatorSetString(INDICATOR_SHORTNAME, indicatorShortName); +} + +// +// 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; + + // + // Define State Value ... + // lineColorIndex == 0 => Bullish => 1; + // lineColorIndex == 1 => Neutural => 0; + // lineColorIndex == 2 => Bearish => -1; + double stateValue = + lineColorIndex == 0 ? X_XTM_BULLISH : lineColorIndex == 2 ? X_XTM_BEARISH + : X_XTM_NEUTURAL; + + // + // Set Ma Buffer Color Index ... + maColorBuffer[bar_index] = lineColorIndex; + + // + // Set State Buffer Value ... + stateBuffer[bar_index] = stateValue; +} + +// +// END Functions ... +// diff --git a/BKPS/OLD/XEU5-0/Indicators/x-saherelm.xts.oscillator.mq5 b/BKPS/OLD/XEU5-0/Indicators/x-saherelm.xts.oscillator.mq5 new file mode 100644 index 0000000..46e9fbf --- /dev/null +++ b/BKPS/OLD/XEU5-0/Indicators/x-saherelm.xts.oscillator.mq5 @@ -0,0 +1,558 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 XTS Oscillator +// --------------------------------------------- +// Name: XTS +// Description: Time Sections Oscillator ... +// +// +// 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 XTS Oscillator" +#property strict + +// +// START Constants ... +// + +#define ShortName "XTS" + +enum ENUM_X_PERIOD_METHOD +{ + // + X_PERIOD_NOTHING, + // + X_PERIOD_AUTO, + // + X_PERIOD_MANUALLY +}; + +// +// XTS Oscillator States ... + +// +// END Constants ... +// + +// +// START Inputs ... +// +input group "Current Period"; +input ENUM_APPLIED_PRICE currentAppliedTo = PRICE_CLOSE; // Current Applied To +// +input group "Nearest Period"; +input ENUM_X_PERIOD_METHOD nearestMethod = X_PERIOD_AUTO; // How to Find Nearest Period +input ENUM_TIMEFRAMES nearestPeriod = NULL; // Nearest Time Frame +input ENUM_APPLIED_PRICE nearestAppliedTo = PRICE_CLOSE; // Nearest Applied To +// +input group "Mediest Period"; +input ENUM_X_PERIOD_METHOD mediestMethod = X_PERIOD_AUTO; // How to Find Mediest Period +input ENUM_TIMEFRAMES mediestPeriod = NULL; // Mediest Time Frame +input ENUM_APPLIED_PRICE mediestAppliedTo = PRICE_CLOSE; // Mediest Applied To +// +input group "Farest Period"; +input ENUM_X_PERIOD_METHOD farestMethod = X_PERIOD_AUTO; // How to Find Farest Period +input ENUM_TIMEFRAMES farestPeriod = NULL; // Farest Time Frame +input ENUM_APPLIED_PRICE farestAppliedTo = PRICE_CLOSE; // Farest Applied To + +// +// Includes Logging Library ... +#include "../Libraries/x-saherelm.log.lib.mq5" + +// +// Includes Draw Library ... +#include "../Libraries/x-saherelm.draw.lib.mq5" + +// +// Includes Common Library ... +#include "../Libraries/x-saherelm.common.lib.mq5" + +// +// START Buffers ... +// +#property indicator_separate_window + +// +#property indicator_buffers 4 +#property indicator_plots 4 + +// +// Current ... +#define currentBufferIndex 0 + +double currentBuffer[]; + +#property indicator_label1 "XTS C" +#property indicator_type1 DRAW_LINE +#property indicator_color1 clrBrown +#property indicator_style1 STYLE_SOLID +#property indicator_width1 1 + +// +// Nearest ... +#define nearestBufferIndex 1 + +double nearestBuffer[]; + +#property indicator_label2 "XTS N" +#property indicator_type2 DRAW_LINE +#property indicator_color2 clrAqua +#property indicator_style2 STYLE_SOLID +#property indicator_width2 1 + +// +// Mediest ... +#define mediestBufferIndex 2 + +double mediestBuffer[]; + +#property indicator_label3 "XTS M" +#property indicator_type3 DRAW_LINE +#property indicator_color3 clrLime +#property indicator_style3 STYLE_SOLID +#property indicator_width3 1 + +// +// Farest ... +#define farestBufferIndex 3 + +double farestBuffer[]; + +#property indicator_label4 "XTS F" +#property indicator_type4 DRAW_LINE +#property indicator_color4 clrLightBlue +#property indicator_style4 STYLE_SOLID +#property indicator_width4 1 + +// +// END Buffers ... +// + +// +// START Global Definitions: Variables, Properties and etc ... +// + +// +ENUM_TIMEFRAMES mNearestPeriod = NULL; +ENUM_TIMEFRAMES mMediestPeriod = NULL; +ENUM_TIMEFRAMES mFarestPeriod = NULL; + +// +// END Global Definitions: Variables, Properties and etc ... +// + +// +// START Event Handlers ... +// + +// +// Initialization ... +int OnInit() +{ + // + // Validate Inputs ... + if (!ValidateInputs()) + { + return INIT_PARAMETERS_INCORRECT; + } + + // + logTag = ShortName; + drawPrefix = ShortName; + + // + // Define Index Buffers ... + DefineBuffers(); + + // + // Set Oscillator ShortName ... + SetOscillatorName(); + + // + // Init Succeed ... + return INIT_SUCCEEDED; +} + +// +// DeInitialization ... +void OnDeinit(const int reason) +{ + // + OnDeinitDrawLibrary(); + + // + Comment(""); +} + +// +// Calculations ... +// +// 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; + + // + // 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 ... + int maxLength = 30; + + // + limit = (prev_calculated > rates_total || prev_calculated <= 0) ? rates_total : (rates_total - prev_calculated) + 1; + + // + // Main Loop ... + for (int i = 0; i < limit && !IsStopped(); i++) + { + // + // Do Buffers Calculation ... + CalculateBuffers(i); + } + + // + return rates_total; +} + +// +// END Event Handlers ... +// + +// +// START Functions ... +// +// +// Validate Input Args for Initialization ... +bool ValidateInputs() +{ + // + bool result = true; + + // + return result; +} + +// +// Define Indexes and Styles ... +void DefineBuffers() +{ + // + int maxLength = 30; + + // + // Current ... + ArraySetAsSeries(currentBuffer, true); + SetIndexBuffer(currentBufferIndex, currentBuffer, INDICATOR_DATA); + PlotIndexSetInteger(currentBufferIndex, PLOT_DRAW_BEGIN, maxLength); + + // + // Nearest ... + ArraySetAsSeries(nearestBuffer, true); + SetIndexBuffer(nearestBufferIndex, nearestBuffer, INDICATOR_DATA); + PlotIndexSetInteger(nearestBufferIndex, PLOT_DRAW_BEGIN, maxLength); + + // + // Mediest ... + ArraySetAsSeries(mediestBuffer, true); + SetIndexBuffer(mediestBufferIndex, mediestBuffer, INDICATOR_DATA); + PlotIndexSetInteger(mediestBufferIndex, PLOT_DRAW_BEGIN, maxLength); + + // + // Farest ... + ArraySetAsSeries(farestBuffer, true); + SetIndexBuffer(farestBufferIndex, farestBuffer, INDICATOR_DATA); + PlotIndexSetInteger(farestBufferIndex, PLOT_DRAW_BEGIN, maxLength); +} + +// +// Set Oscillator Short Name and also we can define Buffers Labels ... +void SetOscillatorName() +{ + IndicatorSetString(INDICATOR_SHORTNAME, ShortName); +} + +// +// Calculate Buffers ... +void CalculateBuffers(int bar_index) +{ + // + // Current ... + CalculateCurrent(bar_index); + + // + // Nearest ... + CalculateNearest(bar_index); + + // + // Mediest ... + CalculateMediest(bar_index); + + // + // Farest ... + CalculateFarest(bar_index); + + // + // Commenting ... + string comment = GenerateDescriptionComment(); + Comment(comment); +} + +// +// Current ... +void CalculateCurrent(int bar_index) +{ + // + datetime barTime = iTime( + _Symbol, + _Period, + bar_index); + datetime startTime = GetPeriodStartTime( + _Symbol, + _Period, + barTime); + int startBarIndex = iBarShift( + _Symbol, + _Period, + startTime); + + // + XOHCL c = GetCandle( + _Symbol, + _Period, + startBarIndex); + + // + double value = GetAppliedPrice( + c, + currentAppliedTo); + + // + currentBuffer[bar_index] = value; +} + +// +// Nearest ... +void CalculateNearest(int bar_index) +{ + // + if (mNearestPeriod == NULL) + { + // + switch (nearestMethod) + { + // + case X_PERIOD_AUTO: + mNearestPeriod = GetNearestTimeFrame(_Period); + break; + + // + case X_PERIOD_NOTHING: + case X_PERIOD_MANUALLY: + mNearestPeriod = nearestPeriod; + break; + } + } + + // + datetime barTime = iTime( + _Symbol, + _Period, + bar_index); + datetime startTime = GetPeriodStartTime( + _Symbol, + mNearestPeriod, + barTime); + int startBarIndex = iBarShift( + _Symbol, + _Period, + startTime); + + // + XOHCL c = GetCandle( + _Symbol, + _Period, + startBarIndex); + + // + double value = GetAppliedPrice( + c, + nearestAppliedTo); + + // + nearestBuffer[bar_index] = value; +} + +// +// Mediest ... +void CalculateMediest(int bar_index) +{ + // + if (mMediestPeriod == NULL) + { + // + switch (mediestMethod) + { + // + case X_PERIOD_AUTO: + mMediestPeriod = GetMediestTimeFrame(_Period); + break; + + // + case X_PERIOD_NOTHING: + case X_PERIOD_MANUALLY: + mMediestPeriod = mediestPeriod; + break; + } + } + + // + datetime barTime = iTime( + _Symbol, + _Period, + bar_index); + datetime startTime = GetPeriodStartTime( + _Symbol, + mMediestPeriod, + barTime); + int startBarIndex = iBarShift( + _Symbol, + _Period, + startTime); + + // + XOHCL c = GetCandle( + _Symbol, + _Period, + startBarIndex); + + // + double value = GetAppliedPrice( + c, + mediestAppliedTo); + + // + mediestBuffer[bar_index] = value; +} + +// +// Farest ... +void CalculateFarest(int bar_index) +{ + // + if (mFarestPeriod == NULL) + { + // + switch (farestMethod) + { + // + case X_PERIOD_AUTO: + mFarestPeriod = GetFarestTimeFrame(_Period); + break; + + // + case X_PERIOD_NOTHING: + case X_PERIOD_MANUALLY: + mFarestPeriod = farestPeriod; + break; + } + } + + // + datetime barTime = iTime( + _Symbol, + _Period, + bar_index); + datetime startTime = GetPeriodStartTime( + _Symbol, + mFarestPeriod, + barTime); + int startBarIndex = iBarShift( + _Symbol, + _Period, + startTime); + + // + XOHCL c = GetCandle( + _Symbol, + _Period, + startBarIndex); + + // + double value = GetAppliedPrice( + c, + farestAppliedTo); + + // + farestBuffer[bar_index] = value; +} + +// +// Generate Comment ... +string GenerateDescriptionComment() +{ + // + string result = ""; + + // + result += "Nearest : " + EnumToString(mNearestPeriod) + "\n"; + result += "Mediest : " + EnumToString(mMediestPeriod) + "\n"; + result += "Farest : " + EnumToString(mFarestPeriod) + "\n"; + + // + return result; +} +// +// END Functions ... +// diff --git a/BKPS/OLD/XEU5-0/Libraries/.gitkeep b/BKPS/OLD/XEU5-0/Libraries/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/BKPS/OLD/XEU5-0/Libraries/x-saherelm.alert.lib.mq5 b/BKPS/OLD/XEU5-0/Libraries/x-saherelm.alert.lib.mq5 new file mode 100644 index 0000000..1079063 --- /dev/null +++ b/BKPS/OLD/XEU5-0/Libraries/x-saherelm.alert.lib.mq5 @@ -0,0 +1,200 @@ +/////////////////////////////////////////////////////// +// +// 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); + } +} +void SendAlert( + XSignal &signal, // the Signal Object which requred to Alert + bool asExecuted = true // determines Alert Signal as Executed Signal or not +) +{ + // + // Prepare Message ... + string message = asExecuted ? ExecutedSignalToString(signal) : SignalToString(signal); + + // + // Do Alerting ... + SendAlert(message); +} +// +// END Provided Functions ... +// diff --git a/BKPS/OLD/XEU5-0/Libraries/x-saherelm.common.lib.mq5 b/BKPS/OLD/XEU5-0/Libraries/x-saherelm.common.lib.mq5 new file mode 100644 index 0000000..290dde9 --- /dev/null +++ b/BKPS/OLD/XEU5-0/Libraries/x-saherelm.common.lib.mq5 @@ -0,0 +1,4429 @@ +/////////////////////////////////////////////////////// +// +// 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; +} + +// +// 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_X_SIGNAL_TYPE type = X_SIGNAL_UNKNOWN // Get entry price for Which direction trade ... +) +{ + // + double result = 0; + + // + // Validate Arg ... + if (type == X_SIGNAL_UNKNOWN) + { + return result; + } + + // + bool isLong = type == X_SIGNAL_LONG; + result = isLong ? GetAsk() : GetBid(); + result = NormalizePrice(result); + + // + return result; +} +double GetEntry( + string symbol, // Specified Symbol + ENUM_X_SIGNAL_TYPE type = X_SIGNAL_UNKNOWN // Get entry price for Which direction trade ... +) +{ + // + double result = 0; + + // + // Validate Arg ... + if (type == X_SIGNAL_UNKNOWN) + { + return result; + } + + // + bool isLong = type == X_SIGNAL_LONG; + result = isLong ? GetAsk(symbol) : GetBid(symbol); + result = NormalizePrice(result, symbol); + + // + return result; +} + +// +// Get Signal Exit ... +double GetExit( + ENUM_X_SIGNAL_TYPE type = X_SIGNAL_UNKNOWN // Get entry price for Which direction trade ... +) +{ + // + double result = 0; + + // + // Validate Arg ... + if (type == X_SIGNAL_UNKNOWN) + { + return result; + } + + // + bool isLong = type == X_SIGNAL_LONG; + result = isLong ? GetBid() : GetAsk(); + result = NormalizePrice(result); + + // + return result; +} +double GetExit( + string symbol, // Specified Symbol + ENUM_X_SIGNAL_TYPE type = X_SIGNAL_UNKNOWN // Get entry price for Which direction trade ... +) +{ + // + double result = 0; + + // + // Validate Arg ... + if (type == X_SIGNAL_UNKNOWN) + { + return result; + } + + // + bool isLong = type == X_SIGNAL_LONG; + result = isLong ? GetBid(symbol) : GetAsk(symbol); + result = NormalizePrice(result, symbol); + + // + 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; +} + +// +// 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; +} + +// +// 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; +} + +// +// 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; +} + +// +// 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 HasStrongBody(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 = HasStrongBody(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 = HasStrongBody(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 = HasStrongBody(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; +} + +// +// 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; +} + +// +// 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; +} + +// +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; +} + +// +// Validate Struct ... +bool IsValid(XSignal &model, ulong magicNumber) +{ + // + bool result = false; + + // + // Validate Signal Type ... + result = model.type != X_SIGNAL_UNKNOWN; + if (!result) + { + return result; + } + + // + // Check Symbol ... + result = StringLen(model.symbol) == 0 ? true : model.symbol == _Symbol; + if (!result) + { + return result; + } + + // + // Check magic number ... + result = model.magicNumber <= 0 ? true : model.magicNumber == magicNumber; + if (!result) + { + return result; + } + + // + // Check Entry ... + result = model.entry > 0; + if (!result) + { + return result; + } + + // + // Check SL ... + result = model.sl == 0 ? true : model.type == X_SIGNAL_LONG ? model.sl < model.entry + : model.sl > model.entry; + if (!result) + { + return result; + } + + // + // Check TP ... + result = model.tp == 0 ? true : model.type == X_SIGNAL_LONG ? model.tp > model.entry + : model.tp < model.entry; + if (!result) + { + return result; + } + + // + // Check Volume ... + result = model.volume > 0; + if (!result) + { + return result; + } + + // + // Check Time ... + result = model.time > 0; + if (!result) + { + return result; + } + + // + return result; +} + +// +void CleanBuffer(int &buffer[]) +{ + // + ArrayFree(buffer); + ArrayResize(buffer, 0); +} +void CleanBuffer(ulong &buffer[]) +{ + // + ArrayFree(buffer); + ArrayResize(buffer, 0); +} +void CleanBuffer(double &buffer[]) +{ + // + ArrayFree(buffer); + ArrayResize(buffer, 0); +} +void CleanBuffer(XSignal &buffer[]) +{ + // + ArrayFree(buffer); + ArrayResize(buffer, 0); +} +void CleanBuffer(XDeal &buffer[]) +{ + // + ArrayFree(buffer); + ArrayResize(buffer, 0); +} +void CleanBuffer(XOrder &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; +} +void Add( + XSignal &item, // item want to add + XSignal &buffer[] // Destination buffer +) +{ + // + ArrayResize( + buffer, + ArraySize(buffer) + 1); + + // + buffer[ArraySize(buffer) - 1] = item; +} +void Add( + XDeal &item, // item want to add + XDeal &buffer[] // Destination buffer +) +{ + // + ArrayResize( + buffer, + ArraySize(buffer) + 1); + + // + buffer[ArraySize(buffer) - 1] = item; +} +void Add( + XOrder &item, // item want to add + XOrder &buffer[] // Destination buffer +) +{ + // + ArrayResize( + buffer, + ArraySize(buffer) + 1); + + // + buffer[ArraySize(buffer) - 1] = item; +} + +// +// 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; +} + +// +// Check a Signal is Long or not ... +bool IsLong(ENUM_X_SIGNAL_TYPE type) +{ + return type == X_SIGNAL_LONG; +} +bool IsLong(XSignal &signal) +{ + // + bool result = IsLong(signal.type); + + // + return result; +} + +// +// Check a Signal is Short or not ... +bool IsShort(ENUM_X_SIGNAL_TYPE type) +{ + return type == X_SIGNAL_SHORT; +} +bool IsShort(XSignal &signal) +{ + // + bool result = IsShort(signal.type); + + // + return result; +} + +// +// Retrieve a Signal Type String Value ... +string GetSignalType(ENUM_X_SIGNAL_TYPE type) +{ + // + string result = ""; + + // + if (type == X_SIGNAL_UNKNOWN) + { + return result; + } + + // + result = type == X_SIGNAL_LONG ? "Long" : "Short"; + + // + return result; +} +string GetSignalType(XSignal &signal) +{ + // + string result = ""; + + // + result = GetSignalType(signal.type); + + // + return result; +} +ENUM_X_SIGNAL_TYPE GetSignalType(string typeStr) +{ + // + ENUM_X_SIGNAL_TYPE result = X_SIGNAL_UNKNOWN; + + // + if (typeStr == GetSignalType(X_SIGNAL_LONG)) + { + result = X_SIGNAL_LONG; + } + else if (typeStr == GetSignalType(X_SIGNAL_SHORT)) + { + result = X_SIGNAL_SHORT; + } + + // + return result; +} + +// +// Retrieve Signal Execution String ... +string GetSignalExecutionError(int error) +{ + // + string result = ""; + + // + switch (error) + { + // + case X_TRADER_INVALID_SIGNAL_ERROR: + result = "Invalid Signal ..."; + break; + + // + case X_TRADER_NOT_ENOUGH_EQUITY_ERROR: + result = "Not Enough Equity for Trade ..."; + break; + + // + case X_TRADER_NOT_ENOUGH_BALANCE_ERROR: + result = "Not Enough Balance for Trade ..."; + break; + + // + case X_TRADER_NOT_ENOUGH_MARIGIN_ERROR: + result = "Not Enough Marigin For Trade ..."; + break; + + // + case X_TRADER_MAX_TRADES_REACHED_ERROR: + result = "Max Allowed Trade Reached ..."; + break; + + // + case X_TRADER_UNKNOWN_ERROR: + default: + result = "Unknown Issue ..."; + break; + } + + // + return 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; +} + +// +// 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; +} + +// +// Check Expert Running in Testing Mode or not ... +bool IsRunningOnTestMode() +{ + // + bool result = false; + + // + // check programm mode ... + result = MQL5InfoInteger(MQL5_TESTING); + + // + return result; +} + +// +// 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; +} + +// +// +// + +// +// 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 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; +} + +// +// END Provided Functions ... +// diff --git a/BKPS/OLD/XEU5-0/Libraries/x-saherelm.draw.lib.mq5 b/BKPS/OLD/XEU5-0/Libraries/x-saherelm.draw.lib.mq5 new file mode 100644 index 0000000..ece98c8 --- /dev/null +++ b/BKPS/OLD/XEU5-0/Libraries/x-saherelm.draw.lib.mq5 @@ -0,0 +1,2345 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 Draw Library +// -------------------------------------- +// Name: XDraw +// Description: provides Draw 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 ... +// +// +// END Inputs ... +// + +// +// Include Logger Library ... +#include "x-saherelm.log.lib.mq5" +#include "x-saherelm.common.lib.mq5" + +// +// START Global Definitions: Variables, Properties and etc ... +// +string drawPrefix = "X-OBJ"; +// +// END Global Definitions: Variables, Properties and etc ... +// + +// +// START Provided Functions ... +// +// +// DeInitial Library if required ... +void OnDeinitDrawLibrary() +{ + RemoveDraws(); +} + +// +void DrawSignalShape( + XSignal &signal, // Specify Signal to Draw + color longColor = clrAqua, // Long Signals Color + color shortColor = clrFuchsia, // Short Signal Color + color entryColor = clrGold // Signal Entry Price Color +) +{ + // + // Draw Signal Info : + // - Draw Entry Price Line; + // - Draw SL; + // - Draw TP; + // - Risk Free; + + // + bool isLong = signal.type == X_SIGNAL_LONG; + + // + color tpColor = longColor; + color slColor = shortColor; + + // + string name = "T(" + (string)signal.ticket + ")" + "_" + "TY(" + EnumToString(signal.type) + ")"; + + // + string tpName = "TP_" + name; + if (IsDrawExists(tpName)) + { + RemoveDraw(tpName); + } + + // + string slName = "SL_" + name; + if (IsDrawExists(slName)) + { + RemoveDraw(slName); + } + + // + string riskFreeName = "RF_" + name; + if (IsDrawExists(riskFreeName)) + { + RemoveDraw(riskFreeName); + } + + // + string entryName = "Entry_" + name; + if (IsDrawExists(entryName)) + { + RemoveDraw(entryName); + } + + // + string vlName = "Time_" + name; + if (IsDrawExists(vlName)) + { + RemoveDraw(vlName); + } + + // + int signalBarIndex = iBarShift( + signal.symbol, + _Period, + signal.time); + + // + datetime time1 = iTime( + signal.symbol, + _Period, + signalBarIndex + 1); + datetime time2 = iTime( + signal.symbol, + _Period, + signalBarIndex - 1); + + // + // Entry ... + bool isTrendLineDrawn = DrawTrendLine( + 0, + entryName, + 0, + time1, + signal.entry, + time2, + signal.entry, + entryColor); + + // + // TP ... + bool isTPDrawn = false; + if (signal.tp > 0) + { + // + isTPDrawn = DrawTrendLine( + 0, + tpName, + 0, + time1, + signal.tp, + time2, + signal.tp, + tpColor, + STYLE_SOLID, + 1, + false, + true); + } + + // + // RISKFREE ... + bool isRFDrawn = false; + if (signal.riskFreeStep > 0) + { + // + double firstStepPrice = isLong ? signal.entry + PipsToPrice(signal.riskFreeStep) + : signal.entry - PipsToPrice(signal.riskFreeStep); + + // + isRFDrawn = DrawTrendLine( + 0, + riskFreeName, + 0, + time1, + firstStepPrice, + time2, + firstStepPrice, + tpColor, + STYLE_DOT, + 1, + false, + true); + } + + // + // SL ... + bool isSLDrawn = false; + if (signal.sl > 0) + { + // + isSLDrawn = DrawTrendLine( + 0, + slName, + 0, + time1, + signal.sl, + time2, + signal.sl, + slColor, + STYLE_SOLID, + 1, + false, + true); + } + + // + // Draw a Vertical Line ... + bool isVerticalLineDrawn = DrawVerticalLine( + 0, + vlName, + 0, + signal.time, + slColor); +} + +// +// remove drawn objects ... +void RemoveDraws( + string tag = NULL, + int chartId = -1, + int subWindow = -1) +{ + // + // Normalize Args ... + // + if (tag == NULL) + { + tag = drawPrefix; + } + + // + 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); + 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; +} + +// +// 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 sub_window = 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, sub_window, 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 back_clr = 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, back_clr); + + // + // 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 ... +// + +// +// END Regular Draws ... +// + +// +// START Chart Style Drawers ... +// +// +// Apply Styles On Chart ... +void ApplyChartStyle( + int chartId = -1, // chart's ID + ENUM_CHART_MODE mode = CHART_CANDLES, // chart's mode + bool showBidLine = true, // show bid line + bool showAskLine = true, // show ask line + bool showGrid = false, // show grids on chart + bool showVolumes = false, // show volumes + bool showTradeLevels = true, // Displaying trade levels in the chart (levels of open positions, Stop Loss, Take Profit and pending orders) + bool autoScroll = true, // chart autoscroll + bool quickNavigation = true, // chart quick navigation state + color foreGroundColor = clrWhite, // chart's foreground color + color backGroundColor = clrBlack, // chart's background color + color upColor = clrGreen, // Up Color + color downColor = clrRed, // Down Color + color bullishColor = clrGreen, // Bullish color + color bearishColor = clrRed, // Bearish color + color gridColor = clrGray, // grid color + color bidLineColor = clrGray, // bid line color + color askLineColor = clrRed, // ask line color + color lineColor = clrLime, // line mode and doji candlestick color + color stopColor = clrGold, // Color of stop order levels (Stop Loss and Take Profit) + color volumesColor = clrGreen // volumes color +) +{ + // + // Validate Args ... + if (chartId == -1) + { + chartId = 0; + } + + // + ChartSetInteger(chartId, CHART_MODE, mode); + ChartSetInteger(chartId, CHART_SHOW_BID_LINE, showBidLine); + ChartSetInteger(chartId, CHART_SHOW_ASK_LINE, showAskLine); + ChartSetInteger(chartId, CHART_SHOW_GRID, showGrid); + ChartSetInteger(chartId, CHART_SHOW_VOLUMES, showVolumes); + ChartSetInteger(chartId, CHART_SHOW_TRADE_LEVELS, showTradeLevels); + ChartSetInteger(chartId, CHART_AUTOSCROLL, autoScroll); + ChartSetInteger(chartId, CHART_QUICK_NAVIGATION, quickNavigation); + ChartSetInteger(chartId, CHART_COLOR_FOREGROUND, foreGroundColor); + ChartSetInteger(chartId, CHART_COLOR_BACKGROUND, backGroundColor); + ChartSetInteger(chartId, CHART_COLOR_CHART_UP, upColor); + ChartSetInteger(chartId, CHART_COLOR_CHART_DOWN, downColor); + ChartSetInteger(chartId, CHART_COLOR_CANDLE_BULL, bullishColor); + ChartSetInteger(chartId, CHART_COLOR_CANDLE_BEAR, bearishColor); + ChartSetInteger(chartId, CHART_COLOR_GRID, gridColor); + ChartSetInteger(chartId, CHART_COLOR_BID, bidLineColor); + ChartSetInteger(chartId, CHART_COLOR_ASK, askLineColor); + ChartSetInteger(chartId, CHART_COLOR_STOP_LEVEL, stopColor); + ChartSetInteger(chartId, CHART_COLOR_CHART_LINE, lineColor); + ChartSetInteger(chartId, CHART_COLOR_VOLUME, volumesColor); +} +// +// END Chart Style Drawers ... +// \ No newline at end of file diff --git a/BKPS/OLD/XEU5-0/Libraries/x-saherelm.http.lib.mq5 b/BKPS/OLD/XEU5-0/Libraries/x-saherelm.http.lib.mq5 new file mode 100644 index 0000000..97f7ac0 --- /dev/null +++ b/BKPS/OLD/XEU5-0/Libraries/x-saherelm.http.lib.mq5 @@ -0,0 +1,177 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 Http Library +// ------------------------------------------ +// Name: XHttp +// Description: provide http communication +// 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 Model Definition ... +// +enum X_HTTP_METHOD +{ + X_HTTP_GET, + X_HTTP_POST +}; +// +// END Model Definition ... +// + +// +// START Inputs ... +// +// +// END Inputs ... +// + +// +// START Global Definitions: Variables, Properties and etc ... +// +// +// END Global Definitions: Variables, Properties and etc ... +// + +// +// START Provided Functions ... +// +// +// Initial Library if required ... +bool OnInInitHttpLibrary() +{ + return false; +} + +// +// DeInitial Library if required ... +void OnDeinitHttpLibrary() +{ +} + +// +// 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; +} + +// +// 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; + } + + // + result = WebRequest( + strMethod, + url, + headers, + timeout, + payload, + response, + responseHeaders + ); + + // + 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; +} +// +// END Provided Functions ... +// diff --git a/BKPS/OLD/XEU5-0/Libraries/x-saherelm.log.lib.mq5 b/BKPS/OLD/XEU5-0/Libraries/x-saherelm.log.lib.mq5 new file mode 100644 index 0000000..70f1bda --- /dev/null +++ b/BKPS/OLD/XEU5-0/Libraries/x-saherelm.log.lib.mq5 @@ -0,0 +1,261 @@ +/////////////////////////////////////////////////////// +// +// 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 +// +// 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); +} + +// +// 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); +} + +// +// Convert a Signal to String Message ... +string SignalToString(const XSignal &signal) +{ + // + string result = "\n"; + + // + result += "Signal: " + "\n"; + result += "id: " + (string)signal.id + "\n"; + result += "symbol: " + signal.symbol + "\n"; + result += "type: " + EnumToString(signal.type) + "\n"; + result += "magicNumber: " + (string)signal.magicNumber + "\n"; + result += "ticket: " + (string)signal.ticket + "\n"; + result += "entry: " + (string)signal.entry + "\n"; + result += "tp: " + (string)signal.tp + "\n"; + result += "sl: " + (string)signal.sl + "\n"; + result += "riskFreeStep: " + (string)signal.riskFreeStep + "\n"; + result += "riskFreeRate: " + (string)signal.riskFreeRate + "\n"; + result += "profit: " + (string)signal.profit + "\n"; + result += "time: " + (string)signal.time + "\n"; + result += "volume: " + (string)signal.volume + "\n"; + result += "comment: " + signal.comment + "\n"; + + // + return result; +} + +// +// Convert an Executed Signal to String Message ... +string ExecutedSignalToString(const XSignal &signal) +{ + // + string result = ""; + + // + result += (signal.type == X_SIGNAL_LONG ? "Buy" : "Sell") + " Signal Executed provided on (" + signal.symbol + " _ " + EnumToString(_Period) + ") by this comment: " + signal.comment; + + // + return result; +} + +// +// Logging Signal ... +void LogSignal(const XSignal &signal) +{ + // + string message = SignalToString(signal); + + // + LogMessage(message); +} + +// +// Log Signal Execution ... +void LogExecutedSignal(const XSignal &signal) +{ + // + string message = ExecutedSignalToString(signal); + + // + LogMessage(message); +} + +// +// Convert a Deal to String ... +string DealToString(const XDeal &deal) +{ + // + string result = "\n"; + + // + result += "Deal:" + "\n"; + result += " " + "\n"; + result += "time: " + (string)deal.time + "\n"; + result += "ticket: " + (string)deal.ticket + "\n"; + result += "order: " + (string)deal.order + "\n"; + result += "positionId: " + (string)deal.positionId + "\n"; + result += "type: " + EnumToString(deal.type) + "\n"; + result += "entry: " + EnumToString(deal.entry) + "\n"; + result += "reason: " + EnumToString(deal.reason) + "\n"; + result += "symbol: " + deal.symbol + "\n"; + result += "price: " + (string)deal.price + "\n"; + result += "profit: " + (string)deal.profit + "\n"; + result += "swap: " + (string)deal.swap + "\n"; + result += "commission: " + (string)deal.commission + "\n"; + result += "volume: " + (string)deal.volume + "\n"; + result += "comment: " + deal.comment + "\n"; + + // + return result; +} + +// +// Log Specific Deal ... +void LogDeal(const XDeal &deal) +{ + // + string message = DealToString(deal); + + // + LogMessage(message); +} + +// +// Convert an Order to String ... +string OrderToString(const XOrder &order) +{ + // + string result = "\n"; + + // + result += "Order: " + "\n"; + result += "magic: " + (string)order.magic + "\n"; + result += "positionId: " + (string)order.positionId + "\n"; + result += "symbol: " + (string)order.symbol + "\n"; + result += "ticket: " + (string)order.ticket + "\n"; + result += "timeSetup: " + (string)order.timeSetup + "\n"; + result += "timeDone: " + (string)order.timeDone + "\n"; + result += "timeExpiration: " + (string)order.timeExpiration + "\n"; + result += "priceOpen: " + (string)order.priceOpen + "\n"; + result += "priceCurrent: " + (string)order.priceCurrent + "\n"; + result += "priceStopLimit: " + (string)order.priceStopLimit + "\n"; + result += "stopLoss: " + (string)order.stopLoss + "\n"; + result += "takeProfit: " + (string)order.takeProfit + "\n"; + result += "volumeInitial: " + (string)order.volumeInitial + "\n"; + result += "volumeCurrent: " + (string)order.volumeCurrent + "\n"; + result += "comment: " + order.comment + "\n"; + result += "type: " + EnumToString(order.type) + "\n"; + result += "state: " + EnumToString(order.state) + "\n"; + result += "typeFilling: " + EnumToString(order.typeFilling) + "\n"; + result += "typeTime: " + EnumToString(order.typeTime) + "\n"; + result += "reason: " + EnumToString(order.reason) + "\n"; + + // + return result; +} + +// +// Log Specific Order ... +void LogOrder(const XOrder &order) +{ + // + string message = OrderToString(order); + + // + LogMessage(message); +} + +// +// END Provided Functions ... +// diff --git a/BKPS/OLD/XEU5-0/Libraries/x-saherelm.models.lib.mq5 b/BKPS/OLD/XEU5-0/Libraries/x-saherelm.models.lib.mq5 new file mode 100644 index 0000000..b98ae3e --- /dev/null +++ b/BKPS/OLD/XEU5-0/Libraries/x-saherelm.models.lib.mq5 @@ -0,0 +1,438 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 Models Library +// --------------------------------------- +// Name: XModels +// Description: provides all required models ... +// +// +// 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 ... +// + +// +// START Global Definitions: Variables, Properties and etc ... +// +// +// END Global Definitions: Variables, Properties and etc ... +// + +// +// START Provided Functions ... +// + +// +// How To Calculate Static Volume ... +enum ENUM_STATIC_VOLUME_METHODS +{ + // + // Based On Deposit ... + X_STATIC_VOLUME_BASED_ON_DEPOSIT, + // + // Based On Balance ... + X_STATIC_VOLUME_BASED_ON_BALANCE, +}; + +// +// START Model Definitions ... +// +// +// OHCL Candel Model ... +enum ENUM_X_PRICE +{ + X_PRICE_HIGH, + X_PRICE_OPEN, + X_PRICE_CLOSE, + X_PRICE_LOW +}; + +// +// Describe an Specific Candle ... +struct XOHCL +{ + double high; + double open; + double close; + double low; +}; + +// +// Swing Types Enum ... +enum ENUM_X_SWING_TYPE +{ + X_NO_SWING = 0, + X_SWING_HIGH = 1, + X_SWING_LOW = -1, +}; + +// +// XTrader Execution Signal Result ... +enum ENUM_EXECUTION_SIGNAL_RESULT +{ + // + X_TRADER_UNKNOWN_ERROR, + X_TRADER_SUCCEED_EXECUTION, + X_TRADER_INVALID_SIGNAL_ERROR, + X_TRADER_NOT_ENOUGH_EQUITY_ERROR, + X_TRADER_MAX_TRADES_REACHED_ERROR, + X_TRADER_NOT_ENOUGH_BALANCE_ERROR, + X_TRADER_NOT_ENOUGH_MARIGIN_ERROR + // +}; + +// +// Signal Types ... +enum ENUM_X_SIGNAL_TYPE +{ + X_SIGNAL_LONG, + X_SIGNAL_SHORT, + X_SIGNAL_UNKNOWN, +}; + +// +// Signal Structure ... +struct XSignal +{ + // + // Identifier ... + ulong id; + + // + // Which Symbol used for Signal ... + string symbol; + + // + // Which Type of operations ... + ENUM_X_SIGNAL_TYPE type; + + // + // Magic Number ... + ulong magicNumber; + + // + // Ticket ... + ulong ticket; + + // + // Entry/Open Price ... + double entry; + + // + // TP ... + double tp; + + // + // SL ... + double sl; + + // + // Make Risk Free Trade on this Value if provided ... + double riskFreeStep; + + // + // a Multiplier for determines how much trade volume exit on risk free time ... + double riskFreeRate; + + // + // Trade Profit ... + double profit; + + // + // Time of Operation ... + datetime time; + + // + // Volume ... + double volume; + + // + // Comment ... + string comment; +}; + +// +// Signal Additional Info ... +struct XProvidedSignal +{ + // + // Suggested TP ... + double tp; + + // + // Suggested SL ... + double sl; + + // + // Signallers ... + string signallers[]; +}; + +// +// Model Specific Deal ... +struct XDeal +{ + // + // the ID of the Expert Advisor, that executed the deal ... + ulong magic; + + // + // the ID of position, in which the deal was involved ... + ulong positionId; + + // + // Ticket ... + ulong ticket; + + // + // the name of the deal symbol ... + string symbol; + + // + // order by which the deal is executed ... + ulong order; + + // + // the time of deal execution ... + datetime time; + + // + // Deal price ... + double price; + + // + // the financial result of the deal (in deposit currency) ... + double profit; + + // + // the amount of swap when position is closed ... + double swap; + + // + // the amount of commission of the deal ... + double commission; + + // + // the volume of deal ... + double volume; + + // + // the deal comment ... + string comment; + + // + // the deal type ... + // ------------------------------------------------------------------ + // DEAL_TYPE_BUY => 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 Specific Order ... +struct XOrder +{ + // + // the ID of expert that placed the order ... + ulong magic; + + // + // the ID of position ... + ulong positionId; + + // + // the name of order symbol ... + string symbol; + + // + // the ticket of an order, previously selected for access ... + ulong ticket; + + // + // the time of order placement ... + datetime timeSetup; + + // + // the time of order execution or cancellation ... + datetime timeDone; + + // + // the order expiration time ... + datetime timeExpiration; + + // + // the order price ... + double priceOpen; + + // + // the current price by order symbol ... + double priceCurrent; + + // + // the price of a pending order ... + double priceStopLimit; + + // + // the order's Stop Loss ... + double stopLoss; + + // + // the order's Take Profit ... + double takeProfit; + + // + // the initial volume of order ... + double volumeInitial; + + // + // the unfilled volume of order ... + double volumeCurrent; + + // + // the order comment ... + string comment; + + // + // the order type ... + // -------------------- + // ORDER_TYPE_BUY => Market Buy order ... + // ORDER_TYPE_SELL => Market Sell order ... + // ORDER_TYPE_BUY_LIMIT => Buy Limit pending order ... + // ORDER_TYPE_SELL_LIMIT => Sell Limit pending order ... + // ORDER_TYPE_BUY_STOP => Buy Stop pending order ... + // ORDER_TYPE_SELL_STOP => Sell Stop pending order ... + // ORDER_TYPE_BUY_STOP_LIMIT => Upon reaching the order price, a pending Buy Limit order is placed at the StopLimit price ... + // ORDER_TYPE_SELL_STOP_LIMIT => Upon reaching the order price, a pending Sell Limit order is placed at the StopLimit price ... + // ORDER_TYPE_CLOSE_BY => Order to close a position by an opposite one ... + ENUM_ORDER_TYPE type; + + // + // the order state ... + // -------------------------- + // ORDER_STATE_STARTED => Order checked, but not yet accepted by broker ... + // ORDER_STATE_PLACED => Order accepted ... + // ORDER_STATE_CANCELED => Order canceled by client ... + // ORDER_STATE_PARTIAL => Order partially executed ... + // ORDER_STATE_FILLED => Order fully executed ... + // ORDER_STATE_REJECTED => Order rejected ... + // ORDER_STATE_EXPIRED => Order expired ... + // ORDER_STATE_REQUEST_ADD => Order is being registered (placing to the trading system) + // ORDER_STATE_REQUEST_MODIFY => Order is being modified (changing its parameters) ... + // ORDER_STATE_REQUEST_CANCEL => Order is being deleted (deleting from the trading system) ... + ENUM_ORDER_STATE state; + + // + // the order filling type ... + // ---------------------------- + // ORDER_FILLING_FOK => Fill or Kill + // An order can be executed in the specified volume only. + // If the necessary amount of a financial instrument is currently unavailable in the market, + // the order will not be executed. + // The desired volume can be made up of several available offers. + // The possibility of using FOK orders is determined at the trade server. + // ORDER_FILLING_IOC => Immediate or Cancel + // A trader agrees to execute a deal with the volume maximally available in the market within that indicated in the order. + // If the request cannot be filled completely, an order with the available volume will be executed, + // and the remaining volume will be canceled. + // The possibility of using IOC orders is determined at the trade server. + // ORDER_FILLING_BOC => Passive (Book or Cancel) + // The BoC order assumes that the order can only be placed in the Depth of Market and cannot be immediately executed. + // If the order can be executed immediately when placed, then it is canceled. + // In fact, the BOC policy guarantees that the price of the placed order will be worse than + // the current market. BoC orders are used to implement passive trading, + // so that the order is not executed immediately when placed and does not affect current liquidity. + // Only limit and stop limit orders are supported (ORDER_TYPE_BUY_LIMIT, ORDER_TYPE_SELL_LIMIT, ORDER_TYPE_BUY_STOP_LIMIT, ORDER_TYPE_SELL_STOP_LIMIT). + // ORDER_FILLING_RETURN => Return + // In case of partial filling, an order with remaining volume is not canceled but processed further. + // Return orders are not allowed in the Market Execution + // mode (market execution — SYMBOL_TRADE_EXECUTION_MARKET). + ENUM_ORDER_TYPE_FILLING typeFilling; + + // + // the type of order at the time of the expiration ... + // -------------------------------------------------------- + // ORDER_TIME_GTC => Good till cancel order ... + // ORDER_TIME_DAY => Good till current trade day order ... + // ORDER_TIME_SPECIFIED => Good till expired order ... + // ORDER_TIME_SPECIFIED_DAY => The order will be effective till 23:59:59 of the specified day. + // If this time is outside a trading session, the order expires in the nearest trading time ... + ENUM_ORDER_TYPE_TIME typeTime; + + // + // The reason for order placing ... + // -------------------------------------- + // ORDER_REASON_SL => The order was placed as a result of Stop Loss activation ... + // ORDER_REASON_TP => The order was placed as a result of Take Profit activation ... + // ORDER_REASON_SO => The order was placed as a result of the Stop Out event ... + // ORDER_REASON_WEB => The order was placed from a web platform ... + // ORDER_REASON_CLIENT => The order was placed from a desktop terminal ... + // ORDER_REASON_MOBILE => The order was placed from a mobile application ... + // ORDER_REASON_EXPERT => The order was placed from an MQL5-program, i.e. by an Expert Advisor or a script ... + ENUM_ORDER_REASON reason; +}; +// +// END Provided Functions ... +// diff --git a/BKPS/OLD/XEU5-0/Providers/.gitkeep b/BKPS/OLD/XEU5-0/Providers/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/BKPS/OLD/XEU5-0/Providers/x-saherelm.xeu5.provider.indicators.lib.mq5 b/BKPS/OLD/XEU5-0/Providers/x-saherelm.xeu5.provider.indicators.lib.mq5 new file mode 100644 index 0000000..b45d4fd --- /dev/null +++ b/BKPS/OLD/XEU5-0/Providers/x-saherelm.xeu5.provider.indicators.lib.mq5 @@ -0,0 +1,9201 @@ +/////////////////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 XEU5 Signal Provider Indicators Library +// ---------------------------------------------------------------- +// +// 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 Define Enums ... +// + +// +enum ENUM_XEU5_SIGNAL_PROVIDERS +{ + // + // XSP Expert Support Mechanism ... + XSP, + // + // XTD ... + XTD, + // + // XTAM ... + XTAM, + // + // XSI ... + XSI, + // + // XSTFI ... + XSTFI, + // + // XOBDLH ... + XOBDLH, + // + // XCHMACC ... + XCHMACC, + // + // XCHMACMN ... + XCHMACMN, + // + // XCHMACMX ... + XCHMACMX, +}; + +// +// Represent Market Conditions ... +struct XEU5MarketConditions +{ + // + // XTM ... + bool isXTMPeak; + bool isXTMVale; + bool isXTMBullish; + bool isXTMBearish; + bool isXTMNeutural; + bool isXTMEndBullish; + bool isXTMEndBearish; + bool isXTMStartBullish; + bool isXTMStartBearish; + bool isXTMEndBullishByNeutural; + bool isXTMEndBearishByNeutural; + bool isXTMStartBullishAfterNeutural; + bool isXTMStartBearishAfterNeutural; + + // + // XAMA ... + bool isXAMAPeak; + bool isXAMAVale; + bool isXAMABullish; + bool isXAMABearish; + bool isXAMANeutural; + bool isXAMAEndBullish; + bool isXAMAEndBearish; + bool isXAMAStartBullish; + bool isXAMAStartBearish; + bool isXAMAEndBullishByNeutural; + bool isXAMAEndBearishByNeutural; + bool isXAMAStartBullishAfterNeutural; + bool isXAMAStartBearishAfterNeutural; + + // + // XLH ... + bool isXLHHHIncreased; + bool isXLHHHDecreased; + bool isXLHLLIncreased; + bool isXLHLLDecreased; + bool isXLHLowAttachedLL; + bool isXLHHighAttachedHH; + bool isXLHHHSameInLength; + bool isXLHLLSameInLength; + bool isXLHPriceOverSignal; + bool isXLHPriceUnderSignal; + bool isXLHPriceInSignalRange; + bool isXLHPriceCrossedOverSignal; + bool isXLHPriceCrossedUnderSignal; + + // + // XTD ... + bool isXTDSignalPeak; + bool isXTDSignalVale; + bool isXTDBullishPeak; + bool isXTDBullishVale; + bool isXTDBearishPeak; + bool isXTDBearishVale; + bool isXTDBullOverBear; + bool isXTDBullUnderBear; + bool isXTDSignalOverBear; + bool isXTDSignalUnderBear; + bool isXTDBullCrossedOverBear; + bool isXTDBullCrossedUnderBear; + bool isXTDSignalCrossedOverBear; + bool isXTDSignalCrossedUnderBear; + + // + // XFI ... + bool isXFIPeak; + bool isXFIVale; + bool isXFICrossedOverZero; + bool isXFIOverZero; + bool isXFICrossedUnderZero; + bool isXFIUnderZero; + + // + // XTS ... + bool isXTSAllSame; + bool isXTSCurrentMin; + bool isXTSCurrentMax; + bool isXTSCurrentOverFarest; + bool isXTSCurrentOverNearest; + bool isXTSCurrentOverMediest; + bool isXTSCurrentUnderFarest; + bool isXTSCurrentUnderNearest; + bool isXTSCurrentUnderMediest; + bool isXTSCurrentCrossedOverFarest; + bool isXTSCurrentCrossedOverNearest; + bool isXTSCurrentCrossedOverMediest; + bool isXTSCurrentCrossedUnderFarest; + bool isXTSCurrentCrossedUnderNearest; + bool isXTSCurrentCrossedUnderMediest; + + // + // XRSI ... + bool isXRSIPeak; + bool isXRSIVale; + bool isXRSICrossedOverLongExit; + bool isXRSICrossedOverLongEntry; + bool isXRSICrossedUnderShortExit; + bool isXRSICrossedUnderShortEntry; + + // + // XOBD ... + bool isXOBDSwingLow; + bool isXOBDSwingHigh; + + // + // XCHLH ... + // + bool isXCHLHSameHHs; + bool isXCHLHSameLLs; + // + bool isXCHLHSCMCHHSame; + bool isXCHLHSCMCLLSame; + // + bool isXCHLHSCLCHHSame; + bool isXCHLHSCLCLLSame; + // + bool isXCHLHMCLCHHSame; + bool isXCHLHMCLCLLSame; + // + bool isXCHLHMCOnTopOfLC; + bool isXCHLHMCInBottomOfLC; + + // + // XCHMA ... + // + bool isXCHMASCOverMax; + bool isXCHMASCOverMin; + bool isXCHMASCUnderMax; + bool isXCHMASCUnderMin; + // + bool isXCHMASCCrossedOverMax; + bool isXCHMASCCrossedUnderMax; + bool isXCHMASCCrossedOverMin; + bool isXCHMASCCrossedUnderMin; + // + bool isXCHMASCPeak; + bool isXCHMASCVale; + bool isXCHMASCTrendsUp; + bool isXCHMASCTrendsDown; + bool isXCHMASCFastOverSlow; + bool isXCHMASCFastUnderSlow; + bool isXCHMASCFastCrossedOverSlow; + bool isXCHMASCFastCrossedUnderSlow; + // + bool isXCHMAMCPeak; + bool isXCHMAMCVale; + bool isXCHMAMCTrendsUp; + bool isXCHMAMCTrendsDown; + bool isXCHMAMCFastOverSlow; + bool isXCHMAMCFastUnderSlow; + bool isXCHMAMCFastCrossedOverSlow; + bool isXCHMAMCFastCrossedUnderSlow; + // + bool isXCHMALCPeak; + bool isXCHMALCVale; + bool isXCHMALCTrendsUp; + bool isXCHMALCTrendsDown; + bool isXCHMALCFastOverSlow; + bool isXCHMALCFastUnderSlow; + bool isXCHMALCFastCrossedOverSlow; + bool isXCHMALCFastCrossedUnderSlow; +}; + +// +// END Define Enums ... +// + +// +// Include Provider Inputs ... +#include "x-saherelm.xeu5.provider.inputs.lib.mq5" + +// +// Signallers ... +input group "XEU5 Signallers"; + +// +// XTD ... +input group "XEU5 XTD Signaller"; +input bool xEU5XTDEnableSignaller = true; // Enable Signaller +// input bool xEU5XTDEnableTPSL = false; // Enable TP/SL +input bool xEU5XTDAllowLongSignals = true; // Enable Long Signals +input bool xEU5XTDAllowShortSignals = true; // Enable Short Signals + +// +// XTAM ... +input group "XEU5 XTAM Signaller"; +input bool xEU5XTAMEnableSignaller = true; // Enable Signaller +// input bool xEU5XTAMEnableTPSL = false; // Enable TP/SL +input bool xEU5XTAMAllowLongSignals = true; // Enable Long Signals +input bool xEU5XTAMAllowShortSignals = true; // Enable Short Signals + +// +// XSI ... +input group "XEU5 XSI Signaller"; +input bool xEU5XSIEnableSignaller = true; // Enable Signaller +// input bool xEU5SIXEnableTPSL = false; // Enable TP/SL +input bool xEU5XSIAllowLongSignals = true; // Enable Long Signals +input bool xEU5XSIAllowShortSignals = true; // Enable Short Signals + +// +// XSTFI ... +input group "XEU5 XSTFI Signaller"; +input bool xEU5XSTFIEnableSignaller = true; // Enable Signaller +// input bool xEU5XSTFIEnableTPSL = false; // Enable TP/SL +input bool xEU5XSTFIAllowLongSignals = true; // Enable Long Signals +input bool xEU5XSTFIAllowShortSignals = true; // Enable Short Signals + +// +// XOBDLH ... +input group "XEU5 XOBDLH Signaller"; +input bool xEU5XOBDLHEnableSignaller = true; // Enable Signaller +// input bool xEU5XOBDLHEnableTPSL = false; // Enable TP/SL +input bool xEU5XOBDLHAllowLongSignals = true; // Enable Long Signals +input bool xEU5XOBDLHAllowShortSignals = true; // Enable Short Signals + +// +// XCHMACC ... +input group "XEU5 XCHMACC Signaller"; +input bool xEU5XCHMACCEnableSignaller = true; // Enable Signaller +// input bool xEU5XCHMACCEnableTPSL = false; // Enable TP/SL +input bool xEU5XCHMACCAllowLongSignals = true; // Enable Long Signals +input bool xEU5XCHMACCAllowShortSignals = true; // Enable Short Signals + +// +// XCHMACMX ... +input group "XEU5 XCHMACMX Signaller"; +input bool xEU5XCHMACMXEnableSignaller = true; // Enable Signaller +// input bool xEU5XCHMACMXEnableTPSL = false; // Enable TP/SL +input bool xEU5XCHMACMXAllowLongSignals = true; // Enable Long Signals +input bool xEU5XCHMACMXAllowShortSignals = true; // Enable Short Signals + +// +// XCHMACMN ... +input group "XEU5 XCHMACMN Signaller"; +input bool xEU5XCHMACMNEnableSignaller = true; // Enable Signaller +// input bool xEU5XCHMACMNEnableTPSL = false; // Enable TP/SL +input bool xEU5XCHMACMNAllowLongSignals = true; // Enable Long Signals +input bool xEU5XCHMACMNAllowShortSignals = true; // Enable Short Signals + +// +// Imports all Indicators Helper here ... +// input group "XEU5 Provider Indicators"; + +// +#include "../Helpers/x-saherelm.xtm.indicator.helper.lib.mq5" +#include "../Helpers/x-saherelm.xama.indicator.helper.lib.mq5" +#include "../Helpers/x-saherelm.xlh.indicator.helper.lib.mq5" +#include "../Helpers/x-saherelm.xtd.oscillator.helper.lib.mq5" +#include "../Helpers/x-saherelm.xfi.oscillator.helper.lib.mq5" +#include "../Helpers/x-saherelm.xts.oscillator.helper.lib.mq5" +#include "../Helpers/x-saherelm.xobd.indicator.helper.lib.mq5" +#include "../Helpers/x-saherelm.xrsi.oscillator.helper.lib.mq5" +#include "../Helpers/x-saherelm.xchlh.oscillator.helper.lib.mq5" +#include "../Helpers/x-saherelm.xchma.oscillator.helper.lib.mq5" + +// +bool xEU5IsTestMode = true; +int xEU5MaxLengthOfInputs = 0; +int xEU5CalculatedBars = 0; + +// +// Signaller Variables ... +// +// XTD ... +bool xEU5MXTDEnableSignaller = xEU5XTDEnableSignaller; +// bool xEU5MXTDEnableTPSL = xEU5XTDEnableTPSL; +bool xEU5MXTDAllowLongSignals = xEU5XTDAllowLongSignals; +bool xEU5MXTDAllowShortSignals = xEU5XTDAllowShortSignals; + +// +// XTAM ... +bool xEU5MXTAMEnableSignaller = xEU5XTAMEnableSignaller; +// bool xEU5MXTAMEnableTPSL = xEU5XTAMEnableTPSL; +bool xEU5MXTAMAllowLongSignals = xEU5XTAMAllowLongSignals; +bool xEU5MXTAMAllowShortSignals = xEU5XTAMAllowShortSignals; + +// +// XSI ... +bool xEU5MXSIEnableSignaller = xEU5XSIEnableSignaller; +// bool xEU5MSIXEnableTPSL = xEU5SIXEnableTPSL; +bool xEU5MXSIAllowLongSignals = xEU5XSIAllowLongSignals; +bool xEU5MXSIAllowShortSignals = xEU5XSIAllowShortSignals; + +// +// XSTFI ... +bool xEU5MXSTFIEnableSignaller = xEU5XSTFIEnableSignaller; +// bool xEU5MXSTFIEnableTPSL = xEU5XSTFIEnableTPSL; +bool xEU5MXSTFIAllowLongSignals = xEU5XSTFIAllowLongSignals; +bool xEU5MXSTFIAllowShortSignals = xEU5XSTFIAllowShortSignals; + +// +// XOBDLH ... +bool xEU5MXOBDLHEnableSignaller = xEU5XOBDLHEnableSignaller; +// bool xEU5MXOBDLHEnableTPSL = xEU5XOBDLHEnableTPSL; +bool xEU5MXOBDLHAllowLongSignals = xEU5XOBDLHAllowLongSignals; +bool xEU5MXOBDLHAllowShortSignals = xEU5XOBDLHAllowShortSignals; + +// +// XCHMACC ... +bool xEU5MXCHMACCEnableSignaller = xEU5XCHMACCEnableSignaller; +// bool xEU5MXCHMACCEnableTPSL = xEU5XCHMACCEnableTPSL; +bool xEU5MXCHMACCAllowLongSignals = xEU5XCHMACCAllowLongSignals; +bool xEU5MXCHMACCAllowShortSignals = xEU5XCHMACCAllowShortSignals; + +// +// XCHMAMX ... +bool xEU5MXCHMACMXEnableSignaller = xEU5XCHMACMXEnableSignaller; +// bool xEU5MXCHMACMXEnableTPSL = xEU5XCHMACMXEnableTPSL; +bool xEU5MXCHMACMXAllowLongSignals = xEU5XCHMACMXAllowLongSignals; +bool xEU5MXCHMACMXAllowShortSignals = xEU5XCHMACMXAllowShortSignals; + +// +// XCHMAMN ... +bool xEU5MXCHMACMNEnableSignaller = xEU5XCHMACMNEnableSignaller; +// bool xEU5MXCHMACMNEnableTPSL = xEU5XCHMACMNEnableTPSL; +bool xEU5MXCHMACMNAllowLongSignals = xEU5XCHMACMNAllowLongSignals; +bool xEU5MXCHMACMNAllowShortSignals = xEU5XCHMACMNAllowShortSignals; + +// +// Funded Next Resolve Guards ... +bool isXEU5OnFundedNext = true; + +// +// Here we Define some Global Market Variables to Analyse MArket Conditions +// using them at each time ... +XEU5MarketConditions xEU5Conditions = {}; + +// +// Validate Indicators Inputs ... +bool XEU5ValidateIndicatorsInputs() +{ + // + bool result = false; + + // + // XTM ... + result = XTMValidateInputs(); + if (!result) + { + return result; + } + + // + // XAMA ... + result = XAMAValidateInputs(); + if (!result) + { + return result; + } + + // + // XTD ... + result = XTDValidateInputs(); + if (!result) + { + return result; + } + + // + // XFI ... + result = XFIValidateInputs(); + if (!result) + { + return result; + } + + // + // XTS ... + result = XTSValidateInputs(); + if (!result) + { + return result; + } + + // + // XOBD ... + result = XOBDValidateInputs(); + if (!result) + { + return result; + } + + // + // XLH ... + result = XLHValidateInputs(); + if (!result) + { + return result; + } + + // + // XRSI ... + result = XRSIValidateInputs(); + if (!result) + { + return result; + } + + // + // XCHLH ... + result = XCHLHValidateInputs(); + if (!result) + { + return result; + } + + // + // XCHMA ... + result = XCHMAValidateInputs(); + if (!result) + { + return result; + } + + // + result = true; + + // + return result; +} + +// +// Init Indicators ... +bool XEU5InitIndicators() +{ + // + bool result = false; + + // + // Make it Enable when we need to Log Market Conditions ... + // xEU5IsTestMode = false; // IsRunningOnTestMode(); + + // + // Check and Calculate Max Length in Inputs ... + // + + // + // XTM ... + xEU5MaxLengthOfInputs = MathMax( + xTMMaPeriod, + xEU5NumberOfItemsPerTick); + + // + // XAMA ... + xEU5MaxLengthOfInputs = MathMax( + xAMALength, + xEU5NumberOfItemsPerTick); + xEU5MaxLengthOfInputs = MathMax( + xAMAFastEMA, + xEU5NumberOfItemsPerTick); + xEU5MaxLengthOfInputs = MathMax( + xAMASlowEMA, + xEU5NumberOfItemsPerTick); + + // + // XLH ... + xEU5MaxLengthOfInputs = MathMax( + xLHLength, + xEU5NumberOfItemsPerTick); + + // + // XTD ... + xEU5MaxLengthOfInputs = MathMax( + xTDLength, + xEU5MaxLengthOfInputs); + + // + // XFI ... + xEU5MaxLengthOfInputs = MathMax( + xFILength, + xEU5MaxLengthOfInputs); + + // + // XRSI ... + xEU5MaxLengthOfInputs = MathMax( + xRSILength, + xEU5MaxLengthOfInputs); + + // + // XOBD ... + xEU5MaxLengthOfInputs = MathMax( + xOBDLength, + xEU5MaxLengthOfInputs); + + // + // XCHLH ... + xEU5MaxLengthOfInputs = MathMax( + xCHLHLcLength, + xEU5MaxLengthOfInputs); + xEU5MaxLengthOfInputs = MathMax( + xCHLHMcLength, + xEU5MaxLengthOfInputs); + xEU5MaxLengthOfInputs = MathMax( + xCHLHScLength, + xEU5MaxLengthOfInputs); + + // + // XCHMA ... + xEU5MaxLengthOfInputs = MathMax( + xCHMAScFastLength, + xEU5MaxLengthOfInputs); + xEU5MaxLengthOfInputs = MathMax( + xCHMAScSlowLength, + xEU5MaxLengthOfInputs); + xEU5MaxLengthOfInputs = MathMax( + xCHMAMcFastLength, + xEU5MaxLengthOfInputs); + xEU5MaxLengthOfInputs = MathMax( + xCHMAMcSlowLength, + xEU5MaxLengthOfInputs); + xEU5MaxLengthOfInputs = MathMax( + xCHMALcFastLength, + xEU5MaxLengthOfInputs); + xEU5MaxLengthOfInputs = MathMax( + xCHMALcSlowLength, + xEU5MaxLengthOfInputs); + + // + // Validate Indicators Inputs before Initialization ... + result = XEU5ValidateIndicatorsInputs(); + if (!result) + { + return result; + } + + // + // Validate Signallers ... + + // + // XTD ... + bool isXTDEnable = + xEU5XTDEnableSignaller && + (xEU5XTDAllowLongSignals || + xEU5XTDAllowShortSignals); + + // + // XTAM ... + bool isXTAMEnable = + xEU5XTAMEnableSignaller && + (xEU5XTAMAllowLongSignals || + xEU5XTAMAllowShortSignals); + + // + // XSI ... + bool isXSIEnable = + xEU5XSIEnableSignaller && + (xEU5XSIAllowLongSignals || + xEU5XSIAllowShortSignals); + + // + // XSTFI ... + bool isXSTFIEnable = + xEU5XSTFIEnableSignaller && + (xEU5XSTFIAllowLongSignals || + xEU5XSTFIAllowShortSignals); + + // + // XOBDLH ... + bool isXOBDLHEnable = + xEU5XOBDLHEnableSignaller && + (xEU5XOBDLHAllowLongSignals || + xEU5XOBDLHAllowShortSignals); + + // + // XCHMACC ... + bool isXCHMACCEnable = + xEU5XCHMACCEnableSignaller && + (xEU5XCHMACCAllowLongSignals || + xEU5XCHMACCAllowShortSignals); + + // + // XCHMACMX ... + bool isXCHMACMXEnable = + xEU5XCHMACMXEnableSignaller && + (xEU5XCHMACMXAllowLongSignals || + xEU5XCHMACMXAllowShortSignals); + + // + // XCHMACMN ... + bool isXCHMACMNEnable = + xEU5XCHMACMNEnableSignaller && + (xEU5XCHMACMNAllowLongSignals || + xEU5XCHMACMNAllowShortSignals); + + // + bool hasSignaller = + // + isXTDEnable || + isXTAMEnable || + isXSIEnable || + isXSTFIEnable || + isXOBDLHEnable || + isXCHMACCEnable || + isXCHMACMXEnable || + isXCHMACMNEnable + // + ; + result = hasSignaller; + if (!result) + { + // + LogMessage("XEU5 doesn't enable any Signaller ..."); + + // + return result; + } + + // + // Initialize Indicator/Oscillator Handlers ... + ResetLastError(); + + // + // XTM Init ... + result = XTMInitHandlers(); + if (!result) + { + return result; + } + + // + // XAMA Init ... + result = XAMAInitHandlers(); + if (!result) + { + return result; + } + + // + // XLH Init ... + result = XLHInitHandlers(); + if (!result) + { + return result; + } + + // + // XTD Init ... + result = XTDInitHandlers(); + if (!result) + { + return result; + } + + // + // XFI Init ... + result = XFIInitHandlers(); + if (!result) + { + return result; + } + + // + // XTS Init ... + result = XTSInitHandlers(); + if (!result) + { + return result; + } + + // + // XRSI Init ... + result = XRSIInitHandlers(); + if (!result) + { + return result; + } + + // + // XOBD Init ... + result = XOBDInitHandlers(); + if (!result) + { + return result; + } + + // + // XCLH Init ... + result = XCHLHInitHandlers(); + if (!result) + { + return result; + } + + // + // XCHMA Init ... + result = XCHMAInitHandlers(); + if (!result) + { + return result; + } + + // + result = true; + + // + return result; +} + +// +// Release Indicators ... +void XEU5ReleaseIndicators() +{ + // + // Release Handlers ... + XTMReleaseHandlers(); + XAMAReleaseHandlers(); + XLHReleaseHandlers(); + XTDReleaseHandlers(); + XFIReleaseHandlers(); + XTSReleaseHandlers(); + XRSIReleaseHandlers(); + XOBDReleaseHandlers(); + XCHMAReleaseHandlers(); + XCHLHReleaseHandlers(); +} + +// +// Handle Reading Buffers ... +void XEU5HandleReadingBuffers() +{ + // + // Reading Calculated Bars for a Simple Handler ... + xEU5CalculatedBars = BarsCalculated(xTMHandler); + + // + // Read Indicators Buffers ... + XTMReadBuffers(xEU5NumberOfItemsPerTick); + XAMAReadBuffers(xEU5NumberOfItemsPerTick); + XLHReadBuffers(xEU5NumberOfItemsPerTick); + XTDReadBuffers(xEU5NumberOfItemsPerTick); + XFIReadBuffers(xEU5NumberOfItemsPerTick); + XTSReadBuffers(xEU5NumberOfItemsPerTick); + XRSIReadBuffers(xEU5NumberOfItemsPerTick); + XOBDReadBuffers(xEU5NumberOfItemsPerTick); + XCHMAReadBuffers(xEU5NumberOfItemsPerTick); + XCHLHReadBuffers(xEU5NumberOfItemsPerTick); + + // + XEU5ReadConditions(); +} + +// +// +// START Combination Functions ... +// +// + +// +// Can Open Long Trade ... +// this is a Function will Check all market Conditions and get all +// Strategy requirement Verifications for Long Signals ... +bool XEU5CanOpenLongTrade( + XProvidedSignal &info // Retrieve Signal Additional Info on this Object +) +{ + // + bool result = false; + + // + info.tp = 0; + info.sl = 0; + ArrayResize( + info.signallers, + 0); + + // + bool hasSignal = XEU5HasLongSignal(info); + + // + result = + // + hasSignal + // + ; + + // + if (result) + { + XEU5ClearConditions(); + } + + // + return result; +} + +// +// Can Close Long Trade ... +// this is a Function will Check all market Conditions and get all +// Strategy requirement Verifications for Long Signals ... +bool XEU5CanCloseLongTrade() +{ + // + bool result = false; + + // + return result; +} + +// +// Can Open Short Trade ... +// this is a Function will Check all market Conditions and get all +// Strategy requirement Verifications for Short Signals ... +bool XEU5CanOpenShortTrade( + XProvidedSignal &info // Retrieve Signal Additional Info on this Object +) +{ + // + bool result = false; + + // + info.tp = 0; + info.sl = 0; + ArrayResize( + info.signallers, + 0); + + // + bool hasSignal = XEU5HasShortSignal(info); + + // + result = + // + hasSignal + // + ; + + // + if (result) + { + XEU5ClearConditions(); + } + + // + return result; +} + +// +// Can Close Short Trade ... +// this is a Function will Check all market Conditions and get all +// Strategy requirement Verifications for Short Signals ... +bool XEU5CanCloseShortTrade() +{ + // + bool result = false; + + // + return result; +} + +// +// +// END Combination Functions ... +// +// + +// +// +// START Combination Signaling ... +// +// + +// +// Read All Globally Required Conditions ... +void XEU5ReadConditions() +{ + // + XEU5ClearConditions(); + + // + xEU5Conditions = XEU5GenerateMarketConditions(1); +} + +// +// Cleanup Conditions ... +void XEU5ClearConditions() +{ + // + XEU5MarketConditions mConditions = {}; + + // + xEU5Conditions = mConditions; +} + +// +// Generate Merket Conditions for Specified Bar Index ... +XEU5MarketConditions XEU5GenerateMarketConditions( + int bar_index = 1 // Specified Bar Index ... +) +{ + // + XEU5MarketConditions mConditions = {}; + + // + // XTM ... + mConditions.isXTMPeak = XTMIsPeak(bar_index); + mConditions.isXTMVale = XTMIsVale(bar_index); + mConditions.isXTMBullish = XTMIsBullish(bar_index); + mConditions.isXTMBearish = XTMIsBearish(bar_index); + mConditions.isXTMNeutural = XTMIsNeutural(bar_index); + mConditions.isXTMEndBullish = XTMIsEndBullish(bar_index); + mConditions.isXTMEndBearish = XTMIsEndBearish(bar_index); + mConditions.isXTMStartBullish = XTMIsStartBullish(bar_index); + mConditions.isXTMStartBearish = XTMIsStartBearish(bar_index); + mConditions.isXTMEndBullishByNeutural = XTMIsEndBullishByNeutural(bar_index); + mConditions.isXTMEndBearishByNeutural = XTMIsEndBearishByNeutural(bar_index); + mConditions.isXTMStartBullishAfterNeutural = XTMIsStartBullishAfterNeutural(bar_index); + mConditions.isXTMStartBearishAfterNeutural = XTMIsStartBearishAfterNeutural(bar_index); + + // + // XAMA ... + mConditions.isXAMAPeak = XAMAIsPeak(bar_index); + mConditions.isXAMAVale = XAMAIsVale(bar_index); + mConditions.isXAMABullish = XAMAIsBullish(bar_index); + mConditions.isXAMABearish = XAMAIsBearish(bar_index); + mConditions.isXAMANeutural = XAMAIsNeutural(bar_index); + mConditions.isXAMAEndBullish = XAMAIsEndBullish(bar_index); + mConditions.isXAMAEndBearish = XAMAIsEndBearish(bar_index); + mConditions.isXAMAStartBullish = XAMAIsStartBullish(bar_index); + mConditions.isXAMAStartBearish = XAMAIsStartBearish(bar_index); + mConditions.isXAMAEndBullishByNeutural = XAMAIsEndBullishByNeutural(bar_index); + mConditions.isXAMAEndBearishByNeutural = XAMAIsEndBearishByNeutural(bar_index); + mConditions.isXAMAStartBullishAfterNeutural = XAMAIsStartBullishAfterNeutural(bar_index); + mConditions.isXAMAStartBearishAfterNeutural = XAMAIsStartBearishAfterNeutural(bar_index); + + // + // XLH ... + mConditions.isXLHHHIncreased = XLHIsHHIncreased(bar_index); + mConditions.isXLHHHDecreased = XLHIsHHDecreased(bar_index); + mConditions.isXLHLLIncreased = XLHIsLLIncreased(bar_index); + mConditions.isXLHLLDecreased = XLHIsLLDecreased(bar_index); + mConditions.isXLHLowAttachedLL = XLHIsLowAttachedLL(bar_index); + mConditions.isXLHHighAttachedHH = XLHIsHighAttachedHH(bar_index); + mConditions.isXLHHHSameInLength = XLHIsHHSameInLength(bar_index); + mConditions.isXLHLLSameInLength = XLHIsLLSameInLength(bar_index); + mConditions.isXLHPriceOverSignal = XLHIsPriceOverSignal(bar_index); + mConditions.isXLHPriceUnderSignal = XLHIsPriceUnderSignal(bar_index); + mConditions.isXLHPriceInSignalRange = XLHIsPriceInSignalRange(bar_index); + mConditions.isXLHPriceCrossedOverSignal = XLHIsPriceCrossedOverSignal(bar_index); + mConditions.isXLHPriceCrossedUnderSignal = XLHIsPriceCrossedUnderSignal(bar_index); + + // + // XTD ... + mConditions.isXTDSignalPeak = XTDIsSignalPeak(bar_index); + mConditions.isXTDSignalVale = XTDIsSignalVale(bar_index); + mConditions.isXTDBullishPeak = XTDIsBullishPeak(bar_index); + mConditions.isXTDBullishVale = XTDIsBullishVale(bar_index); + mConditions.isXTDBearishPeak = XTDIsBearishPeak(bar_index); + mConditions.isXTDBearishVale = XTDIsBearishVale(bar_index); + mConditions.isXTDBullOverBear = XTDIsBullOverBear(bar_index); + mConditions.isXTDBullUnderBear = XTDIsBullUnderBear(bar_index); + mConditions.isXTDSignalOverBear = XTDIsSignalOverBear(bar_index); + mConditions.isXTDSignalUnderBear = XTDIsSignalUnderBear(bar_index); + mConditions.isXTDBullCrossedOverBear = XTDIsBullCrossedOverBear(bar_index); + mConditions.isXTDBullCrossedUnderBear = XTDIsBullCrossedUnderBear(bar_index); + mConditions.isXTDSignalCrossedOverBear = XTDIsSignalCrossedOverBear(bar_index); + mConditions.isXTDSignalCrossedUnderBear = XTDIsSignalCrossedUnderBear(bar_index); + + // + // XFI ... + mConditions.isXFIPeak = XFIIsPeak(bar_index); + mConditions.isXFIVale = XFIIsVale(bar_index); + mConditions.isXFIOverZero = XFIIsOverZero(bar_index); + mConditions.isXFIUnderZero = XFIIsUnderZero(bar_index); + mConditions.isXFICrossedOverZero = XFIIsCrossedOverZero(bar_index); + mConditions.isXFICrossedUnderZero = XFIIsCrossedUnderZero(bar_index); + + // + // XTS ... + mConditions.isXTSAllSame = XTSIsAllSame(bar_index); + mConditions.isXTSCurrentMin = XTSIsCurrentMin(bar_index); + mConditions.isXTSCurrentMax = XTSIsCurrentMax(bar_index); + mConditions.isXTSCurrentOverFarest = XTSIsCurrentOverFarest(bar_index); + mConditions.isXTSCurrentOverNearest = XTSIsCurrentOverNearest(bar_index); + mConditions.isXTSCurrentOverMediest = XTSIsCurrentOverMediest(bar_index); + mConditions.isXTSCurrentUnderFarest = XTSIsCurrentUnderFarest(bar_index); + mConditions.isXTSCurrentUnderNearest = XTSIsCurrentUnderNearest(bar_index); + mConditions.isXTSCurrentUnderMediest = XTSIsCurrentUnderMediest(bar_index); + mConditions.isXTSCurrentCrossedOverFarest = XTSIsCurrentCrossedOverFarest(bar_index); + mConditions.isXTSCurrentCrossedOverNearest = XTSIsCurrentCrossedOverNearest(bar_index); + mConditions.isXTSCurrentCrossedOverMediest = XTSIsCurrentCrossedOverMediest(bar_index); + mConditions.isXTSCurrentCrossedUnderFarest = XTSIsCurrentCrossedUnderFarest(bar_index); + mConditions.isXTSCurrentCrossedUnderNearest = XTSIsCurrentCrossedUnderNearest(bar_index); + mConditions.isXTSCurrentCrossedUnderMediest = XTSIsCurrentCrossedUnderMediest(bar_index); + + // + // XRSI ... + mConditions.isXRSIPeak = XRSIIsPeak(bar_index); + mConditions.isXRSIVale = XRSIIsVale(bar_index); + mConditions.isXRSICrossedOverLongExit = XRSIIsCrossedOverLongExit(bar_index); + mConditions.isXRSICrossedOverLongEntry = XRSIIsCrossedOverLongEntry(bar_index); + mConditions.isXRSICrossedUnderShortExit = XRSIIsCrossedUnderShortExit(bar_index); + mConditions.isXRSICrossedUnderShortEntry = XRSIIsCrossedUnderShortEntry(bar_index); + + // + // XOBD ... + mConditions.isXOBDSwingLow = XOBDIsSwingLow(bar_index); + mConditions.isXOBDSwingHigh = XOBDIsSwingHigh(bar_index); + + // + // XCHLH ... + // + mConditions.isXCHLHSameHHs = XCHLHIsSameHHs(bar_index); + mConditions.isXCHLHSameLLs = XCHLHIsSameLLs(bar_index); + // + mConditions.isXCHLHSCMCHHSame = XCHLHIsMCSCHasSameHH(bar_index); + mConditions.isXCHLHSCMCLLSame = XCHLHIsMCSCHasSameLL(bar_index); + // + mConditions.isXCHLHSCLCHHSame = XCHLHIsLCSCHasSameHH(bar_index); + mConditions.isXCHLHSCLCLLSame = XCHLHIsLCSCHasSameLL(bar_index); + // + mConditions.isXCHLHMCLCHHSame = XCHLHIsLCMCHasSameHH(bar_index); + mConditions.isXCHLHMCLCLLSame = XCHLHIsLCMCHasSameLL(bar_index); + // + mConditions.isXCHLHMCOnTopOfLC = XCHLHIsMCOnTopOfLC(bar_index); + mConditions.isXCHLHMCInBottomOfLC = XCHLHIsMCInBottomOfLC(bar_index); + + // + // XCHMA ... + // + mConditions.isXCHMASCOverMax = XCHMAIsSCOverMax(bar_index); + mConditions.isXCHMASCOverMin = XCHMAIsSCOverMin(bar_index); + mConditions.isXCHMASCUnderMax = XCHMAIsSCUnderMax(bar_index); + mConditions.isXCHMASCUnderMin = XCHMAIsSCUnderMin(bar_index); + // + mConditions.isXCHMASCCrossedOverMax = XCHMAIsSCCrossedOverMax(bar_index); + mConditions.isXCHMASCCrossedUnderMax = XCHMAIsSCCrossedUnderMax(bar_index); + mConditions.isXCHMASCCrossedOverMin = XCHMAIsSCCrossedOverMin(bar_index); + mConditions.isXCHMASCCrossedUnderMin = XCHMAIsSCCrossedUnderMin(bar_index); + // + mConditions.isXCHMASCPeak = XCHMAIsSCPeak(bar_index); + mConditions.isXCHMASCVale = XCHMAIsSCVale(bar_index); + mConditions.isXCHMASCTrendsUp = XCHMAIsSCTrendsUp(bar_index); + mConditions.isXCHMASCTrendsDown = XCHMAIsSCTrendsDown(bar_index); + mConditions.isXCHMASCFastOverSlow = XCHMAIsSCFastOverSlow(bar_index); + mConditions.isXCHMASCFastUnderSlow = XCHMAIsSCFastUnderSlow(bar_index); + mConditions.isXCHMASCFastCrossedOverSlow = XCHMAIsSCFastCrossedOverSlow(bar_index); + mConditions.isXCHMASCFastCrossedUnderSlow = XCHMAIsSCFastCrossedUnderSlow(bar_index); + // + mConditions.isXCHMAMCPeak = XCHMAIsMCPeak(bar_index); + mConditions.isXCHMAMCVale = XCHMAIsMCVale(bar_index); + mConditions.isXCHMAMCTrendsUp = XCHMAIsMCTrendsUp(bar_index); + mConditions.isXCHMAMCTrendsDown = XCHMAIsMCTrendsDown(bar_index); + mConditions.isXCHMAMCFastOverSlow = XCHMAIsMCFastOverSlow(bar_index); + mConditions.isXCHMAMCFastUnderSlow = XCHMAIsMCFastUnderSlow(bar_index); + mConditions.isXCHMAMCFastCrossedOverSlow = XCHMAIsMCFastCrossedOverSlow(bar_index); + mConditions.isXCHMAMCFastCrossedUnderSlow = XCHMAIsMCFastCrossedUnderSlow(bar_index); + // + mConditions.isXCHMALCPeak = XCHMAIsLCPeak(bar_index); + mConditions.isXCHMALCVale = XCHMAIsLCVale(bar_index); + mConditions.isXCHMALCTrendsUp = XCHMAIsLCTrendsUp(bar_index); + mConditions.isXCHMALCTrendsDown = XCHMAIsLCTrendsDown(bar_index); + mConditions.isXCHMALCFastOverSlow = XCHMAIsLCFastOverSlow(bar_index); + mConditions.isXCHMALCFastUnderSlow = XCHMAIsLCFastUnderSlow(bar_index); + mConditions.isXCHMALCFastCrossedOverSlow = XCHMAIsLCFastCrossedOverSlow(bar_index); + mConditions.isXCHMALCFastCrossedUnderSlow = XCHMAIsLCFastCrossedUnderSlow(bar_index); + + // + return mConditions; +} + +// +// Check Market Conditions by Combination of Power of All tools for LONGs ... +bool XEU5HasLongSignal( + XProvidedSignal &info // Retrieve Signal Additional Info on this Object +) +{ + // + bool result = false; + + // + // XTD ... + bool isXTDHasSignal = XEU5XTDHasLongSignal(); + if (isXTDHasSignal) + { + // + Add( + EnumToString(XTD), + info.signallers); + } + + // + // XTAM ... + bool isXTAMHasSignal = XEU5XTAMHasLongSignal(); + if (isXTAMHasSignal) + { + // + Add( + EnumToString(XTAM), + info.signallers); + } + + // + // XSI ... + bool isXSIHasSignal = XEU5XSIHasLongSignal(); + if (isXSIHasSignal) + { + // + Add( + EnumToString(XSI), + info.signallers); + } + + // + // XSTFI ... + bool isXSTFIHasSignal = XEU5XSTFIHasLongSignal(); + if (isXSTFIHasSignal) + { + // + Add( + EnumToString(XSTFI), + info.signallers); + } + + // + // XOBD XLH ... + bool isXOBDLHHasSignal = XEU5XOBDLHHasLongSignal(); + if (isXOBDLHHasSignal) + { + // + Add( + EnumToString(XOBDLH), + info.signallers); + } + + // + // XCHMA Cycles Cross ... + bool isXCHMACCHasSignal = XEU5XCHMACCHasLongSignal(); + if (isXCHMACCHasSignal) + { + // + Add( + EnumToString(XCHMACC), + info.signallers); + } + + // + // XCHMA Cycles Min ... + bool isXCHMACMNHasSignal = XEU5XCHMACMNHasLongSignal(); + if (isXCHMACMNHasSignal) + { + // + Add( + EnumToString(XCHMACMN), + info.signallers); + } + + // + // XCHMA Cycles Max + bool isXCHMACMXHasSignal = XEU5XCHMACMXHasLongSignal(); + if (isXCHMACMXHasSignal) + { + // + Add( + EnumToString(XCHMACMX), + info.signallers); + } + + // + result = + // + isXTDHasSignal + // + || + // + isXTAMHasSignal + // + || + // + isXSIHasSignal + // + || + // + isXSTFIHasSignal + // + || + // + isXOBDLHHasSignal + // + || + // + isXCHMACCHasSignal + // + || + // + isXCHMACMNHasSignal + // + || + // + isXCHMACMXHasSignal + // + ; + + // + if (result) + { + // + // Only Log Signals Time Market Conditions if is in Testing Mode ... + if (xEU5IsTestMode) + { + // + string message = XEU5GetConditionsString(xEU5Conditions, "\n"); + + // + LogMessage( + "Long Signal Provided by: \n" + + info.signallers[ArraySize(info.signallers) - 1] + "\n" + + "Pusher: " + (string)ArraySize(info.signallers) + "\n" + + "Market Conditions: " + message); + } + } + + // + return result; +} + +// +// Check Market Conditions by Combination of Power of All tools for SHORTs ... +bool XEU5HasShortSignal( + XProvidedSignal &info // Retrieve Signal Additional Info on this Object +) +{ + // + bool result = false; + + // + // XTD ... + bool isXTDHasSignal = XEU5XTDHasShortSignal(); + if (isXTDHasSignal) + { + // + Add( + EnumToString(XTD), + info.signallers); + } + + // + // XTAM ... + bool isXTAMHasSignal = XEU5XTAMHasShortSignal(); + if (isXTAMHasSignal) + { + // + Add( + EnumToString(XTAM), + info.signallers); + } + + // + // XSI ... + bool isXSIHasSignal = XEU5XSIHasShortSignal(); + if (isXSIHasSignal) + { + // + Add( + EnumToString(XSI), + info.signallers); + } + + // + // XSTFI ... + bool isXSTFIHasSignal = XEU5XSTFIHasShortSignal(); + if (isXSTFIHasSignal) + { + // + Add( + EnumToString(XSTFI), + info.signallers); + } + + // + // XOBD XLH ... + bool isXOBDLHHasSignal = XEU5XOBDLHHasShortSignal(); + if (isXOBDLHHasSignal) + { + // + Add( + EnumToString(XOBDLH), + info.signallers); + } + + // + // XCHMA Cycles Cross ... + bool isXCHMACCHasSignal = XEU5XCHMACCHasShortSignal(); + if (isXCHMACCHasSignal) + { + // + Add( + EnumToString(XCHMACC), + info.signallers); + } + + // + // XCHMA Cycles Min ... + bool isXCHMACMNHasSignal = XEU5XCHMACMNHasShortSignal(); + if (isXCHMACMNHasSignal) + { + // + Add( + EnumToString(XCHMACMN), + info.signallers); + } + + // + // XCHMA Cycles Max + bool isXCHMACMXHasSignal = XEU5XCHMACMXHasShortSignal(); + if (isXCHMACMXHasSignal) + { + // + Add( + EnumToString(XCHMACMX), + info.signallers); + } + + // + result = + // + isXTDHasSignal + // + || + // + isXTAMHasSignal + // + || + // + isXSIHasSignal + // + || + // + isXSTFIHasSignal + // + || + // + isXOBDLHHasSignal + // + || + // + isXCHMACCHasSignal + // + || + // + isXCHMACMNHasSignal + // + || + // + isXCHMACMXHasSignal + // + ; + + // + if (result) + { + // + // Only Log Signals Time Market Conditions if is in Testing Mode ... + if (xEU5IsTestMode) + { + // + string message = XEU5GetConditionsString(xEU5Conditions, "\n"); + + // + LogMessage( + "Short Signal Provided by: \n" + + info.signallers[ArraySize(info.signallers) - 1] + "\n" + + "Pusher: " + (string)ArraySize(info.signallers) + "\n" + + "Market Conditions: " + message); + } + } + + // + return result; +} + +// +// +// END Combination Signaling ... +// +// + +// +// START Signal Providers ... +// + +// +// Disbale All Signallers Longs ... +void XEU5DisableLongSignallers() +{ + // + // XTD ... + if (xEU5MXTDEnableSignaller) + { + xEU5MXTDAllowLongSignals = false; + } + + // + // XTAM ... + if (xEU5MXTAMEnableSignaller) + { + xEU5MXTAMAllowLongSignals = false; + } + + // + // XSI ... + if (xEU5MXSIEnableSignaller) + { + xEU5MXSIAllowLongSignals = false; + } + + // + // XSTFI ... + if (xEU5MXSTFIEnableSignaller) + { + xEU5MXSTFIAllowLongSignals = false; + } + + // + // XOBDLH ... + if (xEU5MXOBDLHEnableSignaller) + { + xEU5MXOBDLHAllowLongSignals = false; + } + + // + // XCHMACC ... + if (xEU5MXCHMACCEnableSignaller) + { + xEU5MXCHMACCAllowLongSignals = false; + } + + // + // XCHMAMX ... + if (xEU5MXCHMACMXEnableSignaller) + { + xEU5MXCHMACMXAllowLongSignals = false; + } + + // + // XCHMAMN ... + if (xEU5MXCHMACMNEnableSignaller) + { + xEU5MXCHMACMNAllowLongSignals = false; + } +} + +// +// Enable All Signallers Longs ... +// Only if they are Configured as Enable at Settings ... +void XEU5EnableLongSignallers() +{ + // + // XTD ... + if (xEU5MXTDEnableSignaller) + { + xEU5MXTDAllowLongSignals = + xEU5XTDAllowLongSignals + ? true + : xEU5MXTDAllowLongSignals; + } + + // + // XTAM ... + if (xEU5MXTAMEnableSignaller) + { + xEU5MXTAMAllowLongSignals = + xEU5XTAMAllowLongSignals + ? true + : xEU5MXTAMAllowLongSignals; + } + + // + // XSI ... + if (xEU5MXSIEnableSignaller) + { + xEU5MXSIAllowLongSignals = + xEU5XSIAllowLongSignals + ? true + : xEU5MXSIAllowLongSignals; + } + + // + // XSTFI ... + if (xEU5MXSTFIEnableSignaller) + { + xEU5MXSTFIAllowLongSignals = + xEU5XSTFIAllowLongSignals + ? true + : xEU5MXSTFIAllowLongSignals; + } + + // + // XOBDLH ... + if (xEU5MXOBDLHEnableSignaller) + { + xEU5MXOBDLHAllowLongSignals = + xEU5XOBDLHAllowLongSignals + ? true + : xEU5MXOBDLHAllowLongSignals; + } + + // + // XCHMACC ... + if (xEU5MXCHMACCEnableSignaller) + { + xEU5MXCHMACCAllowLongSignals = + xEU5XCHMACCAllowLongSignals + ? true + : xEU5MXCHMACCAllowLongSignals; + } + + // + // XCHMAMX ... + if (xEU5MXCHMACMXEnableSignaller) + { + xEU5MXCHMACMXAllowLongSignals = + xEU5XCHMACMXAllowLongSignals + ? true + : xEU5MXCHMACMXAllowLongSignals; + } + + // + // XCHMAMN ... + if (xEU5MXCHMACMNEnableSignaller) + { + xEU5MXCHMACMNAllowLongSignals = + xEU5XCHMACMNAllowLongSignals + ? true + : xEU5MXCHMACMNAllowLongSignals; + } +} + +// +// Disable All Signallers Shorts ... +void XEUDisableShortSignallers() +{ + // + // XTD ... + if (xEU5MXTDEnableSignaller) + { + xEU5MXTDAllowShortSignals = false; + } + + // + // XTAM ... + if (xEU5MXTAMEnableSignaller) + { + xEU5MXTAMAllowShortSignals = false; + } + + // + // XSI ... + if (xEU5MXSIEnableSignaller) + { + xEU5MXSIAllowShortSignals = false; + } + + // + // XSTFI ... + if (xEU5MXSTFIEnableSignaller) + { + xEU5MXSTFIAllowShortSignals = false; + } + + // + // XOBDLH ... + if (xEU5MXOBDLHEnableSignaller) + { + xEU5MXOBDLHAllowShortSignals = false; + } + + // + // XCHMACC ... + if (xEU5MXCHMACCEnableSignaller) + { + xEU5MXCHMACCAllowShortSignals = false; + } + + // + // XCHMAMX ... + if (xEU5MXCHMACMXEnableSignaller) + { + xEU5MXCHMACMXAllowShortSignals = false; + } + + // + // XCHMAMN ... + if (xEU5MXCHMACMNEnableSignaller) + { + xEU5MXCHMACMNAllowShortSignals = false; + } +} + +// +// Enable All Signallers Shorts ... +// Only if they are Configured as Enable at Settings ... +void XEUEnableShortSignallers() +{ + // + // XTD ... + if (xEU5MXTDEnableSignaller) + { + xEU5MXTDAllowShortSignals = + xEU5XTDAllowShortSignals + ? true + : xEU5MXTDAllowShortSignals; + } + + // + // XTAM ... + if (xEU5MXTAMEnableSignaller) + { + xEU5MXTAMAllowShortSignals = + xEU5XTAMAllowShortSignals + ? true + : xEU5MXTAMAllowShortSignals; + } + + // + // XSI ... + if (xEU5MXSIEnableSignaller) + { + xEU5MXSIAllowShortSignals = + xEU5XSIAllowShortSignals + ? true + : xEU5MXSIAllowShortSignals; + } + + // + // XSTFI ... + if (xEU5MXSTFIEnableSignaller) + { + xEU5MXSTFIAllowShortSignals = + xEU5XSTFIAllowShortSignals + ? true + : xEU5MXSTFIAllowShortSignals; + } + + // + // XOBDLH ... + if (xEU5MXOBDLHEnableSignaller) + { + xEU5MXOBDLHAllowShortSignals = + xEU5XOBDLHAllowShortSignals + ? true + : xEU5MXOBDLHAllowShortSignals; + } + + // + // XCHMACC ... + if (xEU5MXCHMACCEnableSignaller) + { + xEU5MXCHMACCAllowShortSignals = + xEU5XCHMACCAllowShortSignals + ? true + : xEU5MXCHMACCAllowShortSignals; + } + + // + // XCHMAMX ... + if (xEU5MXCHMACMXEnableSignaller) + { + xEU5MXCHMACMXAllowShortSignals = + xEU5XCHMACMXAllowShortSignals + ? true + : xEU5MXCHMACMXAllowShortSignals; + } + + // + // XCHMAMN ... + if (xEU5MXCHMACMNEnableSignaller) + { + xEU5MXCHMACMNAllowShortSignals = + xEU5XCHMACMNAllowShortSignals + ? true + : xEU5MXCHMACMNAllowShortSignals; + } +} + +// +// XTD Long Signal Checking ... +bool XEU5XTDHasLongSignal() +{ + // + bool result = false; + + // + // Validate Args ... + if (!xEU5MXTDEnableSignaller || + !xEU5MXTDAllowLongSignals) + { + return result; + } + + // + result = + // + xEU5Conditions.isXTDSignalCrossedOverBear && + // + !xEU5Conditions.isXLHHighAttachedHH && + !xEU5Conditions.isXLHPriceInSignalRange && + // + !xEU5Conditions.isXCHMAMCPeak && + !xEU5Conditions.isXCHMALCPeak && + !xEU5Conditions.isXCHMAMCFastUnderSlow && + !xEU5Conditions.isXCHMALCFastUnderSlow && + !xEU5Conditions.isXCHMAMCFastCrossedUnderSlow && + !xEU5Conditions.isXCHMALCFastCrossedUnderSlow + // + && + // + !( + // + xEU5Conditions.isXCHMASCOverMax && + xEU5Conditions.isXCHMASCUnderMax + // + ) + // + && + // + !( + // + xEU5Conditions.isXCHLHSameHHs && + xEU5Conditions.isXLHPriceOverSignal + // + ) + // + && + // + !( + // + xEU5Conditions.isXLHHHIncreased && + xEU5Conditions.isXCHMAMCTrendsUp && + xEU5Conditions.isXLHHHSameInLength && + xEU5Conditions.isXLHLLSameInLength && + xEU5Conditions.isXLHPriceOverSignal && + xEU5Conditions.isXCHMAMCFastOverSlow + // + ) + // + && + // + !( + // + xEU5Conditions.isXTMBullish && + xEU5Conditions.isXCHLHSCMCHHSame && + xEU5Conditions.isXCHMASCTrendsUp && + xEU5Conditions.isXCHMAMCTrendsUp && + xEU5Conditions.isXCHMALCTrendsUp && + xEU5Conditions.isXLHLLSameInLength && + xEU5Conditions.isXLHPriceOverSignal && + xEU5Conditions.isXCHMASCFastOverSlow && + xEU5Conditions.isXCHMAMCFastOverSlow && + xEU5Conditions.isXCHMALCFastOverSlow + // + ) + // + && + // + !( + // + xEU5Conditions.isXCHMASCOverMin && + xEU5Conditions.isXTDBearishVale && + xEU5Conditions.isXTDBullOverBear && + xEU5Conditions.isXCHMASCUnderMax && + xEU5Conditions.isXLHHHSameInLength && + xEU5Conditions.isXLHLLSameInLength && + xEU5Conditions.isXCHMASCTrendsDown && + xEU5Conditions.isXCHMAMCTrendsDown && + xEU5Conditions.isXCHMALCTrendsDown && + xEU5Conditions.isXCHMAMCFastOverSlow && + xEU5Conditions.isXCHMALCFastOverSlow && + xEU5Conditions.isXTDSignalCrossedOverBear && + xEU5Conditions.isXCHMASCFastCrossedUnderSlow + // + ) + // + && + // + !( + // + xEU5Conditions.isXCHMASCTrendsUp && + xEU5Conditions.isXCHMAMCTrendsDown && + xEU5Conditions.isXCHMALCTrendsDown && + xEU5Conditions.isXCHMAMCFastOverSlow && + xEU5Conditions.isXCHMALCFastOverSlow && + xEU5Conditions.isXCHMASCFastOverSlow && + xEU5Conditions.isXTDSignalCrossedOverBear && + xEU5Conditions.isXLHPriceCrossedOverSignal + // + ) + // + ; + + // + // Funded Next ... + if (isXEU5OnFundedNext && result) + { + // + result = + // + true + // + ; + } + + // + return result; +} + +// +// XTD Short Signal Checking ... +bool XEU5XTDHasShortSignal() +{ + // + bool result = false; + + // + // Validate Args ... + if (!xEU5MXTDEnableSignaller || + !xEU5MXTDAllowShortSignals) + { + return result; + } + + // + result = + // + xEU5Conditions.isXTDSignalCrossedUnderBear + // + && + // + !xEU5Conditions.isXLHLowAttachedLL && + !xEU5Conditions.isXLHPriceInSignalRange && + // + !xEU5Conditions.isXCHMAMCVale && + !xEU5Conditions.isXCHMALCVale && + !xEU5Conditions.isXCHMAMCFastOverSlow && + !xEU5Conditions.isXCHMALCFastOverSlow && + !xEU5Conditions.isXCHMAMCFastCrossedOverSlow && + !xEU5Conditions.isXCHMALCFastCrossedOverSlow + // + && + // + !( + // + xEU5Conditions.isXCHMASCTrendsDown && + xEU5Conditions.isXCHMAMCTrendsDown && + xEU5Conditions.isXCHMALCTrendsDown && + xEU5Conditions.isXCHMASCFastUnderSlow && + xEU5Conditions.isXCHMAMCFastUnderSlow && + xEU5Conditions.isXCHMALCFastUnderSlow + // + ) + // + && + // + !( + // + xEU5Conditions.isXCHMAMCPeak && + xEU5Conditions.isXCHMALCPeak && + xEU5Conditions.isXCHMAMCTrendsDown && + xEU5Conditions.isXCHMALCTrendsDown && + xEU5Conditions.isXCHMALCFastUnderSlow && + xEU5Conditions.isXCHMAMCFastUnderSlow + // + ) + // + && + // + !( + // + xEU5Conditions.isXCHMAMCPeak && + xEU5Conditions.isXLHHHSameInLength && + xEU5Conditions.isXLHLLSameInLength && + xEU5Conditions.isXCHMAMCTrendsDown && + xEU5Conditions.isXCHMAMCFastUnderSlow + // + ) + // + && + !( + // + xEU5Conditions.isXCHMASCOverMin && + xEU5Conditions.isXCHMASCUnderMin + // + ) + // + && + !( + // + xEU5Conditions.isXCHMASCUnderMax && + xEU5Conditions.isXCHMASCUnderMin && + xEU5Conditions.isXLHHHSameInLength && + xEU5Conditions.isXLHLLSameInLength && + xEU5Conditions.isXCHMALCTrendsDown && + xEU5Conditions.isXLHPriceOverSignal && + xEU5Conditions.isXCHMALCFastUnderSlow + // + ) + // + && + // + !( + // + xEU5Conditions.isXLHHHSameInLength && + xEU5Conditions.isXLHLLSameInLength && + xEU5Conditions.isXTDSignalCrossedUnderBear + // + ) + // + && + // + !( + // + xEU5Conditions.isXTMBearish && + xEU5Conditions.isXLHHHDecreased && + xEU5Conditions.isXCHMAMCTrendsUp && + xEU5Conditions.isXCHMALCTrendsDown && + xEU5Conditions.isXLHLLSameInLength && + xEU5Conditions.isXLHPriceUnderSignal && + xEU5Conditions.isXCHMAMCFastUnderSlow && + xEU5Conditions.isXCHMALCFastUnderSlow + // + ) + // + && + // + !( + // + xEU5Conditions.isXCHMAMCPeak && + xEU5Conditions.isXCHMASCTrendsDown && + xEU5Conditions.isXCHMAMCTrendsDown && + xEU5Conditions.isXCHMALCTrendsDown && + xEU5Conditions.isXCHMASCFastOverSlow && + xEU5Conditions.isXCHMAMCFastUnderSlow && + xEU5Conditions.isXCHMALCFastUnderSlow + // + ) + // + && + // + !( + // + xEU5Conditions.isXLHHHIncreased && + xEU5Conditions.isXCHMASCOverMax && + xEU5Conditions.isXCHMASCOverMin && + xEU5Conditions.isXTDBullOverBear && + xEU5Conditions.isXCHLHSCMCHHSame && + xEU5Conditions.isXCHLHMCLCLLSame && + xEU5Conditions.isXLHLLSameInLength && + xEU5Conditions.isXCHMASCTrendsDown && + xEU5Conditions.isXCHMAMCTrendsDown && + xEU5Conditions.isXCHMALCTrendsDown && + xEU5Conditions.isXCHMAMCFastUnderSlow && + xEU5Conditions.isXCHMALCFastUnderSlow && + xEU5Conditions.isXTDSignalCrossedUnderBear && + xEU5Conditions.isXLHPriceCrossedUnderSignal && + xEU5Conditions.isXCHMASCFastCrossedUnderSlow + // + ) + // + ; + + // + // Funded Next ... + if (isXEU5OnFundedNext && result) + { + // + result = + // + true + // + ; + } + + // + return result; +} + +// +// XTAM Long Signal Checking ... +bool XEU5XTAMHasLongSignal() +{ + // + bool result = false; + + // + // Validate Args ... + if (!xEU5MXTAMEnableSignaller || + !xEU5MXTAMAllowLongSignals) + { + return result; + } + + // + result = + // + xAMAMaBuffer[1] > xTMMaBuffer[1] && + xAMAMaBuffer[2] > xTMMaBuffer[2] + // + && + // + xEU5Conditions.isXAMABullish + // + && + // + xEU5Conditions.isXTMBullish + // + && + // + xEU5Conditions.isXLHLLSameInLength + // + && + // + xEU5Conditions.isXFIOverZero + // + && + // + xEU5Conditions.isXTSCurrentMax + // + && + // + xEU5Conditions.isXTSCurrentOverFarest + // + && + // + xEU5Conditions.isXCHMASCUnderMax + // + && + // + !xEU5Conditions.isXOBDSwingLow + // + && + // + !xEU5Conditions.isXTDSignalCrossedUnderBear + // + && + // + !( + // + ( + // + ( + xEU5Conditions.isXCHMAMCTrendsDown && + xEU5Conditions.isXCHMAMCFastUnderSlow) + // + && + // + ( + xEU5Conditions.isXCHMALCTrendsDown && + xEU5Conditions.isXCHMALCFastUnderSlow) + + ) + // + || + // + ( + // + ( + xEU5Conditions.isXCHMASCTrendsDown && + xEU5Conditions.isXCHMASCFastUnderSlow) + // + && + // + ( + xEU5Conditions.isXCHMAMCTrendsDown && + xEU5Conditions.isXCHMAMCFastUnderSlow) + // + && + // + ( + xEU5Conditions.isXCHMALCTrendsDown && + xEU5Conditions.isXCHMALCFastUnderSlow) + // + ) + // + ) + // + && + // + ( + // + ( + xEU5Conditions.isXCHMASCFastOverSlow + ? !xEU5Conditions.isXCHMASCTrendsDown + : true) + // + || + // + ( + xEU5Conditions.isXCHMAMCFastOverSlow + ? !xEU5Conditions.isXCHMAMCTrendsDown + : true) + // + || + // + ( + xEU5Conditions.isXCHMALCFastOverSlow + ? !xEU5Conditions.isXCHMALCTrendsDown + : true) + // + ) + // + && + // + ( + // + (xEU5Conditions.isXLHHHSameInLength || + xEU5Conditions.isXLHLLSameInLength) + ? !( + xEU5Conditions.isXLHPriceInSignalRange || + xEU5Conditions.isXLHPriceUnderSignal) + : true + // + ) + // + && + // + ( + // + xEU5Conditions.isXTSCurrentMax || + xEU5Conditions.isXFICrossedOverZero || + (xEU5Conditions.isXTSCurrentOverNearest || + xEU5Conditions.isXTSCurrentCrossedOverNearest) || + (xEU5Conditions.isXTSCurrentOverMediest || + xEU5Conditions.isXTSCurrentCrossedOverMediest) + ? (!xEU5Conditions.isXLHPriceOverSignal && + !xEU5Conditions.isXLHPriceUnderSignal && + !xEU5Conditions.isXLHPriceInSignalRange && + !xEU5Conditions.isXLHPriceCrossedOverSignal && + !xEU5Conditions.isXLHPriceCrossedUnderSignal + ? !( + ( + xEU5Conditions.isXLHHHSameInLength && + xEU5Conditions.isXLHLLSameInLength) + // + || + // + ( + xEU5Conditions.isXLHHHDecreased && + xEU5Conditions.isXLHLLSameInLength) + // + ) + : true) && + (xEU5Conditions.isXLHPriceInSignalRange + ? !xEU5Conditions.isXLHHighAttachedHH + : true) && + (xEU5Conditions.isXLHPriceUnderSignal + ? !(xEU5Conditions.isXLHHHDecreased && + xEU5Conditions.isXLHLLSameInLength) + : true) && + ((xEU5Conditions.isXLHPriceOverSignal || + xEU5Conditions.isXLHPriceCrossedOverSignal) + ? !( + // + ( + ( + xEU5Conditions.isXLHLLDecreased || + xEU5Conditions.isXLHHHDecreased || + xEU5Conditions.isXLHHHSameInLength || + xEU5Conditions.isXLHHighAttachedHH) && + xEU5Conditions.isXLHLLSameInLength) + // + || + // + ( + xEU5Conditions.isXLHHHSameInLength && + xEU5Conditions.isXLHLLSameInLength) + // + || + // + ( + xEU5Conditions.isXCHLHSCMCHHSame && + xEU5Conditions.isXCHLHMCLCLLSame) + // + || + // + (xEU5Conditions.isXLHLLSameInLength && + xEU5Conditions.isXRSICrossedUnderShortEntry && + xEU5Conditions.isXCHLHSCMCHHSame && + xEU5Conditions.isXCHMASCOverMin && + xEU5Conditions.isXCHMASCUnderMax && + xEU5Conditions.isXCHMALCVale && + xEU5Conditions.isXCHMALCTrendsDown && + xEU5Conditions.isXCHMALCFastUnderSlow) + // + ) + : true) + : true + // + ) + // + && + // + ( + // + xEU5Conditions.isXLHLLSameInLength && + (xEU5Conditions.isXTSCurrentOverNearest || + xEU5Conditions.isXTSCurrentOverMediest) + ? !(xEU5Conditions.isXLHPriceOverSignal || + xEU5Conditions.isXLHPriceCrossedOverSignal) + : true + // + ) + // + && + // + // False Positives ... + // + !( + // + xEU5Conditions.isXCHMAMCPeak && + xEU5Conditions.isXCHMALCPeak && + xEU5Conditions.isXTSCurrentMax && + xEU5Conditions.isXCHMASCOverMin && + xEU5Conditions.isXTMStartBullish && + xEU5Conditions.isXTDBullOverBear && + xEU5Conditions.isXCHMASCUnderMax && + xEU5Conditions.isXCHMALCTrendsUp && + xEU5Conditions.isXAMAStartBullish && + xEU5Conditions.isXLHHHSameInLength && + xEU5Conditions.isXLHLLSameInLength && + xEU5Conditions.isXCHMAMCTrendsDown && + xEU5Conditions.isXTDSignalUnderBear && + xEU5Conditions.isXCHMAMCFastOverSlow && + xEU5Conditions.isXCHMALCFastOverSlow && + xEU5Conditions.isXCHMASCFastUnderSlow && + xEU5Conditions.isXCHMASCCrossedUnderMax + // + ) + // + && + // + !( + // + xEU5Conditions.isXCHMASCPeak && + xEU5Conditions.isXCHMALCVale && + xEU5Conditions.isXTSCurrentMax && + xEU5Conditions.isXTDBullOverBear && + xEU5Conditions.isXTDSignalOverBear && + xEU5Conditions.isXCHMASCFastOverSlow && + xEU5Conditions.isXCHMALCFastOverSlow && + xEU5Conditions.isXLHPriceOverSignal && + xEU5Conditions.isXLHLLSameInLength && + ( + // + xEU5Conditions.isXLHHHIncreased || + xEU5Conditions.isXLHHighAttachedHH + // + ) + // + ) + // + && + // + !( + // + xEU5Conditions.isXCHMASCPeak && + xEU5Conditions.isXCHMALCVale && + xEU5Conditions.isXCHMASCOverMin && + xEU5Conditions.isXCHLHMCLCLLSame && + xEU5Conditions.isXCHMASCUnderMax && + xEU5Conditions.isXCHMALCTrendsUp && + xEU5Conditions.isXLHLLSameInLength && + xEU5Conditions.isXCHMAMCTrendsDown && + xEU5Conditions.isXLHPriceOverSignal && + xEU5Conditions.isXCHMASCFastOverSlow && + xEU5Conditions.isXCHMAMCFastUnderSlow && + xEU5Conditions.isXCHMALCFastUnderSlow + // + ) + // + && + // + !( + // + xEU5Conditions.isXCHMALCVale && + xEU5Conditions.isXCHMASCOverMin && + xEU5Conditions.isXCHLHSCMCHHSame && + xEU5Conditions.isXCHMASCUnderMax && + xEU5Conditions.isXLHLLSameInLength && + xEU5Conditions.isXCHMASCTrendsDown && + xEU5Conditions.isXCHMAMCTrendsDown && + xEU5Conditions.isXCHMALCTrendsDown && + xEU5Conditions.isXLHPriceOverSignal && + xEU5Conditions.isXCHMAMCFastOverSlow && + xEU5Conditions.isXCHMALCFastUnderSlow && + xEU5Conditions.isXCHMASCFastCrossedOverSlow + // + ) + // + && + // + !( + // + xEU5Conditions.isXCHMAMCVale && + xEU5Conditions.isXCHMALCVale && + xEU5Conditions.isXCHMASCUnderMax && + xEU5Conditions.isXCHMASCUnderMin && + xEU5Conditions.isXCHMASCTrendsUp && + xEU5Conditions.isXCHMAMCTrendsUp && + xEU5Conditions.isXCHMALCTrendsUp && + xEU5Conditions.isXLHLLSameInLength && + xEU5Conditions.isXCHMASCFastOverSlow && + xEU5Conditions.isXCHMAMCFastUnderSlow && + xEU5Conditions.isXCHMALCFastUnderSlow && + xEU5Conditions.isXTSCurrentOverFarest && + xEU5Conditions.isXTSCurrentOverMediest + // + ) + // + && + // + !( + // + xEU5Conditions.isXCHMASCPeak && + xEU5Conditions.isXCHMAMCVale && + xEU5Conditions.isXCHMASCOverMin && + xEU5Conditions.isXCHLHMCLCLLSame && + xEU5Conditions.isXCHMASCUnderMax && + xEU5Conditions.isXLHLLSameInLength && + xEU5Conditions.isXCHMASCTrendsDown && + xEU5Conditions.isXCHMAMCTrendsDown && + xEU5Conditions.isXCHMALCTrendsDown && + xEU5Conditions.isXLHPriceOverSignal && + xEU5Conditions.isXCHMASCFastOverSlow && + xEU5Conditions.isXCHMALCFastOverSlow && + xEU5Conditions.isXCHMAMCFastUnderSlow + // + ) + // + && + // + !( + // + xEU5Conditions.isXCHMAMCPeak && + xEU5Conditions.isXCHMALCPeak && + xEU5Conditions.isXTDBearishVale && + xEU5Conditions.isXCHMASCOverMin && + xEU5Conditions.isXCHMASCOverMax && + xEU5Conditions.isXCHMASCUnderMax && + xEU5Conditions.isXCHMASCTrendsUp && + xEU5Conditions.isXCHMALCTrendsUp && + xEU5Conditions.isXLHLLSameInLength && + xEU5Conditions.isXCHMAMCTrendsDown && + xEU5Conditions.isXLHPriceOverSignal && + xEU5Conditions.isXCHMASCFastOverSlow && + xEU5Conditions.isXCHMAMCFastOverSlow && + xEU5Conditions.isXCHMALCFastOverSlow && + xEU5Conditions.isXLHPriceCrossedOverSignal + // + ) + // + && + // + !( + // + xEU5Conditions.isXCHMALCPeak && + xEU5Conditions.isXTSCurrentMax && + xEU5Conditions.isXCHMASCTrendsUp && + xEU5Conditions.isXCHMAMCTrendsUp && + xEU5Conditions.isXLHLLSameInLength && + xEU5Conditions.isXCHMALCTrendsDown && + xEU5Conditions.isXFICrossedOverZero && + xEU5Conditions.isXCHMASCFastOverSlow && + xEU5Conditions.isXCHMALCFastOverSlow && + xEU5Conditions.isXCHMAMCFastUnderSlow && + xEU5Conditions.isXTSCurrentOverNearest && + xEU5Conditions.isXTSCurrentOverMediest && + xEU5Conditions.isXTDSignalCrossedOverBear && + xEU5Conditions.isXTSCurrentCrossedOverNearest && + xEU5Conditions.isXTSCurrentCrossedOverMediest + // + ) + // + && + // + !( + // + xEU5Conditions.isXCHMALCVale && + xEU5Conditions.isXTSCurrentMax && + xEU5Conditions.isXLHLLIncreased && + xEU5Conditions.isXCHMASCOverMin && + xEU5Conditions.isXCHMASCUnderMax && + xEU5Conditions.isXCHMASCUnderMin && + xEU5Conditions.isXCHMASCTrendsUp && + xEU5Conditions.isXLHLLSameInLength && + xEU5Conditions.isXCHMAMCTrendsDown && + xEU5Conditions.isXCHMALCTrendsDown && + xEU5Conditions.isXTDSignalUnderBear && + xEU5Conditions.isXFICrossedOverZero && + xEU5Conditions.isXLHPriceOverSignal && + xEU5Conditions.isXCHMASCFastOverSlow && + xEU5Conditions.isXCHMALCFastUnderSlow && + xEU5Conditions.isXTDBullCrossedOverBear && + xEU5Conditions.isXLHPriceCrossedOverSignal && + xEU5Conditions.isXCHMAMCFastCrossedOverSlow + // + ) + // + && + // + !( + // + xEU5Conditions.isXCHMASCPeak && + xEU5Conditions.isXCHMALCPeak && + xEU5Conditions.isXCHMASCOverMin && + xEU5Conditions.isXCHLHMCLCLLSame && + xEU5Conditions.isXCHMASCUnderMax && + xEU5Conditions.isXLHLLSameInLength && + xEU5Conditions.isXCHMASCTrendsDown && + xEU5Conditions.isXCHMAMCTrendsDown && + xEU5Conditions.isXCHMALCTrendsDown && + xEU5Conditions.isXLHPriceOverSignal && + xEU5Conditions.isXCHMASCFastOverSlow && + xEU5Conditions.isXCHMALCFastOverSlow && + xEU5Conditions.isXCHMAMCFastUnderSlow && + xEU5Conditions.isXRSICrossedOverLongExit + // + ) + // + && + // + !( + // + xEU5Conditions.isXCHMASCPeak && + xEU5Conditions.isXCHMALCVale && + xEU5Conditions.isXCHMASCOverMin && + xEU5Conditions.isXCHLHSCMCHHSame && + xEU5Conditions.isXCHMASCUnderMax && + xEU5Conditions.isXCHMALCTrendsUp && + xEU5Conditions.isXCHMASCTrendsDown && + xEU5Conditions.isXCHMAMCTrendsDown && + xEU5Conditions.isXLHLLSameInLength && + xEU5Conditions.isXLHPriceOverSignal && + xEU5Conditions.isXCHMASCFastOverSlow && + xEU5Conditions.isXCHMAMCFastUnderSlow && + xEU5Conditions.isXCHMALCFastUnderSlow + // + ) + // + && + // + !( + // + xEU5Conditions.isXCHMASCPeak && + xEU5Conditions.isXCHMAMCPeak && + xEU5Conditions.isXLHLLIncreased && + xEU5Conditions.isXCHMASCOverMax && + xEU5Conditions.isXCHMASCOverMin && + xEU5Conditions.isXCHLHSCMCHHSame && + xEU5Conditions.isXCHMASCUnderMax && + xEU5Conditions.isXCHMASCTrendsUp && + xEU5Conditions.isXCHMAMCTrendsUp && + xEU5Conditions.isXLHLLSameInLength && + xEU5Conditions.isXCHMALCTrendsDown && + xEU5Conditions.isXLHPriceOverSignal && + xEU5Conditions.isXCHMASCFastOverSlow && + xEU5Conditions.isXCHMAMCFastOverSlow && + xEU5Conditions.isXCHMALCFastUnderSlow + // + ) + // + && + // + !( + // + xEU5Conditions.isXCHMAMCPeak && + xEU5Conditions.isXLHHHIncreased && + xEU5Conditions.isXCHMASCOverMin && + xEU5Conditions.isXCHLHSCMCHHSame && + xEU5Conditions.isXCHMASCUnderMax && + xEU5Conditions.isXCHMAMCTrendsUp && + xEU5Conditions.isXLHLLSameInLength && + xEU5Conditions.isXCHMASCTrendsDown && + xEU5Conditions.isXCHMALCTrendsDown && + xEU5Conditions.isXLHPriceOverSignal && + xEU5Conditions.isXCHMASCFastOverSlow && + xEU5Conditions.isXCHMAMCFastOverSlow && + xEU5Conditions.isXCHMALCFastUnderSlow + // + ) + // + && + // + !( + // + (xEU5Conditions.isXTDSignalVale && + xEU5Conditions.isXTDBullishVale && + xEU5Conditions.isXTDSignalUnderBear && + xEU5Conditions.isXTDBullCrossedUnderBear) + // + || + // + ((xEU5Conditions.isXCHMASCFastUnderSlow || + xEU5Conditions.isXCHMASCFastCrossedUnderSlow) && + (xEU5Conditions.isXCHMAMCFastUnderSlow || + xEU5Conditions.isXCHMAMCFastCrossedUnderSlow)) + // + || + // + (xEU5Conditions.isXCHLHMCLCLLSame && + xEU5Conditions.isXLHLLSameInLength) + // + || + // + ((xEU5Conditions.isXCHMAMCVale && + (xEU5Conditions.isXCHMAMCFastUnderSlow || + xEU5Conditions.isXCHMAMCFastCrossedUnderSlow)) && + (xEU5Conditions.isXCHMALCVale && + (xEU5Conditions.isXCHMALCFastUnderSlow || + xEU5Conditions.isXCHMALCFastCrossedUnderSlow)) + // + ) + // + || + // + (xEU5Conditions.isXCHMALCPeak && + xEU5Conditions.isXLHLLSameInLength && + xEU5Conditions.isXTDSignalUnderBear) + // + || + // + (xEU5Conditions.isXCHMASCOverMax && + xEU5Conditions.isXCHMASCUnderMax) + // + ) + // + && + // + // Funded ... + !( + // + (xEU5Conditions.isXCHMALCPeak && + (xEU5Conditions.isXCHMALCFastOverSlow || + xEU5Conditions.isXCHMALCFastCrossedOverSlow)) + // + || + // + (xEU5Conditions.isXCHMAMCVale && + xEU5Conditions.isXLHPriceOverSignal && + (xEU5Conditions.isXCHMAMCFastUnderSlow || + xEU5Conditions.isXCHMAMCFastCrossedUnderSlow)) + // + ) + // + ; + + // + // Funded Next ... + if (isXEU5OnFundedNext && result) + { + // + result = + // + true + // + ; + } + + // + return result; +} + +// +// XTAM Short Signal Checking ... +bool XEU5XTAMHasShortSignal() +{ + // + bool result = false; + + // + // Validate Args ... + if (!xEU5MXTAMEnableSignaller || + !xEU5MXTAMAllowShortSignals) + { + return result; + } + + // + result = + // + xAMAMaBuffer[1] < xTMMaBuffer[1] && + xAMAMaBuffer[2] < xTMMaBuffer[2] + // + && + // + xEU5Conditions.isXAMABearish + // + && + // + xEU5Conditions.isXTMBearish + // + && + // + xEU5Conditions.isXFIUnderZero + // + && + // + xEU5Conditions.isXTSCurrentMin + // + && + // + xEU5Conditions.isXTSCurrentUnderFarest + // + && + // + !xEU5Conditions.isXOBDSwingHigh + // + && + // + !( + // + xEU5Conditions.isXCHMASCVale && + xEU5Conditions.isXCHMAMCVale && + xEU5Conditions.isXCHMALCVale + // + ) + // + && + // + ( + // + ((xEU5Conditions.isXTSCurrentUnderNearest || + xEU5Conditions.isXTSCurrentCrossedUnderNearest) || + (xEU5Conditions.isXTSCurrentUnderMediest || + xEU5Conditions.isXTSCurrentCrossedUnderMediest)) + ? ( + // + ( + // + (xEU5Conditions.isXLHPriceUnderSignal || + xEU5Conditions.isXLHPriceInSignalRange || + xEU5Conditions.isXLHPriceCrossedUnderSignal) + ? !( + (xEU5Conditions.isXLHLowAttachedLL && + xEU5Conditions.isXLHHHSameInLength && + xEU5Conditions.isXCHLHSCMCLLSame) + // + || + // + (xEU5Conditions.isXLHLLDecreased && + (xEU5Conditions.isXCHLHSCMCLLSame || + xEU5Conditions.isXCHLHMCLCHHSame)) + // + || + // + (xEU5Conditions.isXCHLHSameHHs && + xEU5Conditions.isXLHHHIncreased) + // + || + // + (xEU5Conditions.isXCHMALCVale && + xEU5Conditions.isXCHLHSCMCHHSame) + // + || + // + (xEU5Conditions.isXCHMAMCVale && + xEU5Conditions.isXCHMALCVale) + // + || + // + (xEU5Conditions.isXCHLHSameLLs || + xEU5Conditions.isXLHLowAttachedLL || + xEU5Conditions.isXLHHHSameInLength) + // + || + // + (xEU5Conditions.isXLHLLSameInLength && + // + ( + // + xEU5Conditions.isXLHHHSameInLength + // + || + // + (xEU5Conditions.isXCHMASCTrendsDown && + xEU5Conditions.isXCHMALCTrendsDown && + xEU5Conditions.isXCHMASCFastUnderSlow && + xEU5Conditions.isXCHMALCFastUnderSlow) + // + || + // + (xEU5Conditions.isXCHMASCOverMax && + xEU5Conditions.isXCHMASCUnderMax) + // + || + // + (xEU5Conditions.isXCHMAMCVale && + xEU5Conditions.isXCHMALCPeak) + // + || + // + (xEU5Conditions.isXCHMAMCPeak && + xEU5Conditions.isXCHMALCPeak) + // + || + // + (xEU5Conditions.isXCHMAMCVale && + (xEU5Conditions.isXLHHHDecreased || + xEU5Conditions.isXCHMALCPeak)) + // + || + // + (xEU5Conditions.isXLHLLIncreased && + xEU5Conditions.isXCHMALCPeak) + // + || + // + (xEU5Conditions.isXCHMAMCFastOverSlow && + xEU5Conditions.isXCHMALCFastOverSlow && + (xEU5Conditions.isXCHMALCPeak || + xEU5Conditions.isXCHMASCFastOverSlow)) + // + || + // + (xEU5Conditions.isXCHLHSCMCHHSame && + xEU5Conditions.isXTDBullCrossedUnderBear) + // + || + // + (xEU5Conditions.isXCHMAMCTrendsUp && + xEU5Conditions.isXCHMALCTrendsUp && + xEU5Conditions.isXCHMAMCFastOverSlow && + xEU5Conditions.isXCHMALCFastOverSlow) + // + || + // + (xEU5Conditions.isXCHLHMCLCLLSame && + xEU5Conditions.isXCHMALCVale && + xEU5Conditions.isXCHMALCTrendsDown && + xEU5Conditions.isXCHMALCFastUnderSlow) + // + ) + // + ) + // + ) + : (xEU5Conditions.isXLHPriceOverSignal || + xEU5Conditions.isXLHPriceCrossedOverSignal) + ? ( + !( + xEU5Conditions.isXCHLHSameHHs + // + || + // + (xEU5Conditions.isXCHMAMCVale && + xEU5Conditions.isXCHMALCVale && + xEU5Conditions.isXCHLHSCMCHHSame) + // + || + // + (xEU5Conditions.isXLHHHIncreased && + xEU5Conditions.isXLHLLIncreased) + // + || + // + (xEU5Conditions.isXLHLLSameInLength && + (xEU5Conditions.isXLHHHSameInLength + // + || + // + (xEU5Conditions.isXCHMAMCVale && + xEU5Conditions.isXCHMALCVale) + // + || + // + (xEU5Conditions.isXCHMALCPeak && + xEU5Conditions.isXCHMALCFastOverSlow) + // + ) + // + ) + // + || + // + (xEU5Conditions.isXLHHHSameInLength && + ( + // + (xEU5Conditions.isXCHMAMCVale && + xEU5Conditions.isXCHMALCVale) + // + || + // + (xEU5Conditions.isXCHMASCVale && + xEU5Conditions.isXCHMAMCPeak && + xEU5Conditions.isXCHMALCVale) + // + || + // + (xEU5Conditions.isXCHMAMCPeak && + xEU5Conditions.isXCHMALCVale) + // + || + // + (xEU5Conditions.isXCHMAMCFastOverSlow || + xEU5Conditions.isXCHMAMCFastCrossedOverSlow) + // + || + // + (xEU5Conditions.isXCHMALCVale && + xEU5Conditions.isXCHMAMCTrendsUp && + xEU5Conditions.isXCHMALCTrendsDown && + xEU5Conditions.isXCHMAMCFastOverSlow && + xEU5Conditions.isXCHMALCFastUnderSlow) + // + ) + // + ) + // + || + // + ( + xEU5Conditions.isXLHLLSameInLength && + ( + // + (xEU5Conditions.isXCHMASCTrendsDown && + xEU5Conditions.isXCHMAMCTrendsDown && + xEU5Conditions.isXCHMALCTrendsDown && + xEU5Conditions.isXCHMASCFastUnderSlow && + xEU5Conditions.isXCHMAMCFastUnderSlow && + xEU5Conditions.isXCHMALCFastUnderSlow) + // + )) + // + ) + // + ) + : ( + !xEU5Conditions.isXLHPriceOverSignal && + !xEU5Conditions.isXLHPriceUnderSignal && + !xEU5Conditions.isXLHPriceInSignalRange && + !xEU5Conditions.isXLHPriceCrossedOverSignal && + !xEU5Conditions.isXLHPriceCrossedUnderSignal) + ? !( + // + (xEU5Conditions.isXLHHHSameInLength && + xEU5Conditions.isXLHLLSameInLength) + // + || + // + (xEU5Conditions.isXCHMAMCTrendsUp && + xEU5Conditions.isXCHMALCTrendsUp && + xEU5Conditions.isXCHMAMCFastOverSlow && + xEU5Conditions.isXCHMALCFastOverSlow) + // + ) + : true) + // + ) + : true + // + ) + // + && + // + ( + // + ( + (xEU5Conditions.isXTDBullOverBear || + (xEU5Conditions.isXTDBullUnderBear || + xEU5Conditions.isXTDBullCrossedUnderBear)) && + (xEU5Conditions.isXTDSignalUnderBear || + xEU5Conditions.isXTDSignalCrossedUnderBear)) + ? !( + (xEU5Conditions.isXTMVale && + xEU5Conditions.isXAMAVale) + // + || + // + (xEU5Conditions.isXCHMAMCVale && + xEU5Conditions.isXCHMALCVale && + xEU5Conditions.isXLHLLSameInLength) + // + || + // + (xEU5Conditions.isXTDSignalVale && + xEU5Conditions.isXTDBullishVale && + xEU5Conditions.isXLHLLIncreased && + xEU5Conditions.isXLHHHSameInLength) + // + || + // + (xEU5Conditions.isXLHLLIncreased && + xEU5Conditions.isXLHHHSameInLength && + xEU5Conditions.isXLHPriceCrossedUnderSignal) + // + ) + : true + // + ) + // + && + // + ( + // + (xEU5Conditions.isXLHPriceUnderSignal || + xEU5Conditions.isXLHPriceCrossedUnderSignal) + ? !( + // + (xEU5Conditions.isXLHLLSameInLength && + xEU5Conditions.isXCHMALCPeak && + xEU5Conditions.isXCHMALCTrendsUp && + xEU5Conditions.isXCHMALCFastOverSlow) + // + || + // + (xEU5Conditions.isXLHLowAttachedLL && + xEU5Conditions.isXCHLHSameHHs) + // + || + // + ( + xEU5Conditions.isXLHHHSameInLength && + ( + // + (xEU5Conditions.isXLHLLSameInLength && + // + ( + (xEU5Conditions.isXCHMAMCFastOverSlow && + xEU5Conditions.isXCHMALCFastOverSlow) + // + || + // + (xEU5Conditions.isXCHLHSCMCHHSame && + xEU5Conditions.isXCHMAMCFastOverSlow) + // + || + // + (xEU5Conditions.isXCHLHSCMCLLSame && + xEU5Conditions.isXCHLHMCLCHHSame) + // + || + // + (xEU5Conditions.isXCHMALCVale && + xEU5Conditions.isXCHMALCTrendsDown && + xEU5Conditions.isXCHMALCFastUnderSlow) + // + ) + // + ) + // + || + // + (xEU5Conditions.isXCHMAMCPeak && + xEU5Conditions.isXCHMAMCFastOverSlow) + // + || + // + (xEU5Conditions.isXCHLHSCMCLLSame && + xEU5Conditions.isXLHLowAttachedLL) + // + || + // + (xEU5Conditions.isXCHMALCVale && + ( + // + xEU5Conditions.isXCHMAMCVale + // + || + // + xEU5Conditions.isXCHMASCFastOverSlow + // + ) + // + ) + // + || + // + xEU5Conditions.isXCHLHSameLLs + // + || + // + (xEU5Conditions.isXAMAVale && + xEU5Conditions.isXCHMALCPeak && + xEU5Conditions.isXCHLHSCMCLLSame && + xEU5Conditions.isXCHLHMCLCHHSame) + // + ) + // + ) + // + || + // + (xEU5Conditions.isXLHLLIncreased && + xEU5Conditions.isXCHMASCFastOverSlow && + xEU5Conditions.isXCHMAMCFastOverSlow && + xEU5Conditions.isXRSICrossedOverLongExit && + xEU5Conditions.isXLHPriceCrossedUnderSignal) + // + ) + : xEU5Conditions.isXLHPriceInSignalRange + ? ( + // + ( + xEU5Conditions.isXLHHHSameInLength + ? !( + // + xEU5Conditions.isXCHLHSameLLs + // + || + // + (xEU5Conditions.isXCHMASCVale && + xEU5Conditions.isXCHMALCVale) + // + || + // + (xEU5Conditions.isXCHMAMCVale && + xEU5Conditions.isXCHMALCVale) + // + || + // + (xEU5Conditions.isXTDSignalVale || + xEU5Conditions.isXLHLLSameInLength) + // + || + // + (xEU5Conditions.isXCHMALCVale && + xEU5Conditions.isXCHMAMCTrendsUp && + xEU5Conditions.isXCHMAMCFastOverSlow) + // + || + // + // Funded ... + ( + // + (xEU5Conditions.isXTMVale && + xEU5Conditions.isXCHMASCVale && + xEU5Conditions.isXCHMALCPeak) + // + || + // + ((xEU5Conditions.isXCHMAMCFastOverSlow || + xEU5Conditions.isXCHMAMCFastCrossedOverSlow) && + (xEU5Conditions.isXCHMALCFastOverSlow || + xEU5Conditions.isXCHMALCFastCrossedOverSlow)) + // + ) + // + ) + : true + // + ) + // + ) + : (xEU5Conditions.isXLHPriceOverSignal || + xEU5Conditions.isXLHPriceCrossedOverSignal) + ? !( + (xEU5Conditions.isXCHMAMCPeak && + xEU5Conditions.isXCHMALCPeak) + // + || + // + (xEU5Conditions.isXLHHHSameInLength && + ( + // + xEU5Conditions.isXLHLLSameInLength + // + || + // + (xEU5Conditions.isXCHMAMCPeak && + xEU5Conditions.isXCHMALCVale && + xEU5Conditions.isXCHMAMCTrendsUp && + xEU5Conditions.isXCHMAMCFastOverSlow) + // + ) + // + ) + // + ) + : true + // + ) + // + && + // + !( + // + xEU5Conditions.isXCHMAMCPeak && + xEU5Conditions.isXCHMALCPeak && + xEU5Conditions.isXLHHHIncreased && + xEU5Conditions.isXLHHHSameInLength && + xEU5Conditions.isXLHPriceInSignalRange && + xEU5Conditions.isXTSCurrentCrossedUnderFarest + // + ) + // + && + // + // False Positives ... + !( + ((xEU5Conditions.isXTSCurrentUnderNearest || + xEU5Conditions.isXTSCurrentCrossedUnderNearest) + // + || + // + (xEU5Conditions.isXTSCurrentUnderMediest || + xEU5Conditions.isXTSCurrentCrossedUnderMediest) + // + ) + // + ? (xEU5Conditions.isXLHPriceInSignalRange + ? ( + // + (xEU5Conditions.isXCHMASCOverMax && + xEU5Conditions.isXCHMASCUnderMax) + // + || + // + (xEU5Conditions.isXCHMASCFastOverSlow && + xEU5Conditions.isXCHMAMCFastOverSlow && + xEU5Conditions.isXCHMALCFastOverSlow) + // + || + // + (xEU5Conditions.isXLHLLSameInLength && + ( + // + xEU5Conditions.isXFICrossedUnderZero + // + || + // + (xEU5Conditions.isXCHLHSCMCHHSame && + xEU5Conditions.isXCHMAMCFastOverSlow) + // + || + // + (xEU5Conditions.isXCHMALCPeak && + xEU5Conditions.isXCHMALCFastOverSlow) + // + || + // + (xEU5Conditions.isXLHHHDecreased || + // + ( + // + xEU5Conditions.isXCHMAMCFastOverSlow || + // + (xEU5Conditions.isXCHMAMCFastOverSlow || + xEU5Conditions.isXCHMAMCFastCrossedOverSlow) + // + || + // + (xEU5Conditions.isXCHMALCFastOverSlow || + xEU5Conditions.isXCHMALCFastCrossedOverSlow) + // + ) + // + || + // + (xEU5Conditions.isXTMBearish && + xEU5Conditions.isXAMABearish && + xEU5Conditions.isXTDBullOverBear && + xEU5Conditions.isXTDSignalCrossedUnderBear) + // + ) + // + || + // + (xEU5Conditions.isXCHMAMCFastOverSlow && + xEU5Conditions.isXTSCurrentCrossedUnderFarest && + xEU5Conditions.isXTSCurrentCrossedUnderNearest) + // + ) + // + ) + // + ) + // + : (xEU5Conditions.isXLHPriceOverSignal || + xEU5Conditions.isXLHPriceCrossedOverSignal) + ? ( + // + (xEU5Conditions.isXLHHHSameInLength && + // + ( + // + xEU5Conditions.isXTMVale + // + || + // + xEU5Conditions.isXTDSignalCrossedUnderBear + // + || + // + (xEU5Conditions.isXCHLHMCLCHHSame && + (xEU5Conditions.isXCHMAMCPeak || + xEU5Conditions.isXCHMAMCFastOverSlow)) + // + || + // + (xEU5Conditions.isXCHMASCOverMin && + xEU5Conditions.isXCHMASCUnderMin) + // + || + // + (xEU5Conditions.isXCHMAMCPeak && + xEU5Conditions.isXCHMAMCTrendsUp && + xEU5Conditions.isXCHMAMCFastOverSlow) + // + || + // + (xEU5Conditions.isXTDSignalVale && + xEU5Conditions.isXTDBullishVale) + // + || + // + (xEU5Conditions.isXCHMASCVale && + (xEU5Conditions.isXCHMALCVale || + xEU5Conditions.isXCHMASCFastOverSlow)) + // + || + // + (xEU5Conditions.isXCHMASCVale && + xEU5Conditions.isXCHMALCPeak) + // + || + // + (xEU5Conditions.isXCHMAMCFastOverSlow && + xEU5Conditions.isXCHMALCFastOverSlow) + // + || + // + (xEU5Conditions.isXCHMAMCVale && + xEU5Conditions.isXCHMALCPeak && + xEU5Conditions.isXLHLLIncreased) + // + || + // + (xEU5Conditions.isXCHMALCVale && + xEU5Conditions.isXLHHHIncreased && + xEU5Conditions.isXCHMALCTrendsUp && + xEU5Conditions.isXCHMALCFastUnderSlow) + // + || + // + (!xEU5Conditions.isXCHMALCTrendsUp && + xEU5Conditions.isXCHMAMCTrendsDown && + !xEU5Conditions.isXCHMALCTrendsDown && + xEU5Conditions.isXCHMASCFastUnderSlow && + xEU5Conditions.isXCHMAMCFastUnderSlow && + xEU5Conditions.isXCHMALCFastUnderSlow && + xEU5Conditions.isXCHMASCCrossedUnderMax) + // + ) + // + ) + // + || + // + (xEU5Conditions.isXLHLLSameInLength && + ( + // + (xEU5Conditions.isXCHMALCVale && + xEU5Conditions.isXLHHHDecreased) + // + || + // + (xEU5Conditions.isXTDSignalVale && + xEU5Conditions.isXTDBullishVale) + // + || + // + (xEU5Conditions.isXCHMALCVale && + xEU5Conditions.isXCHMAMCFastOverSlow) + // + ) + // + ) + // + || + // + (xEU5Conditions.isXCHMASCOverMax && + xEU5Conditions.isXCHMASCUnderMax) + // + || + // + (xEU5Conditions.isXCHMASCOverMin && + xEU5Conditions.isXCHMASCUnderMin) + // + || + // + (xEU5Conditions.isXCHMAMCVale && + xEU5Conditions.isXCHMALCVale) + // + ) + // + : (xEU5Conditions.isXLHPriceUnderSignal || + xEU5Conditions.isXLHPriceCrossedUnderSignal) + ? ( + // + (xEU5Conditions.isXLHLLSameInLength && + ( + // + xEU5Conditions.isXCHLHSCMCHHSame + // + || + // + xEU5Conditions.isXCHMAMCFastOverSlow + // + || + // + xEU5Conditions.isXRSICrossedUnderShortExit + // + || + // + (xEU5Conditions.isXTDSignalVale && + xEU5Conditions.isXTDBullishVale) + // + || + // + (xEU5Conditions.isXCHLHMCLCLLSame && + xEU5Conditions.isXCHMALCFastOverSlow) + // + || + // + ((xEU5Conditions.isXCHMALCPeak || + xEU5Conditions.isXCHMAMCVale) && + xEU5Conditions.isXCHMALCFastOverSlow) + // + ) + // + ) + // + || + // + (xEU5Conditions.isXCHMASCOverMin && + xEU5Conditions.isXCHMASCUnderMin) + // + || + // + (xEU5Conditions.isXCHLHSCMCHHSame && + xEU5Conditions.isXCHLHSCMCLLSame) + // + ) + // + // XLH Price False ... + : + // + // Funed ... + ( + // + (xEU5Conditions.isXCHMAMCPeak && + xEU5Conditions.isXCHMALCPeak) + // + || + // + ( + xEU5Conditions.isXCHLHMCLCHHSame && + xEU5Conditions.isXLHHHSameInLength) + // + || + // + ( + (xEU5Conditions.isXCHMASCFastOverSlow || + xEU5Conditions.isXCHMASCFastCrossedOverSlow) && + (xEU5Conditions.isXCHMAMCFastOverSlow || + xEU5Conditions.isXCHMAMCFastCrossedOverSlow)) + // + ) + // + ) + // + // Just Current XTS Min and Farest ... + : (xEU5Conditions.isXLHPriceInSignalRange + ? ( + // + (xEU5Conditions.isXLHHHSameInLength && + ( + // + xEU5Conditions.isXCHMASCFastOverSlow + // + || + // + (xEU5Conditions.isXCHMASCFastOverSlow && + xEU5Conditions.isXCHMAMCFastOverSlow) + // + || + // + (xEU5Conditions.isXLHHHIncreased && + xEU5Conditions.isXCHLHMCLCHHSame) + // + || + // + (xEU5Conditions.isXCHMAMCPeak && + xEU5Conditions.isXCHMALCPeak) + // + || + // + (xEU5Conditions.isXCHMASCTrendsDown && + xEU5Conditions.isXCHMAMCTrendsDown && + xEU5Conditions.isXCHMASCFastUnderSlow && + xEU5Conditions.isXCHMAMCFastUnderSlow) + // + ) + // + ) + // + || + // + (xEU5Conditions.isXLHLLSameInLength && + ( + // + (xEU5Conditions.isXCHMASCOverMin && + xEU5Conditions.isXCHMASCUnderMin) + // + || + // + (xEU5Conditions.isXCHMALCVale && + xEU5Conditions.isXLHHHDecreased && + xEU5Conditions.isXTDBullOverBear && + xEU5Conditions.isXTDSignalCrossedUnderBear && + (xEU5Conditions.isXCHMAMCFastOverSlow || + xEU5Conditions.isXCHMAMCFastCrossedOverSlow)) + // + ) + // + ) + // + ) + // + : (xEU5Conditions.isXLHPriceOverSignal || + xEU5Conditions.isXLHPriceCrossedOverSignal) + ? ( + // + ( + xEU5Conditions.isXLHLLSameInLength && + ( + // + xEU5Conditions.isXCHLHMCLCLLSame + // + || + // + xEU5Conditions.isXFICrossedUnderZero + // + || + // + (xEU5Conditions.isXCHMASCOverMax && + xEU5Conditions.isXCHMASCUnderMax) + // + || + // + (xEU5Conditions.isXCHMAMCPeak && + xEU5Conditions.isXCHMAMCFastOverSlow) + // + || + // + (xEU5Conditions.isXCHMALCVale && + xEU5Conditions.isXCHMAMCFastOverSlow) + // + )) + // + ) + // + : ( + xEU5Conditions.isXLHPriceUnderSignal || + xEU5Conditions.isXLHPriceCrossedUnderSignal) + ? ( + // + ( + // + (xEU5Conditions.isXLHHHSameInLength && + ( + // + (xEU5Conditions.isXCHLHSCMCHHSame && + xEU5Conditions.isXCHLHSCMCLLSame) + // + || + // + (xEU5Conditions.isXCHMASCOverMin && + xEU5Conditions.isXCHMASCUnderMin) + // + || + // + (xEU5Conditions.isXCHLHMCLCHHSame && + xEU5Conditions.isXFICrossedUnderZero) + // + || + // + (xEU5Conditions.isXCHMALCVale && + xEU5Conditions.isXCHMAMCFastOverSlow) + // + || + // + (xEU5Conditions.isXCHMALCVale && + xEU5Conditions.isXCHMALCTrendsDown && + xEU5Conditions.isXCHMALCFastUnderSlow) + // + ) + // + ) + // + || + // + (xEU5Conditions.isXLHLLSameInLength && + ( + // + (xEU5Conditions.isXCHLHMCLCLLSame && + xEU5Conditions.isXCHLHMCOnTopOfLC) + // + || + // + ((xEU5Conditions.isXCHMALCPeak || + xEU5Conditions.isXCHMAMCVale) && + xEU5Conditions.isXCHMALCFastOverSlow) + // + || + // + (xEU5Conditions.isXCHMAMCPeak && + xEU5Conditions.isXTDBullOverBear) + // + || + // + ((xEU5Conditions.isXCHMASCFastOverSlow || + xEU5Conditions.isXCHMASCFastCrossedOverSlow) && + (xEU5Conditions.isXCHMAMCFastOverSlow || + xEU5Conditions.isXCHMAMCFastCrossedOverSlow)) + // + || + // + (xEU5Conditions.isXCHMASCOverMax && + xEU5Conditions.isXCHMASCUnderMax) + // + ) + // + ) + // + || + // + ( + (xEU5Conditions.isXLHHHSameInLength && + xEU5Conditions.isXLHLLSameInLength) && + ( + // + xEU5Conditions.isXLHHHDecreased + // + || + // + (xEU5Conditions.isXCHMAMCVale && + xEU5Conditions.isXCHMALCFastOverSlow) + // + || + // + (xEU5Conditions.isXCHMASCOverMax && + xEU5Conditions.isXCHMASCUnderMax) + // + ) + // + ) + // + || + // + (xEU5Conditions.isXLHHHDecreased && + xEU5Conditions.isXCHLHSCMCLLSame && + xEU5Conditions.isXCHMALCFastOverSlow) + // + || + // + (xEU5Conditions.isXTDSignalVale && + xEU5Conditions.isXTDBullishVale) + // + || + // + (xEU5Conditions.isXCHLHSameLLs && + xEU5Conditions.isXLHLowAttachedLL) + // + || + // + (xEU5Conditions.isXCHMAMCVale && + xEU5Conditions.isXCHMALCVale) + // + ) + // + ) + // + // XLH Price Falses ... + : ( + // + (xEU5Conditions.isXLHLLIncreased && + xEU5Conditions.isXCHLHSCMCHHSame) + // + || + // + (xEU5Conditions.isXCHMASCFastOverSlow && + xEU5Conditions.isXCHMAMCFastOverSlow) + // + || + // + ((xEU5Conditions.isXTMBearish || + xEU5Conditions.isXTMStartBearish) && + (xEU5Conditions.isXAMABearish || + xEU5Conditions.isXAMAStartBearish) && + (xEU5Conditions.isXCHMAMCVale && + xEU5Conditions.isXCHMALCVale) && + xEU5Conditions.isXLHLLIncreased && + (xEU5Conditions.isXCHMASCFastOverSlow || + xEU5Conditions.isXCHMASCFastCrossedOverSlow)) + // + ) + // + ) + // + ) + // + ; + + // + // Funded Next ... + if (isXEU5OnFundedNext && result) + { + // + result = + // + true + // + ; + } + + // + return result; +} + +// +// XSI Long Signal Checking ... +bool XEU5XSIHasLongSignal() +{ + // + bool result = false; + + // + // Validate Args ... + if (!xEU5MXSIEnableSignaller || + !xEU5MXSIAllowLongSignals) + { + return result; + } + + // + result = + // + xEU5Conditions.isXRSICrossedOverLongEntry && + xRSIBuffer[3] < xRSILongEntryValue + // + && + // + !( + // + xEU5Conditions.isXTMVale && + xEU5Conditions.isXCHMASCFastUnderSlow + // + ) + // + && + // + !( + // + xEU5Conditions.isXCHMASCOverMin && + xEU5Conditions.isXCHMASCUnderMin + // + ) + // + && + // + ( + // + xEU5Conditions.isXCHMASCUnderMin + ? !( + // + xEU5Conditions.isXCHMASCTrendsUp && + xEU5Conditions.isXCHMASCFastUnderSlow + // + ) && + !( + // + xEU5Conditions.isXTMVale && + xEU5Conditions.isXCHMAMCVale && + xEU5Conditions.isXCHMAMCTrendsUp && + xEU5Conditions.isXCHMAMCFastUnderSlow + // + ) + : true + // + ) + // + && + // + !( + // + xEU5Conditions.isXCHMASCVale || + xEU5Conditions.isXCHMASCFastCrossedUnderSlow + // + ) + // + && + // + ( + // + xEU5Conditions.isXCHMAMCFastOverSlow + ? !xEU5Conditions.isXCHMAMCTrendsDown + : true + // + ) + // + && + // + !( + // + xEU5Conditions.isXTMVale && + xEU5Conditions.isXCHMAMCVale && + xEU5Conditions.isXCHMALCPeak + // + ) + // + && + // + ( + // + xEU5Conditions.isXCHMASCUnderMin + ? !( + // + xEU5Conditions.isXTMVale && + xEU5Conditions.isXTDBearishVale && + xEU5Conditions.isXLHHHSameInLength && + xEU5Conditions.isXLHLLSameInLength + // + ) + : true + // + ) + // + && + // + !( + // + xEU5Conditions.isXCHMALCPeak && + xEU5Conditions.isXCHMAMCVale && + xEU5Conditions.isXLHHHDecreased && + xEU5Conditions.isXLHHHSameInLength && + xEU5Conditions.isXLHLLSameInLength + // + ) + // + && + // + !( + // + xEU5Conditions.isXCHMAMCVale && + xEU5Conditions.isXCHMALCVale && + xEU5Conditions.isXTDBullOverBear && + xEU5Conditions.isXCHMAMCTrendsUp && + xEU5Conditions.isXCHMALCTrendsUp && + xEU5Conditions.isXLHHHSameInLength && + xEU5Conditions.isXLHLLSameInLength && + xEU5Conditions.isXTDSignalUnderBear && + xEU5Conditions.isXLHPriceUnderSignal && + xEU5Conditions.isXCHMAMCFastUnderSlow && + xEU5Conditions.isXCHMALCFastUnderSlow + // + ) + // + && + // + !( + // + xEU5Conditions.isXCHMAMCVale && + xEU5Conditions.isXCHMALCVale && + xEU5Conditions.isXCHLHSameLLs && + xEU5Conditions.isXCHMAMCTrendsUp && + xEU5Conditions.isXCHMALCTrendsUp && + xEU5Conditions.isXTDBullUnderBear && + xEU5Conditions.isXLHHHSameInLength && + xEU5Conditions.isXCHMASCTrendsDown && + xEU5Conditions.isXTDSignalUnderBear && + xEU5Conditions.isXCHMASCFastOverSlow && + xEU5Conditions.isXCHMAMCFastUnderSlow && + xEU5Conditions.isXCHMALCFastUnderSlow + // + ) + // + && + // + !( + // + xEU5Conditions.isXTMVale && + xEU5Conditions.isXCHMAMCVale && + xEU5Conditions.isXTDBullUnderBear && + xEU5Conditions.isXLHHHSameInLength && + xEU5Conditions.isXLHLLSameInLength && + xEU5Conditions.isXTDSignalUnderBear && + xEU5Conditions.isXLHPriceUnderSignal && + xEU5Conditions.isXTMEndBearishByNeutural + // + ) + // + && + // + !( + // + xEU5Conditions.isXCHLHSameLLs && + xEU5Conditions.isXCHLHSCMCLLSame && + xEU5Conditions.isXCHLHSCLCLLSame && + xEU5Conditions.isXCHLHMCLCLLSame && + xEU5Conditions.isXCHMASCUnderMax && + xEU5Conditions.isXCHMASCUnderMin && + xEU5Conditions.isXCHMAMCTrendsUp && + xEU5Conditions.isXLHHHSameInLength && + xEU5Conditions.isXCHMASCTrendsDown && + xEU5Conditions.isXCHMALCTrendsDown && + xEU5Conditions.isXCHMALCFastOverSlow && + xEU5Conditions.isXCHMAMCFastUnderSlow && + xEU5Conditions.isXLHPriceInSignalRange && + xEU5Conditions.isXCHMASCFastCrossedOverSlow + // + ) + // + && + // + !( + // + xEU5Conditions.isXCHMAMCVale && + xEU5Conditions.isXCHMALCVale && + xEU5Conditions.isXCHLHSameLLs && + xEU5Conditions.isXCHLHSCMCLLSame && + xEU5Conditions.isXCHLHSCLCLLSame && + xEU5Conditions.isXCHLHMCLCLLSame && + xEU5Conditions.isXCHMASCUnderMax && + xEU5Conditions.isXCHMASCUnderMin && + xEU5Conditions.isXCHMAMCTrendsUp && + xEU5Conditions.isXCHMALCTrendsUp && + xEU5Conditions.isXCHMASCTrendsDown && + xEU5Conditions.isXLHPriceUnderSignal && + xEU5Conditions.isXCHMAMCFastUnderSlow && + xEU5Conditions.isXCHMALCFastUnderSlow && + xEU5Conditions.isXCHMASCFastCrossedOverSlow + // + ) + // + ; + + // + // Funded Next ... + if (isXEU5OnFundedNext && result) + { + // + result = + // + true + // + ; + } + + // + return result; +} + +// +// XSI Short Signal Checking ... +bool XEU5XSIHasShortSignal() +{ + // + bool result = false; + + // + // Validate Args ... + if (!xEU5MXSIEnableSignaller || + !xEU5MXSIAllowShortSignals) + { + return result; + } + + // + result = + // + xEU5Conditions.isXRSICrossedUnderShortEntry && + xRSIBuffer[3] > xRSIShortEntryValue && + !xEU5Conditions.isXOBDSwingHigh + // + && + // + !( + // + ( + // + xEU5Conditions.isXCHMASCPeak && + xEU5Conditions.isXCHMAMCPeak && + xEU5Conditions.isXCHMALCPeak + // + ) + // + || + // + ( + // + xEU5Conditions.isXCHMAMCPeak && + xEU5Conditions.isXCHMALCPeak + // + ) + // + || + // + ( + // + xEU5Conditions.isXCHMASCPeak && + xEU5Conditions.isXCHMAMCPeak + // + ) + // + || + // + ( + // + xEU5Conditions.isXCHMAMCTrendsDown && + xEU5Conditions.isXCHMALCTrendsDown && + xEU5Conditions.isXCHMAMCFastUnderSlow && + xEU5Conditions.isXCHMALCFastUnderSlow + // + ) + // + ) + // + && + // + !( + // + xEU5Conditions.isXCHLHSameHHs && + xEU5Conditions.isXLHHighAttachedHH && + xEU5Conditions.isXTDSignalCrossedOverBear + // + ) + // + && + // + !( + // + xEU5Conditions.isXCHMAMCPeak && + xEU5Conditions.isXCHMASCTrendsUp && + xEU5Conditions.isXCHMAMCTrendsUp && + xEU5Conditions.isXCHMASCFastOverSlow && + xEU5Conditions.isXCHMAMCFastOverSlow + // + ) + // + && + // + !( + // + xEU5Conditions.isXCHMAMCPeak && + xEU5Conditions.isXCHLHSameHHs && + xEU5Conditions.isXCHMASCTrendsUp && + xEU5Conditions.isXCHMAMCTrendsUp && + xEU5Conditions.isXCHMASCFastOverSlow && + xEU5Conditions.isXCHMAMCFastOverSlow + // + ) + // + && + // + !( + // + xEU5Conditions.isXCHMASCPeak && + xEU5Conditions.isXCHMALCPeak && + xEU5Conditions.isXCHMASCTrendsUp && + xEU5Conditions.isXCHMALCTrendsUp && + xEU5Conditions.isXLHHighAttachedHH && + xEU5Conditions.isXLHLLSameInLength && + xEU5Conditions.isXCHMASCFastOverSlow && + xEU5Conditions.isXCHMALCFastOverSlow + // + ) + // + && + // + !( + // + xEU5Conditions.isXTMBullish && + xEU5Conditions.isXTDBullOverBear && + xEU5Conditions.isXCHMASCTrendsUp && + xEU5Conditions.isXCHMAMCTrendsUp && + xEU5Conditions.isXCHMALCTrendsUp && + xEU5Conditions.isXTDSignalOverBear && + xEU5Conditions.isXCHMASCFastOverSlow && + xEU5Conditions.isXCHMAMCFastOverSlow && + xEU5Conditions.isXCHMALCFastOverSlow + // + ) + // + && + // + !( + // + xEU5Conditions.isXCHMASCPeak && + xEU5Conditions.isXCHMAMCVale && + xEU5Conditions.isXCHMALCVale && + xEU5Conditions.isXCHMASCTrendsUp && + xEU5Conditions.isXLHHighAttachedHH && + xEU5Conditions.isXCHMASCFastOverSlow && + xEU5Conditions.isXCHMAMCFastUnderSlow && + xEU5Conditions.isXCHMALCFastUnderSlow + // + ) + // + && + // + !( + // + xEU5Conditions.isXCHLHSameHHs && + xEU5Conditions.isXCHLHSameLLs && + xEU5Conditions.isXCHMASCOverMax && + xEU5Conditions.isXCHMASCOverMin && + xEU5Conditions.isXTDBullOverBear && + xEU5Conditions.isXCHMASCTrendsUp && + xEU5Conditions.isXCHMALCTrendsUp && + xEU5Conditions.isXTDSignalOverBear && + xEU5Conditions.isXCHMASCFastOverSlow && + xEU5Conditions.isXCHMALCFastOverSlow + // + ) + // + && + // + !( + // + xEU5Conditions.isXCHMASCPeak && + xEU5Conditions.isXTDBullOverBear && + xEU5Conditions.isXCHMASCTrendsUp && + xEU5Conditions.isXTDSignalOverBear && + xEU5Conditions.isXCHMAMCTrendsDown && + xEU5Conditions.isXLHHHSameInLength && + xEU5Conditions.isXLHLLSameInLength && + xEU5Conditions.isXCHMASCFastOverSlow && + xEU5Conditions.isXCHMAMCFastUnderSlow + // + ) + // + && + // + !( + // + xEU5Conditions.isXCHMASCPeak && + xEU5Conditions.isXCHMALCPeak && + xEU5Conditions.isXTDBullOverBear && + xEU5Conditions.isXCHMASCTrendsUp && + xEU5Conditions.isXTDSignalOverBear && + xEU5Conditions.isXCHMALCTrendsDown && + xEU5Conditions.isXCHMASCFastOverSlow && + xEU5Conditions.isXCHMALCFastOverSlow + // + ) + // + && + // + !( + // + xEU5Conditions.isXTMBullish && + xEU5Conditions.isXCHMASCPeak && + xEU5Conditions.isXTDBullOverBear && + xEU5Conditions.isXCHMASCTrendsUp && + xEU5Conditions.isXTDSignalOverBear && + xEU5Conditions.isXLHHighAttachedHH && + xEU5Conditions.isXCHMASCFastOverSlow + // + ) + // + && + // + !( + // + xEU5Conditions.isXCHMALCPeak && + xEU5Conditions.isXCHLHSCMCHHSame && + xEU5Conditions.isXCHLHMCLCLLSame && + xEU5Conditions.isXCHMASCTrendsUp && + xEU5Conditions.isXTDBullOverBear && + xEU5Conditions.isXTDSignalOverBear && + xEU5Conditions.isXCHMALCTrendsDown && + xEU5Conditions.isXCHMASCFastOverSlow && + xEU5Conditions.isXCHMALCFastOverSlow + // + ) + // + && + // + !( + // + xEU5Conditions.isXTMBullish && + xEU5Conditions.isXCHMASCOverMax && + xEU5Conditions.isXTDBullOverBear && + xEU5Conditions.isXCHMASCUnderMax && + xEU5Conditions.isXTDSignalOverBear + // + ) + // + && + // + !( + // + xEU5Conditions.isXCHLHSameHHs && + xEU5Conditions.isXCHLHSameLLs && + xEU5Conditions.isXCHMASCTrendsUp && + xEU5Conditions.isXCHMALCTrendsUp && + xEU5Conditions.isXTDBullOverBear && + xEU5Conditions.isXTDSignalUnderBear && + xEU5Conditions.isXCHMASCFastOverSlow && + xEU5Conditions.isXCHMALCFastOverSlow && + xEU5Conditions.isXLHPriceCrossedOverSignal + // + ) + // + && + // + !( + // + xEU5Conditions.isXCHLHSameHHs && + xEU5Conditions.isXCHMASCOverMin && + xEU5Conditions.isXTDBullOverBear && + xEU5Conditions.isXCHLHSCMCHHSame && + xEU5Conditions.isXCHLHSCLCHHSame && + xEU5Conditions.isXCHLHMCLCHHSame && + xEU5Conditions.isXCHMASCUnderMax && + xEU5Conditions.isXCHMASCTrendsUp && + xEU5Conditions.isXCHMAMCTrendsUp && + xEU5Conditions.isXCHMALCTrendsDown && + xEU5Conditions.isXTDSignalUnderBear && + xEU5Conditions.isXCHMASCFastOverSlow && + xEU5Conditions.isXCHMAMCFastOverSlow && + xEU5Conditions.isXCHMALCFastUnderSlow && + xEU5Conditions.isXLHPriceInSignalRange + // + ) + // + && + // + !( + // + xEU5Conditions.isXTMBearish && + xEU5Conditions.isXCHLHSameHHs && + xEU5Conditions.isXCHMASCOverMin && + xEU5Conditions.isXLHHHIncreased && + xEU5Conditions.isXCHMASCOverMax && + xEU5Conditions.isXCHMASCOverMin && + xEU5Conditions.isXTDBullOverBear && + xEU5Conditions.isXCHLHSCMCHHSame && + xEU5Conditions.isXCHLHSCLCHHSame && + xEU5Conditions.isXCHLHMCLCHHSame && + xEU5Conditions.isXCHMASCUnderMax && + xEU5Conditions.isXCHMASCTrendsUp && + xEU5Conditions.isXCHMAMCTrendsUp && + xEU5Conditions.isXTDBullOverBear && + xEU5Conditions.isXCHLHSCMCHHSame && + xEU5Conditions.isXCHMALCTrendsDown && + xEU5Conditions.isXTDSignalOverBear && + xEU5Conditions.isXLHLLSameInLength && + xEU5Conditions.isXCHMASCTrendsDown && + xEU5Conditions.isXCHMALCTrendsDown && + xEU5Conditions.isXTDSignalUnderBear && + xEU5Conditions.isXCHMASCFastOverSlow && + xEU5Conditions.isXCHMAMCFastOverSlow && + xEU5Conditions.isXCHMAMCFastOverSlow && + xEU5Conditions.isXCHMALCFastUnderSlow && + xEU5Conditions.isXCHMALCFastUnderSlow && + xEU5Conditions.isXLHPriceInSignalRange && + xEU5Conditions.isXLHPriceCrossedUnderSignal && + xEU5Conditions.isXCHMASCFastCrossedUnderSlow + // + ) + // + && + // + !( + // + xEU5Conditions.isXCHMASCPeak && + xEU5Conditions.isXCHMAMCVale && + xEU5Conditions.isXCHMALCVale && + xEU5Conditions.isXCHMASCOverMin && + xEU5Conditions.isXTDBullOverBear && + xEU5Conditions.isXCHMASCUnderMax && + xEU5Conditions.isXCHMASCTrendsUp && + xEU5Conditions.isXCHMALCTrendsUp && + xEU5Conditions.isXTDSignalOverBear && + xEU5Conditions.isXLHLLSameInLength && + xEU5Conditions.isXCHMAMCTrendsDown && + xEU5Conditions.isXLHPriceOverSignal && + xEU5Conditions.isXCHMASCFastOverSlow && + xEU5Conditions.isXCHMAMCFastUnderSlow && + xEU5Conditions.isXCHMALCFastUnderSlow + // + ) + // + && + // + !( + // + xEU5Conditions.isXTMBullish && + xEU5Conditions.isXCHMAMCPeak && + xEU5Conditions.isXCHMALCVale && + xEU5Conditions.isXCHMASCOverMin && + xEU5Conditions.isXTDBullOverBear && + xEU5Conditions.isXCHMASCUnderMax && + xEU5Conditions.isXCHMASCTrendsUp && + xEU5Conditions.isXLHLLSameInLength && + xEU5Conditions.isXCHMAMCTrendsDown && + xEU5Conditions.isXCHMALCTrendsDown && + xEU5Conditions.isXLHPriceOverSignal && + xEU5Conditions.isXCHMASCFastOverSlow && + xEU5Conditions.isXCHMALCFastOverSlow && + xEU5Conditions.isXCHMAMCFastUnderSlow && + xEU5Conditions.isXTDSignalCrossedOverBear + // + ) + // + && + // + !( + // + xEU5Conditions.isXLHHHIncreased && + xEU5Conditions.isXCHMASCOverMax && + xEU5Conditions.isXCHMASCOverMin && + xEU5Conditions.isXTDBullOverBear && + xEU5Conditions.isXTDSignalOverBear && + xEU5Conditions.isXLHLLSameInLength && + xEU5Conditions.isXCHMASCTrendsDown && + xEU5Conditions.isXCHMALCTrendsDown && + xEU5Conditions.isXCHMAMCFastOverSlow && + xEU5Conditions.isXCHMALCFastUnderSlow && + xEU5Conditions.isXLHPriceCrossedUnderSignal && + xEU5Conditions.isXCHMASCFastCrossedUnderSlow + // + ) + // + && + // + !( + // + (xEU5Conditions.isXCHMAMCVale && + xEU5Conditions.isXCHMALCVale && + xEU5Conditions.isXTDSignalVale && + xEU5Conditions.isXTDBullishVale && + xEU5Conditions.isXCHLHMCLCLLSame && + xEU5Conditions.isXCHLHSCMCHHSame && + xEU5Conditions.isXLHLLSameInLength && + xEU5Conditions.isXTDSignalUnderBear && + xEU5Conditions.isXLHPriceOverSignal && + xEU5Conditions.isXTDBullCrossedUnderBear && + (xEU5Conditions.isXCHMASCFastOverSlow || + xEU5Conditions.isXCHMASCFastCrossedOverSlow)) + // + || + // + ((xEU5Conditions.isXTMBullish && + xEU5Conditions.isXAMABullish && + xEU5Conditions.isXTDBullOverBear && + xEU5Conditions.isXTDSignalOverBear) || + (xEU5Conditions.isXLHHHIncreased && + xEU5Conditions.isXLHLLSameInLength && + xEU5Conditions.isXLHPriceOverSignal) || + ((xEU5Conditions.isXCHMASCFastOverSlow || + xEU5Conditions.isXCHMASCFastCrossedOverSlow) && + (xEU5Conditions.isXCHMALCFastOverSlow || + xEU5Conditions.isXCHMALCFastCrossedOverSlow))) + // + || + // + (xEU5Conditions.isXTSCurrentMax && + xEU5Conditions.isXLHHHSameInLength && + xEU5Conditions.isXLHLLSameInLength) + // + || + // + ((xEU5Conditions.isXCHMASCFastOverSlow || + xEU5Conditions.isXCHMASCFastCrossedOverSlow) && + (xEU5Conditions.isXCHMALCFastOverSlow || + xEU5Conditions.isXCHMALCFastCrossedOverSlow)) + // + ) + // + ; + + // + // Funded Next ... + if (isXEU5OnFundedNext && result) + { + // + result = + // + true + // + ; + } + + // + return result; +} + +// +// XSTFI Long Signal Checking ... +bool XEU5XSTFIHasLongSignal() +{ + // + bool result = false; + + // + // Validate Args ... + if (!xEU5MXSTFIEnableSignaller || + !xEU5MXSTFIAllowLongSignals) + { + return result; + } + + // + result = + // + // Base Condition ... + XTSGetMinValue(1) == xTSFarestBuffer[1] && + (xEU5Conditions.isXTSCurrentOverFarest || + xEU5Conditions.isXTSCurrentCrossedOverFarest) && + (xTSCurrentBuffer[1] < xTSNearestBuffer[1] || + xTSCurrentBuffer[1] < xTSMediestBuffer[1]) && + !(xEU5Conditions.isXTSCurrentUnderNearest || + xEU5Conditions.isXTSCurrentCrossedUnderNearest) + // + && + // + // Check Market MA's ... + ( + // + ( + // + ( + // + (xEU5Conditions.isXCHMASCFastOverSlow || + xEU5Conditions.isXCHMASCFastCrossedOverSlow) + // + && + // + (xEU5Conditions.isXCHMAMCFastOverSlow || + xEU5Conditions.isXCHMAMCFastCrossedOverSlow) + // + && + // + (xEU5Conditions.isXCHMALCFastOverSlow || + xEU5Conditions.isXCHMALCFastCrossedOverSlow) + // + ) + // + ) + // + && + // + ( + // + !(xEU5Conditions.isXCHMASCPeak && + xEU5Conditions.isXCHMAMCPeak && + xEU5Conditions.isXCHMALCPeak) + // + && + // + !(xEU5Conditions.isXCHMASCOverMax && + xEU5Conditions.isXCHMASCUnderMax) + // + && + // + !(xEU5Conditions.isXCHMASCOverMin && + xEU5Conditions.isXCHMASCUnderMin) + // + ) + // + // End of Check MA's ... + ) + // + && + // + // Check XTS ... + ( + // + !( + // + (xEU5Conditions.isXTSCurrentUnderNearest && + xEU5Conditions.isXTSCurrentCrossedUnderNearest) + // + || + // + (xEU5Conditions.isXTSCurrentUnderMediest && + xEU5Conditions.isXTSCurrentCrossedUnderMediest) + // + ) + // + // End Of Check XTS ... + ) + // + && + // + // Check XLH ... + ( + // + // Based On Price ... + !( + // + // Signal Range ... + ( + // + xEU5Conditions.isXLHPriceInSignalRange && + ( + // + ((xEU5Conditions.isXLHHHSameInLength && + xEU5Conditions.isXLHLLSameInLength) && + ( + // + xEU5Conditions.isXCHMALCPeak + // + ) + // + ) + // + || + // + (xEU5Conditions.isXLHLLSameInLength && + ( + // + (xEU5Conditions.isXTMStartBearish && + xEU5Conditions.isXAMAStartBearish && + xEU5Conditions.isXFICrossedOverZero) + // + || + // + (((xEU5Conditions.isXCHMAMCTrendsDown && + xEU5Conditions.isXCHMAMCFastOverSlow) || + xEU5Conditions.isXCHMALCPeak) && + xEU5Conditions.isXCHMALCTrendsDown && + xEU5Conditions.isXCHMALCFastOverSlow) + // + ) + // + ) + // + || + // + (xEU5Conditions.isXLHHHSameInLength && + // + ( + // + ((xEU5Conditions.isXCHMASCTrendsDown && + (xEU5Conditions.isXCHMASCFastOverSlow || + xEU5Conditions.isXCHMASCFastCrossedOverSlow)) && + (xEU5Conditions.isXCHMAMCTrendsDown && + (xEU5Conditions.isXCHMAMCFastOverSlow || + xEU5Conditions.isXCHMAMCFastCrossedOverSlow))) + // + || + // + (xEU5Conditions.isXAMABullish && + xEU5Conditions.isXCHMALCPeak && + xEU5Conditions.isXOBDSwingHigh && + xEU5Conditions.isXLHLLIncreased && + xEU5Conditions.isXCHLHMCLCHHSame) + // + ) + // + ) + // + || + // + ( + // + ((xEU5Conditions.isXCHMASCPeak || + xEU5Conditions.isXCHMAMCPeak) && + xEU5Conditions.isXCHMALCPeak) + // + || + // + (xEU5Conditions.isXFICrossedOverZero && + xEU5Conditions.isXTDSignalCrossedOverBear) + // + || + // + (xEU5Conditions.isXLHHHIncreased && + xEU5Conditions.isXCHLHSCMCLLSame && + xEU5Conditions.isXCHLHMCLCHHSame && + xEU5Conditions.isXLHHHSameInLength) + // + || + // + (xEU5Conditions.isXCHLHSameHHs && + xEU5Conditions.isXLHLLIncreased && + xEU5Conditions.isXTDBearishVale) + // + )) + // + ) + // + || + // + // Under Signal ... + ( + // + (xEU5Conditions.isXLHPriceUnderSignal || + xEU5Conditions.isXLHPriceCrossedUnderSignal) && + ( + // + (xEU5Conditions.isXLHHHSameInLength && + ( + // + ((xEU5Conditions.isXCHMAMCVale || + xEU5Conditions.isXCHMAMCPeak || + xEU5Conditions.isXFICrossedUnderZero) && + xEU5Conditions.isXCHMALCPeak) + // + || + // + (xEU5Conditions.isXTMNeutural && + xEU5Conditions.isXAMANeutural) + // + || + // + (xEU5Conditions.isXLHLLIncreased && + xEU5Conditions.isXCHLHMCLCHHSame) + // + ) + // + ) + // + || + // + (xEU5Conditions.isXLHLLSameInLength && + ( + // + (xEU5Conditions.isXCHMAMCPeak && + xEU5Conditions.isXCHMALCPeak) + // + || + // + // Funded ... + ( + // + (xEU5Conditions.isXCHMALCPeak && + xEU5Conditions.isXCHLHSameHHs && + xEU5Conditions.isXTSCurrentOverFarest && + xEU5Conditions.isXTSCurrentUnderMediest) + // + || + // + (xEU5Conditions.isXCHMASCTrendsDown && + (xEU5Conditions.isXCHMASCFastOverSlow || + xEU5Conditions.isXCHMASCFastCrossedOverSlow))) + // + ) + // + ) + // + || + // + ((xEU5Conditions.isXLHHHSameInLength && + xEU5Conditions.isXLHLLSameInLength) && + ( + // + ((xEU5Conditions.isXCHMASCPeak || + xEU5Conditions.isXTDBearishVale || + xEU5Conditions.isXCHLHMCLCHHSame || + (xEU5Conditions.isXTMBearish && + xEU5Conditions.isXAMABearish) || + (xEU5Conditions.isXCHMAMCTrendsDown && + xEU5Conditions.isXCHMAMCFastOverSlow)) && + xEU5Conditions.isXCHMALCPeak) + // + || + // + (xEU5Conditions.isXCHLHMCLCHHSame && + (xEU5Conditions.isXFICrossedOverZero || + (xEU5Conditions.isXTMNeutural && + xEU5Conditions.isXCHMAMCTrendsDown))) + // + || + // + (xEU5Conditions.isXCHMASCTrendsDown && + xEU5Conditions.isXCHMAMCTrendsDown && + xEU5Conditions.isXCHMASCFastOverSlow && + xEU5Conditions.isXCHMAMCFastOverSlow) + // + ) + // + ) + // + ) + // + ) + // + || + // + // Over Signal ... + ( + // + (xEU5Conditions.isXLHPriceOverSignal || + xEU5Conditions.isXLHPriceCrossedOverSignal) && + ( + // + ((xEU5Conditions.isXCHMASCPeak || + xEU5Conditions.isXCHMAMCPeak) && + xEU5Conditions.isXCHMALCPeak) + // + || + // + (xEU5Conditions.isXLHHHSameInLength && + xEU5Conditions.isXLHLLSameInLength) + // + || + // + (xEU5Conditions.isXLHLLSameInLength && + // + ( + // + (xEU5Conditions.isXTMNeutural && + xEU5Conditions.isXAMANeutural && + xEU5Conditions.isXLHHHDecreased) + // + ) + // + ) + // + ) + // + ) + // + || + // + // Price Nothing ... + ( + // + ( + !xEU5Conditions.isXLHPriceOverSignal && + !xEU5Conditions.isXLHPriceUnderSignal && + !xEU5Conditions.isXLHPriceInSignalRange && + !xEU5Conditions.isXLHPriceCrossedOverSignal && + !xEU5Conditions.isXLHPriceCrossedUnderSignal) && + ( + // + (xEU5Conditions.isXLHHHSameInLength && + // + (xEU5Conditions.isXCHMAMCPeak && + xEU5Conditions.isXCHMALCPeak) + // + ) + // + ) + // + ) + // + // End Based On Price Check ... + ) + // + // End Of Check XLH ... + ) + // + ; + + // + // Funded Next ... + if (isXEU5OnFundedNext && result) + { + // + result = + // + true + // + ; + } + + // + return result; +} + +// +// XSTFI Short Signal Checking ... +bool XEU5XSTFIHasShortSignal() +{ + // + bool result = false; + + // + // Validate Args ... + if (!xEU5MXSTFIEnableSignaller || + !xEU5MXSTFIAllowShortSignals) + { + return result; + } + + // + result = + // + // Base Conditions ... + XTSGetMaxValue(1) == xTSFarestBuffer[1] && + (xEU5Conditions.isXTSCurrentUnderFarest || + xEU5Conditions.isXTSCurrentCrossedUnderFarest) && + (xTSCurrentBuffer[1] > xTSNearestBuffer[1] || + xTSCurrentBuffer[1] > xTSMediestBuffer[1]) && + !(xEU5Conditions.isXTSCurrentOverNearest || + xEU5Conditions.isXTSCurrentCrossedOverNearest) + // + && + // + // XOBD Check ... + !xEU5Conditions.isXOBDSwingHigh + // + && + // + // XCHMA Check ... + ( + // + !(xEU5Conditions.isXCHMASCOverMax && + xEU5Conditions.isXCHMASCUnderMax) + // + && + // + !(xEU5Conditions.isXCHMASCOverMin && + xEU5Conditions.isXCHMASCUnderMin) + // + && + // + !(xEU5Conditions.isXCHMASCVale && + xEU5Conditions.isXCHMAMCVale && + xEU5Conditions.isXCHMALCVale) + // + ) + // + && + // + // XLH Prices ... + ( + // + !( + // + // Signal Range ... + (xEU5Conditions.isXLHPriceInSignalRange && + // + ( + // + (xEU5Conditions.isXLHLLSameInLength && + // + ( + // + (xEU5Conditions.isXCHMAMCVale && + xEU5Conditions.isXCHMALCVale) + // + || + // + (xEU5Conditions.isXCHMAMCPeak && + xEU5Conditions.isXCHMALCPeak) + // + || + // + (xEU5Conditions.isXTMNeutural && + xEU5Conditions.isXAMANeutural) + // + || + (xEU5Conditions.isXTMVale && + xEU5Conditions.isXAMAVale && + xEU5Conditions.isXTMEndBearish) + // + || + // + (xEU5Conditions.isXTMBullish && + xEU5Conditions.isXAMAEndBullish && + xEU5Conditions.isXLHLLDecreased) + // + || + // + (xEU5Conditions.isXCHMASCTrendsUp && + (xEU5Conditions.isXCHMASCFastOverSlow || + xEU5Conditions.isXCHMASCFastCrossedOverSlow)) + // + || + // + ((xEU5Conditions.isXCHMASCVale && + xEU5Conditions.isXCHMALCVale) && + (xEU5Conditions.isXCHMAMCFastOverSlow || + xEU5Conditions.isXCHMAMCFastCrossedOverSlow)) + // + || + // + (xEU5Conditions.isXLHHHDecreased && + xEU5Conditions.isXCHLHMCLCLLSame) + // + || + // + (xEU5Conditions.isXCHMALCPeak && + xEU5Conditions.isXCHMALCFastOverSlow) + // + || + // + ((xEU5Conditions.isXTMBullish || + xEU5Conditions.isXTMStartBullish) && + (xEU5Conditions.isXAMABullish || + xEU5Conditions.isXAMAStartBullish)) + // + ) + // + ) + // + || + // + (xEU5Conditions.isXLHHHSameInLength && + // + ( + // + (xEU5Conditions.isXTMVale && + xEU5Conditions.isXAMAVale) + // + || + // + (xEU5Conditions.isXTMNeutural && + xEU5Conditions.isXAMANeutural) + // + || + // + (xEU5Conditions.isXCHMAMCPeak && + xEU5Conditions.isXCHMALCPeak) + // + || + // + (xEU5Conditions.isXCHMAMCVale && + xEU5Conditions.isXCHMALCVale) + // + || + // + (xEU5Conditions.isXTMBullish && + xEU5Conditions.isXAMABullish) + // + || + // + (xEU5Conditions.isXCHLHSameLLs && + xEU5Conditions.isXTDBearishVale) + // + || + // + // Funded ... + ( + // + ( + // + (xEU5Conditions.isXCHMALCVale && + xEU5Conditions.isXAMAEndBearish && + xEU5Conditions.isXLHHHDecreased && + xEU5Conditions.isXFICrossedUnderZero) + // + || + // + (xEU5Conditions.isXCHMAMCFastOverSlow || + xEU5Conditions.isXCHMAMCFastCrossedOverSlow) + // + ) + // + ) + // + || + // + (xEU5Conditions.isXCHMALCVale && + xEU5Conditions.isXCHMASCTrendsUp && + (xEU5Conditions.isXCHMASCFastOverSlow || + xEU5Conditions.isXCHMASCFastCrossedOverSlow)) + // + || + // + (xEU5Conditions.isXCHMASCVale && + xEU5Conditions.isXCHMALCVale && + xEU5Conditions.isXLHLLIncreased) + // + || + // + ((xEU5Conditions.isXCHMAMCFastOverSlow || + xEU5Conditions.isXCHMAMCFastCrossedOverSlow) && + ( + // + xEU5Conditions.isXCHMAMCPeak + // + || + // + (xEU5Conditions.isXCHMALCFastOverSlow || + xEU5Conditions.isXCHMALCFastCrossedOverSlow) + // + || + // + (xEU5Conditions.isXCHMASCFastOverSlow || + xEU5Conditions.isXCHMASCFastCrossedOverSlow) + // + ) + // + ) + // + ) + // + ) + // + || + // + ((xEU5Conditions.isXLHHHSameInLength && + xEU5Conditions.isXLHLLSameInLength) && + // + ( + // + (xEU5Conditions.isXAMABullish && + xEU5Conditions.isXLHLLDecreased && + xEU5Conditions.isXCHLHSCMCLLSame) + // + || + // + (xEU5Conditions.isXCHMASCVale && + xEU5Conditions.isXCHMALCVale && + xEU5Conditions.isXTMEndBearish) + // + || + // + ((xEU5Conditions.isXCHMAMCPeak || + xEU5Conditions.isXCHMAMCVale) && + (xEU5Conditions.isXCHMALCPeak || + (xEU5Conditions.isXCHMAMCFastOverSlow || + xEU5Conditions.isXCHMAMCFastCrossedOverSlow))) + // + || + // + ((xEU5Conditions.isXCHMASCFastOverSlow || + xEU5Conditions.isXCHMASCFastCrossedOverSlow) && + ((xEU5Conditions.isXTMStartBullish && + xEU5Conditions.isXAMAEndBearish) || + (xEU5Conditions.isXCHMALCFastOverSlow || + xEU5Conditions.isXCHMALCFastCrossedOverSlow) || + (xEU5Conditions.isXLHLLDecreased && + xEU5Conditions.isXTSCurrentOverMediest && + xEU5Conditions.isXTSCurrentUnderFarest && + xEU5Conditions.isXTSCurrentUnderNearest))) + // + || + // + // Funded ... + ( + // + (xEU5Conditions.isXTMNeutural && + xEU5Conditions.isXAMABearish && + xEU5Conditions.isXCHMALCVale && + xEU5Conditions.isXTMEndBearish && + xEU5Conditions.isXCHLHMCLCLLSame) + // + ) + // + ) + // + ) + // + || + ( + // + ((xEU5Conditions.isXCHMAMCFastOverSlow || + xEU5Conditions.isXCHMAMCFastCrossedOverSlow) && + // + ( + // + xEU5Conditions.isXCHMALCPeak + // + || + // + (xEU5Conditions.isXCHMALCFastOverSlow || + xEU5Conditions.isXCHMALCFastCrossedOverSlow) + // + || + // + (xEU5Conditions.isXCHMASCFastOverSlow || + xEU5Conditions.isXCHMASCFastCrossedOverSlow) + // + || + // + (xEU5Conditions.isXTMNeutural && + xEU5Conditions.isXAMAEndBearish && + xEU5Conditions.isXCHLHSCMCLLSame) + // + || + // + (xEU5Conditions.isXCHMALCVale && + xEU5Conditions.isXTMEndBearish && + xEU5Conditions.isXLHLLIncreased && + xEU5Conditions.isXCHLHSCMCHHSame) + // + ) + // + ) + // + || + // + ((xEU5Conditions.isXCHMALCFastOverSlow || + xEU5Conditions.isXCHMALCFastCrossedOverSlow) && + ( + // + xEU5Conditions.isXCHMALCPeak + // + ) + // + ) + // + || + // + (xEU5Conditions.isXTMNeutural && + xEU5Conditions.isXAMANeutural && + xEU5Conditions.isXTDBullCrossedOverBear) + // + || + // + (xEU5Conditions.isXCHMAMCVale && + xEU5Conditions.isXCHMALCVale && + xEU5Conditions.isXCHLHSameLLs) + // + ) + // + ) + // + ) + // + || + // + // Under Signal ... + ((xEU5Conditions.isXLHPriceUnderSignal || + xEU5Conditions.isXLHPriceCrossedUnderSignal) && + // + ( + // + (xEU5Conditions.isXLHLLSameInLength && + // + ( + // + (xEU5Conditions.isXTMBearish && + xEU5Conditions.isXAMABearish) + // + || + // + (xEU5Conditions.isXAMAVale && + xEU5Conditions.isXTDBearishVale) + // + || + // + (xEU5Conditions.isXCHMAMCVale && + (xEU5Conditions.isXCHMALCVale || + xEU5Conditions.isXAMAVale || + xEU5Conditions.isXTMBullish || + xEU5Conditions.isXCHLHSCMCLLSame || + xEU5Conditions.isXFICrossedOverZero)) + // + || + // + (xEU5Conditions.isXTMNeutural && + xEU5Conditions.isXAMANeutural && + xEU5Conditions.isXFICrossedUnderZero) + // + || + // + ((xEU5Conditions.isXCHMASCFastOverSlow || + xEU5Conditions.isXCHMASCFastCrossedOverSlow) && + (xEU5Conditions.isXCHMALCFastOverSlow || + xEU5Conditions.isXCHMALCFastCrossedOverSlow)) + // + || + // + ((xEU5Conditions.isXCHMALCPeak || + (xEU5Conditions.isXCHMAMCFastOverSlow || + xEU5Conditions.isXCHMAMCFastCrossedOverSlow)) && + (xEU5Conditions.isXCHMALCFastOverSlow || + xEU5Conditions.isXCHMALCFastCrossedOverSlow)) + // + || + // + ((xEU5Conditions.isXCHMASCFastOverSlow || + xEU5Conditions.isXCHMASCFastCrossedOverSlow) && + (xEU5Conditions.isXCHMAMCFastOverSlow || + xEU5Conditions.isXCHMAMCFastCrossedOverSlow)) + // + ) + // + ) + // + || + // + (xEU5Conditions.isXLHHHSameInLength && + // + ( + // + (xEU5Conditions.isXCHMASCVale && + (xEU5Conditions.isXCHMAMCFastOverSlow || + xEU5Conditions.isXCHMAMCFastOverSlow)) + // + || + // + (xEU5Conditions.isXLHLLDecreased && + xEU5Conditions.isXCHLHSCMCLLSame) + // + || + // + (xEU5Conditions.isXTMVale && + xEU5Conditions.isXAMAVale) + // + || + // + (xEU5Conditions.isXCHMAMCVale && + xEU5Conditions.isXCHMALCVale) + // + || + // + (xEU5Conditions.isXCHLHSCMCHHSame && + (xEU5Conditions.isXCHMASCFastOverSlow || + xEU5Conditions.isXCHMASCFastCrossedOverSlow)) + // + || + // + ((xEU5Conditions.isXCHMASCFastOverSlow || + xEU5Conditions.isXCHMASCFastCrossedOverSlow) && + (xEU5Conditions.isXCHMAMCFastOverSlow || + xEU5Conditions.isXCHMAMCFastCrossedOverSlow)) + // + || + // + ((xEU5Conditions.isXCHMAMCFastOverSlow || + xEU5Conditions.isXCHMAMCFastCrossedOverSlow) && + (xEU5Conditions.isXCHMALCFastOverSlow || + xEU5Conditions.isXCHMALCFastCrossedOverSlow)) + // + || + // + (xEU5Conditions.isXCHLHSCMCLLSame && + (xEU5Conditions.isXCHMALCFastOverSlow || + xEU5Conditions.isXCHMALCFastCrossedOverSlow)) + // + || + // + (xEU5Conditions.isXCHMALCVale && + xEU5Conditions.isXCHLHMCLCHHSame) + // + || + // + (xEU5Conditions.isXTMNeutural && + xEU5Conditions.isXAMANeutural && + xEU5Conditions.isXLHLLIncreased) + // + || + // + (xEU5Conditions.isXLHLLIncreased && + xEU5Conditions.isXCHLHMCLCHHSame && + (xEU5Conditions.isXCHMAMCFastOverSlow || + xEU5Conditions.isXCHMAMCFastCrossedOverSlow)) + // + ) + // + ) + // + || + // + ((xEU5Conditions.isXLHHHSameInLength && + xEU5Conditions.isXLHLLSameInLength) && + // + ( + // + xEU5Conditions.isXTDBearishVale + // + || + // + (xEU5Conditions.isXCHMALCVale && + xEU5Conditions.isXCHMAMCFastOverSlow) + // + || + // + ((xEU5Conditions.isXTMVale || + xEU5Conditions.isXLHLLDecreased) && + xEU5Conditions.isXAMAVale) + // + || + ((xEU5Conditions.isXCHMASCVale || + xEU5Conditions.isXCHMALCVale) && + xEU5Conditions.isXCHMAMCVale) + // + || + // + (xEU5Conditions.isXCHLHMCLCHHSame && + xEU5Conditions.isXCHLHMCLCLLSame) + // + || + // + (xEU5Conditions.isXCHMAMCPeak && + xEU5Conditions.isXCHMAMCTrendsDown && + xEU5Conditions.isXCHMAMCFastOverSlow) + // + || + // + ((xEU5Conditions.isXCHMALCPeak || + xEU5Conditions.isXFICrossedUnderZero || + xEU5Conditions.isXCHMAMCFastOverSlow) && + xEU5Conditions.isXCHMALCFastOverSlow) + // + || + // + (xEU5Conditions.isXCHMASCUnderMax && + xEU5Conditions.isXCHMASCUnderMin && + xEU5Conditions.isXFICrossedUnderZero) + // + ) + // + ) + // + || + // + ( + // + (xEU5Conditions.isXCHLHSCMCHHSame && + (xEU5Conditions.isXCHMASCFastOverSlow || + xEU5Conditions.isXCHMASCFastCrossedOverSlow)) + // + || + // + (xEU5Conditions.isXAMAVale && + xEU5Conditions.isXTMBullish && + xEU5Conditions.isXCHMAMCVale && + xEU5Conditions.isXCHLHSCMCLLSame) + // + || + // + (xEU5Conditions.isXCHMAMCPeak && + xEU5Conditions.isXCHMALCPeak) + // + || + // + (xEU5Conditions.isXCHLHSCMCLLSame && + xEU5Conditions.isXCHMAMCTrendsDown) + // + || + (xEU5Conditions.isXAMAVale && + xEU5Conditions.isXTMEndBearish && + xEU5Conditions.isXCHLHMCLCHHSame) + // + || + // + (xEU5Conditions.isXLHHHSameInLength && + xEU5Conditions.isXLHLLSameInLength) + // + || + // + (xEU5Conditions.isXTMVale && + xEU5Conditions.isXAMAVale && + xEU5Conditions.isXLHLowAttachedLL) + // + || + // + (xEU5Conditions.isXCHMAMCVale && + xEU5Conditions.isXCHMALCVale && + xEU5Conditions.isXCHLHSCMCLLSame) + // + || + // + (xEU5Conditions.isXAMANeutural && + (xEU5Conditions.isXTMBullish || + xEU5Conditions.isXTMStartBullish)) + // + || + // + (xEU5Conditions.isXCHMAMCVale && + xEU5Conditions.isXCHMALCVale && + xEU5Conditions.isXCHLHSameLLs) + // + || + // + (xEU5Conditions.isXLHHHDecreased && + (xEU5Conditions.isXLHLLDecreased || + (xEU5Conditions.isXTMVale && + xEU5Conditions.isXTMNeutural && + xEU5Conditions.isXAMANeutural))) + // + || + // + (xEU5Conditions.isXTMBearish && + xEU5Conditions.isXAMABearish && + xEU5Conditions.isXCHLHSCMCLLSame && + xEU5Conditions.isXCHMAMCFastUnderSlow) + // + || + // + ((xEU5Conditions.isXCHMALCFastOverSlow || + xEU5Conditions.isXCHMALCFastCrossedOverSlow) && + ( + // + xEU5Conditions.isXCHMAMCVale + // + || + // + xEU5Conditions.isXCHMALCVale + // + || + // + xEU5Conditions.isXCHLHSameLLs + // + || + // + xEU5Conditions.isXFICrossedOverZero + // + || + // + (xEU5Conditions.isXTMNeutural && + xEU5Conditions.isXAMABullish) + // + || + // + (xEU5Conditions.isXCHMASCFastOverSlow || + xEU5Conditions.isXCHMASCFastCrossedOverSlow) + // + ) + // + ) + // + || + // + ((xEU5Conditions.isXCHMASCVale || + xEU5Conditions.isXLHLowAttachedLL) && + (xEU5Conditions.isXCHMAMCFastOverSlow || + xEU5Conditions.isXCHMAMCFastCrossedOverSlow)) + // + || + // + (xEU5Conditions.isXTMVale && + xEU5Conditions.isXCHMASCVale && + xEU5Conditions.isXLHLLDecreased && + xEU5Conditions.isXAMAStartBullish && + xEU5Conditions.isXRSICrossedOverLongEntry) + // + || + // + (xEU5Conditions.isXAMAVale && + xEU5Conditions.isXCHMALCPeak && + xEU5Conditions.isXCHLHSCMCLLSame && + (xEU5Conditions.isXCHMAMCFastOverSlow || + xEU5Conditions.isXCHMAMCFastCrossedOverSlow)) + // + || + // + (xEU5Conditions.isXCHMALCPeak && + xEU5Conditions.isXTMEndBearish && + xEU5Conditions.isXAMAEndBearish && + xEU5Conditions.isXCHLHSCMCLLSame && + (xEU5Conditions.isXCHMAMCFastOverSlow || + xEU5Conditions.isXCHMAMCFastCrossedOverSlow) && + (xEU5Conditions.isXCHMALCFastOverSlow || + xEU5Conditions.isXCHMALCFastCrossedOverSlow)) + // + ) + // + ) + // + ) + // + || + // + // Over Signal ... + ((xEU5Conditions.isXLHPriceOverSignal || + xEU5Conditions.isXLHPriceCrossedOverSignal) && + // + ( + // + (xEU5Conditions.isXLHLLSameInLength && + // + ( + // + ((xEU5Conditions.isXCHMAMCVale || + (xEU5Conditions.isXAMAVale && + xEU5Conditions.isXCHMASCVale) || + (xEU5Conditions.isXLHLLIncreased && + xEU5Conditions.isXLHPriceCrossedOverSignal)) && + xEU5Conditions.isXCHMALCVale) + // + || + // + (xEU5Conditions.isXTDSignalVale && + xEU5Conditions.isXTDBullishVale) + // + || + // + (xEU5Conditions.isXLHHHDecreased && + xEU5Conditions.isXCHLHMCLCLLSame) + // + || + // + (xEU5Conditions.isXCHMALCPeak && + xEU5Conditions.isXCHMALCFastOverSlow) + // + || + // + (xEU5Conditions.isXAMABullish && + xEU5Conditions.isXCHLHSCMCHHSame) + // + || + // + ((xEU5Conditions.isXCHMASCFastOverSlow || + xEU5Conditions.isXCHMASCFastCrossedOverSlow) || + (xEU5Conditions.isXCHMAMCFastOverSlow || + xEU5Conditions.isXCHMAMCFastCrossedOverSlow)) + // + || + // + // Funded ... + ( + // + (xEU5Conditions.isXCHMALCVale && + xEU5Conditions.isXTMNeutural && + xEU5Conditions.isXAMANeutural && + xEU5Conditions.isXLHLLIncreased) + // + ) + // + ) + // + ) + // + || + // + (xEU5Conditions.isXLHHHSameInLength && + // + ( + // + (xEU5Conditions.isXTMVale && + xEU5Conditions.isXAMAVale) + // + || + // + (xEU5Conditions.isXCHMASCVale && + xEU5Conditions.isXCHMAMCPeak && + xEU5Conditions.isXCHMALCPeak) + // + || + // + ((xEU5Conditions.isXCHMAMCFastOverSlow || + xEU5Conditions.isXCHMAMCFastCrossedOverSlow) && + (xEU5Conditions.isXCHMAMCPeak || + xEU5Conditions.isXAMANeutural || + xEU5Conditions.isXCHMALCVale || + (xEU5Conditions.isXCHMALCFastOverSlow || + xEU5Conditions.isXCHMALCFastCrossedOverSlow))) + // + || + // + (xEU5Conditions.isXTMStartBullish && + xEU5Conditions.isXAMAStartBullish) + // + || + // + (xEU5Conditions.isXCHMASCOverMax && + xEU5Conditions.isXCHMASCCrossedOverMax) + // + || + // + (xEU5Conditions.isXAMAVale && + xEU5Conditions.isXLHLLIncreased && + xEU5Conditions.isXCHLHMCLCHHSame) + // + || + // + (xEU5Conditions.isXCHMALCVale && + (xEU5Conditions.isXCHMAMCVale || + xEU5Conditions.isXCHMASCFastOverSlow || + (xEU5Conditions.isXLHLLDecreased && + xEU5Conditions.isXCHLHSCMCLLSame))) + // + || + // + (xEU5Conditions.isXTMBullish && + xEU5Conditions.isXAMABullish) + // + || + // + (xEU5Conditions.isXCHLHSCMCLLSame || + xEU5Conditions.isXFICrossedUnderZero) + // + || + // + (xEU5Conditions.isXOBDSwingLow && + (xEU5Conditions.isXCHMAMCFastOverSlow || + xEU5Conditions.isXCHMAMCFastCrossedOverSlow)) + // + || + // + (((xEU5Conditions.isXTMNeutural && + xEU5Conditions.isXAMANeutural) || + (xEU5Conditions.isXCHMASCVale && + xEU5Conditions.isXCHMALCVale)) && + xEU5Conditions.isXCHLHMCLCHHSame) + // + || + // + (xEU5Conditions.isXCHMASCFastOverSlow && + xEU5Conditions.isXCHMAMCFastOverSlow) + // + || + // + (xEU5Conditions.isXAMAVale && + xEU5Conditions.isXCHMAMCPeak && + xEU5Conditions.isXCHMALCPeak && + xEU5Conditions.isXCHLHMCLCHHSame) + // + || + // + // Funded ... + (xEU5Conditions.isXTMNeutural && + xEU5Conditions.isXAMANeutural && + xEU5Conditions.isXLHLLIncreased) + // + || + // + (xEU5Conditions.isXCHMALCVale && + (xEU5Conditions.isXCHMAMCTrendsDown && + (xEU5Conditions.isXCHMAMCFastUnderSlow || + xEU5Conditions.isXCHMAMCFastCrossedUnderSlow))) + // + ) + // + ) + // + || + // + ((xEU5Conditions.isXLHHHSameInLength && + xEU5Conditions.isXLHLLSameInLength) && + ( + // + ((xEU5Conditions.isXCHMASCVale || + xEU5Conditions.isXCHMAMCPeak) && + xEU5Conditions.isXCHMALCVale) + // + || + // + (xEU5Conditions.isXTMBullish && + xEU5Conditions.isXAMANeutural) + // + || + // + (xEU5Conditions.isXTMEndBullish && + xEU5Conditions.isXAMAEndBullish) + // + || + // + (xEU5Conditions.isXTMStartBullish && + xEU5Conditions.isXAMAStartBullish) + // + || + // + (xEU5Conditions.isXTMEndBearish && + xEU5Conditions.isXAMAEndBearish) + // + || + // + (xEU5Conditions.isXTMNeutural && + xEU5Conditions.isXCHMALCVale && + xEU5Conditions.isXAMANeutural) + // + || + // + ((xEU5Conditions.isXCHMAMCPeak || + (xEU5Conditions.isXCHMASCFastOverSlow || + xEU5Conditions.isXCHMASCFastCrossedOverSlow)) && + (xEU5Conditions.isXCHMAMCFastOverSlow || + xEU5Conditions.isXCHMAMCFastCrossedOverSlow)) + // + ) + // + ) + // + || + // + ( + // + (xEU5Conditions.isXTMBullish && + xEU5Conditions.isXAMABullish && + xEU5Conditions.isXLHHighAttachedHH) + // + || + // + ((xEU5Conditions.isXCHMAMCPeak || + xEU5Conditions.isXCHMASCTrendsUp || + (xEU5Conditions.isXCHMAMCFastOverSlow || + xEU5Conditions.isXCHMAMCFastCrossedOverSlow)) && + (xEU5Conditions.isXCHMASCFastOverSlow || + xEU5Conditions.isXCHMASCFastCrossedOverSlow)) + // + || + // + ((xEU5Conditions.isXCHMALCPeak || + (xEU5Conditions.isXCHMAMCFastOverSlow || + xEU5Conditions.isXCHMAMCFastCrossedOverSlow)) && + (xEU5Conditions.isXCHMALCFastOverSlow || + xEU5Conditions.isXCHMALCFastCrossedOverSlow)) + // + || + // + (xEU5Conditions.isXTMEndBullish && + xEU5Conditions.isXAMAEndBullish && + xEU5Conditions.isXLHLLIncreased && + xEU5Conditions.isXCHLHSCMCHHSame && + xEU5Conditions.isXLHHighAttachedHH && + xEU5Conditions.isXFICrossedUnderZero) + // + ) + // + ) + // + ) + // + || + // + // Price Empty Condition ... + ((!xEU5Conditions.isXLHPriceOverSignal && + !xEU5Conditions.isXLHPriceInSignalRange && + !xEU5Conditions.isXLHPriceUnderSignal && + !xEU5Conditions.isXLHPriceCrossedUnderSignal && + !xEU5Conditions.isXLHPriceCrossedOverSignal) && + // + ( + // + (xEU5Conditions.isXLHHHSameInLength && + // + ( + // + (xEU5Conditions.isXCHMAMCVale && + xEU5Conditions.isXCHMALCVale) + // + || + // + (xEU5Conditions.isXCHMAMCPeak && + xEU5Conditions.isXCHMALCPeak) + // + || + // + (xEU5Conditions.isXAMANeutural && + (xEU5Conditions.isXTMEndBearish || + xEU5Conditions.isXTMNeutural) && + xEU5Conditions.isXLHLLIncreased) + // + || + // + (xEU5Conditions.isXAMAVale && + xEU5Conditions.isXTMNeutural && + xEU5Conditions.isXCHMASCVale && + xEU5Conditions.isXAMANeutural && + xEU5Conditions.isXAMAEndBearish) + // + || + // + ((xEU5Conditions.isXCHMAMCFastOverSlow || + xEU5Conditions.isXCHMAMCFastCrossedOverSlow) && + (xEU5Conditions.isXCHMALCFastOverSlow || + xEU5Conditions.isXCHMALCFastCrossedOverSlow)) + // + || + // + // Funded ... + ( + // + (xEU5Conditions.isXCHMALCPeak && + (xEU5Conditions.isXCHMALCFastOverSlow || + xEU5Conditions.isXCHMALCFastCrossedOverSlow)) + // + ) + // + ) + // + ) + // + || + // + (xEU5Conditions.isXLHLLSameInLength && + // + ( + // + (xEU5Conditions.isXCHMAMCVale && + xEU5Conditions.isXCHMALCVale) + // + || + // + (xEU5Conditions.isXCHMAMCPeak && + xEU5Conditions.isXCHMALCPeak) + // + || + // + (xEU5Conditions.isXAMAEndBearish && + xEU5Conditions.isXLHLLDecreased && + xEU5Conditions.isXTMStartBullish) + // + || + // + ((xEU5Conditions.isXCHMAMCFastOverSlow || + xEU5Conditions.isXCHMAMCFastCrossedOverSlow) && + (xEU5Conditions.isXCHMALCFastOverSlow || + xEU5Conditions.isXCHMALCFastCrossedOverSlow)) + // + ) + // + ) + // + || + // + ((xEU5Conditions.isXLHLLSameInLength && + xEU5Conditions.isXLHHHSameInLength) && + // + ( + // + (xEU5Conditions.isXTMBullish && + xEU5Conditions.isXAMABullish) + // + || + // + (xEU5Conditions.isXCHMAMCPeak && + (xEU5Conditions.isXCHMAMCFastOverSlow || + xEU5Conditions.isXCHMAMCFastCrossedOverSlow)) + // + || + // + (xEU5Conditions.isXAMAVale && + xEU5Conditions.isXTMEndBearish && + xEU5Conditions.isXCHLHMCLCHHSame) + // + || + // + ((xEU5Conditions.isXCHMASCFastOverSlow || + xEU5Conditions.isXCHMASCFastCrossedOverSlow) && + (xEU5Conditions.isXCHMALCFastOverSlow || + xEU5Conditions.isXCHMALCFastCrossedOverSlow)) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ); + + // + // Funded Next ... + if (isXEU5OnFundedNext && result) + { + // + result = + // + true + // + ; + } + + // + return result; +} + +// +// XOBDLH Long Signal Checking ... +bool XEU5XOBDLHHasLongSignal() +{ + // + bool result = false; + + // + // Validate Args ... + if (!xEU5MXOBDLHEnableSignaller || + !xEU5MXOBDLHAllowLongSignals) + { + return result; + } + + // + double entry = GetEntry(X_SIGNAL_LONG); + XEU5MarketConditions conditions2 = XEU5GenerateMarketConditions(2); + + // + result = + // + conditions2.isXOBDSwingLow && + conditions2.isXLHLowAttachedLL && + xLHLLBuffer[1] >= xLHLLBuffer[2] && + // + ( + // + xEU5Conditions.isXLHPriceUnderSignal + ? entry < xLHSignalBuffer[1] + : true + // + ) + // + && + // + !( + // + xEU5Conditions.isXCHMASCOverMin && + xEU5Conditions.isXCHMASCUnderMin + // + ) + // + && + // + ( + // + xEU5Conditions.isXCHMASCOverMin && + xEU5Conditions.isXCHMASCUnderMax && + xEU5Conditions.isXCHMASCFastUnderSlow + ? !( + // + xEU5Conditions.isXCHMAMCTrendsDown && + xEU5Conditions.isXCHMAMCFastOverSlow && + xEU5Conditions.isXCHMALCTrendsDown && + xEU5Conditions.isXCHMALCFastOverSlow + // + ) + : true + // + ) + // + && + // + !( + // + xEU5Conditions.isXTMVale && + xEU5Conditions.isXTDBullUnderBear && + xEU5Conditions.isXLHLLDecreased && + xEU5Conditions.isXCHMASCVale && + xEU5Conditions.isXCHMAMCVale && + xEU5Conditions.isXCHMALCVale + // + ) + // + && + // + ( + // + xEU5Conditions.isXCHMASCUnderMin + ? !( + // + xEU5Conditions.isXCHMAMCVale && + xEU5Conditions.isXCHMALCVale + // + ) + : true + // + ) + // + && + // + ( + // + xEU5Conditions.isXCHMASCUnderMin && + xEU5Conditions.isXCHMASCFastUnderSlow && + xEU5Conditions.isXCHMAMCFastUnderSlow && + xEU5Conditions.isXCHMALCFastUnderSlow + ? !xEU5Conditions.isXCHMASCTrendsUp + : true + // + ) + // + && + // + !( + // + xEU5Conditions.isXTMVale && + xEU5Conditions.isXLHHHDecreased && + xEU5Conditions.isXCHLHSameLLs && + xEU5Conditions.isXCHMASCOverMin && + xEU5Conditions.isXCHMASCUnderMax && + xEU5Conditions.isXCHMAMCVale && + xEU5Conditions.isXCHMAMCTrendsUp && + xEU5Conditions.isXCHMAMCFastUnderSlow + // + ) + // + && + // + !( + // + xEU5Conditions.isXCHMAMCVale && + xEU5Conditions.isXCHMALCPeak && + xEU5Conditions.isXCHMALCFastOverSlow && + xEU5Conditions.isXCHMAMCFastUnderSlow + // + ) + // + && + // + !( + // + xEU5Conditions.isXCHMASCTrendsUp && + xEU5Conditions.isXCHMALCTrendsUp && + xEU5Conditions.isXTDBullUnderBear && + xEU5Conditions.isXCHMAMCTrendsDown && + xEU5Conditions.isXTDSignalUnderBear && + xEU5Conditions.isXLHPriceUnderSignal && + xEU5Conditions.isXCHMAMCFastOverSlow && + xEU5Conditions.isXCHMASCFastUnderSlow && + xEU5Conditions.isXCHMALCFastUnderSlow + // + ) + // + && + // + !( + // + xEU5Conditions.isXCHMALCPeak && + xEU5Conditions.isXCHMASCOverMin && + xEU5Conditions.isXCHLHSCMCLLSame && + xEU5Conditions.isXCHLHMCLCHHSame && + xEU5Conditions.isXCHMASCUnderMax && + xEU5Conditions.isXCHMASCTrendsUp && + xEU5Conditions.isXCHMALCTrendsUp && + xEU5Conditions.isXTDBullUnderBear && + xEU5Conditions.isXLHHHSameInLength && + xEU5Conditions.isXCHMAMCTrendsDown && + xEU5Conditions.isXTDSignalUnderBear && + xEU5Conditions.isXLHPriceUnderSignal && + xEU5Conditions.isXCHMAMCFastOverSlow && + xEU5Conditions.isXCHMALCFastOverSlow && + xEU5Conditions.isXCHMASCFastUnderSlow + // + ) + // + && + // + !( + // + xEU5Conditions.isXCHMALCPeak && + xEU5Conditions.isXCHMASCOverMin && + xEU5Conditions.isXCHLHSCMCLLSame && + xEU5Conditions.isXCHMASCUnderMax && + xEU5Conditions.isXCHMALCTrendsUp && + xEU5Conditions.isXTDBullUnderBear && + xEU5Conditions.isXCHMAMCTrendsDown && + xEU5Conditions.isXTDSignalUnderBear && + xEU5Conditions.isXLHPriceUnderSignal && + xEU5Conditions.isXCHMAMCFastOverSlow && + xEU5Conditions.isXCHMALCFastOverSlow && + xEU5Conditions.isXCHMASCFastUnderSlow + // + ) + // + && + // + !( + // + xEU5Conditions.isXCHMALCPeak && + xEU5Conditions.isXLHLLDecreased && + xEU5Conditions.isXCHMASCOverMin && + xEU5Conditions.isXCHLHSCMCLLSame && + xEU5Conditions.isXCHLHMCLCHHSame && + xEU5Conditions.isXCHMASCUnderMax && + xEU5Conditions.isXLHHHSameInLength && + xEU5Conditions.isXCHMASCTrendsDown && + xEU5Conditions.isXCHMAMCTrendsDown && + xEU5Conditions.isXCHMALCTrendsDown && + xEU5Conditions.isXTDSignalUnderBear && + xEU5Conditions.isXLHPriceUnderSignal && + xEU5Conditions.isXCHMASCFastOverSlow && + xEU5Conditions.isXCHMAMCFastOverSlow && + xEU5Conditions.isXCHMALCFastOverSlow && + xEU5Conditions.isXTDBullCrossedOverBear + // + ) + // + ; + + // + // Funded Next ... + if (isXEU5OnFundedNext && result) + { + // + result = + // + true + // + ; + } + + // + return result; +} + +// +// XOBDLH Short Signal Checking ... +bool XEU5XOBDLHHasShortSignal() +{ + // + bool result = false; + + // + // Validate Args ... + if (!xEU5MXOBDLHEnableSignaller || + !xEU5MXOBDLHAllowShortSignals) + { + return result; + } + + // + double entry = GetEntry(X_SIGNAL_SHORT); + XEU5MarketConditions conditions2 = XEU5GenerateMarketConditions(2); + + // + result = + // + conditions2.isXOBDSwingHigh && + conditions2.isXLHHighAttachedHH && + // + !( + // + xEU5Conditions.isXCHMASCOverMin && + xEU5Conditions.isXCHMASCUnderMin + // + ) + // + && + // + !( + // + xEU5Conditions.isXCHMAMCPeak && + xEU5Conditions.isXCHMAMCTrendsDown && + xEU5Conditions.isXCHMAMCFastUnderSlow + // + ) + // + && + // + !( + // + xEU5Conditions.isXLHHighAttachedHH && + xEU5Conditions.isXCHMASCPeak && + xEU5Conditions.isXCHMASCTrendsUp && + xEU5Conditions.isXCHMASCFastOverSlow + // + ) + // + && + // + !( + // + xEU5Conditions.isXCHMAMCPeak && + ( + // + ( + // + xEU5Conditions.isXCHMAMCTrendsUp && + xEU5Conditions.isXCHMAMCFastOverSlow + // + ) || + ( + // + xEU5Conditions.isXCHMAMCTrendsDown && + xEU5Conditions.isXCHMAMCFastCrossedOverSlow + // + ) + // + ) + // + ) + // + && + // + !( + // + xEU5Conditions.isXCHMASCTrendsUp && + xEU5Conditions.isXCHMAMCTrendsUp && + xEU5Conditions.isXCHMALCTrendsUp && + xEU5Conditions.isXCHMASCFastOverSlow && + xEU5Conditions.isXCHMAMCFastOverSlow && + xEU5Conditions.isXCHMALCFastOverSlow + // + ) + // + && + // + !( + // + xEU5Conditions.isXCHMALCPeak && + xEU5Conditions.isXCHLHSameHHs && + xEU5Conditions.isXCHMALCTrendsUp && + xEU5Conditions.isXCHMALCFastOverSlow + // + ) + // + && + // + !( + // + xEU5Conditions.isXCHMASCPeak && + xEU5Conditions.isXTDBullOverBear && + xEU5Conditions.isXCHLHSCMCHHSame && + xEU5Conditions.isXCHLHMCLCLLSame && + xEU5Conditions.isXCHMASCTrendsUp && + xEU5Conditions.isXTDSignalOverBear && + xEU5Conditions.isXLHLLSameInLength && + xEU5Conditions.isXCHMASCFastOverSlow + // + ) + // + && + // + !( + // + xEU5Conditions.isXTDBullUnderBear && + xEU5Conditions.isXLHHHSameInLength && + xEU5Conditions.isXLHLLSameInLength && + xEU5Conditions.isXTDSignalUnderBear && + xEU5Conditions.isXLHPriceInSignalRange && + xEU5Conditions.isXCHMASCCrossedUnderMax + // + ) + // + && + // + !( + // + xEU5Conditions.isXTMStartBullish && + xEU5Conditions.isXCHMASCTrendsUp && + xEU5Conditions.isXCHMASCFastOverSlow && + xEU5Conditions.isXLHPriceCrossedOverSignal + // + ) + // + && + // + !( + // + xEU5Conditions.isXCHMAMCPeak && + xEU5Conditions.isXCHMALCPeak && + xEU5Conditions.isXCHLHSameHHs && + xEU5Conditions.isXTDBullOverBear && + xEU5Conditions.isXTDSignalOverBear && + xEU5Conditions.isXLHPriceOverSignal + // + ) + // + && + // + !( + // + xEU5Conditions.isXTMBullish && + xEU5Conditions.isXCHMALCVale && + xEU5Conditions.isXCHMASCOverMin && + xEU5Conditions.isXTDBullOverBear && + xEU5Conditions.isXCHLHSCMCHHSame && + xEU5Conditions.isXCHMASCUnderMax && + xEU5Conditions.isXCHMASCTrendsUp && + xEU5Conditions.isXCHMAMCTrendsDown && + xEU5Conditions.isXLHHighAttachedHH && + xEU5Conditions.isXCHMALCTrendsDown && + xEU5Conditions.isXTDSignalUnderBear && + xEU5Conditions.isXLHPriceOverSignal && + xEU5Conditions.isXCHMASCFastOverSlow && + xEU5Conditions.isXCHMAMCFastUnderSlow && + xEU5Conditions.isXCHMALCFastUnderSlow + // + ) + // + && + // + !( + // + xEU5Conditions.isXCHMALCVale && + xEU5Conditions.isXTDBullOverBear && + xEU5Conditions.isXCHMASCOverMin && + xEU5Conditions.isXCHLHMCLCLLSame && + xEU5Conditions.isXCHLHSCMCHHSame && + xEU5Conditions.isXCHMASCUnderMax && + xEU5Conditions.isXLHLLSameInLength && + xEU5Conditions.isXCHMASCTrendsDown && + xEU5Conditions.isXCHMAMCTrendsDown && + xEU5Conditions.isXCHMALCTrendsDown && + xEU5Conditions.isXTDSignalUnderBear && + xEU5Conditions.isXLHPriceOverSignal && + xEU5Conditions.isXCHMASCFastUnderSlow && + xEU5Conditions.isXCHMAMCFastUnderSlow && + xEU5Conditions.isXCHMALCFastUnderSlow + // + ) + // + && + // + !( + // + xEU5Conditions.isXCHMALCVale && + xEU5Conditions.isXCHMASCOverMin && + xEU5Conditions.isXCHLHSCMCHHSame && + xEU5Conditions.isXCHLHMCLCLLSame && + xEU5Conditions.isXCHMASCUnderMax && + xEU5Conditions.isXLHLLSameInLength && + xEU5Conditions.isXCHMASCTrendsDown && + xEU5Conditions.isXCHMAMCTrendsDown && + xEU5Conditions.isXCHMALCTrendsDown && + xEU5Conditions.isXCHMASCFastOverSlow && + xEU5Conditions.isXCHMAMCFastUnderSlow && + xEU5Conditions.isXCHMALCFastUnderSlow && + xEU5Conditions.isXLHPriceCrossedOverSignal + // + ) + // + && + // + !( + // + xEU5Conditions.isXCHMALCVale && + xEU5Conditions.isXCHMALCTrendsDown && + xEU5Conditions.isXCHMALCFastUnderSlow && + xEU5Conditions.isXLHPriceCrossedOverSignal + // + ) + // + && + // + !( + // + xEU5Conditions.isXCHMALCVale && + xEU5Conditions.isXCHMASCPeak && + xEU5Conditions.isXCHMAMCPeak && + xEU5Conditions.isXLHHHIncreased && + xEU5Conditions.isXCHMALCTrendsDown && + xEU5Conditions.isXCHMAMCTrendsDown && + xEU5Conditions.isXCHMALCTrendsDown && + xEU5Conditions.isXCHMASCFastOverSlow && + xEU5Conditions.isXCHMAMCFastOverSlow && + xEU5Conditions.isXCHMALCFastUnderSlow && + xEU5Conditions.isXCHMALCFastUnderSlow && + xEU5Conditions.isXLHPriceCrossedOverSignal + // + ) + // + && + // + !( + // + xEU5Conditions.isXCHMASCPeak && + xEU5Conditions.isXCHMAMCPeak && + xEU5Conditions.isXLHHHIncreased && + xEU5Conditions.isXTDBullOverBear && + xEU5Conditions.isXTDSignalOverBear && + xEU5Conditions.isXLHHHSameInLength && + xEU5Conditions.isXCHMAMCTrendsDown && + xEU5Conditions.isXCHMALCTrendsDown && + xEU5Conditions.isXCHMASCFastOverSlow && + xEU5Conditions.isXCHMAMCFastOverSlow && + xEU5Conditions.isXCHMALCFastUnderSlow + // + ) + // + && + // + !( + // + xEU5Conditions.isXCHMASCPeak && + xEU5Conditions.isXCHMALCVale && + xEU5Conditions.isXCHMASCOverMin && + xEU5Conditions.isXTDBullOverBear && + xEU5Conditions.isXCHMASCUnderMax && + xEU5Conditions.isXCHMASCTrendsUp && + xEU5Conditions.isXTDSignalOverBear && + xEU5Conditions.isXLHLLSameInLength && + xEU5Conditions.isXCHMAMCTrendsDown && + xEU5Conditions.isXCHMALCTrendsDown && + xEU5Conditions.isXLHPriceOverSignal && + xEU5Conditions.isXCHMASCFastOverSlow && + xEU5Conditions.isXCHMAMCFastUnderSlow && + xEU5Conditions.isXCHMALCFastUnderSlow + // + ) + // + && + // + // Funded ... + !( + // + (xEU5Conditions.isXTMBullish && + xEU5Conditions.isXAMABullish && + xEU5Conditions.isXTDBullOverBear && + xEU5Conditions.isXTDSignalOverBear) + // + || + // + (xEU5Conditions.isXTSCurrentMax && + (xEU5Conditions.isXTSCurrentOverFarest || + xEU5Conditions.isXTSCurrentCrossedOverFarest) && + (xEU5Conditions.isXTSCurrentOverNearest || + xEU5Conditions.isXTSCurrentCrossedOverNearest) && + (xEU5Conditions.isXTSCurrentOverMediest || + xEU5Conditions.isXTSCurrentCrossedOverMediest)) + // + || + // + (xEU5Conditions.isXCHLHSCMCHHSame && + xEU5Conditions.isXLHHighAttachedHH && + xEU5Conditions.isXLHLLSameInLength && + xEU5Conditions.isXLHPriceOverSignal) + // + || + // + (xEU5Conditions.isXCHMASCOverMax && + xEU5Conditions.isXCHMASCUnderMax) + // + || + // + ((xEU5Conditions.isXCHMASCFastOverSlow || + xEU5Conditions.isXCHMASCFastCrossedOverSlow) && + (xEU5Conditions.isXCHMALCFastOverSlow || + xEU5Conditions.isXCHMALCFastCrossedOverSlow)) + // + ) + // + ; + + // + // Funded Next ... + if (isXEU5OnFundedNext && result) + { + // + result = + // + true + // + ; + } + + // + return result; +} + +// +// XCHMACC Long Signal Checking ... +bool XEU5XCHMACCHasLongSignal() +{ + // + bool result = false; + + // + // Validate Args ... + if (!xEU5MXCHMACCEnableSignaller || + !xEU5MXCHMACCAllowLongSignals) + { + return result; + } + + // + // Required Data ... + double entry = GetEntry(X_SIGNAL_LONG); + double nearHH = GetHighestHigh(3, 1); + double nearLL = GetLowestLow(3, 1); + + // + bool isSharpChanged = IsSharpIncreasedChanged( + 5, + 1, + xTMMaBuffer); + + // + bool isCandleSharpChanged = IsSharpIncreasedChanged( + 5, + 1, + PRICE_CLOSE); + + // + ENUM_XCHMA_CYCLES cycles[]; + Add( + X_XCHMA_CYCLE_MEDIUM, + cycles); + Add( + X_XCHMA_CYCLE_LONG, + cycles); + + // + double xCHMANonSCMax2 = XCHMAGetCyclesMaxValue(2, cycles); + double xCHMANonSCMin2 = XCHMAGetCyclesMinValue(2, cycles); + + // + double xCHMANonSCMax3 = XCHMAGetCyclesMaxValue(3, cycles); + double xCHMANonSCMin3 = XCHMAGetCyclesMinValue(3, cycles); + + // + result = + // + xCHMAScFastBuffer[1] > xCHMAScSlowBuffer[1] && + xCHMAMcFastBuffer[1] > xCHMAMcSlowBuffer[1] && + xCHMALcFastBuffer[1] > xCHMALcSlowBuffer[1] && + // + xCHMAScFastBuffer[2] > xCHMAScSlowBuffer[2] && + xCHMAMcFastBuffer[2] > xCHMAMcSlowBuffer[2] && + xCHMALcFastBuffer[2] > xCHMALcSlowBuffer[2] && + // + !( + // + xCHMAScFastBuffer[3] > xCHMAScSlowBuffer[3] && + xCHMAMcFastBuffer[3] > xCHMAMcSlowBuffer[3] && + xCHMALcFastBuffer[3] > xCHMALcSlowBuffer[3] + // + ) + // + && + // + ( + // + XCHMAIsSCFastCrossedOverSlow(2) + ? XCHMAGetSCTrendPower(1) <= (XCHMAGetSCTrendPower(2) * 2) + : true + // + ) + // + && + // + ( + // + xEU5Conditions.isXCHMASCOverMax + ? XCHMAGetSCTrendPower(2) <= (xCHMANonSCMax2 - xCHMANonSCMin2) + : true + // + ) + // + && + // + !xEU5Conditions.isXCHMAMCTrendsDown + // + && + // + ( + // + xEU5Conditions.isXCHMASCCrossedOverMax || xEU5Conditions.isXLHPriceOverSignal + ? !isCandleSharpChanged + : true + // + ) + // + && + // + !( + // + xEU5Conditions.isXCHMAMCPeak && + xEU5Conditions.isXCHMALCPeak + // + ) + // + && + // + ( + // + xEU5Conditions.isXLHHighAttachedHH && + xEU5Conditions.isXLHHHSameInLength && + xEU5Conditions.isXLHLLSameInLength + ? entry < nearHH + : true + // + ) + // + && + // + ( + // + xEU5Conditions.isXCHMASCOverMax && + xEU5Conditions.isXCHMASCFastOverSlow + ? !xEU5Conditions.isXCHMASCTrendsDown + : true) + // + && + // + !( + // + xEU5Conditions.isXCHMALCPeak && + xEU5Conditions.isXCHMASCOverMax && + xEU5Conditions.isXCHMASCOverMin && + xEU5Conditions.isXTDBullOverBear && + xEU5Conditions.isXCHMASCTrendsUp && + xEU5Conditions.isXCHMAMCTrendsUp && + xEU5Conditions.isXCHMALCTrendsUp && + xEU5Conditions.isXLHHighAttachedHH && + xEU5Conditions.isXLHLLSameInLength && + xEU5Conditions.isXTDSignalUnderBear && + xEU5Conditions.isXLHPriceOverSignal && + xEU5Conditions.isXCHMASCFastOverSlow && + xEU5Conditions.isXCHMAMCFastOverSlow && + xEU5Conditions.isXCHMALCFastOverSlow + // + ) + // + && + // + !( + // + xEU5Conditions.isXLHLLIncreased && + xEU5Conditions.isXCHMASCOverMax && + xEU5Conditions.isXCHMASCOverMin && + xEU5Conditions.isXCHLHSCMCHHSame && + xEU5Conditions.isXCHMAMCTrendsUp && + xEU5Conditions.isXCHMALCTrendsUp && + xEU5Conditions.isXTDBullUnderBear && + xEU5Conditions.isXLHHighAttachedHH && + xEU5Conditions.isXTDSignalUnderBear && + xEU5Conditions.isXLHPriceOverSignal && + xEU5Conditions.isXCHMASCFastOverSlow && + xEU5Conditions.isXCHMAMCFastOverSlow && + xEU5Conditions.isXCHMALCFastOverSlow + // + ) + // + ; + + // + // Funded Next ... + if (isXEU5OnFundedNext && result) + { + // + result = + // + true + // + ; + } + + // + return result; +} + +// +// XCHMACC Short Signal Checking ... +bool XEU5XCHMACCHasShortSignal() +{ + // + bool result = false; + + // + // Validate Args ... + if (!xEU5MXCHMACCEnableSignaller || + !xEU5MXCHMACCAllowShortSignals) + { + return result; + } + + // + result = + // + xCHMAScFastBuffer[1] < xCHMAScSlowBuffer[1] && + xCHMAMcFastBuffer[1] < xCHMAMcSlowBuffer[1] && + xCHMALcFastBuffer[1] < xCHMALcSlowBuffer[1] && + // + xCHMAScFastBuffer[2] < xCHMAScSlowBuffer[2] && + xCHMAMcFastBuffer[2] < xCHMAMcSlowBuffer[2] && + xCHMALcFastBuffer[2] < xCHMALcSlowBuffer[2] && + // + !( + // + xCHMAScFastBuffer[3] < xCHMAScSlowBuffer[3] && + xCHMAMcFastBuffer[3] < xCHMAMcSlowBuffer[3] && + xCHMALcFastBuffer[3] < xCHMALcSlowBuffer[3] + // + ) + // + && + // + !( + // + ( + // + !xEU5Conditions.isXCHMASCTrendsUp && + !xEU5Conditions.isXCHMASCTrendsDown + // + ) + // + || + // + ( + // + !xEU5Conditions.isXCHMAMCTrendsUp && + !xEU5Conditions.isXCHMAMCTrendsDown + // + ) + // + ) + // + && + // + !( + // + xEU5Conditions.isXCHMASCOverMin && + xEU5Conditions.isXCHMASCUnderMin + // + ) + // + && + // + !( + // + xEU5Conditions.isXCHLHSameLLs && + xEU5Conditions.isXLHLowAttachedLL && + xEU5Conditions.isXLHPriceUnderSignal + // + ) + // + && + // + !( + // + xEU5Conditions.isXCHMALCVale && + xEU5Conditions.isXLHLowAttachedLL && + xEU5Conditions.isXCHMALCFastUnderSlow && + ( + // + !xEU5Conditions.isXCHMALCTrendsUp && + !xEU5Conditions.isXCHMALCTrendsDown + // + ) + // + ) + // + && + // + !( + // + xEU5Conditions.isXTDBullUnderBear && + xEU5Conditions.isXLHHHSameInLength && + xEU5Conditions.isXLHLLSameInLength && + xEU5Conditions.isXLHPriceInSignalRange + // + ) + // + && + // + !( + // + xEU5Conditions.isXCHMALCVale && + xEU5Conditions.isXLHHHSameInLength && + xEU5Conditions.isXLHLLSameInLength && + xEU5Conditions.isXCHMALCTrendsDown && + xEU5Conditions.isXCHMALCFastUnderSlow + // + ) + // + && + // + !( + // + xEU5Conditions.isXCHMAMCVale && + xEU5Conditions.isXCHMALCVale && + xEU5Conditions.isXCHMAMCFastUnderSlow && + xEU5Conditions.isXCHMALCFastUnderSlow + // + ) + // + && + // + !( + // + xEU5Conditions.isXCHMALCVale && + xEU5Conditions.isXTDSignalVale && + xEU5Conditions.isXTDBullishVale && + xEU5Conditions.isXCHMALCTrendsUp && + xEU5Conditions.isXCHMALCFastUnderSlow + // + ) + // + && + // + !( + // + xEU5Conditions.isXTMVale && + xEU5Conditions.isXTDSignalVale && + xEU5Conditions.isXTDBullishVale + // + ) + // + && + // + !( + // + xEU5Conditions.isXCHMASCTrendsDown && + xEU5Conditions.isXCHMAMCTrendsDown && + xEU5Conditions.isXCHMALCTrendsDown && + xEU5Conditions.isXCHMASCFastUnderSlow && + xEU5Conditions.isXCHMAMCFastUnderSlow && + xEU5Conditions.isXCHMALCFastUnderSlow + // + ) + // + && + // + !( + // + xEU5Conditions.isXCHMALCVale && + xEU5Conditions.isXCHMALCTrendsUp && + xEU5Conditions.isXLHPriceUnderSignal && + xEU5Conditions.isXCHMALCFastUnderSlow + // + ) + // + && + // + !( + // + xEU5Conditions.isXCHMASCPeak && + xEU5Conditions.isXLHHHSameInLength && + xEU5Conditions.isXLHLLSameInLength && + xEU5Conditions.isXCHMASCTrendsDown && + xEU5Conditions.isXCHMASCFastUnderSlow + // + ) + // + && + // + !( + // + xEU5Conditions.isXCHMALCVale && + xEU5Conditions.isXCHMAMCTrendsDown && + xEU5Conditions.isXCHMALCTrendsDown && + xEU5Conditions.isXCHMAMCFastUnderSlow && + xEU5Conditions.isXCHMALCFastUnderSlow + // + ) + // + && + // + !( + // + xEU5Conditions.isXLHHHSameInLength && + xEU5Conditions.isXLHLLSameInLength && + xEU5Conditions.isXCHMASCTrendsDown && + xEU5Conditions.isXCHMASCFastUnderSlow && + xEU5Conditions.isXTMStartBullishAfterNeutural + // + ) + // + && + // + !( + // + xEU5Conditions.isXCHMALCVale && + xEU5Conditions.isXCHMALCTrendsUp && + xEU5Conditions.isXLHHHSameInLength && + xEU5Conditions.isXLHLLSameInLength && + xEU5Conditions.isXCHMALCFastUnderSlow && + xEU5Conditions.isXTMEndBullishByNeutural && + xEU5Conditions.isXTDSignalCrossedUnderBear + // + ) + // + && + // + !( + // + xEU5Conditions.isXCHMALCVale && + xEU5Conditions.isXTDSignalVale && + xEU5Conditions.isXTDBullishVale && + xEU5Conditions.isXTDBullUnderBear && + xEU5Conditions.isXLHLowAttachedLL && + xEU5Conditions.isXLHHHSameInLength && + xEU5Conditions.isXCHMALCTrendsDown && + xEU5Conditions.isXCHMALCFastUnderSlow + // + ) + // + && + // + !( + // + xEU5Conditions.isXCHLHSCMCLLSame && + xEU5Conditions.isXCHMASCUnderMax && + xEU5Conditions.isXCHMASCUnderMin && + xEU5Conditions.isXCHMASCTrendsUp && + xEU5Conditions.isXCHMAMCTrendsUp && + xEU5Conditions.isXCHMALCTrendsUp && + xEU5Conditions.isXTDBullUnderBear && + xEU5Conditions.isXTDSignalUnderBear && + xEU5Conditions.isXLHPriceUnderSignal && + xEU5Conditions.isXCHMASCFastUnderSlow && + xEU5Conditions.isXCHMAMCFastUnderSlow && + xEU5Conditions.isXCHMALCFastUnderSlow + // + ) + // + && + // + !( + // + xEU5Conditions.isXCHMALCVale && + xEU5Conditions.isXLHHHIncreased && + xEU5Conditions.isXLHHHSameInLength && + xEU5Conditions.isXLHLLSameInLength && + xEU5Conditions.isXLHPriceInSignalRange + // + ) + // + && + // + !( + // + xEU5Conditions.isXCHMALCVale && + xEU5Conditions.isXCHMAMCTrendsUp && + xEU5Conditions.isXLHLowAttachedLL && + xEU5Conditions.isXCHMASCTrendsDown && + xEU5Conditions.isXCHMALCTrendsDown && + xEU5Conditions.isXCHMASCFastUnderSlow && + xEU5Conditions.isXCHMAMCFastUnderSlow && + xEU5Conditions.isXCHMALCFastUnderSlow + // + ) + // + && + // + !( + // + xEU5Conditions.isXCHMASCUnderMax && + xEU5Conditions.isXCHMASCUnderMin && + xEU5Conditions.isXCHMASCTrendsDown && + xEU5Conditions.isXCHMALCTrendsDown && + xEU5Conditions.isXLHHHSameInLength && + xEU5Conditions.isXCHMASCFastUnderSlow && + xEU5Conditions.isXCHMALCFastUnderSlow && + xEU5Conditions.isXTMEndBearishByNeutural + // + ) + // + && + // + !( + // + xEU5Conditions.isXTDSignalVale && + xEU5Conditions.isXTDBullishVale && + xEU5Conditions.isXCHMASCUnderMin && + xEU5Conditions.isXLHLLSameInLength && + xEU5Conditions.isXCHMAMCTrendsDown && + xEU5Conditions.isXLHPriceUnderSignal && + xEU5Conditions.isXCHMAMCFastUnderSlow && + xEU5Conditions.isXCHMASCCrossedUnderMin + // + ) + // + && + // + !( + // + xEU5Conditions.isXTMVale && + xEU5Conditions.isXCHMALCVale && + xEU5Conditions.isXTDBullUnderBear && + xEU5Conditions.isXCHMALCTrendsDown && + xEU5Conditions.isXTDSignalUnderBear && + xEU5Conditions.isXCHMALCFastUnderSlow + // + ) + // + && + // + !( + // + xEU5Conditions.isXTDBullUnderBear && + xEU5Conditions.isXLHHHSameInLength && + xEU5Conditions.isXLHLLSameInLength && + xEU5Conditions.isXCHMAMCTrendsDown && + xEU5Conditions.isXCHMALCTrendsDown && + xEU5Conditions.isXTDSignalUnderBear && + xEU5Conditions.isXLHPriceOverSignal && + xEU5Conditions.isXCHMAMCFastUnderSlow && + xEU5Conditions.isXCHMALCFastUnderSlow + // + ) + // + && + // + !( + // + xEU5Conditions.isXCHMALCVale && + xEU5Conditions.isXTDBullOverBear && + xEU5Conditions.isXCHMALCTrendsUp && + xEU5Conditions.isXTDSignalUnderBear && + xEU5Conditions.isXCHMALCFastUnderSlow && + xEU5Conditions.isXTMEndBearishByNeutural + // + ) + // + && + // + !( + // + xEU5Conditions.isXLHHHSameInLength && + xEU5Conditions.isXCHMASCTrendsDown && + xEU5Conditions.isXCHMAMCTrendsDown && + xEU5Conditions.isXLHPriceOverSignal && + xEU5Conditions.isXTDSignalUnderBear && + xEU5Conditions.isXCHMASCFastUnderSlow && + xEU5Conditions.isXCHMAMCFastUnderSlow && + xEU5Conditions.isXTDBullCrossedUnderBear + // + ) + // + && + // + !( + // + xEU5Conditions.isXCHMAMCPeak && + xEU5Conditions.isXCHMASCTrendsUp && + xEU5Conditions.isXLHHHSameInLength && + xEU5Conditions.isXLHLLSameInLength && + xEU5Conditions.isXLHPriceOverSignal && + xEU5Conditions.isXCHMASCFastUnderSlow && + xEU5Conditions.isXTMStartBullishAfterNeutural + // + ) + // + && + // + !( + // + xEU5Conditions.isXCHMALCVale && + xEU5Conditions.isXCHMASCOverMin && + xEU5Conditions.isXCHMASCUnderMax && + xEU5Conditions.isXCHMALCTrendsUp && + xEU5Conditions.isXTDBullOverBear && + xEU5Conditions.isXLHHHSameInLength && + xEU5Conditions.isXLHLLSameInLength && + xEU5Conditions.isXCHMASCTrendsDown && + xEU5Conditions.isXCHMAMCTrendsDown && + xEU5Conditions.isXTDSignalUnderBear && + xEU5Conditions.isXCHMASCFastUnderSlow && + xEU5Conditions.isXCHMAMCFastUnderSlow && + xEU5Conditions.isXCHMALCFastUnderSlow + // + ) + // + && + // + !( + // + xEU5Conditions.isXCHMALCVale && + xEU5Conditions.isXCHMAMCTrendsDown && + xEU5Conditions.isXCHMAMCFastUnderSlow + // + ) + // + && + // + !( + // + xEU5Conditions.isXTMBearish && + xEU5Conditions.isXCHMASCOverMin && + xEU5Conditions.isXTDBullOverBear && + xEU5Conditions.isXCHMASCUnderMax && + xEU5Conditions.isXCHMALCTrendsUp && + xEU5Conditions.isXLHHHSameInLength && + xEU5Conditions.isXLHLLSameInLength && + xEU5Conditions.isXCHMASCTrendsDown && + xEU5Conditions.isXCHMAMCTrendsDown && + xEU5Conditions.isXTDSignalUnderBear && + xEU5Conditions.isXLHPriceInSignalRange && + xEU5Conditions.isXCHMASCFastUnderSlow && + xEU5Conditions.isXCHMAMCFastUnderSlow && + xEU5Conditions.isXCHMALCFastUnderSlow + // + ) + // + && + // + !( + // + xEU5Conditions.isXTMBearish && + xEU5Conditions.isXCHMALCVale && + xEU5Conditions.isXCHMASCUnderMax && + xEU5Conditions.isXCHMASCUnderMin && + xEU5Conditions.isXCHMAMCTrendsUp && + xEU5Conditions.isXCHMALCTrendsDown && + xEU5Conditions.isXTDSignalUnderBear && + xEU5Conditions.isXCHMAMCFastUnderSlow && + xEU5Conditions.isXCHMALCFastUnderSlow + // + ) + // + && + // + !( + // + (xEU5Conditions.isXTMEndBearish && + xEU5Conditions.isXCHLHSCMCLLSame && + xEU5Conditions.isXCHMAMCTrendsDown && + xEU5Conditions.isXLHPriceUnderSignal) + // + ) + // + && + // + // Funded ... + !( + // + (xEU5Conditions.isXTMVale && + (xEU5Conditions.isXTMBearish || + xEU5Conditions.isXTMStartBearish) && + xEU5Conditions.isXAMAVale && + xEU5Conditions.isXCHMASCVale && + xEU5Conditions.isXLHHHSameInLength && + xEU5Conditions.isXLHPriceUnderSignal) + // + || + // + (xEU5Conditions.isXTMNeutural && + xEU5Conditions.isXFIOverZero && + xEU5Conditions.isXAMANeutural && + xEU5Conditions.isXTDBullOverBear) + // + || + // + (xEU5Conditions.isXLHHHSameInLength && + xEU5Conditions.isXLHLLSameInLength && + xEU5Conditions.isXLHPriceOverSignal) + // + ) + // + ; + + // + // Funded Next ... + if (isXEU5OnFundedNext && result) + { + // + result = + // + true + // + ; + } + + // + return result; +} + +// +// XCHMACMN Long Signal Checking ... +bool XEU5XCHMACMNHasLongSignal() +{ + // + bool result = false; + + // + // Validate Args ... + if (!xEU5MXCHMACMNEnableSignaller || + !xEU5MXCHMACMNAllowLongSignals) + { + return result; + } + + // + // Required Data ... + double entry = GetEntry(X_SIGNAL_LONG); + double nearHH = GetHighestHigh(3, 1); + double nearLL = GetLowestLow(3, 1); + + // + ENUM_XCHMA_CYCLES cycles[]; + Add( + X_XCHMA_CYCLE_MEDIUM, + cycles); + Add( + X_XCHMA_CYCLE_LONG, + cycles); + + // + double xCHMANonSCMax2 = XCHMAGetCyclesMaxValue(2, cycles); + double xCHMANonSCMin2 = XCHMAGetCyclesMinValue(2, cycles); + + // + result = + // + xEU5Conditions.isXCHMASCCrossedOverMin && + xCHMAScFastBuffer[2] < xCHMANonSCMin2 && + xCHMAScSlowBuffer[2] < xCHMANonSCMin2 && + // + ( + // + xEU5Conditions.isXCHMASCOverMin && + xEU5Conditions.isXCHMASCUnderMax + ? !( + // + XCHMAGetCycleMaxValue(1, X_XCHMA_CYCLE_MEDIUM) < XCHMAGetCycleMaxValue(1, X_XCHMA_CYCLE_LONG) && + XCHMAGetCycleMinValue(1, X_XCHMA_CYCLE_MEDIUM) > XCHMAGetCycleMinValue(1, X_XCHMA_CYCLE_LONG) + // + ) + : true + // + ) + // + && + // + !( + // + xEU5Conditions.isXCHMALCVale && + xEU5Conditions.isXLHHighAttachedHH + // + ) + // + && + // + ( + // + xEU5Conditions.isXCHMALCVale && + xEU5Conditions.isXCHMAMCTrendsDown && + xEU5Conditions.isXCHMAMCFastOverSlow && + xEU5Conditions.isXCHMALCFastUnderSlow + ? !xEU5Conditions.isXLHPriceInSignalRange + : true + // + ) + // + && + // + !( + // + xEU5Conditions.isXCHLHSCMCHHSame && + xEU5Conditions.isXLHHighAttachedHH && + xEU5Conditions.isXLHPriceOverSignal + // + ) + // + && + // + !( + // + xEU5Conditions.isXCHMALCVale && + xEU5Conditions.isXCHMAMCTrendsDown && + xEU5Conditions.isXCHMALCTrendsDown && + xEU5Conditions.isXCHMAMCFastUnderSlow && + xEU5Conditions.isXCHMALCFastUnderSlow + // + ) + // + && + // + !( + // + xEU5Conditions.isXCHMAMCVale && + xEU5Conditions.isXCHMALCVale && + xEU5Conditions.isXCHMAMCTrendsDown && + xEU5Conditions.isXCHMALCTrendsDown + // + ) + // + && + // + !( + // + xEU5Conditions.isXTDBullOverBear && + xEU5Conditions.isXCHLHSCMCHHSame && + xEU5Conditions.isXCHLHSCMCLLSame && + xEU5Conditions.isXRSICrossedOverLongExit + // + ) + // + && + // + !( + // + xEU5Conditions.isXLHHHSameInLength && + xEU5Conditions.isXLHLLSameInLength && + xEU5Conditions.isXCHMAMCTrendsDown && + xEU5Conditions.isXCHMALCTrendsDown && + xEU5Conditions.isXCHMAMCFastOverSlow && + xEU5Conditions.isXCHMALCFastUnderSlow + // + ) + // + && + // + !( + // + xEU5Conditions.isXTDBearishVale && + xEU5Conditions.isXTDBullOverBear && + xEU5Conditions.isXLHHHSameInLength && + xEU5Conditions.isXLHLLSameInLength && + xEU5Conditions.isXCHMAMCTrendsDown && + xEU5Conditions.isXCHMAMCFastOverSlow && + xEU5Conditions.isXCHMALCVale && + xEU5Conditions.isXCHMALCTrendsDown && + xEU5Conditions.isXCHMALCFastUnderSlow + // + ) + // + && + // + !( + // + xEU5Conditions.isXCHMAMCTrendsDown && + xEU5Conditions.isXCHMALCTrendsDown && + xEU5Conditions.isXCHMAMCFastOverSlow && + xEU5Conditions.isXCHMALCFastOverSlow + // + ) + // + && + !( + // + xEU5Conditions.isXCHMALCVale && + xEU5Conditions.isXCHMAMCTrendsDown && + xEU5Conditions.isXCHMALCTrendsDown && + xEU5Conditions.isXCHMAMCFastOverSlow && + xEU5Conditions.isXCHMALCFastUnderSlow + // + ) + // + && + // + !( + // + xEU5Conditions.isXTDBullOverBear && + xEU5Conditions.isXCHLHMCLCHHSame && + xEU5Conditions.isXCHLHMCLCLLSame && + xEU5Conditions.isXCHMASCTrendsUp && + xEU5Conditions.isXLHLLSameInLength && + xEU5Conditions.isXLHHHSameInLength && + xEU5Conditions.isXCHMALCTrendsDown && + xEU5Conditions.isXTDSignalUnderBear && + xEU5Conditions.isXLHPriceOverSignal && + xEU5Conditions.isXCHMALCFastUnderSlow && + xEU5Conditions.isXCHMASCFastCrossedOverSlow + // + ) + // + && + // + !( + // + xEU5Conditions.isXTMBullish && + xEU5Conditions.isXCHMAMCVale && + xEU5Conditions.isXCHMALCVale && + xEU5Conditions.isXCHMALCTrendsUp && + xEU5Conditions.isXLHHHSameInLength && + xEU5Conditions.isXLHLLSameInLength && + xEU5Conditions.isXCHMAMCTrendsDown && + xEU5Conditions.isXTDSignalUnderBear && + xEU5Conditions.isXLHPriceOverSignal && + xEU5Conditions.isXCHMASCCrossedOverMin && + xEU5Conditions.isXCHMAMCFastUnderSlow && + xEU5Conditions.isXCHMALCFastUnderSlow + // + ) + // + && + // + !( + // + xEU5Conditions.isXTMBullish && + xEU5Conditions.isXCHMALCTrendsDown && + xEU5Conditions.isXTDSignalUnderBear && + xEU5Conditions.isXCHMALCFastOverSlow && + xEU5Conditions.isXCHMASCCrossedOverMin && + xEU5Conditions.isXLHPriceCrossedOverSignal + // + ) + // + && + // + !( + // + xEU5Conditions.isXCHMASCOverMin && + (xEU5Conditions.isXCHLHMCLCHHSame || + xEU5Conditions.isXCHLHMCLCLLSame) && + xEU5Conditions.isXCHMASCUnderMax && + xEU5Conditions.isXCHMASCTrendsUp && + xEU5Conditions.isXCHMAMCTrendsUp && + xEU5Conditions.isXLHHHSameInLength && + xEU5Conditions.isXCHMALCTrendsDown && + xEU5Conditions.isXLHLLSameInLength && + xEU5Conditions.isXCHMAMCFastOverSlow && + xEU5Conditions.isXCHMALCFastUnderSlow && + xEU5Conditions.isXCHMASCCrossedOverMin && + xEU5Conditions.isXCHMASCFastCrossedOverSlow + // + ) + // + && + // + !( + // + xEU5Conditions.isXLHLLSameInLength && + xEU5Conditions.isXLHPriceOverSignal && + (xEU5Conditions.isXCHMAMCVale && + (xEU5Conditions.isXCHMAMCFastUnderSlow || + xEU5Conditions.isXCHMAMCFastCrossedUnderSlow)) && + (xEU5Conditions.isXCHMALCVale && + (xEU5Conditions.isXCHMALCFastUnderSlow || + xEU5Conditions.isXCHMALCFastCrossedUnderSlow)) + // + ) + // + && + // + // Funded ... + !( + // + (xEU5Conditions.isXTMNeutural && + xEU5Conditions.isXAMANeutural && + xEU5Conditions.isXTSCurrentMax && + xEU5Conditions.isXAMAEndBearish && + xEU5Conditions.isXCHLHSCMCLLSame && + xEU5Conditions.isXTDBullUnderBear && + xEU5Conditions.isXLHHHSameInLength && + xEU5Conditions.isXTDSignalUnderBear && + xEU5Conditions.isXLHPriceUnderSignal) + // + || + // + (xEU5Conditions.isXCHMAMCVale && + (xEU5Conditions.isXCHMASCFastUnderSlow || + xEU5Conditions.isXCHMASCFastCrossedUnderSlow) && + (xEU5Conditions.isXCHMAMCFastUnderSlow || + xEU5Conditions.isXCHMAMCFastCrossedUnderSlow)) + // + || + // + ( + // + xEU5Conditions.isXOBDSwingLow + // + || + // + (xEU5Conditions.isXTMNeutural && + xEU5Conditions.isXAMANeutural && + xEU5Conditions.isXTDSignalUnderBear && + xEU5Conditions.isXTDBullCrossedOverBear) + // + || + // + (xEU5Conditions.isXCHLHSCMCHHSame && + xEU5Conditions.isXCHLHSCMCLLSame && + xEU5Conditions.isXLHHighAttachedHH && + xEU5Conditions.isXLHPriceInSignalRange) + // + || + // + ((xEU5Conditions.isXCHMASCFastUnderSlow || + xEU5Conditions.isXCHMASCFastCrossedUnderSlow) && + (xEU5Conditions.isXCHMAMCFastUnderSlow || + xEU5Conditions.isXCHMAMCFastCrossedUnderSlow)) + // + ) + // + ) + // + ; + + // + // Funded Next ... + if (isXEU5OnFundedNext && result) + { + // + result = + // + true + // + ; + } + + // + return result; +} + +// +// XCHMACMN Short Signal Checking ... +bool XEU5XCHMACMNHasShortSignal() +{ + // + bool result = false; + + // + // Validate Args ... + if (!xEU5MXCHMACMNEnableSignaller || + !xEU5MXCHMACMNAllowShortSignals) + { + return result; + } + + // + ENUM_XCHMA_CYCLES cycles[]; + Add( + X_XCHMA_CYCLE_MEDIUM, + cycles); + Add( + X_XCHMA_CYCLE_LONG, + cycles); + + // + double xCHMANonSCMin2 = XCHMAGetCyclesMinValue(2, cycles); + double xCHMANonSCMin3 = XCHMAGetCyclesMinValue(3, cycles); + + // + result = + // + xEU5Conditions.isXCHMASCCrossedUnderMin && + xCHMAScFastBuffer[2] > xCHMANonSCMin2 && + xCHMAScSlowBuffer[2] > xCHMANonSCMin2 + // + && + // + !( + // + ( + // + xEU5Conditions.isXCHMASCFastCrossedOverSlow || + ( + // + xEU5Conditions.isXCHMASCTrendsUp && + xEU5Conditions.isXCHMASCFastOverSlow + // + ) + // + ) && + ( + // + xEU5Conditions.isXCHMAMCFastCrossedOverSlow || + ( + // + xEU5Conditions.isXCHMAMCTrendsUp && + xEU5Conditions.isXCHMAMCFastOverSlow + // + ) + // + ) && + ( + // + xEU5Conditions.isXCHMALCFastCrossedOverSlow || + ( + // + xEU5Conditions.isXCHMALCTrendsUp && + xEU5Conditions.isXCHMALCFastOverSlow + // + ) + // + ) + // + ) + // + && + // + !( + // + xEU5Conditions.isXCHMAMCVale && + xEU5Conditions.isXCHMALCVale + // + ) + // + && + // + !( + // + xEU5Conditions.isXCHMALCVale && + xEU5Conditions.isXCHMALCFastUnderSlow && + // + ( + // + ( + // + xEU5Conditions.isXCHMAMCTrendsDown && + xEU5Conditions.isXLHPriceUnderSignal && + xEU5Conditions.isXCHMAMCFastUnderSlow + // + ) || + ( + // + xEU5Conditions.isXTDBullUnderBear && + xEU5Conditions.isXLHHHSameInLength && + xEU5Conditions.isXTDSignalUnderBear && + xEU5Conditions.isXCHMAMCFastOverSlow + // + ) + // + ) + // + ) + // + && + // + !( + // + xEU5Conditions.isXTMBearish && + xEU5Conditions.isXTDBullUnderBear && + xEU5Conditions.isXLHLowAttachedLL && + xEU5Conditions.isXCHMAMCTrendsDown && + xEU5Conditions.isXCHMAMCFastOverSlow + // + ) + // + && + // + !( + // + xEU5Conditions.isXCHMAMCTrendsDown && + xEU5Conditions.isXLHPriceUnderSignal && + xEU5Conditions.isXCHMAMCFastUnderSlow && + xEU5Conditions.isXTDBullCrossedUnderBear + // + ) + // + && + // + !( + // + xEU5Conditions.isXLHHHSameInLength && + xEU5Conditions.isXLHLLSameInLength && + xEU5Conditions.isXLHPriceInSignalRange + // + ) + // + && + // + !( + // + ( + // + xEU5Conditions.isXCHMASCVale || + xEU5Conditions.isXCHMAMCVale + // + ) + // + && + xEU5Conditions.isXLHPriceUnderSignal && + xEU5Conditions.isXTDBullUnderBear && + xEU5Conditions.isXTDSignalUnderBear && + ( + // + ( + // + xEU5Conditions.isXTMVale && + xEU5Conditions.isXLHHHSameInLength && + xEU5Conditions.isXLHLLSameInLength + // + ) || + ( + // + xEU5Conditions.isXLHLowAttachedLL && + xEU5Conditions.isXCHMALCTrendsDown && + xEU5Conditions.isXCHMALCFastOverSlow + // + ) + // + ) + // + ) + // + && + // + !( + // + xEU5Conditions.isXCHMASCVale && + xEU5Conditions.isXCHMAMCVale && + xEU5Conditions.isXTDBullUnderBear && + xEU5Conditions.isXTDSignalUnderBear && + xEU5Conditions.isXLHHHSameInLength && + xEU5Conditions.isXLHLLSameInLength + // + ) + // + && + // + !( + // + xEU5Conditions.isXTMBullish && + xEU5Conditions.isXCHMASCPeak && + xEU5Conditions.isXCHMALCVale && + xEU5Conditions.isXLHHHDecreased && + xEU5Conditions.isXCHMALCTrendsUp && + xEU5Conditions.isXLHHHSameInLength && + xEU5Conditions.isXLHLLSameInLength && + xEU5Conditions.isXCHMAMCTrendsDown && + xEU5Conditions.isXCHMAMCFastUnderSlow && + xEU5Conditions.isXCHMALCFastUnderSlow + // + ) + // + && + // + // Funded ... + !( + // + (xEU5Conditions.isXAMAVale && + xEU5Conditions.isXCHMAMCVale && + xEU5Conditions.isXTDBullOverBear) + // + || + // + ((xEU5Conditions.isXLHHHSameInLength && + xEU5Conditions.isXLHLLSameInLength) && + (xEU5Conditions.isXCHLHMCLCHHSame && + xEU5Conditions.isXCHLHMCLCLLSame) && + (xEU5Conditions.isXCHMALCFastOverSlow || + xEU5Conditions.isXCHMALCFastCrossedOverSlow)) + // + ) + // + ; + + // + // Funded Next ... + if (isXEU5OnFundedNext && result) + { + // + result = + // + true + // + ; + } + + // + return result; +} + +// +// XCHMACMX Long Signal Checking ... +bool XEU5XCHMACMXHasLongSignal() +{ + // + bool result = false; + + // + // Validate Args ... + if (!xEU5MXCHMACMXEnableSignaller || + !xEU5MXCHMACMXAllowLongSignals) + { + return result; + } + + // + // Required Data ... + double entry = GetEntry(X_SIGNAL_LONG); + double nearHH = GetHighestHigh(3, 1); + double nearLL = GetLowestLow(3, 1); + + // + ENUM_XCHMA_CYCLES cycles[]; + Add( + X_XCHMA_CYCLE_MEDIUM, + cycles); + Add( + X_XCHMA_CYCLE_LONG, + cycles); + + // + double xCHMANonSCMax2 = XCHMAGetCyclesMaxValue(2, cycles); + + // + result = + // + xEU5Conditions.isXCHMASCCrossedOverMax && + xCHMAScFastBuffer[2] < xCHMANonSCMax2 && + xCHMAScSlowBuffer[2] < xCHMANonSCMax2 && + MathAbs(xCHMANonSCMax2 - xCHMAScFastBuffer[2]) > MathAbs(xCHMAScFastBuffer[2] - xCHMAScSlowBuffer[2]) && + MathAbs(xCHMANonSCMax2 - xCHMAScSlowBuffer[2]) > MathAbs(xCHMAScFastBuffer[2] - xCHMAScSlowBuffer[2]) + // + && + // + !( + // + xEU5Conditions.isXLHPriceInSignalRange && + xEU5Conditions.isXLHHighAttachedHH + // + ) + // + && + // + !( + // + xEU5Conditions.isXCHMAMCPeak && + xEU5Conditions.isXCHMALCPeak + // + ) + // + && + // + !( + // + xEU5Conditions.isXCHLHSameHHs && + xEU5Conditions.isXCHMALCTrendsDown && + xEU5Conditions.isXLHHighAttachedHH && + xEU5Conditions.isXCHMALCFastUnderSlow + // + ) + // + && + // + ( + // + xEU5Conditions.isXCHLHSCMCHHSame && + xEU5Conditions.isXCHLHMCOnTopOfLC && + xEU5Conditions.isXLHHighAttachedHH && + xEU5Conditions.isXLHLLSameInLength + ? entry < nearHH + : true + // + ) + // + && + // + !( + // + xEU5Conditions.isXTMBullish && + xEU5Conditions.isXCHMALCPeak && + xEU5Conditions.isXCHMASCOverMax && + xEU5Conditions.isXCHMASCOverMin && + xEU5Conditions.isXLHHighAttachedHH && + xEU5Conditions.isXCHMASCTrendsDown && + xEU5Conditions.isXCHMAMCTrendsDown && + xEU5Conditions.isXCHMALCTrendsDown && + xEU5Conditions.isXCHMASCFastOverSlow && + xEU5Conditions.isXCHMALCFastOverSlow && + xEU5Conditions.isXCHMAMCFastUnderSlow && + xEU5Conditions.isXCHMASCCrossedOverMax && + xEU5Conditions.isXTDSignalCrossedOverBear + // + ) && + // + !( + // + (xEU5Conditions.isXCHMAMCPeak && + xEU5Conditions.isXLHHHDecreased && + xEU5Conditions.isXCHMASCOverMax && + xEU5Conditions.isXCHMASCOverMin && + xEU5Conditions.isXLHHHSameInLength && + xEU5Conditions.isXLHLLSameInLength && + xEU5Conditions.isXCHMASCTrendsDown && + xEU5Conditions.isXCHMAMCTrendsDown && + xEU5Conditions.isXCHMALCTrendsDown && + xEU5Conditions.isXCHMAMCFastOverSlow && + xEU5Conditions.isXCHMASCFastUnderSlow && + xEU5Conditions.isXCHMALCFastUnderSlow && + xEU5Conditions.isXCHMASCCrossedOverMax && + xEU5Conditions.isXLHPriceCrossedOverSignal) + // + || + // + (xEU5Conditions.isXCHLHMCLCLLSame && + xEU5Conditions.isXLHLLSameInLength && + xEU5Conditions.isXLHPriceOverSignal) + // + || + // + (xEU5Conditions.isXCHMASCPeak && + xEU5Conditions.isXCHMASCTrendsDown && + xEU5Conditions.isXCHMALCPeak && + xEU5Conditions.isXCHMALCTrendsDown) + // + ) + // + ; + + // + // Funded Next ... + if (isXEU5OnFundedNext && result) + { + // + result = + // + true + // + ; + } + + // + return result; +} + +// +// XCHMACMX Short Signal Checking ... +bool XEU5XCHMACMXHasShortSignal() +{ + // + bool result = false; + + // + // Validate Args ... + if (!xEU5MXCHMACMXEnableSignaller || + !xEU5MXCHMACMXAllowShortSignals) + { + return result; + } + + // + ENUM_XCHMA_CYCLES cycles[]; + Add( + X_XCHMA_CYCLE_MEDIUM, + cycles); + Add( + X_XCHMA_CYCLE_LONG, + cycles); + + // + double xCHMANonSCMax3 = XCHMAGetCyclesMaxValue(3, cycles); + double xCHMANonSCMax2 = XCHMAGetCyclesMaxValue(2, cycles); + + // + result = + // + xEU5Conditions.isXCHMASCCrossedUnderMax && + xCHMAScFastBuffer[2] > xCHMANonSCMax2 && + xCHMAScSlowBuffer[2] > xCHMANonSCMax2 + // + && + // + !( + // + xEU5Conditions.isXCHMAMCPeak && + xEU5Conditions.isXCHMALCPeak + // + ) + // + && + // + !( + // + xEU5Conditions.isXLHHHSameInLength && + xEU5Conditions.isXLHLLSameInLength && + xEU5Conditions.isXLHPriceInSignalRange && + // + ( + // + ( + // + xEU5Conditions.isXCHMAMCTrendsDown && + xEU5Conditions.isXCHMALCTrendsDown && + xEU5Conditions.isXCHMAMCFastUnderSlow && + xEU5Conditions.isXCHMALCFastUnderSlow + // + ) || + ( + // + xEU5Conditions.isXTDBullUnderBear && + xEU5Conditions.isXTDSignalUnderBear + // + ) + // + ) + // + ) + // + && + // + !( + // + ( + // + xEU5Conditions.isXCHMASCFastCrossedOverSlow || + ( + // + xEU5Conditions.isXCHMASCTrendsUp && + xEU5Conditions.isXCHMASCFastOverSlow + // + ) + // + ) && + ( + // + xEU5Conditions.isXCHMAMCFastCrossedOverSlow || + ( + // + xEU5Conditions.isXCHMAMCTrendsUp && + xEU5Conditions.isXCHMAMCFastOverSlow + // + ) + // + ) && + ( + // + xEU5Conditions.isXCHMALCFastCrossedOverSlow || + ( + // + xEU5Conditions.isXCHMALCTrendsUp && + xEU5Conditions.isXCHMALCFastOverSlow + // + ) + // + ) + // + ) + // + && + // + !( + // + xEU5Conditions.isXCHMASCOverMin && + xEU5Conditions.isXCHMASCUnderMin + // + ) + // + && + // + !( + // + xEU5Conditions.isXCHMALCPeak && + xEU5Conditions.isXTDBullOverBear && + xEU5Conditions.isXCHLHSCMCLLSame && + xEU5Conditions.isXCHLHMCLCHHSame && + xEU5Conditions.isXLHLowAttachedLL + // + ) + // + && + // + !( + // + xEU5Conditions.isXCHLHSameHHs && + xEU5Conditions.isXCHMAMCPeak && + xEU5Conditions.isXCHMAMCTrendsUp && + xEU5Conditions.isXCHMAMCFastOverSlow && + xEU5Conditions.isXLHPriceInSignalRange + // + ) + // + && + // + !( + // + xEU5Conditions.isXCHMALCPeak && + xEU5Conditions.isXLHLLIncreased && + xEU5Conditions.isXTDBullUnderBear && + xEU5Conditions.isXLHPriceUnderSignal && + xEU5Conditions.isXCHMAMCFastOverSlow && + xEU5Conditions.isXCHMALCFastOverSlow + // + ) + // + && + // + !( + // + xEU5Conditions.isXCHMAMCPeak && + xEU5Conditions.isXCHLHSCMCHHSame && + xEU5Conditions.isXCHLHMCLCLLSame && + xEU5Conditions.isXTDBullUnderBear && + xEU5Conditions.isXLHLLSameInLength && + xEU5Conditions.isXCHMAMCTrendsDown && + xEU5Conditions.isXCHMALCTrendsDown && + xEU5Conditions.isXTDSignalUnderBear && + xEU5Conditions.isXCHMAMCFastUnderSlow && + xEU5Conditions.isXCHMALCFastUnderSlow + // + ) + // + && + // + !( + // + xEU5Conditions.isXCHMALCPeak && + xEU5Conditions.isXCHMASCOverMin && + xEU5Conditions.isXCHMASCUnderMax && + xEU5Conditions.isXCHMALCTrendsUp && + xEU5Conditions.isXLHLowAttachedLL && + xEU5Conditions.isXCHMASCTrendsDown && + xEU5Conditions.isXCHMAMCTrendsDown && + xEU5Conditions.isXCHMASCFastOverSlow && + xEU5Conditions.isXCHMAMCFastOverSlow && + xEU5Conditions.isXCHMALCFastOverSlow && + xEU5Conditions.isXCHMASCCrossedUnderMax && + xEU5Conditions.isXLHPriceCrossedUnderSignal + // + ) + // + && + // + !( + // + xEU5Conditions.isXCHMALCPeak && + xEU5Conditions.isXTDBullOverBear && + xEU5Conditions.isXCHMASCOverMin && + xEU5Conditions.isXCHMASCUnderMax && + xEU5Conditions.isXLHHHSameInLength && + xEU5Conditions.isXCHMASCTrendsDown && + xEU5Conditions.isXCHMAMCTrendsDown && + xEU5Conditions.isXCHMALCTrendsDown && + xEU5Conditions.isXCHMAMCFastOverSlow && + xEU5Conditions.isXCHMALCFastOverSlow && + xEU5Conditions.isXCHMASCCrossedUnderMax && + xEU5Conditions.isXTDSignalCrossedUnderBear && + xEU5Conditions.isXCHMASCFastCrossedUnderSlow + // + ) + // + && + // + !( + // + xEU5Conditions.isXCHMALCPeak && + xEU5Conditions.isXCHMASCOverMin && + xEU5Conditions.isXTDBullOverBear && + xEU5Conditions.isXCHMASCUnderMax && + xEU5Conditions.isXLHLowAttachedLL && + xEU5Conditions.isXLHHHSameInLength && + xEU5Conditions.isXCHMASCTrendsDown && + xEU5Conditions.isXCHMAMCTrendsDown && + xEU5Conditions.isXCHMALCTrendsDown && + xEU5Conditions.isXTDSignalUnderBear && + xEU5Conditions.isXCHMAMCFastOverSlow && + xEU5Conditions.isXCHMALCFastOverSlow && + xEU5Conditions.isXCHMASCFastUnderSlow && + xEU5Conditions.isXCHMASCCrossedUnderMax + // + ) + // + && + // + !( + // + (xEU5Conditions.isXLHLowAttachedLL && + xEU5Conditions.isXLHHHSameInLength && + xEU5Conditions.isXLHPriceUnderSignal && + (xEU5Conditions.isXCHMAMCFastOverSlow || + xEU5Conditions.isXCHMAMCFastCrossedOverSlow) && + (xEU5Conditions.isXCHMALCFastOverSlow || + xEU5Conditions.isXCHMALCFastCrossedOverSlow)) + // + ) + // + ; + + // + // Funded Next ... + if (isXEU5OnFundedNext && result) + { + // + result = + // + true + // + ; + } + + // + return result; +} + +// +// END Signal Providers ... +// + +// +// START Utilities ... +// + +// +// Converts Market Conditions to Specific String Representation ... +string XEU5GetConditionsString( + XEU5MarketConditions &condition, // Specify Conditiond + string separator = ",", // Specify Separator + bool ignoreFalses = true // Ignore False Conditions +) +{ + // + XEU5MarketConditions mConditions = {}; + + // + mConditions = condition; + + // + string result = "\n"; + + // + // XOBD ... + result += + "| XOBD |" + separator; + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXOBDSwingLow)) + { + result += "isXOBDSwingLow: " + (string)mConditions.isXOBDSwingLow + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXOBDSwingHigh)) + { + result += "isXOBDSwingHigh: " + (string)mConditions.isXOBDSwingHigh + separator; + } + + // + // Separator ... + result += separator; + + // + // XTM ... + result += + "| XTM |" + separator; + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXTMPeak)) + { + result += "isXTMPeak: " + (string)mConditions.isXTMPeak + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXTMVale)) + { + result += "isXTMVale: " + (string)mConditions.isXTMVale + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXTMStartBullish)) + { + result += "isXTMStartBullish: " + (string)mConditions.isXTMStartBullish + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXTMStartBullishAfterNeutural)) + { + result += "isXTMStartBullishAfterNeutural: " + (string)mConditions.isXTMStartBullishAfterNeutural + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXTMBullish)) + { + result += "isXTMBullish: " + (string)mConditions.isXTMBullish + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXTMEndBullish)) + { + result += "isXTMEndBullish: " + (string)mConditions.isXTMEndBullish + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXTMEndBullishByNeutural)) + { + result += "isXTMEndBullishByNeutural: " + (string)mConditions.isXTMEndBullishByNeutural + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXTMStartBearish)) + { + result += "isXTMStartBearish: " + (string)mConditions.isXTMStartBearish + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXTMStartBearishAfterNeutural)) + { + result += "isXTMStartBearishAfterNeutural: " + (string)mConditions.isXTMStartBearishAfterNeutural + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXTMBearish)) + { + result += "isXTMBearish: " + (string)mConditions.isXTMBearish + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXTMEndBearish)) + { + result += "isXTMEndBearish: " + (string)mConditions.isXTMEndBearish + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXTMEndBearishByNeutural)) + { + result += "isXTMEndBearishByNeutural: " + (string)mConditions.isXTMEndBearishByNeutural + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXTMNeutural)) + { + result += "isXTMNeutural: " + (string)mConditions.isXTMNeutural + separator; + } + + // + // Separator ... + result += separator; + + // + // XAMA ... + result += + "| XAMA |" + separator; + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXAMAPeak)) + { + result += "isXAMAPeak: " + (string)mConditions.isXAMAPeak + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXAMAVale)) + { + result += "isXAMAVale: " + (string)mConditions.isXAMAVale + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXAMAStartBullish)) + { + result += "isXAMAStartBullish: " + (string)mConditions.isXAMAStartBullish + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXAMAStartBullishAfterNeutural)) + { + result += "isXAMAStartBullishAfterNeutural: " + (string)mConditions.isXAMAStartBullishAfterNeutural + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXAMABullish)) + { + result += "isXAMABullish: " + (string)mConditions.isXAMABullish + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXAMAEndBullish)) + { + result += "isXAMAEndBullish: " + (string)mConditions.isXAMAEndBullish + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXAMAEndBullishByNeutural)) + { + result += "isXAMAEndBullishByNeutural: " + (string)mConditions.isXAMAEndBullishByNeutural + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXAMAStartBearish)) + { + result += "isXAMAStartBearish: " + (string)mConditions.isXAMAStartBearish + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXAMAStartBearishAfterNeutural)) + { + result += "isXAMAStartBearishAfterNeutural: " + (string)mConditions.isXAMAStartBearishAfterNeutural + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXAMABearish)) + { + result += "isXAMABearish: " + (string)mConditions.isXAMABearish + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXAMAEndBearish)) + { + result += "isXAMAEndBearish: " + (string)mConditions.isXAMAEndBearish + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXAMAEndBearishByNeutural)) + { + result += "isXAMAEndBearishByNeutural: " + (string)mConditions.isXAMAEndBearishByNeutural + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXAMANeutural)) + { + result += "isXAMANeutural: " + (string)mConditions.isXAMANeutural + separator; + } + + // + // Separator ... + result += separator; + + // + // XTD ... + result += + "| XTD |" + separator; + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXTDSignalPeak)) + { + result += "isXTDSignalPeak: " + (string)mConditions.isXTDSignalPeak + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXTDSignalVale)) + { + result += "isXTDSignalVale: " + (string)mConditions.isXTDSignalVale + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXTDBullishPeak)) + { + result += "isXTDBullishPeak: " + (string)mConditions.isXTDBullishPeak + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXTDBullishVale)) + { + result += "isXTDBullishVale: " + (string)mConditions.isXTDBullishVale + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXTDBearishPeak)) + { + result += "isXTDBearishPeak: " + (string)mConditions.isXTDBearishPeak + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXTDBearishVale)) + { + result += "isXTDBearishVale: " + (string)mConditions.isXTDBearishVale + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXTDBullOverBear)) + { + result += "isXTDBullOverBear: " + (string)mConditions.isXTDBullOverBear + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXTDBullUnderBear)) + { + result += "isXTDBullUnderBear: " + (string)mConditions.isXTDBullUnderBear + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXTDSignalOverBear)) + { + result += "isXTDSignalOverBear: " + (string)mConditions.isXTDSignalOverBear + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXTDSignalUnderBear)) + { + result += "isXTDSignalUnderBear: " + (string)mConditions.isXTDSignalUnderBear + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXTDBullCrossedOverBear)) + { + result += "isXTDBullCrossedOverBear: " + (string)mConditions.isXTDBullCrossedOverBear + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXTDBullCrossedUnderBear)) + { + result += "isXTDBullCrossedUnderBear: " + (string)mConditions.isXTDBullCrossedUnderBear + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXTDSignalCrossedOverBear)) + { + result += "isXTDSignalCrossedOverBear: " + (string)mConditions.isXTDSignalCrossedOverBear + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXTDSignalCrossedUnderBear)) + { + result += "isXTDSignalCrossedUnderBear: " + (string)mConditions.isXTDSignalCrossedUnderBear + separator; + } + + // + // Separator ... + result += separator; + + // + // XFI ... + result += + "| XFI |" + separator; + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXFIPeak)) + { + result += "isXFIPeak: " + (string)mConditions.isXFIPeak + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXFIVale)) + { + result += "isXFIVale: " + (string)mConditions.isXFIVale + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXFIOverZero)) + { + result += "isXFIOverZero: " + (string)mConditions.isXFIOverZero + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXFIUnderZero)) + { + result += "isXFIUnderZero: " + (string)mConditions.isXFIUnderZero + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXFICrossedOverZero)) + { + result += "isXFICrossedOverZero: " + (string)mConditions.isXFICrossedOverZero + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXFICrossedUnderZero)) + { + result += "isXFICrossedUnderZero: " + (string)mConditions.isXFICrossedUnderZero + separator; + } + + // + // Separator ... + result += separator; + + // + // XTS ... + result += + "| XTS |" + separator; + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXTSAllSame)) + { + result += "isXTSAllSame: " + (string)mConditions.isXTSAllSame + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXTSCurrentMin)) + { + result += "isXTSCurrentMin: " + (string)mConditions.isXTSCurrentMin + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXTSCurrentMax)) + { + result += "isXTSCurrentMax: " + (string)mConditions.isXTSCurrentMax + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXTSCurrentOverFarest)) + { + result += "isXTSCurrentOverFarest: " + (string)mConditions.isXTSCurrentOverFarest + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXTSCurrentOverNearest)) + { + result += "isXTSCurrentOverNearest: " + (string)mConditions.isXTSCurrentOverNearest + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXTSCurrentOverMediest)) + { + result += "isXTSCurrentOverMediest: " + (string)mConditions.isXTSCurrentOverMediest + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXTSCurrentUnderFarest)) + { + result += "isXTSCurrentUnderFarest: " + (string)mConditions.isXTSCurrentUnderFarest + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXTSCurrentUnderNearest)) + { + result += "isXTSCurrentUnderNearest: " + (string)mConditions.isXTSCurrentUnderNearest + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXTSCurrentUnderMediest)) + { + result += "isXTSCurrentUnderMediest: " + (string)mConditions.isXTSCurrentUnderMediest + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXTSCurrentCrossedOverFarest)) + { + result += "isXTSCurrentCrossedOverFarest: " + (string)mConditions.isXTSCurrentCrossedOverFarest + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXTSCurrentCrossedOverNearest)) + { + result += "isXTSCurrentCrossedOverNearest: " + (string)mConditions.isXTSCurrentCrossedOverNearest + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXTSCurrentCrossedOverMediest)) + { + result += "isXTSCurrentCrossedOverMediest: " + (string)mConditions.isXTSCurrentCrossedOverMediest + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXTSCurrentCrossedUnderFarest)) + { + result += "isXTSCurrentCrossedUnderFarest: " + (string)mConditions.isXTSCurrentCrossedUnderFarest + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXTSCurrentCrossedUnderNearest)) + { + result += "isXTSCurrentCrossedUnderNearest: " + (string)mConditions.isXTSCurrentCrossedUnderNearest + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXTSCurrentCrossedUnderMediest)) + { + result += "isXTSCurrentCrossedUnderMediest: " + (string)mConditions.isXTSCurrentCrossedUnderMediest + separator; + } + + // + // Separator ... + result += separator; + + // + // XLH ... + result += + "| XLH |" + separator; + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXLHHHIncreased)) + { + result += "isXLHHHIncreased: " + (string)mConditions.isXLHHHIncreased + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXLHHHDecreased)) + { + result += "isXLHHHDecreased: " + (string)mConditions.isXLHHHDecreased + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXLHLLIncreased)) + { + result += "isXLHLLIncreased: " + (string)mConditions.isXLHLLIncreased + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXLHLLDecreased)) + { + result += "isXLHLLDecreased: " + (string)mConditions.isXLHLLDecreased + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXLHHighAttachedHH)) + { + result += "isXLHHighAttachedHH: " + (string)mConditions.isXLHHighAttachedHH + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXLHLowAttachedLL)) + { + result += "isXLHLowAttachedLL: " + (string)mConditions.isXLHLowAttachedLL + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXLHHHSameInLength)) + { + result += "isXLHHHSameInLength: " + (string)mConditions.isXLHHHSameInLength + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXLHLLSameInLength)) + { + result += "isXLHLLSameInLength: " + (string)mConditions.isXLHLLSameInLength + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXLHPriceCrossedOverSignal)) + { + result += "isXLHPriceCrossedOverSignal: " + (string)mConditions.isXLHPriceCrossedOverSignal + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXLHPriceOverSignal)) + { + result += "isXLHPriceOverSignal: " + (string)mConditions.isXLHPriceOverSignal + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXLHPriceCrossedUnderSignal)) + { + result += "isXLHPriceCrossedUnderSignal: " + (string)mConditions.isXLHPriceCrossedUnderSignal + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXLHPriceUnderSignal)) + { + result += "isXLHPriceUnderSignal: " + (string)mConditions.isXLHPriceUnderSignal + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXLHPriceInSignalRange)) + { + result += "isXLHPriceInSignalRange: " + (string)mConditions.isXLHPriceInSignalRange + separator; + } + + // + // Separator ... + result += separator; + + // + // XRSI ... + result += + "| XRSI |" + separator; + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXRSIPeak)) + { + result += "isXRSIPeak: " + (string)mConditions.isXRSIPeak + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXRSIVale)) + { + result += "isXRSIVale: " + (string)mConditions.isXRSIVale + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXRSICrossedOverLongExit)) + { + result += "isXRSICrossedOverLongExit: " + (string)mConditions.isXRSICrossedOverLongExit + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXRSICrossedOverLongEntry)) + { + result += "isXRSICrossedOverLongEntry: " + (string)mConditions.isXRSICrossedOverLongEntry + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXRSICrossedUnderShortExit)) + { + result += "isXRSICrossedUnderShortExit: " + (string)mConditions.isXRSICrossedUnderShortExit + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXRSICrossedUnderShortEntry)) + { + result += "isXRSICrossedUnderShortEntry: " + (string)mConditions.isXRSICrossedUnderShortEntry + separator; + } + + // + // Separator ... + result += separator; + + // + // XCHLH ... + result += + "| XCHLH |" + separator; + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXCHLHSameHHs)) + { + result += "isXCHLHSameHHs: " + (string)mConditions.isXCHLHSameHHs + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXCHLHSameLLs)) + { + result += "isXCHLHSameLLs: " + (string)mConditions.isXCHLHSameLLs + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXCHLHSCMCHHSame)) + { + result += "isXCHLHSCMCHHSame: " + (string)mConditions.isXCHLHSCMCHHSame + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXCHLHSCMCLLSame)) + { + result += "isXCHLHSCMCLLSame: " + (string)mConditions.isXCHLHSCMCLLSame + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXCHLHSCLCHHSame)) + { + result += "isXCHLHSCLCHHSame: " + (string)mConditions.isXCHLHSCLCHHSame + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXCHLHSCLCLLSame)) + { + result += "isXCHLHSCLCLLSame: " + (string)mConditions.isXCHLHSCLCLLSame + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXCHLHMCLCHHSame)) + { + result += "isXCHLHMCLCHHSame: " + (string)mConditions.isXCHLHMCLCHHSame + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXCHLHMCLCLLSame)) + { + result += "isXCHLHMCLCLLSame: " + (string)mConditions.isXCHLHMCLCLLSame + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXCHLHMCOnTopOfLC)) + { + result += "isXCHLHMCOnTopOfLC: " + (string)mConditions.isXCHLHMCOnTopOfLC + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXCHLHMCInBottomOfLC)) + { + result += "isXCHLHMCInBottomOfLC: " + (string)mConditions.isXCHLHMCInBottomOfLC + separator; + } + + // + // Separator ... + result += separator; + + // + // XCHMA ... + result += + "| XCHMA |" + separator; + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXCHMASCOverMax)) + { + result += "isXCHMASCOverMax: " + (string)mConditions.isXCHMASCOverMax + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXCHMASCOverMin)) + { + result += "isXCHMASCOverMin: " + (string)mConditions.isXCHMASCOverMin + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXCHMASCUnderMax)) + { + result += "isXCHMASCUnderMax: " + (string)mConditions.isXCHMASCUnderMax + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXCHMASCUnderMin)) + { + result += "isXCHMASCUnderMin: " + (string)mConditions.isXCHMASCUnderMin + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXCHMASCCrossedOverMax)) + { + result += "isXCHMASCCrossedOverMax: " + (string)mConditions.isXCHMASCCrossedOverMax + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXCHMASCCrossedUnderMax)) + { + result += "isXCHMASCCrossedUnderMax: " + (string)mConditions.isXCHMASCCrossedUnderMax + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXCHMASCCrossedOverMin)) + { + result += "isXCHMASCCrossedOverMin: " + (string)mConditions.isXCHMASCCrossedOverMin + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXCHMASCCrossedUnderMin)) + { + result += "isXCHMASCCrossedUnderMin: " + (string)mConditions.isXCHMASCCrossedUnderMin + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXCHMASCPeak)) + { + result += "isXCHMASCPeak: " + (string)mConditions.isXCHMASCPeak + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXCHMASCVale)) + { + result += "isXCHMASCVale: " + (string)mConditions.isXCHMASCVale + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXCHMASCTrendsUp)) + { + result += "isXCHMASCTrendsUp: " + (string)mConditions.isXCHMASCTrendsUp + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXCHMASCTrendsDown)) + { + result += "isXCHMASCTrendsDown: " + (string)mConditions.isXCHMASCTrendsDown + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXCHMASCFastOverSlow)) + { + result += "isXCHMASCFastOverSlow: " + (string)mConditions.isXCHMASCFastOverSlow + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXCHMASCFastUnderSlow)) + { + result += "isXCHMASCFastUnderSlow: " + (string)mConditions.isXCHMASCFastUnderSlow + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXCHMASCFastCrossedOverSlow)) + { + result += "isXCHMASCFastCrossedOverSlow: " + (string)mConditions.isXCHMASCFastCrossedOverSlow + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXCHMASCFastCrossedUnderSlow)) + { + result += "isXCHMASCFastCrossedUnderSlow: " + (string)mConditions.isXCHMASCFastCrossedUnderSlow + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXCHMAMCPeak)) + { + result += "isXCHMAMCPeak: " + (string)mConditions.isXCHMAMCPeak + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXCHMAMCVale)) + { + result += "isXCHMAMCVale: " + (string)mConditions.isXCHMAMCVale + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXCHMAMCTrendsUp)) + { + result += "isXCHMAMCTrendsUp: " + (string)mConditions.isXCHMAMCTrendsUp + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXCHMAMCTrendsDown)) + { + result += "isXCHMAMCTrendsDown: " + (string)mConditions.isXCHMAMCTrendsDown + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXCHMAMCFastOverSlow)) + { + result += "isXCHMAMCFastOverSlow: " + (string)mConditions.isXCHMAMCFastOverSlow + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXCHMAMCFastUnderSlow)) + { + result += "isXCHMAMCFastUnderSlow: " + (string)mConditions.isXCHMAMCFastUnderSlow + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXCHMAMCFastCrossedOverSlow)) + { + result += "isXCHMAMCFastCrossedOverSlow: " + (string)mConditions.isXCHMAMCFastCrossedOverSlow + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXCHMAMCFastCrossedUnderSlow)) + { + result += "isXCHMAMCFastCrossedUnderSlow: " + (string)mConditions.isXCHMAMCFastCrossedUnderSlow + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXCHMALCPeak)) + { + result += "isXCHMALCPeak: " + (string)mConditions.isXCHMALCPeak + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXCHMALCVale)) + { + result += "isXCHMALCVale: " + (string)mConditions.isXCHMALCVale + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXCHMALCTrendsUp)) + { + result += "isXCHMALCTrendsUp: " + (string)mConditions.isXCHMALCTrendsUp + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXCHMALCTrendsDown)) + { + result += "isXCHMALCTrendsDown: " + (string)mConditions.isXCHMALCTrendsDown + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXCHMALCFastOverSlow)) + { + result += "isXCHMALCFastOverSlow: " + (string)mConditions.isXCHMALCFastOverSlow + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXCHMALCFastUnderSlow)) + { + result += "isXCHMALCFastUnderSlow: " + (string)mConditions.isXCHMALCFastUnderSlow + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXCHMALCFastCrossedOverSlow)) + { + result += "isXCHMALCFastCrossedOverSlow: " + (string)mConditions.isXCHMALCFastCrossedOverSlow + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXCHMALCFastCrossedUnderSlow)) + { + result += "isXCHMALCFastCrossedUnderSlow: " + (string)mConditions.isXCHMALCFastCrossedUnderSlow + separator; + } + + // + // Separator ... + result += separator; + + // + return result; +} + +void Add( + ENUM_XEU5_SIGNAL_PROVIDERS item, + ENUM_XEU5_SIGNAL_PROVIDERS &items[]) +{ + // + ArrayResize( + items, + ArraySize(items) + 1); + + // + items[ArraySize(items) - 1] = item; +} +// +// START Utilities ... +// \ No newline at end of file diff --git a/BKPS/OLD/XEU5-0/Providers/x-saherelm.xeu5.provider.inputs.lib.mq5 b/BKPS/OLD/XEU5-0/Providers/x-saherelm.xeu5.provider.inputs.lib.mq5 new file mode 100644 index 0000000..b873b64 --- /dev/null +++ b/BKPS/OLD/XEU5-0/Providers/x-saherelm.xeu5.provider.inputs.lib.mq5 @@ -0,0 +1,321 @@ +/////////////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 XEU5 Signal Provider Library Inputs +// ----------------------------------------------------------- +// +// 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 Logger ... +#include "../Libraries/x-saherelm.log.lib.mq5" + +// +// Include Classes ... +#include "../Classes/x-saherelm.class.lib.mq5" + +// +// START Definitions ... +// + +// +// Cross Signals Methods ... +enum ENUM_XEU5_CROSS_SIGNAL_METHOD +{ + // + // Do Nothing and Ignore them ... + XEU5_CROSS_SIGNAL_DO_NOTHING, + // + // Accept all Cross Signals and Act Usually ... + XEU5_CROSS_SIGNAL_REGULAR, + // + // Accept all Cross Signals and for Directional Act Usually and for Indirectional Ac Important ... + XEU5_CROSS_SIGNAL_DIRECTION_REGULAR_INDIRECTION_IMPORTANT, + // + // Accept all Cross Signals and for Directional Act Important and for Indirectional Ac Usually ... + XEU5_CROSS_SIGNAL_DIRECTION_IMPORTANT_INDIRECTION_REGULAR, + // + // Accept Only Indirectional Signals and Act Usually ... + XEU5_CROSS_SIGNAL_INDIRECTION_REGULAR, + // + // Accept Only Directional Signals and Act Usually ... + XEU5_CROSS_SIGNAL_DIRECTION_REGULAR, + // + // Accept Only Indirectional Signals and Act Important ... + XEU5_CROSS_SIGNAL_INDIRECTION_IMPORTANT, + // + // Accept Only Directional Signals and Act Important ... + XEU5_CROSS_SIGNAL_DIRECTION_IMPORTANT, +}; + +// +// END Definitions ... +// + +// +input group "XEU5 Provider"; + +// +// Commonly Used Configurations ... +input group "XEU5 Common"; +// +// Provider ... +input bool xEU5EnableProvider = true; // Enable Provider +input int xEU5NumberOfItemsPerTick = 30; // Number Of items Readed In Each Tick +// +// Alerts ... +input bool xEU5EnableAlerts = true; // Enable Events Alert +input bool xEU5EnableHourlyAlerts = false; // Send Alert on each new Hour +input bool xEU5EnableDailyAlerts = false; // Send Alert on each new Day +input bool xEU5EnableWeeklyAlerts = false; // Send Alert on each new Week +input bool xEU5EnableMonthlyAlerts = true; // Send Alert on each new Month +// +// Reports ... +input bool xEU5EnableDailyReports = false; // Send Report on each new Day +input bool xEU5EnableWeeklyReports = false; // Send Report on each new Week +input bool xEU5EnableMonthlyReports = true; // Send Report on each new Month + +// +// Trader and Expert Specific Configurations ... +input group "XEU5 Trader"; +input int xEU5MagicNumber = 16940561; // Trader MagicNumber +input int xEU5Slippage = 10; // Trader Slippage + +// +// Trades Management Configurations ... +input group "XEU5 Trade Management"; +input bool xEU5AllowLongTrades = true; // Allow Long Trades +input bool xEU5AllowShortTrades = true; // Allow Short Trades + +// +// Risk Management Configurations ... +input group "XEU5 Risk Management"; +// +input bool xEU5UseVirtualTPSl = true; // Use Virtual TP SL +// +// Trade Count ... +input int xEU5MaxAllowedTrades = 4; // Max Allowed Trades at Same Time +input ENUM_XEU5_CROSS_SIGNAL_METHOD xEU5CrossSignalsMethod = XEU5_CROSS_SIGNAL_REGULAR; // Handle Cross Signals Method +// +// Max Allowed Trade Age ... +input int xEU5MaxAllowedTradeAge = 0; // Detect Long Time Trades +input ENUM_X_GUARD_ACTIONS xEU5OldTradesAction = X_GUARD_DO_NOTHING; // What to do with Old Trades +// +// Trade Volume Specific Configurations ... +input double xEU5StaticVolumeFactor = 0.00002; // Static Volume baesd on Balance +input ENUM_STATIC_VOLUME_METHODS xEU5StaticVolumeMethod = X_STATIC_VOLUME_BASED_ON_DEPOSIT; // How to Calculate Static Volume +input double xEU5VolumeMultiplier = 2.0; // Volume Increase Multiplier +input double xEU5ApplyVolumeMultiplierFactor = 0.002; // Apply Volume Multiplier Rate based on Balance +input double xEU5MaxSupportedVolumePerTradeFactor = 0.00008; // Max Supported Volume Per Trade Factor based on Balance +input double xEU5IncreasedMaxSupportedVolumeRate = 0.3; // Increase Max Supported Volume based on Balance +// +// Trade Profits ... +input double xEU5MinRewardInPips = 15; // Minimum Reward Per Trade in Pips +input double xEU5RiskFreeStepInPips = 4; // Make Trades Risk Free Steps in Pips +input double xEU5RiskFreeRate = 0.75; // Volume Multiplier for Risk Free Trades +// +// Guard Riskable Money and Profits ... +input double xEU5CriticalDrawDownFactor = 0.25; // Critical Allowed Drawdown Factor based on Balance +input ENUM_X_GUARD_ACTIONS xEU5CriticalGuardAction = X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_5; // Specify Guard Action on Critical Drawdown +input double xEU5MaxAllowedDrawDownFactor = 0.4; // Max Allowed Drawdown Factor based on Balance +input ENUM_X_GUARD_ACTIONS xEU5MaxAllowedGuardAction = X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_10; // Specify Guard Action on Max Allowed Drawdown +input int xEU5GuardStopoutFiredAfterTouches = 5; // Guard Stopout all Trades if Max Allowed Drawdown touched +// +// TODO: Complete this ... +// input ENUM_X_GUARD_SUPPORT_METHODS xEU5GuardSupportMethod = X_SUPPORT_DO_NOTHING; // How to Supprt Open Trades + +// +// Account Conditions for Trading ... +input double xEU5BalanceFactorForOpenTrades = 0.5; // Minimum Balance for Open Trades +input double xEU5FreeMarginFactorForOpenTrades = 0.8; // Minimum Free Margin for Open Trades + +// +// Validate Inputs before Initialization ... +bool XEU5ValidateInputs() +{ + // + bool result = false; + + // + // Implement Other Verifications ... + + // + // Check Trading Availability ... + bool isTradeAvailable = xEU5AllowLongTrades || xEU5AllowShortTrades; + if (!isTradeAvailable) + { + LogMessage("XEU5 => Warning: Trading disabled ..."); + } + + // + // Chekc Number of reading items per tick ... + result = xEU5NumberOfItemsPerTick >= 5; + if (!result) + { + // + LogMessage("XEU5 invalid Number of items Reading Per Tick ..."); + + // + return result; + } + + // + // Check Max Allowed Trades Count ... + result = isTradeAvailable && xEU5MaxAllowedTrades >= 1; + if (!result) + { + // + LogMessage("XEU5 Number of Trades not valid ..."); + + // + return result; + } + + // + // Check Free Margin ... + result = + isTradeAvailable && + xEU5FreeMarginFactorForOpenTrades > 0 && + xEU5FreeMarginFactorForOpenTrades < 1; + if (!result) + { + // + LogMessage("XEU5 Invalid Free Margin ..."); + + // + return result; + } + + // + // Check min Balance for Open Trades ... + result = + isTradeAvailable && + xEU5BalanceFactorForOpenTrades > 0 && + xEU5BalanceFactorForOpenTrades < 1; + if (!result) + { + // + LogMessage("XEU5 Invalid Min Balance for Open Trades ..."); + + // + return result; + } + + // + // Check Min Reward Per Trade ... + result = xEU5MinRewardInPips > 0; + if (!result) + { + // + LogMessage("XEU5 Invalid Min Reward Per Trade ..."); + + // + return result; + } + + // + // Check Trades Volume ... + result = xEU5StaticVolumeFactor > 0; + if (!result) + { + // + LogMessage("XEU5 Invalid Static Volume ..."); + + // + return result; + } + + // + // Check Volume Multiplier ... + result = xEU5VolumeMultiplier >= 0; + if (!result) + { + // + LogMessage("XEU5 Invalid Volume Multiplier ..."); + + // + return result; + } + + // + result = + xEU5CriticalDrawDownFactor == 0 || (xEU5CriticalDrawDownFactor > 0 && + xEU5CriticalDrawDownFactor < 1); + if (!result) + { + // + LogMessage("XEU5 Invalid Critical DrawDown Factor ..."); + + // + return result; + } + + // + result = + xEU5MaxAllowedDrawDownFactor == 0 || (xEU5MaxAllowedDrawDownFactor > 0 && + xEU5MaxAllowedDrawDownFactor < 1); + if (!result) + { + // + LogMessage("XEU5 Invalid Max Allowed DrawDown Factor ..."); + + // + return result; + } + + // + // Check Guard Actions ... + // + result = + xEU5CriticalDrawDownFactor > 0 && + xEU5CriticalDrawDownFactor < 1 && + xEU5MaxAllowedDrawDownFactor > 0 && + xEU5MaxAllowedDrawDownFactor < 1; + if (!result) + { + // + LogMessage("XEU5 For Critical Drawdown, you have to Specify Max Drawdown also ..."); + + // + return result; + } + + // + result = xEU5CriticalDrawDownFactor > 0 && xEU5CriticalDrawDownFactor < xEU5MaxAllowedDrawDownFactor; + if (!result) + { + // + LogMessage("XEU5 Critical Drawdown must Smaller than Max Drawdown ..."); + + // + return result; + } + + // + if (xEU5CriticalDrawDownFactor > 0 && xEU5CriticalGuardAction == X_GUARD_DO_NOTHING) + { + LogMessage("XEU5 IMPORTANT you Specified Critical Drawdown, but there is no any Guard Action ..."); + } + + // + if (xEU5MaxAllowedDrawDownFactor > 0 && xEU5MaxAllowedGuardAction == X_GUARD_DO_NOTHING) + { + LogMessage("XEU5 IMPORTANT you Specified Max Allowed Drawdown, but there is no any Guard Action ..."); + } + + // + result = true; + + // + return result; +} \ No newline at end of file diff --git a/BKPS/OLD/XEU5-0/Providers/x-saherelm.xeu5.provider.lib.mq5 b/BKPS/OLD/XEU5-0/Providers/x-saherelm.xeu5.provider.lib.mq5 new file mode 100644 index 0000000..4366410 --- /dev/null +++ b/BKPS/OLD/XEU5-0/Providers/x-saherelm.xeu5.provider.lib.mq5 @@ -0,0 +1,1370 @@ +//////////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 XEU5 Signal Provider Library +// -------------------------------------------------------- +// Name: XEU5SignalProvider +// Description: XEU5 based 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 + +#define XEU5ProviderName "XEU5" + +// +// START Inputs ... +// + +#include "x-saherelm.xeu5.provider.inputs.lib.mq5"; + +// +// END Inputs ... +// + +// +// Include Common Library ... +#include "../Libraries/x-saherelm.common.lib.mq5" + +// +// Include Logger Library ... +#include "../Libraries/x-saherelm.log.lib.mq5" + +// +// Include Alert Library ... +#include "../Libraries/x-saherelm.alert.lib.mq5" + +// +// Include Draw Library ... +#include "../Libraries/x-saherelm.draw.lib.mq5" + +// +// Include Class Libraries ... +#include "../Classes/x-saherelm.class.lib.mq5" + +// +// START Global Definitions: Variables, Properties and etc ... +// + +// +XCGuard *xEU5Guard; +XCTrade *xEU5Trader; +XCReporter *xEU5Reporter; +XCCollector *xEU5Collector; +XCAccountInfo *xEU5AccountInfo; +XCVolumeManager *xEU5VolumeManager; + +// +#include "x-saherelm.xeu5.provider.indicators.lib.mq5" + +// +// Controlling Variables ... +bool xEU5MEnableProvider = false; +bool xEU5MAllowLongTrades = false; +bool xEU5MAllowShortTrades = false; + +// +double xEU5Deposit = 0; +double xEU5Balance = 0; +double xEU5MinReward = 0; +double xEU5FreeMargin = 0; +double xEU5BalanceForOpenTrades = 0; +double xEU5FreeMarginForOpenTrades = 0; + +// +// Guard ... +double xEU5CriticalDrawDown = 0; +double xEU5MaxAllowedDrawDown = 0; + +// +double xEU5MaxDrawUp = 0; +double xEU5MaxDrawDown = 0; + +// +int NOT_ENOUGH_MONEY_ERROR = 4756; +const string XEU5_SUPPORT_ID = "SP"; + +// +// END Global Definitions: Variables, Properties and etc ... +// + +// +// START Provided Functions ... +// + +// +// Initial Library if required ... +bool XEU5InitSignalProviderLibrary() +{ + // + bool result = false; + + // + if (!xEU5EnableProvider) + { + return result; + } + + // + // Controlling Variables ... + xEU5MEnableProvider = xEU5EnableProvider; + xEU5MAllowLongTrades = xEU5AllowLongTrades; + xEU5MAllowShortTrades = xEU5AllowShortTrades; + + // + // Validate Inputs ... + result = XEU5ValidateInputs(); + if (!result) + { + return result; + } + + // + // Init Indicators ... + result = XEU5InitIndicators(); + if (!result) + { + return result; + } + + // + xEU5Reporter = new XCReporter(); + xEU5Collector = new XCCollector(); + xEU5AccountInfo = new XCAccountInfo(); + + // + // Calculate Account Deposit ... + xEU5Deposit = xEU5AccountInfo.GetInitialBalance(); + + // + // Prepare Min Reward ... + if (xEU5MinRewardInPips > 0) + { + xEU5MinReward = PipsToPrice(xEU5MinRewardInPips); + } + + // + // Calculate Min Balance for Trades ... + if (xEU5BalanceFactorForOpenTrades > 0) + { + xEU5BalanceForOpenTrades = xEU5BalanceFactorForOpenTrades * xEU5Deposit; + } + + // + // Claculate Min Free Marging for Trades ... + if (xEU5FreeMarginFactorForOpenTrades > 0) + { + xEU5FreeMarginForOpenTrades = xEU5FreeMarginFactorForOpenTrades * xEU5Deposit; + } + + // + // Calculate Init Time Critical DrawDown Value ... + if (xEU5CriticalDrawDownFactor > 0) + { + xEU5CriticalDrawDown = xEU5CriticalDrawDownFactor * xEU5Deposit; + } + + // + // Calculate Init Time Max Allowed DrawDown Value ... + if (xEU5MaxAllowedDrawDownFactor > 0) + { + xEU5MaxAllowedDrawDown = xEU5MaxAllowedDrawDownFactor * xEU5Deposit; + } + + // + // Instant Volume Manager ... + xEU5VolumeManager = new XCVolumeManager( + xEU5StaticVolumeFactor, + xEU5StaticVolumeMethod, + xEU5VolumeMultiplier, + xEU5ApplyVolumeMultiplierFactor, + xEU5MaxSupportedVolumePerTradeFactor, + xEU5IncreasedMaxSupportedVolumeRate); + + // + // Make XCTrader instance ... + xEU5Trader = new XCTrade( + XEU5ProviderName, + _Symbol, + xEU5Slippage, + xEU5MagicNumber, + xEU5UseVirtualTPSl, + xEU5MaxAllowedTrades, + xEU5FreeMarginForOpenTrades, + xEU5BalanceForOpenTrades); + + // + // Instantiate Account Guard ... + xEU5Guard = new XCGuard( + // + // Old Trades ... + xEU5MaxAllowedTradeAge, + xEU5OldTradesAction, + // + // Critical DrawDown ... + xEU5CriticalDrawDownFactor, + xEU5CriticalGuardAction, + // + // Max Allowed DrawDown ... + xEU5MaxAllowedDrawDownFactor, + xEU5MaxAllowedGuardAction, + xEU5GuardStopoutFiredAfterTouches, + // + // xEU5GuardSupportMethod + X_SUPPORT_DO_NOTHING + // + ); + + // + // Reset Calculations Buffers and Variables ... + XEU5ResetCollectors(); + + // + XEU5UpdateReports(); + + // + result = true; + + // + // Logging State ... + XEU5IssueInitializationSucceedAlert(); + + // + return result; +} + +// +// DeInitial Library if required ... +void XEU5DeinitSignalProviderLibrary(const int reason) +{ + // + // Release Handlers ... + XEU5ReleaseIndicators(); + + // + // Logging State ... + XEU5IssueDeinitializationSucceedAlert(); +} + +// +// this is a Globally Function which do all of +// checkings and positions handling ... +void XEU5SignalProviderHandleTick() +{ + // + // Check Provider is Enable or Not ... + if (!xEU5MEnableProvider) + { + return; + } + + // + XEU5SignalProviderDoControlState(); + + // + // Reading Indicator Buffers ... + XEU5HandleReadingBuffers(); + if (xEU5CalculatedBars < xEU5MaxLengthOfInputs) + { + return; + } + + // + // Handle Open Trades ... + XEU5HandleOpenTrades(); + + // + // Handle Close Trades ... + XEU5HandleCloseTrades(); + + // + // DrawDown and DrawUp ... + XEU5HandleCalculateDrawDownUp(); +} + +// +// Do Control Checks here ... +void XEU5SignalProviderDoControlState() +{ + // + // Update account Balance ... + xEU5Balance = xEU5AccountInfo.GetBalance(); + xEU5FreeMargin = xEU5AccountInfo.GetFreeMargin(); + + // + // Check Provider is Enable or Not ... + if (!xEU5MEnableProvider) + { + return; + } + + // + // Protect Account by Guarding Maximum Drawdown ... + // TODO: add Guard Result here ... + string guardMessage = ""; + XGuardHandlerResult guardHandlerResult; + bool isGuarded = xEU5Guard.Guard( + guardHandlerResult, + guardMessage, + xEU5Trader, + _Period); + if (isGuarded) + { + // + // Criticals ... + int criticalsCount = ArraySize(guardHandlerResult.criticals); + if (criticalsCount > 0) + { + // + for (int i = 0; i < criticalsCount; i++) + { + // + XSignal iSignal = guardHandlerResult.criticals[i]; + + // + XEU5OnGuard( + iSignal, + X_GUARDED_CRITICAL, + guardMessage); + } + } + + // + // Maxes ... + int maxesCount = ArraySize(guardHandlerResult.maxes); + if (maxesCount > 0) + { + // + for (int i = 0; i < maxesCount; i++) + { + // + XSignal iSignal = guardHandlerResult.maxes[i]; + + // + XEU5OnGuard( + iSignal, + X_GUARDED_MAX, + guardMessage, + guardHandlerResult.isStopOut); + } + } + + // + // Olds ... + int oldsCount = ArraySize(guardHandlerResult.olds); + if (oldsCount > 0) + { + // + for (int i = 0; i < oldsCount; i++) + { + // + XSignal iSignal = guardHandlerResult.olds[i]; + + // + XEU5OnGuard( + iSignal, + X_GUARDED_OLD, + guardMessage); + } + } + } + + // + // Signal Protection ... + XSignal protectSupports[]; + bool isSupported = xEU5Guard.ProtectSignals( + protectSupports, + xEU5Trader); + if (isSupported) + { + // + LogMessage("Guard do Support Trdae ..."); + } + + // + // Handling Signals ... + XTraderHandlerResult signalHandlerResult; + xEU5Trader.HandleSignals( + signalHandlerResult, + false // Ignore Risk Free Trdaes + ); + + // + // Handle Sl Reports ... + int handledSLsCount = ArraySize(signalHandlerResult.sl); + if (handledSLsCount > 0) + { + // + for (int i = 0; i < handledSLsCount; i++) + { + // + XSignal iSignal = signalHandlerResult.sl[i]; + XEU5OnSL(iSignal); + } + } + + // + // Handle TP Reports ... + int handledTPsCount = ArraySize(signalHandlerResult.tp); + if (handledTPsCount > 0) + { + // + for (int i = 0; i < handledTPsCount; i++) + { + // + XSignal iSignal = signalHandlerResult.tp[i]; + XEU5OnTP(iSignal); + } + } + + // + // Handle RFs as TP Reports ... + int handledRFsCount = ArraySize(signalHandlerResult.rf); + if (handledRFsCount > 0) + { + // + for (int i = 0; i < handledRFsCount; i++) + { + // + XSignal iSignal = signalHandlerResult.rf[i]; + XEU5OnRF(iSignal); + } + } +} + +// +// Handle Trades when OnTrade Event Hnadler Calls ... +void XEU5SignalProviderHandleTrade() +{ + // + // Check Provider Enabled ... + if (!xEU5MEnableProvider) + { + return; + } + + // + // Handle OnTrade Event ... + XOnTradeHandlerResult result = {}; + xEU5Trader.HandleOnTradeEvent( + result); + + // + // Detected TP or SL ... + if (result.hasNewDeal) + { + // + XDeal last = xEU5Trader.GetLastDeal(); + + // + if (last.reason == DEAL_REASON_SL) + { + xEU5Reporter.AddTradeSLInReports(); + } + else if (last.reason == DEAL_REASON_TP) + { + xEU5Reporter.AddTradeTPInReports(); + } + } +} + +// +// Handle Open Trades ... +void XEU5HandleOpenTrades() +{ + // + // Check Can Trade ... + bool canTrade = xEU5MAllowLongTrades || xEU5MAllowShortTrades; + if (!canTrade) + { + return; + } + + // + // Check Max Open Trades ... + int openSignals = xEU5Trader.Count(); + bool canOpenPositions = openSignals < xEU5MaxAllowedTrades; + if (!canOpenPositions) + { + return; + } + + // + // Check Signals Exists ... + XProvidedSignal longSignalInfo; + XProvidedSignal shortSignalInfo; + bool hasLongSignal = XEU5CanOpenLongTrade(longSignalInfo); + bool hasShortSignal = XEU5CanOpenShortTrade(shortSignalInfo); + if (!hasLongSignal && !hasShortSignal) + { + return; + } + + // + // Update Reports ... + XEU5UpdateReports(); + + // + // Open Long Trades ... + if ( + // + hasLongSignal && + xEU5MAllowLongTrades) + { + // + bool isOpened = XEU5OpenLongPosition(longSignalInfo); + } + + // + // Open Short Trades ... + if ( + // + hasShortSignal && + xEU5MAllowShortTrades) + { + // + bool isOpened = XEU5OpenShortPosition(shortSignalInfo); + } +} + +// +// Handle Close Trades ... +void XEU5HandleCloseTrades() +{ + // + // Force Close Long Trades ... + bool isClosedLongTrades = false; + bool canCloseLongTrades = XEU5CanCloseLongTrade(); + if (xEU5MAllowLongTrades && canCloseLongTrades) + { + // + ENUM_X_SIGNAL_TYPE type = X_SIGNAL_LONG; + + // + XSignal closed[]; + xEU5Trader.CloseSignals( + closed, + type); + + // + int closedTradesCount = ArraySize(closed); + isClosedLongTrades = closedTradesCount > 0; + if (isClosedLongTrades) + { + // + for (int i = 0; i < closedTradesCount; i++) + { + // + XSignal iSignal = closed[i]; + XEU5OnFC(iSignal); + } + } + } + + // + // Force Close Short Trades ... + bool isClosedShortTrades = false; + bool canCloseShortTrades = XEU5CanCloseShortTrade(); + if (xEU5MAllowShortTrades && canCloseShortTrades) + { + // + ENUM_X_SIGNAL_TYPE type = X_SIGNAL_SHORT; + + // + XSignal closed[]; + xEU5Trader.CloseSignals( + closed, + type); + + // + int closedTradesCount = ArraySize(closed); + isClosedShortTrades = closedTradesCount > 0; + if (isClosedShortTrades) + { + // + for (int i = 0; i < closedTradesCount; i++) + { + // + XSignal iSignal = closed[i]; + XEU5OnFC(iSignal); + } + } + } +} + +// +// Open Long Position ... +bool XEU5OpenLongPosition( + XProvidedSignal &info // Retrieve Signal Additional Info on this Object +) +{ + // + bool result = false; + + // + // Calculate Required Data for Position ... + double entry = GetEntry(_Symbol, X_SIGNAL_LONG); + double sl = info.sl > 0 ? info.sl : 0; + // entry - (200 * _Point); + // info.sl > 0 ? info.sl : 0; + double tp = info.tp > 0 ? info.tp : entry + xEU5MinReward; + double riskFreeRate = xEU5RiskFreeRate; + double riskFreeStep = xEU5RiskFreeStepInPips; + double volume = XEU5CalculateVolume(ArraySize(info.signallers)); + + // + XSignal signal = {}; + signal = xEU5Trader.GenerateSignal( + X_SIGNAL_LONG, + tp, + sl, + volume, + riskFreeStep, + riskFreeRate); + bool isValidSignal = IsValid( + signal, + xEU5MagicNumber); + if (!isValidSignal) + { + return result; + } + + // + int signalsCount = xEU5Trader.Count(); + bool isCross = signalsCount >= 1; + if (isCross) + { + // + // Handle Cross Signals ... + XEU5HnadleCrossSignal(signal); + } + + // + // Retrieve Can Execute Signal or not ... + bool canExecuteSignal = + !isCross + // + || + // + ( + // + isCross && + xEU5CrossSignalsMethod != XEU5_CROSS_SIGNAL_DO_NOTHING + // + ); + if (!canExecuteSignal) + { + return result; + } + + // + // Execute Signal ... + ENUM_EXECUTION_SIGNAL_RESULT executionResult = xEU5Trader.ExecuteSignal( + signal, + false, // Ignore Number of Trades ... + true // Check Account Conditions ... + ); + result = executionResult == X_TRADER_SUCCEED_EXECUTION; + if (result) + { + // + // Update Reports ... + string providers[]; + ArrayCopy( + providers, + info.signallers + ); + + // + XSignal tSignal = xEU5Trader.GetSignal(signal.ticket); + + // + XEU5OnSignal( + tSignal, + providers); + } + else + { + XEU5IssueSignalExecutionError(executionResult); + } + + // + return result; +} + +// +// Open Short Position ... +bool XEU5OpenShortPosition( + XProvidedSignal &info // Retrieve Signal Additional Info on this Object +) +{ + // + bool result = false; + + // + // Calculate Required Data for Position ... + double entry = GetEntry(_Symbol, X_SIGNAL_SHORT); + double sl = info.sl > 0 ? info.sl : 0; + // entry + (200 * _Point); + // info.sl > 0 ? info.sl : 0; + double tp = info.tp > 0 ? info.tp : entry - xEU5MinReward; + double riskFreeRate = xEU5RiskFreeRate; + double riskFreeStep = xEU5RiskFreeStepInPips; + double volume = XEU5CalculateVolume(ArraySize(info.signallers)); + + // + XSignal signal = {}; + signal = xEU5Trader.GenerateSignal( + X_SIGNAL_SHORT, + tp, + sl, + volume, + riskFreeStep, + riskFreeRate); + bool isValidSignal = IsValid( + signal, + xEU5MagicNumber); + if (!isValidSignal) + { + return result; + } + + // + int signalsCount = xEU5Trader.Count(); + bool isCross = signalsCount >= 1; + if (isCross) + { + // + // Handle Cross Signals ... + XEU5HnadleCrossSignal(signal); + } + + // + // Retrieve Can Execute Signal or not ... + bool canExecuteSignal = + !isCross + // + || + // + ( + // + isCross && + xEU5CrossSignalsMethod != XEU5_CROSS_SIGNAL_DO_NOTHING + // + ); + if (!canExecuteSignal) + { + return result; + } + + // + // Execute Signal ... + ENUM_EXECUTION_SIGNAL_RESULT executionResult = xEU5Trader.ExecuteSignal( + signal, + false, // Ignore Number of Trades ... + true // Check Account Conditions ... + ); + result = executionResult == X_TRADER_SUCCEED_EXECUTION; + if (result) + { + string providers[]; + ArrayCopy( + providers, + info.signallers + ); + + // + XSignal tSignal = xEU5Trader.GetSignal(signal.ticket); + + // + XEU5OnSignal( + tSignal, + providers); + } + else + { + XEU5IssueSignalExecutionError(executionResult); + } + + // + return result; +} + +// +// Apply Cross Signal Actions ... +void XEU5HnadleCrossSignal( + XSignal &signal // Specified Signal ... +) +{ + // + // Check Cross Signal Handling Enabled ... + if (xEU5CrossSignalsMethod == XEU5_CROSS_SIGNAL_DO_NOTHING) + { + return; + } + + // + // First We have to Change Cross Signals Comment ... + string comment = xEU5Trader.GenerateSignalComment( + signal, + true); + + // + signal.comment = comment; + + // + // If Every thing is Regular, prevent any changes here ... + if (xEU5CrossSignalsMethod == XEU5_CROSS_SIGNAL_REGULAR) + { + return; + } + + // + // Retrieve Max in Drawdown Signal ... + XSignal maxInDDSignal = xEU5Trader.GetMaxInDrawdownSignal(); + + // + // Validate Signal ... + bool isValidSignal = + maxInDDSignal.ticket > 0 && + maxInDDSignal.symbol == signal.symbol && + IsValid(maxInDDSignal, xEU5MagicNumber); + if (!isValidSignal) + { + return; + } + + // + double volume = signal.volume; + bool isDirectional = maxInDDSignal.type == signal.type; + + // + // Prevent any changes on Regular Conditions ... + bool isRegular = + isDirectional + ? ( + // + xEU5CrossSignalsMethod == XEU5_CROSS_SIGNAL_DIRECTION_REGULAR || + xEU5CrossSignalsMethod == XEU5_CROSS_SIGNAL_DIRECTION_REGULAR_INDIRECTION_IMPORTANT + // + ) + : ( + // + xEU5CrossSignalsMethod == XEU5_CROSS_SIGNAL_INDIRECTION_REGULAR || + xEU5CrossSignalsMethod == XEU5_CROSS_SIGNAL_DIRECTION_IMPORTANT_INDIRECTION_REGULAR + // + ); + if (isRegular) + { + return; + } + + // + // Important Act needs to Multiply volume by 2 ... + volume *= 2; + + // + // Set Volume of signal ... + signal.volume = volume; +} + +// +// Calculate Usefull data ... +void XEU5HandleCalculateDrawDownUp() +{ + // + XSignal signals[]; + xEU5Trader.GetSignals(signals); + int signalsCount = ArraySize(signals); + if (signalsCount <= 0) + { + return; + } + + // + double profit = 0; + double volume = 0; + XCollector collector = {}; + double maxAllowedVolume = xEU5VolumeManager.GetMaxAllowedVolume(); + for (int i = 0; i < signalsCount; i++) + { + // + XSignal iSignal = signals[i]; + + // + profit += iSignal.profit; + + // + volume = + volume == 0 || + volume < iSignal.volume + ? iSignal.volume + : volume; + } + + // + if (profit < 0) + { + // + xEU5MaxDrawDown = + xEU5MaxDrawDown == 0 || + xEU5MaxDrawDown > MathAbs(profit) + ? MathAbs(profit) + : xEU5MaxDrawDown; + + // + // Update Buffers ... + datetime time = iTime(_Symbol, _Period, 0); + + // + // Calculate Max Allowed Drawdown ... + // + collector.time = time; + collector.volume = volume; + collector.maxDrawDown = xEU5MaxDrawDown; + collector.maxAllowedVolume = maxAllowedVolume; + collector.minBalanceForOpenTrade = xEU5Trader.GetMinBalanceForOpenTrades(); + } + else + { + // + xEU5MaxDrawUp = + xEU5MaxDrawUp == 0 || + xEU5MaxDrawUp < profit + ? profit + : xEU5MaxDrawUp; + } + + // + // Update Collector ... + xEU5Collector.Add(collector); + + // + // Update Reports ... + xEU5Reporter.UpdateMaxDrawUpInReports(xEU5MaxDrawUp); + xEU5Reporter.UpdateMaxDrawDownInReports(xEU5MaxDrawDown); + xEU5Reporter.UpdateMaxSameTimeTradesInReports(signalsCount); +} + +// +// START Event Handlers ... +// + +// +// Runs When a Signal Successfully Executed ... +void XEU5OnSignal( + XSignal &signal, // Specified Signal + string &providers[] // Signal Providers +) +{ + // + // Issue Propper Alert ... + XEU5IssueSignalExecutionAlert( + signal, + providers); + + // + // Add Signal To Supports on Guard ... + xEU5Guard.AddSupport(signal); + + // + // Update Reports ... + xEU5Reporter.AddSignalToReports( + signal, + providers); +} + +// +// Runs when a Position Got Take Profit ... +void XEU5OnTP( + XSignal &signal // Specified Signal +) +{ + // + // Issue Propper Alert ... + XEU5IssueTPAlert(signal); + + // + // Remove Signal From Guard Protector ... + xEU5Guard.Remove(signal.ticket); + xEU5Guard.RemoveSupport(signal.ticket); + + // + // Update Reports ... + xEU5Reporter.AddTradeTPInReports(); + XEU5UpdateReports(); +} + +// +// Runs when a Position Got Stop Loss ... +void XEU5OnSL( + XSignal &signal // Specified Signal +) +{ + // + // Issue Propper Alert ... + XEU5IssueSLAlert(signal); + + // + // Remove Signal From Guard Protector ... + xEU5Guard.Remove(signal.ticket); + xEU5Guard.RemoveSupport(signal.ticket); + + // + // Update Reports ... + xEU5Reporter.AddTradeSLInReports(); + XEU5UpdateReports(); +} + +// +// Runs when a Position Risk Free ... +void XEU5OnRF( + XSignal &signal // Specified Signal +) +{ + // + // Issue Propper Alert ... + XEU5IssueRFAlert(signal); + + // + // Remove Signal From Guard Protector ... + // since RiskFree Signals has SL ... + xEU5Guard.Remove(signal.ticket); + xEU5Guard.RemoveSupport(signal.ticket); + + // + // Update Reports ... + xEU5Reporter.AddTradeSLInReports(); + XEU5UpdateReports(); +} + +// +// Runs when a Position Force Closed ... +void XEU5OnFC( + XSignal &signal // Specified Signal +) +{ + // + // Issue Propper Alert ... + XEU5IssueFCAlert(signal); + + // + // Remove Signal From Guard Protector ... + xEU5Guard.Remove(signal.ticket); + xEU5Guard.RemoveSupport(signal.ticket); + + // + // Update Reports ... + xEU5Reporter.AddTradeSLInReports(); + XEU5UpdateReports(); +} + +// +// Runs when a Position Guarded ... +void XEU5OnGuard( + XSignal &signal, // Specified Signal + ENUM_X_GUARD_REASONS reason, // Reason of Guard Applied + string message, // Guard Returned Message + bool isStopOut = false // Specified StopOut Fired or not +) +{ + // + // Chekc StopOut ... + if (isStopOut) + { + // + LogMessage(message); + + // + xEU5MEnableProvider = false; + } + + // + // Issue Propper Alert ... + XEU5IssueGuardAlert(signal, reason, isStopOut); + + // + // Update Reports ... + xEU5Reporter.AddTradeSLInReports(); + XEU5UpdateReports(); +} + +// +// END Event Handlers ... +// + +// +// END Provided Functions ... +// + +// +// START Private Functions ... +// + +// +// START Volume Baseed Functions ... +// + +// +// Calculating Volume for Tradings ... +double XEU5CalculateVolume( + double forceMultiplier = 0 // some times we get more than one signal at the same time, here we increase volume using this ... +) +{ + // + // Check Open Trades ... + int openSignals = xEU5Trader.Count(); + + // + double result = xEU5VolumeManager.CalculateVolume( + openSignals, + _Symbol); + + // + result *= forceMultiplier; + + // + // Normalize Volume ... + result = NormalizeVolume(result, _Symbol, 2); + + // + return result; +} + +// +// END Volume Baseed Functions ... +// + +// +// START Report/Collect and Guard Functions ... +// + +// +// Update Report Info ... +void XEU5UpdateReports() +{ + // + double staticVolume = xEU5VolumeManager.GetStaticVolume(); + string staticVolumeCalculationMethod = EnumToString(xEU5StaticVolumeMethod); + double maxAllowedVolume = xEU5VolumeManager.GetMaxAllowedVolume(); + double volumeIncreaseMultiplier = xEU5VolumeManager.GetVolumeMultiplier(); + double balanceGowingToApplyMultiplier = xEU5VolumeManager.GetIncreaseMultiplierBalance(); + + double balanceGrowingToIncreaseMaxAllowedVolume = xEU5VolumeManager.GetIncreaseMaxAllowedVolumeBalance(); + + // + // Update Reports Volume Info ... + xEU5Reporter.UpdateReportsVolumeInfo( + staticVolume, + staticVolumeCalculationMethod, + maxAllowedVolume, + volumeIncreaseMultiplier, + balanceGowingToApplyMultiplier, + balanceGrowingToIncreaseMaxAllowedVolume); + + // + // Calculate Max Allowed Drawdown ... + double minBalanceForTradeBasedOnBalance = xEU5Trader.GetMinBalanceForOpenTrades(); + xEU5Reporter.UpdateMinBalanceForOpenTradesInReports(minBalanceForTradeBasedOnBalance); +} + +// +// Reset XEU5 Info Buffers ... +void XEU5ResetCollectors() +{ + // + // Reset Calculations Buffers and Variables ... + xEU5MaxDrawUp = 0; + xEU5MaxDrawDown = 0; + + // + xEU5Trader.Reset(); + xEU5Reporter.Reset(); + xEU5Collector.Reset(); + xEU5VolumeManager.ResetForceVolumeMultiplier(); +} + +// +// END Report/Collect and Guard Functions ... +// + +// +// START Alert Functions ... +// + +// +// Send Alert ... +void XEU5IssueAlert(string message) +{ + // + // Validate Args ... + if (StringLen(message) <= 0) + { + return; + } + + // + if (xEU5EnableAlerts) + { + SendAlert(message); + } + else + { + LogMessage(message); + } +} + +// +// Send Take Profit Alert on Specific Signal ... +void XEU5IssueTPAlert( + XSignal &signal // Specified Signal +) +{ + // + string message = ""; + + // + message = xEU5Trader.GenerateSignalTPComment(signal); + + // + XEU5IssueAlert(message); +} + +// +// Send Stop Loss Alert on Specific Signal ... +void XEU5IssueSLAlert( + XSignal &signal // Specified Signal +) +{ + // + string message = ""; + + // + message = xEU5Trader.GenerateSignalSLComment(signal); + + // + XEU5IssueAlert(message); +} + +// +// Send Force Close Alert on Specific Signal ... +void XEU5IssueFCAlert( + XSignal &signal // Specified Signal +) +{ + // + string message = ""; + + // + message = xEU5Trader.GenerateSignalForceCloseComment(signal); + + // + XEU5IssueAlert(message); +} + +// +// Send Risk Free Alert on Specific Signal ... +void XEU5IssueRFAlert( + XSignal &signal // Specified Signal +) +{ + // + string message = ""; + + // + message = xEU5Trader.GenerateSignalRFComment(signal, 0); + + // + XEU5IssueAlert(message); +} + +// +// Send Guard Alert on Specific Signal ... +void XEU5IssueGuardAlert( + XSignal &signal, // Specified Signal + ENUM_X_GUARD_REASONS reason, // Specified Guard Reason + bool isStopOut = false // Specified StopOut Fired or not +) +{ + // + string message = ""; + + // + message = xEU5Guard.GenerateGuardedSignalComment( + signal, + reason); + + // + XEU5IssueAlert(message); +} + +// +// Send Initialization Succeed Alert ... +void XEU5IssueInitializationSucceedAlert() +{ + // + string message = "Initializion of (" + XEU5ProviderName + " Provider" + " _ " + _Symbol + " _ " + EnumToString(_Period) + ") Succeeded ..."; + XEU5IssueAlert(message); +} + +// +// Send De Initialization Succeed Alert ... +void XEU5IssueDeinitializationSucceedAlert() +{ + // + string message = "De Initializion of (" + XEU5ProviderName + " Provider" + ") Succeeded ..."; + XEU5IssueAlert(message); +} + +// +// Send Signal Successfully Execution Alert ... +void XEU5IssueSignalExecutionAlert( + XSignal &signal, // Specified Signal + string &providers[] // Signal Providers +) +{ + // + string message = xEU5Trader.ToString(signal); + + // + string providersMsg = ToString(providers); + if (StringLen(providersMsg) > 0) + { + message += ", Providers: " + providersMsg; + } + + // + XEU5IssueAlert(message); +} + +// +// Send Signal Execution Alert ... +void XEU5IssueSignalExecutionError(int error) +{ + // + string message = GetSignalExecutionError(error); + if (StringLen(message) == 0) + { + return; + } + + // + XEU5IssueAlert(message); +} + +// +// END Alert Functions ... +// + +// +// END Private Functions ... +// diff --git a/BKPS/OLD/XEU5-0/Settings/.gitkeep b/BKPS/OLD/XEU5-0/Settings/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/BKPS/OLD/XEU5-0/Templates/.gitkeep b/BKPS/OLD/XEU5-0/Templates/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/BKPS/OLD/XEU5-0/Templates/FundedNext.XEU5.Guarded.Signals.txt b/BKPS/OLD/XEU5-0/Templates/FundedNext.XEU5.Guarded.Signals.txt new file mode 100644 index 0000000..79c473c --- /dev/null +++ b/BKPS/OLD/XEU5-0/Templates/FundedNext.XEU5.Guarded.Signals.txt @@ -0,0 +1,548 @@ +2020.02.06 20:35:00 XEU5EA > Long Signal Provided by: +2020.02.06 20:35:00 XTAM +2020.02.06 20:35:00 Pusher: 1 +2020.02.06 20:35:00 Market Conditions: +2020.02.06 20:35:00 | XOBD | +2020.02.06 20:35:00 +2020.02.06 20:35:00 | XTM | +2020.02.06 20:35:00 isXTMBullish: true +2020.02.06 20:35:00 +2020.02.06 20:35:00 | XAMA | +2020.02.06 20:35:00 isXAMABullish: true +2020.02.06 20:35:00 +2020.02.06 20:35:00 | XTD | +2020.02.06 20:35:00 isXTDBullOverBear: true +2020.02.06 20:35:00 isXTDSignalOverBear: true +2020.02.06 20:35:00 +2020.02.06 20:35:00 | XFI | +2020.02.06 20:35:00 isXFIOverZero: true +2020.02.06 20:35:00 +2020.02.06 20:35:00 | XTS | +2020.02.06 20:35:00 isXTSCurrentMax: true +2020.02.06 20:35:00 isXTSCurrentOverFarest: true +2020.02.06 20:35:00 isXTSCurrentOverMediest: true +2020.02.06 20:35:00 +2020.02.06 20:35:00 | XLH | +2020.02.06 20:35:00 isXLHLLSameInLength: true +2020.02.06 20:35:00 +2020.02.06 20:35:00 | XRSI | +2020.02.06 20:35:00 +2020.02.06 20:35:00 | XCHLH | +2020.02.06 20:35:00 isXCHLHMCLCLLSame: true +2020.02.06 20:35:00 isXCHLHMCOnTopOfLC: true +2020.02.06 20:35:00 +2020.02.06 20:35:00 | XCHMA | +2020.02.06 20:35:00 isXCHMASCOverMin: true +2020.02.06 20:35:00 isXCHMASCUnderMax: true +2020.02.06 20:35:00 isXCHMASCUnderMin: true +2020.02.06 20:35:00 isXCHMASCTrendsUp: true +2020.02.06 20:35:00 isXCHMASCFastOverSlow: true +2020.02.06 20:35:00 isXCHMAMCVale: true +2020.02.06 20:35:00 isXCHMAMCTrendsDown: true +2020.02.06 20:35:00 isXCHMAMCFastUnderSlow: true +2020.02.06 20:35:00 isXCHMALCVale: true +2020.02.06 20:35:00 isXCHMALCTrendsUp: true +2020.02.06 20:35:00 isXCHMALCFastUnderSlow: true +2020.02.06 20:35:00 +2020.02.06 20:35:00 +2020.02.06 20:35:00 market buy 1.04 EURUSD tp: 1.10013 (1.09810 / 1.09813 / 1.09810) +2020.02.06 20:35:00 deal #785 buy 1.04 EURUSD at 1.09813 done (based on order #785) +2020.02.06 20:35:00 deal performed [#785 buy 1.04 EURUSD at 1.09813] +2020.02.06 20:35:00 order performed buy 1.04 at 1.09813 [#785 buy 1.04 EURUSD at 1.09813] +2020.02.06 20:35:00 XEU5EA > T(785)_TY(Long)_TP(1.10013)_SL(0.0)_RFS(6.0)_RFR(0.6), Providers: XTAM + + +2020.04.29 02:05:00 XEU5EA > Short Signal Provided by: +2020.04.29 02:05:00 XSI +2020.04.29 02:05:00 Pusher: 1 +2020.04.29 02:05:00 Market Conditions: +2020.04.29 02:05:00 | XOBD | +2020.04.29 02:05:00 +2020.04.29 02:05:00 | XTM | +2020.04.29 02:05:00 isXTMBullish: true +2020.04.29 02:05:00 +2020.04.29 02:05:00 | XAMA | +2020.04.29 02:05:00 isXAMABullish: true +2020.04.29 02:05:00 +2020.04.29 02:05:00 | XTD | +2020.04.29 02:05:00 isXTDBullOverBear: true +2020.04.29 02:05:00 isXTDSignalOverBear: true +2020.04.29 02:05:00 +2020.04.29 02:05:00 | XFI | +2020.04.29 02:05:00 isXFIOverZero: true +2020.04.29 02:05:00 +2020.04.29 02:05:00 | XTS | +2020.04.29 02:05:00 isXTSCurrentMax: true +2020.04.29 02:05:00 isXTSCurrentOverFarest: true +2020.04.29 02:05:00 +2020.04.29 02:05:00 | XLH | +2020.04.29 02:05:00 isXLHLLSameInLength: true +2020.04.29 02:05:00 isXLHPriceOverSignal: true +2020.04.29 02:05:00 +2020.04.29 02:05:00 | XRSI | +2020.04.29 02:05:00 isXRSICrossedUnderShortEntry: true +2020.04.29 02:05:00 +2020.04.29 02:05:00 | XCHLH | +2020.04.29 02:05:00 isXCHLHSCMCHHSame: true +2020.04.29 02:05:00 isXCHLHMCOnTopOfLC: true +2020.04.29 02:05:00 +2020.04.29 02:05:00 | XCHMA | +2020.04.29 02:05:00 isXCHMASCOverMax: true +2020.04.29 02:05:00 isXCHMASCOverMin: true +2020.04.29 02:05:00 isXCHMASCCrossedOverMax: true +2020.04.29 02:05:00 isXCHMASCPeak: true +2020.04.29 02:05:00 isXCHMASCTrendsUp: true +2020.04.29 02:05:00 isXCHMASCFastOverSlow: true +2020.04.29 02:05:00 isXCHMAMCTrendsDown: true +2020.04.29 02:05:00 isXCHMAMCFastUnderSlow: true +2020.04.29 02:05:00 isXCHMALCPeak: true +2020.04.29 02:05:00 isXCHMALCTrendsUp: true +2020.04.29 02:05:00 isXCHMALCFastOverSlow: true +2020.04.29 02:05:00 +2020.04.29 02:05:00 +2020.04.29 02:05:00 market sell 1.14 EURUSD tp: 1.08201 (1.08401 / 1.08451 / 1.08401) +2020.04.29 02:05:00 deal #975 sell 1.14 EURUSD at 1.08401 done (based on order #975) +2020.04.29 02:05:00 deal performed [#975 sell 1.14 EURUSD at 1.08401] +2020.04.29 02:05:00 order performed sell 1.14 at 1.08401 [#975 sell 1.14 EURUSD at 1.08401] +2020.04.29 02:05:00 XEU5EA > T(975)_TY(Short)_TP(1.08201)_SL(0.0)_RFS(6.0)_RFR(0.6), Providers: XSI + + +2020.05.25 21:10:00 XEU5EA > Short Signal Provided by: +2020.05.25 21:10:00 XTAM +2020.05.25 21:10:00 Pusher: 1 +2020.05.25 21:10:00 Market Conditions: +2020.05.25 21:10:00 | XOBD | +2020.05.25 21:10:00 +2020.05.25 21:10:00 | XTM | +2020.05.25 21:10:00 isXTMBearish: true +2020.05.25 21:10:00 +2020.05.25 21:10:00 | XAMA | +2020.05.25 21:10:00 isXAMABearish: true +2020.05.25 21:10:00 +2020.05.25 21:10:00 | XTD | +2020.05.25 21:10:00 isXTDSignalUnderBear: true +2020.05.25 21:10:00 isXTDBullCrossedUnderBear: true +2020.05.25 21:10:00 +2020.05.25 21:10:00 | XFI | +2020.05.25 21:10:00 isXFIUnderZero: true +2020.05.25 21:10:00 +2020.05.25 21:10:00 | XTS | +2020.05.25 21:10:00 isXTSCurrentMin: true +2020.05.25 21:10:00 isXTSCurrentUnderFarest: true +2020.05.25 21:10:00 isXTSCurrentUnderNearest: true +2020.05.25 21:10:00 isXTSCurrentUnderMediest: true +2020.05.25 21:10:00 isXTSCurrentCrossedUnderNearest: true +2020.05.25 21:10:00 isXTSCurrentCrossedUnderMediest: true +2020.05.25 21:10:00 +2020.05.25 21:10:00 | XLH | +2020.05.25 21:10:00 isXLHHHSameInLength: true +2020.05.25 21:10:00 isXLHPriceCrossedOverSignal: true +2020.05.25 21:10:00 isXLHPriceOverSignal: true +2020.05.25 21:10:00 +2020.05.25 21:10:00 | XRSI | +2020.05.25 21:10:00 +2020.05.25 21:10:00 | XCHLH | +2020.05.25 21:10:00 isXCHLHMCOnTopOfLC: true +2020.05.25 21:10:00 +2020.05.25 21:10:00 | XCHMA | +2020.05.25 21:10:00 isXCHMASCOverMin: true +2020.05.25 21:10:00 isXCHMASCUnderMax: true +2020.05.25 21:10:00 isXCHMASCTrendsUp: true +2020.05.25 21:10:00 isXCHMASCFastUnderSlow: true +2020.05.25 21:10:00 isXCHMAMCFastOverSlow: true +2020.05.25 21:10:00 isXCHMALCVale: true +2020.05.25 21:10:00 isXCHMALCTrendsDown: true +2020.05.25 21:10:00 isXCHMALCFastUnderSlow: true +2020.05.25 21:10:00 +2020.05.25 21:10:00 +2020.05.25 21:10:00 market sell 1.05 EURUSD tp: 1.08760 (1.08960 / 1.08966 / 1.08960) +2020.05.25 21:10:00 deal #1036 sell 1.05 EURUSD at 1.08960 done (based on order #1036) +2020.05.25 21:10:00 deal performed [#1036 sell 1.05 EURUSD at 1.08960] +2020.05.25 21:10:00 order performed sell 1.05 at 1.08960 [#1036 sell 1.05 EURUSD at 1.08960] +2020.05.25 21:10:00 XEU5EA > T(1036)_TY(Short)_TP(1.0876)_SL(0.0)_RFS(6.0)_RFR(0.6), Providers: XTAM + + +2020.07.10 19:15:00 XEU5EA > Short Signal Provided by: +2020.07.10 19:15:00 XTAM +2020.07.10 19:15:00 Pusher: 1 +2020.07.10 19:15:00 Market Conditions: +2020.07.10 19:15:00 | XOBD | +2020.07.10 19:15:00 +2020.07.10 19:15:00 | XTM | +2020.07.10 19:15:00 isXTMStartBearish: true +2020.07.10 19:15:00 isXTMStartBearishAfterNeutural: true +2020.07.10 19:15:00 isXTMBearish: true +2020.07.10 19:15:00 +2020.07.10 19:15:00 | XAMA | +2020.07.10 19:15:00 isXAMAStartBearish: true +2020.07.10 19:15:00 isXAMAStartBearishAfterNeutural: true +2020.07.10 19:15:00 isXAMABearish: true +2020.07.10 19:15:00 +2020.07.10 19:15:00 | XTD | +2020.07.10 19:15:00 isXTDBullOverBear: true +2020.07.10 19:15:00 isXTDSignalOverBear: true +2020.07.10 19:15:00 +2020.07.10 19:15:00 | XFI | +2020.07.10 19:15:00 isXFIUnderZero: true +2020.07.10 19:15:00 isXFICrossedUnderZero: true +2020.07.10 19:15:00 +2020.07.10 19:15:00 | XTS | +2020.07.10 19:15:00 isXTSCurrentMin: true +2020.07.10 19:15:00 isXTSCurrentUnderFarest: true +2020.07.10 19:15:00 isXTSCurrentUnderNearest: true +2020.07.10 19:15:00 isXTSCurrentUnderMediest: true +2020.07.10 19:15:00 +2020.07.10 19:15:00 | XLH | +2020.07.10 19:15:00 isXLHHHSameInLength: true +2020.07.10 19:15:00 +2020.07.10 19:15:00 | XRSI | +2020.07.10 19:15:00 +2020.07.10 19:15:00 | XCHLH | +2020.07.10 19:15:00 isXCHLHMCLCHHSame: true +2020.07.10 19:15:00 isXCHLHMCOnTopOfLC: true +2020.07.10 19:15:00 +2020.07.10 19:15:00 | XCHMA | +2020.07.10 19:15:00 isXCHMASCOverMax: true +2020.07.10 19:15:00 isXCHMASCOverMin: true +2020.07.10 19:15:00 isXCHMASCUnderMax: true +2020.07.10 19:15:00 isXCHMASCTrendsDown: true +2020.07.10 19:15:00 isXCHMASCFastOverSlow: true +2020.07.10 19:15:00 isXCHMAMCPeak: true +2020.07.10 19:15:00 isXCHMAMCTrendsDown: true +2020.07.10 19:15:00 isXCHMAMCFastOverSlow: true +2020.07.10 19:15:00 isXCHMALCPeak: true +2020.07.10 19:15:00 isXCHMALCTrendsDown: true +2020.07.10 19:15:00 isXCHMALCFastUnderSlow: true +2020.07.10 19:15:00 +2020.07.10 19:15:00 +2020.07.10 19:15:00 market sell 0.22 EURUSD tp: 1.12803 (1.13003 / 1.13007 / 1.13003) +2020.07.10 19:15:00 deal #1174 sell 0.22 EURUSD at 1.13003 done (based on order #1174) +2020.07.10 19:15:00 deal performed [#1174 sell 0.22 EURUSD at 1.13003] +2020.07.10 19:15:00 order performed sell 0.22 at 1.13003 [#1174 sell 0.22 EURUSD at 1.13003] +2020.07.10 19:15:00 XEU5EA > T(1174)_TY(Short)_TP(1.12803)_SL(0.0)_RFS(6.0)_RFR(0.6), Providers: XTAM + + +2020.09.28 02:05:00 XEU5EA > Short Signal Provided by: +2020.09.28 02:05:00 XTAM +2020.09.28 02:05:00 Pusher: 1 +2020.09.28 02:05:00 Market Conditions: +2020.09.28 02:05:00 | XOBD | +2020.09.28 02:05:00 +2020.09.28 02:05:00 | XTM | +2020.09.28 02:05:00 isXTMBearish: true +2020.09.28 02:05:00 +2020.09.28 02:05:00 | XAMA | +2020.09.28 02:05:00 isXAMABearish: true +2020.09.28 02:05:00 +2020.09.28 02:05:00 | XTD | +2020.09.28 02:05:00 isXTDBullUnderBear: true +2020.09.28 02:05:00 isXTDSignalUnderBear: true +2020.09.28 02:05:00 +2020.09.28 02:05:00 | XFI | +2020.09.28 02:05:00 isXFIUnderZero: true +2020.09.28 02:05:00 +2020.09.28 02:05:00 | XTS | +2020.09.28 02:05:00 isXTSCurrentMin: true +2020.09.28 02:05:00 isXTSCurrentUnderFarest: true +2020.09.28 02:05:00 +2020.09.28 02:05:00 | XLH | +2020.09.28 02:05:00 isXLHHHSameInLength: true +2020.09.28 02:05:00 isXLHPriceUnderSignal: true +2020.09.28 02:05:00 +2020.09.28 02:05:00 | XRSI | +2020.09.28 02:05:00 isXRSICrossedUnderShortExit: true +2020.09.28 02:05:00 +2020.09.28 02:05:00 | XCHLH | +2020.09.28 02:05:00 isXCHLHSCMCLLSame: true +2020.09.28 02:05:00 isXCHLHMCOnTopOfLC: true +2020.09.28 02:05:00 +2020.09.28 02:05:00 | XCHMA | +2020.09.28 02:05:00 isXCHMASCUnderMax: true +2020.09.28 02:05:00 isXCHMASCUnderMin: true +2020.09.28 02:05:00 isXCHMASCVale: true +2020.09.28 02:05:00 isXCHMASCTrendsUp: true +2020.09.28 02:05:00 isXCHMASCFastUnderSlow: true +2020.09.28 02:05:00 isXCHMAMCTrendsUp: true +2020.09.28 02:05:00 isXCHMAMCFastUnderSlow: true +2020.09.28 02:05:00 isXCHMALCVale: true +2020.09.28 02:05:00 isXCHMALCTrendsDown: true +2020.09.28 02:05:00 isXCHMALCFastUnderSlow: true +2020.09.28 02:05:00 +2020.09.28 02:05:00 +2020.09.28 02:05:00 market sell 0.36 EURUSD tp: 1.15989 (1.16189 / 1.16191 / 1.16189) +2020.09.28 02:05:00 deal #1364 sell 0.36 EURUSD at 1.16189 done (based on order #1364) +2020.09.28 02:05:00 deal performed [#1364 sell 0.36 EURUSD at 1.16189] +2020.09.28 02:05:00 order performed sell 0.36 at 1.16189 [#1364 sell 0.36 EURUSD at 1.16189] +2020.09.28 02:05:00 XEU5EA > T(1364)_TY(Short)_TP(1.15989)_SL(0.0)_RFS(6.0)_RFR(0.6), Providers: XTAM + + +2021.03.04 05:20:00 XEU5EA > Long Signal Provided by: +2021.03.04 05:20:00 XTAM +2021.03.04 05:20:00 Pusher: 1 +2021.03.04 05:20:00 Market Conditions: +2021.03.04 05:20:00 | XOBD | +2021.03.04 05:20:00 +2021.03.04 05:20:00 | XTM | +2021.03.04 05:20:00 isXTMStartBullish: true +2021.03.04 05:20:00 isXTMStartBullishAfterNeutural: true +2021.03.04 05:20:00 isXTMBullish: true +2021.03.04 05:20:00 +2021.03.04 05:20:00 | XAMA | +2021.03.04 05:20:00 isXAMAStartBullish: true +2021.03.04 05:20:00 isXAMAStartBullishAfterNeutural: true +2021.03.04 05:20:00 isXAMABullish: true +2021.03.04 05:20:00 +2021.03.04 05:20:00 | XTD | +2021.03.04 05:20:00 isXTDBearishVale: true +2021.03.04 05:20:00 isXTDBullOverBear: true +2021.03.04 05:20:00 isXTDSignalOverBear: true +2021.03.04 05:20:00 +2021.03.04 05:20:00 | XFI | +2021.03.04 05:20:00 isXFIOverZero: true +2021.03.04 05:20:00 +2021.03.04 05:20:00 | XTS | +2021.03.04 05:20:00 isXTSCurrentMax: true +2021.03.04 05:20:00 isXTSCurrentOverFarest: true +2021.03.04 05:20:00 isXTSCurrentOverMediest: true +2021.03.04 05:20:00 isXTSCurrentCrossedOverMediest: true +2021.03.04 05:20:00 +2021.03.04 05:20:00 | XLH | +2021.03.04 05:20:00 isXLHLLSameInLength: true +2021.03.04 05:20:00 +2021.03.04 05:20:00 | XRSI | +2021.03.04 05:20:00 +2021.03.04 05:20:00 | XCHLH | +2021.03.04 05:20:00 isXCHLHMCOnTopOfLC: true +2021.03.04 05:20:00 +2021.03.04 05:20:00 | XCHMA | +2021.03.04 05:20:00 isXCHMASCUnderMax: true +2021.03.04 05:20:00 isXCHMASCUnderMin: true +2021.03.04 05:20:00 isXCHMASCTrendsUp: true +2021.03.04 05:20:00 isXCHMASCFastOverSlow: true +2021.03.04 05:20:00 isXCHMAMCVale: true +2021.03.04 05:20:00 isXCHMAMCTrendsDown: true +2021.03.04 05:20:00 isXCHMAMCFastUnderSlow: true +2021.03.04 05:20:00 isXCHMALCVale: true +2021.03.04 05:20:00 isXCHMALCTrendsUp: true +2021.03.04 05:20:00 isXCHMALCFastUnderSlow: true +2021.03.04 05:20:00 +2021.03.04 05:20:00 +2021.03.04 05:20:00 market buy 0.4 EURUSD tp: 1.20764 (1.20563 / 1.20564 / 1.20563) +2021.03.04 05:20:00 deal #1558 buy 0.4 EURUSD at 1.20564 done (based on order #1558) +2021.03.04 05:20:00 deal performed [#1558 buy 0.4 EURUSD at 1.20564] +2021.03.04 05:20:00 order performed buy 0.4 at 1.20564 [#1558 buy 0.4 EURUSD at 1.20564] +2021.03.04 05:20:00 XEU5EA > T(1558)_TY(Long)_TP(1.20764)_SL(0.0)_RFS(6.0)_RFR(0.6), Providers: XTAM + + +2021.05.17 07:40:00 XEU5EA > Short Signal Provided by: +2021.05.17 07:40:00 XOBDLH +2021.05.17 07:40:00 Pusher: 1 +2021.05.17 07:40:00 Market Conditions: +2021.05.17 07:40:00 | XOBD | +2021.05.17 07:40:00 +2021.05.17 07:40:00 | XTM | +2021.05.17 07:40:00 isXTMBullish: true +2021.05.17 07:40:00 +2021.05.17 07:40:00 | XAMA | +2021.05.17 07:40:00 isXAMABullish: true +2021.05.17 07:40:00 +2021.05.17 07:40:00 | XTD | +2021.05.17 07:40:00 isXTDBullOverBear: true +2021.05.17 07:40:00 isXTDSignalOverBear: true +2021.05.17 07:40:00 +2021.05.17 07:40:00 | XFI | +2021.05.17 07:40:00 isXFIOverZero: true +2021.05.17 07:40:00 +2021.05.17 07:40:00 | XTS | +2021.05.17 07:40:00 isXTSCurrentMax: true +2021.05.17 07:40:00 isXTSCurrentOverFarest: true +2021.05.17 07:40:00 isXTSCurrentOverNearest: true +2021.05.17 07:40:00 isXTSCurrentOverMediest: true +2021.05.17 07:40:00 isXTSCurrentCrossedOverNearest: true +2021.05.17 07:40:00 +2021.05.17 07:40:00 | XLH | +2021.05.17 07:40:00 isXLHHighAttachedHH: true +2021.05.17 07:40:00 isXLHLLSameInLength: true +2021.05.17 07:40:00 isXLHPriceOverSignal: true +2021.05.17 07:40:00 +2021.05.17 07:40:00 | XRSI | +2021.05.17 07:40:00 +2021.05.17 07:40:00 | XCHLH | +2021.05.17 07:40:00 isXCHLHSCMCHHSame: true +2021.05.17 07:40:00 isXCHLHMCOnTopOfLC: true +2021.05.17 07:40:00 +2021.05.17 07:40:00 | XCHMA | +2021.05.17 07:40:00 isXCHMASCOverMax: true +2021.05.17 07:40:00 isXCHMASCOverMin: true +2021.05.17 07:40:00 isXCHMASCUnderMax: true +2021.05.17 07:40:00 isXCHMASCTrendsUp: true +2021.05.17 07:40:00 isXCHMASCFastOverSlow: true +2021.05.17 07:40:00 isXCHMAMCTrendsDown: true +2021.05.17 07:40:00 isXCHMAMCFastUnderSlow: true +2021.05.17 07:40:00 isXCHMALCPeak: true +2021.05.17 07:40:00 isXCHMALCTrendsDown: true +2021.05.17 07:40:00 isXCHMALCFastOverSlow: true +2021.05.17 07:40:00 +2021.05.17 07:40:00 +2021.05.17 07:40:00 market sell 0.16 EURUSD tp: 1.21210 (1.21410 / 1.21460 / 1.21410) +2021.05.17 07:40:00 deal #1701 sell 0.16 EURUSD at 1.21410 done (based on order #1701) +2021.05.17 07:40:00 deal performed [#1701 sell 0.16 EURUSD at 1.21410] +2021.05.17 07:40:00 order performed sell 0.16 at 1.21410 [#1701 sell 0.16 EURUSD at 1.21410] +2021.05.17 07:40:00 XEU5EA > T(1701)_TY(Short)_TP(1.2121)_SL(0.0)_RFS(6.0)_RFR(0.6), Providers: XOBDLH + + +2021.05.17 22:05:00 XEU5EA > Short Signal Provided by: +2021.05.17 22:05:00 XTAM +2021.05.17 22:05:00 Pusher: 1 +2021.05.17 22:05:00 Market Conditions: +2021.05.17 22:05:00 | XOBD | +2021.05.17 22:05:00 +2021.05.17 22:05:00 | XTM | +2021.05.17 22:05:00 isXTMVale: true +2021.05.17 22:05:00 isXTMBearish: true +2021.05.17 22:05:00 +2021.05.17 22:05:00 | XAMA | +2021.05.17 22:05:00 isXAMABearish: true +2021.05.17 22:05:00 +2021.05.17 22:05:00 | XTD | +2021.05.17 22:05:00 isXTDBullUnderBear: true +2021.05.17 22:05:00 isXTDSignalUnderBear: true +2021.05.17 22:05:00 +2021.05.17 22:05:00 | XFI | +2021.05.17 22:05:00 isXFIUnderZero: true +2021.05.17 22:05:00 +2021.05.17 22:05:00 | XTS | +2021.05.17 22:05:00 isXTSCurrentMin: true +2021.05.17 22:05:00 isXTSCurrentUnderFarest: true +2021.05.17 22:05:00 +2021.05.17 22:05:00 | XLH | +2021.05.17 22:05:00 isXLHHHSameInLength: true +2021.05.17 22:05:00 isXLHPriceInSignalRange: true +2021.05.17 22:05:00 +2021.05.17 22:05:00 | XRSI | +2021.05.17 22:05:00 +2021.05.17 22:05:00 | XCHLH | +2021.05.17 22:05:00 isXCHLHMCOnTopOfLC: true +2021.05.17 22:05:00 +2021.05.17 22:05:00 | XCHMA | +2021.05.17 22:05:00 isXCHMASCOverMin: true +2021.05.17 22:05:00 isXCHMASCUnderMax: true +2021.05.17 22:05:00 isXCHMASCCrossedUnderMax: true +2021.05.17 22:05:00 isXCHMASCVale: true +2021.05.17 22:05:00 isXCHMASCTrendsUp: true +2021.05.17 22:05:00 isXCHMASCFastUnderSlow: true +2021.05.17 22:05:00 isXCHMAMCTrendsDown: true +2021.05.17 22:05:00 isXCHMAMCFastOverSlow: true +2021.05.17 22:05:00 isXCHMALCPeak: true +2021.05.17 22:05:00 isXCHMALCTrendsDown: true +2021.05.17 22:05:00 isXCHMALCFastOverSlow: true +2021.05.17 22:05:00 +2021.05.17 22:05:00 +2021.05.17 22:05:00 market sell 0.16 EURUSD tp: 1.21306 (1.21506 / 1.21533 / 1.21506) +2021.05.17 22:05:00 deal #1706 sell 0.16 EURUSD at 1.21506 done (based on order #1706) +2021.05.17 22:05:00 deal performed [#1706 sell 0.16 EURUSD at 1.21506] +2021.05.17 22:05:00 order performed sell 0.16 at 1.21506 [#1706 sell 0.16 EURUSD at 1.21506] +2021.05.17 22:05:00 XEU5EA > T(1706)_TY(Short)_TP(1.21306)_SL(0.0)_RFS(6.0)_RFR(0.6), Providers: XTAM + + +2021.08.16 23:10:00 XEU5EA > Long Signal Provided by: +2021.08.16 23:10:00 XTAM +2021.08.16 23:10:00 Pusher: 1 +2021.08.16 23:10:00 Market Conditions: +2021.08.16 23:10:00 | XOBD | +2021.08.16 23:10:00 +2021.08.16 23:10:00 | XTM | +2021.08.16 23:10:00 isXTMBullish: true +2021.08.16 23:10:00 +2021.08.16 23:10:00 | XAMA | +2021.08.16 23:10:00 isXAMABullish: true +2021.08.16 23:10:00 +2021.08.16 23:10:00 | XTD | +2021.08.16 23:10:00 isXTDBullOverBear: true +2021.08.16 23:10:00 isXTDSignalCrossedOverBear: true +2021.08.16 23:10:00 +2021.08.16 23:10:00 | XFI | +2021.08.16 23:10:00 isXFIOverZero: true +2021.08.16 23:10:00 +2021.08.16 23:10:00 | XTS | +2021.08.16 23:10:00 isXTSCurrentMax: true +2021.08.16 23:10:00 isXTSCurrentOverFarest: true +2021.08.16 23:10:00 +2021.08.16 23:10:00 | XLH | +2021.08.16 23:10:00 isXLHLLSameInLength: true +2021.08.16 23:10:00 isXLHPriceOverSignal: true +2021.08.16 23:10:00 +2021.08.16 23:10:00 | XRSI | +2021.08.16 23:10:00 +2021.08.16 23:10:00 | XCHLH | +2021.08.16 23:10:00 isXCHLHMCOnTopOfLC: true +2021.08.16 23:10:00 +2021.08.16 23:10:00 | XCHMA | +2021.08.16 23:10:00 isXCHMASCOverMin: true +2021.08.16 23:10:00 isXCHMASCUnderMax: true +2021.08.16 23:10:00 isXCHMASCTrendsUp: true +2021.08.16 23:10:00 isXCHMASCFastOverSlow: true +2021.08.16 23:10:00 isXCHMAMCVale: true +2021.08.16 23:10:00 isXCHMAMCTrendsDown: true +2021.08.16 23:10:00 isXCHMAMCFastUnderSlow: true +2021.08.16 23:10:00 isXCHMALCPeak: true +2021.08.16 23:10:00 isXCHMALCTrendsDown: true +2021.08.16 23:10:00 isXCHMALCFastOverSlow: true +2021.08.16 23:10:00 +2021.08.16 23:10:00 +2021.08.16 23:10:00 market buy 0.42 EURUSD tp: 1.17985 (1.17780 / 1.17785 / 1.17780) +2021.08.16 23:10:00 deal #1924 buy 0.42 EURUSD at 1.17785 done (based on order #1924) +2021.08.16 23:10:00 deal performed [#1924 buy 0.42 EURUSD at 1.17785] +2021.08.16 23:10:00 order performed buy 0.42 at 1.17785 [#1924 buy 0.42 EURUSD at 1.17785] +2021.08.16 23:10:00 XEU5EA > T(1924)_TY(Long)_TP(1.17985)_SL(0.0)_RFS(6.0)_RFR(0.6), Providers: XTAM + + +2023.06.08 02:05:00 XEU5EA > Short Signal Provided by: +2023.06.08 02:05:00 XCHMACC +2023.06.08 02:05:00 Pusher: 1 +2023.06.08 02:05:00 Market Conditions: +2023.06.08 02:05:00 | XOBD | +2023.06.08 02:05:00 +2023.06.08 02:05:00 | XTM | +2023.06.08 02:05:00 isXTMNeutural: true +2023.06.08 02:05:00 +2023.06.08 02:05:00 | XAMA | +2023.06.08 02:05:00 isXAMANeutural: true +2023.06.08 02:05:00 +2023.06.08 02:05:00 | XTD | +2023.06.08 02:05:00 isXTDBullOverBear: true +2023.06.08 02:05:00 isXTDSignalUnderBear: true +2023.06.08 02:05:00 +2023.06.08 02:05:00 | XFI | +2023.06.08 02:05:00 isXFIOverZero: true +2023.06.08 02:05:00 +2023.06.08 02:05:00 | XTS | +2023.06.08 02:05:00 isXTSCurrentMax: true +2023.06.08 02:05:00 isXTSCurrentOverFarest: true +2023.06.08 02:05:00 +2023.06.08 02:05:00 | XLH | +2023.06.08 02:05:00 isXLHHHSameInLength: true +2023.06.08 02:05:00 isXLHLLSameInLength: true +2023.06.08 02:05:00 isXLHPriceOverSignal: true +2023.06.08 02:05:00 +2023.06.08 02:05:00 | XRSI | +2023.06.08 02:05:00 +2023.06.08 02:05:00 | XCHLH | +2023.06.08 02:05:00 isXCHLHMCOnTopOfLC: true +2023.06.08 02:05:00 +2023.06.08 02:05:00 | XCHMA | +2023.06.08 02:05:00 isXCHMASCUnderMax: true +2023.06.08 02:05:00 isXCHMASCUnderMin: true +2023.06.08 02:05:00 isXCHMASCTrendsUp: true +2023.06.08 02:05:00 isXCHMASCFastUnderSlow: true +2023.06.08 02:05:00 isXCHMAMCTrendsDown: true +2023.06.08 02:05:00 isXCHMAMCFastUnderSlow: true +2023.06.08 02:05:00 isXCHMALCTrendsDown: true +2023.06.08 02:05:00 isXCHMALCFastUnderSlow: true +2023.06.08 02:05:00 +2023.06.08 02:05:00 +2023.06.08 02:05:00 market sell 5.21 EURUSD tp: 1.06802 (1.07002 / 1.07003 / 1.07002) +2023.06.08 02:05:00 deal #3489 sell 5.21 EURUSD at 1.07002 done (based on order #3489) +2023.06.08 02:05:00 deal performed [#3489 sell 5.21 EURUSD at 1.07002] +2023.06.08 02:05:00 order performed sell 5.21 at 1.07002 [#3489 sell 5.21 EURUSD at 1.07002] +2023.06.08 02:05:00 XEU5EA > T(3489)_TY(Short)_TP(1.06802)_SL(0.0)_RFS(6.0)_RFR(0.6), Providers: XCHMACC diff --git a/BKPS/OLD/XEU5/Classes/.gitkeep b/BKPS/OLD/XEU5/Classes/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/BKPS/OLD/XEU5/Classes/x-saherelm.class.lib.mq5 b/BKPS/OLD/XEU5/Classes/x-saherelm.class.lib.mq5 new file mode 100644 index 0000000..68f4847 --- /dev/null +++ b/BKPS/OLD/XEU5/Classes/x-saherelm.class.lib.mq5 @@ -0,0 +1,10316 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 Class Library +// -------------------------------------- +// Name: XClass +// Description: provides all classes for use ... +// +// +// Maintainer: +// ------------ +// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) +// +////////////////////////////////////////////////////// +// +// Global Properties ... +#property library +#property copyright "Copyright 2023, SaherElm IT Center" +#property link "https://www.saherelm.ir" +#property version "1.00" +#property strict + +// +#include +#include +#include +#include +#include +#include +// +#include "../Libraries/x-saherelm.draw.lib.mq5" +#include "../Libraries/x-saherelm.alert.lib.mq5" +#include "../Libraries/x-saherelm.models.lib.mq5" +#include "../Libraries/x-saherelm.common.lib.mq5" + +// +// START Constant Definitions ... +// + +static uchar _md5_PADDING[64] = + { + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; + +#define _md5_F(x, y, z) (((x) & (y)) | ((~x) & (z))) +#define _md5_G(x, y, z) (((x) & (z)) | ((y) & (~z))) +#define _md5_H(x, y, z) ((x) ^ (y) ^ (z)) +#define _md5_I(x, y, z) ((y) ^ ((x) | (~z))) +#define _md5_ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32 - (n)))) + +#define _md5_FF(a, b, c, d, x, s, ac) \ + { \ + (a) += _md5_F((b), (c), (d)) + (x) + (uint)(ac); \ + (a) = _md5_ROTATE_LEFT((a), (s)); \ + (a) += (b); \ + } +#define _md5_GG(a, b, c, d, x, s, ac) \ + { \ + (a) += _md5_G((b), (c), (d)) + (x) + (uint)(ac); \ + (a) = _md5_ROTATE_LEFT((a), (s)); \ + (a) += (b); \ + } +#define _md5_HH(a, b, c, d, x, s, ac) \ + { \ + (a) += _md5_H((b), (c), (d)) + (x) + (uint)(ac); \ + (a) = _md5_ROTATE_LEFT((a), (s)); \ + (a) += (b); \ + } +#define _md5_II(a, b, c, d, x, s, ac) \ + { \ + (a) += _md5_I((b), (c), (d)) + (x) + (uint)(ac); \ + (a) = _md5_ROTATE_LEFT((a), (s)); \ + (a) += (b); \ + } + +#define _md5_INIT_STATE_0 0x67452301 +#define _md5_INIT_STATE_1 0xefcdab89 +#define _md5_INIT_STATE_2 0x98badcfe +#define _md5_INIT_STATE_3 0x10325476 + +#define _md5_S11 7 +#define _md5_S12 12 +#define _md5_S13 17 +#define _md5_S14 22 + +#define _md5_S21 5 +#define _md5_S22 9 +#define _md5_S23 14 +#define _md5_S24 20 + +#define _md5_S31 4 +#define _md5_S32 11 +#define _md5_S33 16 +#define _md5_S34 23 + +#define _md5_S41 6 +#define _md5_S42 10 +#define _md5_S43 15 +#define _md5_S44 21 + +// +// END Constant Definitions ... +// + +// +// START Model Definitions ... +// + +// +string X_SIGNAL_TP = "TP"; +string X_SIGNAL_SL = "SL"; +string X_SIGNAL_TYPE = "TY"; +string X_SIGNAL_TICKET = "T"; +string X_SIGNAL_RISKFREE_STEP = "RFS"; +string X_SIGNAL_RISKFREE_RATE = "RFR"; + +// +// Model Signal Handler Result on XCTrade Class ... +struct XTraderHandlerResult +{ + // + // List Of Closed On SL Signals ... + XSignal sl[]; + + // + // List Of Closed On TP Signals ... + XSignal tp[]; + + // + // List Of Risk Free Signals ... + XSignal rf[]; +}; + +// +// Model OnTrade Event Handler Result on XCTrade Class ... +struct XOnTradeHandlerResult +{ + // + bool hasNewDeal; + int newDeals; + + // + bool hasNewOrder; + int newOrders; + + // + bool hasNewPosition; + int newPositions; + + // + bool hasNewHistoryOrder; + int newHistoryOrders; +}; + +// +// Model Guard Action Applied Signals ... +struct XGuardHandlerResult +{ + // + // Critical Guard ... + XSignal criticals[]; + + // + // Max Guard ... + XSignal maxes[]; + + // + // Old ... + XSignal olds[]; + + // + // Determines Stopout Action Cals or not ... + bool isStopOut; +}; + +// +// Define Volume States ... +struct XVolumeInfo +{ + // + // Current Available Static Volume ... + double staticVolume; + + // + // Static Volume Calculation Method ... + string staticVolumeCalculationMethod; + + // + // Current Maximum Appliable Volume ... + double maxAllowedVolume; + + // + // Static Volume Increase Multiplier ... + double volumeIncreaseMultiplier; + + // + // Multiply Volume Based On Balance Growing ... + double balanceGowingToApplyMultiplier; + + // + // Where to Increase MaxAllowed Volume ... + double balanceGrowingToIncreaseMaxAllowedVolume; +}; + +// +// Model a Simple Provider Status ... +struct XSignallerInfo +{ + // + // Provider Name ... + string name; + + // + // Number of Longs ... + int longs; + + // + // Number of Shorts ... + int shorts; +}; + +// +// Model Some of Usefull Signals and Market Data ... +struct XSummaryInfo +{ + // + // Define Max Signal Volume ... + double maxSignalVolume; + + // + // Max DrawDown ... + double maxDrawDown; + + // + // Max DrawUp ... + double maxDrawUp; + + // + // Max Number of Same Time Signals ... + int maxSameTimeSignals; + + // + // Number of Long Trades ... + int longSignals; + + // + // Number of Short Trades ... + int shortSignals; + + // + // Number of TPs Attached ... + int numberOfTPs; + + // + // Number of SLs Attached ... + int numberOfSLs; +}; + +// +// Model Account info ... +struct XAccountInfo +{ + // + // User Account ... + string user; + + // + // Name of Client ... + string name; + + // + // Trade Server Name ... + string server; + + // + // Broker Name ... + string broker; + + // + // Account Trade Mode ... + ENUM_ACCOUNT_TRADE_MODE mode; + + // + // Account Leverage ... + long leverage; + + // + // Currency ... + string currency; + + // + // Deposit ... + double deposit; + + // + // Balance ... + double balance; + + // + // Min Balance for Open Trades ... + double minBalanceForOpenTrades; +}; + +// +// this is a Model Which holds Reports for Specific Time Periods ... +struct XReport +{ + // + datetime start; + + // + datetime end; + + // + XAccountInfo accountInfo; + + // + XVolumeInfo volumeInfo; + + // + XSignallerInfo signallersInfo[]; + + // + XSummaryInfo summaryInfo; +}; + +// +// an Enumeration Object which determines Report Type ... +enum ENUM_XREPORT_TYPES +{ + // + // Main Report ... + XREPORT_MAIN, + // + // Daily Report ... + XREPORT_DAILY, + // + // Weekly Report ... + XREPORT_WEEKLY, + // + // Monthly Report ... + XREPORT_MONTHLY, +}; + +// +// a Signal Protection Structure ... +struct XProtectedSignal +{ + // + ulong ticket; + + // + datetime time[]; + + // + double profit[]; +}; + +// +// Represent Collector State Based on Time ... +struct XCollector +{ + // + // time in checking ... + datetime time; + + // + // Signal Volume ... + double volume; + + // + // Max DrawDown in Check Time ... + double maxDrawDown; + + // + // Max Allowed Volume in Check Time ... + double maxAllowedVolume; + + // + // Minimum required Balance for Opening Trades at Check Time ... + double minBalanceForOpenTrade; +}; + +// +// Cross Signals Methods ... +enum ENUM_X_CROSS_SIGNAL_METHOD +{ + // + // Do Nothing and Ignore them ... + X_CROSS_SIGNAL_DO_NOTHING, + // + // Accept all Cross Signals and Act Usually ... + X_CROSS_SIGNAL_REGULAR, + // + // Accept all Cross Signals and for Directional Act Usually and for Indirectional Ac Important ... + X_CROSS_SIGNAL_DIRECTION_REGULAR_INDIRECTION_IMPORTANT, + // + // Accept all Cross Signals and for Directional Act Important and for Indirectional Ac Usually ... + X_CROSS_SIGNAL_DIRECTION_IMPORTANT_INDIRECTION_REGULAR, + // + // Accept Only Indirectional Signals and Act Usually ... + X_CROSS_SIGNAL_INDIRECTION_REGULAR, + // + // Accept Only Directional Signals and Act Usually ... + X_CROSS_SIGNAL_DIRECTION_REGULAR, + // + // Accept Only Indirectional Signals and Act Important ... + X_CROSS_SIGNAL_INDIRECTION_IMPORTANT, + // + // Accept Only Directional Signals and Act Important ... + X_CROSS_SIGNAL_DIRECTION_IMPORTANT, +}; + +// +// the Action which Guard Handler Can Done when Attacked ... +enum ENUM_X_GUARD_ACTIONS +{ + // + // Do Nothing ... + X_GUARD_DO_NOTHING, + // + // Close All Open Positions ... + X_GUARD_CLOSE_ALL, + // + // Close Max In Drawdown Position ... + X_GUARD_CLOSE_MAX_IN_DD, + // + // Partial Close Max In Drawdown Position by 1% of Volume ... + X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_1, + // + // Partial Close Max In Drawdown Position by 2% of Volume ... + X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_2, + // + // Partial Close Max In Drawdown Position by 3% of Volume ... + X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_3, + // + // Partial Close Max In Drawdown Position by 5% of Volume ... + X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_5, + // + // Partial Close Max In Drawdown Position by 10% of Volume ... + X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_10, + // + // Partial Close Max In Drawdown Position by 15% of Volume ... + X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_15, + // + // Partial Close Max In Drawdown Position by 20% of Volume ... + X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_20, + // + // Partial Close Max In Drawdown Position by 25% of Volume ... + X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_25, + // + // Partial Close Max In Drawdown Position by 30% of Volume ... + X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_30, + // + // Partial Close Max In Drawdown Position by 40% of Volume ... + X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_40, + // + // Partial Close Max In Drawdown Position by 50% of Volume ... + X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_50, + // + // Partial Close Max In Drawdown Position by 60% of Volume ... + X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_60, + // + // Partial Close Max In Drawdown Position by 70% of Volume ... + X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_70, + // + // Partial Close Max In Drawdown Position by 75% of Volume ... + X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_75, +}; + +// +// Guard Reason ... +enum ENUM_X_GUARD_REASONS +{ + // + // Critical ... + X_GUARDED_CRITICAL, + // + // Max ... + X_GUARDED_MAX, + // + // Old ... + X_GUARDED_OLD +}; + +// +// All Suuported Support Positions Guard ... +enum ENUM_X_GUARD_SUPPORT_METHODS +{ + // + // Ignore Supporting ... + X_SUPPORT_DO_NOTHING, + // + // Full Both Side Support ... + X_SUPPORT_FULL, + // + // Indirectional Supports On Drawing Down ... + X_SUPPORT_IN_DRAWDOWN_INDIRECTIONAL, + // + // Directional Supports On Drawing Up ... + X_SUPPORT_IN_DRAWUP_DIRECTIONAL, +}; + +// +// END Model Definitions ... +// + +// +// START Overrides ... +// + +// +// XBase Class ... +class XCBase +{ + // + // Public ... +public: + // + // Protected ... +protected: + // + void AddItemToBuffer( + double item, // Specified Item + double &buffer[] // Specified Buffer + ) + { + // + int bufferSize = ArraySize(buffer); + + // + ArrayResize( + buffer, + bufferSize + 1); + + // + buffer[bufferSize] = item; + } + void AddItemToBuffer( + datetime item, // Specified Item + datetime &buffer[] // Specified Buffer + ) + { + // + int bufferSize = ArraySize(buffer); + + // + ArrayResize( + buffer, + bufferSize + 1); + + // + buffer[bufferSize] = item; + } + void AddItemToBuffer( + XSignal &item, + XSignal &buffer[]) + { + // + ArrayResize( + buffer, + ArraySize(buffer) + 1); + + // + buffer[ArraySize(buffer) - 1] = item; + } + void AddItemToBuffer( + XCollector &item, // Specified Item + XCollector &buffer[] // Specified Buffer + ) + { + // + int bufferSize = ArraySize(buffer); + + // + ArrayResize( + buffer, + bufferSize + 1); + + // + buffer[bufferSize] = item; + } + void AddItemToBuffer( + XSignallerInfo &item, + XSignallerInfo &buffer[]) + { + // + ArrayResize( + buffer, + ArraySize(buffer) + 1); + + // + buffer[ArraySize(buffer) - 1] = item; + } + void AddItemToBuffer( + XProtectedSignal &item, // Item ... + XProtectedSignal &buffer[] // Buffer ... + ) + { + // + int bufferSize = ArraySize(buffer); + + // + ArrayResize( + buffer, + bufferSize + 1); + buffer[bufferSize] = item; + } + + // + void CleanBuffer(double &buffer[]) + { + // + ArrayFree(buffer); + ArrayResize(buffer, 0); + } + void CleanBuffer(XDeal &buffer[]) + { + // + ArrayFree(buffer); + ArrayResize(buffer, 0); + } + void CleanBuffer(XOrder &buffer[]) + { + // + ArrayFree(buffer); + ArrayResize(buffer, 0); + } + void CleanBuffer(XSignal &buffer[]) + { + // + ArrayFree(buffer); + ArrayResize(buffer, 0); + } + void CleanBuffer(XCollector &buffer[]) + { + // + ArrayFree(buffer); + ArrayResize(buffer, 0); + } + void CleanBuffer(XSignallerInfo &buffer[]) + { + // + ArrayFree(buffer); + ArrayResize(buffer, 0); + } + void CleanBuffer(XProtectedSignal &buffer[]) + { + // + ArrayFree(buffer); + ArrayResize(buffer, 0); + } + + // + void CopyBuffer( + const XSignallerInfo &source[], // Source Buffer ... + XSignallerInfo &dest[] // Dest Buffer ... + ) + { + // + CleanBuffer(dest); + + // + int sourceCount = ArraySize(source); + if (sourceCount <= 0) + { + return; + } + + // + // Loop ... + for (int i = 0; i < sourceCount; i++) + { + // + XSignallerInfo iInfo = source[i]; + + // + AddItemToBuffer( + iInfo, + dest); + } + } + void CopyBuffer( + XProtectedSignal &source[], // Source Buffer to Copy + XProtectedSignal &dest[] // Fill this buffer using source + ) + { + // + CleanBuffer(dest); + + // + int sourceCount = ArraySize(source); + if (sourceCount <= 0) + { + return; + } + + // + for (int i = 0; i < sourceCount; i++) + { + // + XProtectedSignal iItem = source[i]; + + // + AddItemToBuffer( + iItem, + dest); + } + } + + // + // Private ... +private: +}; + +// +// XCTrade Base Class ... +class XSCTrade : 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 ... +// + +// +// START Global Definitions: Variables, Properties and etc ... +// + +// +// XCMD5 a library for Hashing ... +class XCMD5 : public XCBase +{ + // + // Public Provides ... +public: + // + // Protected Provides ... + + // + // Constructor ... + XCMD5(void) {} + + // + // Deconstructor ... + ~XCMD5(void) {} + + // + // Hash Specified Char Array ... + string Hash( + uchar &source[], // Specify Char Array to Hash + int length = 0 // Specify Length of Char Array which required to hash + ) + { + // + string result = ""; + + // + int sourceCount = ArraySize(source); + + // + // Validate Args ... + if ( + sourceCount <= 0 || + (sourceCount > 0 && length > sourceCount)) + { + return result; + } + + // + // Normalize Args ... + if (length == 0) + { + length = sourceCount; + } + + // + // Init MD5 ... + MD5Init(); + + // + // Update Buffer ... + MD5Update(source, length); + + // + // Calculate Result ... + result = MD5Final(); + + // + return result; + } + + // + // Hash Specified String ... + string Hash( + string source // Specified String + ) + { + // + string result = ""; + + // + // Converts String to Char Array ... + uchar bytes[]; + StringToCharArray( + source, + bytes, + 0, + StringLen(source)); + + // + result = Hash( + bytes, + ArraySize(bytes)); + + // + return result; + } + +protected: + // + // Private Provides ... +private: + // + uint m_lMD5[4]; + uint m_nCount[2]; + uchar m_lpszBuffer[64]; + + // + // Convert Byte to DWord ... + void ByteToDWord(int &out[], uint &in[], uint len) + { + // + uint i = 0; + uint j = 0; + + // + for (; j < len; i++, j += 4) + { + out[i] = (int)in[j] | (int)in[j + 1] << 8 | (int)in[j + 2] << 16 | (int)in[j + 3] << 24; + } + } + + // + // Convert DWord to Byte ... + void DWordToByte(uchar &out[], int &in[], uint len) + { + // + uint i = 0; + uint j = 0; + + // + for (; j < len; i++, j += 4) + { + // + out[j] = (uchar)(in[i] & 0xff); + out[j + 1] = (uchar)((in[i] >> 8) & 0xff); + out[j + 2] = (uchar)((in[i] >> 16) & 0xff); + out[j + 3] = (uchar)((in[i] >> 24) & 0xff); + } + } + + // + // Init MD5 Array ... + void MD5Init() + { + // + ArrayInitialize(m_lpszBuffer, 64); + + // + m_nCount[0] = m_nCount[1] = 0; + m_lMD5[0] = _md5_INIT_STATE_0; + m_lMD5[1] = _md5_INIT_STATE_1; + m_lMD5[2] = _md5_INIT_STATE_2; + m_lMD5[3] = _md5_INIT_STATE_3; + } + + // + // Update MD5 ... + void MD5Update(uchar &inBuf[], uint inLen) + { + // + int i, ii; + int mdi; + + // + uint in[16]; + int i0 = 0; + + // + mdi = (int)((m_nCount[0] >> 3) & 0x3F); + + // + if ((m_nCount[0] + ((uint)inLen << 3)) < m_nCount[0]) + { + m_nCount[1]++; + } + + // + m_nCount[0] += ((uint)inLen << 3); + m_nCount[1] += ((uint)inLen >> 29); + + // + while ((inLen--) > 0) + { + // + m_lpszBuffer[mdi++] = inBuf[i0++]; + if (mdi == 0x40) + { + // + for (i = 0, ii = 0; i < 16; i++, ii += 4) + { + in[i] = (((uint)m_lpszBuffer[ii + 3]) << 24) | (((uint)m_lpszBuffer[ii + 2]) << 16) | (((uint)m_lpszBuffer[ii + 1]) << 8) | ((uint)m_lpszBuffer[ii]); + } + + // + Transform(m_lMD5, in); + + // + mdi = 0; + } + } + } + + // + // Finalize an MD5 Expression ... + string MD5Final() + { + // + uchar bits[8]; + int nIndex; + uint nPadLen; + const int nMD5Size = 16; + uchar lpszMD5[16]; + string temp; + string out = ""; + int i; + + // + DWordToByte(bits, m_nCount, 8); + nIndex = (int)((m_nCount[0] >> 3) & 0x3f); + nPadLen = (nIndex < 56) ? (56 - nIndex) : (120 - nIndex); + MD5Update(_md5_PADDING, nPadLen); + MD5Update(bits, 8); + DWordToByte(lpszMD5, m_lMD5, nMD5Size); + + // + for (i = 0; i < nMD5Size; i++) + { + // + if (lpszMD5[i] == 0) + { + temp = "00"; + } + else if (lpszMD5[i] <= 15) + { + temp = StringFormat("0%x", lpszMD5[i]); + } + else + { + temp = StringFormat("%x", lpszMD5[i]); + } + + // + out += temp; + } + + // + lpszMD5[0] = '\0'; + + // + return (out); + } + + // + // Transform Buffers ... + void Transform(uint &buf[], uint &in[]) + { + // + uint a = buf[0], b = buf[1], c = buf[2], d = buf[3]; + + // + _md5_FF(a, b, c, d, in[0], _md5_S11, 0xD76AA478); + _md5_FF(d, a, b, c, in[1], _md5_S12, 0xE8C7B756); + _md5_FF(c, d, a, b, in[2], _md5_S13, 0x242070DB); + _md5_FF(b, c, d, a, in[3], _md5_S14, 0xC1BDCEEE); + _md5_FF(a, b, c, d, in[4], _md5_S11, 0xF57C0FAF); + _md5_FF(d, a, b, c, in[5], _md5_S12, 0x4787C62A); + _md5_FF(c, d, a, b, in[6], _md5_S13, 0xA8304613); + _md5_FF(b, c, d, a, in[7], _md5_S14, 0xFD469501); + _md5_FF(a, b, c, d, in[8], _md5_S11, 0x698098D8); + _md5_FF(d, a, b, c, in[9], _md5_S12, 0x8B44F7AF); + _md5_FF(c, d, a, b, in[10], _md5_S13, 0xFFFF5BB1); + _md5_FF(b, c, d, a, in[11], _md5_S14, 0x895CD7BE); + _md5_FF(a, b, c, d, in[12], _md5_S11, 0x6B901122); + _md5_FF(d, a, b, c, in[13], _md5_S12, 0xFD987193); + _md5_FF(c, d, a, b, in[14], _md5_S13, 0xA679438E); + _md5_FF(b, c, d, a, in[15], _md5_S14, 0x49B40821); + + // + _md5_GG(a, b, c, d, in[1], _md5_S21, 0xF61E2562); + _md5_GG(d, a, b, c, in[6], _md5_S22, 0xC040B340); + _md5_GG(c, d, a, b, in[11], _md5_S23, 0x265E5A51); + _md5_GG(b, c, d, a, in[0], _md5_S24, 0xE9B6C7AA); + _md5_GG(a, b, c, d, in[5], _md5_S21, 0xD62F105D); + _md5_GG(d, a, b, c, in[10], _md5_S22, 0x02441453); + _md5_GG(c, d, a, b, in[15], _md5_S23, 0xD8A1E681); + _md5_GG(b, c, d, a, in[4], _md5_S24, 0xE7D3FBC8); + _md5_GG(a, b, c, d, in[9], _md5_S21, 0x21E1CDE6); + _md5_GG(d, a, b, c, in[14], _md5_S22, 0xC33707D6); + _md5_GG(c, d, a, b, in[3], _md5_S23, 0xF4D50D87); + _md5_GG(b, c, d, a, in[8], _md5_S24, 0x455A14ED); + _md5_GG(a, b, c, d, in[13], _md5_S21, 0xA9E3E905); + _md5_GG(d, a, b, c, in[2], _md5_S22, 0xFCEFA3F8); + _md5_GG(c, d, a, b, in[7], _md5_S23, 0x676F02D9); + _md5_GG(b, c, d, a, in[12], _md5_S24, 0x8D2A4C8A); + + // + _md5_HH(a, b, c, d, in[5], _md5_S31, 0xFFFA3942); + _md5_HH(d, a, b, c, in[8], _md5_S32, 0x8771F681); + _md5_HH(c, d, a, b, in[11], _md5_S33, 0x6D9D6122); + _md5_HH(b, c, d, a, in[14], _md5_S34, 0xFDE5380C); + _md5_HH(a, b, c, d, in[1], _md5_S31, 0xA4BEEA44); + _md5_HH(d, a, b, c, in[4], _md5_S32, 0x4BDECFA9); + _md5_HH(c, d, a, b, in[7], _md5_S33, 0xF6BB4B60); + _md5_HH(b, c, d, a, in[10], _md5_S34, 0xBEBFBC70); + _md5_HH(a, b, c, d, in[13], _md5_S31, 0x289B7EC6); + _md5_HH(d, a, b, c, in[0], _md5_S32, 0xEAA127FA); + _md5_HH(c, d, a, b, in[3], _md5_S33, 0xD4EF3085); + _md5_HH(b, c, d, a, in[6], _md5_S34, 0x04881D05); + _md5_HH(a, b, c, d, in[9], _md5_S31, 0xD9D4D039); + _md5_HH(d, a, b, c, in[12], _md5_S32, 0xE6DB99E5); + _md5_HH(c, d, a, b, in[15], _md5_S33, 0x1FA27CF8); + _md5_HH(b, c, d, a, in[2], _md5_S34, 0xC4AC5665); + + // + _md5_II(a, b, c, d, in[0], _md5_S41, 0xF4292244); + _md5_II(d, a, b, c, in[7], _md5_S42, 0x432AFF97); + _md5_II(c, d, a, b, in[14], _md5_S43, 0xAB9423A7); + _md5_II(b, c, d, a, in[5], _md5_S44, 0xFC93A039); + _md5_II(a, b, c, d, in[12], _md5_S41, 0x655B59C3); + _md5_II(d, a, b, c, in[3], _md5_S42, 0x8F0CCC92); + _md5_II(c, d, a, b, in[10], _md5_S43, 0xFFEFF47D); + _md5_II(b, c, d, a, in[1], _md5_S44, 0x85845DD1); + _md5_II(a, b, c, d, in[8], _md5_S41, 0x6FA87E4F); + _md5_II(d, a, b, c, in[15], _md5_S42, 0xFE2CE6E0); + _md5_II(c, d, a, b, in[6], _md5_S43, 0xA3014314); + _md5_II(b, c, d, a, in[13], _md5_S44, 0x4E0811A1); + _md5_II(a, b, c, d, in[4], _md5_S41, 0xF7537E82); + _md5_II(d, a, b, c, in[11], _md5_S42, 0xBD3AF235); + _md5_II(c, d, a, b, in[2], _md5_S43, 0x2AD7D2BB); + _md5_II(b, c, d, a, in[9], _md5_S44, 0xEB86D391); + + // + buf[0] += a; + buf[1] += b; + buf[2] += c; + buf[3] += d; + } +}; + +// +// XSaherElm Account Info Class ... +class XCAccountInfo : public XCBase +{ + // + // Public properties ... +public: + // + // Constructro ... + void XCAccountInfo() + { + // + mAccountInfo = new CAccountInfo(); + + // + mInitialBalance = mAccountInfo.Balance(); + } + + // + // Deconstructor ... + void ~XCAccountInfo() + { + // + mInitialBalance = 0; + } + + // + // 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 Initial Deposit Balance ... + double GetInitialBalance() + { + return mInitialBalance; + } + + // + // 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; + } + + // + // Protected properties ... +protected: + // + // Private properties ... +private: + // + // Initial Account Balance ... + double mInitialBalance; + + // + // Account Info ... + CAccountInfo mAccountInfo; +}; + +// +// XSaherElm Report Info Class ... +class XCReporter : public XCBase +{ + // + // Public Provided ... +public: + // + // Constructro ... + void XCReporter() + { + // + mAccountInfo = new XCAccountInfo(); + + // + Reset(); + } + + // + // Deconstructor ... + void ~XCReporter() + { + } + + // + // Reset Specific Report ... + void Reset( + ENUM_XREPORT_TYPES type // Specify Report Type + ) + { + CleanReport(type); + } + + // + // Reset All Reports ... + void Reset() + { + // + CleanReport(XREPORT_MAIN); + CleanReport(XREPORT_MONTHLY); + CleanReport(XREPORT_WEEKLY); + CleanReport(XREPORT_DAILY); + } + + // + // Update Volume Info ... + void UpdateReportVolumeInfo( + ENUM_XREPORT_TYPES type, // Specified Report Type + // + double staticVolume, // Current Available Static Volume + string staticVolumeCalculationMethod, // Static Volume Calculation Method + double maxAllowedVolume, // Current Maximum Appliable Volume + double volumeIncreaseMultiplier, // Static Volume Increase Multiplier + double balanceGowingToApplyMultiplier, // Multiply Volume Based On Balance Growing + double balanceGrowingToIncreaseMaxAllowedVolume // Where to Increase MaxAllowed Volume + ) + { + // + // Filling Account Info ... + FillReportAccountInfo(type); + + // + switch (type) + { + // + // Main ... + case XREPORT_MAIN: + // + FillingVolumeInfo( + mMainReport, + staticVolume, + staticVolumeCalculationMethod, + maxAllowedVolume, + volumeIncreaseMultiplier, + balanceGowingToApplyMultiplier, + balanceGrowingToIncreaseMaxAllowedVolume); + break; + + // + // Monthly ... + case XREPORT_MONTHLY: + // + FillingVolumeInfo( + mMonthlyReport, + staticVolume, + staticVolumeCalculationMethod, + maxAllowedVolume, + volumeIncreaseMultiplier, + balanceGowingToApplyMultiplier, + balanceGrowingToIncreaseMaxAllowedVolume); + break; + + // + // Weekly ... + case XREPORT_WEEKLY: + // + FillingVolumeInfo( + mWeeklyReport, + staticVolume, + staticVolumeCalculationMethod, + maxAllowedVolume, + volumeIncreaseMultiplier, + balanceGowingToApplyMultiplier, + balanceGrowingToIncreaseMaxAllowedVolume); + break; + + // + // Daily ... + case XREPORT_DAILY: + // + FillingVolumeInfo( + mDailyReport, + staticVolume, + staticVolumeCalculationMethod, + maxAllowedVolume, + volumeIncreaseMultiplier, + balanceGowingToApplyMultiplier, + balanceGrowingToIncreaseMaxAllowedVolume); + break; + } + } + + // + // Update Volume Info on All Reports ... + void UpdateReportsVolumeInfo( + double staticVolume, // Current Available Static Volume + string staticVolumeCalculationMethod, // Static Volume Calculation Method + double maxAllowedVolume, // Current Maximum Appliable Volume + double volumeIncreaseMultiplier, // Static Volume Increase Multiplier + double balanceGowingToApplyMultiplier, // Multiply Volume Based On Balance Growing + double balanceGrowingToIncreaseMaxAllowedVolume // Where to Increase MaxAllowed Volume + ) + { + // + // Main ... + UpdateReportVolumeInfo( + XREPORT_MAIN, + staticVolume, + staticVolumeCalculationMethod, + maxAllowedVolume, + volumeIncreaseMultiplier, + balanceGowingToApplyMultiplier, + balanceGrowingToIncreaseMaxAllowedVolume); + + // + // Monthly ... + UpdateReportVolumeInfo( + XREPORT_MONTHLY, + staticVolume, + staticVolumeCalculationMethod, + maxAllowedVolume, + volumeIncreaseMultiplier, + balanceGowingToApplyMultiplier, + balanceGrowingToIncreaseMaxAllowedVolume); + + // + // Weekly ... + UpdateReportVolumeInfo( + XREPORT_WEEKLY, + staticVolume, + staticVolumeCalculationMethod, + maxAllowedVolume, + volumeIncreaseMultiplier, + balanceGowingToApplyMultiplier, + balanceGrowingToIncreaseMaxAllowedVolume); + + // + // Daily ... + UpdateReportVolumeInfo( + XREPORT_DAILY, + staticVolume, + staticVolumeCalculationMethod, + maxAllowedVolume, + volumeIncreaseMultiplier, + balanceGowingToApplyMultiplier, + balanceGrowingToIncreaseMaxAllowedVolume); + } + + // + // Add Specific Signal to Report ... + void AddSignalToReport( + ENUM_XREPORT_TYPES type, // Specified Report Type + const XSignal &signal, // Specified Signal + const string &providers[] // Specified Signal Providers + ) + { + // + // + // Filling Account Info ... + FillReportAccountInfo(type); + + // + switch (type) + { + // + // Main ... + case XREPORT_MAIN: + AddSignalToReport( + mMainReport, + signal, + providers); + break; + + // + // Monthly ... + case XREPORT_MONTHLY: + AddSignalToReport( + mMonthlyReport, + signal, + providers); + break; + + // + // Weekly ... + case XREPORT_WEEKLY: + AddSignalToReport( + mWeeklyReport, + signal, + providers); + break; + + // + // Daily ... + case XREPORT_DAILY: + AddSignalToReport( + mDailyReport, + signal, + providers); + break; + } + } + + // + // Add Specific Signal to All Reports ... + void AddSignalToReports( + const XSignal &signal, // Specified Signal + const string &providers[] // Specified Signal Providers + ) + { + // + // Main ... + AddSignalToReport( + XREPORT_MAIN, + signal, + providers); + + // + // Monthly ... + AddSignalToReport( + XREPORT_MONTHLY, + signal, + providers); + + // + // Weekly ... + AddSignalToReport( + XREPORT_WEEKLY, + signal, + providers); + + // + // Daily ... + AddSignalToReport( + XREPORT_DAILY, + signal, + providers); + } + + // + // Report a TP for Specific Report ... + void AddTradeTPInReport( + ENUM_XREPORT_TYPES type // Specified Report Type + ) + { + // + switch (type) + { + // + // Main ... + case XREPORT_MAIN: + AddTradeTPInReport(mMainReport); + break; + + // + // Monthly ... + case XREPORT_MONTHLY: + AddTradeTPInReport(mMonthlyReport); + break; + + // + // Weekly ... + case XREPORT_WEEKLY: + AddTradeTPInReport(mWeeklyReport); + break; + + // + // Daily ... + case XREPORT_DAILY: + AddTradeTPInReport(mDailyReport); + break; + } + } + + // + // Report a TP for All Reports ... + void AddTradeTPInReports() + { + // + // Main ... + AddTradeTPInReport(XREPORT_MAIN); + + // + // Monthly ... + AddTradeTPInReport(XREPORT_MONTHLY); + + // + // Weekly ... + AddTradeTPInReport(XREPORT_WEEKLY); + + // + // Daily ... + AddTradeTPInReport(XREPORT_DAILY); + } + + // + // Report a SL for Specific Report ... + void AddTradeSLInReport( + ENUM_XREPORT_TYPES type // Specified Report Type + ) + { + // + switch (type) + { + // + // Main ... + case XREPORT_MAIN: + AddTradeSLInReport(mMainReport); + break; + + // + // Monthly ... + case XREPORT_MONTHLY: + AddTradeSLInReport(mMonthlyReport); + break; + + // + // Weekly ... + case XREPORT_WEEKLY: + AddTradeSLInReport(mWeeklyReport); + break; + + // + // Daily ... + case XREPORT_DAILY: + AddTradeSLInReport(mDailyReport); + break; + } + } + + // + // Report a SL for All Reports ... + void AddTradeSLInReports() + { + // + // Main ... + AddTradeSLInReport(XREPORT_MAIN); + + // + // Monthly ... + AddTradeSLInReport(XREPORT_MONTHLY); + + // + // Weekly ... + AddTradeSLInReport(XREPORT_WEEKLY); + + // + // Daily ... + AddTradeSLInReport(XREPORT_DAILY); + } + + // + // Update Number of Same Time Trades in Specific Report ... + void UpdateMaxSameTimeTradesInReport( + ENUM_XREPORT_TYPES type, // Specified Report Type + int value // number of same time trades + ) + { + // + switch (type) + { + // + // Main ... + case XREPORT_MAIN: + UpdateMaxSameTimeTradesInReport( + mMainReport, + value); + break; + + // + // Monthly ... + case XREPORT_MONTHLY: + UpdateMaxSameTimeTradesInReport( + mMonthlyReport, + value); + break; + + // + // Weekly ... + case XREPORT_WEEKLY: + UpdateMaxSameTimeTradesInReport( + mWeeklyReport, + value); + break; + + // + // Daily ... + case XREPORT_DAILY: + UpdateMaxSameTimeTradesInReport( + mDailyReport, + value); + break; + } + } + + // + // Update Number of Same Time Trades in All Report ... + void UpdateMaxSameTimeTradesInReports( + int value // number of same time trades + ) + { + // + // Main ... + UpdateMaxSameTimeTradesInReport( + XREPORT_MAIN, + value); + + // + // Monthly ... + UpdateMaxSameTimeTradesInReport( + XREPORT_MONTHLY, + value); + + // + // Weekly ... + UpdateMaxSameTimeTradesInReport( + XREPORT_WEEKLY, + value); + + // + // Daily ... + UpdateMaxSameTimeTradesInReport( + XREPORT_DAILY, + value); + } + + // + // Update Max DrawDown in Specific Report ... + void UpdateMaxDrawDownInReport( + ENUM_XREPORT_TYPES type, // Specified Report Type + double value // draw down value + ) + { + // + switch (type) + { + // + // Main ... + case XREPORT_MAIN: + UpdateMaxDrawDownInReport( + mMainReport, + value); + break; + + // + // Monthly ... + case XREPORT_MONTHLY: + UpdateMaxDrawDownInReport( + mMonthlyReport, + value); + break; + + // + // Weekly ... + case XREPORT_WEEKLY: + UpdateMaxDrawDownInReport( + mWeeklyReport, + value); + break; + + // + // Daily ... + case XREPORT_DAILY: + UpdateMaxDrawDownInReport( + mDailyReport, + value); + break; + } + } + + // + // Update Max DrawDown in All Report ... + void UpdateMaxDrawDownInReports( + double value // draw down value + ) + { + // + // Main ... + UpdateMaxDrawDownInReport( + XREPORT_MAIN, + value); + + // + // Monthly ... + UpdateMaxDrawDownInReport( + XREPORT_MONTHLY, + value); + + // + // Weekly ... + UpdateMaxDrawDownInReport( + XREPORT_WEEKLY, + value); + + // + // Daily ... + UpdateMaxDrawDownInReport( + XREPORT_DAILY, + value); + } + + // + // Update Max DrawUp in Specific Report ... + void UpdateMaxDrawUpInReport( + ENUM_XREPORT_TYPES type, // Specified Report Type + double value // draw up value + ) + { + // + switch (type) + { + // + // Main ... + case XREPORT_MAIN: + UpdateMaxDrawUpInReport( + mMainReport, + value); + break; + + // + // Monthly ... + case XREPORT_MONTHLY: + UpdateMaxDrawUpInReport( + mMonthlyReport, + value); + break; + + // + // Weekly ... + case XREPORT_WEEKLY: + UpdateMaxDrawUpInReport( + mWeeklyReport, + value); + break; + + // + // Daily ... + case XREPORT_DAILY: + UpdateMaxDrawUpInReport( + mDailyReport, + value); + break; + } + } + + // + // Update Max DrawUp in All Report ... + void UpdateMaxDrawUpInReports( + double value // draw up value + ) + { + // + // Main ... + UpdateMaxDrawUpInReport( + XREPORT_MAIN, + value); + + // + // Monthly ... + UpdateMaxDrawUpInReport( + XREPORT_MONTHLY, + value); + + // + // Weekly ... + UpdateMaxDrawUpInReport( + XREPORT_WEEKLY, + value); + + // + // Daily ... + UpdateMaxDrawUpInReport( + XREPORT_DAILY, + value); + } + + // + // Update Min Balance for Open Trades in Specific Report ... + void UpdateMinBalanceForOpenTradesInReport( + ENUM_XREPORT_TYPES type, // Specified Report Type + double value // min balance for open trades + ) + { + // + switch (type) + { + // + // Main ... + case XREPORT_MAIN: + UpdateMinBalanceForOpenTradesInReport( + mMainReport, + value); + break; + + // + // Monthly ... + case XREPORT_MONTHLY: + UpdateMinBalanceForOpenTradesInReport( + mMonthlyReport, + value); + break; + + // + // Weekly ... + case XREPORT_WEEKLY: + UpdateMinBalanceForOpenTradesInReport( + mWeeklyReport, + value); + break; + + // + // Daily ... + case XREPORT_DAILY: + UpdateMinBalanceForOpenTradesInReport( + mDailyReport, + value); + break; + } + } + + // + // Update Min Balance for Open Trades in All Report ... + void UpdateMinBalanceForOpenTradesInReports( + double value // min balance for open trades + ) + { + // + // Main ... + UpdateMinBalanceForOpenTradesInReport( + XREPORT_MAIN, + value); + + // + // Monthly ... + UpdateMinBalanceForOpenTradesInReport( + XREPORT_MONTHLY, + value); + + // + // Weekly ... + UpdateMinBalanceForOpenTradesInReport( + XREPORT_WEEKLY, + value); + + // + // Daily ... + UpdateMinBalanceForOpenTradesInReport( + XREPORT_DAILY, + value); + } + + // + // Gnerate Specific Type Of Report String Representation ... + string GenerateReportString( + ENUM_XREPORT_TYPES type, // Specified Report Type + string separator = "\n" // Separator + ) + { + // + string result = ""; + + // + switch (type) + { + // + // Main ... + case XREPORT_MAIN: + result = GenerateReportString( + mMainReport, + separator); + break; + + // + // Monthly ... + case XREPORT_MONTHLY: + result = GenerateReportString( + mMonthlyReport, + separator); + break; + + // + // Weekly ... + case XREPORT_WEEKLY: + result = GenerateReportString( + mWeeklyReport, + separator); + break; + + // + // Daily ... + case XREPORT_DAILY: + result = GenerateReportString( + mDailyReport, + separator); + break; + } + + // + return result; + } + + // + // Protected Provided ... +protected: + // + // Private Provided ... +private: + // + // Account Info Instance ... + XCAccountInfo mAccountInfo; + + // + // Main Report ... + XReport mMainReport; + + // + // Monthly Report ... + XReport mMonthlyReport; + + // + // Weekly Report ... + XReport mWeeklyReport; + + // + // Daily Report ... + XReport mDailyReport; + + // + // Clean Specific Report ... + void CleanReport( + XReport &report // Specified Report + ) + { + // + datetime time = TimeCurrent(); + + // + // Reset Times ... + report.start = time; + report.end = -1; + + // + // Reset Account Info ... + FillReportAccountInfo(report); + + // + // Reset Summary Info ... + report.summaryInfo.maxDrawUp = 0; + report.summaryInfo.maxDrawDown = 0; + report.summaryInfo.longSignals = 0; + report.summaryInfo.numberOfTPs = 0; + report.summaryInfo.numberOfSLs = 0; + report.summaryInfo.shortSignals = 0; + report.summaryInfo.maxSignalVolume = 0; + report.summaryInfo.maxSameTimeSignals = 0; + + // + // Reset Volume Info ... + report.volumeInfo.staticVolume = 0; + report.volumeInfo.maxAllowedVolume = 0; + report.volumeInfo.volumeIncreaseMultiplier = 0; + report.volumeInfo.balanceGowingToApplyMultiplier = 0; + report.volumeInfo.staticVolumeCalculationMethod = NULL; + report.volumeInfo.balanceGrowingToIncreaseMaxAllowedVolume = 0; + + // + // Reset Signallers Info ... + CleanBuffer(report.signallersInfo); + } + void CleanReport( + ENUM_XREPORT_TYPES type // Specify Report Type + ) + { + // + switch (type) + { + // + // Main ... + case XREPORT_MAIN: + CleanReport(mMainReport); + break; + + // + // Monthly ... + case XREPORT_MONTHLY: + CleanReport(mMonthlyReport); + break; + + // + // Weekly ... + case XREPORT_WEEKLY: + CleanReport(mWeeklyReport); + break; + + // + // Daily ... + case XREPORT_DAILY: + CleanReport(mDailyReport); + break; + } + } + + // + // Update Specific Reports End Time ... + void FillReportEndTime( + XReport &report // Specified Report + ) + { + // + datetime time = TimeCurrent(); + report.end = time; + } + + // + // Filleing Report Account Info ... + void FillReportAccountInfo( + XReport &report // Specified Report + ) + { + // + FillReportEndTime(report); + + // + report.accountInfo.user = (string)mAccountInfo.GetUserAccount(); + report.accountInfo.name = mAccountInfo.GetName(); + report.accountInfo.server = mAccountInfo.GetServerName(); + report.accountInfo.broker = mAccountInfo.GetCompany(); + report.accountInfo.mode = mAccountInfo.GetTradeMode(); + report.accountInfo.leverage = mAccountInfo.GetLeverage(); + report.accountInfo.currency = mAccountInfo.GetCurrency(); + report.accountInfo.deposit = mAccountInfo.GetInitialBalance(); + report.accountInfo.balance = mAccountInfo.GetBalance(); + } + void FillReportAccountInfo( + ENUM_XREPORT_TYPES type // Specify Report Type + ) + { + // + switch (type) + { + // + // Main ... + case XREPORT_MAIN: + FillReportAccountInfo(mMainReport); + break; + + // + // Monthly ... + case XREPORT_MONTHLY: + FillReportAccountInfo(mMonthlyReport); + break; + + // + // Weekly ... + case XREPORT_WEEKLY: + FillReportAccountInfo(mWeeklyReport); + break; + + // + // Daily ... + case XREPORT_DAILY: + FillReportAccountInfo(mDailyReport); + break; + } + } + + // + // Filling Volume Info ... + void FillingVolumeInfo( + XReport &report, // Specified Report + // + double staticVolume, // Current Available Static Volume + string staticVolumeCalculationMethod, // Static Volume Calculation Method + double maxAllowedVolume, // Current Maximum Appliable Volume + double volumeIncreaseMultiplier, // Static Volume Increase Multiplier + double balanceGowingToApplyMultiplier, // Multiply Volume Based On Balance Growing + double balanceGrowingToIncreaseMaxAllowedVolume // Where to Increase MaxAllowed Volume + ) + { + // + FillReportEndTime(report); + + // + report.volumeInfo.staticVolume = staticVolume; + report.volumeInfo.maxAllowedVolume = maxAllowedVolume; + report.volumeInfo.volumeIncreaseMultiplier = volumeIncreaseMultiplier; + report.volumeInfo.staticVolumeCalculationMethod = staticVolumeCalculationMethod; + report.volumeInfo.balanceGowingToApplyMultiplier = balanceGowingToApplyMultiplier; + report.volumeInfo.balanceGrowingToIncreaseMaxAllowedVolume = balanceGrowingToIncreaseMaxAllowedVolume; + } + + // + // Add Signal to Report ... + void AddSignalToReport( + XReport &report, // Specified Report + const XSignal &signal, // Specified Signal + const string &providers[] // Specified Signal Providers + ) + { + // + FillReportEndTime(report); + + // + double volume = signal.volume; + bool isLong = signal.type == X_SIGNAL_LONG; + + // + // Update Longs and Shorts ... + if (isLong) + { + report.summaryInfo.longSignals++; + } + else + { + report.summaryInfo.shortSignals++; + } + + // + // Chack Max Volume ... + if (volume > report.summaryInfo.maxSignalVolume) + { + report.summaryInfo.maxSignalVolume = volume; + } + + // + // Update Signallers Info ... + for (int i = 0; i < ArraySize(providers); i++) + { + // + string iProvider = providers[i]; + + // + AddOrUpdateSignaller( + report, + iProvider, + signal); + } + } + + // + // Add or Update Signaller Info of Specific Report ... + void AddOrUpdateSignaller( + XReport &report, // Specified Report + const string provider, // Signal Provider name + const XSignal &signal // Specified Signal + ) + { + // + int providerIdx = -1; + int signallersInfoCount = 0; + bool isLong = signal.type == X_SIGNAL_LONG; + + // + // Prepare New One Provider ... + XSignallerInfo info = {}; + info.name = provider; + if (isLong) + { + info.longs = 1; + } + else + { + info.shorts = 1; + } + + // + // Find Provider idx if Exists ... + providerIdx = FindProviderInSignallersInfo( + provider, + report.signallersInfo); + + // + // Check IDX ... + if (providerIdx > -1) + { + // + // Update Exists ... + if (isLong) + { + report.signallersInfo[providerIdx].longs++; + } + else + { + report.signallersInfo[providerIdx].shorts++; + } + } + else + { + // + // Add New One ... + AddItemToBuffer( + info, + report.signallersInfo); + } + } + + // + // Add TP in Report ... + void AddTradeTPInReport( + XReport &report // Specified Report + ) + { + // + FillReportEndTime(report); + + // + report.summaryInfo.numberOfTPs++; + } + + // + // Add SL in Report ... + void AddTradeSLInReport( + XReport &report // Specified Report + ) + { + // + FillReportEndTime(report); + + // + report.summaryInfo.numberOfSLs++; + } + + // + // Update Number of Same Time Trades in Report ... + void UpdateMaxSameTimeTradesInReport( + XReport &report, // Specified Report + int value // number of same time trades + ) + { + // + // Validate Args ... + if (value <= report.summaryInfo.maxSameTimeSignals) + { + return; + } + + // + FillReportEndTime(report); + + // + report.summaryInfo.maxSameTimeSignals = value; + } + + // + // Update Number of Same Time Trades in Report ... + void UpdateMaxDrawUpInReport( + XReport &report, // Specified Report + double value // draw up value + ) + { + // + // Validate Args ... + if (value <= report.summaryInfo.maxDrawUp) + { + return; + } + + // + FillReportEndTime(report); + + // + report.summaryInfo.maxDrawUp = value; + } + + // + // Update Number of Same Time Trades in Report ... + void UpdateMaxDrawDownInReport( + XReport &report, // Specified Report + double value // draw down value + ) + { + // + // Validate Args ... + if (value <= report.summaryInfo.maxDrawDown) + { + return; + } + + // + FillReportEndTime(report); + + // + report.summaryInfo.maxDrawDown = value; + } + + // + // Update Min Balance for Open Trades Value in Report ... + void UpdateMinBalanceForOpenTradesInReport( + XReport &report, // Specified Report + double value // min balance for open trades + ) + { + // + // Validate Arg ... + if (value <= 0) + { + return; + } + + // + FillReportEndTime(report); + + // + report.accountInfo.minBalanceForOpenTrades = value; + } + + // + // Generate Specific Report String Representation ... + string GenerateReportString( + XReport &report, // Specified Report + string separator = "\n" // Separator + ) + { + // + string result = ""; + + // + // Start and End Date ... + result += "Start: " + (string)report.start + separator; + result += "End: " + (string)report.end + separator; + + // + // Account Info ... + string accountStr = GenerateAccountInfoReportString(report.accountInfo); + result += "Account: " + separator + accountStr + separator; + + // + // Summary Info ... + string summaryStr = GenerateSummaryInfoReportString(report.summaryInfo); + result += "Summary: " + separator + summaryStr + separator; + + // + // Volume Info ... + string volumeStr = GenerateVolumeInfoReportString(report.volumeInfo); + result += "Volume: " + separator + volumeStr + separator; + + // + // Signallers Info ... + string signallersStr = GenerateSignallersInfoReportString(report.signallersInfo); + result += "Signallers: " + separator + signallersStr + separator; + + // + return result; + } + + // + // Generate Account info String Representation ... + string GenerateAccountInfoReportString( + XAccountInfo &info, // Specified Account Info + string separator = "\n" // Separator + ) + { + // + string result = ""; + + // + // Generate Report ... + result += "user: " + info.user + separator; + result += "name: " + info.name + separator; + result += "server: " + info.server + separator; + result += "broker: " + info.broker + separator; + result += "mode: " + EnumToString(info.mode) + separator; + result += "leverage: " + (string)info.leverage + separator; + result += "currency: " + info.currency + separator; + result += "deposit: " + (string)info.deposit + separator; + result += "balance: " + (string)info.balance + separator; + result += "minBalanceForTrading: " + (string)info.minBalanceForOpenTrades + separator; + + // + return result; + } + + // + // Generate Summary info String Representation ... + string GenerateSummaryInfoReportString( + XSummaryInfo &info, // Specified Summary Info + string separator = "\n" // Separator + ) + { + // + string result = ""; + + // + // Generate Report ... + result += "longSignals: " + (string)info.longSignals + separator; + result += "shortSignals: " + (string)info.shortSignals + separator; + result += "numberOfTps: " + (string)info.numberOfTPs + separator; + result += "numberOfSLs: " + (string)info.numberOfSLs + separator; + result += "maxDrawUp: " + (string)info.maxDrawUp + separator; + result += "maxDrawDown: " + (string)info.maxDrawDown + separator; + result += "maxSignalVolume: " + (string)info.maxSignalVolume + separator; + result += "maxSameTimeSignals: " + (string)info.maxSameTimeSignals + separator; + + // + return result; + } + + // + // Generate Volume info String Representation ... + string GenerateVolumeInfoReportString( + XVolumeInfo &info, // Specified Volume Info + string separator = "\n" // Separator + ) + { + // + string result = ""; + + // + // Generate Report ... + result += "staticVolume: " + (string)info.staticVolume + separator; + result += "staticVolumeCalculationMethod: " + info.staticVolumeCalculationMethod + separator; + result += "maxAllowedVolume: " + (string)info.maxAllowedVolume + separator; + result += "volumeIncreaseMultiplier: " + (string)info.volumeIncreaseMultiplier + separator; + result += "balanceGowingToApplyMultiplier: " + (string)info.balanceGowingToApplyMultiplier + separator; + result += "balanceGrowingToIncreaseMaxAllowedVolume: " + (string)info.balanceGrowingToIncreaseMaxAllowedVolume + separator; + + // + return result; + } + + // + // Generate Signallers info String Representation ... + string GenerateSignallersInfoReportString( + XSignallerInfo &infos[], // Specified Signallers Info + string separator = "\n" // Separator + ) + { + // + string result = ""; + + // + // Validate Signallers Array Size ... + int signallersCount = ArraySize(infos); + if (signallersCount <= 0) + { + // + result += "EMPTY" + separator; + return result; + } + + // + // Generate Report ... + for (int i = 0; i < signallersCount; i++) + { + // + XSignallerInfo iSignaller = infos[i]; + + // + result += "name: " + iSignaller.name + separator; + result += "longs: " + (string)iSignaller.longs + separator; + result += "shorts: " + (string)iSignaller.shorts + separator; + + // + if (i < signallersCount - 1) + { + result += separator; + } + } + // + return result; + } + + // + // Find a Provider Index in SignallersInfo ... + int FindProviderInSignallersInfo( + string provider, // Specified Provider Name ... + XSignallerInfo &infoBuffer[] // Specified XSignallerInfo Buffer ... + ) + { + // + int result = -1; + + // + int bufferSize = ArraySize(infoBuffer); + if (bufferSize <= 0) + { + return result; + } + + // + // Loop through buffer to find provider index ... + for (int i = 0; i < bufferSize; i++) + { + // + XSignallerInfo iInfo = infoBuffer[i]; + + // + if (iInfo.name != provider) + { + continue; + } + + // + result = i; + } + + // + return result; + } +}; + +// +// a Class For Collectiong Info ... +class XCCollector : public XCBase +{ + // + // Public ... +public: + // + // Constructor ... + XCCollector() + { + Reset(); + } + + // + // Deconstructor ... + ~XCCollector() {} + + // + // Reset All Collectors ... + void Reset() + { + Clean(); + } + + // + // Count Data ... + int Count() + { + // + int result = 0; + + // + result = ArraySize(mTimes); + + // + return result; + } + + // + // TODO: Implement Business Logic here ... + + // + // Add Specific item to Collection ... + bool Add( + XCollector &item // Specified Info + ) + { + // + bool result = false; + + // + // Validate Args ... + result = IsValid( + item, + false); + if (!result) + { + return result; + } + + // + // Add Items Values to Buffers ... + // + AddItemToBuffer( + item.time, + mTimes); + + // + AddItemToBuffer( + item.volume, + mVolumes); + + // + AddItemToBuffer( + item.maxDrawDown, + mMaxDrawDowns); + + // + AddItemToBuffer( + item.maxAllowedVolume, + mMaxAllowedVolumes); + + // + AddItemToBuffer( + item.minBalanceForOpenTrade, + mMinBalanceForTradePrices); + + // + return result; + } + + // + // Retrieve Specific Item ... + bool Get( + XCollector &item, // Hold's Result + int index = 0 // Specified Index to Retrieve + ) + { + // + bool result = false; + + // + result = IsValidIndex(index); + if (!result) + { + return result; + } + + // + // Filling Item ... + item.time = mTimes[index]; + item.volume = mVolumes[index]; + item.maxDrawDown = mMaxDrawDowns[index]; + item.maxAllowedVolume = mMaxAllowedVolumes[index]; + item.minBalanceForOpenTrade = mMinBalanceForTradePrices[index]; + + // + return result; + } + XCollector Get( + int index = 0 // Specified Index to Retrieve + ) + { + // + XCollector result = {}; + + // + bool isValidIndex = IsValidIndex(index); + if (!isValidIndex) + { + return result; + } + + // + // Filling Item ... + result.time = mTimes[index]; + result.volume = mVolumes[index]; + result.maxDrawDown = mMaxDrawDowns[index]; + result.maxAllowedVolume = mMaxAllowedVolumes[index]; + result.minBalanceForOpenTrade = mMinBalanceForTradePrices[index]; + + // + return result; + } + bool Get( + XCollector &item, // Hold's Result + datetime time // Specified Index to Retrieve + ) + { + // + bool result = false; + + // + if (time <= 0) + { + return result; + } + + // + int timesCount = ArraySize(mTimes); + result = timesCount > 0; + if (!result) + { + return result; + } + + // + int index = -1; + for (int i = 0; i < timesCount; i++) + { + // + datetime iTime = mTimes[i]; + + // + if (iTime == time) + { + // + index = i; + break; + } + } + + // + result = index >= 0; + if (!result) + { + return result; + } + + // + result = Get( + item, + index); + + // + return result; + } + XCollector Get( + datetime time // Specified Index to Retrieve + ) + { + // + XCollector result = {}; + + // + if (time <= 0) + { + return result; + } + + // + int timesCount = ArraySize(mTimes); + if (timesCount <= 0) + { + return result; + } + + // + int index = -1; + for (int i = 0; i < timesCount; i++) + { + // + datetime iTime = mTimes[i]; + + // + if (iTime == time) + { + // + index = i; + break; + } + } + + // + if (index <= -1) + { + return result; + } + + // + result = Get( + index); + + // + return result; + } + + // + // Retrieve All ... + void GetAll( + XCollector &result[], // Hold's Result + bool reversal = false // Extract Direction + ) + { + // + CleanBuffer(result); + + // + int timesCount = ArraySize(mTimes); + if (timesCount <= 0) + { + return; + } + + // + if (!reversal) + { + // + for (int i = 0; i < timesCount; i++) + { + // + XCollector iCollector = Get(i); + + // + AddItemToBuffer( + iCollector, + result); + } + } + else + { + // + for (int i = timesCount - 1; i >= 0; i--) + { + // + XCollector iCollector = Get(i); + + // + AddItemToBuffer( + iCollector, + result); + } + } + } + + // + // Extract History ... + void Extract( + XCollector &result[], // Hold's Result + int start, // Start Index + int end // End Index + ) + { + // + CleanBuffer(result); + + // + // Validate Args ... + if ( + end < 0 || + start < 0 || + (start == 0 && end == 0) || + MathAbs(start - end == 0)) + { + return; + } + + // + // Validate Start and End Index ... + bool isValidEnd = IsValidIndex(end); + bool isValidStart = IsValidIndex(start); + if (!isValidEnd || !isValidStart) + { + return; + } + + // + bool direction = end > start; + if (direction) + { + // + for (int i = start; i < end - 1; i++) + { + // + XCollector iCollect = Get(i); + + // + AddItemToBuffer( + iCollect, + result); + } + } + else + { + // + for (int i = end - 1; i >= start; i--) + { + // + XCollector iCollect = Get(i); + + // + AddItemToBuffer( + iCollect, + result); + } + } + } + + // + // Validate an Item ... + bool IsValid( + XCollector &item, // Specified Info + bool ignoreTime = true // Ignore Times Checking ... + ) + { + // + bool result = false; + + // + // Check Each Items contains Correct Value ... + // + result = item.volume >= 0; + if (!result) + { + return result; + } + + // + result = item.maxDrawDown >= 0; + if (!result) + { + return result; + } + + // + result = item.maxAllowedVolume >= 0; + if (!result) + { + return result; + } + + // + result = item.minBalanceForOpenTrade >= 0; + if (!result) + { + return result; + } + + // + // Check Time has Proper Value ... + result = item.time > 0; + if (!result) + { + return result; + } + + // + // Check time bigger than last Time ... + int timesCount = ArraySize(mTimes); + if ( + !ignoreTime && + timesCount >= 0) + { + // + // Retrieve Last Added Times ... + datetime lastTime; + result = GetLastItem(lastTime, mTimes); + if (!result) + { + return result; + } + + // + // Compare Last Time by current Time ... + result = item.time > lastTime; + if (!result) + { + return result; + } + } + + // + return result; + } + + // + // Generate Logging String Representation ... + string GenerateString( + XCollector &item, // Specified Info + string separator = "\n" // Separator Character + ) + { + // + string result = ""; + + // + result += "time: " + (string)item.time + separator; + result += "volume: " + (string)item.volume + separator; + result += "maxDrawDown: " + (string)item.maxDrawDown + separator; + result += "maxAllowedVolume: " + (string)item.maxAllowedVolume + separator; + result += "minBalanceForOpenTrade: " + (string)item.minBalanceForOpenTrade + separator; + + // + return result; + } + + // + // Protected ... +protected: + // + // Private ... +private: + // + // Max Draw Up touched till now ... + double mMaxDrawUp; + + // + // Max Draw Down touched till now ... + double mMaxDrawDown; + + // + // Last Time for Checks ... + datetime mTimes[]; + + // + // Volume at the Check Time ... + double mVolumes[]; + + // + // DrawDown for each Check ... + double mMaxDrawDowns[]; + + // + // Max Allowed Volume for each check ... + double mMaxAllowedVolumes[]; + + // + // Min Balance for Open Trades for Each Check ... + double mMinBalanceForTradePrices[]; + + // + // Reset ... + void Clean() + { + // + mMaxDrawUp = 0; + mMaxDrawDown = 0; + + // + CleanBuffer(mTimes); + CleanBuffer(mVolumes); + CleanBuffer(mMaxDrawDowns); + CleanBuffer(mMaxAllowedVolumes); + CleanBuffer(mMinBalanceForTradePrices); + } + + // + // Validate Index ... + bool IsValidIndex( + int index // Specified Index + ) + { + // + bool result = false; + + // + int bufferSize = ArraySize(mTimes); + if (bufferSize <= 0) + { + return result; + } + + // + result = index <= bufferSize - 1; + + // + return result; + } +}; + +// +// a Class for Managing Volumes ... +class XCVolumeManager : public XCBase +{ + // + // Public ... +public: + // + // Constructor ... + XCVolumeManager( + double staticVolumeRate, // Static Volume Calculation Mutiplier + ENUM_STATIC_VOLUME_METHODS volumeMethod = X_STATIC_VOLUME_BASED_ON_DEPOSIT, // How to Calculate Static Volume + double volumeMultiplier = 0, // Volume Multiplier + double volumeMultiplierAppliedRate = 0, // Apply Volume Multiplier when Balance Increased by this rate + double maxAllowedVolume = 0, // Max Allowed Volume + double increaseMaxAllowedVolumeRate = 0 // Increase Max Allowed Volumes when Balance Increased by this rate + ) + { + // + mAccountInfo = new XCAccountInfo(); + + // + ResetForceVolumeMultiplier(); + + // + mVolumeMethod = volumeMethod; + mStaticVoluemRate = staticVolumeRate; + mVolumeMultiplier = volumeMultiplier; + mMaxAllowedVolume = maxAllowedVolume; + mVolumeMultiplierAppliedRate = volumeMultiplierAppliedRate; + mIncreaseMaxAllowedVolumeRate = increaseMaxAllowedVolumeRate; + } + + // + // Deconstructor ... + ~XCVolumeManager(void) {} + + // + // Check Volume Multiplier ... + bool CanUseVolumeMultiplier() + { + // + bool result = false; + + // + result = + mVolumeMultiplier > 0 && + mVolumeMultiplierAppliedRate > 0; + + // + return result; + } + + // + // Check Max Volume ... + bool CanUseMaxVolume() + { + // + bool result = false; + + // + result = + mMaxAllowedVolume > 0; + + // + return result; + } + + // + // Calculate Volume for Position ... + double CalculateVolume( + int numberOfOpenPositions = 0, // Number Of Open Signals + string symbol = NULL // Specify Symbol + ) + { + // + double result = 0; + + // + // Normalize Symbol ... + if (StringLen(symbol) == 0) + { + symbol = _Symbol; + } + + // + // Static Volume ... + result = GetStaticVolume(); + + // + double multiplier = GetVolumeMultiplier(); + result *= multiplier; + + // + // Check Max Allowed Volume Exists ... + double maxAllowedVolume = GetMaxAllowedVolume(); + if (maxAllowedVolume > 0) + { + // + result = + result > maxAllowedVolume + ? maxAllowedVolume + : result; + } + + // + // Check Number of Open Positions ... + if (numberOfOpenPositions >= 0) + { + // + // Decrease Volume ... + result /= (1 + numberOfOpenPositions); + } + + // + // Apply Force Volume Multiplier ... + result *= mForceVolumeMultiplier; + + // + // Retrieve Symbol Volume Info ... + result = NormalizeVolume(result, symbol, 2); + + // + return result; + } + + // + // Calculate Volume Multiplier ... + double GetVolumeMultiplier() + { + // + double result = 1; + + // + double deposit = mAccountInfo.GetInitialBalance(); + double balance = mAccountInfo.GetBalance(); + bool canUseVolumeMultiplier = CanUseVolumeMultiplier(); + if ( + balance < deposit || + !canUseVolumeMultiplier) + { + return result; + } + + // + // Apply Multiplier to Volume ... + double baseGrowBalance = deposit * mVolumeMultiplierAppliedRate; + double balanceGrows = balance - deposit; + if (balanceGrows < baseGrowBalance) + { + return result; + } + + // + double applyMultiplierTimes = balanceGrows / baseGrowBalance; + double roundedApplyMultiplierTimes = MathRound(applyMultiplierTimes); + + // + if (applyMultiplierTimes < roundedApplyMultiplierTimes) + { + applyMultiplierTimes -= (1 - (roundedApplyMultiplierTimes - applyMultiplierTimes)); + } + + // + // Calculate result ... + result = applyMultiplierTimes * mVolumeMultiplier; + + // + return result; + } + + // + // Retrieve Required Balance Grows for Increase Max Allowed Volume ... + double GetIncreaseMaxAllowedVolumeBalance() + { + // + double result = 0; + + // + if ( + mMaxAllowedVolume <= 0 || + mIncreaseMaxAllowedVolumeRate <= 0) + { + return result; + } + + // + result = mAccountInfo.GetInitialBalance() * mIncreaseMaxAllowedVolumeRate; + + // + return result; + } + + // + // Calculate Max Allowed Volume ... + double GetMaxAllowedVolume() + { + // + double result = 0; + + // + // Validate Args ... + result = + mMaxAllowedVolume <= 0 + ? 0 + : mMaxAllowedVolume; + + // + double deposit = mAccountInfo.GetInitialBalance(); + double balance = mAccountInfo.GetBalance(); + bool canUseMaxAllowedVolume = CanUseMaxVolume(); + if ( + balance <= deposit || + !canUseMaxAllowedVolume || + mIncreaseMaxAllowedVolumeRate <= 0) + { + // + return result; + } + + // + // Apply Multiplier to Volume ... + double baseGrowBalance = GetIncreaseMaxAllowedVolumeBalance(); + double balanceGrows = balance - deposit; + if (balanceGrows < baseGrowBalance) + { + return result; + } + + // + double applyMultiplierTimes = balanceGrows / baseGrowBalance; + double roundedApplyMultiplierTimes = MathRound(applyMultiplierTimes); + + // + if (applyMultiplierTimes < roundedApplyMultiplierTimes) + { + applyMultiplierTimes -= (1 - (roundedApplyMultiplierTimes - applyMultiplierTimes)); + } + + // + result *= applyMultiplierTimes; + + // + return result; + } + + // + // Get Static Volume ... + double GetStaticVolume() + { + // + double result = 0; + + // + double deposit = mAccountInfo.GetInitialBalance(); + double balance = mAccountInfo.GetBalance(); + + // + switch (mVolumeMethod) + { + // + case X_STATIC_VOLUME_BASED_ON_DEPOSIT: + result = mStaticVoluemRate * deposit; + break; + + // + case X_STATIC_VOLUME_BASED_ON_BALANCE: + result = mStaticVoluemRate * balance; + break; + } + + // + return result; + } + + // + // Reset Froce Volume Multiplier ... + void ResetForceVolumeMultiplier() + { + mForceVolumeMultiplier = 1; + } + + // + // Retrieve Current Force Volume Multiplier ... + double GetCurrentForceVolumeMultiplier() + { + return mForceVolumeMultiplier; + } + + // + // Retrieve Next Increase Multiplier Price ... + double GetIncreaseMultiplierBalance() + { + return mAccountInfo.GetInitialBalance() * mVolumeMultiplierAppliedRate; + } + + // + // Change Force Volume Multiplier ... + void ChangeForceVolumeMultiplier( + double rate // Change rate + ) + { + // + // Normalize rate ... + if (rate <= 1) + { + rate = 1; + } + + // + mForceVolumeMultiplier = rate; + } + + // + // Increase Force Volume Multiplier ... + void IncreaseForceVolumeMultiplier() + { + mForceVolumeMultiplier += 0.5; + } + + // + // Decrease Force Volume Multiplier ... + void DecreaseForceVolumeMultiplier() + { + // + if (mForceVolumeMultiplier <= 1) + { + return; + } + + // + mForceVolumeMultiplier -= 0.5; + } + + // + // Generate Current State Log String ... + string GenerateStateString( + string separator = "\n" // Log Separator ... + ) + { + // + string result = ""; + + // + // Normallize Separator ... + if (StringLen(separator) == 0) + { + separator = "\n"; + } + + // + result += "ForceVolumeMultiplier: " + (string)mForceVolumeMultiplier + separator; + // + result += "StaticVoluemRate: " + (string)mStaticVoluemRate + separator; + result += "StaticVoluem: " + (string)GetStaticVolume() + separator; + result += "VolumeMethod: " + EnumToString(mVolumeMethod) + separator; + // + result += "VolumeMultiplier: " + (string)mVolumeMultiplier + separator; + result += "VolumeMultiplierAppliedRate: " + (string)mVolumeMultiplierAppliedRate + separator; + // + result += "MaxAllowedVolume: " + (string)mMaxAllowedVolume + separator; + result += "IncreaseMaxAllowedVolumeRate: " + (string)mIncreaseMaxAllowedVolumeRate + separator; + + // + return result; + } + + // + // Protected ... +protected: + // + // Private ... +private: + // + // an Instance of Account Info for reading Balance and Deposit and etc ... + XCAccountInfo mAccountInfo; + + // + // Force Volume Rate Multiplier ... + double mForceVolumeMultiplier; + + // + // Static Volume Calculation Mutiplier ... + double mStaticVoluemRate; + + // + // How to Calculate Static Volume ... + ENUM_STATIC_VOLUME_METHODS mVolumeMethod; + + // + // Volume Multiplier ... + double mVolumeMultiplier; + + // + // Apply Volume Multiplier when Balance Increased by this rate ... + double mVolumeMultiplierAppliedRate; + + // + // Max Allowed Volume + double mMaxAllowedVolume; + + // + // Increase Max Allowed Volumes when Balance Increased by this rate + double mIncreaseMaxAllowedVolumeRate; +}; + +// +// a Class For Managing Signals Additional Data ... +class XCSignalManager : public XCBase +{ + // + // Public ... +public: + // + // Constructor ... + XCSignalManager(void) + { + CleanData(); + } + + // + // Deconstructor ... + ~XCSignalManager(void) {} + + // + void Reset() + { + CleanData(); + } + + // + // Retrieve All Signals ... + void GetAll( + XSignal &result[] // Hold's Result + ) + { + // + CleanBuffer(result); + + // + int signalsCount = ArraySize(mSignals); + if (signalsCount <= 0) + { + return; + } + + // + for (int i = 0; i < signalsCount; i++) + { + // + XSignal iSignal = mSignals[i]; + + // + AddItemToBuffer( + iSignal, + result); + } + } + + // + // Count Items ... + int Count() + { + return ArraySize(mSignals); + } + + // + // Retrieve Specific Signal by Ticket ... + XSignal Get( + ulong ticket // Signals Ticket ... + ) + { + // + XSignal result = {}; + + // + // Check Exists ... + bool isExists = IsExists(ticket); + if (!isExists) + { + return result; + } + + // + int signalsCount = ArraySize(mSignals); + if (signalsCount <= 0) + { + return result; + } + + // + for (int i = 0; i < signalsCount; i++) + { + // + XSignal iSignal = mSignals[i]; + + // + if (iSignal.ticket == ticket) + { + // + result = iSignal; + break; + } + } + + // + return result; + } + + // + // Check Signal Exists or not ... + bool IsExists( + ulong ticket // Specified Signal Ticket + ) + { + // + bool result = false; + + // + int signalsCount = ArraySize(mSignals); + if (signalsCount <= 0) + { + return result; + } + + // + for (int i = 0; i < signalsCount; i++) + { + // + XSignal iSignal = mSignals[i]; + + // + if (iSignal.ticket == ticket) + { + // + result = true; + break; + } + } + + // + return result; + } + bool IsExists( + XSignal &signal // Specified Signal + ) + { + // + bool result = false; + + // + int signalsCount = ArraySize(mSignals); + if (signalsCount <= 0) + { + return result; + } + + // + for (int i = 0; i < signalsCount; i++) + { + // + XSignal iSignal = mSignals[i]; + + // + if (iSignal.ticket == signal.ticket) + { + // + result = true; + break; + } + } + + // + return result; + } + + // + // Add Signal ... + bool Add( + XSignal &signal // Specified Signal + ) + { + // + bool result = false; + + // + // Validate Args ... + if (signal.ticket <= 0) + { + return result; + } + + // + // Chekc Signal Exists ... + bool isExists = IsExists(signal); + if (isExists) + { + return result; + } + + // + AddItemToBuffer( + signal, + mSignals); + result = true; + + // + return result; + } + + // + // Update Specific Buffer ... + bool Update( + XSignal &signal // Specified Signal + ) + { + // + bool result = false; + + // + // Validate Args ... + if (signal.ticket <= 0) + { + return result; + } + + // + // Chekc Signal Exists ... + bool isExists = IsExists(signal); + if (!isExists) + { + return result; + } + + // + // Remove Signal ... + Remove(signal); + + // + // Add new One ... + AddItemToBuffer( + signal, + mSignals); + + // + result = true; + + // + return result; + } + + // + // Remove Signal ... + bool Remove( + ulong ticket // Specified Signal Ticket + ) + { + // + bool result = false; + + // + // Check Signal Exists ... + bool isExists = IsExists(ticket); + if (!isExists) + { + return result; + } + + // + int signalsCount = ArraySize(mSignals); + if (signalsCount <= 0) + { + return result; + } + + // + XSignal signals[]; + + // + for (int i = 0; i < signalsCount; i++) + { + // + XSignal iSignal = mSignals[i]; + + // + if (iSignal.ticket != ticket) + { + AddItemToBuffer( + iSignal, + signals); + } + } + + // + // Now we have to Clean All Signals and Replace them by signals[] buffer ... + UpdateData(signals); + + // + result = true; + return result; + } + bool Remove( + XSignal &signal // Specified Signal + ) + { + // + bool result = false; + + // + // Check Signal Exists ... + bool isExists = IsExists(signal); + if (!isExists) + { + return result; + } + + // + int signalsCount = ArraySize(mSignals); + if (signalsCount <= 0) + { + return result; + } + + // + XSignal signals[]; + + // + for (int i = 0; i < signalsCount; i++) + { + // + XSignal iSignal = mSignals[i]; + + // + if (iSignal.ticket != signal.ticket) + { + AddItemToBuffer( + iSignal, + signals); + } + } + + // + // Now we have to Clean All Signals and Replace them by signals[] buffer ... + UpdateData(signals); + + // + result = true; + return result; + } + + // + // Add Or Update ... + bool AddOrUpdate( + XSignal &signal // Specified Signal + ) + { + // + bool result = false; + + // + // Validate Args ... + if (signal.ticket <= 0) + { + return result; + } + + // + // Chekc Signal Exists ... + bool isExists = IsExists(signal); + if (!isExists) + { + result = Add(signal); + } + else + { + result = Update(signal); + } + + // + return result; + } + + // + // Protected ... +protected: + // + // Private ... +private: + // + // Holds Signals ... + XSignal mSignals[]; + + // + // Clean All Exists Data ... + void CleanData() + { + CleanBuffer(mSignals); + } + + // + // Update Data ... + void UpdateData( + XSignal &source[] // a Buffer which needs to Replace ... + ) + { + // + CleanData(); + + // + int sourceCount = ArraySize(source); + if (sourceCount <= 0) + { + return; + } + + // + for (int i = 0; i < sourceCount; i++) + { + // + XSignal iSignal = source[i]; + + // + AddItemToBuffer( + iSignal, + mSignals); + } + } +}; + +// +// XSaherElm Trade Class ... +class XCTrade : public XCBase +{ + // + // all public features ... +public: + // + // Constructor ... + void XCTrade( + string tag, // Specify a Tag for Trader instance + string symbol, // Specify Trader Symbol + int slippage, // Specify Slippage + ulong magicNumber, // Specify Magic Number + bool useVirtualTPSL, // Use Virtual TP SL + int maxAllowedTrades, // Specify Max Allowed Trades + double minBallanceForOpenTrades, // Specify Minimum Balance for Open Trades + double minAllowedFreeMarginForOpenTrades, // Specify Minimum Free Marging for Open Trades + bool useSignalProtector = true // Specify Use Signal Protector or not + ) + { + // + mTag = tag; + mSymbol = symbol; + mSlippage = slippage; + mMagicNumber = magicNumber; + mUseVirtualTPSL = useVirtualTPSL; + mMaxAllowedTrades = maxAllowedTrades; + mMinBallanceForOpenTrades = minBallanceForOpenTrades; + mMinAllowedFreeMarginForOpenTrades = minAllowedFreeMarginForOpenTrades; + + // + mTrader = new XSCTrade(); + + // + mTrader.SetAsyncMode(false); + mTrader.SetDeviationInPoints(mSlippage); + mTrader.SetExpertMagicNumber(mMagicNumber); + + // + // Setting Log Level ... + mTrader.LogLevel(LOG_LEVEL_ERRORS); + + // + mSignalManager = new XCSignalManager(); + + // + Reset(); + } + + // + // Deconstructor ... + void ~XCTrade() + { + } + + // + // START Configuring Class Functions ... + // + + // + // Reset all Variables ... + void Reset() + { + // + mSignalManager.Reset(); + + // + mDaysForRead = 1; + mScanStarted = false; + + // + // Reset On Trade Counter ... + ResetOnTradeContext(); + + // + // Init On Trade Context ... + InitOnTradeContext(); + } + + // + // END Configuring Class Functions ... + // + + // + // START Count ... + // + + // + // Count Open Positions ... + int Count() + { + // + int result = 0; + + // + int total = PositionsTotal(); + for (int i = 0; i < total; i++) + { + // + if (!mPositionInfo.SelectByIndex(i)) + { + continue; + } + + // + if (mPositionInfo.Magic() != mMagicNumber) + { + continue; + } + + // + if (mPositionInfo.Symbol() != mSymbol) + { + continue; + } + + // + result++; + } + + // + return result; + } + + // + // Count Longs ... + int CountLongs() + { + int result = CountByType(X_SIGNAL_LONG); + return result; + } + + // + // Count Shorts ... + int CountShorts() + { + int result = CountByType(X_SIGNAL_SHORT); + return result; + } + + // + // Count Specific Type Of Positions ... + int CountByType(ENUM_POSITION_TYPE type) + { + // + int result = 0; + + // + int total = PositionsTotal(); + for (int i = 0; i < total; i++) + { + // + if (!mPositionInfo.SelectByIndex(i)) + { + continue; + } + + // + if (mPositionInfo.Symbol() != mSymbol) + { + continue; + } + + // + if (mPositionInfo.PositionType() != type) + { + continue; + } + + // + result++; + } + + // + return result; + } + + // + // Count By Type ... + int CountByType(ENUM_X_SIGNAL_TYPE type) + { + // + // Validate Args ... + ENUM_POSITION_TYPE mType = POSITION_TYPE_BUY; + if (type == X_SIGNAL_LONG) + { + mType = POSITION_TYPE_BUY; + } + else if (type == X_SIGNAL_SHORT) + { + mType = POSITION_TYPE_SELL; + } + + // + int result = CountByType(mType); + return result; + } + + // + // END Count ... + // + + // + // START Retrieve ... + // + + // + // Retrieve Specified Position by it's Ticket ... + XSignal GetSignal( + ulong ticket // Specified Ticket + ) + { + // + XSignal result = {}; + + // + result = PositionToSignal(ticket); + + // + return result; + } + + // + // Get Last Signal ... + XSignal GetLastSignal() + { + // + XSignal result = {}; + + // + XSignal signals[]; + GetSignals(signals); + int signalsCount = ArraySize(signals); + if (signalsCount <= 0) + { + return result; + } + + // + result = signals[0]; + + // + return result; + } + + // + // Retrieve Last Executed Signal ... + bool GetLastSignal(XSignal &signal) + { + // + bool result = false; + + // + XSignal signals[]; + GetSignals(signals); + int signalsCount = ArraySize(signals); + if (signalsCount <= 0) + { + return result; + } + + // + signal = signals[0]; + result = true; + + // + return result; + } + + // + // Retrieve All Positions ... + void GetSignals( + XSignal &result[] // Holds Result ... + ) + { + // + CleanBuffer(result); + + // + int totalPositions = PositionsTotal(); + for (int i = 0; i < totalPositions; i++) + { + // + if (!mPositionInfo.SelectByIndex(i)) + { + continue; + } + + // + if (mPositionInfo.Magic() != mMagicNumber) + { + continue; + } + + // + if (mPositionInfo.Symbol() != mSymbol) + { + continue; + } + + // + // Position to Signal ... + XSignal signal = PositionToSignal(i); + Add( + signal, + result); + } + } + + // + // Retrieve Type Specific Signals ... + void GetSignals( + XSignal &result[], // Holds Result ... + ENUM_X_SIGNAL_TYPE type // Specified Sginal Type ... + ) + { + // + CleanBuffer(result); + + // + XSignal signals[]; + GetSignals(signals); + + // + int signalsCount = ArraySize(signals); + if (signalsCount <= 0) + { + return; + } + + // + // Loop ... + for (int i = signalsCount - 1; i >= 0; i--) + { + // + XSignal iSignal = signals[i]; + + // + if (type == X_SIGNAL_UNKNOWN) + { + Add( + iSignal, + result); + } + else if (iSignal.type == type) + { + Add( + iSignal, + result); + } + } + } + + // + // Filter Signals By Searching Comments ... + void FilterSignals( + XSignal &result[], // Holds Result ... + const string query, // Search in Comment Qeury ... + ENUM_X_SIGNAL_TYPE type = X_SIGNAL_UNKNOWN // Specified Sginal Type ... + ) + { + // + CleanBuffer(result); + + // + XSignal signals[]; + GetSignals( + signals, + type); + int signalsCount = ArraySize(signals); + + // + // Validate Args ... + if ( + StringLen(query) <= 0 || + signalsCount <= 0) + { + return; + } + + // + // Loop ... + for (int i = 0; i < signalsCount; i++) + { + // + XSignal iSignal = signals[i]; + + // + int queryPos = StringFind( + iSignal.comment, + query); + bool isContains = queryPos > -1; + if (!isContains) + { + continue; + } + + // + Add( + iSignal, + result); + } + } + + // + // Get All Trades Which Candle Passed after Open ... + void GetOldSignals( + XSignal &result[], // Holds Result + int life, // Max Candle Passed after Trades Open + ENUM_TIMEFRAMES period = NULL, // Calculate Candles based on time frame + ENUM_X_SIGNAL_TYPE type = X_SIGNAL_UNKNOWN // Specify Type of Positions + ) + { + // + CleanBuffer(result); + + // + // Normalize Period ... + if (period == NULL) + { + period = _Period; + } + + // + XSignal signals[]; + GetSignals( + signals, + type); + int signalsCount = ArraySize(signals); + if (signalsCount <= 0) + { + return; + } + + // + // Current Time Frame Candle Index ... + int currentBarIndex = 0; + + // + // Loop through Positions ... + for (int i = 0; i < signalsCount; i++) + { + // + XSignal iSignal = signals[i]; + + // + // Retrieve Trade Open Bar Index based on Current Period ... + int tradeOpenBarIndex = iBarShift( + mSymbol, + period, + iSignal.time); + + // + // Calculate Trade Life ... + int diff = MathAbs(currentBarIndex - tradeOpenBarIndex); + + // + bool isPassed = diff >= life; + if (isPassed) + { + // + Add( + iSignal, + result); + } + } + } + + // + // Get In Profit Signals ... + void GetInProfitSignals( + XSignal &result[], // Holds Result + double minProfit = 0, // Minimum Profit To Close Trades + ENUM_X_SIGNAL_TYPE type = X_SIGNAL_UNKNOWN // Specify Type of Positions + ) + { + // + CleanBuffer(result); + + // + XSignal signals[]; + GetSignals( + signals, + type); + int signalsCount = ArraySize(signals); + if (signalsCount <= 0) + { + return; + } + + // + // Loop ... + for (int i = 0; i < signalsCount; i++) + { + // + XSignal iSignal = signals[i]; + + // + bool isPassed = minProfit <= 0 && iSignal.profit > 0 + ? true + : iSignal.profit >= minProfit; + if (isPassed) + { + Add( + iSignal, + result); + } + } + } + + // + // Get In Drawdown Signals ... + void GetInDrawdownSignals( + XSignal &result[], // Holds Result + double maxDrawDown = 0, // Minimum Profit To Close Trades + ENUM_X_SIGNAL_TYPE type = X_SIGNAL_UNKNOWN // Specify Type of Positions + ) + { + // + CleanBuffer(result); + + // + XSignal signals[]; + GetSignals( + signals, + type); + int signalsCount = ArraySize(signals); + if (signalsCount <= 0) + { + return; + } + + // + // Loop ... + for (int i = 0; i < signalsCount; i++) + { + // + XSignal iSignal = signals[i]; + + // + bool isPassed = maxDrawDown <= 0 && iSignal.profit < 0 + ? true + : iSignal.profit >= (-1 * maxDrawDown); + if (isPassed) + { + Add( + iSignal, + result); + } + } + } + + // + // Retrieve Max In Draw Down Trade ... + XSignal GetMaxInDrawdownSignal( + ENUM_X_SIGNAL_TYPE type = X_SIGNAL_UNKNOWN // Specify Type of Positions + ) + { + // + XSignal result = {}; + + // + XSignal signals[]; + GetInDrawdownSignals( + signals, + 0, + type); + int signalsCount = ArraySize(signals); + if (signalsCount <= 0) + { + return result; + } + + // + // Loop ... + for (int i = 0; i < signalsCount; i++) + { + // + XSignal iSignal = signals[i]; + + // + result = + (result.ticket <= 0 && + result.profit == 0) || + result.profit > iSignal.profit + ? iSignal + : result; + } + + // + return result; + } + + // + // Calculate Profits Of all Open Signals ... + double GetSignalsProfit( + ENUM_X_SIGNAL_TYPE type = X_SIGNAL_UNKNOWN // Specify Type of Positions + ) + { + // + double result = 0; + + // + XSignal signals[]; + GetSignals(signals, type); + int signalsCount = ArraySize(signals); + if (signalsCount <= 0) + { + return result; + } + + // + // Loop ... + for (int i = 0; i < signalsCount; i++) + { + // + XSignal iSignal = signals[i]; + + // + result += iSignal.profit; + } + + // + return result; + } + + // + // END Retrieve ... + // + + // + // START Signal Execution Actions ... + // + + // + // Execute a Signal in Market ... + ENUM_EXECUTION_SIGNAL_RESULT ExecuteSignal( + XSignal &signal, // Specified Signal + bool ignoreNumberOfTraes = false, // Ignore Number of Trades + bool checkAccountConditions = true // Check Account Balance, Equity and Free Margin for Signal Execution + ) + { + // + ENUM_EXECUTION_SIGNAL_RESULT result = X_TRADER_UNKNOWN_ERROR; + + // + // Validate Signal ... + bool isValid = IsValidSignal(signal); + if (!isValid) + { + // + result = X_TRADER_INVALID_SIGNAL_ERROR; + return result; + } + + // + // Check Account Equity ... + bool isEquityPassed = !checkAccountConditions + ? true + : IsEquityReadyForTrade(); + if (!isEquityPassed) + { + // + result = X_TRADER_NOT_ENOUGH_EQUITY_ERROR; + return result; + } + + // + // Check Account Balance ... + bool isBalancePassed = !checkAccountConditions + ? true + : IsBalanceReadyForTrade(); + if (!isBalancePassed) + { + // + result = X_TRADER_NOT_ENOUGH_BALANCE_ERROR; + return result; + } + + // + // Check Account FreeMargin ... + bool isFreeMarginPassed = !checkAccountConditions + ? true + : IsFreeMarginReadyForTrade(); + if (!isFreeMarginPassed) + { + // + result = X_TRADER_NOT_ENOUGH_MARIGIN_ERROR; + return result; + } + + // + // Check Number of Open Trades ... + int openTradesCount = Count(); + bool isTradeCountPassed = ignoreNumberOfTraes + ? true + : openTradesCount < mMaxAllowedTrades; + if (!isTradeCountPassed) + { + // + result = X_TRADER_MAX_TRADES_REACHED_ERROR; + return result; + } + + // + bool isExecuted = + signal.type == X_SIGNAL_LONG + ? Buy( + signal.volume, + signal.entry, + mUseVirtualTPSL + ? 0 + : signal.sl, + mUseVirtualTPSL + ? 0 + : signal.tp, + signal.comment) + : signal.type == X_SIGNAL_SHORT + ? Sell( + signal.volume, + signal.entry, + mUseVirtualTPSL + ? 0 + : signal.sl, + mUseVirtualTPSL + ? 0 + : signal.tp, + signal.comment) + : false; + if (isExecuted) + { + // + ulong ticket = PositionGetTicket(PositionsTotal() - 1); + + // + signal.id = ticket; + signal.ticket = ticket; + + // + AddOrUpdateSignalInfo(signal); + + // + result = X_TRADER_SUCCEED_EXECUTION; + } + + // + return result; + } + + // + // This Function, Handling Following Works on Open Positions: + // - Close On SL if Reached ... + // - Close On TP if Reached ... + // - Make Risk Free Trades ... + bool HandleSignals( + XTraderHandlerResult &handlerResult, // Holds Result + bool ignoreRiskFree = false // Ignore Risk Free Trdaes + ) + { + // + bool result = false; + + // + // Cleanup Result ... + CleanBuffer(handlerResult.sl); + CleanBuffer(handlerResult.tp); + CleanBuffer(handlerResult.rf); + + // + // Reading Open Positions ... + XSignal signals[]; + GetSignals(signals); + int signalsCount = ArraySize(signals); + if (signalsCount <= 0) + { + return result; + } + + // + double deviation = mSlippage * GetPoints(mSymbol); + + // + // Loop ... + for (int i = 0; i < signalsCount; i++) + { + // + XSignal iSignal = signals[i]; + + // + bool isLong = iSignal.type == X_SIGNAL_LONG; + double entry = GetEntry(iSignal.symbol, iSignal.type); + double exit = GetExit(iSignal.symbol, iSignal.type); + double spread = GetSpread(iSignal.symbol); + double appliedTPPrice = + iSignal.tp > 0 + ? isLong + ? iSignal.tp - deviation + : iSignal.tp + deviation + : 0; + double appliedSLPrice = + iSignal.sl > 0 + ? isLong + ? iSignal.sl + deviation + : iSignal.sl - deviation + : 0; + + // + double usedPrice = exit; + + // + bool isSLTouched = + isLong + ? usedPrice <= appliedSLPrice + : usedPrice >= appliedSLPrice; + + // + bool isTPTouched = + isLong + ? usedPrice >= appliedTPPrice + : usedPrice <= appliedTPPrice; + + // + // Handle SL ... + if ( + // + iSignal.sl > 0 + // + && + // + isSLTouched + // + && + // + mUseVirtualTPSL) + { + // + string comment = GenerateSignalSLComment(iSignal); + + // + bool isClosed = Close( + iSignal.ticket, + comment); + if (isClosed) + { + AddItemToBuffer( + iSignal, + handlerResult.sl); + } + } + + // + // Handle TP ... + if ( + // + iSignal.tp > 0 + // + && + // + isTPTouched + // + && + // + mUseVirtualTPSL) + { + // + string comment = GenerateSignalTPComment(iSignal); + + // + bool isClosed = Close( + iSignal.ticket, + comment); + if (isClosed) + { + AddItemToBuffer( + iSignal, + handlerResult.tp); + } + } + + // + // Handle Risk Free ... + if ( + // + !ignoreRiskFree + // + && + // + iSignal.riskFreeStep > 0 + // + && + // + iSignal.riskFreeRate > 0 + // + ) + { + // + // Make Signals Risk Free Only if Signal In Profit ... + if (iSignal.profit <= 0) + { + continue; + } + + // + // Base Price is ENTRY, then Last Level, in each level SL is Last Level ... + // + // Calculate Risk Free Level/Multiplier ... + double level = 0; + double roundedLevel = 0; + double rStepPrice = PipsToPrice(iSignal.riskFreeStep); + double rBasePrice = + iSignal.sl > 0 && + iSignal.sl > iSignal.entry + ? iSignal.sl + : iSignal.entry; + + // + double exit = GetExit(iSignal.type); + + // + // Check Base Price for Signal reached with Exit Price ... + bool isExitPriceReachedBasePrice = + isLong + ? exit > rBasePrice + : exit < rBasePrice; + if (!isExitPriceReachedBasePrice) + { + continue; + } + + // + // Calculate Risk Free Step Multiplier ... + level = MathAbs(exit - rBasePrice) / rStepPrice; + + // + // Check Level Must Bigger than 1 ... + if (level < 1) + { + continue; + } + + // + // Normalize Level ... + roundedLevel = MathRound(level); + if (level < roundedLevel) + { + level -= (1 - (roundedLevel - level)); + } + else if (level > roundedLevel) + { + level -= (level - roundedLevel); + } + + // + // Generate Comment ... + string comment = GenerateSignalRFComment(iSignal, (int)level); + + // + // Calculate SL ... + double slDistance = spread; + double sl = + isLong + ? exit - slDistance + : exit + slDistance; + + // + // Increase TP One Level if Exists ... + double tp = iSignal.tp; + if (iSignal.tp > 0 && (isLong + ? iSignal.tp < rBasePrice + rStepPrice + : iSignal.tp > rBasePrice - rStepPrice)) + { + // + tp = + isLong + ? iSignal.tp + rStepPrice + : iSignal.tp - rStepPrice; + } + + // + double rVolume = NormalizeVolume((iSignal.volume * iSignal.riskFreeRate), iSignal.symbol); + + // + // Update Signal Volume ... + double volume = iSignal.volume - rVolume; + + // + bool isClosedPartial = + ClosePartial( + iSignal.ticket, + rVolume, + comment); + if (isClosedPartial) + { + // + bool isModified = true; + if (!mUseVirtualTPSL) + { + // + isModified = Modify( + iSignal.ticket, + sl, + tp, + comment); + } + + // + if (isModified) + { + // + // Try to Update Signal ... + XSignal s = mSignalManager.Get(iSignal.ticket); + + // + // Apply Changes on Signal ... + s.sl = sl; + s.tp = tp; + s.volume = volume; + + // + // Update Signal ... + bool isUpdated = false; + bool isRemoved = false; + if (volume == 0) + { + isRemoved = mSignalManager.Remove(s); + } + else if (volume > 0) + { + isUpdated = mSignalManager.AddOrUpdate(s); + } + if ( + isUpdated || + isRemoved) + { + // + AddItemToBuffer( + s, + handlerResult.rf); + } + } + } + else + { + mSignalManager.Remove(iSignal.ticket); + } + } + } + + // + result = + ArraySize(handlerResult.tp) > 0 || + ArraySize(handlerResult.sl) > 0 || + ArraySize(handlerResult.rf) > 0; + + // + return result; + } + + // + // Close All Trades ... + void CloseSignals( + XSignal &result[], // Holds Result + ENUM_X_SIGNAL_TYPE type = X_SIGNAL_UNKNOWN // Specify Type of Positions + ) + { + // + CleanBuffer(result); + + // + XSignal signals[]; + GetSignals( + signals, + type); + int signalsCount = ArraySize(signals); + if (signalsCount <= 0) + { + return; + } + + // + for (int i = 0; i < signalsCount; i++) + { + // + XSignal iSignal = signals[i]; + + // + string comment = GenerateSignalForceCloseComment(iSignal); + + // + bool isClosed = Close( + iSignal.ticket, + comment); + if (isClosed) + { + Add( + iSignal, + result); + } + } + } + + // + // Close Pyramid Signals ... + void CloseInPyramidSignals( + XSignal &result[], // Holds Result + double pyramid = 0, // Close Pyramid Profit + ENUM_X_SIGNAL_TYPE type = X_SIGNAL_UNKNOWN // Specify Type of Positions + ) + { + // + CleanBuffer(result); + + // + XSignal signals[]; + GetSignals( + signals, + type); + int signalsCount = ArraySize(signals); + if (signalsCount <= 0) + { + return; + } + + // + double profit = 0; + for (int i = 0; i < signalsCount; i++) + { + // + XSignal iSignal = signals[i]; + + // + profit += iSignal.profit; + } + + // + // Normalize Pyramid ... + if (pyramid < 0) + { + pyramid = 0; + } + + // + if (profit > pyramid) + { + CloseSignals(result); + } + } + + // + // Close All Trades Which Candle Passed after Open ... + void CloseOldSignals( + XSignal &result[], // Holds Result + int life, // Max Candle Passed after Trades Open + ENUM_TIMEFRAMES period = NULL, // Calculate Candles based on time frame + ENUM_X_SIGNAL_TYPE type = X_SIGNAL_UNKNOWN // Specify Type of Positions + ) + { + // + CleanBuffer(result); + + // + XSignal signals[]; + GetOldSignals( + signals, + life, + period, + type); + int signalsCount = ArraySize(signals); + if (signalsCount <= 0) + { + return; + } + + // + for (int i = 0; i < signalsCount; i++) + { + // + XSignal iSignal = signals[i]; + + // + string comment = GenerateSignalAgeComment(iSignal); + + // + bool isClosed = Close( + iSignal.ticket, + comment); + if (isClosed) + { + Add( + iSignal, + result); + } + } + } + + // + // Close In Profit Signals ... + void CloseInProfitSignals( + XSignal &result[], // Holds Result + double minProfit = 0, // Minimum Profit To Close Trades + ENUM_X_SIGNAL_TYPE type = X_SIGNAL_UNKNOWN // Specify Type of Positions + ) + { + // + CleanBuffer(result); + + // + XSignal signals[]; + GetInProfitSignals( + signals, + minProfit, + type); + int signalsCount = ArraySize(signals); + if (signalsCount <= 0) + { + return; + } + + // + for (int i = 0; i < signalsCount; i++) + { + // + XSignal iSignal = signals[i]; + + // + string comment = GenerateSignalProfitComment(iSignal); + + // + bool isClosed = Close( + iSignal.ticket, + comment); + if (isClosed) + { + Add( + iSignal, + result); + } + } + } + + // + // Close In Drawdown Signals ... + void CloseInDrawdownSignals( + XSignal &result[], // Holds Result + double maxDrawDown = 0, // Minimum Profit To Close Trades + ENUM_X_SIGNAL_TYPE type = X_SIGNAL_UNKNOWN // Specify Type of Positions + ) + { + // + CleanBuffer(result); + + // + XSignal signals[]; + GetInDrawdownSignals( + signals, + maxDrawDown, + type); + int signalsCount = ArraySize(signals); + if (signalsCount <= 0) + { + return; + } + + // + for (int i = 0; i < signalsCount; i++) + { + // + XSignal iSignal = signals[i]; + + // + string comment = GenerateSignalProfitComment(iSignal); + + // + bool isClosed = Close( + iSignal.ticket, + comment); + if (isClosed) + { + Add( + iSignal, + result); + } + } + } + + // + // END Signal Execution Actions ... + // + + // + // START Actions ... + // + + // + // Force Open a Buy/Long Position ... + bool Buy( + double volume, // position volume + double price, // execution price + double sl = 0, // stop loss price + double tp = 0, // take profit price + const string comment = "" // comment + ) + { + // + bool result = false; + + // + result = mTrader.Buy( + volume, + mSymbol, + price, + sl, + tp, + comment); + + // + return result; + } + + // + // Send BUY LIMIT order ... + bool BuyLimit( + 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; + + // + result = mTrader.BuyLimit( + volume, + price, + mSymbol, + sl, + tp, + typeTime, + expiration, + comment); + + // + return result; + } + + // + // Send BUY STOP order ... + bool BuyStop( + 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; + + // + result = mTrader.BuyStop( + volume, + price, + mSymbol, + sl, + tp, + typeTime, + expiration, + comment); + + // + return result; + } + + // + // Force Open a Sell/Short Position ... + bool Sell( + double volume, // position volume + double price, // execution price + double sl = 0, // stop loss price + double tp = 0, // take profit price + const string comment = "" // comment + ) + { + // + bool result = false; + + // + result = mTrader.Sell( + volume, + mSymbol, + price, + sl, + tp, + comment); + + // + return result; + } + + // + // Send SELL LIMIT order ... + bool SellLimit( + 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; + + // + result = mTrader.SellLimit( + volume, + price, + mSymbol, + sl, + tp, + typeTime, + expiration, + comment); + + // + return result; + } + + // + // Send SELL STOP order ... + bool SellStop( + 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; + + // + result = mTrader.SellStop( + volume, + price, + mSymbol, + 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 + const string comment = "" // comment + ) + { + // + bool result = false; + + // + // Validate Args ... + if (tp <= 0 && sl <= 0) + { + result = false; + return result; + } + + // + result = mTrader.PositionModify( + ticket, + sl, + tp, + comment); + if (result) + { + // + if (mSignalManager.IsExists(ticket)) + { + // + XSignal signal = GetSignal(ticket); + + // + mSignalManager.Update(signal); + } + } + + // + 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); + if (result) + { + // + if (mSignalManager.IsExists(ticket)) + { + mSignalManager.Remove(ticket); + } + } + + // + return result; + } + + // + // 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); + if (result) + { + // + if (mSignalManager.IsExists(ticket)) + { + // + XSignal signal = GetSignal(ticket); + + // + mSignalManager.Update(signal); + } + } + + // + return result; + } + + // + // END Actions ... + // + + // + // START Account Related ... + // + + // + // Retrieve Minimum Balance For Open Trades ... + double GetMinBalanceForOpenTrades() + { + // + double result = mMinBallanceForOpenTrades; + + // + double balance = mAccountInfo.GetBalance(); + double deposit = mAccountInfo.GetInitialBalance(); + if (balance > deposit) + { + // + double rate = mMinBallanceForOpenTrades / deposit; + + // + double ratedBalance = balance * rate; + + // + result = MathMax(mMinBallanceForOpenTrades, ratedBalance); + } + + // + return result; + } + + // + // Check Account Has Minimum Balance For Trade ... + bool IsBalanceReadyForTrade() + { + // + bool result = false; + + // + double minBalance = GetMinBalanceForOpenTrades(); + result = mAccountInfo.GetBalance() >= minBalance; + + // + return result; + } + + // + // Check Free Margin Has Enough For Trade ... + bool IsFreeMarginReadyForTrade() + { + // + bool result = false; + + // + double freeMargin = mAccountInfo.GetFreeMargin(); + + // + result = freeMargin >= mMinAllowedFreeMarginForOpenTrades; + + // + return result; + } + + // + // Check Equity Has Enough For Trade ... + bool IsEquityReadyForTrade() + { + // + bool result = false; + + // + double equity = mAccountInfo.GetEquity(); + + // + result = equity >= mMinAllowedFreeMarginForOpenTrades; + + // + return result; + } + + // + // END Account Related ... + // + + // + // START Signal Related ... + // + + // + // Validate Signal ... + bool IsValidSignal( + XSignal &signal // Specified Signal for Execution + ) + { + // + bool result = false; + + // + // Validate Signal Type ... + result = signal.type != X_SIGNAL_UNKNOWN; + if (!result) + { + return result; + } + + // + // Check Symbol ... + result = StringLen(signal.symbol) == 0 ? true : signal.symbol == mSymbol; + if (!result) + { + return result; + } + + // + // Check magic number ... + result = signal.magicNumber <= 0 ? true : signal.magicNumber == mMagicNumber; + if (!result) + { + return result; + } + + // + // Check Entry ... + result = signal.entry > 0; + if (!result) + { + return result; + } + + // // + // // Check SL ... + // // For Fix RiskFree Issues Ignore this ... + // result = signal.sl == 0 ? true : signal.type == X_SIGNAL_LONG ? signal.sl < signal.entry + // : signal.sl > signal.entry; + // if (!result) + // { + // return result; + // } + + // + // Check TP ... + result = signal.tp == 0 ? true : signal.type == X_SIGNAL_LONG ? signal.tp > signal.entry + : signal.tp < signal.entry; + if (!result) + { + return result; + } + + // + // Check Volume ... + result = signal.volume > 0; + if (!result) + { + return result; + } + + // + // Check Time ... + result = signal.time > 0; + if (!result) + { + return result; + } + + // + return result; + } + + // + // Get Signal InDirection (Reversal) Type ... + ENUM_X_SIGNAL_TYPE GetSignalIndirectionType( + XSignal &signal // Specified Signal + ) + { + // + ENUM_X_SIGNAL_TYPE result = X_SIGNAL_UNKNOWN; + + // + switch (signal.type) + { + // + case X_SIGNAL_LONG: + result = X_SIGNAL_SHORT; + break; + + // + case X_SIGNAL_SHORT: + result = X_SIGNAL_LONG; + break; + } + + // + return result; + } + + // + // Get Signal InDirection (Reversal) Type ... + ENUM_X_SIGNAL_TYPE GetIndirectionSignalType( + ENUM_X_SIGNAL_TYPE type // Specified Type + ) + { + // + ENUM_X_SIGNAL_TYPE result = X_SIGNAL_UNKNOWN; + + // + switch (type) + { + // + case X_SIGNAL_LONG: + result = X_SIGNAL_SHORT; + break; + + // + case X_SIGNAL_SHORT: + result = X_SIGNAL_LONG; + break; + } + + // + return result; + } + + // + // Calculate SignalAge ... + int GetSignalAge( + datetime time // Signal Execution Time + ) + { + // + int result = 0; + + // + // Validate Arg ... + if (time <= 0) + { + return result; + } + + // + int sIndex = iBarShift( + mSymbol, + _Period, + time); + + // + datetime cTime = iTime( + mSymbol, + _Period, + 0); + int cIndex = iBarShift( + mSymbol, + _Period, + cTime); + + // + result = MathAbs(cIndex - sIndex); + + // + return result; + } + int GetSignalAge( + datetime time, // Signal Execution Time + ENUM_TIMEFRAMES period // Specify Time Frame + ) + { + // + int result = 0; + + // + // Validate Arg ... + if (time <= 0) + { + return result; + } + + // + int sIndex = iBarShift( + mSymbol, + period, + time); + + // + datetime cTime = iTime( + mSymbol, + period, + 0); + int cIndex = iBarShift( + mSymbol, + _Period, + cTime); + + // + result = MathAbs(cIndex - sIndex); + + // + return result; + } + int GetSignalAge( + XSignal &signal // Specified Signal + ) + { + // + int result = 0; + + // + // Validate Arg ... + if ( + signal.time <= 0 || + !IsValid(signal, mMagicNumber)) + { + return result; + } + + // + result = GetSignalAge(signal.time); + + // + return result; + } + int GetSignalAge( + XSignal &signal, // Specify Signal + ENUM_TIMEFRAMES period // Specify Time Frame + ) + { + // + int result = 0; + + // + // Validate Arg ... + if ( + signal.time <= 0 || + !IsValid(signal, mMagicNumber)) + { + return result; + } + + // + result = GetSignalAge( + signal.time, + period); + + // + return result; + } + + // + // Prepare a Signall ... + XSignal GenerateSignal( + ENUM_X_SIGNAL_TYPE type, // Signal Type + double tp = 0, // Take Profit + double sl = 0, // Stop Loss + double volume = 0, // Volume + double riskFreeStep = 0, // Risk Free Step Price + double riskFreeRate = 0 // Risk Free Rate + ) + { + // + XSignal result = {}; + + // + // Validate Arg ... + if (type == X_SIGNAL_UNKNOWN) + { + return result; + } + + // + // Check Signal Type ... + bool isLong = type == X_SIGNAL_LONG; + + // + // Retrieve entry Price ... + double entry = GetEntry(mSymbol, type); + double spread = GetSpread(mSymbol); + + // + result.tp = tp; + result.sl = sl; + result.type = type; + result.entry = entry; + result.symbol = mSymbol; + result.magicNumber = mMagicNumber; + result.riskFreeStep = riskFreeStep; + result.riskFreeRate = riskFreeRate; + result.time = iTime(mSymbol, _Period, 0); + result.volume = NormalizeVolume(volume, mSymbol); + + // + // Since we Use signal instance to Generate Comment, this must be at the end ... + result.comment = GenerateSignalComment(result); + + // + return result; + } + + // + // Convert a Signal to String Representation ... + string ToString( + XSignal &signal // Specified Signal + ) + { + // + string result = ""; + + // + if (!IsValid(signal, mMagicNumber) || signal.ticket <= 0) + { + return result; + } + + // + // TICKET ... + // it is very importants since they hold position info ... + result += X_SIGNAL_TICKET + "(" + (string)signal.ticket + ")"; + + // + // TYPE ... + string typeStr = GetSignalType(signal.type); + result += "_" + X_SIGNAL_TYPE + "(" + typeStr + ")"; + + // + // TP ... + result += "_" + X_SIGNAL_TP + "(" + (string)signal.tp + ")"; + + // + // SL ... + result += "_" + X_SIGNAL_SL + "(" + (string)signal.sl + ")"; + + // + // RFS ... + result += "_" + X_SIGNAL_RISKFREE_STEP + "(" + (string)signal.riskFreeStep + ")"; + + // + // RFR ... + result += "_" + X_SIGNAL_RISKFREE_RATE + "(" + (string)signal.riskFreeRate + ")"; + + // + return result; + } + + // + // Generate Comments for Specific Signal ... + string GenerateSignalComment( + ENUM_X_SIGNAL_TYPE type, // Specify Kind Signal Type + double volume, // Signal Volume + bool isCrossSignal = false // Specify Signal Cross + ) + { + // + string result = ""; + + // + string typeStr = GetSignalType(type); + if ( + volume <= 0 || + StringLen(typeStr) == 0) + { + return result; + } + + // + volume = NormalizeVolume(volume, mSymbol); + + // + result = mTag + (!isCrossSignal ? "" : "_Cross_") + "_" + typeStr; + + // + return result; + } + string GenerateSignalComment( + XSignal &signal, // Specified Signal + bool isCrossSignal = false // Specify Signal Cross + ) + { + // + string result = GenerateSignalComment( + signal.type, + signal.volume, + isCrossSignal + // + ); + + // + return result; + } + + // + // Generate Signal RF TP Comment ... + string GenerateSignalRFComment( + XSignal &signal, // Specified Signal + int level // Which Step of RFS + ) + { + // + string result = ""; + + // + // Validate Signal and it's Ticket ... + if (!IsValidSignal(signal) || signal.ticket <= 0) + { + return result; + } + + // + double exit = NormalizePrice(GetExit(signal.symbol, signal.type), signal.symbol); + + // + string prefix = X_SIGNAL_RISKFREE_STEP + "(" + (string)signal.ticket + ")"; + // + result = + // + level > 0 + ? prefix + "_" + (string)level + ": " + (string)exit + : prefix + ": " + (string)exit; + // + ; + + // + return result; + } + + // + // Generate Signal TP Comment ... + string GenerateSignalTPComment( + XSignal &signal // Specified Signal + ) + { + // + string result = ""; + + // + // Validate Signal and it's Ticket ... + if (!IsValidSignal(signal) || signal.ticket <= 0) + { + return result; + } + + // + double exit = NormalizePrice(GetExit(signal.symbol, signal.type), signal.symbol); + + // + result = + // + X_SIGNAL_TP + "(" + (string)signal.ticket + "): " + (string)exit; + // + ; + + // + return result; + } + + // + // Generate Signal SL Comment ... + string GenerateSignalSLComment( + XSignal &signal // Specified Signal + ) + { + // + string result = ""; + + // + // Validate Signal and it's Ticket ... + if (!IsValidSignal(signal) || signal.ticket <= 0) + { + return result; + } + + // + double exit = NormalizePrice(GetExit(signal.symbol, signal.type), signal.symbol); + + // + result = + // + X_SIGNAL_SL + "(" + (string)signal.ticket + "): " + (string)exit; + // + ; + + // + return result; + } + + // + // Generate Signal Profit Comment ... + string GenerateSignalProfitComment( + XSignal &signal // Specified Signal + ) + { + // + string result = ""; + + // + // Validate Signal and it's Ticket ... + if (!IsValidSignal(signal) || signal.ticket <= 0) + { + return result; + } + + // + result = + // + "Profit(" + (string)signal.ticket + "): " + (string)signal.profit; + // + ; + + // + return result; + } + + // + // Generate Signal Force Close Comment ... + string GenerateSignalForceCloseComment( + XSignal &signal // Specified Signal + ) + { + // + string result = ""; + + // + // Validate Signal and it's Ticket ... + if (!IsValidSignal(signal) || signal.ticket <= 0) + { + return result; + } + + // + result = + // + "FC(" + (string)signal.ticket + "): " + (string)signal.profit; + // + ; + + // + return result; + } + + // + // Generate Signal Age Comment ... + string GenerateSignalAgeComment( + XSignal &signal // Specified Signal + ) + { + // + string result = ""; + + // + // Validate Signal and it's Ticket ... + if (!IsValidSignal(signal) || signal.ticket <= 0) + { + return result; + } + + // + int age = GetSignalAge(signal); + + // + result = + // + "(" + (string)signal.ticket + ") A: " + (string)age + ", P:" + (string)signal.profit; + // + ; + + // + return result; + } + + // + // Generate a Signal Object name for Draw Events On Chart ... + string GenerateSignalObjectName( + ulong ticket // Specify Ticket + ) + { + // + string result = ""; + + // + // Validate Arg ... + if (ticket <= 0) + { + return result; + } + + // + // TICKET ... + // it is very importants since they hold position info ... + result += "T(" + (string)ticket + ")"; + + // + return result; + } + string GenerateSignalObjectName( + XSignal &signal // Specified Signal + ) + { + // + string result = ""; + + // + // Validate Arg ... + if (!IsValid(signal, mMagicNumber)) + { + return result; + } + + // + result = GenerateSignalObjectName(signal.ticket); + + // + return result; + } + + // + // Genrate a Signal Event Object Name ... + string GenerateSignalEventObjectName( + ulong ticket // Specify Ticket + ) + { + // + string result = ""; + + // + result = GenerateSignalObjectName(ticket) + "_Event"; + + // + return result; + } + string GenerateSignalEventObjectName( + XSignal &signal // Specified Signal + ) + { + // + string result = ""; + + // + result = GenerateSignalEventObjectName(signal.ticket); + + // + return result; + } + + // + // END Signal Related ... + // + + // + // START Deals ... + // + + // + // Count Deals ... + int DealsCount( + datetime start = -1, // Start Date + datetime end = -1 // End Date + ) + { + // + int result = 0; + + // + XDeal deals[]; + GetDeals( + deals, + start, + end); + result = ArraySize(deals); + + // + return result; + } + + // + // Retrieve All Deals ... + void GetDeals( + XDeal &result[], // Hold's Result + datetime start = -1, // Start Date + datetime end = -1 // End Date + ) + { + // + CleanBuffer(result); + + // + // Select History if Start and End date provided ... + if (start > -1) + { + // + // Normalize End date ... + if (end == -1) + { + end = TimeCurrent(); + } + + // + bool isSelect = HistorySelect(start, end); + if (!isSelect) + { + return; + } + } + + // + int total = HistoryDealsTotal(); + if (total <= 0) + { + return; + } + + // + // Loop ... + for (int i = total - 1; i >= 0; i--) + { + // + // Select by Index ... + bool isSelect = mDealInfo.SelectByIndex(i); + if (!isSelect) + { + continue; + } + + // + // Check Magic ... + ulong magic = mDealInfo.Magic(); + bool isMagicSame = magic == mMagicNumber; + if (!isMagicSame) + { + continue; + } + + // + // Check Symbol ... + string symbol = mDealInfo.Symbol(); + bool isSymbolSame = symbol == mSymbol; + if (!isSymbolSame) + { + continue; + } + + // + XDeal deal = ToXDealByIndex(i); + + // + Add( + deal, + result); + } + } + + // + // Retrieve Last Deal ... + XDeal GetLastDeal() + { + // + XDeal result = {}; + + // + XDeal deals[]; + GetDeals(deals); + int dealsCount = ArraySize(deals); + if (dealsCount <= 0) + { + return result; + } + + // + result = deals[0]; + + // + return result; + } + + // + // END Deals ... + // + + // + // START Orders ... + // + + // + // Count Orders ... + int OrdersCount( + datetime start = -1, // Start Date + datetime end = -1 // End Date + ) + { + // + int result = 0; + + // + XOrder orders[]; + GetOrders( + orders, + start, + end); + result = ArraySize(orders); + + // + return result; + } + + // + // Retrieve Orders ... + void GetOrders( + XOrder &result[], // Hold's Result + datetime start = -1, // Start Date + datetime end = -1 // End Date + ) + { + // + CleanBuffer(result); + + // + // Select History if Start and End date provided ... + if (start > -1) + { + // + // Normalize End date ... + if (end == -1) + { + end = TimeCurrent(); + } + + // + bool isSelect = HistorySelect(start, end); + if (!isSelect) + { + return; + } + } + + // + int total = HistoryOrdersTotal(); + if (total <= 0) + { + return; + } + + // + // Loop ... + for (int i = total - 1; i >= 0; i--) + { + // + // Select by Index ... + bool isSelect = mOrderInfo.SelectByIndex(i); + if (!isSelect) + { + continue; + } + + // + // Check Magic ... + ulong magic = mOrderInfo.Magic(); + bool isMagicSame = magic == mMagicNumber; + if (!isMagicSame) + { + continue; + } + + // + // Check Symbol ... + string symbol = mOrderInfo.Symbol(); + bool isSymbolSame = symbol == mSymbol; + if (!isSymbolSame) + { + continue; + } + + // + XOrder order = ToXOrderByIndex(i); + + // + Add( + order, + result); + } + } + + // + // Retrieve Last Order ... + XOrder GetLastOrder() + { + // + XOrder result = {}; + + // + XOrder orders[]; + GetOrders(orders); + int ordersCount = ArraySize(orders); + if (ordersCount <= 0) + { + return result; + } + + // + result = orders[0]; + + // + return result; + } + + // + // END Orders ... + // + + // + // START OnTrade Handlers ... + // + + // + // Handle OnTrade Event ... + void HandleOnTradeEvent( + XOnTradeHandlerResult &result // Hold's Result + ) + { + // + if (mScanStarted) + { + ProcessOnTradeContext(result); + } + else + { + InitOnTradeContext(); + } + } + + // + // END OnTrade Handlers ... + // + + // + // Retrieve Magic Number ... + ulong GetMagicNumber() + { + return mMagicNumber; + } + + // + // all protected features ... +protected: + // + // all private features ... +private: + // + // Specified Unique Tag ... + string mTag; + + // + // which Symbol ... + string mSymbol; + + // + // using deviation, it must be in Point ... + int mSlippage; + + // + // using magic number ... + ulong mMagicNumber; + + // + // Detect Using Virtual TP or SL ... + bool mUseVirtualTPSL; + + // + // Specify Max Allowed Trades + int mMaxAllowedTrades; + + // + // Minimum Free Marging for Open Trades + double mMinAllowedFreeMarginForOpenTrades; + + // + // Minimum Balance for Open Trades + double mMinBallanceForOpenTrades; + + // + // using CTrade instance ... + XSCTrade mTrader; + + // + // Deals Info ... + CDealInfo mDealInfo; + + // + // Order Info ... + COrderInfo mOrderInfo; + + // + // An Instance Of XCAccount Info for Handling Account Related Actions ... + XCAccountInfo mAccountInfo; + + // + // using PositionInfo instance ... + CPositionInfo mPositionInfo; + + // + // Signal Manager ... + XCSignalManager mSignalManager; + + // + // START OnTrade Handlers ... + // + + // + 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( + XOnTradeHandlerResult &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) + { + // + LogMessage("Failed to Load OnTrade Context History ..."); + + // + 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(); + + // + // load history ... + bool selected = HistorySelect(mStartDate, mEndDate); + if (!selected) + { + // + LogMessage("Failed to Load OnTrade Context History ..."); + + // + return; + } + + // + // get the current value ... + mOrdersCount = OrdersTotal(); + mPositionsCount = PositionsTotal(); + mDealsCount = HistoryDealsTotal(); + mHistoryOrdersCount = HistoryOrdersTotal(); + + // + mScanStarted = true; + } + + // + // END OnTrade Handlers ... + // + + // + // START Signal Private ... + // + + // + // Add Or Update Signal ... + void AddOrUpdateSignalInfo( + XSignal &signal // Specified Signal + ) + { + // + bool isExists = mSignalManager.IsExists(signal); + if (isExists) + { + mSignalManager.Remove(signal.ticket); + } + + // + bool isAddOrUpdated = mSignalManager.AddOrUpdate(signal); + if (isAddOrUpdated) + { + // + color longColor = clrAqua; + color shortColor = clrFuchsia; + + // + DrawSignalShape( + signal, + longColor, + shortColor); + } + } + + // + // Retrieve Signal String From Chart Event ... + XSignal RetrieveSignal( + ulong ticket // Specify Position Ticket + ) + { + // + XSignal result = {}; + + // + if (ticket <= 0) + { + return result; + } + + // + result = mSignalManager.Get(ticket); + + // + return result; + } + void RetrieveSignal( + XSignal &signal // Specified Signal + ) + { + + // + XSignal tSignal = mSignalManager.Get(signal.ticket); + + // + // Fill signal by tSignal Data ... + // since tese properties may change in signal manipulation times ... + signal.tp = tSignal.tp; + signal.sl = tSignal.sl; + signal.riskFreeStep = tSignal.riskFreeStep; + signal.riskFreeRate = tSignal.riskFreeRate; + } + + // + // Convert Position to Signal by Index ... + XSignal PositionToSignal(int index) + { + // + XSignal result = {}; + + // + if (!mPositionInfo.SelectByIndex(index)) + { + return result; + } + + // + ulong ticket = mPositionInfo.Ticket(); + result = PositionToSignal(ticket); + + // + return result; + } + + // + // Position To Signal by Ticket ... + XSignal PositionToSignal(ulong ticket) + { + // + XSignal result = {}; + + // + if (!mPositionInfo.SelectByTicket(ticket)) + { + return result; + } + + // + bool isExists = mSignalManager.IsExists(ticket); + if (isExists) + { + result = RetrieveSignal(ticket); + } + + // + // Ticket ... + result.ticket = mPositionInfo.Ticket(); + + // + // ID ... + result.id = mPositionInfo.Identifier(); + + // + // Symbol ... + result.symbol = mPositionInfo.Symbol(); + + // + // Type ... + ENUM_POSITION_TYPE pType = (ENUM_POSITION_TYPE)mPositionInfo.PositionType(); + ENUM_X_SIGNAL_TYPE type = pType == POSITION_TYPE_BUY ? X_SIGNAL_LONG : X_SIGNAL_SHORT; + result.type = type; + + // + // MagicNumber ... + result.magicNumber = mPositionInfo.Magic(); + + // + // Entry/Open Price ... + result.entry = mPositionInfo.PriceOpen(); + + // + // Take Profit ... + result.tp = result.tp <= 0 && mPositionInfo.TakeProfit() > 0 + ? mPositionInfo.TakeProfit() + : result.tp; + + // + // Stop Loss ... + result.sl = result.sl <= 0 && mPositionInfo.StopLoss() > 0 + ? mPositionInfo.StopLoss() + : result.sl; + + // + // Profit ... + result.profit = mPositionInfo.Profit(); + + // + // Time ... + result.time = mPositionInfo.Time(); + + // + // Volume ... + result.volume = mPositionInfo.Volume(); + + // + // Comment ... + result.comment = mPositionInfo.Comment(); + + // + return result; + } + + // + // Converts a Deal to XDeal by Index ... + XDeal ToXDealByIndex(int index) + { + // + XDeal result = {}; + + // + bool isSelect = mDealInfo.SelectByIndex(index); + if (!isSelect) + { + return result; + } + + // + // Read Deal Ticket ... + ulong ticket = mDealInfo.Ticket(); + result = ToXDealByTicket(ticket); + + // + return result; + } + + // + // Converts a Deal to XDeal by Ticket ... + XDeal ToXDealByTicket(ulong ticket) + { + // + XDeal result = {}; + + // + mDealInfo.Ticket(ticket); + + // + result.time = mDealInfo.Time(); + result.swap = mDealInfo.Swap(); + result.magic = mDealInfo.Magic(); + result.order = mDealInfo.Order(); + result.entry = mDealInfo.Entry(); + result.price = mDealInfo.Price(); + result.ticket = mDealInfo.Ticket(); + result.symbol = mDealInfo.Symbol(); + result.type = mDealInfo.DealType(); + result.profit = mDealInfo.Profit(); + result.volume = mDealInfo.Volume(); + result.comment = mDealInfo.Comment(); + result.positionId = mDealInfo.PositionId(); + result.commission = mDealInfo.Commission(); + result.reason = (ENUM_DEAL_REASON)HistoryDealGetInteger( + ticket, + DEAL_REASON); + + // + return result; + } + + // + // Convert an Order to XOrder by Index ... + XOrder ToXOrderByIndex(int index) + { + // + XOrder result = {}; + + // + bool isSelect = mOrderInfo.SelectByIndex(index); + if (!isSelect) + { + return result; + } + + // + ulong ticket = mOrderInfo.Ticket(); + result = ToXOrderByTicket(ticket); + + // + return result; + } + + // + // Convert an Order to XOrder by Ticket ... + XOrder ToXOrderByTicket(ulong ticket) + { + // + XOrder result = {}; + + // + bool isSelect = mOrderInfo.Select(ticket); + if (!isSelect) + { + return result; + } + + // + result.state = mOrderInfo.State(); + result.magic = mOrderInfo.Magic(); + result.ticket = mOrderInfo.Ticket(); + result.symbol = mOrderInfo.Symbol(); + result.type = mOrderInfo.OrderType(); + result.comment = mOrderInfo.Comment(); + result.stopLoss = mOrderInfo.StopLoss(); + result.typeTime = mOrderInfo.TypeTime(); + result.timeDone = mOrderInfo.TimeDone(); + result.timeSetup = mOrderInfo.TimeSetup(); + result.positionId = mOrderInfo.PositionId(); + result.priceOpen = mOrderInfo.PriceOpen(); + result.takeProfit = mOrderInfo.TakeProfit(); + result.typeFilling = mOrderInfo.TypeFilling(); + result.priceCurrent = mOrderInfo.PriceCurrent(); + result.volumeInitial = mOrderInfo.VolumeInitial(); + result.volumeCurrent = mOrderInfo.VolumeCurrent(); + result.timeExpiration = mOrderInfo.TimeExpiration(); + result.priceStopLimit = mOrderInfo.PriceStopLimit(); + result.reason = (ENUM_ORDER_REASON)HistoryOrderGetInteger( + ticket, + ORDER_REASON); + + // + return result; + } + // + // END Signal Private ... + // +}; + +// +// a Class For Guard Account ... +class XCGuard : public XCBase +{ + // + // Public ... +public: + // + // Constructor ... + XCGuard( + int oldAge, // Age for Old Trades + ENUM_X_GUARD_ACTIONS oldGuardAction, // Guard Action for Too Old State + double criticalFactor, // Critical DrawDown Factor based On Balance + ENUM_X_GUARD_ACTIONS criticalAction, // Guard Action for Critical State + double maxFactor, // Max DrawDown Factor based on Balance + ENUM_X_GUARD_ACTIONS maxAction, // Guard Action for Max State + int GuardStopoutFiredAfterTouches, // Guard Stopout if Max State touched + ENUM_X_GUARD_SUPPORT_METHODS supportMethod // How to Support Signals + ) + { + // + mSupportPrefix = "SPT"; + mDirectional = "SPD"; + mInDirectional = "SPIND"; + + // + mOldAge = oldAge; + mOldGuardAction = oldGuardAction; + + // + mMaxFactor = maxFactor; + mMaxAction = maxAction; + mCriticalFactor = criticalFactor; + mCriticalAction = criticalAction; + mGuardStopoutFiredAfterTouches = GuardStopoutFiredAfterTouches; + + // + mSupportMethod = supportMethod; + + // + mAccountInfo = new XCAccountInfo(); + + // + double deposit = mAccountInfo.GetInitialBalance(); + + // + if ( + maxFactor > 0 && + maxFactor < 1) + { + mMaxValue = maxFactor * deposit; + } + + // + if ( + criticalFactor > 0 && + criticalFactor < 1) + { + mCriticalValue = criticalFactor * deposit; + } + + // + Reset(); + ResetMaxDrawDownTouches(); + } + + // + // Deconstructor ... + ~XCGuard() {} + + // + // Reset List ... + void Reset() + { + // + CleanBuffer(mGuardedSignals); + CleanBuffer(mSupportedSignals); + } + + // + // Reset Consecutive Max DrawDown Touches ... + void ResetMaxDrawDownTouches() + { + mOccuredconsecutiveMaxDraDownTouches = 0; + } + + // + // Calculate and Retrieve Critical DrawDown Value ... + double GetCriticalValue() + { + // + double result = mCriticalValue; + if (mCriticalFactor <= 0) + { + return result; + } + + // + double deposit = mAccountInfo.GetInitialBalance(); + double balance = mAccountInfo.GetBalance(); + + // + if (balance > deposit) + { + // + double balanceBasedCriticalDrawDown = mCriticalFactor * balance; + + // + result = MathMax( + mCriticalValue, + balanceBasedCriticalDrawDown); + } + + // + return result; + } + + // + // Calculate and Retrieve Max Allowed DrawDown Value ... + double GetMaxValue() + { + // + double result = mMaxValue; + if (mMaxValue <= 0) + { + return result; + } + + // + double deposit = mAccountInfo.GetInitialBalance(); + double balance = mAccountInfo.GetBalance(); + + // + if (balance > deposit) + { + // + double balanceBasedMaxAllwedDrawDown = mMaxFactor * balance; + + // + result = MathMax( + mMaxValue, + balanceBasedMaxAllwedDrawDown); + } + + // + return result; + } + + // + // Guard Account Protection ... + bool Guard( + XGuardHandlerResult &guardResult, // Hold's Message + string &message, // Hold's Message + XCTrade &trader, // Specified Trader + ENUM_TIMEFRAMES period = NULL // Specified Time Frame for Detecting Signal Ages + ) + { + // + message = ""; + + // + // Clean Result of Guard ... + CleanBuffer(guardResult.olds); + CleanBuffer(guardResult.maxes); + CleanBuffer(guardResult.criticals); + + // + bool result = false; + + // + // So Important is to Guard DrawDowns ... + result = GuardDrawDown( + guardResult, + message, + trader); + if (result) + { + return result; + } + + // + // Then we have to Guard Old Trades ... + result = GuardOlds( + guardResult, + message, + trader); + + // + return result; + } + + // + // Handle Guard Old Trades ... + bool GuardOlds( + XGuardHandlerResult &guardResult, // Hold's Message + string &message, // Hold's Message + XCTrade &trader, // Specified Trader + ENUM_TIMEFRAMES period = NULL // Specified Time Frame for Detecting Signal Ages + ) + { + // + // Cleanup Message ... + message = ""; + + // + // Clean Result of Guard ... + CleanBuffer(guardResult.olds); + + // + bool result = false; + + // + // Validate Args ... + if ( + mOldAge <= 0 || + mOldGuardAction == X_GUARD_DO_NOTHING) + { + return result; + } + + // + // Normalize Args ... + if (period == NULL) + { + period = _Period; + } + + // + // Retrieve Old Trades ... + XSignal oldSignals[]; + trader.GetOldSignals( + oldSignals, + mOldAge, + period); + int oldSignalsCount = ArraySize(oldSignals); + if (oldSignalsCount <= 0) + { + return result; + } + + // + result = DoGuardAction( + guardResult, + message, + trader, + mOldGuardAction, + X_GUARDED_OLD, // Specify Guard Reason + period // Specified Running Time Frame for Signal Age Calculations + ); + + // + return result; + } + + // + // Hnadle Guard DrawDown ... + bool GuardDrawDown( + XGuardHandlerResult &guardResult, // Hold's Message + string &message, // Hold's Message + XCTrade &trader // Specified Trader + ) + { + // + message = ""; + + // + // Clean Result of Guard ... + CleanBuffer(guardResult.maxes); + CleanBuffer(guardResult.criticals); + + // + bool result = false; + + // + // Check State for Guard ... + bool isCriticalGuardEnabled = mCriticalFactor > 0; + bool isMaxGuardEnabled = mMaxFactor > 0; + bool isGuardEnabled = + isMaxGuardEnabled; + + // + if (!isGuardEnabled) + { + return result; + } + + // + double maxValue = GetMaxValue(); + double criticalValue = GetCriticalValue(); + + // + double profitSums = trader.GetSignalsProfit(); + + // + bool isMaxReached = + profitSums < 0 && + isMaxGuardEnabled && + MathAbs(profitSums) >= maxValue; + bool isCriticalReached = + profitSums < 0 && + isCriticalGuardEnabled && + MathAbs(profitSums) >= criticalValue; + + // + if (!isMaxReached && !isCriticalReached) + { + // + // Reset Consecutive Max DrawDown Touches ... + ResetMaxDrawDownTouches(); + + // + return result; + } + + // + // Check For Critical Guard ... + if (isCriticalReached && !isMaxReached) + { + // + result = DoGuardAction( + guardResult, + message, + trader, + mCriticalAction, + X_GUARDED_CRITICAL); + } + else if (isMaxReached) + { + // + result = DoGuardAction( + guardResult, + message, + trader, + mMaxAction, + X_GUARDED_MAX); + + // + // Handle Guard StopOut Action ... + mOccuredconsecutiveMaxDraDownTouches++; + if ( + mMaxAction != X_GUARD_DO_NOTHING && + mMaxAction != X_GUARD_CLOSE_ALL && + mGuardStopoutFiredAfterTouches > 0 && + mOccuredconsecutiveMaxDraDownTouches >= mGuardStopoutFiredAfterTouches) + { + // + XSignal closed[]; + trader.CloseSignals(closed); + int closedCount = ArraySize(closed); + if (closedCount > 0) + { + // + for (int i = 0; i < closedCount; i++) + { + // + XSignal iSignal = closed[i]; + + // + AddItemToBuffer( + iSignal, + guardResult.maxes); + } + + // + message = "Guard StopOut Action Closed (" + (string)closedCount + ") Signals and Release Account ..."; + + // + guardResult.isStopOut = true; + + // + result = true; + } + } + } + + // + return result; + } + + // + // Do Signal Protections and apply Support ... + bool ProtectSignals( + XSignal &mResult[], // Hold's Result + XCTrade &trader, // Specified Trader + int numberOfItemsCheck = 30 // Number of Items to check + ) + { + // + bool result = false; + + // + CleanBuffer(mResult); + + // + // Check Supports Enabled ... + result = IsSupportEnabled(); + if (!result) + { + return result; + } + + // + // Update Supports ... + XSignal signals[]; + trader.GetSignals(signals); + int signalsCount = ArraySize(signals); + if (signalsCount > 0) + { + // + for (int i = 0; i < signalsCount; i++) + { + // + XSignal iSignal = signals[i]; + + // + bool isExists = IsSupportExists(iSignal.ticket); + if (isExists) + { + UpdateSupport(iSignal); + } + } + } + + // + // Count Supporteds ... + XProtectedSignal supporteds[]; + GetAllSupports(supporteds); + int supportedCount = ArraySize(supporteds); + result = supportedCount > 0; + if (!result) + { + return result; + } + + // + // Loop through ... + for (int i = 0; i < supportedCount; i++) + { + // + XProtectedSignal iP = supporteds[i]; + + // + bool canDoDirectional = CanDoDirectionalSupport( + trader, + iP.ticket, + numberOfItemsCheck); + bool canDoInDirectional = CanDoInDirectionalSupport( + trader, + iP.ticket, + numberOfItemsCheck); + + // + if ( + !canDoDirectional && + !canDoInDirectional) + { + continue; + } + + // + // Do Directional ... + if (canDoDirectional) + { + // + // Generate Propper Signal ... + XSignal sdSignal = GenerateDirectionalSupportSignal( + iP.ticket, + trader); + + // + ENUM_EXECUTION_SIGNAL_RESULT executionResult = trader.ExecuteSignal( + sdSignal, + true, + false); + bool isExecuted = executionResult == X_TRADER_SUCCEED_EXECUTION; + if (isExecuted) + { + // + XSignal eSignal = trader.GetSignal(sdSignal.ticket); + + // + AddItemToBuffer( + eSignal, + mResult); + } + } + // + // Do Indirectional ... + else if (canDoInDirectional) + { + // + // Generate Propper Signal ... + XSignal sindSignal = GenerateDirectionalSupportSignal( + iP.ticket, + trader); + + // + ENUM_EXECUTION_SIGNAL_RESULT executionResult = trader.ExecuteSignal( + sindSignal, + true, + false); + bool isExecuted = executionResult == X_TRADER_SUCCEED_EXECUTION; + if (isExecuted) + { + // + XSignal eSignal = trader.GetSignal(sindSignal.ticket); + + // + AddItemToBuffer( + eSignal, + mResult); + } + } + } + + // + result = ArraySize(mResult) > 0; + + // + return result; + } + + // + // Validate State ... + bool Validate() + { + // + bool result = false; + + // + result = + mMaxFactor > 0 && + (mCriticalFactor > 0 + ? mCriticalFactor < mMaxFactor + : true); + + // + return result; + } + + // + // START Guarded Signals Functions ... + // + + // + // Add new Protecte Signal ... + bool Add( + XSignal &signal // Specified Signal + ) + { + // + bool result = false; + + // + bool isExists = IsExists(signal.ticket); + if (isExists) + { + return result; + } + + // + XProtectedSignal item; + + // + datetime time = TimeCurrent(); + + // + item.ticket = signal.ticket; + + // + AddItemToBuffer( + time, + item.time); + + // + AddItemToBuffer( + signal.profit, + item.profit); + + // + AddItemToBuffer( + item, + mGuardedSignals); + + // + return result; + } + + // + // Get All ... + void GetAll( + XProtectedSignal &result[] // Hold's Result + ) + { + // + CopyBuffer( + mGuardedSignals, + result); + } + + // + // Get ... + XProtectedSignal Get( + ulong ticket // Specified Signal Ticket + ) + { + // + XProtectedSignal result; + + // + bool isExists = IsExists(ticket); + if (!isExists) + { + return result; + } + + // + int protectedCounts = ArraySize(mGuardedSignals); + if (protectedCounts <= 0) + { + return result; + } + + // + for (int i = 0; i < protectedCounts; i++) + { + // + XProtectedSignal iProtected = mGuardedSignals[i]; + + // + if (iProtected.ticket == ticket) + { + // + result = iProtected; + break; + } + } + + // + return result; + } + + // + // Remove ... + bool Remove( + ulong ticket // Specified Signal Ticket + ) + { + // + bool result = false; + + // + result = IsExists(ticket); + if (!result) + { + return result; + } + + // + int protectedCounts = ArraySize(mGuardedSignals); + result = protectedCounts > 0; + if (!result) + { + return result; + } + + // + XProtectedSignal cleared[]; + for (int i = 0; i < protectedCounts; i++) + { + // + XProtectedSignal iProtected = mGuardedSignals[i]; + + // + if (iProtected.ticket != ticket) + { + AddItemToBuffer( + iProtected, + cleared); + } + } + + // + // Update Source by Cleared ... + CopyBuffer( + cleared, + mGuardedSignals); + + // + result = true; + + // + return result; + } + + // + // Update ... + bool Update( + ulong ticket, // Specified Signal Ticket + datetime time, // Specified Last Checked time + double profit // Specified Signal Profit + // XProtectedSignal &item // Specified which object to Update + ) + { + // + bool result = false; + + // + int protectedCounts = ArraySize(mGuardedSignals); + result = protectedCounts > 0; + if (!result) + { + return result; + } + + // + result = IsExists(ticket); + if (!result) + { + return result; + } + + // + // Retrieve Struct ... + XProtectedSignal item = Get(ticket); + AddItemToBuffer( + time, + item.time); + AddItemToBuffer( + profit, + item.profit); + + // + result = Remove(ticket); + if (!result) + { + return result; + } + + // + AddItemToBuffer( + item, + mGuardedSignals); + result = true; + + // + return result; + } + bool Update( + XProtectedSignal &item // Specified Protected Item + ) + { + // + bool result = false; + + // + datetime time; + result = GetLastItem( + time, + item.time); + if (!result) + { + return result; + } + + // + double profit; + result = GetLastItem( + profit, + item.profit); + if (!result) + { + return result; + } + + // + result = Update( + item.ticket, time, profit); + + // + return result; + } + bool Update( + XSignal &signal // Specified Signal + ) + { + // + bool result = false; + + // + ulong ticket = signal.ticket; + datetime time = TimeCurrent(); + double profit = signal.profit; + + // + result = Update( + ticket, + time, + profit); + + // + return result; + } + + // + // Add Or Update ... + bool AddOrUpdate( + XSignal &signal // Specified Signal + ) + { + // + bool result = false; + + // + bool isExists = IsExists(signal.ticket); + if (!isExists) + { + result = Add(signal); + } + else + { + result = Update(signal); + } + + // + return result; + } + + // + // Check Exists ... + bool IsExists( + ulong ticket // Specified Signal Ticket + ) + { + // + bool result = false; + + // + // Validate Args ... + if (ticket <= 0) + { + return result; + } + + // + int protectedCounts = ArraySize(mGuardedSignals); + if (protectedCounts <= 0) + { + return result; + } + + // + for (int i = 0; i < protectedCounts; i++) + { + // + XProtectedSignal iProtected = mGuardedSignals[i]; + + // + if (iProtected.ticket == ticket) + { + // + result = true; + break; + } + } + + // + return result; + } + + // + // Count Protecteds ... + int Count() + { + // + int result = 0; + + // + result = ArraySize(mGuardedSignals); + + // + return result; + } + + // + // END Guarded Signals Functions ... + // + + // + // START Supported Signals Functions ... + // + + // + // Check can Handle Support Signals or not ... + bool IsSupportEnabled() + { + // + bool result = false; + + // + result = + mSupportMethod != X_SUPPORT_DO_NOTHING; + + // + return result; + } + + // + // Retrieve List Of Supported Signals ... + void GetSupportSignals( + XSignal &result[], // Hold's Result ... + XCTrade &trader // Specified Trader class Instance ... + ) + { + // + CleanBuffer(result); + + // + XSignal signals[]; + trader.GetSignals(signals); + int signalsCount = ArraySize(signals); + if (signalsCount <= 0) + { + return; + } + + // + for (int i = -0; i < signalsCount; i++) + { + // + XSignal iSignal = signals[i]; + + // + bool isSupport = IsSupport(iSignal.comment); + if (isSupport) + { + AddItemToBuffer( + iSignal, + result); + } + } + } + + // + // Retrieve List Of Specific Signals Supported Signals ... + void GetSignalSupports( + XSignal &result[], // Hold's Result ... + XCTrade &trader, // Specified Trader class Instance ... + ulong ticket // Specified Signal Ticket ... + ) + { + // + CleanBuffer(result); + + // + // Validate Args ... + if (ticket <= 0) + { + return; + } + + // + // Check Signal Exists using Trader ... + XSignal parentSignal = trader.GetSignal(ticket); + bool isValid = + parentSignal.ticket > 0 && + parentSignal.ticket == ticket && + StringLen(parentSignal.comment) > 0; + if (!isValid) + { + return; + } + + // + XSignal supportSignals[]; + GetSupportSignals( + supportSignals, + trader); + int supportSignalsCount = ArraySize(supportSignals); + if (supportSignalsCount <= 0) + { + return; + } + + // + for (int i = 0; i < supportSignalsCount; i++) + { + // + XSignal iSignal = supportSignals[i]; + + // + bool isBelongsToParent = IsBelongsToParent( + ticket, + iSignal.comment); + if (isBelongsToParent) + { + AddItemToBuffer( + iSignal, + result); + } + } + } + + // + // Check Specific Support Conditions for Opening Directional Support ... + bool CanDoDirectionalSupport( + XCTrade &trader, // Specified Trader class Instance ... + ulong ticket, // Specified Signal Ticket ... + int numberOfItemsCheck = 30 // Number of Items to check ... + ) + { + // + bool result = false; + + // + // Check Supports Enabled ... + result = IsSupportEnabled(); + if (!result) + { + return result; + } + + // + // Check Support Method Allows Directional ... + result = + mSupportMethod == X_SUPPORT_FULL || + mSupportMethod == X_SUPPORT_IN_DRAWUP_DIRECTIONAL; + if (!result) + { + return result; + } + + // + // Validate Ticket ... + result = ticket > 0; + if (!result) + { + return result; + } + + // + // Check Supports Count ... + int supportedCount = ArraySize(mSupportedSignals); + result = supportedCount > 0; + if (!result) + { + return result; + } + + // + // Check Ticket Exists in Supports ... + result = IsSupportExists(ticket); + if (!result) + { + return result; + } + + // + // Check signal Doesn't have any Support ... + XSignal supports[]; + GetSignalSupports( + supports, + trader, + ticket); + int supportsCount = ArraySize(supports); + result = supportsCount <= 0; + if (!result) + { + return result; + } + + // + // Retrieve Support Model ... + XProtectedSignal sInfo = GetSupport(ticket); + + // + // Validate Model ... + int sTimesCount = ArraySize(sInfo.time); + int sProfitsCount = ArraySize(sInfo.profit); + result = + sInfo.ticket == ticket && + sTimesCount == sProfitsCount && + sTimesCount >= numberOfItemsCheck && + sProfitsCount >= numberOfItemsCheck; + if (!result) + { + return result; + } + + // + // Validate Signal Age ... + XSignal sSignal = trader.GetSignal(ticket); + int sSignalAge = trader.GetSignalAge(sSignal.time); + result = sSignalAge >= numberOfItemsCheck; + if (!result) + { + return result; + } + + // + // Extrat Profits ... + double lastProfits[]; + for (int i = sProfitsCount - 1; i >= (sProfitsCount - numberOfItemsCheck); i++) + { + // + double iProfit = sInfo.profit[i]; + + // + AddItemToBuffer( + iProfit, + lastProfits); + } + + // + string logMsg = ToString(lastProfits); + LogMessage("" + (string)ticket + " lastProfits: \n" + logMsg); + + // + result = false; + + // + // Now implement Business Logics ... + + // + return result; + } + + // + // Check Specific Support Conditions for Opening InDirectional Support ... + bool CanDoInDirectionalSupport( + XCTrade &trader, // Specified Trader class Instance ... + ulong ticket, // Specified Signal Ticket ... + int numberOfItemsCheck = 30 // Number of Items to check ... + ) + { + // + bool result = false; + + // + // Check Supports Enabled ... + result = IsSupportEnabled(); + if (!result) + { + return result; + } + + // + // Check Support Method Allows Directional ... + result = + mSupportMethod == X_SUPPORT_FULL || + mSupportMethod == X_SUPPORT_IN_DRAWDOWN_INDIRECTIONAL; + if (!result) + { + return result; + } + + // + // Validate Ticket ... + result = ticket > 0; + if (!result) + { + return result; + } + + // + // Check Supports Count ... + int supportedCount = ArraySize(mSupportedSignals); + result = supportedCount > 0; + if (!result) + { + return result; + } + + // + // Check Ticket Exists in Supports ... + result = IsSupportExists(ticket); + if (!result) + { + return result; + } + + // + // Check signal Doesn't have any Support ... + XSignal supports[]; + GetSignalSupports( + supports, + trader, + ticket); + int supportsCount = ArraySize(supports); + result = supportsCount <= 0; + if (!result) + { + return result; + } + + // + // Retrieve Support Model ... + XProtectedSignal sInfo = GetSupport(ticket); + + // + // Validate Model ... + int sTimesCount = ArraySize(sInfo.time); + int sProfitsCount = ArraySize(sInfo.profit); + result = + sInfo.ticket == ticket && + sTimesCount == sProfitsCount && + sTimesCount >= numberOfItemsCheck && + sProfitsCount >= numberOfItemsCheck; + if (!result) + { + return result; + } + + // + // Validate Signal Age ... + XSignal sSignal = trader.GetSignal(ticket); + int sSignalAge = trader.GetSignalAge(sSignal.time); + result = sSignalAge >= numberOfItemsCheck; + if (!result) + { + return result; + } + + // + // Extrat Profits ... + double lastProfits[]; + for (int i = sProfitsCount - 1; i >= (sProfitsCount - numberOfItemsCheck); i++) + { + // + double iProfit = sInfo.profit[i]; + + // + AddItemToBuffer( + iProfit, + lastProfits); + } + + // + string logMsg = ToString(lastProfits); + LogMessage("" + (string)ticket + " lastProfits: \n" + logMsg); + + // + result = false; + + // + // Now implement Business Logics ... + + // + return result; + } + + // + // Generate Directional Support Signal for Parent Signal ... + XSignal GenerateDirectionalSupportSignal( + ulong ticket, // Specified Parent Signal Ticket ... + XCTrade &trader // Specified Trader Class ... + ) + { + // + XSignal result = {}; + + // + // Validate Args ... + if (ticket <= 0) + { + return result; + } + + // + XSignal pSignal = trader.GetSignal(ticket); + bool isValidParent = + pSignal.ticket > 0 && + pSignal.ticket == ticket && + StringLen(pSignal.comment) > 0; + if (!isValidParent) + { + return result; + } + + // + ENUM_X_SIGNAL_TYPE type = pSignal.type; + bool isLong = IsLong(type); + + // + double entry = GetEntry( + pSignal.symbol, + type); + double exit = GetExit( + pSignal.symbol, + type); + + // + double reward = PipsToPrice( + pSignal.symbol, + 6); + double risk = PipsToPrice( + pSignal.symbol, + 1); + + // + double tp = + isLong + ? entry + reward + : entry - reward; + + // + double sl = + isLong + ? exit - risk + : exit + risk; + + // + double rfStep = 2; + double rfRate = 0.5; + + // + double volume = NormalizeVolume( + pSignal.volume / 2, + pSignal.symbol, + 2); + + // + // Generate Signal using Trader Class Instance ... + result = trader.GenerateSignal( + // + type, + tp, + sl, + volume, + rfStep, + rfRate + // + ); + + // + return result; + } + + // + // Generate InDirectional Support Signal for Parent Signal ... + XSignal GenerateInDirectionalSupportSignal( + ulong ticket, // Specified Parent Signal Ticket ... + XCTrade &trader // Specified Trader Class ... + ) + { + // + XSignal result = {}; + + // + // Validate Args ... + if (ticket <= 0) + { + return result; + } + + // + XSignal pSignal = trader.GetSignal(ticket); + bool isValidParent = + pSignal.ticket > 0 && + pSignal.ticket == ticket && + StringLen(pSignal.comment) > 0; + if (!isValidParent) + { + return result; + } + + // + ENUM_X_SIGNAL_TYPE type = trader + .GetIndirectionSignalType(pSignal.type); + bool isLong = IsLong(type); + + // + double entry = GetEntry( + pSignal.symbol, + type); + double exit = GetExit( + pSignal.symbol, + type); + + // + double reward = PipsToPrice( + pSignal.symbol, + 6); + double risk = PipsToPrice( + pSignal.symbol, + 1); + + // + double tp = + isLong + ? entry + reward + : entry - reward; + + // + double sl = + isLong + ? exit - risk + : exit + risk; + + // + double rfStep = 2; + double rfRate = 0.5; + + // + double volume = NormalizeVolume( + pSignal.volume / 2, + pSignal.symbol, + 2); + + // + // Generate Signal using Trader Class Instance ... + result = trader.GenerateSignal( + // + type, + tp, + sl, + volume, + rfStep, + rfRate + // + ); + + // + return result; + } + + // + // Generate Specific Signals Support Signal Comment ... + string GenerateSupportSignalComment( + ulong ticket, // Specified Parent Signal Ticket + ENUM_X_SIGNAL_TYPE type, // Specified Support Signal Type + bool isInDirectional = false // Specified Support Signal Direction + ) + { + // + string result = ""; + + // + if (ticket <= 0) + { + return result; + } + + // + string typeString = GetSignalType(type); + string directionStr = GenerateSupportDirection(isInDirectional); + + // + result = + mSupportPrefix + "(" + (string)ticket + ")_" + + X_SIGNAL_TYPE + "(" + typeString + ")_" + + directionStr; + + // + return result; + } + + // + // Get Support Direction String Representation ... + string GenerateSupportDirection( + bool isInDirectional = false // Specified Support Signal Direction + ) + { + // + string result = ""; + + // + result = + isInDirectional + ? mInDirectional + : mDirectional; + + // + return result; + } + + // + // Check an String Is Directional Or not ... + bool IsDirectionalSupport( + string comment // Specified Comment ... + ) + { + // + bool result = false; + + // + result = IsSupport(comment); + if (!result) + { + return result; + } + + // + int sPos = StringFind( + comment, + mDirectional); + result = sPos >= 0; + + // + return result; + } + + // + // Check an String Is In Directional Or not ... + bool IsInDirectionalSupport( + string comment // Specified Comment ... + ) + { + // + bool result = false; + + // + result = IsSupport(comment); + if (!result) + { + return result; + } + + // + int sPos = StringFind( + comment, + mInDirectional); + result = sPos >= 0; + + // + return result; + } + + // + // Check an String Is Support or not ... + bool IsSupport( + string comment // Specified Comment ... + ) + { + // + bool result = false; + + // + int sPos = StringFind( + comment, + mSupportPrefix); + result = sPos >= 0; + + // + return result; + } + + // + // Extract Parent of Support Signal Ticket from a comment ... + ulong ExtractParentTicket( + string comment // Specified Comment ... + ) + { + // + ulong result = 0; + + // + bool isSupport = IsSupport(comment); + if (!isSupport) + { + return result; + } + + // + // TICKET ... + string ticketStr = ExtractString( + comment, + mSupportPrefix + "(", + ")"); + if (StringLen(ticketStr) > 0) + { + result = (ulong)ticketStr; + } + + // + return result; + } + + // + // Check a Comment belongs to Support Signal or not ... + bool IsBelongsToParent( + ulong ticket, // Specified Parent Signal Ticket + string comment // Specified Support Signal Comment + ) + { + // + bool result = false; + + // + // Validate Arg ... + if (ticket <= 0) + { + return result; + } + + // + result = IsSupport(comment); + if (!result) + { + return result; + } + + // + ulong spTicket = ExtractParentTicket(comment); + result = spTicket == ticket; + + // + return result; + } + + // + // Add new Protecte Signal ... + bool AddSupport( + XSignal &signal // Specified Signal + ) + { + // + bool result = false; + + // + bool isExists = IsSupportExists(signal.ticket); + if (isExists) + { + return result; + } + + // + XProtectedSignal item; + + // + datetime time = TimeCurrent(); + + // + item.ticket = signal.ticket; + + // + AddItemToBuffer( + time, + item.time); + + // + AddItemToBuffer( + signal.profit, + item.profit); + + // + AddItemToBuffer( + item, + mSupportedSignals); + + // + return result; + } + + // + // Get All ... + void GetAllSupports( + XProtectedSignal &result[] // Hold's Result + ) + { + // + CopyBuffer( + mSupportedSignals, + result); + } + + // + // Get ... + XProtectedSignal GetSupport( + ulong ticket // Specified Signal Ticket + ) + { + // + XProtectedSignal result; + + // + bool isExists = IsSupportExists(ticket); + if (!isExists) + { + return result; + } + + // + int protectedCounts = ArraySize(mSupportedSignals); + if (protectedCounts <= 0) + { + return result; + } + + // + for (int i = 0; i < protectedCounts; i++) + { + // + XProtectedSignal iProtected = mSupportedSignals[i]; + + // + if (iProtected.ticket == ticket) + { + // + result = iProtected; + break; + } + } + + // + return result; + } + + // + // Remove ... + bool RemoveSupport( + ulong ticket // Specified Signal Ticket + ) + { + // + bool result = false; + + // + result = IsSupportExists(ticket); + if (!result) + { + return result; + } + + // + int protectedCounts = ArraySize(mSupportedSignals); + result = protectedCounts > 0; + if (!result) + { + return result; + } + + // + XProtectedSignal cleared[]; + for (int i = 0; i < protectedCounts; i++) + { + // + XProtectedSignal iProtected = mSupportedSignals[i]; + + // + if (iProtected.ticket != ticket) + { + AddItemToBuffer( + iProtected, + cleared); + } + } + + // + // Update Source by Cleared ... + CopyBuffer( + cleared, + mSupportedSignals); + + // + result = true; + + // + return result; + } + + // + // Update ... + bool UpdateSupport( + ulong ticket, // Specified Signal Ticket + datetime time, // Specified Last Checked time + double profit // Specified Signal Profit + ) + { + // + bool result = false; + + // + int protectedCounts = ArraySize(mSupportedSignals); + result = protectedCounts > 0; + if (!result) + { + return result; + } + + // + result = IsSupportExists(ticket); + if (!result) + { + return result; + } + + // + // Retrieve Struct ... + XProtectedSignal item = GetSupport(ticket); + AddItemToBuffer( + time, + item.time); + AddItemToBuffer( + profit, + item.profit); + + // + result = RemoveSupport(ticket); + if (!result) + { + return result; + } + + // + AddItemToBuffer( + item, + mSupportedSignals); + result = true; + + // + return result; + } + bool UpdateSupport( + XProtectedSignal &item // Specified Protected Item + ) + { + // + bool result = false; + + // + datetime time; + result = GetLastItem( + time, + item.time); + if (!result) + { + return result; + } + + // + double profit; + result = GetLastItem( + profit, + item.profit); + if (!result) + { + return result; + } + + // + result = UpdateSupport( + item.ticket, time, profit); + + // + return result; + } + bool UpdateSupport( + XSignal &signal // Specified Signal + ) + { + // + bool result = false; + + // + ulong ticket = signal.ticket; + datetime time = TimeCurrent(); + double profit = signal.profit; + + // + result = UpdateSupport( + ticket, + time, + profit); + + // + return result; + } + + // + // Add Or Update ... + bool AddOrUpdateSupport( + XSignal &signal // Specified Signal + ) + { + // + bool result = false; + + // + bool isExists = IsSupportExists(signal.ticket); + if (!isExists) + { + result = Add(signal); + } + else + { + result = Update(signal); + } + + // + return result; + } + + // + // Check Exists ... + bool IsSupportExists( + ulong ticket // Specified Signal Ticket + ) + { + // + bool result = false; + + // + // Validate Args ... + if (ticket <= 0) + { + return result; + } + + // + int protectedCounts = ArraySize(mSupportedSignals); + if (protectedCounts <= 0) + { + return result; + } + + // + for (int i = 0; i < protectedCounts; i++) + { + // + XProtectedSignal iProtected = mSupportedSignals[i]; + + // + if (iProtected.ticket == ticket) + { + // + result = true; + break; + } + } + + // + return result; + } + + // + // Count Protecteds ... + int CountSupports() + { + // + int result = 0; + + // + result = ArraySize(mSupportedSignals); + + // + return result; + } + + // + // END Suppoprted Signals Functions ... + // + + // + // START Getter/Setter(s) ... + // + + // + int GetOldAge() + { + return mOldAge; + } + + // + bool SetOldAge(int value) + { + // + bool result = false; + + // + result = + value > 0 && + mOldAge != value; + if (!result) + { + return result; + } + + // + mOldAge = value; + + // + return result; + } + + // + ENUM_X_GUARD_ACTIONS GetOldGuardAction() + { + return mOldGuardAction; + } + + // + bool SetOldGuardAction(ENUM_X_GUARD_ACTIONS value) + { + // + bool result = false; + + // + result = value != mOldGuardAction; + if (!result) + { + return result; + } + + // + mOldGuardAction = value; + + // + return result; + } + + // + double GetCriticalFactor() + { + return mCriticalFactor; + } + + // + bool SetCriticalFactor(bool value) + { + // + bool result = false; + + // + result = + value > 0 && + value < 1 && + mCriticalFactor != value; + if (!result) + { + return result; + } + + // + mCriticalFactor = value; + + // + double deposit = mAccountInfo.GetInitialBalance(); + mCriticalValue = deposit * value; + + // + return result; + } + + // + ENUM_X_GUARD_ACTIONS GetCriticalAction() + { + return mCriticalAction; + } + + // + bool SetCriticalAction(ENUM_X_GUARD_ACTIONS value) + { + // + bool result = false; + + // + result = + value != mCriticalAction; + if (!result) + { + return result; + } + + // + mCriticalAction = value; + + // + return result; + } + + // + double GetMaxFactor() + { + return mMaxFactor; + } + + // + bool SetMaxFactor(bool value) + { + // + bool result = false; + + // + result = + value > 0 && + value < 1 && + mMaxFactor != value; + if (!result) + { + return result; + } + + // + mMaxFactor = value; + + // + double deposit = mAccountInfo.GetInitialBalance(); + mMaxValue = deposit * value; + + // + return result; + } + + // + ENUM_X_GUARD_ACTIONS GetMaxAction() + { + return mMaxAction; + } + + // + bool SetMaxAction(ENUM_X_GUARD_ACTIONS value) + { + // + bool result = false; + + // + result = + value != mMaxAction; + if (!result) + { + return result; + } + + // + mMaxAction = value; + + // + return result; + } + + // + ENUM_X_GUARD_SUPPORT_METHODS GetSupportMethod() + { + return mSupportMethod; + } + + // + bool SetSupportMethod(ENUM_X_GUARD_SUPPORT_METHODS value) + { + // + bool result = false; + + // + result = + value != mSupportMethod; + if (!result) + { + return result; + } + + // + mSupportMethod = value; + + // + return result; + } + + // + // END Getter/Setter(s) ... + // + + // + // Generate Signal Guard Attacked Message ... + string GenerateGuardedSignalComment( + XSignal &signal, // Specified Signal + ENUM_X_GUARD_REASONS reason // Specified Guard Reason + ) + { + // + string result = ""; + + // + string reasonMessage = + ( + // + reason == X_GUARDED_OLD + ? "Because of Old Issue" + : reason == X_GUARDED_CRITICAL + ? "Because Of Crtical Drawdown Isuue" + : reason == X_GUARDED_MAX + ? "Because of Max Drawdown Issue" + : "" + // + ) + + " On Profit: " + (string)signal.profit; + + // + result += "Guard Attacked (" + (string)signal.ticket + "), " + reasonMessage + " ..."; + + // + return result; + } + + // + // Protected ... +protected: + // + // Private ... +private: + // + string mSupportPrefix; + string mDirectional; + string mInDirectional; + + // + XProtectedSignal mGuardedSignals[]; + XProtectedSignal mSupportedSignals[]; + + // + int mOldAge; + ENUM_X_GUARD_ACTIONS mOldGuardAction; + + // + // Critical DrawDown Factor based On Balance ... + double mCriticalFactor; + double mCriticalValue; + + // + // Guard Action for Critical State ... + ENUM_X_GUARD_ACTIONS mCriticalAction; + + // + // Max DrawDown Factor based on Balance ... + double mMaxFactor; + double mMaxValue; + // + // Guard Stopout if Max State touched ... + int mOccuredconsecutiveMaxDraDownTouches; + int mGuardStopoutFiredAfterTouches; + + // + // Guard Action for Max State ... + ENUM_X_GUARD_ACTIONS mMaxAction; + + // + // How to Support Signals ... + ENUM_X_GUARD_SUPPORT_METHODS mSupportMethod; + + // + // Account Info Instance ... + XCAccountInfo mAccountInfo; + + // + // Get Volume Multiplier for Specified Guard Action ... + double GetGuardActionVolumeMultiplier( + ENUM_X_GUARD_ACTIONS action = X_GUARD_DO_NOTHING // Specified Action + ) + { + // + // Partial Close Max In Drawdown Trade ... + double result = 0.0; + if (action == X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_1) + { + result = 0.01; + } + else if (action == X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_2) + { + result = 0.02; + } + else if (action == X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_3) + { + result = 0.03; + } + else if (action == X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_5) + { + result = 0.05; + } + else if (action == X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_10) + { + result = 0.10; + } + else if (action == X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_15) + { + result = 0.15; + } + else if (action == X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_20) + { + result = 0.20; + } + else if (action == X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_25) + { + result = 0.25; + } + else if (action == X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_30) + { + result = 0.30; + } + else if (action == X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_40) + { + result = 0.40; + } + else if (action == X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_50) + { + result = 0.50; + } + else if (action == X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_60) + { + result = 0.60; + } + else if (action == X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_70) + { + result = 0.70; + } + else if (action == X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_75) + { + result = 0.75; + } + + // + return result; + } + + // + // Do Specified Guard Action ... + bool DoGuardAction( + XGuardHandlerResult &guardResult, // Hold's Result ... + string &message, // Hold's Message ... + XCTrade &trader, // Specified Trader Class ... + ENUM_X_GUARD_ACTIONS action, // Specified Which Action to Do ... + ENUM_X_GUARD_REASONS reason, // Specified Guard Reason ... + ENUM_TIMEFRAMES period = NULL // Specified Time Frame for Detecting Signal Ages ... + ) + { + // + bool result = false; + + // + message = ""; + + // + string reasonString = + reason == X_GUARDED_OLD + ? "Because of Age Issue" + : "Because of DD " + ( + // + reason == X_GUARDED_CRITICAL ? "Critical" : "Max" + // + ) + + " Issue"; + + // + // Validate Args ... + if (action == X_GUARD_DO_NOTHING) + { + // + message = "Max Allowed Drawdown Reached, but nothing Happens ..."; + + // + return result; + } + + // + // Normalize Period ... + if (period == NULL) + { + period = _Period; + } + + // + // Close All Signals ... + XSignal closed[]; + XSignal maxInDDSignal; + + // + // Handle Perform Guard Action ... + switch (action) + { + // + // Close All ... + case X_GUARD_CLOSE_ALL: + { + // + trader.CloseSignals(closed); + int closedCount = ArraySize(closed); + result = closedCount > 0; + if (!result) + { + break; + } + + // + message = "Closed (" + (string)closedCount + ") Trades by Guard, " + reasonString + " ..."; + } + break; + + // + case X_GUARD_CLOSE_MAX_IN_DD: + case X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_1: + case X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_2: + case X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_3: + case X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_5: + case X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_10: + case X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_15: + case X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_20: + case X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_25: + case X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_30: + case X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_40: + case X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_50: + case X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_60: + case X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_70: + case X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_75: + { + // + // Retrieve Max In Drawdown Trade ... + maxInDDSignal = trader.GetMaxInDrawdownSignal(); + bool isValid = IsValid(maxInDDSignal, trader.GetMagicNumber()) && maxInDDSignal.ticket > 0; + if (!isValid) + { + break; + } + + // + // Close Max In Drawdown Trade ... + if (action == X_GUARD_CLOSE_MAX_IN_DD) + { + // + string comment = "Signal (" + (string)maxInDDSignal.ticket + ") Closed by Guard ..."; + result = trader.Close( + maxInDDSignal.ticket, + comment); + if (result) + { + message = comment; + } + + // + break; + } + + // + int signalAge = 0; + bool canGuard = true; + bool isGuardedBefore = false; + + // + // Do Some Additional Verifications if Guard for Olds Trades ... + if (reason == X_GUARDED_OLD) + { + // + // Retrieve Signal Age ... + signalAge = trader.GetSignalAge( + maxInDDSignal, + period); + + // + // Check Guarded Before Or Not ... + isGuardedBefore = IsExists(maxInDDSignal.ticket); + if (isGuardedBefore) + { + // + // Now We Have to Check Signal Age growse required times to apply Guard Action again ... + // First Calculate Guard Grow Step ... + int ageGrowStep = mOldAge / 10; + + // + XProtectedSignal guardItem = Get(maxInDDSignal.ticket); + datetime lastGuardTime = 0; + if (GetLastItem(lastGuardTime, guardItem.time)) + { + // + int lastGuardIndex = iBarShift( + maxInDDSignal.symbol, + period, + lastGuardTime); + + // + canGuard = + MathAbs(lastGuardIndex) >= ageGrowStep; + } + } + else + { + // + // Check Signal age ... + canGuard = signalAge >= mOldAge; + } + } + + // + // Prevent Moving Forward ... + if (!canGuard) + { + // + result = false; + break; + } + + // + // Partial Close Max In Drawdown Trade ... + double volumeRate = GetGuardActionVolumeMultiplier(action); + + // + double volume = NormalizeVolume( + maxInDDSignal.volume * volumeRate, + maxInDDSignal.symbol); + + // + string commentPrefix = "Signal (" + (string)maxInDDSignal.ticket + ") Partial Closed (" + (string)volumeRate + ") by Guard"; + string comment = commentPrefix + " ..."; + + // + result = trader.ClosePartial( + maxInDDSignal.ticket, + volume, + comment); + if (result) + { + // + reasonString = + reasonString + + (reason == X_GUARDED_OLD + ? " (" + (string)signalAge + ")" + : " (" + (string)maxInDDSignal.profit + ")"); + + // + // Update Guarded Signals ... + if (isGuardedBefore) + { + // + XSignal tSignal = trader.GetSignal(maxInDDSignal.ticket); + + // + if (tSignal.ticket > 0 && tSignal.volume > 0) + { + // + // Update In Guardeds ... + Update(tSignal); + } + else + { + // + // Remove From Guardeds ... + Remove(tSignal.ticket); + } + } + else if (reason == X_GUARDED_OLD) + { + // + // Added to Guardeds ... + Add(maxInDDSignal); + } + + // + message = commentPrefix + reasonString + " ..."; + } + } + break; + + // + // Nothing ... + // Default ... + default: + message = "Max Allowed Drawdown Reached ..."; + break; + } + + // + result = StringLen(message) > 0; + if (!result) + { + return result; + } + + // + if (result) + { + // + if (reason == X_GUARDED_OLD) + { + // + int closedCount = ArraySize(closed); + if (closedCount > 0) + { + // + for (int i = 0; i < closedCount; i++) + { + AddItemToBuffer( + closed[i], + guardResult.olds); + } + } + + // + if (maxInDDSignal.ticket > 0) + { + AddItemToBuffer( + maxInDDSignal, + guardResult.olds); + } + } + else if (reason == X_GUARDED_CRITICAL) + { + // + int closedCount = ArraySize(closed); + if (closedCount > 0) + { + // + for (int i = 0; i < closedCount; i++) + { + AddItemToBuffer( + closed[i], + guardResult.criticals); + } + } + + // + if (maxInDDSignal.ticket > 0) + { + AddItemToBuffer( + maxInDDSignal, + guardResult.criticals); + } + } + else if (reason == X_GUARDED_MAX) + { + // + int closedCount = ArraySize(closed); + if (closedCount > 0) + { + // + for (int i = 0; i < closedCount; i++) + { + AddItemToBuffer( + closed[i], + guardResult.maxes); + } + } + + // + if (maxInDDSignal.ticket > 0) + { + AddItemToBuffer( + maxInDDSignal, + guardResult.maxes); + } + } + } + + // + return result; + } +}; + +// +// END Global Definitions: Variables, Properties and etc ... +// diff --git a/BKPS/OLD/XEU5/Classes/x-saherelm.nn.lib.mq5 b/BKPS/OLD/XEU5/Classes/x-saherelm.nn.lib.mq5 new file mode 100644 index 0000000..8fa40f5 --- /dev/null +++ b/BKPS/OLD/XEU5/Classes/x-saherelm.nn.lib.mq5 @@ -0,0 +1,258 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 NN Class Library +// ---------------------------------------- +// Name: XNNClass +// Description: provides all classes for implementing +// Neural Network ... +// +// +// 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 Global Definitions: Variables, Properties and etc ... +// +class XCNNBase +{ + // + // Public Definitions ... +public: + // + // Constructor ... + void XCNNBase( + int nodes = 10, // Number of Input Nodes + double starterWeight = 0.5, // start weight for each input + double coEfficient = 0.1, // COEfficient Multiplier + double upperRange = 1, // Upper Normal Range Value + double lowerRange = -1, // Lower Normal Range Value + double learningRates = 0.1 // Back Propagation Learning Rate + ) { + // + mNodes = nodes; + mUpperRange = upperRange; + mLowerRange = lowerRange; + mCoEfficient = coEfficient; + mLearningRates = learningRates; + mStarterWeight = starterWeight; + + // + ReConstructWeights(); + } + + // + // Deconstructor ... + void ~XCNNBase() {} + + // + // Protected Definitions ... + void NormalizeInputs(double &inputs[], double &result[]) + { + // + ArrayFree(result); + ArrayResize(result, 1); + + // + // Validate inputs ... + if (ArraySize(inputs) != mNodes) + { + return; + } + + // + // Prepare Result ... + ArrayResize(result, mNodes); + + // + // Calculating min and max range value ... + double minRangeValue = inputs[ArrayMinimum(inputs)]; + double maxRangeValue = inputs[ArrayMaximum(inputs)]; + + // + // Loop through Inputs nd Normalize them ... + for (int i = 0; i < mNodes; i++) + { + // + double normalValue = (((inputs[i] - minRangeValue) * (mUpperRange - mLowerRange)) / (maxRangeValue - minRangeValue)) + mLowerRange; + result[i] = normalValue; + } + } + + // + // Hyperbolic Tangent Activation Function ... + double TanHActivationFunction(double weightedInputs) + { + // + double result = (exp(weightedInputs) - exp(-weightedInputs)) / (exp(weightedInputs) + exp(-weightedInputs)); + return result; + } + + // + // Calculate Weighted Inputs ... + double CalculateWeightedInputs( + double &inputs[], + bool applyCOEfficient = true) + { + // + double result = 0; + + // + // Validate Inputs ... + if (ArraySize(inputs) != mNodes) + { + // + result = -1; + return result; + } + + // + for (int i = 0; i < mNodes; i++) + { + result += inputs[i] * mWeights[i]; + } + + // + // Multiply if required ... + if (applyCOEfficient) + { + result *= mCoEfficient; + } + + // + return result; + } + + // + // Calculate Hidden Layers ... + virtual double CalculateHiddenLayer(double &inputs[]) + { + // + // this is Default Activation Function which used ... + // you can override this by writing your own ... + double totalWeightedInputs = CalculateWeightedInputs(inputs); + double result = TanHActivationFunction(totalWeightedInputs); + + // + return result; + } + + // + // Calculate Output Layers ... + double CalculateOutputLayer(double &inputs[]) + { + // + double result = -1; + + // + // Validate Inputs ... + if (ArraySize(inputs) != mNodes) { + return result; + } + + // + double normalizedInputs[]; + NormalizeInputs(inputs, normalizedInputs); + if (ArraySize(normalizedInputs) != mNodes) { + return result; + } + + // + double hiddenLayerResult = CalculateHiddenLayer(normalizedInputs); + + // + result = 1 * hiddenLayerResult; + + // + return result; + } + + // + // Basck Propaggation Learning ... + void BackPropagation( + double &inputs[], + double &outputs, + double targetOutput + ) { + // + // Validate Inputs ... + if (ArraySize(inputs) != mNodes) { + return; + } + + // + double normalizedInputs[]; + NormalizeInputs(inputs, normalizedInputs); + if (ArraySize(normalizedInputs) != mNodes) { + return; + } + + // + double error = targetOutput - outputs; + double derivative = 1 - MathPow(outputs, 2); + + // + for (int i = 0; i < mNodes; i++) { + // + double gradient = error * derivative * inputs[i]; + mWeights[i] = mLearningRates * gradient; + } + } + +protected: + // + // Private Definitions ... +private: + // + // Number of Input Nodes ... + int mNodes; + + // + // Specify Upper range of Normal Values ... + double mUpperRange; + + // + // Specify Lower range of Normal Values ... + double mLowerRange; + + // + // Starter Weight for each input node ... + double mStarterWeight; + + // + // double Input Node Weights ... + double mWeights[]; + + // + // CoEfficient is a multiplyer for weighted inputs ... + double mCoEfficient; + + // + // Back Propagation Learning Rates ... + double mLearningRates; + + // + // ReConstruct Weights ... + void ReConstructWeights() { + // + ArrayFree(mWeights); + ArrayResize(mWeights, mNodes); + + // + for (int i = 0; i< mNodes; i++) { + mWeights[i] = mStarterWeight; + } + } +} +// +// END Global Definitions: Variables, Properties and etc ... +// diff --git a/BKPS/OLD/XEU5/Classes/x-saherelm.provider.lib.mq5 b/BKPS/OLD/XEU5/Classes/x-saherelm.provider.lib.mq5 new file mode 100644 index 0000000..1dbdcd3 --- /dev/null +++ b/BKPS/OLD/XEU5/Classes/x-saherelm.provider.lib.mq5 @@ -0,0 +1,4430 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 Class Library +// -------------------------------------- +// Name: XProvider +// Description: provides all indicators based provider classes for use ... +// +// +// Maintainer: +// ------------ +// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) +// +////////////////////////////////////////////////////// +// +// Global Properties ... +#property library +#property copyright "Copyright 2023, SaherElm IT Center" +#property link "https://www.saherelm.ir" +#property version "1.00" +#property strict + +// +// START Define Enums ... +// + +// +enum ENUM_X_SIGNAL_PROVIDERS +{ + // + // XSP Expert Support Mechanism ... + XSP, + // + // XTD ... + XTD, + // + // XTAM ... + XTAM, + // + // XSI ... + XSI, + // + // XTSFI ... + XTSFI, + // + // XOBDLH ... + XOBDLH, + // + // XCHMACC ... + XCHMACC, + // + // XCHMACMN ... + XCHMAMN, + // + // XCHMACMX ... + XCHMAMX, +}; + +// +// Represent Market Conditions ... +struct XMarketConditions +{ + // + // XTM ... + bool isXTMPeak; + bool isXTMVale; + bool isXTMBullish; + bool isXTMBearish; + bool isXTMNeutural; + bool isXTMEndBullish; + bool isXTMEndBearish; + bool isXTMStartBullish; + bool isXTMStartBearish; + bool isXTMEndBullishByNeutural; + bool isXTMEndBearishByNeutural; + bool isXTMStartBullishAfterNeutural; + bool isXTMStartBearishAfterNeutural; + + // + // XAMA ... + bool isXAMAPeak; + bool isXAMAVale; + bool isXAMABullish; + bool isXAMABearish; + bool isXAMANeutural; + bool isXAMAEndBullish; + bool isXAMAEndBearish; + bool isXAMAStartBullish; + bool isXAMAStartBearish; + bool isXAMAEndBullishByNeutural; + bool isXAMAEndBearishByNeutural; + bool isXAMAStartBullishAfterNeutural; + bool isXAMAStartBearishAfterNeutural; + + // + // XLH ... + bool isXLHHHIncreased; + bool isXLHHHDecreased; + bool isXLHLLIncreased; + bool isXLHLLDecreased; + bool isXLHLowAttachedLL; + bool isXLHHighAttachedHH; + bool isXLHHHSameInLength; + bool isXLHLLSameInLength; + bool isXLHPriceOverSignal; + bool isXLHPriceUnderSignal; + bool isXLHPriceInSignalRange; + bool isXLHPriceCrossedOverSignal; + bool isXLHPriceCrossedUnderSignal; + + // + // XTD ... + bool isXTDSignalPeak; + bool isXTDSignalVale; + bool isXTDBullishPeak; + bool isXTDBullishVale; + bool isXTDBearishPeak; + bool isXTDBearishVale; + bool isXTDBullOverBear; + bool isXTDBullUnderBear; + bool isXTDSignalOverBear; + bool isXTDSignalUnderBear; + bool isXTDBullCrossedOverBear; + bool isXTDBullCrossedUnderBear; + bool isXTDSignalCrossedOverBear; + bool isXTDSignalCrossedUnderBear; + + // + // XFI ... + bool isXFIPeak; + bool isXFIVale; + bool isXFICrossedOverZero; + bool isXFIOverZero; + bool isXFICrossedUnderZero; + bool isXFIUnderZero; + + // + // XTS ... + bool isXTSAllSame; + bool isXTSCurrentMin; + bool isXTSCurrentMax; + bool isXTSCurrentOverFarest; + bool isXTSCurrentOverNearest; + bool isXTSCurrentOverMediest; + bool isXTSCurrentUnderFarest; + bool isXTSCurrentUnderNearest; + bool isXTSCurrentUnderMediest; + bool isXTSCurrentCrossedOverFarest; + bool isXTSCurrentCrossedOverNearest; + bool isXTSCurrentCrossedOverMediest; + bool isXTSCurrentCrossedUnderFarest; + bool isXTSCurrentCrossedUnderNearest; + bool isXTSCurrentCrossedUnderMediest; + + // + // XRSI ... + bool isXRSIPeak; + bool isXRSIVale; + bool isXRSICrossedOverLongExit; + bool isXRSICrossedOverLongEntry; + bool isXRSICrossedUnderShortExit; + bool isXRSICrossedUnderShortEntry; + + // + // XOBD ... + bool isXOBDSwingLow; + bool isXOBDSwingHigh; + + // + // XCHLH ... + // + bool isXCHLHSameHHs; + bool isXCHLHSameLLs; + // + bool isXCHLHSCMCHHSame; + bool isXCHLHSCMCLLSame; + // + bool isXCHLHSCLCHHSame; + bool isXCHLHSCLCLLSame; + // + bool isXCHLHMCLCHHSame; + bool isXCHLHMCLCLLSame; + // + bool isXCHLHMCOnTopOfLC; + bool isXCHLHMCInBottomOfLC; + + // + // XCHMA ... + // + bool isXCHMASCOverMax; + bool isXCHMASCOverMin; + bool isXCHMASCUnderMax; + bool isXCHMASCUnderMin; + // + bool isXCHMASCCrossedOverMax; + bool isXCHMASCCrossedUnderMax; + bool isXCHMASCCrossedOverMin; + bool isXCHMASCCrossedUnderMin; + // + bool isXCHMASCPeak; + bool isXCHMASCVale; + bool isXCHMASCTrendsUp; + bool isXCHMASCTrendsDown; + bool isXCHMASCFastOverSlow; + bool isXCHMASCFastUnderSlow; + bool isXCHMASCFastCrossedOverSlow; + bool isXCHMASCFastCrossedUnderSlow; + // + bool isXCHMAMCPeak; + bool isXCHMAMCVale; + bool isXCHMAMCTrendsUp; + bool isXCHMAMCTrendsDown; + bool isXCHMAMCFastOverSlow; + bool isXCHMAMCFastUnderSlow; + bool isXCHMAMCFastCrossedOverSlow; + bool isXCHMAMCFastCrossedUnderSlow; + // + bool isXCHMALCPeak; + bool isXCHMALCVale; + bool isXCHMALCTrendsUp; + bool isXCHMALCTrendsDown; + bool isXCHMALCFastOverSlow; + bool isXCHMALCFastUnderSlow; + bool isXCHMALCFastCrossedOverSlow; + bool isXCHMALCFastCrossedUnderSlow; +}; + +// +// END Define Enums ... +// + +// +// START Includes Requirements ... +// + +// +// Includes Classes ... +#include "x-saherelm.class.lib.mq5" + +// +// Includes all Indicator's Helpers ... +#include "../Helpers/x-saherelm.xlh.indicator.helper.lib.mq5" +#include "../Helpers/x-saherelm.xtm.indicator.helper.lib.mq5" +#include "../Helpers/x-saherelm.xama.indicator.helper.lib.mq5" +#include "../Helpers/x-saherelm.xfi.oscillator.helper.lib.mq5" +#include "../Helpers/x-saherelm.xobd.indicator.helper.lib.mq5" +#include "../Helpers/x-saherelm.xts.oscillator.helper.lib.mq5" +#include "../Helpers/x-saherelm.xtd.oscillator.helper.lib.mq5" +#include "../Helpers/x-saherelm.xrsi.oscillator.helper.lib.mq5" +#include "../Helpers/x-saherelm.xchlh.oscillator.helper.lib.mq5" +#include "../Helpers/x-saherelm.xchma.oscillator.helper.lib.mq5" + +// +// END Includes Requirements ... +// + +// +class XCProvider : public XCBase +{ + // + // Public ... +public: + // + // Constructor ... + XCProvider( + // + // Common Requirements ... + string xSymbol, // Which Symbol is Used + ENUM_TIMEFRAMES xPeriod, // Which Period is Used + // + // Signallers Requirements ... + // + // XTD ... + bool xTDEnableSignaller, // Enable Signaller + bool xTDAllowLongSignals, // Allow Long Signals + bool xTDAllowShortSignals, // Allow Short Signals + // + // XTAM ... + bool xTAMEnableSignaller, // Enable Signaller + bool xTAMAllowLongSignals, // Allow Long Signals + bool xTAMAllowShortSignals, // Allow Short Signals + // + // XSI ... + bool xSIEnableSignaller, // Enable Signaller + bool xSIAllowLongSignals, // Allow Long Signals + bool xSIAllowShortSignals, // Allow Short Signals + // + // XTSFI ... + bool xTSFIEnableSignaller, // Enable Signaller + bool xTSFIAllowLongSignals, // Allow Long Signals + bool xTSFIAllowShortSignals, // Allow Short Signals + // + // XOBDLH ... + bool xOBDLHEnableSignaller, // Enable Signaller + bool xOBDLHAllowLongSignals, // Allow Long Signals + bool xOBDLHAllowShortSignals, // Allow Short Signals + // + // XCHMACC ... + bool xCHMACCEnableSignaller, // Enable Signaller + bool xCHMACCAllowLongSignals, // Allow Long Signals + bool xCHMACCAllowShortSignals, // Allow Short Signals + // + // XCHMAMX ... + bool xCHMACMXEnableSignaller, // Enable Signaller + bool xCHMACMXAllowLongSignals, // Allow Long Signals + bool xCHMACMXAllowShortSignals, // Allow Short Signals + // + // XCHMAMN ... + bool xCHMACMNEnableSignaller, // Enable Signaller + bool xCHMACMNAllowLongSignals, // Allow Long Signals + bool xCHMACMNAllowShortSignals // Allow Short Signals + // + ) + { + // + // XTD ... + mXTDEnableSignaller = xTDEnableSignaller; + mXTDAllowLongSignals = xTDAllowLongSignals; + mXTDAllowShortSignals = xTDAllowShortSignals; + + // + // XTAM ... + mXTAMEnableSignaller = xTAMEnableSignaller; + mXTAMAllowLongSignals = xTAMAllowLongSignals; + mXTAMAllowShortSignals = xTAMAllowShortSignals; + + // + // XSI ... + mXSIEnableSignaller = xSIEnableSignaller; + mXSIAllowLongSignals = xSIAllowLongSignals; + mXSIAllowShortSignals = xSIAllowShortSignals; + + // + // XTSFI ... + mXTSFIEnableSignaller = xTSFIEnableSignaller; + mXTSFIAllowLongSignals = xTSFIAllowLongSignals; + mXTSFIAllowShortSignals = xTSFIAllowShortSignals; + + // + // XOBDLH ... + mXOBDLHEnableSignaller = xOBDLHEnableSignaller; + mXOBDLHAllowLongSignals = xOBDLHAllowLongSignals; + mXOBDLHAllowShortSignals = xOBDLHAllowShortSignals; + + // + // XCHMACC ... + mXCHMACCEnableSignaller = xCHMACCEnableSignaller; + mXCHMACCAllowLongSignals = xCHMACCAllowLongSignals; + mXCHMACCAllowShortSignals = xCHMACCAllowShortSignals; + + // + // XCHMAMX ... + mXCHMAMXEnableSignaller = xCHMACMXEnableSignaller; + mXCHMAMXAllowLongSignals = xCHMACMXAllowLongSignals; + mXCHMAMXAllowShortSignals = xCHMACMXAllowShortSignals; + + // + // XCHMAMN ... + mXCHMAMNEnableSignaller = xCHMACMNEnableSignaller; + mXCHMAMNAllowLongSignals = xCHMACMNAllowLongSignals; + mXCHMAMNAllowShortSignals = xCHMACMNAllowShortSignals; + } + + // + // Deconstructor ... + ~XCProvider() {} + + // + // START Common Functions ... + // + + // + // Read All Globally Required Conditions ... + void ReadConditions() + { + // + ClearConditions(); + + // + mXConditions = GenerateMarketConditions(1); + } + + // + // Cleanup Conditions ... + void ClearConditions() + { + // + XMarketConditions mConditions = {}; + + // + mXConditions = mConditions; + } + + // + // Generate Merket Conditions for Specified Bar Index ... + XMarketConditions GenerateMarketConditions( + int bar_index = 1 // Specified Bar Index ... + ) + { + // + XMarketConditions mConditions = {}; + + // + // XTM ... + mConditions.isXTMPeak = XTMIsPeak(bar_index); + mConditions.isXTMVale = XTMIsVale(bar_index); + mConditions.isXTMBullish = XTMIsBullish(bar_index); + mConditions.isXTMBearish = XTMIsBearish(bar_index); + mConditions.isXTMNeutural = XTMIsNeutural(bar_index); + mConditions.isXTMEndBullish = XTMIsEndBullish(bar_index); + mConditions.isXTMEndBearish = XTMIsEndBearish(bar_index); + mConditions.isXTMStartBullish = XTMIsStartBullish(bar_index); + mConditions.isXTMStartBearish = XTMIsStartBearish(bar_index); + mConditions.isXTMEndBullishByNeutural = XTMIsEndBullishByNeutural(bar_index); + mConditions.isXTMEndBearishByNeutural = XTMIsEndBearishByNeutural(bar_index); + mConditions.isXTMStartBullishAfterNeutural = XTMIsStartBullishAfterNeutural(bar_index); + mConditions.isXTMStartBearishAfterNeutural = XTMIsStartBearishAfterNeutural(bar_index); + + // + // XAMA ... + mConditions.isXAMAPeak = XAMAIsPeak(bar_index); + mConditions.isXAMAVale = XAMAIsVale(bar_index); + mConditions.isXAMABullish = XAMAIsBullish(bar_index); + mConditions.isXAMABearish = XAMAIsBearish(bar_index); + mConditions.isXAMANeutural = XAMAIsNeutural(bar_index); + mConditions.isXAMAEndBullish = XAMAIsEndBullish(bar_index); + mConditions.isXAMAEndBearish = XAMAIsEndBearish(bar_index); + mConditions.isXAMAStartBullish = XAMAIsStartBullish(bar_index); + mConditions.isXAMAStartBearish = XAMAIsStartBearish(bar_index); + mConditions.isXAMAEndBullishByNeutural = XAMAIsEndBullishByNeutural(bar_index); + mConditions.isXAMAEndBearishByNeutural = XAMAIsEndBearishByNeutural(bar_index); + mConditions.isXAMAStartBullishAfterNeutural = XAMAIsStartBullishAfterNeutural(bar_index); + mConditions.isXAMAStartBearishAfterNeutural = XAMAIsStartBearishAfterNeutural(bar_index); + + // + // XLH ... + mConditions.isXLHHHIncreased = XLHIsHHIncreased(bar_index); + mConditions.isXLHHHDecreased = XLHIsHHDecreased(bar_index); + mConditions.isXLHLLIncreased = XLHIsLLIncreased(bar_index); + mConditions.isXLHLLDecreased = XLHIsLLDecreased(bar_index); + mConditions.isXLHLowAttachedLL = XLHIsLowAttachedLL(bar_index); + mConditions.isXLHHighAttachedHH = XLHIsHighAttachedHH(bar_index); + mConditions.isXLHHHSameInLength = XLHIsHHSameInLength(bar_index); + mConditions.isXLHLLSameInLength = XLHIsLLSameInLength(bar_index); + mConditions.isXLHPriceOverSignal = XLHIsPriceOverSignal(bar_index); + mConditions.isXLHPriceUnderSignal = XLHIsPriceUnderSignal(bar_index); + mConditions.isXLHPriceInSignalRange = XLHIsPriceInSignalRange(bar_index); + mConditions.isXLHPriceCrossedOverSignal = XLHIsPriceCrossedOverSignal(bar_index); + mConditions.isXLHPriceCrossedUnderSignal = XLHIsPriceCrossedUnderSignal(bar_index); + + // + // XTD ... + mConditions.isXTDSignalPeak = XTDIsSignalPeak(bar_index); + mConditions.isXTDSignalVale = XTDIsSignalVale(bar_index); + mConditions.isXTDBullishPeak = XTDIsBullishPeak(bar_index); + mConditions.isXTDBullishVale = XTDIsBullishVale(bar_index); + mConditions.isXTDBearishPeak = XTDIsBearishPeak(bar_index); + mConditions.isXTDBearishVale = XTDIsBearishVale(bar_index); + mConditions.isXTDBullOverBear = XTDIsBullOverBear(bar_index); + mConditions.isXTDBullUnderBear = XTDIsBullUnderBear(bar_index); + mConditions.isXTDSignalOverBear = XTDIsSignalOverBear(bar_index); + mConditions.isXTDSignalUnderBear = XTDIsSignalUnderBear(bar_index); + mConditions.isXTDBullCrossedOverBear = XTDIsBullCrossedOverBear(bar_index); + mConditions.isXTDBullCrossedUnderBear = XTDIsBullCrossedUnderBear(bar_index); + mConditions.isXTDSignalCrossedOverBear = XTDIsSignalCrossedOverBear(bar_index); + mConditions.isXTDSignalCrossedUnderBear = XTDIsSignalCrossedUnderBear(bar_index); + + // + // XFI ... + mConditions.isXFIPeak = XFIIsPeak(bar_index); + mConditions.isXFIVale = XFIIsVale(bar_index); + mConditions.isXFIOverZero = XFIIsOverZero(bar_index); + mConditions.isXFIUnderZero = XFIIsUnderZero(bar_index); + mConditions.isXFICrossedOverZero = XFIIsCrossedOverZero(bar_index); + mConditions.isXFICrossedUnderZero = XFIIsCrossedUnderZero(bar_index); + + // + // XTS ... + mConditions.isXTSAllSame = XTSIsAllSame(bar_index); + mConditions.isXTSCurrentMin = XTSIsCurrentMin(bar_index); + mConditions.isXTSCurrentMax = XTSIsCurrentMax(bar_index); + mConditions.isXTSCurrentOverFarest = XTSIsCurrentOverFarest(bar_index); + mConditions.isXTSCurrentOverNearest = XTSIsCurrentOverNearest(bar_index); + mConditions.isXTSCurrentOverMediest = XTSIsCurrentOverMediest(bar_index); + mConditions.isXTSCurrentUnderFarest = XTSIsCurrentUnderFarest(bar_index); + mConditions.isXTSCurrentUnderNearest = XTSIsCurrentUnderNearest(bar_index); + mConditions.isXTSCurrentUnderMediest = XTSIsCurrentUnderMediest(bar_index); + mConditions.isXTSCurrentCrossedOverFarest = XTSIsCurrentCrossedOverFarest(bar_index); + mConditions.isXTSCurrentCrossedOverNearest = XTSIsCurrentCrossedOverNearest(bar_index); + mConditions.isXTSCurrentCrossedOverMediest = XTSIsCurrentCrossedOverMediest(bar_index); + mConditions.isXTSCurrentCrossedUnderFarest = XTSIsCurrentCrossedUnderFarest(bar_index); + mConditions.isXTSCurrentCrossedUnderNearest = XTSIsCurrentCrossedUnderNearest(bar_index); + mConditions.isXTSCurrentCrossedUnderMediest = XTSIsCurrentCrossedUnderMediest(bar_index); + + // + // XRSI ... + mConditions.isXRSIPeak = XRSIIsPeak(bar_index); + mConditions.isXRSIVale = XRSIIsVale(bar_index); + mConditions.isXRSICrossedOverLongExit = XRSIIsCrossedOverLongExit(bar_index); + mConditions.isXRSICrossedOverLongEntry = XRSIIsCrossedOverLongEntry(bar_index); + mConditions.isXRSICrossedUnderShortExit = XRSIIsCrossedUnderShortExit(bar_index); + mConditions.isXRSICrossedUnderShortEntry = XRSIIsCrossedUnderShortEntry(bar_index); + + // + // XOBD ... + mConditions.isXOBDSwingLow = XOBDIsSwingLow(bar_index); + mConditions.isXOBDSwingHigh = XOBDIsSwingHigh(bar_index); + + // + // XCHLH ... + // + mConditions.isXCHLHSameHHs = XCHLHIsSameHHs(bar_index); + mConditions.isXCHLHSameLLs = XCHLHIsSameLLs(bar_index); + // + mConditions.isXCHLHSCMCHHSame = XCHLHIsMCSCHasSameHH(bar_index); + mConditions.isXCHLHSCMCLLSame = XCHLHIsMCSCHasSameLL(bar_index); + // + mConditions.isXCHLHSCLCHHSame = XCHLHIsLCSCHasSameHH(bar_index); + mConditions.isXCHLHSCLCLLSame = XCHLHIsLCSCHasSameLL(bar_index); + // + mConditions.isXCHLHMCLCHHSame = XCHLHIsLCMCHasSameHH(bar_index); + mConditions.isXCHLHMCLCLLSame = XCHLHIsLCMCHasSameLL(bar_index); + // + mConditions.isXCHLHMCOnTopOfLC = XCHLHIsMCOnTopOfLC(bar_index); + mConditions.isXCHLHMCInBottomOfLC = XCHLHIsMCInBottomOfLC(bar_index); + + // + // XCHMA ... + // + mConditions.isXCHMASCOverMax = XCHMAIsSCOverMax(bar_index); + mConditions.isXCHMASCOverMin = XCHMAIsSCOverMin(bar_index); + mConditions.isXCHMASCUnderMax = XCHMAIsSCUnderMax(bar_index); + mConditions.isXCHMASCUnderMin = XCHMAIsSCUnderMin(bar_index); + // + mConditions.isXCHMASCCrossedOverMax = XCHMAIsSCCrossedOverMax(bar_index); + mConditions.isXCHMASCCrossedUnderMax = XCHMAIsSCCrossedUnderMax(bar_index); + mConditions.isXCHMASCCrossedOverMin = XCHMAIsSCCrossedOverMin(bar_index); + mConditions.isXCHMASCCrossedUnderMin = XCHMAIsSCCrossedUnderMin(bar_index); + // + mConditions.isXCHMASCPeak = XCHMAIsSCPeak(bar_index); + mConditions.isXCHMASCVale = XCHMAIsSCVale(bar_index); + mConditions.isXCHMASCTrendsUp = XCHMAIsSCTrendsUp(bar_index); + mConditions.isXCHMASCTrendsDown = XCHMAIsSCTrendsDown(bar_index); + mConditions.isXCHMASCFastOverSlow = XCHMAIsSCFastOverSlow(bar_index); + mConditions.isXCHMASCFastUnderSlow = XCHMAIsSCFastUnderSlow(bar_index); + mConditions.isXCHMASCFastCrossedOverSlow = XCHMAIsSCFastCrossedOverSlow(bar_index); + mConditions.isXCHMASCFastCrossedUnderSlow = XCHMAIsSCFastCrossedUnderSlow(bar_index); + // + mConditions.isXCHMAMCPeak = XCHMAIsMCPeak(bar_index); + mConditions.isXCHMAMCVale = XCHMAIsMCVale(bar_index); + mConditions.isXCHMAMCTrendsUp = XCHMAIsMCTrendsUp(bar_index); + mConditions.isXCHMAMCTrendsDown = XCHMAIsMCTrendsDown(bar_index); + mConditions.isXCHMAMCFastOverSlow = XCHMAIsMCFastOverSlow(bar_index); + mConditions.isXCHMAMCFastUnderSlow = XCHMAIsMCFastUnderSlow(bar_index); + mConditions.isXCHMAMCFastCrossedOverSlow = XCHMAIsMCFastCrossedOverSlow(bar_index); + mConditions.isXCHMAMCFastCrossedUnderSlow = XCHMAIsMCFastCrossedUnderSlow(bar_index); + // + mConditions.isXCHMALCPeak = XCHMAIsLCPeak(bar_index); + mConditions.isXCHMALCVale = XCHMAIsLCVale(bar_index); + mConditions.isXCHMALCTrendsUp = XCHMAIsLCTrendsUp(bar_index); + mConditions.isXCHMALCTrendsDown = XCHMAIsLCTrendsDown(bar_index); + mConditions.isXCHMALCFastOverSlow = XCHMAIsLCFastOverSlow(bar_index); + mConditions.isXCHMALCFastUnderSlow = XCHMAIsLCFastUnderSlow(bar_index); + mConditions.isXCHMALCFastCrossedOverSlow = XCHMAIsLCFastCrossedOverSlow(bar_index); + mConditions.isXCHMALCFastCrossedUnderSlow = XCHMAIsLCFastCrossedUnderSlow(bar_index); + + // + return mConditions; + } + + // + // Access Last Readed Market Conditions ... + XMarketConditions GetLastMarketCondition() + { + // + XMarketConditions result = {}; + + // + result = mXConditions; + + // + return result; + } + + // + // Check Market Conditions is Ready for Long Signals or not ... + bool IsReadyForLong( + bool checkXCHMAMin = true, // Force Check XCHMA Min State + bool checkXCHMAMax = true, // Force Check XCHMA Max State + bool checkXCHMACycles = true, // Force Check XCHMA Cycles State + bool checkXCHMAPeaks = true, // Force Check XCHMA Peaks State + bool checkXCHMATrendPowers = true, // Force Check XCHMA Trend Powers + bool checkXOBD = true, // Force Check XOBD State + bool checkXTS = true // Force Check XTS State + ) + { + // + bool result = true; + + // + if (checkXCHMAMin) + { + // + result = + // + // XCHMA MIN ... + !( + // + (mXConditions.isXCHMASCOverMin || + mXConditions.isXCHMASCCrossedOverMin) && + (mXConditions.isXCHMASCUnderMin || + mXConditions.isXCHMASCCrossedUnderMin) + // + ); + } + + // + if (checkXCHMAMax && result) + { + // + result = + // + // XCHMA MAX ... + !( + // + (mXConditions.isXCHMASCOverMax || + mXConditions.isXCHMASCCrossedOverMax) && + (mXConditions.isXCHMASCUnderMax || + mXConditions.isXCHMASCCrossedUnderMax) + // + ) + // + ; + } + + // + if (checkXCHMACycles && result) + { + // + result = + // + // Check XCHMA Trend Bullish ... + ( + // + // All Cycles Bullish ... + ( + // + // SC ... + (mXConditions.isXCHMASCFastOverSlow || + mXConditions.isXCHMASCFastCrossedOverSlow) + // + && + // + // MC ... + (mXConditions.isXCHMAMCFastOverSlow || + mXConditions.isXCHMAMCFastCrossedOverSlow) + // + && + // + // LC ... + (mXConditions.isXCHMALCFastOverSlow || + mXConditions.isXCHMALCFastCrossedOverSlow) + // + ) + // + || + // + // Two Cycle Fully Bullish ... + ( + // + // SC and MC ... + ( + // + // SC ... + (mXConditions.isXCHMASCFastOverSlow || + mXConditions.isXCHMASCFastCrossedOverSlow) + // + && + // + // MC ... + (mXConditions.isXCHMAMCFastOverSlow || + mXConditions.isXCHMAMCFastCrossedOverSlow) + // + ) + // + || + // + // SC and LC ... + ( + // + // SC ... + (mXConditions.isXCHMASCFastOverSlow || + mXConditions.isXCHMASCFastCrossedOverSlow) + // + && + // + // LC ... + (mXConditions.isXCHMALCFastOverSlow || + mXConditions.isXCHMALCFastCrossedOverSlow) + // + ) + // + || + // + // MC and LC ... + ( + // + // MC ... + (mXConditions.isXCHMAMCFastOverSlow || + mXConditions.isXCHMAMCFastCrossedOverSlow) + // + && + // + // LC ... + (mXConditions.isXCHMALCFastOverSlow || + mXConditions.isXCHMALCFastCrossedOverSlow) + // + ) + // + ) + // + ) + // + ; + } + + // + if (checkXCHMAPeaks && result) + { + // + result = + // + // XCHMA Check Peaks ... + !( + // + // All Cycles Peak ... + (mXConditions.isXCHMASCPeak && + mXConditions.isXCHMAMCPeak && + mXConditions.isXCHMALCPeak) + // + || + // + ( + // + // SC MC ... + (mXConditions.isXCHMASCPeak && + mXConditions.isXCHMAMCPeak) + // + || + // + // SC LC ... + (mXConditions.isXCHMASCPeak && + mXConditions.isXCHMALCPeak) + // + || + // + // MC LC ... + (mXConditions.isXCHMAMCPeak && + mXConditions.isXCHMALCPeak) + // + ) + // + ) + // + ; + } + + // + if (checkXCHMATrendPowers && result) + { + // + result = + // + // XCHMA Check Trends Power ... + !( + // + // All Trends Down ... + (mXConditions.isXCHMASCTrendsDown && + mXConditions.isXCHMAMCTrendsDown && + mXConditions.isXCHMALCTrendsDown) + // + || + // + // Twisted pairs ... + ( + // + (mXConditions.isXCHMASCTrendsDown && + mXConditions.isXCHMAMCTrendsDown) + // + || + // + (mXConditions.isXCHMASCTrendsDown && + mXConditions.isXCHMALCTrendsDown) + // + || + // + (mXConditions.isXCHMAMCTrendsDown && + mXConditions.isXCHMALCTrendsDown) + // + ) + // + ) + // + ; + } + + // + if (checkXOBD && result) + { + // + result = + // + // XOBD Check Swings ... + !mXConditions.isXOBDSwingLow + // + ; + } + + // + if (checkXTS && result) + { + result = + // + // XTS Check ... + !( + // + mXConditions.isXTSCurrentMin && + // + ( + // + // All Under ... + ( + (mXConditions.isXTSCurrentUnderNearest || + mXConditions.isXTSCurrentCrossedUnderNearest) && + (mXConditions.isXTSCurrentUnderMediest || + mXConditions.isXTSCurrentCrossedUnderMediest) && + (mXConditions.isXTSCurrentUnderFarest || + mXConditions.isXTSCurrentCrossedUnderFarest)) + // + || + // + // Pairs ... + ( + // + ((mXConditions.isXTSCurrentUnderNearest || + mXConditions.isXTSCurrentCrossedUnderNearest) && + (mXConditions.isXTSCurrentUnderMediest || + mXConditions.isXTSCurrentCrossedUnderMediest)) + // + || + // + ((mXConditions.isXTSCurrentUnderNearest || + mXConditions.isXTSCurrentCrossedUnderNearest) && + (mXConditions.isXTSCurrentUnderFarest || + mXConditions.isXTSCurrentCrossedUnderFarest)) + // + || + // + ((mXConditions.isXTSCurrentUnderMediest || + mXConditions.isXTSCurrentCrossedUnderMediest) && + (mXConditions.isXTSCurrentUnderFarest || + mXConditions.isXTSCurrentCrossedUnderFarest)) + // + ) + // + ) + // + ) + // + ; + } + + // + return result; + } + + // + // Check Market Conditions is Ready for Short Signals or not ... + bool IsReadyForShort( + bool checkXCHMAMin = true, // Force Check XCHMA Min State + bool checkXCHMAMax = true, // Force Check XCHMA Max State + bool checkXCHMACycles = true, // Force Check XCHMA Cycles State + bool checkXCHMAVales = true, // Force Check XCHMA Vales State + bool checkXCHMATrendPowers = true, // Force Check XCHMA Trend Powers + bool checkXOBD = true, // Force Check XOBD State + bool checkXTS = true // Force Check XTS State + ) + { + // + bool result = true; + + // + if (checkXCHMAMin) + { + // + result = + // + // XCHMA MIN ... + !( + // + (mXConditions.isXCHMASCOverMin || + mXConditions.isXCHMASCCrossedOverMin) && + (mXConditions.isXCHMASCUnderMin || + mXConditions.isXCHMASCCrossedUnderMin) + // + ); + } + + // + if (checkXCHMAMax && result) + { + // + result = + // + // XCHMA MAX ... + !( + // + (mXConditions.isXCHMASCOverMax || + mXConditions.isXCHMASCCrossedOverMax) && + (mXConditions.isXCHMASCUnderMax || + mXConditions.isXCHMASCCrossedUnderMax) + // + ) + // + ; + } + + // + if (checkXCHMACycles && result) + { + // + result = + // + // Check XCHMA Trend Bullish ... + ( + // + // All Cycles Bullish ... + ( + // + // SC ... + (mXConditions.isXCHMASCFastUnderSlow || + mXConditions.isXCHMASCFastCrossedUnderSlow) + // + && + // + // MC ... + (mXConditions.isXCHMAMCFastUnderSlow || + mXConditions.isXCHMAMCFastCrossedUnderSlow) + // + && + // + // LC ... + (mXConditions.isXCHMALCFastUnderSlow || + mXConditions.isXCHMALCFastCrossedUnderSlow) + // + ) + // + || + // + // Two Cycle Fully Bullish ... + ( + // + // SC and MC ... + ( + // + // SC ... + (mXConditions.isXCHMASCFastUnderSlow || + mXConditions.isXCHMASCFastCrossedOverSlow) + // + && + // + // MC ... + (mXConditions.isXCHMAMCFastUnderSlow || + mXConditions.isXCHMAMCFastCrossedOverSlow) + // + ) + // + || + // + // SC and LC ... + ( + // + // SC ... + (mXConditions.isXCHMASCFastUnderSlow || + mXConditions.isXCHMASCFastCrossedUnderSlow) + // + && + // + // LC ... + (mXConditions.isXCHMALCFastUnderSlow || + mXConditions.isXCHMALCFastCrossedUnderSlow) + // + ) + // + || + // + // MC and LC ... + ( + // + // MC ... + (mXConditions.isXCHMAMCFastUnderSlow || + mXConditions.isXCHMAMCFastCrossedOverSlow) + // + && + // + // LC ... + (mXConditions.isXCHMALCFastUnderSlow || + mXConditions.isXCHMALCFastCrossedOverSlow) + // + ) + // + ) + // + ) + // + ; + } + + // + if (checkXCHMAVales && result) + { + // + result = + // + // XCHMA Check Vales ... + !( + // + // All Cycles Vale ... + (mXConditions.isXCHMASCVale && + mXConditions.isXCHMAMCVale && + mXConditions.isXCHMALCVale) + // + || + // + ( + // + // SC MC ... + (mXConditions.isXCHMASCVale && + mXConditions.isXCHMAMCVale) + // + || + // + // SC LC ... + (mXConditions.isXCHMASCVale && + mXConditions.isXCHMALCVale) + // + || + // + // MC LC ... + (mXConditions.isXCHMAMCVale && + mXConditions.isXCHMALCVale) + // + ) + // + ) + // + ; + } + + // + if (checkXCHMATrendPowers && result) + { + // + result = + // + // XCHMA Check Trends Power ... + !( + // + // All Trends Down ... + (mXConditions.isXCHMASCTrendsDown && + mXConditions.isXCHMAMCTrendsDown && + mXConditions.isXCHMALCTrendsDown) + // + || + // + // Twisted pairs ... + ( + // + (mXConditions.isXCHMASCTrendsDown && + mXConditions.isXCHMAMCTrendsDown) + // + || + // + (mXConditions.isXCHMASCTrendsDown && + mXConditions.isXCHMALCTrendsDown) + // + || + // + (mXConditions.isXCHMAMCTrendsDown && + mXConditions.isXCHMALCTrendsDown) + // + ) + // + ) + // + ; + } + + // + if (checkXOBD && result) + { + // + result = + // + // XOBD Check Swings ... + !mXConditions.isXOBDSwingHigh + // + ; + } + + // + if (checkXTS && result) + { + // + result = + // + // XTS Check ... + !( + // + mXConditions.isXTSCurrentMax && + // + ( + // + // All Over ... + ( + (mXConditions.isXTSCurrentOverNearest || + mXConditions.isXTSCurrentCrossedOverNearest) && + (mXConditions.isXTSCurrentOverMediest || + mXConditions.isXTSCurrentCrossedOverMediest) && + (mXConditions.isXTSCurrentOverFarest || + mXConditions.isXTSCurrentCrossedOverFarest)) + // + || + // + // Pairs ... + ( + // + ((mXConditions.isXTSCurrentOverNearest || + mXConditions.isXTSCurrentCrossedOverNearest) && + (mXConditions.isXTSCurrentOverMediest || + mXConditions.isXTSCurrentCrossedOverMediest)) + // + || + // + ((mXConditions.isXTSCurrentOverNearest || + mXConditions.isXTSCurrentCrossedOverNearest) && + (mXConditions.isXTSCurrentOverFarest || + mXConditions.isXTSCurrentCrossedOverFarest)) + // + || + // + ((mXConditions.isXTSCurrentOverMediest || + mXConditions.isXTSCurrentCrossedOverMediest) && + (mXConditions.isXTSCurrentOverFarest || + mXConditions.isXTSCurrentCrossedOverFarest)) + // + ) + // + ) + // + ) + // + ; + } + + // + return result; + } + + // + // Converts Market Conditions to Specific String Representation ... + string GenerateConditionsString( + XMarketConditions &condition, // Specify Conditiond + string separator = "\n", // Specify Separator + bool ignoreFalses = true // Ignore False Conditions + ) + { + // + XMarketConditions mConditions = {}; + + // + mConditions = condition; + + // + string result = "\n"; + + // + // XOBD ... + result += + "| XOBD |" + separator; + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXOBDSwingLow)) + { + result += "isXOBDSwingLow: " + (string)mConditions.isXOBDSwingLow + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXOBDSwingHigh)) + { + result += "isXOBDSwingHigh: " + (string)mConditions.isXOBDSwingHigh + separator; + } + + // + // Separator ... + result += separator; + + // + // XTM ... + result += + "| XTM |" + separator; + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXTMPeak)) + { + result += "isXTMPeak: " + (string)mConditions.isXTMPeak + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXTMVale)) + { + result += "isXTMVale: " + (string)mConditions.isXTMVale + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXTMStartBullish)) + { + result += "isXTMStartBullish: " + (string)mConditions.isXTMStartBullish + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXTMStartBullishAfterNeutural)) + { + result += "isXTMStartBullishAfterNeutural: " + (string)mConditions.isXTMStartBullishAfterNeutural + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXTMBullish)) + { + result += "isXTMBullish: " + (string)mConditions.isXTMBullish + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXTMEndBullish)) + { + result += "isXTMEndBullish: " + (string)mConditions.isXTMEndBullish + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXTMEndBullishByNeutural)) + { + result += "isXTMEndBullishByNeutural: " + (string)mConditions.isXTMEndBullishByNeutural + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXTMStartBearish)) + { + result += "isXTMStartBearish: " + (string)mConditions.isXTMStartBearish + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXTMStartBearishAfterNeutural)) + { + result += "isXTMStartBearishAfterNeutural: " + (string)mConditions.isXTMStartBearishAfterNeutural + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXTMBearish)) + { + result += "isXTMBearish: " + (string)mConditions.isXTMBearish + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXTMEndBearish)) + { + result += "isXTMEndBearish: " + (string)mConditions.isXTMEndBearish + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXTMEndBearishByNeutural)) + { + result += "isXTMEndBearishByNeutural: " + (string)mConditions.isXTMEndBearishByNeutural + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXTMNeutural)) + { + result += "isXTMNeutural: " + (string)mConditions.isXTMNeutural + separator; + } + + // + // Separator ... + result += separator; + + // + // XAMA ... + result += + "| XAMA |" + separator; + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXAMAPeak)) + { + result += "isXAMAPeak: " + (string)mConditions.isXAMAPeak + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXAMAVale)) + { + result += "isXAMAVale: " + (string)mConditions.isXAMAVale + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXAMAStartBullish)) + { + result += "isXAMAStartBullish: " + (string)mConditions.isXAMAStartBullish + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXAMAStartBullishAfterNeutural)) + { + result += "isXAMAStartBullishAfterNeutural: " + (string)mConditions.isXAMAStartBullishAfterNeutural + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXAMABullish)) + { + result += "isXAMABullish: " + (string)mConditions.isXAMABullish + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXAMAEndBullish)) + { + result += "isXAMAEndBullish: " + (string)mConditions.isXAMAEndBullish + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXAMAEndBullishByNeutural)) + { + result += "isXAMAEndBullishByNeutural: " + (string)mConditions.isXAMAEndBullishByNeutural + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXAMAStartBearish)) + { + result += "isXAMAStartBearish: " + (string)mConditions.isXAMAStartBearish + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXAMAStartBearishAfterNeutural)) + { + result += "isXAMAStartBearishAfterNeutural: " + (string)mConditions.isXAMAStartBearishAfterNeutural + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXAMABearish)) + { + result += "isXAMABearish: " + (string)mConditions.isXAMABearish + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXAMAEndBearish)) + { + result += "isXAMAEndBearish: " + (string)mConditions.isXAMAEndBearish + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXAMAEndBearishByNeutural)) + { + result += "isXAMAEndBearishByNeutural: " + (string)mConditions.isXAMAEndBearishByNeutural + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXAMANeutural)) + { + result += "isXAMANeutural: " + (string)mConditions.isXAMANeutural + separator; + } + + // + // Separator ... + result += separator; + + // + // XTD ... + result += + "| XTD |" + separator; + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXTDSignalPeak)) + { + result += "isXTDSignalPeak: " + (string)mConditions.isXTDSignalPeak + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXTDSignalVale)) + { + result += "isXTDSignalVale: " + (string)mConditions.isXTDSignalVale + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXTDBullishPeak)) + { + result += "isXTDBullishPeak: " + (string)mConditions.isXTDBullishPeak + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXTDBullishVale)) + { + result += "isXTDBullishVale: " + (string)mConditions.isXTDBullishVale + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXTDBearishPeak)) + { + result += "isXTDBearishPeak: " + (string)mConditions.isXTDBearishPeak + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXTDBearishVale)) + { + result += "isXTDBearishVale: " + (string)mConditions.isXTDBearishVale + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXTDBullOverBear)) + { + result += "isXTDBullOverBear: " + (string)mConditions.isXTDBullOverBear + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXTDBullUnderBear)) + { + result += "isXTDBullUnderBear: " + (string)mConditions.isXTDBullUnderBear + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXTDSignalOverBear)) + { + result += "isXTDSignalOverBear: " + (string)mConditions.isXTDSignalOverBear + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXTDSignalUnderBear)) + { + result += "isXTDSignalUnderBear: " + (string)mConditions.isXTDSignalUnderBear + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXTDBullCrossedOverBear)) + { + result += "isXTDBullCrossedOverBear: " + (string)mConditions.isXTDBullCrossedOverBear + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXTDBullCrossedUnderBear)) + { + result += "isXTDBullCrossedUnderBear: " + (string)mConditions.isXTDBullCrossedUnderBear + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXTDSignalCrossedOverBear)) + { + result += "isXTDSignalCrossedOverBear: " + (string)mConditions.isXTDSignalCrossedOverBear + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXTDSignalCrossedUnderBear)) + { + result += "isXTDSignalCrossedUnderBear: " + (string)mConditions.isXTDSignalCrossedUnderBear + separator; + } + + // + // Separator ... + result += separator; + + // + // XFI ... + result += + "| XFI |" + separator; + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXFIPeak)) + { + result += "isXFIPeak: " + (string)mConditions.isXFIPeak + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXFIVale)) + { + result += "isXFIVale: " + (string)mConditions.isXFIVale + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXFIOverZero)) + { + result += "isXFIOverZero: " + (string)mConditions.isXFIOverZero + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXFIUnderZero)) + { + result += "isXFIUnderZero: " + (string)mConditions.isXFIUnderZero + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXFICrossedOverZero)) + { + result += "isXFICrossedOverZero: " + (string)mConditions.isXFICrossedOverZero + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXFICrossedUnderZero)) + { + result += "isXFICrossedUnderZero: " + (string)mConditions.isXFICrossedUnderZero + separator; + } + + // + // Separator ... + result += separator; + + // + // XTS ... + result += + "| XTS |" + separator; + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXTSAllSame)) + { + result += "isXTSAllSame: " + (string)mConditions.isXTSAllSame + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXTSCurrentMin)) + { + result += "isXTSCurrentMin: " + (string)mConditions.isXTSCurrentMin + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXTSCurrentMax)) + { + result += "isXTSCurrentMax: " + (string)mConditions.isXTSCurrentMax + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXTSCurrentOverFarest)) + { + result += "isXTSCurrentOverFarest: " + (string)mConditions.isXTSCurrentOverFarest + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXTSCurrentOverNearest)) + { + result += "isXTSCurrentOverNearest: " + (string)mConditions.isXTSCurrentOverNearest + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXTSCurrentOverMediest)) + { + result += "isXTSCurrentOverMediest: " + (string)mConditions.isXTSCurrentOverMediest + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXTSCurrentUnderFarest)) + { + result += "isXTSCurrentUnderFarest: " + (string)mConditions.isXTSCurrentUnderFarest + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXTSCurrentUnderNearest)) + { + result += "isXTSCurrentUnderNearest: " + (string)mConditions.isXTSCurrentUnderNearest + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXTSCurrentUnderMediest)) + { + result += "isXTSCurrentUnderMediest: " + (string)mConditions.isXTSCurrentUnderMediest + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXTSCurrentCrossedOverFarest)) + { + result += "isXTSCurrentCrossedOverFarest: " + (string)mConditions.isXTSCurrentCrossedOverFarest + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXTSCurrentCrossedOverNearest)) + { + result += "isXTSCurrentCrossedOverNearest: " + (string)mConditions.isXTSCurrentCrossedOverNearest + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXTSCurrentCrossedOverMediest)) + { + result += "isXTSCurrentCrossedOverMediest: " + (string)mConditions.isXTSCurrentCrossedOverMediest + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXTSCurrentCrossedUnderFarest)) + { + result += "isXTSCurrentCrossedUnderFarest: " + (string)mConditions.isXTSCurrentCrossedUnderFarest + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXTSCurrentCrossedUnderNearest)) + { + result += "isXTSCurrentCrossedUnderNearest: " + (string)mConditions.isXTSCurrentCrossedUnderNearest + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXTSCurrentCrossedUnderMediest)) + { + result += "isXTSCurrentCrossedUnderMediest: " + (string)mConditions.isXTSCurrentCrossedUnderMediest + separator; + } + + // + // Separator ... + result += separator; + + // + // XLH ... + result += + "| XLH |" + separator; + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXLHHHIncreased)) + { + result += "isXLHHHIncreased: " + (string)mConditions.isXLHHHIncreased + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXLHHHDecreased)) + { + result += "isXLHHHDecreased: " + (string)mConditions.isXLHHHDecreased + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXLHLLIncreased)) + { + result += "isXLHLLIncreased: " + (string)mConditions.isXLHLLIncreased + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXLHLLDecreased)) + { + result += "isXLHLLDecreased: " + (string)mConditions.isXLHLLDecreased + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXLHHighAttachedHH)) + { + result += "isXLHHighAttachedHH: " + (string)mConditions.isXLHHighAttachedHH + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXLHLowAttachedLL)) + { + result += "isXLHLowAttachedLL: " + (string)mConditions.isXLHLowAttachedLL + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXLHHHSameInLength)) + { + result += "isXLHHHSameInLength: " + (string)mConditions.isXLHHHSameInLength + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXLHLLSameInLength)) + { + result += "isXLHLLSameInLength: " + (string)mConditions.isXLHLLSameInLength + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXLHPriceCrossedOverSignal)) + { + result += "isXLHPriceCrossedOverSignal: " + (string)mConditions.isXLHPriceCrossedOverSignal + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXLHPriceOverSignal)) + { + result += "isXLHPriceOverSignal: " + (string)mConditions.isXLHPriceOverSignal + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXLHPriceCrossedUnderSignal)) + { + result += "isXLHPriceCrossedUnderSignal: " + (string)mConditions.isXLHPriceCrossedUnderSignal + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXLHPriceUnderSignal)) + { + result += "isXLHPriceUnderSignal: " + (string)mConditions.isXLHPriceUnderSignal + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXLHPriceInSignalRange)) + { + result += "isXLHPriceInSignalRange: " + (string)mConditions.isXLHPriceInSignalRange + separator; + } + + // + // Separator ... + result += separator; + + // + // XRSI ... + result += + "| XRSI |" + separator; + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXRSIPeak)) + { + result += "isXRSIPeak: " + (string)mConditions.isXRSIPeak + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXRSIVale)) + { + result += "isXRSIVale: " + (string)mConditions.isXRSIVale + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXRSICrossedOverLongExit)) + { + result += "isXRSICrossedOverLongExit: " + (string)mConditions.isXRSICrossedOverLongExit + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXRSICrossedOverLongEntry)) + { + result += "isXRSICrossedOverLongEntry: " + (string)mConditions.isXRSICrossedOverLongEntry + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXRSICrossedUnderShortExit)) + { + result += "isXRSICrossedUnderShortExit: " + (string)mConditions.isXRSICrossedUnderShortExit + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXRSICrossedUnderShortEntry)) + { + result += "isXRSICrossedUnderShortEntry: " + (string)mConditions.isXRSICrossedUnderShortEntry + separator; + } + + // + // Separator ... + result += separator; + + // + // XCHLH ... + result += + "| XCHLH |" + separator; + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXCHLHSameHHs)) + { + result += "isXCHLHSameHHs: " + (string)mConditions.isXCHLHSameHHs + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXCHLHSameLLs)) + { + result += "isXCHLHSameLLs: " + (string)mConditions.isXCHLHSameLLs + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXCHLHSCMCHHSame)) + { + result += "isXCHLHSCMCHHSame: " + (string)mConditions.isXCHLHSCMCHHSame + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXCHLHSCMCLLSame)) + { + result += "isXCHLHSCMCLLSame: " + (string)mConditions.isXCHLHSCMCLLSame + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXCHLHSCLCHHSame)) + { + result += "isXCHLHSCLCHHSame: " + (string)mConditions.isXCHLHSCLCHHSame + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXCHLHSCLCLLSame)) + { + result += "isXCHLHSCLCLLSame: " + (string)mConditions.isXCHLHSCLCLLSame + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXCHLHMCLCHHSame)) + { + result += "isXCHLHMCLCHHSame: " + (string)mConditions.isXCHLHMCLCHHSame + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXCHLHMCLCLLSame)) + { + result += "isXCHLHMCLCLLSame: " + (string)mConditions.isXCHLHMCLCLLSame + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXCHLHMCOnTopOfLC)) + { + result += "isXCHLHMCOnTopOfLC: " + (string)mConditions.isXCHLHMCOnTopOfLC + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXCHLHMCInBottomOfLC)) + { + result += "isXCHLHMCInBottomOfLC: " + (string)mConditions.isXCHLHMCInBottomOfLC + separator; + } + + // + // Separator ... + result += separator; + + // + // XCHMA ... + result += + "| XCHMA |" + separator; + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXCHMASCOverMax)) + { + result += "isXCHMASCOverMax: " + (string)mConditions.isXCHMASCOverMax + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXCHMASCOverMin)) + { + result += "isXCHMASCOverMin: " + (string)mConditions.isXCHMASCOverMin + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXCHMASCUnderMax)) + { + result += "isXCHMASCUnderMax: " + (string)mConditions.isXCHMASCUnderMax + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXCHMASCUnderMin)) + { + result += "isXCHMASCUnderMin: " + (string)mConditions.isXCHMASCUnderMin + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXCHMASCCrossedOverMax)) + { + result += "isXCHMASCCrossedOverMax: " + (string)mConditions.isXCHMASCCrossedOverMax + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXCHMASCCrossedUnderMax)) + { + result += "isXCHMASCCrossedUnderMax: " + (string)mConditions.isXCHMASCCrossedUnderMax + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXCHMASCCrossedOverMin)) + { + result += "isXCHMASCCrossedOverMin: " + (string)mConditions.isXCHMASCCrossedOverMin + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXCHMASCCrossedUnderMin)) + { + result += "isXCHMASCCrossedUnderMin: " + (string)mConditions.isXCHMASCCrossedUnderMin + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXCHMASCPeak)) + { + result += "isXCHMASCPeak: " + (string)mConditions.isXCHMASCPeak + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXCHMASCVale)) + { + result += "isXCHMASCVale: " + (string)mConditions.isXCHMASCVale + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXCHMASCTrendsUp)) + { + result += "isXCHMASCTrendsUp: " + (string)mConditions.isXCHMASCTrendsUp + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXCHMASCTrendsDown)) + { + result += "isXCHMASCTrendsDown: " + (string)mConditions.isXCHMASCTrendsDown + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXCHMASCFastOverSlow)) + { + result += "isXCHMASCFastOverSlow: " + (string)mConditions.isXCHMASCFastOverSlow + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXCHMASCFastUnderSlow)) + { + result += "isXCHMASCFastUnderSlow: " + (string)mConditions.isXCHMASCFastUnderSlow + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXCHMASCFastCrossedOverSlow)) + { + result += "isXCHMASCFastCrossedOverSlow: " + (string)mConditions.isXCHMASCFastCrossedOverSlow + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXCHMASCFastCrossedUnderSlow)) + { + result += "isXCHMASCFastCrossedUnderSlow: " + (string)mConditions.isXCHMASCFastCrossedUnderSlow + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXCHMAMCPeak)) + { + result += "isXCHMAMCPeak: " + (string)mConditions.isXCHMAMCPeak + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXCHMAMCVale)) + { + result += "isXCHMAMCVale: " + (string)mConditions.isXCHMAMCVale + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXCHMAMCTrendsUp)) + { + result += "isXCHMAMCTrendsUp: " + (string)mConditions.isXCHMAMCTrendsUp + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXCHMAMCTrendsDown)) + { + result += "isXCHMAMCTrendsDown: " + (string)mConditions.isXCHMAMCTrendsDown + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXCHMAMCFastOverSlow)) + { + result += "isXCHMAMCFastOverSlow: " + (string)mConditions.isXCHMAMCFastOverSlow + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXCHMAMCFastUnderSlow)) + { + result += "isXCHMAMCFastUnderSlow: " + (string)mConditions.isXCHMAMCFastUnderSlow + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXCHMAMCFastCrossedOverSlow)) + { + result += "isXCHMAMCFastCrossedOverSlow: " + (string)mConditions.isXCHMAMCFastCrossedOverSlow + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXCHMAMCFastCrossedUnderSlow)) + { + result += "isXCHMAMCFastCrossedUnderSlow: " + (string)mConditions.isXCHMAMCFastCrossedUnderSlow + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXCHMALCPeak)) + { + result += "isXCHMALCPeak: " + (string)mConditions.isXCHMALCPeak + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXCHMALCVale)) + { + result += "isXCHMALCVale: " + (string)mConditions.isXCHMALCVale + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXCHMALCTrendsUp)) + { + result += "isXCHMALCTrendsUp: " + (string)mConditions.isXCHMALCTrendsUp + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXCHMALCTrendsDown)) + { + result += "isXCHMALCTrendsDown: " + (string)mConditions.isXCHMALCTrendsDown + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXCHMALCFastOverSlow)) + { + result += "isXCHMALCFastOverSlow: " + (string)mConditions.isXCHMALCFastOverSlow + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXCHMALCFastUnderSlow)) + { + result += "isXCHMALCFastUnderSlow: " + (string)mConditions.isXCHMALCFastUnderSlow + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXCHMALCFastCrossedOverSlow)) + { + result += "isXCHMALCFastCrossedOverSlow: " + (string)mConditions.isXCHMALCFastCrossedOverSlow + separator; + } + + // + if ( + !ignoreFalses || + (ignoreFalses && mConditions.isXCHMALCFastCrossedUnderSlow)) + { + result += "isXCHMALCFastCrossedUnderSlow: " + (string)mConditions.isXCHMALCFastCrossedUnderSlow + separator; + } + + // + // Separator ... + result += separator; + + // + return result; + } + + // + // END Common Functions ... + // + + // + // START Actions Based On Signallers ... + // + + // + // START XTD Signaller ... + // + + // + // Enable Signaller ... + bool EnableSXTDignaller() + { + // + bool result = false; + + // + // Validate Args ... + if (mXTDEnableSignaller) + { + return result; + } + + // + result = true; + mXTDEnableSignaller = true; + + // + return result; + } + + // + // Disable Signaller ... + bool DisbaleXTDSignaller() + { + // + bool result = false; + + // + // Validate Args ... + if (!mXTDEnableSignaller) + { + return result; + } + + // + result = true; + mXTDEnableSignaller = false; + + // + return result; + } + + // + // Allow Sginaller to Issue Long Signals ... + bool EnableXTDLongs() + { + // + bool result = false; + + // + // Validate Args ... + if ( + !mXTDEnableSignaller || + mXTDAllowLongSignals) + { + return result; + } + + // + result = true; + mXTDAllowLongSignals = true; + + // + return result; + } + + // + // Disallow Signaller to Issue Long Signals ... + bool DisbaleXTDLongs() + { + // + bool result = false; + + // + // Validate Args ... + if ( + !mXTDEnableSignaller || + !mXTDAllowLongSignals) + { + return result; + } + + // + result = true; + mXTDAllowLongSignals = false; + + // + return result; + } + + // + // Allow Signaller to Issue Short Sginals ... + bool EnableXTDShorts() + { + // + bool result = false; + + // + // Validate Args ... + if ( + !mXTDEnableSignaller || + mXTDAllowShortSignals) + { + return result; + } + + // + result = true; + mXTDAllowShortSignals = true; + + // + return result; + } + + // + // Disallow Signaller to Issue Short Signals ... + bool DisableXTDShorts() + { + // + bool result = false; + + // + // Validate Args ... + if ( + !mXTDEnableSignaller || + !mXTDAllowShortSignals) + { + return result; + } + + // + result = true; + mXTDAllowShortSignals = false; + + // + return result; + } + + // + // Check Market Base Conditions for Long Signals ... + bool XTDHasLongConditions() + { + // + bool result = false; + + // + // Validate Args ... + if ( + !mXTDEnableSignaller || + !mXTDAllowLongSignals) + { + return result; + } + + // + // Start Analysing Market based On Conditions ... + result = + // + // Base Condition: + // each Strategy must has a Base Conditions, which they are usually common combinations + // of Market Properties that must be happens to lookup for signals ... + ( + // + mXConditions.isXTDSignalCrossedOverBear + // + ) + // + && + // + // Next Step is combine sorts of Conditions which make our choice + // so Exact in Market ... + ( + // + IsReadyForLong() + // + ) + // + ; + + // + return result; + } + + // + // Check Market Base Conditions for Short Signals ... + bool XTDHasShortConditions() + { + // + bool result = false; + + // + // Validate Args ... + if ( + !mXTDEnableSignaller || + !mXTDAllowShortSignals) + { + return result; + } + + // + // Start Analysing Market based On Conditions ... + result = + // + // Base Condition: + // each Strategy must has a Base Conditions, which they are usually common combinations + // of Market Properties that must be happens to lookup for signals ... + ( + // + mXConditions.isXTDSignalCrossedUnderBear + // + ) + // + && + // + // Next Step is combine sorts of Conditions which make our choice + // so Exact in Market ... + ( + // + IsReadyForShort() + // + ) + // + ; + + // + return result; + } + + // + // END XTD Signaller ... + // + + // + // START XTAM Signaller ... + // + + // + // Enable Signaller ... + bool EnableSXTAMignaller() + { + // + bool result = false; + + // + // Validate Args ... + if (mXTAMEnableSignaller) + { + return result; + } + + // + result = true; + mXTAMEnableSignaller = true; + + // + return result; + } + + // + // Disable Signaller ... + bool DisbaleXTAMSignaller() + { + // + bool result = false; + + // + // Validate Args ... + if (!mXTAMEnableSignaller) + { + return result; + } + + // + result = true; + mXTAMEnableSignaller = false; + + // + return result; + } + + // + // Allow Sginaller to Issue Long Signals ... + bool EnableXTAMLongs() + { + // + bool result = false; + + // + // Validate Args ... + if ( + !mXTAMEnableSignaller || + mXTAMAllowLongSignals) + { + return result; + } + + // + result = true; + mXTAMAllowLongSignals = true; + + // + return result; + } + + // + // Disallow Signaller to Issue Long Signals ... + bool DisbaleXTAMLongs() + { + // + bool result = false; + + // + // Validate Args ... + if ( + !mXTAMEnableSignaller || + !mXTAMAllowLongSignals) + { + return result; + } + + // + result = true; + mXTAMAllowLongSignals = false; + + // + return result; + } + + // + // Allow Signaller to Issue Short Sginals ... + bool EnableXTAMShorts() + { + // + bool result = false; + + // + // Validate Args ... + if ( + !mXTAMEnableSignaller || + mXTAMAllowShortSignals) + { + return result; + } + + // + result = true; + mXTAMAllowShortSignals = true; + + // + return result; + } + + // + // Disallow Signaller to Issue Short Signals ... + bool DisableXTAMShorts() + { + // + bool result = false; + + // + // Validate Args ... + if ( + !mXTAMEnableSignaller || + !mXTAMAllowShortSignals) + { + return result; + } + + // + result = true; + mXTAMAllowShortSignals = false; + + // + return result; + } + + // + // Check Market Base Conditions for Long Signals ... + bool XTAMHasLongConditions() + { + // + bool result = false; + + // + // Validate Args ... + if ( + !mXTAMEnableSignaller || + !mXTAMAllowLongSignals) + { + return result; + } + + // + // Start Analysing Market based On Conditions ... + result = + // + // Base Condition: + // each Strategy must has a Base Conditions, which they are usually common combinations + // of Market Properties that must be happens to lookup for signals ... + ( + // + (xAMAMaBuffer[1] > xTMMaBuffer[1] && + xAMAMaBuffer[2] > xTMMaBuffer[2]) + // + && + // + !(xAMAMaBuffer[2] > xTMMaBuffer[2] && + xAMAMaBuffer[3] > xTMMaBuffer[3]) + // + ) + // + && + // + // Next Step is combine sorts of Conditions which make our choice + // so Exact in Market ... + ( + // + IsReadyForLong() + // + ) + // + ; + + // + return result; + } + + // + // Check Market Base Conditions for Short Signals ... + bool XTAMHasShortConditions() + { + // + bool result = false; + + // + // Validate Args ... + if ( + !mXTAMEnableSignaller || + !mXTAMAllowShortSignals) + { + return result; + } + + // + // Start Analysing Market based On Conditions ... + result = + // + // Base Condition: + // each Strategy must has a Base Conditions, which they are usually common combinations + // of Market Properties that must be happens to lookup for signals ... + ( + // + (xAMAMaBuffer[1] < xTMMaBuffer[1] && + xAMAMaBuffer[2] < xTMMaBuffer[2]) + // + && + // + !(xAMAMaBuffer[2] < xTMMaBuffer[2] && + xAMAMaBuffer[3] < xTMMaBuffer[3]) + // + ) + // + && + // + // Next Step is combine sorts of Conditions which make our choice + // so Exact in Market ... + ( + // + IsReadyForShort() + // + ) + // + ; + + // + return result; + } + + // + // END XTAM Signaller ... + // + + // + // START XSI Signaller ... + // + + // + // Enable Signaller ... + bool EnableSXSIignaller() + { + // + bool result = false; + + // + // Validate Args ... + if (mXSIEnableSignaller) + { + return result; + } + + // + result = true; + mXSIEnableSignaller = true; + + // + return result; + } + + // + // Disable Signaller ... + bool DisbaleXSISignaller() + { + // + bool result = false; + + // + // Validate Args ... + if (!mXSIEnableSignaller) + { + return result; + } + + // + result = true; + mXSIEnableSignaller = false; + + // + return result; + } + + // + // Allow Sginaller to Issue Long Signals ... + bool EnableXSILongs() + { + // + bool result = false; + + // + // Validate Args ... + if ( + !mXSIEnableSignaller || + mXSIAllowLongSignals) + { + return result; + } + + // + result = true; + mXSIAllowLongSignals = true; + + // + return result; + } + + // + // Disallow Signaller to Issue Long Signals ... + bool DisbaleXSILongs() + { + // + bool result = false; + + // + // Validate Args ... + if ( + !mXSIEnableSignaller || + !mXSIAllowLongSignals) + { + return result; + } + + // + result = true; + mXSIAllowLongSignals = false; + + // + return result; + } + + // + // Allow Signaller to Issue Short Sginals ... + bool EnableXSIShorts() + { + // + bool result = false; + + // + // Validate Args ... + if ( + !mXSIEnableSignaller || + mXSIAllowShortSignals) + { + return result; + } + + // + result = true; + mXSIAllowShortSignals = true; + + // + return result; + } + + // + // Disallow Signaller to Issue Short Signals ... + bool DisableXSIShorts() + { + // + bool result = false; + + // + // Validate Args ... + if ( + !mXSIEnableSignaller || + !mXSIAllowShortSignals) + { + return result; + } + + // + result = true; + mXSIAllowShortSignals = false; + + // + return result; + } + + // + // Check Market Base Conditions for Long Signals ... + bool XSIHasLongConditions() + { + // + bool result = false; + + // + // Validate Args ... + if ( + !mXSIEnableSignaller || + !mXSIAllowLongSignals) + { + return result; + } + + // + // Start Analysing Market based On Conditions ... + result = + // + // Base Condition: + // each Strategy must has a Base Conditions, which they are usually common combinations + // of Market Properties that must be happens to lookup for signals ... + ( + // + mXConditions.isXRSICrossedOverLongEntry && + xRSIBuffer[3] < xRSILongEntryValue + // + ) + // + && + // + // Next Step is combine sorts of Conditions which make our choice + // so Exact in Market ... + ( + // + IsReadyForLong( + true, // XCHMA Min + true, // XCHMA Max + true, // XCHMA Cycles + true, // XCHMA Peaks + false, // XCHMA Trend Powers + true, // XOBD + true // XTS + ) + // + ) + // + ; + + // + return result; + } + + // + // Check Market Base Conditions for Short Signals ... + bool XSIHasShortConditions() + { + // + bool result = false; + + // + // Validate Args ... + if ( + !mXSIEnableSignaller || + !mXSIAllowShortSignals) + { + return result; + } + + // + // Start Analysing Market based On Conditions ... + result = + // + // Base Condition: + // each Strategy must has a Base Conditions, which they are usually common combinations + // of Market Properties that must be happens to lookup for signals ... + ( + // + mXConditions.isXRSICrossedUnderShortEntry && + xRSIBuffer[3] > xRSIShortEntryValue + // + ) + // + && + // + // Next Step is combine sorts of Conditions which make our choice + // so Exact in Market ... + ( + // + IsReadyForShort( + true, // XCHMA Min + true, // XCHMA Max + true, // XCHMA Cycles + true, // XCHMA Peaks + false, // XCHMA Trend Powers + true, // XOBD + true // XTS + ) + // + ) + // + ; + + // + return result; + } + + // + // END XSI Signaller ... + // + + // + // START XTSFI Signaller ... + // + + // + // Enable Signaller ... + bool EnableSXTSFIignaller() + { + // + bool result = false; + + // + // Validate Args ... + if (mXTSFIEnableSignaller) + { + return result; + } + + // + result = true; + mXTSFIEnableSignaller = true; + + // + return result; + } + + // + // Disable Signaller ... + bool DisbaleXTSFISignaller() + { + // + bool result = false; + + // + // Validate Args ... + if (!mXTSFIEnableSignaller) + { + return result; + } + + // + result = true; + mXTSFIEnableSignaller = false; + + // + return result; + } + + // + // Allow Sginaller to Issue Long Signals ... + bool EnableXTSFILongs() + { + // + bool result = false; + + // + // Validate Args ... + if ( + !mXTSFIEnableSignaller || + mXTSFIAllowLongSignals) + { + return result; + } + + // + result = true; + mXTSFIAllowLongSignals = true; + + // + return result; + } + + // + // Disallow Signaller to Issue Long Signals ... + bool DisbaleXTSFILongs() + { + // + bool result = false; + + // + // Validate Args ... + if ( + !mXTSFIEnableSignaller || + !mXTSFIAllowLongSignals) + { + return result; + } + + // + result = true; + mXTSFIAllowLongSignals = false; + + // + return result; + } + + // + // Allow Signaller to Issue Short Sginals ... + bool EnableXTSFIShorts() + { + // + bool result = false; + + // + // Validate Args ... + if ( + !mXTSFIEnableSignaller || + mXTSFIAllowShortSignals) + { + return result; + } + + // + result = true; + mXTSFIAllowShortSignals = true; + + // + return result; + } + + // + // Disallow Signaller to Issue Short Signals ... + bool DisableXTSFIShorts() + { + // + bool result = false; + + // + // Validate Args ... + if ( + !mXTSFIEnableSignaller || + !mXTSFIAllowShortSignals) + { + return result; + } + + // + result = true; + mXTSFIAllowShortSignals = false; + + // + return result; + } + + // + // Check Market Base Conditions for Long Signals ... + bool XTSFIHasLongConditions() + { + // + bool result = false; + + // + // Validate Args ... + if ( + !mXTSFIEnableSignaller || + !mXTSFIAllowLongSignals) + { + return result; + } + + // + // Start Analysing Market based On Conditions ... + result = + // + // Base Condition: + // each Strategy must has a Base Conditions, which they are usually common combinations + // of Market Properties that must be happens to lookup for signals ... + ( + // + XTSGetMinValue(1) == xTSFarestBuffer[1] && + (mXConditions.isXTSCurrentOverFarest || + mXConditions.isXTSCurrentCrossedOverFarest) && + (xTSCurrentBuffer[1] < xTSNearestBuffer[1] || + xTSCurrentBuffer[1] < xTSMediestBuffer[1]) && + !(mXConditions.isXTSCurrentUnderNearest || + mXConditions.isXTSCurrentCrossedUnderNearest) + // + ) + // + && + // + // Next Step is combine sorts of Conditions which make our choice + // so Exact in Market ... + ( + // + IsReadyForLong() + // + ) + // + ; + + // + return result; + } + + // + // Check Market Base Conditions for Short Signals ... + bool XTSFIHasShortConditions() + { + // + bool result = false; + + // + // Validate Args ... + if ( + !mXTSFIEnableSignaller || + !mXTSFIAllowShortSignals) + { + return result; + } + + // + // Start Analysing Market based On Conditions ... + result = + // + // Base Condition: + // each Strategy must has a Base Conditions, which they are usually common combinations + // of Market Properties that must be happens to lookup for signals ... + ( + // + XTSGetMaxValue(1) == xTSFarestBuffer[1] && + (mXConditions.isXTSCurrentUnderFarest || + mXConditions.isXTSCurrentCrossedUnderFarest) && + (xTSCurrentBuffer[1] > xTSNearestBuffer[1] || + xTSCurrentBuffer[1] > xTSMediestBuffer[1]) && + !(mXConditions.isXTSCurrentOverNearest || + mXConditions.isXTSCurrentCrossedOverNearest) + // + ) + // + && + // + // Next Step is combine sorts of Conditions which make our choice + // so Exact in Market ... + ( + // + IsReadyForShort() + // + ) + // + ; + + // + return result; + } + + // + // END XTSFI Signaller ... + // + + // + // START XOBDLH Signaller ... + // + + // + // Enable Signaller ... + bool EnableSXOBDLHignaller() + { + // + bool result = false; + + // + // Validate Args ... + if (mXOBDLHEnableSignaller) + { + return result; + } + + // + result = true; + mXOBDLHEnableSignaller = true; + + // + return result; + } + + // + // Disable Signaller ... + bool DisbaleXOBDLHSignaller() + { + // + bool result = false; + + // + // Validate Args ... + if (!mXOBDLHEnableSignaller) + { + return result; + } + + // + result = true; + mXOBDLHEnableSignaller = false; + + // + return result; + } + + // + // Allow Sginaller to Issue Long Signals ... + bool EnableXOBDLHLongs() + { + // + bool result = false; + + // + // Validate Args ... + if ( + !mXOBDLHEnableSignaller || + mXOBDLHAllowLongSignals) + { + return result; + } + + // + result = true; + mXOBDLHAllowLongSignals = true; + + // + return result; + } + + // + // Disallow Signaller to Issue Long Signals ... + bool DisbaleXOBDLHLongs() + { + // + bool result = false; + + // + // Validate Args ... + if ( + !mXOBDLHEnableSignaller || + !mXOBDLHAllowLongSignals) + { + return result; + } + + // + result = true; + mXOBDLHAllowLongSignals = false; + + // + return result; + } + + // + // Allow Signaller to Issue Short Sginals ... + bool EnableXOBDLHShorts() + { + // + bool result = false; + + // + // Validate Args ... + if ( + !mXOBDLHEnableSignaller || + mXOBDLHAllowShortSignals) + { + return result; + } + + // + result = true; + mXOBDLHAllowShortSignals = true; + + // + return result; + } + + // + // Disallow Signaller to Issue Short Signals ... + bool DisableXOBDLHShorts() + { + // + bool result = false; + + // + // Validate Args ... + if ( + !mXOBDLHEnableSignaller || + !mXOBDLHAllowShortSignals) + { + return result; + } + + // + result = true; + mXOBDLHAllowShortSignals = false; + + // + return result; + } + + // + // Check Market Base Conditions for Long Signals ... + bool XOBDLHHasLongConditions() + { + // + bool result = false; + + // + // Validate Args ... + if ( + !mXOBDLHEnableSignaller || + !mXOBDLHAllowLongSignals) + { + return result; + } + + // + XMarketConditions xConditions2 = GenerateMarketConditions(2); + + // + // Start Analysing Market based On Conditions ... + result = + // + // Base Condition: + // each Strategy must has a Base Conditions, which they are usually common combinations + // of Market Properties that must be happens to lookup for signals ... + ( + // + xConditions2.isXOBDSwingLow && + xConditions2.isXLHLowAttachedLL && + xLHLLBuffer[1] >= xLHLLBuffer[2] + // + ) + // + && + // + // Next Step is combine sorts of Conditions which make our choice + // so Exact in Market ... + ( + // + IsReadyForLong( + true, // XCHMA Min + true, // XCHMA Max + false, // XCHMA Cycles + false, // XCHMA Peaks + false, // XCHMA Trend Powers + false, // XOBD + false // XTS + ) + // + ) + // + ; + + // + return result; + } + + // + // Check Market Base Conditions for Short Signals ... + bool XOBDLHHasShortConditions() + { + // + bool result = false; + + // + // Validate Args ... + if ( + !mXOBDLHEnableSignaller || + !mXOBDLHAllowShortSignals) + { + return result; + } + + // + XMarketConditions xConditions2 = GenerateMarketConditions(2); + + // + // Start Analysing Market based On Conditions ... + result = + // + // Base Condition: + // each Strategy must has a Base Conditions, which they are usually common combinations + // of Market Properties that must be happens to lookup for signals ... + ( + // + xConditions2.isXOBDSwingHigh && + xConditions2.isXLHHighAttachedHH && + xLHHHBuffer[1] <= xLHHHBuffer[2] + // + ) + // + && + // + // Next Step is combine sorts of Conditions which make our choice + // so Exact in Market ... + ( + // + IsReadyForShort( + true, // XCHMA Min + true, // XCHMA Max + false, // XCHMA Cycles + false, // XCHMA Peaks + false, // XCHMA Trend Powers + false, // XOBD + false // XTS + ) + // + ) + // + ; + + // + return result; + } + + // + // END XOBDLH Signaller ... + // + + // + // START XCHMACC Signaller ... + // + + // + // Enable Signaller ... + bool EnableSXCHMACCignaller() + { + // + bool result = false; + + // + // Validate Args ... + if (mXCHMACCEnableSignaller) + { + return result; + } + + // + result = true; + mXCHMACCEnableSignaller = true; + + // + return result; + } + + // + // Disable Signaller ... + bool DisbaleXCHMACCSignaller() + { + // + bool result = false; + + // + // Validate Args ... + if (!mXCHMACCEnableSignaller) + { + return result; + } + + // + result = true; + mXCHMACCEnableSignaller = false; + + // + return result; + } + + // + // Allow Sginaller to Issue Long Signals ... + bool EnableXCHMACCLongs() + { + // + bool result = false; + + // + // Validate Args ... + if ( + !mXCHMACCEnableSignaller || + mXCHMACCAllowLongSignals) + { + return result; + } + + // + result = true; + mXCHMACCAllowLongSignals = true; + + // + return result; + } + + // + // Disallow Signaller to Issue Long Signals ... + bool DisbaleXCHMACCLongs() + { + // + bool result = false; + + // + // Validate Args ... + if ( + !mXCHMACCEnableSignaller || + !mXCHMACCAllowLongSignals) + { + return result; + } + + // + result = true; + mXCHMACCAllowLongSignals = false; + + // + return result; + } + + // + // Allow Signaller to Issue Short Sginals ... + bool EnableXCHMACCShorts() + { + // + bool result = false; + + // + // Validate Args ... + if ( + !mXCHMACCEnableSignaller || + mXCHMACCAllowShortSignals) + { + return result; + } + + // + result = true; + mXCHMACCAllowShortSignals = true; + + // + return result; + } + + // + // Disallow Signaller to Issue Short Signals ... + bool DisableXCHMACCShorts() + { + // + bool result = false; + + // + // Validate Args ... + if ( + !mXCHMACCEnableSignaller || + !mXCHMACCAllowShortSignals) + { + return result; + } + + // + result = true; + mXCHMACCAllowShortSignals = false; + + // + return result; + } + + // + // Check Market Base Conditions for Long Signals ... + bool XCHMACCHasLongConditions() + { + // + bool result = false; + + // + // Validate Args ... + if ( + !mXCHMACCEnableSignaller || + !mXCHMACCAllowLongSignals) + { + return result; + } + + // + // Start Analysing Market based On Conditions ... + result = + // + // Base Condition: + // each Strategy must has a Base Conditions, which they are usually common combinations + // of Market Properties that must be happens to lookup for signals ... + ( + // + xCHMAScFastBuffer[1] > xCHMAScSlowBuffer[1] && + xCHMAMcFastBuffer[1] > xCHMAMcSlowBuffer[1] && + xCHMALcFastBuffer[1] > xCHMALcSlowBuffer[1] && + // + xCHMAScFastBuffer[2] > xCHMAScSlowBuffer[2] && + xCHMAMcFastBuffer[2] > xCHMAMcSlowBuffer[2] && + xCHMALcFastBuffer[2] > xCHMALcSlowBuffer[2] && + // + !( + // + xCHMAScFastBuffer[3] > xCHMAScSlowBuffer[3] && + xCHMAMcFastBuffer[3] > xCHMAMcSlowBuffer[3] && + xCHMALcFastBuffer[3] > xCHMALcSlowBuffer[3] + // + ) + // + ) + // + && + // + // Next Step is combine sorts of Conditions which make our choice + // so Exact in Market ... + ( + // + IsReadyForLong() + // + ) + // + ; + + // + return result; + } + + // + // Check Market Base Conditions for Short Signals ... + bool XCHMACCHasShortConditions() + { + // + bool result = false; + + // + // Validate Args ... + if ( + !mXCHMACCEnableSignaller || + !mXCHMACCAllowShortSignals) + { + return result; + } + + // + // Start Analysing Market based On Conditions ... + result = + // + // Base Condition: + // each Strategy must has a Base Conditions, which they are usually common combinations + // of Market Properties that must be happens to lookup for signals ... + ( + // + xCHMAScFastBuffer[1] < xCHMAScSlowBuffer[1] && + xCHMAMcFastBuffer[1] < xCHMAMcSlowBuffer[1] && + xCHMALcFastBuffer[1] < xCHMALcSlowBuffer[1] && + // + xCHMAScFastBuffer[2] < xCHMAScSlowBuffer[2] && + xCHMAMcFastBuffer[2] < xCHMAMcSlowBuffer[2] && + xCHMALcFastBuffer[2] < xCHMALcSlowBuffer[2] && + // + !( + // + xCHMAScFastBuffer[3] < xCHMAScSlowBuffer[3] && + xCHMAMcFastBuffer[3] < xCHMAMcSlowBuffer[3] && + xCHMALcFastBuffer[3] < xCHMALcSlowBuffer[3] + // + ) + // + ) + // + && + // + // Next Step is combine sorts of Conditions which make our choice + // so Exact in Market ... + ( + // + IsReadyForShort() + // + ) + // + ; + + // + return result; + } + + // + // END XCHMACC Signaller ... + // + + // + // START XCHMAMX Signaller ... + // + + // + // Enable Signaller ... + bool EnableSXCHMAMXignaller() + { + // + bool result = false; + + // + // Validate Args ... + if (mXCHMAMXEnableSignaller) + { + return result; + } + + // + result = true; + mXCHMAMXEnableSignaller = true; + + // + return result; + } + + // + // Disable Signaller ... + bool DisbaleXCHMAMXSignaller() + { + // + bool result = false; + + // + // Validate Args ... + if (!mXCHMAMXEnableSignaller) + { + return result; + } + + // + result = true; + mXCHMAMXEnableSignaller = false; + + // + return result; + } + + // + // Allow Sginaller to Issue Long Signals ... + bool EnableXCHMAMXLongs() + { + // + bool result = false; + + // + // Validate Args ... + if ( + !mXCHMAMXEnableSignaller || + mXCHMAMXAllowLongSignals) + { + return result; + } + + // + result = true; + mXCHMAMXAllowLongSignals = true; + + // + return result; + } + + // + // Disallow Signaller to Issue Long Signals ... + bool DisbaleXCHMAMXLongs() + { + // + bool result = false; + + // + // Validate Args ... + if ( + !mXCHMAMXEnableSignaller || + !mXCHMAMXAllowLongSignals) + { + return result; + } + + // + result = true; + mXCHMAMXAllowLongSignals = false; + + // + return result; + } + + // + // Allow Signaller to Issue Short Sginals ... + bool EnableXCHMAMXShorts() + { + // + bool result = false; + + // + // Validate Args ... + if ( + !mXCHMAMXEnableSignaller || + mXCHMAMXAllowShortSignals) + { + return result; + } + + // + result = true; + mXCHMAMXAllowShortSignals = true; + + // + return result; + } + + // + // Disallow Signaller to Issue Short Signals ... + bool DisableXCHMAMXShorts() + { + // + bool result = false; + + // + // Validate Args ... + if ( + !mXCHMAMXEnableSignaller || + !mXCHMAMXAllowShortSignals) + { + return result; + } + + // + result = true; + mXCHMAMXAllowShortSignals = false; + + // + return result; + } + + // + // Check Market Base Conditions for Long Signals ... + bool XCHMAMXHasLongConditions() + { + // + bool result = false; + + // + // Validate Args ... + if ( + !mXCHMAMXEnableSignaller || + !mXCHMAMXAllowLongSignals) + { + return result; + } + + // + ENUM_XCHMA_CYCLES cycles[]; + Add( + X_XCHMA_CYCLE_MEDIUM, + cycles); + Add( + X_XCHMA_CYCLE_LONG, + cycles); + + // + double xCHMANonSCMax2 = XCHMAGetCyclesMaxValue(2, cycles); + + // + // Start Analysing Market based On Conditions ... + result = + // + // Base Condition: + // each Strategy must has a Base Conditions, which they are usually common combinations + // of Market Properties that must be happens to lookup for signals ... + ( + // + mXConditions.isXCHMASCCrossedOverMax && + xCHMAScFastBuffer[2] < xCHMANonSCMax2 && + xCHMAScSlowBuffer[2] < xCHMANonSCMax2 && + MathAbs(xCHMANonSCMax2 - xCHMAScFastBuffer[2]) > MathAbs(xCHMAScFastBuffer[2] - xCHMAScSlowBuffer[2]) && + MathAbs(xCHMANonSCMax2 - xCHMAScSlowBuffer[2]) > MathAbs(xCHMAScFastBuffer[2] - xCHMAScSlowBuffer[2]) + // + ) + // + && + // + // Next Step is combine sorts of Conditions which make our choice + // so Exact in Market ... + ( + // + IsReadyForLong( + true, // XCHMA Min + true, // XCHMA Max + false, // XCHMA Cycles + false, // XCHMA Peaks + false, // XCHMA Trend Powers + true, // XOBD + true // XTS + ) + // + ) + // + ; + + // + return result; + } + + // + // Check Market Base Conditions for Short Signals ... + bool XCHMAMXHasShortConditions() + { + // + bool result = false; + + // + // Validate Args ... + if ( + !mXCHMAMXEnableSignaller || + !mXCHMAMXAllowShortSignals) + { + return result; + } + + // + ENUM_XCHMA_CYCLES cycles[]; + Add( + X_XCHMA_CYCLE_MEDIUM, + cycles); + Add( + X_XCHMA_CYCLE_LONG, + cycles); + + // + double xCHMANonSCMax2 = XCHMAGetCyclesMaxValue(2, cycles); + + // + // Start Analysing Market based On Conditions ... + result = + // + // Base Condition: + // each Strategy must has a Base Conditions, which they are usually common combinations + // of Market Properties that must be happens to lookup for signals ... + ( + // + mXConditions.isXCHMASCCrossedUnderMax && + xCHMAScFastBuffer[2] > xCHMANonSCMax2 && + xCHMAScSlowBuffer[2] > xCHMANonSCMax2 + // + ) + // + && + // + // Next Step is combine sorts of Conditions which make our choice + // so Exact in Market ... + ( + // + IsReadyForShort( + true, // XCHMA Min + true, // XCHMA Max + false, // XCHMA Cycles + false, // XCHMA Peaks + false, // XCHMA Trend Powers + true, // XOBD + true // XTS + ) + // + ) + // + ; + // + return result; + } + + // + // END XCHMAMX Signaller ... + // + + // + // START XCHMAMN Signaller ... + // + + // + // Enable Signaller ... + bool EnableSXCHMAMNignaller() + { + // + bool result = false; + + // + // Validate Args ... + if (mXCHMAMNEnableSignaller) + { + return result; + } + + // + result = true; + mXCHMAMNEnableSignaller = true; + + // + return result; + } + + // + // Disable Signaller ... + bool DisbaleXCHMAMNSignaller() + { + // + bool result = false; + + // + // Validate Args ... + if (!mXCHMAMNEnableSignaller) + { + return result; + } + + // + result = true; + mXCHMAMNEnableSignaller = false; + + // + return result; + } + + // + // Allow Sginaller to Issue Long Signals ... + bool EnableXCHMAMNLongs() + { + // + bool result = false; + + // + // Validate Args ... + if ( + !mXCHMAMNEnableSignaller || + mXCHMAMNAllowLongSignals) + { + return result; + } + + // + result = true; + mXCHMAMNAllowLongSignals = true; + + // + return result; + } + + // + // Disallow Signaller to Issue Long Signals ... + bool DisbaleXCHMAMNLongs() + { + // + bool result = false; + + // + // Validate Args ... + if ( + !mXCHMAMNEnableSignaller || + !mXCHMAMNAllowLongSignals) + { + return result; + } + + // + result = true; + mXCHMAMNAllowLongSignals = false; + + // + return result; + } + + // + // Allow Signaller to Issue Short Sginals ... + bool EnableXCHMAMNShorts() + { + // + bool result = false; + + // + // Validate Args ... + if ( + !mXCHMAMNEnableSignaller || + mXCHMAMNAllowShortSignals) + { + return result; + } + + // + result = true; + mXCHMAMNAllowShortSignals = true; + + // + return result; + } + + // + // Disallow Signaller to Issue Short Signals ... + bool DisableXCHMAMNShorts() + { + // + bool result = false; + + // + // Validate Args ... + if ( + !mXCHMAMNEnableSignaller || + !mXCHMAMNAllowShortSignals) + { + return result; + } + + // + result = true; + mXCHMAMNAllowShortSignals = false; + + // + return result; + } + + // + // Check Market Base Conditions for Long Signals ... + bool XCHMAMNHasLongConditions() + { + // + bool result = false; + + // + // Validate Args ... + if ( + !mXCHMAMNEnableSignaller || + !mXCHMAMNAllowLongSignals) + { + return result; + } + + // + ENUM_XCHMA_CYCLES cycles[]; + Add( + X_XCHMA_CYCLE_MEDIUM, + cycles); + Add( + X_XCHMA_CYCLE_LONG, + cycles); + + // + double xCHMANonSCMin2 = XCHMAGetCyclesMinValue(2, cycles); + + // + // Start Analysing Market based On Conditions ... + result = + // + // Base Condition: + // each Strategy must has a Base Conditions, which they are usually common combinations + // of Market Properties that must be happens to lookup for signals ... + ( + // + mXConditions.isXCHMASCCrossedOverMin && + xCHMAScFastBuffer[2] < xCHMANonSCMin2 && + xCHMAScSlowBuffer[2] < xCHMANonSCMin2 + // + ) + // + && + // + // Next Step is combine sorts of Conditions which make our choice + // so Exact in Market ... + ( + // + IsReadyForLong( + true, // XCHMA Min + true, // XCHMA Max + false, // XCHMA Cycles + false, // XCHMA Peaks + false, // XCHMA Trend Powers + true, // XOBD + true // XTS + ) + // + ) + // + ; + + // + return result; + } + + // + // Check Market Base Conditions for Short Signals ... + bool XCHMAMNHasShortConditions() + { + // + bool result = false; + + // + // Validate Args ... + if ( + !mXCHMAMNEnableSignaller || + !mXCHMAMNAllowShortSignals) + { + return result; + } + + // + ENUM_XCHMA_CYCLES cycles[]; + Add( + X_XCHMA_CYCLE_MEDIUM, + cycles); + Add( + X_XCHMA_CYCLE_LONG, + cycles); + + // + double xCHMANonSCMin2 = XCHMAGetCyclesMinValue(2, cycles); + + // + // Start Analysing Market based On Conditions ... + result = + // + // Base Condition: + // each Strategy must has a Base Conditions, which they are usually common combinations + // of Market Properties that must be happens to lookup for signals ... + ( + // + mXConditions.isXCHMASCCrossedUnderMin && + xCHMAScFastBuffer[2] > xCHMANonSCMin2 && + xCHMAScSlowBuffer[2] > xCHMANonSCMin2 + // + ) + // + && + // + // Next Step is combine sorts of Conditions which make our choice + // so Exact in Market ... + ( + // + IsReadyForLong( + true, // XCHMA Min + true, // XCHMA Max + false, // XCHMA Cycles + false, // XCHMA Peaks + false, // XCHMA Trend Powers + true, // XOBD + true // XTS + ) + // + ) + // + ; + // + return result; + } + + // + // END XCHMAMN Signaller ... + // + + // + // END Actions Based On Signallers ... + // + + // + // Protected ... +protected: + // + // Private ... +private: + // + // XTD ... + bool mXTDEnableSignaller; + bool mXTDAllowLongSignals; + bool mXTDAllowShortSignals; + + // + // XTAM ... + bool mXTAMEnableSignaller; + bool mXTAMAllowLongSignals; + bool mXTAMAllowShortSignals; + + // + // XSI ... + bool mXSIEnableSignaller; + bool mXSIAllowLongSignals; + bool mXSIAllowShortSignals; + + // + // XTSFI ... + bool mXTSFIEnableSignaller; + bool mXTSFIAllowLongSignals; + bool mXTSFIAllowShortSignals; + + // + // XOBDLH ... + bool mXOBDLHEnableSignaller; + bool mXOBDLHAllowLongSignals; + bool mXOBDLHAllowShortSignals; + + // + // XCHMACC ... + bool mXCHMACCEnableSignaller; + bool mXCHMACCAllowLongSignals; + bool mXCHMACCAllowShortSignals; + + // + // XCHMAMX ... + bool mXCHMAMXEnableSignaller; + bool mXCHMAMXAllowLongSignals; + bool mXCHMAMXAllowShortSignals; + + // + // XCHMAMN ... + bool mXCHMAMNEnableSignaller; + bool mXCHMAMNAllowLongSignals; + bool mXCHMAMNAllowShortSignals; + + // + // Here we Define some Global Market Variables to Analyse MArket Conditions + // using them at each time ... + XMarketConditions mXConditions; +}; \ No newline at end of file diff --git a/BKPS/OLD/XEU5/Documents/.gitkeep b/BKPS/OLD/XEU5/Documents/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/BKPS/OLD/XEU5/Documents/Reports/.gitkeep b/BKPS/OLD/XEU5/Documents/Reports/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/BKPS/OLD/XEU5/Documents/Settings/.gitkeep b/BKPS/OLD/XEU5/Documents/Settings/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/BKPS/OLD/XEU5/Experts/.gitkeep b/BKPS/OLD/XEU5/Experts/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/BKPS/OLD/XEU5/Experts/x-saherelm.xeu5.ea.mq5 b/BKPS/OLD/XEU5/Experts/x-saherelm.xeu5.ea.mq5 new file mode 100644 index 0000000..58c5bda --- /dev/null +++ b/BKPS/OLD/XEU5/Experts/x-saherelm.xeu5.ea.mq5 @@ -0,0 +1,347 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 Expert Advisor +// ---------------------------------------- +// Name: XAUUSD +// 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 XEU5 EA" +#property strict + +// +// START Inputs ... +// + +input group "Commons"; + +// +// END Inputs ... +// + +// +// START Including Providers ... +// + +// +// Logger Library ... +#include "../Libraries/x-saherelm.log.lib.mq5" + +// +// Common Library ... +#include "../Libraries/x-saherelm.common.lib.mq5" + +// +// Alert Library ... +#include "../Libraries/x-saherelm.alert.lib.mq5" + +// +// Draw Library ... +#include "../Libraries/x-saherelm.draw.lib.mq5" + +// +// XEU5 Signal Provider ... +#include "../Providers/x-saherelm.xeu5.provider.lib.mq5" + +// +// END Including Providers ... +// + +// +// START Global Definitions: Variables, Properties and etc ... +// +bool isXEU5NewHour; +bool isXEU5NewDay; +bool isXEU5NewWeek; +bool isXEU5NewMonth; +// +// END Global Definitions: Variables, Properties and etc ... +// + +// +// START Event Handlers ... +// + +// +// Initialization ... +int OnInit() +{ + // + logTag = "XEU5EA"; + drawPrefix = logTag; + alertPrefix = logTag; + + // + // Apply default Chart Style for EA ... + ApplyChartStyle(); + + // + // Reset Timings ... + ResetTiming(); + + // + // Validate Inputs ... + if (!ValidateInputs()) + { + return INIT_PARAMETERS_INCORRECT; + } + + // + // Initialize XEU5 Provider ... + if (!XEU5InitSignalProviderLibrary()) + { + return INIT_PARAMETERS_INCORRECT; + } + + // + // 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 ... + + // + // De Initialize XEU5 Provider ... + XEU5DeinitSignalProviderLibrary(reason); + + // + // De Init XDraw Library ... + // OnDeinitDrawLibrary(); +} + +// +// On Tick Handler ... +void OnTick() +{ + // + // Handle Monthly Alert ... + bool isFirstMonth = xMonth == -1; + isXEU5NewMonth = IsNewMonth(); + bool canMonthlyAlert = + isXEU5NewMonth && + xEU5EnableAlerts && + xEU5EnableMonthlyAlerts; + bool canMonthlyReport = + !isFirstMonth && + canMonthlyAlert && + xEU5EnableMonthlyReports; + if (canMonthlyAlert) + { + // + string message = "New Month ..."; + + // + // Prepare Monthly Report ... + if (canMonthlyReport) + { + // + string report = xEU5Reporter.GenerateReportString(XREPORT_MONTHLY); + + // + message = "Last Month Report:\n" + report; + } + + // + // Reset Report ... + xEU5Reporter.Reset(XREPORT_MONTHLY); + + // + SendAlert(message); + } + + // + // Handle Weekly Alert ... + bool isFirstWeek = xDayOfWeek == -1; + isXEU5NewWeek = IsNewWeek(); + bool canWeeklyAlert = + isXEU5NewWeek && + xEU5EnableAlerts && + xEU5EnableWeeklyAlerts; + bool canWeeklyReport = + !isFirstWeek && + canWeeklyAlert && + xEU5EnableWeeklyReports; + if (canWeeklyAlert) + { + // + string message = "New Week ..."; + + // + // Prepare Weekly Report ... + if (canWeeklyReport) + { + // + string report = xEU5Reporter.GenerateReportString(XREPORT_WEEKLY); + + // + message = "Last Week Report:\n" + report; + } + + // + // Reset Report ... + xEU5Reporter.Reset(XREPORT_WEEKLY); + + // + SendAlert(message); + } + + // + // Handle Daily Alert ... + bool isFirstDay = xDay == -1; + isXEU5NewDay = IsNewDay(); + bool canDailyAlert = + isXEU5NewDay && + xEU5EnableAlerts && + xEU5EnableDailyAlerts; + bool canDailyReport = + !isFirstDay && + canDailyAlert && + xEU5EnableDailyReports; + if (canDailyAlert) + { + // + string message = "New Day ..."; + + // + // Prepare Daily Report ... + if (canDailyReport) + { + // + string report = xEU5Reporter.GenerateReportString(XREPORT_DAILY); + + // + message = "Last Week Report:\n" + report; + } + + // + // Reset Report ... + xEU5Reporter.Reset(XREPORT_DAILY); + + // + SendAlert(message); + } + + // + // Handle Hourly Alert ... + bool isFirstHour = xHour == -1; + isXEU5NewHour = IsNewHour(); + bool canHourlyAlert = + isXEU5NewHour && + xEU5EnableAlerts && + xEU5EnableHourlyAlerts; + if (canHourlyAlert) + { + // + string message = "New Hour ..."; + + // + SendAlert(message); + } + + + // + // Prevent Going Forward if user Disable it ... + if (xEU5EnableProvider) + { + // + // Handle Processing on XEU5 Signal Provider ... + XEU5SignalProviderDoControlState(); + } + + // + if (!IsNewCandle()) + { + return; + } + + // + // Prevent Going Forward if user Disable it ... + if (xEU5EnableProvider) + { + // + // Handle Processing on XEU5 Signal Provider ... + XEU5SignalProviderHandleTick(); + } +} + +// +// Handle Trade Events ... +void OnTrade() +{ + + // + // Prevent Going Forward if user Disable it ... + if (xEU5EnableProvider) + { + // + // Handle Processing Trades on XEU5 Signal Provider ... + XEU5SignalProviderHandleTrade(); + } +} + +// +// END Event Handlers ... +// + +// +// START Functions ... +// + +// +// Validate Input Args for Initialization ... +bool ValidateInputs() +{ + // + bool result = false; + + // + // Validate Args ... + + // + // Validate XEU5 Provider Inputs ... + result = XEU5ValidateInputs(); + if (!result) + { + return false; + } + + // + // Logging State ... + string message = "Validation of (" + logTag + ") Inputs " + (result ? "Succeeded" : "Failed") + " ..."; + LogMessage(message); + + // + return result; +} + +// +// END Functions ... +// diff --git a/BKPS/OLD/XEU5/Helpers/.gitkeep b/BKPS/OLD/XEU5/Helpers/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/BKPS/OLD/XEU5/Helpers/x-saherelm.xama.indicator.helper.lib.mq5 b/BKPS/OLD/XEU5/Helpers/x-saherelm.xama.indicator.helper.lib.mq5 new file mode 100644 index 0000000..f565e41 --- /dev/null +++ b/BKPS/OLD/XEU5/Helpers/x-saherelm.xama.indicator.helper.lib.mq5 @@ -0,0 +1,607 @@ +///////////////////////////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 XAMA Indicator Helper for Signal Providers +// -------------------------------------------------------------------------- +// +// 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 + +// +// Includes ... +#include "../Libraries/x-saherelm.log.lib.mq5" +#include "../Libraries/x-saherelm.common.lib.mq5" + +// +// START Enum Definitions ... +// + +// +// XAMA Indicator States ... +enum ENUM_X_XAMA_STATES +{ + X_XAMA_BULLISH = 1, + X_XAMA_BEARISH = -1, + X_XAMA_NEUTURAL = 0, +}; + +// +// XAMA Indicator Buffer Lines ... +enum ENUM_X_XAMA_BUFFER_LINES +{ + X_XAMA_MA_LINE = 0, + X_XAMA_MC_COLOR_LINE = 1, + X_XAMA_STATE_LINE = 2, +}; + +// +// END Enum Definitions ... +// + +// +// START Inputs ... +// + +// input group "XAMA Indicator"; + +// +// input int xAMALength = 18; // Market Length +// input int xAMAFastEMA = 2; // Fast EMA Period +// input int xAMASlowEMA = 30; // Slow EMA Period +// input int xAMAShift = 0; // Shift +// input ENUM_APPLIED_PRICE xAMAAppliedTo = PRICE_CLOSE; // Applied To + +// +// Configurations ... +int xAMALength = 18; // Market Length +int xAMAFastEMA = 2; // Fast EMA Period +int xAMASlowEMA = 30; // Slow EMA Period +int xAMAShift = 0; // Shift +ENUM_APPLIED_PRICE xAMAAppliedTo = PRICE_CLOSE; // Applied To + +// +// END Inputs ... +// + +// +// START Definitions ... +// + +int xAMAHandler = INVALID_HANDLE; +double xAMAMaBuffer[]; +double xAMAStateBuffer[]; + +// +// END Definitions ... +// + +// +// START Handler Functions ... +// + +// +// Validate Inputs ... +bool XAMAValidateInputs() +{ + // + bool result = false; + + // + result = + xAMALength > 2 && + xAMAFastEMA < xAMALength && + xAMAFastEMA < xAMASlowEMA && + xAMAShift >= 0; + + // + if (!result) + { + // + LogMessage("XAMA Indicator Inputs Validation Failed ..."); + } + + // + return result; +} + +// +// Init Indicators ... +bool XAMAInitHandlers() +{ + // + bool result = false; + + // + // Initialize Indicator/Indicator Handlers ... + ResetLastError(); + + // + // XAMA Handler ... + ArraySetAsSeries(xAMAMaBuffer, true); + ArraySetAsSeries(xAMAStateBuffer, true); + xAMAHandler = iCustom( + _Symbol, + _Period, + "x-saherelm.xama.indicator", + // + // Inputs ... + xAMALength, + xAMAFastEMA, + xAMASlowEMA, + xAMAShift, + xAMAAppliedTo + // + ); + if (xAMAHandler == INVALID_HANDLE) + { + // + LogMessage("failed to Initialize XAMA Indicator: " + (string)GetLastError()); + return result; + } + + // + result = true; + + // + return result; +} + +// +// Release Indicators ... +void XAMAReleaseHandlers() +{ + IndicatorRelease(xAMAHandler); +} + +// +// Handle Reading Buffers ... +void XAMAReadBuffers( + int xAMAItemsPerTick // Number Of Reading Buffer Items Per Tick +) +{ + // + // XAMA Ma Buffer ... + CopyBuffer( + xAMAHandler, + X_XAMA_MA_LINE, + 0, + xAMAItemsPerTick, + xAMAMaBuffer); + + // + // XAMA State Buffer ... + CopyBuffer( + xAMAHandler, + X_XAMA_STATE_LINE, + 0, + xAMAItemsPerTick, + xAMAStateBuffer); +} + +// +// END Handler Funcions ... +// + +// +// START XAMA Custom Functions ... +// + +// +// Check SC is Peak ... +bool XAMAIsPeak( + int bar_index, // Specified Index ... + int length = 10 // Specified Length ... +) +{ + // + bool result = false; + + // + if ( + length <= 0 || + bar_index <= 0 || + !XAMAIsValidBuffersSize(bar_index + length + 1)) + { + return result; + } + + // + // Must Decreasing ... + bool isIncreasing = IsIncreasing( + bar_index + length, + bar_index, + xAMAMaBuffer + // + ); + + // + return result; +} + +// +// Check SC is Vale ... +bool XAMAIsVale( + int bar_index, // Specified Index ... + int length = 10 // Specified Length ... +) +{ + // + bool result = false; + + // + if ( + length <= 0 || + bar_index <= 0 || + !XAMAIsValidBuffersSize(bar_index + length + 1)) + { + return result; + } + + // + result = IsDecreasing( + bar_index + length, + bar_index, + xAMAMaBuffer + // + ); + + // + return result; +} + +// +// Check TM Crossed Up ... +bool XAMAIsStartBullish( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XAMAIsValidBuffersSize(bar_index + 2)) + { + return result; + } + + // + result = + // + xAMAStateBuffer[bar_index] == X_XAMA_BULLISH && + xAMAStateBuffer[bar_index + 1] != X_XAMA_BULLISH + // + ; + + // + return result; +} + +// +// Check TM Crossed Up After Neutural State ... +bool XAMAIsStartBullishAfterNeutural( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XAMAIsValidBuffersSize(bar_index + 2)) + { + return result; + } + + // + result = + // + xAMAStateBuffer[bar_index] == X_XAMA_BULLISH && + xAMAStateBuffer[bar_index + 1] == X_XAMA_NEUTURAL + // + ; + + // + return result; +} + +// +// Check TM In Up State ... +bool XAMAIsBullish( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XAMAIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + result = + // + xAMAStateBuffer[bar_index] == X_XAMA_BULLISH + // + ; + + // + return result; +} + +// +// Check TM Ends Up State ... +bool XAMAIsEndBullish( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XAMAIsValidBuffersSize(bar_index + 2)) + { + return result; + } + + // + result = + // + xAMAStateBuffer[bar_index] != X_XAMA_BULLISH && + xAMAStateBuffer[bar_index + 1] == X_XAMA_BULLISH + // + ; + + // + return result; +} + +// +// Check TM Ends Up State By Neutural ... +bool XAMAIsEndBullishByNeutural( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XAMAIsValidBuffersSize(bar_index + 2)) + { + return result; + } + + // + result = + // + xAMAStateBuffer[bar_index] == X_XAMA_NEUTURAL && + xAMAStateBuffer[bar_index + 1] == X_XAMA_BULLISH + // + ; + + // + return result; +} + +// +// Check TM Crossed Down ... +bool XAMAIsStartBearish( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XAMAIsValidBuffersSize(bar_index + 2)) + { + return result; + } + + // + result = + // + xAMAStateBuffer[bar_index] == X_XAMA_BEARISH && + xAMAStateBuffer[bar_index + 1] != X_XAMA_BEARISH + // + ; + + // + return result; +} + +// +// Check TM Crossed Down After Neutural State ... +bool XAMAIsStartBearishAfterNeutural( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XAMAIsValidBuffersSize(bar_index + 2)) + { + return result; + } + + // + result = + // + xAMAStateBuffer[bar_index] == X_XAMA_BEARISH && + xAMAStateBuffer[bar_index + 1] == X_XAMA_NEUTURAL + // + ; + + // + return result; +} + +// +// Check TM In Down State ... +bool XAMAIsBearish( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XAMAIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + result = + // + xAMAStateBuffer[bar_index] == X_XAMA_BEARISH + // + ; + + // + return result; +} + +// +// Check TM Ends Down State ... +bool XAMAIsEndBearish( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XAMAIsValidBuffersSize(bar_index + 2)) + { + return result; + } + + // + result = + // + xAMAStateBuffer[bar_index] != X_XAMA_BEARISH && + xAMAStateBuffer[bar_index + 1] == X_XAMA_BEARISH + // + ; + + // + return result; +} + +// +// Check TM Ends Down State By Neutural ... +bool XAMAIsEndBearishByNeutural( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XAMAIsValidBuffersSize(bar_index + 2)) + { + return result; + } + + // + result = + // + xAMAStateBuffer[bar_index] == X_XAMA_NEUTURAL && + xAMAStateBuffer[bar_index + 1] == X_XAMA_BEARISH + // + ; + + // + return result; +} + +// +// Check TM In Neutural State ... +bool XAMAIsNeutural( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XAMAIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + result = + // + xAMAStateBuffer[bar_index] == X_XAMA_NEUTURAL + // + ; + + // + return result; +} + +// +// Check all Buffers has valid Size ... +bool XAMAIsValidBuffersSize( + int size // the size of buffers which min size for requirements +) +{ + // + bool result = false; + + // + if ( + size <= 0 || + // + ArraySize(xAMAMaBuffer) < size + // + ) + { + result = false; + } + else + { + result = true; + } + + // + return result; +} + +// +// END XAMA Custom Functions ... +// diff --git a/BKPS/OLD/XEU5/Helpers/x-saherelm.xchlh.oscillator.helper.lib.mq5 b/BKPS/OLD/XEU5/Helpers/x-saherelm.xchlh.oscillator.helper.lib.mq5 new file mode 100644 index 0000000..d7071b4 --- /dev/null +++ b/BKPS/OLD/XEU5/Helpers/x-saherelm.xchlh.oscillator.helper.lib.mq5 @@ -0,0 +1,1032 @@ +///////////////////////////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 XCHLH Oscillator Helper for Signal Providers +// -------------------------------------------------------------------------- +// +// 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 + +// +// Includes ... +#include "../Libraries/x-saherelm.log.lib.mq5" +#include "../Libraries/x-saherelm.common.lib.mq5" + +// +// START Enum Definitions ... +// + +// +// Cycles Enumeration ... +enum ENUM_X_XCHLH_CYCLES +{ + X_XCHLH_CYCLE_LONG, + X_XCHLH_CYCLE_MEDIUM, + X_XCHLH_CYCLE_SHORT, +}; + +// +// XCHLH Hot States ... +enum ENUM_X_XCHLH_HOT_STATES +{ + X_XCHLH_HOT_HH = 1, + X_XCHLH_NEUTURAL = 0, + X_XCHLH_HOT_LL = -1, +}; + +// +// XCHLH Buffer Lines ... +enum ENUM_X_XCHLH_BUFFER_LINES +{ + X_XCHLH_LC_HH_LINE = 0, + X_XCHLH_LC_LL_LINE = 1, + X_XCHLH_MC_HH_LINE = 2, + X_XCHLH_MC_LL_LINE = 3, + X_XCHLH_SC_HH_LINE = 4, + X_XCHLH_SC_LL_LINE = 5, + X_XCHLH_SIGNAL_T_LINE = 6, + X_XCHLH_SIGNAL_B_LINE = 7, + X_XCHLH_HOT_STATE_LINE = 8, +}; + +// +// END Enum Definitions ... +// + +// +// START Inputs ... +// + +// // +// input group "XCHLH Oscillator"; + +// // +// // Common ... +// input group "XCHLH Hot Areas"; +// input bool xCHLHDrawHotAreas = false; // Draw Hot Areas Symbol +// input uchar xCHLHHotHHArrowCode = 234; // Hot HH Arrow Code +// input color xCHLHHotHHArrowColor = clrAqua; // Hot HH Arrow Color +// input uchar xCHLHHotLLArrowCode = 233; // Hot LL Arrow Code +// input color xCHLHHotLLArrowColor = clrFuchsia; // Hot LL Arrow Color + +// // +// // LC Inputs ... +// input group "XCHLH Long Cycle"; +// input group "XCHLH LC Market"; +// input int xCHLHLcLength = 288; // Length +// input double xCHLHLcThresholdInPips = 0.3; // Threshold In Pips +// input ENUM_SERIESMODE xCHLHLcHHMode = MODE_HIGH; // Highest High Calculation Method +// input ENUM_SERIESMODE xCHLHLcLLMode = MODE_LOW; // Lowest Low Calculation Method +// input group "XCHLH LC Style"; +// input int xCHLHLcDrawWidth = 1; // Draw Width +// input ENUM_DRAW_TYPE xCHLHLcDrawType = DRAW_LINE; // Draw Type +// input ENUM_LINE_STYLE xCHLHLcDrawStyle = STYLE_DOT; // Draw Style +// input color xCHLHLcHHColor = clrAqua; // Highest High Color +// input color xCHLHLcLLColor = clrFuchsia; // Lowest Low Color +// input group "XCHLH LC Drawings"; +// input bool xCHLHLcDrawHH = true; // Draw Highest High +// input bool xCHLHLcDrawLL = true; // Draw Lowest Low + +// // +// // MC Inputs ... +// input group "XCHLH Medium Cycle"; +// input group "XCHLH MC Market"; +// input int xCHLHMcLength = 72; // Length +// input double xCHLHMcThresholdInPips = 0.3; // Threshold In Pips +// input ENUM_SERIESMODE xCHLHMcHHMode = MODE_HIGH; // Highest High Calculation Method +// input ENUM_SERIESMODE xCHLHMcLLMode = MODE_LOW; // Lowest Low Calculation Method +// input group "XCHLH MC Style"; +// input int xCHLHMcDrawWidth = 1; // Draw Width +// input ENUM_DRAW_TYPE xCHLHMcDrawType = DRAW_LINE; // Draw Type +// input ENUM_LINE_STYLE xCHLHMcDrawStyle = STYLE_DOT; // Draw Style +// input color xCHLHMcHHColor = clrLime; // Highest High Color +// input color xCHLHMcLLColor = clrRed; // Lowest Low Color +// input group "XCHLH MC Drawings"; +// input bool xCHLHMcDrawHH = true; // Draw Highest High +// input bool xCHLHMcDrawLL = true; // Draw Lowest Low + +// // +// // SC Inputs ... +// input group "XCHLH Short Cycle"; +// input group "XCHLH SC Market"; +// input int xCHLHScLength = 7; // Length +// input double xCHLHScThresholdInPips = 0.3; // Threshold In Pips +// input ENUM_SERIESMODE xCHLHScHHMode = MODE_HIGH; // Highest High Calculation Method +// input ENUM_SERIESMODE xCHLHScLLMode = MODE_LOW; // Lowest Low Calculation Method +// input group "XCHLH SC Style"; +// input int xCHLHScDrawWidth = 1; // Draw Width +// input ENUM_DRAW_TYPE xCHLHScDrawType = DRAW_LINE; // Draw Type +// input ENUM_LINE_STYLE xCHLHScDrawStyle = STYLE_DOT; // Draw Style +// input color xCHLHScHHColor = clrLightBlue; // Highest High Color +// input color xCHLHScLLColor = clrLightSalmon; // Lowest Low Color +// input group "XCHLH SC Drawings"; +// input bool xCHLHScDrawHH = true; // Draw Highest High +// input bool xCHLHScDrawLL = true; // Draw Lowest Low + +// +// Configurations ... +// +// Common ... +bool xCHLHDrawHotAreas = false; // Draw Hot Areas Symbol +uchar xCHLHHotHHArrowCode = 234; // Hot HH Arrow Code +color xCHLHHotHHArrowColor = clrAqua; // Hot HH Arrow Color +uchar xCHLHHotLLArrowCode = 233; // Hot LL Arrow Code +color xCHLHHotLLArrowColor = clrFuchsia; // Hot LL Arrow Color + +// +// LC Inputs ... +int xCHLHLcLength = 288; // Length +double xCHLHLcThresholdInPips = 0.3; // Threshold In Pips +ENUM_SERIESMODE xCHLHLcHHMode = MODE_HIGH; // Highest High Calculation Method +ENUM_SERIESMODE xCHLHLcLLMode = MODE_LOW; // Lowest Low Calculation Method +int xCHLHLcDrawWidth = 1; // Draw Width +ENUM_DRAW_TYPE xCHLHLcDrawType = DRAW_LINE; // Draw Type +ENUM_LINE_STYLE xCHLHLcDrawStyle = STYLE_DOT; // Draw Style +color xCHLHLcHHColor = clrAqua; // Highest High Color +color xCHLHLcLLColor = clrFuchsia; // Lowest Low Color +bool xCHLHLcDrawHH = true; // Draw Highest High +bool xCHLHLcDrawLL = true; // Draw Lowest Low + +// +// MC Inputs ... +int xCHLHMcLength = 72; // Length +double xCHLHMcThresholdInPips = 0.3; // Threshold In Pips +ENUM_SERIESMODE xCHLHMcHHMode = MODE_HIGH; // Highest High Calculation Method +ENUM_SERIESMODE xCHLHMcLLMode = MODE_LOW; // Lowest Low Calculation Method +int xCHLHMcDrawWidth = 1; // Draw Width +ENUM_DRAW_TYPE xCHLHMcDrawType = DRAW_LINE; // Draw Type +ENUM_LINE_STYLE xCHLHMcDrawStyle = STYLE_DOT; // Draw Style +color xCHLHMcHHColor = clrLime; // Highest High Color +color xCHLHMcLLColor = clrRed; // Lowest Low Color +bool xCHLHMcDrawHH = true; // Draw Highest High +bool xCHLHMcDrawLL = true; // Draw Lowest Low + +// +// SC Inputs ... +int xCHLHScLength = 7; // Length +double xCHLHScThresholdInPips = 0.3; // Threshold In Pips +ENUM_SERIESMODE xCHLHScHHMode = MODE_HIGH; // Highest High Calculation Method +ENUM_SERIESMODE xCHLHScLLMode = MODE_LOW; // Lowest Low Calculation Method +int xCHLHScDrawWidth = 1; // Draw Width +ENUM_DRAW_TYPE xCHLHScDrawType = DRAW_LINE; // Draw Type +ENUM_LINE_STYLE xCHLHScDrawStyle = STYLE_DOT; // Draw Style +color xCHLHScHHColor = clrLightBlue; // Highest High Color +color xCHLHScLLColor = clrLightSalmon; // Lowest Low Color +bool xCHLHScDrawHH = true; // Draw Highest High +bool xCHLHScDrawLL = true; // Draw Lowest Low + +// +// END Inputs ... +// + +// +// START Definitions ... +// + +int xCHLHHandler = INVALID_HANDLE; +double xCHLHLcHHBuffer[]; +double xCHLHLcLLBuffer[]; +double xCHLHMcHHBuffer[]; +double xCHLHMcLLBuffer[]; +double xCHLHScHHBuffer[]; +double xCHLHScLLBuffer[]; + +// +// END Definitions ... +// + +// +// START Handler Functions ... +// + +// +// Validate Inputs ... +bool XCHLHValidateInputs() +{ + // + bool result = false; + + // + result = + xCHLHScLength >= 2 && + xCHLHMcLength > xCHLHScLength && + xCHLHLcLength > xCHLHMcLength; + + // + if (!result) + { + // + LogMessage("XCHLH Oscillator Inputs Validation Failed ..."); + } + + // + return result; +} + +// +// Init Oscillators ... +bool XCHLHInitHandlers() +{ + // + bool result = false; + + // + // Initialize Indicator/Oscillator Handlers ... + ResetLastError(); + + // + // XCHLH Handler ... + ArraySetAsSeries(xCHLHLcHHBuffer, true); + ArraySetAsSeries(xCHLHLcLLBuffer, true); + ArraySetAsSeries(xCHLHMcHHBuffer, true); + ArraySetAsSeries(xCHLHMcLLBuffer, true); + ArraySetAsSeries(xCHLHScHHBuffer, true); + ArraySetAsSeries(xCHLHScLLBuffer, true); + xCHLHHandler = iCustom( + _Symbol, + _Period, + "x-saherelm.xchlh.oscillator", + // + // Inputs ... + // + // Commons ... + "", + xCHLHDrawHotAreas, + xCHLHHotHHArrowCode, + xCHLHHotHHArrowColor, + xCHLHHotLLArrowCode, + xCHLHHotLLArrowColor, + // + // LC ... + "", + "", + xCHLHLcLength, + xCHLHLcThresholdInPips, + xCHLHLcHHMode, + xCHLHLcLLMode, + "", + xCHLHLcDrawWidth, + xCHLHLcDrawType, + xCHLHLcDrawStyle, + xCHLHLcHHColor, + xCHLHLcLLColor, + "", + xCHLHLcDrawHH, + xCHLHLcDrawLL, + // + // MC ... + "", + "", + xCHLHMcLength, + xCHLHMcThresholdInPips, + xCHLHMcHHMode, + xCHLHMcLLMode, + "", + xCHLHMcDrawWidth, + xCHLHMcDrawType, + xCHLHMcDrawStyle, + xCHLHMcHHColor, + xCHLHMcLLColor, + "", + xCHLHMcDrawHH, + xCHLHMcDrawLL, + // + // SC ... + "", + "", + xCHLHScLength, + xCHLHScThresholdInPips, + xCHLHScHHMode, + xCHLHScLLMode, + "", + xCHLHScDrawWidth, + xCHLHScDrawType, + xCHLHScDrawStyle, + xCHLHScHHColor, + xCHLHScLLColor, + "", + xCHLHScDrawHH, + xCHLHScDrawLL); + if (xCHLHHandler == INVALID_HANDLE) + { + // + LogMessage("failed to Initialize XCHLH Indicator: " + (string)GetLastError()); + return result; + } + + // + result = true; + + // + return result; +} + +// +// Release Oscillators ... +void XCHLHReleaseHandlers() +{ + IndicatorRelease(xCHLHHandler); +} + +// +// Handle Reading Buffers ... +void XCHLHReadBuffers( + int xCHLHItemsPerTick // Number Of Reading Buffer Items Per Tick +) +{ + // + // XCHLH LC HH Buffer ... + CopyBuffer( + xCHLHHandler, + X_XCHLH_LC_HH_LINE, + 0, + xCHLHItemsPerTick, + xCHLHLcHHBuffer); + + // + // XCHLH LC LL Buffer ... + CopyBuffer( + xCHLHHandler, + X_XCHLH_LC_LL_LINE, + 0, + xCHLHItemsPerTick, + xCHLHLcLLBuffer); + + // + // XCHLH MC HH Buffer ... + CopyBuffer( + xCHLHHandler, + X_XCHLH_MC_HH_LINE, + 0, + xCHLHItemsPerTick, + xCHLHMcHHBuffer); + + // + // XCHLH MC LL Buffer ... + CopyBuffer( + xCHLHHandler, + X_XCHLH_MC_LL_LINE, + 0, + xCHLHItemsPerTick, + xCHLHMcLLBuffer); + + // + // XCHLH SC HH Buffer ... + CopyBuffer( + xCHLHHandler, + X_XCHLH_SC_HH_LINE, + 0, + xCHLHItemsPerTick, + xCHLHScHHBuffer); + + // + // XCHLH SC LL Buffer ... + CopyBuffer( + xCHLHHandler, + X_XCHLH_SC_LL_LINE, + 0, + xCHLHItemsPerTick, + xCHLHScLLBuffer); +} + +// +// END Handler Funcions ... +// + +// +// START XCHLH Custom Functions ... +// + +// +// Check LC and MC has Same HH ... +bool XCHLHIsLCMCHasSameHH( + int bar_index // Specified Bar Index ... +) +{ + // + bool result = false; + + // + // Validate Args ... + if (!XCHLHIsValidBufferSizes(bar_index + 1)) + { + return result; + } + + // + double lcValue = xCHLHLcHHBuffer[bar_index]; + double mcValue = xCHLHMcHHBuffer[bar_index]; + + // + result = lcValue == mcValue; + + // + return result; +} + +// +// Check LC and MC has Same LL ... +bool XCHLHIsLCMCHasSameLL( + int bar_index // Specified Bar Index ... +) +{ + // + bool result = false; + + // + // Validate Args ... + if (!XCHLHIsValidBufferSizes(bar_index + 1)) + { + return result; + } + + // + double lcValue = xCHLHLcLLBuffer[bar_index]; + double mcValue = xCHLHMcLLBuffer[bar_index]; + + // + result = lcValue == mcValue; + + // + return result; +} + +// +// Check LC and SC has Same HH ... +bool XCHLHIsLCSCHasSameHH( + int bar_index // Specified Bar Index ... +) +{ + // + bool result = false; + + // + // Validate Args ... + if (!XCHLHIsValidBufferSizes(bar_index + 1)) + { + return result; + } + + // + double lcValue = xCHLHLcHHBuffer[bar_index]; + double scValue = xCHLHScHHBuffer[bar_index]; + + // + result = lcValue == scValue; + + // + return result; +} + +// +// Check LC and SC has Same LL ... +bool XCHLHIsLCSCHasSameLL( + int bar_index // Specified Bar Index ... +) +{ + // + bool result = false; + + // + // Validate Args ... + if (!XCHLHIsValidBufferSizes(bar_index + 1)) + { + return result; + } + + // + double lcValue = xCHLHLcLLBuffer[bar_index]; + double scValue = xCHLHScLLBuffer[bar_index]; + + // + result = lcValue == scValue; + + // + return result; +} + +// +// Check MC and SC has Same HH ... +bool XCHLHIsMCSCHasSameHH( + int bar_index // Specified Bar Index ... +) +{ + // + bool result = false; + + // + // Validate Args ... + if (!XCHLHIsValidBufferSizes(bar_index + 1)) + { + return result; + } + + // + double mcValue = xCHLHMcHHBuffer[bar_index]; + double scValue = xCHLHScHHBuffer[bar_index]; + + // + result = mcValue == scValue; + + // + return result; +} + +// +// Check MC and SC has Same LL ... +bool XCHLHIsMCSCHasSameLL( + int bar_index // Specified Bar Index ... +) +{ + // + bool result = false; + + // + // Validate Args ... + if (!XCHLHIsValidBufferSizes(bar_index + 1)) + { + return result; + } + + // + double mcValue = xCHLHMcLLBuffer[bar_index]; + double scValue = xCHLHScLLBuffer[bar_index]; + + // + result = mcValue == scValue; + + // + return result; +} + +// +// Check Is Same Highest Highs ... +bool XCHLHIsSameHHs( + int bar_index // Specified Bar Index ... +) +{ + // + bool result = false; + + // + // Validate Args ... + if (!XCHLHIsValidBufferSizes(bar_index + 1)) + { + return result; + } + + // + double lcValue = xCHLHLcHHBuffer[bar_index]; + double mcValue = xCHLHMcHHBuffer[bar_index]; + double scValue = xCHLHScHHBuffer[bar_index]; + + // + result = + // + lcValue == mcValue && + mcValue == scValue + // + ; + + // + return result; +} + +// +// Check Is Same Lowest Lows ... +bool XCHLHIsSameLLs( + int bar_index // Specified Bar Index ... +) +{ + // + bool result = false; + + // + // Validate Args ... + if (!XCHLHIsValidBufferSizes(bar_index + 1)) + { + return result; + } + + // + double lcValue = xCHLHLcLLBuffer[bar_index]; + double mcValue = xCHLHMcLLBuffer[bar_index]; + double scValue = xCHLHScLLBuffer[bar_index]; + + // + result = + // + lcValue == mcValue && + mcValue == scValue + // + ; + + // + return result; +} + +// +// Check Medium Cycle is On Top of Long Cycle's Mid ... +bool XCHLHIsMCOnTopOfLC( + int bar_index // Specified Bar Index ... +) +{ + // + bool result = false; + + // + // Validate Args ... + if ( + bar_index < 0 || + !XCHLHIsValidBufferSizes(bar_index + 1)) + { + return result; + } + + // + ENUM_X_XCHLH_CYCLES sCycle = X_XCHLH_CYCLE_MEDIUM; + ENUM_X_XCHLH_CYCLES dCycle = X_XCHLH_CYCLE_LONG; + + // + result = + // + XCHLHCheckCycleIsOnTopOfAnother( + bar_index, + sCycle, + dCycle) + // + ; + + // + return result; +} + +// +// Check Medium Cycle is In Bottom of Long Cycle's Mid ... +bool XCHLHIsMCInBottomOfLC( + int bar_index // Specified Bar Index ... +) +{ + // + bool result = false; + + // + // Validate Args ... + if ( + bar_index < 0 || + !XCHLHIsValidBufferSizes(bar_index + 1)) + { + return result; + } + + // + ENUM_X_XCHLH_CYCLES sCycle = X_XCHLH_CYCLE_MEDIUM; + ENUM_X_XCHLH_CYCLES dCycle = X_XCHLH_CYCLE_LONG; + + // + result = + // + XCHLHCheckCycleIsInBottomOfAnother( + bar_index, + sCycle, + dCycle) + // + ; + + // + return result; +} + +// +// Check and Validate Buffer Sizes ... +bool XCHLHIsValidBufferSizes( + int size // Specified Min Size +) +{ + // + bool result = false; + + // + result = + // + ArraySize(xCHLHLcHHBuffer) > size && + ArraySize(xCHLHLcLLBuffer) > size && + // + ArraySize(xCHLHMcHHBuffer) > size && + ArraySize(xCHLHMcLLBuffer) > size && + // + ArraySize(xCHLHScHHBuffer) > size && + ArraySize(xCHLHScLLBuffer) > size; + + // + return result; +} + +// +// Get Cycle Middle Value ... +double XCHLHGetCycleMid( + int bar_index, // Specified Bar Index ... + ENUM_X_XCHLH_CYCLES cycle // Specified Cycle ... +) +{ + // + double result = 0; + + // + // Validate Args ... + if ( + bar_index < 0 || + !XCHLHIsValidBufferSizes(bar_index + 1)) + { + return result; + } + + // + // Retrieve Cycle Max Value ... + double iMax = XCHLHGetCycleMax( + bar_index, + cycle); + + // + // Retrieve Cycle Min Value ... + double iMin = XCHLHGetCycleMin( + bar_index, + cycle); + + // + result = (iMax - iMin) / 2; + + // + return result; +} + +// +// Get Cycle Max Value ... +double XCHLHGetCycleMax( + int bar_index, // Specified Bar Index ... + ENUM_X_XCHLH_CYCLES cycle // Specified Cycle ... +) +{ + // + double result = 0; + + // + // Validate Args ... + if ( + bar_index < 0 || + !XCHLHIsValidBufferSizes(bar_index + 1)) + { + return result; + } + + // + switch (cycle) + { + // + // Long Cycle ... + case X_XCHLH_CYCLE_LONG: + result = xCHLHLcHHBuffer[1]; + break; + + // + // Medium Cycle ... + case X_XCHLH_CYCLE_MEDIUM: + result = xCHLHMcHHBuffer[1]; + break; + + // + // Short Cycle ... + case X_XCHLH_CYCLE_SHORT: + result = xCHLHScHHBuffer[1]; + break; + } + + // + return result; +} + +// +// Get Specified Cycles Max Value ... +double XCHLHGetCyclesMax( + int bar_index, // Specified Bar Index ... + ENUM_X_XCHLH_CYCLES &cycles[] // Specified Cycle ... +) +{ + // + bool result = 0; + + // + // Validate Args ... + if ( + bar_index < 0 || + ArraySize(cycles) <= 0 || + !XCHLHIsValidBufferSizes(bar_index + 1)) + { + return result; + } + + // + // Loop Through Cycles ... + for (int i = 0; i < ArraySize(cycles); i++) + { + // + ENUM_X_XCHLH_CYCLES iCycle = cycles[i]; + + // + double iValue = XCHLHGetCycleMax( + bar_index, + iCycle); + + // + result = result == 0 || result < iValue ? iValue : result; + } + + // + return result; +} + +// +// Get Cycle Min Value ... +double XCHLHGetCycleMin( + int bar_index, // Specified Bar Index ... + ENUM_X_XCHLH_CYCLES cycle // Specified Cycle ... +) +{ + // + double result = 0; + + // + // Validate Args ... + if ( + bar_index < 0 || + !XCHLHIsValidBufferSizes(bar_index + 1)) + { + return result; + } + + // + switch (cycle) + { + // + // Long Cycle ... + case X_XCHLH_CYCLE_LONG: + result = xCHLHLcLLBuffer[1]; + break; + + // + // Medium Cycle ... + case X_XCHLH_CYCLE_MEDIUM: + result = xCHLHMcLLBuffer[1]; + break; + + // + // Short Cycle ... + case X_XCHLH_CYCLE_SHORT: + result = xCHLHScLLBuffer[1]; + break; + } + + // + return result; +} + +// +// Get Specified Cycles Min Value ... +double XCHLHGetCyclesMin( + int bar_index, // Specified Bar Index ... + ENUM_X_XCHLH_CYCLES &cycles[] // Specified Cycle ... +) +{ + // + bool result = 0; + + // + // Validate Args ... + if ( + bar_index < 0 || + ArraySize(cycles) <= 0 || + !XCHLHIsValidBufferSizes(bar_index + 1)) + { + return result; + } + + // + // Loop Through Cycles ... + for (int i = 0; i < ArraySize(cycles); i++) + { + // + ENUM_X_XCHLH_CYCLES iCycle = cycles[i]; + + // + double iValue = XCHLHGetCycleMin( + bar_index, + iCycle); + + // + result = result == 0 || result > iValue ? iValue : result; + } + + // + return result; +} + +// +// Check a Cycle is On Top of Another Cycle's Mid ... +bool XCHLHCheckCycleIsOnTopOfAnother( + int bar_index, // Specified Bar Index ... + ENUM_X_XCHLH_CYCLES sourceCycle, // Specified Source Cycle which Checks ... + ENUM_X_XCHLH_CYCLES destCycle // Specified Dest Cycle which source Checked based on it ... +) +{ + // + bool result = false; + + // + // Validate Args ... + if ( + bar_index < 0 || + !XCHLHIsValidBufferSizes(bar_index + 1)) + { + return result; + } + + // + // Retrieve Min Value of Source Cycle ... + double iMin = XCHLHGetCycleMin( + bar_index, + sourceCycle); + + // + // Retrieve Mid Value of Dest Cycle ... + double iMid = XCHLHGetCycleMid( + bar_index, + destCycle); + + // + // Generate Result ... + result = + // + iMin >= iMid + // + ; + + // + return result; +} + +// +// Check a Cycle is Under Bottom of Another Cycle's Mid ... +bool XCHLHCheckCycleIsInBottomOfAnother( + int bar_index, // Specified Bar Index ... + ENUM_X_XCHLH_CYCLES sourceCycle, // Specified Source Cycle which Checks ... + ENUM_X_XCHLH_CYCLES destCycle // Specified Dest Cycle which source Checked based on it ... +) +{ + // + bool result = false; + + // + // Validate Args ... + if ( + bar_index < 0 || + !XCHLHIsValidBufferSizes(bar_index + 1)) + { + return result; + } + + // + // Retrieve Max Value of Source Cycle ... + double iMax = XCHLHGetCycleMax( + bar_index, + sourceCycle); + + // + // Retrieve Mid Value of Dest Cycle ... + double iMid = XCHLHGetCycleMid( + bar_index, + destCycle); + + // + // Generate Result ... + result = + // + iMax <= iMid + // + ; + + // + return result; +} + +// +// END XCHLH Custom Functions ... +// diff --git a/BKPS/OLD/XEU5/Helpers/x-saherelm.xchma.oscillator.helper.lib.mq5 b/BKPS/OLD/XEU5/Helpers/x-saherelm.xchma.oscillator.helper.lib.mq5 new file mode 100644 index 0000000..e84d762 --- /dev/null +++ b/BKPS/OLD/XEU5/Helpers/x-saherelm.xchma.oscillator.helper.lib.mq5 @@ -0,0 +1,2229 @@ +///////////////////////////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 XCHMA Oscillator Helper for Signal Providers +// -------------------------------------------------------------------------- +// +// 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 + +// +// Includes ... +#include "../Libraries/x-saherelm.log.lib.mq5" +#include "../Libraries/x-saherelm.common.lib.mq5" + +// +// START Enum Definitions ... +// + +// +// XCHMA Cycles ... +enum ENUM_XCHMA_CYCLES +{ + X_XCHMA_CYCLE_LONG, + X_XCHMA_CYCLE_MEDIUM, + X_XCHMA_CYCLE_SHORT, +}; + +// +// XCHMA Oscillator Hot State Presentation ... +enum ENUM_XCHMA_HOT_STATES +{ + X_XCHMA_HOT_BULLISH = 1, + X_XCHMA_HOT_NEUTURAL = 0, + X_XCHMA_HOT_BEARISH = -1, +}; + +// +// XCHMA Oscillator Cycles State Presentation ... +enum ENUM_XCHMA_CYCLE_STATES +{ + X_XCHMA_FAST_CROSSED_OVER_SLOW = 2, + X_XCHMA_FAST_OVER_SLOW = 1, + X_XCHMA_NEUTURAL = 0, + X_XCHMA_FAST_UNDER_SLOW = -1, + X_XCHMA_FAST_CROSSED_UNDER_SLOW = -2, +}; + +// +// XCHMA Oscillator Buffer Lines ... +enum ENUM_X_XCHMA_BUFFER_LINES +{ + X_XCHMA_LC_FAST_LINE = 0, + X_XCHMA_LC_SLOW_LINE = 1, + X_XCHMA_LC_STATE_LINE = 6, + X_XCHMA_MC_FAST_LINE = 2, + X_XCHMA_MC_SLOW_LINE = 3, + X_XCHMA_MC_STATE_LINE = 7, + X_XCHMA_SC_FAST_LINE = 4, + X_XCHMA_SC_SLOW_LINE = 5, + X_XCHMA_SC_STATE_LINE = 8, + X_XCHMA_HOT_STATE_LINE = 9, +}; + +// +// END Enum Definitions ... +// + +// +// START Inputs ... +// + +// input group "XCHMA Oscillator"; + +// // +// // Commons ... +// input group "XCHMA Hot Areas"; +// input bool xCHMADrawHotAreas = false; // Draw Hot Areas Symbol; +// input uchar xCHMAHotBullishArrowCode = 228; // Hot Bullish Arrow Code; +// input color xCHMAHotBullishArrowColor = clrAqua; // Hot Bullish Arrow Color; +// input uchar xCHMAHotBearishArrowCode = 230; // Hot Bearish Arrow Code; +// input color xCHMAHotBearishArrowColor = clrFuchsia; // Hot Bearish Arrow Color; + +// // +// // LC Inputs ... +// input group "XCHMA Long Cycle"; +// input group "XCHMA LC Market"; +// input int xCHMALcFastLength = 288; // Fast Length +// input int xCHMALcSlowLength = 576; // Slow Length +// input ENUM_MA_METHOD xCHMALcMethod = MODE_EMA; // Calculation Method +// input ENUM_APPLIED_PRICE xCHMALcAppliedTo = PRICE_CLOSE; // Applied To +// input group "XCHMA LC Style"; +// input int xCHMALcDrawWidth = 1; // Draw Width +// input ENUM_DRAW_TYPE xCHMALcDrawType = DRAW_LINE; // Draw Type +// input ENUM_LINE_STYLE xCHMALcDrawStyle = STYLE_DOT; // Draw Style +// input color xCHMALcFastColor = clrAqua; // Fast Color +// input color xCHMALcSlowColor = clrFuchsia; // Slow Color +// input group "XCHMA LC Drawings"; +// input bool xCHMALcDrawFast = true; // Draw Fast +// input bool xCHMALcDrawSlow = true; // Draw Slow +// input bool xCHMALcDrawCrosses = false; // Draw Cross Lines + +// // +// // MC Inputs ... +// input group "XCHMA Medium Cycle"; +// input group "XCHMA MC Market"; +// input int xCHMAMcFastLength = 72; // Fast Length +// input int xCHMAMcSlowLength = 144; // Slow Length +// input ENUM_MA_METHOD xCHMAMcMethod = MODE_EMA; // Calculation Method +// input ENUM_APPLIED_PRICE xCHMAMcAppliedTo = PRICE_CLOSE; // Applied To +// input group "XCHMA MC Style"; +// input int xCHMAMcDrawWidth = 1; // Draw Width +// input ENUM_DRAW_TYPE xCHMAMcDrawType = DRAW_LINE; // Draw Type +// input ENUM_LINE_STYLE xCHMAMcDrawStyle = STYLE_DOT; // Draw Style +// input color xCHMAMcFastColor = clrLime; // Fast Color +// input color xCHMAMcSlowColor = clrRed; // Slow Color +// input group "XCHMA MC Drawings"; +// input bool xCHMAMcDrawFast = true; // Draw Fast +// input bool xCHMAMcDrawSlow = true; // Draw Slow +// input bool xCHMAMcDrawCrosses = false; // Draw Cross Lines + +// // +// // SC Inputs ... +// input group "XCHMA Short Cycle"; +// input group "XCHMA SC Market"; +// input int xCHMAScFastLength = 7; // Fast Length +// input int xCHMAScSlowLength = 14; // Slow Length +// input ENUM_MA_METHOD xCHMAScMethod = MODE_SMA; // Calculation Method +// input ENUM_APPLIED_PRICE xCHMAScAppliedTo = PRICE_CLOSE; // Applied To +// input group "XCHMA SC Style"; +// input int xCHMAScDrawWidth = 1; // Draw Width +// input ENUM_DRAW_TYPE xCHMAScDrawType = DRAW_LINE; // Draw Type +// input ENUM_LINE_STYLE xCHMAScDrawStyle = STYLE_SOLID; // Draw Style +// input color xCHMAScFastColor = clrLightBlue; // Fast Color +// input color xCHMAScSlowColor = clrLightSalmon; // Slow Color +// input group "XCHMA SC Drawings"; +// input bool xCHMAScDrawFast = true; // Draw Fast +// input bool xCHMAScDrawSlow = true; // Draw Slow +// input bool xCHMAScDrawCrosses = false; // Draw Cross Lines + +// +// Configurations ... +// +// Commons ... +bool xCHMADrawHotAreas = false; // Draw Hot Areas Symbol; +uchar xCHMAHotBullishArrowCode = 228; // Hot Bullish Arrow Code; +color xCHMAHotBullishArrowColor = clrAqua; // Hot Bullish Arrow Color; +uchar xCHMAHotBearishArrowCode = 230; // Hot Bearish Arrow Code; +color xCHMAHotBearishArrowColor = clrFuchsia; // Hot Bearish Arrow Color; + +// +// LC Inputs ... +int xCHMALcFastLength = 288; // Fast Length +int xCHMALcSlowLength = 576; // Slow Length +ENUM_MA_METHOD xCHMALcMethod = MODE_EMA; // Calculation Method +ENUM_APPLIED_PRICE xCHMALcAppliedTo = PRICE_CLOSE; // Applied To +int xCHMALcDrawWidth = 1; // Draw Width +ENUM_DRAW_TYPE xCHMALcDrawType = DRAW_LINE; // Draw Type +ENUM_LINE_STYLE xCHMALcDrawStyle = STYLE_DOT; // Draw Style +color xCHMALcFastColor = clrAqua; // Fast Color +color xCHMALcSlowColor = clrFuchsia; // Slow Color +bool xCHMALcDrawFast = true; // Draw Fast +bool xCHMALcDrawSlow = true; // Draw Slow +bool xCHMALcDrawCrosses = false; // Draw Cross Lines + +// +// MC Inputs ... +int xCHMAMcFastLength = 72; // Fast Length +int xCHMAMcSlowLength = 144; // Slow Length +ENUM_MA_METHOD xCHMAMcMethod = MODE_EMA; // Calculation Method +ENUM_APPLIED_PRICE xCHMAMcAppliedTo = PRICE_CLOSE; // Applied To +int xCHMAMcDrawWidth = 1; // Draw Width +ENUM_DRAW_TYPE xCHMAMcDrawType = DRAW_LINE; // Draw Type +ENUM_LINE_STYLE xCHMAMcDrawStyle = STYLE_DOT; // Draw Style +color xCHMAMcFastColor = clrLime; // Fast Color +color xCHMAMcSlowColor = clrRed; // Slow Color +bool xCHMAMcDrawFast = true; // Draw Fast +bool xCHMAMcDrawSlow = true; // Draw Slow +bool xCHMAMcDrawCrosses = false; // Draw Cross Lines + +// +// SC Inputs ... +int xCHMAScFastLength = 7; // Fast Length +int xCHMAScSlowLength = 14; // Slow Length +ENUM_MA_METHOD xCHMAScMethod = MODE_SMA; // Calculation Method +ENUM_APPLIED_PRICE xCHMAScAppliedTo = PRICE_CLOSE; // Applied To +int xCHMAScDrawWidth = 1; // Draw Width +ENUM_DRAW_TYPE xCHMAScDrawType = DRAW_LINE; // Draw Type +ENUM_LINE_STYLE xCHMAScDrawStyle = STYLE_SOLID; // Draw Style +color xCHMAScFastColor = clrLightBlue; // Fast Color +color xCHMAScSlowColor = clrLightSalmon; // Slow Color +bool xCHMAScDrawFast = true; // Draw Fast +bool xCHMAScDrawSlow = true; // Draw Slow +bool xCHMAScDrawCrosses = false; // Draw Cross Lines + +// +// END Inputs ... +// + +// +// START Definitions ... +// + +int xCHMAHandler = INVALID_HANDLE; +double xCHMALcFastBuffer[]; +double xCHMALcSlowBuffer[]; +double xCHMAMcFastBuffer[]; +double xCHMAMcSlowBuffer[]; +double xCHMAScFastBuffer[]; +double xCHMAScSlowBuffer[]; + +// +// END Definitions ... +// + +// +// START Handler Functions ... +// + +// +// Validate Inputs ... +bool XCHMAValidateInputs() +{ + // + bool result = false; + + // + result = + xCHMAScFastLength >= 2 && + xCHMAScSlowLength > xCHMAScFastLength && + xCHMAMcFastLength > xCHMAScSlowLength && + xCHMAMcSlowLength > xCHMAMcFastLength && + xCHMALcFastLength > xCHMAMcSlowLength && + xCHMALcSlowLength > xCHMALcFastLength; + + // + if (!result) + { + // + LogMessage("XCHMA Oscillator Inputs Validation Failed ..."); + } + + // + return result; +} + +// +// Init Oscillators ... +bool XCHMAInitHandlers() +{ + // + bool result = false; + + // + // Initialize Indicator/Oscillator Handlers ... + ResetLastError(); + + // + // XCHMA Handler ... + ArraySetAsSeries(xCHMALcFastBuffer, true); + ArraySetAsSeries(xCHMALcSlowBuffer, true); + ArraySetAsSeries(xCHMAMcFastBuffer, true); + ArraySetAsSeries(xCHMAMcSlowBuffer, true); + ArraySetAsSeries(xCHMAScFastBuffer, true); + ArraySetAsSeries(xCHMAScSlowBuffer, true); + xCHMAHandler = iCustom( + _Symbol, + _Period, + "x-saherelm.xchma.oscillator", + // + // Inputs ... + "", + xCHMADrawHotAreas, + xCHMAHotBullishArrowCode, + xCHMAHotBullishArrowColor, + xCHMAHotBearishArrowCode, + xCHMAHotBearishArrowColor, + // + // Long Cycle ... + "", + "", + xCHMALcFastLength, + xCHMALcSlowLength, + xCHMALcMethod, + xCHMALcAppliedTo, + "", + xCHMALcDrawWidth, + xCHMALcDrawType, + xCHMALcDrawStyle, + xCHMALcFastColor, + xCHMALcSlowColor, + "", + xCHMALcDrawFast, + xCHMALcDrawSlow, + xCHMALcDrawCrosses, + // + // Medium Cycle ... + "", + "", + xCHMAMcFastLength, + xCHMAMcSlowLength, + xCHMAMcMethod, + xCHMAMcAppliedTo, + "", + xCHMAMcDrawWidth, + xCHMAMcDrawType, + xCHMAMcDrawStyle, + xCHMAMcFastColor, + xCHMAMcSlowColor, + "", + xCHMAMcDrawFast, + xCHMAMcDrawSlow, + xCHMAMcDrawCrosses, + // + // Short Cycle ... + "", + "", + xCHMAScFastLength, + xCHMAScSlowLength, + xCHMAScMethod, + xCHMAScAppliedTo, + "", + xCHMAScDrawWidth, + xCHMAScDrawType, + xCHMAScDrawStyle, + xCHMAScFastColor, + xCHMAScSlowColor, + "", + xCHMAScDrawFast, + xCHMAScDrawSlow, + xCHMAScDrawCrosses); + if (xCHMAHandler == INVALID_HANDLE) + { + // + LogMessage("failed to Initialize XCHMA Oscillator: " + (string)GetLastError()); + return result; + } + + // + result = true; + + // + return result; +} + +// +// Release Oscillators ... +void XCHMAReleaseHandlers() +{ + IndicatorRelease(xCHMAHandler); +} + +// +// Handle Reading Buffers ... +void XCHMAReadBuffers( + int xCHMAItemsPerTick // Number Of Reading Buffer Items Per Tick +) +{ + // + // XCHMA Long Cycle ... + // + // XCHMA Fast ... + CopyBuffer( + xCHMAHandler, + X_XCHMA_LC_FAST_LINE, + 0, + xCHMAItemsPerTick, + xCHMALcFastBuffer); + + // + // XCHMA Slow ... + CopyBuffer( + xCHMAHandler, + X_XCHMA_LC_SLOW_LINE, + 0, + xCHMAItemsPerTick, + xCHMALcSlowBuffer); + + // + // XCHMA Medium Cycle ... + // + // XCHMA Fast ... + CopyBuffer( + xCHMAHandler, + X_XCHMA_MC_FAST_LINE, + 0, + xCHMAItemsPerTick, + xCHMAMcFastBuffer); + + // + // XCHMA Slow ... + CopyBuffer( + xCHMAHandler, + X_XCHMA_MC_SLOW_LINE, + 0, + xCHMAItemsPerTick, + xCHMAMcSlowBuffer); + + // + // XCHMA Short Cycle ... + // + // XCHMA Fast ... + CopyBuffer( + xCHMAHandler, + X_XCHMA_SC_FAST_LINE, + 0, + xCHMAItemsPerTick, + xCHMAScFastBuffer); + + // + // XCHMA Slow ... + CopyBuffer( + xCHMAHandler, + X_XCHMA_SC_SLOW_LINE, + 0, + xCHMAItemsPerTick, + xCHMAScSlowBuffer); +} + +// +// END Handler Funcions ... +// + +// +// START XCHMA Custom Functions ... +// + +// +// Retrieve Max Cycles Value ... +double XCHMAGetMax( + int bar_index // Specified Index ... +) +{ + // + double result = 0; + + // + // Validate Args ... + if (!XCHMAIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + // SC Fast ... + result = MathMax( + result, + xCHMAScFastBuffer[bar_index]); + + // + // SC Slow ... + result = MathMax( + result, + xCHMAScSlowBuffer[bar_index]); + + // + // MC Fast ... + result = MathMax( + result, + xCHMAMcFastBuffer[bar_index]); + + // + // MC Slow ... + result = MathMax( + result, + xCHMAMcSlowBuffer[bar_index]); + + // + // LC Fast ... + result = MathMax( + result, + xCHMALcFastBuffer[bar_index]); + + // + // LC Slow ... + result = MathMax( + result, + xCHMALcSlowBuffer[bar_index]); + + // + return result; +} + +// +// Retrieve Max Cycles Value ... +double XCHMAGetMin( + int bar_index // Specified Index ... +) +{ + // + double result = 0; + + // + // Validate Args ... + if (!XCHMAIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + result = xCHMAScFastBuffer[bar_index]; + + // + // SC Fast ... + result = MathMin( + result, + xCHMAScFastBuffer[bar_index]); + + // + // SC Slow ... + result = MathMin( + result, + xCHMAScSlowBuffer[bar_index]); + + // + // MC Fast ... + result = MathMin( + result, + xCHMAMcFastBuffer[bar_index]); + + // + // MC Slow ... + result = MathMin( + result, + xCHMAMcSlowBuffer[bar_index]); + + // + // LC Fast ... + result = MathMin( + result, + xCHMALcFastBuffer[bar_index]); + + // + // LC Slow ... + result = MathMin( + result, + xCHMALcSlowBuffer[bar_index]); + + // + return result; +} + +// +// Short Cycle Over Max Of Cycle Channels ... +bool XCHMAIsSCOverMax( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + // Validate Args ... + if ( + bar_index < 0 || + !XCHMAIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + double shortCycleMax1 = XCHMAGetCycleMaxValue( + bar_index, + X_XCHMA_CYCLE_SHORT); + + // + ENUM_XCHMA_CYCLES cycles[]; + Add( + X_XCHMA_CYCLE_MEDIUM, + cycles); + Add( + X_XCHMA_CYCLE_LONG, + cycles); + + // + double nonOfShortCycleMax1 = XCHMAGetCyclesMaxValue( + bar_index, + cycles); + + // + // Calculate Result ... + result = + // + shortCycleMax1 > nonOfShortCycleMax1 + // + ; + + // + return result; +} + +// +// Short Cycle Under Max Of Cycle Channels ... +bool XCHMAIsSCUnderMax( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + // Validate Args ... + if ( + bar_index < 0 || + !XCHMAIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + double shortCycleMin1 = XCHMAGetCycleMinValue( + bar_index, + X_XCHMA_CYCLE_SHORT); + + // + ENUM_XCHMA_CYCLES cycles[]; + Add( + X_XCHMA_CYCLE_MEDIUM, + cycles); + Add( + X_XCHMA_CYCLE_LONG, + cycles); + + // + double nonOfShortCycleMax1 = XCHMAGetCyclesMaxValue( + bar_index, + cycles); + + // + // Calculate Result ... + result = + // + shortCycleMin1 < nonOfShortCycleMax1 + // + ; + + // + return result; +} + +// +// Short Cycle Over Min Of Cycle Channels ... +bool XCHMAIsSCOverMin( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + // Validate Args ... + if ( + bar_index < 0 || + !XCHMAIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + double shortCycleMax1 = XCHMAGetCycleMaxValue( + bar_index, + X_XCHMA_CYCLE_SHORT); + + // + ENUM_XCHMA_CYCLES cycles[]; + Add( + X_XCHMA_CYCLE_MEDIUM, + cycles); + Add( + X_XCHMA_CYCLE_LONG, + cycles); + + // + double nonOfShortCycleMin1 = XCHMAGetCyclesMinValue( + bar_index, + cycles); + + // + // Calculate Result ... + result = + // + shortCycleMax1 > nonOfShortCycleMin1 + // + ; + + // + return result; +} + +// +// Short Cycle Under Min Of Cycle Channels ... +bool XCHMAIsSCUnderMin( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + // Validate Args ... + if ( + bar_index < 0 || + !XCHMAIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + double shortCycleMin1 = XCHMAGetCycleMinValue( + bar_index, + X_XCHMA_CYCLE_SHORT); + + // + ENUM_XCHMA_CYCLES cycles[]; + Add( + X_XCHMA_CYCLE_MEDIUM, + cycles); + Add( + X_XCHMA_CYCLE_LONG, + cycles); + + // + double nonOfShortCycleMin1 = XCHMAGetCyclesMinValue( + bar_index, + cycles); + + // + // Calculate Result ... + result = + // + shortCycleMin1 < nonOfShortCycleMin1 + // + ; + + // + return result; +} + +// +// Short Cycle Crossed Over Max Of Cycle Channels ... +bool XCHMAIsSCCrossedOverMax( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + // Validate Args ... + if ( + bar_index < 0 || + !XCHMAIsValidBuffersSize(bar_index + 2)) + { + return result; + } + + // + double shortCycleMin1 = XCHMAGetCycleMinValue( + bar_index, + X_XCHMA_CYCLE_SHORT); + double shortCycleMin2 = XCHMAGetCycleMinValue( + bar_index + 1, + X_XCHMA_CYCLE_SHORT); + + // + ENUM_XCHMA_CYCLES cycles[]; + Add( + X_XCHMA_CYCLE_MEDIUM, + cycles); + Add( + X_XCHMA_CYCLE_LONG, + cycles); + + // + double nonOfShortCycleMax1 = XCHMAGetCyclesMaxValue( + bar_index, + cycles); + double nonOfShortCycleMax2 = XCHMAGetCyclesMaxValue( + bar_index + 1, + cycles); + + // + // Calculate Result ... + result = + // + shortCycleMin1 > nonOfShortCycleMax1 && + shortCycleMin2 <= nonOfShortCycleMax2 + // + ; + + // + return result; +} + +// +// Short Cycle Crossed Under Max Of Cycle Channels ... +bool XCHMAIsSCCrossedUnderMax( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + // Validate Args ... + if ( + bar_index < 0 || + !XCHMAIsValidBuffersSize(bar_index + 2)) + { + return result; + } + + // + double shortCycleMax1 = XCHMAGetCycleMaxValue( + bar_index, + X_XCHMA_CYCLE_SHORT); + double shortCycleMax2 = XCHMAGetCycleMaxValue( + bar_index + 1, + X_XCHMA_CYCLE_SHORT); + + // + ENUM_XCHMA_CYCLES cycles[]; + Add( + X_XCHMA_CYCLE_MEDIUM, + cycles); + Add( + X_XCHMA_CYCLE_LONG, + cycles); + + // + double nonOfShortCycleMax1 = XCHMAGetCyclesMaxValue( + bar_index, + cycles); + double nonOfShortCycleMax2 = XCHMAGetCyclesMaxValue( + bar_index + 1, + cycles); + + // + // Calculate Result ... + result = + // + shortCycleMax1 < nonOfShortCycleMax1 && + shortCycleMax2 >= nonOfShortCycleMax2 + // + ; + + // + return result; +} + +// +// Short Cycle Crossed Over Min Of Cycle Channels ... +bool XCHMAIsSCCrossedOverMin( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + // Validate Args ... + if ( + bar_index < 0 || + !XCHMAIsValidBuffersSize(bar_index + 2)) + { + return result; + } + + // + double shortCycleMin1 = XCHMAGetCycleMinValue( + bar_index, + X_XCHMA_CYCLE_SHORT); + double shortCycleMin2 = XCHMAGetCycleMinValue( + bar_index + 1, + X_XCHMA_CYCLE_SHORT); + + // + ENUM_XCHMA_CYCLES cycles[]; + Add( + X_XCHMA_CYCLE_MEDIUM, + cycles); + Add( + X_XCHMA_CYCLE_LONG, + cycles); + + // + double nonOfShortCycleMin1 = XCHMAGetCyclesMinValue( + bar_index, + cycles); + double nonOfShortCycleMin2 = XCHMAGetCyclesMinValue( + bar_index + 1, + cycles); + + // + // Calculate Result ... + result = + // + shortCycleMin1 > nonOfShortCycleMin1 && + shortCycleMin2 <= nonOfShortCycleMin2 + // + ; + + // + return result; +} + +// +// Short Cycle Crossed Under Min Of Cycle Channels ... +bool XCHMAIsSCCrossedUnderMin( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + // Validate Args ... + if ( + bar_index < 0 || + !XCHMAIsValidBuffersSize(bar_index + 2)) + { + return result; + } + + // + double shortCycleMax1 = XCHMAGetCycleMaxValue( + bar_index, + X_XCHMA_CYCLE_SHORT); + double shortCycleMax2 = XCHMAGetCycleMaxValue( + bar_index + 1, + X_XCHMA_CYCLE_SHORT); + + // + ENUM_XCHMA_CYCLES cycles[]; + Add( + X_XCHMA_CYCLE_MEDIUM, + cycles); + Add( + X_XCHMA_CYCLE_LONG, + cycles); + + // + double nonOfShortCycleMin1 = XCHMAGetCyclesMinValue( + bar_index, + cycles); + double nonOfShortCycleMin2 = XCHMAGetCyclesMinValue( + bar_index + 1, + cycles); + + // + // Calculate Result ... + result = + // + shortCycleMax1 < nonOfShortCycleMin1 && + shortCycleMax2 >= nonOfShortCycleMin2 + // + ; + + // + return result; +} + +// +// Long Cycle ... +// + +// +// Check LC is Peak ... +bool XCHMAIsLCPeak( + int bar_index, // Specified Index ... + int length = 10 // Specified Length ... +) +{ + // + bool result = false; + + // + if ( + length <= 0 || + bar_index <= 0 || + !XCHMAIsValidBuffersSize(bar_index + length + 1)) + { + return result; + } + + // + result = IsIncreasing( + bar_index + length, + bar_index, + xCHMALcSlowBuffer + // + ); + + // + return result; +} + +// +// Check LC is Vale ... +bool XCHMAIsLCVale( + int bar_index, // Specified Index ... + int length = 10 // Specified Length ... +) +{ + // + bool result = false; + + // + if ( + length <= 0 || + bar_index <= 0 || + !XCHMAIsValidBuffersSize(bar_index + length + 1)) + { + return result; + } + + // + result = IsDecreasing( + bar_index + length, + bar_index, + xCHMALcSlowBuffer + // + ); + + // + return result; +} + +// +// Check LC Fast Crossed Over Slow ... +bool XCHMAIsLCFastCrossedOverSlow( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XCHMAIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + result = IsCrossOver( + xCHMALcFastBuffer, + xCHMALcSlowBuffer, + bar_index); + + // + return result; +} + +// +// Check LC Fast Over Slow ... +bool XCHMAIsLCFastOverSlow( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XCHMAIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + result = IsOver( + xCHMALcFastBuffer, + xCHMALcSlowBuffer, + bar_index); + + // + return result; +} + +// +// Check LC Fast Crossed Under Slow ... +bool XCHMAIsLCFastCrossedUnderSlow( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XCHMAIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + result = IsCrossUnder( + xCHMALcFastBuffer, + xCHMALcSlowBuffer, + bar_index); + + // + return result; +} + +// +// Check LC Fast Under Slow ... +bool XCHMAIsLCFastUnderSlow( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XCHMAIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + result = IsUnder( + xCHMALcFastBuffer, + xCHMALcSlowBuffer, + bar_index); + + // + return result; +} + +// +// Get Trend Power ... +double XCHMAGetLCTrendPower( + int bar_index // Specified Index ... +) +{ + // + double result = 0; + + // + if ( + bar_index <= 0 || + !XCHMAIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + result = + // + MathAbs(xCHMALcFastBuffer[bar_index] - xCHMALcSlowBuffer[bar_index]) + // + ; + + // + return result; +} + +// +// Check XTM TrendsDown or Up ... +bool XCHMAIsLCTrendsUp( + int bar_index, // Specified Index ... + int length = 10 // Specified Length ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XCHMAIsValidBuffersSize(bar_index + length + 2)) + { + return result; + } + + // + double trend1 = XCHMAGetLCTrendPower(bar_index); + + // + int trendsUpCount = 0; + int trendsDownCount = 0; + for (int i = bar_index + 1; i < bar_index + length + 1; i++) + { + // + double iPrevTrend = XCHMAGetLCTrendPower(i + 1); + double iTrend = XCHMAGetLCTrendPower(i); + + // + if ( + trend1 > iTrend && + iTrend >= iPrevTrend && + trend1 >= iPrevTrend) + { + trendsUpCount++; + } + else if ( + trend1 < iTrend && + iTrend <= iPrevTrend && + trend1 <= iPrevTrend) + { + trendsDownCount++; + } + } + + // + result = + // + trendsUpCount > trendsDownCount + // + ; + + // + return result; +} + +// +// Check XTM TrendsDown or Up ... +bool XCHMAIsLCTrendsDown( + int bar_index, // Specified Index ... + int length = 10 // Specified Length ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XCHMAIsValidBuffersSize(bar_index + length + 2)) + { + return result; + } + + // + double trend1 = XCHMAGetLCTrendPower(bar_index); + + // + int trendsUpCount = 0; + int trendsDownCount = 0; + for (int i = bar_index + 1; i < bar_index + length + 1; i++) + { + // + double iPrevTrend = XCHMAGetLCTrendPower(i + 1); + double iTrend = XCHMAGetLCTrendPower(i); + + // + if ( + trend1 > iTrend && + iTrend >= iPrevTrend && + trend1 >= iPrevTrend) + { + trendsUpCount++; + } + else if ( + trend1 < iTrend && + iTrend <= iPrevTrend && + trend1 <= iPrevTrend) + { + trendsDownCount++; + } + } + + // + result = + // + trendsDownCount > trendsUpCount + // + ; + + // + return result; +} + +// +// Medium Cycle ... +// + +// +// Check MC is Peak ... +bool XCHMAIsMCPeak( + int bar_index, // Specified Index ... + int length = 10 // Specified Length ... +) +{ + // + bool result = false; + + // + if ( + length <= 0 || + bar_index <= 0 || + !XCHMAIsValidBuffersSize(bar_index + length + 1)) + { + return result; + } + + // + result = IsIncreasing( + bar_index + length, + bar_index, + xCHMAMcSlowBuffer + // + ); + + // + return result; +} + +// +// Check MC is Vale ... +bool XCHMAIsMCVale( + int bar_index, // Specified Index ... + int length = 10 // Specified Length ... +) +{ + // + bool result = false; + + // + if ( + length <= 0 || + bar_index <= 0 || + !XCHMAIsValidBuffersSize(bar_index + length + 1)) + { + return result; + } + + // + result = IsDecreasing( + bar_index + length, + bar_index, + xCHMAMcSlowBuffer + // + ); + + // + return result; +} + +// +// Check MC Fast Crossed Over Slow ... +bool XCHMAIsMCFastCrossedOverSlow( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XCHMAIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + result = IsCrossOver( + xCHMAMcFastBuffer, + xCHMAMcSlowBuffer, + bar_index); + + // + return result; +} + +// +// Check MC Fast Over Slow ... +bool XCHMAIsMCFastOverSlow( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XCHMAIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + result = IsOver( + xCHMAMcFastBuffer, + xCHMAMcSlowBuffer, + bar_index); + + // + return result; +} + +// +// Check MC Fast Crossed Under Slow ... +bool XCHMAIsMCFastCrossedUnderSlow( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XCHMAIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + result = IsCrossUnder( + xCHMAMcFastBuffer, + xCHMAMcSlowBuffer, + bar_index); + + // + return result; +} + +// +// Check MC Fast Under Slow ... +bool XCHMAIsMCFastUnderSlow( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XCHMAIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + result = IsUnder( + xCHMAMcFastBuffer, + xCHMAMcSlowBuffer, + bar_index); + + // + return result; +} + +// +// Get Trend Power ... +double XCHMAGetMCTrendPower( + int bar_index // Specified Index ... +) +{ + // + double result = 0; + + // + if ( + bar_index <= 0 || + !XCHMAIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + result = + // + MathAbs(xCHMAMcFastBuffer[bar_index] - xCHMAMcSlowBuffer[bar_index]) + // + ; + + // + return result; +} + +// +// Check XTM TrendsDown or Up ... +bool XCHMAIsMCTrendsUp( + int bar_index, // Specified Index ... + int length = 10 // Specified Length ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XCHMAIsValidBuffersSize(bar_index + length + 2)) + { + return result; + } + + // + double trend1 = XCHMAGetMCTrendPower(bar_index); + + // + int trendsUpCount = 0; + int trendsDownCount = 0; + for (int i = bar_index + 1; i < bar_index + length + 1; i++) + { + // + double iPrevTrend = XCHMAGetMCTrendPower(i + 1); + double iTrend = XCHMAGetMCTrendPower(i); + + // + if ( + trend1 > iTrend && + iTrend >= iPrevTrend && + trend1 >= iPrevTrend) + { + trendsUpCount++; + } + else if ( + trend1 < iTrend && + iTrend <= iPrevTrend && + trend1 <= iPrevTrend) + { + trendsDownCount++; + } + } + + // + result = + // + trendsUpCount > trendsDownCount + // + ; + + // + return result; +} + +// +// Check XTM TrendsDown or Up ... +bool XCHMAIsMCTrendsDown( + int bar_index, // Specified Index ... + int length = 10 // Specified Length ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XCHMAIsValidBuffersSize(bar_index + length + 2)) + { + return result; + } + + // + double trend1 = XCHMAGetMCTrendPower(bar_index); + + // + int trendsUpCount = 0; + int trendsDownCount = 0; + for (int i = bar_index + 1; i < bar_index + length + 1; i++) + { + // + double iPrevTrend = XCHMAGetMCTrendPower(i + 1); + double iTrend = XCHMAGetMCTrendPower(i); + + // + if ( + trend1 > iTrend && + iTrend >= iPrevTrend && + trend1 >= iPrevTrend) + { + trendsUpCount++; + } + else if ( + trend1 < iTrend && + iTrend <= iPrevTrend && + trend1 <= iPrevTrend) + { + trendsDownCount++; + } + } + + // + result = + // + trendsDownCount > trendsUpCount + // + ; + + // + return result; +} + +// +// Short Cycle ... +// + +// +// Check SC is Peak ... +bool XCHMAIsSCPeak( + int bar_index, // Specified Index ... + int length = 10 // Specified Length ... +) +{ + // + bool result = false; + + // + if ( + length <= 0 || + bar_index <= 0 || + !XCHMAIsValidBuffersSize(bar_index + length + 1)) + { + return result; + } + + // + result = IsIncreasing( + bar_index + length, + bar_index, + xCHMAScSlowBuffer + // + ); + + // + return result; +} + +// +// Check SC is Vale ... +bool XCHMAIsSCVale( + int bar_index, // Specified Index ... + int length = 10 // Specified Length ... +) +{ + // + bool result = false; + + // + if ( + length <= 0 || + bar_index <= 0 || + !XCHMAIsValidBuffersSize(bar_index + length + 1)) + { + return result; + } + + // + result = IsDecreasing( + bar_index + length, + bar_index, + xCHMAScSlowBuffer + // + ); + + // + return result; +} + +// +// Check SC Fast Crossed Over Slow ... +bool XCHMAIsSCFastCrossedOverSlow( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XCHMAIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + result = IsCrossOver( + xCHMAScFastBuffer, + xCHMAScSlowBuffer, + bar_index); + + // + return result; +} + +// +// Check SC Fast Over Slow ... +bool XCHMAIsSCFastOverSlow( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XCHMAIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + result = IsOver( + xCHMAScFastBuffer, + xCHMAScSlowBuffer, + bar_index); + + // + return result; +} + +// +// Check SC Fast Crossed Under Slow ... +bool XCHMAIsSCFastCrossedUnderSlow( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XCHMAIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + result = IsCrossUnder( + xCHMAScFastBuffer, + xCHMAScSlowBuffer, + bar_index); + + // + return result; +} + +// +// Check SC Fast Under Slow ... +bool XCHMAIsSCFastUnderSlow( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XCHMAIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + result = IsUnder( + xCHMAScFastBuffer, + xCHMAScSlowBuffer, + bar_index); + + // + return result; +} + +// +// Get SC Trend Power ... +double XCHMAGetSCTrendPower( + int bar_index // Specified Index ... +) +{ + // + double result = 0; + + // + if ( + bar_index <= 0 || + !XCHMAIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + result = + // + MathAbs(xCHMAScFastBuffer[bar_index] - xCHMAScSlowBuffer[bar_index]) + // + ; + + // + return result; +} + +// +// Check SC Trends Up ... +bool XCHMAIsSCTrendsUp( + int bar_index, // Specified Index ... + int length = 10 // Specified Length ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XCHMAIsValidBuffersSize(bar_index + length + 2)) + { + return result; + } + + // + double trend1 = XCHMAGetSCTrendPower(bar_index); + + // + int trendsUpCount = 0; + int trendsDownCount = 0; + for (int i = bar_index + 1; i < bar_index + length + 1; i++) + { + // + double iPrevTrend = XCHMAGetSCTrendPower(i + 1); + double iTrend = XCHMAGetSCTrendPower(i); + + // + if ( + trend1 > iTrend && + iTrend >= iPrevTrend && + trend1 >= iPrevTrend) + { + trendsUpCount++; + } + else if ( + trend1 < iTrend && + iTrend <= iPrevTrend && + trend1 <= iPrevTrend) + { + trendsDownCount++; + } + } + + // + result = + // + trendsUpCount > trendsDownCount + // + ; + + // + return result; +} + +// +// Check SC Trends Down ... +bool XCHMAIsSCTrendsDown( + int bar_index, // Specified Index ... + int length = 10 // Specified Length ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XCHMAIsValidBuffersSize(bar_index + length + 2)) + { + return result; + } + + // + double trend1 = XCHMAGetSCTrendPower(bar_index); + + // + int trendsUpCount = 0; + int trendsDownCount = 0; + for (int i = bar_index + 1; i < bar_index + length + 1; i++) + { + // + double iPrevTrend = XCHMAGetSCTrendPower(i + 1); + double iTrend = XCHMAGetSCTrendPower(i); + + // + if ( + trend1 > iTrend && + iTrend >= iPrevTrend && + trend1 >= iPrevTrend) + { + trendsUpCount++; + } + else if ( + trend1 < iTrend && + iTrend <= iPrevTrend && + trend1 <= iPrevTrend) + { + trendsDownCount++; + } + } + + // + result = + // + trendsDownCount > trendsUpCount + // + ; + + // + return result; +} + +// +// Utility Functions ... +// + +// +// Check a Cycle is Over of Another ... +bool XCHMAIsCycleOverAnother( + int bar_index, // Specified Index ... + ENUM_XCHMA_CYCLES sourceCycle, // Specified Cycle ... + ENUM_XCHMA_CYCLES destCycle // Specified Cycle ... +) +{ + // + bool result = false; + + // + // Validate BufferSize ... + if ( + bar_index <= 0 || + !XCHMAIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + double sourceMinValue = XCHMAGetCycleMinValue(bar_index, sourceCycle); + double destMaxValue = XCHMAGetCycleMaxValue(bar_index, destCycle); + + // + result = + // + sourceMinValue > destMaxValue + // + ; + + // + return result; +} + +// +// Check a Cycle is Under of Another ... +bool XCHMAIsCycleUnderAnother( + int bar_index, // Specified Index ... + ENUM_XCHMA_CYCLES sourceCycle, // Specified Cycle ... + ENUM_XCHMA_CYCLES destCycle // Specified Cycle ... +) +{ + // + bool result = false; + + // + // Validate BufferSize ... + if ( + bar_index <= 0 || + !XCHMAIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + double sourceMaxValue = XCHMAGetCycleMaxValue(bar_index, sourceCycle); + double destMinValue = XCHMAGetCycleMinValue(bar_index, destCycle); + + // + result = + // + sourceMaxValue < destMinValue + // + ; + + // + return result; +} + +// +// Get Cycle Min Value ... +double XCHMAGetCycleMinValue( + int bar_index, // Specified Index ... + ENUM_XCHMA_CYCLES cycle // Specified Cycle ... +) +{ + // + double result = 0; + + // + // Validate BufferSize ... + if ( + bar_index <= 0 || + !XCHMAIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + switch (cycle) + { + // + case X_XCHMA_CYCLE_LONG: + result = MathMin( + xCHMALcFastBuffer[bar_index], + xCHMALcSlowBuffer[bar_index]); + break; + + // + case X_XCHMA_CYCLE_MEDIUM: + result = MathMin( + xCHMAMcFastBuffer[bar_index], + xCHMAMcSlowBuffer[bar_index]); + break; + + // + case X_XCHMA_CYCLE_SHORT: + result = MathMin( + xCHMAScFastBuffer[bar_index], + xCHMAScSlowBuffer[bar_index]); + break; + } + + // + return result; +} + +// +// Get Cycles Min Value ... +double XCHMAGetCyclesMinValue( + int bar_index, // Specified Index ... + ENUM_XCHMA_CYCLES &cycle[] // Specified Cycles ... +) +{ + // + double result = 0; + + // + // Validate Args ... + if ( + // + bar_index <= 0 || + ArraySize(cycle) <= 0 || + !XCHMAIsValidBuffersSize(bar_index + 1) + // + ) + { + return result; + } + + // + // Loop Through Cycles ... + for (int i = 0; i < ArraySize(cycle); i++) + { + // + ENUM_XCHMA_CYCLES iCycle = cycle[i]; + double iValue = XCHMAGetCycleMinValue( + bar_index, + iCycle); + + // + result = result == 0 || result > iValue ? iValue : result; + } + + // + return result; +} + +// +// Get Cycle Max Value ... +double XCHMAGetCycleMaxValue( + int bar_index, // Specified Index ... + ENUM_XCHMA_CYCLES cycle // Specified Cycle ... +) +{ + // + double result = 0; + + // + // Validate BufferSize ... + if ( + bar_index <= 0 || + !XCHMAIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + switch (cycle) + { + // + case X_XCHMA_CYCLE_LONG: + result = MathMax( + xCHMALcFastBuffer[bar_index], + xCHMALcSlowBuffer[bar_index]); + break; + + // + case X_XCHMA_CYCLE_MEDIUM: + result = MathMax( + xCHMAMcFastBuffer[bar_index], + xCHMAMcSlowBuffer[bar_index]); + break; + + // + case X_XCHMA_CYCLE_SHORT: + result = MathMax( + xCHMAScFastBuffer[bar_index], + xCHMAScSlowBuffer[bar_index]); + break; + } + + // + return result; +} + +// +// Get Cycles Max Value ... +double XCHMAGetCyclesMaxValue( + int bar_index, // Specified Index ... + ENUM_XCHMA_CYCLES &cycle[] // Specified Cycles ... +) +{ + // + double result = 0; + + // + // Validate Args ... + if ( + // + bar_index <= 0 || + ArraySize(cycle) <= 0 || + !XCHMAIsValidBuffersSize(bar_index + 1) + // + ) + { + return result; + } + + // + // Loop Through Cycles ... + for (int i = 0; i < ArraySize(cycle); i++) + { + // + ENUM_XCHMA_CYCLES iCycle = cycle[i]; + double iValue = XCHMAGetCycleMaxValue( + bar_index, + iCycle); + + // + result = result == 0 || result < iValue ? iValue : result; + } + + // + return result; +} + +// +// Check all Buffers has valid Size ... +bool XCHMAIsValidBuffersSize( + int size // the size of buffers which min size for requirements +) +{ + // + bool result = false; + + // + if ( + size <= 0 || + // + ArraySize(xCHMALcFastBuffer) < size || + ArraySize(xCHMALcSlowBuffer) < size || + // + ArraySize(xCHMAMcFastBuffer) < size || + ArraySize(xCHMAMcSlowBuffer) < size || + // + ArraySize(xCHMAScFastBuffer) < size || + ArraySize(xCHMAScSlowBuffer) < size + // + ) + { + result = false; + } + else + { + result = true; + } + + // + return result; +} + +// +// Add Specified Object to it's correspond Buffer ... +void Add( + ENUM_XCHMA_CYCLES item, + ENUM_XCHMA_CYCLES &buffer[]) +{ + // + ArrayResize( + buffer, + ArraySize(buffer) + 1); + + // + buffer[ArraySize(buffer) - 1] = item; +} + +// +// END XCHMA Custom Functions ... +// diff --git a/BKPS/OLD/XEU5/Helpers/x-saherelm.xfi.oscillator.helper.lib.mq5 b/BKPS/OLD/XEU5/Helpers/x-saherelm.xfi.oscillator.helper.lib.mq5 new file mode 100644 index 0000000..19d3417 --- /dev/null +++ b/BKPS/OLD/XEU5/Helpers/x-saherelm.xfi.oscillator.helper.lib.mq5 @@ -0,0 +1,358 @@ +///////////////////////////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 XFI Oscillator Helper for Signal Providers +// -------------------------------------------------------------------------- +// +// 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 + +// +// Includes ... +#include "../Libraries/x-saherelm.log.lib.mq5" +#include "../Libraries/x-saherelm.common.lib.mq5" + +// +// START Enum Definitions ... +// + +// +// END Enum Definitions ... +// + +// +// START Inputs ... +// + +// input group "XFI Oscillator"; + +// // +// input int xFILength = 18; // Market Length +// input ENUM_MA_METHOD xFIMethod = MODE_SMA; // MA Method +// input ENUM_APPLIED_VOLUME xFIAppliedTo = VOLUME_TICK; // Applied To + +// +// Configurations ... +int xFILength = 18; // Market Length +ENUM_MA_METHOD xFIMethod = MODE_SMA; // MA Method +ENUM_APPLIED_VOLUME xFIAppliedTo = VOLUME_TICK; // Applied To + +// +// END Inputs ... +// + +// +// START Definitions ... +// + +int xFIHandler = INVALID_HANDLE; +double xFIBuffer[]; + +// +// END Definitions ... +// + +// +// START Handler Functions ... +// + +// +// Validate Inputs ... +bool XFIValidateInputs() +{ + // + bool result = false; + + // + result = xFILength > 2; + + // + if (!result) + { + // + LogMessage("XFI Oscillator Inputs Validation Failed ..."); + } + + // + return result; +} + +// +// Init Oscillators ... +bool XFIInitHandlers() +{ + // + bool result = false; + + // + // Initialize Indicator/Oscillator Handlers ... + ResetLastError(); + + // + // XFI Handler ... + ArraySetAsSeries(xFIBuffer, true); + xFIHandler = iCustom( + _Symbol, + _Period, + "x-saherelm.xfi.oscillator", + // + // Inputs ... + xFILength, + xFIMethod, + xFIAppliedTo + // + ); + if (xFIHandler == INVALID_HANDLE) + { + // + LogMessage("failed to Initialize XFI Oscillator: " + (string)GetLastError()); + return result; + } + + // + result = true; + + // + return result; +} + +// +// Release Oscillators ... +void XFIReleaseHandlers() +{ + IndicatorRelease(xFIHandler); +} + +// +// Handle Reading Buffers ... +void XFIReadBuffers( + int xFIItemsPerTick // Number Of Reading Buffer Items Per Tick +) +{ + // + // XFI Signal ... + CopyBuffer( + xFIHandler, + 0, + 0, + xFIItemsPerTick, + xFIBuffer); +} + +// +// END Handler Funcions ... +// + +// +// START XFI Custom Functions ... +// + +// +// Check SC is Peak ... +bool XFIIsPeak( + int bar_index, // Specified Index ... + int length = 10 // Specified Length ... +) +{ + // + bool result = false; + + // + if ( + length <= 0 || + bar_index <= 0 || + !XFIIsValidBuffersSize(bar_index + length + 1)) + { + return result; + } + + // + // Must Decreasing ... + bool isIncreasing = IsIncreasing( + bar_index + length, + bar_index, + xFIBuffer + // + ); + + // + return result; +} + +// +// Check SC is Vale ... +bool XFIIsVale( + int bar_index, // Specified Index ... + int length = 10 // Specified Length ... +) +{ + // + bool result = false; + + // + if ( + length <= 0 || + bar_index <= 0 || + !XFIIsValidBuffersSize(bar_index + length + 1)) + { + return result; + } + + // + result = IsDecreasing( + bar_index + length, + bar_index, + xFIBuffer + // + ); + + // + return result; +} + +// +// Detect XFI Crossed Over Zero ... +bool XFIIsCrossedOverZero( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + // Validate Args ... + if ( + bar_index < 0 || + !XFIIsValidBuffersSize(bar_index + 2)) + { + return result; + } + + // + result = + xFIBuffer[bar_index] > 0 && + xFIBuffer[bar_index + 1] <= 0; + + // + return result; +} + +// +// Detect XFI Over Zero ... +bool XFIIsOverZero( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + // Validate Args ... + if ( + bar_index < 0 || + !XFIIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + result = + xFIBuffer[bar_index] > 0; + + // + return result; +} + +// +// Detect XFI Crossed Under Zero ... +bool XFIIsCrossedUnderZero( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + // Validate Args ... + if ( + bar_index < 0 || + !XFIIsValidBuffersSize(bar_index + 2)) + { + return result; + } + + // + result = + xFIBuffer[bar_index] < 0 && + xFIBuffer[bar_index + 1] >= 0; + + // + return result; +} + +// +// Detect XFI Under Zero ... +bool XFIIsUnderZero( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + // Validate Args ... + if ( + bar_index < 0 || + !XFIIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + result = + xFIBuffer[bar_index] < 0; + + // + return result; +} + +// +// Check all Buffers has valid Size ... +bool XFIIsValidBuffersSize( + int size // the size of buffers which min size for requirements +) +{ + // + bool result = false; + + // + if ( + size <= 0 || + // + ArraySize(xFIBuffer) < size + // + ) + { + result = false; + } + else + { + result = true; + } + + // + return result; +} + +// +// END XFI Custom Functions ... +// diff --git a/BKPS/OLD/XEU5/Helpers/x-saherelm.xlh.indicator.helper.lib.mq5 b/BKPS/OLD/XEU5/Helpers/x-saherelm.xlh.indicator.helper.lib.mq5 new file mode 100644 index 0000000..e6a92f6 --- /dev/null +++ b/BKPS/OLD/XEU5/Helpers/x-saherelm.xlh.indicator.helper.lib.mq5 @@ -0,0 +1,668 @@ +///////////////////////////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 XLH Indicator Helper for Signal Providers +// -------------------------------------------------------------------------- +// +// 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 + +// +// Includes ... +#include "../Libraries/x-saherelm.log.lib.mq5" +#include "../Libraries/x-saherelm.common.lib.mq5" + +// +// START Enum Definitions ... +// + +// +// XLH Indicator Buffer Lines ... +enum ENUM_X_XLH_BUFFER_LINES +{ + X_XLH_HH_LINE = 0, + X_XLH_LL_LINE = 1, + X_XLH_SIGNAL_LINE = 2, +}; + +// +// END Enum Definitions ... +// + +// +// START Inputs ... +// + +// input group "XLH Indicator"; + +// input int xLHLength = 72; // Length +// input ENUM_SERIESMODE xLHHHMode = MODE_HIGH; // Highest High Calculation Method +// input ENUM_SERIESMODE xLHLLMode = MODE_LOW; // Lowest Low Calculation Method + +// +// Configurations ... +int xLHLength = 72; // Length +ENUM_SERIESMODE xLHHHMode = MODE_HIGH; // Highest High Calculation Method +ENUM_SERIESMODE xLHLLMode = MODE_LOW; // Lowest Low Calculation Method + +// +// END Inputs ... +// + +// +// START Definitions ... +// + +// +int xLHHandler = INVALID_HANDLE; + +// +double xLHHHBuffer[]; +double xLHLLBuffer[]; +double xLHSignalBuffer[]; + +// +// END Definitions ... +// + +// +// START Handler Functions ... +// + +// +// Validate Inputs ... +bool XLHValidateInputs() +{ + // + bool result = false; + + // + result = xLHLength >= 2; + + // + if (!result) + { + // + LogMessage("XLH Indicator Inputs Validation Failed ..."); + } + + // + return result; +} + +// +// Init Indicators ... +bool XLHInitHandlers() +{ + // + bool result = false; + + // + // Initialize Indicator/Oscillator Handlers ... + ResetLastError(); + + // + // XLH Handler ... + ArraySetAsSeries(xLHHHBuffer, true); + ArraySetAsSeries(xLHLLBuffer, true); + ArraySetAsSeries(xLHSignalBuffer, true); + + // + xLHHandler = iCustom( + _Symbol, + _Period, + "x-saherelm.xlh.indicator", + // + // Inputs ... + xLHLength, + xLHHHMode, + xLHLLMode + // + ); + if (xLHHandler == INVALID_HANDLE) + { + // + LogMessage("failed to Initialize XLH Indicator: " + (string)GetLastError()); + return result; + } + + // + result = true; + + // + return result; +} + +// +// Release Indicators ... +void XLHReleaseHandlers() +{ + IndicatorRelease(xLHHandler); +} + +// +// Handle Reading Buffers ... +void XLHReadBuffers( + int xLHItemsPerTick // Number Of Reading Buffer Items Per Tick +) +{ + // + // HH Buffer ... + CopyBuffer( + xLHHandler, + X_XLH_HH_LINE, + 0, + xLHItemsPerTick, + xLHHHBuffer + // + ); + + // + // LL Buffer ... + CopyBuffer( + xLHHandler, + X_XLH_LL_LINE, + 0, + xLHItemsPerTick, + xLHLLBuffer + // + ); + + // + // Signal Buffer ... + CopyBuffer( + xLHHandler, + X_XLH_SIGNAL_LINE, + 0, + xLHItemsPerTick, + xLHSignalBuffer + // + ); +} + +// +// END Handler Funcions ... +// + +// +// START XLH Custom Functions ... +// + +// +// TODO: What we have to Implement ... +// - [] + +// +// Check Candle High is HH ... +bool XLHIsHighAttachedHH( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XLHIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + XOHCL candle = GetCandle(bar_index); + + // + result = + // + candle.high == xLHHHBuffer[bar_index] + // + ; + + // + return result; +} + +// +// Check Candle Low is LL ... +bool XLHIsLowAttachedLL( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XLHIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + XOHCL candle = GetCandle(bar_index); + + // + result = + // + candle.low == xLHLLBuffer[bar_index] + // + ; + + // + return result; +} + +// +// Check Price Jumping Up Signal ... +bool XLHIsPriceCrossedOverSignal( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XLHIsValidBuffersSize(bar_index + 2)) + { + return result; + } + + // + XOHCL candle1 = GetCandle(bar_index); + XOHCL candle2 = GetCandle(bar_index + 1); + + // + result = + // + candle1.low > xLHSignalBuffer[bar_index] && + candle2.low < xLHSignalBuffer[bar_index + 1] + // + ; + + // + return result; +} + +// +// Check Price Over Signal ... +bool XLHIsPriceOverSignal( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XLHIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + XOHCL candle1 = GetCandle(bar_index); + + // + result = + // + candle1.low > xLHSignalBuffer[bar_index] + // + ; + + // + return result; +} + +// +// Check Price Jumping Down Signal ... +bool XLHIsPriceCrossedUnderSignal( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XLHIsValidBuffersSize(bar_index + 2)) + { + return result; + } + + // + XOHCL candle1 = GetCandle(bar_index); + XOHCL candle2 = GetCandle(bar_index + 1); + + // + result = + // + candle1.high < xLHSignalBuffer[bar_index] && + candle2.high > xLHSignalBuffer[bar_index + 1] + // + ; + + // + return result; +} + +// +// Check Price Down Signal ... +bool XLHIsPriceUnderSignal( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XLHIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + XOHCL candle1 = GetCandle(bar_index); + + // + result = + // + candle1.high < xLHSignalBuffer[bar_index] + // + ; + + // + return result; +} + +// +// Check Price Ranging Signal ... +bool XLHIsPriceInSignalRange( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XLHIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + XOHCL candle1 = GetCandle(bar_index); + + // + result = + // + candle1.high > xLHSignalBuffer[bar_index] && + candle1.low < xLHSignalBuffer[bar_index] + // + ; + + // + return result; +} + +// +// Check HH Increased ... +bool XLHIsHHIncreased( + int bar_index, // Specified Index ... + int length = 10 // Specified Length ... +) +{ + // + bool result = false; + + // + if ( + length <= 0 || + bar_index <= 0 || + !XLHIsValidBuffersSize(bar_index + length + 1)) + { + return result; + } + + // + result = IsIncreasing( + bar_index + length, + bar_index, + xLHHHBuffer + // + ); + + // + return result; +} + +// +// Check HH Decreased ... +bool XLHIsHHDecreased( + int bar_index, // Specified Index ... + int length = 10 // Specified Length ... +) +{ + // + bool result = false; + + // + if ( + length <= 0 || + bar_index <= 0 || + !XLHIsValidBuffersSize(bar_index + length + 1)) + { + return result; + } + + // + result = IsDecreasing( + bar_index + length, + bar_index, + xLHHHBuffer + // + ); + + // + return result; +} + +// +// Check LL Increased ... +bool XLHIsLLIncreased( + int bar_index, // Specified Index ... + int length = 10 // Specified Length ... +) +{ + // + bool result = false; + + // + if ( + length <= 0 || + bar_index <= 0 || + !XLHIsValidBuffersSize(bar_index + length + 1)) + { + return result; + } + + // + result = IsIncreasing( + bar_index + length, + bar_index, + xLHLLBuffer + // + ); + + // + return result; +} + +// +// Check LL Decreased ... +bool XLHIsLLDecreased( + int bar_index, // Specified Index ... + int length = 10 // Specified Length ... +) +{ + // + bool result = false; + + // + if ( + length <= 0 || + bar_index <= 0 || + !XLHIsValidBuffersSize(bar_index + length + 1)) + { + return result; + } + + // + result = IsDecreasing( + bar_index + length, + bar_index, + xLHLLBuffer + // + ); + + // + return result; +} + +// +// Check HH Same in Length ... +bool XLHIsHHSameInLength( + int bar_index, // Specified Index ... + int length = 5 // Specified Length ... +) +{ + // + bool result = false; + + // + if ( + length <= 0 || + bar_index <= 0 || + !XLHIsValidBuffersSize(bar_index + length + 1)) + { + return result; + } + + // + double value1 = xLHHHBuffer[bar_index]; + + // + // Loop ... + result = true; + for (int i = bar_index + 1; i < bar_index + length + 1; i++) + { + // + double iValue = xLHHHBuffer[i]; + if (iValue != value1) + { + // + result = false; + + // + break; + } + } + + // + return result; +} + +// +// Check LL Same in Length ... +bool XLHIsLLSameInLength( + int bar_index, // Specified Index ... + int length = 5 // Specified Length ... +) +{ + // + bool result = false; + + // + if ( + length <= 0 || + bar_index <= 0 || + !XLHIsValidBuffersSize(bar_index + length + 1)) + { + return result; + } + + // + double value1 = xLHLLBuffer[bar_index]; + + // + // Loop ... + result = true; + for (int i = bar_index + 1; i < bar_index + length + 1; i++) + { + // + double iValue = xLHLLBuffer[i]; + if (iValue != value1) + { + // + result = false; + + // + break; + } + } + + // + return result; +} + +// +// Check all Buffers has valid Size ... +bool XLHIsValidBuffersSize( + int size // the size of buffers which min size for requirements +) +{ + // + bool result = false; + + // + if ( + size <= 0 || + // + ArraySize(xLHHHBuffer) < size || + ArraySize(xLHLLBuffer) < size || + ArraySize(xLHSignalBuffer) < size + // + ) + { + result = false; + } + else + { + result = true; + } + + // + return result; +} + +// +// END XLH Custom Functions ... +// diff --git a/BKPS/OLD/XEU5/Helpers/x-saherelm.xobd.indicator.helper.lib.mq5 b/BKPS/OLD/XEU5/Helpers/x-saherelm.xobd.indicator.helper.lib.mq5 new file mode 100644 index 0000000..f90f15b --- /dev/null +++ b/BKPS/OLD/XEU5/Helpers/x-saherelm.xobd.indicator.helper.lib.mq5 @@ -0,0 +1,249 @@ +///////////////////////////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 XOBD Indicator Helper for Signal Providers +// -------------------------------------------------------------------------- +// +// 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 + +// +// Includes ... +#include "../Libraries/x-saherelm.log.lib.mq5" +#include "../Libraries/x-saherelm.common.lib.mq5" + +// +// START Enum Definitions ... +// + +// +// END Enum Definitions ... +// + +// +// START Inputs ... +// + +// input group "XOBD Indicator"; + +// input int xOBDLength = 5; // Swing Length +// input uchar xOBDSwingHighArrowCode = 108; // Swing High Arrow Code +// input color xOBDSwingHighArrowColor = clrMagenta; // Swing High Arrow Color +// input uchar xOBDSwingLowArrowCode = 108; // Swing Low Arrow Code +// input color xOBDSwingLowArrowColor = clrAqua; // Swing Low Arrow Color + +// +// Configurations ... +int xOBDLength = 5; // Swing Length +uchar xOBDSwingHighArrowCode = 108; // Swing High Arrow Code +color xOBDSwingHighArrowColor = clrMagenta; // Swing High Arrow Color +uchar xOBDSwingLowArrowCode = 108; // Swing Low Arrow Code +color xOBDSwingLowArrowColor = clrAqua; // Swing Low Arrow Color + +// +// END Inputs ... +// + +// +// START Definitions ... +// + +// +int xOBDHandler = INVALID_HANDLE; + +// +double xOBDBuffer[]; + +// +// END Definitions ... +// + +// +// START Handler Functions ... +// + +// +// Validate Inputs ... +bool XOBDValidateInputs() +{ + // + bool result = false; + + // + result = xOBDLength >= 2; + + // + if (!result) + { + // + LogMessage("XOBD Indicator Inputs Validation Failed ..."); + } + + // + return result; +} + +// +// Init Indicators ... +bool XOBDInitHandlers() +{ + // + bool result = false; + + // + // Initialize Indicator/Oscillator Handlers ... + ResetLastError(); + + // + // XOBD Handler ... + ArraySetAsSeries(xOBDBuffer, true); + + // + xOBDHandler = iCustom( + _Symbol, + _Period, + "x-saherelm.xobd.indicator", + // + // Inputs ... + xOBDLength, + xOBDSwingHighArrowCode, + xOBDSwingHighArrowColor, + xOBDSwingLowArrowCode, + xOBDSwingLowArrowColor + // + ); + if (xOBDHandler == INVALID_HANDLE) + { + // + LogMessage("failed to Initialize XOBD Indicator: " + (string)GetLastError()); + return result; + } + + // + result = true; + + // + return result; +} + +// +// Release Indicators ... +void XOBDReleaseHandlers() +{ + IndicatorRelease(xOBDHandler); +} + +// +// Handle Reading Buffers ... +void XOBDReadBuffers( + int xOBDItemsPerTick // Number Of Reading Buffer Items Per Tick +) +{ + // + // OBD Buffer ... + CopyBuffer( + xOBDHandler, + 0, + 0, + xOBDItemsPerTick, + xOBDBuffer + // + ); +} + +// +// END Handler Funcions ... +// + +// +// START XOBD Custom Functions ... +// + +// +// Check is Swing Low Occured or not ... +bool XOBDIsSwingLow( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XOBDIsValidBuffersSize(bar_index + 2)) + { + return result; + } + + // + result = xOBDBuffer[bar_index] == X_SWING_LOW; + + // + return result; +} + +// +// Check is Swing High Occured or not ... +bool XOBDIsSwingHigh( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XOBDIsValidBuffersSize(bar_index + 2)) + { + return result; + } + + // + result = xOBDBuffer[bar_index] == X_SWING_HIGH; + + // + return result; +} + +// +// Check all Buffers has valid Size ... +bool XOBDIsValidBuffersSize( + int size // the size of buffers which min size for requirements +) +{ + // + bool result = false; + + // + if ( + size <= 0 || + // + ArraySize(xOBDBuffer) < size + // + ) + { + result = false; + } + else + { + result = true; + } + + // + return result; +} + +// +// END XOBD Custom Functions ... +// diff --git a/BKPS/OLD/XEU5/Helpers/x-saherelm.xrsi.oscillator.helper.lib.mq5 b/BKPS/OLD/XEU5/Helpers/x-saherelm.xrsi.oscillator.helper.lib.mq5 new file mode 100644 index 0000000..e6971b7 --- /dev/null +++ b/BKPS/OLD/XEU5/Helpers/x-saherelm.xrsi.oscillator.helper.lib.mq5 @@ -0,0 +1,433 @@ +///////////////////////////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 XRSI Oscillator Helper for Signal Providers +// -------------------------------------------------------------------------- +// +// 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 + +// +// Includes ... +#include "../Libraries/x-saherelm.log.lib.mq5" +#include "../Libraries/x-saherelm.common.lib.mq5" + +// +// START Enum Definitions ... +// + +// +// XRSI Oscillator Buffer Lines ... +// + +// +// END Enum Definitions ... +// + +// +// START Inputs ... +// + +// input group "XRSI Oscillator"; + +// // +// input group "XRSI Market"; +// input int xRSILength = 18; // Market Length +// input ENUM_APPLIED_PRICE xRSIAppliedTo = PRICE_OPEN; // Applied To + +// // +// input group "XRSI Short Entry"; +// input double xRSIShortEntryValue = 70; // Short Entry Level +// input color xRSIShortEntryColor = clrRed; // Short Entry Level Color +// input ENUM_LINE_STYLE xRSIShortEntryLineStyle = STYLE_SOLID; // Short Entry Style + +// // +// input group "XRSI Short Exit"; +// input double xRSIShortExitValue = 40; // Short Exit Level +// input color xRSIShortExitColor = clrRed; // Short Exit Level Color +// input ENUM_LINE_STYLE xRSIShortExitLineStyle = STYLE_DOT; // Short Exit Style + +// // +// input group "XRSI Long Entry"; +// input double xRSILongEntryValue = 30; // Long Entry Level +// input color xRSILongEntryColor = clrRed; // Long Entry Level Color +// input ENUM_LINE_STYLE xRSILongEntryLineStyle = STYLE_SOLID; // Long Entry Style + +// // +// input group "XRSI Long Exit"; +// input double xRSILongExitValue = 60; // Long Exit Level +// input color xRSILongExitColor = clrRed; // Long Exit Level Color +// input ENUM_LINE_STYLE xRSILongExitLineStyle = STYLE_DOT; // Long Exit Style + +// +// Configurations ... +int xRSILength = 18; // Market Length +ENUM_APPLIED_PRICE xRSIAppliedTo = PRICE_OPEN; // Applied To + +// +double xRSIShortEntryValue = 70; // Short Entry Level +color xRSIShortEntryColor = clrRed; // Short Entry Level Color +ENUM_LINE_STYLE xRSIShortEntryLineStyle = STYLE_SOLID; // Short Entry Style + +// +double xRSIShortExitValue = 40; // Short Exit Level +color xRSIShortExitColor = clrRed; // Short Exit Level Color +ENUM_LINE_STYLE xRSIShortExitLineStyle = STYLE_DOT; // Short Exit Style + +// +double xRSILongEntryValue = 30; // Long Entry Level +color xRSILongEntryColor = clrRed; // Long Entry Level Color +ENUM_LINE_STYLE xRSILongEntryLineStyle = STYLE_SOLID; // Long Entry Style + +// +double xRSILongExitValue = 60; // Long Exit Level +color xRSILongExitColor = clrRed; // Long Exit Level Color +ENUM_LINE_STYLE xRSILongExitLineStyle = STYLE_DOT; // Long Exit Style + +// +// END Inputs ... +// + +// +// START Definitions ... +// + +int xRSIHandler = INVALID_HANDLE; +double xRSIBuffer[]; + +// +// END Definitions ... +// + +// +// START Handler Functions ... +// + +// +// Validate Inputs ... +bool XRSIValidateInputs() +{ + // + bool result = false; + + // + result = + xRSILongEntryValue < xRSILongExitValue && + xRSIShortEntryValue > xRSIShortExitValue && + xRSIShortEntryValue > xRSILongExitValue && + xRSIShortExitValue < xRSILongExitValue; + + // + if (!result) + { + // + LogMessage("XRSI Oscillator Inputs Validation Failed ..."); + } + + // + return result; +} + +// +// Init Oscillators ... +bool XRSIInitHandlers() +{ + // + bool result = false; + + // + // Initialize Indicator/Oscillator Handlers ... + ResetLastError(); + + // + // XRSI Handler ... + ArraySetAsSeries(xRSIBuffer, true); + xRSIHandler = iCustom( + _Symbol, + _Period, + "x-saherelm.xrsi.oscillator", + // + // Inputs ... + // + // Market ... + "", + xRSILength, + xRSIAppliedTo, + // + // Short Entry ... + "", + xRSIShortEntryValue, + xRSIShortEntryColor, + xRSIShortEntryLineStyle, + // + // Short Exit ... + "", + xRSIShortExitValue, + xRSIShortExitColor, + xRSIShortExitLineStyle, + // + // Long Entry ... + "", + xRSILongEntryValue, + xRSILongEntryColor, + xRSILongEntryLineStyle, + // + // Long Exit ... + "", + xRSILongExitValue, + xRSILongExitColor, + xRSILongExitLineStyle + // + ); + if (xRSIHandler == INVALID_HANDLE) + { + // + LogMessage("failed to Initialize XRSI Oscillator: " + (string)GetLastError()); + return result; + } + + // + result = true; + + // + return result; +} + +// +// Release Oscillators ... +void XRSIReleaseHandlers() +{ + IndicatorRelease(xRSIHandler); +} + +// +// Handle Reading Buffers ... +void XRSIReadBuffers( + int xRSIItemsPerTick // Number Of Reading Buffer Items Per Tick +) +{ + // + // XRSI Signal ... + CopyBuffer( + xRSIHandler, + 0, + 0, + xRSIItemsPerTick, + xRSIBuffer); +} + +// +// END Handler Funcions ... +// + +// +// START XRSI Custom Functions ... +// + +// +// Check SC is Peak ... +bool XRSIIsPeak( + int bar_index, // Specified Index ... + int length = 10 // Specified Length ... +) +{ + // + bool result = false; + + // + if ( + length <= 0 || + bar_index <= 0 || + !XRSIIsValidBuffersSize(bar_index + length + 1)) + { + return result; + } + + // + // Must Decreasing ... + bool isIncreasing = IsIncreasing( + bar_index + length, + bar_index, + xRSIBuffer + // + ); + + // + return result; +} + +// +// Check SC is Vale ... +bool XRSIIsVale( + int bar_index, // Specified Index ... + int length = 10 // Specified Length ... +) +{ + // + bool result = false; + + // + if ( + length <= 0 || + bar_index <= 0 || + !XRSIIsValidBuffersSize(bar_index + length + 1)) + { + return result; + } + + // + result = IsDecreasing( + bar_index + length, + bar_index, + xRSIBuffer + // + ); + + // + return result; +} + +// +// RSI Value GO Up from Long Entry ... +bool XRSIIsCrossedOverLongEntry( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XRSIIsValidBuffersSize(bar_index + 2)) + { + return result; + } + + // + result = + xRSIBuffer[bar_index + 1] > xRSILongEntryValue && + xRSIBuffer[bar_index + 2] <= xRSILongEntryValue; + + // + return result; +} + +// +// RSI Value GO Up from Long Exit ... +bool XRSIIsCrossedOverLongExit( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XRSIIsValidBuffersSize(bar_index + 2)) + { + return result; + } + + // + result = + xRSIBuffer[bar_index + 1] > xRSILongExitValue && + xRSIBuffer[bar_index + 2] <= xRSILongExitValue; + + // + return result; +} + +// +// RSI Value Go Down Short Entry ... +bool XRSIIsCrossedUnderShortEntry( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XRSIIsValidBuffersSize(bar_index + 2)) + { + return result; + } + + // + result = + xRSIBuffer[bar_index + 1] < xRSIShortEntryValue && + xRSIBuffer[bar_index + 2] >= xRSIShortEntryValue; + + // + return result; +} + +// +// RSI Value Go Down Short Exit ... +bool XRSIIsCrossedUnderShortExit( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XRSIIsValidBuffersSize(bar_index + 2)) + { + return result; + } + + // + result = + xRSIBuffer[bar_index + 1] < xRSIShortExitValue && + xRSIBuffer[bar_index + 2] >= xRSIShortExitValue; + + // + return result; +} + +// +// Check all Buffers has valid Size ... +bool XRSIIsValidBuffersSize( + int size // the size of buffers which min size for requirements +) +{ + // + bool result = false; + + // + if ( + size <= 0 || + // + ArraySize(xRSIBuffer) < size + // + ) + { + result = false; + } + else + { + result = true; + } + + // + return result; +} + +// +// END XRSI Custom Functions ... +// diff --git a/BKPS/OLD/XEU5/Helpers/x-saherelm.xtd.oscillator.helper.lib.mq5 b/BKPS/OLD/XEU5/Helpers/x-saherelm.xtd.oscillator.helper.lib.mq5 new file mode 100644 index 0000000..6286228 --- /dev/null +++ b/BKPS/OLD/XEU5/Helpers/x-saherelm.xtd.oscillator.helper.lib.mq5 @@ -0,0 +1,931 @@ +///////////////////////////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 XTD Oscillator Helper for Signal Providers +// -------------------------------------------------------------------------- +// +// 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 + +// +// Includes ... +#include "../Libraries/x-saherelm.log.lib.mq5" +#include "../Libraries/x-saherelm.common.lib.mq5" + +// +// START Enum Definitions ... +// + +// +// XTD Oscillator States ... +enum ENUM_X_XTD_STATES +{ + X_XTD_BULLISH_CROSSED_OVER_BEARISH = 2, + X_XTD_BULLISH_OVER_BEARISH = 1, + X_XTD_NEUTURAL = 0, + X_XTD_BULLISH_UNDER_BEARISH = -1, + X_XTD_BULLISH_CROSSED_UNDER_BEARISH = -2 +}; + +// +// XTD Oscillator Buffer Lines ... +enum ENUM_X_XTD_BUFFER_LINES +{ + X_XTD_BULLISH_POWER_LINE = 0, + X_XTD_BEARISH_POWER_LINE = 1, + X_XTD_SIGNAL_LINE = 2, +}; + +// +// END Enum Definitions ... +// + +// +// START Inputs ... +// + +// input group "XTD Oscillator"; + +// input int xTDLength = 18; // Market Length +// input bool xTDDrawCrosses = false; // Draw Cross Arrows +// input uchar xTDBullishArrowCode = 228; // Cross Over Arrow Code +// input color xTDBullishArrowColor = clrAqua; // Cross Over Arrow Color +// input uchar xTDBearishArrowCode = 230; // Cross Under Arrow Code +// input color xTDBearishArrowColor = clrMagenta; // Cross Under Arrow Color + +// +// Configurations ... +int xTDLength = 18; // Market Length +bool xTDDrawCrosses = false; // Draw Cross Arrows +uchar xTDBullishArrowCode = 228; // Cross Over Arrow Code +color xTDBullishArrowColor = clrAqua; // Cross Over Arrow Color +uchar xTDBearishArrowCode = 230; // Cross Under Arrow Code +color xTDBearishArrowColor = clrMagenta; // Cross Under Arrow Color + +// +// END Inputs ... +// + +// +// START Definitions ... +// + +int xTDHandler = INVALID_HANDLE; +double xTDBullishBuffer[]; +double xTDBearishBuffer[]; +double xTDSignalBuffer[]; +// +// END Definitions ... +// + +// +// START Handler Functions ... +// + +// +// Validate Inputs ... +bool XTDValidateInputs() +{ + // + bool result = false; + + // + result = xTDLength >= 2; + + // + if (!result) + { + // + LogMessage("XTD Oscillator Inputs Validation Failed ..."); + } + + // + return result; +} + +// +// Init Oscillators ... +bool XTDInitHandlers() +{ + // + bool result = false; + + // + // Initialize Indicator/Oscillator Handlers ... + ResetLastError(); + + // + // XTD Handler ... + ArraySetAsSeries(xTDBullishBuffer, true); + ArraySetAsSeries(xTDBearishBuffer, true); + ArraySetAsSeries(xTDSignalBuffer, true); + xTDHandler = iCustom( + _Symbol, + _Period, + "x-saherelm.xtd.oscillator", + // + // Inputs ... + xTDLength, + xTDDrawCrosses, + xTDBullishArrowCode, + xTDBullishArrowColor, + xTDBearishArrowCode, + xTDBearishArrowColor); + if (xTDHandler == INVALID_HANDLE) + { + // + LogMessage("failed to Initialize XTD Oscillator: " + (string)GetLastError()); + return result; + } + + // + result = true; + + // + return result; +} + +// +// Release Oscillators ... +void XTDReleaseHandlers() +{ + IndicatorRelease(xTDHandler); +} + +// +// Handle Reading Buffers ... +void XTDReadBuffers( + int xTDItemsPerTick // Number Of Reading Buffer Items Per Tick +) +{ + // + // XTD Bullish Buffer ... + CopyBuffer( + xTDHandler, + X_XTD_BULLISH_POWER_LINE, + 0, + xTDItemsPerTick, + xTDBullishBuffer); + + // + // XTD Bullish Buffer ... + CopyBuffer( + xTDHandler, + X_XTD_BEARISH_POWER_LINE, + 0, + xTDItemsPerTick, + xTDBearishBuffer); + + // + // XTD Signal Buffer ... + CopyBuffer( + xTDHandler, + X_XTD_SIGNAL_LINE, + 0, + xTDItemsPerTick, + xTDSignalBuffer); +} + +// +// END Handler Funcions ... +// + +// +// START XTD Custom Functions ... +// + +// +// Check Signal Vale ... +bool XTDIsSignalVale( + int bar_index, // Specified Index ... + int length = 10 // Specified Length ... +) +{ + // + bool result = false; + + // + if ( + length <= 0 || + bar_index <= 0 || + !XTDIsValidBuffersSize(bar_index + length + 1)) + { + return result; + } + + // + result = IsDecreasing( + bar_index + length, + bar_index, + xTDSignalBuffer + // + ); + + // + return result; +} + +// +// Check Signal Peak ... +bool XTDIsSignalPeak( + int bar_index, // Specified Index ... + int length = 10 // Specified Length ... +) +{ + // + bool result = false; + + // + if ( + length <= 0 || + bar_index <= 0 || + !XTDIsValidBuffersSize(bar_index + length + 1)) + { + return result; + } + + // + // Must Decreasing ... + bool isIncreasing = IsIncreasing( + bar_index + length, + bar_index, + xTDSignalBuffer + // + ); + + // + return result; +} + +// +// Check Signal Vale ... +bool XTDIsBullishVale( + int bar_index, // Specified Index ... + int length = 10 // Specified Length ... +) +{ + // + bool result = false; + + // + if ( + length <= 0 || + bar_index <= 0 || + !XTDIsValidBuffersSize(bar_index + length + 1)) + { + return result; + } + + // + result = IsDecreasing( + bar_index + length, + bar_index, + xTDBullishBuffer + // + ); + + // + return result; +} + +// +// Check Signal Peak ... +bool XTDIsBullishPeak( + int bar_index, // Specified Index ... + int length = 10 // Specified Length ... +) +{ + // + bool result = false; + + // + if ( + length <= 0 || + bar_index <= 0 || + !XTDIsValidBuffersSize(bar_index + length + 1)) + { + return result; + } + + // + // Must Decreasing ... + bool isIncreasing = IsIncreasing( + bar_index + length, + bar_index, + xTDBullishBuffer + // + ); + + // + return result; +} + +// +// Check Signal Vale ... +bool XTDIsBearishVale( + int bar_index, // Specified Index ... + int length = 10 // Specified Length ... +) +{ + // + bool result = false; + + // + if ( + length <= 0 || + bar_index <= 0 || + !XTDIsValidBuffersSize(bar_index + length + 1)) + { + return result; + } + + // + result = IsDecreasing( + bar_index + length, + bar_index, + xTDBearishBuffer + // + ); + + // + return result; +} + +// +// Check Signal Peak ... +bool XTDIsBearishPeak( + int bar_index, // Specified Index ... + int length = 10 // Specified Length ... +) +{ + // + bool result = false; + + // + if ( + length <= 0 || + bar_index <= 0 || + !XTDIsValidBuffersSize(bar_index + length + 1)) + { + return result; + } + + // + // Must Decreasing ... + bool isIncreasing = IsIncreasing( + bar_index + length, + bar_index, + xTDBearishBuffer + // + ); + + // + return result; +} + +// +// Check Signal Peak ... + +// +// Check Bullish Crossed Over Bearish ... +bool XTDIsBullCrossedOverBear( + int bar_index // Specified Bar Index +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XTDIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + result = IsCrossOver( + xTDBullishBuffer, + xTDBearishBuffer, + 1); + + // + return result; +} + +// +// Check Bullish Over Bearish ... +bool XTDIsBullOverBear( + int bar_index // Specified Bar Index +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XTDIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + result = IsOver( + xTDBullishBuffer, + xTDBearishBuffer, + 1); + + // + return result; +} + +// +// Check Bullish Crossed Under Bearish ... +bool XTDIsBullCrossedUnderBear( + int bar_index // Specified Bar Index +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XTDIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + result = IsCrossUnder( + xTDBullishBuffer, + xTDBearishBuffer, + 1); + + // + return result; +} + +// +// Check Bullish Under Bearish ... +bool XTDIsBullUnderBear( + int bar_index // Specified Bar Index +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XTDIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + result = IsUnder( + xTDBullishBuffer, + xTDBearishBuffer, + 1); + + // + return result; +} + +// +// Check Signal Crossed Over Bearish ... +bool XTDIsSignalCrossedOverBear( + int bar_index // Specified Bar Index +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XTDIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + result = IsCrossOver( + xTDSignalBuffer, + xTDBearishBuffer, + 1); + + // + return result; +} + +// +// Check Signal Over Bearish ... +bool XTDIsSignalOverBear( + int bar_index // Specified Bar Index +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XTDIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + result = IsOver( + xTDSignalBuffer, + xTDBearishBuffer, + 1); + + // + return result; +} + +// +// Check Signal Crossed Under Bearish ... +bool XTDIsSignalCrossedUnderBear( + int bar_index // Specified Bar Index +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XTDIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + result = IsCrossUnder( + xTDSignalBuffer, + xTDBearishBuffer, + 1); + + // + return result; +} + +// +// Check Signal Under Bearish ... +bool XTDIsSignalUnderBear( + int bar_index // Specified Bar Index +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XTDIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + result = IsUnder( + xTDSignalBuffer, + xTDBearishBuffer, + 1); + + // + return result; +} + +// +// Check all Buffers has valid Size ... +bool XTDIsValidBuffersSize( + int size // the size of buffers which min size for requirements +) +{ + // + bool result = false; + + // + if ( + size <= 0 || + ArraySize(xTDBullishBuffer) < size || + ArraySize(xTDBullishBuffer) < size || + ArraySize(xTDSignalBuffer) < size) + { + result = false; + } + else + { + result = true; + } + + // + return result; +} + +// +// Count Signal Crossed Over Bear ... +int XTDCountSignalCrossedOverBearIndex( + int bar_index // Specified Bar Index +) +{ + // + int result = 0; + + // + int count = ArraySize(xTDSignalBuffer) - 1; + if ( + bar_index <= 0 || + count <= bar_index + 1) + { + return result; + } + + // + // Loop Through ... + for (int i = bar_index + 1; i < count && result == -1; i++) + { + // + // Check Cross On i Point ... + bool isCrossedOnI = XTDIsSignalCrossedOverBear(i); + if (isCrossedOnI) + { + result++; + } + } + + // + return result; +} + +// +// Count Signal Crossed Under Bear ... +int XTDCountSignalCrossedUnderBearIndex( + int bar_index // Specified Bar Index +) +{ + // + int result = 0; + + // + int count = ArraySize(xTDSignalBuffer) - 1; + if ( + bar_index <= 0 || + count <= bar_index + 1) + { + return result; + } + + // + // Loop Through ... + for (int i = bar_index + 1; i < count && result == -1; i++) + { + // + // Check Cross On i Point ... + bool isCrossedOnI = XTDIsSignalCrossedUnderBear(i); + if (isCrossedOnI) + { + result++; + } + } + + // + return result; +} + +// +// Count Bull Crossed Over Bear ... +int XTDCountBullCrossedOverBearIndex( + int bar_index // Specified Bar Index +) +{ + // + int result = 0; + + // + int count = ArraySize(xTDSignalBuffer) - 1; + if ( + bar_index <= 0 || + count <= bar_index + 1) + { + return result; + } + + // + // Loop Through ... + for (int i = bar_index + 1; i < count && result == -1; i++) + { + // + // Check Cross On i Point ... + bool isCrossedOnI = XTDIsBullCrossedOverBear(i); + if (isCrossedOnI) + { + result++; + } + } + + // + return result; +} + +// +// Count Bull Crossed Under Bear ... +int XTDCountBullCrossedUnderBearIndex( + int bar_index // Specified Bar Index +) +{ + // + int result = 0; + + // + int count = ArraySize(xTDSignalBuffer) - 1; + if ( + bar_index <= 0 || + count <= bar_index + 1) + { + return result; + } + + // + // Loop Through ... + for (int i = bar_index + 1; i < count && result == -1; i++) + { + // + // Check Cross On i Point ... + bool isCrossedOnI = XTDIsBullCrossedUnderBear(i); + if (isCrossedOnI) + { + result++; + } + } + + // + return result; +} + +// +// Find Last Signal Crossed Over Bear ... +int XTDFindLastSignalCrossedOverBearIndex( + int bar_index // Specified Bar Index +) +{ + // + int result = -1; + + // + int count = ArraySize(xTDSignalBuffer) - 1; + if ( + bar_index <= 0 || + count <= bar_index + 1) + { + return result; + } + + // + // Loop Through ... + for (int i = bar_index + 1; i < count && result == -1; i++) + { + // + // Check Cross On i Point ... + bool isCrossedOnI = XTDIsSignalCrossedOverBear(i); + if (isCrossedOnI) + { + // + result = i; + break; + } + } + + // + return result; +} + +// +// Find Last Signal Crossed Onder Bear ... +int XTDFindLastSignalCrossedUnderBearIndex( + int bar_index // Specified Bar Index +) +{ + // + int result = -1; + + // + int count = ArraySize(xTDSignalBuffer) - 1; + if ( + bar_index <= 0 || + count <= bar_index + 1) + { + return result; + } + + // + // Loop Through ... + for (int i = bar_index + 1; i < count && result == -1; i++) + { + // + // Check Cross On i Point ... + bool isCrossedOnI = XTDIsSignalCrossedUnderBear(i); + if (isCrossedOnI) + { + // + result = i; + break; + } + } + + // + return result; +} + +// +// Find Last Bull Crossed Over Bear ... +int XTDFindLastBullCrossedOverBearIndex( + int bar_index // Specified Bar Index +) +{ + // + int result = -1; + + // + int count = ArraySize(xTDSignalBuffer) - 1; + if ( + bar_index <= 0 || + count <= bar_index + 1) + { + return result; + } + + // + // Loop Through ... + for (int i = bar_index + 1; i < count && result == -1; i++) + { + // + // Check Cross On i Point ... + bool isCrossedOnI = XTDIsBullCrossedOverBear(i); + if (isCrossedOnI) + { + // + result = i; + break; + } + } + + // + return result; +} + +// +// Find Last Bull Crossed Under Bear ... +int XTDFindLastBullCrossedUnderBearIndex( + int bar_index // Specified Bar Index +) +{ + // + int result = -1; + + // + int count = ArraySize(xTDSignalBuffer) - 1; + if ( + bar_index <= 0 || + count <= bar_index + 1) + { + return result; + } + + // + // Loop Through ... + for (int i = bar_index + 1; i < count && result == -1; i++) + { + // + // Check Cross On i Point ... + bool isCrossedOnI = XTDIsBullCrossedUnderBear(i); + if (isCrossedOnI) + { + // + result = i; + break; + } + } + + // + return result; +} + +// +// END XTD Custom Functions ... +// diff --git a/BKPS/OLD/XEU5/Helpers/x-saherelm.xtm.indicator.helper.lib.mq5 b/BKPS/OLD/XEU5/Helpers/x-saherelm.xtm.indicator.helper.lib.mq5 new file mode 100644 index 0000000..a871ed4 --- /dev/null +++ b/BKPS/OLD/XEU5/Helpers/x-saherelm.xtm.indicator.helper.lib.mq5 @@ -0,0 +1,598 @@ +///////////////////////////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 XTM Indicator Helper for Signal Providers +// -------------------------------------------------------------------------- +// +// 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 + +// +// Includes ... +#include "../Libraries/x-saherelm.log.lib.mq5" +#include "../Libraries/x-saherelm.common.lib.mq5" + +// +// START Enum Definitions ... +// + +// +// XTM Indicator States ... +enum ENUM_X_XTM_STATES +{ + X_XTM_BULLISH = 1, + X_XTM_BEARISH = -1, + X_XTM_NEUTURAL = 0, +}; + +// +// XTM Indicator Buffer Lines ... +enum ENUM_X_XTM_BUFFER_LINES +{ + X_XTM_MA_LINE = 0, + X_XTM_MC_COLOR_LINE = 1, + X_XTM_STATE_LINE = 2, +}; + +// +// END Enum Definitions ... +// + +// +// START Inputs ... +// + +// input group "XTM Indicator"; + +// input int xTMMaPeriod = 18; // Period +// input int xTMMaShift = 0; // Shift +// input ENUM_MA_METHOD xTMMaMethod = MODE_EMA; // Method +// input ENUM_APPLIED_PRICE xTMMaAppliedTo = PRICE_OPEN; // Applied To + +// +// Configurations ... +int xTMMaPeriod = 18; // Period +int xTMMaShift = 0; // Shift +ENUM_MA_METHOD xTMMaMethod = MODE_EMA; // Method +ENUM_APPLIED_PRICE xTMMaAppliedTo = PRICE_OPEN; // Applied To + +// +// END Inputs ... +// + +// +// START Definitions ... +// + +int xTMHandler = INVALID_HANDLE; +double xTMMaBuffer[]; +double xTMStateBuffer[]; + +// +// END Definitions ... +// + +// +// START Handler Functions ... +// + +// +// Validate Inputs ... +bool XTMValidateInputs() +{ + // + bool result = false; + + // + result = xTMMaPeriod >= 2; + + // + if (!result) + { + // + LogMessage("XTM Indicator Inputs Validation Failed ..."); + } + + // + return result; +} + +// +// Init Indicators ... +bool XTMInitHandlers() +{ + // + bool result = false; + + // + // Initialize Indicator/Oscillator Handlers ... + ResetLastError(); + + // + // XTM Handler ... + ArraySetAsSeries(xTMMaBuffer, true); + ArraySetAsSeries(xTMStateBuffer, true); + xTMHandler = iCustom( + _Symbol, + _Period, + "x-saherelm.xtm.indicator", + // + // Inputs ... + xTMMaPeriod, + xTMMaShift, + xTMMaMethod, + xTMMaAppliedTo); + if (xTMHandler == INVALID_HANDLE) + { + // + LogMessage("failed to Initialize XTM Indicator: " + (string)GetLastError()); + return result; + } + + // + result = true; + + // + return result; +} + +// +// Release Indicators ... +void XTMReleaseHandlers() +{ + IndicatorRelease(xTMHandler); +} + +// +// Handle Reading Buffers ... +void XTMReadBuffers( + int xTMItemsPerTick // Number Of Reading Buffer Items Per Tick +) +{ + // + // Ma Buffer ... + CopyBuffer( + xTMHandler, + X_XTM_MA_LINE, + 0, + xTMItemsPerTick, + xTMMaBuffer); + + // + // State Buffer ... + CopyBuffer( + xTMHandler, + X_XTM_STATE_LINE, + 0, + xTMItemsPerTick, + xTMStateBuffer); +} + +// +// END Handler Funcions ... +// + +// +// START XTM Custom Functions ... +// + +// +// Find Peak based On this Indicator ... +bool XTMIsPeak( + int bar_index, // Specified Index ... + int length = 10 // Specified Length ... +) +{ + // + bool result = false; + + // + if ( + length <= 0 || + bar_index <= 0 || + !XTMIsValidBuffersSize(bar_index + length + 1)) + { + return result; + } + + // + // Must Decreasing ... + bool isIncreasing = IsIncreasing( + bar_index + length, + bar_index, + xTMMaBuffer + // + ); + + // + return result; +} + +// +// Find Vale based On this Indicator ... +bool XTMIsVale( + int bar_index, // Specified Index ... + int length = 10 // Specified Length ... +) +{ + // + bool result = false; + + // + if ( + length <= 0 || + bar_index <= 0 || + !XTMIsValidBuffersSize(bar_index + length + 1)) + { + return result; + } + + // + result = IsDecreasing( + bar_index + length, + bar_index, + xTMMaBuffer + // + ); + + // + return result; +} + +// +// Check TM Crossed Up ... +bool XTMIsStartBullish( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XTMIsValidBuffersSize(bar_index + 2)) + { + return result; + } + + // + result = + // + xTMStateBuffer[bar_index] == X_XTM_BULLISH && + xTMStateBuffer[bar_index + 1] != X_XTM_BULLISH + // + ; + + // + return result; +} + +// +// Check TM Crossed Up After Neutural State ... +bool XTMIsStartBullishAfterNeutural( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XTMIsValidBuffersSize(bar_index + 2)) + { + return result; + } + + // + result = + // + xTMStateBuffer[bar_index] == X_XTM_BULLISH && + xTMStateBuffer[bar_index + 1] == X_XTM_NEUTURAL + // + ; + + // + return result; +} + +// +// Check TM In Up State ... +bool XTMIsBullish( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XTMIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + result = + // + xTMStateBuffer[bar_index] == X_XTM_BULLISH + // + ; + + // + return result; +} + +// +// Check TM Ends Up State ... +bool XTMIsEndBullish( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XTMIsValidBuffersSize(bar_index + 2)) + { + return result; + } + + // + result = + // + xTMStateBuffer[bar_index] != X_XTM_BULLISH && + xTMStateBuffer[bar_index + 1] == X_XTM_BULLISH + // + ; + + // + return result; +} + +// +// Check TM Ends Up State By Neutural ... +bool XTMIsEndBullishByNeutural( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XTMIsValidBuffersSize(bar_index + 2)) + { + return result; + } + + // + result = + // + xTMStateBuffer[bar_index] == X_XTM_NEUTURAL && + xTMStateBuffer[bar_index + 1] == X_XTM_BULLISH + // + ; + + // + return result; +} + +// +// Check TM Crossed Down ... +bool XTMIsStartBearish( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XTMIsValidBuffersSize(bar_index + 2)) + { + return result; + } + + // + result = + // + xTMStateBuffer[bar_index] == X_XTM_BEARISH && + xTMStateBuffer[bar_index + 1] != X_XTM_BEARISH + // + ; + + // + return result; +} + +// +// Check TM Crossed Down After Neutural State ... +bool XTMIsStartBearishAfterNeutural( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XTMIsValidBuffersSize(bar_index + 2)) + { + return result; + } + + // + result = + // + xTMStateBuffer[bar_index] == X_XTM_BEARISH && + xTMStateBuffer[bar_index + 1] == X_XTM_NEUTURAL + // + ; + + // + return result; +} + +// +// Check TM In Down State ... +bool XTMIsBearish( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XTMIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + result = + // + xTMStateBuffer[bar_index] == X_XTM_BEARISH + // + ; + + // + return result; +} + +// +// Check TM Ends Down State ... +bool XTMIsEndBearish( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XTMIsValidBuffersSize(bar_index + 2)) + { + return result; + } + + // + result = + // + xTMStateBuffer[bar_index] != X_XTM_BEARISH && + xTMStateBuffer[bar_index + 1] == X_XTM_BEARISH + // + ; + + // + return result; +} + +// +// Check TM Ends Down State By Neutural ... +bool XTMIsEndBearishByNeutural( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XTMIsValidBuffersSize(bar_index + 2)) + { + return result; + } + + // + result = + // + xTMStateBuffer[bar_index] == X_XTM_NEUTURAL && + xTMStateBuffer[bar_index + 1] == X_XTM_BEARISH + // + ; + + // + return result; +} + +// +// Check TM In Neutural State ... +bool XTMIsNeutural( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + if ( + bar_index <= 0 || + !XTMIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + result = + // + xTMStateBuffer[bar_index] == X_XTM_NEUTURAL + // + ; + + // + return result; +} + +// +// Check all Buffers has valid Size ... +bool XTMIsValidBuffersSize( + int size // the size of buffers which min size for requirements +) +{ + // + bool result = false; + + // + if ( + size <= 0 || + // + ArraySize(xTMMaBuffer) < size || + ArraySize(xTMStateBuffer) < size + // + ) + { + result = false; + } + else + { + result = true; + } + + // + return result; +} + +// +// END XTM Custom Functions ... +// diff --git a/BKPS/OLD/XEU5/Helpers/x-saherelm.xts.oscillator.helper.lib.mq5 b/BKPS/OLD/XEU5/Helpers/x-saherelm.xts.oscillator.helper.lib.mq5 new file mode 100644 index 0000000..875eec0 --- /dev/null +++ b/BKPS/OLD/XEU5/Helpers/x-saherelm.xts.oscillator.helper.lib.mq5 @@ -0,0 +1,1179 @@ +///////////////////////////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 XTS Oscillator Helper for Signal Providers +// -------------------------------------------------------------------------- +// +// 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 + +// +// Includes ... +#include "../Libraries/x-saherelm.log.lib.mq5" +#include "../Libraries/x-saherelm.common.lib.mq5" + +// +// START Enum Definitions ... +// + +// +// Methods to Calculate TimeFrames ... +enum ENUM_X_PERIOD_METHOD +{ + // + X_PERIOD_NOTHING, + // + X_PERIOD_AUTO, + // + X_PERIOD_MANUALLY +}; + +// +// Buffer Lines ... +enum ENUM_X_XTS_BUFFER_LINES +{ + X_XTS_CURRENT_LINE = 0, + X_XTS_NEAREST_LINE = 1, + X_XTS_MEDIEST_LINE = 2, + X_XTS_FAREST_LINE = 3, +}; + +// +// Periods ... +enum ENUM_X_XTS_PERIODS +{ + // + // Current Period ... + X_XTS_PERIOD_CURRENT, + // + // Nearest Period ... + X_XTS_PERIOD_NEAREST, + // + // Mediest Period ... + X_XTS_PERIOD_MEDIEST, + // + // Farest Period ... + X_XTS_PERIOD_FAREST, +}; + +// +// END Enum Definitions ... +// + +// +// START Inputs ... +// + +// // +// input group "XTS Oscillator"; + +// // +// input group "XTS Current Period"; +// input ENUM_APPLIED_PRICE xTSCurrentAppliedTo = PRICE_CLOSE; // Current Applied To +// // +// input group "XTS Nearest Period"; +// input ENUM_X_PERIOD_METHOD xTSNearestMethod = X_PERIOD_AUTO; // How to Find Nearest Period +// input ENUM_TIMEFRAMES xTSNearestPeriod = NULL; // Nearest Time Frame +// input ENUM_APPLIED_PRICE xTSNearestAppliedTo = PRICE_CLOSE; // Nearest Applied To +// // +// input group "XTS Mediest Period"; +// input ENUM_X_PERIOD_METHOD xTSMediestMethod = X_PERIOD_AUTO; // How to Find Mediest Period +// input ENUM_TIMEFRAMES xTSMediestPeriod = NULL; // Mediest Time Frame +// input ENUM_APPLIED_PRICE xTSMediestAppliedTo = PRICE_CLOSE; // Mediest Applied To +// // +// input group "XTS Farest Period"; +// input ENUM_X_PERIOD_METHOD xTSFarestMethod = X_PERIOD_AUTO; // How to Find Farest Period +// input ENUM_TIMEFRAMES xTSFarestPeriod = NULL; // Farest Time Frame +// input ENUM_APPLIED_PRICE xTSFarestAppliedTo = PRICE_CLOSE; // Farest Applied To + +// +// Configurations ... +ENUM_APPLIED_PRICE xTSCurrentAppliedTo = PRICE_CLOSE; // Current Applied To +// +ENUM_X_PERIOD_METHOD xTSNearestMethod = X_PERIOD_AUTO; // How to Find Nearest Period +ENUM_TIMEFRAMES xTSNearestPeriod = NULL; // Nearest Time Frame +ENUM_APPLIED_PRICE xTSNearestAppliedTo = PRICE_CLOSE; // Nearest Applied To +// +ENUM_X_PERIOD_METHOD xTSMediestMethod = X_PERIOD_AUTO; // How to Find Mediest Period +ENUM_TIMEFRAMES xTSMediestPeriod = NULL; // Mediest Time Frame +ENUM_APPLIED_PRICE xTSMediestAppliedTo = PRICE_CLOSE; // Mediest Applied To +// +ENUM_X_PERIOD_METHOD xTSFarestMethod = X_PERIOD_AUTO; // How to Find Farest Period +ENUM_TIMEFRAMES xTSFarestPeriod = NULL; // Farest Time Frame +ENUM_APPLIED_PRICE xTSFarestAppliedTo = PRICE_CLOSE; // Farest Applied To + +// +// END Inputs ... +// + +// +// START Definitions ... +// + +int xTSHandler = INVALID_HANDLE; +double xTSCurrentBuffer[]; +double xTSNearestBuffer[]; +double xTSMediestBuffer[]; +double xTSFarestBuffer[]; + +// +// END Definitions ... +// + +// +// START Handler Functions ... +// + +// +// Validate Inputs ... +bool XTSValidateInputs() +{ + // + bool result = false; + + // + result = true; + + // + if (!result) + { + // + LogMessage("XTS Oscillator Inputs Validation Failed ..."); + } + + // + return result; +} + +// +// Init Oscillators ... +bool XTSInitHandlers() +{ + // + bool result = false; + + // + // Initialize Indicator/Oscillator Handlers ... + ResetLastError(); + + // + // XTS Handler ... + ArraySetAsSeries(xTSCurrentBuffer, true); + ArraySetAsSeries(xTSNearestBuffer, true); + ArraySetAsSeries(xTSMediestBuffer, true); + ArraySetAsSeries(xTSFarestBuffer, true); + xTSHandler = iCustom( + _Symbol, + _Period, + "x-saherelm.xts.oscillator", + // + // Inputs ... + "", + xTSCurrentAppliedTo, + "", + xTSNearestMethod, + xTSNearestPeriod, + xTSNearestAppliedTo, + "", + xTSMediestMethod, + xTSMediestPeriod, + xTSMediestAppliedTo, + "", + xTSFarestMethod, + xTSFarestPeriod, + xTSFarestAppliedTo + // + ); + if (xTSHandler == INVALID_HANDLE) + { + // + LogMessage("failed to Initialize XTS Oscillator: " + (string)GetLastError()); + return result; + } + + // + result = true; + + // + return result; +} + +// +// Release Oscillators ... +void XTSReleaseHandlers() +{ + IndicatorRelease(xTSHandler); +} + +// +// Handle Reading Buffers ... +void XTSReadBuffers( + int xTSItemsPerTick // Number Of Reading Buffer Items Per Tick +) +{ + // + // XTS Current ... + CopyBuffer( + xTSHandler, + X_XTS_CURRENT_LINE, + 0, + xTSItemsPerTick, + xTSCurrentBuffer); + + // + // XTS Nearest ... + CopyBuffer( + xTSHandler, + X_XTS_NEAREST_LINE, + 0, + xTSItemsPerTick, + xTSNearestBuffer); + + // + // XTS Mediest ... + CopyBuffer( + xTSHandler, + X_XTS_MEDIEST_LINE, + 0, + xTSItemsPerTick, + xTSMediestBuffer); + + // + // XTS Farest ... + CopyBuffer( + xTSHandler, + X_XTS_FAREST_LINE, + 0, + xTSItemsPerTick, + xTSFarestBuffer); +} + +// +// END Handler Funcions ... +// + +// +// START XTS Custom Functions ... +// + +// +// Calculate Min Value ... +double XTSGetMinValue( + int bar_index // Specified Index ... +) +{ + // + ENUM_X_XTS_PERIODS periods[]; + XTSGetAllPeriodsEnum(periods); + + // + double result = XTSGetPeriodsMinValue( + periods, + bar_index); + + // + return result; +} + +// +// Calculate Max Value ... +double XTSGetMaxValue( + int bar_index // Specified Index ... +) +{ + // + ENUM_X_XTS_PERIODS periods[]; + XTSGetAllPeriodsEnum(periods); + + // + double result = XTSGetPeriodsMaxValue( + periods, + bar_index); + + // + return result; +} + +// +// Check if all Periods Values are Same ... +bool XTSIsAllSame( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + // Validate Args ... + if ( + bar_index < 0 || + !XTSIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + result = + xTSCurrentBuffer[bar_index] == xTSNearestBuffer[bar_index] && + xTSNearestBuffer[bar_index] == xTSMediestBuffer[bar_index] && + xTSMediestBuffer[bar_index] == xTSFarestBuffer[bar_index]; + + // + return result; +} + +// +// Current ... + +// +// Check Current Buffer is Min Or Not ... +bool XTSIsCurrentMin( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + // Validate Args ... + if ( + bar_index < 0 || + !XTSIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + double minValue = XTSGetMinValue(bar_index); + + // + result = + xTSCurrentBuffer[bar_index] == minValue; + + // + return result; +} + +// +// Check Current Buffer is Max Or Not ... +bool XTSIsCurrentMax( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + // Validate Args ... + if ( + bar_index < 0 || + !XTSIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + double maxValue = XTSGetMaxValue(bar_index); + + // + result = + xTSCurrentBuffer[bar_index] == maxValue; + + // + return result; +} + +// +// Current VS Nearest ... + +// +// Check Current Crossed Over Nearest ... +bool XTSIsCurrentCrossedOverNearest( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + result = XTSIsPeriodCrossedOverAnother( + X_XTS_PERIOD_CURRENT, + X_XTS_PERIOD_NEAREST, + bar_index); + + // + return result; +} + +// +// Check Current Over Nearest ... +bool XTSIsCurrentOverNearest( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + result = XTSIsPeriodOverAnother( + X_XTS_PERIOD_CURRENT, + X_XTS_PERIOD_NEAREST, + bar_index); + + // + return result; +} + +// +// Check Current Crossed Under Nearest ... +bool XTSIsCurrentCrossedUnderNearest( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + result = XTSIsPeriodCrossedUnderAnother( + X_XTS_PERIOD_CURRENT, + X_XTS_PERIOD_NEAREST, + bar_index); + + // + return result; +} + +// +// Check Current Under Nearest ... +bool XTSIsCurrentUnderNearest( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + result = XTSIsPeriodUnderAnother( + X_XTS_PERIOD_CURRENT, + X_XTS_PERIOD_NEAREST, + bar_index); + + // + return result; +} + +// +// Current VS Mediest ... + +// +// Check Current Crossed Over Mediest ... +bool XTSIsCurrentCrossedOverMediest( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + result = XTSIsPeriodCrossedOverAnother( + X_XTS_PERIOD_CURRENT, + X_XTS_PERIOD_MEDIEST, + bar_index); + + // + return result; +} + +// +// Check Current Over Mediest ... +bool XTSIsCurrentOverMediest( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + result = XTSIsPeriodOverAnother( + X_XTS_PERIOD_CURRENT, + X_XTS_PERIOD_MEDIEST, + bar_index); + + // + return result; +} + +// +// Check Current Crossed Under Mediest ... +bool XTSIsCurrentCrossedUnderMediest( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + result = XTSIsPeriodCrossedUnderAnother( + X_XTS_PERIOD_CURRENT, + X_XTS_PERIOD_MEDIEST, + bar_index); + + // + return result; +} + +// +// Check Current Under Mediest ... +bool XTSIsCurrentUnderMediest( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + result = XTSIsPeriodUnderAnother( + X_XTS_PERIOD_CURRENT, + X_XTS_PERIOD_MEDIEST, + bar_index); + + // + return result; +} + +// +// Current VS Farest ... + +// +// Check Current Crossed Over Farest ... +bool XTSIsCurrentCrossedOverFarest( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + result = XTSIsPeriodCrossedOverAnother( + X_XTS_PERIOD_CURRENT, + X_XTS_PERIOD_FAREST, + bar_index); + + // + return result; +} + +// +// Check Current Over Farest ... +bool XTSIsCurrentOverFarest( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + result = XTSIsPeriodOverAnother( + X_XTS_PERIOD_CURRENT, + X_XTS_PERIOD_FAREST, + bar_index); + + // + return result; +} + +// +// Check Current Crossed Under Farest ... +bool XTSIsCurrentCrossedUnderFarest( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + result = XTSIsPeriodCrossedUnderAnother( + X_XTS_PERIOD_CURRENT, + X_XTS_PERIOD_FAREST, + bar_index); + + // + return result; +} + +// +// Check Current Under Farest ... +bool XTSIsCurrentUnderFarest( + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + result = XTSIsPeriodUnderAnother( + X_XTS_PERIOD_CURRENT, + X_XTS_PERIOD_FAREST, + bar_index); + + // + return result; +} + +// +// Globally Custom Functions ... + +// +// Check a Period Crossed Over another one ... +bool XTSIsPeriodCrossedOverAnother( + ENUM_X_XTS_PERIODS source, // Specified Source Period which Check it's Crossed ... + ENUM_X_XTS_PERIODS dest, // Specified Dest Period Which used to Check Source Crosses ... + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + // Validate Args ... + if ( + bar_index < 0 || + !XTSIsValidBuffersSize(bar_index + 2)) + { + return result; + } + + // + double sourceValue = XTSGetPeriodValue( + source, + bar_index); + double sourceValue1 = XTSGetPeriodValue( + source, + bar_index + 1); + + // + double destValue = XTSGetPeriodValue( + dest, + bar_index); + double destValue1 = XTSGetPeriodValue( + dest, + bar_index + 1); + + // + result = + sourceValue > destValue && + sourceValue1 <= destValue1; + + // + return result; +} + +// +// Check a Period Over another one ... +bool XTSIsPeriodOverAnother( + ENUM_X_XTS_PERIODS source, // Specified Source Period which Check it's Crossed ... + ENUM_X_XTS_PERIODS dest, // Specified Dest Period Which used to Check Source Crosses ... + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + // Validate Args ... + if ( + bar_index < 0 || + !XTSIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + double sourceValue = XTSGetPeriodValue( + source, + bar_index); + + // + double destValue = XTSGetPeriodValue( + dest, + bar_index); + + // + result = + sourceValue > destValue; + + // + return result; +} + +// +// Check a Period Crossed Under another one ... +bool XTSIsPeriodCrossedUnderAnother( + ENUM_X_XTS_PERIODS source, // Specified Source Period which Check it's Crossed ... + ENUM_X_XTS_PERIODS dest, // Specified Dest Period Which used to Check Source Crosses ... + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + // Validate Args ... + if ( + bar_index < 0 || + !XTSIsValidBuffersSize(bar_index + 2)) + { + return result; + } + + // + double sourceValue = XTSGetPeriodValue( + source, + bar_index); + double sourceValue1 = XTSGetPeriodValue( + source, + bar_index + 1); + + // + double destValue = XTSGetPeriodValue( + dest, + bar_index); + double destValue1 = XTSGetPeriodValue( + dest, + bar_index + 1); + + // + result = + sourceValue < destValue && + sourceValue1 >= destValue1; + + // + return result; +} + +// +// Check a Period Under another one ... +bool XTSIsPeriodUnderAnother( + ENUM_X_XTS_PERIODS source, // Specified Source Period which Check it's Crossed ... + ENUM_X_XTS_PERIODS dest, // Specified Dest Period Which used to Check Source Crosses ... + int bar_index // Specified Index ... +) +{ + // + bool result = false; + + // + // Validate Args ... + if ( + bar_index < 0 || + !XTSIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + double sourceValue = XTSGetPeriodValue( + source, + bar_index); + + // + double destValue = XTSGetPeriodValue( + dest, + bar_index); + + // + result = + sourceValue < destValue; + + // + return result; +} + +// +// Retrieve Specific Period's Value from Buffer for Specific Bar Index ... +double XTSGetPeriodValue( + ENUM_X_XTS_PERIODS period, // Specified Period to read it's Value ... + int bar_index // Specified Index ... +) +{ + // + double result = 0; + + // + // Validate Args ... + if ( + bar_index < 0 || + !XTSIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + switch (period) + { + // + case X_XTS_PERIOD_CURRENT: + result = xTSCurrentBuffer[bar_index]; + break; + + // + case X_XTS_PERIOD_NEAREST: + result = xTSNearestBuffer[bar_index]; + break; + + // + case X_XTS_PERIOD_MEDIEST: + result = xTSMediestBuffer[bar_index]; + break; + + // + case X_XTS_PERIOD_FAREST: + result = xTSFarestBuffer[bar_index]; + break; + } + + // + return result; +} + +// +// Fill All Exists Periods ... +void XTSGetAllPeriodsEnum( + ENUM_X_XTS_PERIODS &result[] // Hold's Result ... +) +{ + // + CleanBuffer(result); + + // + Add( + X_XTS_PERIOD_CURRENT, + result); + + // + Add( + X_XTS_PERIOD_NEAREST, + result); + + // + Add( + X_XTS_PERIOD_MEDIEST, + result); + + // + Add( + X_XTS_PERIOD_FAREST, + result); +} + +// +// Fill All Exists Periods Except ... +void XTSGetAllPeriodsEnumExcept( + ENUM_X_XTS_PERIODS &result[], // Hold's Result ... + ENUM_X_XTS_PERIODS exception // Excepted Period ... +) +{ + // + CleanBuffer(result); + + // + ENUM_X_XTS_PERIODS allPeriods[]; + XTSGetAllPeriodsEnum(allPeriods); + int periodsCount = ArraySize(allPeriods); + if (periodsCount <= 0) + { + return; + } + + // + // Loop ... + for (int i = 0; i < periodsCount; i++) + { + // + ENUM_X_XTS_PERIODS iPeriod = allPeriods[i]; + + // + if (iPeriod != exception) + { + Add( + iPeriod, + result); + } + } +} + +// +// Fill All Exists Periods Except ... +void XTSGetAllPeriodsEnumExcept( + ENUM_X_XTS_PERIODS &result[], // Hold's Result ... + ENUM_X_XTS_PERIODS &exceptions[] // Excepted Periods ... +) +{ + // + CleanBuffer(result); + + // + ENUM_X_XTS_PERIODS allPeriods[]; + XTSGetAllPeriodsEnum(allPeriods); + int periodsCount = ArraySize(allPeriods); + if (periodsCount <= 0) + { + return; + } + + // + int exceptionsCount = ArraySize(exceptions); + + // + // Loop ... + for (int i = 0; i < periodsCount; i++) + { + // + ENUM_X_XTS_PERIODS iPeriod = allPeriods[i]; + + // + bool canAddIPeriod = false; + if (exceptionsCount <= 0) + { + canAddIPeriod = true; + } + else + { + // + // Loop through Exceptions ... + for (int j = 0; j < exceptionsCount; j++) + { + // + ENUM_X_XTS_PERIODS jException = exceptions[j]; + + // + if (iPeriod == jException) + { + // + canAddIPeriod = false; + break; + } + + // + canAddIPeriod = true; + } + } + + // + if (canAddIPeriod) + { + // + Add( + iPeriod, + result); + } + } +} + +// +// Calculate Periods Min Value ... +double XTSGetPeriodsMinValue( + ENUM_X_XTS_PERIODS &periods[], // Specified Periods ... + int bar_index // Specified Index ... +) +{ + // + double result = 0; + + // + int periodsCount = ArraySize(periods); + + // + // Validate Args ... + if ( + bar_index < 0 || + periodsCount <= 0 || + !XTSIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + // Loop ... + for (int i = 0; i < periodsCount; i++) + { + // + ENUM_X_XTS_PERIODS iPeriod = periods[i]; + + // + double iValue = 0; + + // + switch (iPeriod) + { + // + case X_XTS_PERIOD_CURRENT: + iValue = xTSCurrentBuffer[bar_index]; + break; + + // + case X_XTS_PERIOD_NEAREST: + iValue = xTSNearestBuffer[bar_index]; + break; + + // + case X_XTS_PERIOD_MEDIEST: + iValue = xTSMediestBuffer[bar_index]; + break; + + // + case X_XTS_PERIOD_FAREST: + iValue = xTSFarestBuffer[bar_index]; + break; + } + + // + // Compare iValue to result ... + result = + result == 0 || + result > iValue + ? iValue + : result; + } + + // + return result; +} + +// +// Calculate Periods Max Value ... +double XTSGetPeriodsMaxValue( + ENUM_X_XTS_PERIODS &periods[], // Specified Periods ... + int bar_index // Specified Index ... +) +{ + // + double result = 0; + + // + int periodsCount = ArraySize(periods); + + // + // Validate Args ... + if ( + bar_index < 0 || + periodsCount <= 0 || + !XTSIsValidBuffersSize(bar_index + 1)) + { + return result; + } + + // + // Loop ... + for (int i = 0; i < periodsCount; i++) + { + // + ENUM_X_XTS_PERIODS iPeriod = periods[i]; + + // + double iValue = 0; + + // + switch (iPeriod) + { + // + case X_XTS_PERIOD_CURRENT: + iValue = xTSCurrentBuffer[bar_index]; + break; + + // + case X_XTS_PERIOD_NEAREST: + iValue = xTSNearestBuffer[bar_index]; + break; + + // + case X_XTS_PERIOD_MEDIEST: + iValue = xTSMediestBuffer[bar_index]; + break; + + // + case X_XTS_PERIOD_FAREST: + iValue = xTSFarestBuffer[bar_index]; + break; + } + + // + // Compare iValue to result ... + result = + result == 0 || + result < iValue + ? iValue + : result; + } + + // + return result; +} + +// +// Check all Buffers has valid Size ... +bool XTSIsValidBuffersSize( + int size // the size of buffers which min size for requirements +) +{ + // + bool result = false; + + // + if ( + size <= 0 || + // + ArraySize(xTSCurrentBuffer) < size + // + ) + { + result = false; + } + else + { + result = true; + } + + // + return result; +} + +// +void Add( + ENUM_X_XTS_PERIODS item, // Specified Item ... + ENUM_X_XTS_PERIODS &buffer[] // Specified Buffer ... +) +{ + // + int bufferSize = ArraySize(buffer); + + // + ArrayResize( + buffer, + bufferSize + 1); + + // + buffer[bufferSize] = item; +} + +void CleanBuffer( + ENUM_X_XTS_PERIODS &buffer[] // Specified Buffer ... +) +{ + // + ArrayFree(buffer); + ArrayResize(buffer, 0); +} + +// +// END XTS Custom Functions ... +// diff --git a/BKPS/OLD/XEU5/Indicators/.gitkeep b/BKPS/OLD/XEU5/Indicators/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/BKPS/OLD/XEU5/Indicators/x-saherelm.xama.indicator.mq5 b/BKPS/OLD/XEU5/Indicators/x-saherelm.xama.indicator.mq5 new file mode 100644 index 0000000..14d1ef7 --- /dev/null +++ b/BKPS/OLD/XEU5/Indicators/x-saherelm.xama.indicator.mq5 @@ -0,0 +1,353 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 XAMA Indicator +// --------------------------------------------- +// Name: 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 XAMA Indicator" +#property strict + +// +// START Constants ... +// +#define ShortName "XAMA" + +// +// XAMA Indicator States ... +enum ENUM_X_XAMA_STATES +{ + X_XAMA_BULLISH = 1, + X_XAMA_BEARISH = -1, + X_XAMA_NEUTURAL = 0, +}; +// +// END Constants ... +// + +// +// START Inputs ... +// +input int length = 18; // Period +input int fastEMA = 2; // Fast EMA Period +input int slowEMA = 30; // Slow EMA Period +input int maShift = 0; // Shift +input ENUM_APPLIED_PRICE appliedTo = PRICE_CLOSE; // Applied To +// +// END Inputs ... +// + +// +// Includes Logging Library ... +#include "../Libraries/x-saherelm.log.lib.mq5" + +// +// 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 +#define stateBufferIndex 2 + +double maBuffer[]; +double maColorBuffer[]; +double stateBuffer[]; + +#property indicator_label1 "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 maHandler = INVALID_HANDLE; +// +// END Global Definitions: Variables, Properties and etc ... +// + +// +// START Event Handlers ... +// +// +// Initialization ... +int OnInit() +{ + // + // Validate Inputs ... + if (!ValidateInputs()) + { + return INIT_PARAMETERS_INCORRECT; + } + + // + logTag = ShortName; + + // + // Initializing MA Handler ... + maHandler = iAMA( + _Symbol, + _Period, + length, + fastEMA, + slowEMA, + maShift, + appliedTo); + if (maHandler == INVALID_HANDLE) + { + // + string message = "Error Initializing Ma Handler ..."; + LogMessage(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); +} + +// +// Calculations ... +// +// 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; + + // + // 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 ... + int maxLength = MathMax(fastEMA, slowEMA); + maxLength = MathMax(maxLength, length); + + // + // 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; +} + +// +// Define Indexes and Styles ... +void DefineBuffers() +{ + // + string maBufferLabel = "XAMA " + "(" + (string)length + ")"; + + // + // Ma Buffer ... + ArraySetAsSeries(maBuffer, true); + SetIndexBuffer(maBufferIndex, maBuffer, INDICATOR_DATA); + PlotIndexSetString(maBufferIndex, PLOT_LABEL, maBufferLabel); + + // + // Ma Color Buffer ... + ArraySetAsSeries(maColorBuffer, true); + SetIndexBuffer(maColorBufferIndex, maColorBuffer, INDICATOR_COLOR_INDEX); + + // + // State Buffer ... + ArraySetAsSeries(stateBuffer, true); + SetIndexBuffer(stateBufferIndex, stateBuffer, INDICATOR_CALCULATIONS); +} + +// +// Set Indicator Short Name and also we can define Buffers Labels ... +void SetIndicatorName() +{ + // + string indicatorShortName = ""; + StringConcatenate(indicatorShortName, ShortName, " ", "(", length, ")"); + + // + IndicatorSetString(INDICATOR_SHORTNAME, indicatorShortName); +} + +// +// 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; + + // + // Define State Value ... + // lineColorIndex == 0 => Bullish => 1; + // lineColorIndex == 1 => Neutural => 0; + // lineColorIndex == 2 => Bearish => -1; + double stateValue = + lineColorIndex == 0 ? X_XAMA_BULLISH : lineColorIndex == 2 ? X_XAMA_BEARISH + : X_XAMA_NEUTURAL; + + // + // Set Ma Buffer Color Index ... + maColorBuffer[bar_index] = lineColorIndex; + + // + // Set State Buffer Value ... + stateBuffer[bar_index] = stateValue; +} + +// +// END Functions ... +// diff --git a/BKPS/OLD/XEU5/Indicators/x-saherelm.xchlh.oscillator.mq5 b/BKPS/OLD/XEU5/Indicators/x-saherelm.xchlh.oscillator.mq5 new file mode 100644 index 0000000..5c74787 --- /dev/null +++ b/BKPS/OLD/XEU5/Indicators/x-saherelm.xchlh.oscillator.mq5 @@ -0,0 +1,753 @@ +////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 Cycle Channel LH Oscillator +// --------------------------------------------------- +// Name: XCHLH +// Description: detecting HH and LL based on cycles ... +// +// +// 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 XCHLH Oscillator" +#property strict + +// +// START Constants ... +// +#define ShortName "XCHLH" + +// +// XCHLH Hot States ... +enum ENUM_X_XCHLH_HOT_STATES +{ + X_XCHLH_HOT_HH = 1, + X_XCHLH_NEUTURAL = 0, + X_XCHLH_HOT_LL = -1, +}; + +// +// Including Models Library ... +#include "../Libraries/x-saherelm.models.lib.mq5" +// +// END Constants ... +// + +// +// START Inputs ... +// +// +// Common ... +input group "Hot Areas"; +input bool drawHotAreas = true; // Draw Hot Areas Symbol +input uchar hotHHArrowCode = 234; // Hot HH Arrow Code +input color hotHHArrowColor = clrAqua; // Hot HH Arrow Color +input uchar hotLLArrowCode = 233; // Hot LL Arrow Code +input color hotLLArrowColor = clrFuchsia; // Hot LL Arrow Color + +// +// LC Inputs ... +input group "Long Cycle"; +input group "LC Market"; +input int lcLength = 28; // Length +input double lcThresholdInPips = 0.3; // Threshold In Pips +input ENUM_SERIESMODE lcHHMode = MODE_HIGH; // Highest High Calculation Method +input ENUM_SERIESMODE lcLLMode = MODE_LOW; // Lowest Low Calculation Method +input group "LC Style"; +input int lcDrawWidth = 1; // Draw Width +input ENUM_DRAW_TYPE lcDrawType = DRAW_LINE; // Draw Type +input ENUM_LINE_STYLE lcDrawStyle = STYLE_DOT; // Draw Style +input color lcHHColor = clrAqua; // Highest High Color +input color lcLLColor = clrFuchsia; // Lowest Low Color +input group "LC Drawings"; +input bool lcDrawHH = true; // Draw Highest High +input bool lcDrawLL = true; // Draw Lowest Low + +// +// MC Inputs ... +input group "Medium Cycle"; +input group "MC Market"; +input int mcLength = 14; // Length +input double mcThresholdInPips = 0.3; // Threshold In Pips +input ENUM_SERIESMODE mcHHMode = MODE_HIGH; // Highest High Calculation Method +input ENUM_SERIESMODE mcLLMode = MODE_LOW; // Lowest Low Calculation Method +input group "MC Style"; +input int mcDrawWidth = 1; // Draw Width +input ENUM_DRAW_TYPE mcDrawType = DRAW_LINE; // Draw Type +input ENUM_LINE_STYLE mcDrawStyle = STYLE_DOT; // Draw Style +input color mcHHColor = clrLime; // Highest High Color +input color mcLLColor = clrRed; // Lowest Low Color +input group "MC Drawings"; +input bool mcDrawHH = true; // Draw Highest High +input bool mcDrawLL = true; // Draw Lowest Low + +// +// SC Inputs ... +input group "Short Cycle"; +input group "SC Market"; +input int scLength = 7; // Length +input double scThresholdInPips = 0.3; // Threshold In Pips +input ENUM_SERIESMODE scHHMode = MODE_HIGH; // Highest High Calculation Method +input ENUM_SERIESMODE scLLMode = MODE_LOW; // Lowest Low Calculation Method +input group "SC Style"; +input int scDrawWidth = 1; // Draw Width +input ENUM_DRAW_TYPE scDrawType = DRAW_LINE; // Draw Type +input ENUM_LINE_STYLE scDrawStyle = STYLE_DOT; // Draw Style +input color scHHColor = clrLightBlue; // Highest High Color +input color scLLColor = clrLightSalmon; // Lowest Low Color +input group "SC Drawings"; +input bool scDrawHH = true; // Draw Highest High +input bool scDrawLL = true; // Draw Lowest Low +// +// END Inputs ... +// + +// +// Includes Logging Library ... +#include "../Libraries/x-saherelm.log.lib.mq5"; + +// +// Includes Common Library ... +#include "../Libraries/x-saherelm.common.lib.mq5"; + +// +// Includes Draw Library ... +#include "../Libraries/x-saherelm.draw.lib.mq5"; + +// +// START Buffers ... +// +#property indicator_separate_window + +// +#property indicator_buffers 7 +#property indicator_plots 6 + +// +// LC ... +#define lcHHBufferIndex 0 +#define lcLLBufferIndex 1 + +// +double lcHHBuffer[]; +double lcLLBuffer[]; + +// +// MC ... +#define mcHHBufferIndex 2 +#define mcLLBufferIndex 3 + +// +double mcHHBuffer[]; +double mcLLBuffer[]; + +// +// SC ... +#define scHHBufferIndex 4 +#define scLLBufferIndex 5 + +// +double scHHBuffer[]; +double scLLBuffer[]; + +// +// Hot State ... +// +#define hotStateBufferIndex 6 + +// +double hotStateBuffer[]; +// +// 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 (!ValidateInputs()) + { + return INIT_PARAMETERS_INCORRECT; + } + + // + logTag = ShortName; + drawPrefix = ShortName; + + // + // 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 ... + + // + // ReDraw Chart ... + ChartRedraw(); + + // + // De Init Draw Library ... + OnDeinitDrawLibrary(); + + // + Comment(""); +} + +// +// Calculations ... +// +// 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; + + // + // 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 ... + int maxLength = MathMax(lcLength, mcLength); + maxLength = MathMax(maxLength, scLength); + + // + limit = prev_calculated < maxLength ? rates_total - (maxLength + 1) : rates_total - prev_calculated; + + // + // Main Loop ... + for (int i = limit; i >= 0 && !IsStopped(); i--) + { + // + CalculateBuffers(i); + } + + // + return rates_total; +} +// +// END Event Handlers ... +// + +// +// START Functions ... +// +// +// Validate Input Args for Initialization ... +bool ValidateInputs() +{ + // + bool result = false; + + // + // Validate Args ... + bool isLCInputsValid = + lcLength >= 4 && + lcLength > mcLength && + lcLength > scLength; + bool isMCInputsValid = + mcLength >= 4 && + mcLength > scLength && + mcLength < lcLength; + bool isSCInputsValid = + scLength >= 4 && + scLength < mcLength && + scLength < lcLength; + if ( + isLCInputsValid && + isMCInputsValid && + isSCInputsValid) + { + result = true; + } + + // + return result; +} + +// +// Define Indexes and Styles ... +void DefineBuffers() +{ + // + // LC ... + LCDefineBuffers(); + + // + // MC ... + MCDefineBuffers(); + + // + // SC ... + SCDefineBuffers(); + + // + // Hot State Buffer ... + HotStateDefineBuffers(); +} + +// +// Set Indicator Short Name and also we can define Buffers Labels ... +void SetIndicatorName() +{ + // + string indicatorShortName = ""; + StringConcatenate(indicatorShortName, ShortName, ""); + + // + IndicatorSetString(INDICATOR_SHORTNAME, indicatorShortName); +} + +// +// Calculate Buffers ... +void CalculateBuffers( + int bar_index // Current Candle Index ... +) +{ + // + // LC ... + LCCalculateBuffers(bar_index); + + // + // MC ... + MCCalculateBuffers(bar_index); + + // + // SC ... + SCCalculateBuffers(bar_index); + + // + // SIGNAL ... + SignalCalculateBuffers(bar_index); + + // + // HOT State Buffer ... + HotStateCalculateBuffers(bar_index); + + // + // After all Calculations we are ready to Draw what we want ... + DrawBuffers(bar_index); +} + +// +// LC Buffers Definitions ... +void LCDefineBuffers() +{ + // + // LC HH Buffer ... + string lcHHBufferLabel = ShortName + " LC HH (" + (string)lcLength + ")"; + ENUM_DRAW_TYPE lcHHDrawType = lcDrawHH ? lcDrawType : DRAW_NONE; + ArraySetAsSeries(lcHHBuffer, true); + SetIndexBuffer(lcHHBufferIndex, lcHHBuffer, INDICATOR_DATA); + PlotIndexSetInteger(lcHHBufferIndex, PLOT_DRAW_BEGIN, lcLength); + PlotIndexSetString(lcHHBufferIndex, PLOT_LABEL, lcHHBufferLabel); + PlotIndexSetInteger(lcHHBufferIndex, PLOT_LINE_COLOR, lcHHColor); + PlotIndexSetInteger(lcHHBufferIndex, PLOT_LINE_STYLE, lcDrawStyle); + PlotIndexSetInteger(lcHHBufferIndex, PLOT_LINE_WIDTH, lcDrawWidth); + PlotIndexSetInteger(lcHHBufferIndex, PLOT_DRAW_TYPE, lcHHDrawType); + + // + // LC LL Buffer ... + string lcLLBufferLabel = ShortName + " LC LL (" + (string)lcLength + ")"; + ENUM_DRAW_TYPE lcLLDrawType = lcDrawLL ? lcDrawType : DRAW_NONE; + ArraySetAsSeries(lcLLBuffer, true); + SetIndexBuffer(lcLLBufferIndex, lcLLBuffer, INDICATOR_DATA); + PlotIndexSetInteger(lcLLBufferIndex, PLOT_DRAW_BEGIN, lcLength); + PlotIndexSetString(lcLLBufferIndex, PLOT_LABEL, lcLLBufferLabel); + PlotIndexSetInteger(lcLLBufferIndex, PLOT_LINE_COLOR, lcLLColor); + PlotIndexSetInteger(lcLLBufferIndex, PLOT_LINE_STYLE, lcDrawStyle); + PlotIndexSetInteger(lcLLBufferIndex, PLOT_LINE_WIDTH, lcDrawWidth); + PlotIndexSetInteger(lcLLBufferIndex, PLOT_DRAW_TYPE, lcLLDrawType); +} + +// +// MC Buffers Definitions ... +void MCDefineBuffers() +{ + // + // MC HH Buffer ... + string mcHHBufferLabel = ShortName + " MC HH (" + (string)mcLength + ")"; + ENUM_DRAW_TYPE mcHHDrawType = mcDrawHH ? lcDrawType : DRAW_NONE; + ArraySetAsSeries(mcHHBuffer, true); + SetIndexBuffer(mcHHBufferIndex, mcHHBuffer, INDICATOR_DATA); + PlotIndexSetInteger(mcHHBufferIndex, PLOT_DRAW_BEGIN, mcLength); + PlotIndexSetString(mcHHBufferIndex, PLOT_LABEL, mcHHBufferLabel); + PlotIndexSetInteger(mcHHBufferIndex, PLOT_LINE_COLOR, mcHHColor); + PlotIndexSetInteger(mcHHBufferIndex, PLOT_LINE_STYLE, mcDrawStyle); + PlotIndexSetInteger(mcHHBufferIndex, PLOT_LINE_WIDTH, mcDrawWidth); + PlotIndexSetInteger(mcHHBufferIndex, PLOT_DRAW_TYPE, mcHHDrawType); + + // + // MC LL Buffer ... + string mcLLBufferLabel = ShortName + " MC LL (" + (string)mcLength + ")"; + ENUM_DRAW_TYPE mcLLDrawType = mcDrawLL ? lcDrawType : DRAW_NONE; + ArraySetAsSeries(mcLLBuffer, true); + SetIndexBuffer(mcLLBufferIndex, mcLLBuffer, INDICATOR_DATA); + PlotIndexSetInteger(mcLLBufferIndex, PLOT_DRAW_BEGIN, mcLength); + PlotIndexSetString(mcLLBufferIndex, PLOT_LABEL, mcLLBufferLabel); + PlotIndexSetInteger(mcLLBufferIndex, PLOT_LINE_COLOR, mcLLColor); + PlotIndexSetInteger(mcLLBufferIndex, PLOT_LINE_STYLE, mcDrawStyle); + PlotIndexSetInteger(mcLLBufferIndex, PLOT_LINE_WIDTH, mcDrawWidth); + PlotIndexSetInteger(mcLLBufferIndex, PLOT_DRAW_TYPE, mcLLDrawType); +} + +// +// SC Buffers Definitions ... +void SCDefineBuffers() +{ + // + // SC HH Buffer ... + string scHHBufferLabel = ShortName + " SC HH (" + (string)scLength + ")"; + ENUM_DRAW_TYPE scHHDrawType = scDrawHH ? lcDrawType : DRAW_NONE; + ArraySetAsSeries(scHHBuffer, true); + SetIndexBuffer(scHHBufferIndex, scHHBuffer, INDICATOR_DATA); + PlotIndexSetInteger(scHHBufferIndex, PLOT_DRAW_BEGIN, scLength); + PlotIndexSetString(scHHBufferIndex, PLOT_LABEL, scHHBufferLabel); + PlotIndexSetInteger(scHHBufferIndex, PLOT_LINE_COLOR, scHHColor); + PlotIndexSetInteger(scHHBufferIndex, PLOT_LINE_STYLE, scDrawStyle); + PlotIndexSetInteger(scHHBufferIndex, PLOT_LINE_WIDTH, scDrawWidth); + PlotIndexSetInteger(scHHBufferIndex, PLOT_DRAW_TYPE, scHHDrawType); + + // + // SC LL Buffer ... + string scLLBufferLabel = ShortName + " SC LL (" + (string)scLength + ")"; + ENUM_DRAW_TYPE scLLDrawType = scDrawLL ? lcDrawType : DRAW_NONE; + ArraySetAsSeries(scLLBuffer, true); + SetIndexBuffer(scLLBufferIndex, scLLBuffer, INDICATOR_DATA); + PlotIndexSetInteger(scLLBufferIndex, PLOT_DRAW_BEGIN, scLength); + PlotIndexSetString(scLLBufferIndex, PLOT_LABEL, scLLBufferLabel); + PlotIndexSetInteger(scLLBufferIndex, PLOT_LINE_COLOR, scLLColor); + PlotIndexSetInteger(scLLBufferIndex, PLOT_LINE_STYLE, scDrawStyle); + PlotIndexSetInteger(scLLBufferIndex, PLOT_LINE_WIDTH, scDrawWidth); + PlotIndexSetInteger(scLLBufferIndex, PLOT_DRAW_TYPE, scLLDrawType); +} + +// +// Hot State Buffer ... +void HotStateDefineBuffers() +{ + // + // Hot State Buffer ... + ArraySetAsSeries(hotStateBuffer, true); + SetIndexBuffer(hotStateBufferIndex, hotStateBuffer, INDICATOR_CALCULATIONS); +} + +// +// LC Calculations ... +void LCCalculateBuffers( + int bar_index // Current Candle Index ... +) +{ + // + // Detect Cycle HH and LL ... + int length = lcLength; + ENUM_SERIESMODE hhMode = lcHHMode; + ENUM_SERIESMODE llMode = lcLLMode; + double threshold = PipsToPrice(lcThresholdInPips); + double hh = GetHighestHigh( + length, + bar_index, + hhMode); + double hhValue = hh + threshold; + double ll = GetLowestLow( + length, + bar_index, + llMode); + double llValue = ll - threshold; + + // + lcHHBuffer[bar_index] = hhValue; + lcLLBuffer[bar_index] = llValue; +} + +// +// MC Calculations ... +void MCCalculateBuffers( + int bar_index // Current Candle Index ... +) +{ + // + // Detect Cycle HH and LL ... + int length = mcLength; + ENUM_SERIESMODE hhMode = mcHHMode; + ENUM_SERIESMODE llMode = mcLLMode; + double threshold = PipsToPrice(mcThresholdInPips); + double hh = GetHighestHigh( + length, + bar_index, + hhMode); + double hhValue = hh + threshold; + double ll = GetLowestLow( + length, + bar_index, + llMode); + double llValue = ll - threshold; + + // + mcHHBuffer[bar_index] = hhValue; + mcLLBuffer[bar_index] = llValue; +} + +// +// SC Calculations ... +void SCCalculateBuffers( + int bar_index // Current Candle Index ... +) +{ + // + // Detect Cycle HH and LL ... + int length = scLength; + ENUM_SERIESMODE hhMode = scHHMode; + ENUM_SERIESMODE llMode = scLLMode; + double threshold = PipsToPrice(scThresholdInPips); + double hh = GetHighestHigh( + length, + bar_index, + hhMode); + double hhValue = hh + threshold; + double ll = GetLowestLow( + length, + bar_index, + llMode); + double llValue = ll - threshold; + + // + scHHBuffer[bar_index] = hhValue; + scLLBuffer[bar_index] = llValue; +} + +// +// SIGNAL Calculations ... +void SignalCalculateBuffers( + int bar_index // Current Candle Index ... +) +{ + // + // LC Values ... + double lcHH = lcHHBuffer[bar_index]; + double lcLL = lcLLBuffer[bar_index]; + double lcDelta = lcHH - lcLL; + double lcAvg = lcDelta / 2; + + // + // MC Values ... + double mcHH = mcHHBuffer[bar_index]; + double mcLL = mcLLBuffer[bar_index]; + double mcDelta = mcHH - mcLL; + double mcAvg = mcDelta / 2; + + // + // SC Values ... + double scHH = scHHBuffer[bar_index]; + double scLL = scLLBuffer[bar_index]; + double scDelta = scHH - scLL; + double scAvg = scDelta / 2; + + // + // Min Value ... + double minValue = MathMin( + scLL, mcLL); + minValue = MathMin( + lcLL, minValue); + + // + // Max Value ... + double maxValue = MathMin( + scHH, mcHH); + maxValue = MathMin( + lcHH, maxValue); +} + +// +// HOT State Calculate Buffers ... +void HotStateCalculateBuffers( + int bar_index // Current Candle Index ... +) +{ + // + // LC ... + double lcHH = lcHHBuffer[bar_index]; + double lcLL = lcLLBuffer[bar_index]; + // + double lcHH1 = lcHHBuffer[bar_index + 1]; + double lcLL1 = lcLLBuffer[bar_index + 1]; + + // + // MC ... + double mcHH = mcHHBuffer[bar_index]; + double mcLL = mcLLBuffer[bar_index]; + // + double mcHH1 = mcHHBuffer[bar_index + 1]; + double mcLL1 = mcLLBuffer[bar_index + 1]; + + // + // SC ... + double scHH = scHHBuffer[bar_index]; + double scLL = scLLBuffer[bar_index]; + // + double scHH1 = scHHBuffer[bar_index + 1]; + double scLL1 = scLLBuffer[bar_index + 1]; + + // + bool isHotLLState = scLL == mcLL && mcLL == lcLL; + bool isHotLLState1 = scLL1 == mcLL1 && mcLL1 == lcLL1; + // + bool isHotHHState = scHH == mcHH && mcHH == lcHH; + bool isHotHHState1 = scHH1 == mcHH1 && mcHH1 == lcHH1; + + // + bool isHotLL = isHotLLState && !isHotLLState1; + bool isHotHH = isHotHHState && !isHotHHState1; + + // + double hotStateValue = X_XCHLH_NEUTURAL; + if (isHotHH) + { + hotStateValue = X_XCHLH_HOT_HH; + } + else if (isHotLL) + { + hotStateValue = X_XCHLH_HOT_LL; + } + + // + hotStateBuffer[bar_index] = hotStateValue; +} + +// +// Draw Buffers ... +void DrawBuffers( + int bar_index // Current Candle Index ... +) +{ + // + // General Requirements ... + + // + // Retrieve Candle Model ... + XOHCL candle = GetCandle(bar_index); + datetime time = iTime(_Symbol, _Period, bar_index); + + // + // Draw Arrow on Hot Areas ... + if (drawHotAreas) + { + // + double hotStateValue = hotStateBuffer[bar_index]; + bool isHotHHArea = hotStateValue == 1; + bool isHotLLArea = hotStateValue == -1; + if (isHotHHArea || isHotLLArea) + { + // + bool isHH = isHotHHArea; + + // + double price = isHH ? candle.high : candle.low; + ENUM_ARROW_ANCHOR anchor = isHH ? ANCHOR_BOTTOM : ANCHOR_TOP; + color clr = isHH ? hotHHArrowColor : hotLLArrowColor; + uchar arrowCode = isHH ? hotHHArrowCode : hotLLArrowCode; + string name = "HOT " + (isHH ? "HH" : "LL") + "_" + (string)price + "_" + (string)time; + + // + DrawArrow( + 0, + name, + 0, + time, + price, + arrowCode, + anchor, + clr, + STYLE_SOLID, + 1); + } + } +} +// +// END Functions ... +// diff --git a/BKPS/OLD/XEU5/Indicators/x-saherelm.xchma.oscillator.mq5 b/BKPS/OLD/XEU5/Indicators/x-saherelm.xchma.oscillator.mq5 new file mode 100644 index 0000000..12d6c69 --- /dev/null +++ b/BKPS/OLD/XEU5/Indicators/x-saherelm.xchma.oscillator.mq5 @@ -0,0 +1,1153 @@ +/////////////////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 Cycle Channel Moving Averages Oscillator +// ---------------------------------------------------------------- +// Name: XCHMA +// Description: trend detecting based on cycles ... +// +// +// 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 XCHMA Oscillator" +#property strict + +// +// START Constants ... +// +#define ShortName "XCHMA" + +// +// XCHMA Oscillator Cycles State Presentation ... +enum ENUM_XCHMA_CYCLE_STATES +{ + X_XCHMA_FAST_CROSSED_OVER_SLOW = 2, + X_XCHMA_FAST_OVER_SLOW = 1, + X_XCHMA_NEUTURAL = 0, + X_XCHMA_FAST_UNDER_SLOW = -1, + X_XCHMA_FAST_CROSSED_UNDER_SLOW = -2, +}; +// +// END Constants ... +// + +// +// START Inputs ... +// +// +// Common ... +input group "Hot Areas"; +input bool drawHotAreas = true; // Draw Hot Areas Symbol +input uchar hotBullishArrowCode = 228; // Hot Bullish Arrow Code +input color hotBullishArrowColor = clrAqua; // Hot Bullish Arrow Color +input uchar hotBearishArrowCode = 230; // Hot Bearish Arrow Code +input color hotBearishArrowColor = clrFuchsia; // Hot Bearish Arrow Color + +// +// LC Inputs ... +input group "Long Cycle"; +input group "LC Market"; +input int lcFastLength = 20; // Fast Length +input int lcSlowLength = 50; // Slow Length +input ENUM_MA_METHOD lcMethod = MODE_EMA; // Calculation Method +input ENUM_APPLIED_PRICE lcAppliedTo = PRICE_CLOSE; // Applied To +input group "LC Style"; +input int lcDrawWidth = 1; // Draw Width +input ENUM_DRAW_TYPE lcDrawType = DRAW_LINE; // Draw Type +input ENUM_LINE_STYLE lcDrawStyle = STYLE_DOT; // Draw Style +input color lcFastColor = clrAqua; // Fast Color +input color lcSlowColor = clrFuchsia; // Slow Color +input group "LC Drawings"; +input bool lcDrawFast = true; // Draw Fast +input bool lcDrawSlow = true; // Draw Slow +input bool lcDrawCrosses = true; // Draw Cross Lines + +// +// MC Inputs ... +input group "Medium Cycle"; +input group "MC Market"; +input int mcFastLength = 10; // Fast Length +input int mcSlowLength = 30; // Slow Length +input ENUM_MA_METHOD mcMethod = MODE_EMA; // Calculation Method +input ENUM_APPLIED_PRICE mcAppliedTo = PRICE_CLOSE; // Applied To +input group "MC Style"; +input int mcDrawWidth = 1; // Draw Width +input ENUM_DRAW_TYPE mcDrawType = DRAW_LINE; // Draw Type +input ENUM_LINE_STYLE mcDrawStyle = STYLE_DOT; // Draw Style +input color mcFastColor = clrLime; // Fast Color +input color mcSlowColor = clrRed; // Slow Color +input group "MC Drawings"; +input bool mcDrawFast = true; // Draw Fast +input bool mcDrawSlow = true; // Draw Slow +input bool mcDrawCrosses = false; // Draw Cross Lines + +// +// SC Inputs ... +input group "Short Cycle"; +input group "SC Market"; +input int scFastLength = 7; // Fast Length +input int scSlowLength = 14; // Slow Length +input ENUM_MA_METHOD scMethod = MODE_EMA; // Calculation Method +input ENUM_APPLIED_PRICE scAppliedTo = PRICE_CLOSE; // Applied To +input group "SC Style"; +input int scDrawWidth = 1; // Draw Width +input ENUM_DRAW_TYPE scDrawType = DRAW_LINE; // Draw Type +input ENUM_LINE_STYLE scDrawStyle = STYLE_SOLID; // Draw Style +input color scFastColor = clrLightBlue; // Fast Color +input color scSlowColor = clrLightSalmon; // Slow Color +input group "SC Drawings"; +input bool scDrawFast = true; // Draw Fast +input bool scDrawSlow = true; // Draw Slow +input bool scDrawCrosses = false; // Draw Cross Lines +// +// END Inputs ... +// + +// +// Includes Logging Library ... +#include "../Libraries/x-saherelm.log.lib.mq5" + +// +// Includes Common Library ... +#include "../Libraries/x-saherelm.common.lib.mq5" + +// +// Includes Draw Library ... +#include "../Libraries/x-saherelm.draw.lib.mq5" + +// +// START Buffers ... +// +#property indicator_separate_window + +// +#property indicator_buffers 7 +#property indicator_plots 6 + +// +// LC ... +#define lcFastBufferIndex 0 +#define lcSlowBufferIndex 1 + +// +double lcFastBuffer[]; +double lcSlowBuffer[]; + +// +// MC ... +#define mcFastBufferIndex 2 +#define mcSlowBufferIndex 3 + +// +double mcFastBuffer[]; +double mcSlowBuffer[]; + +// +// SC ... +#define scFastBufferIndex 4 +#define scSlowBufferIndex 5 + +// +double scFastBuffer[]; +double scSlowBuffer[]; + +// +// Hot State ... +// +#define hotStateBufferIndex 6 + +// +double hotStateBuffer[]; +// +// END Buffers ... +// + +// +// START Global Definitions: Variables, Properties and etc ... +// +// +// LC ... +int lcFastHandler = INVALID_HANDLE; +int lcSlowHandler = INVALID_HANDLE; + +// +// MC ... +int mcFastHandler = INVALID_HANDLE; +int mcSlowHandler = INVALID_HANDLE; + +// +// SC ... +int scFastHandler = INVALID_HANDLE; +int scSlowHandler = INVALID_HANDLE; +// +// END Global Definitions: Variables, Properties and etc ... +// + +// +// START Event Handlers ... +// +// +// Initialization ... +int OnInit() +{ + // + // Validate Inputs ... + if (!ValidateInputs()) + { + return INIT_PARAMETERS_INCORRECT; + } + + // + logTag = ShortName; + drawPrefix = ShortName; + + // + // Define Index Buffers ... + DefineBuffers(); + + // + // Set Indicator ShortName ... + SetIndicatorName(); + + // + // Init All Required Handlers ... + if (!InitHandlers()) + { + 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 ... + + // + // ReDraw Chart ... + ChartRedraw(); + + // + // De Init Draw Library ... + OnDeinitDrawLibrary(); + + // + Comment(""); +} + +// +// Calculations ... +// +// 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; + + // + // 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 ... + int maxLength = MathMax(lcFastLength, lcSlowLength); + + // + // Get Retrieved Values from indicators ... + // + // LC ... + int lcFastCalculatedBars = BarsCalculated(lcFastHandler); + int lcSlowCalculatedBars = BarsCalculated(lcSlowHandler); + + // + // MC ... + int mcFastCalculatedBars = BarsCalculated(mcFastHandler); + int mcSlowCalculatedBars = BarsCalculated(mcSlowHandler); + + // + // SC ... + int scFastCalculatedBars = BarsCalculated(scFastHandler); + int scSlowCalculatedBars = BarsCalculated(scSlowHandler); + + // + // Check Calculated Bars ... + if ( + // + // LC ... + lcFastCalculatedBars < maxLength || + lcSlowCalculatedBars < maxLength || + // + // MC ... + mcFastCalculatedBars < maxLength || + mcSlowCalculatedBars < maxLength || + // + // SC ... + scFastCalculatedBars < maxLength || + scSlowCalculatedBars < maxLength) + { + return prev_calculated; + } + + // + limit = prev_calculated < maxLength ? rates_total - (maxLength + 1) : rates_total - prev_calculated; + + // + // Copy Buffers from indicators ... + // + // LC ... + int lcFastCopiedItems = CopyBuffer(lcFastHandler, 0, 0, limit + 1, lcFastBuffer); + int lcSlowCopiedItems = CopyBuffer(lcSlowHandler, 0, 0, limit + 1, lcSlowBuffer); + + // + // MC ... + int mcFastCopiedItems = CopyBuffer(mcFastHandler, 0, 0, limit + 1, mcFastBuffer); + int mcSlowCopiedItems = CopyBuffer(mcSlowHandler, 0, 0, limit + 1, mcSlowBuffer); + + // + // SC ... + int scFastCopiedItems = CopyBuffer(scFastHandler, 0, 0, limit + 1, scFastBuffer); + int scSlowCopiedItems = CopyBuffer(scSlowHandler, 0, 0, limit + 1, scSlowBuffer); + + // + // Check Copied Items Number ... + if ( + // + // LC ... + lcFastCopiedItems <= 0 || + lcSlowCopiedItems <= 0 || + // + // MC ... + mcFastCopiedItems <= 0 || + mcSlowCopiedItems <= 0 || + // + // MC ... + mcFastCopiedItems <= 0 || + mcSlowCopiedItems <= 0) + { + return prev_calculated; + } + + // + // Main Loop ... + for (int i = limit; i >= 0 && !IsStopped(); i--) + { + // + CalculateBuffers(i); + } + + // + return rates_total; +} +// +// END Event Handlers ... +// + +// +// START Functions ... +// +// +// Validate Input Args for Initialization ... +bool ValidateInputs() +{ + // + bool result = false; + + // + // Validate Args ... + bool isLCInputsValid = lcFastLength >= 4 && lcSlowLength > lcFastLength; + bool isMCInputsValid = mcFastLength >= 4 && mcSlowLength > mcFastLength; + bool isSCInputsValid = scFastLength >= 4 && scSlowLength > scFastLength; + if ( + isLCInputsValid && + isMCInputsValid && + isSCInputsValid && + lcFastLength > mcFastLength && + mcFastLength > scFastLength) + { + result = true; + } + + // + return result; +} + +// +// Define Indexes and Styles ... +void DefineBuffers() +{ + // + // LC ... + LCDefineBuffers(); + + // + // MC ... + MCDefineBuffers(); + + // + // SC ... + SCDefineBuffers(); + + // + // Hot State Buffer ... + HotStateDefineBuffers(); +} + +// +// Init Handlers ... +bool InitHandlers() +{ + // + bool result = false; + + // + // LC ... + result = LCInitHandlers(); + if (!result) + { + return result; + } + + // + // MC ... + result = MCInitHandlers(); + if (!result) + { + return result; + } + + // + // SC ... + result = SCInitHandlers(); + if (!result) + { + return result; + } + + // + return result; +} + +// +// Set Indicator Short Name and also we can define Buffers Labels ... +void SetIndicatorName() +{ + // + string indicatorShortName = ""; + StringConcatenate(indicatorShortName, ShortName, ""); + + // + IndicatorSetString(INDICATOR_SHORTNAME, indicatorShortName); +} + +// +// Calculate Buffers ... +void CalculateBuffers( + int bar_index // Current Candle Index ... +) +{ + // + // HOT State Buffer ... + HotStateCalculateBuffers(bar_index); + + // + // After all Calculations we are ready to Draw what we want ... + DrawBuffers(bar_index); +} + +// +// LC Buffers Definitions ... +void LCDefineBuffers() +{ + // + // LC Fast Buffer ... + string lcFastBufferLabel = ShortName + " LC Fast (" + (string)lcFastLength + ")"; + ENUM_DRAW_TYPE lcFastDrawType = lcDrawFast ? lcDrawType : DRAW_NONE; + ArraySetAsSeries(lcFastBuffer, true); + SetIndexBuffer(lcFastBufferIndex, lcFastBuffer, INDICATOR_DATA); + PlotIndexSetString(lcFastBufferIndex, PLOT_LABEL, lcFastBufferLabel); + PlotIndexSetInteger(lcFastBufferIndex, PLOT_LINE_COLOR, lcFastColor); + PlotIndexSetInteger(lcFastBufferIndex, PLOT_LINE_STYLE, lcDrawStyle); + PlotIndexSetInteger(lcFastBufferIndex, PLOT_LINE_WIDTH, lcDrawWidth); + PlotIndexSetInteger(lcFastBufferIndex, PLOT_DRAW_BEGIN, lcFastLength); + PlotIndexSetInteger(lcFastBufferIndex, PLOT_DRAW_TYPE, lcFastDrawType); + + // + // LC Slow Buffer ... + string lcSlowBufferLabel = ShortName + " LC Slow (" + (string)lcSlowLength + ")"; + ENUM_DRAW_TYPE lcSlowDrawType = lcDrawSlow ? lcDrawType : DRAW_NONE; + ArraySetAsSeries(lcSlowBuffer, true); + SetIndexBuffer(lcSlowBufferIndex, lcSlowBuffer, INDICATOR_DATA); + PlotIndexSetString(lcSlowBufferIndex, PLOT_LABEL, lcSlowBufferLabel); + PlotIndexSetInteger(lcSlowBufferIndex, PLOT_LINE_COLOR, lcSlowColor); + PlotIndexSetInteger(lcSlowBufferIndex, PLOT_LINE_STYLE, lcDrawStyle); + PlotIndexSetInteger(lcSlowBufferIndex, PLOT_LINE_WIDTH, lcDrawWidth); + PlotIndexSetInteger(lcSlowBufferIndex, PLOT_DRAW_BEGIN, lcSlowLength); + PlotIndexSetInteger(lcSlowBufferIndex, PLOT_DRAW_TYPE, lcSlowDrawType); +} + +// +// MC Buffers Definitions ... +void MCDefineBuffers() +{ + // + // MC Fast Buffer ... + string mcFastBufferLabel = ShortName + " MC Fast (" + (string)mcFastLength + ")"; + ENUM_DRAW_TYPE mcFastDrawType = mcDrawFast ? lcDrawType : DRAW_NONE; + ArraySetAsSeries(mcFastBuffer, true); + SetIndexBuffer(mcFastBufferIndex, mcFastBuffer, INDICATOR_DATA); + PlotIndexSetString(mcFastBufferIndex, PLOT_LABEL, mcFastBufferLabel); + PlotIndexSetInteger(mcFastBufferIndex, PLOT_LINE_COLOR, mcFastColor); + PlotIndexSetInteger(mcFastBufferIndex, PLOT_LINE_STYLE, mcDrawStyle); + PlotIndexSetInteger(mcFastBufferIndex, PLOT_LINE_WIDTH, mcDrawWidth); + PlotIndexSetInteger(mcFastBufferIndex, PLOT_DRAW_BEGIN, mcFastLength); + PlotIndexSetInteger(mcFastBufferIndex, PLOT_DRAW_TYPE, mcFastDrawType); + + // + // MC Slow Buffer ... + string mcSlowBufferLabel = ShortName + " MC Slow (" + (string)mcSlowLength + ")"; + ENUM_DRAW_TYPE mcSlowDrawType = mcDrawSlow ? lcDrawType : DRAW_NONE; + ArraySetAsSeries(mcSlowBuffer, true); + SetIndexBuffer(mcSlowBufferIndex, mcSlowBuffer, INDICATOR_DATA); + PlotIndexSetString(mcSlowBufferIndex, PLOT_LABEL, mcSlowBufferLabel); + PlotIndexSetInteger(mcSlowBufferIndex, PLOT_LINE_COLOR, mcSlowColor); + PlotIndexSetInteger(mcSlowBufferIndex, PLOT_LINE_STYLE, mcDrawStyle); + PlotIndexSetInteger(mcSlowBufferIndex, PLOT_LINE_WIDTH, mcDrawWidth); + PlotIndexSetInteger(mcSlowBufferIndex, PLOT_DRAW_BEGIN, mcSlowLength); + PlotIndexSetInteger(mcSlowBufferIndex, PLOT_DRAW_TYPE, mcSlowDrawType); +} + +// +// SC Buffers Definitions ... +void SCDefineBuffers() +{ + // + // SC Fast Buffer ... + string scFastBufferLabel = ShortName + " SC Fast (" + (string)scFastLength + ")"; + ENUM_DRAW_TYPE scFastDrawType = scDrawFast ? lcDrawType : DRAW_NONE; + ArraySetAsSeries(scFastBuffer, true); + SetIndexBuffer(scFastBufferIndex, scFastBuffer, INDICATOR_DATA); + PlotIndexSetString(scFastBufferIndex, PLOT_LABEL, scFastBufferLabel); + PlotIndexSetInteger(scFastBufferIndex, PLOT_LINE_COLOR, scFastColor); + PlotIndexSetInteger(scFastBufferIndex, PLOT_LINE_STYLE, scDrawStyle); + PlotIndexSetInteger(scFastBufferIndex, PLOT_LINE_WIDTH, scDrawWidth); + PlotIndexSetInteger(scFastBufferIndex, PLOT_DRAW_BEGIN, scFastLength); + PlotIndexSetInteger(scFastBufferIndex, PLOT_DRAW_TYPE, scFastDrawType); + + // + // SC Slow Buffer ... + string scSlowBufferLabel = ShortName + " SC Slow (" + (string)scSlowLength + ")"; + ENUM_DRAW_TYPE scSlowDrawType = scDrawSlow ? lcDrawType : DRAW_NONE; + ArraySetAsSeries(scSlowBuffer, true); + SetIndexBuffer(scSlowBufferIndex, scSlowBuffer, INDICATOR_DATA); + PlotIndexSetString(scSlowBufferIndex, PLOT_LABEL, scSlowBufferLabel); + PlotIndexSetInteger(scSlowBufferIndex, PLOT_LINE_COLOR, scSlowColor); + PlotIndexSetInteger(scSlowBufferIndex, PLOT_LINE_STYLE, scDrawStyle); + PlotIndexSetInteger(scSlowBufferIndex, PLOT_LINE_WIDTH, scDrawWidth); + PlotIndexSetInteger(scSlowBufferIndex, PLOT_DRAW_BEGIN, scSlowLength); + PlotIndexSetInteger(scSlowBufferIndex, PLOT_DRAW_TYPE, scSlowDrawType); +} + +// +// Hot State Buffer ... +void HotStateDefineBuffers() +{ + // + // Hot State Buffer ... + ArraySetAsSeries(hotStateBuffer, true); + SetIndexBuffer(hotStateBufferIndex, hotStateBuffer, INDICATOR_CALCULATIONS); +} + +// +// LC Init Handlers ... +bool LCInitHandlers() +{ + // + ResetLastError(); + + // + // LC Fast Handler ... + lcFastHandler = iMA( + _Symbol, + _Period, + lcFastLength, + 0, + lcMethod, + lcAppliedTo); + if (lcFastHandler == INVALID_HANDLE) + { + // + LogMessage("LC Fast Indicator initialization failed: " + (string)GetLastError()); + + // + return false; + } + + // + // LC Slow Handler ... + lcSlowHandler = iMA( + _Symbol, + _Period, + lcSlowLength, + 0, + lcMethod, + lcAppliedTo); + if (lcSlowHandler == INVALID_HANDLE) + { + // + LogMessage("LC Slow Indicator initialization failed: " + (string)GetLastError()); + + // + return false; + } + + // + return true; +} + +// +// MC Init Handlers ... +bool MCInitHandlers() +{ + // + ResetLastError(); + + // + // MC Fast Handler ... + mcFastHandler = iMA( + _Symbol, + _Period, + mcFastLength, + 0, + mcMethod, + mcAppliedTo); + if (mcFastHandler == INVALID_HANDLE) + { + // + LogMessage("MC Fast Indicator initialization failed: " + (string)GetLastError()); + + // + return false; + } + + // + // MC Slow Handler ... + mcSlowHandler = iMA( + _Symbol, + _Period, + mcSlowLength, + 0, + mcMethod, + mcAppliedTo); + if (mcSlowHandler == INVALID_HANDLE) + { + // + LogMessage("MC Slow Indicator initialization failed: " + (string)GetLastError()); + + // + return false; + } + + // + return true; +} + +// +// SC Init Handlers ... +bool SCInitHandlers() +{ + // + ResetLastError(); + + // + // SC Fast Handler ... + scFastHandler = iMA( + _Symbol, + _Period, + scFastLength, + 0, + scMethod, + scAppliedTo); + if (scFastHandler == INVALID_HANDLE) + { + // + LogMessage("SC Fast Indicator initialization failed: " + (string)GetLastError()); + + // + return false; + } + + // + // SC Slow Handler ... + scSlowHandler = iMA( + _Symbol, + _Period, + scSlowLength, + 0, + scMethod, + scAppliedTo); + if (scSlowHandler == INVALID_HANDLE) + { + // + LogMessage("SC Slow Indicator initialization failed: " + (string)GetLastError()); + + // + return false; + } + + // + return true; +} + +// +// LC State ... +double GetLCState( + int bar_index // Current Candle Index ... +) +{ + // + // Fast Cross Over Slow Detection ... + bool isFastCrossedOverSlow = IsCrossOver( + lcFastBuffer, + lcSlowBuffer, + bar_index); + + // + // Fast Over Slow Detection ... + bool isFastOverSlow = IsOver( + lcFastBuffer, + lcSlowBuffer, + bar_index); + + // + // Fast Cross Under Slow Detection ... + bool isFastCrossedUnderSlow = IsCrossUnder( + lcFastBuffer, + lcSlowBuffer, + bar_index); + + // + // Fast Under Slow Detection ... + bool isFastUnderSlow = IsUnder( + lcFastBuffer, + lcSlowBuffer, + bar_index); + + // + // Generate state value which represent curren bar index + // state between fast and slow lines ... + double result = X_XCHMA_NEUTURAL; + + // + // Filling state value based on Market Conditions ... + if (isFastCrossedOverSlow) + { + result = X_XCHMA_FAST_CROSSED_OVER_SLOW; + } + else if (isFastCrossedUnderSlow) + { + result = X_XCHMA_FAST_CROSSED_UNDER_SLOW; + } + else if (isFastOverSlow) + { + result = X_XCHMA_FAST_OVER_SLOW; + } + else if (isFastUnderSlow) + { + result = X_XCHMA_FAST_UNDER_SLOW; + } + + // + return result; +} + +// +// MC State ... +double GetMCState( + int bar_index // Current Candle Index ... +) +{ + // + // Fast Cross Over Slow Detection ... + bool isFastCrossedOverSlow = IsCrossOver( + mcFastBuffer, + mcSlowBuffer, + bar_index); + + // + // Fast Over Slow Detection ... + bool isFastOverSlow = IsOver( + mcFastBuffer, + mcSlowBuffer, + bar_index); + + // + // Fast Cross Under Slow Detection ... + bool isFastCrossedUnderSlow = IsCrossUnder( + mcFastBuffer, + mcSlowBuffer, + bar_index); + + // + // Fast Under Slow Detection ... + bool isFastUnderSlow = IsUnder( + mcFastBuffer, + mcSlowBuffer, + bar_index); + + // + // Generate state value which represent curren bar index + // state between fast and slow lines ... + double result = X_XCHMA_NEUTURAL; + + // + // Filling state value based on Market Conditions ... + if (isFastCrossedOverSlow) + { + result = X_XCHMA_FAST_CROSSED_OVER_SLOW; + } + else if (isFastCrossedUnderSlow) + { + result = X_XCHMA_FAST_CROSSED_UNDER_SLOW; + } + else if (isFastOverSlow) + { + result = X_XCHMA_FAST_OVER_SLOW; + } + else if (isFastUnderSlow) + { + result = X_XCHMA_FAST_UNDER_SLOW; + } + + // + return result; +} + +// +// SC State ... +double GetSCState( + int bar_index // Current Candle Index ... +) +{ + // + // Fast Cross Over Slow Detection ... + bool isFastCrossedOverSlow = IsCrossOver( + scFastBuffer, + scSlowBuffer, + bar_index); + + // + // Fast Over Slow Detection ... + bool isFastOverSlow = IsOver( + scFastBuffer, + scSlowBuffer, + bar_index); + + // + // Fast Cross Under Slow Detection ... + bool isFastCrossedUnderSlow = IsCrossUnder( + scFastBuffer, + scSlowBuffer, + bar_index); + + // + // Fast Under Slow Detection ... + bool isFastUnderSlow = IsUnder( + scFastBuffer, + scSlowBuffer, + bar_index); + + // + // Generate state value which represent curren bar index + // state between fast and slow lines ... + double result = X_XCHMA_NEUTURAL; + + // + // Filling state value based on Market Conditions ... + if (isFastCrossedOverSlow) + { + result = X_XCHMA_FAST_CROSSED_OVER_SLOW; + } + else if (isFastCrossedUnderSlow) + { + result = X_XCHMA_FAST_CROSSED_UNDER_SLOW; + } + else if (isFastOverSlow) + { + result = X_XCHMA_FAST_OVER_SLOW; + } + else if (isFastUnderSlow) + { + result = X_XCHMA_FAST_UNDER_SLOW; + } + + // + return result; +} + +// +// HOT State Calculate Buffers ... +void HotStateCalculateBuffers( + int bar_index // Current Candle Index ... +) +{ + // + // LC ... + double lcFast = lcFastBuffer[bar_index]; + double lcSlow = lcSlowBuffer[bar_index]; + // + double lcFastPrev = lcFastBuffer[bar_index + 1]; + double lcSlowPrev = lcSlowBuffer[bar_index + 1]; + // + double lcState = GetLCState(bar_index); + + // + // MC ... + double mcFast = mcFastBuffer[bar_index]; + double mcSlow = mcSlowBuffer[bar_index]; + // + double mcFastPrev = mcFastBuffer[bar_index + 1]; + double mcSlowPrev = mcSlowBuffer[bar_index + 1]; + // + double mcState = GetMCState(bar_index); + + // + // SC ... + double scFast = scFastBuffer[bar_index]; + double scSlow = scSlowBuffer[bar_index]; + // + double scFastPrev = scFastBuffer[bar_index + 1]; + double scSlowPrev = scSlowBuffer[bar_index + 1]; + // + double scState = GetSCState(bar_index); + + // + // Detect HOT Bearish Area ... + bool isHotBearishArea = + lcFast < lcSlow && + mcFast < mcSlow && + scFast < scSlow; + // + bool isPrevHotBearishArea = + lcFastPrev < lcSlowPrev && + mcFastPrev < mcSlowPrev && + scFastPrev < scSlowPrev; + + // + // Detect HOT Bearish Area ... + bool isHotBullishArea = + lcFast > lcSlow && + mcFast > mcSlow && + scFast > scSlow; + // + bool isPrevHotBullishArea = + lcFastPrev > lcSlowPrev && + mcFastPrev > mcSlowPrev && + scFastPrev > scSlowPrev; + + // + // Generate HotState Value ... + double hotStateValue = + isHotBullishArea && !isPrevHotBullishArea + ? 1 + : isHotBearishArea && !isPrevHotBearishArea + ? -1 + : 0; + hotStateBuffer[bar_index] = hotStateValue; +} + +// +// Draw Buffers ... +void DrawBuffers( + int bar_index // Current Candle Index ... +) +{ + // + // General Requirements ... + + // + // Retrieve Candle Model ... + XOHCL candle = GetCandle(bar_index); + datetime time = iTime(_Symbol, _Period, bar_index); + + // + // Draw Arrow on Hot Areas ... + if (drawHotAreas) + { + // + double hotStateValue = hotStateBuffer[bar_index]; + bool isHotBullishArea = hotStateValue == 1; + bool isHotBearishArea = hotStateValue == -1; + if (isHotBullishArea || isHotBearishArea) + { + // + bool isBull = isHotBullishArea; + + // + double price = isBull ? candle.low : candle.high; + ENUM_ARROW_ANCHOR anchor = isBull ? ANCHOR_TOP : ANCHOR_BOTTOM; + color clr = isBull ? hotBullishArrowColor : hotBearishArrowColor; + uchar arrowCode = isBull ? hotBullishArrowCode : hotBearishArrowCode; + string name = "HOT " + (isBull ? "Bullish" : "Bearish") + "_" + (string)price + "_" + (string)time; + + // + DrawArrow( + 0, + name, + 0, + time, + price, + arrowCode, + anchor, + clr); + } + } + + // + // Draw LC Crosses ... + if (lcDrawCrosses) + { + // + double lcStateValue = GetLCState(bar_index); + bool isLcFastCrossedOverSlow = lcStateValue == X_XCHMA_FAST_CROSSED_OVER_SLOW; + bool isLcFastCrossedUnderSlow = lcStateValue == X_XCHMA_FAST_CROSSED_UNDER_SLOW; + if (isLcFastCrossedOverSlow || isLcFastCrossedUnderSlow) + { + // + bool isBull = isLcFastCrossedOverSlow; + + // + color clr = isBull ? lcFastColor : lcSlowColor; + string name = "LC Fast Cross " + (isBull ? "Over" : "Under") + "_" + (string)time; + + // + DrawVerticalLine( + 0, + name, + 0, + time, + clr); + } + } + + // + // Draw MC Crosses ... + if (mcDrawCrosses) + { + // + double mcStateValue = GetMCState(bar_index); + bool isMcFastCrossedOverSlow = mcStateValue == X_XCHMA_FAST_CROSSED_OVER_SLOW; + bool isMcFastCrossedUnderSlow = mcStateValue == X_XCHMA_FAST_CROSSED_UNDER_SLOW; + if (isMcFastCrossedOverSlow || isMcFastCrossedUnderSlow) + { + // + bool isBull = isMcFastCrossedOverSlow; + + // + color clr = isBull ? mcFastColor : mcSlowColor; + string name = "MC Fast Cross " + (isBull ? "Over" : "Under") + "_" + (string)time; + + // + DrawVerticalLine( + 0, + name, + 0, + time, + clr); + } + } + + // + // Draw SC Crosses ... + if (scDrawCrosses) + { + // + double scStateValue = GetSCState(bar_index); + bool isScFastCrossedOverSlow = scStateValue == X_XCHMA_FAST_CROSSED_OVER_SLOW; + bool isScFastCrossedUnderSlow = scStateValue == X_XCHMA_FAST_CROSSED_UNDER_SLOW; + if (isScFastCrossedOverSlow || isScFastCrossedUnderSlow) + { + // + bool isBull = isScFastCrossedOverSlow; + + // + color clr = isBull ? scFastColor : scSlowColor; + string name = "SC Fast Cross " + (isBull ? "Over" : "Under") + "_" + (string)time; + + // + DrawVerticalLine( + 0, + name, + 0, + time, + clr); + } + } +} +// +// END Functions ... +// diff --git a/BKPS/OLD/XEU5/Indicators/x-saherelm.xfi.oscillator.mq5 b/BKPS/OLD/XEU5/Indicators/x-saherelm.xfi.oscillator.mq5 new file mode 100644 index 0000000..cfd393c --- /dev/null +++ b/BKPS/OLD/XEU5/Indicators/x-saherelm.xfi.oscillator.mq5 @@ -0,0 +1,317 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 XFI Oscillator +// --------------------------------------------- +// Name: XFI +// Description: Price Momentum Power Detection +// Market Analysor ... +// +// +// 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 XFI Oscillator" +#property strict + +// +// START Constants ... +// +#define ShortName "XFI" +// +// END Constants ... +// + +// +// START Inputs ... +// +input int length = 18; // Length +input ENUM_MA_METHOD method = MODE_SMA; // MA Method +input ENUM_APPLIED_VOLUME appliedTo = VOLUME_TICK; // Applied To +// +// END Inputs ... +// + +// +// Includes Logging Library ... +#include "../Libraries/x-saherelm.log.lib.mq5" + +// +// Includes Common Library ... +#include "../Libraries/x-saherelm.common.lib.mq5" + +// +// START Buffers ... +// +#property indicator_separate_window + +// +#property indicator_buffers 2 +#property indicator_plots 1 + +// +// FI Buffer ... +#define fiBufferIndex 0 +#define fiColorBufferIndex 1 + +// +double fiBuffer[]; +double fiColorBuffer[]; + +// +#property indicator_label1 "XFI" +#property indicator_type1 DRAW_COLOR_LINE +#property indicator_color1 clrAqua, clrGray, clrFuchsia +#property indicator_style1 STYLE_DOT +#property indicator_width1 1 +// +// END Buffers ... +// + +// +// START Global Definitions: Variables, Properties and etc ... +// +int fiHandler = INVALID_HANDLE; +// +// END Global Definitions: Variables, Properties and etc ... +// + +// +// START Event Handlers ... +// +// +// Initialization ... +int OnInit() +{ + // + // Validate Inputs ... + if (!ValidateInputs()) + { + return INIT_PARAMETERS_INCORRECT; + } + + // + logTag = ShortName; + + // + fiHandler = iForce( + _Symbol, + _Period, + length, + method, + appliedTo); + if (fiHandler == INVALID_HANDLE) + { + // + string message = "Error Initializing Handler ..."; + LogMessage(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(fiHandler); +} + +// +// Calculations ... +// +// 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; + + // + // 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 ... + int maxLength = MathMax(0, length); + + // + // Check Calculated Bars ... + int fiCalculatedBars = BarsCalculated(fiHandler); + if (fiCalculatedBars < maxLength) + { + return prev_calculated; + } + + // + limit = (prev_calculated > rates_total || prev_calculated <= 0) ? rates_total : (rates_total - prev_calculated) + 1; + + // + // Buffers Copy ... + int copiedFis = CopyBuffer(fiHandler, 0, 0, limit, fiBuffer); + if (copiedFis <= 0) + { + return prev_calculated; + } + + // + // Main Loop ... + for (int i = 0; i < limit && !IsStopped(); i++) + { + // + 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; +} + +// +// Define Indexes and Styles ... +void DefineBuffers() +{ + // + string fiBufferLabel = "XFI " + "(" + (string)length + ")"; + + // + // FI Buffer ... + ArraySetAsSeries(fiBuffer, true); + SetIndexBuffer(fiBufferIndex, fiBuffer, INDICATOR_DATA); + PlotIndexSetString(fiBufferIndex, PLOT_LABEL, fiBufferLabel); + + // + // FI Color Buffer ... + ArraySetAsSeries(fiColorBuffer, true); + SetIndexBuffer(fiColorBufferIndex, fiColorBuffer, INDICATOR_COLOR_INDEX); +} + +// +// Set Indicator Short Name and also we can define Buffers Labels ... +void SetIndicatorName() +{ + // + string indicatorShortName = ""; + StringConcatenate(indicatorShortName, ShortName, ""); + + // + IndicatorSetString(INDICATOR_SHORTNAME, indicatorShortName); +} + +// +// Calculate Buffers ... +void CalculateBuffers( + int bar_index // Selected Bar Index +) +{ + // + double iValue = fiBuffer[bar_index]; + + // + double iColorIndex = + iValue > 0 ? 0 : iValue < 0 ? 2 + : 1; + + // + // Set Buffer Color Index ... + fiColorBuffer[bar_index] = iColorIndex; +} +// +// END Functions ... +// diff --git a/BKPS/OLD/XEU5/Indicators/x-saherelm.xlh.indicator.mq5 b/BKPS/OLD/XEU5/Indicators/x-saherelm.xlh.indicator.mq5 new file mode 100644 index 0000000..4dfc64e --- /dev/null +++ b/BKPS/OLD/XEU5/Indicators/x-saherelm.xlh.indicator.mq5 @@ -0,0 +1,346 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 XLH Indicator +// --------------------------------------------- +// Name: XLH +// Description: Moving Average Indicator +// Market Analysor ... +// +// +// 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 XLH Indicator" +#property strict + +// +// START Constants ... +// +#define ShortName "XLH" +// +// END Constants ... +// + +// +// START Inputs ... +// +input int length = 14; // Length +input ENUM_SERIESMODE hhMode = MODE_HIGH; // Highest High Calculation Method +input ENUM_SERIESMODE llMode = MODE_LOW; // Lowest Low Calculation Method +// +// END Inputs ... +// + +// +// Includes Logging Library ... +#include "../Libraries/x-saherelm.log.lib.mq5" + +// +// Includes Common Library ... +#include "../Libraries/x-saherelm.common.lib.mq5" + +// +// START Buffers ... +// +#property indicator_chart_window + +// +#property indicator_buffers 3 +#property indicator_plots 3 + +// +// HH Buffer ... +#define hhBufferIndex 0 + +// +double hhBuffer[]; + +// +#property indicator_label1 "XLH HH" +#property indicator_type1 DRAW_LINE +#property indicator_color1 clrAqua +#property indicator_style1 STYLE_DOT +#property indicator_width1 1 + +// +// LL Buffer ... +#define llBufferIndex 1 + +// +double llBuffer[]; + +// +#property indicator_label2 "XLH LL" +#property indicator_type2 DRAW_LINE +#property indicator_color2 clrFuchsia +#property indicator_style2 STYLE_DOT +#property indicator_width2 1 + +// +// Signal Buffer ... +#define signalBufferIndex 2 + +// +double signalBuffer[]; + +// +#property indicator_label3 "XLH S" +#property indicator_type3 DRAW_LINE +#property indicator_color3 clrGold +#property indicator_style3 STYLE_DOT +#property indicator_width3 1 +// +// 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 (!ValidateInputs()) + { + return INIT_PARAMETERS_INCORRECT; + } + + // + logTag = ShortName; + + // + // 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 ... +} + +// +// Calculations ... +// +// 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; + + // + // 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 ... + int maxLength = MathMax(0, length); + + // + 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 = false; + + // + // Validate Args ... + if (length >= 2) + { + result = true; + } + + // + return result; +} + +// +// Define Indexes and Styles ... +void DefineBuffers() +{ + // + // HH Buffer ... + string hhBufferLabel = ShortName + " HH " + "(" + (string)length + ")"; + ArraySetAsSeries(hhBuffer, true); + SetIndexBuffer(hhBufferIndex, hhBuffer, INDICATOR_DATA); + PlotIndexSetInteger(hhBufferIndex, PLOT_DRAW_BEGIN, length); + PlotIndexSetString(hhBufferIndex, PLOT_LABEL, hhBufferLabel); + + // + // LL Buffer ... + string llBufferLabel = ShortName + " LL " + "(" + (string)length + ")"; + ArraySetAsSeries(llBuffer, true); + SetIndexBuffer(llBufferIndex, llBuffer, INDICATOR_DATA); + PlotIndexSetInteger(llBufferIndex, PLOT_DRAW_BEGIN, length); + PlotIndexSetString(llBufferIndex, PLOT_LABEL, llBufferLabel); + + // + // Signal Buffer ... + string signalBufferLabel = ShortName + " S " + "(" + (string)length + ")"; + ArraySetAsSeries(signalBuffer, true); + SetIndexBuffer(signalBufferIndex, signalBuffer, INDICATOR_DATA); + PlotIndexSetInteger(signalBufferIndex, PLOT_DRAW_BEGIN, length); + PlotIndexSetString(signalBufferIndex, PLOT_LABEL, signalBufferLabel); +} + +// +// Set Indicator Short Name and also we can define Buffers Labels ... +void SetIndicatorName() +{ + // + string indicatorShortName = ""; + StringConcatenate(indicatorShortName, ShortName, ""); + + // + IndicatorSetString(INDICATOR_SHORTNAME, indicatorShortName); +} + +// +// Calculate Buffers ... +void CalculateBuffers( + int bar_index // Selected Bar Index +) +{ + // + // Calculate Threshold ... + // + // HH Buffer ... + int hhIndex = iHighest( + _Symbol, + _Period, + hhMode, + length, + bar_index); + double hhValue = GetAppliedPrice( + hhIndex, + hhMode); + + // + hhBuffer[bar_index] = hhValue; + + // + // LL Buffer ... + int llIndex = iLowest( + _Symbol, + _Period, + llMode, + length, + bar_index); + double llValue = GetAppliedPrice( + llIndex, + llMode); + + // + llBuffer[bar_index] = llValue; + + // + XOHCL c = GetCandle(bar_index); + double lhDiff = hhValue - llValue; + double signalValue = (lhDiff / 2); + + // + signalBuffer[bar_index] = (hhValue - signalValue); +} +// +// END Functions ... +// diff --git a/BKPS/OLD/XEU5/Indicators/x-saherelm.xobd.indicator.mq5 b/BKPS/OLD/XEU5/Indicators/x-saherelm.xobd.indicator.mq5 new file mode 100644 index 0000000..4ac05cf --- /dev/null +++ b/BKPS/OLD/XEU5/Indicators/x-saherelm.xobd.indicator.mq5 @@ -0,0 +1,390 @@ +///////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 OrderBlock Detector Indicator +// ----------------------------------------------------- +// Name: XOBD +// Description: detect Order Blocks based on Swings ... +// +// +// 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 XOBD Indicator" +#property strict + +// +// START Constants ... +// +#define ShortName "XOBD" +// +// END Constants ... +// + +// +// START Inputs ... +// +// +input int length = 5; // Swing Length + +// +input uchar swingHighArrowCode = 108; // Swing High Arrow Code +input color swingHighArrowColor = clrMagenta; // Swing High Arrow Color + +// +input uchar swingLowArrowCode = 108; // Swing Low Arrow Code +input color swingLowArrowColor = clrAqua; // Swing Low Arrow Color +// +// END Inputs ... +// + +// +// Includes Logging Library ... +#include "../Libraries/x-saherelm.log.lib.mq5" + +// +// Include Common and Models Library ... +#include "../Libraries/x-saherelm.common.lib.mq5" + +// +// Include Draw Library ... +#include "../Libraries/x-saherelm.draw.lib.mq5" + +// +// START Buffers ... +// +#property indicator_chart_window + +// +#property indicator_buffers 1 +#property indicator_plots 0 + +// +#define swingBufferIndex 0 +double swingBuffer[]; +// +// 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 (!ValidateInputs()) + { + return INIT_PARAMETERS_INCORRECT; + } + + // + logTag = ShortName; + drawPrefix = ShortName; + + // + // 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 ... + OnDeinitDrawLibrary(); +} + +// +// Calculations ... +// +// 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; + + // + // 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 ... + int maxLength = MathMax(0, length * 3); + + // + limit = prev_calculated < maxLength ? rates_total - (maxLength + 1) : rates_total - prev_calculated; + + // + // Main Loop ... + for (int i = limit; i >= 0 && !IsStopped(); i--) + { + // + 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; +} + +// +// Define Indexes and Styles ... +void DefineBuffers() +{ + // + ArraySetAsSeries(swingBuffer, true); + SetIndexBuffer(swingBufferIndex, swingBuffer, INDICATOR_CALCULATIONS); +} + +// +// Set Indicator Short Name and also we can define Buffers Labels ... +void SetIndicatorName() +{ + // + string indicatorShortName = ""; + StringConcatenate(indicatorShortName, ShortName, " ", "( ", length, " )"); + + // + IndicatorSetString(INDICATOR_SHORTNAME, indicatorShortName); +} + +// +// Calculate Buffers ... +void CalculateBuffers(int bar_index) +{ + // + // GetCandleSwing(bar_index); + ENUM_X_SWING_TYPE type = X_NO_SWING; + + // + // Try To Detect Order Blocks ... + bool isSwingLow = false; + bool isSwingHigh = false; + + // + // Reading Candles Data ... + XOHCL candles[]; + for (int i = bar_index; i < bar_index + ((length * 2) + 2); i++) + { + // + XOHCL iCandle = GetCandle( + _Symbol, + _Period, + i); + + // + Add( + iCandle, + candles); + } + + // + // Swing Low ... + isSwingLow = + // + candles[1].close > candles[2].close && + candles[2].close > candles[3].close && + // + candles[3].close < candles[4].close && + // + candles[5].close > candles[4].close && + candles[6].close > candles[5].close + // + ; + + // + if (isSwingLow) + { + type = X_SWING_LOW; + } + + // + if (!isSwingLow) + { + // + // Swing High ... + isSwingHigh = + // + candles[1].close < candles[2].close && + candles[2].close < candles[3].close && + // + candles[3].close > candles[4].close && + // + candles[5].close < candles[4].close && + candles[6].close < candles[5].close + // + ; + + // + if (isSwingHigh) + { + type = X_SWING_HIGH; + } + } + + // + switch (type) + { + // + // Swing High ... + case X_SWING_HIGH: + // + swingBuffer[bar_index] = type; + DrawSwingArrow(1, bar_index); + break; + + // + // Swinmg Low ... + case X_SWING_LOW: + // + swingBuffer[bar_index] = type; + DrawSwingArrow(0, bar_index); + break; + + // + // No Swing ... + default: + case X_NO_SWING: + // + swingBuffer[bar_index] = 0; + break; + } +} + +// +// Draw a Swing Arrow Shape ... +void DrawSwingArrow( + int type, // Swing Type: 0 - Low / 1 - High ... + int bar_index) +{ + // + bool isSwingHigh = type == 1; + XOHCL candle = GetCandle(bar_index + 3); + double arrowDistanceInPoint = 0; + + // + // Define Required Object Properties fro Draw an Arrow ... + datetime time = iTime(_Symbol, _Period, bar_index + 3); + double purePrice = isSwingHigh ? candle.high : candle.low; + color clr = isSwingHigh ? swingHighArrowColor : swingLowArrowColor; + ENUM_ARROW_ANCHOR anchor = isSwingHigh ? ANCHOR_BOTTOM : ANCHOR_TOP; + uchar arrowCode = uchar(isSwingHigh ? swingHighArrowCode : swingLowArrowCode); + double price = isSwingHigh ? purePrice + arrowDistanceInPoint : purePrice - arrowDistanceInPoint; + string name = "Swing " + (isSwingHigh ? "High" : "Low") + "_" + (string)time + "_" + (string)purePrice; + + // + // Draw desired Arrow ... + DrawArrow( + 0, + name, + 0, + time, + price, + arrowCode, + anchor, + clr); +} +// +// END Functions ... +// diff --git a/BKPS/OLD/XEU5/Indicators/x-saherelm.xrsi.oscillator.mq5 b/BKPS/OLD/XEU5/Indicators/x-saherelm.xrsi.oscillator.mq5 new file mode 100644 index 0000000..5659e07 --- /dev/null +++ b/BKPS/OLD/XEU5/Indicators/x-saherelm.xrsi.oscillator.mq5 @@ -0,0 +1,397 @@ +///////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 OrderBlock Detector Oscillator +// ------------------------------------------------------ +// Name: XRSI +// Description: detect market conditions based on RSI ... +// +// +// 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 XRSI Oscillator" +#property strict + +// +// START Constants ... +// + +#define ShortName "XRSI" + +// +// END Constants ... +// + +// +// START Inputs ... +// + +// +input group "Market"; +input int length = 14; // Market Length +input ENUM_APPLIED_PRICE appliedTo = PRICE_CLOSE; // Applied To + +// +input group "Short Entry"; +input double shortEntryValue = 70; // Short Entry Level +input color shortEntryColor = clrRed; // Short Entry Level Color +input ENUM_LINE_STYLE shortEntryLineStyle = STYLE_DOT; // Short Entry Style + +// +input group "Short Exit"; +input double shortExitValue = 40; // Short Exit Level +input color shortExitColor = clrRed; // Short Exit Level Color +input ENUM_LINE_STYLE shortExitLineStyle = STYLE_DOT; // Short Exit Style + +// +input group "Long Entry"; +input double longEntryValue = 30; // Long Entry Level +input color longEntryColor = clrRed; // Long Entry Level Color +input ENUM_LINE_STYLE longEntryLineStyle = STYLE_DOT; // Long Entry Style + +// +input group "Long Exit"; +input double longExitValue = 60; // Long Exit Level +input color longExitColor = clrRed; // Long Exit Level Color +input ENUM_LINE_STYLE longExitLineStyle = STYLE_DOT; // Long Exit Style + +// +// START Inputs ... +// + +// +// Includes Logging Library ... +#include "../Libraries/x-saherelm.log.lib.mq5" + +// +// Include Common and Models Library ... +#include "../Libraries/x-saherelm.common.lib.mq5" + +// +// START Buffers ... +// + +// +#property indicator_separate_window +#property indicator_buffers 2 +#property indicator_plots 1 + +// +#define rsiBufferIndex 0 +#define rsiColorBufferIndex 1 + +// +double rsiBuffer[]; +double rsiColorBuffer[]; + +// +#property indicator_label1 "XRSI" +#property indicator_type1 DRAW_COLOR_LINE +#property indicator_color1 clrAqua, clrGray, clrFuchsia +#property indicator_style1 STYLE_DOT +#property indicator_width1 1 + +// +// END Buffers ... +// + +// +// START Global Definitions: Variables, Properties and etc ... +// + +// +int rsiHandler = INVALID_HANDLE; + +// +// END Global Definitions: Variables, Properties and etc ... +// + +// +// START Event Handlers ... +// +// +// Initialization ... +int OnInit() +{ + // + // Validate Inputs ... + if (!ValidateInputs()) + { + return INIT_PARAMETERS_INCORRECT; + } + + // + logTag = ShortName; + + // + rsiHandler = iRSI( + _Symbol, + _Period, + length, + appliedTo); + if (rsiHandler == 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(rsiHandler); +} + +// +// Calculations ... +// +// 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; + + // + // 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 ... + int maxLength = MathMax(0, length); + + // + int rsiCalculatedBars = BarsCalculated(rsiHandler); + if (rsiCalculatedBars < maxLength) + { + return prev_calculated; + } + + // + limit = prev_calculated < maxLength ? rates_total - (maxLength + 1) : rates_total - prev_calculated; + + // + int rsiCopiedItems = CopyBuffer(rsiHandler, 0, 0, limit, rsiBuffer); + if (rsiCopiedItems <= 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 = false; + + // + // Validate Args ... + if (length >= 2) + { + result = true; + } + + // + return result; +} + +// +// Define Indexes and Styles ... +void DefineBuffers() +{ + // + // RSI ... + string rsiBufferLabel = ShortName + " (" + (string)length + ")"; + ArraySetAsSeries(rsiBuffer, true); + SetIndexBuffer(rsiBufferIndex, rsiBuffer, INDICATOR_DATA); + PlotIndexSetInteger(rsiBufferIndex, PLOT_DRAW_BEGIN, length); + PlotIndexSetString(rsiBufferIndex, PLOT_LABEL, rsiBufferLabel); + + // + // RSI Color Buffer ... + ArraySetAsSeries(rsiColorBuffer, true); + SetIndexBuffer(rsiColorBufferIndex, rsiColorBuffer, INDICATOR_COLOR_INDEX); + + // + // Set Indicator Levels here ... + // OB, ExitLong, ExitShort, OS ... + IndicatorSetInteger(INDICATOR_LEVELS, 4); + + // + // SHORTENTRY ... + IndicatorSetDouble(INDICATOR_LEVELVALUE, 0, shortEntryValue); + IndicatorSetInteger(INDICATOR_LEVELCOLOR, 0, shortEntryColor); + IndicatorSetInteger(INDICATOR_LEVELSTYLE, 0, shortEntryLineStyle); + IndicatorSetString(INDICATOR_LEVELTEXT, 0, "Short Entry"); + + // + // LONGEXIT ... + IndicatorSetDouble(INDICATOR_LEVELVALUE, 1, longExitValue); + IndicatorSetInteger(INDICATOR_LEVELCOLOR, 1, longExitColor); + IndicatorSetInteger(INDICATOR_LEVELSTYLE, 1, shortExitLineStyle); + IndicatorSetString(INDICATOR_LEVELTEXT, 1, "Long Exit"); + + // + // SHORTEXIT ... + IndicatorSetDouble(INDICATOR_LEVELVALUE, 2, shortExitValue); + IndicatorSetInteger(INDICATOR_LEVELCOLOR, 2, shortExitColor); + IndicatorSetInteger(INDICATOR_LEVELSTYLE, 2, longEntryLineStyle); + IndicatorSetString(INDICATOR_LEVELTEXT, 2, "Short Exit"); + + // + // LONGENTRY ... + IndicatorSetDouble(INDICATOR_LEVELVALUE, 3, longEntryValue); + IndicatorSetInteger(INDICATOR_LEVELCOLOR, 3, longEntryColor); + IndicatorSetInteger(INDICATOR_LEVELSTYLE, 3, longExitLineStyle); + IndicatorSetString(INDICATOR_LEVELTEXT, 3, "Long Entry"); + + // + // Set Maximum and Minimum for subwindow + IndicatorSetInteger(INDICATOR_DIGITS, 2); + IndicatorSetDouble(INDICATOR_MINIMUM, 0); + IndicatorSetDouble(INDICATOR_MAXIMUM, 100); +} + +// +// Set Indicator Short Name and also we can define Buffers Labels ... +void SetIndicatorName() +{ + // + string indicatorShortName = ""; + StringConcatenate(indicatorShortName, ShortName, " ", "( ", length, " )"); + + // + IndicatorSetString(INDICATOR_SHORTNAME, indicatorShortName); +} + +// +// Calculate Buffers ... +void CalculateBuffers(int bar_index) +{ + // + double iValue = rsiBuffer[bar_index]; + + // + double iColorIndex = 0; + + // + if ( + iValue >= shortEntryValue || + iValue <= longEntryValue || + (iValue < longExitValue && + iValue > shortExitValue)) + { + iColorIndex = 0; + } + else if ( + iValue <= shortEntryValue && + iValue >= longExitValue) + { + iColorIndex = 2; + } + else if ( + iValue < shortExitValue && + iValue > longEntryValue) + { + iColorIndex = 1; + } + + // + rsiColorBuffer[bar_index] = iColorIndex; +} + +// +// END Functions ... +// diff --git a/BKPS/OLD/XEU5/Indicators/x-saherelm.xtd.oscillator.mq5 b/BKPS/OLD/XEU5/Indicators/x-saherelm.xtd.oscillator.mq5 new file mode 100644 index 0000000..5f46d18 --- /dev/null +++ b/BKPS/OLD/XEU5/Indicators/x-saherelm.xtd.oscillator.mq5 @@ -0,0 +1,465 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 Trend Detector Oscillator +// -------------------------------------------------- +// Name: XTD +// Description: trend detecting in both sides ... +// +// +// 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 XTD Oscillator" +#property strict + +// +// START Constants ... +// +#define ShortName "XTD" + +// +// XTD Oscillator States ... +enum ENUM_X_XTD_STATES +{ + X_XTD_BULLISH_CROSSED_OVER_BEARISH = 2, + X_XTD_BULLISH_OVER_BEARISH = 1, + X_XTD_NEUTURAL = 0, + X_XTD_BULLISH_UNDER_BEARISH = -1, + X_XTD_BULLISH_CROSSED_UNDER_BEARISH = -2 +}; +// +// END Constants ... +// + +// +// Include Models Library ... +#include "../Libraries/x-saherelm.models.lib.mq5" + +// +// START Inputs ... +// +input int length = 14; // Market Length +input bool drawCrosses = true; // Draw Cross Arrows + +// +// Bullish ... +input uchar bullishArrowCode = 228; // Cross Over Arrow Code +input color bullishArrowColor = clrAqua; // Cross Over Arrow Color + +// +// Bearish ... +input uchar bearishArrowCode = 230; // Cross Under Arrow Code +input color bearishArrowColor = clrMagenta; // Cross Under Arrow Color +// +// END Inputs ... +// + +// +// Includes Logging Library ... +#include "../Libraries/x-saherelm.log.lib.mq5"; + +// +// Includes Common Library ... +#include "../Libraries/x-saherelm.common.lib.mq5"; + +// +// Includes Draw Library ... +#include "../Libraries/x-saherelm.draw.lib.mq5"; + +// +// START Buffers ... +// +#property indicator_separate_window + +// +#property indicator_buffers 3 +#property indicator_plots 3 + +// +#define bullishBufferIndex 0 +#define bearishBufferIndex 1 +#define signalBufferIndex 2 + +// +double bullishBuffer[]; +double bearishBuffer[]; +double signalBuffer[]; + +// +#property indicator_label1 "XBullPower" +#property indicator_type1 DRAW_LINE +#property indicator_color1 clrLime +#property indicator_style1 STYLE_SOLID +#property indicator_width1 1 + +// +#property indicator_label2 "XBearPower" +#property indicator_type2 DRAW_LINE +#property indicator_color2 clrRed +#property indicator_style2 STYLE_SOLID +#property indicator_width2 1 + +// +#property indicator_label3 "XSignal" +#property indicator_type3 DRAW_LINE +#property indicator_color3 clrGold +#property indicator_style3 STYLE_DOT +#property indicator_width3 1 +// +// END Buffers ... +// + +// +// START Global Definitions: Variables, Properties and etc ... +// +// +int xtdBullishCandleCount = 0; +int xtdBearishCandleCount = 0; +// +// END Global Definitions: Variables, Properties and etc ... +// + +// +// START Event Handlers ... +// +// +// Initialization ... +int OnInit() +{ + // + // Validate Inputs ... + if (!ValidateInputs()) + { + return INIT_PARAMETERS_INCORRECT; + } + + // + logTag = ShortName; + drawPrefix = ShortName; + + // + // 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 ... + + // + // De Init Draw Library ... + OnDeinitDrawLibrary(); +} + +// +// Calculations ... +// +// 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; + + // + // 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 ... + int maxLength = MathMax(0, length); + + // + limit = prev_calculated < maxLength ? rates_total - (maxLength + 1) : rates_total - prev_calculated; + + // + // Main Loop ... + for (int i = limit; i >= 0 && !IsStopped(); i--) + { + // + CalculateBuffers(i, close); + } + + // + return rates_total; +} +// +// END Event Handlers ... +// + +// +// START Functions ... +// +// +// Validate Input Args for Initialization ... +bool ValidateInputs() +{ + // + bool result = false; + + // + // Validate Args ... + if (length >= 5) + { + result = true; + } + + // + return result; +} + +// +// Define Indexes and Styles ... +void DefineBuffers() +{ + // + // Bullish Buffer ... + string bullishBufferLabel = ShortName + "BullPow " + "(" + (string)length + ")"; + ArraySetAsSeries(bullishBuffer, true); + SetIndexBuffer(bullishBufferIndex, bullishBuffer, INDICATOR_DATA); + PlotIndexSetInteger(bullishBufferIndex, PLOT_DRAW_BEGIN, length); + PlotIndexSetString(bullishBufferIndex, PLOT_LABEL, bullishBufferLabel); + + // + // Bearish Buffer ... + string bearishBufferLabel = ShortName + "BearPow " + "(" + (string)length + ")"; + ArraySetAsSeries(bearishBuffer, true); + SetIndexBuffer(bearishBufferIndex, bearishBuffer, INDICATOR_DATA); + PlotIndexSetInteger(bearishBufferIndex, PLOT_DRAW_BEGIN, length); + PlotIndexSetString(bearishBufferIndex, PLOT_LABEL, bearishBufferLabel); + + // + // Signal Buffer ... + string signalBufferLabel = ShortName + "Signal " + "(" + (string)length + ")"; + ArraySetAsSeries(signalBuffer, true); + SetIndexBuffer(signalBufferIndex, signalBuffer, INDICATOR_DATA); + PlotIndexSetInteger(signalBufferIndex, PLOT_DRAW_BEGIN, length); + PlotIndexSetString(signalBufferIndex, PLOT_LABEL, signalBufferLabel); +} + +// +// Set Indicator Short Name and also we can define Buffers Labels ... +void SetIndicatorName() +{ + // + string indicatorShortName = ""; + StringConcatenate(indicatorShortName, ShortName, " ", "( ", length, " )"); + + // + IndicatorSetString(INDICATOR_SHORTNAME, indicatorShortName); +} + +// +// Calculate Buffers ... +void CalculateBuffers( + int bar_index, + const double &close[]) +{ + // + // Reset Global Counters ... + xtdBullishCandleCount = 0; + xtdBearishCandleCount = 0; + + // + // Loop through Closes ... + for (int i = bar_index; i <= bar_index + length; i++) + { + for (int j = i + 1; j <= bar_index + length; j++) + { + // + if (close[i] > close[j]) + { + xtdBullishCandleCount++; + } + + // + if (close[i] < close[j]) + { + xtdBearishCandleCount++; + } + } + } + + // + // Bullish Power Buffer ... + bullishBuffer[bar_index] = MathAbs(xtdBullishCandleCount); + + // + // Bearish Power Buffer ... + bearishBuffer[bar_index] = MathAbs(xtdBearishCandleCount); + + // + // Signal Buffer ... + signalBuffer[bar_index] = bullishBuffer[bar_index] - bearishBuffer[bar_index]; + + // + // Check and Draw Crosses if it's Specified ... + if (drawCrosses) + { + DrawCrosses(bar_index); + } +} + +// +// +double GetState( + int bar_index // Specified Bar Index +) +{ + // + // Check Cross Points ... + // bullishCrossedOverBearish = 2; + // bullishOverBearish = 1; + // bullishCrossedUnderBearish = -2; + // bullishUnderBearish = -1; + // OtherWise = 0; + bool isBullishCrossedOverBearish = IsCrossOver( + bullishBuffer, + bearishBuffer, + bar_index); + bool isBullishCrossedUnderBearish = IsCrossUnder( + bullishBuffer, + bearishBuffer, + bar_index); + bool isBullishOverBearish = IsOver( + bullishBuffer, + bearishBuffer, + bar_index); + bool isBullishUnderBearish = IsUnder( + bullishBuffer, + bearishBuffer, + bar_index); + + // + double result = X_XTD_NEUTURAL; + if (isBullishCrossedOverBearish) + { + result = X_XTD_BULLISH_CROSSED_OVER_BEARISH; + } + else if (isBullishCrossedUnderBearish) + { + result = X_XTD_BULLISH_CROSSED_UNDER_BEARISH; + } + else if (isBullishOverBearish) + { + result = X_XTD_BULLISH_OVER_BEARISH; + } + else if (isBullishUnderBearish) + { + result = X_XTD_BULLISH_UNDER_BEARISH; + } + else + { + result = X_XTD_NEUTURAL; + } + + // + return result; +} + +// +// Draw Crosses ... +void DrawCrosses( + int bar_index // the bars which required to draw cross arrow on it ... +) +{ + // + double stateValue = GetState(bar_index); + + // + bool isOver = stateValue == 2; + double low = iLow(_Symbol, _Period, bar_index); + double high = iHigh(_Symbol, _Period, bar_index); + + // + double price = isOver ? low : high; + datetime time = iTime(_Symbol, _Period, bar_index); + ENUM_ARROW_ANCHOR anchor = isOver ? ANCHOR_TOP : ANCHOR_BOTTOM; + uchar arrowCode = isOver ? bullishArrowCode : bearishArrowCode; + color arrowColor = isOver ? bullishArrowColor : bearishArrowColor; + string crossName = "Trend " + (isOver ? "Up" : "Down") + "_" + (string)time + "_" + (string)price; + + // + DrawArrow( + 0, + crossName, + 0, + time, + price, + arrowCode, + anchor, + arrowColor); +} +// +// END Functions ... +// diff --git a/BKPS/OLD/XEU5/Indicators/x-saherelm.xtm.indicator.mq5 b/BKPS/OLD/XEU5/Indicators/x-saherelm.xtm.indicator.mq5 new file mode 100644 index 0000000..eac88e0 --- /dev/null +++ b/BKPS/OLD/XEU5/Indicators/x-saherelm.xtm.indicator.mq5 @@ -0,0 +1,349 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 Candle Indicator +// --------------------------------------------- +// Name: XTM +// 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 XTM Indicator" +#property strict + +// +// START Constants ... +// +#define ShortName "XTM" + +// +// XTM Indicator States ... +enum ENUM_X_XTM_STATES +{ + X_XTM_BULLISH = 1, + X_XTM_BEARISH = -1, + X_XTM_NEUTURAL = 0, +}; +// +// END Constants ... +// + +// +// START Inputs ... +// +input int maPeriod = 14; // Period +input int maShift = 0; // Shift +input ENUM_MA_METHOD maMethod = MODE_SMA; // Method +input ENUM_APPLIED_PRICE maAppliedTo = PRICE_CLOSE; // Applied To +// +// END Inputs ... +// + +// +// Includes Logging Library ... +#include "../Libraries/x-saherelm.log.lib.mq5" + +// +// 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 +#define stateBufferIndex 2 + +double maBuffer[]; +double maColorBuffer[]; +double stateBuffer[]; + +#property indicator_label1 "XTM" +#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 maHandler = INVALID_HANDLE; +// +// END Global Definitions: Variables, Properties and etc ... +// + +// +// START Event Handlers ... +// +// +// Initialization ... +int OnInit() +{ + // + // Validate Inputs ... + if (!ValidateInputs()) + { + return INIT_PARAMETERS_INCORRECT; + } + + // + logTag = ShortName; + + // + // Initializing MA Handler ... + maHandler = iMA( + _Symbol, + _Period, + maPeriod, + maShift, + maMethod, + maAppliedTo); + if (maHandler == INVALID_HANDLE) + { + // + string message = "Error Initializing Ma Handler ..."; + LogMessage(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 ... +} + +// +// Calculations ... +// +// 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; + + // + // 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 ... + int maxLength = MathMax(0, maPeriod); + + // + // 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 (maPeriod >= 2) + { + result = true; + } + + // + return result; +} + +// +// Define Indexes and Styles ... +void DefineBuffers() +{ + // + string maBufferLabel = "XTM " + "(" + (string)maPeriod + ")"; + + // + // Ma Buffer ... + ArraySetAsSeries(maBuffer, true); + SetIndexBuffer(maBufferIndex, maBuffer, INDICATOR_DATA); + PlotIndexSetString(maBufferIndex, PLOT_LABEL, maBufferLabel); + + // + // Ma Color Buffer ... + ArraySetAsSeries(maColorBuffer, true); + SetIndexBuffer(maColorBufferIndex, maColorBuffer, INDICATOR_COLOR_INDEX); + + // + // State Buffer ... + ArraySetAsSeries(stateBuffer, true); + SetIndexBuffer(stateBufferIndex, stateBuffer, INDICATOR_CALCULATIONS); +} + +// +// Set Indicator Short Name and also we can define Buffers Labels ... +void SetIndicatorName() +{ + // + string indicatorShortName = ""; + StringConcatenate(indicatorShortName, ShortName, " ", "(", maPeriod, ")"); + + // + IndicatorSetString(INDICATOR_SHORTNAME, indicatorShortName); +} + +// +// 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; + + // + // Define State Value ... + // lineColorIndex == 0 => Bullish => 1; + // lineColorIndex == 1 => Neutural => 0; + // lineColorIndex == 2 => Bearish => -1; + double stateValue = + lineColorIndex == 0 ? X_XTM_BULLISH : lineColorIndex == 2 ? X_XTM_BEARISH + : X_XTM_NEUTURAL; + + // + // Set Ma Buffer Color Index ... + maColorBuffer[bar_index] = lineColorIndex; + + // + // Set State Buffer Value ... + stateBuffer[bar_index] = stateValue; +} + +// +// END Functions ... +// diff --git a/BKPS/OLD/XEU5/Indicators/x-saherelm.xts.oscillator.mq5 b/BKPS/OLD/XEU5/Indicators/x-saherelm.xts.oscillator.mq5 new file mode 100644 index 0000000..46e9fbf --- /dev/null +++ b/BKPS/OLD/XEU5/Indicators/x-saherelm.xts.oscillator.mq5 @@ -0,0 +1,558 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 XTS Oscillator +// --------------------------------------------- +// Name: XTS +// Description: Time Sections Oscillator ... +// +// +// 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 XTS Oscillator" +#property strict + +// +// START Constants ... +// + +#define ShortName "XTS" + +enum ENUM_X_PERIOD_METHOD +{ + // + X_PERIOD_NOTHING, + // + X_PERIOD_AUTO, + // + X_PERIOD_MANUALLY +}; + +// +// XTS Oscillator States ... + +// +// END Constants ... +// + +// +// START Inputs ... +// +input group "Current Period"; +input ENUM_APPLIED_PRICE currentAppliedTo = PRICE_CLOSE; // Current Applied To +// +input group "Nearest Period"; +input ENUM_X_PERIOD_METHOD nearestMethod = X_PERIOD_AUTO; // How to Find Nearest Period +input ENUM_TIMEFRAMES nearestPeriod = NULL; // Nearest Time Frame +input ENUM_APPLIED_PRICE nearestAppliedTo = PRICE_CLOSE; // Nearest Applied To +// +input group "Mediest Period"; +input ENUM_X_PERIOD_METHOD mediestMethod = X_PERIOD_AUTO; // How to Find Mediest Period +input ENUM_TIMEFRAMES mediestPeriod = NULL; // Mediest Time Frame +input ENUM_APPLIED_PRICE mediestAppliedTo = PRICE_CLOSE; // Mediest Applied To +// +input group "Farest Period"; +input ENUM_X_PERIOD_METHOD farestMethod = X_PERIOD_AUTO; // How to Find Farest Period +input ENUM_TIMEFRAMES farestPeriod = NULL; // Farest Time Frame +input ENUM_APPLIED_PRICE farestAppliedTo = PRICE_CLOSE; // Farest Applied To + +// +// Includes Logging Library ... +#include "../Libraries/x-saherelm.log.lib.mq5" + +// +// Includes Draw Library ... +#include "../Libraries/x-saherelm.draw.lib.mq5" + +// +// Includes Common Library ... +#include "../Libraries/x-saherelm.common.lib.mq5" + +// +// START Buffers ... +// +#property indicator_separate_window + +// +#property indicator_buffers 4 +#property indicator_plots 4 + +// +// Current ... +#define currentBufferIndex 0 + +double currentBuffer[]; + +#property indicator_label1 "XTS C" +#property indicator_type1 DRAW_LINE +#property indicator_color1 clrBrown +#property indicator_style1 STYLE_SOLID +#property indicator_width1 1 + +// +// Nearest ... +#define nearestBufferIndex 1 + +double nearestBuffer[]; + +#property indicator_label2 "XTS N" +#property indicator_type2 DRAW_LINE +#property indicator_color2 clrAqua +#property indicator_style2 STYLE_SOLID +#property indicator_width2 1 + +// +// Mediest ... +#define mediestBufferIndex 2 + +double mediestBuffer[]; + +#property indicator_label3 "XTS M" +#property indicator_type3 DRAW_LINE +#property indicator_color3 clrLime +#property indicator_style3 STYLE_SOLID +#property indicator_width3 1 + +// +// Farest ... +#define farestBufferIndex 3 + +double farestBuffer[]; + +#property indicator_label4 "XTS F" +#property indicator_type4 DRAW_LINE +#property indicator_color4 clrLightBlue +#property indicator_style4 STYLE_SOLID +#property indicator_width4 1 + +// +// END Buffers ... +// + +// +// START Global Definitions: Variables, Properties and etc ... +// + +// +ENUM_TIMEFRAMES mNearestPeriod = NULL; +ENUM_TIMEFRAMES mMediestPeriod = NULL; +ENUM_TIMEFRAMES mFarestPeriod = NULL; + +// +// END Global Definitions: Variables, Properties and etc ... +// + +// +// START Event Handlers ... +// + +// +// Initialization ... +int OnInit() +{ + // + // Validate Inputs ... + if (!ValidateInputs()) + { + return INIT_PARAMETERS_INCORRECT; + } + + // + logTag = ShortName; + drawPrefix = ShortName; + + // + // Define Index Buffers ... + DefineBuffers(); + + // + // Set Oscillator ShortName ... + SetOscillatorName(); + + // + // Init Succeed ... + return INIT_SUCCEEDED; +} + +// +// DeInitialization ... +void OnDeinit(const int reason) +{ + // + OnDeinitDrawLibrary(); + + // + Comment(""); +} + +// +// Calculations ... +// +// 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; + + // + // 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 ... + int maxLength = 30; + + // + limit = (prev_calculated > rates_total || prev_calculated <= 0) ? rates_total : (rates_total - prev_calculated) + 1; + + // + // Main Loop ... + for (int i = 0; i < limit && !IsStopped(); i++) + { + // + // Do Buffers Calculation ... + CalculateBuffers(i); + } + + // + return rates_total; +} + +// +// END Event Handlers ... +// + +// +// START Functions ... +// +// +// Validate Input Args for Initialization ... +bool ValidateInputs() +{ + // + bool result = true; + + // + return result; +} + +// +// Define Indexes and Styles ... +void DefineBuffers() +{ + // + int maxLength = 30; + + // + // Current ... + ArraySetAsSeries(currentBuffer, true); + SetIndexBuffer(currentBufferIndex, currentBuffer, INDICATOR_DATA); + PlotIndexSetInteger(currentBufferIndex, PLOT_DRAW_BEGIN, maxLength); + + // + // Nearest ... + ArraySetAsSeries(nearestBuffer, true); + SetIndexBuffer(nearestBufferIndex, nearestBuffer, INDICATOR_DATA); + PlotIndexSetInteger(nearestBufferIndex, PLOT_DRAW_BEGIN, maxLength); + + // + // Mediest ... + ArraySetAsSeries(mediestBuffer, true); + SetIndexBuffer(mediestBufferIndex, mediestBuffer, INDICATOR_DATA); + PlotIndexSetInteger(mediestBufferIndex, PLOT_DRAW_BEGIN, maxLength); + + // + // Farest ... + ArraySetAsSeries(farestBuffer, true); + SetIndexBuffer(farestBufferIndex, farestBuffer, INDICATOR_DATA); + PlotIndexSetInteger(farestBufferIndex, PLOT_DRAW_BEGIN, maxLength); +} + +// +// Set Oscillator Short Name and also we can define Buffers Labels ... +void SetOscillatorName() +{ + IndicatorSetString(INDICATOR_SHORTNAME, ShortName); +} + +// +// Calculate Buffers ... +void CalculateBuffers(int bar_index) +{ + // + // Current ... + CalculateCurrent(bar_index); + + // + // Nearest ... + CalculateNearest(bar_index); + + // + // Mediest ... + CalculateMediest(bar_index); + + // + // Farest ... + CalculateFarest(bar_index); + + // + // Commenting ... + string comment = GenerateDescriptionComment(); + Comment(comment); +} + +// +// Current ... +void CalculateCurrent(int bar_index) +{ + // + datetime barTime = iTime( + _Symbol, + _Period, + bar_index); + datetime startTime = GetPeriodStartTime( + _Symbol, + _Period, + barTime); + int startBarIndex = iBarShift( + _Symbol, + _Period, + startTime); + + // + XOHCL c = GetCandle( + _Symbol, + _Period, + startBarIndex); + + // + double value = GetAppliedPrice( + c, + currentAppliedTo); + + // + currentBuffer[bar_index] = value; +} + +// +// Nearest ... +void CalculateNearest(int bar_index) +{ + // + if (mNearestPeriod == NULL) + { + // + switch (nearestMethod) + { + // + case X_PERIOD_AUTO: + mNearestPeriod = GetNearestTimeFrame(_Period); + break; + + // + case X_PERIOD_NOTHING: + case X_PERIOD_MANUALLY: + mNearestPeriod = nearestPeriod; + break; + } + } + + // + datetime barTime = iTime( + _Symbol, + _Period, + bar_index); + datetime startTime = GetPeriodStartTime( + _Symbol, + mNearestPeriod, + barTime); + int startBarIndex = iBarShift( + _Symbol, + _Period, + startTime); + + // + XOHCL c = GetCandle( + _Symbol, + _Period, + startBarIndex); + + // + double value = GetAppliedPrice( + c, + nearestAppliedTo); + + // + nearestBuffer[bar_index] = value; +} + +// +// Mediest ... +void CalculateMediest(int bar_index) +{ + // + if (mMediestPeriod == NULL) + { + // + switch (mediestMethod) + { + // + case X_PERIOD_AUTO: + mMediestPeriod = GetMediestTimeFrame(_Period); + break; + + // + case X_PERIOD_NOTHING: + case X_PERIOD_MANUALLY: + mMediestPeriod = mediestPeriod; + break; + } + } + + // + datetime barTime = iTime( + _Symbol, + _Period, + bar_index); + datetime startTime = GetPeriodStartTime( + _Symbol, + mMediestPeriod, + barTime); + int startBarIndex = iBarShift( + _Symbol, + _Period, + startTime); + + // + XOHCL c = GetCandle( + _Symbol, + _Period, + startBarIndex); + + // + double value = GetAppliedPrice( + c, + mediestAppliedTo); + + // + mediestBuffer[bar_index] = value; +} + +// +// Farest ... +void CalculateFarest(int bar_index) +{ + // + if (mFarestPeriod == NULL) + { + // + switch (farestMethod) + { + // + case X_PERIOD_AUTO: + mFarestPeriod = GetFarestTimeFrame(_Period); + break; + + // + case X_PERIOD_NOTHING: + case X_PERIOD_MANUALLY: + mFarestPeriod = farestPeriod; + break; + } + } + + // + datetime barTime = iTime( + _Symbol, + _Period, + bar_index); + datetime startTime = GetPeriodStartTime( + _Symbol, + mFarestPeriod, + barTime); + int startBarIndex = iBarShift( + _Symbol, + _Period, + startTime); + + // + XOHCL c = GetCandle( + _Symbol, + _Period, + startBarIndex); + + // + double value = GetAppliedPrice( + c, + farestAppliedTo); + + // + farestBuffer[bar_index] = value; +} + +// +// Generate Comment ... +string GenerateDescriptionComment() +{ + // + string result = ""; + + // + result += "Nearest : " + EnumToString(mNearestPeriod) + "\n"; + result += "Mediest : " + EnumToString(mMediestPeriod) + "\n"; + result += "Farest : " + EnumToString(mFarestPeriod) + "\n"; + + // + return result; +} +// +// END Functions ... +// diff --git a/BKPS/OLD/XEU5/Libraries/.gitkeep b/BKPS/OLD/XEU5/Libraries/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/BKPS/OLD/XEU5/Libraries/x-saherelm.alert.lib.mq5 b/BKPS/OLD/XEU5/Libraries/x-saherelm.alert.lib.mq5 new file mode 100644 index 0000000..1079063 --- /dev/null +++ b/BKPS/OLD/XEU5/Libraries/x-saherelm.alert.lib.mq5 @@ -0,0 +1,200 @@ +/////////////////////////////////////////////////////// +// +// 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); + } +} +void SendAlert( + XSignal &signal, // the Signal Object which requred to Alert + bool asExecuted = true // determines Alert Signal as Executed Signal or not +) +{ + // + // Prepare Message ... + string message = asExecuted ? ExecutedSignalToString(signal) : SignalToString(signal); + + // + // Do Alerting ... + SendAlert(message); +} +// +// END Provided Functions ... +// diff --git a/BKPS/OLD/XEU5/Libraries/x-saherelm.common.lib.mq5 b/BKPS/OLD/XEU5/Libraries/x-saherelm.common.lib.mq5 new file mode 100644 index 0000000..290dde9 --- /dev/null +++ b/BKPS/OLD/XEU5/Libraries/x-saherelm.common.lib.mq5 @@ -0,0 +1,4429 @@ +/////////////////////////////////////////////////////// +// +// 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; +} + +// +// 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_X_SIGNAL_TYPE type = X_SIGNAL_UNKNOWN // Get entry price for Which direction trade ... +) +{ + // + double result = 0; + + // + // Validate Arg ... + if (type == X_SIGNAL_UNKNOWN) + { + return result; + } + + // + bool isLong = type == X_SIGNAL_LONG; + result = isLong ? GetAsk() : GetBid(); + result = NormalizePrice(result); + + // + return result; +} +double GetEntry( + string symbol, // Specified Symbol + ENUM_X_SIGNAL_TYPE type = X_SIGNAL_UNKNOWN // Get entry price for Which direction trade ... +) +{ + // + double result = 0; + + // + // Validate Arg ... + if (type == X_SIGNAL_UNKNOWN) + { + return result; + } + + // + bool isLong = type == X_SIGNAL_LONG; + result = isLong ? GetAsk(symbol) : GetBid(symbol); + result = NormalizePrice(result, symbol); + + // + return result; +} + +// +// Get Signal Exit ... +double GetExit( + ENUM_X_SIGNAL_TYPE type = X_SIGNAL_UNKNOWN // Get entry price for Which direction trade ... +) +{ + // + double result = 0; + + // + // Validate Arg ... + if (type == X_SIGNAL_UNKNOWN) + { + return result; + } + + // + bool isLong = type == X_SIGNAL_LONG; + result = isLong ? GetBid() : GetAsk(); + result = NormalizePrice(result); + + // + return result; +} +double GetExit( + string symbol, // Specified Symbol + ENUM_X_SIGNAL_TYPE type = X_SIGNAL_UNKNOWN // Get entry price for Which direction trade ... +) +{ + // + double result = 0; + + // + // Validate Arg ... + if (type == X_SIGNAL_UNKNOWN) + { + return result; + } + + // + bool isLong = type == X_SIGNAL_LONG; + result = isLong ? GetBid(symbol) : GetAsk(symbol); + result = NormalizePrice(result, symbol); + + // + 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; +} + +// +// 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; +} + +// +// 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; +} + +// +// 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; +} + +// +// 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 HasStrongBody(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 = HasStrongBody(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 = HasStrongBody(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 = HasStrongBody(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; +} + +// +// 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; +} + +// +// 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; +} + +// +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; +} + +// +// Validate Struct ... +bool IsValid(XSignal &model, ulong magicNumber) +{ + // + bool result = false; + + // + // Validate Signal Type ... + result = model.type != X_SIGNAL_UNKNOWN; + if (!result) + { + return result; + } + + // + // Check Symbol ... + result = StringLen(model.symbol) == 0 ? true : model.symbol == _Symbol; + if (!result) + { + return result; + } + + // + // Check magic number ... + result = model.magicNumber <= 0 ? true : model.magicNumber == magicNumber; + if (!result) + { + return result; + } + + // + // Check Entry ... + result = model.entry > 0; + if (!result) + { + return result; + } + + // + // Check SL ... + result = model.sl == 0 ? true : model.type == X_SIGNAL_LONG ? model.sl < model.entry + : model.sl > model.entry; + if (!result) + { + return result; + } + + // + // Check TP ... + result = model.tp == 0 ? true : model.type == X_SIGNAL_LONG ? model.tp > model.entry + : model.tp < model.entry; + if (!result) + { + return result; + } + + // + // Check Volume ... + result = model.volume > 0; + if (!result) + { + return result; + } + + // + // Check Time ... + result = model.time > 0; + if (!result) + { + return result; + } + + // + return result; +} + +// +void CleanBuffer(int &buffer[]) +{ + // + ArrayFree(buffer); + ArrayResize(buffer, 0); +} +void CleanBuffer(ulong &buffer[]) +{ + // + ArrayFree(buffer); + ArrayResize(buffer, 0); +} +void CleanBuffer(double &buffer[]) +{ + // + ArrayFree(buffer); + ArrayResize(buffer, 0); +} +void CleanBuffer(XSignal &buffer[]) +{ + // + ArrayFree(buffer); + ArrayResize(buffer, 0); +} +void CleanBuffer(XDeal &buffer[]) +{ + // + ArrayFree(buffer); + ArrayResize(buffer, 0); +} +void CleanBuffer(XOrder &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; +} +void Add( + XSignal &item, // item want to add + XSignal &buffer[] // Destination buffer +) +{ + // + ArrayResize( + buffer, + ArraySize(buffer) + 1); + + // + buffer[ArraySize(buffer) - 1] = item; +} +void Add( + XDeal &item, // item want to add + XDeal &buffer[] // Destination buffer +) +{ + // + ArrayResize( + buffer, + ArraySize(buffer) + 1); + + // + buffer[ArraySize(buffer) - 1] = item; +} +void Add( + XOrder &item, // item want to add + XOrder &buffer[] // Destination buffer +) +{ + // + ArrayResize( + buffer, + ArraySize(buffer) + 1); + + // + buffer[ArraySize(buffer) - 1] = item; +} + +// +// 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; +} + +// +// Check a Signal is Long or not ... +bool IsLong(ENUM_X_SIGNAL_TYPE type) +{ + return type == X_SIGNAL_LONG; +} +bool IsLong(XSignal &signal) +{ + // + bool result = IsLong(signal.type); + + // + return result; +} + +// +// Check a Signal is Short or not ... +bool IsShort(ENUM_X_SIGNAL_TYPE type) +{ + return type == X_SIGNAL_SHORT; +} +bool IsShort(XSignal &signal) +{ + // + bool result = IsShort(signal.type); + + // + return result; +} + +// +// Retrieve a Signal Type String Value ... +string GetSignalType(ENUM_X_SIGNAL_TYPE type) +{ + // + string result = ""; + + // + if (type == X_SIGNAL_UNKNOWN) + { + return result; + } + + // + result = type == X_SIGNAL_LONG ? "Long" : "Short"; + + // + return result; +} +string GetSignalType(XSignal &signal) +{ + // + string result = ""; + + // + result = GetSignalType(signal.type); + + // + return result; +} +ENUM_X_SIGNAL_TYPE GetSignalType(string typeStr) +{ + // + ENUM_X_SIGNAL_TYPE result = X_SIGNAL_UNKNOWN; + + // + if (typeStr == GetSignalType(X_SIGNAL_LONG)) + { + result = X_SIGNAL_LONG; + } + else if (typeStr == GetSignalType(X_SIGNAL_SHORT)) + { + result = X_SIGNAL_SHORT; + } + + // + return result; +} + +// +// Retrieve Signal Execution String ... +string GetSignalExecutionError(int error) +{ + // + string result = ""; + + // + switch (error) + { + // + case X_TRADER_INVALID_SIGNAL_ERROR: + result = "Invalid Signal ..."; + break; + + // + case X_TRADER_NOT_ENOUGH_EQUITY_ERROR: + result = "Not Enough Equity for Trade ..."; + break; + + // + case X_TRADER_NOT_ENOUGH_BALANCE_ERROR: + result = "Not Enough Balance for Trade ..."; + break; + + // + case X_TRADER_NOT_ENOUGH_MARIGIN_ERROR: + result = "Not Enough Marigin For Trade ..."; + break; + + // + case X_TRADER_MAX_TRADES_REACHED_ERROR: + result = "Max Allowed Trade Reached ..."; + break; + + // + case X_TRADER_UNKNOWN_ERROR: + default: + result = "Unknown Issue ..."; + break; + } + + // + return 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; +} + +// +// 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; +} + +// +// Check Expert Running in Testing Mode or not ... +bool IsRunningOnTestMode() +{ + // + bool result = false; + + // + // check programm mode ... + result = MQL5InfoInteger(MQL5_TESTING); + + // + return result; +} + +// +// 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; +} + +// +// +// + +// +// 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 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; +} + +// +// END Provided Functions ... +// diff --git a/BKPS/OLD/XEU5/Libraries/x-saherelm.draw.lib.mq5 b/BKPS/OLD/XEU5/Libraries/x-saherelm.draw.lib.mq5 new file mode 100644 index 0000000..ece98c8 --- /dev/null +++ b/BKPS/OLD/XEU5/Libraries/x-saherelm.draw.lib.mq5 @@ -0,0 +1,2345 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 Draw Library +// -------------------------------------- +// Name: XDraw +// Description: provides Draw 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 ... +// +// +// END Inputs ... +// + +// +// Include Logger Library ... +#include "x-saherelm.log.lib.mq5" +#include "x-saherelm.common.lib.mq5" + +// +// START Global Definitions: Variables, Properties and etc ... +// +string drawPrefix = "X-OBJ"; +// +// END Global Definitions: Variables, Properties and etc ... +// + +// +// START Provided Functions ... +// +// +// DeInitial Library if required ... +void OnDeinitDrawLibrary() +{ + RemoveDraws(); +} + +// +void DrawSignalShape( + XSignal &signal, // Specify Signal to Draw + color longColor = clrAqua, // Long Signals Color + color shortColor = clrFuchsia, // Short Signal Color + color entryColor = clrGold // Signal Entry Price Color +) +{ + // + // Draw Signal Info : + // - Draw Entry Price Line; + // - Draw SL; + // - Draw TP; + // - Risk Free; + + // + bool isLong = signal.type == X_SIGNAL_LONG; + + // + color tpColor = longColor; + color slColor = shortColor; + + // + string name = "T(" + (string)signal.ticket + ")" + "_" + "TY(" + EnumToString(signal.type) + ")"; + + // + string tpName = "TP_" + name; + if (IsDrawExists(tpName)) + { + RemoveDraw(tpName); + } + + // + string slName = "SL_" + name; + if (IsDrawExists(slName)) + { + RemoveDraw(slName); + } + + // + string riskFreeName = "RF_" + name; + if (IsDrawExists(riskFreeName)) + { + RemoveDraw(riskFreeName); + } + + // + string entryName = "Entry_" + name; + if (IsDrawExists(entryName)) + { + RemoveDraw(entryName); + } + + // + string vlName = "Time_" + name; + if (IsDrawExists(vlName)) + { + RemoveDraw(vlName); + } + + // + int signalBarIndex = iBarShift( + signal.symbol, + _Period, + signal.time); + + // + datetime time1 = iTime( + signal.symbol, + _Period, + signalBarIndex + 1); + datetime time2 = iTime( + signal.symbol, + _Period, + signalBarIndex - 1); + + // + // Entry ... + bool isTrendLineDrawn = DrawTrendLine( + 0, + entryName, + 0, + time1, + signal.entry, + time2, + signal.entry, + entryColor); + + // + // TP ... + bool isTPDrawn = false; + if (signal.tp > 0) + { + // + isTPDrawn = DrawTrendLine( + 0, + tpName, + 0, + time1, + signal.tp, + time2, + signal.tp, + tpColor, + STYLE_SOLID, + 1, + false, + true); + } + + // + // RISKFREE ... + bool isRFDrawn = false; + if (signal.riskFreeStep > 0) + { + // + double firstStepPrice = isLong ? signal.entry + PipsToPrice(signal.riskFreeStep) + : signal.entry - PipsToPrice(signal.riskFreeStep); + + // + isRFDrawn = DrawTrendLine( + 0, + riskFreeName, + 0, + time1, + firstStepPrice, + time2, + firstStepPrice, + tpColor, + STYLE_DOT, + 1, + false, + true); + } + + // + // SL ... + bool isSLDrawn = false; + if (signal.sl > 0) + { + // + isSLDrawn = DrawTrendLine( + 0, + slName, + 0, + time1, + signal.sl, + time2, + signal.sl, + slColor, + STYLE_SOLID, + 1, + false, + true); + } + + // + // Draw a Vertical Line ... + bool isVerticalLineDrawn = DrawVerticalLine( + 0, + vlName, + 0, + signal.time, + slColor); +} + +// +// remove drawn objects ... +void RemoveDraws( + string tag = NULL, + int chartId = -1, + int subWindow = -1) +{ + // + // Normalize Args ... + // + if (tag == NULL) + { + tag = drawPrefix; + } + + // + 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); + 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; +} + +// +// 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 sub_window = 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, sub_window, 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 back_clr = 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, back_clr); + + // + // 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 ... +// + +// +// END Regular Draws ... +// + +// +// START Chart Style Drawers ... +// +// +// Apply Styles On Chart ... +void ApplyChartStyle( + int chartId = -1, // chart's ID + ENUM_CHART_MODE mode = CHART_CANDLES, // chart's mode + bool showBidLine = true, // show bid line + bool showAskLine = true, // show ask line + bool showGrid = false, // show grids on chart + bool showVolumes = false, // show volumes + bool showTradeLevels = true, // Displaying trade levels in the chart (levels of open positions, Stop Loss, Take Profit and pending orders) + bool autoScroll = true, // chart autoscroll + bool quickNavigation = true, // chart quick navigation state + color foreGroundColor = clrWhite, // chart's foreground color + color backGroundColor = clrBlack, // chart's background color + color upColor = clrGreen, // Up Color + color downColor = clrRed, // Down Color + color bullishColor = clrGreen, // Bullish color + color bearishColor = clrRed, // Bearish color + color gridColor = clrGray, // grid color + color bidLineColor = clrGray, // bid line color + color askLineColor = clrRed, // ask line color + color lineColor = clrLime, // line mode and doji candlestick color + color stopColor = clrGold, // Color of stop order levels (Stop Loss and Take Profit) + color volumesColor = clrGreen // volumes color +) +{ + // + // Validate Args ... + if (chartId == -1) + { + chartId = 0; + } + + // + ChartSetInteger(chartId, CHART_MODE, mode); + ChartSetInteger(chartId, CHART_SHOW_BID_LINE, showBidLine); + ChartSetInteger(chartId, CHART_SHOW_ASK_LINE, showAskLine); + ChartSetInteger(chartId, CHART_SHOW_GRID, showGrid); + ChartSetInteger(chartId, CHART_SHOW_VOLUMES, showVolumes); + ChartSetInteger(chartId, CHART_SHOW_TRADE_LEVELS, showTradeLevels); + ChartSetInteger(chartId, CHART_AUTOSCROLL, autoScroll); + ChartSetInteger(chartId, CHART_QUICK_NAVIGATION, quickNavigation); + ChartSetInteger(chartId, CHART_COLOR_FOREGROUND, foreGroundColor); + ChartSetInteger(chartId, CHART_COLOR_BACKGROUND, backGroundColor); + ChartSetInteger(chartId, CHART_COLOR_CHART_UP, upColor); + ChartSetInteger(chartId, CHART_COLOR_CHART_DOWN, downColor); + ChartSetInteger(chartId, CHART_COLOR_CANDLE_BULL, bullishColor); + ChartSetInteger(chartId, CHART_COLOR_CANDLE_BEAR, bearishColor); + ChartSetInteger(chartId, CHART_COLOR_GRID, gridColor); + ChartSetInteger(chartId, CHART_COLOR_BID, bidLineColor); + ChartSetInteger(chartId, CHART_COLOR_ASK, askLineColor); + ChartSetInteger(chartId, CHART_COLOR_STOP_LEVEL, stopColor); + ChartSetInteger(chartId, CHART_COLOR_CHART_LINE, lineColor); + ChartSetInteger(chartId, CHART_COLOR_VOLUME, volumesColor); +} +// +// END Chart Style Drawers ... +// \ No newline at end of file diff --git a/BKPS/OLD/XEU5/Libraries/x-saherelm.http.lib.mq5 b/BKPS/OLD/XEU5/Libraries/x-saherelm.http.lib.mq5 new file mode 100644 index 0000000..97f7ac0 --- /dev/null +++ b/BKPS/OLD/XEU5/Libraries/x-saherelm.http.lib.mq5 @@ -0,0 +1,177 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 Http Library +// ------------------------------------------ +// Name: XHttp +// Description: provide http communication +// 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 Model Definition ... +// +enum X_HTTP_METHOD +{ + X_HTTP_GET, + X_HTTP_POST +}; +// +// END Model Definition ... +// + +// +// START Inputs ... +// +// +// END Inputs ... +// + +// +// START Global Definitions: Variables, Properties and etc ... +// +// +// END Global Definitions: Variables, Properties and etc ... +// + +// +// START Provided Functions ... +// +// +// Initial Library if required ... +bool OnInInitHttpLibrary() +{ + return false; +} + +// +// DeInitial Library if required ... +void OnDeinitHttpLibrary() +{ +} + +// +// 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; +} + +// +// 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; + } + + // + result = WebRequest( + strMethod, + url, + headers, + timeout, + payload, + response, + responseHeaders + ); + + // + 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; +} +// +// END Provided Functions ... +// diff --git a/BKPS/OLD/XEU5/Libraries/x-saherelm.log.lib.mq5 b/BKPS/OLD/XEU5/Libraries/x-saherelm.log.lib.mq5 new file mode 100644 index 0000000..70f1bda --- /dev/null +++ b/BKPS/OLD/XEU5/Libraries/x-saherelm.log.lib.mq5 @@ -0,0 +1,261 @@ +/////////////////////////////////////////////////////// +// +// 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 +// +// 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); +} + +// +// 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); +} + +// +// Convert a Signal to String Message ... +string SignalToString(const XSignal &signal) +{ + // + string result = "\n"; + + // + result += "Signal: " + "\n"; + result += "id: " + (string)signal.id + "\n"; + result += "symbol: " + signal.symbol + "\n"; + result += "type: " + EnumToString(signal.type) + "\n"; + result += "magicNumber: " + (string)signal.magicNumber + "\n"; + result += "ticket: " + (string)signal.ticket + "\n"; + result += "entry: " + (string)signal.entry + "\n"; + result += "tp: " + (string)signal.tp + "\n"; + result += "sl: " + (string)signal.sl + "\n"; + result += "riskFreeStep: " + (string)signal.riskFreeStep + "\n"; + result += "riskFreeRate: " + (string)signal.riskFreeRate + "\n"; + result += "profit: " + (string)signal.profit + "\n"; + result += "time: " + (string)signal.time + "\n"; + result += "volume: " + (string)signal.volume + "\n"; + result += "comment: " + signal.comment + "\n"; + + // + return result; +} + +// +// Convert an Executed Signal to String Message ... +string ExecutedSignalToString(const XSignal &signal) +{ + // + string result = ""; + + // + result += (signal.type == X_SIGNAL_LONG ? "Buy" : "Sell") + " Signal Executed provided on (" + signal.symbol + " _ " + EnumToString(_Period) + ") by this comment: " + signal.comment; + + // + return result; +} + +// +// Logging Signal ... +void LogSignal(const XSignal &signal) +{ + // + string message = SignalToString(signal); + + // + LogMessage(message); +} + +// +// Log Signal Execution ... +void LogExecutedSignal(const XSignal &signal) +{ + // + string message = ExecutedSignalToString(signal); + + // + LogMessage(message); +} + +// +// Convert a Deal to String ... +string DealToString(const XDeal &deal) +{ + // + string result = "\n"; + + // + result += "Deal:" + "\n"; + result += " " + "\n"; + result += "time: " + (string)deal.time + "\n"; + result += "ticket: " + (string)deal.ticket + "\n"; + result += "order: " + (string)deal.order + "\n"; + result += "positionId: " + (string)deal.positionId + "\n"; + result += "type: " + EnumToString(deal.type) + "\n"; + result += "entry: " + EnumToString(deal.entry) + "\n"; + result += "reason: " + EnumToString(deal.reason) + "\n"; + result += "symbol: " + deal.symbol + "\n"; + result += "price: " + (string)deal.price + "\n"; + result += "profit: " + (string)deal.profit + "\n"; + result += "swap: " + (string)deal.swap + "\n"; + result += "commission: " + (string)deal.commission + "\n"; + result += "volume: " + (string)deal.volume + "\n"; + result += "comment: " + deal.comment + "\n"; + + // + return result; +} + +// +// Log Specific Deal ... +void LogDeal(const XDeal &deal) +{ + // + string message = DealToString(deal); + + // + LogMessage(message); +} + +// +// Convert an Order to String ... +string OrderToString(const XOrder &order) +{ + // + string result = "\n"; + + // + result += "Order: " + "\n"; + result += "magic: " + (string)order.magic + "\n"; + result += "positionId: " + (string)order.positionId + "\n"; + result += "symbol: " + (string)order.symbol + "\n"; + result += "ticket: " + (string)order.ticket + "\n"; + result += "timeSetup: " + (string)order.timeSetup + "\n"; + result += "timeDone: " + (string)order.timeDone + "\n"; + result += "timeExpiration: " + (string)order.timeExpiration + "\n"; + result += "priceOpen: " + (string)order.priceOpen + "\n"; + result += "priceCurrent: " + (string)order.priceCurrent + "\n"; + result += "priceStopLimit: " + (string)order.priceStopLimit + "\n"; + result += "stopLoss: " + (string)order.stopLoss + "\n"; + result += "takeProfit: " + (string)order.takeProfit + "\n"; + result += "volumeInitial: " + (string)order.volumeInitial + "\n"; + result += "volumeCurrent: " + (string)order.volumeCurrent + "\n"; + result += "comment: " + order.comment + "\n"; + result += "type: " + EnumToString(order.type) + "\n"; + result += "state: " + EnumToString(order.state) + "\n"; + result += "typeFilling: " + EnumToString(order.typeFilling) + "\n"; + result += "typeTime: " + EnumToString(order.typeTime) + "\n"; + result += "reason: " + EnumToString(order.reason) + "\n"; + + // + return result; +} + +// +// Log Specific Order ... +void LogOrder(const XOrder &order) +{ + // + string message = OrderToString(order); + + // + LogMessage(message); +} + +// +// END Provided Functions ... +// diff --git a/BKPS/OLD/XEU5/Libraries/x-saherelm.models.lib.mq5 b/BKPS/OLD/XEU5/Libraries/x-saherelm.models.lib.mq5 new file mode 100644 index 0000000..b98ae3e --- /dev/null +++ b/BKPS/OLD/XEU5/Libraries/x-saherelm.models.lib.mq5 @@ -0,0 +1,438 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 Models Library +// --------------------------------------- +// Name: XModels +// Description: provides all required models ... +// +// +// 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 ... +// + +// +// START Global Definitions: Variables, Properties and etc ... +// +// +// END Global Definitions: Variables, Properties and etc ... +// + +// +// START Provided Functions ... +// + +// +// How To Calculate Static Volume ... +enum ENUM_STATIC_VOLUME_METHODS +{ + // + // Based On Deposit ... + X_STATIC_VOLUME_BASED_ON_DEPOSIT, + // + // Based On Balance ... + X_STATIC_VOLUME_BASED_ON_BALANCE, +}; + +// +// START Model Definitions ... +// +// +// OHCL Candel Model ... +enum ENUM_X_PRICE +{ + X_PRICE_HIGH, + X_PRICE_OPEN, + X_PRICE_CLOSE, + X_PRICE_LOW +}; + +// +// Describe an Specific Candle ... +struct XOHCL +{ + double high; + double open; + double close; + double low; +}; + +// +// Swing Types Enum ... +enum ENUM_X_SWING_TYPE +{ + X_NO_SWING = 0, + X_SWING_HIGH = 1, + X_SWING_LOW = -1, +}; + +// +// XTrader Execution Signal Result ... +enum ENUM_EXECUTION_SIGNAL_RESULT +{ + // + X_TRADER_UNKNOWN_ERROR, + X_TRADER_SUCCEED_EXECUTION, + X_TRADER_INVALID_SIGNAL_ERROR, + X_TRADER_NOT_ENOUGH_EQUITY_ERROR, + X_TRADER_MAX_TRADES_REACHED_ERROR, + X_TRADER_NOT_ENOUGH_BALANCE_ERROR, + X_TRADER_NOT_ENOUGH_MARIGIN_ERROR + // +}; + +// +// Signal Types ... +enum ENUM_X_SIGNAL_TYPE +{ + X_SIGNAL_LONG, + X_SIGNAL_SHORT, + X_SIGNAL_UNKNOWN, +}; + +// +// Signal Structure ... +struct XSignal +{ + // + // Identifier ... + ulong id; + + // + // Which Symbol used for Signal ... + string symbol; + + // + // Which Type of operations ... + ENUM_X_SIGNAL_TYPE type; + + // + // Magic Number ... + ulong magicNumber; + + // + // Ticket ... + ulong ticket; + + // + // Entry/Open Price ... + double entry; + + // + // TP ... + double tp; + + // + // SL ... + double sl; + + // + // Make Risk Free Trade on this Value if provided ... + double riskFreeStep; + + // + // a Multiplier for determines how much trade volume exit on risk free time ... + double riskFreeRate; + + // + // Trade Profit ... + double profit; + + // + // Time of Operation ... + datetime time; + + // + // Volume ... + double volume; + + // + // Comment ... + string comment; +}; + +// +// Signal Additional Info ... +struct XProvidedSignal +{ + // + // Suggested TP ... + double tp; + + // + // Suggested SL ... + double sl; + + // + // Signallers ... + string signallers[]; +}; + +// +// Model Specific Deal ... +struct XDeal +{ + // + // the ID of the Expert Advisor, that executed the deal ... + ulong magic; + + // + // the ID of position, in which the deal was involved ... + ulong positionId; + + // + // Ticket ... + ulong ticket; + + // + // the name of the deal symbol ... + string symbol; + + // + // order by which the deal is executed ... + ulong order; + + // + // the time of deal execution ... + datetime time; + + // + // Deal price ... + double price; + + // + // the financial result of the deal (in deposit currency) ... + double profit; + + // + // the amount of swap when position is closed ... + double swap; + + // + // the amount of commission of the deal ... + double commission; + + // + // the volume of deal ... + double volume; + + // + // the deal comment ... + string comment; + + // + // the deal type ... + // ------------------------------------------------------------------ + // DEAL_TYPE_BUY => 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 Specific Order ... +struct XOrder +{ + // + // the ID of expert that placed the order ... + ulong magic; + + // + // the ID of position ... + ulong positionId; + + // + // the name of order symbol ... + string symbol; + + // + // the ticket of an order, previously selected for access ... + ulong ticket; + + // + // the time of order placement ... + datetime timeSetup; + + // + // the time of order execution or cancellation ... + datetime timeDone; + + // + // the order expiration time ... + datetime timeExpiration; + + // + // the order price ... + double priceOpen; + + // + // the current price by order symbol ... + double priceCurrent; + + // + // the price of a pending order ... + double priceStopLimit; + + // + // the order's Stop Loss ... + double stopLoss; + + // + // the order's Take Profit ... + double takeProfit; + + // + // the initial volume of order ... + double volumeInitial; + + // + // the unfilled volume of order ... + double volumeCurrent; + + // + // the order comment ... + string comment; + + // + // the order type ... + // -------------------- + // ORDER_TYPE_BUY => Market Buy order ... + // ORDER_TYPE_SELL => Market Sell order ... + // ORDER_TYPE_BUY_LIMIT => Buy Limit pending order ... + // ORDER_TYPE_SELL_LIMIT => Sell Limit pending order ... + // ORDER_TYPE_BUY_STOP => Buy Stop pending order ... + // ORDER_TYPE_SELL_STOP => Sell Stop pending order ... + // ORDER_TYPE_BUY_STOP_LIMIT => Upon reaching the order price, a pending Buy Limit order is placed at the StopLimit price ... + // ORDER_TYPE_SELL_STOP_LIMIT => Upon reaching the order price, a pending Sell Limit order is placed at the StopLimit price ... + // ORDER_TYPE_CLOSE_BY => Order to close a position by an opposite one ... + ENUM_ORDER_TYPE type; + + // + // the order state ... + // -------------------------- + // ORDER_STATE_STARTED => Order checked, but not yet accepted by broker ... + // ORDER_STATE_PLACED => Order accepted ... + // ORDER_STATE_CANCELED => Order canceled by client ... + // ORDER_STATE_PARTIAL => Order partially executed ... + // ORDER_STATE_FILLED => Order fully executed ... + // ORDER_STATE_REJECTED => Order rejected ... + // ORDER_STATE_EXPIRED => Order expired ... + // ORDER_STATE_REQUEST_ADD => Order is being registered (placing to the trading system) + // ORDER_STATE_REQUEST_MODIFY => Order is being modified (changing its parameters) ... + // ORDER_STATE_REQUEST_CANCEL => Order is being deleted (deleting from the trading system) ... + ENUM_ORDER_STATE state; + + // + // the order filling type ... + // ---------------------------- + // ORDER_FILLING_FOK => Fill or Kill + // An order can be executed in the specified volume only. + // If the necessary amount of a financial instrument is currently unavailable in the market, + // the order will not be executed. + // The desired volume can be made up of several available offers. + // The possibility of using FOK orders is determined at the trade server. + // ORDER_FILLING_IOC => Immediate or Cancel + // A trader agrees to execute a deal with the volume maximally available in the market within that indicated in the order. + // If the request cannot be filled completely, an order with the available volume will be executed, + // and the remaining volume will be canceled. + // The possibility of using IOC orders is determined at the trade server. + // ORDER_FILLING_BOC => Passive (Book or Cancel) + // The BoC order assumes that the order can only be placed in the Depth of Market and cannot be immediately executed. + // If the order can be executed immediately when placed, then it is canceled. + // In fact, the BOC policy guarantees that the price of the placed order will be worse than + // the current market. BoC orders are used to implement passive trading, + // so that the order is not executed immediately when placed and does not affect current liquidity. + // Only limit and stop limit orders are supported (ORDER_TYPE_BUY_LIMIT, ORDER_TYPE_SELL_LIMIT, ORDER_TYPE_BUY_STOP_LIMIT, ORDER_TYPE_SELL_STOP_LIMIT). + // ORDER_FILLING_RETURN => Return + // In case of partial filling, an order with remaining volume is not canceled but processed further. + // Return orders are not allowed in the Market Execution + // mode (market execution — SYMBOL_TRADE_EXECUTION_MARKET). + ENUM_ORDER_TYPE_FILLING typeFilling; + + // + // the type of order at the time of the expiration ... + // -------------------------------------------------------- + // ORDER_TIME_GTC => Good till cancel order ... + // ORDER_TIME_DAY => Good till current trade day order ... + // ORDER_TIME_SPECIFIED => Good till expired order ... + // ORDER_TIME_SPECIFIED_DAY => The order will be effective till 23:59:59 of the specified day. + // If this time is outside a trading session, the order expires in the nearest trading time ... + ENUM_ORDER_TYPE_TIME typeTime; + + // + // The reason for order placing ... + // -------------------------------------- + // ORDER_REASON_SL => The order was placed as a result of Stop Loss activation ... + // ORDER_REASON_TP => The order was placed as a result of Take Profit activation ... + // ORDER_REASON_SO => The order was placed as a result of the Stop Out event ... + // ORDER_REASON_WEB => The order was placed from a web platform ... + // ORDER_REASON_CLIENT => The order was placed from a desktop terminal ... + // ORDER_REASON_MOBILE => The order was placed from a mobile application ... + // ORDER_REASON_EXPERT => The order was placed from an MQL5-program, i.e. by an Expert Advisor or a script ... + ENUM_ORDER_REASON reason; +}; +// +// END Provided Functions ... +// diff --git a/BKPS/OLD/XEU5/Providers/.gitkeep b/BKPS/OLD/XEU5/Providers/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/BKPS/OLD/XEU5/Providers/x-saherelm.xeu5.provider.indicators.lib.mq5 b/BKPS/OLD/XEU5/Providers/x-saherelm.xeu5.provider.indicators.lib.mq5 new file mode 100644 index 0000000..c077b65 --- /dev/null +++ b/BKPS/OLD/XEU5/Providers/x-saherelm.xeu5.provider.indicators.lib.mq5 @@ -0,0 +1,13599 @@ +/////////////////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 XEU5 Signal Provider Indicators Library +// ---------------------------------------------------------------- +// +// 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 Provider Inputs ... +#include "x-saherelm.xeu5.provider.inputs.lib.mq5" + +// +// Include Provider Class ... +#include "../Classes/x-saherelm.provider.lib.mq5" + +// +// Signallers ... +input group "XEU5 Signallers"; + +// +// XTD ... +input group "XEU5 XTD Signaller"; +input bool xEU5XTDEnableSignaller = true; // Enable Signaller +input bool xEU5XTDAllowLongSignals = true; // Enable Long Signals +input bool xEU5XTDAllowShortSignals = true; // Enable Short Signals + +// +// XTAM ... +input group "XEU5 XTAM Signaller"; +input bool xEU5XTAMEnableSignaller = true; // Enable Signaller +input bool xEU5XTAMAllowLongSignals = true; // Enable Long Signals +input bool xEU5XTAMAllowShortSignals = true; // Enable Short Signals + +// +// XSI ... +input group "XEU5 XSI Signaller"; +input bool xEU5XSIEnableSignaller = true; // Enable Signaller +input bool xEU5XSIAllowLongSignals = true; // Enable Long Signals +input bool xEU5XSIAllowShortSignals = true; // Enable Short Signals + +// +// XTSFI ... +input group "XEU5 XTSFI Signaller"; +input bool xEU5XTSFIEnableSignaller = true; // Enable Signaller +input bool xEU5XTSFIAllowLongSignals = true; // Enable Long Signals +input bool xEU5XTSFIAllowShortSignals = true; // Enable Short Signals + +// +// XOBDLH ... +input group "XEU5 XOBDLH Signaller"; +input bool xEU5XOBDLHEnableSignaller = true; // Enable Signaller +input bool xEU5XOBDLHAllowLongSignals = true; // Enable Long Signals +input bool xEU5XOBDLHAllowShortSignals = true; // Enable Short Signals + +// +// XCHMACC ... +input group "XEU5 XCHMACC Signaller"; +input bool xEU5XCHMACCEnableSignaller = true; // Enable Signaller +input bool xEU5XCHMACCAllowLongSignals = true; // Enable Long Signals +input bool xEU5XCHMACCAllowShortSignals = true; // Enable Short Signals + +// +// XCHMAMX ... +input group "XEU5 XCHMAMX Signaller"; +input bool xEU5XCHMAMXEnableSignaller = true; // Enable Signaller +input bool xEU5XCHMAMXAllowLongSignals = true; // Enable Long Signals +input bool xEU5XCHMAMXAllowShortSignals = true; // Enable Short Signals + +// +// XCHMAMN ... +input group "XEU5 XCHMAMN Signaller"; +input bool xEU5XCHMAMNEnableSignaller = true; // Enable Signaller +input bool xEU5XCHMAMNAllowLongSignals = true; // Enable Long Signals +input bool xEU5XCHMAMNAllowShortSignals = true; // Enable Short Signals + +// +bool xEU5IsTestMode = true; +int xEU5MaxLengthOfInputs = 0; +int xEU5CalculatedBars = 0; + +// +// Signaller Variables ... +// +// XTD ... +bool xEU5MXTDEnableSignaller = xEU5XTDEnableSignaller; +bool xEU5MXTDAllowLongSignals = xEU5XTDAllowLongSignals; +bool xEU5MXTDAllowShortSignals = xEU5XTDAllowShortSignals; + +// +// XTAM ... +bool xEU5MXTAMEnableSignaller = xEU5XTAMEnableSignaller; +bool xEU5MXTAMAllowLongSignals = xEU5XTAMAllowLongSignals; +bool xEU5MXTAMAllowShortSignals = xEU5XTAMAllowShortSignals; + +// +// XSI ... +bool xEU5MXSIEnableSignaller = xEU5XSIEnableSignaller; +bool xEU5MXSIAllowLongSignals = xEU5XSIAllowLongSignals; +bool xEU5MXSIAllowShortSignals = xEU5XSIAllowShortSignals; + +// +// XTSFI ... +bool xEU5MXTSFIEnableSignaller = xEU5XTSFIEnableSignaller; +bool xEU5MXTSFIAllowLongSignals = xEU5XTSFIAllowLongSignals; +bool xEU5MXTSFIAllowShortSignals = xEU5XTSFIAllowShortSignals; + +// +// XOBDLH ... +bool xEU5MXOBDLHEnableSignaller = xEU5XOBDLHEnableSignaller; +bool xEU5MXOBDLHAllowLongSignals = xEU5XOBDLHAllowLongSignals; +bool xEU5MXOBDLHAllowShortSignals = xEU5XOBDLHAllowShortSignals; + +// +// XCHMACC ... +bool xEU5MXCHMACCEnableSignaller = xEU5XCHMACCEnableSignaller; +bool xEU5MXCHMACCAllowLongSignals = xEU5XCHMACCAllowLongSignals; +bool xEU5MXCHMACCAllowShortSignals = xEU5XCHMACCAllowShortSignals; + +// +// XCHMAMX ... +bool xEU5MXCHMAMXEnableSignaller = xEU5XCHMAMXEnableSignaller; +bool xEU5MXCHMAMXAllowLongSignals = xEU5XCHMAMXAllowLongSignals; +bool xEU5MXCHMAMXAllowShortSignals = xEU5XCHMAMXAllowShortSignals; + +// +// XCHMAMN ... +bool xEU5MXCHMAMNEnableSignaller = xEU5XCHMAMNEnableSignaller; +bool xEU5MXCHMAMNAllowLongSignals = xEU5XCHMAMNAllowLongSignals; +bool xEU5MXCHMAMNAllowShortSignals = xEU5XCHMAMNAllowShortSignals; + +// +XCProvider *xEU5Provider; + +// +// Validate Indicators Inputs ... +bool XEU5ValidateIndicatorsInputs() +{ + // + bool result = false; + + // + // XTM ... + result = XTMValidateInputs(); + if (!result) + { + return result; + } + + // + // XAMA ... + result = XAMAValidateInputs(); + if (!result) + { + return result; + } + + // + // XTD ... + result = XTDValidateInputs(); + if (!result) + { + return result; + } + + // + // XFI ... + result = XFIValidateInputs(); + if (!result) + { + return result; + } + + // + // XTS ... + result = XTSValidateInputs(); + if (!result) + { + return result; + } + + // + // XOBD ... + result = XOBDValidateInputs(); + if (!result) + { + return result; + } + + // + // XLH ... + result = XLHValidateInputs(); + if (!result) + { + return result; + } + + // + // XRSI ... + result = XRSIValidateInputs(); + if (!result) + { + return result; + } + + // + // XCHLH ... + result = XCHLHValidateInputs(); + if (!result) + { + return result; + } + + // + // XCHMA ... + result = XCHMAValidateInputs(); + if (!result) + { + return result; + } + + // + // Make an Instance Of XCProvider Class for Use ... + xEU5Provider = new XCProvider( + // + // Commons ... + _Symbol, + _Period, + // + // Signallers ... + // + // XTD ... + xEU5MXTDEnableSignaller, + xEU5MXTDAllowLongSignals, + xEU5MXTDAllowShortSignals, + // + // XTAM ... + xEU5MXTAMEnableSignaller, + xEU5MXTAMAllowLongSignals, + xEU5MXTAMAllowShortSignals, + // + // XSI ... + xEU5MXSIEnableSignaller, + xEU5MXSIAllowLongSignals, + xEU5MXSIAllowShortSignals, + // + // XTSFI ... + xEU5MXTSFIEnableSignaller, + xEU5MXTSFIAllowLongSignals, + xEU5MXTSFIAllowShortSignals, + // + // XOBDLH ... + xEU5MXOBDLHEnableSignaller, + xEU5MXOBDLHAllowLongSignals, + xEU5MXOBDLHAllowShortSignals, + // + // XCHMACC ... + xEU5MXCHMACCEnableSignaller, + xEU5MXCHMACCAllowLongSignals, + xEU5MXCHMACCAllowShortSignals, + // + // XCHMAMX ... + xEU5MXCHMAMXEnableSignaller, + xEU5MXCHMAMXAllowLongSignals, + xEU5MXCHMAMXAllowShortSignals, + // + // XCHMAMN ... + xEU5MXCHMAMNEnableSignaller, + xEU5MXCHMAMNAllowLongSignals, + xEU5MXCHMAMNAllowShortSignals + // + ); + + // + result = true; + + // + return result; +} + +// +// Init Indicators ... +bool XEU5InitIndicators() +{ + // + bool result = false; + + // + // Make it Enable when we need to Log Market Conditions ... + // xEU5IsTestMode = false; // IsRunningOnTestMode(); + + // + // Check and Calculate Max Length in Inputs ... + // + + // + // XTM ... + xEU5MaxLengthOfInputs = MathMax( + xTMMaPeriod, + xEU5NumberOfItemsPerTick); + + // + // XAMA ... + xEU5MaxLengthOfInputs = MathMax( + xAMALength, + xEU5NumberOfItemsPerTick); + xEU5MaxLengthOfInputs = MathMax( + xAMAFastEMA, + xEU5NumberOfItemsPerTick); + xEU5MaxLengthOfInputs = MathMax( + xAMASlowEMA, + xEU5NumberOfItemsPerTick); + + // + // XLH ... + xEU5MaxLengthOfInputs = MathMax( + xLHLength, + xEU5NumberOfItemsPerTick); + + // + // XTD ... + xEU5MaxLengthOfInputs = MathMax( + xTDLength, + xEU5MaxLengthOfInputs); + + // + // XFI ... + xEU5MaxLengthOfInputs = MathMax( + xFILength, + xEU5MaxLengthOfInputs); + + // + // XRSI ... + xEU5MaxLengthOfInputs = MathMax( + xRSILength, + xEU5MaxLengthOfInputs); + + // + // XOBD ... + xEU5MaxLengthOfInputs = MathMax( + xOBDLength, + xEU5MaxLengthOfInputs); + + // + // XCHLH ... + xEU5MaxLengthOfInputs = MathMax( + xCHLHLcLength, + xEU5MaxLengthOfInputs); + xEU5MaxLengthOfInputs = MathMax( + xCHLHMcLength, + xEU5MaxLengthOfInputs); + xEU5MaxLengthOfInputs = MathMax( + xCHLHScLength, + xEU5MaxLengthOfInputs); + + // + // XCHMA ... + xEU5MaxLengthOfInputs = MathMax( + xCHMAScFastLength, + xEU5MaxLengthOfInputs); + xEU5MaxLengthOfInputs = MathMax( + xCHMAScSlowLength, + xEU5MaxLengthOfInputs); + xEU5MaxLengthOfInputs = MathMax( + xCHMAMcFastLength, + xEU5MaxLengthOfInputs); + xEU5MaxLengthOfInputs = MathMax( + xCHMAMcSlowLength, + xEU5MaxLengthOfInputs); + xEU5MaxLengthOfInputs = MathMax( + xCHMALcFastLength, + xEU5MaxLengthOfInputs); + xEU5MaxLengthOfInputs = MathMax( + xCHMALcSlowLength, + xEU5MaxLengthOfInputs); + + // + // Validate Indicators Inputs before Initialization ... + result = XEU5ValidateIndicatorsInputs(); + if (!result) + { + return result; + } + + // + // Validate Signallers ... + + // + // XTD ... + bool isXTDEnable = + xEU5XTDEnableSignaller && + (xEU5XTDAllowLongSignals || + xEU5XTDAllowShortSignals); + + // + // XTAM ... + bool isXTAMEnable = + xEU5XTAMEnableSignaller && + (xEU5XTAMAllowLongSignals || + xEU5XTAMAllowShortSignals); + + // + // XSI ... + bool isXSIEnable = + xEU5XSIEnableSignaller && + (xEU5XSIAllowLongSignals || + xEU5XSIAllowShortSignals); + + // + // XTSFI ... + bool isXTSFIEnable = + xEU5XTSFIEnableSignaller && + (xEU5XTSFIAllowLongSignals || + xEU5XTSFIAllowShortSignals); + + // + // XOBDLH ... + bool isXOBDLHEnable = + xEU5XOBDLHEnableSignaller && + (xEU5XOBDLHAllowLongSignals || + xEU5XOBDLHAllowShortSignals); + + // + // XCHMACC ... + bool isXCHMACCEnable = + xEU5XCHMACCEnableSignaller && + (xEU5XCHMACCAllowLongSignals || + xEU5XCHMACCAllowShortSignals); + + // + // XCHMAMX ... + bool isXCHMAMXEnable = + xEU5XCHMAMXEnableSignaller && + (xEU5XCHMAMXAllowLongSignals || + xEU5XCHMAMXAllowShortSignals); + + // + // XCHMAMN ... + bool isXCHMAMNEnable = + xEU5XCHMAMNEnableSignaller && + (xEU5XCHMAMNAllowLongSignals || + xEU5XCHMAMNAllowShortSignals); + + // + bool hasSignaller = + // + isXTDEnable || + isXTAMEnable || + isXSIEnable || + isXTSFIEnable || + isXOBDLHEnable || + isXCHMACCEnable || + isXCHMAMXEnable || + isXCHMAMNEnable + // + ; + result = hasSignaller; + if (!result) + { + // + LogMessage("XEU5 doesn't enable any Signaller ..."); + + // + return result; + } + + // + // Initialize Indicator/Oscillator Handlers ... + ResetLastError(); + + // + // XTM Init ... + result = XTMInitHandlers(); + if (!result) + { + return result; + } + + // + // XAMA Init ... + result = XAMAInitHandlers(); + if (!result) + { + return result; + } + + // + // XLH Init ... + result = XLHInitHandlers(); + if (!result) + { + return result; + } + + // + // XTD Init ... + result = XTDInitHandlers(); + if (!result) + { + return result; + } + + // + // XFI Init ... + result = XFIInitHandlers(); + if (!result) + { + return result; + } + + // + // XTS Init ... + result = XTSInitHandlers(); + if (!result) + { + return result; + } + + // + // XRSI Init ... + result = XRSIInitHandlers(); + if (!result) + { + return result; + } + + // + // XOBD Init ... + result = XOBDInitHandlers(); + if (!result) + { + return result; + } + + // + // XCLH Init ... + result = XCHLHInitHandlers(); + if (!result) + { + return result; + } + + // + // XCHMA Init ... + result = XCHMAInitHandlers(); + if (!result) + { + return result; + } + + // + result = true; + + // + return result; +} + +// +// Release Indicators ... +void XEU5ReleaseIndicators() +{ + // + // Release Handlers ... + XTMReleaseHandlers(); + XAMAReleaseHandlers(); + XLHReleaseHandlers(); + XTDReleaseHandlers(); + XFIReleaseHandlers(); + XTSReleaseHandlers(); + XRSIReleaseHandlers(); + XOBDReleaseHandlers(); + XCHMAReleaseHandlers(); + XCHLHReleaseHandlers(); +} + +// +// Handle Reading Buffers ... +void XEU5HandleReadingBuffers() +{ + // + // Reading Calculated Bars for a Simple Handler ... + xEU5CalculatedBars = BarsCalculated(xTMHandler); + + // + // Read Indicators Buffers ... + XTMReadBuffers(xEU5NumberOfItemsPerTick); + XAMAReadBuffers(xEU5NumberOfItemsPerTick); + XLHReadBuffers(xEU5NumberOfItemsPerTick); + XTDReadBuffers(xEU5NumberOfItemsPerTick); + XFIReadBuffers(xEU5NumberOfItemsPerTick); + XTSReadBuffers(xEU5NumberOfItemsPerTick); + XRSIReadBuffers(xEU5NumberOfItemsPerTick); + XOBDReadBuffers(xEU5NumberOfItemsPerTick); + XCHMAReadBuffers(xEU5NumberOfItemsPerTick); + XCHLHReadBuffers(xEU5NumberOfItemsPerTick); + + // + xEU5Provider.ReadConditions(); +} + +// +// +// START Combination Functions ... +// +// + +// +// Can Open Long Trade ... +// this is a Function will Check all market Conditions and get all +// Strategy requirement Verifications for Long Signals ... +bool XEU5CanOpenLongTrade( + XProvidedSignal &info // Retrieve Signal Additional Info on this Object +) +{ + // + bool result = false; + + // + info.tp = 0; + info.sl = 0; + ArrayResize( + info.signallers, + 0); + + // + bool hasSignal = XEU5HasLongSignal(info); + + // + result = + // + hasSignal + // + ; + + // + if (result) + { + xEU5Provider.ClearConditions(); + } + + // + return result; +} + +// +// Can Close Long Trade ... +// this is a Function will Check all market Conditions and get all +// Strategy requirement Verifications for Long Signals ... +bool XEU5CanCloseLongTrade() +{ + // + bool result = false; + + // + return result; +} + +// +// Can Open Short Trade ... +// this is a Function will Check all market Conditions and get all +// Strategy requirement Verifications for Short Signals ... +bool XEU5CanOpenShortTrade( + XProvidedSignal &info // Retrieve Signal Additional Info on this Object +) +{ + // + bool result = false; + + // + info.tp = 0; + info.sl = 0; + ArrayResize( + info.signallers, + 0); + + // + bool hasSignal = XEU5HasShortSignal(info); + + // + result = + // + hasSignal + // + ; + + // + if (result) + { + xEU5Provider.ClearConditions(); + } + + // + return result; +} + +// +// Can Close Short Trade ... +// this is a Function will Check all market Conditions and get all +// Strategy requirement Verifications for Short Signals ... +bool XEU5CanCloseShortTrade() +{ + // + bool result = false; + + // + return result; +} + +// +// +// END Combination Functions ... +// +// + +// +// +// START Combination Signaling ... +// +// + +// +// Check Market Conditions by Combination of Power of All tools for LONGs ... +bool XEU5HasLongSignal( + XProvidedSignal &info // Retrieve Signal Additional Info on this Object +) +{ + // + bool result = false; + + // + // XTD ... + bool isXTDHasSignal = XEU5XTDHasLongSignal(); + if (isXTDHasSignal) + { + // + Add( + EnumToString(XTD), + info.signallers); + } + + // + // XTAM ... + bool isXTAMHasSignal = XEU5XTAMHasLongSignal(); + if (isXTAMHasSignal) + { + // + Add( + EnumToString(XTAM), + info.signallers); + } + + // + // XSI ... + bool isXSIHasSignal = XEU5XSIHasLongSignal(); + if (isXSIHasSignal) + { + // + Add( + EnumToString(XSI), + info.signallers); + } + + // + // XTSFI ... + bool isXTSFIHasSignal = XEU5XTSFIHasLongSignal(); + if (isXTSFIHasSignal) + { + // + Add( + EnumToString(XTSFI), + info.signallers); + } + + // + // XOBD XLH ... + bool isXOBDLHHasSignal = XEU5XOBDLHHasLongSignal(); + if (isXOBDLHHasSignal) + { + // + Add( + EnumToString(XOBDLH), + info.signallers); + } + + // + // XCHMA Cycles Cross ... + bool isXCHMACCHasSignal = XEU5XCHMACCHasLongSignal(); + if (isXCHMACCHasSignal) + { + // + Add( + EnumToString(XCHMACC), + info.signallers); + } + + // + // XCHMA Cycles Min ... + bool isXCHMAMNHasSignal = XEU5XCHMAMNHasLongSignal(); + if (isXCHMAMNHasSignal) + { + // + Add( + EnumToString(XCHMAMN), + info.signallers); + } + + // + // XCHMA Cycles Max + bool isXCHMAMXHasSignal = XEU5XCHMAMXHasLongSignal(); + if (isXCHMAMXHasSignal) + { + // + Add( + EnumToString(XCHMAMX), + info.signallers); + } + + // + result = + // + isXTDHasSignal + // + || + // + isXTAMHasSignal + // + || + // + isXSIHasSignal + // + || + // + isXTSFIHasSignal + // + || + // + isXOBDLHHasSignal + // + || + // + isXCHMACCHasSignal + // + || + // + isXCHMAMNHasSignal + // + || + // + isXCHMAMXHasSignal + // + ; + + // + if (result) + { + // + // Only Log Signals Time Market Conditions if is in Testing Mode ... + if (xEU5IsTestMode) + { + // + XMarketConditions mConditions = xEU5Provider.GetLastMarketCondition(); + string message = xEU5Provider.GenerateConditionsString(mConditions); + + // + LogMessage( + "Long Signal Provided by: \n" + + info.signallers[ArraySize(info.signallers) - 1] + "\n" + + "Pusher: " + (string)ArraySize(info.signallers) + "\n" + + "Market Conditions: " + message); + } + } + + // + return result; +} + +// +// Check Market Conditions by Combination of Power of All tools for SHORTs ... +bool XEU5HasShortSignal( + XProvidedSignal &info // Retrieve Signal Additional Info on this Object +) +{ + // + bool result = false; + + // + // XTD ... + bool isXTDHasSignal = XEU5XTDHasShortSignal(); + if (isXTDHasSignal) + { + // + Add( + EnumToString(XTD), + info.signallers); + } + + // + // XTAM ... + bool isXTAMHasSignal = XEU5XTAMHasShortSignal(); + if (isXTAMHasSignal) + { + // + Add( + EnumToString(XTAM), + info.signallers); + } + + // + // XSI ... + bool isXSIHasSignal = XEU5XSIHasShortSignal(); + if (isXSIHasSignal) + { + // + Add( + EnumToString(XSI), + info.signallers); + } + + // + // XTSFI ... + bool isXTSFIHasSignal = XEU5XTSFIHasShortSignal(); + if (isXTSFIHasSignal) + { + // + Add( + EnumToString(XTSFI), + info.signallers); + } + + // + // XOBD XLH ... + bool isXOBDLHHasSignal = XEU5XOBDLHHasShortSignal(); + if (isXOBDLHHasSignal) + { + // + Add( + EnumToString(XOBDLH), + info.signallers); + } + + // + // XCHMA Cycles Cross ... + bool isXCHMACCHasSignal = XEU5XCHMACCHasShortSignal(); + if (isXCHMACCHasSignal) + { + // + Add( + EnumToString(XCHMACC), + info.signallers); + } + + // + // XCHMA Cycles Min ... + bool isXCHMAMNHasSignal = XEU5XCHMAMNHasShortSignal(); + if (isXCHMAMNHasSignal) + { + // + Add( + EnumToString(XCHMAMN), + info.signallers); + } + + // + // XCHMA Cycles Max + bool isXCHMAMXHasSignal = XEU5XCHMAMXHasShortSignal(); + if (isXCHMAMXHasSignal) + { + // + Add( + EnumToString(XCHMAMX), + info.signallers); + } + + // + result = + // + isXTDHasSignal + // + || + // + isXTAMHasSignal + // + || + // + isXSIHasSignal + // + || + // + isXTSFIHasSignal + // + || + // + isXOBDLHHasSignal + // + || + // + isXCHMACCHasSignal + // + || + // + isXCHMAMNHasSignal + // + || + // + isXCHMAMXHasSignal + // + ; + + // + if (result) + { + // + // Only Log Signals Time Market Conditions if is in Testing Mode ... + if (xEU5IsTestMode) + { + // + XMarketConditions mConditions = xEU5Provider.GetLastMarketCondition(); + string message = xEU5Provider.GenerateConditionsString(mConditions); + + // + LogMessage( + "Short Signal Provided by: \n" + + info.signallers[ArraySize(info.signallers) - 1] + "\n" + + "Pusher: " + (string)ArraySize(info.signallers) + "\n" + + "Market Conditions: " + message); + } + } + + // + return result; +} + +// +// +// END Combination Signaling ... +// +// + +// +// START Signal Providers ... +// + +// +// Disbale All Signallers Longs ... +void XEU5DisableLongSignallers() +{ + // + // XTD ... + if (xEU5MXTDEnableSignaller) + { + // + xEU5Provider.DisbaleXTDLongs(); + xEU5MXTDAllowLongSignals = false; + } + + // + // XTAM ... + if (xEU5MXTAMEnableSignaller) + { + // + xEU5Provider.DisbaleXTAMLongs(); + xEU5MXTAMAllowLongSignals = false; + } + + // + // XSI ... + if (xEU5MXSIEnableSignaller) + { + // + xEU5Provider.DisbaleXSILongs(); + xEU5MXSIAllowLongSignals = false; + } + + // + // XTSFI ... + if (xEU5MXTSFIEnableSignaller) + { + // + xEU5Provider.DisbaleXTSFILongs(); + xEU5MXTSFIAllowLongSignals = false; + } + + // + // XOBDLH ... + if (xEU5MXOBDLHEnableSignaller) + { + // + xEU5Provider.DisbaleXOBDLHLongs(); + xEU5MXOBDLHAllowLongSignals = false; + } + + // + // XCHMACC ... + if (xEU5MXCHMACCEnableSignaller) + { + // + xEU5Provider.DisbaleXCHMACCLongs(); + xEU5MXCHMACCAllowLongSignals = false; + } + + // + // XCHMAMX ... + if (xEU5MXCHMAMXEnableSignaller) + { + // + xEU5Provider.DisbaleXCHMAMXLongs(); + xEU5MXCHMAMXAllowLongSignals = false; + } + + // + // XCHMAMN ... + if (xEU5MXCHMAMNEnableSignaller) + { + // + xEU5Provider.DisbaleXCHMAMNLongs(); + xEU5MXCHMAMNAllowLongSignals = false; + } +} + +// +// Enable All Signallers Longs ... +// Only if they are Configured as Enable at Settings ... +void XEU5EnableLongSignallers() +{ + // + // XTD ... + if (xEU5MXTDEnableSignaller) + { + // + xEU5MXTDAllowLongSignals = + xEU5XTDAllowLongSignals + ? true + : xEU5MXTDAllowLongSignals; + + // + if (xEU5MXTDAllowLongSignals) + { + xEU5Provider.EnableXTDLongs(); + } + } + + // + // XTAM ... + if (xEU5MXTAMEnableSignaller) + { + // + xEU5MXTAMAllowLongSignals = + xEU5XTAMAllowLongSignals + ? true + : xEU5MXTAMAllowLongSignals; + + // + if (xEU5MXTAMAllowLongSignals) + { + xEU5Provider.EnableXTAMLongs(); + } + } + + // + // XSI ... + if (xEU5MXSIEnableSignaller) + { + // + xEU5MXSIAllowLongSignals = + xEU5XSIAllowLongSignals + ? true + : xEU5MXSIAllowLongSignals; + + // + if (xEU5MXSIAllowLongSignals) + { + xEU5Provider.EnableXSILongs(); + } + } + + // + // XTSFI ... + if (xEU5MXTSFIEnableSignaller) + { + // + xEU5MXTSFIAllowLongSignals = + xEU5XTSFIAllowLongSignals + ? true + : xEU5MXTSFIAllowLongSignals; + + // + if (xEU5MXTSFIAllowLongSignals) + { + xEU5Provider.EnableXTSFILongs(); + } + } + + // + // XOBDLH ... + if (xEU5MXOBDLHEnableSignaller) + { + // + xEU5MXOBDLHAllowLongSignals = + xEU5XOBDLHAllowLongSignals + ? true + : xEU5MXOBDLHAllowLongSignals; + + // + if (xEU5MXOBDLHAllowLongSignals) + { + xEU5Provider.EnableXOBDLHLongs(); + } + } + + // + // XCHMACC ... + if (xEU5MXCHMACCEnableSignaller) + { + // + xEU5MXCHMACCAllowLongSignals = + xEU5XCHMACCAllowLongSignals + ? true + : xEU5MXCHMACCAllowLongSignals; + + // + if (xEU5MXCHMACCAllowLongSignals) + { + xEU5Provider.EnableXCHMACCLongs(); + } + } + + // + // XCHMAMX ... + if (xEU5MXCHMAMXEnableSignaller) + { + // + xEU5MXCHMAMXAllowLongSignals = + xEU5XCHMAMXAllowLongSignals + ? true + : xEU5MXCHMAMXAllowLongSignals; + + // + if (xEU5MXCHMAMXAllowLongSignals) + { + xEU5Provider.EnableXCHMAMXLongs(); + } + } + + // + // XCHMAMN ... + if (xEU5MXCHMAMNEnableSignaller) + { + // + xEU5MXCHMAMNAllowLongSignals = + xEU5XCHMAMNAllowLongSignals + ? true + : xEU5MXCHMAMNAllowLongSignals; + + // + if (xEU5MXCHMAMNAllowLongSignals) + { + xEU5Provider.EnableXCHMAMNLongs(); + } + } +} + +// +// Disable All Signallers Shorts ... +void XEU5DisableShortSignallers() +{ + // + // XTD ... + if (xEU5MXTDEnableSignaller) + { + // + xEU5Provider.DisableXTDShorts(); + xEU5MXTDAllowShortSignals = false; + } + + // + // XTAM ... + if (xEU5MXTAMEnableSignaller) + { + // + xEU5Provider.DisableXTAMShorts(); + xEU5MXTAMAllowShortSignals = false; + } + + // + // XSI ... + if (xEU5MXSIEnableSignaller) + { + // + xEU5Provider.DisableXSIShorts(); + xEU5MXSIAllowShortSignals = false; + } + + // + // XTSFI ... + if (xEU5MXTSFIEnableSignaller) + { + // + xEU5Provider.DisableXTSFIShorts(); + xEU5MXTSFIAllowShortSignals = false; + } + + // + // XOBDLH ... + if (xEU5MXOBDLHEnableSignaller) + { + // + xEU5Provider.DisableXOBDLHShorts(); + xEU5MXOBDLHAllowShortSignals = false; + } + + // + // XCHMACC ... + if (xEU5MXCHMACCEnableSignaller) + { + // + xEU5Provider.DisableXCHMACCShorts(); + xEU5MXCHMACCAllowShortSignals = false; + } + + // + // XCHMAMX ... + if (xEU5MXCHMAMXEnableSignaller) + { + // + xEU5Provider.DisableXCHMAMXShorts(); + xEU5MXCHMAMXAllowShortSignals = false; + } + + // + // XCHMAMN ... + if (xEU5MXCHMAMNEnableSignaller) + { + // + xEU5Provider.DisableXCHMAMNShorts(); + xEU5MXCHMAMNAllowShortSignals = false; + } +} + +// +// Enable All Signallers Shorts ... +// Only if they are Configured as Enable at Settings ... +void XEU5EnableShortSignallers() +{ + // + // XTD ... + if (xEU5MXTDEnableSignaller) + { + // + xEU5MXTDAllowShortSignals = + xEU5XTDAllowShortSignals + ? true + : xEU5MXTDAllowShortSignals; + + // + if (xEU5MXTDAllowShortSignals) + { + xEU5Provider.EnableXTDShorts(); + } + } + + // + // XTAM ... + if (xEU5MXTAMEnableSignaller) + { + // + xEU5MXTAMAllowShortSignals = + xEU5XTAMAllowShortSignals + ? true + : xEU5MXTAMAllowShortSignals; + + // + if (xEU5MXTAMAllowShortSignals) + { + xEU5Provider.EnableXTAMShorts(); + } + } + + // + // XSI ... + if (xEU5MXSIEnableSignaller) + { + // + xEU5MXSIAllowShortSignals = + xEU5XSIAllowShortSignals + ? true + : xEU5MXSIAllowShortSignals; + + // + if (xEU5MXSIAllowShortSignals) + { + xEU5Provider.EnableXSIShorts(); + } + } + + // + // XTSFI ... + if (xEU5MXTSFIEnableSignaller) + { + // + xEU5MXTSFIAllowShortSignals = + xEU5XTSFIAllowShortSignals + ? true + : xEU5MXTSFIAllowShortSignals; + + // + if (xEU5MXTSFIAllowShortSignals) + { + xEU5Provider.EnableXTSFIShorts(); + } + } + + // + // XOBDLH ... + if (xEU5MXOBDLHEnableSignaller) + { + // + xEU5MXOBDLHAllowShortSignals = + xEU5XOBDLHAllowShortSignals + ? true + : xEU5MXOBDLHAllowShortSignals; + + // + if (xEU5MXOBDLHAllowShortSignals) + { + xEU5Provider.EnableXOBDLHShorts(); + } + } + + // + // XCHMACC ... + if (xEU5MXCHMACCEnableSignaller) + { + // + xEU5MXCHMACCAllowShortSignals = + xEU5XCHMACCAllowShortSignals + ? true + : xEU5MXCHMACCAllowShortSignals; + + // + if (xEU5MXCHMACCAllowShortSignals) + { + xEU5Provider.EnableXCHMACCShorts(); + } + } + + // + // XCHMAMX ... + if (xEU5MXCHMAMXEnableSignaller) + { + // + xEU5MXCHMAMXAllowShortSignals = + xEU5XCHMAMXAllowShortSignals + ? true + : xEU5MXCHMAMXAllowShortSignals; + + // + if (xEU5MXCHMAMXAllowShortSignals) + { + xEU5Provider.EnableXCHMAMXShorts(); + } + } + + // + // XCHMAMN ... + if (xEU5MXCHMAMNEnableSignaller) + { + // + xEU5MXCHMAMNAllowShortSignals = + xEU5XCHMAMNAllowShortSignals + ? true + : xEU5MXCHMAMNAllowShortSignals; + + // + if (xEU5MXCHMAMNAllowShortSignals) + { + xEU5Provider.EnableXCHMAMNShorts(); + } + } +} + +// +// +// + +// +// XTD Long Signal Checking ... +bool XEU5XTDHasLongSignal() +{ + // + bool result = false; + + // + // Validate Args ... + if (!xEU5MXTDEnableSignaller || + !xEU5MXTDAllowLongSignals) + { + return result; + } + + // + // Retrieve Market Condition ... + XMarketConditions mConditions = xEU5Provider.GetLastMarketCondition(); + + // + // Start Analysing Market based On Conditions ... + result = + // + // Base Condition: + xEU5Provider.XTDHasLongConditions() + // + && + // + // Exceptions: + // there some commonly Exceptions which makes our choice incorrect, + // here we are combined knownly Exceptions ... + !( + // + // for Exception we used XLH Conditions as follow ... + // + // Check Conditions if Price In Signal Range ... + (mConditions.isXLHPriceInSignalRange && + // + ( + // + // Next Step is to Check LL and HH Same Style ... + // + // Check if Both LL and HH Same In Length ... + ((mConditions.isXLHLLSameInLength && + mConditions.isXLHHHSameInLength) && + // + ( + // + (mConditions.isXTSCurrentMin && + mConditions.isXTDSignalCrossedOverBear && + (mConditions.isXCHMAMCFastUnderSlow || + mConditions.isXCHMAMCFastCrossedUnderSlow)) + // + || + // + ((mConditions.isXTSCurrentUnderNearest || + mConditions.isXTSCurrentCrossedUnderNearest) && + (mConditions.isXTSCurrentUnderMediest || + mConditions.isXTSCurrentCrossedUnderMediest) && + (mConditions.isXCHMAMCFastUnderSlow || + mConditions.isXCHMAMCFastCrossedUnderSlow)) + // + || + // + (mConditions.isXCHMAMCVale && + mConditions.isXCHMALCVale && + mConditions.isXTSCurrentMax && + mConditions.isXCHLHMCLCLLSame) + // + || + // + ((mConditions.isXCHMAMCFastUnderSlow || + mConditions.isXCHMAMCFastCrossedUnderSlow) && + (mConditions.isXCHMALCFastOverSlow || + mConditions.isXCHMALCFastCrossedOverSlow)) + // + || + // + (mConditions.isXTSCurrentMax && + mConditions.isXCHMASCCrossedOverMin && + mConditions.isXTDSignalCrossedOverBear && + (mConditions.isXCHMALCFastUnderSlow || + mConditions.isXCHMALCFastCrossedUnderSlow)) + // + || + // + ( + (mConditions.isXCHMALCFastUnderSlow || + mConditions.isXCHMALCFastCrossedUnderSlow) && + ( + // + (mConditions.isXTMNeutural && + mConditions.isXTSCurrentMax) + // + || + // + (mConditions.isXCHMALCVale && + mConditions.isXTSCurrentUnderNearest) + // + || + // + (mConditions.isXTMNeutural && + mConditions.isXAMANeutural) + // + || + // + (mConditions.isXFICrossedOverZero && + mConditions.isXTDSignalCrossedOverBear) + // + ) + // + ) + // + || + // + (mConditions.isXCHMAMCPeak && + (mConditions.isXCHMAMCFastOverSlow || + mConditions.isXCHMAMCFastCrossedOverSlow)) + // + || + // + (mConditions.isXCHMALCPeak && + (mConditions.isXCHMALCFastOverSlow || + mConditions.isXCHMALCFastCrossedOverSlow)) + // + || + // + ( + (mConditions.isXCHMAMCVale && + mConditions.isXTDBearishVale) && + ( + // + (mConditions.isXCHMALCVale && + mConditions.isXCHLHMCLCLLSame) + // + || + // + (mConditions.isXCHMAMCFastUnderSlow || + mConditions.isXCHMAMCFastCrossedUnderSlow) + // + || + // + (mConditions.isXLHLLIncreased && + mConditions.isXTMStartBullish && + mConditions.isXAMAStartBullish && + mConditions.isXTSCurrentUnderFarest && + (mConditions.isXTSCurrentUnderNearest || + mConditions.isXTSCurrentCrossedUnderNearest)) + // + ) + // + ) + // + || + // + (mConditions.isXTSCurrentMax && + mConditions.isXTDBearishVale && + mConditions.isXCHLHMCLCHHSame && + mConditions.isXCHMAMCTrendsDown) + // + ) + // + ) + // + || + // + // Check If LL Same In Length ... + ((mConditions.isXLHLLSameInLength && + !mConditions.isXLHHHSameInLength) && + // + ( + // + (mConditions.isXCHMALCPeak && + (mConditions.isXCHMALCFastOverSlow || + mConditions.isXCHMALCFastCrossedOverSlow)) + // + || + // + ( + (mConditions.isXCHMAMCVale && + (mConditions.isXCHMAMCFastUnderSlow || + mConditions.isXCHMAMCFastCrossedUnderSlow)) && + ( + // + ( + // + mConditions.isXAMANeutural + // + || + // + (mConditions.isXLHLLDecreased && + mConditions.isXCHLHMCLCLLSame && + mConditions.isXAMAStartBullish) + // + ) + // + ) + // + ) + // + || + // + // + ((mConditions.isXTSCurrentMax && + mConditions.isXLHHHDecreased) && + ( + // + (mConditions.isXTDBearishVale && + mConditions.isXCHLHMCLCLLSame && + (mConditions.isXCHMAMCFastUnderSlow || + mConditions.isXCHMAMCFastCrossedUnderSlow)) + // + || + // + (mConditions.isXCHMALCVale && + mConditions.isXTDSignalCrossedOverBear && + (mConditions.isXCHMALCFastUnderSlow || + mConditions.isXCHMALCFastCrossedUnderSlow)) + // + ) + // + ) + // + || + // + (mConditions.isXTMNeutural && + mConditions.isXTMEndBullish && + mConditions.isXAMANeutural && + mConditions.isXAMAEndBullish && + mConditions.isXTDSignalCrossedOverBear && + (mConditions.isXTSCurrentUnderNearest || + mConditions.isXTSCurrentCrossedUnderNearest) && + (mConditions.isXCHMALCFastUnderSlow || + mConditions.isXCHMALCFastCrossedUnderSlow)) + // + || + // + (mConditions.isXAMANeutural && + mConditions.isXLHHHDecreased && + mConditions.isXTSCurrentUnderFarest && + mConditions.isXTDSignalCrossedOverBear && + (mConditions.isXCHMAMCFastUnderSlow || + mConditions.isXCHMAMCFastCrossedUnderSlow)) + // + ) + // + ) + // + || + // + // Check If HH is Same In Length ... + ((mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + (mConditions.isXCHMALCPeak && + (mConditions.isXCHMALCFastOverSlow || + mConditions.isXCHMALCFastCrossedOverSlow)) + // + || + // + (mConditions.isXCHMAMCPeak && + (mConditions.isXCHMAMCFastOverSlow || + mConditions.isXCHMAMCFastCrossedOverSlow)) + // + || + // + (mConditions.isXTMBullish && + mConditions.isXAMANeutural && + mConditions.isXAMAEndBearish && + mConditions.isXTDBearishVale && + mConditions.isXTMStartBullish && + mConditions.isXCHLHMCLCHHSame && + mConditions.isXTSCurrentUnderFarest) + // + ) + // + ) + // + || + // + // Not Same LL or HH in Lenght ... + ((!mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + false + // + ) + // + ) + // + ) + // + ) + // + || + // + // Check Conditions if Price is Under Signal ... + ( + // + ((mConditions.isXLHPriceUnderSignal || + mConditions.isXLHPriceCrossedUnderSignal) && + ( + // + // Next Step is to Check LL and HH Same Style ... + // + // Check if Both LL and HH Same In Length ... + ((mConditions.isXLHLLSameInLength && + mConditions.isXLHHHSameInLength) && + // + ( + // + (mConditions.isXCHMAMCVale && + // + ( + // + (mConditions.isXTMNeutural && + mConditions.isXTMEndBullish) + // + || + // + (mConditions.isXAMAVale && + mConditions.isXCHMALCVale && + mConditions.isXTMStartBullish && + mConditions.isXCHLHMCLCLLSame) + // + || + // + (mConditions.isXAMANeutural && + mConditions.isXTDBearishVale && + mConditions.isXCHLHMCLCHHSame) + // + || + // + (mConditions.isXTMNeutural && + mConditions.isXAMANeutural && + mConditions.isXLHHHDecreased) + // + || + // + (mConditions.isXCHMAMCFastUnderSlow || + mConditions.isXCHMAMCFastCrossedUnderSlow) + // + ) + // + ) + // + // + || + // + (mConditions.isXCHMALCPeak && + (mConditions.isXCHMALCFastOverSlow || + mConditions.isXCHMALCFastCrossedOverSlow)) + // + ) + // + ) + // + || + // + // Check If LL Same In Length ... + ((mConditions.isXLHLLSameInLength && + !mConditions.isXLHHHSameInLength) && + // + ( + // + (mConditions.isXCHMAMCVale && + (mConditions.isXCHMAMCFastUnderSlow || + mConditions.isXCHMAMCFastCrossedUnderSlow)) + // + || + // + (mConditions.isXTSCurrentMax && + mConditions.isXTDBearishVale && + mConditions.isXCHLHSCMCLLSame) + // + || + // + (mConditions.isXCHMALCPeak && + (mConditions.isXCHMALCFastOverSlow || + mConditions.isXCHMALCFastCrossedOverSlow)) + // + || + // + ((mConditions.isXLHHHDecreased && + mConditions.isXFICrossedOverZero) && + ( + // + (mConditions.isXTMNeutural && + mConditions.isXCHMAMCVale && + mConditions.isXCHMALCVale && + mConditions.isXAMAStartBearish && + mConditions.isXTDSignalCrossedOverBear) + // + || + // + (mConditions.isXAMANeutural && + mConditions.isXTSCurrentUnderFarest && + (mConditions.isXCHMAMCFastUnderSlow || + mConditions.isXCHMAMCFastCrossedUnderSlow)) + // + ) + // + ) + // + ) + // + ) + // + || + // + // Check If HH is Same In Length ... + ((mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + (mConditions.isXAMAVale && + mConditions.isXTSCurrentMax && + mConditions.isXTDBearishVale && + mConditions.isXLHLLIncreased) + // + || + // + (mConditions.isXCHMALCPeak && + (mConditions.isXCHMALCFastOverSlow || + mConditions.isXCHMALCFastCrossedOverSlow)) + // + || + // + (mConditions.isXCHMAMCPeak && + (mConditions.isXCHMAMCFastOverSlow || + mConditions.isXCHMAMCFastCrossedOverSlow)) + // + || + // + (mConditions.isXTMNeutural && + mConditions.isXCHMALCVale && + mConditions.isXAMANeutural && + mConditions.isXFICrossedOverZero && + mConditions.isXTDSignalCrossedOverBear && + mConditions.isXLHPriceCrossedUnderSignal) + // + ) + // + ) + // + || + // + // Not Same LL or HH in Lenght ... + ((!mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + (mConditions.isXCHMALCPeak && + (mConditions.isXCHMALCFastOverSlow || + mConditions.isXCHMALCFastCrossedOverSlow)) + // + || + // + (mConditions.isXAMANeutural && + mConditions.isXTSCurrentMax && + mConditions.isXTMStartBullish && + mConditions.isXCHLHSCMCLLSame && + mConditions.isXTSCurrentOverFarest && + mConditions.isXTSCurrentOverNearest && + mConditions.isXTSCurrentOverMediest && + mConditions.isXTSCurrentCrossedOverFarest && + mConditions.isXTSCurrentCrossedOverNearest && + mConditions.isXTSCurrentCrossedOverMediest && + (mConditions.isXCHMAMCFastUnderSlow || + mConditions.isXCHMAMCFastCrossedUnderSlow)) + // + ) + // + ) + // + ) + // + ) + // + ) + // + || + // + // Check Conditions if Price is Over Signal ... + ( + // + ((mConditions.isXLHPriceOverSignal || + mConditions.isXLHPriceCrossedOverSignal) && + ( + // + // Next Step is to Check LL and HH Same Style ... + // + // Check if Both LL and HH Same In Length ... + ((mConditions.isXLHLLSameInLength && + mConditions.isXLHHHSameInLength) && + // + ( + // + (mConditions.isXTMBullish && + mConditions.isXAMABullish && + mConditions.isXLHHHIncreased && + mConditions.isXCHLHMCLCLLSame && + mConditions.isXTSCurrentUnderMediest && + mConditions.isXTDSignalCrossedOverBear && + (mConditions.isXCHMASCTrendsUp && + (mConditions.isXCHMASCFastUnderSlow || + mConditions.isXCHMASCFastCrossedUnderSlow))) + // + || + // + (mConditions.isXTDSignalCrossedOverBear && + (mConditions.isXCHMALCVale && + (mConditions.isXCHMALCFastUnderSlow || + mConditions.isXCHMALCFastCrossedUnderSlow))) + // + || + // + (mConditions.isXCHMALCPeak && + (mConditions.isXCHMALCFastOverSlow || + mConditions.isXCHMALCFastCrossedOverSlow)) + // + || + // + ((mConditions.isXCHMALCFastUnderSlow || + mConditions.isXCHMALCFastCrossedUnderSlow) && + ( + // + (mConditions.isXCHLHMCLCLLSame && + mConditions.isXTSCurrentUnderNearest) + // + || + // + (mConditions.isXCHLHMCLCHHSame && + mConditions.isXCHLHMCLCLLSame && + mConditions.isXTSCurrentUnderNearest) + // + ) + // + ) + // + || + // + (mConditions.isXCHMALCVale && + mConditions.isXTDBearishVale && + mConditions.isXTMStartBullish && + mConditions.isXAMAStartBullish) + // + || + // + ((mConditions.isXTSCurrentMax && + mConditions.isXCHLHMCLCHHSame && + mConditions.isXTDSignalCrossedOverBear) && + ( + // + ( + // + mConditions.isXCHMASCCrossedOverMax + // + || + // + (mConditions.isXTMBullish && + mConditions.isXAMABullish && + mConditions.isXCHLHMCLCLLSame && + mConditions.isXTSCurrentOverFarest && + mConditions.isXTSCurrentOverNearest && + mConditions.isXTSCurrentOverMediest) + // + ) + // + ) + // + ) + // + || + // + (mConditions.isXCHMAMCPeak && + (mConditions.isXCHMAMCFastOverSlow || + mConditions.isXCHMAMCFastCrossedOverSlow)) + // + || + // + (mConditions.isXTSCurrentMax && + mConditions.isXCHLHMCLCLLSame && + mConditions.isXCHMASCCrossedOverMax && + mConditions.isXTDSignalCrossedOverBear) + // + || + // + (mConditions.isXCHMAMCFastUnderSlow || + mConditions.isXCHMAMCFastCrossedUnderSlow) + // + || + // + ((mConditions.isXTMNeutural && + mConditions.isXAMANeutural) && + ( + // + ( + // + (mConditions.isXTSCurrentUnderFarest || + mConditions.isXTSCurrentUnderMediest) + // + || + // + (mConditions.isXTSCurrentMax && + mConditions.isXTDBearishVale && + mConditions.isXTDSignalCrossedOverBear) + // + ) && + (mConditions.isXCHMALCVale && + (mConditions.isXCHMALCFastUnderSlow || + mConditions.isXCHMALCFastCrossedUnderSlow)) + // + ) + // + ) + // + || + // + ((mConditions.isXCHMALCVale && + (mConditions.isXCHMALCFastUnderSlow || + mConditions.isXCHMALCFastCrossedUnderSlow)) && + ( + // + mConditions.isXRSICrossedOverLongExit + // + || + // + (mConditions.isXTSAllSame && + mConditions.isXAMAStartBullish && + mConditions.isXTDSignalCrossedOverBear) + // + || + // + (mConditions.isXTSCurrentMax && + mConditions.isXAMAStartBullish) + // + || + // + ((mConditions.isXTSCurrentUnderNearest || + mConditions.isXTSCurrentCrossedUnderNearest) && + (mConditions.isXTSCurrentUnderMediest || + mConditions.isXTSCurrentCrossedUnderMediest)) + // + ) + // + ) + // + ) + // + ) + // + || + // + // Check If LL Same In Length ... + ((mConditions.isXLHLLSameInLength && + !mConditions.isXLHHHSameInLength) && + // + ( + // + (mConditions.isXCHMAMCPeak && + (mConditions.isXCHMAMCFastOverSlow || + mConditions.isXCHMAMCFastCrossedOverSlow)) + // + || + // + (mConditions.isXCHMALCPeak && + (mConditions.isXCHMALCFastOverSlow || + mConditions.isXCHMALCFastCrossedOverSlow)) + // + || + // + ((mConditions.isXTSCurrentMax || + mConditions.isXTSCurrentUnderFarest) && + mConditions.isXTDBearishVale && + mConditions.isXLHLLDecreased && + mConditions.isXLHPriceCrossedOverSignal && + (mConditions.isXCHMAMCFastUnderSlow || + mConditions.isXCHMAMCFastCrossedUnderSlow)) + // + || + // + ((mConditions.isXCHLHSCMCHHSame && + mConditions.isXTDSignalCrossedOverBear) && + ( + // + (mConditions.isXTSCurrentMax && + mConditions.isXLHHighAttachedHH) + // + || + // + (mConditions.isXCHLHMCLCLLSame && + ( + // + (mConditions.isXCHMASCCrossedOverMin && + (mConditions.isXCHMALCFastUnderSlow || + mConditions.isXCHMALCFastCrossedUnderSlow)) + // + || + // + (mConditions.isXCHMASCCrossedOverMax && + (mConditions.isXCHMAMCFastUnderSlow || + mConditions.isXCHMAMCFastCrossedUnderSlow)) + // + ) + // + ) + // + || + // + (((mConditions.isXCHMAMCFastUnderSlow || + mConditions.isXCHMAMCFastCrossedUnderSlow) || + (mConditions.isXCHMALCFastUnderSlow || + mConditions.isXCHMALCFastCrossedUnderSlow)) && + // + ( + // + ((mConditions.isXTSCurrentUnderNearest || + mConditions.isXTSCurrentCrossedUnderNearest) && + (mConditions.isXTSCurrentUnderMediest || + mConditions.isXTSCurrentCrossedUnderMediest)) + // + ) + // + ) + // + ) + // + ) + // + || + // + (( + // + (mConditions.isXFICrossedOverZero && + mConditions.isXTDSignalCrossedOverBear) + // + || + // + (mConditions.isXTDBullOverBear && + mConditions.isXTSCurrentOverFarest && + mConditions.isXTSCurrentOverMediest) + // + ) && + (mConditions.isXCHMALCVale && + (mConditions.isXCHMALCFastUnderSlow || + mConditions.isXCHMALCFastCrossedUnderSlow))) + // + || + // + (mConditions.isXTMBullish && + mConditions.isXAMABullish && + mConditions.isXFIOverZero && + mConditions.isXCHLHSameHHs && + mConditions.isXTSCurrentMax && + mConditions.isXCHMASCCrossedOverMax && + mConditions.isXTDSignalCrossedOverBear) + // + || + // + (mConditions.isXCHMAMCVale && + mConditions.isXCHMALCVale && + mConditions.isXTDBearishVale && + mConditions.isXCHLHMCLCLLSame && + mConditions.isXAMAStartBullish) + // + ) + // + ) + // + || + // + // Check If HH is Same In Length ... + ((mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + (mConditions.isXTDBearishVale && + mConditions.isXCHLHMCLCHHSame && + (mConditions.isXCHMALCFastUnderSlow || + mConditions.isXCHMALCFastCrossedUnderSlow)) + // + || + // + (mConditions.isXTMEndBullish && + mConditions.isXTDBearishVale && + mConditions.isXFICrossedOverZero && + (mConditions.isXCHMAMCFastUnderSlow || + mConditions.isXCHMAMCFastCrossedUnderSlow)) + // + || + // + (mConditions.isXCHMAMCPeak && + (mConditions.isXCHMAMCFastOverSlow || + mConditions.isXCHMAMCFastCrossedOverSlow)) + // + || + // + (mConditions.isXCHMALCPeak && + (mConditions.isXCHMALCFastOverSlow || + mConditions.isXCHMALCFastCrossedOverSlow)) + // + || + // + (mConditions.isXCHMALCVale && + (mConditions.isXCHMALCFastUnderSlow || + mConditions.isXCHMALCFastCrossedUnderSlow)) + // + || + // + (mConditions.isXTSCurrentMax && + mConditions.isXCHLHMCLCHHSame && + mConditions.isXFICrossedOverZero && + mConditions.isXTSCurrentOverFarest && + mConditions.isXTSCurrentOverNearest && + mConditions.isXTSCurrentOverMediest && + mConditions.isXTDSignalCrossedOverBear) + // + ) + // + ) + // + || + // + // Not Same LL or HH in Lenght ... + ((!mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + (mConditions.isXCHMAMCPeak && + (mConditions.isXCHMAMCFastOverSlow || + mConditions.isXCHMAMCFastCrossedOverSlow)) + // + || + // + ((mConditions.isXTSCurrentMax && + mConditions.isXTDSignalCrossedOverBear) && + ( + // + (mConditions.isXCHLHSCMCHHSame && + mConditions.isXLHHighAttachedHH) + // + || + // + (mConditions.isXAMAEndBullish && + mConditions.isXCHLHSCMCLLSame && + (mConditions.isXCHMAMCFastUnderSlow || + mConditions.isXCHMAMCFastCrossedUnderSlow)) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + || + // + // Check Conditions if Price is not has clear state ... + ( + // + ((!mConditions.isXLHPriceOverSignal && + !mConditions.isXLHPriceUnderSignal && + !mConditions.isXLHPriceInSignalRange && + !mConditions.isXLHPriceCrossedOverSignal && + !mConditions.isXLHPriceCrossedUnderSignal) && + ( + // + // Next Step is to Check LL and HH Same Style ... + // + // Check if Both LL and HH Same In Length ... + ((mConditions.isXLHLLSameInLength && + mConditions.isXLHHHSameInLength) && + // + ( + // + (mConditions.isXTMNeutural && + mConditions.isXAMANeutural) + // + || + // + (mConditions.isXCHMALCVale && + (mConditions.isXCHMALCFastUnderSlow || + mConditions.isXCHMALCFastCrossedUnderSlow)) + // + ) + // + ) + // + || + // + // Check If LL Same In Length ... + ((mConditions.isXLHLLSameInLength && + !mConditions.isXLHHHSameInLength) && + // + ( + // + (mConditions.isXCHMALCPeak && + (mConditions.isXCHMALCFastOverSlow || + mConditions.isXCHMALCFastCrossedOverSlow)) + // + ) + // + ) + // + || + // + // Check If HH is Same In Length ... + ((mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + false + // + ) + // + ) + // + || + // + // Not Same LL or HH in Lenght ... + ((!mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + false + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ; + + // + return result; +} + +// +// XTD Short Signal Checking ... +bool XEU5XTDHasShortSignal() +{ + // + bool result = false; + + // + // Validate Args ... + if (!xEU5MXTDEnableSignaller || + !xEU5MXTDAllowShortSignals) + { + return result; + } + + // + // Retrieve Market Condition ... + XMarketConditions mConditions = xEU5Provider.GetLastMarketCondition(); + + // + // Start Analysing Market based On Conditions ... + result = + // + // Base Condition: + xEU5Provider.XTDHasShortConditions() + // + && + // + // Exceptions: + // there some commonly Exceptions which makes our choice incorrect, + // here we are combined knownly Exceptions ... + !( + // + // for Exception we used XLH Conditions as follow ... + // + // Check Conditions if Price In Signal Range ... + (mConditions.isXLHPriceInSignalRange && + // + ( + // + // Next Step is to Check LL and HH Same Style ... + // + // PriceInSignalRange ... + // Check if Both LL and HH Same In Length ... + ((mConditions.isXLHLLSameInLength && + mConditions.isXLHHHSameInLength) && + // + ( + // + (mConditions.isXTDBullOverBear && + mConditions.isXFICrossedOverZero && + mConditions.isXTSCurrentOverNearest && + mConditions.isXTSCurrentOverMediest) + // + ) + // + ) + // + || + // + // PriceInSignalRange ... + // Check If LL Same In Length ... + ((mConditions.isXLHLLSameInLength && + !mConditions.isXLHHHSameInLength) && + // + ( + // + ((mConditions.isXCHMAMCFastOverSlow || + mConditions.isXCHMAMCFastCrossedOverSlow) && + ( + // + (mConditions.isXTDBullOverBear && + ( + // + (mConditions.isXCHMAMCPeak && + mConditions.isXCHMAMCTrendsUp) + // + || + // + (mConditions.isXCHLHSCMCHHSame && + mConditions.isXCHLHMCLCLLSame) + // + || + // + (mConditions.isXTSCurrentOverNearest && + mConditions.isXTSCurrentOverMediest) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + || + // + // PriceInSignalRange ... + // Check If HH is Same In Length ... + ((mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + ((mConditions.isXCHMASCFastOverSlow || + mConditions.isXCHMASCFastCrossedOverSlow) && + ( + // + (mConditions.isXFIOverZero && + mConditions.isXTMNeutural && + mConditions.isXAMANeutural && + mConditions.isXTDBullOverBear) + // + || + // + ((mConditions.isXTDBullOverBear && + mConditions.isXTSCurrentOverFarest && + mConditions.isXTSCurrentOverNearest) && + ( + // + (mConditions.isXTMNeutural && + mConditions.isXAMANeutural) + // + ) + // + ) + // + ) + // + ) + // + || + // + ((mConditions.isXCHMAMCFastOverSlow || + mConditions.isXCHMAMCFastCrossedOverSlow) && + ( + // + ((mConditions.isXAMANeutural || + mConditions.isXAMAEndBullish) && + mConditions.isXTDBullOverBear) + // + || + // + (mConditions.isXCHLHSameLLs && + mConditions.isXCHMAMCTrendsUp && + mConditions.isXLHLowAttachedLL) + // + ) + // + ) + // + ) + // + ) + // + || + // + // PriceInSignalRange ... + // Not Same LL or HH in Lenght ... + ((!mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + false + // + ) + // + ) + // + ) + // + ) + // + || + // + // Check Conditions if Price is Under Signal ... + ( + // + ((mConditions.isXLHPriceUnderSignal || + mConditions.isXLHPriceCrossedUnderSignal) && + ( + // + // Next Step is to Check LL and HH Same Style ... + // + // PriceUnderSignal ... + // Check if Both LL and HH Same In Length ... + ((mConditions.isXLHLLSameInLength && + mConditions.isXLHHHSameInLength) && + // + ( + // + (mConditions.isXTMBearish && + mConditions.isXAMABearish && + mConditions.isXCHMALCVale && + mConditions.isXTSCurrentMin && + mConditions.isXTDBullOverBear) + // + || + // + ((mConditions.isXCHMASCFastOverSlow || + mConditions.isXCHMASCFastCrossedOverSlow) && + ( + // + (mConditions.isXTDBullOverBear && + ( + // + (mConditions.isXTMNeutural && + mConditions.isXAMANeutural) + // + || + // + (mConditions.isXCHMASCTrendsUp && + mConditions.isXTMStartBearish && + mConditions.isXAMAStartBearish) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + || + // + // PriceUnderSignal ... + // Check If LL Same In Length ... + ((mConditions.isXLHLLSameInLength && + !mConditions.isXLHHHSameInLength) && + // + ( + // + false + // + ) + // + ) + // + || + // + // PriceUnderSignal ... + // Check If HH is Same In Length ... + ((mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + ((mConditions.isXCHMASCFastOverSlow || + mConditions.isXCHMASCFastCrossedOverSlow) && + ( + // + mConditions.isXCHMASCTrendsUp + // + || + // + (mConditions.isXTDBullOverBear && + mConditions.isXTSCurrentOverNearest) + // + ) + // + ) + // + ) + // + ) + // + || + // + // PriceUnderSignal ... + // Not Same LL or HH in Lenght ... + ((!mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + false + // + ) + // + ) + // + ) + // + ) + // + ) + // + || + // + // Check Conditions if Price is Over Signal ... + ( + // + ((mConditions.isXLHPriceOverSignal || + mConditions.isXLHPriceCrossedOverSignal) && + ( + // + // Next Step is to Check LL and HH Same Style ... + // + // PriceOverSignal ... + // Check if Both LL and HH Same In Length ... + ((mConditions.isXLHLLSameInLength && + mConditions.isXLHHHSameInLength) && + // + ( + // + ((mConditions.isXCHMALCTrendsDown && + (mConditions.isXCHMALCFastUnderSlow || + mConditions.isXCHMALCFastCrossedUnderSlow)) && + ( + // + (mConditions.isXTMNeutural && + mConditions.isXTDBullOverBear && + (mConditions.isXAMANeutural || + mConditions.isXTSCurrentOverFarest)) + // + ) + // + ) + // + || + // + ((mConditions.isXCHMASCFastOverSlow || + mConditions.isXCHMASCFastCrossedOverSlow) && + ( + // + (mConditions.isXTMNeutural && + mConditions.isXAMABullish && + mConditions.isXTDBullOverBear && + mConditions.isXCHLHSCMCHHSame && + mConditions.isXTSCurrentOverFarest) + // + || + // + (mConditions.isXCHMALCVale && + mConditions.isXCHMALCTrendsUp && + (mConditions.isXCHMALCFastUnderSlow || + mConditions.isXCHMALCFastCrossedUnderSlow)) + // + ) + // + ) + // + ) + // + ) + // + || + // + // PriceOverSignal ... + // Check If LL Same In Length ... + ((mConditions.isXLHLLSameInLength && + !mConditions.isXLHHHSameInLength) && + // + ( + // + ((mConditions.isXCHMASCFastOverSlow || + mConditions.isXCHMASCFastCrossedOverSlow) && + ( + // + (mConditions.isXCHMALCVale && + mConditions.isXCHMASCTrendsUp) + // + || + // + (mConditions.isXTMBullish && + mConditions.isXAMABullish && + mConditions.isXTDBullOverBear && + mConditions.isXCHLHSCMCHHSame && + mConditions.isXLHHighAttachedHH) + // + ) + // + ) + // + || + // + ((mConditions.isXCHMAMCFastOverSlow || + mConditions.isXCHMAMCFastCrossedOverSlow) && + ( + // + (mConditions.isXTDBullOverBear && + ( + // + (mConditions.isXCHLHSCMCHHSame && + mConditions.isXCHLHMCLCLLSame) + // + || + // + (mConditions.isXTMNeutural && + mConditions.isXAMANeutural && + mConditions.isXTMEndBullish && + mConditions.isXAMAEndBullish && + mConditions.isXLHHighAttachedHH) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + || + // + // PriceOverSignal ... + // Check If HH is Same In Length ... + ((mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + false + // + ) + // + ) + // + || + // + // PriceOverSignal ... + // Not Same LL or HH in Lenght ... + ((!mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + ((mConditions.isXCHMAMCFastOverSlow || + mConditions.isXCHMAMCFastCrossedOverSlow) && + ( + // + mConditions.isXCHMAMCTrendsUp + // + || + // + (mConditions.isXTMBullish && + mConditions.isXAMABullish && + mConditions.isXFIOverZero && + mConditions.isXTDBullOverBear) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + || + // + // Check Conditions if Price is not has clear state ... + ( + // + ((!mConditions.isXLHPriceOverSignal && + !mConditions.isXLHPriceUnderSignal && + !mConditions.isXLHPriceInSignalRange && + !mConditions.isXLHPriceCrossedOverSignal && + !mConditions.isXLHPriceCrossedUnderSignal) && + ( + // + // Next Step is to Check LL and HH Same Style ... + // + // PriceFree ... + // Check if Both LL and HH Same In Length ... + ((mConditions.isXLHLLSameInLength && + mConditions.isXLHHHSameInLength) && + // + ( + // + false + // + ) + // + ) + // + || + // + // PriceFree ... + // Check If LL Same In Length ... + ((mConditions.isXLHLLSameInLength && + !mConditions.isXLHHHSameInLength) && + // + ( + // + false + // + ) + // + ) + // + || + // + // PriceFree ... + // Check If HH is Same In Length ... + ((mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + false + // + ) + // + ) + // + || + // + // PriceFree ... + // Not Same LL or HH in Lenght ... + ((!mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + false + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ; + + // + return result; +} + +// +// XTAM Long Signal Checking ... +bool XEU5XTAMHasLongSignal() +{ + // + bool result = false; + + // + // Validate Args ... + if (!xEU5MXTAMEnableSignaller || + !xEU5MXTAMAllowLongSignals) + { + return result; + } + + // + // Retrieve Market Condition ... + XMarketConditions mConditions = xEU5Provider.GetLastMarketCondition(); + + // + // Start Analysing Market based On Conditions ... + result = + // + // Base Condition: + xEU5Provider.XTAMHasLongConditions() + // + && + // + // Exceptions: + // there some commonly Exceptions which makes our choice incorrect, + // here we are combined knownly Exceptions ... + !( + // + // for Exception we used XLH Conditions as follow ... + // + // Check Conditions if Price In Signal Range ... + (mConditions.isXLHPriceInSignalRange && + // + ( + // + // Next Step is to Check LL and HH Same Style ... + // + // PriceInSignalRange ... + // Check if Both LL and HH Same In Length ... + ((mConditions.isXLHLLSameInLength && + mConditions.isXLHHHSameInLength) && + // + ( + // + ((mConditions.isXCHMAMCVale && + (mConditions.isXCHMAMCFastUnderSlow || + mConditions.isXCHMAMCFastCrossedUnderSlow)) && + ( + // + (mConditions.isXTMStartBullish && + mConditions.isXAMAStartBullish && + mConditions.isXTDBullUnderBear && + mConditions.isXTDSignalUnderBear && + mConditions.isXTSCurrentUnderFarest) + // + ) + // + ) + // + || + // + ((mConditions.isXCHMALCFastUnderSlow || + mConditions.isXCHMALCFastCrossedUnderSlow) && + ( + // + (mConditions.isXTSCurrentMax && + mConditions.isXLHLLIncreased && + mConditions.isXCHLHMCLCHHSame) + // + ) + // + ) + // + || + // + (mConditions.isXCHMALCPeak && + (mConditions.isXCHMALCFastOverSlow || + mConditions.isXCHMALCFastCrossedOverSlow)) + // + || + // + (mConditions.isXCHMAMCPeak && + (mConditions.isXCHMAMCFastOverSlow || + mConditions.isXCHMAMCFastCrossedOverSlow)) + // + ) + // + ) + // + || + // + // PriceInSignalRange ... + // Check If LL Same In Length ... + ((mConditions.isXLHLLSameInLength && + !mConditions.isXLHHHSameInLength) && + // + ( + // + (mConditions.isXCHMAMCPeak && + (mConditions.isXCHMAMCFastOverSlow || + mConditions.isXCHMAMCFastCrossedOverSlow)) + // + || + // + ((mConditions.isXCHMALCFastUnderSlow || + mConditions.isXCHMALCFastCrossedUnderSlow) && + ( + // + (mConditions.isXTMBullish && + mConditions.isXAMABullish && + mConditions.isXTSCurrentMax) + // + ) + // + ) + // + ) + // + ) + // + || + // + // PriceInSignalRange ... + // Check If HH is Same In Length ... + ((mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + (mConditions.isXCHMALCPeak && + (mConditions.isXCHMALCFastOverSlow || + mConditions.isXCHMALCFastCrossedOverSlow)) + // + || + // + ((mConditions.isXCHMASCFastUnderSlow || + mConditions.isXCHMASCFastCrossedUnderSlow) && + ( + // + (mConditions.isXTMNeutural && + mConditions.isXAMANeutural && + mConditions.isXCHLHSCMCLLSame) + // + ) + // + ) + // + ) + // + ) + // + || + // + // PriceInSignalRange ... + // Not Same LL or HH in Lenght ... + ((!mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + false + // + ) + // + ) + // + ) + // + ) + // + || + // + // Check Conditions if Price is Under Signal ... + ( + // + ((mConditions.isXLHPriceUnderSignal || + mConditions.isXLHPriceCrossedUnderSignal) && + ( + // + // Next Step is to Check LL and HH Same Style ... + // + // PriceUnderSignal ... + // Check if Both LL and HH Same In Length ... + ((mConditions.isXLHLLSameInLength && + mConditions.isXLHHHSameInLength) && + // + ( + // + ((mConditions.isXCHMAMCVale && + (mConditions.isXCHMAMCFastUnderSlow || + mConditions.isXCHMAMCFastCrossedUnderSlow)) && + ( + // + (mConditions.isXTMNeutural && + mConditions.isXAMANeutural) + // + ) + // + ) + // + || + // + (mConditions.isXCHMASCPeak && + (mConditions.isXCHMASCFastOverSlow || + mConditions.isXCHMASCFastCrossedOverSlow)) + // + || + // + (mConditions.isXCHMALCPeak && + (mConditions.isXCHMALCFastOverSlow || + mConditions.isXCHMALCFastCrossedOverSlow)) + // + || + ((mConditions.isXCHMAMCVale && + (mConditions.isXCHMAMCFastUnderSlow || + mConditions.isXCHMAMCFastCrossedUnderSlow)) && + (mConditions.isXCHMALCVale && + (mConditions.isXCHMALCFastOverSlow || + mConditions.isXCHMALCFastCrossedOverSlow))) + // + ) + // + ) + // + || + // + // PriceUnderSignal ... + // Check If LL Same In Length ... + ((mConditions.isXLHLLSameInLength && + !mConditions.isXLHHHSameInLength) && + // + ( + // + (mConditions.isXCHMALCPeak && + (mConditions.isXCHMALCFastOverSlow || + mConditions.isXCHMALCFastCrossedOverSlow)) + // + || + // + (mConditions.isXCHMAMCVale && + (mConditions.isXCHMAMCFastUnderSlow || + mConditions.isXCHMAMCFastCrossedUnderSlow)) + // + || + // + (mConditions.isXTMNeutural && + mConditions.isXCHMAMCVale && + mConditions.isXCHMALCVale && + mConditions.isXAMANeutural && + mConditions.isXTSCurrentMax && + mConditions.isXLHLLDecreased && + mConditions.isXCHLHMCLCLLSame) + // + || + // + ((mConditions.isXCHMASCFastUnderSlow || + mConditions.isXCHMASCFastCrossedUnderSlow) && + ( + // + (mConditions.isXTMNeutural && + mConditions.isXAMABearish && + mConditions.isXTMEndBearish && + mConditions.isXTSCurrentUnderFarest) + // + ) + // + ) + // + ) + // + ) + // + || + // + // PriceUnderSignal ... + // Check If HH is Same In Length ... + ((mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + ((mConditions.isXCHMASCFastUnderSlow || + mConditions.isXCHMASCFastCrossedUnderSlow) && + ( + // + (mConditions.isXTMBearish && + mConditions.isXAMABearish && + mConditions.isXCHLHSCMCLLSame && + (mConditions.isXTSCurrentUnderFarest || + mConditions.isXTSCurrentUnderMediest)) + // + || + // + (mConditions.isXCHLHMCLCHHSame && + (mConditions.isXTSCurrentUnderNearest || + mConditions.isXTSCurrentCrossedUnderNearest)) + // + || + // + (mConditions.isXTMVale && + mConditions.isXAMAVale && + mConditions.isXTSAllSame && + mConditions.isXCHMASCVale && + mConditions.isXTDSignalVale && + mConditions.isXTDBullishVale && + mConditions.isXCHLHSCMCLLSame && + mConditions.isXCHLHMCLCHHSame) + // + ) + // + ) + // + || + // + (mConditions.isXCHMALCPeak && + (mConditions.isXCHMALCFastOverSlow || + mConditions.isXCHMALCFastCrossedOverSlow)) + // + ) + // + ) + // + || + // + // PriceUnderSignal ... + // Not Same LL or HH in Lenght ... + ((!mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + ( + (mConditions.isXCHMASCFastUnderSlow || + mConditions.isXCHMASCFastCrossedUnderSlow) && + ( + // + (mConditions.isXTMBearish && + mConditions.isXAMABearish && + mConditions.isXCHLHSCMCLLSame && + mConditions.isXTSCurrentUnderFarest && + mConditions.isXTSCurrentUnderMediest && + mConditions.isXTDBullCrossedUnderBear) + // + ) + // + ) + // + || + // + (mConditions.isXCHMALCPeak && + (mConditions.isXCHMALCFastOverSlow || + mConditions.isXCHMALCFastCrossedOverSlow)) + // + ) + // + ) + // + ) + // + ) + // + ) + // + || + // + // Check Conditions if Price is Over Signal ... + ( + // + ((mConditions.isXLHPriceOverSignal || + mConditions.isXLHPriceCrossedOverSignal) && + ( + // + // Next Step is to Check LL and HH Same Style ... + // + // PriceOverSignal ... + // Check if Both LL and HH Same In Length ... + ((mConditions.isXLHLLSameInLength && + mConditions.isXLHHHSameInLength) && + // + ( + // + ((mConditions.isXCHMASCFastUnderSlow || + mConditions.isXCHMASCFastCrossedUnderSlow) && + ( + // + (mConditions.isXCHMASCVale && + mConditions.isXTMNeutural && + mConditions.isXAMANeutural) + // + || + // + (mConditions.isXTMNeutural && + mConditions.isXAMANeutural && + mConditions.isXTSCurrentMax && + mConditions.isXLHPriceCrossedOverSignal && + mConditions.isXTSCurrentCrossedOverFarest) + // + ) + // + ) + // + || + // + ((mConditions.isXCHMALCFastUnderSlow || + mConditions.isXCHMALCFastCrossedUnderSlow) && + ( + // + (mConditions.isXCHMALCVale && + ( + // + mConditions.isXLHHHDecreased + // + || + // + (mConditions.isXTMBullish && + mConditions.isXAMABullish && + mConditions.isXTDBearishVale) + // + ) + // + ) + // + || + // + (mConditions.isXTMBullish && + mConditions.isXAMABullish && + mConditions.isXTSCurrentMax && + mConditions.isXCHLHMCLCHHSame && + mConditions.isXCHMASCFastCrossedOverSlow) + // + ) + // + ) + // + || + // + (mConditions.isXCHMALCPeak && + (mConditions.isXCHMALCFastOverSlow || + mConditions.isXCHMALCFastCrossedOverSlow)) + // + || + // + (mConditions.isXCHMAMCPeak && + (mConditions.isXCHMAMCFastOverSlow || + mConditions.isXCHMAMCFastCrossedOverSlow)) + // + ) + // + ) + // + || + // + // PriceOverSignal ... + // Check If LL Same In Length ... + ((mConditions.isXLHLLSameInLength && + !mConditions.isXLHHHSameInLength) && + // + ( + // + ((mConditions.isXCHMAMCPeak && + (mConditions.isXCHMAMCFastOverSlow || + mConditions.isXCHMAMCFastCrossedOverSlow)) && + ( + // + (mConditions.isXCHLHSameHHs && + mConditions.isXTSCurrentMax && + mConditions.isXTSCurrentOverFarest && + mConditions.isXTSCurrentOverMediest) + // + || + // + (mConditions.isXTSCurrentMax && + mConditions.isXTMStartBullish && + mConditions.isXCHLHSCMCHHSame && + mConditions.isXAMAStartBullish && + mConditions.isXLHHighAttachedHH) + // + ) + // + ) + // + || + // + ((mConditions.isXCHMALCVale || + mConditions.isXCHLHSameHHs) && + (mConditions.isXCHMALCFastUnderSlow || + mConditions.isXCHMALCFastCrossedUnderSlow)) + // + || + // + (mConditions.isXCHMALCPeak && + (mConditions.isXCHMALCFastOverSlow || + mConditions.isXCHMALCFastCrossedOverSlow)) + // + || + // + (mConditions.isXCHLHSameHHs && + mConditions.isXLHLLDecreased && + mConditions.isXLHHighAttachedHH) + // + || + // + (mConditions.isXTMBullish && + mConditions.isXAMABullish && + mConditions.isXTDBearishVale && + mConditions.isXCHLHSCMCHHSame && + mConditions.isXLHHighAttachedHH) + // + || + // + (mConditions.isXTSCurrentMax && + mConditions.isXCHMASCPeak && + (mConditions.isXCHMAMCTrendsDown || + mConditions.isXCHMAMCFastUnderSlow)) + // + ) + // + ) + // + || + // + // PriceOverSignal ... + // Check If HH is Same In Length ... + ((mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + ((mConditions.isXCHMASCFastUnderSlow || + mConditions.isXCHMASCFastCrossedUnderSlow) && + ( + // + (mConditions.isXTMNeutural && + mConditions.isXTMEndBearish && + mConditions.isXAMANeutural && + mConditions.isXAMAEndBearish && + mConditions.isXCHLHMCLCHHSame && + mConditions.isXFICrossedOverZero && + mConditions.isXTSCurrentUnderFarest) + // + ) + // + ) + // + || + // + ((mConditions.isXCHMALCFastUnderSlow || + mConditions.isXCHMALCFastCrossedUnderSlow) && + ( + // + (mConditions.isXTMBullish && + mConditions.isXAMABullish && + mConditions.isXTSCurrentMax && + mConditions.isXTMStartBullish && + mConditions.isXAMAStartBullish) + // + ) + // + ) + // + || + // + (mConditions.isXCHMAMCPeak && + (mConditions.isXCHMAMCFastOverSlow || + mConditions.isXCHMAMCFastCrossedOverSlow)) + // + || + // + (mConditions.isXCHMALCPeak && + (mConditions.isXCHMALCFastOverSlow || + mConditions.isXCHMALCFastCrossedOverSlow)) + // + ) + // + ) + // + || + // + // PriceOverSignal ... + // Not Same LL or HH in Lenght ... + ((!mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + false + // + ) + // + ) + // + ) + // + ) + // + ) + // + || + // + // Check Conditions if Price is not has clear state ... + ( + // + ((!mConditions.isXLHPriceOverSignal && + !mConditions.isXLHPriceUnderSignal && + !mConditions.isXLHPriceInSignalRange && + !mConditions.isXLHPriceCrossedOverSignal && + !mConditions.isXLHPriceCrossedUnderSignal) && + ( + // + // Next Step is to Check LL and HH Same Style ... + // + // PriceFree ... + // Check if Both LL and HH Same In Length ... + ((mConditions.isXLHLLSameInLength && + mConditions.isXLHHHSameInLength) && + // + ( + // + false + // + ) + // + ) + // + || + // + // PriceFree ... + // Check If LL Same In Length ... + ((mConditions.isXLHLLSameInLength && + !mConditions.isXLHHHSameInLength) && + // + ( + // + false + // + ) + // + ) + // + || + // + // PriceFree ... + // Check If HH is Same In Length ... + ((mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + false + // + ) + // + ) + // + || + // + // PriceFree ... + // Not Same LL or HH in Lenght ... + ((!mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + false + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ; + + // + return result; +} + +// +// XTAM Short Signal Checking ... +bool XEU5XTAMHasShortSignal() +{ + // + bool result = false; + + // + // Validate Args ... + if (!xEU5MXTAMEnableSignaller || + !xEU5MXTAMAllowShortSignals) + { + return result; + } + + // + // Retrieve Market Condition ... + XMarketConditions mConditions = xEU5Provider.GetLastMarketCondition(); + + // + // Start Analysing Market based On Conditions ... + result = + // + // Base Condition: + xEU5Provider.XTAMHasShortConditions() + // + && + // + // Exceptions: + // there some commonly Exceptions which makes our choice incorrect, + // here we are combined knownly Exceptions ... + !( + // + // for Exception we used XLH Conditions as follow ... + // + // Check Conditions if Price In Signal Range ... + (mConditions.isXLHPriceInSignalRange && + // + ( + // + // Next Step is to Check LL and HH Same Style ... + // + // PriceInSignalRange ... + // Check if Both LL and HH Same In Length ... + ((mConditions.isXLHLLSameInLength && + mConditions.isXLHHHSameInLength) && + // + ( + // + (mConditions.isXFIOverZero && + mConditions.isXTMNeutural && + mConditions.isXAMANeutural && + mConditions.isXTSCurrentOverFarest) + // + || + // + ((mConditions.isXCHMASCFastOverSlow || + mConditions.isXCHMASCFastCrossedOverSlow) && + ( + // + ((mConditions.isXTMNeutural || + mConditions.isXTMEndBullish) && + mConditions.isXAMABullish && + mConditions.isXFIOverZero && + mConditions.isXTDBullOverBear) + // + || + // + (mConditions.isXTMNeutural && + mConditions.isXAMANeutural && + mConditions.isXCHMASCTrendsUp && + mConditions.isXTSCurrentOverNearest) + // + ) + // + ) + // + || + // + ((mConditions.isXCHMAMCFastOverSlow || + mConditions.isXCHMAMCFastCrossedOverSlow) && + ( + // + (mConditions.isXTMNeutural && + mConditions.isXAMANeutural && + mConditions.isXCHMASCTrendsUp) + // + ) + // + ) + // + ) + // + ) + // + || + // + // PriceInSignalRange ... + // Check If LL Same In Length ... + ((mConditions.isXLHLLSameInLength && + !mConditions.isXLHHHSameInLength) && + // + ( + // + ((mConditions.isXCHMASCFastOverSlow || + mConditions.isXCHMASCFastCrossedOverSlow) && + ( + // + (mConditions.isXTMNeutural && + mConditions.isXAMANeutural && + mConditions.isXTDBullOverBear && + mConditions.isXTDSignalOverBear) + // + || + // + (mConditions.isXFIOverZero && + mConditions.isXCHMASCPeak && + mConditions.isXTSCurrentOverFarest) + // + ) + // + ) + // + ) + // + ) + // + || + // + // PriceInSignalRange ... + // Check If HH is Same In Length ... + ((mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + ((mConditions.isXCHMASCFastOverSlow || + mConditions.isXCHMASCFastCrossedOverSlow) && + ( + // + ( + // + mConditions.isXCHMAMCTrendsUp + // + || + // + (mConditions.isXTMNeutural && + mConditions.isXCHMALCVale && + mConditions.isXAMANeutural) + // + ) + // + ) + // + ) + // + ) + // + ) + // + || + // + // PriceInSignalRange ... + // Not Same LL or HH in Lenght ... + ((!mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + false + // + ) + // + ) + // + ) + // + ) + // + || + // + // Check Conditions if Price is Under Signal ... + ( + // + ((mConditions.isXLHPriceUnderSignal || + mConditions.isXLHPriceCrossedUnderSignal) && + ( + // + // Next Step is to Check LL and HH Same Style ... + // + // PriceUnderSignal ... + // Check if Both LL and HH Same In Length ... + ((mConditions.isXLHLLSameInLength && + mConditions.isXLHHHSameInLength) && + // + ( + // + ((mConditions.isXCHMASCFastOverSlow || + mConditions.isXCHMASCFastCrossedOverSlow) && + ( + // + (mConditions.isXCHMALCVale && + mConditions.isXCHMALCTrendsUp && + (mConditions.isXCHMALCFastUnderSlow || + mConditions.isXCHMALCFastCrossedUnderSlow)) + // + || + // + (mConditions.isXTMBullish && + mConditions.isXAMABullish && + mConditions.isXFIOverZero && + mConditions.isXCHLHMCLCLLSame && + mConditions.isXTSCurrentOverMediest) + // + ) + // + ) + // + || + // + ((mConditions.isXCHMALCFastOverSlow || + mConditions.isXCHMALCFastCrossedOverSlow) && + ( + // + (mConditions.isXTMBearish && + mConditions.isXAMABearish && + mConditions.isXTSCurrentMin && + mConditions.isXCHMALCTrendsUp && + mConditions.isXTDBullUnderBear && + mConditions.isXTDSignalUnderBear && + mConditions.isXTSCurrentUnderFarest && + mConditions.isXTSCurrentUnderNearest && + mConditions.isXTSCurrentUnderMediest) + // + || + // + ((mConditions.isXAMAVale && + mConditions.isXCHMASCVale && + mConditions.isXTSCurrentMin) && + ( + // + mConditions.isXRSICrossedUnderShortExit + // + || + // + mConditions.isXTDBullishVale + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + || + // + // PriceUnderSignal ... + // Check If LL Same In Length ... + ((mConditions.isXLHLLSameInLength && + !mConditions.isXLHHHSameInLength) && + // + ( + // + false + // + ) + // + ) + // + || + // + // PriceUnderSignal ... + // Check If HH is Same In Length ... + ((mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + ((mConditions.isXCHMALCVale && + mConditions.isXTSCurrentMin && + mConditions.isXCHLHSCMCLLSame && + mConditions.isXLHLowAttachedLL) && + ( + // + mConditions.isXCHMALCTrendsDown + // + || + // + (mConditions.isXTMStartBearish && + mConditions.isXAMAStartBearish && + mConditions.isXTDBullUnderBear && + mConditions.isXTDSignalUnderBear && + mConditions.isXLHPriceCrossedUnderSignal) + // + ) + // + ) + // + || + // + ((mConditions.isXCHMAMCFastOverSlow || + mConditions.isXCHMAMCFastCrossedOverSlow) && + ( + // + mConditions.isXRSICrossedUnderShortExit + // + || + // + (mConditions.isXAMAVale && + mConditions.isXTMBearish && + mConditions.isXCHMASCVale && + mConditions.isXAMABearish && + mConditions.isXCHLHSameLLs && + mConditions.isXTSCurrentMin && + mConditions.isXCHMASCTrendsUp && + mConditions.isXLHLowAttachedLL) + // + ) + // + ) + // + || + // + ((mConditions.isXCHMALCFastOverSlow || + mConditions.isXCHMALCFastCrossedOverSlow) && + ( + // + ( + // + mConditions.isXRSICrossedUnderShortExit + // + || + // + (mConditions.isXAMAVale && + mConditions.isXTMBearish && + mConditions.isXAMABearish && + mConditions.isXCHMASCVale && + mConditions.isXTSCurrentMin && + mConditions.isXTDBullUnderBear && + mConditions.isXTDSignalUnderBear && + mConditions.isXTSCurrentUnderFarest && + mConditions.isXTSCurrentUnderMediest) + // + || + // + ((mConditions.isXTMBearish && + mConditions.isXAMABearish && + mConditions.isXTSCurrentMin && + mConditions.isXLHLowAttachedLL) && + ( + // + (mConditions.isXCHMAMCVale && + mConditions.isXCHLHSameLLs && + mConditions.isXTDSignalVale && + mConditions.isXTDBullishVale && + mConditions.isXCHMAMCTrendsUp) + // + || + // + (mConditions.isXCHMASCVale && + mConditions.isXCHLHSCMCLLSame && + mConditions.isXTDBullUnderBear && + mConditions.isXTDSignalUnderBear && + mConditions.isXTSCurrentUnderFarest && + mConditions.isXTSCurrentUnderNearest && + mConditions.isXTSCurrentUnderMediest) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + || + // + // PriceUnderSignal ... + // Not Same LL or HH in Lenght ... + ((!mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + ((mConditions.isXCHMALCFastOverSlow || + mConditions.isXCHMALCFastCrossedOverSlow) && + ( + // + ( + // + mConditions.isXRSICrossedUnderShortExit + // + || + // + ((mConditions.isXTMBearish && + mConditions.isXAMABearish && + mConditions.isXTDSignalVale && + mConditions.isXTSCurrentMin && + mConditions.isXTDBullishVale) && + ( + // + (mConditions.isXTSAllSame && + mConditions.isXLHHHDecreased && + mConditions.isXCHLHSCMCLLSame) + // + || + // + (mConditions.isXLHLowAttachedLL && + mConditions.isXTSCurrentUnderFarest && + mConditions.isXTSCurrentUnderNearest && + mConditions.isXTSCurrentUnderMediest) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + || + // + // Check Conditions if Price is Over Signal ... + ( + // + ((mConditions.isXLHPriceOverSignal || + mConditions.isXLHPriceCrossedOverSignal) && + ( + // + // Next Step is to Check LL and HH Same Style ... + // + // PriceOverSignal ... + // Check if Both LL and HH Same In Length ... + ((mConditions.isXLHLLSameInLength && + mConditions.isXLHHHSameInLength) && + // + ( + // + ((mConditions.isXTMStartBullish && + mConditions.isXAMAStartBullish) && + ( + // + (mConditions.isXCHMASCPeak && + mConditions.isXTDSignalVale && + mConditions.isXTDBullishVale && + mConditions.isXCHLHMCLCHHSame && + mConditions.isXCHLHMCLCLLSame) + // + ) + // + ) + // + || + // + ((mConditions.isXCHMASCFastOverSlow || + mConditions.isXCHMASCFastCrossedOverSlow) && + ( + // + (mConditions.isXTMNeutural && + mConditions.isXAMANeutural && + mConditions.isXTDBullOverBear && + mConditions.isXTDSignalOverBear && + mConditions.isXTSCurrentOverFarest) + // + || + // + ((mConditions.isXTMBullish && + mConditions.isXAMABullish && + mConditions.isXTDBullOverBear) && + ( + // + (mConditions.isXCHMASCTrendsUp && + mConditions.isXTDSignalOverBear) + // + || + // + (mConditions.isXFIOverZero && + mConditions.isXTSCurrentOverFarest && + mConditions.isXTSCurrentOverMediest) + // + ) + // + ) + // + ) + // + ) + // + || + // + ((mConditions.isXCHMAMCFastOverSlow || + mConditions.isXCHMAMCFastCrossedOverSlow) && + ( + // + (mConditions.isXCHMAMCPeak && + mConditions.isXCHMAMCTrendsUp) + // + ) + // + ) + // + ) + // + ) + // + || + // + // PriceOverSignal ... + // Check If LL Same In Length ... + ((mConditions.isXLHLLSameInLength && + !mConditions.isXLHHHSameInLength) && + // + ( + // + ((mConditions.isXCHMASCFastOverSlow || + mConditions.isXCHMASCFastCrossedOverSlow) && + ( + // + (mConditions.isXTMBullish && + mConditions.isXAMABullish && + (mConditions.isXTDBullOverBear || + mConditions.isXTSCurrentOverFarest)) + // + || + // + (mConditions.isXCHLHSCMCHHSame && + mConditions.isXCHLHMCLCLLSame && + (mConditions.isXTSCurrentOverFarest || + mConditions.isXTSCurrentOverMediest)) + // + || + // + (mConditions.isXTMBullish && + mConditions.isXAMABullish && + mConditions.isXLHLLDecreased && + mConditions.isXCHLHSCMCHHSame && + mConditions.isXCHLHMCLCLLSame) + // + ) + // + ) + // + ) + // + ) + // + || + // + // PriceOverSignal ... + // Check If HH is Same In Length ... + ((mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + ((mConditions.isXCHMAMCFastOverSlow || + mConditions.isXCHMAMCFastCrossedOverSlow) && + ( + // + (mConditions.isXTMNeutural && + mConditions.isXAMANeutural && + mConditions.isXTSCurrentMin && + mConditions.isXCHMAMCTrendsUp && + mConditions.isXTDSignalUnderBear && + mConditions.isXTSCurrentUnderFarest && + mConditions.isXTSCurrentUnderNearest && + mConditions.isXTSCurrentUnderMediest) + // + ) + // + ) + // + ) + // + ) + // + || + // + // PriceOverSignal ... + // Not Same LL or HH in Lenght ... + ((!mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + ((mConditions.isXCHMASCFastOverSlow || + mConditions.isXCHMASCFastCrossedOverSlow) && + ( + // + (mConditions.isXCHMASCPeak && + mConditions.isXCHMASCTrendsUp) + // + || + // + (mConditions.isXTDBullOverBear && + mConditions.isXTDSignalOverBear && + mConditions.isXTSCurrentOverFarest) + // + ) + // + ) + // + || + // + ((mConditions.isXCHMAMCFastOverSlow || + mConditions.isXCHMAMCFastCrossedOverSlow) && + ( + // + (mConditions.isXTMBullish && + mConditions.isXAMABullish) + // + || + // + (mConditions.isXFIOverZero && + mConditions.isXCHMALCVale && + mConditions.isXLHHHIncreased && + mConditions.isXTDBullOverBear && + mConditions.isXCHLHSCMCHHSame) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + || + // + // Check Conditions if Price is not has clear state ... + ( + // + ((!mConditions.isXLHPriceOverSignal && + !mConditions.isXLHPriceUnderSignal && + !mConditions.isXLHPriceInSignalRange && + !mConditions.isXLHPriceCrossedOverSignal && + !mConditions.isXLHPriceCrossedUnderSignal) && + ( + // + // Next Step is to Check LL and HH Same Style ... + // + // PriceFree ... + // Check if Both LL and HH Same In Length ... + ((mConditions.isXLHLLSameInLength && + mConditions.isXLHHHSameInLength) && + // + ( + // + false + // + ) + // + ) + // + || + // + // PriceFree ... + // Check If LL Same In Length ... + ((mConditions.isXLHLLSameInLength && + !mConditions.isXLHHHSameInLength) && + // + ( + // + false + // + ) + // + ) + // + || + // + // PriceFree ... + // Check If HH is Same In Length ... + ((mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + ((mConditions.isXCHMAMCFastOverSlow || + mConditions.isXCHMAMCFastCrossedOverSlow) && + ( + // + (mConditions.isXTMNeutural && + mConditions.isXAMANeutural && + mConditions.isXCHMAMCTrendsUp) + // + || + // + (mConditions.isXTSCurrentMin && + mConditions.isXTDSignalUnderBear && + mConditions.isXFICrossedUnderZero && + mConditions.isXTSCurrentUnderFarest && + mConditions.isXTSCurrentUnderNearest && + mConditions.isXTSCurrentUnderMediest && + mConditions.isXTDBullCrossedUnderBear) + // + ) + // + ) + // + ) + // + ) + // + || + // + // PriceFree ... + // Not Same LL or HH in Lenght ... + ((!mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + false + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ; + + // + return result; +} + +// +// XSI Long Signal Checking ... +bool XEU5XSIHasLongSignal() +{ + // + bool result = false; + + // + // Validate Args ... + if (!xEU5MXSIEnableSignaller || + !xEU5MXSIAllowLongSignals) + { + return result; + } + + // + // Retrieve Market Condition ... + XMarketConditions mConditions = xEU5Provider.GetLastMarketCondition(); + + // + // Start Analysing Market based On Conditions ... + result = + // + // Base Condition: + xEU5Provider.XSIHasLongConditions() + // + && + // + // Exceptions: + // there some commonly Exceptions which makes our choice incorrect, + // here we are combined knownly Exceptions ... + !( + // + // for Exception we used XLH Conditions as follow ... + // + // Check Conditions if Price In Signal Range ... + (mConditions.isXLHPriceInSignalRange && + // + ( + // + // Next Step is to Check LL and HH Same Style ... + // + // PriceInSignalRange ... + // Check if Both LL and HH Same In Length ... + ((mConditions.isXLHLLSameInLength && + mConditions.isXLHHHSameInLength) && + // + ( + // + (mConditions.isXCHMALCPeak && + (mConditions.isXCHMALCFastOverSlow || + mConditions.isXCHMALCFastCrossedOverSlow)) + // + || + // + ((mConditions.isXCHMASCFastUnderSlow || + mConditions.isXCHMASCFastCrossedUnderSlow) && + ( + // + (mConditions.isXCHMASCVale && + mConditions.isXTMNeutural && + mConditions.isXAMANeutural && + mConditions.isXTSCurrentUnderNearest) + // + ) + // + ) + // + ) + // + ) + // + || + // + // PriceInSignalRange ... + // Check If LL Same In Length ... + ((mConditions.isXLHLLSameInLength && + !mConditions.isXLHHHSameInLength) && + // + ( + // + false + // + ) + // + ) + // + || + // + // PriceInSignalRange ... + // Check If HH is Same In Length ... + ((mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + (mConditions.isXCHMALCPeak && + (mConditions.isXCHMALCFastOverSlow || + mConditions.isXCHMALCFastCrossedOverSlow)) + // + || + // + (mConditions.isXTSAllSame && + mConditions.isXCHLHSameLLs && + mConditions.isXTMStartBullish && + mConditions.isXAMAStartBullish) + // + || + // + (mConditions.isXCHMASCVale && + mConditions.isXCHMAMCVale && + mConditions.isXAMANeutural && + mConditions.isXLHHHDecreased && + mConditions.isXTMStartBullish && + mConditions.isXCHLHSCMCLLSame && + mConditions.isXTSCurrentUnderFarest) + // + || + // + ((mConditions.isXCHMASCFastUnderSlow || + mConditions.isXCHMASCFastCrossedUnderSlow) && + ( + // + (mConditions.isXCHMASCVale && + mConditions.isXCHMAMCVale) + // + || + // + (mConditions.isXAMANeutural && + mConditions.isXTMStartBullish) + // + ) + // + ) + // + || + // + ((mConditions.isXCHMAMCFastUnderSlow || + mConditions.isXCHMAMCFastCrossedUnderSlow) && + ( + // + (mConditions.isXTSCurrentMin && + mConditions.isXTSCurrentMax) + // + ) + // + ) + // + ) + // + ) + // + || + // + // PriceInSignalRange ... + // Not Same LL or HH in Lenght ... + ((!mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + false + // + ) + // + ) + // + ) + // + ) + // + || + // + // Check Conditions if Price is Under Signal ... + ( + // + ((mConditions.isXLHPriceUnderSignal || + mConditions.isXLHPriceCrossedUnderSignal) && + ( + // + // Next Step is to Check LL and HH Same Style ... + // + // PriceUnderSignal ... + // Check if Both LL and HH Same In Length ... + ((mConditions.isXLHLLSameInLength && + mConditions.isXLHHHSameInLength) && + // + ( + // + (mConditions.isXCHMALCPeak && + (mConditions.isXCHMALCFastOverSlow || + mConditions.isXCHMALCFastCrossedOverSlow)) + // + || + // + (mConditions.isXTDSignalVale && + mConditions.isXTDBullishVale && + (mConditions.isXAMANeutural || + mConditions.isXAMAEndBearish)) + // + || + // + (mConditions.isXTMVale && + mConditions.isXAMANeutural && + mConditions.isXAMAEndBullish && + mConditions.isXLHLLDecreased && + mConditions.isXCHLHMCLCHHSame && + mConditions.isXCHLHMCLCLLSame) + // + || + // + ((mConditions.isXCHMASCFastUnderSlow || + mConditions.isXCHMASCFastCrossedUnderSlow) && + ( + // + (mConditions.isXAMAEndBearish && + mConditions.isXTSCurrentUnderFarest && + mConditions.isXTSCurrentUnderMediest) + // + || + // + ((mConditions.isXTMVale && + mConditions.isXAMAVale) + // + && + // + (mConditions.isXCHMASCVale && + mConditions.isXCHMAMCVale) + // + && + // + (mConditions.isXCHLHSCMCLLSame && + mConditions.isXCHLHMCLCHHSame)) + // + ) + // + ) + // + || + // + ((mConditions.isXCHMAMCFastUnderSlow || + mConditions.isXCHMAMCFastCrossedUnderSlow) && + ( + // + (mConditions.isXCHMASCVale && + mConditions.isXCHMAMCVale && + mConditions.isXCHMALCVale) + // + || + // + (mConditions.isXTMVale && + mConditions.isXTMNeutural && + mConditions.isXCHLHMCLCLLSame && + mConditions.isXAMAStartBullish && + mConditions.isXTSCurrentUnderFarest) + // + ) + // + ) + // + ) + // + ) + // + || + // + // PriceUnderSignal ... + // Check If LL Same In Length ... + ((mConditions.isXLHLLSameInLength && + !mConditions.isXLHHHSameInLength) && + // + ( + // + (mConditions.isXCHMALCPeak && + (mConditions.isXCHMALCFastOverSlow || + mConditions.isXCHMALCFastCrossedOverSlow)) + // + || + // + ((mConditions.isXCHMASCFastUnderSlow || + mConditions.isXCHMASCFastCrossedUnderSlow) && + ( + // + (mConditions.isXCHMASCVale && + mConditions.isXCHMAMCVale) + // + || + // + (mConditions.isXLHHHDecreased && + mConditions.isXLHLLDecreased) + // + || + // + ((mConditions.isXTMVale || + mConditions.isXTMNeutural || + mConditions.isXTMEndBearish) && + mConditions.isXAMANeutural) + // + ) + // + ) + // + ) + // + ) + // + || + // + // PriceUnderSignal ... + // Check If HH is Same In Length ... + ((mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + (mConditions.isXCHMALCPeak && + (mConditions.isXCHMALCFastOverSlow || + mConditions.isXCHMALCFastCrossedOverSlow)) + // + || + // + (mConditions.isXTMVale && + mConditions.isXAMAVale && + mConditions.isXCHLHSCMCLLSame) + // + || + // + ((mConditions.isXCHMASCFastUnderSlow || + mConditions.isXCHMASCFastCrossedUnderSlow) && + ( + // + (mConditions.isXCHMASCVale && + mConditions.isXCHMAMCVale) + // + ) + // + ) + // + ) + // + ) + // + || + // + // PriceUnderSignal ... + // Not Same LL or HH in Lenght ... + ((!mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + (mConditions.isXCHMALCPeak && + (mConditions.isXCHMALCFastOverSlow || + mConditions.isXCHMALCFastCrossedOverSlow)) + // + || + // + ((mConditions.isXCHMASCFastUnderSlow || + mConditions.isXCHMASCFastCrossedUnderSlow) && + ( + // + (mConditions.isXTMVale && + mConditions.isXAMAVale && + mConditions.isXTDSignalVale && + mConditions.isXTDBullishVale) + // + || + // + (mConditions.isXCHMASCVale && + mConditions.isXCHLHSCMCLLSame) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + || + // + // Check Conditions if Price is Over Signal ... + ( + // + ((mConditions.isXLHPriceOverSignal || + mConditions.isXLHPriceCrossedOverSignal) && + ( + // + // Next Step is to Check LL and HH Same Style ... + // + // PriceOverSignal ... + // Check if Both LL and HH Same In Length ... + ((mConditions.isXLHLLSameInLength && + mConditions.isXLHHHSameInLength) && + // + ( + // + false + // + ) + // + ) + // + || + // + // PriceOverSignal ... + // Check If LL Same In Length ... + ((mConditions.isXLHLLSameInLength && + !mConditions.isXLHHHSameInLength) && + // + ( + // + false + // + ) + // + ) + // + || + // + // PriceOverSignal ... + // Check If HH is Same In Length ... + ((mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + false + // + ) + // + ) + // + || + // + // PriceOverSignal ... + // Not Same LL or HH in Lenght ... + ((!mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + false + // + ) + // + ) + // + ) + // + ) + // + ) + // + || + // + // Check Conditions if Price is not has clear state ... + ( + // + ((!mConditions.isXLHPriceOverSignal && + !mConditions.isXLHPriceUnderSignal && + !mConditions.isXLHPriceInSignalRange && + !mConditions.isXLHPriceCrossedOverSignal && + !mConditions.isXLHPriceCrossedUnderSignal) && + ( + // + // Next Step is to Check LL and HH Same Style ... + // + // PriceFree ... + // Check if Both LL and HH Same In Length ... + ((mConditions.isXLHLLSameInLength && + mConditions.isXLHHHSameInLength) && + // + ( + // + false + // + ) + // + ) + // + || + // + // PriceFree ... + // Check If LL Same In Length ... + ((mConditions.isXLHLLSameInLength && + !mConditions.isXLHHHSameInLength) && + // + ( + // + false + // + ) + // + ) + // + || + // + // PriceFree ... + // Check If HH is Same In Length ... + ((mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + false + // + ) + // + ) + // + || + // + // PriceFree ... + // Not Same LL or HH in Lenght ... + ((!mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + false + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ; + + // + return result; +} + +// +// XSI Short Signal Checking ... +bool XEU5XSIHasShortSignal() +{ + // + bool result = false; + + // + // Validate Args ... + if (!xEU5MXSIEnableSignaller || + !xEU5MXSIAllowShortSignals) + { + return result; + } + + // + // Retrieve Market Condition ... + XMarketConditions mConditions = xEU5Provider.GetLastMarketCondition(); + + // + // Start Analysing Market based On Conditions ... + result = + // + // Base Condition: + xEU5Provider.XSIHasShortConditions() + // + && + // + // Exceptions: + // there some commonly Exceptions which makes our choice incorrect, + // here we are combined knownly Exceptions ... + !( + // + // for Exception we used XLH Conditions as follow ... + // + // Check Conditions if Price In Signal Range ... + (mConditions.isXLHPriceInSignalRange && + // + ( + // + // Next Step is to Check LL and HH Same Style ... + // + // PriceInSignalRange ... + // Check if Both LL and HH Same In Length ... + ((mConditions.isXLHLLSameInLength && + mConditions.isXLHHHSameInLength) && + // + ( + // + false + // + ) + // + ) + // + || + // + // PriceInSignalRange ... + // Check If LL Same In Length ... + ((mConditions.isXLHLLSameInLength && + !mConditions.isXLHHHSameInLength) && + // + ( + // + ((mConditions.isXCHMASCFastOverSlow || + mConditions.isXCHMASCFastCrossedOverSlow) && + ( + // + ((mConditions.isXTDBullOverBear && + mConditions.isXTDSignalOverBear) && + ( + // + (mConditions.isXTMNeutural && + mConditions.isXLHHHIncreased && + mConditions.isXTSCurrentOverFarest) + // + || + // + (mConditions.isXCHLHSCMCHHSame && + mConditions.isXCHLHMCLCLLSame) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + || + // + // PriceInSignalRange ... + // Check If HH is Same In Length ... + ((mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + false + // + ) + // + ) + // + || + // + // PriceInSignalRange ... + // Not Same LL or HH in Lenght ... + ((!mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + false + // + ) + // + ) + // + ) + // + ) + // + || + // + // Check Conditions if Price is Under Signal ... + ( + // + ((mConditions.isXLHPriceUnderSignal || + mConditions.isXLHPriceCrossedUnderSignal) && + ( + // + // Next Step is to Check LL and HH Same Style ... + // + // PriceUnderSignal ... + // Check if Both LL and HH Same In Length ... + ((mConditions.isXLHLLSameInLength && + mConditions.isXLHHHSameInLength) && + // + ( + // + false + // + ) + // + ) + // + || + // + // PriceUnderSignal ... + // Check If LL Same In Length ... + ((mConditions.isXLHLLSameInLength && + !mConditions.isXLHHHSameInLength) && + // + ( + // + ((mConditions.isXCHMAMCFastOverSlow || + mConditions.isXCHMAMCFastCrossedOverSlow) && + ( + // + (mConditions.isXLHHHIncreased && + mConditions.isXTDBullOverBear && + mConditions.isXTDSignalOverBear) + // + ) + // + ) + // + ) + // + ) + // + || + // + // PriceUnderSignal ... + // Check If HH is Same In Length ... + ((mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + false + // + ) + // + ) + // + || + // + // PriceUnderSignal ... + // Not Same LL or HH in Lenght ... + ((!mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + false + // + ) + // + ) + // + ) + // + ) + // + ) + // + || + // + // Check Conditions if Price is Over Signal ... + ( + // + ((mConditions.isXLHPriceOverSignal || + mConditions.isXLHPriceCrossedOverSignal) && + ( + // + // Next Step is to Check LL and HH Same Style ... + // + // PriceOverSignal ... + // Check if Both LL and HH Same In Length ... + ((mConditions.isXLHLLSameInLength && + mConditions.isXLHHHSameInLength) && + // + ( + // + (mConditions.isXFIOverZero && + mConditions.isXTDBullOverBear && + mConditions.isXCHLHSCMCHHSame && + mConditions.isXCHLHMCLCLLSame && + mConditions.isXTDSignalOverBear) + // + || + // + ((mConditions.isXCHMASCFastOverSlow || + mConditions.isXCHMASCFastCrossedOverSlow) && + ( + // + ((mConditions.isXTMBullish && + (mConditions.isXAMANeutural || + mConditions.isXAMAEndBullish)) && + mConditions.isXFIOverZero && + mConditions.isXTDBullOverBear && + mConditions.isXTDSignalOverBear && + mConditions.isXTSCurrentOverFarest) + // + || + // + (mConditions.isXCHMASCPeak && + mConditions.isXCHMAMCPeak && + mConditions.isXLHHHIncreased && + mConditions.isXTDBullOverBear && + mConditions.isXTDSignalOverBear) + // + || + // + ((mConditions.isXTDBullOverBear && + mConditions.isXTDSignalOverBear) && + ( + // + (mConditions.isXTMBullish && + mConditions.isXAMABullish && + mConditions.isXTSCurrentOverFarest) + // + || + // + (mConditions.isXCHMASCPeak && + mConditions.isXCHMASCTrendsUp && + mConditions.isXCHLHMCLCHHSame && + mConditions.isXCHLHMCLCLLSame) + // + || + // + ((mConditions.isXCHLHSCMCHHSame && + mConditions.isXCHLHMCLCLLSame) && + ( + // + (mConditions.isXFIOverZero && + mConditions.isXCHMAMCPeak && + mConditions.isXTSCurrentOverFarest) + // + || + // + (mConditions.isXCHMAMCPeak && + mConditions.isXCHMALCVale && + mConditions.isXAMABearish && + mConditions.isXTSCurrentMin && + mConditions.isXTMStartBearish && + mConditions.isXTSCurrentUnderFarest && + mConditions.isXTSCurrentUnderNearest && + mConditions.isXTSCurrentUnderMediest && + mConditions.isXTSCurrentCrossedUnderFarest && + mConditions.isXTSCurrentCrossedUnderNearest && + mConditions.isXTSCurrentCrossedUnderMediest) + // + )) + // + ) + // + ) + // + ) + // + ) + // + || + // + ((mConditions.isXCHMAMCFastOverSlow || + mConditions.isXCHMAMCFastCrossedOverSlow) && + ( + // + (mConditions.isXCHMASCPeak && + mConditions.isXCHMAMCPeak && + mConditions.isXCHMALCPeak) + // + || + // + (mConditions.isXTDSignalVale && + mConditions.isXTDBullishVale && + mConditions.isXCHLHMCLCHHSame && + mConditions.isXCHLHMCLCLLSame && + mConditions.isXTSCurrentOverNearest) + // + || + // + (((mConditions.isXTMBullish || + mConditions.isXTMStartBullish) && + (mConditions.isXAMABullish || + mConditions.isXAMAStartBullish)) && + mConditions.isXTDBullOverBear && + mConditions.isXTDSignalOverBear) + // + ) + // + ) + // + || + // + (mConditions.isXCHMASCPeak && + mConditions.isXCHMAMCPeak && + mConditions.isXCHMALCVale && + mConditions.isXLHHHIncreased && + mConditions.isXCHLHSCMCHHSame && + mConditions.isXCHLHMCLCLLSame) + // + ) + // + ) + // + || + // + // PriceOverSignal ... + // Check If LL Same In Length ... + ((mConditions.isXLHLLSameInLength && + !mConditions.isXLHHHSameInLength) && + // + ( + // + ((mConditions.isXCHMASCFastOverSlow || + mConditions.isXCHMASCFastCrossedOverSlow) && + ( + // + ((mConditions.isXTDBullOverBear && + mConditions.isXTDSignalOverBear) && + ( + // + (mConditions.isXTMBullish && + mConditions.isXAMABullish && + mConditions.isXFIOverZero) + // + || + // + (mConditions.isXTMBullish && + mConditions.isXFIOverZero && + mConditions.isXAMANeutural && + mConditions.isXTSCurrentOverFarest) + // + || + // + (mConditions.isXCHMASCPeak && + mConditions.isXCHMALCPeak && + mConditions.isXCHLHSCMCHHSame) + // + || + // + (mConditions.isXCHMASCPeak && + mConditions.isXTMEndBullish && + mConditions.isXTSCurrentMin && + mConditions.isXCHLHSCMCHHSame && + mConditions.isXCHLHMCLCLLSame && + mConditions.isXAMAStartBearish) + // + || + // + ((mConditions.isXCHMASCPeak && + mConditions.isXTSCurrentOverFarest) && + ( + // + mConditions.isXTMNeutural + // + || + // + mConditions.isXTSCurrentOverMediest + // + || + // + (mConditions.isXTMBullish && + mConditions.isXCHMALCVale && + mConditions.isXAMANeutural && + mConditions.isXLHHHIncreased) + // + ) + // + ) + // + || + // + (mConditions.isXCHMALCVale && + mConditions.isXTSCurrentMin && + mConditions.isXCHLHSCMCHHSame && + mConditions.isXTMStartBearish && + mConditions.isXAMAStartBearish) + // + || + // + ((mConditions.isXCHMASCPeak && + mConditions.isXCHMAMCPeak && + mConditions.isXCHMALCVale) && + ( + // + (mConditions.isXLHHHIncreased && + mConditions.isXLHLLIncreased) + // + || + // + (mConditions.isXCHLHSCMCHHSame && + ( + // + (mConditions.isXTMBullish && + mConditions.isXAMANeutural) + // + || + // + (mConditions.isXTMNeutural && + mConditions.isXTSCurrentMin) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + || + // + ((mConditions.isXCHMAMCFastOverSlow || + mConditions.isXCHMAMCFastCrossedOverSlow) && + ( + // + (mConditions.isXCHLHSameHHs && + mConditions.isXLHHHIncreased && + mConditions.isXTDBullOverBear && + mConditions.isXTSCurrentOverFarest) + // + || + // + (mConditions.isXCHMAMCPeak && + mConditions.isXCHMAMCTrendsUp) + // + ) + // + ) + // + ) + // + ) + // + || + // + // PriceOverSignal ... + // Check If HH is Same In Length ... + ((mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + false + // + ) + // + ) + // + || + // + // PriceOverSignal ... + // Not Same LL or HH in Lenght ... + ((!mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + ((mConditions.isXCHMASCFastOverSlow || + mConditions.isXCHMASCFastCrossedOverSlow) && + ( + // + ((mConditions.isXTDBullOverBear && + (mConditions.isXTDSignalOverBear || + mConditions.isXTDSignalCrossedOverBear)) && + ( + // + (mConditions.isXCHMASCPeak && + mConditions.isXCHMAMCPeak && + (mConditions.isXFIOverZero || + mConditions.isXTSCurrentOverFarest)) + // + || + // + (mConditions.isXAMABullish && + mConditions.isXFIOverZero && + mConditions.isXTSCurrentMax && + mConditions.isXTSCurrentOverFarest) + // + || + // + (mConditions.isXCHMAMCPeak && + mConditions.isXCHLHSCMCHHSame && + mConditions.isXCHMASCTrendsUp) + // + ) + // + ) + // + || + // + (mConditions.isXCHMASCPeak && + mConditions.isXCHMASCTrendsUp) + // + || + // + ((mConditions.isXCHMASCPeak && + mConditions.isXCHMAMCPeak && + mConditions.isXCHMALCVale) && + ( + // + ((mConditions.isXTDBullOverBear && + mConditions.isXTDSignalOverBear) && + ( + // + (mConditions.isXTMBullish && + mConditions.isXCHLHSCMCHHSame) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + || + // + // Check Conditions if Price is not has clear state ... + ( + // + ((!mConditions.isXLHPriceOverSignal && + !mConditions.isXLHPriceUnderSignal && + !mConditions.isXLHPriceInSignalRange && + !mConditions.isXLHPriceCrossedOverSignal && + !mConditions.isXLHPriceCrossedUnderSignal) && + ( + // + // Next Step is to Check LL and HH Same Style ... + // + // PriceFree ... + // Check if Both LL and HH Same In Length ... + ((mConditions.isXLHLLSameInLength && + mConditions.isXLHHHSameInLength) && + // + ( + // + false + // + ) + // + ) + // + || + // + // PriceFree ... + // Check If LL Same In Length ... + ((mConditions.isXLHLLSameInLength && + !mConditions.isXLHHHSameInLength) && + // + ( + // + false + // + ) + // + ) + // + || + // + // PriceFree ... + // Check If HH is Same In Length ... + ((mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + false + // + ) + // + ) + // + || + // + // PriceFree ... + // Not Same LL or HH in Lenght ... + ((!mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + false + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ; + + // + return result; +} + +// +// XTSFI Long Signal Checking ... +bool XEU5XTSFIHasLongSignal() +{ + // + bool result = false; + + // + // Validate Args ... + if (!xEU5MXTSFIEnableSignaller || + !xEU5MXTSFIAllowLongSignals) + { + return result; + } + + // + // Retrieve Market Condition ... + XMarketConditions mConditions = xEU5Provider.GetLastMarketCondition(); + + // + // Start Analysing Market based On Conditions ... + result = + // + // Base Condition: + xEU5Provider.XTSFIHasLongConditions() + // + && + // + // Exceptions: + // there some commonly Exceptions which makes our choice incorrect, + // here we are combined knownly Exceptions ... + !( + // + // for Exception we used XLH Conditions as follow ... + // + // Check Conditions if Price In Signal Range ... + (mConditions.isXLHPriceInSignalRange && + // + ( + // + // Next Step is to Check LL and HH Same Style ... + // + // PriceInSignalRange ... + // Check if Both LL and HH Same In Length ... + ((mConditions.isXLHLLSameInLength && + mConditions.isXLHHHSameInLength) && + // + ( + // + (mConditions.isXCHMAMCPeak && + (mConditions.isXCHMAMCFastOverSlow || + mConditions.isXCHMAMCFastCrossedOverSlow)) + // + || + // + (mConditions.isXCHMALCPeak && + (mConditions.isXCHMALCFastOverSlow || + mConditions.isXCHMALCFastCrossedOverSlow)) + // + || + // + ((mConditions.isXCHMASCFastUnderSlow || + mConditions.isXCHMASCFastCrossedUnderSlow) && + ( + // + (mConditions.isXAMANeutural && + mConditions.isXAMAEndBearish && + mConditions.isXTSCurrentUnderMediest) + // + || + // + (mConditions.isXTMBearish && + mConditions.isXAMABearish && + mConditions.isXTDSignalVale && + mConditions.isXTDBullishVale && + mConditions.isXCHLHMCLCHHSame) + // + ) + // + ) + // + || + // + ((mConditions.isXCHMALCFastUnderSlow || + mConditions.isXCHMALCFastCrossedUnderSlow) && + ( + // + ((mConditions.isXTMNeutural && + mConditions.isXTSCurrentUnderMediest) && + ( + // + (mConditions.isXAMANeutural && + mConditions.isXTSCurrentUnderMediest) + // + || + // + (mConditions.isXTDSignalUnderBear && + mConditions.isXFICrossedUnderZero) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + || + // + // PriceInSignalRange ... + // Check If LL Same In Length ... + ((mConditions.isXLHLLSameInLength && + !mConditions.isXLHHHSameInLength) && + // + ( + // + (mConditions.isXCHMAMCPeak && + (mConditions.isXCHMAMCFastOverSlow || + mConditions.isXCHMAMCFastCrossedOverSlow)) + // + || + // + (mConditions.isXCHMALCPeak && + (mConditions.isXCHMALCFastOverSlow || + mConditions.isXCHMALCFastCrossedOverSlow)) + // + || + // + ((mConditions.isXCHMAMCFastUnderSlow || + mConditions.isXCHMAMCFastCrossedUnderSlow) && + ( + // + (mConditions.isXCHMAMCVale && + mConditions.isXCHMALCVale) + // + ) + // + ) + // + || + // + ((mConditions.isXCHMALCFastUnderSlow || + mConditions.isXCHMALCFastCrossedUnderSlow) && + ( + // + (mConditions.isXTMNeutural && + (mConditions.isXAMANeutural || + mConditions.isXAMAEndBullish) && + mConditions.isXCHLHSameHHs && + mConditions.isXLHLLIncreased && + mConditions.isXLHHighAttachedHH) + // + ) + // + ) + // + || + // + (mConditions.isXTMNeutural && + mConditions.isXAMANeutural && + mConditions.isXTDBearishVale && + mConditions.isXTDSignalUnderBear && + mConditions.isXTSCurrentUnderMediest) + // + ) + // + ) + // + || + // + // PriceInSignalRange ... + // Check If HH is Same In Length ... + ((mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + (mConditions.isXCHMAMCPeak && + (mConditions.isXCHMAMCFastOverSlow || + mConditions.isXCHMAMCFastCrossedOverSlow)) + // + || + // + (mConditions.isXCHMALCPeak && + (mConditions.isXCHMALCFastOverSlow || + mConditions.isXCHMALCFastCrossedOverSlow)) + // + || + // + ((mConditions.isXCHMALCFastUnderSlow || + mConditions.isXCHMALCFastCrossedUnderSlow) && + ( + // + (mConditions.isXTMNeutural && + mConditions.isXTDSignalUnderBear && + mConditions.isXFICrossedUnderZero && + mConditions.isXTSCurrentUnderMediest) + // + ) + // + ) + // + ) + // + ) + // + || + // + // PriceInSignalRange ... + // Not Same LL or HH in Lenght ... + ((!mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + false + // + ) + // + ) + // + ) + // + ) + // + || + // + // Check Conditions if Price is Under Signal ... + ( + // + ((mConditions.isXLHPriceUnderSignal || + mConditions.isXLHPriceCrossedUnderSignal) && + ( + // + // Next Step is to Check LL and HH Same Style ... + // + // PriceUnderSignal ... + // Check if Both LL and HH Same In Length ... + ((mConditions.isXLHLLSameInLength && + mConditions.isXLHHHSameInLength) && + // + ( + // + (mConditions.isXCHMASCPeak && + (mConditions.isXCHMASCFastOverSlow || + mConditions.isXCHMASCFastCrossedOverSlow)) + // + || + // + (mConditions.isXCHMALCPeak && + (mConditions.isXCHMALCFastOverSlow || + mConditions.isXCHMALCFastCrossedOverSlow)) + // + || + // + (mConditions.isXCHMAMCVale && + mConditions.isXCHMALCVale && + mConditions.isXTMStartBearish && + mConditions.isXAMAStartBearish && + mConditions.isXTSCurrentUnderMediest) + // + || + // + (mConditions.isXTMNeutural && + mConditions.isXAMABearish && + mConditions.isXCHLHMCLCHHSame && + mConditions.isXCHMAMCTrendsDown && + (mConditions.isXCHMAMCFastOverSlow || + mConditions.isXCHMAMCFastCrossedOverSlow)) + // + || + // + ((mConditions.isXCHMASCFastUnderSlow || + mConditions.isXCHMASCFastCrossedUnderSlow) && + ( + // + (mConditions.isXTMBearish && + mConditions.isXAMABearish && + mConditions.isXCHMASCOverMax && + mConditions.isXCHMASCOverMin && + mConditions.isXTSCurrentUnderMediest) + // + ) + // + ) + // + || + // + ((mConditions.isXCHMAMCFastUnderSlow || + mConditions.isXCHMAMCFastCrossedUnderSlow) && + ( + // + (mConditions.isXCHMAMCVale && + ( + // + mConditions.isXCHMALCVale + // + || + // + (mConditions.isXCHLHMCLCHHSame && + mConditions.isXCHLHMCLCLLSame && + mConditions.isXTSCurrentUnderMediest) + // + ) + // + ) + // + || + // + (mConditions.isXCHLHMCLCHHSame && + mConditions.isXCHLHMCLCLLSame && + mConditions.isXAMAStartBullish) + // + || + // + (mConditions.isXLHLLDecreased && + mConditions.isXTDSignalUnderBear && + mConditions.isXTSCurrentUnderMediest) + // + ) + // + ) + // + ) + // + ) + // + || + // + // PriceUnderSignal ... + // Check If LL Same In Length ... + ((mConditions.isXLHLLSameInLength && + !mConditions.isXLHHHSameInLength) && + // + ( + // + (mConditions.isXCHMALCPeak && + (mConditions.isXCHMALCFastOverSlow || + mConditions.isXCHMALCFastCrossedOverSlow)) + // + || + // + ((mConditions.isXTMNeutural || + mConditions.isXTMStartBullish) && + mConditions.isXLHHHDecreased && + (mConditions.isXAMANeutural || + mConditions.isXAMAStartBearish) && + mConditions.isXTSCurrentUnderMediest) + // + || + // + ((mConditions.isXCHMAMCFastUnderSlow || + mConditions.isXCHMAMCFastCrossedUnderSlow) && + ( + // + (mConditions.isXCHMAMCVale && + ( + // + mConditions.isXCHMALCVale + // + || + // + (mConditions.isXTMNeutural && + mConditions.isXCHLHMCLCLLSame && + mConditions.isXTSCurrentUnderMediest) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + || + // + // PriceUnderSignal ... + // Check If HH is Same In Length ... + ((mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + (mConditions.isXCHMAMCPeak && + (mConditions.isXCHMAMCFastOverSlow || + mConditions.isXCHMAMCFastCrossedOverSlow)) + // + || + // + (mConditions.isXCHMALCPeak && + (mConditions.isXCHMALCFastOverSlow || + mConditions.isXCHMALCFastCrossedOverSlow)) + // + ) + // + ) + // + || + // + // PriceUnderSignal ... + // Not Same LL or HH in Lenght ... + ((!mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + false + // + ) + // + ) + // + ) + // + ) + // + ) + // + || + // + // Check Conditions if Price is Over Signal ... + ( + // + ((mConditions.isXLHPriceOverSignal || + mConditions.isXLHPriceCrossedOverSignal) && + ( + // + // Next Step is to Check LL and HH Same Style ... + // + // PriceOverSignal ... + // Check if Both LL and HH Same In Length ... + ((mConditions.isXLHLLSameInLength && + mConditions.isXLHHHSameInLength) && + // + ( + // + (mConditions.isXCHMASCPeak && + (mConditions.isXCHMASCFastOverSlow || + mConditions.isXCHMASCFastCrossedOverSlow)) + // + || + // + (mConditions.isXCHMAMCPeak && + (mConditions.isXCHMAMCFastOverSlow || + mConditions.isXCHMAMCFastCrossedOverSlow)) + // + || + // + (mConditions.isXCHMALCPeak && + (mConditions.isXCHMALCFastOverSlow || + mConditions.isXCHMALCFastCrossedOverSlow)) + // + || + // + ((mConditions.isXCHMASCFastUnderSlow || + mConditions.isXCHMASCFastCrossedUnderSlow) && + ( + // + (mConditions.isXTMNeutural && + mConditions.isXAMABullish && + mConditions.isXTDBullOverBear && + mConditions.isXTDSignalUnderBear) + // + || + // + (mConditions.isXCHLHMCLCLLSame && + mConditions.isXTSCurrentUnderMediest) + // + ) + // + ) + // + || + // + ((mConditions.isXCHMAMCFastUnderSlow || + mConditions.isXCHMAMCFastCrossedUnderSlow) && + ( + // + (mConditions.isXCHMASCPeak && + (mConditions.isXAMANeutural || + mConditions.isXAMAEndBullish)) + // + ) + // + ) + // + || + // + ((mConditions.isXCHMALCFastUnderSlow || + mConditions.isXCHMALCFastCrossedUnderSlow) && + ( + // + (mConditions.isXTMNeutural && + mConditions.isXAMANeutural) + // + || + // + (mConditions.isXCHLHSameHHs && + mConditions.isXTSCurrentUnderMediest) + // + || + // + (mConditions.isXCHMALCVale && + (mConditions.isXAMANeutural || + mConditions.isXAMAEndBullish) && + mConditions.isXTMStartBearish) + // + ) + // + ) + // + ) + // + ) + // + || + // + // PriceOverSignal ... + // Check If LL Same In Length ... + ((mConditions.isXLHLLSameInLength && + !mConditions.isXLHHHSameInLength) && + // + ( + // + (mConditions.isXCHMAMCPeak && + (mConditions.isXCHMAMCFastOverSlow || + mConditions.isXCHMAMCFastCrossedOverSlow)) + // + || + // + (mConditions.isXCHMALCPeak && + (mConditions.isXCHMALCFastOverSlow || + mConditions.isXCHMALCFastCrossedOverSlow)) + // + || + // + ((mConditions.isXCHMALCFastUnderSlow || + mConditions.isXCHMALCFastCrossedUnderSlow) && + ( + // + ((mConditions.isXCHLHSCMCHHSame && + mConditions.isXTSCurrentUnderMediest) && + ( + // + mConditions.isXCHMALCVale + // + || + // + (mConditions.isXCHMALCTrendsDown && + mConditions.isXTSCurrentCrossedUnderMediest) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + || + // + // PriceOverSignal ... + // Check If HH is Same In Length ... + ((mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + (mConditions.isXCHMASCPeak && + (mConditions.isXCHMASCFastOverSlow || + mConditions.isXCHMASCFastCrossedOverSlow)) + // + || + // + (mConditions.isXCHMAMCPeak && + (mConditions.isXCHMAMCFastOverSlow || + mConditions.isXCHMAMCFastCrossedOverSlow)) + // + || + // + (mConditions.isXCHMALCPeak && + (mConditions.isXCHMALCFastOverSlow || + mConditions.isXCHMALCFastCrossedOverSlow)) + // + || + // + ((mConditions.isXCHMAMCFastUnderSlow || + mConditions.isXCHMAMCFastCrossedUnderSlow) && + ( + // + (mConditions.isXTMNeutural && + mConditions.isXCHMALCVale && + mConditions.isXAMAStartBullish && + mConditions.isXFICrossedOverZero && + mConditions.isXTDBullCrossedOverBear && + mConditions.isXTSCurrentUnderMediest) + // + ) + // + ) + // + || + // + ((mConditions.isXCHMALCFastUnderSlow || + mConditions.isXCHMALCFastCrossedUnderSlow) && + ( + // + (mConditions.isXCHMALCVale && + mConditions.isXTMNeutural && + mConditions.isXAMANeutural) + // + ) + // + ) + // + ) + // + ) + // + || + // + // PriceOverSignal ... + // Not Same LL or HH in Lenght ... + ((!mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + (mConditions.isXCHMAMCPeak && + (mConditions.isXCHMAMCFastOverSlow || + mConditions.isXCHMAMCFastCrossedOverSlow)) + // + || + // + ((mConditions.isXCHMALCFastUnderSlow || + mConditions.isXCHMALCFastCrossedUnderSlow) && + ( + // + (mConditions.isXCHMALCVale && + mConditions.isXTDBearishVale && + mConditions.isXCHLHSCMCHHSame) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + || + // + // Check Conditions if Price is not has clear state ... + ( + // + ((!mConditions.isXLHPriceOverSignal && + !mConditions.isXLHPriceUnderSignal && + !mConditions.isXLHPriceInSignalRange && + !mConditions.isXLHPriceCrossedOverSignal && + !mConditions.isXLHPriceCrossedUnderSignal) && + ( + // + // Next Step is to Check LL and HH Same Style ... + // + // PriceFree ... + // Check if Both LL and HH Same In Length ... + ((mConditions.isXLHLLSameInLength && + mConditions.isXLHHHSameInLength) && + // + ( + // + (mConditions.isXCHMALCPeak && + (mConditions.isXCHMALCFastOverSlow || + mConditions.isXCHMALCFastCrossedOverSlow)) + // + ) + // + ) + // + || + // + // PriceFree ... + // Check If LL Same In Length ... + ((mConditions.isXLHLLSameInLength && + !mConditions.isXLHHHSameInLength) && + // + ( + // + false + // + ) + // + ) + // + || + // + // PriceFree ... + // Check If HH is Same In Length ... + ((mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + (mConditions.isXCHMALCPeak && + (mConditions.isXCHMALCFastOverSlow || + mConditions.isXCHMALCFastCrossedOverSlow)) + // + ) + // + ) + // + || + // + // PriceFree ... + // Not Same LL or HH in Lenght ... + ((!mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + false + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ; + + // + return result; +} + +// +// XTSFI Short Signal Checking ... +bool XEU5XTSFIHasShortSignal() +{ + // + bool result = false; + + // + // Validate Args ... + if (!xEU5MXTSFIEnableSignaller || + !xEU5MXTSFIAllowShortSignals) + { + return result; + } + + // + // Retrieve Market Condition ... + XMarketConditions mConditions = xEU5Provider.GetLastMarketCondition(); + + // + // Start Analysing Market based On Conditions ... + result = + // + // Base Condition: + xEU5Provider.XTSFIHasShortConditions() + // + && + // + // Exceptions: + // there some commonly Exceptions which makes our choice incorrect, + // here we are combined knownly Exceptions ... + !( + // + // for Exception we used XLH Conditions as follow ... + // + // Check Conditions if Price In Signal Range ... + (mConditions.isXLHPriceInSignalRange && + // + ( + // + // Next Step is to Check LL and HH Same Style ... + // + // PriceInSignalRange ... + // Check if Both LL and HH Same In Length ... + ((mConditions.isXLHLLSameInLength && + mConditions.isXLHHHSameInLength) && + // + ( + // + ((mConditions.isXCHMALCVale && + mConditions.isXCHLHMCLCLLSame) && + ( + // + mConditions.isXCHMASCTrendsDown + // + || + // + (mConditions.isXTMNeutural && + mConditions.isXTMEndBearish && + mConditions.isXTSCurrentOverMediest) + // + ) + // + ) + // + || + // + (((mConditions.isXTMVale || + mConditions.isXTMNeutural) && + mConditions.isXAMANeutural) && + (mConditions.isXFIOverZero || + mConditions.isXFICrossedOverZero) && + mConditions.isXTSCurrentOverMediest) + // + || + // + ((mConditions.isXCHMASCFastOverSlow || + mConditions.isXCHMASCFastCrossedOverSlow) && + ( + // + ( + // + (mConditions.isXTSCurrentOverMediest && + ( + // + (mConditions.isXTMBullish && + mConditions.isXAMABullish && + mConditions.isXTDBullOverBear && + mConditions.isXTDSignalCrossedOverBear) + // + || + // + (mConditions.isXTMBullish && + mConditions.isXAMABullish && + mConditions.isXFIOverZero && + mConditions.isXTDBullOverBear) + // + || + // + (mConditions.isXCHMALCVale && + mConditions.isXTMNeutural && + mConditions.isXAMANeutural && + mConditions.isXCHMAMCTrendsDown && + mConditions.isXTSCurrentCrossedUnderNearest) + // + || + // + ((mConditions.isXTMBullish && + mConditions.isXAMABullish && + mConditions.isXFIOverZero) && + ( + // + (mConditions.isXCHMALCVale && + mConditions.isXCHLHSCMCLLSame) + // + || + // + (mConditions.isXTDBearishVale && + mConditions.isXTDBullOverBear && + mConditions.isXTDSignalCrossedOverBear) + // + ) + // + ) + // + ) + // + ) + // + || + // + ((mConditions.isXFIOverZero && + mConditions.isXTDBullOverBear) && + ( + // + (mConditions.isXAMANeutural && + mConditions.isXTMStartBullish) + // + || + // + (mConditions.isXTMBullish && + mConditions.isXAMABullish && + mConditions.isXTDSignalOverBear) + // + ) + // + ) + // + ) + // + ) + // + ) + // + || + // + ((mConditions.isXCHMAMCFastOverSlow || + mConditions.isXCHMAMCFastCrossedOverSlow) && + ( + // + (mConditions.isXTSCurrentOverMediest && + ( + // + (mConditions.isXCHMASCVale && + mConditions.isXTMNeutural && + mConditions.isXAMANeutural && + mConditions.isXCHLHSCMCLLSame && + mConditions.isXCHLHMCLCHHSame && + mConditions.isXTDBullUnderBear && + mConditions.isXTDSignalUnderBear) + // + || + // + (mConditions.isXTMBullish && + mConditions.isXAMABullish && + mConditions.isXFIOverZero && + mConditions.isXTDBullOverBear) + // + ) + // + ) + // + ) + // + ) + // + || + // + ((mConditions.isXCHMALCFastOverSlow || + mConditions.isXCHMALCFastCrossedOverSlow) && + ( + // + (mConditions.isXTSCurrentOverMediest && + ( + // + (mConditions.isXCHMALCPeak && + (mConditions.isXTMNeutural || + mConditions.isXTMEndBullish) && + (mConditions.isXAMANeutural || + mConditions.isXAMAEndBullish) && + mConditions.isXTDBullUnderBear && + mConditions.isXTDSignalUnderBear) + // + || + // + (mConditions.isXAMAVale && + mConditions.isXCHMALCPeak && + mConditions.isXTDBullOverBear && + (mConditions.isXFIOverZero || + mConditions.isXFICrossedOverZero)) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + || + // + // PriceInSignalRange ... + // Check If LL Same In Length ... + ((mConditions.isXLHLLSameInLength && + !mConditions.isXLHHHSameInLength) && + // + ( + // + ((mConditions.isXCHMASCFastOverSlow || + mConditions.isXCHMASCFastCrossedOverSlow) && + ( + // + ((mConditions.isXAMANeutural && + mConditions.isXFIOverZero && + mConditions.isXTDBullOverBear && + mConditions.isXTSCurrentOverMediest) && + ( + // + mConditions.isXTMNeutural + // + || + // + (mConditions.isXTMBullish && + mConditions.isXLHLLDecreased) + // + ) + // + ) + // + ) + // + ) + // + || + // + ((mConditions.isXCHMALCFastOverSlow || + mConditions.isXCHMALCFastCrossedOverSlow) && + ( + // + (mConditions.isXFIOverZero && + mConditions.isXCHMAMCVale && + mConditions.isXCHMALCPeak && + mConditions.isXLHHHDecreased && + (mConditions.isXTMBullish || + mConditions.isXTMStartBullish) && + mConditions.isXAMABullish && + mConditions.isXTSCurrentOverMediest && + mConditions.isXTDBullCrossedOverBear) + // + || + // + (mConditions.isXTMNeutural && + mConditions.isXAMABullish && + mConditions.isXCHMAMCVale && + mConditions.isXCHMALCPeak && + mConditions.isXLHHHDecreased && + mConditions.isXFICrossedOverZero && + mConditions.isXTDBullCrossedOverBear) + // + || + // + (mConditions.isXFIOverZero && + mConditions.isXCHMALCPeak && + mConditions.isXTDBullOverBear && + mConditions.isXTDSignalOverBear && + mConditions.isXTSCurrentOverMediest) + // + || + // + (mConditions.isXTMNeutural && + mConditions.isXFIOverZero && + mConditions.isXCHMALCPeak && + mConditions.isXLHHHDecreased && + mConditions.isXTSCurrentOverMediest && + mConditions.isXTDBullCrossedUnderBear) + // + ) + // + ) + // + ) + // + ) + // + || + // + // PriceInSignalRange ... + // Check If HH is Same In Length ... + ((mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + (mConditions.isXTSCurrentOverMediest && + ( + // + (mConditions.isXCHMALCVale && + mConditions.isXTMNeutural && + mConditions.isXAMANeutural) + // + || + // + (mConditions.isXAMANeutural && + mConditions.isXTMStartBearish && + mConditions.isXTDBullUnderBear && + mConditions.isXCHMAMCTrendsDown && + mConditions.isXTDSignalUnderBear) + // + || + // + ((mConditions.isXTMBullish || + mConditions.isXTMStartBullish) && + (mConditions.isXAMABullish || + mConditions.isXAMAStartBullish) && + (mConditions.isXFIOverZero || + mConditions.isXFICrossedOverZero) && + mConditions.isXCHLHSameLLs) + // + ) + // + ) + // + || + // + ((mConditions.isXCHMASCFastOverSlow || + mConditions.isXCHMASCFastCrossedOverSlow) && + ( + // + ((mConditions.isXTMBullish && + mConditions.isXAMABullish) && + ( + // + (mConditions.isXCHMALCVale && + mConditions.isXCHMASCTrendsUp) + // + || + // + (mConditions.isXCHLHSameLLs && + mConditions.isXTDBearishVale && + mConditions.isXTDBullOverBear && + mConditions.isXTSCurrentOverMediest) + // + ) + // + ) + // + ) + // + ) + // + || + // + ((mConditions.isXCHMALCFastOverSlow || + mConditions.isXCHMALCFastCrossedOverSlow) && + ( + // + (mConditions.isXTMNeutural && + mConditions.isXCHMALCPeak && + mConditions.isXAMANeutural && + mConditions.isXCHLHSCMCLLSame && + mConditions.isXTSCurrentOverMediest && + mConditions.isXTSCurrentCrossedUnderFarest) + // + || + // + ((mConditions.isXCHMAMCVale && + mConditions.isXCHLHSCMCLLSame && + mConditions.isXTSCurrentOverMediest) && + ( + // + (mConditions.isXTMBearish && + mConditions.isXAMABearish && + mConditions.isXTDSignalVale && + mConditions.isXTDBullishVale) + // + || + // + (mConditions.isXTMNeutural && + mConditions.isXTMEndBearish && + mConditions.isXTDBullUnderBear && + mConditions.isXTDSignalUnderBear) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + || + // + // PriceInSignalRange ... + // Not Same LL or HH in Lenght ... + ((!mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + false + // + ) + // + ) + // + ) + // + ) + // + || + // + // Check Conditions if Price is Under Signal ... + ( + // + ((mConditions.isXLHPriceUnderSignal || + mConditions.isXLHPriceCrossedUnderSignal) && + ( + // + // Next Step is to Check LL and HH Same Style ... + // + // PriceUnderSignal ... + // Check if Both LL and HH Same In Length ... + ((mConditions.isXLHLLSameInLength && + mConditions.isXLHHHSameInLength) && + // + ( + // + (mConditions.isXTSCurrentOverMediest && + ( + // + ((mConditions.isXTMBearish && + mConditions.isXAMABearish && + mConditions.isXCHLHSCMCLLSame && + mConditions.isXTDBullUnderBear && + mConditions.isXTDSignalUnderBear && + mConditions.isXTSCurrentUnderFarest) && + ( + // + mConditions.isXTSCurrentUnderNearest + // + || + // + (mConditions.isXTDSignalVale && + mConditions.isXTDBullishVale) + // + ) + // + ) + // + ) + // + ) + // + || + // + ((mConditions.isXCHMASCFastOverSlow || + mConditions.isXCHMASCFastCrossedOverSlow) && + ( + // + (mConditions.isXCHMALCVale && + mConditions.isXCHMASCTrendsUp) + // + || + // + (mConditions.isXTMNeutural && + mConditions.isXAMANeutural && + mConditions.isXTDBullOverBear && + mConditions.isXTSCurrentOverMediest) + // + || + // + (mConditions.isXTDBullOverBear && + mConditions.isXLHHHDecreased && + mConditions.isXLHLLDecreased && + mConditions.isXTSCurrentOverMediest) + // + || + // + ((mConditions.isXFIOverZero && + mConditions.isXTSCurrentOverMediest) && + ( + // + (mConditions.isXTMStartBullish && + mConditions.isXAMAStartBullish) + // + || + // + (mConditions.isXTMBullish && + mConditions.isXAMABullish) + // + || + // + ((mConditions.isXTDBullOverBear && + mConditions.isXTDSignalOverBear) && + ( + // + (mConditions.isXTMStartBearish && + mConditions.isXAMAStartBearish) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + || + // + ((mConditions.isXCHMAMCFastOverSlow || + mConditions.isXCHMAMCFastCrossedOverSlow) && + ( + // + (mConditions.isXTSCurrentOverMediest && + ( + // + (mConditions.isXTMNeutural && + mConditions.isXAMANeutural && + mConditions.isXTDBullOverBear) + // + || + // + (mConditions.isXCHMALCVale && + mConditions.isXTMStartBearish && + mConditions.isXAMAStartBearish && + mConditions.isXCHLHSCMCLLSame) + // + || + // + (mConditions.isXTMVale && + mConditions.isXAMAVale && + mConditions.isXCHMALCVale && + mConditions.isXTDBullUnderBear && + mConditions.isXTDSignalUnderBear) + // + ) + // + ) + // + ) + // + ) + // + || + // + ((mConditions.isXCHMALCFastOverSlow || + mConditions.isXCHMALCFastCrossedOverSlow) && + ( + // + mConditions.isXOBDSwingLow + // + || + // + (mConditions.isXTSCurrentOverMediest && + ( + // + (mConditions.isXTMVale && + mConditions.isXAMAVale && + mConditions.isXCHMAMCVale && + mConditions.isXCHMALCPeak) + // + || + // + (mConditions.isXCHMAMCVale && + mConditions.isXCHLHSameLLs && + mConditions.isXTDSignalVale && + mConditions.isXTDBullishVale) + // + || + // + (mConditions.isXAMAVale && + mConditions.isXCHMAMCVale && + mConditions.isXCHMALCPeak && + mConditions.isXTDBullCrossedUnderBear && + mConditions.isXTSCurrentCrossedOverMediest) + // + || + // + ((mConditions.isXTDBullUnderBear && + mConditions.isXTDSignalUnderBear) && + ( + // + mConditions.isXCHMALCPeak + // + || + // + (mConditions.isXTMBearish && + mConditions.isXAMABearish && + mConditions.isXTSCurrentCrossedOverMediest) + // + || + // + (mConditions.isXAMAVale && + mConditions.isXTMNeutural && + mConditions.isXFIOverZero && + mConditions.isXTSCurrentCrossedOverMediest) + // + || + // + (mConditions.isXAMAVale && + mConditions.isXTMBearish && + mConditions.isXCHMAMCVale && + mConditions.isXCHLHMCLCLLSame) + // + || + // + (mConditions.isXTMNeutural && + mConditions.isXFIOverZero && + mConditions.isXLHHHIncreased && + mConditions.isXCHLHSCMCLLSame && + mConditions.isXCHLHMCLCHHSame && + mConditions.isXFICrossedOverZero) + // + || + // + (mConditions.isXAMABearish && + mConditions.isXCHMAMCVale && + mConditions.isXCHLHMCLCLLSame && + (mConditions.isXTMNeutural || + mConditions.isXTMEndBearish)) + // + || + // + (mConditions.isXAMAVale && + mConditions.isXCHMAMCVale && + mConditions.isXTMStartBearish && + mConditions.isXCHLHMCLCLLSame && + mConditions.isXTSCurrentUnderFarest) + // + || + // + (mConditions.isXAMAVale && + mConditions.isXTMNeutural && + mConditions.isXCHMAMCVale && + mConditions.isXCHLHSCMCLLSame && + mConditions.isXFICrossedUnderZero && + mConditions.isXTSCurrentCrossedUnderNearest) + // + || + // + ((mConditions.isXAMAVale && + mConditions.isXTMNeutural && + mConditions.isXCHMALCPeak && + mConditions.isXCHMAMCVale) && + ( + // + mConditions.isXLHPriceCrossedUnderSignal + // + || + // + (mConditions.isXCHLHSCMCLLSame && + mConditions.isXFICrossedUnderZero && + mConditions.isXTSCurrentUnderFarest && + mConditions.isXTSCurrentUnderNearest && + mConditions.isXTSCurrentCrossedUnderNearest) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + || + // + (((mConditions.isXTMBullish || + mConditions.isXTMNeutural || + mConditions.isXTMStartBullish) && + mConditions.isXTSCurrentOverMediest) && + ( + // + (mConditions.isXAMAVale && + mConditions.isXCHMAMCVale && + mConditions.isXCHMALCPeak && + (mConditions.isXTMStartBullish || + mConditions.isXTMEndBullish)) + // + || + // + (mConditions.isXCHMAMCVale && + mConditions.isXTDBullOverBear && + mConditions.isXCHLHMCLCLLSame && + mConditions.isXAMAStartBearish) + // + || + // + (mConditions.isXCHMALCPeak && + mConditions.isXFIOverZero && + mConditions.isXTMEndBearish && + mConditions.isXFICrossedOverZero) + // + ) + // + ) + // + || + // + ((mConditions.isXCHMAMCVale && + mConditions.isXTSCurrentOverMediest) && + ( + // + (mConditions.isXCHMALCPeak && + mConditions.isXLHHHDecreased && + mConditions.isXCHLHSCMCLLSame) + // + || + // + ((mConditions.isXTMNeutural && + mConditions.isXAMAStartBearish) && + ( + // + (mConditions.isXCHLHSameLLs && + mConditions.isXTDBullOverBear) + // + || + // + (mConditions.isXAMAVale && + mConditions.isXCHLHMCLCLLSame) + // + ) + // + ) + // + ) + // + ) + // + || + // + ((mConditions.isXCHMAMCVale && + mConditions.isXCHMALCPeak && + mConditions.isXTSCurrentOverMediest) && + ( + // + (mConditions.isXTMVale && + mConditions.isXAMAVale && + mConditions.isXLHHHDecreased) + // + || + // + (mConditions.isXTMNeutural && + mConditions.isXAMANeutural && + mConditions.isXTDBullOverBear && + mConditions.isXCHLHMCLCLLSame) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + || + // + // PriceUnderSignal ... + // Check If LL Same In Length ... + ((mConditions.isXLHLLSameInLength && + !mConditions.isXLHHHSameInLength) && + // + ( + // + ((mConditions.isXCHMASCFastOverSlow || + mConditions.isXCHMASCFastCrossedOverSlow) && + (mConditions.isXCHMALCFastOverSlow || + mConditions.isXCHMALCFastCrossedOverSlow)) + // + || + // + (mConditions.isXTSCurrentOverMediest && + ( + // + ((mConditions.isXCHMALCVale && + mConditions.isXCHLHSCMCLLSame) && + ( + // + (mConditions.isXAMAVale && + mConditions.isXCHMASCUnderMax && + mConditions.isXCHMASCUnderMin) + // + || + // + (mConditions.isXTMBearish && + mConditions.isXAMABearish && + mConditions.isXTDBullUnderBear && + mConditions.isXTDSignalUnderBear) + // + ) + // + ) + // + ) + // + ) + // + || + // + ((mConditions.isXCHMASCFastOverSlow || + mConditions.isXCHMASCFastCrossedOverSlow) && + ( + // + ( + // + (mConditions.isXTMNeutural && + mConditions.isXAMANeutural && + mConditions.isXTDBullOverBear && + mConditions.isXCHLHSCMCHHSame && + mConditions.isXCHLHMCLCLLSame && + mConditions.isXCHMASCTrendsUp && + mConditions.isXTSCurrentOverMediest) + // + ) + // + ) + // + ) + // + || + // + ((mConditions.isXCHMALCFastOverSlow || + mConditions.isXCHMALCFastCrossedOverSlow) && + ( + // + ((mConditions.isXCHMAMCVale && + mConditions.isXTSCurrentOverMediest) && + ( + // + mConditions.isXLHHHDecreased + // + || + // + mConditions.isXTSCurrentCrossedOverMediest + // + || + // + (mConditions.isXTMVale && + mConditions.isXTMNeutural && + mConditions.isXAMAVale && + mConditions.isXAMANeutural) + // + || + // + (mConditions.isXTMBearish && + mConditions.isXAMABearish && + mConditions.isXCHMALCTrendsDown) + // + || + // + (mConditions.isXAMAVale && + mConditions.isXFIOverZero && + mConditions.isXTMEndBearish && + mConditions.isXTDBullOverBear) + // + || + // + (mConditions.isXCHMALCPeak && + ( + // + mConditions.isXCHLHMCLCLLSame + // + || + // + (mConditions.isXTMVale && + mConditions.isXAMAVale) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + || + // + // PriceUnderSignal ... + // Check If HH is Same In Length ... + ((mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + (mConditions.isXTSCurrentOverMediest && + ( + // + (mConditions.isXTMNeutural && + mConditions.isXAMANeutural && + mConditions.isXTSCurrentCrossedOverMediest) + // + || + // + ((mConditions.isXTMBearish && + mConditions.isXAMABearish && + mConditions.isXCHLHSCMCLLSame && + mConditions.isXTDSignalUnderBear) && + ( + // + mConditions.isXTDBullCrossedUnderBear + // + || + // + (mConditions.isXCHMALCVale && + mConditions.isXLHHHIncreased && + mConditions.isXTDBullUnderBear) + // + ) + // + ) + // + ) + // + ) + // + || + // + ((mConditions.isXCHMASCFastOverSlow || + mConditions.isXCHMASCFastCrossedOverSlow) && + ( + // + ( + // + ((mConditions.isXCHMALCVale && + mConditions.isXTDBullOverBear && + mConditions.isXTSCurrentOverMediest) && + ( + // + (mConditions.isXFIOverZero && + mConditions.isXCHMASCTrendsUp) + // + || + // + (mConditions.isXAMANeutural && + mConditions.isXLHHHIncreased && + mConditions.isXTMStartBearish && + mConditions.isXCHLHSCMCHHSame) + // + ) + // + ) + // + ) + // + ) + // + ) + // + || + // + ((mConditions.isXCHMAMCFastOverSlow || + mConditions.isXCHMAMCFastCrossedOverSlow) && + ( + // + (mConditions.isXTMBearish && + mConditions.isXAMABearish && + mConditions.isXTDBullUnderBear && + mConditions.isXTDSignalUnderBear && + mConditions.isXTSCurrentOverMediest) + // + || + // + (mConditions.isXTMVale && + mConditions.isXAMAVale && + mConditions.isXCHMASCVale && + mConditions.isXCHLHSCMCLLSame && + mConditions.isXCHLHMCLCHHSame && + mConditions.isXTSCurrentOverMediest) + // + ) + // + ) + // + || + // + ((mConditions.isXCHMALCFastOverSlow || + mConditions.isXCHMALCFastCrossedOverSlow) && + ( + // + (mConditions.isXTSCurrentOverMediest && + ( + // + mConditions.isXCHLHSameLLs + // + || + // + (mConditions.isXAMAVale && + mConditions.isXTMNeutural && + mConditions.isXFIOverZero && + mConditions.isXCHMAMCVale && + mConditions.isXCHMALCPeak && + mConditions.isXLHHHDecreased) + // + || + // + (mConditions.isXTMVale && + mConditions.isXAMAVale && + mConditions.isXCHMAMCVale && + mConditions.isXCHMALCPeak && + mConditions.isXLHHHDecreased && + mConditions.isXTSCurrentCrossedUnderNearest) + // + || + // + (mConditions.isXCHLHSCMCLLSame && + ( + // + (mConditions.isXCHLHMCLCHHSame && + ( + // + (mConditions.isXAMAVale && + mConditions.isXCHMAMCVale && + mConditions.isXTMStartBearish) + // + || + // + ((mConditions.isXTMNeutural || + mConditions.isXTMEndBearish) && + (mConditions.isXAMANeutural || + mConditions.isXAMAEndBearish)) + // + || + // + (mConditions.isXTMVale && + mConditions.isXCHMAMCVale && + mConditions.isXTDBullUnderBear && + mConditions.isXTDSignalUnderBear && + mConditions.isXTSCurrentUnderFarest && + mConditions.isXTSCurrentUnderNearest) + // + ) + // + ) + // + || + // + (mConditions.isXTMBearish && + mConditions.isXAMABearish) + // + || + // + (mConditions.isXFIOverZero && + mConditions.isXCHMAMCVale && + mConditions.isXTMEndBearish && + mConditions.isXTDBullUnderBear && + mConditions.isXTDSignalUnderBear) + // + || + // + (mConditions.isXCHMALCPeak && + ( + // + (mConditions.isXTMNeutural && + mConditions.isXAMABearish && + mConditions.isXFIOverZero && + mConditions.isXCHMAMCVale && + mConditions.isXTDBullUnderBear && + mConditions.isXTDSignalUnderBear) + // + || + // + (mConditions.isXTMNeutural && + mConditions.isXAMABearish && + mConditions.isXCHMAMCVale && + mConditions.isXLHHHDecreased && + mConditions.isXFICrossedUnderZero && + mConditions.isXTSCurrentCrossedUnderNearest) + // + ) + // + ) + // + || + // + ((mConditions.isXAMAVale && + mConditions.isXCHMALCPeak) && + ( + // + mConditions.isXTMNeutural + // + || + // + (mConditions.isXTMVale && + mConditions.isXTMEndBearish && + mConditions.isXLHLLDecreased) + // + ) + // + ) + // + || + // + (mConditions.isXTMVale && + mConditions.isXTMNeutural && + mConditions.isXAMABearish && + mConditions.isXCHMAMCVale && + mConditions.isXTDBullUnderBear && + mConditions.isXTDSignalUnderBear && + mConditions.isXTSCurrentUnderFarest && + mConditions.isXTSCurrentUnderNearest && + mConditions.isXTSCurrentCrossedUnderNearest) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + || + // + // PriceUnderSignal ... + // Not Same LL or HH in Lenght ... + ((!mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + ((mConditions.isXCHLHSCMCLLSame && + mConditions.isXCHMASCUnderMax && + mConditions.isXCHMASCUnderMin && + mConditions.isXTSCurrentOverMediest) && + ( + // + mConditions.isXCHMAMCTrendsDown + // + || + // + (mConditions.isXTMBearish && + mConditions.isXAMABearish) + // + ) + // + ) + // + || + // + ((mConditions.isXCHMASCFastOverSlow || + mConditions.isXCHMASCFastCrossedOverSlow) && + ( + // + (mConditions.isXCHMASCTrendsUp && + mConditions.isXTMStartBearish && + mConditions.isXTDBullOverBear && + mConditions.isXAMAStartBearish && + mConditions.isXTSCurrentOverMediest) + // + ) + // + ) + // + || + // + ((mConditions.isXCHMALCFastOverSlow || + mConditions.isXCHMALCFastCrossedOverSlow) && + ( + // + ((mConditions.isXCHMAMCVale && + mConditions.isXCHLHSCMCLLSame && + mConditions.isXTSCurrentOverMediest) && + ( + // + (mConditions.isXAMAVale && + mConditions.isXTMBullish) + // + || + // + (mConditions.isXAMAVale && + (mConditions.isXTMNeutural || + mConditions.isXTMEndBearish)) + // + || + // + (mConditions.isXCHMALCPeak && + mConditions.isXTDSignalVale && + mConditions.isXTDBullishVale) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + || + // + // Check Conditions if Price is Over Signal ... + ( + // + ((mConditions.isXLHPriceOverSignal || + mConditions.isXLHPriceCrossedOverSignal) && + ( + // + // Next Step is to Check LL and HH Same Style ... + // + // PriceOverSignal ... + // Check if Both LL and HH Same In Length ... + ((mConditions.isXLHLLSameInLength && + mConditions.isXLHHHSameInLength) && + // + ( + // + ((mConditions.isXTMNeutural && + mConditions.isXCHMALCVale && + mConditions.isXAMANeutural && + mConditions.isXTSCurrentOverMediest) && + ( + // + (mConditions.isXCHLHMCLCLLSame && + mConditions.isXLHPriceCrossedOverSignal) + // + || + // + (mConditions.isXTDBullUnderBear && + mConditions.isXCHMAMCTrendsDown && + mConditions.isXTDSignalUnderBear) + // + ) + // + ) + // + || + // + ((mConditions.isXCHMASCFastOverSlow || + mConditions.isXCHMASCFastCrossedOverSlow) && + ( + // + (mConditions.isXTMBullish && + mConditions.isXAMABullish && + mConditions.isXTSCurrentOverMediest) + // + || + // + ((mConditions.isXTMBullish && + mConditions.isXFIOverZero && + mConditions.isXTSCurrentOverMediest) && + ( + // + (mConditions.isXAMANeutural && + mConditions.isXTDBullOverBear) + // + || + // + (mConditions.isXAMABullish && + mConditions.isXTDBullCrossedOverBear) + // + ) + // + ) + // + || + // + (mConditions.isXTSCurrentOverMediest && + ( + // + (mConditions.isXTMNeutural && + mConditions.isXCHMALCVale && + mConditions.isXAMANeutural && + mConditions.isXLHLLIncreased && + mConditions.isXCHLHSCMCHHSame && + mConditions.isXCHMASCTrendsUp) + // + ) + // + ) + // + ) + // + ) + // + || + // + ((mConditions.isXCHMAMCFastOverSlow || + mConditions.isXCHMAMCFastCrossedOverSlow) && + ( + // + (mConditions.isXCHMAMCPeak && + mConditions.isXCHMAMCTrendsUp) + // + || + // + (mConditions.isXCHMAMCTrendsUp && + mConditions.isXTSCurrentOverMediest) + // + || + // + (mConditions.isXCHMAMCPeak && + mConditions.isXCHMALCPeak && + mConditions.isXTDSignalVale && + mConditions.isXTDBullishVale && + mConditions.isXCHLHMCLCHHSame && + mConditions.isXTSCurrentOverMediest) + // + ) + // + ) + // + || + // + ((mConditions.isXCHMALCFastOverSlow || + mConditions.isXCHMALCFastCrossedOverSlow) && + ( + // + (mConditions.isXTSCurrentOverMediest && + ( + // + (mConditions.isXFIOverZero && + mConditions.isXCHMALCPeak) + // + || + // + (mConditions.isXCHMAMCVale && + mConditions.isXCHLHSCMCLLSame) + // + || + // + (mConditions.isXCHMALCPeak && + mConditions.isXTDSignalVale && + mConditions.isXTDBullishVale && + mConditions.isXLHHHDecreased) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + || + // + // PriceOverSignal ... + // Check If LL Same In Length ... + ((mConditions.isXLHLLSameInLength && + !mConditions.isXLHHHSameInLength) && + // + ( + // + ((mConditions.isXCHMASCFastOverSlow || + mConditions.isXCHMASCFastCrossedOverSlow) && + ( + // + ((mConditions.isXTDBullOverBear && + mConditions.isXTDSignalOverBear) && + ( + // + ((mConditions.isXTMBullish || + mConditions.isXTMStartBullish) + // + && + // + (mConditions.isXAMABullish || + mConditions.isXAMAStartBullish)) + // + ) + // + ) + // + ) + // + ) + // + || + // + ((mConditions.isXCHMAMCFastOverSlow || + mConditions.isXCHMAMCFastCrossedOverSlow) && + ( + // + (mConditions.isXTSCurrentOverMediest && + ( + // + (mConditions.isXCHMAMCPeak && + mConditions.isXCHMAMCTrendsUp) + // + || + // + (mConditions.isXTMNeutural && + mConditions.isXAMANeutural && + mConditions.isXCHLHSCMCHHSame && + mConditions.isXCHLHMCLCLLSame && + mConditions.isXTSCurrentUnderFarest && + mConditions.isXTDBullCrossedUnderBear) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + || + // + // PriceOverSignal ... + // Check If HH is Same In Length ... + ((mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + (mConditions.isXTSCurrentOverMediest && + ( + // + (mConditions.isXTMStartBullish && + mConditions.isXAMAStartBullish && + mConditions.isXLHPriceCrossedOverSignal) + // + || + // + (mConditions.isXTMNeutural && + mConditions.isXAMANeutural && + mConditions.isXLHLLIncreased && + mConditions.isXTDBullUnderBear && + mConditions.isXTDSignalUnderBear) + // + || + // + (mConditions.isXTMNeutural && + mConditions.isXAMANeutural && + mConditions.isXCHMAMCTrendsDown && + mConditions.isXTSCurrentUnderFarest && + mConditions.isXTSCurrentUnderNearest && + mConditions.isXTSCurrentCrossedUnderNearest) + // + ) + // + ) + // + || + // + ((mConditions.isXCHMASCFastOverSlow || + mConditions.isXCHMASCFastCrossedOverSlow) && + ( + // + (mConditions.isXLHHHIncreased && + mConditions.isXCHLHSCMCHHSame && + mConditions.isXCHMASCTrendsUp) + // + || + // + (mConditions.isXTSCurrentOverMediest && + ( + // + (mConditions.isXAMANeutural && + mConditions.isXTMStartBearish && + mConditions.isXTDBullOverBear) + // + || + // + (mConditions.isXTMBullish && + mConditions.isXAMABullish && + mConditions.isXFIOverZero && + mConditions.isXTDBullOverBear) + // + || + // + (mConditions.isXTMNeutural && + mConditions.isXAMABullish && + mConditions.isXCHMALCVale && + mConditions.isXCHLHSCMCHHSame && + mConditions.isXCHMASCTrendsUp) + // + ) + // + ) + // + ) + // + ) + // + || + // + ((mConditions.isXCHMAMCFastOverSlow || + mConditions.isXCHMAMCFastCrossedOverSlow) && + ( + // + (mConditions.isXCHMAMCTrendsUp && + ( + // + (mConditions.isXCHMAMCPeak && + mConditions.isXCHMAMCTrendsUp) + // + || + // + (mConditions.isXTMNeutural && + mConditions.isXAMANeutural && + mConditions.isXTSCurrentOverMediest) + // + || + // + ((mConditions.isXTMBullish || + mConditions.isXTMStartBullish) && + (mConditions.isXAMABullish || + mConditions.isXAMAStartBullish) && + (mConditions.isXTSCurrentOverMediest || + mConditions.isXTSCurrentCrossedOverMediest)) + // + )) + // + ) + // + ) + // + || + // + ((mConditions.isXCHMALCFastOverSlow || + mConditions.isXCHMALCFastCrossedOverSlow) && + ( + // + ((mConditions.isXTSCurrentOverMediest || + mConditions.isXTSCurrentCrossedOverMediest) && + ( + // + (mConditions.isXTMBearish && + mConditions.isXAMABearish && + mConditions.isXCHMAMCVale && + mConditions.isXLHHHDecreased && + mConditions.isXTDBullUnderBear && + mConditions.isXTDSignalUnderBear) + // + || + // + (mConditions.isXAMAVale && + mConditions.isXTMNeutural && + mConditions.isXFIOverZero && + mConditions.isXCHMAMCVale && + mConditions.isXCHMALCPeak && + mConditions.isXTDBullCrossedUnderBear) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + || + // + // PriceOverSignal ... + // Not Same LL or HH in Lenght ... + ((!mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + ((mConditions.isXTDBullOverBear && + mConditions.isXTSCurrentOverMediest) && + ( + // + (mConditions.isXAMANeutural && + mConditions.isXCHLHSCMCHHSame && + mConditions.isXTMStartBearish) + // + || + // + (mConditions.isXTMBullish && + mConditions.isXAMABullish && + mConditions.isXCHLHSameLLs) + // + ) + // + ) + // + || + // + (mConditions.isXCHMASCTrendsUp && + (mConditions.isXCHMASCFastOverSlow || + mConditions.isXCHMASCFastCrossedOverSlow)) + // + ) + // + ) + // + ) + // + ) + // + ) + // + || + // + // Check Conditions if Price is not has clear state ... + ( + // + ((!mConditions.isXLHPriceOverSignal && + !mConditions.isXLHPriceUnderSignal && + !mConditions.isXLHPriceInSignalRange && + !mConditions.isXLHPriceCrossedOverSignal && + !mConditions.isXLHPriceCrossedUnderSignal) && + ( + // + // Next Step is to Check LL and HH Same Style ... + // + // PriceFree ... + // Check if Both LL and HH Same In Length ... + ((mConditions.isXLHLLSameInLength && + mConditions.isXLHHHSameInLength) && + // + ( + // + false + // + ) + // + ) + // + || + // + // PriceFree ... + // Check If LL Same In Length ... + ((mConditions.isXLHLLSameInLength && + !mConditions.isXLHHHSameInLength) && + // + ( + // + false + // + ) + // + ) + // + || + // + // PriceFree ... + // Check If HH is Same In Length ... + ((mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + false + // + ) + // + ) + // + || + // + // PriceFree ... + // Not Same LL or HH in Lenght ... + ((!mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + false + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ; + + // + return result; +} + +// +// XOBDLH Long Signal Checking ... +bool XEU5XOBDLHHasLongSignal() +{ + // + bool result = false; + + // + // Validate Args ... + if (!xEU5MXOBDLHEnableSignaller || + !xEU5MXOBDLHAllowLongSignals) + { + return result; + } + + // + // Retrieve Market Condition ... + XMarketConditions mConditions = xEU5Provider.GetLastMarketCondition(); + + // + XMarketConditions xMConditions2 = xEU5Provider.GenerateMarketConditions(2); + + // + // Start Analysing Market based On Conditions ... + result = + // + // Base Condition: + xEU5Provider.XOBDLHHasLongConditions() + // + && + // + // Exceptions: + // there some commonly Exceptions which makes our choice incorrect, + // here we are combined knownly Exceptions ... + !( + // + // for Exception we used XLH Conditions as follow ... + // + // Check Conditions if Price In Signal Range ... + (mConditions.isXLHPriceInSignalRange && + // + ( + // + // Next Step is to Check LL and HH Same Style ... + // + // PriceInSignalRange ... + // Check if Both LL and HH Same In Length ... + ((mConditions.isXLHLLSameInLength && + mConditions.isXLHHHSameInLength) && + // + ( + // + false + // + ) + // + ) + // + || + // + // PriceInSignalRange ... + // Check If LL Same In Length ... + ((mConditions.isXLHLLSameInLength && + !mConditions.isXLHHHSameInLength) && + // + ( + // + false + // + ) + // + ) + // + || + // + // PriceInSignalRange ... + // Check If HH is Same In Length ... + ((mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + false + // + ) + // + ) + // + || + // + // PriceInSignalRange ... + // Not Same LL or HH in Lenght ... + ((!mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + false + // + ) + // + ) + // + ) + // + ) + // + || + // + // Check Conditions if Price is Under Signal ... + ( + // + ((mConditions.isXLHPriceUnderSignal || + mConditions.isXLHPriceCrossedUnderSignal) && + ( + // + // Next Step is to Check LL and HH Same Style ... + // + // PriceUnderSignal ... + // Check if Both LL and HH Same In Length ... + ((mConditions.isXLHLLSameInLength && + mConditions.isXLHHHSameInLength) && + // + ( + // + ((mConditions.isXCHMASCFastUnderSlow || + mConditions.isXCHMASCFastCrossedUnderSlow) && + ( + // + (mConditions.isXTMVale && + mConditions.isXAMAVale && + mConditions.isXCHMALCVale && + mConditions.isXTDSignalVale && + mConditions.isXTDBullishVale && + mConditions.isXCHLHSCMCLLSame) + // + ) + // + ) + // + ) + // + ) + // + || + // + // PriceUnderSignal ... + // Check If LL Same In Length ... + ((mConditions.isXLHLLSameInLength && + !mConditions.isXLHHHSameInLength) && + // + ( + // + false + // + ) + // + ) + // + || + // + // PriceUnderSignal ... + // Check If HH is Same In Length ... + ((mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + ((mConditions.isXCHMALCPeak && + (mConditions.isXCHMALCFastOverSlow || + mConditions.isXCHMALCFastCrossedOverSlow)) && + ( + // + (mConditions.isXTMNeutural && + mConditions.isXAMANeutural && + mConditions.isXLHLLDecreased && + mConditions.isXCHLHSCMCLLSame && + mConditions.isXCHLHMCLCHHSame && + mConditions.isXTSCurrentUnderFarest) + // + || + // + (mConditions.isXAMAVale && + mConditions.isXTMNeutural && + mConditions.isXAMANeutural && + mConditions.isXTMEndBearish && + mConditions.isXCHLHSCMCLLSame && + mConditions.isXCHLHMCLCHHSame) + // + ) + // + ) + // + || + // + ((mConditions.isXCHMASCFastUnderSlow || + mConditions.isXCHMASCFastCrossedUnderSlow) && + ( + // + (mConditions.isXCHMAMCVale && + mConditions.isXCHMALCVale && + mConditions.isXCHLHSCMCLLSame) + // + || + // + (mConditions.isXCHMAMCVale && + mConditions.isXCHMALCPeak && + mConditions.isXCHLHSCMCLLSame) + // + || + // + (mConditions.isXCHMASCVale && + mConditions.isXCHMAMCVale && + mConditions.isXCHMALCVale) + // + || + // + (mConditions.isXCHMASCVale && + mConditions.isXCHMALCPeak && + mConditions.isXCHLHSCMCLLSame) + // + || + // + (mConditions.isXTMVale && + mConditions.isXLHLLDecreased && + mConditions.isXCHLHSCMCLLSame && + mConditions.isXAMAStartBearish) + // + || + // + (mConditions.isXCHMALCPeak && + mConditions.isXCHLHSCMCLLSame && + mConditions.isXTSCurrentUnderFarest && + mConditions.isXTSCurrentUnderMediest) + // + || + // + (mConditions.isXTMVale && + mConditions.isXAMAVale && + mConditions.isXCHMAMCVale && + mConditions.isXCHLHSCMCLLSame && + mConditions.isXCHLHMCLCHHSame) + // + || + // + ((mConditions.isXTMVale && + mConditions.isXAMAVale && + mConditions.isXCHMAMCVale && + mConditions.isXCHLHSameLLs) && + ( + // + (mConditions.isXCHMALCVale && + mConditions.isXTDSignalVale && + mConditions.isXTDBullishVale) + // + || + // + (mConditions.isXTMNeutural && + mConditions.isXAMANeutural && + mConditions.isXLHHHDecreased) + // + ) + // + ) + // + || + // + (mConditions.isXCHMAMCFastUnderSlow || + mConditions.isXCHMAMCFastCrossedUnderSlow) + // + || + // + ((mConditions.isXCHMASCVale && + mConditions.isXCHMALCPeak && + mConditions.isXCHLHSCMCLLSame) && + ( + // + mConditions.isXTSCurrentMax + // + || + // + mConditions.isXLHLowAttachedLL + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + || + // + // PriceUnderSignal ... + // Not Same LL or HH in Lenght ... + ((!mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + ((mConditions.isXCHMASCFastUnderSlow || + mConditions.isXCHMASCFastCrossedUnderSlow) && + ( + // + (mConditions.isXCHMASCVale && + mConditions.isXCHMAMCVale && + mConditions.isXCHMALCVale) + // + || + // + (mConditions.isXTMVale && + mConditions.isXAMAVale && + mConditions.isXCHLHSCMCLLSame && + mConditions.isXTSCurrentUnderFarest) + // + || + // + (mConditions.isXTMNeutural && + mConditions.isXCHMALCPeak && + mConditions.isXTMEndBearish && + mConditions.isXCHLHSCMCLLSame) + // + || + // + (mConditions.isXAMAVale && + mConditions.isXTMNeutural && + mConditions.isXCHMAMCVale && + mConditions.isXCHMALCVale && + mConditions.isXTDBearishVale && + mConditions.isXCHLHSCMCLLSame) + // + || + // + (mConditions.isXCHMALCPeak && + mConditions.isXTMStartBearish && + mConditions.isXCHLHSCMCLLSame && + mConditions.isXAMAStartBearish) + // + || + // + (mConditions.isXAMAVale && + mConditions.isXTSAllSame && + mConditions.isXCHMAMCVale && + mConditions.isXCHMALCVale && + mConditions.isXTDSignalVale && + mConditions.isXTDBullishVale && + mConditions.isXTMStartBearish && + mConditions.isXCHLHSCMCLLSame && + mConditions.isXLHLowAttachedLL) + // + ) + // + ) + // + || + // + ((mConditions.isXCHMAMCFastUnderSlow || + mConditions.isXCHMAMCFastCrossedUnderSlow) && + ( + // + (mConditions.isXTMNeutural && + mConditions.isXCHMAMCVale && + mConditions.isXCHMALCVale && + mConditions.isXAMANeutural && + mConditions.isXCHLHSameLLs) + // + || + // + (mConditions.isXCHMALCPeak && + mConditions.isXAMANeutural && + mConditions.isXTMStartBullish && + mConditions.isXCHLHSCMCLLSame && + mConditions.isXTDSignalCrossedOverBear) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + || + // + // Check Conditions if Price is Over Signal ... + ( + // + ((mConditions.isXLHPriceOverSignal || + mConditions.isXLHPriceCrossedOverSignal) && + ( + // + // Next Step is to Check LL and HH Same Style ... + // + // PriceOverSignal ... + // Check if Both LL and HH Same In Length ... + ((mConditions.isXLHLLSameInLength && + mConditions.isXLHHHSameInLength) && + // + ( + // + false + // + ) + // + ) + // + || + // + // PriceOverSignal ... + // Check If LL Same In Length ... + ((mConditions.isXLHLLSameInLength && + !mConditions.isXLHHHSameInLength) && + // + ( + // + false + // + ) + // + ) + // + || + // + // PriceOverSignal ... + // Check If HH is Same In Length ... + ((mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + false + // + ) + // + ) + // + || + // + // PriceOverSignal ... + // Not Same LL or HH in Lenght ... + ((!mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + false + // + ) + // + ) + // + ) + // + ) + // + ) + // + || + // + // Check Conditions if Price is not has clear state ... + ( + // + ((!mConditions.isXLHPriceOverSignal && + !mConditions.isXLHPriceUnderSignal && + !mConditions.isXLHPriceInSignalRange && + !mConditions.isXLHPriceCrossedOverSignal && + !mConditions.isXLHPriceCrossedUnderSignal) && + ( + // + // Next Step is to Check LL and HH Same Style ... + // + // PriceFree ... + // Check if Both LL and HH Same In Length ... + ((mConditions.isXLHLLSameInLength && + mConditions.isXLHHHSameInLength) && + // + ( + // + false + // + ) + // + ) + // + || + // + // PriceFree ... + // Check If LL Same In Length ... + ((mConditions.isXLHLLSameInLength && + !mConditions.isXLHHHSameInLength) && + // + ( + // + false + // + ) + // + ) + // + || + // + // PriceFree ... + // Check If HH is Same In Length ... + ((mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + false + // + ) + // + ) + // + || + // + // PriceFree ... + // Not Same LL or HH in Lenght ... + ((!mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + false + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ; + + // + return result; +} + +// +// XOBDLH Short Signal Checking ... +bool XEU5XOBDLHHasShortSignal() +{ + // + bool result = false; + + // + // Validate Args ... + if (!xEU5MXOBDLHEnableSignaller || + !xEU5MXOBDLHAllowShortSignals) + { + return result; + } + + // + // Retrieve Market Condition ... + XMarketConditions mConditions = xEU5Provider.GetLastMarketCondition(); + + // + // Start Analysing Market based On Conditions ... + result = + // + // Base Condition: + xEU5Provider.XOBDLHHasShortConditions() + // + && + // + // Exceptions: + // there some commonly Exceptions which makes our choice incorrect, + // here we are combined knownly Exceptions ... + !( + // + // for Exception we used XLH Conditions as follow ... + // + // Check Conditions if Price In Signal Range ... + (mConditions.isXLHPriceInSignalRange && + // + ( + // + // Next Step is to Check LL and HH Same Style ... + // + // PriceInSignalRange ... + // Check if Both LL and HH Same In Length ... + ((mConditions.isXLHLLSameInLength && + mConditions.isXLHHHSameInLength) && + // + ( + // + (((mConditions.isXCHMASCFastOverSlow || + mConditions.isXCHMASCFastCrossedOverSlow) && + (mConditions.isXCHMALCFastOverSlow || + mConditions.isXCHMALCFastCrossedOverSlow)) && + ( + // + ((mConditions.isXTMNeutural && + mConditions.isXAMANeutural) && + ( + // + (mConditions.isXCHMALCPeak && + mConditions.isXCHLHSCMCHHSame && + mConditions.isXCHMASCCrossedUnderMax) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + || + // + // PriceInSignalRange ... + // Check If LL Same In Length ... + ((mConditions.isXLHLLSameInLength && + !mConditions.isXLHHHSameInLength) && + // + ( + // + (((mConditions.isXCHMAMCFastOverSlow || + mConditions.isXCHMAMCFastCrossedOverSlow) && + (mConditions.isXCHMALCFastOverSlow || + mConditions.isXCHMALCFastCrossedOverSlow)) && + ( + // + (mConditions.isXCHMAMCPeak && + mConditions.isXCHMAMCTrendsUp && + mConditions.isXCHMALCPeak && + mConditions.isXCHMALCTrendsUp) + // + || + // + (mConditions.isXTMNeutural && + mConditions.isXAMANeutural && + mConditions.isXTSCurrentMax && + mConditions.isXTDBullOverBear && + mConditions.isXTSCurrentOverFarest && + mConditions.isXTSCurrentOverNearest && + mConditions.isXTSCurrentOverMediest && + mConditions.isXTDSignalCrossedOverBear) + // + ) + // + ) + // + ) + // + ) + // + || + // + // PriceInSignalRange ... + // Check If HH is Same In Length ... + ((mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + false + // + ) + // + ) + // + || + // + // PriceInSignalRange ... + // Not Same LL or HH in Lenght ... + ((!mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + false + // + ) + // + ) + // + ) + // + ) + // + || + // + // Check Conditions if Price is Under Signal ... + ( + // + ((mConditions.isXLHPriceUnderSignal || + mConditions.isXLHPriceCrossedUnderSignal) && + ( + // + // Next Step is to Check LL and HH Same Style ... + // + // PriceUnderSignal ... + // Check if Both LL and HH Same In Length ... + ((mConditions.isXLHLLSameInLength && + mConditions.isXLHHHSameInLength) && + // + ( + // + false + // + ) + // + ) + // + || + // + // PriceUnderSignal ... + // Check If LL Same In Length ... + ((mConditions.isXLHLLSameInLength && + !mConditions.isXLHHHSameInLength) && + // + ( + // + false + // + ) + // + ) + // + || + // + // PriceUnderSignal ... + // Check If HH is Same In Length ... + ((mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + false + // + ) + // + ) + // + || + // + // PriceUnderSignal ... + // Not Same LL or HH in Lenght ... + ((!mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + false + // + ) + // + ) + // + ) + // + ) + // + ) + // + || + // + // Check Conditions if Price is Over Signal ... + ( + // + ((mConditions.isXLHPriceOverSignal || + mConditions.isXLHPriceCrossedOverSignal) && + ( + // + // Next Step is to Check LL and HH Same Style ... + // + // PriceOverSignal ... + // Check if Both LL and HH Same In Length ... + ((mConditions.isXLHLLSameInLength && + mConditions.isXLHHHSameInLength) && + // + ( + // + false + // + ) + // + ) + // + || + // + // PriceOverSignal ... + // Check If LL Same In Length ... + ((mConditions.isXLHLLSameInLength && + !mConditions.isXLHHHSameInLength) && + // + ( + // + ((mConditions.isXFIOverZero && + mConditions.isXCHLHMCLCLLSame && + mConditions.isXCHLHSCMCHHSame && + mConditions.isXTDBullOverBear) && + ( + // + (mConditions.isXTSCurrentMax && + mConditions.isXTMStartBullish && + mConditions.isXAMAStartBullish && + mConditions.isXTDSignalOverBear) + // + || + // + (mConditions.isXTMNeutural && + mConditions.isXAMABullish && + mConditions.isXTMEndBullish && + mConditions.isXTSCurrentOverFarest) + // + || + // + (mConditions.isXTMNeutural && + mConditions.isXAMABullish && + mConditions.isXTMEndBullish) + // + || + // + (mConditions.isXTMNeutural && + mConditions.isXAMABullish && + mConditions.isXTSCurrentMin && + mConditions.isXCHMASCTrendsDown && + mConditions.isXCHMAMCTrendsDown && + mConditions.isXCHMALCTrendsDown) + // + ) + // + ) + // + || + // + ((mConditions.isXCHMASCFastOverSlow || + mConditions.isXCHMASCFastCrossedOverSlow) && + ( + // + (mConditions.isXTMBullish && + mConditions.isXAMABullish && + mConditions.isXTDBullOverBear && + mConditions.isXTDSignalOverBear) + // + || + // + (mConditions.isXFIOverZero && + ( + // + (mConditions.isXCHMASCPeak && + mConditions.isXCHMAMCPeak && + mConditions.isXTSCurrentOverFarest) + // + || + // + (mConditions.isXCHMASCPeak && + mConditions.isXTSCurrentOverFarest && + mConditions.isXTSCurrentOverMediest) + // + ) + // + ) + // + ) + // + ) + // + || + // + (((mConditions.isXCHMASCFastOverSlow || + mConditions.isXCHMASCFastCrossedOverSlow) && + (mConditions.isXCHMALCFastOverSlow || + mConditions.isXCHMALCFastCrossedOverSlow)) && + ( + // + ((mConditions.isXTMBullish && + mConditions.isXAMABullish) && + ( + // + ((mConditions.isXCHMAMCPeak && + mConditions.isXCHMALCPeak) && + ( + // + ((mConditions.isXTMBullish && + mConditions.isXAMABullish) && + ( + // + (mConditions.isXCHLHSameHHs && + mConditions.isXTDBullOverBear && + mConditions.isXTSCurrentOverMediest && + mConditions.isXTDSignalCrossedOverBear) + // + ) + // + ) + // + ) + // + ) + // + || + // + ((mConditions.isXCHMASCPeak && + mConditions.isXCHMAMCPeak && + mConditions.isXCHMALCPeak) && + ( + // + (mConditions.isXTDBullOverBear && + mConditions.isXTDSignalOverBear) + // + || + // + (mConditions.isXCHLHSCMCHHSame && + mConditions.isXCHLHMCLCLLSame) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + || + // + (((mConditions.isXCHMASCFastOverSlow || + mConditions.isXCHMASCFastCrossedOverSlow) && + (mConditions.isXCHMAMCFastOverSlow || + mConditions.isXCHMAMCFastCrossedOverSlow)) && + ( + // + (mConditions.isXTMBullish && + mConditions.isXAMABullish && + mConditions.isXTDBullCrossedOverBear) + // + || + // + (mConditions.isXTSCurrentMax && + mConditions.isXTSCurrentOverFarest && + mConditions.isXTSCurrentOverNearest && + mConditions.isXTSCurrentOverMediest) + // + || + // + (mConditions.isXCHMASCTrendsUp && + mConditions.isXCHMAMCTrendsUp) + // + || + // + ((mConditions.isXTDBullOverBear && + mConditions.isXTDSignalOverBear) && + ( + // + (mConditions.isXCHMASCPeak && + mConditions.isXCHMAMCPeak) + // + ) + // + ) + // + ) + // + ) + // + || + // + (((mConditions.isXCHMASCFastOverSlow || + mConditions.isXCHMASCFastCrossedOverSlow) && + (mConditions.isXCHMAMCFastOverSlow || + mConditions.isXCHMAMCFastCrossedOverSlow) && + (mConditions.isXCHMALCFastOverSlow || + mConditions.isXCHMALCFastCrossedOverSlow)) && + ( + // + (mConditions.isXCHMASCPeak && + mConditions.isXCHMAMCPeak && + mConditions.isXCHMALCPeak && + mConditions.isXTMBullish && + mConditions.isXAMABullish && + mConditions.isXTDBullOverBear && + mConditions.isXTDSignalOverBear) + // + || + // + ((mConditions.isXCHMAMCPeak && + mConditions.isXCHMALCPeak) && + ( + // + (mConditions.isXCHMAMCTrendsUp && + mConditions.isXCHMALCTrendsUp) + // + || + // + (mConditions.isXTMBullish && + mConditions.isXAMABullish && + mConditions.isXTDBullOverBear && + mConditions.isXTDSignalOverBear && + mConditions.isXTSCurrentOverFarest) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + || + // + // PriceOverSignal ... + // Check If HH is Same In Length ... + ((mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + (((mConditions.isXCHMASCFastOverSlow || + mConditions.isXCHMASCFastCrossedOverSlow) && + (mConditions.isXCHMAMCFastOverSlow || + mConditions.isXCHMAMCFastCrossedOverSlow)) && + ( + // + (mConditions.isXCHMASCPeak && + mConditions.isXCHMASCTrendsUp && + mConditions.isXCHMAMCPeak && + mConditions.isXCHMAMCTrendsUp) + // + || + // + (mConditions.isXTMBullish && + mConditions.isXAMABullish && + mConditions.isXTDBullOverBear && + mConditions.isXTDSignalOverBear) + // + ) + // + ) + // + ) + // + ) + // + || + // + // PriceOverSignal ... + // Not Same LL or HH in Lenght ... + ((!mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + ((mConditions.isXCHMASCFastOverSlow || + mConditions.isXCHMASCFastCrossedOverSlow) && + ( + // + (mConditions.isXTMStartBullish && + mConditions.isXTDBullOverBear && + mConditions.isXAMAStartBullish && + mConditions.isXTDSignalOverBear) + // + ) + // + ) + // + || + // + (((mConditions.isXCHMASCFastOverSlow || + mConditions.isXCHMASCFastCrossedOverSlow) && + (mConditions.isXCHMAMCFastOverSlow || + mConditions.isXCHMAMCFastCrossedOverSlow)) && + ( + // + (mConditions.isXTMNeutural && + mConditions.isXAMABullish && + mConditions.isXFIOverZero && + mConditions.isXTSCurrentOverFarest && + mConditions.isXTSCurrentOverNearest) + // + || + // + (mConditions.isXCHMAMCPeak && + mConditions.isXCHMASCTrendsUp && + mConditions.isXCHMAMCTrendsUp) + // + ) + // + ) + // + || + // + (((mConditions.isXCHMASCFastOverSlow || + mConditions.isXCHMASCFastCrossedOverSlow) && + (mConditions.isXCHMAMCFastOverSlow || + mConditions.isXCHMAMCFastCrossedOverSlow) && + (mConditions.isXCHMALCFastOverSlow || + mConditions.isXCHMALCFastCrossedOverSlow)) && + ( + // + (mConditions.isXCHMASCPeak && + mConditions.isXCHMAMCPeak && + mConditions.isXCHMALCPeak && + mConditions.isXTMBullish && + mConditions.isXAMABullish && + mConditions.isXTDBullOverBear && + mConditions.isXTDSignalOverBear) + // + || + // + (mConditions.isXTMBullish && + mConditions.isXAMABullish && + mConditions.isXFIOverZero && + mConditions.isXCHLHSameHHs && + mConditions.isXTSCurrentMax && + mConditions.isXTDBullOverBear && + mConditions.isXTDSignalOverBear) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + || + // + // Check Conditions if Price is not has clear state ... + ( + // + ((!mConditions.isXLHPriceOverSignal && + !mConditions.isXLHPriceUnderSignal && + !mConditions.isXLHPriceInSignalRange && + !mConditions.isXLHPriceCrossedOverSignal && + !mConditions.isXLHPriceCrossedUnderSignal) && + ( + // + // Next Step is to Check LL and HH Same Style ... + // + // PriceFree ... + // Check if Both LL and HH Same In Length ... + ((mConditions.isXLHLLSameInLength && + mConditions.isXLHHHSameInLength) && + // + ( + // + false + // + ) + // + ) + // + || + // + // PriceFree ... + // Check If LL Same In Length ... + ((mConditions.isXLHLLSameInLength && + !mConditions.isXLHHHSameInLength) && + // + ( + // + false + // + ) + // + ) + // + || + // + // PriceFree ... + // Check If HH is Same In Length ... + ((mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + false + // + ) + // + ) + // + || + // + // PriceFree ... + // Not Same LL or HH in Lenght ... + ((!mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + false + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ; + + // + return result; +} + +// +// XCHMACC Long Signal Checking ... +bool XEU5XCHMACCHasLongSignal() +{ + // + bool result = false; + + // + // Validate Args ... + if (!xEU5MXCHMACCEnableSignaller || + !xEU5MXCHMACCAllowLongSignals) + { + return result; + } + + // + // Retrieve Market Condition ... + XMarketConditions mConditions = xEU5Provider.GetLastMarketCondition(); + + // + // Start Analysing Market based On Conditions ... + result = + // + // Base Condition: + xEU5Provider.XCHMACCHasLongConditions() + // + && + // + // Exceptions: + // there some commonly Exceptions which makes our choice incorrect, + // here we are combined knownly Exceptions ... + !( + // + // for Exception we used XLH Conditions as follow ... + // + // Check Conditions if Price In Signal Range ... + (mConditions.isXLHPriceInSignalRange && + // + ( + // + // Next Step is to Check LL and HH Same Style ... + // + // PriceInSignalRange ... + // Check if Both LL and HH Same In Length ... + ((mConditions.isXLHLLSameInLength && + mConditions.isXLHHHSameInLength) && + // + ( + // + ((mConditions.isXCHMAMCFastOverSlow || + mConditions.isXCHMAMCFastCrossedOverSlow) && + ( + // + (mConditions.isXCHMAMCTrendsDown && + ( + // + (mConditions.isXCHMALCPeak && + ( + // + (mConditions.isXTSCurrentMax && + mConditions.isXCHLHMCLCHHSame && + (mConditions.isXTSCurrentOverFarest || + mConditions.isXTDSignalCrossedUnderBear)) + // + || + // + (mConditions.isXTMBullish && + mConditions.isXAMANeutural && + mConditions.isXTDSignalVale && + mConditions.isXTDBullishVale && + mConditions.isXTMStartBullish && + mConditions.isXFICrossedUnderZero) + // + || + // + ( + (mConditions.isXTDBullUnderBear && + mConditions.isXTDSignalUnderBear) && + ( + // + (mConditions.isXTMBullish && + mConditions.isXCHLHMCLCHHSame && + mConditions.isXAMAStartBullish) + // + || + // + (mConditions.isXTMNeutural && + mConditions.isXAMANeutural && + mConditions.isXLHLLDecreased) + // + ) + // + ) + // + ) + // + ) + // + )) + // + || + // + (((mConditions.isXTMNeutural && + mConditions.isXTMEndBullish && + mConditions.isXFICrossedUnderZero) + // + || + // + (mConditions.isXTMBullish && + mConditions.isXAMABullish && + mConditions.isXTDBullOverBear)) + // + && + // + (mConditions.isXCHMALCPeak && + ( + // + mConditions.isXCHMALCTrendsDown + // + || + // + (mConditions.isXCHLHMCLCHHSame && + (mConditions.isXTDSignalUnderBear || + mConditions.isXTDSignalCrossedUnderBear)) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + || + // + // PriceInSignalRange ... + // Check If LL Same In Length ... + ((mConditions.isXLHLLSameInLength && + !mConditions.isXLHHHSameInLength) && + // + ( + // + false + // + ) + // + ) + // + || + // + // PriceInSignalRange ... + // Check If HH is Same In Length ... + ((mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + ((mConditions.isXCHMAMCFastOverSlow || + mConditions.isXCHMAMCFastCrossedOverSlow) && + ( + // + (mConditions.isXCHMAMCTrendsDown && + ( + // + (mConditions.isXTSCurrentMax && + mConditions.isXCHLHMCLCHHSame && + mConditions.isXTDSignalUnderBear) + // + ) + // + ) + // + || + // + (mConditions.isXTDBullOverBear && + mConditions.isXCHLHMCLCHHSame && + mConditions.isXTDSignalUnderBear && + mConditions.isXTSCurrentUnderFarest) + // + ) + // + ) + // + ) + // + ) + // + || + // + // PriceInSignalRange ... + // Not Same LL or HH in Lenght ... + ((!mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + false + // + ) + // + ) + // + ) + // + ) + // + || + // + // Check Conditions if Price is Under Signal ... + ( + // + ((mConditions.isXLHPriceUnderSignal || + mConditions.isXLHPriceCrossedUnderSignal) && + ( + // + // Next Step is to Check LL and HH Same Style ... + // + // PriceUnderSignal ... + // Check if Both LL and HH Same In Length ... + ((mConditions.isXLHLLSameInLength && + mConditions.isXLHHHSameInLength) && + // + ( + // + ((mConditions.isXCHMAMCFastOverSlow || + mConditions.isXCHMAMCFastCrossedOverSlow) && + ( + // + (mConditions.isXCHMAMCTrendsDown && + ( + // + (mConditions.isXCHMALCPeak && + ( + // + (mConditions.isXTDSignalUnderBear && + ( + // + (mConditions.isXAMAVale && + mConditions.isXAMABearish) + // + || + // + (mConditions.isXTMNeutural && + mConditions.isXAMAStartBearish && + mConditions.isXFICrossedUnderZero) + // + || + // + ((mConditions.isXAMANeutural || + mConditions.isXAMAEndBearish) && + mConditions.isXTMStartBullish && + mConditions.isXFICrossedOverZero) + // + || + // + (mConditions.isXCHLHMCLCHHSame && + mConditions.isXTMStartBullish && + mConditions.isXAMAStartBullish && + mConditions.isXTSCurrentUnderFarest) + // + ) + // + ) + // + || + // + (mConditions.isXAMAVale && + mConditions.isXAMANeutural && + mConditions.isXTSCurrentMax && + mConditions.isXTMStartBullish && + mConditions.isXCHLHMCLCHHSame && + mConditions.isXTDBullUnderBear) + // + ) + // + ) + // + || + // + ((mConditions.isXAMABearish && + (mConditions.isXTMNeutural || + mConditions.isXTMBearish)) && + mConditions.isXTSCurrentUnderMediest && + (mConditions.isXTDBullCrossedUnderBear || + (mConditions.isXTDBullUnderBear && + mConditions.isXFICrossedUnderZero))) + // + || + // + ((mConditions.isXTMBullish && + mConditions.isXAMABullish) && + mConditions.isXCHLHMCLCHHSame && + mConditions.isXTDSignalUnderBear && + mConditions.isXTSCurrentOverFarest && + mConditions.isXLHPriceCrossedUnderSignal) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + || + // + // PriceUnderSignal ... + // Check If LL Same In Length ... + ((mConditions.isXLHLLSameInLength && + !mConditions.isXLHHHSameInLength) && + // + ( + // + ((mConditions.isXCHMAMCFastOverSlow || + mConditions.isXCHMAMCFastCrossedOverSlow) && + ( + // + (mConditions.isXCHMAMCTrendsDown && + ( + // + (mConditions.isXCHMALCPeak && + ( + // + (mConditions.isXTSCurrentMax && + ( + // + (mConditions.isXAMABearish && + mConditions.isXTDBullCrossedOverBear) + // + || + // + (mConditions.isXTMStartBullish && + ( + // + ( + // + mConditions.isXAMAStartBullish + // + || + // + (mConditions.isXAMAEndBearish && + mConditions.isXTDSignalUnderBear) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + || + (mConditions.isXLHLLDecreased && + mConditions.isXTMStartBullish && + mConditions.isXCHLHSCMCLLSame && + mConditions.isXTDSignalUnderBear) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + || + // + // PriceUnderSignal ... + // Check If HH is Same In Length ... + ((mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + false + // + ) + // + ) + // + || + // + // PriceUnderSignal ... + // Not Same LL or HH in Lenght ... + ((!mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + false + // + ) + // + ) + // + ) + // + ) + // + ) + // + || + // + // Check Conditions if Price is Over Signal ... + ( + // + ((mConditions.isXLHPriceOverSignal || + mConditions.isXLHPriceCrossedOverSignal) && + ( + // + // Next Step is to Check LL and HH Same Style ... + // + // PriceOverSignal ... + // Check if Both LL and HH Same In Length ... + ((mConditions.isXLHLLSameInLength && + mConditions.isXLHHHSameInLength) && + // + ( + // + ((mConditions.isXCHMASCFastOverSlow || + mConditions.isXCHMASCFastCrossedOverSlow) && + ( + // + (mConditions.isXTMEndBullish && + mConditions.isXAMAEndBullish) + // + || + // + (mConditions.isXTSCurrentMax && + (mConditions.isXTMBullish || + mConditions.isXTMStartBullish) && + (mConditions.isXAMABullish || + mConditions.isXAMAStartBullish) && + mConditions.isXCHMAMCTrendsDown && + mConditions.isXTDSignalUnderBear) + // + || + // + ((mConditions.isXTMBullish && + mConditions.isXAMABullish) && + ( + // + mConditions.isXTDBearishVale + // + || + // + mConditions.isXRSICrossedOverLongExit + // + || + // + (mConditions.isXCHMASCPeak && + mConditions.isXCHLHMCLCLLSame) + // + || + // + (mConditions.isXTDSignalUnderBear && + ( + // + (mConditions.isXTSCurrentMax && + mConditions.isXCHLHMCLCHHSame) + // + || + // + (mConditions.isXCHMALCPeak && + mConditions.isXTSCurrentUnderFarest) + // + ) + // + ) + // + ) + // + ) + // + || + // + (mConditions.isXCHMASCTrendsDown && + ( + // + (mConditions.isXCHMALCPeak && + mConditions.isXTDBullUnderBear && + mConditions.isXTDSignalUnderBear) + // + || + // + ((mConditions.isXTMBullish && + mConditions.isXAMABullish) && + ( + // + (mConditions.isXTSCurrentMax && + mConditions.isXCHLHMCLCHHSame) + // + || + // + (mConditions.isXCHMASCVale && + mConditions.isXFIUnderZero && + mConditions.isXTDBullUnderBear && + mConditions.isXTDSignalUnderBear) + // + ) + // + ) + // + || + // + (mConditions.isXTMNeutural && + mConditions.isXAMANeutural && + mConditions.isXTSCurrentMax && + mConditions.isXCHLHMCLCHHSame && + mConditions.isXLHPriceCrossedOverSignal) + // + ) + // + ) + // + || + // + (mConditions.isXTSCurrentMax && + mConditions.isXTDBearishVale && + mConditions.isXCHLHSCMCHHSame && + mConditions.isXCHLHMCLCLLSame && + (mConditions.isXCHMAMCPeak && + mConditions.isXCHMAMCTrendsDown)) + // + ) + // + ) + // + || + // + ((mConditions.isXCHMALCFastOverSlow || + mConditions.isXCHMALCFastCrossedOverSlow) && + ( + // + (mConditions.isXCHMALCPeak && + ( + // + ( + // + mConditions.isXCHMALCTrendsDown + // + || + // + ((mConditions.isXTMBullish && + mConditions.isXAMABullish) && + ( + // + ( + mConditions.isXTDSignalUnderBear && + ( + // + mConditions.isXTSAllSame + // + || + // + ((mConditions.isXTSCurrentUnderNearest || + mConditions.isXTSCurrentCrossedUnderNearest)) + // + ) + // + ) + // + || + // + (mConditions.isXTSCurrentMax && + mConditions.isXCHMALCTrendsUp && + mConditions.isXTDSignalUnderBear && + mConditions.isXTSCurrentOverFarest && + mConditions.isXTSCurrentOverNearest && + mConditions.isXTSCurrentOverMediest) + // + || + // + (mConditions.isXTDBullOverBear && + mConditions.isXTDSignalUnderBear && + mConditions.isXLHPriceCrossedOverSignal && + (mConditions.isXCHMAMCTrendsDown && + (mConditions.isXCHMAMCFastOverSlow || + mConditions.isXCHMAMCFastCrossedOverSlow))) + // + || + // + (mConditions.isXTSCurrentMax && + mConditions.isXTDBullOverBear && + mConditions.isXTDSignalOverBear && + mConditions.isXCHMAMCTrendsDown) + // + ) + // + ) + // + ) + // + ) + // + ) + // + || + // + (mConditions.isXTMBullish && + mConditions.isXAMABullish && + mConditions.isXTSCurrentMax && + mConditions.isXCHLHSCMCHHSame && + mConditions.isXLHHighAttachedHH) + // + ) + // + ) + // + ) + // + ) + // + || + // + // PriceOverSignal ... + // Check If LL Same In Length ... + ((mConditions.isXLHLLSameInLength && + !mConditions.isXLHHHSameInLength) && + // + ( + // + ((mConditions.isXCHMALCPeak && + (mConditions.isXCHMALCFastOverSlow || + mConditions.isXCHMALCFastCrossedOverSlow)) && + ( + // + (mConditions.isXCHMALCTrendsDown && + ( + // + ((mConditions.isXTMBullish && + mConditions.isXAMABullish) && + ( + // + (mConditions.isXTSCurrentMax && + mConditions.isXTDSignalUnderBear) + // + || + // + (mConditions.isXCHLHSCMCHHSame && + mConditions.isXLHHighAttachedHH) + // + ) + // + ) + // + ) + // + ) + // + || + // + (mConditions.isXTMBullish && + mConditions.isXAMABullish && + mConditions.isXCHLHSameHHs && + mConditions.isXTDSignalUnderBear && + mConditions.isXTSCurrentUnderNearest) + // + || + // + ( + (mConditions.isXAMABullish && + mConditions.isXCHLHSCMCHHSame && + mConditions.isXLHHighAttachedHH) && + ( + // + (mConditions.isXTMNeutural && + mConditions.isXTMEndBullish && + mConditions.isXTDSignalUnderBear) + // + || + // + ((mConditions.isXTMBullish && + mConditions.isXTSCurrentMax) && + ( + // + (mConditions.isXTDBullOverBear && + mConditions.isXTDSignalUnderBear) + // + || + // + (mConditions.isXTDBullCrossedOverBear && + mConditions.isXLHPriceCrossedOverSignal) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + || + // + ((mConditions.isXCHMAMCFastOverSlow || + mConditions.isXCHMAMCFastCrossedOverSlow) && + ( + // + ( + (mConditions.isXCHMAMCTrendsDown && + ( + // + (mConditions.isXTMBullish && + mConditions.isXAMABullish) + // + || + (mConditions.isXLHLLDecreased && + mConditions.isXCHMAMCTrendsDown && + mConditions.isXTDSignalUnderBear) + // + || + // + (mConditions.isXCHMAMCPeak && + ( + // + (mConditions.isXTDBearishVale && + mConditions.isXCHLHSCMCHHSame && + mConditions.isXCHLHMCLCLLSame) + // + ) + // + ) + // + )) + // + || + // + (mConditions.isXCHMASCPeak && + mConditions.isXCHLHSameHHs && + (mConditions.isXTSCurrentUnderNearest || + mConditions.isXTSCurrentCrossedUnderNearest) && + (mConditions.isXTSCurrentUnderMediest || + mConditions.isXTSCurrentCrossedUnderMediest)) + // + || + // + (mConditions.isXCHMAMCPeak && + mConditions.isXTSCurrentMax && + mConditions.isXTMStartBullish && + mConditions.isXCHLHSCMCHHSame && + mConditions.isXLHHighAttachedHH && + mConditions.isXTDSignalCrossedOverBear) + // + ) + // + ) + // + ) + // + ) + // + ) + // + || + // + // PriceOverSignal ... + // Check If HH is Same In Length ... + ((mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + ((mConditions.isXCHMALCFastOverSlow || + mConditions.isXCHMALCFastCrossedOverSlow) && + ( + // + (mConditions.isXCHMAMCTrendsDown && + ( + // + (mConditions.isXCHMALCPeak && + mConditions.isXTMNeutural && + mConditions.isXTMEndBullish && + mConditions.isXCHLHMCLCHHSame && + mConditions.isXTDBullUnderBear && + mConditions.isXTDSignalUnderBear) + // + ) + // + ) + // + || + // + (mConditions.isXCHMALCTrendsDown && + ( + // + (((mConditions.isXTMBullish && + mConditions.isXAMABullish && + mConditions.isXTSCurrentMax) && + ( + // + mConditions.isXCHLHMCLCHHSame + // + || + // + (mConditions.isXTDSignalUnderBear && + mConditions.isXCHMALCPeak) + // + || + // + (mConditions.isXTDSignalUnderBear && + mConditions.isXFICrossedOverZero) + // + ) + // + ) + // + ) + // + || + // + (mConditions.isXTMNeutural && + mConditions.isXCHMAMCPeak && + mConditions.isXTMEndBullish && + mConditions.isXCHLHMCLCHHSame && + mConditions.isXTSCurrentUnderNearest) + // + ) + // + ) + // + || + // + (mConditions.isXTMBullish && + mConditions.isXAMABullish && + mConditions.isXCHMALCPeak && + mConditions.isXCHLHMCLCHHSame && + mConditions.isXTDSignalUnderBear) + // + ) + // + ) + // + ) + // + ) + // + || + // + // PriceOverSignal ... + // Not Same LL or HH in Lenght ... + ((!mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + ((mConditions.isXCHMAMCFastOverSlow || + mConditions.isXCHMAMCFastCrossedOverSlow) && + ( + // + (mConditions.isXCHMAMCTrendsDown && + ( + // + ((mConditions.isXTMBullish && + mConditions.isXAMABullish && + mConditions.isXCHLHSCMCHHSame) && + ( + // + mConditions.isXTSCurrentUnderNearest + // + || + // + (mConditions.isXLHLLIncreased && + mConditions.isXTDBullUnderBear && + mConditions.isXLHHighAttachedHH && + mConditions.isXTDSignalUnderBear && + mConditions.isXFICrossedUnderZero) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + || + // + ((mConditions.isXCHMALCFastOverSlow || + mConditions.isXCHMALCFastCrossedOverSlow) && + ( + // + (mConditions.isXCHMALCTrendsDown && + ( + // + (mConditions.isXCHMALCPeak && + ( + // + (mConditions.isXCHLHSameHHs && + mConditions.isXTSCurrentMax && + mConditions.isXTDSignalUnderBear) + // + ) + // + ) + // + ) + // + ) + // + || + // + ((mConditions.isXTMBullish && + mConditions.isXAMABullish && + (mConditions.isXTSCurrentMin || + mConditions.isXTSCurrentMax)) && + ( + // + (mConditions.isXCHMALCPeak && + mConditions.isXCHLHSameHHs && + mConditions.isXTDSignalUnderBear) + // + || + // + (mConditions.isXLHLLIncreased && + mConditions.isXCHLHSCMCHHSame && + mConditions.isXTDBullUnderBear && + mConditions.isXLHHighAttachedHH && + mConditions.isXTDSignalUnderBear) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + || + // + // Check Conditions if Price is not has clear state ... + ( + // + ((!mConditions.isXLHPriceOverSignal && + !mConditions.isXLHPriceUnderSignal && + !mConditions.isXLHPriceInSignalRange && + !mConditions.isXLHPriceCrossedOverSignal && + !mConditions.isXLHPriceCrossedUnderSignal) && + ( + // + // Next Step is to Check LL and HH Same Style ... + // + // PriceFree ... + // Check if Both LL and HH Same In Length ... + ((mConditions.isXLHLLSameInLength && + mConditions.isXLHHHSameInLength) && + // + ( + // + false + // + ) + // + ) + // + || + // + // PriceFree ... + // Check If LL Same In Length ... + ((mConditions.isXLHLLSameInLength && + !mConditions.isXLHHHSameInLength) && + // + ( + // + false + // + ) + // + ) + // + || + // + // PriceFree ... + // Check If HH is Same In Length ... + ((mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + false + // + ) + // + ) + // + || + // + // PriceFree ... + // Not Same LL or HH in Lenght ... + ((!mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + false + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ; + + // + return result; +} + +// +// XCHMACC Short Signal Checking ... +bool XEU5XCHMACCHasShortSignal() +{ + // + bool result = false; + + // + // Validate Args ... + if (!xEU5MXCHMACCEnableSignaller || + !xEU5MXCHMACCAllowShortSignals) + { + return result; + } + + // + // Retrieve Market Condition ... + XMarketConditions mConditions = xEU5Provider.GetLastMarketCondition(); + + // + // Start Analysing Market based On Conditions ... + result = + // + // Base Condition: + xEU5Provider.XCHMACCHasShortConditions() + // + && + // + // Exceptions: + // there some commonly Exceptions which makes our choice incorrect, + // here we are combined knownly Exceptions ... + !( + // + // for Exception we used XLH Conditions as follow ... + // + // Check Conditions if Price In Signal Range ... + (mConditions.isXLHPriceInSignalRange && + // + ( + // + // Next Step is to Check LL and HH Same Style ... + // + // PriceInSignalRange ... + // Check if Both LL and HH Same In Length ... + ((mConditions.isXLHLLSameInLength && + mConditions.isXLHHHSameInLength) && + // + ( + // + (mConditions.isXTDBullOverBear && + ( + // + (mConditions.isXAMANeutural && + mConditions.isXTMStartBullish && + mConditions.isXTDSignalOverBear && + mConditions.isXTSCurrentOverFarest) + // + || + // + ((mConditions.isXFIOverZero && + mConditions.isXTSCurrentOverNearest && + mConditions.isXTSCurrentOverMediest) && + ( + // + (mConditions.isXAMAStartBearish && + mConditions.isXFICrossedOverZero) + // + || + // + (mConditions.isXTMNeutural && + mConditions.isXAMABullish && + mConditions.isXAMAStartBullish) + // + ) + // + ) + // + ) + // + ) + // + || + // + ((mConditions.isXCHMALCVale && + (mConditions.isXCHMALCFastUnderSlow || + mConditions.isXCHMALCFastCrossedUnderSlow)) && + ( + // + // + ((mConditions.isXTDBullUnderBear && + mConditions.isXTDSignalUnderBear) && + ( + // + (mConditions.isXTMBearish && + mConditions.isXLHLLIncreased && + mConditions.isXAMAStartBearish && + mConditions.isXTSCurrentOverNearest) + // + || + // + (((mConditions.isXTMNeutural || + mConditions.isXTMEndBearish) && + (mConditions.isXAMANeutural || + mConditions.isXAMAEndBullish)) && + ( + // + (mConditions.isXTSCurrentMax && + mConditions.isXTSCurrentOverFarest) + // + || + // + (mConditions.isXTSAllSame && + mConditions.isXCHMAMCTrendsDown) + // + ) + // + ) + // + || + // + (mConditions.isXTMBearish && + mConditions.isXAMABearish && + mConditions.isXTSCurrentMin && + mConditions.isXCHMALCTrendsUp && + mConditions.isXTSCurrentUnderFarest && + mConditions.isXTSCurrentUnderNearest && + mConditions.isXTSCurrentUnderMediest) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + || + // + // PriceInSignalRange ... + // Check If LL Same In Length ... + ((mConditions.isXLHLLSameInLength && + !mConditions.isXLHHHSameInLength) && + // + ( + // + ((mConditions.isXCHMALCFastUnderSlow || + mConditions.isXCHMALCFastCrossedUnderSlow) && + ( + // + (mConditions.isXCHMALCVale && + ( + // + ((mConditions.isXTMEndBearish || + mConditions.isXTMNeutural) && + (mConditions.isXAMABearish || + mConditions.isXAMANeutural) && + mConditions.isXFIOverZero && + mConditions.isXTDBullOverBear && + mConditions.isXFICrossedOverZero && + mConditions.isXTSCurrentOverFarest) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + || + // + // PriceInSignalRange ... + // Check If HH is Same In Length ... + ((mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + (mConditions.isXAMANeutural && + mConditions.isXTMStartBearish && + mConditions.isXCHMAMCTrendsDown && + mConditions.isXTSCurrentOverMediest) + // + || + // + (mConditions.isXCHMALCVale && + ( + // + ((mConditions.isXCHMALCFastUnderSlow || + mConditions.isXCHMALCFastCrossedUnderSlow) && + ( + // + (mConditions.isXAMANeutural && + mConditions.isXTMStartBearish && + mConditions.isXTDBullUnderBear && + mConditions.isXTDSignalUnderBear && + mConditions.isXTSCurrentOverMediest) + // + || + // + ((mConditions.isXTMNeutural || + mConditions.isXTMEndBearish) && + (mConditions.isXAMANeutural || + mConditions.isXAMAEndBearish) && + mConditions.isXLHHHIncreased && + mConditions.isXTDBullOverBear && + mConditions.isXTSCurrentOverFarest) + // + || + // + ((mConditions.isXTMNeutural && + mConditions.isXAMABearish && + mConditions.isXTMEndBearish && + mConditions.isXTDBullOverBear) && + ( + // + mConditions.isXCHLHSCMCLLSame + // + || + // + (mConditions.isXFIOverZero && + mConditions.isXFICrossedOverZero && + mConditions.isXTSCurrentOverFarest && + mConditions.isXTSCurrentCrossedOverFarest) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + || + // + // PriceInSignalRange ... + // Not Same LL or HH in Lenght ... + ((!mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + false + // + ) + // + ) + // + ) + // + ) + // + || + // + // Check Conditions if Price is Under Signal ... + ( + // + ((mConditions.isXLHPriceUnderSignal || + mConditions.isXLHPriceCrossedUnderSignal) && + ( + // + // Next Step is to Check LL and HH Same Style ... + // + // PriceUnderSignal ... + // Check if Both LL and HH Same In Length ... + ((mConditions.isXLHLLSameInLength && + mConditions.isXLHHHSameInLength) && + // + ( + // + (mConditions.isXTMBearish && + mConditions.isXAMABearish && + mConditions.isXTSCurrentMin && + mConditions.isXTDBullOverBear && + mConditions.isXAMAStartBearish && + mConditions.isXTDSignalUnderBear) + // + || + // + ((mConditions.isXTMBearish && + mConditions.isXAMABearish && + mConditions.isXTDBullUnderBear && + mConditions.isXTDSignalUnderBear) && + ( + // + (mConditions.isXTSCurrentMax && + mConditions.isXTSCurrentOverFarest) + // + || + // + (mConditions.isXTSCurrentMin && + mConditions.isXCHMASCUnderMin) + // + ) + // + ) + // + || + // + ((mConditions.isXTMStartBearish && + mConditions.isXTDBullOverBear && + mConditions.isXAMAStartBearish) && + ( + // + (mConditions.isXTSCurrentMin && + mConditions.isXTDSignalUnderBear) + // + || + // + (mConditions.isXTSCurrentOverFarest && + mConditions.isXLHPriceCrossedUnderSignal) + // + ) + // + ) + // + || + // + ((mConditions.isXCHMALCVale && + (mConditions.isXCHMALCFastUnderSlow || + mConditions.isXCHMALCFastCrossedUnderSlow)) && + ( + // + mConditions.isXCHMALCTrendsDown + // + || + // + (mConditions.isXTMBearish && + mConditions.isXAMABearish && + mConditions.isXFIOverZero && + mConditions.isXFICrossedOverZero) + // + || + // + ((mConditions.isXTMBearish && + mConditions.isXAMABearish && + mConditions.isXTSCurrentMin) && + ( + // + (mConditions.isXFICrossedUnderZero && + mConditions.isXTDBullCrossedUnderBear) + // + || + // + (mConditions.isXCHMALCTrendsUp && + mConditions.isXTSCurrentUnderFarest && + mConditions.isXTSCurrentUnderNearest && + mConditions.isXTSCurrentUnderMediest) + // + || + // + (mConditions.isXTDBullOverBear && + mConditions.isXCHLHMCLCLLSame && + mConditions.isXFICrossedUnderZero && + mConditions.isXLHPriceCrossedUnderSignal) + // + ) + // + ) + // + ) + // + ) + // + || + // + ((mConditions.isXCHMAMCTrendsDown && + (mConditions.isXCHMAMCFastUnderSlow || + mConditions.isXCHMAMCFastCrossedUnderSlow)) && + ( + // + (mConditions.isXCHMALCVale && + mConditions.isXTSCurrentOverNearest) + // + ) + // + ) + // + ) + // + ) + // + || + // + // PriceUnderSignal ... + // Check If LL Same In Length ... + ((mConditions.isXLHLLSameInLength && + !mConditions.isXLHHHSameInLength) && + // + ( + // + ((mConditions.isXCHMASCFastUnderSlow || + mConditions.isXCHMASCFastCrossedUnderSlow) && + ( + // + (mConditions.isXCHMALCVale && + mConditions.isXCHMASCTrendsDown && + mConditions.isXTSCurrentOverNearest) + // + || + // + (mConditions.isXCHMALCVale && + (mConditions.isXTSCurrentOverNearest || + mConditions.isXTSCurrentCrossedOverNearest) && + (mConditions.isXTSCurrentOverFarest || + mConditions.isXTSCurrentCrossedOverFarest)) + // + ) + // + ) + // + ) + // + ) + // + || + // + // PriceUnderSignal ... + // Check If HH is Same In Length ... + ((mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + ((mConditions.isXTMBearish && + mConditions.isXAMABearish && + mConditions.isXTSCurrentMin) && + ( + // + ((mConditions.isXTDBullUnderBear && + mConditions.isXTDSignalUnderBear) && + ( + // + (mConditions.isXCHMALCVale && + mConditions.isXCHMALCTrendsUp) + // + || + // + ((mConditions.isXTSCurrentUnderFarest && + mConditions.isXTSCurrentUnderNearest && + mConditions.isXTSCurrentUnderMediest) && + ( + // + (mConditions.isXTMVale && + mConditions.isXAMAVale && + mConditions.isXCHMASCVale) + // + || + // + ((mConditions.isXCHLHSameLLs && + mConditions.isXLHHHIncreased && + mConditions.isXLHLowAttachedLL) && + ( + // + mConditions.isXCHMAMCTrendsDown + // + || + // + mConditions.isXCHMASCCrossedUnderMin + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + || + // + ((mConditions.isXCHMALCVale && + mConditions.isXTDBullCrossedUnderBear) && + ( + // + (mConditions.isXCHLHSCMCLLSame && + mConditions.isXLHLowAttachedLL) + // + || + // + (mConditions.isXCHLHMCLCHHSame && + mConditions.isXCHMALCTrendsDown && + mConditions.isXTSCurrentUnderFarest && + mConditions.isXTSCurrentUnderMediest) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + || + // + // PriceUnderSignal ... + // Not Same LL or HH in Lenght ... + ((!mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + (mConditions.isXTMBearish && + mConditions.isXAMABearish && + mConditions.isXCHMAMCVale && + mConditions.isXTSCurrentMin && + mConditions.isXCHLHSCMCLLSame && + mConditions.isXTDBullUnderBear && + mConditions.isXTDSignalUnderBear) + // + || + // + ((mConditions.isXCHMALCFastUnderSlow || + mConditions.isXCHMALCFastCrossedUnderSlow) && + ( + // + ((mConditions.isXAMABearish && + mConditions.isXTDBullUnderBear && + mConditions.isXTDSignalUnderBear) && + ( + // + (mConditions.isXTMEndBearish && + mConditions.isXTSCurrentOverNearest && + mConditions.isXTSCurrentOverMediest) + // + || + // + (mConditions.isXTMNeutural && + mConditions.isXTSCurrentMin && + mConditions.isXCHLHSCMCLLSame && + mConditions.isXCHMAMCTrendsDown && + mConditions.isXTSCurrentUnderFarest && + mConditions.isXTSCurrentUnderNearest && + mConditions.isXTSCurrentUnderMediest) + // + ) + // + ) + // + || + // + ((mConditions.isXTMBearish && + mConditions.isXAMABearish) && + ( + // + (mConditions.isXCHMALCVale && + mConditions.isXTDBullOverBear && + mConditions.isXTSCurrentOverNearest) + // + || + // + (mConditions.isXTDBullUnderBear && + mConditions.isXTDSignalUnderBear && + mConditions.isXTSCurrentOverMediest) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + || + // + // Check Conditions if Price is Over Signal ... + ( + // + ((mConditions.isXLHPriceOverSignal || + mConditions.isXLHPriceCrossedOverSignal) && + ( + // + // Next Step is to Check LL and HH Same Style ... + // + // PriceOverSignal ... + // Check if Both LL and HH Same In Length ... + ((mConditions.isXLHLLSameInLength && + mConditions.isXLHHHSameInLength) && + // + ( + // + ((mConditions.isXCHMALCVale && + (mConditions.isXCHMALCFastUnderSlow || + mConditions.isXCHMALCFastCrossedUnderSlow)) && + ( + // + ((mConditions.isXTMNeutural && + mConditions.isXAMANeutural) && + ( + // + (mConditions.isXCHMAMCTrendsDown && + mConditions.isXTSCurrentOverMediest) + // + || + // + (mConditions.isXFIUnderZero && + mConditions.isXTSCurrentMin && + mConditions.isXTDBullUnderBear && + mConditions.isXCHMAMCTrendsDown && + mConditions.isXTDSignalUnderBear && + mConditions.isXTSCurrentUnderFarest && + mConditions.isXTSCurrentUnderNearest && + mConditions.isXTSCurrentUnderMediest && + mConditions.isXTSCurrentCrossedUnderFarest && + mConditions.isXTSCurrentCrossedUnderNearest && + mConditions.isXTSCurrentCrossedUnderMediest) + // + ) + // + ) + // + || + // + (mConditions.isXTSCurrentOverFarest && + ( + // + (mConditions.isXTMNeutural && + mConditions.isXAMABullish && + mConditions.isXCHLHMCLCLLSame) + // + || + // + (mConditions.isXTMEndBearish && + mConditions.isXAMAEndBearish && + mConditions.isXTDBullOverBear) + // + || + // + (mConditions.isXTMNeutural && + mConditions.isXAMANeutural && + mConditions.isXTSCurrentMax) + // + || + // + (mConditions.isXTMBearish && + mConditions.isXAMANeutural && + mConditions.isXTDBullUnderBear && + mConditions.isXTDSignalUnderBear) + // + || + // + (mConditions.isXFIOverZero && + mConditions.isXTMStartBullish && + mConditions.isXTDBullOverBear && + mConditions.isXAMAStartBullish && + mConditions.isXTSCurrentOverNearest) + // + ) + // + ) + // + || + // + ((mConditions.isXTDSignalVale && + mConditions.isXTSCurrentMin && + mConditions.isXTDBullishVale && + mConditions.isXTSCurrentUnderFarest && + mConditions.isXTSCurrentUnderNearest && + mConditions.isXTSCurrentUnderMediest) && + ( + // + (mConditions.isXTMBearish && + mConditions.isXAMANeutural) + // + ) + // + ) + // + || + // + (mConditions.isXTMBearish && + mConditions.isXAMANeutural && + mConditions.isXTDSignalVale && + mConditions.isXTDBullishVale && + mConditions.isXCHMAMCTrendsDown && + mConditions.isXTSCurrentOverFarest) + // + || + // + (mConditions.isXTMNeutural && + mConditions.isXAMABullish && + mConditions.isXTSCurrentMin && + mConditions.isXCHMASCOverMin && + mConditions.isXCHLHMCLCLLSame && + mConditions.isXCHMASCUnderMax && + mConditions.isXTDBullUnderBear && + mConditions.isXTDSignalUnderBear && + mConditions.isXTSCurrentUnderFarest && + mConditions.isXTSCurrentUnderMediest) + // + ) + // + ) + // + || + // + (mConditions.isXTMNeutural && + mConditions.isXAMANeutural && + mConditions.isXTSCurrentMax && + mConditions.isXTDBullOverBear && + mConditions.isXTSCurrentOverFarest) + // + || + // + (mConditions.isXCHMAMCPeak && + mConditions.isXCHMALCVale && + mConditions.isXAMANeutural && + mConditions.isXLHHHIncreased && + mConditions.isXTDBullOverBear && + mConditions.isXTSCurrentOverFarest && + mConditions.isXTSCurrentOverNearest) + // + || + // + ((mConditions.isXTMNeutural || + mConditions.isXTMEndBearish) && + (mConditions.isXAMANeutural || + mConditions.isXAMAEndBearish) && + mConditions.isXFIOverZero && + mConditions.isXTDBullOverBear && + mConditions.isXFICrossedOverZero && + mConditions.isXTSCurrentOverNearest) + // + ) + // + ) + // + || + // + // PriceOverSignal ... + // Check If LL Same In Length ... + ((mConditions.isXLHLLSameInLength && + !mConditions.isXLHHHSameInLength) && + // + ( + // + (mConditions.isXTMNeutural && + mConditions.isXAMANeutural && + mConditions.isXFIOverZero && + mConditions.isXTSCurrentMax && + mConditions.isXTDBullOverBear && + mConditions.isXTSCurrentOverFarest) + // + ) + // + ) + // + || + // + // PriceOverSignal ... + // Check If HH is Same In Length ... + ((mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + ((mConditions.isXCHMALCVale && + mConditions.isXTSCurrentMin) && + ( + // + (mConditions.isXTMVale && + mConditions.isXAMAVale) + // + || + // + (mConditions.isXTMBearish && + mConditions.isXTDSignalVale && + mConditions.isXTDBullishVale && + mConditions.isXLHLLIncreased && + mConditions.isXCHMALCTrendsUp && + mConditions.isXAMAStartBearish) + // + || + // + ((mConditions.isXCHMALCFastUnderSlow || + mConditions.isXCHMALCFastCrossedUnderSlow) && + ( + // + (mConditions.isXAMANeutural && + mConditions.isXTDSignalVale && + mConditions.isXTDBullishVale && + mConditions.isXLHLLIncreased && + mConditions.isXTSCurrentUnderFarest && + mConditions.isXTSCurrentUnderNearest && + mConditions.isXTSCurrentUnderMediest) + // + || + // + (mConditions.isXAMANeutural && + mConditions.isXTSCurrentMin && + mConditions.isXAMAEndBullish && + mConditions.isXTMStartBearish && + mConditions.isXTDBullOverBear && + mConditions.isXCHMAMCTrendsDown) + // + || + // + (mConditions.isXAMAVale && + mConditions.isXCHMALCVale && + mConditions.isXTSCurrentMin && + mConditions.isXTDBullUnderBear && + mConditions.isXCHMALCTrendsDown && + mConditions.isXTDSignalUnderBear && + mConditions.isXTSCurrentUnderFarest && + mConditions.isXTSCurrentUnderNearest && + mConditions.isXTSCurrentUnderMediest) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + || + // + // PriceOverSignal ... + // Not Same LL or HH in Lenght ... + ((!mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + false + // + ) + // + ) + // + ) + // + ) + // + ) + // + || + // + // Check Conditions if Price is not has clear state ... + ( + // + ((!mConditions.isXLHPriceOverSignal && + !mConditions.isXLHPriceUnderSignal && + !mConditions.isXLHPriceInSignalRange && + !mConditions.isXLHPriceCrossedOverSignal && + !mConditions.isXLHPriceCrossedUnderSignal) && + ( + // + // Next Step is to Check LL and HH Same Style ... + // + // PriceFree ... + // Check if Both LL and HH Same In Length ... + ((mConditions.isXLHLLSameInLength && + mConditions.isXLHHHSameInLength) && + // + ( + // + false + // + ) + // + ) + // + || + // + // PriceFree ... + // Check If LL Same In Length ... + ((mConditions.isXLHLLSameInLength && + !mConditions.isXLHHHSameInLength) && + // + ( + // + false + // + ) + // + ) + // + || + // + // PriceFree ... + // Check If HH is Same In Length ... + ((mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + false + // + ) + // + ) + // + || + // + // PriceFree ... + // Not Same LL or HH in Lenght ... + ((!mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + false + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ; + + // + return result; +} + +// +// XCHMAMN Long Signal Checking ... +bool XEU5XCHMAMNHasLongSignal() +{ + // + bool result = false; + + // + // Validate Args ... + if (!xEU5MXCHMAMNEnableSignaller || + !xEU5MXCHMAMNAllowLongSignals) + { + return result; + } + + // + ENUM_XCHMA_CYCLES cycles[]; + Add( + X_XCHMA_CYCLE_MEDIUM, + cycles); + Add( + X_XCHMA_CYCLE_LONG, + cycles); + + // + double xCHMANonSCMax2 = XCHMAGetCyclesMaxValue(2, cycles); + double xCHMANonSCMin2 = XCHMAGetCyclesMinValue(2, cycles); + + // + // Retrieve Market Condition ... + XMarketConditions mConditions = xEU5Provider.GetLastMarketCondition(); + + // + // Start Analysing Market based On Conditions ... + result = + // + // Base Condition: + xEU5Provider.XCHMAMNHasLongConditions() + // + && + // + // Exceptions: + // there some commonly Exceptions which makes our choice incorrect, + // here we are combined knownly Exceptions ... + !( + // + // for Exception we used XLH Conditions as follow ... + // + // Check Conditions if Price In Signal Range ... + (mConditions.isXLHPriceInSignalRange && + // + ( + // + // Next Step is to Check LL and HH Same Style ... + // + // PriceInSignalRange ... + // Check if Both LL and HH Same In Length ... + ((mConditions.isXLHLLSameInLength && + mConditions.isXLHHHSameInLength) && + // + ( + // + ((mConditions.isXCHMASCTrendsDown && + mConditions.isXCHMAMCTrendsDown) && + ( + // + ( + // + (mConditions.isXCHMALCVale && + mConditions.isXAMANeutural) + // + || + // + (mConditions.isXTDBullUnderBear && + mConditions.isXTDSignalUnderBear) + // + ) + // + ) + // + ) + // + || + // + ((mConditions.isXCHMASCTrendsDown && + mConditions.isXCHMALCTrendsDown) && + ( + // + (mConditions.isXTMBullish && + mConditions.isXAMABullish && + mConditions.isXCHMAMCVale && + mConditions.isXCHLHMCLCLLSame) + // + || + // + (mConditions.isXAMANeutural && + mConditions.isXLHHHDecreased && + mConditions.isXLHLLDecreased && + mConditions.isXTMStartBullish && + mConditions.isXTDBullUnderBear && + mConditions.isXTDSignalUnderBear) + // + || + // + (mConditions.isXTMNeutural && + mConditions.isXAMANeutural && + mConditions.isXLHHHDecreased && + mConditions.isXLHLLDecreased && + mConditions.isXTDBullUnderBear && + mConditions.isXTDSignalUnderBear) + // + ) + // + ) + // + ) + // + ) + // + || + // + // PriceInSignalRange ... + // Check If LL Same In Length ... + ((mConditions.isXLHLLSameInLength && + !mConditions.isXLHHHSameInLength) && + // + ( + // + (mConditions.isXCHMASCTrendsDown && + mConditions.isXCHMAMCTrendsDown && + mConditions.isXCHMALCTrendsDown) + // + ) + // + ) + // + || + // + // PriceInSignalRange ... + // Check If HH is Same In Length ... + ((mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + false + // + ) + // + ) + // + || + // + // PriceInSignalRange ... + // Not Same LL or HH in Lenght ... + ((!mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + ((mConditions.isXCHMASCTrendsDown && + mConditions.isXCHMALCTrendsDown) && + ( + // + (((mConditions.isXTMVale || + mConditions.isXTMNeutural) && + mConditions.isXTMEndBearish) && + (mConditions.isXAMANeutural || + mConditions.isXAMAEndBearish) && + mConditions.isXTDBullUnderBear && + mConditions.isXTDSignalUnderBear) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + || + // + // Check Conditions if Price is Under Signal ... + ( + // + ((mConditions.isXLHPriceUnderSignal || + mConditions.isXLHPriceCrossedUnderSignal) && + ( + // + // Next Step is to Check LL and HH Same Style ... + // + // PriceUnderSignal ... + // Check if Both LL and HH Same In Length ... + ((mConditions.isXLHLLSameInLength && + mConditions.isXLHHHSameInLength) && + // + ( + // + ((mConditions.isXCHMASCTrendsDown && + mConditions.isXCHMALCTrendsDown) && + ( + // + (mConditions.isXCHMAMCVale && + mConditions.isXLHLLDecreased && + mConditions.isXCHLHMCLCHHSame) + // + || + // + (mConditions.isXTMBullish && + mConditions.isXAMABullish && + mConditions.isXTDBullUnderBear && + mConditions.isXTDSignalUnderBear) + // + ) + // + ) + // + || + // + // LC Vale ... + (mConditions.isXCHMALCVale && + ( + // + (mConditions.isXCHMAMCVale && + ( + // + (mConditions.isXCHMAMCTrendsDown && + mConditions.isXCHMALCTrendsDown) + // + ) + // + ) + // + || + // + ((mConditions.isXCHMAMCTrendsDown && + mConditions.isXCHMALCTrendsDown) && + ( + // + mConditions.isXCHMASCTrendsDown + // + || + // + (mConditions.isXTMVale && + mConditions.isXAMAVale && + mConditions.isXLHLLIncreased && + mConditions.isXCHLHMCLCHHSame && + mConditions.isXTDBullUnderBear && + mConditions.isXTDSignalUnderBear) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + || + // + // PriceUnderSignal ... + // Check If LL Same In Length ... + ((mConditions.isXLHLLSameInLength && + !mConditions.isXLHHHSameInLength) && + // + ( + // + (mConditions.isXCHMASCTrendsDown && + mConditions.isXCHMAMCTrendsDown && + mConditions.isXCHMALCTrendsDown) + // + || + // + ((mConditions.isXCHMAMCVale && + mConditions.isXCHMAMCTrendsUp && + (mConditions.isXCHMAMCFastUnderSlow || + mConditions.isXCHMAMCFastCrossedUnderSlow)) && + mConditions.isXTDBullUnderBear && + mConditions.isXTDSignalUnderBear) + // + ) + // + ) + // + || + // + // PriceUnderSignal ... + // Check If HH is Same In Length ... + ((mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + ((mConditions.isXCHMASCTrendsDown && + mConditions.isXCHMALCTrendsDown) && + ( + // + (mConditions.isXCHMAMCVale && + mConditions.isXTMNeutural && + mConditions.isXAMANeutural && + mConditions.isXCHLHSCMCLLSame && + mConditions.isXTDBullUnderBear && + mConditions.isXTDSignalUnderBear) + // + ) + // + ) + // + ) + // + ) + // + || + // + // PriceUnderSignal ... + // Not Same LL or HH in Lenght ... + ((!mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + false + // + ) + // + ) + // + ) + // + ) + // + ) + // + || + // + // Check Conditions if Price is Over Signal ... + ( + // + ((mConditions.isXLHPriceOverSignal || + mConditions.isXLHPriceCrossedOverSignal) && + ( + // + // Next Step is to Check LL and HH Same Style ... + // + // PriceOverSignal ... + // Check if Both LL and HH Same In Length ... + ((mConditions.isXLHLLSameInLength && + mConditions.isXLHHHSameInLength) && + // + ( + // + ((mConditions.isXCHMASCTrendsDown && + mConditions.isXCHMAMCTrendsDown) && + ( + // + ((mConditions.isXCHMASCPeak && + mConditions.isXCHMALCVale) && + ( + // + mConditions.isXCHMAMCVale + // + || + // + (mConditions.isXTMBullish && + mConditions.isXAMABullish && + mConditions.isXLHHHDecreased && + mConditions.isXTDBullOverBear && + mConditions.isXTDSignalOverBear) + // + ) + // + ) + // + || + // + (mConditions.isXCHMAMCVale && + mConditions.isXCHMALCVale && + mConditions.isXCHLHMCLCLLSame) + // + ) + // + ) + // + || + // + ((mConditions.isXCHMAMCTrendsDown && + mConditions.isXCHMALCTrendsDown) && + ( + // + (mConditions.isXTMBullish && + mConditions.isXAMABullish && + mConditions.isXTDSignalUnderBear && + mConditions.isXTSCurrentUnderNearest) + // + || + // + (mConditions.isXCHMALCVale && + ( + // + mConditions.isXCHMASCTrendsDown + // + || + // + (mConditions.isXTMBullish && + mConditions.isXAMABullish && + mConditions.isXTSCurrentMax && + mConditions.isXTDBearishVale) + // + || + // + (mConditions.isXAMANeutural && + mConditions.isXTSCurrentMax && + mConditions.isXTDBearishVale && + mConditions.isXTMStartBullish && + mConditions.isXTDSignalUnderBear) + // + ) + // + ) + // + ) + // + ) + // + || + // + (mConditions.isXCHMALCTrendsDown && + ( + // + (mConditions.isXTMBullish && + mConditions.isXAMABullish && + (mConditions.isXCHLHMCLCHHSame || + mConditions.isXCHLHMCLCLLSame) && + mConditions.isXTSCurrentUnderNearest) + // + ) + // + ) + // + ) + // + ) + // + || + // + // PriceOverSignal ... + // Check If LL Same In Length ... + ((mConditions.isXLHLLSameInLength && + !mConditions.isXLHHHSameInLength) && + // + ( + // + ((mConditions.isXCHMASCTrendsDown && + mConditions.isXCHMAMCTrendsDown) && + ( + // + mConditions.isXCHMALCVale + // + || + // + (mConditions.isXTMBullish && + mConditions.isXAMABullish && + mConditions.isXTDBullUnderBear && + mConditions.isXTDSignalUnderBear) + // + ) + // + ) + // + || + // + ((mConditions.isXCHMAMCTrendsDown && + mConditions.isXCHMALCTrendsDown) && + ( + // + ((mConditions.isXCHLHSCMCHHSame && + mConditions.isXLHHighAttachedHH) && + ( + // + (mConditions.isXCHMAMCVale && + mConditions.isXCHMALCVale) + // + || + // + (mConditions.isXTMStartBullish && + mConditions.isXAMAStartBullish) + // + || + // + (mConditions.isXTMBullish && + mConditions.isXAMABullish && + mConditions.isXTDBullUnderBear && + mConditions.isXTDSignalUnderBear) + // + || + // + (mConditions.isXTMBullish && + mConditions.isXAMABullish && + mConditions.isXCHMALCVale && + mConditions.isXTSCurrentMax && + mConditions.isXTDBullUnderBear) + // + ) + // + ) + // + || + // + (mConditions.isXTMBullish && + mConditions.isXAMABullish && + mConditions.isXTSCurrentMax && + mConditions.isXCHLHSCMCLLSame && + mConditions.isXTDSignalUnderBear) + // + || + // + mConditions.isXCHMASCTrendsDown + // + ) + // + ) + // + ) + // + ) + // + || + // + // PriceOverSignal ... + // Check If HH is Same In Length ... + ((mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + (mConditions.isXCHMASCTrendsDown && + mConditions.isXCHMAMCTrendsDown && + mConditions.isXCHMALCTrendsDown) + // + ) + // + ) + // + || + // + // PriceOverSignal ... + // Not Same LL or HH in Lenght ... + ((!mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + // LC Vale ... + (mConditions.isXCHMALCVale && + ( + // + (mConditions.isXCHMAMCVale && + ( + // + (mConditions.isXCHMAMCTrendsDown && + mConditions.isXCHMALCTrendsDown) + // + ) + // + ) + // + || + // + ((mConditions.isXCHMAMCTrendsDown && + mConditions.isXCHMALCTrendsDown) && + ( + // + (mConditions.isXTMBullish && + mConditions.isXAMABullish && + mConditions.isXTSCurrentMax && + mConditions.isXCHLHSCMCHHSame && + mConditions.isXTDBullUnderBear && + mConditions.isXLHHighAttachedHH && + mConditions.isXTDSignalUnderBear) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + || + // + // Check Conditions if Price is not has clear state ... + ( + // + ((!mConditions.isXLHPriceOverSignal && + !mConditions.isXLHPriceUnderSignal && + !mConditions.isXLHPriceInSignalRange && + !mConditions.isXLHPriceCrossedOverSignal && + !mConditions.isXLHPriceCrossedUnderSignal) && + ( + // + // Next Step is to Check LL and HH Same Style ... + // + // PriceFree ... + // Check if Both LL and HH Same In Length ... + ((mConditions.isXLHLLSameInLength && + mConditions.isXLHHHSameInLength) && + // + ( + // + (mConditions.isXCHMASCTrendsDown && + mConditions.isXCHMAMCTrendsDown && + mConditions.isXCHMALCTrendsDown) + // + ) + // + ) + // + || + // + // PriceFree ... + // Check If LL Same In Length ... + ((mConditions.isXLHLLSameInLength && + !mConditions.isXLHHHSameInLength) && + // + ( + // + false + // + ) + // + ) + // + || + // + // PriceFree ... + // Check If HH is Same In Length ... + ((mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + false + // + ) + // + ) + // + || + // + // PriceFree ... + // Not Same LL or HH in Lenght ... + ((!mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + false + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ; + + // + return result; +} + +// +// XCHMAMN Short Signal Checking ... +bool XEU5XCHMAMNHasShortSignal() +{ + // + bool result = false; + + // + // Validate Args ... + if (!xEU5MXCHMAMNEnableSignaller || + !xEU5MXCHMAMNAllowShortSignals) + { + return result; + } + + // + // Retrieve Market Condition ... + XMarketConditions mConditions = xEU5Provider.GetLastMarketCondition(); + + // + // Start Analysing Market based On Conditions ... + result = + // + // Base Condition: + xEU5Provider.XCHMAMNHasShortConditions() + // + && + // + // Exceptions: + // there some commonly Exceptions which makes our choice incorrect, + // here we are combined knownly Exceptions ... + !( + // + // for Exception we used XLH Conditions as follow ... + // + // Check Conditions if Price In Signal Range ... + (mConditions.isXLHPriceInSignalRange && + // + ( + // + // Next Step is to Check LL and HH Same Style ... + // + // PriceInSignalRange ... + // Check if Both LL and HH Same In Length ... + ((mConditions.isXLHLLSameInLength && + mConditions.isXLHHHSameInLength) && + // + ( + // + ((mConditions.isXCHMAMCFastOverSlow || + mConditions.isXCHMAMCFastCrossedOverSlow) && + ( + // + (mConditions.isXTSAllSame && + mConditions.isXTMNeutural && + mConditions.isXAMANeutural && + mConditions.isXTDBullOverBear && + mConditions.isXTDSignalOverBear) + // + ) + // + ) + // + ) + // + ) + // + || + // + // PriceInSignalRange ... + // Check If LL Same In Length ... + ((mConditions.isXLHLLSameInLength && + !mConditions.isXLHHHSameInLength) && + // + ( + // + false + // + ) + // + ) + // + || + // + // PriceInSignalRange ... + // Check If HH is Same In Length ... + ((mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + ((mConditions.isXTMBearish || + mConditions.isXTMNeutural) && + mConditions.isXAMANeutural && + mConditions.isXCHMASCVale && + mConditions.isXCHMAMCVale && + mConditions.isXCHMALCVale && + mConditions.isXLHLLIncreased && + mConditions.isXTSCurrentOverNearest) + // + ) + // + ) + // + || + // + // PriceInSignalRange ... + // Not Same LL or HH in Lenght ... + ((!mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + false + // + ) + // + ) + // + ) + // + ) + // + || + // + // Check Conditions if Price is Under Signal ... + ( + // + ((mConditions.isXLHPriceUnderSignal || + mConditions.isXLHPriceCrossedUnderSignal) && + ( + // + // Next Step is to Check LL and HH Same Style ... + // + // PriceUnderSignal ... + // Check if Both LL and HH Same In Length ... + ((mConditions.isXLHLLSameInLength && + mConditions.isXLHHHSameInLength) && + // + ( + // + ((mConditions.isXTDBullOverBear && + mConditions.isXTSCurrentOverFarest) && + ( + // + (mConditions.isXFIOverZero && + mConditions.isXCHMAMCVale && + mConditions.isXCHMALCVale && + mConditions.isXAMANeutural && + mConditions.isXAMAEndBullish && + mConditions.isXTMStartBearish) + // + || + // + (mConditions.isXTMBearish && + mConditions.isXAMABearish && + mConditions.isXTSCurrentMax && + mConditions.isXTSCurrentOverNearest && + mConditions.isXTSCurrentOverMediest && + (mConditions.isXCHMAMCFastOverSlow || + mConditions.isXCHMAMCFastCrossedOverSlow)) + // + ) + // + ) + // + ) + // + ) + // + || + // + // PriceUnderSignal ... + // Check If LL Same In Length ... + ((mConditions.isXLHLLSameInLength && + !mConditions.isXLHHHSameInLength) && + // + ( + // + (mConditions.isXTMBearish && + mConditions.isXAMABearish && + mConditions.isXCHMALCVale && + mConditions.isXTDBullOverBear && + mConditions.isXTDSignalUnderBear && + mConditions.isXFICrossedUnderZero && + mConditions.isXTSCurrentOverFarest) + // + ) + // + ) + // + || + // + // PriceUnderSignal ... + // Check If HH is Same In Length ... + ((mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + mConditions.isXRSICrossedUnderShortExit + // + ) + // + ) + // + || + // + // PriceUnderSignal ... + // Not Same LL or HH in Lenght ... + ((!mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + false + // + ) + // + ) + // + ) + // + ) + // + ) + // + || + // + // Check Conditions if Price is Over Signal ... + ( + // + ((mConditions.isXLHPriceOverSignal || + mConditions.isXLHPriceCrossedOverSignal) && + ( + // + // Next Step is to Check LL and HH Same Style ... + // + // PriceOverSignal ... + // Check if Both LL and HH Same In Length ... + ((mConditions.isXLHLLSameInLength && + mConditions.isXLHHHSameInLength) && + // + ( + // + ((mConditions.isXTSCurrentOverFarest && + (mConditions.isXCHMASCFastOverSlow || + mConditions.isXCHMASCFastCrossedOverSlow)) && + ( + // + (mConditions.isXTMNeutural && + mConditions.isXAMAStartBearish) + // + || + // + (mConditions.isXTMBearish && + mConditions.isXAMABearish && + mConditions.isXCHMASCVale && + mConditions.isXCHMAMCVale && + mConditions.isXCHMALCVale && + ((mConditions.isXCHMALCFastOverSlow || + mConditions.isXCHMALCFastCrossedOverSlow))) + // + ) + // + ) + // + ) + // + ) + // + || + // + // PriceOverSignal ... + // Check If LL Same In Length ... + ((mConditions.isXLHLLSameInLength && + !mConditions.isXLHHHSameInLength) && + // + ( + // + false + // + ) + // + ) + // + || + // + // PriceOverSignal ... + // Check If HH is Same In Length ... + ((mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + ((mConditions.isXCHMAMCFastOverSlow || + mConditions.isXCHMAMCFastCrossedOverSlow) && + ( + // + (mConditions.isXAMANeutural && + mConditions.isXTMEndBearish && + mConditions.isXTSCurrentOverMediest) + // + ) + // + ) + // + ) + // + ) + // + || + // + // PriceOverSignal ... + // Not Same LL or HH in Lenght ... + ((!mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + false + // + ) + // + ) + // + ) + // + ) + // + ) + // + || + // + // Check Conditions if Price is not has clear state ... + ( + // + ((!mConditions.isXLHPriceOverSignal && + !mConditions.isXLHPriceUnderSignal && + !mConditions.isXLHPriceInSignalRange && + !mConditions.isXLHPriceCrossedOverSignal && + !mConditions.isXLHPriceCrossedUnderSignal) && + ( + // + // Next Step is to Check LL and HH Same Style ... + // + // PriceFree ... + // Check if Both LL and HH Same In Length ... + ((mConditions.isXLHLLSameInLength && + mConditions.isXLHHHSameInLength) && + // + ( + // + false + // + ) + // + ) + // + || + // + // PriceFree ... + // Check If LL Same In Length ... + ((mConditions.isXLHLLSameInLength && + !mConditions.isXLHHHSameInLength) && + // + ( + // + false + // + ) + // + ) + // + || + // + // PriceFree ... + // Check If HH is Same In Length ... + ((mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + false + // + ) + // + ) + // + || + // + // PriceFree ... + // Not Same LL or HH in Lenght ... + ((!mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + false + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ; + + // + return result; +} + +// +// XCHMAMX Long Signal Checking ... +bool XEU5XCHMAMXHasLongSignal() +{ + // + bool result = false; + + // + // Validate Args ... + if (!xEU5MXCHMAMXEnableSignaller || + !xEU5MXCHMAMXAllowLongSignals) + { + return result; + } + + // + ENUM_XCHMA_CYCLES cycles[]; + Add( + X_XCHMA_CYCLE_MEDIUM, + cycles); + Add( + X_XCHMA_CYCLE_LONG, + cycles); + + // + double xCHMANonSCMax2 = XCHMAGetCyclesMaxValue(2, cycles); + + // + // Retrieve Market Condition ... + XMarketConditions mConditions = xEU5Provider.GetLastMarketCondition(); + + // + // Start Analysing Market based On Conditions ... + result = + // + // Base Condition: + xEU5Provider.XCHMAMXHasLongConditions() + // + && + // + // Exceptions: + // there some commonly Exceptions which makes our choice incorrect, + // here we are combined knownly Exceptions ... + !( + // + // for Exception we used XLH Conditions as follow ... + // + // Check Conditions if Price In Signal Range ... + (mConditions.isXLHPriceInSignalRange && + // + ( + // + // Next Step is to Check LL and HH Same Style ... + // + // PriceInSignalRange ... + // Check if Both LL and HH Same In Length ... + ((mConditions.isXLHLLSameInLength && + mConditions.isXLHHHSameInLength) && + // + ( + // + false + // + ) + // + ) + // + || + // + // PriceInSignalRange ... + // Check If LL Same In Length ... + ((mConditions.isXLHLLSameInLength && + !mConditions.isXLHHHSameInLength) && + // + ( + // + ((mConditions.isXCHMALCFastOverSlow || + mConditions.isXCHMALCFastCrossedOverSlow) && + ( + // + (mConditions.isXCHMALCPeak && + ( + // + (mConditions.isXCHMALCTrendsDown && + ( + // + ( + // + mConditions.isXCHMASCPeak + // + || + // + (mConditions.isXTMNeutural && + mConditions.isXAMANeutural && + mConditions.isXCHLHSameHHs && + mConditions.isXLHHighAttachedHH && + mConditions.isXTDSignalUnderBear) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + || + // + // PriceInSignalRange ... + // Check If HH is Same In Length ... + ((mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + false + // + ) + // + ) + // + || + // + // PriceInSignalRange ... + // Not Same LL or HH in Lenght ... + ((!mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + false + // + ) + // + ) + // + ) + // + ) + // + || + // + // Check Conditions if Price is Under Signal ... + ( + // + ((mConditions.isXLHPriceUnderSignal || + mConditions.isXLHPriceCrossedUnderSignal) && + ( + // + // Next Step is to Check LL and HH Same Style ... + // + // PriceUnderSignal ... + // Check if Both LL and HH Same In Length ... + ((mConditions.isXLHLLSameInLength && + mConditions.isXLHHHSameInLength) && + // + ( + // + false + // + ) + // + ) + // + || + // + // PriceUnderSignal ... + // Check If LL Same In Length ... + ((mConditions.isXLHLLSameInLength && + !mConditions.isXLHHHSameInLength) && + // + ( + // + false + // + ) + // + ) + // + || + // + // PriceUnderSignal ... + // Check If HH is Same In Length ... + ((mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + false + // + ) + // + ) + // + || + // + // PriceUnderSignal ... + // Not Same LL or HH in Lenght ... + ((!mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + false + // + ) + // + ) + // + ) + // + ) + // + ) + // + || + // + // Check Conditions if Price is Over Signal ... + ( + // + ((mConditions.isXLHPriceOverSignal || + mConditions.isXLHPriceCrossedOverSignal) && + ( + // + // Next Step is to Check LL and HH Same Style ... + // + // PriceOverSignal ... + // Check if Both LL and HH Same In Length ... + ((mConditions.isXLHLLSameInLength && + mConditions.isXLHHHSameInLength) && + // + ( + // + (((mConditions.isXCHMASCFastUnderSlow || + mConditions.isXCHMASCFastCrossedUnderSlow) && + (mConditions.isXCHMALCFastUnderSlow || + mConditions.isXCHMALCFastCrossedUnderSlow)) && + ( + // + (mConditions.isXLHHHDecreased && + mConditions.isXTDBullUnderBear && + mConditions.isXTDSignalUnderBear && + mConditions.isXLHPriceCrossedOverSignal) + // + || + // + (mConditions.isXTMNeutural && + mConditions.isXAMANeutural) + // + || + // + (mConditions.isXCHMASCTrendsDown && + mConditions.isXCHMALCTrendsDown) + // + ) + // + ) + // + ) + // + ) + // + || + // + // PriceOverSignal ... + // Check If LL Same In Length ... + ((mConditions.isXLHLLSameInLength && + !mConditions.isXLHHHSameInLength) && + // + ( + // + (mConditions.isXCHMASCTrendsDown && + mConditions.isXCHMAMCTrendsDown && + mConditions.isXCHMALCTrendsDown) + // + || + // + (((mConditions.isXCHMASCTrendsDown && + mConditions.isXCHMALCTrendsDown) || + (mConditions.isXCHMASCTrendsDown && + mConditions.isXCHMAMCTrendsDown) || + (mConditions.isXCHMAMCTrendsDown && + mConditions.isXCHMALCTrendsDown)) && + ( + // + (mConditions.isXCHMAMCPeak + // + || + // + mConditions.isXRSICrossedOverLongExit) + // + || + // + ((mConditions.isXCHMAMCFastUnderSlow || + mConditions.isXCHMAMCFastCrossedUnderSlow) && + ( + // + (mConditions.isXTMBullish && + mConditions.isXAMABullish && + mConditions.isXCHLHSCMCHHSame) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + || + // + // PriceOverSignal ... + // Check If HH is Same In Length ... + ((mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + (mConditions.isXCHMASCTrendsDown && + mConditions.isXCHMAMCTrendsDown && + mConditions.isXCHMALCTrendsDown) + // + ) + // + ) + // + || + // + // PriceOverSignal ... + // Not Same LL or HH in Lenght ... + ((!mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + (mConditions.isXCHMASCTrendsDown && + mConditions.isXCHMAMCTrendsDown && + mConditions.isXCHMALCTrendsDown) + // + ) + // + ) + // + ) + // + ) + // + ) + // + || + // + // Check Conditions if Price is not has clear state ... + ( + // + ((!mConditions.isXLHPriceOverSignal && + !mConditions.isXLHPriceUnderSignal && + !mConditions.isXLHPriceInSignalRange && + !mConditions.isXLHPriceCrossedOverSignal && + !mConditions.isXLHPriceCrossedUnderSignal) && + ( + // + // Next Step is to Check LL and HH Same Style ... + // + // PriceFree ... + // Check if Both LL and HH Same In Length ... + ((mConditions.isXLHLLSameInLength && + mConditions.isXLHHHSameInLength) && + // + ( + // + false + // + ) + // + ) + // + || + // + // PriceFree ... + // Check If LL Same In Length ... + ((mConditions.isXLHLLSameInLength && + !mConditions.isXLHHHSameInLength) && + // + ( + // + false + // + ) + // + ) + // + || + // + // PriceFree ... + // Check If HH is Same In Length ... + ((mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + false + // + ) + // + ) + // + || + // + // PriceFree ... + // Not Same LL or HH in Lenght ... + ((!mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + false + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ; + + // + return result; +} + +// +// XCHMAMX Short Signal Checking ... +bool XEU5XCHMAMXHasShortSignal() +{ + // + bool result = false; + + // + // Validate Args ... + if (!xEU5MXCHMAMXEnableSignaller || + !xEU5MXCHMAMXAllowShortSignals) + { + return result; + } + + // + // Retrieve Market Condition ... + XMarketConditions mConditions = xEU5Provider.GetLastMarketCondition(); + + // + // Start Analysing Market based On Conditions ... + result = + // + // Base Condition: + xEU5Provider.XCHMAMXHasShortConditions() + // + && + // + // Exceptions: + // there some commonly Exceptions which makes our choice incorrect, + // here we are combined knownly Exceptions ... + !( + // + // for Exception we used XLH Conditions as follow ... + // + // Check Conditions if Price In Signal Range ... + (mConditions.isXLHPriceInSignalRange && + // + ( + // + // Next Step is to Check LL and HH Same Style ... + // + // PriceInSignalRange ... + // Check if Both LL and HH Same In Length ... + ((mConditions.isXLHLLSameInLength && + mConditions.isXLHHHSameInLength) && + // + ( + // + (mConditions.isXTMNeutural && + mConditions.isXCHMASCVale && + mConditions.isXCHMAMCPeak && + mConditions.isXCHMALCPeak && + mConditions.isXAMANeutural && + mConditions.isXTSCurrentMin) + // + || + // + (((mConditions.isXCHMAMCFastOverSlow || + mConditions.isXCHMAMCFastCrossedOverSlow) && + (mConditions.isXCHMALCFastOverSlow || + mConditions.isXCHMALCFastCrossedOverSlow)) && + ( + // + (mConditions.isXAMAStartBearish && + mConditions.isXTSCurrentOverFarest) + // + || + // + (mConditions.isXCHMASCVale && + mConditions.isXCHMAMCPeak && + mConditions.isXCHMALCPeak) + // + || + // + (mConditions.isXTSCurrentMin && + mConditions.isXCHLHSCMCHHSame && + mConditions.isXAMAStartBearish) + // + ) + // + ) + // + ) + // + ) + // + || + // + // PriceInSignalRange ... + // Check If LL Same In Length ... + ((mConditions.isXLHLLSameInLength && + !mConditions.isXLHHHSameInLength) && + // + ( + // + ((mConditions.isXCHMAMCFastOverSlow || + mConditions.isXCHMAMCFastCrossedOverSlow) && + ( + // + (mConditions.isXTMBearish && + mConditions.isXLHHHIncreased && + mConditions.isXTDBullOverBear && + mConditions.isXCHLHSCMCHHSame && + mConditions.isXCHMAMCTrendsUp && + mConditions.isXAMAStartBearish && + mConditions.isXTSCurrentOverFarest) + // + ) + // + ) + // + ) + // + ) + // + || + // + // PriceInSignalRange ... + // Check If HH is Same In Length ... + ((mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + ((mConditions.isXCHMAMCFastOverSlow || + mConditions.isXCHMAMCFastCrossedOverSlow) && + ( + // + (mConditions.isXCHLHSameHHs && + mConditions.isXTSCurrentMin && + mConditions.isXTMStartBearish && + mConditions.isXAMAStartBearish && + mConditions.isXLHLowAttachedLL) + // + ) + // + ) + // + ) + // + ) + // + || + // + // PriceInSignalRange ... + // Not Same LL or HH in Lenght ... + ((!mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + false + // + ) + // + ) + // + ) + // + ) + // + || + // + // Check Conditions if Price is Under Signal ... + ( + // + ((mConditions.isXLHPriceUnderSignal || + mConditions.isXLHPriceCrossedUnderSignal) && + ( + // + // Next Step is to Check LL and HH Same Style ... + // + // PriceUnderSignal ... + // Check if Both LL and HH Same In Length ... + ((mConditions.isXLHLLSameInLength && + mConditions.isXLHHHSameInLength) && + // + ( + // + (((mConditions.isXCHMAMCFastOverSlow || + mConditions.isXCHMAMCFastCrossedOverSlow) && + (mConditions.isXCHMALCFastOverSlow || + mConditions.isXCHMALCFastCrossedOverSlow)) && + ( + // + ((mConditions.isXCHMAMCPeak && + mConditions.isXCHMALCPeak) && + ( + // + (mConditions.isXTMVale && + mConditions.isXAMAVale) + // + || + // + (mConditions.isXTMStartBearish && + mConditions.isXAMAStartBearish && + mConditions.isXTSCurrentOverFarest) + // + ) + // + ) + // + || + // + (mConditions.isXTMBearish && + mConditions.isXAMABearish && + mConditions.isXCHMALCPeak && + mConditions.isXTSCurrentMin && + mConditions.isXCHMAMCTrendsDown) + // + ) + // + ) + // + || + // + ((mConditions.isXCHMAMCFastOverSlow || + mConditions.isXCHMAMCFastCrossedOverSlow) && + ( + // + (mConditions.isXTMBearish && + mConditions.isXCHMAMCPeak && + mConditions.isXAMAStartBearish && + mConditions.isXTSCurrentOverFarest) + // + ) + // + ) + // + || + // + ((mConditions.isXCHMALCFastOverSlow || + mConditions.isXCHMALCFastCrossedOverSlow) && + ( + // + (mConditions.isXTSCurrentMin && + mConditions.isXLHHHDecreased && + mConditions.isXTMStartBearish && + mConditions.isXCHMALCTrendsUp && + mConditions.isXAMAStartBearish) + // + ) + // + ) + // + ) + // + ) + // + || + // + // PriceUnderSignal ... + // Check If LL Same In Length ... + ((mConditions.isXLHLLSameInLength && + !mConditions.isXLHHHSameInLength) && + // + ( + // + false + // + ) + // + ) + // + || + // + // PriceUnderSignal ... + // Check If HH is Same In Length ... + ((mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + ((mConditions.isXCHMALCFastOverSlow || + mConditions.isXCHMALCFastCrossedOverSlow) && + ( + // + mConditions.isXCHMALCPeak + // + || + // + (mConditions.isXTSAllSame && + mConditions.isXAMAEndBullish && + mConditions.isXTMStartBearish && + mConditions.isXTDBullOverBear && + mConditions.isXLHLowAttachedLL) + // + ) + // + ) + // + || + // + (((mConditions.isXCHMAMCFastOverSlow || + mConditions.isXCHMAMCFastCrossedOverSlow) && + (mConditions.isXCHMALCFastOverSlow || + mConditions.isXCHMALCFastCrossedOverSlow)) && + ( + // + ( + (mConditions.isXTMBearish && + mConditions.isXAMABearish && + mConditions.isXCHLHSCMCLLSame && + mConditions.isXLHLowAttachedLL) && + ( + // + (mConditions.isXTSCurrentMin && + mConditions.isXCHLHMCLCHHSame) + // + || + // + (mConditions.isXCHMALCPeak && + mConditions.isXTDBullOverBear && + mConditions.isXTSCurrentCrossedUnderNearest) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + || + // + // PriceUnderSignal ... + // Not Same LL or HH in Lenght ... + ((!mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + ((mConditions.isXCHMAMCFastOverSlow || + mConditions.isXCHMAMCFastCrossedOverSlow) && + ( + // + (mConditions.isXCHLHSameHHs && + mConditions.isXCHLHSameLLs && + mConditions.isXTSCurrentMin && + mConditions.isXTMStartBearish && + mConditions.isXAMAStartBearish && + mConditions.isXLHLowAttachedLL) + // + ) + // + ) + // + || + // + (mConditions.isXTSCurrentMin && + mConditions.isXTMStartBearish && + mConditions.isXAMAStartBearish && + mConditions.isXLHLowAttachedLL && + ((mConditions.isXCHMASCFastOverSlow || + mConditions.isXCHMASCFastCrossedOverSlow) && + (mConditions.isXCHMAMCFastOverSlow || + mConditions.isXCHMAMCFastCrossedOverSlow) && + (mConditions.isXCHMALCFastOverSlow || + mConditions.isXCHMALCFastCrossedOverSlow))) + // + ) + // + ) + // + ) + // + ) + // + ) + // + || + // + // Check Conditions if Price is Over Signal ... + ( + // + ((mConditions.isXLHPriceOverSignal || + mConditions.isXLHPriceCrossedOverSignal) && + ( + // + // Next Step is to Check LL and HH Same Style ... + // + // PriceOverSignal ... + // Check if Both LL and HH Same In Length ... + ((mConditions.isXLHLLSameInLength && + mConditions.isXLHHHSameInLength) && + // + ( + // + (mConditions.isXTMBearish && + mConditions.isXAMABearish && + mConditions.isXCHMAMCPeak && + mConditions.isXTSCurrentMin && + mConditions.isXCHMAMCTrendsUp) + // + || + // + (mConditions.isXCHMAMCPeak && + mConditions.isXCHMAMCTrendsUp && + (mConditions.isXCHMAMCFastOverSlow || + mConditions.isXCHMAMCFastCrossedOverSlow)) + // + || + // + ((mConditions.isXCHMALCFastOverSlow || + mConditions.isXCHMALCFastCrossedOverSlow) && + ( + // + (mConditions.isXCHMASCVale && + mConditions.isXTSCurrentMin && + mConditions.isXTMStartBearish && + mConditions.isXAMAStartBearish) + // + ) + // + ) + // + ) + // + ) + // + || + // + // PriceOverSignal ... + // Check If LL Same In Length ... + ((mConditions.isXLHLLSameInLength && + !mConditions.isXLHHHSameInLength) && + // + ( + // + ((mConditions.isXTMBearish && + mConditions.isXCHMAMCPeak && + mConditions.isXAMANeutural && + mConditions.isXCHLHSCMCHHSame && + mConditions.isXCHLHMCLCLLSame) && + ( + // + mConditions.isXTSCurrentOverFarest + // + || + // + (mConditions.isXTSCurrentMin && + mConditions.isXCHMAMCTrendsDown && + mConditions.isXCHMALCTrendsDown) + // + ) + // + ) + // + || + // + ((mConditions.isXCHMAMCFastOverSlow || + mConditions.isXCHMAMCFastCrossedOverSlow) && + ( + // + (mConditions.isXCHMAMCPeak && + mConditions.isXCHMALCPeak && + mConditions.isXAMANeutural && + mConditions.isXTMStartBearish) + // + ) + // + ) + // + ) + // + ) + // + || + // + // PriceOverSignal ... + // Check If HH is Same In Length ... + ((mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + ((mConditions.isXCHMASCTrendsUp && + (mConditions.isXCHMASCFastUnderSlow || + mConditions.isXCHMASCFastCrossedUnderSlow)) && + ( + // + (mConditions.isXFIUnderZero && + (mConditions.isXTMBearish || + mConditions.isXTMStartBearish) && + (mConditions.isXAMABearish || + mConditions.isXAMAStartBearish) && + (mConditions.isXTDBullUnderBear && + mConditions.isXTDSignalUnderBear)) + // + ) + // + ) + // + ) + // + ) + // + || + // + // PriceOverSignal ... + // Not Same LL or HH in Lenght ... + ((!mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + false + // + ) + // + ) + // + ) + // + ) + // + ) + // + || + // + // Check Conditions if Price is not has clear state ... + ( + // + ((!mConditions.isXLHPriceOverSignal && + !mConditions.isXLHPriceUnderSignal && + !mConditions.isXLHPriceInSignalRange && + !mConditions.isXLHPriceCrossedOverSignal && + !mConditions.isXLHPriceCrossedUnderSignal) && + ( + // + // Next Step is to Check LL and HH Same Style ... + // + // PriceFree ... + // Check if Both LL and HH Same In Length ... + ((mConditions.isXLHLLSameInLength && + mConditions.isXLHHHSameInLength) && + // + ( + // + false + // + ) + // + ) + // + || + // + // PriceFree ... + // Check If LL Same In Length ... + ((mConditions.isXLHLLSameInLength && + !mConditions.isXLHHHSameInLength) && + // + ( + // + false + // + ) + // + ) + // + || + // + // PriceFree ... + // Check If HH is Same In Length ... + ((mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + false + // + ) + // + ) + // + || + // + // PriceFree ... + // Not Same LL or HH in Lenght ... + ((!mConditions.isXLHHHSameInLength && + !mConditions.isXLHLLSameInLength) && + // + ( + // + false + // + ) + // + ) + // + ) + // + ) + // + ) + // + ) + // + ; + + // + return result; +} + +// +// END Signal Providers ... +// diff --git a/BKPS/OLD/XEU5/Providers/x-saherelm.xeu5.provider.inputs.lib.mq5 b/BKPS/OLD/XEU5/Providers/x-saherelm.xeu5.provider.inputs.lib.mq5 new file mode 100644 index 0000000..03e0a50 --- /dev/null +++ b/BKPS/OLD/XEU5/Providers/x-saherelm.xeu5.provider.inputs.lib.mq5 @@ -0,0 +1,280 @@ +/////////////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 XEU5 Signal Provider Library Inputs +// ----------------------------------------------------------- +// +// 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 Logger ... +#include "../Libraries/x-saherelm.log.lib.mq5" + +// +// Include Classes ... +#include "../Classes/x-saherelm.class.lib.mq5" + +// +input group "XEU5 Provider"; + +// +// Commonly Used Configurations ... +input group "XEU5 Common"; +// +// Provider ... +input bool xEU5EnableProvider = true; // Enable Provider +input int xEU5NumberOfItemsPerTick = 30; // Number Of items Readed In Each Tick +// +// Alerts ... +input bool xEU5EnableAlerts = true; // Enable Events Alert +input bool xEU5EnableHourlyAlerts = false; // Send Alert on each new Hour +input bool xEU5EnableDailyAlerts = false; // Send Alert on each new Day +input bool xEU5EnableWeeklyAlerts = false; // Send Alert on each new Week +input bool xEU5EnableMonthlyAlerts = true; // Send Alert on each new Month +// +// Reports ... +input bool xEU5EnableDailyReports = false; // Send Report on each new Day +input bool xEU5EnableWeeklyReports = false; // Send Report on each new Week +input bool xEU5EnableMonthlyReports = true; // Send Report on each new Month + +// +// Trader and Expert Specific Configurations ... +input group "XEU5 Trader"; +input int xEU5MagicNumber = 16940560; // Trader MagicNumber +input int xEU5Slippage = 10; // Trader Slippage + +// +// Trades Management Configurations ... +input group "XEU5 Trade Management"; +input bool xEU5AllowLongTrades = true; // Allow Long Trades +input bool xEU5AllowShortTrades = true; // Allow Short Trades + +// +// Risk Management Configurations ... +input group "XEU5 Risk Management"; +// +input bool xEU5UseVirtualTPSl = false; // Use Virtual TP SL +// +// Trade Count ... +input int xEU5MaxAllowedTrades = 10; // Max Allowed Trades at Same Time +input ENUM_X_CROSS_SIGNAL_METHOD xEU5CrossSignalsMethod = X_CROSS_SIGNAL_REGULAR; // Handle Cross Signals Method +// +// Max Allowed Trade Age ... +input int xEU5MaxAllowedTradeAge = 1500; // Detect Long Time Trades +input ENUM_X_GUARD_ACTIONS xEU5OldTradesAction = X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_1; // What to do with Old Trades +// +// Trade Volume Specific Configurations ... +input double xEU5StaticVolumeFactor = 0.0002; // Static Volume baesd on Balance +input ENUM_STATIC_VOLUME_METHODS xEU5StaticVolumeMethod = X_STATIC_VOLUME_BASED_ON_BALANCE; // How to Calculate Static Volume +input double xEU5VolumeMultiplier = 0; // Volume Increase Multiplier +input double xEU5ApplyVolumeMultiplierFactor = 0; // Apply Volume Multiplier Rate based on Balance +input double xEU5MaxSupportedVolumePerTradeFactor = 0; // Max Supported Volume Per Trade Factor based on Balance +input double xEU5IncreasedMaxSupportedVolumeRate = 0; // Increase Max Supported Volume based on Balance +// +// Trade Profits ... +input double xEU5MinRewardInPips = 15; // Minimum Reward Per Trade in Pips +input double xEU5RiskFreeStepInPips = 6; // Make Trades Risk Free Steps in Pips +input double xEU5RiskFreeRate = 0.6; // Volume Multiplier for Risk Free Trades +// +// Guard Riskable Money and Profits ... +input double xEU5CriticalDrawDownFactor = 0.40; // Critical Allowed Drawdown Factor based on Balance +input ENUM_X_GUARD_ACTIONS xEU5CriticalGuardAction = X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_5; // Specify Guard Action on Critical Drawdown +input double xEU5MaxAllowedDrawDownFactor = 0.45; // Max Allowed Drawdown Factor based on Balance +input ENUM_X_GUARD_ACTIONS xEU5MaxAllowedGuardAction = X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_10; // Specify Guard Action on Max Allowed Drawdown +input int xEU5GuardStopoutFiredAfterTouches = 5; // Guard Stopout all Trades if Max Allowed Drawdown touched + +// +// Account Conditions for Trading ... +input double xEU5BalanceFactorForOpenTrades = 0.5; // Minimum Balance for Open Trades +input double xEU5FreeMarginFactorForOpenTrades = 0.8; // Minimum Free Margin for Open Trades + +// +// Validate Inputs before Initialization ... +bool XEU5ValidateInputs() +{ + // + bool result = false; + + // + // Implement Other Verifications ... + + // + // Check Trading Availability ... + bool isTradeAvailable = xEU5AllowLongTrades || xEU5AllowShortTrades; + if (!isTradeAvailable) + { + LogMessage("XEU5 => Warning: Trading disabled ..."); + } + + // + // Chekc Number of reading items per tick ... + result = xEU5NumberOfItemsPerTick >= 5; + if (!result) + { + // + LogMessage("XEU5 invalid Number of items Reading Per Tick ..."); + + // + return result; + } + + // + // Check Max Allowed Trades Count ... + result = isTradeAvailable && xEU5MaxAllowedTrades >= 1; + if (!result) + { + // + LogMessage("XEU5 Number of Trades not valid ..."); + + // + return result; + } + + // + // Check Free Margin ... + result = + isTradeAvailable && + xEU5FreeMarginFactorForOpenTrades > 0 && + xEU5FreeMarginFactorForOpenTrades < 1; + if (!result) + { + // + LogMessage("XEU5 Invalid Free Margin ..."); + + // + return result; + } + + // + // Check min Balance for Open Trades ... + result = + isTradeAvailable && + xEU5BalanceFactorForOpenTrades > 0 && + xEU5BalanceFactorForOpenTrades < 1; + if (!result) + { + // + LogMessage("XEU5 Invalid Min Balance for Open Trades ..."); + + // + return result; + } + + // + // Check Min Reward Per Trade ... + result = xEU5MinRewardInPips > 0; + if (!result) + { + // + LogMessage("XEU5 Invalid Min Reward Per Trade ..."); + + // + return result; + } + + // + // Check Trades Volume ... + result = xEU5StaticVolumeFactor > 0; + if (!result) + { + // + LogMessage("XEU5 Invalid Static Volume ..."); + + // + return result; + } + + // + // Check Volume Multiplier ... + result = xEU5VolumeMultiplier >= 0; + if (!result) + { + // + LogMessage("XEU5 Invalid Volume Multiplier ..."); + + // + return result; + } + + // + result = + xEU5CriticalDrawDownFactor == 0 || (xEU5CriticalDrawDownFactor > 0 && + xEU5CriticalDrawDownFactor < 1); + if (!result) + { + // + LogMessage("XEU5 Invalid Critical DrawDown Factor ..."); + + // + return result; + } + + // + result = + xEU5MaxAllowedDrawDownFactor == 0 || (xEU5MaxAllowedDrawDownFactor > 0 && + xEU5MaxAllowedDrawDownFactor < 1); + if (!result) + { + // + LogMessage("XEU5 Invalid Max Allowed DrawDown Factor ..."); + + // + return result; + } + + // + // Check Guard Actions ... + // + result = + xEU5CriticalDrawDownFactor > 0 && + xEU5CriticalDrawDownFactor < 1 && + xEU5MaxAllowedDrawDownFactor > 0 && + xEU5MaxAllowedDrawDownFactor < 1; + if (!result) + { + // + LogMessage("XEU5 For Critical Drawdown, you have to Specify Max Drawdown also ..."); + + // + return result; + } + + // + result = xEU5CriticalDrawDownFactor > 0 && xEU5CriticalDrawDownFactor < xEU5MaxAllowedDrawDownFactor; + if (!result) + { + // + LogMessage("XEU5 Critical Drawdown must Smaller than Max Drawdown ..."); + + // + return result; + } + + // + if (xEU5CriticalDrawDownFactor > 0 && xEU5CriticalGuardAction == X_GUARD_DO_NOTHING) + { + LogMessage("XEU5 IMPORTANT you Specified Critical Drawdown, but there is no any Guard Action ..."); + } + + // + if (xEU5MaxAllowedDrawDownFactor > 0 && xEU5MaxAllowedGuardAction == X_GUARD_DO_NOTHING) + { + LogMessage("XEU5 IMPORTANT you Specified Max Allowed Drawdown, but there is no any Guard Action ..."); + } + + // + result = true; + + // + return result; +} \ No newline at end of file diff --git a/BKPS/OLD/XEU5/Providers/x-saherelm.xeu5.provider.lib.mq5 b/BKPS/OLD/XEU5/Providers/x-saherelm.xeu5.provider.lib.mq5 new file mode 100644 index 0000000..c57de45 --- /dev/null +++ b/BKPS/OLD/XEU5/Providers/x-saherelm.xeu5.provider.lib.mq5 @@ -0,0 +1,1370 @@ +//////////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 XEU5 Signal Provider Library +// -------------------------------------------------------- +// Name: XEU5SignalProvider +// Description: XEU5 based 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 + +#define XEU5ProviderName "XEU5" + +// +// START Inputs ... +// + +#include "x-saherelm.xeu5.provider.inputs.lib.mq5"; + +// +// END Inputs ... +// + +// +// Include Common Library ... +#include "../Libraries/x-saherelm.common.lib.mq5" + +// +// Include Logger Library ... +#include "../Libraries/x-saherelm.log.lib.mq5" + +// +// Include Alert Library ... +#include "../Libraries/x-saherelm.alert.lib.mq5" + +// +// Include Draw Library ... +#include "../Libraries/x-saherelm.draw.lib.mq5" + +// +// Include Class Libraries ... +#include "../Classes/x-saherelm.class.lib.mq5" + +// +// START Global Definitions: Variables, Properties and etc ... +// + +// +XCGuard *xEU5Guard; +XCTrade *xEU5Trader; +XCReporter *xEU5Reporter; +XCCollector *xEU5Collector; +XCAccountInfo *xEU5AccountInfo; +XCVolumeManager *xEU5VolumeManager; + +// +#include "x-saherelm.xeu5.provider.indicators.lib.mq5" + +// +// Controlling Variables ... +bool xEU5MEnableProvider = false; +bool xEU5MAllowLongTrades = false; +bool xEU5MAllowShortTrades = false; + +// +double xEU5Deposit = 0; +double xEU5Balance = 0; +double xEU5MinReward = 0; +double xEU5FreeMargin = 0; +double xEU5BalanceForOpenTrades = 0; +double xEU5FreeMarginForOpenTrades = 0; + +// +// Guard ... +double xEU5CriticalDrawDown = 0; +double xEU5MaxAllowedDrawDown = 0; + +// +double xEU5MaxDrawUp = 0; +double xEU5MaxDrawDown = 0; + +// +int NOT_ENOUGH_MONEY_ERROR = 4756; +const string XEU5_SUPPORT_ID = "SP"; + +// +// END Global Definitions: Variables, Properties and etc ... +// + +// +// START Provided Functions ... +// + +// +// Initial Library if required ... +bool XEU5InitSignalProviderLibrary() +{ + // + bool result = false; + + // + if (!xEU5EnableProvider) + { + return result; + } + + // + // Controlling Variables ... + xEU5MEnableProvider = xEU5EnableProvider; + xEU5MAllowLongTrades = xEU5AllowLongTrades; + xEU5MAllowShortTrades = xEU5AllowShortTrades; + + // + // Validate Inputs ... + result = XEU5ValidateInputs(); + if (!result) + { + return result; + } + + // + // Init Indicators ... + result = XEU5InitIndicators(); + if (!result) + { + return result; + } + + // + xEU5Reporter = new XCReporter(); + xEU5Collector = new XCCollector(); + xEU5AccountInfo = new XCAccountInfo(); + + // + // Calculate Account Deposit ... + xEU5Deposit = xEU5AccountInfo.GetInitialBalance(); + + // + // Prepare Min Reward ... + if (xEU5MinRewardInPips > 0) + { + xEU5MinReward = PipsToPrice(xEU5MinRewardInPips); + } + + // + // Calculate Min Balance for Trades ... + if (xEU5BalanceFactorForOpenTrades > 0) + { + xEU5BalanceForOpenTrades = xEU5BalanceFactorForOpenTrades * xEU5Deposit; + } + + // + // Claculate Min Free Marging for Trades ... + if (xEU5FreeMarginFactorForOpenTrades > 0) + { + xEU5FreeMarginForOpenTrades = xEU5FreeMarginFactorForOpenTrades * xEU5Deposit; + } + + // + // Calculate Init Time Critical DrawDown Value ... + if (xEU5CriticalDrawDownFactor > 0) + { + xEU5CriticalDrawDown = xEU5CriticalDrawDownFactor * xEU5Deposit; + } + + // + // Calculate Init Time Max Allowed DrawDown Value ... + if (xEU5MaxAllowedDrawDownFactor > 0) + { + xEU5MaxAllowedDrawDown = xEU5MaxAllowedDrawDownFactor * xEU5Deposit; + } + + // + // Instant Volume Manager ... + xEU5VolumeManager = new XCVolumeManager( + xEU5StaticVolumeFactor, + xEU5StaticVolumeMethod, + xEU5VolumeMultiplier, + xEU5ApplyVolumeMultiplierFactor, + xEU5MaxSupportedVolumePerTradeFactor, + xEU5IncreasedMaxSupportedVolumeRate); + + // + // Make XCTrader instance ... + xEU5Trader = new XCTrade( + XEU5ProviderName, + _Symbol, + xEU5Slippage, + xEU5MagicNumber, + xEU5UseVirtualTPSl, + xEU5MaxAllowedTrades, + xEU5FreeMarginForOpenTrades, + xEU5BalanceForOpenTrades); + + // + // Instantiate Account Guard ... + xEU5Guard = new XCGuard( + // + // Old Trades ... + xEU5MaxAllowedTradeAge, + xEU5OldTradesAction, + // + // Critical DrawDown ... + xEU5CriticalDrawDownFactor, + xEU5CriticalGuardAction, + // + // Max Allowed DrawDown ... + xEU5MaxAllowedDrawDownFactor, + xEU5MaxAllowedGuardAction, + xEU5GuardStopoutFiredAfterTouches, + // + // xEU5GuardSupportMethod + X_SUPPORT_DO_NOTHING + // + ); + + // + // Reset Calculations Buffers and Variables ... + XEU5ResetCollectors(); + + // + XEU5UpdateReports(); + + // + result = true; + + // + // Logging State ... + XEU5IssueInitializationSucceedAlert(); + + // + return result; +} + +// +// DeInitial Library if required ... +void XEU5DeinitSignalProviderLibrary(const int reason) +{ + // + // Release Handlers ... + XEU5ReleaseIndicators(); + + // + // Logging State ... + XEU5IssueDeinitializationSucceedAlert(); +} + +// +// this is a Globally Function which do all of +// checkings and positions handling ... +void XEU5SignalProviderHandleTick() +{ + // + // Check Provider is Enable or Not ... + if (!xEU5MEnableProvider) + { + return; + } + + // + XEU5SignalProviderDoControlState(); + + // + // Reading Indicator Buffers ... + XEU5HandleReadingBuffers(); + if (xEU5CalculatedBars < xEU5MaxLengthOfInputs) + { + return; + } + + // + // Handle Open Trades ... + XEU5HandleOpenTrades(); + + // + // Handle Close Trades ... + XEU5HandleCloseTrades(); + + // + // DrawDown and DrawUp ... + XEU5HandleCalculateDrawDownUp(); +} + +// +// Do Control Checks here ... +void XEU5SignalProviderDoControlState() +{ + // + // Update account Balance ... + xEU5Balance = xEU5AccountInfo.GetBalance(); + xEU5FreeMargin = xEU5AccountInfo.GetFreeMargin(); + + // + // Check Provider is Enable or Not ... + if (!xEU5MEnableProvider) + { + return; + } + + // + // Protect Account by Guarding Maximum Drawdown ... + // TODO: add Guard Result here ... + string guardMessage = ""; + XGuardHandlerResult guardHandlerResult; + bool isGuarded = xEU5Guard.Guard( + guardHandlerResult, + guardMessage, + xEU5Trader, + _Period); + if (isGuarded) + { + // + // Criticals ... + int criticalsCount = ArraySize(guardHandlerResult.criticals); + if (criticalsCount > 0) + { + // + for (int i = 0; i < criticalsCount; i++) + { + // + XSignal iSignal = guardHandlerResult.criticals[i]; + + // + XEU5OnGuard( + iSignal, + X_GUARDED_CRITICAL, + guardMessage); + } + } + + // + // Maxes ... + int maxesCount = ArraySize(guardHandlerResult.maxes); + if (maxesCount > 0) + { + // + for (int i = 0; i < maxesCount; i++) + { + // + XSignal iSignal = guardHandlerResult.maxes[i]; + + // + XEU5OnGuard( + iSignal, + X_GUARDED_MAX, + guardMessage, + guardHandlerResult.isStopOut); + } + } + + // + // Olds ... + int oldsCount = ArraySize(guardHandlerResult.olds); + if (oldsCount > 0) + { + // + for (int i = 0; i < oldsCount; i++) + { + // + XSignal iSignal = guardHandlerResult.olds[i]; + + // + XEU5OnGuard( + iSignal, + X_GUARDED_OLD, + guardMessage); + } + } + } + + // + // Signal Protection ... + XSignal protectSupports[]; + bool isSupported = xEU5Guard.ProtectSignals( + protectSupports, + xEU5Trader); + if (isSupported) + { + // + LogMessage("Guard do Support Trdae ..."); + } + + // + // Handling Signals ... + XTraderHandlerResult signalHandlerResult; + xEU5Trader.HandleSignals( + signalHandlerResult, + false // Ignore Risk Free Trdaes + ); + + // + // Handle Sl Reports ... + int handledSLsCount = ArraySize(signalHandlerResult.sl); + if (handledSLsCount > 0) + { + // + for (int i = 0; i < handledSLsCount; i++) + { + // + XSignal iSignal = signalHandlerResult.sl[i]; + XEU5OnSL(iSignal); + } + } + + // + // Handle TP Reports ... + int handledTPsCount = ArraySize(signalHandlerResult.tp); + if (handledTPsCount > 0) + { + // + for (int i = 0; i < handledTPsCount; i++) + { + // + XSignal iSignal = signalHandlerResult.tp[i]; + XEU5OnTP(iSignal); + } + } + + // + // Handle RFs as TP Reports ... + int handledRFsCount = ArraySize(signalHandlerResult.rf); + if (handledRFsCount > 0) + { + // + for (int i = 0; i < handledRFsCount; i++) + { + // + XSignal iSignal = signalHandlerResult.rf[i]; + XEU5OnRF(iSignal); + } + } +} + +// +// Handle Trades when OnTrade Event Hnadler Calls ... +void XEU5SignalProviderHandleTrade() +{ + // + // Check Provider Enabled ... + if (!xEU5MEnableProvider) + { + return; + } + + // + // Handle OnTrade Event ... + XOnTradeHandlerResult result = {}; + xEU5Trader.HandleOnTradeEvent( + result); + + // + // Detected TP or SL ... + if (result.hasNewDeal) + { + // + XDeal last = xEU5Trader.GetLastDeal(); + + // + if (last.reason == DEAL_REASON_SL) + { + xEU5Reporter.AddTradeSLInReports(); + } + else if (last.reason == DEAL_REASON_TP) + { + xEU5Reporter.AddTradeTPInReports(); + } + } +} + +// +// Handle Open Trades ... +void XEU5HandleOpenTrades() +{ + // + // Check Can Trade ... + bool canTrade = xEU5MAllowLongTrades || xEU5MAllowShortTrades; + if (!canTrade) + { + return; + } + + // + // Check Max Open Trades ... + int openSignals = xEU5Trader.Count(); + bool canOpenPositions = openSignals < xEU5MaxAllowedTrades; + if (!canOpenPositions) + { + return; + } + + // + // Check Signals Exists ... + XProvidedSignal longSignalInfo; + XProvidedSignal shortSignalInfo; + bool hasLongSignal = XEU5CanOpenLongTrade(longSignalInfo); + bool hasShortSignal = XEU5CanOpenShortTrade(shortSignalInfo); + if (!hasLongSignal && !hasShortSignal) + { + return; + } + + // + // Update Reports ... + XEU5UpdateReports(); + + // + // Open Long Trades ... + if ( + // + hasLongSignal && + xEU5MAllowLongTrades) + { + // + bool isOpened = XEU5OpenLongPosition(longSignalInfo); + } + + // + // Open Short Trades ... + if ( + // + hasShortSignal && + xEU5MAllowShortTrades) + { + // + bool isOpened = XEU5OpenShortPosition(shortSignalInfo); + } +} + +// +// Handle Close Trades ... +void XEU5HandleCloseTrades() +{ + // + // Force Close Long Trades ... + bool isClosedLongTrades = false; + bool canCloseLongTrades = XEU5CanCloseLongTrade(); + if (xEU5MAllowLongTrades && canCloseLongTrades) + { + // + ENUM_X_SIGNAL_TYPE type = X_SIGNAL_LONG; + + // + XSignal closed[]; + xEU5Trader.CloseSignals( + closed, + type); + + // + int closedTradesCount = ArraySize(closed); + isClosedLongTrades = closedTradesCount > 0; + if (isClosedLongTrades) + { + // + for (int i = 0; i < closedTradesCount; i++) + { + // + XSignal iSignal = closed[i]; + XEU5OnFC(iSignal); + } + } + } + + // + // Force Close Short Trades ... + bool isClosedShortTrades = false; + bool canCloseShortTrades = XEU5CanCloseShortTrade(); + if (xEU5MAllowShortTrades && canCloseShortTrades) + { + // + ENUM_X_SIGNAL_TYPE type = X_SIGNAL_SHORT; + + // + XSignal closed[]; + xEU5Trader.CloseSignals( + closed, + type); + + // + int closedTradesCount = ArraySize(closed); + isClosedShortTrades = closedTradesCount > 0; + if (isClosedShortTrades) + { + // + for (int i = 0; i < closedTradesCount; i++) + { + // + XSignal iSignal = closed[i]; + XEU5OnFC(iSignal); + } + } + } +} + +// +// Open Long Position ... +bool XEU5OpenLongPosition( + XProvidedSignal &info // Retrieve Signal Additional Info on this Object +) +{ + // + bool result = false; + + // + // Calculate Required Data for Position ... + double entry = GetEntry(_Symbol, X_SIGNAL_LONG); + double sl = info.sl > 0 ? info.sl : 0; + // entry - (200 * _Point); + // info.sl > 0 ? info.sl : 0; + double tp = info.tp > 0 ? info.tp : entry + xEU5MinReward; + double riskFreeRate = xEU5RiskFreeRate; + double riskFreeStep = xEU5RiskFreeStepInPips; + double volume = XEU5CalculateVolume(ArraySize(info.signallers)); + + // + XSignal signal = {}; + signal = xEU5Trader.GenerateSignal( + X_SIGNAL_LONG, + tp, + sl, + volume, + riskFreeStep, + riskFreeRate); + bool isValidSignal = IsValid( + signal, + xEU5MagicNumber); + if (!isValidSignal) + { + return result; + } + + // + int signalsCount = xEU5Trader.Count(); + bool isCross = signalsCount >= 1; + if (isCross) + { + // + // Handle Cross Signals ... + XEU5HnadleCrossSignal(signal); + } + + // + // Retrieve Can Execute Signal or not ... + bool canExecuteSignal = + !isCross + // + || + // + ( + // + isCross && + xEU5CrossSignalsMethod != X_CROSS_SIGNAL_DO_NOTHING + // + ); + if (!canExecuteSignal) + { + return result; + } + + // + // Execute Signal ... + ENUM_EXECUTION_SIGNAL_RESULT executionResult = xEU5Trader.ExecuteSignal( + signal, + false, // Ignore Number of Trades ... + true // Check Account Conditions ... + ); + result = executionResult == X_TRADER_SUCCEED_EXECUTION; + if (result) + { + // + // Update Reports ... + string providers[]; + ArrayCopy( + providers, + info.signallers + ); + + // + XSignal tSignal = xEU5Trader.GetSignal(signal.ticket); + + // + XEU5OnSignal( + tSignal, + providers); + } + else + { + XEU5IssueSignalExecutionError(executionResult); + } + + // + return result; +} + +// +// Open Short Position ... +bool XEU5OpenShortPosition( + XProvidedSignal &info // Retrieve Signal Additional Info on this Object +) +{ + // + bool result = false; + + // + // Calculate Required Data for Position ... + double entry = GetEntry(_Symbol, X_SIGNAL_SHORT); + double sl = info.sl > 0 ? info.sl : 0; + // entry + (200 * _Point); + // info.sl > 0 ? info.sl : 0; + double tp = info.tp > 0 ? info.tp : entry - xEU5MinReward; + double riskFreeRate = xEU5RiskFreeRate; + double riskFreeStep = xEU5RiskFreeStepInPips; + double volume = XEU5CalculateVolume(ArraySize(info.signallers)); + + // + XSignal signal = {}; + signal = xEU5Trader.GenerateSignal( + X_SIGNAL_SHORT, + tp, + sl, + volume, + riskFreeStep, + riskFreeRate); + bool isValidSignal = IsValid( + signal, + xEU5MagicNumber); + if (!isValidSignal) + { + return result; + } + + // + int signalsCount = xEU5Trader.Count(); + bool isCross = signalsCount >= 1; + if (isCross) + { + // + // Handle Cross Signals ... + XEU5HnadleCrossSignal(signal); + } + + // + // Retrieve Can Execute Signal or not ... + bool canExecuteSignal = + !isCross + // + || + // + ( + // + isCross && + xEU5CrossSignalsMethod != X_CROSS_SIGNAL_DO_NOTHING + // + ); + if (!canExecuteSignal) + { + return result; + } + + // + // Execute Signal ... + ENUM_EXECUTION_SIGNAL_RESULT executionResult = xEU5Trader.ExecuteSignal( + signal, + false, // Ignore Number of Trades ... + true // Check Account Conditions ... + ); + result = executionResult == X_TRADER_SUCCEED_EXECUTION; + if (result) + { + string providers[]; + ArrayCopy( + providers, + info.signallers + ); + + // + XSignal tSignal = xEU5Trader.GetSignal(signal.ticket); + + // + XEU5OnSignal( + tSignal, + providers); + } + else + { + XEU5IssueSignalExecutionError(executionResult); + } + + // + return result; +} + +// +// Apply Cross Signal Actions ... +void XEU5HnadleCrossSignal( + XSignal &signal // Specified Signal ... +) +{ + // + // Check Cross Signal Handling Enabled ... + if (xEU5CrossSignalsMethod == X_CROSS_SIGNAL_DO_NOTHING) + { + return; + } + + // + // First We have to Change Cross Signals Comment ... + string comment = xEU5Trader.GenerateSignalComment( + signal, + true); + + // + signal.comment = comment; + + // + // If Every thing is Regular, prevent any changes here ... + if (xEU5CrossSignalsMethod == X_CROSS_SIGNAL_REGULAR) + { + return; + } + + // + // Retrieve Max in Drawdown Signal ... + XSignal maxInDDSignal = xEU5Trader.GetMaxInDrawdownSignal(); + + // + // Validate Signal ... + bool isValidSignal = + maxInDDSignal.ticket > 0 && + maxInDDSignal.symbol == signal.symbol && + IsValid(maxInDDSignal, xEU5MagicNumber); + if (!isValidSignal) + { + return; + } + + // + double volume = signal.volume; + bool isDirectional = maxInDDSignal.type == signal.type; + + // + // Prevent any changes on Regular Conditions ... + bool isRegular = + isDirectional + ? ( + // + xEU5CrossSignalsMethod == X_CROSS_SIGNAL_DIRECTION_REGULAR || + xEU5CrossSignalsMethod == X_CROSS_SIGNAL_DIRECTION_REGULAR_INDIRECTION_IMPORTANT + // + ) + : ( + // + xEU5CrossSignalsMethod == X_CROSS_SIGNAL_INDIRECTION_REGULAR || + xEU5CrossSignalsMethod == X_CROSS_SIGNAL_DIRECTION_IMPORTANT_INDIRECTION_REGULAR + // + ); + if (isRegular) + { + return; + } + + // + // Important Act needs to Multiply volume by 2 ... + volume *= 2; + + // + // Set Volume of signal ... + signal.volume = volume; +} + +// +// Calculate Usefull data ... +void XEU5HandleCalculateDrawDownUp() +{ + // + XSignal signals[]; + xEU5Trader.GetSignals(signals); + int signalsCount = ArraySize(signals); + if (signalsCount <= 0) + { + return; + } + + // + double profit = 0; + double volume = 0; + XCollector collector = {}; + double maxAllowedVolume = xEU5VolumeManager.GetMaxAllowedVolume(); + for (int i = 0; i < signalsCount; i++) + { + // + XSignal iSignal = signals[i]; + + // + profit += iSignal.profit; + + // + volume = + volume == 0 || + volume < iSignal.volume + ? iSignal.volume + : volume; + } + + // + if (profit < 0) + { + // + xEU5MaxDrawDown = + xEU5MaxDrawDown == 0 || + xEU5MaxDrawDown > MathAbs(profit) + ? MathAbs(profit) + : xEU5MaxDrawDown; + + // + // Update Buffers ... + datetime time = iTime(_Symbol, _Period, 0); + + // + // Calculate Max Allowed Drawdown ... + // + collector.time = time; + collector.volume = volume; + collector.maxDrawDown = xEU5MaxDrawDown; + collector.maxAllowedVolume = maxAllowedVolume; + collector.minBalanceForOpenTrade = xEU5Trader.GetMinBalanceForOpenTrades(); + } + else + { + // + xEU5MaxDrawUp = + xEU5MaxDrawUp == 0 || + xEU5MaxDrawUp < profit + ? profit + : xEU5MaxDrawUp; + } + + // + // Update Collector ... + xEU5Collector.Add(collector); + + // + // Update Reports ... + xEU5Reporter.UpdateMaxDrawUpInReports(xEU5MaxDrawUp); + xEU5Reporter.UpdateMaxDrawDownInReports(xEU5MaxDrawDown); + xEU5Reporter.UpdateMaxSameTimeTradesInReports(signalsCount); +} + +// +// START Event Handlers ... +// + +// +// Runs When a Signal Successfully Executed ... +void XEU5OnSignal( + XSignal &signal, // Specified Signal + string &providers[] // Signal Providers +) +{ + // + // Issue Propper Alert ... + XEU5IssueSignalExecutionAlert( + signal, + providers); + + // + // Add Signal To Supports on Guard ... + xEU5Guard.AddSupport(signal); + + // + // Update Reports ... + xEU5Reporter.AddSignalToReports( + signal, + providers); +} + +// +// Runs when a Position Got Take Profit ... +void XEU5OnTP( + XSignal &signal // Specified Signal +) +{ + // + // Issue Propper Alert ... + XEU5IssueTPAlert(signal); + + // + // Remove Signal From Guard Protector ... + xEU5Guard.Remove(signal.ticket); + xEU5Guard.RemoveSupport(signal.ticket); + + // + // Update Reports ... + xEU5Reporter.AddTradeTPInReports(); + XEU5UpdateReports(); +} + +// +// Runs when a Position Got Stop Loss ... +void XEU5OnSL( + XSignal &signal // Specified Signal +) +{ + // + // Issue Propper Alert ... + XEU5IssueSLAlert(signal); + + // + // Remove Signal From Guard Protector ... + xEU5Guard.Remove(signal.ticket); + xEU5Guard.RemoveSupport(signal.ticket); + + // + // Update Reports ... + xEU5Reporter.AddTradeSLInReports(); + XEU5UpdateReports(); +} + +// +// Runs when a Position Risk Free ... +void XEU5OnRF( + XSignal &signal // Specified Signal +) +{ + // + // Issue Propper Alert ... + XEU5IssueRFAlert(signal); + + // + // Remove Signal From Guard Protector ... + // since RiskFree Signals has SL ... + xEU5Guard.Remove(signal.ticket); + xEU5Guard.RemoveSupport(signal.ticket); + + // + // Update Reports ... + xEU5Reporter.AddTradeSLInReports(); + XEU5UpdateReports(); +} + +// +// Runs when a Position Force Closed ... +void XEU5OnFC( + XSignal &signal // Specified Signal +) +{ + // + // Issue Propper Alert ... + XEU5IssueFCAlert(signal); + + // + // Remove Signal From Guard Protector ... + xEU5Guard.Remove(signal.ticket); + xEU5Guard.RemoveSupport(signal.ticket); + + // + // Update Reports ... + xEU5Reporter.AddTradeSLInReports(); + XEU5UpdateReports(); +} + +// +// Runs when a Position Guarded ... +void XEU5OnGuard( + XSignal &signal, // Specified Signal + ENUM_X_GUARD_REASONS reason, // Reason of Guard Applied + string message, // Guard Returned Message + bool isStopOut = false // Specified StopOut Fired or not +) +{ + // + // Chekc StopOut ... + if (isStopOut) + { + // + LogMessage(message); + + // + xEU5MEnableProvider = false; + } + + // + // Issue Propper Alert ... + XEU5IssueGuardAlert(signal, reason, isStopOut); + + // + // Update Reports ... + xEU5Reporter.AddTradeSLInReports(); + XEU5UpdateReports(); +} + +// +// END Event Handlers ... +// + +// +// END Provided Functions ... +// + +// +// START Private Functions ... +// + +// +// START Volume Baseed Functions ... +// + +// +// Calculating Volume for Tradings ... +double XEU5CalculateVolume( + double forceMultiplier = 0 // some times we get more than one signal at the same time, here we increase volume using this ... +) +{ + // + // Check Open Trades ... + int openSignals = xEU5Trader.Count(); + + // + double result = xEU5VolumeManager.CalculateVolume( + openSignals, + _Symbol); + + // + result *= forceMultiplier; + + // + // Normalize Volume ... + result = NormalizeVolume(result, _Symbol, 2); + + // + return result; +} + +// +// END Volume Baseed Functions ... +// + +// +// START Report/Collect and Guard Functions ... +// + +// +// Update Report Info ... +void XEU5UpdateReports() +{ + // + double staticVolume = xEU5VolumeManager.GetStaticVolume(); + string staticVolumeCalculationMethod = EnumToString(xEU5StaticVolumeMethod); + double maxAllowedVolume = xEU5VolumeManager.GetMaxAllowedVolume(); + double volumeIncreaseMultiplier = xEU5VolumeManager.GetVolumeMultiplier(); + double balanceGowingToApplyMultiplier = xEU5VolumeManager.GetIncreaseMultiplierBalance(); + + double balanceGrowingToIncreaseMaxAllowedVolume = xEU5VolumeManager.GetIncreaseMaxAllowedVolumeBalance(); + + // + // Update Reports Volume Info ... + xEU5Reporter.UpdateReportsVolumeInfo( + staticVolume, + staticVolumeCalculationMethod, + maxAllowedVolume, + volumeIncreaseMultiplier, + balanceGowingToApplyMultiplier, + balanceGrowingToIncreaseMaxAllowedVolume); + + // + // Calculate Max Allowed Drawdown ... + double minBalanceForTradeBasedOnBalance = xEU5Trader.GetMinBalanceForOpenTrades(); + xEU5Reporter.UpdateMinBalanceForOpenTradesInReports(minBalanceForTradeBasedOnBalance); +} + +// +// Reset XEU5 Info Buffers ... +void XEU5ResetCollectors() +{ + // + // Reset Calculations Buffers and Variables ... + xEU5MaxDrawUp = 0; + xEU5MaxDrawDown = 0; + + // + xEU5Trader.Reset(); + xEU5Reporter.Reset(); + xEU5Collector.Reset(); + xEU5VolumeManager.ResetForceVolumeMultiplier(); +} + +// +// END Report/Collect and Guard Functions ... +// + +// +// START Alert Functions ... +// + +// +// Send Alert ... +void XEU5IssueAlert(string message) +{ + // + // Validate Args ... + if (StringLen(message) <= 0) + { + return; + } + + // + if (xEU5EnableAlerts) + { + SendAlert(message); + } + else + { + LogMessage(message); + } +} + +// +// Send Take Profit Alert on Specific Signal ... +void XEU5IssueTPAlert( + XSignal &signal // Specified Signal +) +{ + // + string message = ""; + + // + message = xEU5Trader.GenerateSignalTPComment(signal); + + // + XEU5IssueAlert(message); +} + +// +// Send Stop Loss Alert on Specific Signal ... +void XEU5IssueSLAlert( + XSignal &signal // Specified Signal +) +{ + // + string message = ""; + + // + message = xEU5Trader.GenerateSignalSLComment(signal); + + // + XEU5IssueAlert(message); +} + +// +// Send Force Close Alert on Specific Signal ... +void XEU5IssueFCAlert( + XSignal &signal // Specified Signal +) +{ + // + string message = ""; + + // + message = xEU5Trader.GenerateSignalForceCloseComment(signal); + + // + XEU5IssueAlert(message); +} + +// +// Send Risk Free Alert on Specific Signal ... +void XEU5IssueRFAlert( + XSignal &signal // Specified Signal +) +{ + // + string message = ""; + + // + message = xEU5Trader.GenerateSignalRFComment(signal, 0); + + // + XEU5IssueAlert(message); +} + +// +// Send Guard Alert on Specific Signal ... +void XEU5IssueGuardAlert( + XSignal &signal, // Specified Signal + ENUM_X_GUARD_REASONS reason, // Specified Guard Reason + bool isStopOut = false // Specified StopOut Fired or not +) +{ + // + string message = ""; + + // + message = xEU5Guard.GenerateGuardedSignalComment( + signal, + reason); + + // + XEU5IssueAlert(message); +} + +// +// Send Initialization Succeed Alert ... +void XEU5IssueInitializationSucceedAlert() +{ + // + string message = "Initializion of (" + XEU5ProviderName + " Provider" + " _ " + _Symbol + " _ " + EnumToString(_Period) + ") Succeeded ..."; + XEU5IssueAlert(message); +} + +// +// Send De Initialization Succeed Alert ... +void XEU5IssueDeinitializationSucceedAlert() +{ + // + string message = "De Initializion of (" + XEU5ProviderName + " Provider" + ") Succeeded ..."; + XEU5IssueAlert(message); +} + +// +// Send Signal Successfully Execution Alert ... +void XEU5IssueSignalExecutionAlert( + XSignal &signal, // Specified Signal + string &providers[] // Signal Providers +) +{ + // + string message = xEU5Trader.ToString(signal); + + // + string providersMsg = ToString(providers); + if (StringLen(providersMsg) > 0) + { + message += ", Providers: " + providersMsg; + } + + // + XEU5IssueAlert(message); +} + +// +// Send Signal Execution Alert ... +void XEU5IssueSignalExecutionError(int error) +{ + // + string message = GetSignalExecutionError(error); + if (StringLen(message) == 0) + { + return; + } + + // + XEU5IssueAlert(message); +} + +// +// END Alert Functions ... +// + +// +// END Private Functions ... +// diff --git a/BKPS/OLD/XEU5/Settings/.gitkeep b/BKPS/OLD/XEU5/Settings/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/BKPS/OLD/XEU5/Settings/xeu5.longs.vbb.set b/BKPS/OLD/XEU5/Settings/xeu5.longs.vbb.set new file mode 100644 index 0000000000000000000000000000000000000000..273e17a67e016fae53a997ad63e98c2250decebf GIT binary patch literal 7584 zcmcgw+j1H?5bfu!%0KV{8^<_~olEgR>^MnPj9tb_{K~?ZPz#3Q5|gd{_T8MLo<`Cz z1Y#_TVrHb#^yxl2>ekHv|GkllOr#~>C6f-WhjNGGf$ZadD0?_pajeQQdaLMrEzji$ z#}_z1kw1jbPvx8RV5K6rIQLb=o#TShJ^}xI*63M z63P2N#Jw4M>3PqMq_-Lw`{)h*rDt9F;qIu9wEQR9ZQ%EC{2SMwV4X-Bv$tZL&?kDs z=pV2Zqv!@qK0&Epe1F~EdqF~RNN3Dy!R0MedqtSR#Z>a3S;j}Y%h*9Zmo)Y06Wz6 z_Livs31)eFOI&w1@=iWO>lL}gTn?SGJD5?gY(FAY3{^DGpM4i7q-fmwACp=SbL*>|0iODGuAoJ!UXsa*PplC zgtAp}+uDxfyaHDfw?kML65g39Yvi%prGmSQcVy!1s zn(5{O%*Bz`u|BxRWG-VBDtgJ4u^e*~&u|~e)%69>_FbLJ*z5RKc4EFm-_H?4-^Db-xrf>FG0=hxHz)zM6=X*-BS8wIBLpI}^*QseIx7z73A~hQf8;aanJU zRrD+GuAJ_eV>Q~xVTHS7R;GJcAHx&+b_orP;2EKdot$B4*t%9dC2G45NNy~_$`F65gd^8&N=DcUWtdJ3)G zgVSX#9Rzq`mSBDM$odX$J)0oEhl+GA;|yn!YK%OVXSlLVygnLwZR{Nekud`rbG*-Z ztXX`iV)EmDiaF;*Dtgymz1=g{%)Hla#cdw25#W(y~9*b&2Gb#Ni zR-94ax_RgBrHv=U`96b1z6J3+#9g7z&}YK39aJQ}P|+q-DGuX*ZmoQrLEND z?H^)nhF)6Ub2DkJdd5ClLwjjiSH8OuwULrvqTPo697XrZ!1OlM6S^HzQpokPvh1qzXy;*UT-gn z{GTAo+e_lUyOnqH30%+Q3b7nIW_J)#&ul*yd z{Q3aKLYR)JmD^=}`z#N~I&l z={dB-yZ#2Ku+G?yH@01%msOxG;V!JX`u(e`+()S7%30QQ-=}-euJK6KZft@9J;aCg zybC+1!{pkX6@|Uw`c-~pLfe_QDNXC+)YTsIjeC-H;=$E3);W*D1p1%OKQFlnW-H^i zl^y$e4Xh^ags{%bPneg>XUr$>XTYNmKd*#%Z?^}idG0csqR3NU?4^&OM$Y2Ldz_0; zVcigxPGDCLk-E@W_*mBCcGVZ`I$AJ^XHsL8GS+%RrWtQ8 zfn4lq9s7f4Oy)9Hp|X|S8OuI5v4-bB?yk>R+jn&?mvi(|9(hxPT|7DScUZ`^_Ccx5 zbGBilbIgm)b+5x)(TVX6ZNGpIedp5%_a36>eV`Suoi~clo~zgDo7&AvZQg1BvgLJ` zBUq8v>8--iG{-oFHmtWm`PGD{%vQR)$^FnCJDFHkO=Szu_ibRzHx%ykj>~#;?4rl4 zyLP-|j#Y1;2Nj-@S(zRneGE%z+Z8x4f@RF+e3Me#A}Xw~+<|qREcMOt#*MX6zxaksc zw=V8Hy|l41jQ2St@-2wpA?{1nmdx|K^H2K$O4OzM@G&0Pjv{_z)JyK{AF<-Z`9ypC z(>|U}C#^WasI}wh#V4KcJiu=c{Jvw~E^ZfZt+&A93~#T?v%@!3ofW?KEzjTP+^6#W z>5tz@c&-e!kOy}zzRcG|B5o-k!n0@0jj|4Z!YpeEWo)J+MxL7Ls3)7C%6VyVrH1s# z##&Nh+eDpOk1S`U#Fg?>qZ;c-iRle?+WAJf+RT*LnvT@?F6&8&@uj>)ru``IH(;-y zn-XWQB{kAjno?qY3Y3}kPVrlxE5g|+@ecK*M!Z_rE-=5qH}TCe=j>fzPCdKAJl3@v V%o{(1d1FVIH+G15sOvc~{~r_GJ~03Q literal 0 HcmV?d00001 diff --git a/BKPS/OLD/XEU5/Settings/xeu5.vbb.set b/BKPS/OLD/XEU5/Settings/xeu5.vbb.set new file mode 100644 index 0000000000000000000000000000000000000000..c3b40992523f1f6026475f1412702542a0c8bd53 GIT binary patch literal 7566 zcmcgw+j1I55bbAIkQ$Be}=*h3w;hD0{dc;L3J}r(^jIPy4tY z$glE~JQJ>;%4g|AN+x%>4&ha#pBRu68%W$1zHD?gF0~^0ULIIhR zK>rcOX6U8neK(WZs%7k>Hq@7z_2eHnqB>IYbF{m_@8kM6oc_W8^mAV?^Cs;AWkKQU4b`ZCRA9e4!Udrcc`XnB0K<)(CxqQX% z4zmW%ezx{qUpU@cU^Ja9vZ=TsLO8aG{DISdTPYe(j1}5GkXT-9Y213u?jhtbuD6%O z_%Gn)?Im&F-N;+{h*;0$622U{$i9U~ePsI?VZ<8_weWE8jPp$g6HT8wv2(N8K<$7sW$gQ$Wkhd zn5U;eiFf@qSYe&99dFTgj$T%Qu7ta=ftvjaRr?V8>IhF7vvHs9J-ddp4{CQ~8xhcl ze^}3Z(1REz*Y2z+?A5lfBsYufq_1I}u%6t60hY|CDA7AYU%YkRk z{v0;*TsU6BeYHT{KK7OoV;*&nQ}1I~ai4p==! ztUZ9!YAl8O{xCphefG%u4sJc`Ape0VQeSSC;p#H+YHKWi?%{k9^2kNQ^LbGBd4Xyexep7E#f3F|BOUlZp_eQ&&WV_j4)zTY=WTht=Wqtw5u_Z#PR zo?W_F8G8E+68R3quMqc3wU%+`+44_3p_$K#rMu92>hNtpk-rJ5CHM7@Xz|+FM1B0z zKAsJeTD-=nwR!g}#OIvwG{7$p{JLXbF8rzQ23(xt-L*P9d_UD$;agvI{x+vRmG94f z{7S-8Wr(ufxpEo7pDwq@hoRmzTfMaI66Z}?Z ziEwsGwnLn>eAgrGg7I^F1z(?W&fW#%#MuqwG16`rZ~YMCtsODm+8N^^(o-`2KMu<~ AmjD0& literal 0 HcmV?d00001 diff --git a/BKPS/OLD/XEU5/Templates/.gitkeep b/BKPS/OLD/XEU5/Templates/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Projects/XUSCHF5/Classes/x-saherelm.class.lib.ex5 b/Projects/XUSCHF5/Classes/x-saherelm.class.lib.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..6fa51c27962dba39513f5c8bd53c82b808fde245 GIT binary patch literal 9642 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 E2k9DaJOBUy literal 0 HcmV?d00001 diff --git a/Projects/XUSCHF5/Classes/x-saherelm.nn.lib.ex5 b/Projects/XUSCHF5/Classes/x-saherelm.nn.lib.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..cc8c404a010be7af8480fbce7fe2577d258d2ec4 GIT binary patch literal 4622 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 literal 0 HcmV?d00001 diff --git a/Projects/XUSCHF5/Classes/x-saherelm.provider.lib.ex5 b/Projects/XUSCHF5/Classes/x-saherelm.provider.lib.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..b2568635174ddfad45ae8e1bf7b2f35fab295292 GIT binary patch literal 12298 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 literal 0 HcmV?d00001 diff --git a/Projects/XUSCHF5/Experts/x-saherelm.xuschf5.ea.ex5 b/Projects/XUSCHF5/Experts/x-saherelm.xuschf5.ea.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..54880cdd698fef66fb6a0fcb7e5b5569f13e352e GIT binary patch literal 262270 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 b2lp8T8NjH89aUM=;3F27(`X)eUTXdi+B`5= literal 0 HcmV?d00001 diff --git a/Projects/XUSCHF5/Helpers/x-saherelm.xama.indicator.helper.lib.ex5 b/Projects/XUSCHF5/Helpers/x-saherelm.xama.indicator.helper.lib.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..513f261feaffba99db65db5f4061d2ec9bfa7878 GIT binary patch literal 7932 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 literal 0 HcmV?d00001 diff --git a/Projects/XUSCHF5/Helpers/x-saherelm.xchlh.oscillator.helper.lib.ex5 b/Projects/XUSCHF5/Helpers/x-saherelm.xchlh.oscillator.helper.lib.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..eb475778087ca27cc2d3fca7c3b41c2d5ce88b1e GIT binary patch literal 7842 zcmdT|Wl$WcgF zyXV&Jd;8q(t~!0I`bSHHc-}b!EV0Dk0Dl1k*!@@hC;xBoe9xds3(SZst4Z{MC%qy3 zH~+uJ|2fA82>|%V{}WOO9Z~TVK7Sx0DGeyH^kq3v+fhzdpQBX4aTgc$^+sm1U!~SE zST_G>uOz?`-~{jnxB#pHmH;b&8-NnP31I*0T!0UMb9I36U)KC@T^e8qu>Z@*0W|)O zl7BgezpMYL{C~zjirxO+fGa=%@bRyC{>#|@&i}33{9n4+{@&03Z>9gaOB?{Uzujj4 z&&B@(+sd?r5r~fs0`WxKmYJz3OM|`|9D7Itxy64Lmr+~|UhU@>ne$D%TSqD8f`z&! zBj>Y!_;m$2CMEF?Pu4>`y6KRZGQzr^KEI%@SFAry$Z04&O$)faFiW5vX17y*=eM1m zy1Ldx{k?QSu9_H?#tbW+^KxX@dbVQ0{2>aJM1HNx?}1ZwrmtLAGY-iMqN_~&Necsr zpkmr?E{~Gc>jP#Dm#|36d2Q*T6t67^nJG8M5|M-rT;3_UK{LH%%UO1XSWI#H-}{`K zpb=G3ex}SKjw75u24iFTf463(E|gvnT9nDR(6G|y?zexX;NyH)hl1eLm z^ywpMNGlU&qrYK-b4_Lx@$ zXDOf3V};mEUAL&W3kSD(^a|>0_NN`Pxr*_IEs7KPvtM?XS1bzID;y497reM^Z z4V`A;SQ;{hq~bi)^0!_$A0b{kRuY_s@EU@WL^C~CvF`YrVLxAXov9vlW{BF|c$L!N zxR9JDI)ik6_?UWh@Z$+5Q+Zso%{uDrRPoREOCNBif2wP~73MLKdO;WFGN%AJe_(T| zv#Tr?92cN=VhM{|mdH#+@{cb^h6FPRegx~U3rFnT6NU*|RM4K$?^K|}x+E}#RuS5v`AMiJ()tkZ!ea-R$KA6IA zuu~;y{W1ma#st_`)>&LDZgfXY2RCSu&@wNp>WltdtL28)cgrzfj^MupNw+cHC4ykm zvm!lbwxvp51B7QN$$K6{`OO?3t5@~vzEm78Y1D~y$)271_O2T*^$|6Pck|%kqAFPH z9fsekC~4`y)1KeoSwcQG!oq-gq7p1{&_!_gc$~JLu8E|;dS|^qm-@Fm=gMz9<*tag zyQL`G=KQ_J4*92=cCi;uQ>^I;(&vXOg`<%Dp?F%?$c>Nd!bqcDIHNzjHmsM> z8!?j8^SYWry=M~c*uxUem)fFZT;eg-7|q=jz{0^2x^yA8guToe?oUdB`sUCh_d!|B zI2Iy5XuYNce)Z%9drVWO#FmzCR*+4+3cT{%g}~7|0NG4F{rEC$2R?q3VW$3SM>e3t7Bvb zV!*ufut!P!GedxT)0&!i%JA&PA8?{uQg@ zo}f#2>Jgf5&S@qcMs$udSBn$X1a*_!ESgQYamuN0v4?w$CYk=&d^c*@GJp21ieG7_ zpel=04ot2or#at|U~UDbM?HZtl+TGJ?-{J+OlW*_FQ4-sS@}Uuz>l*@X@bDSanl2y zn}>oN=omHHa+S8%9$5h1gAa2~D$B2RE~WbxQpVWJIIODrj-qEUZ)0hNVQ8`wsy!3z z>5N9utcQpvI2FhRK5EG}k&j{pn-3Ytyd!;wu}pp$Z^0L98iyv}HH|*}!R%>NP4eW9 zuJi;Bu|Z-xxcXCV{dE9_?pxMRRY5N_x&7bC<0NFEQ^W-v(%qP-Igv4D5i?-2N3gSZa&OZIQK(r=>v2h*d9i zCLyl*6DTca#PL99PaO%Pc%L;3xFn#U7^(9^|7v-+EV72;0MSfDvbl_*x@lfNtP6#Z z0z$3^+ouQ@yY)lDL$tSf!v|8Y{ZHygfD^CpqTUrHM~-^0gk{kNw3@l-G8P%64D4%T zh~d+V8buO}BqrD*-5NNr^l*C{vqv&so|Be9;85%mQ6P3Ee0*lZI0~_HX`VNO*{QmS zsOO!yA6mu(!PAw02_aJ&GGq(>>N{mI<*&D65vlm%E31x+&d<|{Nldw@^n=p*I%#b| zE~?w+c#cMNKBDT;4+(xYH{fsjzc_E%XmB)QCFw8WH3>dnO~HeL?(FbNHnEOW5@_9Y z&VykX*tCJUL4b zX9uG0U7kL^cCD^^_;|;CN06(@Qq#6S3%w~oxbt%_rqWDld@sbus0M)ET&ehpm2%-l zS-Mhj%?rLRuHMZL5`EDyt;5+#{38r6i-2k1P2u02{_Gbz3l|V|QSV^uL8V*JDG^>UK;9MyQ|JP`5&SD)0Nv^_;A-z{L;8vO>KeH0j!*!k8yaYpHmRWZ4lJ zUH(u~Z3FIP?PjNSnjfQlvfs)#n^Hu(*vZHI%>{8V^s>a~xTT%0$PvVQgoyf;j$@6_e7TUd!J+C?L#S zE!RbKHzM<97M5oz6HDBcos=mM8CP@L7uUFvM7i|mc-Xgo<5R-z$pmjp9kIpeG&)kZ?7GqgXB-WR}mE0K2k&wz$WIn_hs+HSk? z!tF4~SvXIkXQVf^CWOG!?Kv z;`0x8`<%Vh=NV_>myH7#Gqozz1JKV^3wa8WBBEorqA?U}C^SvK=8E|hv6KH14ZwYq zkeACxm1bMM0k+!zEf&u$~bSHeMalvpYA%vt49%eQ}XE%Qf7 zi>*vGw6>${l4>+|%8E2~WSqKyK3DZ#0X`5b)>!VnR?AQkTfBSX(4c63*^24mQJ2SL zaSo(RcaMT|Jtl-Dj&uN|^h29O;677sq=$;X)ZvvFfY zK7oaP*LLi3ciy+9Jci1BAR~r`-oR9?oov@z8NczjAdV^7aP10ACNE5*-1xLgM1$>F zqgW_I9HQ)v%Jk~m^k`*x!6D0X)M;j|9pAfDEk?xvl9#_~Uq(Ia4e{ zQ88m!`Qs4r%X;Sf&P>_U>DsEc=5K4HH@i^=(?sg}-vY@w8Ws~qWLkg_AJT@6};iKJb|4o8HDbI3M zxcr8rka!kDP_b%y6N#jpO#ng^+ZYdbR`FxJTJ}EH&1CiRVuhEaB|Jw6+0Pdj_AU9G z)u1^`b(j|*`kXQwCK$uM7+D0&Ipr|&Rea-{XfFh(nl!ABcS4bifQi4pdOMRne3w;A zVt*ON#K&>VfZB{n_)XD+$jJiSwM+~K(Ua7IxuvKXNikN)hQ3(h&x8TXzLhM{k~|Am>hv`+3^KsJ4Yky0v(n*JDyG zMf|nE%Aod-7M@g=WZ$t%>}6a=cNP(z#j|UA z?5NYB?!E@HcWkby?U$Fjekj_6->$#4s*Y(?;lDba;!lWlojOtO(oz(UieJJDo)2$Q zp&@vN)Q1$OIXrT>e8a~vVkr7LC{i7sZWsvh#Ssd7RID$>{$saiVG~0qp>e0UkCuvz zQw>zreMsxs5>k`DV(S%l=@d#72^UtPS4kZ=sf^ch+!F%j#q1-8W&Y`p7yLX(8$9sq z{kv>M-2OihKg_rV2M&_uShcWAcTLT}cOaHIKVVdaqHmkmN){3%5uT=Neo;@B{^va& z`mlZN$|SnLSPh!8))}~<+MwW*omB&wBCe?6@y}!;3^iA!X~C|Z9JQ$MI1a+u8U;~{ zUr?y0M~b&5^GiIJIy>yPg5&uSS5w}Zn7z}d#^H=v99@zv#wJtS0$*q|41iuIny{sB ztmV-Eachvv^ zUU-$khoW%L5oui|vBa*%dt0bXEQ92B!lh&2^zAM5%c}3mtiD+&^>SiFL8PZJ?qfbZ zqZTNgERj*ba~8-DzD#0Rdm%m1G!2%e?6g&*EmsB}S?m5@IaHsGe$jc46KgpPr?~Lz zOpDJx!F$Xyid;ZZYVQS>hcYeA9)ZAg&Y51KF_n&L{F|S8S(4p$^3iJ=^*xe<Yz6Ta5O zx3!GvL~4CyZd&#Se;qNBuN6hg2rX~UtKUQ=sWNRv$T1O3XpIqQayBuflw~u{Z@1r` z%h7yV3}8#~n~QiqIMN{5GH9QKMfkixSyz%ErzI5x}5}Ktjw1`iO6f zYNA!7gptX>I<8fGiw~)(Lmu>4c4e(Q6Fo&w5Gxjj+15Y}WREJYPSsYrp zP561Hm?s75qUJjiT$$7zo~BDxIZK9g4B)iQxruF72tmj(`XOGtSO)S_*>egq+w_IDc z$c17nf%DF+73(N&w|lrn{Jp$E(d^!NI8QT%vV>lwitgsLEOIyPDaN14*}UZxY|8kz zTW=b)8e=BE`q3b1{l6oO-}s6-&8YY)Y;1d2m^240^Of6U5rqgDW>-)CaQk~_1v@zE z&X7+_Xq~cNad7!#utG16)-K4Rv#wAvjWR=YOJ{X#E0;9%*}fm)m&6>haE>Izb}#d@ zx+yPwZbiZ5+78v%{2FOV(IADruYz}SkQ*=9OIQk-lH_s4yxV*cUSq5@QM;uh(aRB<-BUd8|RfGZ6**9&uFzDsUN$uJWv z5pSQH8%v|rAe&^=*~?&k86~)Cn}C!1F=Qyho*rXlhEViJ+;E}Mog4xs=)3#-VCKU; zB>!byuF5?NgRVd4r#X5+PT~|q`WgnRqDx?ny)x>+PBA-582417a9V20JvZPnsSj$+ z>^QTbVg$4sGW~r{t=UKHuU~Yb=#?GH_>e$F{3Eime*2lr4p-Ek;^{(5A^wv+i)cW+=bUFV|dXw=G;!v!TZ+vrQ4y z#X~uafr-kA%-#HD(lH6GuTy%c4#kjQa~@FitCKKrH>VL;H2w%szPanKE0!j5P*p&d zLpM*h>`8{?ptCCZbh1dj=eOTHVvTAMqH%&fXVdfhK7*4z**>}j zfo%mq{Ipm{lVa>~)y?OB`e6f6`=n3>Qsp?cqID^oi3F$KJlN!^p&@)Jzi>yDMG-YT zL&z$@2ZlOQ<%XCJ<6o;JTkl1YM50Z7@xH_rhS(UTsq?|OEruv&>MvwHO<%!|Xx6{M zcIrk)G$RW**6+NRjh)${RUTg`-gD3dyJX!AE>k}OOGa3QU3OvgM;nxuY*^D>W_Qz( z1_IU|LmB#Mki_Eoa;$fFCMUe?D$$)()38Hjy_AFBezL;b*~uw-OUf($Nz4fwKGmJp zPbstEMt{{^5ycv?#zP@J#2(Ys85x4-JKzOtwk7iL(XoHd-UG3ho>lCzan<8`9ueTB z+bKSWVX*UfgoiwdolqpO5r}|4jo}=u=$?L+&lSeSeq@O~0&%nTtEoPmeu(w2kY~s+ zh%-;ct&=1P2{AN{*D*51D{1s^NXAsDvU7RFS&7ad)?#ckP+(t9ue3=0iHa=a!{mLJ z`ZDL~W9bsNX}(;?WI=0CQqB}}ZWQ+oYX?$(`-|;>SpZmllQSo^J@=G$43k-uF=NU} zyIrpj5_7Q=LKoigK}M=6*pcEkf%&b9Crzp}X7$93QKlAB>ET~my-z9Rq&6}oN>z(75tZ(91pf8RVRP2RdIWenW*>Rvs7UO#9#P?59V<)`Mxj=CxXWd5=h)R|=T z+rE<24r*R>8I$!+Np-sXb%f^DSLq{Q*>tAOFF#XNd049G~^S^aTfGxo8FCzm`|GSF+ z<-mVW|5N$@jDHln{Oy1fcfvVS^snK z|G+vj0tjghh4qFh!IbJsNd^XDS*q^nKLpl|rqUxR%TY3&9`=!WQ1mjajsR$7haPy{ zRSC{yH1&QFcF>d9+_r^!HJiJTuXA5vI#Ho4e;x%6txAHmobbgTna!U@)M1XY^IH51 z%X+AOu)y(;7yWiX&_?fk7K6ppTkZ&f7=8$6bw8qrcc#}wRpOu=r<}=}59(6P{*&b+ z;va%Sn$qtVrkdh=mkeD6reP+%vDmi|9I94c8J9s{uE*95E4S|y=tC!`4%GB9U;up% zI1ESRMVhS?@@}R)AK|Rs;g~u>1NtpGh4c?HWkv}IA^!a$!yk3f4nKNpZRnW_q2g-6 zv;dd1q6Kyxi;)IIh&)<8sq4nkH>)LI@D*iH$)(p1=JUP*@>)I8~(?%kzE5itX?otHO7$!_u3E##VqUXoUx~?L8I55Oj$-T{QL8rQy}Y#19It>6Yn4Lqm^KneWpQLK zh~hbTn;d=5plTzXF2i<$bjhv?ap*&aefSA8$rDSBbs$$`ex4+^W1tN^*Li<$li5HT zDeuEOyk9U*KcE_0`UTuzVQs&uSkxB4JzgW)fMAvWB!s*m_Us6|B*cEJjYU8|Jb7pH z^Xkb7rmbv;RIJemqRM8cDBlz6NP$vFaQ=gs;x>bg5^3-0z(7DyV%aQePSk}zbI^W3 z7!D&&)dd;Q)ea_y=!c91HI=hCeRYj{=Ss=3(9U7iU{LpcUb(5hyiN0_$jOrK0*>LA z4(xL??Qetg@{cVnX+thV)N7wICpj(vD_L2$92^orL9za-+(=EWREa-YBs_qTejS3 zbWnRq;?=@lKXCtii<4o>{dp7h^=_sLd@VWVrK6>R6r757+xA{Zze>x3KOZEdVylvO z!6a8*(;}ii@IxWBP1SDLP(mU@ae$6V#oV4C^VF-?C%WRd-?WYF+G|9(>h&zx_}h^6 zT`Cbh;hwuV8d6)&o)7jrk!6H|nVFs9ZFiLV_)2n`OlKFh$_ZoLy@>nqjf5Zut=QuEQz`it zeD?RVRWn1%EPH;Xp*{cF*v~&n^pk}C4~(^ z7WxzbaSe_7Slhuvjir@DZAW`zQND?_U{OrCocZY3o977R3@!cM7^&*a2G)?%^0lrR zMeL4&bg`R&-Lf#SsmmD#at2rC#5GcT&|of=pSL1&w_9a+MYnd^Q7va#`ZVI9LUx5# zvk~WPyAyM^Irl^1fJt+j_`LyBR4rH)<=v$IN4_JDPuZ}-e(|EwO?o93PaXDqz^~UO zOj>!^$D94y$0-$pmQB{L@(A-K7ewdEx9KsuS$To5{hk|NYB)^XchV=^ z4*`Gjg!G66qg^=rDwhu#vu;8q8kjSY`2qgi`m9E(237*+zbJ6so(TO=Km7XsW)i=g zKLyHmP1c0ah&~2PLRCS5P4c|txaz(g{`X@c5R5X0*_R&9n8%Wb(9Q^~*cXS{>JCnL zjfu-9#l(^j`Sw zdbNwrO0kXI<>HF9{&0yeg{)k@R^^z+nG(AUF)f!QcUKT9md-Mo*>7yAA2h^ABv}GNV)3yQKEDo&}#DG{y_AJ=3&E2J(;x0E)0lLK< z?bme(7q{k@ue#tevRU=3nv61mLH0CX1s>{iAehHA{^YtJW<3 zNqL;c4t&LFCE7&TWmjOCr(UfiH(UK}v3O(2N9X3-V>F)@K>>E38GIq)^hXHay`PP? zmD6t=i`2nlKS2QS5%>1zpzoo1P2GmMrC027dYJ7?HmSiT4^6+xDUDkhNhWrcxb0U* zg$yqBC8_otyOMD$(|>4Rgs=&3gm5-oO<;#1H*A(N+d1xEEq}{xHfZqGY&rUT6@fBW zF=*hsuo;^im{g&_x~}W~`KR9!)u71x8;x>Km*Rt6{!adl?=b>lsS11yM<>$kck%(x zS~?t?o9X`BnNh?1=`*BKzUmdJD)DG3wU{}@4*tkd{2nL)B6tz)PTchL&#t#Hxnebf z`cF>G{-5;qL@uAVZ^eO_aE1VPshZGwk!Hb9jTT0#nPz;AWpVW|>7Pxad#SY=`;Faj z)p~NR)nBcLe2%iH(v)MWYlup>-mI=iKbsaWgq)p?nZqtrekp3nflG>^3wz|Ja3X>& z&{!zDQybAwW?Y{LVT?ufdh-&KG$4SQCbq5AeXZqKwhO&7ZtZFKc~(wQ;f?;abbIxA zHZ-U^2c2O#6Ng(_^w?_8_Kef-I$?hFY|ut;bnaMLhzoNcMj}~XW`EWjdctFKSmYCN zGqKJ}fZ_*A*y@~H>rV!R2eK22$LhDuRl*)qrZGw*=%G0kcNxd2ky*@Epz#Jpr+*F0 zTWuf8oH=s*CboJm)jb#nC|s3C=~%v`QxmRR^(_%{TlRAj4cXX5=owHPsUNoevFXnGF z$-mS|g!8IP#98|Au$-0ZN!IpV4D7~@fEZImfP#_xfZFd3#idfWqja8*Ffda738t&$ zLmWNk1gM|VqRJf6U|rc0P^Z}55+iBuGuN7KT+PS6Fy-+mJ_nS0&xVfm@%hp`CjWvJ z%198rsU@W#AezrM`F5xR(9a@{N@5)N-mkMrsr0VdB9tc0(g4v6SOd-S+4=TS|B)ab zq}*g*I}M?g%hov~mX-hBAzcK*R3;T^Gj{F1Z&D|c@z$Qse!4XuR4(Up^(q(UT^2}! zxW%!Kb*TXb-rNLys4BZjmzdr@jFV2x&n@+_v6Zq|*)tHNX06|L0PWoS92O{vz8Dyi zl_|d{$v2RwRH;zN1VY!n9@&Isl8Xg?sb?Ibtn0#j+Pgn&ntxB;N3f6D;%%<;h+$Bfv(QrmFI$6gJ#IN z6f$y3%P?jkdR$X%BV|V8XS04WX z7VQb;aeW-V?rTi#Et$wP-ua$cg}&za{0_f`&v&)&6A@+wCEIw>`IU1;beRhA`SZR6 zB*+kQDd!oRX^veL?dYDnM%%M>oYu^9!*FQ`si)^R>_7E_Iz=EAn0po|>6!uE%w?S8 zeAl6mMl274EVv1jv2vk#m%>#=TCn+c_&14H$LGb`(0=q=C_M_n^?Ui(FPQKV!qx5z zRpu>_#aqoDNP?EAo0Za@K`H^4C)UDwuw;{C<4VB3tE(s6lNt@4Yu!@c)HJiGycmWe zBOew9Qd}G>9Y)JEWB~&Ppc6o6gLY zn4>oOdrUW5!l*OhmxR5{JYv&3$ z+D9l_X}bjrc2e3O&y$;j-GdHgX1hAR=Qc4@{JE|HJM-=1EshDY)%&DOQ++cpbWAVL zqA|+m1>18OL7I>}XmVx8IG7?D++YmUx9~mhMm(lOWPc|nlXPHcAibTOOD-Xt7omFv z-6Da31p(%Acm^-WQ5)6tx-3iHDS1#UH~Klq-WI>7&(XtN)ElWOwA-FPm2lLwD~87| zG%>@pAms_eCoJUQYhM7|P~`W<2^mr>``DGWSJ1>d9`C)FD$E}#d*f6jTlCPt5?zT! z!*7k$AwNOrydldmg@aVHx6Jxv9(v;^ef#-4;SAH5EVRdT%1;|1{=e!ntGF&?8s(LP zO&tj-5=;BPz%A7==)H2ex53MJ@&gJrfSrU)gX7iTh+Sod4@TRxR4KP+Hu3}JlOeJq zodZ8bj6QT-npIMk;|Xp_QRe2xaVr7e(yV+kt}JIjcTFqzaON#Wv1&m&&;YW}3#q4k z${E0v7>6yz&T<~Y znfk$B*mNHfdetRW+gL=nM~rVi06!-92bv^%q>GRR#*A(Nq{8*E+`pJ-p+$%qG)(OPdxFB= zrAZ%V%)MhN+(n#5gnZO0Kjh2|&mPS18;#HLi$^5G_a`EB+%Y%1C9evTEf!u&VH+r5 z2aWHmO?hICjmnNXrv^ut9MG`S7q+KaJ2L(xMeZp8UjLLgsv;eDb>Ha-M+^X*zUUnZ z@6T{gPdZbNn7ME5dzQ05D(w=GC>^;C%4CY#Ese1uh)>SH(z9b{+75Z~?fSE8zJR16=8ii?78TDDt9eX>(W=x+MDI=U_Rd-=Mb58LN8JmSU2d&;nlN_jaVlxtfU z91rY&! zp7{VSjBoW`(N}Td-`fBkP?WD46(B#Sa;f6_fHBWY6aM|ys4A>3hS2QAiajB3Jpp_> zVv7+%5B&_wxV%JS%_LTH&?im9yIhcJ)SDgkqMzD}ZJf0rZvjfTBw$ok!Y73dH%Rdq zJSPAI(YnoZK!|tCpQZrwc z-Q9U5a1|6B_0FOJ2$vhcjEdV}ZpVuu*R1+;<9rxz#pZZ7Ra7d3&M*Xy3k(9fl-suS zVOSHFE-cXk-d!{XH`9f6TfGwqTZ=Clp;d{Zm@eM8G;E1Gke@9s0Fb0FDk zOT6hFt8*61o4@%QWSN+`C(4YGj+JjeT{gG;7_=na5?>a#E58?6^oX?qs?ts^jh0z- ziXwP;O1<&i@7a4lLWD!IgWTPlNs=c(nF)mI+?(zDw%4Ssr)QR012UKknRs%*x8kV4 zt#kurIlZ^u=oYD<4z|S3+7Hn zgG2&Bcl?&9s8(#!vgA1+)rjX&oe9$@$vnO_Te*ecH<#h#P*fRo7ZxU%bOWJ$;&7Mj zfYGSU+fuVsey*CG3~6{Q#V{ zgbjR&G}IT=3X=LoTNxuE?5%r>bVn779{Q^Z*<`~3?;Rs0+WnMdG_C#xf&Uuy?zlw( zmC6rkS(73l&qP!t2m95COhpy!`!Fx<%S-!U^%o%1$ ziDppPg40mpPdkE2joLyP{2bH*YIpYG$`Cu&Z8W!kPS0wt6M#R z!r!kd%l_GP(a4d*l6bmeVF6Mr)Dc2Ip%k!_hLVEO4yV*Oi-pZkEBWXE{T`uT zKPa>JjU-dtx{HIXsoC;q=6h&wWY~{%UzAI~`yQAot%UWCy+e(rN>t>mY&D1B=*{MM z$5&mk8<=8)e5WpO7KgH0G_#$1wxxFvPe>+Ec}9z^x%$O#fw-?v#pjMBH#`s2f5jo1 z@`H|J+RwXrQ6NHk&IYwHpI=Upa?c!5K(H6>k}eL<3~4#lXN@1))_8@UPO67QmJROf zxM_RFUsa6>Pa8_>M2m$daSB;vGy$%hOyt=31QO_;F4p`MHzIb@L0{9Y(9o`Om!E6k z62MU3$6GhS{OB`CSG}A<=N=x<0RNCf!3C8Mk1yoTvh?1sxa7-F@Fax|WZay{UNrr| z{Y7MHbrLsjOuk5J6thMAiay4=II3B5miWSg-bdbW`*BE{<)C?&?{{Lw_^aeR!u`h` zjk!kX60rbPt~Q3yY5i!UxR!fD63ABbBFqN;;}L?2N0H?)6Ir-0!KkL(J6_G`%Wqa6(+)DD?NS z_{eHbIlzF|O8|#3sUX=VpV4Gx2qCdB_p7;-bFdYW_O`@m32(}D;lzqRgHBPXoOt+T>a;-d!pdCT*lWa7>V zJJj$!BvA9IYQDaxlG z1XvD!Q@$|jiqA6xcXO&n3a%zkwAR|d`A|tu1149i>@=cuH{wD3rnB(m-0A z6+ttf^TYWZ-o-vGbd}VgJiQX5b~& zpZ%)S92Mk}LaC@vk9)9NeVH>wm$FEP08B1F;g$vJjZ-%2s*S+pV(ojvE|VVJS~l9c z1s8-#ViQI9&YV8|HYesHC!m%(HxYO9Qx&qy&JYBQ1AUfQrH;p|U_3Q zfoB|sVJ*tw!7%_FB-s$dJ~QP=Qtx?#hNG(W-1v8;uk~41&QDz> z1`Ob{&(Mo65vyfAi7u~>RF7^aFd+H`7)qlVM?AXhe;B&^Wv>WAOK3nVoj%Saxu5Dc zA`tZhF$45$9=yH=`W$}iqep%oVhCZyMpE&7)B8+lM;ZU&mz!r{mmiP5>^o=C_c_LW ziFR8}ICG-@?#Pj|qAqV*+!S+4@$HZ$Pf+D6K`RDBCy+OAi>|AuHnDEl1M@Vi{9bs` z()V8WC;6}LOh}TzcG)mS`6Zgu4c5WD!#UnJD|u2oU(_hKq?o6eY23TRCO_tZ=Bitg z!ul|WK97BMc$2uAkuWik`gwvJ>v-UM>6(5-4#^znuUEgPo|~mQt7o|4kM36GzWf)G C4@}4a literal 0 HcmV?d00001 diff --git a/Projects/XUSCHF5/Helpers/x-saherelm.xfi.oscillator.helper.lib.ex5 b/Projects/XUSCHF5/Helpers/x-saherelm.xfi.oscillator.helper.lib.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..2a6086e865ab4ecf44c4586ec1072b6a5dde5cf0 GIT binary patch literal 7592 zcmdT>Wl$X4k{x_-cMI9c8JyrATnG0s_~7my+}+(0G`IzK4X&H-?Y@7nYWMG+ zu9kcH-dlCLrM3CsoB)lI@S!5NYTw(W<9iO>I4*t#mulaxe z@d5$>|M-8xFZyW4PIeS+FdE3{K{dtDft;N&6H$a;CnD7*=ZLnni&s#}= z1HcjB32+8{1y};C0Iq;{0B!*1U*`d^{;kyj#(!D!zkO+dEx_(C^9i8-H%k8H?El{W zr}O_A|0s6-I{_DfFo5H)x&O=9|DOM?+x%a;+5gVx|F_cryd^FG``>MI{^#cZfz1+# zqYpxM(Dh|7U}9Glq-)j<_r2uLhl9tB4;Jm2x;Y6CPA|Ug91$_t2ugrh~6 zS}YvmJpE#~C!HtHM4+QED?9Mwp#7uyQtM%p%(7()gB>gBBU>FTN{>xHSQn0Y=%zD}Y`% zGn>HBP5*lRn&g$Qrae67qah!kI$+__Pvsh7`dJYp%j} zM2GAx24b?pr4&GV^3Fm}$6xaAFc!6vV9MY%wJ7i+mZ+vI!j=Ih`8KP!A=r{`Iqhod z_UrTpd^kj){Er^{lonhS$4`3OS0UdpMiK^F~mD4Nd9g3)-g{!%aP!4LfRG7syGhD}l<0gRzSh;XPQ zn<{SaTps!(j!#Y7{wN4Ddb83}(HfHO+gN%;RNRhCmtp&j@RLzh zDSc{1=a2241>ZO~^u>w-$a`7vmO|;&=zzU~xZ#q;fe18T{f&RxPfllB{p<=WQz?g5 zu9Al;k8^#z&IDWd6WOn+Y3l1j>!T@MJlcS$$)Ext;_P{(7u%%?y<9`0a+2GdVpsi` zC+B(a9PP7v5N6!hFv6qXy#})PSHu8Y%@iK}kN6;ZcB2Y8a0QZtj0jdV6VI0)SLUr9 zigyWJ#yD^~Th`dmZ9p2J-H5l8pb&nkViu-m!_wVX&oRqaJw)eT%kjns3(lws zcp>huqV>uOUk@p$jjiuS!$BHFFhZG4R!AdA$7tbgx~+%WO_NA?gfO<$-?lS5fIi(( ze4{w}2h15>wFPu`bL9+;bp}WvQyMlLKCsqAvNd+Yz3FUBOH>61(wr$AS*83WGhGYN z`;WkKsTg6>QX3KS$3TzL{2MIGrbh{3CxH_ur@@=_)!R*276pvz*!6oY8|P7|%ODgqq?vv88QRyTZ# zFEU9J%*_gAInv14zSxqxa4|CU^^uatV&fSV@`AYgA&B|v?rqeQw(vE!@N~~g2M&j? z6x9#%`KCE4>~CEMN-)ULnis}gQe&Ptb|1JIu3%<8qJ9K3V8z!FC#9oazem3_gx?FY zXfe=o!{Q&0sK((?5b`>tdP2tbDAHg*MG$^6FMddc60(k(YURLU)3M$M&%u&@47fwU z@@;tC)H!jHc>h8zIGWlqM4T&j?pcU^RdCj7(n`gw8oCw{2a_2;LM^kLIKg9IPl3>{ zX!HBACv>dRt+)DG*=#{4V=9j7Vj9}Fw%73KDbeMC@$^_`JEnJrZbfwRGpzR%l%RE| zZ3p1(L|HS#cYcDrDUiNFc+&%xm$3_p+^@QtZ?27sQ_IuQOG6@EwOg>#uc%_H8av6e z*6Ja@?i;NP*%?B-rqm_Oe!e8$czS#8zm7I6PHvBRBI|HZ@Ezbtf4hO-cIR||rWzyV zf>5mMO9+^hRqJy(SqlgC&5Qf|j5_5^wg~GK_;%u=tGAn==rCFg{#F@2BL<=1Y_ z(-=jJ(1T=9(}G+w{caz))a)gkEPUadIv{3M)`E@S`ZHnr-R(SldJQ-8pb|di98L<- zjmbVI&kPP?YS}x#x9#;~1u4ceGA~Z2P3(N*cEV$8WG05hc9&wW6If^e`68% zZVI`o`-P}%8bf+*M^_=NeBgAzAxX0Fy*`2l0l8&pijrethG?X$`ZNdTbdnR@C>3V! zhZPFTB`Zag!gcnE%v?|LogYu&FrG4_eC`_r(xrqaKc+eOQM0EQ|uyI&8I;DNt?B##R6UWY|U& zsC2#$TZN~nGbeZW5CjXcw18m`Z{+vBI-g93F&`R8EtiFz>u*1XH0}ymW&Otf2nJ8g z$syQpsotDsoBUwMud6nuJ{R!1LTDEQkN*M+GKl*tp%8}EJ!ikd?SnJ7f$;dsir3U( zuOWLS(=H2;>|r^7Or{|2_4e+O_dme6n$nC)cdODg=MzjSN#7N5aK4;|F&dh^BUn89 zFt%08m%E32u8vBJrRdnEG~@uh35#{T6S@Awg@3|$^kt9^PPvJ3M3{zhpiAGab3ysDB%$ncAh$~kOGD~g$qY2Xrhj1YKF?hkg2NUkT z2Up0Lpu+|WxfvE-8I6$X$b4Am)627+KYd(4?)N|S7Wim`6C$6^8$$~upnEkk+gFq@ zinmauN~8^LHeXhI)ct5D(i`-Ce!i$V62`p0SaFZ6Y>w|%eW;lhzp@c6<{E}=LX4X*RAGFj&3 z-r`o)w>f%q%}iB9wMuY(@#1M4}^)?93x?XAu3f3~KeWeIx@#ayLMPCYuUqbR+s@iHv zJWb%b+yA!t+h7B_2MRpEXJMh0QuT?lMzWw#)wEm8@d%MD)O=KHeU`-Xc{u-KcQ zqOtOd(D)HtHttW^*ESC9mNVE0yTg~`NI8jE_qVG#Rj8H^Y3r3P6|&)Ak}x7)6iF6z z6gU_RAF~+Fn7+EXYd|pQqA!$qbyYfC&ItuAutwq;zUkpq8q-u?$x!q!L`aCAK2TrU zM@KYNIi8~NRg{J%r=ImQ+|l)#hHq-OjJE3T1-9r7bgb&|%lRGA_nIrYMeK#<9#KsD z2XQ|STwbT$>f95A!sqI^4z|l6krUIQmTd&V7Sb@e-Ke&s;pUc z>3FX3Xb*Sl6t3KTX|lsskrlg2$EA2;qr4H(I_z+*n=)f%A@ha5_8WZFaxy2(=|4Eo2102RPhli5m!;Kxg zro0pBTpDG1qz;l2I`*t3cFFw?0OkVjxF?a!X3x{!7Vmx}hHR5`VFe|S03&X%+&$h- z9nETqVvC9}?FaP=IvKSNEylMa@w-6oC{LMfnj|K7@n&&Av-Y~1(PGlvnUWkbJ1Uk- zv!9Qeuz{9;N@4os8oD?LWFg4At>bJ6J6dvuFXGQkgVuwZiqP}oCl{=wGP_?`_w{JJ z@Q`~A7tGhU7K$kMC^X6o(p=->V0kSG)~bQ^OSRkScv!j2UYwKJd{s2QS`iu6rzO{= z$%h2C`6W2@rwa&79WPY|Y+yarda_9c!;>l|xN<-O5vHP3VKj#?Bb`g-f~A`j+# z#G6O5z2+8`za<)do)0~@Y={E}!lxMq~U(b9tS zD6NuH`(E+1aW%e54v*bNBVKmYfW$etf?w`TDJVWKHc-J#Ic=0Ip5eXT)?IfVGIjGG zJRPo8zklH8^601(kz!JZg7JA}V$f19T=^MP9^XnQ#F*te1S-EC@%+y8eWV8(UFE^q zmzBOo4C&I_y*(Q$VOI3PBB)|y-S4!%4i4mr&LYBCe>l(#M}T-C7atb{`+j`bh@iIl@dLbyvFR&Op>K0fPpg$~4c7#rCX3 zwFuJIx)4j1(L6F=#6x5^x@j=(rVRVuAhPRptG}iw*r;cL)BSftK4p-VXP=*uF!M$N zBE!z#wGqux>B~zQ8jA7@#|O)I4-HKpQjBL%|iL6O6gV8MKkk4@Pq@4b%+NN^SYh8a_o9Z;aIk( zjqR!F7Ac2){qQ0~4K>bk08OrVnf~Ko(+p6b|96hF85|xyM~*IO+kUO?gbUW>s?~Ir zSQideNIpRsM-1);MECcvLA|$RG?eZ(q9ZbXFZG(e{tJl^Zm5@a$fuzmSy-AVNeDL9 zeFidKg6NPYcW7=WjrJ3>VVQo`28+;m`%(zeAW?>USS8zN7y5Y140CbJ=X3-YRpe#s z(!0+Qc(G`03fVK~dg>LZsA)mXnWX_4zx@irF?r!lOBR9egNAUuu8@$NrWm>qHs%p& z^%|uanSV10)#t`9mGAfVr_3i=efEn1nGf8aF|&J>4&pw!8Z?}9kjBxm zs6lX>2s18r$7)~cqAgFZo}fZiP=mdDNAus@G=5Uz2LB7P)TX+a6u<#b zyz>swkx3xWVfzD=^<7?mFu>P-)p;HwXUi~GS(rry?;R`sPW*67R)q9Sdmgua7G}xK z@~aVnHHWg^*c|WL?ZcdtLxUN14Bx#<ervVqtVk ziJ`FR&W0)dZH)%l*%Dez1BEZ#DG*K+^tbR)_3YDlMKP&UsV2Ix;H?`W0QXI{W3tLu zuN=zunzzof0kYIU$*8st`EK8P5_1j(4Kf8c)UHcD0HDFkYV_%v_aPdBe7(kxQ++7F zVz$mLu#``HyV{);y9gJ&lWaLjx_J_VGSm-G&3BuW9Hh~aF8rCdHjz-QRZH2BC8}Dj zvtC^?+k-Q{@vy`1|w9#RVr>Wdmh|_^$ucpAE1(Owt?u+Mxga^ z)ad~;HH8fSg+q-&SgZE3%*U*TSn2Ht;G3}#iuZt{#-I>btOoFo*PRGuhfiH<)J447 zh1~!t3Z8I_Bw;xR3A3P9)1pl)E>xh%VW%jm>UGV-%7Jj(8#`}qI_B=F4Us)3aWNMn zEB-x2Sh8b%N5a&YNF5!B=y+UPH1z;<)_MzFPgk*S_u8XIabt4hSS=iJu%uKVJ|X*@ zyvzVaBqa^m5t$+8$?i}s!3p0(emOa0&7k-BLq$P^_H`(qSc5<#53zbw#RI-(*b=%G z20|;cQy$b>-d4=U4HguETy%*^39p|_aM~TeR!Z>++i*x)QYki%K~Y6pR`Ff*RI{Ra zt7iCSep0M4An%K}x6F+jg(lILfzl9C6|WWKFJ@c&`rj{RmXBr}AII;-YdQ2B{fcI`Lb0t;g@WvE zGnK>B5tQi?tr-1sp9MvBD~Wh;91ZK2Uk31IVfUj)dPUUH?D*ax^2xV?uZFySeOFIN zG_8Y1AGrp^;YX@@8?}ZoE*E9-DGrXRWNb*M>f}3Gp29dCdMWW03+XdfI&@W*WT7U+cRo&D|j_IA13!m%cWYogy+H z6o|sNo4JcjTPR>V*sp{wKULY;HE&HY&DCv_ceUB~#n7!kjT_-vWSIL{95A>VO2HVb zu!7xk*LC{d)Wd7yj9UGO7dL2yIBfPF#8*a|T&!>_`$=ozP3;HW*uqj-JfJJW?>6O zXyqhY$&la=$J_!uuX| z$k|GJe0}pPFj&e(Hm+p0m1Ak!zkAfzhh1ZbNhg>R_K0t!8%2J1mHaL3cnueNztF^0 zI0SOWO$?gPvdivO9!IAv6OEgW!p|Rc!Pqy0E_y9*^pEwLmvHbR zqo$@v&H8%nnF)fb|4fknUKJ$n3wkLt;zAsNvYpkyzFZ(%F}|OQvY(4eRUYvgf4pAQ zGz^zp^mkR%ev(!P&mTd@=w+X8d=0TaV)wYbx~M8Wy&r6HM$)xSo2b7mz`7mX!8}S$ zZ}#L8zxSOThd+?pH=^^6&Wk42+J34|7#zybRfCI+Q5K}2R~?^oyk{dhi1>6{=q3+b zzVl%AakmcM%5RoOJdk}w>A5Prq16yNo($y`U$kLv)=vA;FxuRAAfJ7|dBRPBe?whX zPqcnvHOqOokkl7Lphkw9%j+UWP>?8L!+q?!94{R6o46v!&{eB?@nq2~pIzp09SeJ} zC|h}cIqegtpvl~Z7pxHdb+QI*O`s;;9^5znuwZb^SyjI#&h-}@ieJir&jDTrSl2&1 zL&$3!p0n1mA26Pg*kZQd({s6->Iz$)-|N%xRT8<0k}V_s`jTp_z3bT${N-RNbczeN zelA)vHFi{hxpzM85`YJY8q>6=Midmn_&EfAh3$3HHi~#b%4arKChPKLUM%$!#bBv0 zs435GCYV3=Tb9tgYIh0|I3#jZw^o+CSanrExlil7=>ApSRELN86{KGf1F=XTr43gx zUXseQl0)PHgbqZ1!!FvX4#h*Lf7bu70n_R;Jqp`UBBn;<7?2o%CO?0c4{2$ID#_gX z1%13+{EgxpN?o=&ktz04rp@%)0WD`;=VYM}NY=D@ZOepfE70k5$ea2e1>(0MvI0D} zb4-Ct@6nTT^Wd~1UWUkLKm4u3v;V<#Ilnb4pmtcav^;)C-6|O`2AlczzS%veb5oy3_WT77yfUB^*ab zUcJl^k;c&Ei~lAJFRFmc+&X;zan-O5wiI+Adecm z_$5+->D7nD812webRW*mQm1+=>rndi|X&%zjq4M qge7b@4jmon3jDbjFS_O0fML&W{i?r!SD)rVxhDX0pDJ_7_5T7byoj>^ literal 0 HcmV?d00001 diff --git a/Projects/XUSCHF5/Helpers/x-saherelm.xlh.indicator.helper.lib.ex5 b/Projects/XUSCHF5/Helpers/x-saherelm.xlh.indicator.helper.lib.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..ff643c369ea057bda5c434dc64a27bac9720df3d GIT binary patch literal 7750 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 literal 0 HcmV?d00001 diff --git a/Projects/XUSCHF5/Helpers/x-saherelm.xobd.indicator.helper.lib.ex5 b/Projects/XUSCHF5/Helpers/x-saherelm.xobd.indicator.helper.lib.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..b8f8930375accc5ea50b04baa4c274623bda1946 GIT binary patch literal 7530 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 ku23Gg=&s3#?cBeZ8~^|S literal 0 HcmV?d00001 diff --git a/Projects/XUSCHF5/Helpers/x-saherelm.xrsi.oscillator.helper.lib.ex5 b/Projects/XUSCHF5/Helpers/x-saherelm.xrsi.oscillator.helper.lib.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..1d78c23aa5e1cc19068f251fcfe5d9256f24aee8 GIT binary patch literal 8180 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 Bv!eh2 literal 0 HcmV?d00001 diff --git a/Projects/XUSCHF5/Helpers/x-saherelm.xtd.oscillator.helper.lib.ex5 b/Projects/XUSCHF5/Helpers/x-saherelm.xtd.oscillator.helper.lib.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..1f193c13da35f60f0c10718accb40c31b11be9b0 GIT binary patch literal 7938 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 bvYgNAfMec!HQ>u;o9L$U!O_Aa%6$4SW>`Ah literal 0 HcmV?d00001 diff --git a/Projects/XUSCHF5/Helpers/x-saherelm.xtm.indicator.helper.lib.ex5 b/Projects/XUSCHF5/Helpers/x-saherelm.xtm.indicator.helper.lib.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..f690c043f98c05dc67fba1fc0c1b689d4bb25820 GIT binary patch literal 7640 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 literal 0 HcmV?d00001 diff --git a/Projects/XUSCHF5/Helpers/x-saherelm.xts.oscillator.helper.lib.ex5 b/Projects/XUSCHF5/Helpers/x-saherelm.xts.oscillator.helper.lib.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..1653f0979cfb7425af2fe9dc5ad4aa7dc9a103c1 GIT binary patch literal 7548 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 literal 0 HcmV?d00001 diff --git a/Projects/XUSCHF5/Indicators/x-saherelm.xchlh.oscillator.ex5 b/Projects/XUSCHF5/Indicators/x-saherelm.xchlh.oscillator.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..5737c1560b039305382409437e4aca7279d3b9b3 GIT binary patch literal 46938 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

alY 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 AKL7v# literal 0 HcmV?d00001 diff --git a/Projects/XUSCHF5/Indicators/x-saherelm.xobd.indicator.ex5 b/Projects/XUSCHF5/Indicators/x-saherelm.xobd.indicator.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..ac6333577d5a1e07465d77a5f6551e0ff18221f3 GIT binary patch literal 16438 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 Ht=<0uybA3M literal 0 HcmV?d00001 diff --git a/Projects/XUSCHF5/Indicators/x-saherelm.xtd.oscillator.ex5 b/Projects/XUSCHF5/Indicators/x-saherelm.xtd.oscillator.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..020e01624f6ff277255ae125e02a37449656f239 GIT binary patch literal 19390 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 literal 0 HcmV?d00001 diff --git a/Projects/XUSCHF5/Indicators/x-saherelm.xtm.indicator.ex5 b/Projects/XUSCHF5/Indicators/x-saherelm.xtm.indicator.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..4fc0c41fe32b5ddb625542ac553d940196bf2993 GIT binary patch literal 13428 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 literal 0 HcmV?d00001 diff --git a/Projects/XUSCHF5/Indicators/x-saherelm.xts.oscillator.ex5 b/Projects/XUSCHF5/Indicators/x-saherelm.xts.oscillator.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..2810d1f3103a7df5adcb4d195bc0fc783b12d338 GIT binary patch literal 37722 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 pp&RW!DtJ>aB@8(R8aq3d5*8<;KCCUjYDiiJwJo zSlr;M=6(5?Hs=1ozw!T=|MiY9DFE%rX3a`a z(kOq!3dv@Y3JMpCS^K~4ssP*p9soap7r+VN2!H{60PFy9z`g5`00>?0^#Rt`sQq3yzT$yEpk1d|81uK ztdbZ&lc7txG?_;TO^sQG~MHbxWWjl!@B6iQ&g^}w*rj%)8TDuwH zcN>O3HZ*q13suJn~3*|KR{oG5kXIB z2sa7=-c=Eoq|(Dc%0+W5yi7vxRtnLZPB{46F?t&K>Dux=M#{ahaHGR&(ksk9$x$TJ zt@Si;rDT_*G*xBQc<1n%#qWjylAaTzYiEii+`e7&yj}RB*FT8nm>`oQx2r|_fZqv& zedL_^i&g(^H&$r=`-HAhh_VLpi3e54q=qRIT^qFnosl}}7Lz4WGr1+$J;P?hf4gID zX=2(X=3(Ab4%$ZzU@dTE6Ah97j0x@2A{RmLz0|;?Cb-ICE zWRw4b)dpwpqPZ`$ej>2D-?hiB4H_PB^l6?*Mg^_(tnxqzsq)LN;zNhx`_&WIgH=yE zl888o@6u&G2VO3w#(WgpeN;Q~#5)mlv!?neENj8c5aE`THb)V4a*=(WjMPj`voqf= zeziCpC~I*1%v{a`e5r0vRf@As5{(4W}IjFth8wzwLLtq{1+49BvM;# z?mMsL>AH*srnbOd5|j6)1pcTTtK77H8n|K{Z#$WbwV9H@wgEVCHRYn~`ZlCyZ#CJCJ8@3ImdB z)Qs@HKBOc#mUnk@+`?nW5?}6ONROI3-OZ6gX$Z+!HEuGTOei?*^G2_ziztjiEPtP7 zWvRGfe|Ntez}OANa;<&gpE8kXGRnJJGQDKuXHQQgSIm%RNzE1mP`n~iv1Z?RSH*9+ zxG$Xf9l16ino_k+Yx;T#FCmtyoSfm0)Zp<}LJDU({?Qz{JCwlR`0nMV80R+8s-|e^*e{}w^@_V?=V=L> zg+H`H?UW(bB*85veJuFmew`iPnnAt;keu?_`nYZRf#K?vTodF z%=kmCbAB`6P<067Az_cfnKqr)C7471>K6oG+y1793_UHrb~=1h!Hn=s@;&v6b&9-u zYg7dE0CK2GWpUerI}l!U>a`BCk|4_)hp?mDS&9lizx^!wr}uYSXDd`r!nKKul{R%> zreX!NoJtp-NWlB#73d>`dc{10PjC6`hiH@N`fHQB_YrWBp=`ei7AMTuQ`bp-w-fJ` zlS`R6#RhUo1>f^xqQM$eWvG>2k*;q(DXUm8#B01q*2^Q}<3^jI6S<(4n3N_Kwp5cr z;?u^GMaatE%S?fziS|XAt!@^I@qL|v<;}G!4H6kO+*=*0oCq+&rI$!c<}7WTA5>;) z=Uhy4p><+%EEZZZWlxG;GSI1iIvw&9#Q1W5pjmrk;&BpLzP#rei6_gkzC`N?GFLk_ zR8gcQYNC*Vg_722-loN#I92Z93LQmU^4oQmpxPtIU1+1RO`6uL_Cpb zXb@kxz-#vl#41G|d($trjebD~4(vQ0*NE~IOwd5%dKGUl_RO01D`>o<(QSG4Bi9PD zDd1DTMGwy$p;7fI*%Q~$7;_rnwXC{$l96En?8&whvU55>BN) z(TUY5emlnf9wZw{cq$)b8rctUjozPhj9+y@-avBvJht5$Qp5$D^S$RRtWbE=DrZ>@rY+U@IZVRC{6355mzU-1K*R>Il^l zMW+H5d1HjqfvuC1p*-r38zpu`f|)!Te>)OyoN5GsQdi-^9IXrC!{aYT5WR2L-mH}n z>EZPVLa#{7bhMP zu6m>PymBA{QuYeApW6fCf8e_{>u|660V`>#r+|hEGpoGZxg6C z^VJqCCtXG>Iw9UB{d}6b6hOImQxb{s6w%?=zRP}mOQ=-0^6Zr6tCzE~x& zc3rJD6j#(KF=XCuaq)dp3*E|T*2pZOuy~@%R!(gzpG^AWzH$!+G5Z@nD#?+Mi9H;w z48BD~@u)kH;)O(uSYaA#W_dX2YY>iJYSXej%AJS_%c{U*&wIErSCPG;De2v8daXxj z`qs??!OCy%=U8<6-_lqHfWVN0u3wwuPEi7%ZCv8OH;>~oMg-=ErZ5QW*HF0hv*^N~ zlKL7EtQW=lwNzEhVoPhzcgg2B7mJ*hP&jMV$6jmX_*nf9vy~!Lgq71^rsE{<=Gn%b z#Tg#r^*BAwWfjcicWOF&ddjL(<2fj~QVnZdZ`3N49c=_+%AW@w#I(sQ2Vu1xBqMrNE29~*VbZ*;puH~^>x z97uNHiSU+41-)#0%Fk9ag=AMhQn&1ZD&JRYtUVdFz;%3iV;08khg}6kT+^onVc;*7EA%)f2M2{KZ2a_zN(QHc| zivY}}V|7U5e9gdzI6lq-2$vc`du-xE1Z7;X7szVl$)`N>bAOZ9=l}l(+^D0HFU5%toC_2ufY@ddk)`- zy9{0wAdgq-Bz2VKB&E~4E_jHXjcoZN1x>OyF@%}#DOB-s=)1^}wipWPE5MYT ziK~}4PkCeuLuN&$R51FRVSIDpxVh+5)z+CM_@vGJb&~TJUeO1!WZdU=!TjDx1|LRO znWzU*Q=ZMIV5vSh_m#N+o{04Fi$)|>>QgWB#V%oU!4i6Q07u&U)NHqvk$QspL!ott z5Zhw2afXd#Y21-@!n{iohOldie^^AwDJxvkG*qz_hf}?Szdx+WS$L-M{NlTSwHuxw zYxC#yNn6*KJ5yJ6O)LY%?LinCo>86k_qfZj=r(k3A$GK)-P3#W-jyA&wyv55B*V=4*Q49xGK z%J0)GEWGC>F8;Ex$bfX~6QQ98VWq|3qn|pf7+C=}0=ln<(BS>9yLgKk23z=mrcYJ` z)kCQL%0zA&_cmEK(^L#)HXWC;;}O<9Qk@r@9W&J40zD(VdON557170%XZv095RsmT zKXWs(P2sA6aYB*+)+90yW7lTQPK`>c(> literal 0 HcmV?d00001 diff --git a/Projects/XUSCHF5/Libraries/x-saherelm.log.lib.ex5 b/Projects/XUSCHF5/Libraries/x-saherelm.log.lib.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..2779577bd1760a66c621cf1fecda6cad6f8a9b86 GIT binary patch literal 7802 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

NaJgNe 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 literal 0 HcmV?d00001 diff --git a/Projects/XUSCHF5/Providers/x-saherelm.xuschf5.provider.indicators.lib.ex5 b/Projects/XUSCHF5/Providers/x-saherelm.xuschf5.provider.indicators.lib.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..3306d9d718111b0d10fa11a4e705c806e5e742d3 GIT binary patch literal 34150 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 MJ-=lZqUGuT7le;*0ssI2 literal 0 HcmV?d00001 diff --git a/Projects/XUSCHF5/Providers/x-saherelm.xuschf5.provider.inputs.lib.mq5 b/Projects/XUSCHF5/Providers/x-saherelm.xuschf5.provider.inputs.lib.mq5 index d901c24..45ae41b 100644 --- a/Projects/XUSCHF5/Providers/x-saherelm.xuschf5.provider.inputs.lib.mq5 +++ b/Projects/XUSCHF5/Providers/x-saherelm.xuschf5.provider.inputs.lib.mq5 @@ -50,7 +50,7 @@ input bool xUSCHF5EnableMonthlyReports = true; // Send Report on each new Month // // Trader and Expert Specific Configurations ... input group "XUSCHF5 Trader"; -input int xUSCHF5MagicNumber = 16940561; // Trader MagicNumber +input int xUSCHF5MagicNumber = 16940562; // Trader MagicNumber input int xUSCHF5Slippage = 10; // Trader Slippage // @@ -68,11 +68,11 @@ input int xUSCHF5MaxAllowedTrades = 10; input ENUM_X_CROSS_SIGNAL_METHOD xUSCHF5CrossSignalsMethod = X_CROSS_SIGNAL_REGULAR; // Handle Cross Signals Method // // Max Allowed Trade Age ... -input int xUSCHF5MaxAllowedTradeAge = 2000; // Detect Long Time Trades +input int xUSCHF5MaxAllowedTradeAge = 1500; // Detect Long Time Trades input ENUM_X_GUARD_ACTIONS xUSCHF5OldTradesAction = X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_1; // What to do with Old Trades // // Trade Volume Specific Configurations ... -input double xUSCHF5StaticVolumeFactor = 0.0002; // Static Volume baesd on Balance +input double xUSCHF5StaticVolumeFactor = 0.0001; // Static Volume baesd on Balance input ENUM_STATIC_VOLUME_METHODS xUSCHF5StaticVolumeMethod = X_STATIC_VOLUME_BASED_ON_BALANCE; // How to Calculate Static Volume input double xUSCHF5VolumeMultiplier = 0; // Volume Increase Multiplier input double xUSCHF5ApplyVolumeMultiplierFactor = 0; // Apply Volume Multiplier Rate based on Balance @@ -85,9 +85,9 @@ input double xUSCHF5RiskFreeStepInPips = 0; // Make Trades Risk Free Steps in Pi input double xUSCHF5RiskFreeRate = 0; // Volume Multiplier for Risk Free Trades // // Guard Riskable Money and Profits ... -input double xUSCHF5CriticalDrawDownFactor = 0.30; // Critical Allowed Drawdown Factor based on Balance +input double xUSCHF5CriticalDrawDownFactor = 0.15; // Critical Allowed Drawdown Factor based on Balance input ENUM_X_GUARD_ACTIONS xUSCHF5CriticalGuardAction = X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_5; // Specify Guard Action on Critical Drawdown -input double xUSCHF5MaxAllowedDrawDownFactor = 0.40; // Max Allowed Drawdown Factor based on Balance +input double xUSCHF5MaxAllowedDrawDownFactor = 0.20; // Max Allowed Drawdown Factor based on Balance input ENUM_X_GUARD_ACTIONS xUSCHF5MaxAllowedGuardAction = X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_10; // Specify Guard Action on Max Allowed Drawdown input int xUSCHF5GuardStopoutFiredAfterTouches = 5; // Guard Stopout all Trades if Max Allowed Drawdown touched diff --git a/Projects/XUSCHF5/Providers/x-saherelm.xuschf5.provider.lib.ex5 b/Projects/XUSCHF5/Providers/x-saherelm.xuschf5.provider.lib.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..9371663bf36c451d20c8777757700c0f83c5e0d9 GIT binary patch literal 33186 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 G)Bgh^(uO4f literal 0 HcmV?d00001 diff --git a/Projects/XUSCHF5/Settings/XCHMACC.set b/Projects/XUSCHF5/Settings/XCHMACC.set new file mode 100644 index 0000000000000000000000000000000000000000..097d6e936bf10305f68ca61f024ca2eb0f7f4568 GIT binary patch literal 8182 zcmcgxZF3qo5Z=$7>3`q{v z_&t%=^0WLToIjU)8A3`$`nZlDsUjUCX%5LlNaQnKr}7!2E4a30hVK|-=lIT+vnRNt zydK(fGh-kxA!%w_WAyyD?5)T`e#NLZusOd6+%fcB03ieVJ#?v|-NT3qeix9zaYS#! z(l3ycLGsMAVuEL!P5p;vBz0E%*hihHHT4_FSMx+QrQ~1G?m&wne*eY&2S_K9TJEG+ zW~dXjAqNk@CHH;&l1-w$U-3ou$mBmuT`lkDm@&qOKFiFrh5RKgIhS{G3F}*sG?7QN z+ZfR`p1Fm7M4U+-GH1Z;$^ZEDF=k|JXRB)Z{O8Sx{J30dHNtlegi~lyL&Vg!nmvQI zs^O8*L$%T0W7DJBF!spu03Uj4U{J^=xndlKPj|7H7!4zfv7;>e2>!EOiM#kCl->jbV?-ol`Wh?kJtC=xo($Tvk86@SqmGqgqg=1AOtiCC z+p$&X>mG9Kuis+63ib9SzXQvkq3Z~FFGL9?hpkjhq;W2mad%jhPvE@=#t&`H6CBBr+5Em+0dNYN;@J?R*{ zMht}ZHxU1<#hJF;mZD6aGx)LfUaHLz z7F)+yi^yYacT8!p$q&j`Ormec73>)q`=+=KO&+oKsAs9AyHhKzPn_M_pR%E0asv0N zP1rGB9lE>QO%IL07HnpY(jA7Y#n;MKG&ZjuRwJH~I*1{j@_26Rnq0TQntMve8xxbv zuj&EEi@V#EAy(krs~&+dgFe*oBO+r8{dgX-@!;;L!znbeAL_uiT?5+B-dHr+Yqk8;s`Xk$lTAK7 zF34{l|4&4gdiFVaF_z0WTjs1eSy@;$b%=`*eP?51No|eAO-zIR*yf}#7WwXmCxTv62Ig*-iv71HB3RpWFyD`aOUUI}i|>3Ma=SUB z!9|F>V>M@aBO>1(**32!E$qr8qciNn%mCZya<=lNyQ|_Io5d#XSyGo+1>{#8d<(+2 zYpHYb9oV_Rxq5xhdOfUT{ZrxktbLp}6vx$ze2c?+)JJ2q^o{?S_sLP%Qh&{1yM4nI zTLpO}SDEeuE9M&_Hn2+-XPl$U;haciu^wWT!FvmPVo}yPwhYdRQx4-HQW<>TV!d8& z!MPn@2JaTD9PZcA%HaQ6-XgPqz<&Wnqu$LZ!v_wn952N1%J2jKjbUCr$ET<#{5hL^ z;qP&~?SVd8IlhP^roFMfjq$zL;$Go@gl&DnIh%YD@*lQ}RwTZTo4v6;GvQmMJM(WL o3`q{v@ZU@ahu_R*ma$mV0(<)`Gecp8Kt<<-dR5N=0&M%NNO{i}qL^aX*qOekXEZo(FO$zhd-Ij^#J}s<^ZL zqx>LTKa&R;fJ#Mrcn(3SA{|3%2Fe3avqM!qdZD>9d#F{=%1uFrrw0>5)0zNkHF^6v$&R`2InF~UWg<>uX7{*;!S%avS0`W7gSZW^|2Z z?!g}sr&0&aDR49Sj;n_`LnAwTRWs(lzmCw4(kxS_LaK{jxo^j^$33*fJ(^LtniZOO$DO4kegxMMm8YnO zP7sqdv@}NJV;aNZ?D9x%!Al0P9jl{0cp{R`1NNyD!+h|(WEG(t+!shwtBqMiT1GW@ zqbIX#ayNC_$#+mKIQm+b&_7>`5R?24I?PQ4ww~OaH8(j;rDq)+^0l57!kl&vj~auI z997r=y3~C+hb>s~vM%cy`_i6jTfM(A89$cipXal&^q3mxDJ@p%Fo*XIN~V zVa}fG)zw5UiA`oOs@{z zwYK9!J+K9tnWJ=vVYK*M*^0*I)%|kBGg1dW#8V#6ZC#V==7_oHc)T+{$^5DoaC&jA zZ8gLSoO{(1Fs9 Nxk+Cg6|fA?pvWMIKJUiM_}J`!)u2oTD*swAt>`Xd#2-tSu)6 z++E9AMBSf8nMZjRX9j5_#xBrrL%SF7zbEK+)xVCgD_cA2X;G!uDw^8l+v7F$Tg3kZ zo~4$3OI=)M{WJq}H!Jh~cg7=F+jOwr_k>H(#wCIlaMoh-pJiOw$fHK5*oBz^HsR%LX-n6t%GnZ|xM!uj#3~@a;^0>heqAd&7k`3w zE^w}1U9(yb>sDuY1+44!Zbb?kIJ7iYh~cHM1OJU-UOmUPt|k06DQw~6rLjgF zF{M44_%C5odvHxkdk`<9is}ZfQHgN(^Z4Do>+!~w9_&3`q{w5i|gCc_6}*G*=EoiT3XuM`f<1PsHGm~{Hv+dhvLA?c9J zf#HUMJL#l-cAs6XR>yz;zLlEf(w1+MNf-BHdBpFL9N>E*ug&$f9LlfgJw)Fd)Bgtj zC-Q^563(B=gA5?0COuq-kW`b7ku-zk0VMJnuM_!-(KTG#GR1dopa1+iB0nydS`G1?0pScY0dpKfC@F&ah|V@Fx`5&UP{$R|_%0AU*` zx`wzuX#21rFZ6BLN_lz&Ib6%3ec{}&m6F6YpCb}qE{VRl4bYApWd#Y|D+HvR}B{Td965Rr`O8?3Ysh@=cXIkaaV*CcaB9V^8~xn2)Vw6j;+ zu~q2n9&+rj-*UbR_4Xyd2g_ff>kxS_LV?eyQvdkO?H4KJu86gHY{#<49a!QX%~iOX6`FX)ouwoG3a+CL zIzv5lf;D-HJ6)skKJKN(C+U^kLX-^PJ61=1=tLx&2kccPhWX%m%W6V9xGzwqRvWX3 zwOrNQjh@V|$=%eklkcEfaPqY-VSK(6A!hk4ILu82R?cpYnwy-a*0T-{^(yCuFsEH0 zqQ=l8M-?^zm%1SS!(I-)Jp3UXSepJY-pIAz`bf6 zc8pht?(VkJLnE*So0+3@hv91RwXzkB&8z#>h-ah@Vu+_ap4+-6*Uho!p40Kx#3b{p zdcg7G?zUx!6*%{*CtysW4>kOR$e2Jso`-BaxI5}_22JdTIUaM%b$*0F9 z`7PrAj>uBaz9cWka`}48oHZv)3;7<#j~snxV|&!rSlq-k*o|#Y3S*J)Zg_H-!BYbh zqh0K^Jrkuo`S2Ov*6=+_ec?IvpJrh0W~tbJXCi{NO$YP+NVtMrp0)VS=drMxGa6ik zxI0#JmNz2u?U8Nsn$p6qJTf}PF3b$Di7w|$U%I;kIbUKE_dKaftOD{Y4!#B9+qKlW z_#W(B;#|EtXSE*IvHq!Wb=EG<8;axVMZU#hJ?f(|T6)I+%=_dhY^lFyu-(4limieo zlB-O2ffe%&5gXX0$}`T<)o@Ovs#p)Ps^GnaJ+Un799sqF#Hohy5UC2j@33C4HsIWj zuYz}rRSoy6XjSlkBkz#eKjOcDvQh75RN(`MR*e^8cvbj;|Hd${Uf@&K6aJhkeBt9& z`E)$$GJyWSId9@zLAP#(w1-1lP>Nj@`&G4sp9)eUYhGmIgtzWp5XHdFjMu4r#pnvIZJFUa#@IQ&v*qjw?kKN^ z_T0=E$j^{8HLWpv{$BQ0WFbFcR2#ZEzX!cz*t>v+4B8)H%Q@OTjHuvu0T~=e?QMAa z4RSI_o_StO@Qkx*|Im!2&FUZfXcMibeFOP!o~Wgi{3F^OSTV%!7ueILI>liJ>|@FIFd@~@?>7WYfc7~{j3W#-vJ{*abj$~(D+_bo`8$P?Oa zjOd!k+`~R^rm zGgzw@o*FyU8vQ*pJ!%cPN0bNnFj51fg=i8h@-Te5i^tT_FtW%UMcLQjKifqM^huF2ihp_3h;T5$5UE+Ien)e!Ui4j5*p0xRY>M=eZFQ}0;^hjtZpd_in7%9q&avC z4ut+Uz<<`_%w+W?A9cRvWG!iP3o}_Sa}E6o2_v%;_E4R+jZ|hS%H%nNA6xIG+8kkZ z>lo`1ag6PbDGN5mLGg-7^!>PjKO^Jc6xX52Bi0{{EUk2R>ZOf|^IQ8lRpZ&)IlqILZ8~ z5pcM;yIm1t1g%Qt)Gym__quxjcM#}R#JW4WZh#&{F6;4r>9DdZyG-SFfvN2G>^ zqh0K^eZx|oeE5uSYxo|ezKop4PctxgvlRE=8b+|T>0rLkglov$47V-cUWRUgTRG)}y{QvZZh0&%95J!j{Hs4&Ut?uGlKb zYjTxoUY9San5I}{sIP%NsyN;pT@K>Zv>Eg5aR{qei-6OV#yrG1Y^CBGN4$ym8K_%bWgx$lM zMyG3Y1i}>`wo>aqpKW6L(oxvnzj(gkKQPRum-rNof-7 z#Py|P5qcH2Qa(N(jT`)Xux&Irr_5+jUzyPe^_3fq<_^(lmK=>{$ literal 0 HcmV?d00001 diff --git a/Projects/XUSCHF5/Settings/XSI.set b/Projects/XUSCHF5/Settings/XSI.set new file mode 100644 index 0000000000000000000000000000000000000000..7ac420dee44eb28bd75b503f73d7bcb64a360a47 GIT binary patch literal 8176 zcmcgx+ioI95UuA(`3F8A*8n29#_?2)o3K+z&Yc|TaCpo8zrn|>I z<~|xRGkvSesY_Q6|NZ;3R3wv@e37nn@IIC&+>fP--&=X3&o_8KLhlit@8kr1?=W^G z-^w?_^)q>t0jN}@hvyKKD$-U;Gf*CYBFFfg$Y;#1;MtNXek07C;Wu5Z9^;Mlx@gaI zMPGgZrHQsi==pomTameZk6A77=K3!9jv((G95Qf!ge<3McQK=a`y4blkK9|(^b6=@ zpgaw<7-Nj9DgQucQfAYSeUyn(Q@*}@)e)1Fl)po}4Jih=|AqIDpiWMvxu@cgp-hy9 z7(9V5vG3tdG|BCHi5Jl$l7B8_b+}((#RwN|mg(4Bev_tL$OpNC_DxV4%QM<7%;>0P z?javJPNfE#Q}FG|Ke&3BGgRH#s%l?2-bm0-)1_2H{AS>A1}RSAF{c}?oi=GV9vyU;!oKe%<%J^fB2-W)!~63O5+z&eE1Jf@_G%Gx-S> zP!;>y*&;^MeHO#4YxG#{VRU5N}wv1}- zM$fuyayRwpWP7Lzk|Y1cfu~J)0R?Yma0KUo-=s4datO>84fL* z<22e-f>m}fyiz)adfY&tq3SombD(*|>0>xiO8;hBI-7XCt-nZzy5ab(Xrjr{lQr?p^Zyl| zWtQC~FQ#(&YR$YhZFBRwclmz?H%~PQ-^4kqh4l`J4pg!8cUfWYI z<;jO*{942BD7A&<%zl=ExtkUF{(JQZ);4Xd4?W=uba~d|H=n26Zq8Wn9^&6v%{ko2 zkzbEoo6jOCT;vhaDRyCIfK6mMU)s{YRporin|#j;Wl2>)Va36(ApE*kbS{1XI+r+C zzg+XO9=5sRsqp2heVjLpkFOW`6^Hd`$Za1LX`YX-OLym#vJ3guu|utoHfNWEH#wDq zc+BbWm^ZN(u8TP5uEKkUc-rNw=>z=ux)iKqK8Hv89-3WkfVP{z3h|!idDeH#g>lRB za%huOmBh$1*;e~_Oh0aI&#f5!m_ytu;+M`YxAGpj{3E{puj}uAMHx2m+{&>+ieDLa z;QueorWd%@wM4k43|oZ!%CSb8W1052!M_Ka+JkG#vYmb;?x%OymVUI@1_GpxD KkC5Yj?eRaSPM9(P literal 0 HcmV?d00001 diff --git a/Projects/XUSCHF5/Settings/XTAM.set b/Projects/XUSCHF5/Settings/XTAM.set new file mode 100644 index 0000000000000000000000000000000000000000..90bcaafcfdba2b18cb9e7164d0a13e53f00c2be4 GIT binary patch literal 8180 zcmcgx+j1f|5bftw6(|x+tY7PJW`;*ipmyUdqOnSJV$TNOVk zp2*kom2m!Co@59qHRYjGf~6@q47g+Hy8uEC^e5<2M?1ra8h#g$!Er?Iz|t>} zlSA^%vtoj0oK5|QW+Zi1``AaFs5SK)$Y17(YD&r9pxuQQL;U`U`;U-LB(>a0vCL2> zYC{g5flKcD_$8Y}yIJu?_Q>QPOIWat-U-kTj7Ov^yBl zGoE>Xengx}12Sj8&Ey|^`WQ1ZwzG9)`uyjui2S%*YBj=l4uo@PQI}JEsdK1ZdiD(3 zs)i><57kD0Pfd?%!`LIs1AOSIfk7dgbdMy6z#Y|D+HvR}By#)rwh)Blt9ah>6A}K>p4(-{;HOZXOz)G=EuGeD|?d;Wd zY!&*thaCIsx16s+y?x0a!18D4IzrwHQ9{XKD-{!IoU3Kr9Tw$x@ScJ3LtAqT)}G<* zr-LIo-tJ-96u6qN8imZhtABjv4vQ3WSHyaIY{#<416bl7%~iOb6>jm2J4;vm72H4_ zbdDP63~REEJ6)skKJKN(C+U^kMwATUJ61;n=tLx&2kccPhWX%i%W6V9xGzwqRvYt( zwOrNQjb6;I$=%eklkcHgaPqY-VSMh25VQOq9OkA1D`z)HElf^R>sbefdX@7+nA0v1 zQ4{EqqY4{>OWl`q_<|KL>$0BludBAy!{2-LO(^koJ)5hDsjqemR`E7cG)iqxItK3$ z1EKv*#6N3sW-{(jMU5HX?2GM9ZOml7%r*2IB#g{Xn4voD7^%!s4d}>o20ymmOSL&d zb+>b@MQ_z$lOL3?m`%PNx3Fhq?3>~`G@ImRmdiI==BzneS$JgX5Emo*&c?=)+8T?SmF zXkxU7y|!g7EEH z>RkK?cCK))UZ1mG59?U}RJcBCALk9larGkK;;|Yd~@t3w)-aMu-4$Z3|pEbe1F6;?<3;)#^WFr z-J$HTwH;EL?NEByN@1lUyp8Nvp7RH=!SPk_Zn0ea9g_QXv?}<&llREyAMp=B*{F9j zs_=nBtHuj4yej;_|6rKuF7YYr34cx%zVPv?@kSi6N`KtqAB4C1gLA6%2l1-)M~GOh VKU!P(qgAm#T9y05N8GPJ{s-mrnAZRR literal 0 HcmV?d00001 diff --git a/Projects/XUSCHF5/Settings/XTD.set b/Projects/XUSCHF5/Settings/XTD.set new file mode 100644 index 0000000000000000000000000000000000000000..0897946c1e1f2921529d8b3e75292c277129cebf GIT binary patch literal 8184 zcmcgxZF3qo5Z=$7$$z*X(4@o;j@t|$h#e=H3D{%YCSNHWm?;>BBQeS3x3_&BEke?v zGw(MH+({?xv-|97wL1R$_l+cyNn5^2DqY-<qNd{bb@PJrudF9c82eCF?)gdQ~!Y(NuAX`_E9HlP5t`v-8@lEDfw5lJJ4c)-+yrb3DSwAmOCky8R|rB z$iV|}$$byMWRqwgmwb^uGWqvHSIheaW{mKm&oc9DE`Lf(F64t;!TJ^?jpY&THb!)f zXYQaM5vNjv%qehF`H4>tV}{0dwkoF2f8LD9kISW2LwsjIID-~dL``+8*;8n%8lD(E zR2%(0H9e{gV~;HN@u8>s28C>rE5>2?bQg<>Q8%&}JIb<;;6K|%KAGwV2)jtpHN^En z+lM)Mp>M-hk*7zH!?hgR7tRe^MUuGYGeqM4lIV*sL4+rAgBTv0)!a2PW7kH0oWE8$ zCR{1+yqL*L+{GWE^d=Y>AtD*m*H~#E5lJa}GHA~}u1V&M8di#pa=pGZ(av6N$5x@Q zd&sfBemC<~sJAcq16ckFU5ChfAxbDYY!$^sG0x>8?v9J{8N8=p{Mgnsz}f@6eSdT$ z$J;F|n*dkyRV|m<_w|p@+;NdY?($gM$961x+<_(T(OiYAS)qYv+*vx}uizRgpELO# z)lmie+8J8hG2?x)C&eqdg(w-ocdU;3(1}Pk57?_p4D-R$mL)5h+stl`nwy-a*0T-{_1eq}VNSb1M2(?G zhAM0TE_Gkd;0so~tjoH_zpmO+55M;6n^5A@de)Z_Q(f*Btm18?Xq4KX;uyR}421UA z5&x{knaQ|AwkT5hmVT$UsZKN_w)u1EK8T{CKuc*xts=J+I zE!tLtb$(F3VmA49G+@ur*f+s-VDgByM|q+p?oO?=KCw2~-Xa_7CMR&OT8ACu)uFpP zi&(5%%yNyu7HnpY(jA7Y#n;MKG&ZjuS0kR0I*1{j@_26Rnp`)>ntMveTN9Jauj&EE zi@V#EAy(krs~&+dg+A2q29Ys=emoD^cyM>r;S8GC4|QPMt^w_5Z_Fn)+g%wJQdrK~ za+1S6w4Hg><1xxS%Ck5#NE>VH674qFy+r&yg4@;jI>D}N{b;ilxzs9}Z1U;phWzI7 z-y^crv-{-5ST0|0nX~5A(!z?VLtKpLI~yBIYHKWRVj3LAHYbI#$agn9In3axfr-&B z_S&9_Ql5PHjBjiB9;LSMocd2QFn6<}*nevxg0)Qt^ZiJ;f?S@p_|E4cx0`bj{RwKt~q)g z+dZ=exc4zm!j{JD4F0!o`C^&C>b0KnP!fv=J>l|AK=fo+8 z@ervDzVEPBueRXajxU3Ei&YNyt7v8Le=Tp3(?8)~fK8*`%_zeM4y_z7#PG`S1OJC< zV3l9sv#BTiIc505$1BGhal|tH(ZIh5+xmlZ%Jc{E%JoNxSgt>sJNTnnvOk)o`@=^( HtUvw-_dA(n literal 0 HcmV?d00001 diff --git a/Projects/XUSCHF5/Settings/XTSFI.set b/Projects/XUSCHF5/Settings/XTSFI.set new file mode 100644 index 0000000000000000000000000000000000000000..0b52aaea9afb118b9204dc815e1a5f88f10c1a18 GIT binary patch literal 8172 zcmcgxTXPyW6h63`q{q$%;Ob~8K>yRI`6V~=qgzYeQjspM15m0++fbTI&Z+lHe&OAkSZu^j3b?hQwIlo<0VJaKnQw8cZ<;T5@s506YVcZ|>2*vPK)V})zN zNcq$AnJmR^>=9CL0D&Pql0JQdNc#X!N-&c`dd@K>nKNpL6zk=BeQUg(vpSANp)Y%g zu^+$d*(#LVr+fvJze3gl@?OX#q#Ta&d?KIE#oX_T-CbREqA0N45Ifd9|d2R07vFvdVlvtw~h09st8qZi++TurWP2QreouNCb zqOP4_#EKc8i#^GYOm%QvU$K>m139=Ue>H4)Pr?_G_~89Mzm#Avl=~{ zs>y2V&`I~uEjaqxm(V|VK|OnS39-fe(cG*Wv%{ z#hJ-ip|TRw^Enr*O-<}%zswl=2NVXT5+>+QTZSsLR1GrnoWYOn_wvSEp|aaOR-;WN zSY-#rE2fjL$2IgB82!e$_DvqK`Y2A+#NDZu)+Sa5JDaCN-Q)z;s#UyWxH|6c&T`C` zEvC78U=unsM`?v&wD?llj>hKIVkP1ksSO|EDUav2j>&a1#N10V-Wi`{epL%NT-@EZ z2(bfat$GHJ3FM)KxA2THi|{R+R;&73wz3k|EL4{<)C?`*6usje}P$`o>2)sI^_= zr9AoY8Q<3MJxXnEIklf=U{pmTw9 z_41zOepuJ~r^4l3`#5hXAJ;GPEe`uppW8k<(kvg>m+sCfW*73Sqe88ZHdmK}H#wDq zc*v=E%$ul%>mtszW#COdWuP7MDIV*4#OUP)c-!@>FrOla?eeCYk*AWCf%-D9;*r0R z_sHWP@#cSBUw1oJq2D!imi;wrQ8?1N=-VgOZ9JeBTlrR7Amk8^cHx(Ag^))$%HtT% z@ci$Ene-f=buHoVDZ>^%zjCY*=UApauJO;oruN{TGVMWr<=P|USgt)9TiByfvOOB5 L+r#I$UwixyOe2@B literal 0 HcmV?d00001 diff --git a/Projects/XUSCHF5/Settings/longs.vbb.set b/Projects/XUSCHF5/Settings/longs.vbb.set index e359e2d7b536ff798f66a574b123ff1bed298f25..0a21903d1d091505c8196efb7ad8b117d2690dbe 100644 GIT binary patch delta 232 zcmca(f5v`-marj%0)rug0fQ9~n*&Kx28)fh_Uw}bn2k1XV4uRMZ^TdogoX@e43-Qg zKt-lN7EBC_%;bea(wqA@U6`1S7z{RF<^InCWSCCADsY|Ac=KApa^}ejGDedF

1AUCY%B9UJg?G%dSu(I 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 RFBjN)Y;Kq=+%N_He*m=Vnf?F( literal 0 HcmV?d00001 diff --git a/BKPS/OLD/EURUSD-5M-V0.1/EX5/Indicators/x-saherelm.xobd.oscillator.ex5 b/BKPS/OLD/EURUSD-5M-V0.1/EX5/Indicators/x-saherelm.xobd.oscillator.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..175eb86ece621aeefc1543c861c7b146d99d4cd1 GIT binary patch literal 11052 zcmdUMV{j!iEZ1?#I|m1^TxJqI}=VOwrykLWa3P0+i&*O+pXI7WB+fT>OQBx zuTNKf-4a@ykWPSGWMN1E3IG5G*oOrCH)|-;GZr0@$1n8lBEjIY5B_iDzl7@l2mUkv ze|@}R0f7H-007}Xng6=&;UX+)6e%ST)wT7n9pzP^;p3zLuA7Kt%*t%HNa^ejo@VZ@ z;&$f$@j(pW0B{6&0h|F=080P};0hoCumM>9IXi&i-&+-6{0}w%$4dZg0e1fo8Gzcq zDE1Gt|5yDV%>QQl55=zkCg1|#1u*|RF8`(1{Qv4@`Zt&V-3tHb?XUuv{%xD(e=hnT z*aWgP14(a6hJCYRd4CyStu^mSO(ca+)GaXtgapyy*_uv}{hWLmjiLMqA({(W$i^(s zLkI13fPZ?8$??^l(VpkPF4N6Oslo_D$^!lmU%HrHZ>I8;mqfnQ1*In3WzDmm?851+ zySI{$J0ETS@uS#)%`g5xw{e0f*2Oxy*?$YyP*R}&jM;J{OJ{5iKrT0f_D8(8++;nDd{ zWUO2pLtzQcG!I%=y2~cswGmHx%hi{sXJlafKYVS|4Mvwxy?`{~r)FTW(p z+E|L-FEqj?s@UMW46eQTtDy7vb)!V=ducYBf=$AkOVWK#a0in3U!12*&!^jqG#p7M z*Zbk%It}rHx)PkvM9GfInx2#o=&P%|&{TKfLAG0t49UxlavjXCy$_+jj}an%&XDRI ztL7V7_qAN03|es}u2n73`aI*eN|2kQKTE23}hsjj z_g$tHt&gQ}JTP}p!a&ehx$2}Kkc{U2*;J$!D#H)`Ek z0agXVf5wYBtt_=D<5nCxG3ATTB&qRuM1@U=ND+c_HgYE@OSCvZ=1{h+&(bvWxyvTs zqwB77&NvZ*;h82qA9XOUHH;CURUX4ZfkJqJ+8w0OdM+eRm!J^UP}HBZG`KS-hmKL- zHtv!&)f&Pv@X;aXaStxPsRpPvPH}?N@X|+Q9wruyLW3v+?G!h)6mm9k_!|ASS}7me zw>h{h?X-}J#$_<=E?ZpAMD{~E(|&+Yg`UA1@~c*{T}I z+9IodrIm-`TT_sTQJ&2Pu4*G&0uStsF{rYD&6(6G3vgkhA<5`pLQfT|&E| zKAd&ODf=)wPj2-f@^`-{ER5x4>kc`|4waZsM!kTEe3~R6u_@%Z?-I)3rdZ09B^}=E zLeW1^X6z8)*L-%($%(IUE@Q8a3W8aLSp!NyyY3O)KpKPtvc8LNmRh$x_!~+~;9mvn{^B!Vh95b;fwWvL z8tt=2;-)|Zw#DSnRfl`Z6vdk4&=qSf{nMQGGAjgW!UhTojVPyfs>Tk)z4nTR!_sQ0 z+O{}=Y{2CgMg0cfY+laC`l6?J1}V7^S!!J%W*?^q%1%MPYSRVqN-HeM-CyE-IBe8Ojj?>opE z9>dKwNBd7-RqHC3UJVKjV|^zK_v-}#HDd`NHZeM3lSVaT%_yvW4vUH|JTy`r|K^9B zzp-l3!75Y)hDJg|E{uW~SstLS{ic;Nr zmRn{$Y}sf1t*!Emn*@Pl$i!>Ef|Yupe+~pF*9#l=8tiq)ynO8Y0~@q#xakuN#eZ(A zyaI7E!s-l-e%fdaku74};OhX9EymFiq|Va3ot75ICdQRbH?Z;3C@?f8b64Q@Gkf z&WD%MeBCXrGCs3P?{OTlu6?xy>-yb#oC@vu@^_^ok%~R^ETArBC6v9*IyF`WhS?G3n(#bsV4 z{rp4X>(4B;o1?;T(=U^*%-w+`!O0a zKW_q5@AJ3yqzRg7=SHsRrAl&V*v!2Q?%#}ws}Q6iqT~d7csI3yz2u&WxZlh(2(JOd zMOIo-GrjV;`r&8-+z>vUHLEQ;=p9Dt(b#P@$tTx0LlC$Po~~5%p(HL-y6}~eq+8G; zoz*Acae5$u@cIHL33Kv}z<|~}$R8WavY$vb%6CbwXYE4Y3ZuO~E5MG@b+TK?dw|5< z*{d%xjG7sfDS37Viu!~MCq0sd<>F>ke__TdsczJD>_!NbdrqM^7r@O zSJ!njeyx1ZbNDp6F*0oX8k|8>*gRjv-QG&DPSJzqAB+nOpqHGr^+o&QX+j`>4?gZ) ziCF>l1Qnxjs2)6w-4)U~2@h-X8Q;34qi_3TDcxcQM0P~T@!KglK>o%X*?#+-$L2+% z!mEu3{Iv4P0JdTUu#J?B@)b#XL0aft&01VJ6cX(&b78zOGD~(lNx(y zio7ir{vCBgE9!U~Z(JfU`p!NkXkI#J>_G6E2t0zfKASAY{Y93|{X6plPbWS{3UN&f z6INbMR9R!GRNz=ezn8_(Sd*uHvxUz3$}RHz1#Dq>L#M~3w>Z7Sz_DA}49j3cPq)>o ze77Pl^JaKxX5EX0iKy5SaR6x>_FIH$x9Oi}zU~(bZRg%J$G(0-Tp1*4{xhqDY%~N) z@WQzoj>=R&;~lGruWHDpLX?75a(A{T=b{-O)f6OjUHVEDo9&ddaPwGg{Ks*8fzXya zCRSg74%+THN<3Yuhp*v-Om{Nw?&(i}$rOvk*Y6%tvtS!}9S+8BL5uKI&kNcJH9d@~ zSMiLv%KC?D4G%2_jcS@q&3h~i6S~9j;@Iyz2HeCbphpXsnKl)zYc~5+jA`9RIzJGl z&#>$Mv{Ez+Jk)rz9_moWD_hLK-L;@mQS5cTzK}F_w{1)SPJxJ5>q{JGu zDGG!4`)7{uHt;`REB$7$E+Y|&l9$Z#w=Bnc&JT&@aq&C{f|3fI30VAl>7{&2vSTHh+`CTyqOmbb`_)+DQAhUJwIkzn9(JDu*H$CX9{}=V0kZv+DtK?E;#E@YGY?HJD#$l zqODJ=<#XHQESr44`gzdBT|F!<+vCfeyna=%W0q+hX1X#G3l|P>b___`_G?4W`v_-U z_uS_!vMSj*}f3JUl0|!*{&G`RD z-cUlgWusAN@TYk=p{-BNuvjkE5kb%6O+`~|>-tgVtNmLbPb9b_xuJ1BO*Kcj`g&=- z*0h1)!_`bMA=MQVAy^WJLv~#z;$6? zx^gMT`-Y8}%?@>w=AvUE08;<_-WW<8-<=-q7*M`stA`&H_r=WK5HMyzjjg?Nb^}rE zrntguvJHTkPi!;VMN2F+Vdo4E0|c>O4$Cg#@2*|p@GhGf8#c2a-#je6EosG!fEkPpg64EVr5xkb}2 zV8E_|vK*UlFm8eFZ4RvGp(v7Spr zM}S-aH2ATR)|^q27#8$CD2#ZqAwzd426Z-(9cwQ#M)IM!TB$O`CYhIQ7`)rCI~FC` zBc4FZq;(2fWk?8qrQ{_9e=!pm-%a(xR#$or?kMxqJF<_L3!}?op7845r}E*_itz}5 zZPs(pieG5Tn1b;6nJHjM;%oZk`B)(xQX(xJg!~QCH9~1OZZrD^EP7%Ee3jvIz9Q2= z!@P_%=qD(Yy`E_sVMR>NhHZ|s!l``2JQVW~QHd1OBnpD|({76Dskei~lPIj~;8E?9 z5}CS8l3rI7^P(kslXu2F4+9xwnKe|kJ_{nsb{>9C* zJKu*PKWy#Y@XzSNluF^jLpt(Ypiu|~SVL(GkgKkro-|lu)mpA1Cg0%Ui+OyYxsa+B zp4!G;Q7&+A%>{f4 zr?6VISM?wv&b+MvNf6(a6)K?Fu)xJ%77|rxkU>eLq^UceE+rs(9=}$&2$ocE%iBL} zJ34wG#JUgsiA?CYfpU_m){klvOX}K@zEmq^K`_+km^Q!Vwp-Z{->G1cjTPc;w;ywQ;!7f;&-bY1#NL_Xc}3Rz+<;~ zDhj-SCE;JYGv@I3aqJ-rOF6BZpNb|$Ir-#*r*S!}+c-Q5^!5y&itW(wGD|1%dN>-f zTX?Jxa5AN60Y?%zEmgP7q5z0dBKCs2@N^|Fexu)Qcd29EzXJ$uW=5epg&EYULi^c^g0u=8B zT}T-@>ua*F9SmG=m;s^(?ec564gpe_}G&KB)W}QXDe4 zPy=TI*~pFZcG0^asVgnuNFp6=e~Ox!21mjw-}iQak$%nTH+TQwMn1F@4erLnqNGtNNX$6@zHJ z@!MjKxsKE5riaWgo|ZB@Z^E(b_#Pg^&m!s#JRX^mfGF{waZMiqfQFp-UQ?)BZL7pu zOFzBO$mg>(L?8Z{UF-?_WSaSn^F7l$PSiQ>Xe$-aNe(qkStJbjM=^~?(5Ysu!Be#7 z{(Ln39aOi$^iG(>JZnB>;YX)2;etn;RN_y$x>34yvI0N&mo~i4y}!r`Y2s_GuUL(sp1|M$jgQNbK%RiQjJ4ZHKeWh+TqU?; zf!}h99crj^Ry#;=+soHR*-x}(y`TamvUJkX1E2ciR#!Uk zy&=VWO>1BBQFhIU=F!h>szx$oZxNdulDk!2uoBa9Ci|Q`QR3HPK~!HF2Po06^76WB z(P^rCg+1|fSi$cs0uQL)hPdhdvjjEz#0Lzs*114$(YM0xtA?8oxK=Xnlci;PVBKlpFN8^_Z8Fh z-n6#D4%~71rqOoM*InE;AyLdkAV)5jySVEV6=*gRAkk#zkgIPP3u90M&rQJzA?C&wdtU(evhF0B?=h`XM=xYj1zNq&s#nALFmP`+&{_S;$;6yZ&b7h z$>TqeUcQ1uDHPfpz&`!t@0-4~@?QEr`WBDXM`n-tmHe5`)?ZwJM4D#QRU=b}Y*;8h8CjE}su?vhQepA!X&xz0Ocy9yMnIP*TQ-kyOS!_4R-tQmU9rWiD!JJ&bXT*vd|Y$SOw z5u)*HVrfXTT>^f46arW~&io0iX1yOt5aS>QGt0u(`&HD6v$iI-Z4nh^M2o89m%W5t zx@wa8qX0g927fE8%v;f_Z?*`IRa8U$(E0(Rjl8+@g_Py3rspU7HcW*fdZZf1(@Yei zbbtS+D9qWz-5^3a^i(8a6j6@$Z^FtNex3&tFQfO}f;U93*nr>01=zTK%w0H5$Bzs3 zuOY^dVk9+Nv|tN`AGR)XyD{$)pW@+!hks2mtgNMgA$MmsI)FqU;{^Z6uEQ=vrP7q< zu8q?+wuRZNk4BqY(K_Nk_KH4R`A$M$f16o^T9EVH(`nTxKurCQAS7`Iv`gM_R;L+N_Fa=zi@(KhJ}5~Q4( zx+DIrH;HqMzx`da<)618=aQecRYU4W)!C6OXL*Qk(aZ%bePa1RQj^w#^ImnrGED}l z*GkA!JfSOB?)R}^6LmHFqkM)>sV65_)YMjG*Fh`M_D!Cr{`Bm!u*%y$pi@euz+I}y z0!@3*$)a=oTHY(JQ{O7|urV~zb;GO=u1vdT>@5lgm5eUt39BT~sh0+i&~x=2CFYwX zd7+kcWeuEj%CiYeL%B%*ROPLp{t}ql85>mmmU*I8+0!tGdH>m6p6g_K-Dxj)Syf~$ zsgG!Mm7+m8KAkoieio--#nwlJVNtvA8L?2xmQIh@2JWWs&^4&NK>%uZj$Cos;obSGIyBP+q5&@JTLYR3O%JK@8$=DK zoHRXeJ0jHeiJ97fkA0AFE7IljIHTFjT;@@wA-@j8GWKT01<(1(umDK&x60Z?xVzlc z61me4R*ddo#3+B%Nd*3Bx%BDiR+J`rDD-?$2nR7RS;gicWRVlSq@|Yg%fd1IN~6_S zulL%y{zf&6DV!DFak=_jN1=KFtYc%g|b3I0~Dl`ee zdEvk9?Y_tas~@6I}gCVnGS?U)Dowc z?!<`ec`aBuv69hh*PFks(ZChmenqNehmYz6p5rT)R)n0O6Lvb!Y%C(7L-?+AQlEA{ zflA-oXc%$V=7I_z2B(Ca}50Fnn0mU5`;P%JUYwkLTwFTcxd;)9t*m{o#6tzRA`wFb^K!23=L zRO(_6heaGB9-pFhRwAWnH}oSDa!Lu=zvdJg?Fq&cxNq~l;AxD|dub##twqs51$7K| zdrmtXsx-JEi@I4mObmf{EMMGU0;(^vo(mF^qiFqzB<4dCzg*|1Bcm><1h}M4#kk!k zGzq)}%=O{P&slUqY*Q{u^4Ibf!B^R*edM_3YtJrxE);I1l9XY>~!;n4>Cc`7zFa79mZ>ASWS4B)^cH&n7VMa~_DE(C}Ij_8SkJkeq&{ zq{G^`^>bZ75^FJffp!G0+2XO32EjEk!=hfV-1sOblH_QIa!nDa_G~Pa9OODCuP_(xpDa^C}C8G&XRDqGF z0lwSA8YE!~ScoZbHD+Mzt+g%lxPWac3Gw1`vniVaiKzXoo z-vGKnu$M{+7Tk8P5w>&OC3R;nD#aO+L4NsUg^;WW{#`J$5}JAG!5+dwSh?II<1F(h zE?tBY5~&voS!H!szd*=`4&)VshK&_Dm%sVhUE5~YoVh`o5|{}Nn3*4a=Z~qM_Vk3% z)(iRT5v9OeapkfnJ`S0%@G-MO0iN;nWpbD!osmLvosI}&1~<;GV=cS*hQ z!V!s%ksl}4n5(FZPZKdI6$D6ik#=EhwYBkK+CN$6p@C?NaJN!c6D%_3$2wQI3x=Y# z17tb_0Wona!&RtAf;r%Vko;c(+--vvz{G`6UmeEQ-N0q#F4W+^*Bg_p55G632$jnTB&xA{4hZ^vP5~-a^r0giK zQ3-|EX{)I6N#@h~HUeF!J2~CQMNeoRU^H<;Z74qbV;=CH#OyOV#;*Gu+-i`+^3l5? z2O2^+wFsk7x#>yum;J6^fm-o+$@x>Yv z)^~xvd*YWuV|#WB{q=JtX6)6U9XR|efdOSCe1(EXy>+{aXZVUG<-y0=CSYxxN(p8_ zL22FghED8*GMwbPZ35?=tOB<%sl(-A6Xo>>FklX%)!LF@8oQ!o|7-s?6j3{)Z~FJR zh&5&FC7M=vLyyY6SnJ$*t|sw;KGEb5( z%Fmg3@sO1?C|EDb3MXBo6w3;vLw0CRL9`pGSr>k+_o?P>niLvO+g6g1J?1>BOP4kX z{(hnyxG1fv8}5hly1p*roY{={)b>tM=Ryzi?d$sEb$#pk>MTtPZa)(+jS2?cC=?Y) z^3%P#2BMl52y%Cvt&rhv>NaPQnbva}F}gA}o(OVc#~27DI%Mek6?IFFyFOd92b0-h)`qiI5NAd78%mc?1sU?_(;S7Yw3p%BPIQ2JqZUmIUa>C za3kwIQ0%E?e;k5dO;lt51O{rbHXiz}DfA(RZ``lUFuoLA!fIcoD97huzrjQ!)cnFLk|Km#h4@!!R;BzY=S=6uy2~Kp_WU3URE} WqYzkYw_#jwpbO%z^`O(f6Z{`0o(|#w literal 0 HcmV?d00001 diff --git a/BKPS/OLD/EURUSD-5M-V0.1/EX5/Indicators/x-saherelm.xrsi.oscillator.ex5 b/BKPS/OLD/EURUSD-5M-V0.1/EX5/Indicators/x-saherelm.xrsi.oscillator.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..a206d3faea6fe479313dd8d00e6e4952b3a1e1b2 GIT binary patch literal 17482 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 Yc}|AOqsfkrcEX>gi6W zDwT+8u!1@Q9uNdT0f+zq5a1XT@W09OaeNv)7_JAZ5CkOJ;E&M%X8cbf`~L#}kN&^b z@qz>Z{-+9n!u{9&@4|%$ua65|0Nn&9&!(d@NWi3Wto;l!4&*Ga%m~Vm<%7nx!Qd)l zYx+O4gaP&d2Y@HQ31A5@2Uq}H0E7T00KB8_1gQMi z3jc@M{Wto5EdPI&|6%O%p9h=)Tmbt2iu3==*YyA9OZT5&{{PMJ{~R4g0NsDlX81o3 z`af6+HOb9AIWjckD5?-mMXQBq9NNih1$yDs&F1A+`ro1@?kW*pdL3V@XI>ar8R8at zYk~6qStQ83Hro<5BhPVz(SQU)0SG(>RFMIIXIa%v`668tI+8vG;$*Jm@+|!8(D0}!-Txv{`0%8x{sfbYPR1c z&{%AqOjb|DD4~L{fdn_U92y>2`Y0+z$N4~Qo?U2?!$(}!nGa*q1rIxGljPqG3}cc= zD|HllhL7@h?g^|IX#76`_tAu|Y}`>nAfAWIEdYKorF+L5&k)_|VQ z@Sb8FYgPqamQ^O6gxR(NImLY(txn9Qh?b%<8NHKH*u?N0k>MCux8RCiKmGt&JgWPO zP>Er;sA+xei{l>g?gg__G@=;~!62T|{PwbtL+-ka03hn1f|6&<~ema!?pd>!6%#7Hcr5P zLa~@m?WL@V*U|l@n(1Q+u;4Jzj+tg_Q)Ed<^KL^Jk8upW30X;iALa-w{DTdx`Q9In zS%FGD=SLpD356&EK5U{$M~Qb%1xgJfuE4k*>>l7m8p|r5 z*^y24Q})ljq^~G#B6_O9SA7(4h1lQE875Q;y`$Ua^j$QVcRTVmo7h5*&HNaD3^h&D z&MeBZP~m3bZ6QH%0UyKT@V1pb;T(a8gy+Eq<(!8a0?&&=r5tNN$&-f~ViAOUzwHa3RT;Bya226#bmw=z@26k zNw)Y0>PuQFSnIj*;eW~jb<9rZK?=QBm?XKMSrrMAe)wLQSuRVr0vs40VWMfm>env4 zSUK+000J#LK6VxBYJeb}$sZAIUGoRjKc>H~JI@t1UUs1_m0|U1U}!<)&*?}({1j%i z%=TO%MbY`aI@RztfM+OFt`LIGTYUI5<&}AFnz+isJ@yX?usI(B>)*67^F6aBSI8W; zNp7@D*tN%YP_94m;GNtejq2KQT+KpbB=RpVm4e?`pv=g*IGVqm-;aOl8sZT$f*D!u zg*~@eSlkgJps#%Zr6za?o{PFyV;t$U;X=8s$^1+zdmJ3vErj&v#>RQ7tvPCXbOhX^ z_Hy&?r=tA8z9^}$Qy8ih0J^Hg0z33PN36tmd1{d zU^lYsDJv+lNUTBdTNEdVfO#M3_lYSA;RT?lVlX~dNA2p`T25-@w#U?8n%mod#}dS% z&|~0#M9pj$uMJH=lc7JkE74hd2Br10_j46(1~k!pgWHegnZ%U}({aZ_kK3^w2&!bf z%?AIeWJXea#NA{`POUzP(%W59(K1-k3ejWXN(+Fft(@+ma$a9qXL{&?Zi;es8ZY!7 z(au^qhLDL$v2@4r$TH?8KI>E#7NR(wJcWowjOC(A(09$gq(i#={}n+=6}fdcJ9CP5;v5A_~tADWol zK7cRUddb;E1^XTEfE;8-gqXJ(`Hvc}Qe$F&*Y56@M@rz}a&70OdD~pI2^jax+Zz@C zJN%&33Bo+djq>$Usx(DGc#g%yE$zF>WHfj120&$1t!tZMUwrx}8a^>;i;?;?9>x&O z6HL6A4MD^}-M8p8=*MUzmd80qYwIrfVNJUaPcIOpbC{sQIwHl@wzx0WF3lPf73Lot z=p(DB+BvXkf^a7QpzZ0!>cjlfxY9mk^0O`%kvB}Q#&=^*jfqr4byKzW=-H~I{^WJ* zH^RgG10brll2jO$|9b*X%pnccKFcfcZ}71H2;3gd@}zo-1becPLp#nr@|3YWZ?)*U zlF~#QTuxqz`RIdeTQKXzqfhvF)f>ra6|AtVnf^ILJf&+^L~85h%3|mHWXODP5lv>{ z{kC))5M6>Zj_-VClf1H7*Iv?1r+8%xQn8KfG347)=Rv5gf9 zc)rA{nd~=H0vc^b&mUnMnuEq7W_|?9GJ|?2t7o(V%ZKjV0J(u0CWngA7QO#UZak3- zZY*YMqlnbz2bT9(PT>IdOWbfs(apP^9;jQ_QaL$T|`xAt&QZ45|!koKU}tHanC2p zZRzA#!XkS0Xz}HPIRxx-)3DA559SEP_c9hw_p}9$``0+g)gWP(nHj``aZZ-56w__e z#tFhuY$mtVf^7amxOW>C+0yj2KWwsx(}4JHe2mPH`bOh&g=I5#PB)I-dpe|h#o!+vrXeIjSlJr zF_yy7`eeHcmTPE}j_N?uI_FG?yc3m4(RlXvEOx*t7h4*t0_7U}G{gdlt5&+ht&h?c z*>Ug*!6>idDYEa!Hq=LSgpKg9%F77%*AD z$~zM~9y_DPI51DfP4ak~e^)*9_1lYn4sNL=oxpj7a)01Qi8G7D89t_b*IA{;^*)ngq~VbdNSX z%Ez#OD}e*$EYkd+VfP-`=In7d^yGcO)Eio7!6YIkOK;ga%-2M1Ry_-}vVv+B zj+rc58w8;QZsw8ii@773i;HfMJIa|G>s#eH33h|7w<|ZoW=J3ChwhRqyK+yt>n~L2md@u^n&j?dJ$J93*jc)gBUq3Av4+kZ3L!Dy zF7r#3{}mOg=31sIJEfllVwyk-mE|8WLh}z0Nt+MIOO(GIDZ|GpjYhg6pEVA`?w}Ft z&+X3bd00m(PYAYVqQ9WZ?yR!Kcje{+yUp~wLSB&(0*JxTkf9yOKHCGj_2f|b|0y)# zMu@-aLb@iUXe%Vb*2#7`dtu8}k>bU*I$Hk9Ez6^D2MC@m@5)#nG^S_$+iIFIWk`B* z@>$Sp0`1A73Nf%w)Q~9;=Sb79Z=JPIcHOLWl(cA@s0f3IW1H<@l#sd!6ERS^>(vxi z%I*7L4St~f?90qO%Hv~CV0?S~;dWr}q`ZcKaWiX{bi0MCdgyuVG!*n`!MVG=%hW#} z00m};U17~QZ6dE24osNzx6XrByQ*T(xO(K{>= zZ{YM!UQnq!xu29OON4H2M2QwE(iV1E{HqKwV(a9ke%0BQjbR8u3(mV+P}najV=cQn zp->G`LlLKn>b275=vcT0c-WQpSUI7QbvgND%0_6k!X=wg72s7`fim%qNa;|=Or0B3 zDJ?_%ZKO^CshsghQGkD5eH28VpNl2aGy10oVpU@HW6}4*!rqhR#U)7R_w)OGfc_F{eT}kqE~J~iPIUf3u@B?p;Ea5;Emvn9x#ix+3IC8dNhhcGo=~}Gp(HqDjpmB|dJ!y0h!|e9WT9&#Y zNq5)SQDonDyr*4c_(EJs-3B0_=>=lxeFH1370J%%YN7(4$pXJV2kL<%+`~3i^ki{; zsvX~F(dE=!K>`PZ&_Hl*zUjWEwer#YGY6keM<;3mES@_AbeahT_JB_=I5%2gxH-}2 z;4Cnt+tZpyGP@FZ-LM2PZ<8A9SSe_o(DiRo1q-;u6< zCi0Um{Ezy6aYR6@pdqpnuO2VEKUK4Kg<9JVp}XH}4obyt?xUp(LRMwkf#vEm6}CvO zPw!o*zq(k2Hyv^eFxK*3O4oFAFmH3a6OjAq`!w2!<1E9n{PuxR^^$$fX>1|`Lin2r zMTW3SRc4v1cEKKwONw}ea@YOQtunYkdubmeaot0Y(bGrc9rT$sjY!fM$Ku23JCwjn zYFUBpG>0*B?G%*4u*hf=bkvb1NHtCPav}*5`mxRrYTlVihWLtdV(ryQH50#lnA`M6 zGADh#<%u0={kSLtP#A8B!DDBGdA*WQfSU-W@OT8wnxbEmsUFt<1~9WEYo~fSX_-}} zU&NwZkyaa#YG#IIK!0OEJrC~`N)IV@1PGmPak!`8n8uF{l&3_=2w%=nLm55_ddqw^ z6s6})t?vR76nudh!r)9uoGKaV`u-`#(v^O14)84BuPmV{jz=AO++!;;3^ZLL zj)&Qf*|P2#C55B%3W6JjXw@Q3K-$$6R%Wbp_@w=cI!c+#v01Yl;U~F?Cwv;tzX(N? zF{xsO%B-tJ*8~MDRT>O6P~Z>WoM(g!4xz<#<3E*E^SB( z>p+&eI6_2UGC9flVD#>zeCc!44VFt5_~g^7Kezga@ad3{Q{FTWHZsCWRBQiA8 zB%h!BS=s!2{>f*K=-qpsQ^~`;bWIP03A2V@&8{}em;ZGzehPX_Ri}Uu6sh*t61u{s z#+^=nGUvI#68fP}>48)9I@kjn8C(y)zwkuuJTMVz z9B`Nz_S*zU-+?BXh5AYBW*<@dl_|kMm(jQ-P!R(69q)ho82F(2;Ljh#8)DVmeT%~g z!N1O$%W$f9T5uor|FXt@kxABGplGkT$%nZfc3Gpt)iSuErKua`3CD%3I9^iVgKU75 zzT&_(PF~$KMKr75>ACkD^*^cI-FkrlEV}$CjK%}K+yz{NlBAjj--#@~h$n`H3iHO7 zD4=fS+qq46Tvvjk>BgCoa|;j1G3z)I`@3!!;rY-lft{WK2O+f~vO8i->jfvBv&7=B zV2BzHsq2ApK+yu>7@s^}YFA|ngn&1eGh_f}P>WaNuU4j%5;1AxhX~Hx@-oQ(z~vrh zi@bg7HvC)4){ov>@3*i#CHJow50Y{;A_De&zD&J8!rHqAraB~}v=Ct2F%&}VkIH#i zK;naGWg>Oxjl$yKB{qsiR5i85=n;Ht&=Hlarf$Cjq~dV)!Q*HOX=DR5`3=m4@x=6) zseF->=LJw*h8ak97AOBH@<%2Lt1Gh5E&AlqOeTf9x3=r@^Gm^BjhP(%`LOW(yUu zx8!18UbwiKYYNdjQ5z-=`DQBU*_|)t9(@dnk7#kyKe=InPUyu|Lfa^7=~`_ z9ppgD1URu8+AaqfhUtyp8Hz$dfsSK-gL}7E=xYL1lG1k?P(S$@u=rnySf}8~qHFQ> z%OrH~7*-9rTf>Rb!qeaWi31Mxi^;jy4Dp9#b!6POQC$CWv1a-!{h~kDD+PS`*TzBQ ztjah+s&L@#<7P=EnjEEH<{0!jRL2T(6Kqk}alt_Ohcp29UOXo3VA;4J#ZgfM{HR3Q zIRe9|?yl^fUmcLJyAQ^>VaD~k$|7E0r82anucx}6l!{t&(ApLybX6*Aa)<#2pKD%z zAKx;l^Hu}B8Mt=n-~-801^ywioaKP=qPYcf)9O9C{AL64`xV0qQ-vn~?O!HlZOXT#gD&xOZpPg&pQ&BZ{CG)mp}q zm;g8Ckww}i?|XWqKS*PvziDxfp7ZFj2MEh`5p|m|h>_nbNpb)rEr)oErMAVC53A?w z-Vfy0AS7Vub&%81m`5#)1)ty0LS0r)P%ccyawKk)bv`4eLcN38UZQ{E?$204)v8M= z%`EuPin5#18%ft{bee-? z)|^lhCs@&^nN9e5S)LaI1eX8-7LDjYWO-hIV zs9@P6EY(aZFbUdeNWHVqGvKUGIoxMe5?lUh2pFN7g#W;3YjB=hU-EbN2>&nHe>GiT^RW4D?4m zcwxA!RLx2+-MC^QF8tp$+1`u*r2TG6FJr<+tjWpjljd?n7P^sD;~zN_CYT=9RdH{7nY%@( zV0B#6F8+}TM!A*Gqm0ZwyJMSXoY;Y=J0{rc1ZmXFV$EjK_;m09=V#q`HJ7(()Y8T0~$3tZ1@(aBq`aEFsarz9W+S23>cJatU|v z9mSxM!*ksKye9<+)P}J2F^Y5XU+SsKc_~Ek!g$H zmGo7o^gunYkAq%|qm+hfl>$p|4hD^tZP^%5u1AebaDTYd-D<@|n1`i~Zh_znqcVH& z6BeD!!&B!&dyAyOI~$DpLiNou>}iL9&n22@4Jr3$7rP#Uaqf-dUQis^mJrMHus@1wckFO zU%zO!;tuAa7qqEL+~*ed`|a#*x7nmdo+moP6v8)ct<@_=dyq?$o@A4{VJ$e=Nk)YL z*7AWR^@ArGZuQKtr;DmSuXkiv$i%WW_eajpeRhsE%VEDnt3^k5#%&r3DdhN|n*?C$ zX`>6=??m;yZQRC<^exlEXTdzDw^hcp8d5fq`HzqMYYo^>Q>n-_zO?-gj=yX%yR;*= zVJY2UJ~D(Pp%67Z*&3S;$kSWjU>j=QHU4b6nwyP+0X#jf-9J3K@_k306z#6q4Pdv^J7Z5{VSf$Lvgrp4qe&02e5 zSl?eD43ejVz+Z#+n!6>gIoK&0@W!*`gK%koK5%rDd+thEPe!c}K`oxYGDbUkCmS%P zvD^8EoNnO9TU1GG5*yO<$RGr8DoxMgAuS_p#X5o;uv?N){rht68z$Q;j z#OsWu1V$ISaCWZcvw#1%BO9P_o8@&+p?A2Fb>$yYw^K(hQ&yk_e8U)W52;>yncRzS zTE{e^x67V`9)7E$ErLKduiMPKba*Zmhi&>FC;SFIkQ(nTY5L;`WSA*}g}dS{v;@)k zVgjRLtQAu>U_iSqh>h-vboT&Du)ff0FomR1s6m5* zq%uX_!2thCe+!ze;FhD+PY9aBN2?!2V~-0HXI^f$t|Jy|D4V}jTtW+IJjA{7_={%H zm+gSBKUBrV${=9Q9xEqb8}dv{VD-02aby_pLWZT1N|8d*q)R_J%?!Id*rK%3Ze)4+bi@m zog1IJ2B+*;)f{hX)qYNQXmI#VmCt&*`IQ>?B)((tq12demmM(4yw&|Sfs7zkq z48o^A+EJr9V>>%^FOF|4NtZF*Xv&K(*Q~hyu^v)mcpJHIw^$M+JOh4`rY5>1x^kW|7;zjZrtYUNeh%pwloo=RF8ZGS7t)Nh5?l}+|4`ch%G2%#3=Nv_t8LubCMAdl> zu;Y7j@UEOOH(seBBvyYQCfo$f{gEp5Jwo3%cG8dL+bDmQ>yb5|oT8|YSHI%^mHk6< zes^Bv>+=zixtc9$S>C#3fh9md#?}Wr+?|U*=XKdp$=Ak6F{jL$S-mwmJr=^@OtfL1 z_B{*B$%Yr)wyy)e!OCVA7?vvlDk&bTQ3Iaz623K&$$UF1XvK|`5`Z9~exm+u$zsvJ zvlEHRN`UzM#Z;vJ{D8ig*=El)l4$INzUrVRERtCfl)N0<4Ds9b+WIXB^<)Wm%!#h_ z?Uu)v-nOLV=ZNa|4+x$pcjv5+>GnWX#m@2BURn)^=A0DFqS@(0%~FLaw(=6M7rkC6 zVLUfXGu5CD(#YciG23PJN57HGMyCERR=&vaK1f61DOtXjzbk65ULF66JFz8%e<{l5 zY^eKIG{eDB1%#k2RiOXoF#@P<=<%L)!!qJEdBNq3h7oj(GGBGCVktyG>Fb6R zH?5i6^|rg*4(9W0Gd2hfjz)5lrhKmt_dpoR>bUVTO^7Q$H(h$ZqKif_#}l(Uy>Q;sVkOY!CNaS&(%uL%w-I`sq?Sfq|Q{f-jj1|l! znntl@rSk&#)_OUAggv{)CB>z*NENqw+tawf9Ea_97u0B1>{Xnsy1&Rc@OjP4A%tDy zj66%P8j8bS5Fv%UcM&_7JvE+72p9)TQe@a!wIR_pm4rK z8(kb}t&!|90_|MqOR~$F6-0~Al1ItS&DP3F3Be*%E|1L~i|X7JT(qnyS3M;3p0@Ob zq};@bVUEWgwA&WxSwk2zL(e~1g%=&$zJaI9 zxsI0g)Y-IzIe2`}R2G~bio|xf^PU&&)kM5}Q5k1C(nAaN4z&`DODfRp=4US#OgZ=C zqTJ~qmlzeG3OVRdVe2lBOC*t*T*f%zZ;ex06Z8H#AQV#rT#YE1n{Gk{=5eo}>tetM zr4mY%1K|hVH`3u{mzjx3CO?Y*WdbU9GtK29hY2mT_c6tm#+Z(iEqoecA*T2slR0z~ z19`DmrJuc={8W0c_$T0IT%7D7d#{~MD);ZO{(S+x0}uFR=_*(En5{c1#fo;I-#5Pc z){K$gIn&x$a)^11yDZL>{jGs*ul~VD3a<>Y3GTc0P@{Ck;LCacWJoMKaOLC1c*9ve zA)ptp{uAK$VBX2ajS%bQ^W3Y~tv;CF!^eY>&c>H(A94>G#ps2q2$DqF4GmcBoRhIn z{ggzpq)-$<9_*$}D-$WL=FA_Eyy~tJiJ_5EIUFrxEhRe2G z=y5ZIxaL2i6%2IO=|x-I+B)DLsv?%ic|A+ngU&i}B2l0;1hof9AGjTW^wG{w)C zoy#vB(C4ZMThYR(0a+rIoVouVI&D7WO+hQBR0_G%_zrLdiZ7Ha=d*aaj&VO*x5nO9 zy+oGZ=;PhQBil)mdefwpKUJY6fo3`xpcr`hySmW#y0iuy^&s;nz z1Tn@A5~_Mn!+#)&j(>9OZb(ZCnmyg8su7DvuPfjEm+Jr~SIi~Q|FdX?=0%l~gZmd8 z9cLHkhl>4#3KHbSEwmJP;K>U$W`T@6cFM$@pFCn82iWqd+!*f3E}OrYH4axb-8?m5?tA_)UxKW>J;m zv`5|oL;y}O376%l`p{I)RK4`^dp1#e1f3Lam3F+LwQ%92b#(}IujE-k$q{4}@tc?C zx<|wgrxzE4AALDEf2^psm zMR~bQ{Q>`Vx=Z?r`(clON(36|GLCx4vmG)n8dBsRdA657)X9=+vSP(>9cbxK_6Q_g z+a)LBAP}Z}M1Nj%U)TX~+bw;JD{ulYZ50c|XR0S|tu6fgYL||Rl`YucFGR2joWBI( z&d$5}z^79|2dUgMQbfqh_|LenMw8*bt6T_|AX9Ywa=!^?j83bxokVSayQ;l?jbI3= zTBkfn%Mv+3K_>s?q%OSrFP`igulCEh;%?oD8hQdb9T$&et_>ll*yIEu(s>zrWso7l zqqeShtB0ME{5>#^<+a^Wi*7gFt&fhdp&epJ3J~B0THzlkW7LMASlMj1oF)!09v554 z{h}opwH@VONOghS7hE9nHt+o{_F7ep^(Gv9jviOqZOe=4LwvZfAQF9al2Y|rw^9?q zaB-4A&g`kDlxhBZQw@Hi#bD{B)KwAjbu7NT_;}0cVHSjBOBs61r#RLncL?taPtRe}%7jE&aoMXscWd>?EU|?96f@av_C+o>zRE0VJ73B}LKi+uw&P)vz<) zm+o*OHacp+Sn*_3PTP(+2LgnyVXCt3@>q^>D8R(CxP_l-r(pjYP-2_X&qJFYzmc<@QtxrL^3U5dpL^!u!Imj=|6 z@Y;7O@egELBXe)fg3p(pH%?q9K(r3|`I=NXdhyo^r__0U2#3zACz6R0Q6zZC0|eAT z_}*5!aE6v=_;l2D-mZ+B?2uE6t~? zEqm!x9}c50*bYKh(HqL6;#K%AQomY-kf_^;FvkIQ>s+ZiN<Oiila zBQ)~_;!XN1=(8bE6qwnR*r-}Mu4oP}k|d;2!u6R9TWYM=(TJy_^db=EzJW#sy*RLT zcFuhki&#b<*l+QLin)?`Z59MLLwgEhhUlS(!p41HDAkz6}Ju;kEd zPESWWOTDK`R2uviohp1`ElUj#tWq|2)S9x2_V5jdaQ2*qQ)~w4zar4J%bMCTt|ntc z+pqPlU2L4jzHp^$F7m;&YyxKXn$|6YNezdr zG;7)Gx=SBUwEyC(Z)@)GBCzB>id8dRwsWGQZ9Un(UXAbo4x<0!WRVb(Q>V@iriGLu z^Fh!;)`yx;^nB+!clF8UKu6~yc=9DWn2%3cjhBjp<};8x5Dy@8!DP2ES(8K9`=Wl7 zR=J>kQL8P-%!DZ4=jqu|qz=E_E55q>L}a73V&&!=qxyf-?l~`jlw!#@T&XY|6hwO< zOi^l9L1V_9=f1Hw*&SlmJk|e6J2Hjr*MR!tiCT1+z|6yD&x;EdrmXEX`|@Zk4z(|8 z>5!y`Z#4uBOP)OH^GAXj)#UF}6HZ48Y-rS+{Mi0?JzZGmO6z0Nu{LhGf33#lj_Y)K z;PxGtkL)9B5<-C8>E?z9`TZn;UZ3d_sLO7NEE6OhHPh1~l?+Q!_YF!XXF1$S@9uQ> zRpobkdjPKFi6b?58Mw)m*7ij{_1zA$KvVH8vXnBdjb8hu+%_@MawYjD+X)L1Z1En# z8f3<`1BmSvMP;Rtndo*2Ps!wY5!NEd z0AYxE=)aX72_C-a{te9rPdtZ3{TE_1^S4k1y9!BHba4f8)--6(0{vd!gu;9%tY$d@Uc;~ZN8XTih^c%p^c&5auIAq$CzUsLz9lqi1$uCK{*^UFuryO^l z$|=JA-q%C%;{Ao_&EjeDn?D-rkted3s}`rt*>GWLb=LyL3Y)l4DP*|s*3I2bRNzS6 zl;36vq`o(?S&nOC9sNzK4>rThvG{x4$_=AoS=^Z2`KL}#U1-pKy-jh~n2ah#y=Y!fCEy{Jds z=go~e@%87Sz8Qs+xREXmvHlMUZN`$yhEw&Avb4NAk_xW7T;x{+%{^~#U}7@)W=(bz zcytZOBy-5B&gI6(#>xivnt>ZcSY{}<0&xE|=t2n9OD@VEC=I5kpI#T1cXlIT?chA0 zjoEp|x70GtPbWJ)ae~8?UAF+?R*(S^C8G#|$h%!A@CqJxu$xPZmJQBkV;x_z4L}hiAwrbA;LT#QIDfSKAbcnys*A$k| zTC96s{_&8zi;JELr*hSA5Czg!;uQR;_NJU#2Iv{*s<(g$5&DW%zdqX!M?p5naef?E zIaDNVpqLK zZYGyKDcprYh6wgy%^;eT8_+J!(G4eKtCbIS{qh~_whzgi_7UUag@z`*0FDAd z)CiNR_vc9f&$vkS!Di$Xe;SB0 z3y*9j>{VPTdmwH7XqL&cw&XQIbO+oW0?vmB#` zmLWp;V*79T6Lj2}d7E?dc3=S#t9NHW+1Bk~V3>$Z+U^GH^|9km+_3(3C=KTE^j}%2 zKqJG6J`w!pnch!6X>162P@GxwfD5V5u9I(R5Oz^Tj3_}(fp^xE0RIrXEkHks&sKJe zb}J1t7j*DbOy$yF32sBor&oN>JY^2m!yB85Wj$M{N2X>I;UCPP{^b6E5@()u*RH^f zB4ETV&&GCC26*`Km~1K8mA8;#Vb(bYzeJCf>~4zD;#?4+`7?_bKWdoNi0^Q2f#^D9 ziA>znMG&e1HB9mP-Xs|~a4mJy2QVr+1j|3Ug3c&pHcCN6YvMm3J@<9&9&%b^dODy^ zYOMpQv-~#eJ|oV4_e$d|w0eUH%NOkIcyC-y8~cG2H)+^YWqJ1&O0xjttfMMKFA5}) zzGiVqFm=UP=ITwAoeZnY0sS?*rR0VjG*kC^jq~k%4~8Yz`B)bPZr6j_iDoFb^?bt3 zi5GFq>;3rQXb1P2I0~otdI2uyBWczT#3_ofxnu(jcJ@-LIVPChS)Ed2Sv+JhxV7h6 z8y%>ZweJ7zojY%8N@Tk_hh|vsL3x;7j+1d}T7#>5fsploP=m^h>9;7^d&60lMV+ zpzCq4m|zKFK5SZzx63gt=@)*mZjBESa<1Tl-ZRk zGRP9@#C3Fz)I882cg`uOkgFcf-vaSs4MM%yCw+%tSQUWO9Lf3YGFaC*N=`pqjBzgC zJzF2|ElTuagXK#;5>6$&ysr0eiI1N$PDvM(9N z0|6iCoPkz1Y2{mZY&JBQH!?HsFk8WV{1a#`&{l&k2?en#X+mAnxIyN|cfyj~76E#N zM%FejH2*V=dmLvSABk^n^YM10rp&!PDJWUw2Y$fiMNU3_)15g~rN0-HxSzId`7r;K zPyn#3DzeCbmu?3QCXZVAd_lNR5`P71`{rX*$+)F+=-A2Et2?+Fxiia#D6PJH!EwPP z{gmUZg2%yu2i8V`a@%Wcf%lxdQ{H!Ad;>1}l~=Im`%s8Nb_H)RNP5u{xsx(WB6Ter zymKz`C%DF@F{0Y!0Z7;U>Oq4o*a_38D~_{>HNb** zLK^$~T3@ImRg+zA=X~gRI@W?4s9&s+{f$4P5E}s_n$))#KauKGWKf4I}VbZH> z5i@SpTA+rZs%Vyml7!j)6An{xiV{HXTHY46ZXd>$J%3`+avgoLOK4!W z8-?qtjUA`s@O<52W(u<|j8ip9IZuSx`_T|o?c)5M<+)x<{Wz_b2TvG}O&$dNtYc{|92@D z?~C+O_w!J>6!c}0m#pPw^}rvp542#V5`8`UD&pM;Us?(`+c(Eov1Kz0_`ipP=AjZC z3P!vG1Qc{BH3xpd$j;vf>&MI#E0Q_jD5V}eG$DGHVhVG?CRWgILB`P1$HY1Jx`${E zuh%7Pi)wM!$X7^Lpm>WbtziW@O0yMzNaaf`l^l2phjV-Y8`Ed(Zx5<$&_VZ!NA7On zL&3b~yRm}#mvm(`-XF2?ti6K;VkYDm^n$qgKM-)v(F3|h|CDwH+J=!KnrS;P7?{zJ zD?13|no2Ksc#)E6j6DdEt2xiLw6xRDF~OQ=B8c5FzY3Cif(E`*l?6)LIhHES!(ppxkq3LFA27B=Ot?|?2Pk2}aR491wG0sG2|gi>e6ar3j?-WF*@c`k z$;7zOA}deHXOt1?6`2ih*#T?5m7R1U_A`kQ1hPDdbT2qF*t4r53G&N|fdcQu`?!?O zMN4q|AFh##ygoSKy1{J@d`IQHDKJ|xE8ZaXj6Q*T@_F|T#eTcO!aE`#5Xb?g8*UfH zx5d}ROOW=iY@4tkj^?;Q-jP$dmj>VS=;7k8l`{~8g&qQ;XM$Knqn75je*<1p{24M) zt6EF!VU}Ns?6ZpvYA)>L{E9U7@ECZ(*$cK#Kt|UKW6Q)C!&=c8z-{KTINgam(|KXs zxJJ{QyECqB^4~_LlX{8Q&K87CvP;lsapO-vU0L!<%r$?nVCVkZf6?zC*Rxp@)?Yh? zo&?;8i%~ZQEPFBmOUOuuIZW4|_w&KYd&F66p`hvOzF<)A`P%sKWE?1I&p)76LG3D< z=aS3qwOvp@RWW5C7YxX{Pb4v>kvfHH?YsI2Vz+7Q4)DT}ZsDC~H@T`Q^zh=K)r+tF z8>y0%(3Qjas);tK>1RCCEw3ZDiO;KbVR)P8; z0AEDp4k*~G#Cj(quNd=7NhOWGHJFN8o?LPmAb4G+AA+$RUhg7gH8Y=O9t7TpWvrKz zM#RpKWZ=f*V}+m&e$rjM4*QCiTznCIkE8VS$!7!~rrSws+W*Nv{Hw#zswnc`2Y7wL z6Nx0VJ()YfmE~iC{VY+g%e*h~XpqPa^~>udZ2a%y!4Q|2JkKv}6RU-DysmyZ_g~zb zPRMv}re)`{cl}{5_S@XUUZDe zN8j)DRA2!?0js=Z5B-xic8x}(;yGlPVcOWFx#rM22prJo``KdL=Q$sukwD=utdSGL zz!0Y~l{PvqVTQ-XF*A-Nh&7D@6E4!HiTe#Y`kp0G9a(9#thwykI)x;mBVvIaf2NJU zz+1z^%QsoNHxh_@1w7ThUvOU#D0co1BvzN}ZZy*|&;?(u6xh0B^Ao@vtv%4+U&=a( z_0h}|wKR|X4tSAbPxL*l-G;K2e|Z&!X2PL2jb{$@av(70kH{2kJ7_^720nhy{(>6kJ*Jk&vNY zylE)xoGzn`NKF4mlRCTh-Z7IBkj+WtCE!f+87{pKZzp)ey<@qMa(F1(45YLIaU^V( zHL(nYG{%`RUq=k2Fo_b;<+{!DXIG@!XM#ID4_xCTe;k;SU0M%#F6?>lg51RAZdQJo zz_H`mT8ibM-AlUX_J8%gu2#Z8TwH0^{9pM;$1eX;oJh|yOx~CpopH8PVRZo}Hd6i& z3A8O$>ha(CFGZQ{Z-=4rj{q=i|3rRfhqnq|7&|uaMx|ip|5`m+h0CUmbl9tJsNVv9 z*Bz0>TI!V<=Vz*WU~k}`fe3xgS6b5ge+731i2Cpm?fJcJA%Dsah74QUZEqEwp@1et z2lo$US=&PG%#FZmNK>Z4cS#FO`9ZR+@VD(RO@KRj`!sh2D)nx+Ijys(am{Z0sB}Mh z;5LVjKs%6gl9LEa4}!FPchBWhheIfdb{pe)ng@3q4>5M2kV90pR<1t7*CE748i1pi7p>Y8Jo z42z4Xifi%dHr-0XA)%dUG^T|DkImqWbb3nkQ3D4^1D+P8;+Gj`1^8hW8Hm1PT);yKVFj(pcfp92=6dpR$l_b;q~IuMRaG99a|s}oZ`61qifVM8^= zg6nxWj&Bm{5$gmU(bTnupq*3BsU;^Rdg9BMWN#8T7Xu_0Gmo!UMwFNEp}X>WhG<;k zWAPa_6^tm8^o1)`7v^&W_bD*3i-co}n&Q4V!PpPGr&Aq)^e5sFplazfvGFL7jVD2l z2_3#}O#YxbL<_x|y#Zw`B&b(fb1_G=l-Y|Wpn}#=iJVHDuT9Zih?RXr5z#UxFQLD6G>zU`1a0l)qjh`hZ>q8W)q#`iFD250@W z5)eq<`zpLDA=^Xi`UyZp;G|io0+oTXfOY5dEayPX7fuTWXpLdnN9sJ!&fXc?ls+@# zm-Rq|{Daa_=!M_X^e!s=-AJBD1NkKh+$SPp!ooYot;UhZ5EG zZH?o*x?!kFW~8rfcPsA7Q(*_l&sT(~5;$ga3Ppp|gF7o`>f#-gIcp8=S`$%VX1tt= zPu39Db%&RiPPLTqG*GQnRzcNX)FC^cfRmJXYggwUeq7JE*@G%VzA%)ko4HZ`O;li8 zEKOq_Pp+%XFFxS@!LiBPwmF!grwk-n_WFtHbXrhdte{LTNLrWP!1Q!mJnHc~f6LPb zci8Y}@Xna|S9OXfrv7?>$ELpX(@zNcV>+d{EMi!UVE5iXj2u!|_y64UAnc&c{yg?XWoP^a3Fy9E}KRsiUW;3)FOs>M* znSzIFMa7PfR!q(7GJ@vmu6Sd~@mWQb>1JZ}Vq6M`$pieg7>w)=IW#bVMcsR=F8A;E zRH$~iE!J}p6LE}nHDa`XvqBocU$k?XN_fUUU45?ExTFbVol$ekdfG4_EOkG83vNO_ zF3*bX4iZP2qHTI}vCGvV*uf^GzC1K)3lRDFw^INe$bDnz%3$|Pv)}}W% z>MO)*84eCPYo{(j`P+7@F{0Q;Aih?D2T1Fo5P~}%q zwArmClQxJO8Y^Ze;f#SX z)1**dc(j_8cdbMQZbxe)Xg!|9Ml#=8BxU|=8*6L1>qgDeiX68EJ{!WD!Q#HM`(JUW cAAE=M_c*L~z<o0ybfT|gSX8dwJ#E{zrfu80o71*EZQHhO+uhT)ZQGii=Z*a~_T7kmV}I!?5I3=dZ4(cPXz$r|Ev99@PB$C>N|I9z6V`IdnhkE*&Gm2b0#ipEe0}XOKXQo z=n*k=Gz@50Q5%#0=!yXB0QLY6fFr;HU_e;7Oevw#zT8^HMQar(dbn*0}EhJSYX-<#q8>>XwR z!#{5`{m)AO0~(I&=d?%e!{JX=Vp#~C%QHbl3&U;ZrkDRL^M(po{q1iL=TmGvgT88Z zhin3gsjEP_Wt=-ykOe||mg-!6JvG^wf3LlkpOKvUBfJmdCkbNdq_=h45MF$J2FGu5 z0x&H|y1rV2CeZpVN0Q!fn*^-VzvH&1?y?e~X%J)v!uAS_<$cv4d%=eo&#}WQ?0noo zBLs?6=Jjsi<@H3&`=ML+LL57#4TJj`u7&MCZ;9dsG2(0n=L}5Fx`0-rKnJZwNMv4PEjbWd@1wsfdov%3)%zpOU^p})?Nz!D@P$ak_H9_ zV8o5SOumbHnvGu3iJ%sm+i{QJP#479_tMGmJyWRQsYgvQnH+B>Lrp_&i!c0B-MA#t zH+y*9{^ylw+HZw?w#VLYxCE3*L96()dHFOw9;2lAM|2d)5%;iwiB}LDdXcPi}Nn?y?|esUk1k5+;Y@{k);pPz%C9t!wtvOGayEm$^Uo z&Fo7lfc>ufgd8Ej6RgawOwF*nVQ#F7aRkk$t!0@)+U* zRT-NUj%ThTA4pcs&Y3Hu-ZsrXHd2)Ag;rt_iy&Upzdf5$6M4eSrE(H^ouSKtTJKIm zpMHfAFnGhBYe*4^s{~I_YvTiTbA`f};OkuGiTNdaaKD_sa6sycv4;vE@!(FMPnfk3 zRd6fikeh<8_hc!}s`=*A+~<#4sv>d=zJr}VN-p0#tEY8aQ>Gbi1@!YW(0v77ceJ?-=N^2fCBK2qn5NsFBj0Jra} z>s!TuI-j^&rB56h95Y3|M-U(&7tMWibkeEbbeuZvn)y;3c{XvcJQ|H2Q#!Sqj5YxW zmIf+L1Zwy=TfY$1NSo(SL*0ohy{$qQgc+8#U6V2zLs$XRnpGvQjyxF_sJ1}K z%zts^7dvr5vpr39MlU?jMa^j4Qe*s18!&%`QGCce@h3|tYO+Cr&uD!SOfTRVs?%W3 zy*o)svAom)AqoVC4B75C+Z^-8Jb1DuLi5H^hP7%yeet4|$}nRRGP%Th@tb>zeksEdBV?()Fn*EZMD#_!MF$1is5MRMm_$aSYS2xvM7M*#2*~dWO{sjbjTt z@JTdk;ZK5}KG+BjvdboUwmcYcGmX@|COh2eF$y?Rm)T6uSbU2`==b>2)mD*;h~=8F z`m7@t1z)lR?}j$I60i%dB(Wkn35SW=FTmyMmGpXWc)$6Xu28tUUn|PEjKZQLM?6-K zA5#%{bm>HlG~a*v<3hC&#Kv6$S%o(Jexguw%wTA0&iEBNu*}ZMBd;N-LiFK?m;yAWWV8Q|AX8WC$cwJ(t!RHX@J02DA z$Y8sJ+hqE~yTl(h9h(nh@HqA5ty(S+BiI#*(=XAGb&#I|U!4KN*o=G+84LIQ$DYz% zI(KV|EF2Tg5V4K7j0-@b*08R&4h&DJ85Q51hh~fd{n&__FKIb)bwimjKLMoTs=Z~1 zsJ>CSDMpeWC(Jbrb4rh5Q;8%b?&+`KCxy)lE?Ek|n=7>VGSD-Y~6?cgY zC)_!3M~#oE@=j={!(xM3nAB2$7 z$4Gn^!n_Jxe)$yakEndcc&>FD62)-F_?`ZWv>hkiq<;p>7G-22M0%cr_l3lQ z-j@U7f*9j>U33@&rGhpN2L^TN5G;i!V4W(}uGe5ZR)4+<=?^0fQncH6p#q-4=8YOg zh|_Gm%9Q@Z*7$2$)P#12Q(MYL3`*-!9_8X27)QJ~97gB5s3 z3rnZ|4r#qfy)Nx3F=ySM52w9lEmKBD+0$I%riD7I4pxhE`b)isS=vR@=C0+R+= z>Zn6y<0jC3Gzn|?D1BCa_F!DTl}6a<7l;a6i#n*<9N6>$;^(nwlIRN5YB4(!GjyX} zIQ1BG`@>h3Z(PTR_%QGv{g&Cc>~!XX2HTs%1l{NF_EfUa%GTkbpuioiRolFFNXANC z!7QXYK55w$7hY=^PpJIe?1IqVvECb2VlwEvH(+@)=$HPcO)@l3hUGkVpi3MQgfnx= z9`$+)O}~TAEayl4@nc!irKu>@N}X4CHp&^0znuHT zwZSL+5DC`DKxAAP26~UFa9qKDy`0Alq}UX)on=yw}M1kLWtyA2}R4edmU@v zB~ZntdWEA`oY262H-5pePOZB>DM~0X!pYmVG)jn@bo$edR8>OQ0-sk@S9lE3$q2|x zzs`a%9ya&c1!@H{PY~Pay#>DLZ>C#gG*Sp_&&Oh z-@Rrl6OTNh(7v>_eEvZJwH4KW-Re8aM|klNlgZIftI^)Ylq`FG-9hC4vh?wvj8zoO zZ;pY>Uu`dYW3Sv4c!&MOw#ocSLy>D~$}|Zd zTzc&JVn);MH!hl4UrF)n0io97eT1ND6hzER19d}Sxln}F! z29H?=#4qstrea}rti>~VFDucOH@4zZa?opPRZZYp5uX!}A^Q zeYDr%$~!K;#pW*!JGR3l3F0Q(M%e_ts>mbJ)0Lna;>H?6+#PyhKH0@^U?e)2pWu4h zw1*Q&U_eCp2|ZP z#MepxH*eSMsSNG1Sa2Y$d7efn#-N8>KD%E^OR-8#zTI_K!77jkj@ZdSXBQIL-sW|7 zcuLY#<$AI>j_lEtJ-uxYbPh#DtkK_!$i*btA9k8p_b?FK-R89cHYaCcoX-k>>hMnR zrlxdAe4QIqml7`|AH>OzqHBXo=8L8VIxmr00|#V3K`c3W1LDXSs4?wL+LKo>C|cxH zrzB8sBiafs#*%5Q8snKa1x*_B$wIR3!7dzuO&ZW`-rps6U1i4{Ea8X-<<3>=cZ<;5~3Bs^9M8VK+$*2+P}IdDI5Zqy47 zvpOHn3O%64hE7D(=w8#Sjgx@!iqxk^`>r4{`t!$^@;B5&N4(m1p+QuIU@)^cBC zsKzyDIEIu9(<2=LzgekyJBYby&meQ3mfoKe!vdPh(D~luP;}ukR6KJslZG%mL{OP5?O;klYqpy%tyzTbdL&}) zCt{C;McZaaVR|2G;efPmPcq5?|DLa2B*ulX)BNEws>2RCduCtUafsBY=eddJ*rE6n z(3Z;`F`EanaqWIJM)b(j{pISW^9Z4j+6G)H_Wra~S&y<)*qi(GYB;3^bKStdE|zPR{Y{V zDo^?Ozq&{5@C1Uq2FaCm;|wck(CO^g?Rm&?f$vk|&@H^A1E$42VQoM3>Y=TdEA<1v z1`9dt(}grbB{hxaPR@UN-GxN!jbJ^Mszrf|e-zHK3AaSj%t!1w!&p3(Qr=1N2ufHq zG1-^D4-sE8 zS)9caE24+&=EwvRQ zqZmRWDFF20kuS80Mby9b$5qiFV$(W){bVqg^?ve-;C+v|l|vr7$>6Jw$9xnrj|6L@ z!dTz20&nZR)nI_35J|V&IcYO!1M*F$m{m~NPV}r|E87C|O|FS9$G~hSSdMnGd4ree zQ;et(1Xh|I`kH9nK6qJwj((z=S*U|u=z#(qj_jFX7gW0=IIVALnjRg9BIYIednqJ8 z$}zh^i#cy%wlhQ8;J{Ae&Bd;PKa@0sv_w5&UR~kf3?JvXLT<5`oF`jFw*DT5xu}X= z3&7~@hw|3DXQJ+2cC5T(ugcG*U`8@Rj_om3zdZfXjFh&7=Bqq_bwP>l8TWl-u3l6? z9SD$qiOAx{b`^~>3^K<*T2){|je=XjgrlXsxsAJT&DE9koEk1yp@FI+nBApppN`H1 zAMH*Xkd7dM?8$4qF`Ia9G# zMSs9G?v-OggJ;uvkaBe~x4;W&%W)!B&A$t4iuhleA1w^pHiY!PsuDWqLPjrm!3-5mXO7BXDmW83)|+8D>>b2PmM;&N zJ%X@E;_BJeOYI~1>lQl2R{z{Iw} z?Fyl$y_XYP#o>CpEs6YGI=)Z}11#e4<39Gv?u5-6(WDkacOiC29_iBdnI?3tj1=Jikk2D)vt$ZPFQ9UX z<@`DNowo4|vO2+wA#Mw7;rbRt{o41!J$bcph3I#!cQyK?*Tq{yYKs1tT0u8u^Dc(s z!He+l`9ulKJ44)f$FG1l-4DBtf=E@k=KnZeftil~yd|IQDxC(pMMJduJq~`LkdOuj zLsR?v#cfV&beP#kZS6#g7SHz=-F`8MVrpCQw=++6W4;?FpSg0Kbz2vSt9A1kf?ZL+ zc0l0@S4$5+gSIlyq3-8`!AEZ$RZMLh`CMH7LMy77>BIsX7(noo9uQxS+wi1AU(wS@ z-uRt-z%Kg3(ODNhQ^p+BBJFo9&$Z@CiyRUhw6bOG@52C2o0|{^SOW|;ti5b26AZnh zO`bqT@cz+B-H<_cu(k-61=r2mw6{E7mGA_G!3q!vZzzG8!l)^{f$TQfP84`OhVR|u zE|d-nOfCa~yU5S}Rk2XV1zkAc&vXr8=h5CmIWmw6tnqc?#<5!>*?&u|>G-Jz-)uO%ScccDR-KFwk6V1mG0FL00qK2`5n1#G#~|X6XYTrBCeA zsJ0Fa!AMzvnpO^^TCO;Fx3ho>#~Gt#DZ$IyOK=n9-cd<6yx-QE^JZ8eE!HpCY5W~}l%y#*Ta+(&cj&0=CcS|rX@`B^4l+H& z5b}v0Wk|L~idc=H3?jE0r^Ak$13Fu>?XaPIp4Wj~d%?GMzgkbYin{NcA3{c`P*=l6DklR% zBr?kq1zm&od#Ox>T>ayH^gDH@cW-FIW$x z-t??Dd&*!#^4{~4+B?OO+gPQHZMijED(peukA)B%0yWiQF@$L`WYSJiL-pMuWfMDt z_XOBtB4GcTufHFrjhGjZkrlD->6uLZM|QGY0Ib4Ol4K43f0AL=lwJfiE zE+(r&sm@tUo7=kw zD%WgU_x_frY+}V&(pNh|#C^(*p{&Cd71`zDZwSONLpFUD5_785WWqYk)k+d3YU>JG zF*6VFq&YKbh-&t!Z(_C-9G3}zv!rCW`3R-nl#&OpMKkAC3_42Jy^4l&B9_dB-pPK+ zq`ph-C31kr-?tS6rpIn9E0~iII>y^YQ=^Wh2BtCbE$rDIF-XWI1r$H{wagD;DD<18 zR?ytLG1`A(D$v-B{-OKH-C^JLZfHy6v-2pF_kQW#Z}zhQQW9_&;;q!RK8+M3NQiOz z&R2++#HzBBIb6KxY+9!uPH`z9--V3u8=*TUcP9(>F|kMyR2){>6lZ`JHo_P>8NgY+;BD%HV6z08@Ho(fLo!XKQt5`rMqtIuKY6I zUY#~%Ozb%dIU@N?KX=(DFgGkEnrhwikwOj0FWF$@iQXN@#3#k7TT)f|c=N{&Vr9g@ z3^W|#saw2pRTRjq1m?~kcDH6fmOD=c?bG);bIzs&0Ah&K$%jw z$-ee+^JT5Q4cllcxo{*gf#(_cCi7kK=r^%gxqPt^3ebmsIXdy7%sxA|DJ`&{iy$k7 zSAsadJ8t5DPR`vQc!)Lmm>YzGpk3x#>-CPVj7u!IE;$djSg{x-fln_%NoeV@d-NPQ zq(pKY>kcn>r^yhJP&+d$aEgutR!?IV4b_7@Q5AkRT(~N8aIAO===4YM~^L=T;Xz{+8+`Bef&P9drhSk z%3|FNY26U4Ti4V{@hL)&t~6ika0cNC7cE&aR#VSJ_-e{I%x{w{ThhW|(W_5d3w*~B zT=h|UM+SwQz-qzFK%!OWUHWD&dz-cI_S0f5iw}=yl(Dyhy0aR=U&;m<-1&2|T4Q45 zZx@u=0H5s>hJxkQH6zf7n#|>-V|S^R!2DaAsYg*7JJftC0EqjH_$OtR}U5XTBqFswN{+!4&>qOR9l&;M&032S69eAMxoSL{h3f(_4KT$t#V*yzEVTaACyYO6BXmqA1EZ73Quc9aL<&5 z4^zZ7igJ(xLcSbNMJtyIDtT)OR(A>@pplgIi1l;~>8I?8IWvKCKn%l~cj))A$h-*)tslkeRF)7R7}&gEe=2$d#aUCw^d=?A*l z)0TMa+|WUFvD);{NyD@03pZ3Z9zE7ozh4XYw`h5*s%hNwI~j?lOu)d`-aZbqtQ{ml zmyYjt5UoEGZcOnhC^^4N6{NYqhKTX!pIv2Na^-EAwWf=(5FQ-teMS#^FUhJ$?fYkp zqRlpvA3yg2g%ttk%2YdMh2OG^>-$cxCDGCq%8-^TESLonRLzlZxm;jH2kZkiKsf^~ zv{!opdUCBrCyK?2HSk8C+KzCw@UJXO^7N*Y44iU z5FJI~=P9s^H&3dfG)ir3t`&IChBeVWV060tSl=cX0m)NquCTt$#j(FYJ?{pq;_8w# zJ9`JIS@&P;YzfG}YGDK$Bd;W2Z3FRy+^U*~Yz!*v^6Nb5h zWEv7dL)o zK#D5Im~iJ->nE~L1uG@JvQCzjy}c=Ha_|C4CbDT+d{6JK_ryLR4f-&Uz*LQc3?U2;vC<_S zrV|1Zg@me$@3%Z0D$CpkFfJErB=9i$fH@zXkqv-7=tL9@ZDp^S*J*07ZKyz=>5>$L z$g7o|;#7i+v5`YVkh=g|qUWPqN8eFcs8j+==S;9{1UvNPqPV zHCU3REm?jv#Xki^J73rtnEPDIq)NSlJU=Q+wY?YEWTGLcaHxykn>U-xy3+Aq``R*-6_1Xf5)UhE*to;C(Tp&ebcX~ zT3fv7w&%nqqC}m33rlBwz7^GA6gZk%#T3iAO}7avKUFaVAILye;)hObEpAfGr0WTI zU4s4s42Rj9o#NSI#2B}V;pMKmB098G>0QxUPkZ6PQITClf56C;(8Ntup&yb_ftdSUruYF#bL3ymScFeXOuEzzT1MBW_K@t?7OEb{TVs+ z!w9i1x2w&Ucw`CF@fn!zzQ+!ZYLo6`(0pxsJ`!>7D+u%#MVSEipeqN4ypC(>w$&W@ zg<^M(hZ!ue@#8C|By^VA7@+(Y>`mNgDhNu#CnI0g zW0x?=IkJOwJz3&s$hn<$O3Rn$E<0@4F!0HcdaOTUaCFt`g>YzOTKLFRs=Q0SQdpji z>{8`Qiw4^)L!OMuA6;^9mVkn-qCI_6s#6s3XsW7$F zeiLqAis#EVgqs(?jjfO?abVe&QWSXdm#}uP{~d^v3V5lYTnBfRT-o5D`}J-9-Z{Qn z2WjSCI4H$?fjW3d^$Zt#ox&H%(+>8#_?~;w7afPUeToYy@g|fg;OQcp&bAh;PDxN#i)cU%7Yic%h7QhoEVTqchx{Pv5As_JKNw}{ z0c)e&C=+Q=@Bu&8@b*zb%p21mb@8Ar{zTF!sE7uC^08hpe`32^-~|J}ujTw5EVkCycJha{I$;jP;{WA%31>!TFb;x5$x- zVc~bcDLJ@Je_ZYxIqap7=ew&iM#)qeH^JUcT0TZGN!KwS;`_IU-Fcnnx=VtRMydY&K5- zUpBEA>bQ$~4wKSkgamf4ykX}i2w7lr`^Xv|iC!k|#rJ|eH^jCvt}iOn^;f^n-|bna zx4b{hg4sH0xHsL^pW#wZbWVq19CD9!5n=1@$w)=NFsM?x-mtl zVD;0mlI+>Cs2gXW+Cl`}uk!F`->vzl=IBVY9(!uy3~0eP(-xlGzOrO6Mn>V1D}?eG zmqi{VqfCT(0^f^s@n53c2eZ4XIO%0#!%Wh^pr_*Skm83QQW1~%M{|gOqn}82*8jR^ zbNS*64v_fZcWXK0%@$8p95Uc_()?ss=J<0`_k@I## z(NEj$6aBp`T)6q|4Vo^AK3s9Va0+MXf(O5iF?fI6{f?%#p0r32uz$^*WEyp#ic{Rm1>DI;@U|3kW)=gtQw>$p4^(zZUWS zbXUdlL)d;N+^@4Jz#Nx&CrdGZ`B0Y)BnZRVIIj=e7SQs_Bt{#&$m{}4ADE5UqW?k_ z3I^Z%5a}?{-)fcp8K~=R{X!-b?4uL&_8lR+Iw|L0t1_PV7J!!)320n^U?yM zI!{JyaM4^f*CQs}xXQzOHq;LhIT#Gd`Zp*Z^iN7#dq%r6sn_z&Zcg2iWCd`C)s@(*X^U81qm!P)6CfaMN^fm}r5LbF17b zhqGR+eD@EHo3L|T6{wUo91D!rl7XIJ%H>1pV)3dBkI;>X^uXHVG3RRe@xjm=Z%9%} zxV3}{!3TR%x!!mpGGCV}iFy%mRN^;e}XN%hsv7$Hf^ z%RZ> zvRdyYArD;}u=EcTVaS~-9~L(aWZWuQMOU*@EPYi^qwGF0#c*uVZotS*mJh-O&{G!s zq5)*cMcI0b2cZC4NM3$o&`Du1d{&5|x-9}2=}*xVVIOyeEY8g^EgIs#^eM(TL__vW zCZJCgi<|=1AkHVPiv_zr`-G;s)X`T%1fYKl_u`5zmi*uIFW=pFJl=t3<0xL;e7hiM zGsG6~rhSUyfUH9uNPrJV?V}`#5OdcVq_hZ;O3z@J%*uqUUybsA_P^HV&smEJezs$m z)>qlLjPQ~I3pgeL|4oAtuzi_a+uti-r{mbl^YT8z3kDgj&FgB>ZZ`$#^54*tQQ}Z_b zLQfSkc?HWF``@4FfpFUN(lgO91}o`CsO2L8D@B%R$Pm!AY={II^V3SCKPKx(Muw4T zmf886^B!pMIUHh4&^%c!tFJx|M3S%Ay0n7PSIN8)+~!rZ&?J_7Q6b>lPWlx=g^2_* z=2gW3%|ztq)m-#7`$$c6pgM=0{243(N1F10*f|ta)TY9|u0Zm{`~&_0DihIakl7tB z6KOjC4(^r&^&Xl2?U_VFoCDJmGaS*DFic!m>q7oA?hjb3Tk+EV13-uel@bVvDVx+3 z9W8y(1Z1;}Mhx}N6Ouzyi>}5r%9oo?DBHZEH`c!9VXQakA7~Y}r~2Vv*b!UdXzuY{ zO)$;RK+qqHj4-NvO)#0e?J$_Wbl{imH~{=;E^)qNHDM;PY`(uNXbr2*KloFhIk^V* zDf0*CGYjR40x8^W?CoGd<-uT3MD?()Ra`!>(w!svaL`pAW@VF*n>&;r zbFZKMK}g`i?I)37Yd`zba9w|t!gxE9H9m7j{#@f!RZML!ZHE4JBIi zAcp;NfknipnoSh+Qa}VqLC0O11;d0aBGIMz;@83khNzxOef{Z=d{Og5AX2P+Lu#u! z3+mwLwB|Dm(h7ON=FF>Qj4Br6u)MMohZ%c_PF6G{W}UBfeI!hdQ|xWVAAUwc=~ySi zAyMiWf*Oy1W_1E1*O0}PQRbfUxu1Aw%lM_t!}*{5N4fe+CC*OgqGte4k{;1G8$aEJ zE1#il>AgEr^!I(CtDIOqB#u5hYmxJ;4>8eG!UiBD-F3*sOZsKNVZV_p3O+%XpzmjARaB?zqWNMY##>%=jVCCB!xh? zI!#a+5&7b+y9=6fHv6VJ=4j=ZaPBpr53i6MJ5bi9uPs^=gphRsqX-;T4~840JvdAR z;ojMt1_Q*1sXtq`SrR4{(u3jD9ANaWE5LZhsf;_v!3%PM9*^9$O;KBAXV&J--+b`i zuUuJV{z6rz_1BS;x{0fRuVuGH!5AbS&RNIZ>mk+7A2KwFCoRK-GE69Dc|=+6yhY5N zt2GXKm_Mr_0wf$t+^y_NvmaygS@UXd$M|z^QGomP27B>y=mDvA)7X99blN$9trfx) zq3RHi-xf_V)vh26|1JL_v4p{pjTGlF)5bq5wFswL(Ri7Fzr)d>{PE*1hr9mz{{R)~ BOcekC literal 0 HcmV?d00001 diff --git a/BKPS/OLD/EURUSD-5M-V0.1/EX5/Libraries/x-saherelm.alert.lib.ex5 b/BKPS/OLD/EURUSD-5M-V0.1/EX5/Libraries/x-saherelm.alert.lib.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..66cdadc6f063f64f86bb46c729c6b5e98ef94934 GIT binary patch literal 7392 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 KW;8t&i~nDV;NepM literal 0 HcmV?d00001 diff --git a/BKPS/OLD/EURUSD-5M-V0.1/EX5/Libraries/x-saherelm.http.lib.ex5 b/BKPS/OLD/EURUSD-5M-V0.1/EX5/Libraries/x-saherelm.http.lib.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..3d13e4f16e057bab2113bcd3ad46fb3d6d36b9e0 GIT binary patch literal 4574 zcmdT@WmFX0)*cv;7((eT$pPt>h5_l0A*H0GnIWV*qz8lnMg)dng8`p03HDFcl;;Yp@}qN74{JSAbg@y8>UK1;VTa#hO6ODKh`9P zl0xw-J!t0-RdILx`>ry;6W|311o!}408RjBfFFPbAPf+^4-o+0{oW8@dyhKa^ANyG zfcrh74luf3mG3c+`_q3j|IPNdV!!(i_yVK>0{8C!kMrNx|JLpJk8b|^{`_|<{m)Yp z0`T8YTkt=V{|~eX-e#2?W}tJxQNrFrlqBzOIV;Z$_(6uFiC9B_zj<3<5GPu?*~;DC zvjF+UdHql$1P8=k9%B0*C7wD49}>8;e)7r8Vx|-+*SmaX+TM_5kCIMy zeKn9ZUnz6Lo7fA&dMh0tm!@Q#L8TqN0WI3K^>7LVpmI+CJ_7VC;*p9CLJ#>cNQ z&3`O|fbu&T1%G{{`xLIR%9ccNCB^xwM(ob8U6!jRvz6WnkU0T}C5!qV_Gav%AqqpL zgy_AJ^*~LrCHTYImLkv3eVltaQMuTQ+MI0D*FBWnVt23d0;VKION1s^fGtXG zS8x>Oj#f)&A(Aq4TJ}422SqQ5PlPC$IA8Cnz`pFfVGK>iHWbtanwsZrV99T|Gr!i*w~?L~F#T9`^IeCPL9Am9w}%19f9I@7{r zEYNO`spq(o?^r3obOe75F88yF6K$O+TjcxDU!AY1f} zLy%0O)(`DHJbyKSZ;9oMIH3@&lAg?FB(70rNe~{~r{*3|Jw67e<3_fYtbR22WC|7K zKbTzmBFY^xEu1LK9?8j&0_@>XG)VcjxedF3g*n{7=k_0|1%G)v?ByjBnB~LBm@#zP z2n7|Noyz0UrNv`b28`&a>GM6m&^pT~d_bg>C9pF=Me9vS`tUa!O^X(A<=5lP$hb+c zVnK%$D-fEnKOY>f1CTONT~sx=i!OoKgsTU+ei3{(FyBgAwRAF>>b;oJ1Er{?lky-C z4P@foh2bKc+|+I$&=+Ed-H>OiM=GZ`E+_gJFT+{VWNq+_q?HKQa>fepqPXT-sfb*C zJES!%gu^$*y+~MDs%wAS^34^HM?BZbeyxL&c%PV$ltvh* z&bHY1{g75PWvHB{D%N7K;R%!7V!_*To<&g9>)}nvX)4jZu~sBx5Nht0^g>$fd4u9# zdCN8WKWrG`DN1BiuT4aA6p6F5SubI0S7T^ia_gFZp?-l$nVfI=eT$!N5D#~o8^C%m zjnf%36u3$Ha?ITgkp(fXE)EjkEdOTWkCmb#SF<1k^Rj$(V2Tw^GU|{r9`Sf1lF9L| zQQxIQ4X3@fd!~e`uGUubh<9ACwW`G^q2OgIo>)5iOjYkqG*sV6-m2r#^M_qKaoQ-U zPxzzT8%Bw=%m|eaxik#aUr07jlh?*Uml1Cjm=Mu-=1%7hB5KPJ4>23wKoP-wLXBp; zLopqEij8`VHL(nDU8?&tyd;m<7b`#WT?`JjY*zakPqYO0j_?Np*2=dy3nZ|DO0Pz7 z)?yMCmIko@FlRcvpjVfglrlG~2jMOTvX|TnJQ2h`I?eW4$dD)L=>%m9%8VBjy<)$tvJXh8HBsOH67Q-LS*&BX8%mx%~PO zO>^loSI)FG_;Db)j^<6}zT$|@Ft5V2*r;gVSm}>X{cl7jMFEtA{3>}>U?z{0&M%Z8 z61pU23ax&TMg${vc0teD(J56bko84w`l(sNa)E1?>tcW(RsYIPGsPW*V;xJN4Y~dy z&-?X6Qht`=ZVmkB?d?)w?PGPSg5XhtixMs7(>=O2WNw#vr<<0uLteGdjFzoiztprE zI&DP)ZFB2B;N_=fEv$U<*N6eR`X()V|8Ot9*Z}sO0aKglM=YX?F>w7XuS|PQ@nCfG zF0RawoJ(116HOcEvL$gTJ2mlwK6!+3Xffk7K9{~D@}>qK$<7|a>C9Da7O%a zlWa56!=%)x&*Xc~(uSS;Sk>f~ynuD(j`WRp%s%zRkH15GSPXt#tCsHVtUgE~aEJMP z;^tg-XH`T{Eg}_s@ksFPjjp6awXlIKd5AXIdgq4dydN%o!9Y#LEh+=^#kvpt8rha? zylgSYIGuh9OIc-#-v);lKj&hIq@GaZaoF>|tJYvDpgP~GY~0suVrsnq%JEM}-ixoi zx6fot&hL4^>RmUBs*kErW5B---#jTc_c+R121ZnH7iaM9ug(_JEy8GpT*~$(gDV#K z1y=~d7t7B>`3>`DzXuLWEy-IZQyUz~WRzh8c>mekar&}I;7q+K_#!c&IU{CEpCZ=63WtQ2H zGIjSD(c=cAx4QFBg;Z!`&!J$xi-l>CrZz#|zbLf6wOI}GX&10}N>8xK)e7BCSE-#{ zU{@47{%Us6V%QgOs+&rH$o%rpD`mCTV=IezZjFfR*v)u*gq*ZDiYK`Ha(YE4m+B53 z5Fnx$DQ2}M#M4q_(2gpi_)0z_RrQ&nzm#aqUb)iD?o@K#PgNX#8B=7BPM$lZ6=>k; z;HhI%C^dbQe?tISPDu1T2Q+x8vk04p?b$Muz0tNo#hJ9HnOluOvoM%|2JABQ0UOSw zx`~+I87p{K)7Vs@^P()~&m-fFUK+A_S`|KjBauNvHLZ*jYz@*8FFzCZK$%Lt#-@O$F6w{p0h!6h-CmCwDn`E7|t^T zn1lK1qz4N58>hxAuf%V@J6L+&)ZDTTQ-k_-stiJ~#rL6}asmP~-1tyY$uCLz7wxJpw&RS(t2jg;D5? zQED1hTvZucZ>~CIbTjH|wJ=gNhk^k3tnbJ5Ui zZsnT6VI(x2 zPmE9}LE9SZ-NG4x+J~R3+#--mt*?blX^go)A%lPGxvM<@MV!CgPM4;iPs;a+WrHyr zRnVofP99q+2&Q)*4FAcTy?Y8<(doMEaOx=itD0&tPDq*7p4XoB7Shg(M z?ZgfHkA_-aeCptwe87NKQe2yl1(DUhyLG9>BV?qfvU0aBimXEs9!p7l^vH`p2|wuonjZbBONX#m*BoM8Cn>C+g@U?uC%|qy)YtnR&3w>X_; zBGMEidLqo;qu literal 0 HcmV?d00001 diff --git a/BKPS/OLD/EURUSD-5M-V0.1/EX5/Libraries/x-saherelm.log.lib.ex5 b/BKPS/OLD/EURUSD-5M-V0.1/EX5/Libraries/x-saherelm.log.lib.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..7569a3f7a44fd5bf75425b155ae7a4f8227d055d GIT binary patch literal 5906 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 literal 0 HcmV?d00001 diff --git a/BKPS/OLD/EURUSD-5M-V0.1/EX5/Libraries/x-saherelm.nn.lib.ex5 b/BKPS/OLD/EURUSD-5M-V0.1/EX5/Libraries/x-saherelm.nn.lib.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..2977459528a566ebd6f14acf5d36fc80bda6f04b GIT binary patch literal 4374 zcmdT>cQoAH*8U-Cl*o+eU82_^dSr|?+NdE2f-&k4AzJY2CeeaHqDS;zqZ7R)2%@*> zz4zerzTdt7-L<~&-@EtPd!PM0=bW{ky%i0`@LmB26i@E}|Jc&M>i>2CkO7n&gZ{d>3`mmFd%Td zZK3~6{y$KE2WBKdL&ip9pruGIL?j2hYs=DPX{O+`+@ZOGvsw=Ff8dnvx-9%FLHTf1 zTnfVY_?IBR&Uwm!5Q@dWa0u5_zG2a<=Y3OZSJP)WvUA_l?FjR05z7Zl>s=OTpR=Q> z6As?cBdMVK!F_GR7~}-Ds~0m@QdF0Oo@W^S78HBU$3j3+OK|08F&Ocr`6K7@>|eqQ z30RRu?6dG`(yCLtDRRh$Mh1#JZKoeirRJX(CgTm(vvNq(J7?(dT{iM<>LRa=CX~c- zgDKG}hPsr@K8{8*IA%I%MQLTGVonU(B8+JSXBo-wR*m}tf0%tc}e)S z?EvqaQj@Ktzt6ki&!5;>_8vbI7t|BrtKuVNh9!mnRxfA$d2*?Oa5?AMO&%o$$vJ0g z{{a<$$UAvY`-aO2zJV4O7{IPr(OjAcGqi`N2xQb4QjBdjZ5IcKL$USUA<+__2hiSi zcv`%UPXfI7lnV~hpZ*TbihFPcg~Uf5R(SP=^)?;j<&w>xddPajaaj+Qpank8Hy_>b zR=%z>7=Lsxd9-y&VUDOkT3+a5nuI`E)kHArXe+QC9^TSOm@ooKFN{mDprgh!;dztv zfzAwmzNWKp+;i!hdH-d>_^iNM)cn&kKOwC_%OTEij%7;*!+1^UFZwI*ic0pjyXlFh z@)b-Z+Akhc^=arWAH-nvX{osaJ_i4@K6&_aQ$+^X_7Vwh