From 8b79f5c87e4ac8f0e37394550f5f515711a06044 Mon Sep 17 00:00:00 2001 From: Hadi Khazaee Asl Date: Mon, 24 Feb 2025 19:20:10 +0330 Subject: [PATCH] Backup ... --- .../Classes/x-saherelm.base.class.ex5 | Bin 0 -> 5860 bytes .../Classes/x-saherelm.base.class.mq5 | 101 + .../Classes/x-saherelm.x-account.class.ex5 | Bin 0 -> 6524 bytes .../Classes/x-saherelm.x-account.class.mq5 | 398 + .../Classes/x-saherelm.x-alert.class.ex5 | Bin 0 -> 5794 bytes .../Classes/x-saherelm.x-alert.class.mq5 | 1580 +++ .../Classes/x-saherelm.x-app-dialog.class.ex5 | Bin 0 -> 11432 bytes .../Classes/x-saherelm.x-app-dialog.class.mq5 | 275 + .../x-saherelm.x-bar.analyser.class.ex5 | Bin 0 -> 8306 bytes .../x-saherelm.x-bar.analyser.class.mq5 | 5852 +++++++++ .../Classes/x-saherelm.x-cobject.class.ex5 | Bin 0 -> 14036 bytes .../Classes/x-saherelm.x-cobject.class.mq5 | 3850 ++++++ .../Classes/x-saherelm.x-expert.class.ex5 | Bin 0 -> 12110 bytes .../Classes/x-saherelm.x-expert.class.mq5 | 967 ++ .../Classes/x-saherelm.x-helper.class.ex5 | Bin 0 -> 7110 bytes .../Classes/x-saherelm.x-helper.class.mq5 | 151 + .../Classes/x-saherelm.x-http.class.ex5 | Bin 0 -> 6138 bytes .../Classes/x-saherelm.x-http.class.mq5 | 373 + .../Classes/x-saherelm.x-md5.class.ex5 | Bin 0 -> 5058 bytes .../Classes/x-saherelm.x-md5.class.mq5 | 445 + .../Classes/x-saherelm.x-poi.class.ex5 | Bin 0 -> 14730 bytes .../Classes/x-saherelm.x-poi.class.mq5 | 4218 ++++++ .../Classes/x-saherelm.x-poi.drawer.class.ex5 | Bin 0 -> 14300 bytes .../Classes/x-saherelm.x-poi.drawer.class.mq5 | 4931 +++++++ .../Classes/x-saherelm.x-trade.class.ex5 | Bin 0 -> 11862 bytes .../Classes/x-saherelm.x-trade.class.mq5 | 3934 ++++++ BKPS/14031206/Documents/BKP/Test.ex5 | Bin 0 -> 8276 bytes BKPS/14031206/Documents/BKP/Test.mq5 | Bin 0 -> 8908 bytes BKPS/14031206/Documents/BKP/tmpPOIS.mq5 | 346 + .../BKP/x-121.smc.xwz.signal.class copy 2.mq5 | 2725 ++++ .../BKP/x-121.smc.xwz.signal.class copy.mq5 | 2725 ++++ .../BKP/x-121.smc.xwz.signal.class.mq5 | 2725 ++++ .../BKP/x-121.smc.xwz.signal.lib copy 2.mq5 | 3749 ++++++ .../BKP/x-121.smc.xwz.signal.lib copy.mq5 | 3749 ++++++ .../BKP/x-121.smc.xwz.signal.lib.mq5 | 3560 +++++ .../Documents/BKP/xsupdem/plib.tmp.codes.mq5 | 2732 ++++ .../Documents/BKP/xsupdem/tmp.signal.mq5 | 1234 ++ .../xsupdem/x-121.smc.expert.alert.class.mq5 | 2458 ++++ .../x-121.smc.xsupdemobs.signal.class.mq5 | 3699 ++++++ .../x-121.smc.xsupdemobs.signal.lib.mq5 | 1686 +++ .../xsupdem/x-121.smc.xwz.signal.class.mq5 | 2996 +++++ .../BKP/xsupdem/x-121.smc.xwz.signal.lib.mq5 | 3283 +++++ .../xsupdem/x-saherelm.x-121.smc.alert.ea.mq5 | 464 + .../Diagrams/Position Protection.drawio | 279 + .../Documents/JsModules/x-color.tools.js | 506 + .../Documents/JsModules/x-file.tools.js | 887 ++ .../Documents/JsModules/x-shell.tools.js | 219 + .../JsModules/x-type-detector.tools.js | 268 + .../Documents/JsModules/x-value.tools.js | 1528 +++ .../Temlates/x-saherelm.x-ea.template.ea.mq5 | 542 + .../Temlates/x-saherelm.x-panel.ea.mq5 | 575 + BKPS/14031206/Experts/Advisors/ExpertMACD.ex5 | Bin 0 -> 136234 bytes BKPS/14031206/Experts/Advisors/ExpertMACD.mq5 | 168 + BKPS/14031206/Experts/Advisors/ExpertMAMA.ex5 | Bin 0 -> 145544 bytes BKPS/14031206/Experts/Advisors/ExpertMAMA.mq5 | 175 + .../Experts/Advisors/ExpertMAPSAR.ex5 | Bin 0 -> 142958 bytes .../Experts/Advisors/ExpertMAPSAR.mq5 | 171 + .../Advisors/ExpertMAPSARSizeOptimized.ex5 | Bin 0 -> 147354 bytes .../Advisors/ExpertMAPSARSizeOptimized.mq5 | 176 + .../Examples/ChartInChart/ChartInChart.ex5 | Bin 0 -> 18276 bytes .../Examples/ChartInChart/ChartInChart.mq5 | Bin 0 -> 30544 bytes .../Experts/Examples/Controls/Controls.ex5 | Bin 0 -> 170410 bytes .../Experts/Examples/Controls/Controls.mq5 | 45 + .../Examples/Controls/ControlsDialog.mqh | 427 + .../Correlation Matrix 3D.ex5 | Bin 0 -> 68536 bytes .../Correlation Matrix 3D.mq5 | Bin 0 -> 77280 bytes .../Correlation Matrix 3D.mqproj | Bin 0 -> 8302 bytes .../Experts/Examples/MACD/MACD Sample.ex5 | Bin 0 -> 42316 bytes .../Experts/Examples/MACD/MACD Sample.mq5 | 451 + .../Examples/Math 3D Morpher/Functions.mqh | 372 + .../Math 3D Morpher/Math 3D Morpher.ex5 | Bin 0 -> 68560 bytes .../Math 3D Morpher/Math 3D Morpher.mq5 | Bin 0 -> 35776 bytes .../Math 3D Morpher/Math 3D Morpher.mqproj | Bin 0 -> 16042 bytes .../Math 3D Morpher/Textures/checker.bmp | Bin 0 -> 196662 bytes .../Experts/Examples/Math 3D/Functions.mqh | Bin 0 -> 16008 bytes .../Experts/Examples/Math 3D/Math 3D.ex5 | Bin 0 -> 41578 bytes .../Experts/Examples/Math 3D/Math 3D.ico | Bin 0 -> 16958 bytes .../Experts/Examples/Math 3D/Math 3D.mq5 | Bin 0 -> 6986 bytes .../Experts/Examples/Math 3D/Math 3D.mqproj | Bin 0 -> 6042 bytes .../Examples/Math 3D/Sets/Chomolungma.set | Bin 0 -> 684 bytes .../Examples/Math 3D/Sets/ClimberDream.set | Bin 0 -> 696 bytes .../Examples/Math 3D/Sets/DoubleScrew.set | Bin 0 -> 684 bytes .../Experts/Examples/Math 3D/Sets/Granite.set | Bin 0 -> 684 bytes .../Examples/Math 3D/Sets/Hedgehog.set | Bin 0 -> 692 bytes .../Experts/Examples/Math 3D/Sets/Hill.set | Bin 0 -> 688 bytes .../Examples/Math 3D/Sets/Josephine.set | Bin 0 -> 688 bytes .../Math 3D/Sets/MultyExtremalScrew.set | Bin 0 -> 684 bytes .../Experts/Examples/Math 3D/Sets/Screw.set | Bin 0 -> 684 bytes .../Experts/Examples/Math 3D/Sets/Sink.set | Bin 0 -> 686 bytes .../Experts/Examples/Math 3D/Sets/Skin.set | Bin 0 -> 686 bytes .../Examples/Math 3D/Sets/Trapfall.set | Bin 0 -> 686 bytes .../Moving Average/Moving Average.ex5 | Bin 0 -> 32854 bytes .../Moving Average/Moving Average.mq5 | 233 + .../BlackCrows WhiteSoldiers CCI.ex5 | Bin 0 -> 42958 bytes .../BlackCrows WhiteSoldiers CCI.mq5 | 657 + .../BlackCrows WhiteSoldiers MFI.ex5 | Bin 0 -> 42308 bytes .../BlackCrows WhiteSoldiers MFI.mq5 | 657 + .../BlackCrows WhiteSoldiers RSI.ex5 | Bin 0 -> 42440 bytes .../BlackCrows WhiteSoldiers RSI.mq5 | 657 + .../BlackCrows WhiteSoldiers Stoch.ex5 | Bin 0 -> 43334 bytes .../BlackCrows WhiteSoldiers Stoch.mq5 | 661 + .../BullishBearish Engulfing CCI.ex5 | Bin 0 -> 43548 bytes .../BullishBearish Engulfing CCI.mq5 | 682 + .../BullishBearish Engulfing MFI.ex5 | Bin 0 -> 42928 bytes .../BullishBearish Engulfing MFI.mq5 | 682 + .../BullishBearish Engulfing RSI.ex5 | Bin 0 -> 43364 bytes .../BullishBearish Engulfing RSI.mq5 | 682 + .../BullishBearish Engulfing Stoch.ex5 | Bin 0 -> 43960 bytes .../BullishBearish Engulfing Stoch.mq5 | 688 + .../Free Robots/BullishBearish Harami CCI.ex5 | Bin 0 -> 44164 bytes .../Free Robots/BullishBearish Harami CCI.mq5 | 682 + .../Free Robots/BullishBearish Harami MFI.ex5 | Bin 0 -> 43098 bytes .../Free Robots/BullishBearish Harami MFI.mq5 | 682 + .../Free Robots/BullishBearish Harami RSI.ex5 | Bin 0 -> 43322 bytes .../Free Robots/BullishBearish Harami RSI.mq5 | 682 + .../BullishBearish Harami Stoch.ex5 | Bin 0 -> 43996 bytes .../BullishBearish Harami Stoch.mq5 | 685 + .../BullishBearish MeetingLines CCI.ex5 | Bin 0 -> 42860 bytes .../BullishBearish MeetingLines CCI.mq5 | 654 + .../BullishBearish MeetingLines MFI.ex5 | Bin 0 -> 42300 bytes .../BullishBearish MeetingLines MFI.mq5 | 652 + .../BullishBearish MeetingLines RSI.ex5 | Bin 0 -> 42872 bytes .../BullishBearish MeetingLines RSI.mq5 | 653 + .../BullishBearish MeetingLines Stoch.ex5 | Bin 0 -> 44070 bytes .../BullishBearish MeetingLines Stoch.mq5 | 662 + .../DarkCloud PiercingLine CCI.ex5 | Bin 0 -> 43580 bytes .../DarkCloud PiercingLine CCI.mq5 | 682 + .../DarkCloud PiercingLine MFI.ex5 | Bin 0 -> 43124 bytes .../DarkCloud PiercingLine MFI.mq5 | 681 + .../DarkCloud PiercingLine RSI.ex5 | Bin 0 -> 44374 bytes .../DarkCloud PiercingLine RSI.mq5 | 683 + .../DarkCloud PiercingLine Stoch.ex5 | Bin 0 -> 44614 bytes .../DarkCloud PiercingLine Stoch.mq5 | 687 + .../Free Robots/HangingMan Hammer CCI.ex5 | Bin 0 -> 43512 bytes .../Free Robots/HangingMan Hammer CCI.mq5 | 679 + .../Free Robots/HangingMan Hammer MFI.ex5 | Bin 0 -> 41890 bytes .../Free Robots/HangingMan Hammer MFI.mq5 | 679 + .../Free Robots/HangingMan Hammer RSI.ex5 | Bin 0 -> 43486 bytes .../Free Robots/HangingMan Hammer RSI.mq5 | 677 + .../Free Robots/HangingMan Hammer Stoch.ex5 | Bin 0 -> 43566 bytes .../Free Robots/HangingMan Hammer Stoch.mq5 | 683 + .../MorningEvening StarDoji CCI.ex5 | Bin 0 -> 43190 bytes .../MorningEvening StarDoji CCI.mq5 | 685 + .../MorningEvening StarDoji MFI.ex5 | Bin 0 -> 42512 bytes .../MorningEvening StarDoji MFI.mq5 | 686 + .../MorningEvening StarDoji RSI.ex5 | Bin 0 -> 43170 bytes .../MorningEvening StarDoji RSI.mq5 | 686 + .../MorningEvening StarDoji Stoch.ex5 | Bin 0 -> 43912 bytes .../MorningEvening StarDoji Stoch.mq5 | 691 + .../Experts/x-saherelm.x-121.smc.ea.ex5 | Bin 0 -> 1521716 bytes .../Experts/x-saherelm.x-121.smc.ea.mq5 | 464 + .../Helpers/x-saherelm.x121.helper.ex5 | Bin 0 -> 7272 bytes .../Helpers/x-saherelm.x121.helper.mq5 | 3750 ++++++ .../Helpers/x-saherelm.x121.xatr.helper.ex5 | Bin 0 -> 6350 bytes .../Helpers/x-saherelm.x121.xatr.helper.mq5 | 1273 ++ .../Helpers/x-saherelm.x121.xcc.helper.ex5 | Bin 0 -> 6226 bytes .../Helpers/x-saherelm.x121.xcc.helper.mq5 | 252 + .../Helpers/x-saherelm.x121.xche.helper.ex5 | Bin 0 -> 6010 bytes .../Helpers/x-saherelm.x121.xche.helper.mq5 | 1387 ++ .../Helpers/x-saherelm.x121.xct.helper.ex5 | Bin 0 -> 5660 bytes .../Helpers/x-saherelm.x121.xct.helper.mq5 | 234 + .../Helpers/x-saherelm.x121.xdon.helper.ex5 | Bin 0 -> 6504 bytes .../Helpers/x-saherelm.x121.xdon.helper.mq5 | 1408 ++ .../Helpers/x-saherelm.x121.xhk.helper.ex5 | Bin 0 -> 6334 bytes .../Helpers/x-saherelm.x121.xhk.helper.mq5 | 1524 +++ .../Helpers/x-saherelm.x121.xpv.helper.ex5 | Bin 0 -> 6604 bytes .../Helpers/x-saherelm.x121.xpv.helper.mq5 | 2377 ++++ .../Helpers/x-saherelm.x121.xstr.helper.ex5 | Bin 0 -> 7118 bytes .../Helpers/x-saherelm.x121.xstr.helper.mq5 | 1112 ++ .../Helpers/x-saherelm.x121.xtrend.helper.ex5 | Bin 0 -> 6604 bytes .../Helpers/x-saherelm.x121.xtrend.helper.mq5 | 1279 ++ .../Helpers/x-saherelm.x121.xvwap.helper.ex5 | Bin 0 -> 6986 bytes .../Helpers/x-saherelm.x121.xvwap.helper.mq5 | 1508 +++ BKPS/14031206/Indicators/Examples/AD.ex5 | Bin 0 -> 8436 bytes BKPS/14031206/Indicators/Examples/AD.mq5 | 90 + BKPS/14031206/Indicators/Examples/ADX.ex5 | Bin 0 -> 12484 bytes BKPS/14031206/Indicators/Examples/ADX.mq5 | 155 + BKPS/14031206/Indicators/Examples/ADXW.ex5 | Bin 0 -> 14360 bytes BKPS/14031206/Indicators/Examples/ADXW.mq5 | 189 + BKPS/14031206/Indicators/Examples/AMA.ex5 | Bin 0 -> 10426 bytes BKPS/14031206/Indicators/Examples/AMA.mq5 | 130 + BKPS/14031206/Indicators/Examples/ASI.ex5 | Bin 0 -> 9026 bytes BKPS/14031206/Indicators/Examples/ASI.mq5 | 112 + BKPS/14031206/Indicators/Examples/ATR.ex5 | Bin 0 -> 9534 bytes BKPS/14031206/Indicators/Examples/ATR.mq5 | 97 + .../Indicators/Examples/Accelerator.ex5 | Bin 0 -> 8826 bytes .../Indicators/Examples/Accelerator.mq5 | 147 + .../Indicators/Examples/Alligator.ex5 | Bin 0 -> 15934 bytes .../Indicators/Examples/Alligator.mq5 | 148 + .../Examples/Awesome_Oscillator.ex5 | Bin 0 -> 7826 bytes .../Examples/Awesome_Oscillator.mq5 | 127 + BKPS/14031206/Indicators/Examples/BB.ex5 | Bin 0 -> 13362 bytes BKPS/14031206/Indicators/Examples/BB.mq5 | 141 + .../Indicators/Examples/BW-ZoneTrade.ex5 | Bin 0 -> 8892 bytes .../Indicators/Examples/BW-ZoneTrade.mq5 | 134 + BKPS/14031206/Indicators/Examples/Bears.ex5 | Bin 0 -> 8346 bytes BKPS/14031206/Indicators/Examples/Bears.mq5 | 94 + BKPS/14031206/Indicators/Examples/Bulls.ex5 | Bin 0 -> 8626 bytes BKPS/14031206/Indicators/Examples/Bulls.mq5 | 94 + BKPS/14031206/Indicators/Examples/CCI.ex5 | Bin 0 -> 10482 bytes BKPS/14031206/Indicators/Examples/CCI.mq5 | 94 + BKPS/14031206/Indicators/Examples/CHO.ex5 | Bin 0 -> 17008 bytes BKPS/14031206/Indicators/Examples/CHO.mq5 | 131 + BKPS/14031206/Indicators/Examples/CHV.ex5 | Bin 0 -> 15442 bytes BKPS/14031206/Indicators/Examples/CHV.mq5 | 118 + .../Indicators/Examples/Canvas/FlameChart.ex5 | Bin 0 -> 26154 bytes .../Indicators/Examples/Canvas/FlameChart.mq5 | 73 + .../Indicators/Examples/ColorBars.ex5 | Bin 0 -> 6918 bytes .../Indicators/Examples/ColorBars.mq5 | 82 + .../Indicators/Examples/ColorCandlesDaily.ex5 | Bin 0 -> 7522 bytes .../Indicators/Examples/ColorCandlesDaily.mq5 | 78 + .../Indicators/Examples/ColorLine.ex5 | Bin 0 -> 7280 bytes .../Indicators/Examples/ColorLine.mq5 | 133 + .../Examples/Custom Moving Average.ex5 | Bin 0 -> 12700 bytes .../Examples/Custom Moving Average.mq5 | 199 + BKPS/14031206/Indicators/Examples/DEMA.ex5 | Bin 0 -> 10890 bytes BKPS/14031206/Indicators/Examples/DEMA.mq5 | 70 + BKPS/14031206/Indicators/Examples/DPO.ex5 | Bin 0 -> 10764 bytes BKPS/14031206/Indicators/Examples/DPO.mq5 | 69 + .../14031206/Indicators/Examples/DeMarker.ex5 | Bin 0 -> 10914 bytes .../14031206/Indicators/Examples/DeMarker.mq5 | 111 + .../Indicators/Examples/Envelopes.ex5 | Bin 0 -> 13348 bytes .../Indicators/Examples/Envelopes.mq5 | 108 + .../Indicators/Examples/Force_Index.ex5 | Bin 0 -> 12350 bytes .../Indicators/Examples/Force_Index.mq5 | 101 + BKPS/14031206/Indicators/Examples/FrAMA.ex5 | Bin 0 -> 8970 bytes BKPS/14031206/Indicators/Examples/FrAMA.mq5 | 81 + .../14031206/Indicators/Examples/Fractals.ex5 | Bin 0 -> 7462 bytes .../14031206/Indicators/Examples/Fractals.mq5 | 88 + BKPS/14031206/Indicators/Examples/Gator.ex5 | Bin 0 -> 15582 bytes BKPS/14031206/Indicators/Examples/Gator.mq5 | 264 + BKPS/14031206/Indicators/Examples/Gator_2.ex5 | Bin 0 -> 16030 bytes BKPS/14031206/Indicators/Examples/Gator_2.mq5 | 252 + .../Indicators/Examples/Heiken_Ashi.ex5 | Bin 0 -> 8006 bytes .../Indicators/Examples/Heiken_Ashi.mq5 | 94 + .../14031206/Indicators/Examples/Ichimoku.ex5 | Bin 0 -> 12178 bytes .../14031206/Indicators/Examples/Ichimoku.mq5 | 130 + BKPS/14031206/Indicators/Examples/MACD.ex5 | Bin 0 -> 13336 bytes BKPS/14031206/Indicators/Examples/MACD.mq5 | 123 + BKPS/14031206/Indicators/Examples/MFI.ex5 | Bin 0 -> 10500 bytes BKPS/14031206/Indicators/Examples/MFI.mq5 | 120 + BKPS/14031206/Indicators/Examples/MI.ex5 | Bin 0 -> 13480 bytes BKPS/14031206/Indicators/Examples/MI.mq5 | 122 + .../Examples/MarketFacilitationIndex.ex5 | Bin 0 -> 9256 bytes .../Examples/MarketFacilitationIndex.mq5 | 151 + .../14031206/Indicators/Examples/Momentum.ex5 | Bin 0 -> 8916 bytes .../14031206/Indicators/Examples/Momentum.mq5 | 68 + BKPS/14031206/Indicators/Examples/OBV.ex5 | Bin 0 -> 8506 bytes BKPS/14031206/Indicators/Examples/OBV.mq5 | 90 + BKPS/14031206/Indicators/Examples/OsMA.ex5 | Bin 0 -> 13924 bytes BKPS/14031206/Indicators/Examples/OsMA.mq5 | 126 + BKPS/14031206/Indicators/Examples/PVT.ex5 | Bin 0 -> 7880 bytes BKPS/14031206/Indicators/Examples/PVT.mq5 | 85 + .../Examples/Panels/ChartPanel/ChartPanel.ex5 | Bin 0 -> 132034 bytes .../Examples/Panels/ChartPanel/ChartPanel.mq5 | 64 + .../Panels/ChartPanel/PanelDialog.mqh | 375 + .../Panels/SimplePanel/PanelDialog.mqh | 346 + .../Panels/SimplePanel/SimplePanel.ex5 | Bin 0 -> 134762 bytes .../Panels/SimplePanel/SimplePanel.mq5 | 64 + .../Indicators/Examples/ParabolicSAR.ex5 | Bin 0 -> 12304 bytes .../Indicators/Examples/ParabolicSAR.mq5 | 204 + .../Indicators/Examples/Price_Channel.ex5 | Bin 0 -> 9070 bytes .../Indicators/Examples/Price_Channel.mq5 | 106 + BKPS/14031206/Indicators/Examples/ROC.ex5 | Bin 0 -> 9180 bytes BKPS/14031206/Indicators/Examples/ROC.mq5 | 66 + BKPS/14031206/Indicators/Examples/RSI.ex5 | Bin 0 -> 11902 bytes BKPS/14031206/Indicators/Examples/RSI.mq5 | 115 + BKPS/14031206/Indicators/Examples/RVI.ex5 | Bin 0 -> 11452 bytes BKPS/14031206/Indicators/Examples/RVI.mq5 | 102 + BKPS/14031206/Indicators/Examples/StdDev.ex5 | Bin 0 -> 12930 bytes BKPS/14031206/Indicators/Examples/StdDev.mq5 | 129 + .../Indicators/Examples/Stochastic.ex5 | Bin 0 -> 11146 bytes .../Indicators/Examples/Stochastic.mq5 | 142 + BKPS/14031206/Indicators/Examples/TEMA.ex5 | Bin 0 -> 10868 bytes BKPS/14031206/Indicators/Examples/TEMA.mq5 | 74 + BKPS/14031206/Indicators/Examples/TRIX.ex5 | Bin 0 -> 9756 bytes BKPS/14031206/Indicators/Examples/TRIX.mq5 | 82 + .../Examples/Ultimate_Oscillator.ex5 | Bin 0 -> 13182 bytes .../Examples/Ultimate_Oscillator.mq5 | 178 + BKPS/14031206/Indicators/Examples/VIDYA.ex5 | Bin 0 -> 9276 bytes BKPS/14031206/Indicators/Examples/VIDYA.mq5 | 98 + BKPS/14031206/Indicators/Examples/VROC.ex5 | Bin 0 -> 11132 bytes BKPS/14031206/Indicators/Examples/VROC.mq5 | 98 + BKPS/14031206/Indicators/Examples/Volumes.ex5 | Bin 0 -> 7680 bytes BKPS/14031206/Indicators/Examples/Volumes.mq5 | 88 + BKPS/14031206/Indicators/Examples/WPR.ex5 | Bin 0 -> 9810 bytes BKPS/14031206/Indicators/Examples/WPR.mq5 | Bin 0 -> 8478 bytes BKPS/14031206/Indicators/Examples/W_AD.ex5 | Bin 0 -> 8250 bytes BKPS/14031206/Indicators/Examples/W_AD.mq5 | 96 + BKPS/14031206/Indicators/Examples/ZigZag.ex5 | Bin 0 -> 12604 bytes BKPS/14031206/Indicators/Examples/ZigZag.mq5 | Bin 0 -> 18820 bytes .../Indicators/Examples/ZigzagColor.ex5 | Bin 0 -> 12770 bytes .../Indicators/Examples/ZigzagColor.mq5 | 287 + .../Free Indicators/Camarilla Channel.ex5 | Bin 0 -> 18278 bytes .../Free Indicators/Camarilla Channel.mq5 | 250 + .../Free Indicators/DeMark Channel.ex5 | Bin 0 -> 13660 bytes .../Free Indicators/DeMark Channel.mq5 | 204 + .../Free Indicators/Donchian Channel.ex5 | Bin 0 -> 12862 bytes .../Free Indicators/Donchian Channel.mq5 | 160 + .../Free Indicators/Fibonacci Channel.ex5 | Bin 0 -> 18226 bytes .../Free Indicators/Fibonacci Channel.mq5 | 264 + .../Free Indicators/Keltner Channel.ex5 | Bin 0 -> 15366 bytes .../Free Indicators/Keltner Channel.mq5 | 246 + .../Free Indicators/MarketProfile Canvas.ex5 | Bin 0 -> 33580 bytes .../Free Indicators/MarketProfile Canvas.mq5 | 448 + .../Free Indicators/MarketProfile.ex5 | Bin 0 -> 17154 bytes .../Free Indicators/MarketProfile.mq5 | 210 + .../Free Indicators/MurreyMath Channel.ex5 | Bin 0 -> 24406 bytes .../Free Indicators/MurreyMath Channel.mq5 | 410 + .../Free Indicators/NRTR Channel.ex5 | Bin 0 -> 16024 bytes .../Free Indicators/NRTR Channel.mq5 | 281 + .../Free Indicators/Parabolic Channel.ex5 | Bin 0 -> 13734 bytes .../Free Indicators/Parabolic Channel.mq5 | 176 + .../Free Indicators/Pivot Channel.ex5 | Bin 0 -> 17628 bytes .../Free Indicators/Pivot Channel.mq5 | 264 + .../Free Indicators/Woodie Channel.ex5 | Bin 0 -> 17758 bytes .../Free Indicators/Woodie Channel.mq5 | 240 + .../Indicators/x-saherelm.x121.xatr.ex5 | Bin 0 -> 24864 bytes .../Indicators/x-saherelm.x121.xatr.mq5 | 648 + .../Indicators/x-saherelm.x121.xcc.ex5 | Bin 0 -> 14548 bytes .../Indicators/x-saherelm.x121.xcc.mq5 | 437 + .../Indicators/x-saherelm.x121.xche.ex5 | Bin 0 -> 20316 bytes .../Indicators/x-saherelm.x121.xche.mq5 | 624 + .../Indicators/x-saherelm.x121.xct.ex5 | Bin 0 -> 24998 bytes .../Indicators/x-saherelm.x121.xct.mq5 | 262 + .../Indicators/x-saherelm.x121.xdon.ex5 | Bin 0 -> 17786 bytes .../Indicators/x-saherelm.x121.xdon.mq5 | 692 + .../Indicators/x-saherelm.x121.xhk.ex5 | Bin 0 -> 20594 bytes .../Indicators/x-saherelm.x121.xhk.mq5 | 616 + .../Indicators/x-saherelm.x121.xpv.ex5 | Bin 0 -> 45116 bytes .../Indicators/x-saherelm.x121.xpv.mq5 | 1002 ++ .../Indicators/x-saherelm.x121.xstr.ex5 | Bin 0 -> 16628 bytes .../Indicators/x-saherelm.x121.xstr.mq5 | 636 + .../Indicators/x-saherelm.x121.xtrend.ex5 | Bin 0 -> 22082 bytes .../Indicators/x-saherelm.x121.xtrend.mq5 | 700 + .../Indicators/x-saherelm.x121.xvwap.ex5 | Bin 0 -> 17252 bytes .../Indicators/x-saherelm.x121.xvwap.mq5 | 711 + .../Indicators/x-saherelm.x121.xwz.ex5 | Bin 0 -> 101456 bytes .../Indicators/x-saherelm.x121.xwz.mq5 | 3438 +++++ .../Libraries/x-saherelm.common.lib.ex5 | Bin 0 -> 5792 bytes .../Libraries/x-saherelm.common.lib.mq5 | 10682 ++++++++++++++++ .../Libraries/x-saherelm.draw.lib.ex5 | Bin 0 -> 7062 bytes .../Libraries/x-saherelm.draw.lib.mq5 | 2626 ++++ .../x-saherelm.x-poi.extensions.lib.ex5 | Bin 0 -> 8018 bytes .../x-saherelm.x-poi.extensions.lib.mq5 | 3441 +++++ .../Libraries/x-saherelm.x-poi.lib.ex5 | Bin 0 -> 7864 bytes .../Libraries/x-saherelm.x-poi.lib.mq5 | 6333 +++++++++ .../Libraries/x-saherelm.x-trade.lib.ex5 | Bin 0 -> 11310 bytes .../Libraries/x-saherelm.x-trade.lib.mq5 | 6250 +++++++++ .../Libraries/x-saherelm.xobfvg.lib.ex5 | Bin 0 -> 7606 bytes .../Libraries/x-saherelm.xobfvg.lib.mq5 | 1898 +++ .../Classes/x-121.smc.base.strategy.class.ex5 | Bin 0 -> 16676 bytes .../Classes/x-121.smc.base.strategy.class.mq5 | 650 + .../Classes/x-121.smc.cobjects.class.ex5 | Bin 0 -> 16454 bytes .../Classes/x-121.smc.cobjects.class.mq5 | 35 + .../Classes/x-121.smc.ea.panel.class.ex5 | Bin 0 -> 10870 bytes .../Classes/x-121.smc.ea.panel.class.mq5 | 63 + .../x-121.smc.market.cycle.helper.class.ex5 | Bin 0 -> 16804 bytes .../x-121.smc.market.cycle.helper.class.mq5 | 802 ++ .../x-121.smc.x-tradehandler.class.ex5 | Bin 0 -> 16154 bytes .../x-121.smc.x-tradehandler.class.mq5 | 4365 +++++++ .../Experts/x-121.smc.expert.class.ex5 | Bin 0 -> 19824 bytes .../Experts/x-121.smc.expert.class.mq5 | 2474 ++++ .../Libraries/x-121.smc.guard.lib.ex5 | Bin 0 -> 17194 bytes .../Libraries/x-121.smc.guard.lib.mq5 | 974 ++ .../X121SMCEA/Libraries/x-121.smc.lib.ex5 | Bin 0 -> 15864 bytes .../X121SMCEA/Libraries/x-121.smc.lib.mq5 | 734 ++ .../Signals/x-121.smc.xwz.signal.class.ex5 | Bin 0 -> 18216 bytes .../Signals/x-121.smc.xwz.signal.class.mq5 | 3642 ++++++ .../Signals/x-121.smc.xwz.signal.lib.ex5 | Bin 0 -> 17836 bytes .../Signals/x-121.smc.xwz.signal.lib.mq5 | 1315 ++ .../Strategy/x-121.smc.strategy.class.ex5 | Bin 0 -> 19358 bytes .../Strategy/x-121.smc.strategy.class.mq5 | 1135 ++ 373 files changed, 175584 insertions(+) create mode 100644 BKPS/14031206/Classes/x-saherelm.base.class.ex5 create mode 100644 BKPS/14031206/Classes/x-saherelm.base.class.mq5 create mode 100644 BKPS/14031206/Classes/x-saherelm.x-account.class.ex5 create mode 100644 BKPS/14031206/Classes/x-saherelm.x-account.class.mq5 create mode 100644 BKPS/14031206/Classes/x-saherelm.x-alert.class.ex5 create mode 100644 BKPS/14031206/Classes/x-saherelm.x-alert.class.mq5 create mode 100644 BKPS/14031206/Classes/x-saherelm.x-app-dialog.class.ex5 create mode 100644 BKPS/14031206/Classes/x-saherelm.x-app-dialog.class.mq5 create mode 100644 BKPS/14031206/Classes/x-saherelm.x-bar.analyser.class.ex5 create mode 100644 BKPS/14031206/Classes/x-saherelm.x-bar.analyser.class.mq5 create mode 100644 BKPS/14031206/Classes/x-saherelm.x-cobject.class.ex5 create mode 100644 BKPS/14031206/Classes/x-saherelm.x-cobject.class.mq5 create mode 100644 BKPS/14031206/Classes/x-saherelm.x-expert.class.ex5 create mode 100644 BKPS/14031206/Classes/x-saherelm.x-expert.class.mq5 create mode 100644 BKPS/14031206/Classes/x-saherelm.x-helper.class.ex5 create mode 100644 BKPS/14031206/Classes/x-saherelm.x-helper.class.mq5 create mode 100644 BKPS/14031206/Classes/x-saherelm.x-http.class.ex5 create mode 100644 BKPS/14031206/Classes/x-saherelm.x-http.class.mq5 create mode 100644 BKPS/14031206/Classes/x-saherelm.x-md5.class.ex5 create mode 100644 BKPS/14031206/Classes/x-saherelm.x-md5.class.mq5 create mode 100644 BKPS/14031206/Classes/x-saherelm.x-poi.class.ex5 create mode 100644 BKPS/14031206/Classes/x-saherelm.x-poi.class.mq5 create mode 100644 BKPS/14031206/Classes/x-saherelm.x-poi.drawer.class.ex5 create mode 100644 BKPS/14031206/Classes/x-saherelm.x-poi.drawer.class.mq5 create mode 100644 BKPS/14031206/Classes/x-saherelm.x-trade.class.ex5 create mode 100644 BKPS/14031206/Classes/x-saherelm.x-trade.class.mq5 create mode 100644 BKPS/14031206/Documents/BKP/Test.ex5 create mode 100644 BKPS/14031206/Documents/BKP/Test.mq5 create mode 100644 BKPS/14031206/Documents/BKP/tmpPOIS.mq5 create mode 100644 BKPS/14031206/Documents/BKP/x-121.smc.xwz.signal.class copy 2.mq5 create mode 100644 BKPS/14031206/Documents/BKP/x-121.smc.xwz.signal.class copy.mq5 create mode 100644 BKPS/14031206/Documents/BKP/x-121.smc.xwz.signal.class.mq5 create mode 100644 BKPS/14031206/Documents/BKP/x-121.smc.xwz.signal.lib copy 2.mq5 create mode 100644 BKPS/14031206/Documents/BKP/x-121.smc.xwz.signal.lib copy.mq5 create mode 100644 BKPS/14031206/Documents/BKP/x-121.smc.xwz.signal.lib.mq5 create mode 100644 BKPS/14031206/Documents/BKP/xsupdem/plib.tmp.codes.mq5 create mode 100644 BKPS/14031206/Documents/BKP/xsupdem/tmp.signal.mq5 create mode 100644 BKPS/14031206/Documents/BKP/xsupdem/x-121.smc.expert.alert.class.mq5 create mode 100644 BKPS/14031206/Documents/BKP/xsupdem/x-121.smc.xsupdemobs.signal.class.mq5 create mode 100644 BKPS/14031206/Documents/BKP/xsupdem/x-121.smc.xsupdemobs.signal.lib.mq5 create mode 100644 BKPS/14031206/Documents/BKP/xsupdem/x-121.smc.xwz.signal.class.mq5 create mode 100644 BKPS/14031206/Documents/BKP/xsupdem/x-121.smc.xwz.signal.lib.mq5 create mode 100644 BKPS/14031206/Documents/BKP/xsupdem/x-saherelm.x-121.smc.alert.ea.mq5 create mode 100644 BKPS/14031206/Documents/Diagrams/Position Protection.drawio create mode 100644 BKPS/14031206/Documents/JsModules/x-color.tools.js create mode 100644 BKPS/14031206/Documents/JsModules/x-file.tools.js create mode 100644 BKPS/14031206/Documents/JsModules/x-shell.tools.js create mode 100644 BKPS/14031206/Documents/JsModules/x-type-detector.tools.js create mode 100644 BKPS/14031206/Documents/JsModules/x-value.tools.js create mode 100644 BKPS/14031206/Documents/Temlates/x-saherelm.x-ea.template.ea.mq5 create mode 100644 BKPS/14031206/Documents/Temlates/x-saherelm.x-panel.ea.mq5 create mode 100644 BKPS/14031206/Experts/Advisors/ExpertMACD.ex5 create mode 100644 BKPS/14031206/Experts/Advisors/ExpertMACD.mq5 create mode 100644 BKPS/14031206/Experts/Advisors/ExpertMAMA.ex5 create mode 100644 BKPS/14031206/Experts/Advisors/ExpertMAMA.mq5 create mode 100644 BKPS/14031206/Experts/Advisors/ExpertMAPSAR.ex5 create mode 100644 BKPS/14031206/Experts/Advisors/ExpertMAPSAR.mq5 create mode 100644 BKPS/14031206/Experts/Advisors/ExpertMAPSARSizeOptimized.ex5 create mode 100644 BKPS/14031206/Experts/Advisors/ExpertMAPSARSizeOptimized.mq5 create mode 100644 BKPS/14031206/Experts/Examples/ChartInChart/ChartInChart.ex5 create mode 100644 BKPS/14031206/Experts/Examples/ChartInChart/ChartInChart.mq5 create mode 100644 BKPS/14031206/Experts/Examples/Controls/Controls.ex5 create mode 100644 BKPS/14031206/Experts/Examples/Controls/Controls.mq5 create mode 100644 BKPS/14031206/Experts/Examples/Controls/ControlsDialog.mqh create mode 100644 BKPS/14031206/Experts/Examples/Correlation Matrix 3D/Correlation Matrix 3D.ex5 create mode 100644 BKPS/14031206/Experts/Examples/Correlation Matrix 3D/Correlation Matrix 3D.mq5 create mode 100644 BKPS/14031206/Experts/Examples/Correlation Matrix 3D/Correlation Matrix 3D.mqproj create mode 100644 BKPS/14031206/Experts/Examples/MACD/MACD Sample.ex5 create mode 100644 BKPS/14031206/Experts/Examples/MACD/MACD Sample.mq5 create mode 100644 BKPS/14031206/Experts/Examples/Math 3D Morpher/Functions.mqh create mode 100644 BKPS/14031206/Experts/Examples/Math 3D Morpher/Math 3D Morpher.ex5 create mode 100644 BKPS/14031206/Experts/Examples/Math 3D Morpher/Math 3D Morpher.mq5 create mode 100644 BKPS/14031206/Experts/Examples/Math 3D Morpher/Math 3D Morpher.mqproj create mode 100644 BKPS/14031206/Experts/Examples/Math 3D Morpher/Textures/checker.bmp create mode 100644 BKPS/14031206/Experts/Examples/Math 3D/Functions.mqh create mode 100644 BKPS/14031206/Experts/Examples/Math 3D/Math 3D.ex5 create mode 100644 BKPS/14031206/Experts/Examples/Math 3D/Math 3D.ico create mode 100644 BKPS/14031206/Experts/Examples/Math 3D/Math 3D.mq5 create mode 100644 BKPS/14031206/Experts/Examples/Math 3D/Math 3D.mqproj create mode 100644 BKPS/14031206/Experts/Examples/Math 3D/Sets/Chomolungma.set create mode 100644 BKPS/14031206/Experts/Examples/Math 3D/Sets/ClimberDream.set create mode 100644 BKPS/14031206/Experts/Examples/Math 3D/Sets/DoubleScrew.set create mode 100644 BKPS/14031206/Experts/Examples/Math 3D/Sets/Granite.set create mode 100644 BKPS/14031206/Experts/Examples/Math 3D/Sets/Hedgehog.set create mode 100644 BKPS/14031206/Experts/Examples/Math 3D/Sets/Hill.set create mode 100644 BKPS/14031206/Experts/Examples/Math 3D/Sets/Josephine.set create mode 100644 BKPS/14031206/Experts/Examples/Math 3D/Sets/MultyExtremalScrew.set create mode 100644 BKPS/14031206/Experts/Examples/Math 3D/Sets/Screw.set create mode 100644 BKPS/14031206/Experts/Examples/Math 3D/Sets/Sink.set create mode 100644 BKPS/14031206/Experts/Examples/Math 3D/Sets/Skin.set create mode 100644 BKPS/14031206/Experts/Examples/Math 3D/Sets/Trapfall.set create mode 100644 BKPS/14031206/Experts/Examples/Moving Average/Moving Average.ex5 create mode 100644 BKPS/14031206/Experts/Examples/Moving Average/Moving Average.mq5 create mode 100644 BKPS/14031206/Experts/Free Robots/BlackCrows WhiteSoldiers CCI.ex5 create mode 100644 BKPS/14031206/Experts/Free Robots/BlackCrows WhiteSoldiers CCI.mq5 create mode 100644 BKPS/14031206/Experts/Free Robots/BlackCrows WhiteSoldiers MFI.ex5 create mode 100644 BKPS/14031206/Experts/Free Robots/BlackCrows WhiteSoldiers MFI.mq5 create mode 100644 BKPS/14031206/Experts/Free Robots/BlackCrows WhiteSoldiers RSI.ex5 create mode 100644 BKPS/14031206/Experts/Free Robots/BlackCrows WhiteSoldiers RSI.mq5 create mode 100644 BKPS/14031206/Experts/Free Robots/BlackCrows WhiteSoldiers Stoch.ex5 create mode 100644 BKPS/14031206/Experts/Free Robots/BlackCrows WhiteSoldiers Stoch.mq5 create mode 100644 BKPS/14031206/Experts/Free Robots/BullishBearish Engulfing CCI.ex5 create mode 100644 BKPS/14031206/Experts/Free Robots/BullishBearish Engulfing CCI.mq5 create mode 100644 BKPS/14031206/Experts/Free Robots/BullishBearish Engulfing MFI.ex5 create mode 100644 BKPS/14031206/Experts/Free Robots/BullishBearish Engulfing MFI.mq5 create mode 100644 BKPS/14031206/Experts/Free Robots/BullishBearish Engulfing RSI.ex5 create mode 100644 BKPS/14031206/Experts/Free Robots/BullishBearish Engulfing RSI.mq5 create mode 100644 BKPS/14031206/Experts/Free Robots/BullishBearish Engulfing Stoch.ex5 create mode 100644 BKPS/14031206/Experts/Free Robots/BullishBearish Engulfing Stoch.mq5 create mode 100644 BKPS/14031206/Experts/Free Robots/BullishBearish Harami CCI.ex5 create mode 100644 BKPS/14031206/Experts/Free Robots/BullishBearish Harami CCI.mq5 create mode 100644 BKPS/14031206/Experts/Free Robots/BullishBearish Harami MFI.ex5 create mode 100644 BKPS/14031206/Experts/Free Robots/BullishBearish Harami MFI.mq5 create mode 100644 BKPS/14031206/Experts/Free Robots/BullishBearish Harami RSI.ex5 create mode 100644 BKPS/14031206/Experts/Free Robots/BullishBearish Harami RSI.mq5 create mode 100644 BKPS/14031206/Experts/Free Robots/BullishBearish Harami Stoch.ex5 create mode 100644 BKPS/14031206/Experts/Free Robots/BullishBearish Harami Stoch.mq5 create mode 100644 BKPS/14031206/Experts/Free Robots/BullishBearish MeetingLines CCI.ex5 create mode 100644 BKPS/14031206/Experts/Free Robots/BullishBearish MeetingLines CCI.mq5 create mode 100644 BKPS/14031206/Experts/Free Robots/BullishBearish MeetingLines MFI.ex5 create mode 100644 BKPS/14031206/Experts/Free Robots/BullishBearish MeetingLines MFI.mq5 create mode 100644 BKPS/14031206/Experts/Free Robots/BullishBearish MeetingLines RSI.ex5 create mode 100644 BKPS/14031206/Experts/Free Robots/BullishBearish MeetingLines RSI.mq5 create mode 100644 BKPS/14031206/Experts/Free Robots/BullishBearish MeetingLines Stoch.ex5 create mode 100644 BKPS/14031206/Experts/Free Robots/BullishBearish MeetingLines Stoch.mq5 create mode 100644 BKPS/14031206/Experts/Free Robots/DarkCloud PiercingLine CCI.ex5 create mode 100644 BKPS/14031206/Experts/Free Robots/DarkCloud PiercingLine CCI.mq5 create mode 100644 BKPS/14031206/Experts/Free Robots/DarkCloud PiercingLine MFI.ex5 create mode 100644 BKPS/14031206/Experts/Free Robots/DarkCloud PiercingLine MFI.mq5 create mode 100644 BKPS/14031206/Experts/Free Robots/DarkCloud PiercingLine RSI.ex5 create mode 100644 BKPS/14031206/Experts/Free Robots/DarkCloud PiercingLine RSI.mq5 create mode 100644 BKPS/14031206/Experts/Free Robots/DarkCloud PiercingLine Stoch.ex5 create mode 100644 BKPS/14031206/Experts/Free Robots/DarkCloud PiercingLine Stoch.mq5 create mode 100644 BKPS/14031206/Experts/Free Robots/HangingMan Hammer CCI.ex5 create mode 100644 BKPS/14031206/Experts/Free Robots/HangingMan Hammer CCI.mq5 create mode 100644 BKPS/14031206/Experts/Free Robots/HangingMan Hammer MFI.ex5 create mode 100644 BKPS/14031206/Experts/Free Robots/HangingMan Hammer MFI.mq5 create mode 100644 BKPS/14031206/Experts/Free Robots/HangingMan Hammer RSI.ex5 create mode 100644 BKPS/14031206/Experts/Free Robots/HangingMan Hammer RSI.mq5 create mode 100644 BKPS/14031206/Experts/Free Robots/HangingMan Hammer Stoch.ex5 create mode 100644 BKPS/14031206/Experts/Free Robots/HangingMan Hammer Stoch.mq5 create mode 100644 BKPS/14031206/Experts/Free Robots/MorningEvening StarDoji CCI.ex5 create mode 100644 BKPS/14031206/Experts/Free Robots/MorningEvening StarDoji CCI.mq5 create mode 100644 BKPS/14031206/Experts/Free Robots/MorningEvening StarDoji MFI.ex5 create mode 100644 BKPS/14031206/Experts/Free Robots/MorningEvening StarDoji MFI.mq5 create mode 100644 BKPS/14031206/Experts/Free Robots/MorningEvening StarDoji RSI.ex5 create mode 100644 BKPS/14031206/Experts/Free Robots/MorningEvening StarDoji RSI.mq5 create mode 100644 BKPS/14031206/Experts/Free Robots/MorningEvening StarDoji Stoch.ex5 create mode 100644 BKPS/14031206/Experts/Free Robots/MorningEvening StarDoji Stoch.mq5 create mode 100644 BKPS/14031206/Experts/x-saherelm.x-121.smc.ea.ex5 create mode 100644 BKPS/14031206/Experts/x-saherelm.x-121.smc.ea.mq5 create mode 100644 BKPS/14031206/Helpers/x-saherelm.x121.helper.ex5 create mode 100644 BKPS/14031206/Helpers/x-saherelm.x121.helper.mq5 create mode 100644 BKPS/14031206/Helpers/x-saherelm.x121.xatr.helper.ex5 create mode 100644 BKPS/14031206/Helpers/x-saherelm.x121.xatr.helper.mq5 create mode 100644 BKPS/14031206/Helpers/x-saherelm.x121.xcc.helper.ex5 create mode 100644 BKPS/14031206/Helpers/x-saherelm.x121.xcc.helper.mq5 create mode 100644 BKPS/14031206/Helpers/x-saherelm.x121.xche.helper.ex5 create mode 100644 BKPS/14031206/Helpers/x-saherelm.x121.xche.helper.mq5 create mode 100644 BKPS/14031206/Helpers/x-saherelm.x121.xct.helper.ex5 create mode 100644 BKPS/14031206/Helpers/x-saherelm.x121.xct.helper.mq5 create mode 100644 BKPS/14031206/Helpers/x-saherelm.x121.xdon.helper.ex5 create mode 100644 BKPS/14031206/Helpers/x-saherelm.x121.xdon.helper.mq5 create mode 100644 BKPS/14031206/Helpers/x-saherelm.x121.xhk.helper.ex5 create mode 100644 BKPS/14031206/Helpers/x-saherelm.x121.xhk.helper.mq5 create mode 100644 BKPS/14031206/Helpers/x-saherelm.x121.xpv.helper.ex5 create mode 100644 BKPS/14031206/Helpers/x-saherelm.x121.xpv.helper.mq5 create mode 100644 BKPS/14031206/Helpers/x-saherelm.x121.xstr.helper.ex5 create mode 100644 BKPS/14031206/Helpers/x-saherelm.x121.xstr.helper.mq5 create mode 100644 BKPS/14031206/Helpers/x-saherelm.x121.xtrend.helper.ex5 create mode 100644 BKPS/14031206/Helpers/x-saherelm.x121.xtrend.helper.mq5 create mode 100644 BKPS/14031206/Helpers/x-saherelm.x121.xvwap.helper.ex5 create mode 100644 BKPS/14031206/Helpers/x-saherelm.x121.xvwap.helper.mq5 create mode 100644 BKPS/14031206/Indicators/Examples/AD.ex5 create mode 100644 BKPS/14031206/Indicators/Examples/AD.mq5 create mode 100644 BKPS/14031206/Indicators/Examples/ADX.ex5 create mode 100644 BKPS/14031206/Indicators/Examples/ADX.mq5 create mode 100644 BKPS/14031206/Indicators/Examples/ADXW.ex5 create mode 100644 BKPS/14031206/Indicators/Examples/ADXW.mq5 create mode 100644 BKPS/14031206/Indicators/Examples/AMA.ex5 create mode 100644 BKPS/14031206/Indicators/Examples/AMA.mq5 create mode 100644 BKPS/14031206/Indicators/Examples/ASI.ex5 create mode 100644 BKPS/14031206/Indicators/Examples/ASI.mq5 create mode 100644 BKPS/14031206/Indicators/Examples/ATR.ex5 create mode 100644 BKPS/14031206/Indicators/Examples/ATR.mq5 create mode 100644 BKPS/14031206/Indicators/Examples/Accelerator.ex5 create mode 100644 BKPS/14031206/Indicators/Examples/Accelerator.mq5 create mode 100644 BKPS/14031206/Indicators/Examples/Alligator.ex5 create mode 100644 BKPS/14031206/Indicators/Examples/Alligator.mq5 create mode 100644 BKPS/14031206/Indicators/Examples/Awesome_Oscillator.ex5 create mode 100644 BKPS/14031206/Indicators/Examples/Awesome_Oscillator.mq5 create mode 100644 BKPS/14031206/Indicators/Examples/BB.ex5 create mode 100644 BKPS/14031206/Indicators/Examples/BB.mq5 create mode 100644 BKPS/14031206/Indicators/Examples/BW-ZoneTrade.ex5 create mode 100644 BKPS/14031206/Indicators/Examples/BW-ZoneTrade.mq5 create mode 100644 BKPS/14031206/Indicators/Examples/Bears.ex5 create mode 100644 BKPS/14031206/Indicators/Examples/Bears.mq5 create mode 100644 BKPS/14031206/Indicators/Examples/Bulls.ex5 create mode 100644 BKPS/14031206/Indicators/Examples/Bulls.mq5 create mode 100644 BKPS/14031206/Indicators/Examples/CCI.ex5 create mode 100644 BKPS/14031206/Indicators/Examples/CCI.mq5 create mode 100644 BKPS/14031206/Indicators/Examples/CHO.ex5 create mode 100644 BKPS/14031206/Indicators/Examples/CHO.mq5 create mode 100644 BKPS/14031206/Indicators/Examples/CHV.ex5 create mode 100644 BKPS/14031206/Indicators/Examples/CHV.mq5 create mode 100644 BKPS/14031206/Indicators/Examples/Canvas/FlameChart.ex5 create mode 100644 BKPS/14031206/Indicators/Examples/Canvas/FlameChart.mq5 create mode 100644 BKPS/14031206/Indicators/Examples/ColorBars.ex5 create mode 100644 BKPS/14031206/Indicators/Examples/ColorBars.mq5 create mode 100644 BKPS/14031206/Indicators/Examples/ColorCandlesDaily.ex5 create mode 100644 BKPS/14031206/Indicators/Examples/ColorCandlesDaily.mq5 create mode 100644 BKPS/14031206/Indicators/Examples/ColorLine.ex5 create mode 100644 BKPS/14031206/Indicators/Examples/ColorLine.mq5 create mode 100644 BKPS/14031206/Indicators/Examples/Custom Moving Average.ex5 create mode 100644 BKPS/14031206/Indicators/Examples/Custom Moving Average.mq5 create mode 100644 BKPS/14031206/Indicators/Examples/DEMA.ex5 create mode 100644 BKPS/14031206/Indicators/Examples/DEMA.mq5 create mode 100644 BKPS/14031206/Indicators/Examples/DPO.ex5 create mode 100644 BKPS/14031206/Indicators/Examples/DPO.mq5 create mode 100644 BKPS/14031206/Indicators/Examples/DeMarker.ex5 create mode 100644 BKPS/14031206/Indicators/Examples/DeMarker.mq5 create mode 100644 BKPS/14031206/Indicators/Examples/Envelopes.ex5 create mode 100644 BKPS/14031206/Indicators/Examples/Envelopes.mq5 create mode 100644 BKPS/14031206/Indicators/Examples/Force_Index.ex5 create mode 100644 BKPS/14031206/Indicators/Examples/Force_Index.mq5 create mode 100644 BKPS/14031206/Indicators/Examples/FrAMA.ex5 create mode 100644 BKPS/14031206/Indicators/Examples/FrAMA.mq5 create mode 100644 BKPS/14031206/Indicators/Examples/Fractals.ex5 create mode 100644 BKPS/14031206/Indicators/Examples/Fractals.mq5 create mode 100644 BKPS/14031206/Indicators/Examples/Gator.ex5 create mode 100644 BKPS/14031206/Indicators/Examples/Gator.mq5 create mode 100644 BKPS/14031206/Indicators/Examples/Gator_2.ex5 create mode 100644 BKPS/14031206/Indicators/Examples/Gator_2.mq5 create mode 100644 BKPS/14031206/Indicators/Examples/Heiken_Ashi.ex5 create mode 100644 BKPS/14031206/Indicators/Examples/Heiken_Ashi.mq5 create mode 100644 BKPS/14031206/Indicators/Examples/Ichimoku.ex5 create mode 100644 BKPS/14031206/Indicators/Examples/Ichimoku.mq5 create mode 100644 BKPS/14031206/Indicators/Examples/MACD.ex5 create mode 100644 BKPS/14031206/Indicators/Examples/MACD.mq5 create mode 100644 BKPS/14031206/Indicators/Examples/MFI.ex5 create mode 100644 BKPS/14031206/Indicators/Examples/MFI.mq5 create mode 100644 BKPS/14031206/Indicators/Examples/MI.ex5 create mode 100644 BKPS/14031206/Indicators/Examples/MI.mq5 create mode 100644 BKPS/14031206/Indicators/Examples/MarketFacilitationIndex.ex5 create mode 100644 BKPS/14031206/Indicators/Examples/MarketFacilitationIndex.mq5 create mode 100644 BKPS/14031206/Indicators/Examples/Momentum.ex5 create mode 100644 BKPS/14031206/Indicators/Examples/Momentum.mq5 create mode 100644 BKPS/14031206/Indicators/Examples/OBV.ex5 create mode 100644 BKPS/14031206/Indicators/Examples/OBV.mq5 create mode 100644 BKPS/14031206/Indicators/Examples/OsMA.ex5 create mode 100644 BKPS/14031206/Indicators/Examples/OsMA.mq5 create mode 100644 BKPS/14031206/Indicators/Examples/PVT.ex5 create mode 100644 BKPS/14031206/Indicators/Examples/PVT.mq5 create mode 100644 BKPS/14031206/Indicators/Examples/Panels/ChartPanel/ChartPanel.ex5 create mode 100644 BKPS/14031206/Indicators/Examples/Panels/ChartPanel/ChartPanel.mq5 create mode 100644 BKPS/14031206/Indicators/Examples/Panels/ChartPanel/PanelDialog.mqh create mode 100644 BKPS/14031206/Indicators/Examples/Panels/SimplePanel/PanelDialog.mqh create mode 100644 BKPS/14031206/Indicators/Examples/Panels/SimplePanel/SimplePanel.ex5 create mode 100644 BKPS/14031206/Indicators/Examples/Panels/SimplePanel/SimplePanel.mq5 create mode 100644 BKPS/14031206/Indicators/Examples/ParabolicSAR.ex5 create mode 100644 BKPS/14031206/Indicators/Examples/ParabolicSAR.mq5 create mode 100644 BKPS/14031206/Indicators/Examples/Price_Channel.ex5 create mode 100644 BKPS/14031206/Indicators/Examples/Price_Channel.mq5 create mode 100644 BKPS/14031206/Indicators/Examples/ROC.ex5 create mode 100644 BKPS/14031206/Indicators/Examples/ROC.mq5 create mode 100644 BKPS/14031206/Indicators/Examples/RSI.ex5 create mode 100644 BKPS/14031206/Indicators/Examples/RSI.mq5 create mode 100644 BKPS/14031206/Indicators/Examples/RVI.ex5 create mode 100644 BKPS/14031206/Indicators/Examples/RVI.mq5 create mode 100644 BKPS/14031206/Indicators/Examples/StdDev.ex5 create mode 100644 BKPS/14031206/Indicators/Examples/StdDev.mq5 create mode 100644 BKPS/14031206/Indicators/Examples/Stochastic.ex5 create mode 100644 BKPS/14031206/Indicators/Examples/Stochastic.mq5 create mode 100644 BKPS/14031206/Indicators/Examples/TEMA.ex5 create mode 100644 BKPS/14031206/Indicators/Examples/TEMA.mq5 create mode 100644 BKPS/14031206/Indicators/Examples/TRIX.ex5 create mode 100644 BKPS/14031206/Indicators/Examples/TRIX.mq5 create mode 100644 BKPS/14031206/Indicators/Examples/Ultimate_Oscillator.ex5 create mode 100644 BKPS/14031206/Indicators/Examples/Ultimate_Oscillator.mq5 create mode 100644 BKPS/14031206/Indicators/Examples/VIDYA.ex5 create mode 100644 BKPS/14031206/Indicators/Examples/VIDYA.mq5 create mode 100644 BKPS/14031206/Indicators/Examples/VROC.ex5 create mode 100644 BKPS/14031206/Indicators/Examples/VROC.mq5 create mode 100644 BKPS/14031206/Indicators/Examples/Volumes.ex5 create mode 100644 BKPS/14031206/Indicators/Examples/Volumes.mq5 create mode 100644 BKPS/14031206/Indicators/Examples/WPR.ex5 create mode 100644 BKPS/14031206/Indicators/Examples/WPR.mq5 create mode 100644 BKPS/14031206/Indicators/Examples/W_AD.ex5 create mode 100644 BKPS/14031206/Indicators/Examples/W_AD.mq5 create mode 100644 BKPS/14031206/Indicators/Examples/ZigZag.ex5 create mode 100644 BKPS/14031206/Indicators/Examples/ZigZag.mq5 create mode 100644 BKPS/14031206/Indicators/Examples/ZigzagColor.ex5 create mode 100644 BKPS/14031206/Indicators/Examples/ZigzagColor.mq5 create mode 100644 BKPS/14031206/Indicators/Free Indicators/Camarilla Channel.ex5 create mode 100644 BKPS/14031206/Indicators/Free Indicators/Camarilla Channel.mq5 create mode 100644 BKPS/14031206/Indicators/Free Indicators/DeMark Channel.ex5 create mode 100644 BKPS/14031206/Indicators/Free Indicators/DeMark Channel.mq5 create mode 100644 BKPS/14031206/Indicators/Free Indicators/Donchian Channel.ex5 create mode 100644 BKPS/14031206/Indicators/Free Indicators/Donchian Channel.mq5 create mode 100644 BKPS/14031206/Indicators/Free Indicators/Fibonacci Channel.ex5 create mode 100644 BKPS/14031206/Indicators/Free Indicators/Fibonacci Channel.mq5 create mode 100644 BKPS/14031206/Indicators/Free Indicators/Keltner Channel.ex5 create mode 100644 BKPS/14031206/Indicators/Free Indicators/Keltner Channel.mq5 create mode 100644 BKPS/14031206/Indicators/Free Indicators/MarketProfile Canvas.ex5 create mode 100644 BKPS/14031206/Indicators/Free Indicators/MarketProfile Canvas.mq5 create mode 100644 BKPS/14031206/Indicators/Free Indicators/MarketProfile.ex5 create mode 100644 BKPS/14031206/Indicators/Free Indicators/MarketProfile.mq5 create mode 100644 BKPS/14031206/Indicators/Free Indicators/MurreyMath Channel.ex5 create mode 100644 BKPS/14031206/Indicators/Free Indicators/MurreyMath Channel.mq5 create mode 100644 BKPS/14031206/Indicators/Free Indicators/NRTR Channel.ex5 create mode 100644 BKPS/14031206/Indicators/Free Indicators/NRTR Channel.mq5 create mode 100644 BKPS/14031206/Indicators/Free Indicators/Parabolic Channel.ex5 create mode 100644 BKPS/14031206/Indicators/Free Indicators/Parabolic Channel.mq5 create mode 100644 BKPS/14031206/Indicators/Free Indicators/Pivot Channel.ex5 create mode 100644 BKPS/14031206/Indicators/Free Indicators/Pivot Channel.mq5 create mode 100644 BKPS/14031206/Indicators/Free Indicators/Woodie Channel.ex5 create mode 100644 BKPS/14031206/Indicators/Free Indicators/Woodie Channel.mq5 create mode 100644 BKPS/14031206/Indicators/x-saherelm.x121.xatr.ex5 create mode 100644 BKPS/14031206/Indicators/x-saherelm.x121.xatr.mq5 create mode 100644 BKPS/14031206/Indicators/x-saherelm.x121.xcc.ex5 create mode 100644 BKPS/14031206/Indicators/x-saherelm.x121.xcc.mq5 create mode 100644 BKPS/14031206/Indicators/x-saherelm.x121.xche.ex5 create mode 100644 BKPS/14031206/Indicators/x-saherelm.x121.xche.mq5 create mode 100644 BKPS/14031206/Indicators/x-saherelm.x121.xct.ex5 create mode 100644 BKPS/14031206/Indicators/x-saherelm.x121.xct.mq5 create mode 100644 BKPS/14031206/Indicators/x-saherelm.x121.xdon.ex5 create mode 100644 BKPS/14031206/Indicators/x-saherelm.x121.xdon.mq5 create mode 100644 BKPS/14031206/Indicators/x-saherelm.x121.xhk.ex5 create mode 100644 BKPS/14031206/Indicators/x-saherelm.x121.xhk.mq5 create mode 100644 BKPS/14031206/Indicators/x-saherelm.x121.xpv.ex5 create mode 100644 BKPS/14031206/Indicators/x-saherelm.x121.xpv.mq5 create mode 100644 BKPS/14031206/Indicators/x-saherelm.x121.xstr.ex5 create mode 100644 BKPS/14031206/Indicators/x-saherelm.x121.xstr.mq5 create mode 100644 BKPS/14031206/Indicators/x-saherelm.x121.xtrend.ex5 create mode 100644 BKPS/14031206/Indicators/x-saherelm.x121.xtrend.mq5 create mode 100644 BKPS/14031206/Indicators/x-saherelm.x121.xvwap.ex5 create mode 100644 BKPS/14031206/Indicators/x-saherelm.x121.xvwap.mq5 create mode 100644 BKPS/14031206/Indicators/x-saherelm.x121.xwz.ex5 create mode 100644 BKPS/14031206/Indicators/x-saherelm.x121.xwz.mq5 create mode 100644 BKPS/14031206/Libraries/x-saherelm.common.lib.ex5 create mode 100644 BKPS/14031206/Libraries/x-saherelm.common.lib.mq5 create mode 100644 BKPS/14031206/Libraries/x-saherelm.draw.lib.ex5 create mode 100644 BKPS/14031206/Libraries/x-saherelm.draw.lib.mq5 create mode 100644 BKPS/14031206/Libraries/x-saherelm.x-poi.extensions.lib.ex5 create mode 100644 BKPS/14031206/Libraries/x-saherelm.x-poi.extensions.lib.mq5 create mode 100644 BKPS/14031206/Libraries/x-saherelm.x-poi.lib.ex5 create mode 100644 BKPS/14031206/Libraries/x-saherelm.x-poi.lib.mq5 create mode 100644 BKPS/14031206/Libraries/x-saherelm.x-trade.lib.ex5 create mode 100644 BKPS/14031206/Libraries/x-saherelm.x-trade.lib.mq5 create mode 100644 BKPS/14031206/Libraries/x-saherelm.xobfvg.lib.ex5 create mode 100644 BKPS/14031206/Libraries/x-saherelm.xobfvg.lib.mq5 create mode 100644 BKPS/14031206/X121SMCEA/Classes/x-121.smc.base.strategy.class.ex5 create mode 100644 BKPS/14031206/X121SMCEA/Classes/x-121.smc.base.strategy.class.mq5 create mode 100644 BKPS/14031206/X121SMCEA/Classes/x-121.smc.cobjects.class.ex5 create mode 100644 BKPS/14031206/X121SMCEA/Classes/x-121.smc.cobjects.class.mq5 create mode 100644 BKPS/14031206/X121SMCEA/Classes/x-121.smc.ea.panel.class.ex5 create mode 100644 BKPS/14031206/X121SMCEA/Classes/x-121.smc.ea.panel.class.mq5 create mode 100644 BKPS/14031206/X121SMCEA/Classes/x-121.smc.market.cycle.helper.class.ex5 create mode 100644 BKPS/14031206/X121SMCEA/Classes/x-121.smc.market.cycle.helper.class.mq5 create mode 100644 BKPS/14031206/X121SMCEA/Classes/x-121.smc.x-tradehandler.class.ex5 create mode 100644 BKPS/14031206/X121SMCEA/Classes/x-121.smc.x-tradehandler.class.mq5 create mode 100644 BKPS/14031206/X121SMCEA/Experts/x-121.smc.expert.class.ex5 create mode 100644 BKPS/14031206/X121SMCEA/Experts/x-121.smc.expert.class.mq5 create mode 100644 BKPS/14031206/X121SMCEA/Libraries/x-121.smc.guard.lib.ex5 create mode 100644 BKPS/14031206/X121SMCEA/Libraries/x-121.smc.guard.lib.mq5 create mode 100644 BKPS/14031206/X121SMCEA/Libraries/x-121.smc.lib.ex5 create mode 100644 BKPS/14031206/X121SMCEA/Libraries/x-121.smc.lib.mq5 create mode 100644 BKPS/14031206/X121SMCEA/Signals/x-121.smc.xwz.signal.class.ex5 create mode 100644 BKPS/14031206/X121SMCEA/Signals/x-121.smc.xwz.signal.class.mq5 create mode 100644 BKPS/14031206/X121SMCEA/Signals/x-121.smc.xwz.signal.lib.ex5 create mode 100644 BKPS/14031206/X121SMCEA/Signals/x-121.smc.xwz.signal.lib.mq5 create mode 100644 BKPS/14031206/X121SMCEA/Strategy/x-121.smc.strategy.class.ex5 create mode 100644 BKPS/14031206/X121SMCEA/Strategy/x-121.smc.strategy.class.mq5 diff --git a/BKPS/14031206/Classes/x-saherelm.base.class.ex5 b/BKPS/14031206/Classes/x-saherelm.base.class.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..5e9aef1173305f96f92811668ded857e839611d8 GIT binary patch literal 5860 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 YsD)?DiSf;c-dDn3>h%g{AbkP<1Ga`BGXMYp literal 0 HcmV?d00001 diff --git a/BKPS/14031206/Classes/x-saherelm.base.class.mq5 b/BKPS/14031206/Classes/x-saherelm.base.class.mq5 new file mode 100644 index 0000000..0e7557f --- /dev/null +++ b/BKPS/14031206/Classes/x-saherelm.base.class.mq5 @@ -0,0 +1,101 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 Class Library +// -------------------------------------- +// Name: XBaseClass +// Description: provides all based classes for use ... +// +// +// Maintainer: +// ------------ +// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) +// +////////////////////////////////////////////////////// +// +// Global Properties ... +#property library +#property copyright "Copyright 2023, SaherElm IT Center" +#property link "https://www.saherelm.ir" +#property version "1.00" +#property strict + +// +#include "../Libraries/x-saherelm.common.lib.mq5" + +// +// XBase Class ... +class XCBase +{ + // + // Public ... + public: + // + // Protected ... + + // + // Represent Basic Unique Tag ... + virtual string GetTag() { + return NULL; + } + + // + // Retrieve Class Token ... + virtual string GetToken() { + return NULL; + } + + // + // Protected + protected: + // + // Private ... + private: +}; + +// +template +string GenerateSpecifiedCommonSummary( + T &mItem, + string separator = "\n", + bool includeScores = true, + bool setLabel = false // +) +{ + // + string result = NULL; + + // + double bullishScore = 0; + double bearishScore = 0; + mItem.GenerateScore( + bullishScore, + bearishScore // + ); + + // + result = + // + (!setLabel + ? "" + : "Commons:" + separator) + + "---------------" + separator + + "Symbol: " + mItem.symbol + separator + + "Period: " + ToString(mItem.period) + separator + + "Time: " + ToString(mItem.time) + separator + + (includeScores + ? "---------------" + separator + + "Scores:" + separator + + "---------------" + separator + + "Bullish: " + ToString(bullishScore) + separator + + "Bearish: " + ToString(bearishScore) + separator + + "---------------" + separator + : "") + + "" + // + ; + + // + return result; +} + +// diff --git a/BKPS/14031206/Classes/x-saherelm.x-account.class.ex5 b/BKPS/14031206/Classes/x-saherelm.x-account.class.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..fd9ede22f2b9249f8f58db45470ca6fb0f534621 GIT binary patch literal 6524 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 KNTF^0Ao?Glo`949 literal 0 HcmV?d00001 diff --git a/BKPS/14031206/Classes/x-saherelm.x-account.class.mq5 b/BKPS/14031206/Classes/x-saherelm.x-account.class.mq5 new file mode 100644 index 0000000..c451091 --- /dev/null +++ b/BKPS/14031206/Classes/x-saherelm.x-account.class.mq5 @@ -0,0 +1,398 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 Class Library +// ---------------------------------------------- +// Name: XSCAccount +// Description: provides all Account requirements ... +// +// +// Maintainer: +// ------------ +// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) +// +////////////////////////////////////////////////////// +// +// Global Properties ... +#property library +#property copyright "Copyright 2023, SaherElm IT Center" +#property link "https://www.saherelm.ir" +#property version "1.00" +#property strict + +// +// START Definitions ... +// + +// +// END Definitions ... +// + +// +// START Import and Inclused requirements ... +// + +// +// Includes ... +#include "../Classes/x-saherelm.base.class.mq5" +#include + +// +// END Import and Inclused requirements ... +// + +// +// START Overrides ... +// + +// +// END Overrides ... +// + +// +// a Class for Manage Account ... +class XCAccount : public XCBase +{ + // + // Public ... + public: + // + // Constructor ... + void XCAccount() + { + // + mAccountInfo = new CAccountInfo(); + } + + // + // Deconstructor ... + void ~XCAccount() + { + } + + // + // START Provided Functions ... + // + + // + // User Account ... + long GetUserAccount() + { + return mAccountInfo.Login(); + } + + // + // Account Leverage ... + long GetLeverage() + { + return mAccountInfo.Leverage(); + } + + // + // Get Trade Expert State ... + bool CanExpertTrade() + { + return mAccountInfo.TradeExpert(); + } + + // + // User Account Trade Mopde (ENUM_ACCOUNT_TRADE_MODE) ... + // -------------------------- + // ACCOUNT_TRADE_MODE_DEMO + // ACCOUNT_TRADE_MODE_CONTEST + // ACCOUNT_TRADE_MODE_REAL + ENUM_ACCOUNT_TRADE_MODE GetTradeMode() + { + return mAccountInfo.TradeMode(); + } + + // + // Get Account Balance ... + double GetBalance() + { + return mAccountInfo.Balance(); + } + + // + // Get the amount of give Credit ... + double GetCredit() + { + return mAccountInfo.Credit(); + } + + // + // Get the amount of current Profit on account ... + double GetProfit() + { + return mAccountInfo.Profit(); + } + + // + // Get the amount of current Equity on account ... + double GetEquity() + { + return mAccountInfo.Equity(); + } + + // + // Get the amount of reserved Margin ... + double GetMargin() + { + return mAccountInfo.Margin(); + } + + // + // Get the amount of free Margin ... + double GetFreeMargin() + { + return mAccountInfo.FreeMargin(); + } + + // + // Get the Level of Margin ... + double GetMarginLevel() + { + return mAccountInfo.MarginLevel(); + } + + // + // Get the Level Of Margin for a Deposit ... + double GetMarginCall() + { + return mAccountInfo.MarginCall(); + } + + // + // Get the Level of Margin for Stop out ... + double GetMarginStopOut() + { + return mAccountInfo.MarginStopOut(); + } + + // + // Get the Client Name ... + string GetName() + { + return mAccountInfo.Name(); + } + + // + // Get the Trade Server Name ... + string GetServerName() + { + return mAccountInfo.Server(); + } + + // + // Get deposit Currency Name ... + string GetCurrency() + { + return mAccountInfo.Currency(); + } + + // + // Get the Company Name that serves an Account ... + string GetCompany() + { + return mAccountInfo.Company(); + } + + // + // Calculate Profits for the current account based on passed parameters ... + double CalculateTradeProfit( + const string symbol, // trading symbol + ENUM_ORDER_TYPE type, // order type + double volume, // volume + double entry, // open price + double exit // close price + ) + { + // + double result = mAccountInfo.OrderProfitCheck( + symbol, + type, + volume, + entry, + exit); + + // + return result; + } + + // + // Calculate amount of margin which required for trade operation ... + double CalculateMarging( + const string symbol, // trading symbol + ENUM_ORDER_TYPE type, // order type + double volume, // volume + double entry // open price + ) + { + // + double result = mAccountInfo.MarginCheck( + symbol, + type, + volume, + entry); + + // + return result; + } + + // + // Calculate amount of free margin left after trade operation ... + double CalculateFreeMarging( + const string symbol, // trading symbol + ENUM_ORDER_TYPE type, // order type + double volume, // volume + double entry // open price + ) + { + // + double result = mAccountInfo.FreeMarginCheck( + symbol, + type, + volume, + entry); + + // + return result; + } + + // + // Calculate the Maximum possible volume of trade operation ... + double CalculateMaxVolume( + const string symbol, // trading symbol + ENUM_ORDER_TYPE type, // order type + double entry, // open price + double percent = 100 // percent of available margin + ) + { + // + double result = mAccountInfo.MaxLotCheck( + symbol, + type, + entry, + percent); + + // + return result; + } + + // + // Calculate Point Value for Given Symbol based on Account ... + double GetPointValue( + string symbol // trading symbol + ) + { + // + double result = 0; + + // + double tickSize = SymbolInfoDouble(symbol, SYMBOL_TRADE_TICK_SIZE); + double tickValue = SymbolInfoDouble(symbol, SYMBOL_TRADE_TICK_VALUE); + double point = SymbolInfoDouble(symbol, SYMBOL_POINT); + + // + double ticksPerPoint = tickSize / point; + + // + result = tickValue / ticksPerPoint; + + // + return result; + } + + // + // Calculate Risk Amount based on account Currency by Providing: + // Points and Volume ... + double CalculateRiskAmount( + string symbol, // trading symbol + double points, // amount of Risk Points + double volume // position Volume + ) + { + // + double result = 0; + + // + double pointValue = GetPointValue(symbol); + + // + result = pointValue * volume * points; + + // + return result; + } + + // + // Calculate Risk Points based on account Currency by Providing: + // Volume and Amount ... + double CalculateRiskPoints( + string symbol, // trading symbol + double volume, // position Volume + double amount // amount of Risk based on Account Currency + ) + { + // + double result = 0; + + // + double pointValue = GetPointValue(symbol); + + // + result = amount / (pointValue * volume); + + // + return result; + } + + // + // Calculate Volume based on account Currency by Providing: + // Amount and Risk Points ... + double CalculateVolume( + string symbol, // trading symbol + double amount, // amount of Risk based on Account Currency + double points // amount of Risk Points + ) + { + // + double result = 0; + + // + points = + points <= 0 + ? 10 + : points; + + // + double pointValue = GetPointValue(symbol); + + // + result = amount / (pointValue * points); + + // + return result; + } + + // + // END Provided Functions ... + // + + // + // Protected ... + protected: + // + // Private ... + private: + // + // Account Info ... + CAccountInfo mAccountInfo; +}; + +// +// START Usefull Functions ... +// + +// +// END Usefull Functions ... +// diff --git a/BKPS/14031206/Classes/x-saherelm.x-alert.class.ex5 b/BKPS/14031206/Classes/x-saherelm.x-alert.class.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..be9dbaeae3031d4c9298caede318f58de4da3e63 GIT binary patch literal 5794 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 Ke^e6r{{H|yukWh> literal 0 HcmV?d00001 diff --git a/BKPS/14031206/Classes/x-saherelm.x-alert.class.mq5 b/BKPS/14031206/Classes/x-saherelm.x-alert.class.mq5 new file mode 100644 index 0000000..c92a6d5 --- /dev/null +++ b/BKPS/14031206/Classes/x-saherelm.x-alert.class.mq5 @@ -0,0 +1,1580 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 Class Library +// ---------------------------------------------- +// Name: XSCAlert +// Description: provides all Alerts requirements ... +// +// +// Maintainer: +// ------------ +// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) +// +////////////////////////////////////////////////////// +// +// Global Properties ... +#property library +#property copyright "Copyright 2023, SaherElm IT Center" +#property link "https://www.saherelm.ir" +#property version "1.00" +#property strict + +// +// Imports ... +#include "../Classes/x-saherelm.base.class.mq5" + +// +// Class Definition ... + +class XCAlert : public XCBase +{ + // + // Public ... + public: + // + // Props ... + + // + // Constructor ... + XCAlert( + string prefix = "X-Alert", // Alerts Prefixe + bool enableAlerts = true, // Enable Alerts + bool logAlerts = true, // Log Alerts + bool terminalAlerts = false, // Terminal Alerts + bool mailAlerts = false, // Mail Alerts + bool pushAlerts = false // Push Alerts + ) + { + // + mPrefix = prefix; + mLogAlerts = logAlerts; + mMailAlerts = mailAlerts; + mPushAlerts = pushAlerts; + mEnableAlerts = enableAlerts; + mTerminalAlerts = terminalAlerts; + + // + // Normalize Prefix if Not Provided ... + if (!IsValid(mPrefix)) + { + mPrefix = GetTag(); + } + } + + // + // Deconstructor ... + ~XCAlert() + { + } + + // + // Override ... + string GetTag() override + { + return GetSpecificToken(this); + } + + // + // Properties Getter(s) / Setter(s) ... + + // + string GetPrefix() + { + return mPrefix; + } + + // + void SetPrefix(string value) + { + mPrefix = value; + } + + // + bool GetLogAlerts() + { + return mLogAlerts; + } + + // + void SetLogAlerts(bool value) + { + mLogAlerts = value; + } + + // + bool GetEnableAlerts() + { + return mEnableAlerts; + } + + // + void SetEnableAlerts(bool value) + { + mEnableAlerts = value; + } + + // + bool GetPushAlerts() + { + return mPushAlerts; + } + + // + void SetPushAlerts(bool value) + { + mPushAlerts = value; + } + + // + bool GetMailAlerts() + { + return mMailAlerts; + } + + // + void SetMailAlerts(bool value) + { + mMailAlerts = value; + } + + // + bool GetTerminalAlerts() + { + return mTerminalAlerts; + } + + // + void SetTerminalAlerts(bool value) + { + mTerminalAlerts = value; + } + + // + // Tools Funtions ... + + // + // Alerts ... + + // + // Logging an Alert ... + void LogAlert(string message) + { + // + // Validate Args ... + if (!CanLogAlert()) + { + return; + } + + // + Log(message); + } + + // + // Terminal Alert ... + void TerminalAlert(string message) + { + // + // Validate Args ... + if (!CanTerminalAlert()) + { + return; + } + + // + // Prepare Message ... + message = PrepareMessage(message); + + // Send Terminal Alert ... + Alert(message); + } + + // + // Mail Alert ... + void MailAlert(string message) + { + // + // Validate Args ... + if (!CanMailAlert()) + { + return; + } + + // + // Send Mail Alert ... + SendMail(GetPrefix(), message); + } + + // + // Send Push Notification ... + void PushAlert(string message) + { + // + // Validate Args ... + if (!CanPushAlert()) + { + return; + } + + // + // Prepare Message ... + message = PrepareMessage(message); + + // + // Send Push Notification Alert ... + SendNotification(message); + } + + // + // Send an Alert by Handling all Different Specified + // type's of Alert's if they are Enabled ... + void Alert(string message) + { + // + // Handle Log, if Enabled ... + LogAlert(message); + + // + // Handle Mail if Enabled ... + MailAlert(message); + + // + // Handle Push if Enabled ... + PushAlert(message); + + // + // Handle Terminal if Enabled ... + TerminalAlert(message); + } + + // + // Logs ... + + // + // Log a Message ... + void Log(string message) + { + // + if (!CanLog()) + { + return; + } + + // + Print(GetPrefix(), " > ", message); + } + void Log(string tag, string message) + { + // + if (!CanLog()) + { + return; + } + + // + Print(GetPrefix(), "_", tag, " > ", message); + } + void LogEmpty() + { + // + if (!CanLog()) + { + return; + } + + // + Print(" "); + } + + // + // Log Specific Array ... + template + void LogArray( + T &array[], // Array to Log + string label = NULL // Array Label + ) + { + // + if (!CanLog()) + { + return; + } + + // + Print(GetPrefix(), ">", (IsValid(label) ? label : "")); + ArrayPrint(array); + } + + // + // Error ... + + // + // Log an Error ... + void LogError( + int error = -1 // Specific Error, if it's equal to -1, use Last Error ... + ) + { + // + if (!CanLog()) + { + return; + } + + // + if (error <= -1) + { + error = GetLastError(); + } + + // + string errorMsg = GetErrorDescription(error); + + // + Log("Error: " + errorMsg); + } + + // + // 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; + } + + // + // Protected ... + protected: + // + // Private ... + + // + bool CanLog() + { + return mLogAlerts; + } + + // + bool CanLogAlert() + { + // + bool result = GetEnableAlerts() && GetLogAlerts(); + + // + return result; + } + + // + bool CanTerminalAlert() + { + // + bool result = GetEnableAlerts() && GetTerminalAlerts(); + + // + return result; + } + + // + bool CanMailAlert() + { + // + bool result = GetEnableAlerts() && GetMailAlerts(); + + // + return result; + } + + // + bool CanPushAlert() + { + // + bool result = GetEnableAlerts() && GetPushAlerts(); + + // + return result; + } + + private: + // + // Props ... + string mPrefix; // Alerts Prefixe + bool mEnableAlerts; // Enable Alerts + bool mLogAlerts; // Log Alerts + bool mTerminalAlerts; // Terminal Alerts + bool mMailAlerts; // Mail Alerts + bool mPushAlerts; // Push Alerts + + // + // Tools ... + + // + // Clear Escape String and + // Attach Alert Prefix to Message ... + string PrepareMessage(string message) + { + // + StringReplace(message, "\n", " | "); + + // + StringConcatenate(message, GetPrefix(), " > ", message); + + // + return message; + } +}; + +// +// a Base Class by Support Alert ... +class XCBaseAlert : public XCBase +{ + // + // Public ... + public: + // + // Props ... + + // + // Constructor(s) ... + void XCBaseAlert() + { + // + // Instance Alert ... + mAlert = new XCAlert(); + } + + // + // Deconstructors ... + void ~XCBaseAlert() + { + // + delete mAlert; + + // + ZeroMemory(mAlert); + } + + // + // Alert Handler Functions ... + + // + // Alert Functions Getter(s) / Setters(s) ... + + // + string GetAlertPrefix() + { + return mAlert.GetPrefix(); + } + + // + void SetAlertPrefix(string value) + { + mAlert.SetPrefix(value); + } + + // + bool GetAlertLogAlerts() + { + return mAlert.GetLogAlerts(); + } + + // + void SetAlertLogAlerts(bool value) + { + mAlert.SetLogAlerts(value); + } + + // + bool GetAlertEnableAlerts() + { + return mAlert.GetEnableAlerts(); + } + + // + void SetAlertEnableAlerts(bool value) + { + mAlert.SetEnableAlerts(value); + } + + // + bool GetAlertPushAlerts() + { + return mAlert.GetPushAlerts(); + } + + // + void SetAlertPushAlerts(bool value) + { + mAlert.SetPushAlerts(value); + } + + // + bool GetAlertMailAlerts() + { + return mAlert.GetMailAlerts(); + } + + // + void SetAlertMailAlerts(bool value) + { + mAlert.SetMailAlerts(value); + } + + // + bool GetAlertTerminalAlerts() + { + return mAlert.GetTerminalAlerts(); + } + + // + void SetAlertTerminalAlerts(bool value) + { + mAlert.SetTerminalAlerts(value); + } + + // + // Alert Actions ... + + // + // Logging an Alert ... + void LogAlert(string message) + { + mAlert.LogAlert(message); + } + + // + // Terminal Alert ... + void TerminalAlert(string message) + { + mAlert.TerminalAlert(message); + } + + // + // Mail Alert ... + void MailAlert(string message) + { + mAlert.MailAlert(message); + } + + // + // Send Push Notification ... + void PushAlert(string message) + { + mAlert.PushAlert(message); + } + + // + // Send an Alert by Handling all Different Specified + // type's of Alert's if they are Enabled ... + void Alert(string message) + { + mAlert.Alert(message); + } + + // + // Logs ... + + // + // Log a Message ... + void Log(string message) + { + mAlert.Log(message); + } + void Log(string tag, string message) + { + mAlert.Log(tag, message); + } + void LogEmpty() + { + mAlert.LogEmpty(); + } + + // + // Log Specific Array ... + template + void LogArray( + T &array[], // Array to Log + string label = NULL // Array Label + ) + { + mAlert.LogArray(array, label); + } + + // + // Error ... + + // + // Log an Error ... + void LogError( + int error = -1 // Specific Error, if it's equal to -1, use Last Error ... + ) + { + mAlert.LogError(error); + } + + // + // Retrieve Specified Error Code Description ... + string GetErrorDescription(int err_code) + { + return mAlert.GetErrorDescription(err_code); + } + + // + // Retrieve Specified Error Code Description ... + string GetTradeServerReturnCodeDescription(int return_code) + { + return mAlert.GetTradeServerReturnCodeDescription(return_code); + } + + // + // Protected ... + protected: + // + // Alert ... + XCAlert *mAlert; + + // + // Private ... + private: +}; + +// \ No newline at end of file diff --git a/BKPS/14031206/Classes/x-saherelm.x-app-dialog.class.ex5 b/BKPS/14031206/Classes/x-saherelm.x-app-dialog.class.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..c5bfe8c7b7bc960b0c6bb63b7278e8087d410cb9 GIT binary patch literal 11432 zcmdU#WpLiwlCD29vtwpvX2;AFJ7#8znIUFoW@ct)rWoUx+5XHBGxIoS_C7OJcdE|) zbI+}5m9&<6ElE#z3x4PoQ)dUW2SB30xyB{sgN3W6?0C<4~00Ni&Akp31@U^5L`jnEhwuf3y9G*y$q!jsPA2l5|L?d>{t-9BM}GcyNBTck zi5bA~QEjIGdGPl zhkZELzVJg_!EZgYs{+oMz7!KD-^w<#=SYDPeC>f&94ej@G2G9xlBh8`AVM~I5FQ9= z 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 literal 0 HcmV?d00001 diff --git a/BKPS/14031206/Classes/x-saherelm.x-app-dialog.class.mq5 b/BKPS/14031206/Classes/x-saherelm.x-app-dialog.class.mq5 new file mode 100644 index 0000000..6bfa4d9 --- /dev/null +++ b/BKPS/14031206/Classes/x-saherelm.x-app-dialog.class.mq5 @@ -0,0 +1,275 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 Class Library +// -------------------------------------- +// Name: XCPanel +// Description: provides all based classes for use ... +// +// +// Maintainer: +// ------------ +// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) +// +////////////////////////////////////////////////////// +// +// Global Properties ... +#property library +#property copyright "Copyright 2023, SaherElm IT Center" +#property link "https://www.saherelm.ir" +#property version "1.00" +#property strict + +// +// Imports ... + +// +#include + +// +#include "../Classes/x-saherelm.base.class.mq5" + +// +// Extentions ... + +/** + * Check a Qery Contains in a Content or not ... + * + * @param mQuery: String ... + * @param mContent: String ... + * @param ignoreCase: Boolean ... + * + * @return ( bool ) + */ +bool XContains( + string mQuery, // Search String + string mContent, // Search Content + bool ignoreCase = true // Ignore Case +) +{ + return Contains( + mQuery, + mContent, + ignoreCase // + ); +} + +// +// Implementation ... + +// +// a Base App Dialog Class ... +class XCAppDialog : public CAppDialog +{ + public: + // + // Action ... + + // + // Virual ... + + /** + * Override Close Button Click Action ... + */ + void OnClickButtonClose() + { + // + bool isClosed = ConfirmDialog("Close EA ?"); + + // + if (isClosed) + { + Destroy(); + } + } + + // + // Configuration Actions ... + + /** + * Show or Hide Minimize Button ... + * + * @param show: boolean + */ + void MinimizeButton(bool show) + { + // + int controlIDX = ControlFind("MinMax"); + if (!IsValidIndex(controlIDX)) + { + return; + } + + // + if (show) + { + Control(controlIDX).Show(); + } + else + { + Control(controlIDX).Hide(); + } + } + + /** + * Show or Hide Close Button ... + * + * @param show: boolean + */ + void CloseButton(bool show) + { + // + int controlIDX = ControlFind("Close"); + if (!IsValidIndex(controlIDX)) + { + return; + } + + // + if (show) + { + Control(controlIDX).Show(); + } + else + { + Control(controlIDX).Hide(); + } + } + + /** + * Minimize Functionality Implementation ... + */ + void Minimize() + { + // + m_minimized = true; + Rebound(m_min_rect); + ClientAreaVisible(false); + } + + /** + * Set Background Color ... + * + * @param clr: Color ... + */ + void BackgroundColor(color clr) + { + // + int controlIDX = ControlFind("Client"); + if (!IsValidIndex(controlIDX)) + { + return; + } + + // + CWnd *obj = Control(controlIDX); + CWndClient *wndclient = (CWndClient *)obj; + + // + wndclient.ColorBackground(clr); + } + + // + protected: + // + + /** + * Find Specific Control in Dialog ... + * + * @param name: String to Search + * + * @return ( int ) + */ + int ControlFind(string name) + { + // + int result = -1; + + // + if (!IsValid(name)) + { + return result; + } + + // + int count = ControlsTotal(); + if (!IsValidSize(count)) + { + return result; + } + + // + for (int i = 0; i < count; i++) + { + // + string iName = Control(i).Name(); + + // + bool isContains = XContains( + name, + iName, + true // Ignore Case ... + ); + if (isContains) + { + // + result = i; + break; + } + } + + // + return result; + } + + /** + * Create and Run Confirm Dialog ... + * + * @param message: message for Message Box ... + * + * @return ( bool ) + */ + bool ConfirmDialog(string message = NULL) + { + // + bool result = false; + + // + if (!IsValid(message)) + { + message = "Confirm ?"; + } + + // + int dialogResult = MessageBox(message, NULL, MB_YESNO); + + // + // use 'switch' or 'if' as needed + switch (dialogResult) + { + // + // Yes ... + case IDYES: + result = true; + break; + // + // No ... + case IDNO: + result = false; + break; + // + // Cancel ... + case IDCANCEL: + result = false; + break; + } + + // + return result; + } + + // + private: + // + + // +}; \ No newline at end of file diff --git a/BKPS/14031206/Classes/x-saherelm.x-bar.analyser.class.ex5 b/BKPS/14031206/Classes/x-saherelm.x-bar.analyser.class.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..3bbf9e6948a3be8ce195a5fd47521ae9890bebba GIT binary patch literal 8306 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 b_~OORIt3E0*g2orF;h?Sy3J4>XIlOTC3ox> literal 0 HcmV?d00001 diff --git a/BKPS/14031206/Classes/x-saherelm.x-bar.analyser.class.mq5 b/BKPS/14031206/Classes/x-saherelm.x-bar.analyser.class.mq5 new file mode 100644 index 0000000..3c7eb16 --- /dev/null +++ b/BKPS/14031206/Classes/x-saherelm.x-bar.analyser.class.mq5 @@ -0,0 +1,5852 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 Class Library +// -------------------------------------- +// Name: XPOI +// Description: Bar Analysing ... +// +// 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 + +// +// Imports ... +#include "../Classes/x-saherelm.base.class.mq5" +#include "../Libraries/x-saherelm.x-poi.lib.mq5" + +// +// Definitions ... + +// +// Implementations ... +class XCBarAnalyser : public XCBase +{ + // + public: + // + + // + // Constructor(s) ... + void XCBarAnalyser() + { + } + + // + // Deconstructor ... + void ~XCBarAnalyser() + { + } + + // + // Getter(s) / Setter(s) ... + + // + // Providers ... + + // + // Actions ... + + /** + * Calculate Loopback Data for Specific Bar ... + * + * @param index: Integer, Bar Current Index ... + * @param start: Integer, Start of Loopback ... + * @param end: Integer, End of Loopback ... + * @param count: Integer, Number of Calculating Bars ... + * @param bar: XOHCL instance, Specified Bar ... + * @param loopback: Integer, Loopback Length ... + * @return ( bool ) + */ + bool CalculateLoopBackData( + int &index, + int &start, + int &end, + int &count, + XOHCL &bar, + int loopback = 1 // + ) + { + // + bool result = false; + + // + if (loopback < 1) + { + loopback = 1; + } + + // + index = -1; + start = -1; + end = -1; + count = -1; + + // + result = bar.IsValid(); + if (!result) + { + return result; + } + + // + index = bar.Index(); + start = index + 1; + end = start + loopback; + count = end - start; + result = count >= 1; + if (!result) + { + return result; + } + + // + return result; + } + + /** + * Retrieve Loopback HH & LL Data ... + * + * @param hhIDX: Integer, HH Index ... + * @param hh: Double, HH Value ... + * @param llIDX: Integer, LL Index ... + * @param ll: Double, LL Value ... + * @param bar: XOHCL instance ... + * @param loopback: Integer, Loopback Length ... + * + * @return ( bool ) + */ + bool CalculateLoopbackHLData( + int &hhIDX, + double &hh, + int &llIDX, + double &ll, + XOHCL &bar, + int loopback // + ) + { + // + bool result = false; + + // + if (loopback < 1) + { + loopback = 1; + } + + // + int index = -1; + int start = -1; + int end = -1; + int count = -1; + result = CalculateLoopBackData( + index, + start, + end, + count, + bar, + loopback // + ); + if (!result) + { + return result; + } + + // + hhIDX = iHighest( + bar.symbol, + bar.period, + MODE_HIGH, + count, + start // + ); + result = IsValidIndex(hhIDX); + if (!result) + { + return result; + } + + // + llIDX = iLowest( + bar.symbol, + bar.period, + MODE_LOW, + count, + start // + ); + result = IsValidIndex(llIDX); + if (!result) + { + return result; + } + + // + hh = iHigh( + bar.symbol, + bar.period, + hhIDX // + ); + ll = iLow( + bar.symbol, + bar.period, + llIDX // + ); + + // + return result; + } + + /** + * Calculate Bar Range ... + * + * @param bar: XOHCL instance ... + * + * @return ( double ) + */ + double GetBarRangePercent(XOHCL &bar) + { + // + double result = 0; + + // + result = bar.GetRange() / 100; + + // + return result; + } + + /** + * Detect Same Bars ... + * + * @param bar: XOHCL instance, Start Bar ... + * @param dir: ENUM_X_DIRECTION member, Holds Result Direction ... + * @param index: Integer, Holds Result Index ... + * @param sameBars: Iteger, Required Same Bar ... + * + * @return ( bool ) + */ + bool HasSameBars( + XOHCL &bar, + ENUM_X_DIRECTION &dir, + int &index, + int sameBars = 3 // + ) + { + // + bool result = false; + + // + dir = X_DIRECTION_NONE; + + // + if (sameBars < 1) + { + sameBars = 1; + } + + // + result = bar.IsValid(); + if (!result) + { + return result; + } + + // + index = bar.Index(); + bool canContinue = true; + int sameBullishBarsFounded = 0; + int sameBearishBarsFounded = 0; + bool canContinueForBullish = true; + bool canContinueForBearish = true; + while (canContinue) + { + // + XOHCL iBar; + result = iBar.Init( + bar.symbol, + bar.period, + index // + ); + if (!result) + { + break; + } + + // + bool isBullish = iBar.IsBullish(); + bool isBearish = iBar.IsBearish(); + result = isBullish || + isBearish; + if (!result) + { + break; + } + + // + if (isBullish) + { + // + sameBullishBarsFounded++; + canContinueForBearish = false; + } + else + { + // + sameBearishBarsFounded++; + canContinueForBullish = false; + } + + // + result = canContinueForBullish || + canContinueForBearish; + if (!result) + { + break; + } + + // + canContinueForBullish = + canContinueForBullish && + sameBullishBarsFounded > 0; + + // + canContinueForBearish = + canContinueForBearish && + sameBearishBarsFounded > 0; + + // + canContinue = + canContinueForBullish || + canContinueForBearish; + if (canContinue) + { + index++; + } + } + + // + bool hasBullishSameBars = + sameBullishBarsFounded >= sameBars; + + // + bool hasBearishSameBars = + sameBearishBarsFounded >= sameBars; + + // + result = hasBullishSameBars || + hasBearishSameBars; + if (!result) + { + return result; + } + + // + dir = + hasBullishSameBars + ? X_DIRECTION_BULLISH + : X_DIRECTION_BEARISH; + + // + return result; + } + + /** + * Detect Price Consolidation ... + * + * @param bar: XOHCL instance Reference, Start Bar ... + * @param loopback: Integer, Consolidation Length Finder ... + * @param consolidationRange: Integer, Consolidation Range Finder ... + * @param upper: Double Reference ... + * @param lower: Double Reference ... + * @param upperAppliedTo: ENUM_APPLIED_PRICE member, Upper Price ... + * @param lowerAppliedTo: ENUM_APPLIED_PRICE member, Lower Price ... + * + * @return ( bool ) + */ + bool IsConsolidate( + XOHCL &bar, + double &upper, + double &lower, + int loopback = 30, + int consolidationRange = 50, + ENUM_APPLIED_PRICE upperAppliedTo = PRICE_HIGH, + ENUM_APPLIED_PRICE lowerAppliedTo = PRICE_LOW // + ) + { + // + bool result = false; + + // + upper = 0; + lower = 0; + + // + if (loopback < 7) + { + loopback = 7; + } + + // + result = bar.IsValid(); + if (!result) + { + return result; + } + + // + double points = GetPoints(bar.symbol); + int index = bar.Index(); + + // + double upperPrice[]; + int upperPriceCount = FillPrice( + upperPrice, + upperAppliedTo, + bar.symbol, + bar.period, + index, + loopback // + ); + + // + double lowerPrice[]; + int lowerPriceCount = FillPrice( + lowerPrice, + lowerAppliedTo, + bar.symbol, + bar.period, + index, + loopback // + ); + + // + result = upperPriceCount == lowerPriceCount && + lowerPriceCount == loopback; + if (!result) + { + return result; + } + + // + upper = upperPrice[ArrayMaximum(upperPrice)]; + lower = lowerPrice[ArrayMinimum(lowerPrice)]; + + // + double range = upper - lower; + result = range <= consolidationRange * points; + + // + return result; + } + + /** + * Check Bar Has Bullish Trend or not ... + * + * @param bar: XOHCL instance ... + * @param forceAll: Boolean ... + * + * @return ( bool ) + */ + bool HasBullishTrend( + XOHCL &bar, + bool forceAll = false // + ) + { + // + bool result = false; + + // + result = bar.IsValid(); + if (!result) + { + return result; + } + + // + XOHCL tmpHSW[]; + XOHCL tmpLSW[]; + + // + bool trend1 = HasBullishTrend( + bar, + tmpHSW, + tmpLSW, + true // + ); + + // + bool trend2 = HasBullishTrend( + bar, + tmpHSW, + tmpLSW, + false // + ); + + // + if (!forceAll) + { + // + result = trend1; + if (!result) + { + return result; + } + } + + // + result = + trend1 || + trend2; + + // + return result; + } + + /** + * Check Bar Has Bearish Trend or not ... + * + * @param bar: XOHCL instance ... + * @param forceAll: Boolean ... + * + * @return ( bool ) + */ + bool HasBearishTrend( + XOHCL &bar, + bool forceAll = false // + ) + { + // + bool result = false; + + // + result = bar.IsValid(); + if (!result) + { + return result; + } + + // + XOHCL tmpHSW[]; + XOHCL tmpLSW[]; + + // + bool trend1 = HasBearishTrend( + bar, + tmpHSW, + tmpLSW, + true // + ); + + // + bool trend2 = HasBearishTrend( + bar, + tmpHSW, + tmpLSW, + false // + ); + + // + if (!forceAll) + { + // + result = trend1; + if (!result) + { + return result; + } + } + + // + result = + trend1 || + trend2; + + // + return result; + } + + /** + * Check Specified Bar Has Bullish Pattern or not ... + * + * @param bar: XOHCL instance, Specified Bar ... + * @param loopback: Integer, Loopback Length for Patterns ... + * @param verifications: Integer, Number of Given Verifications ... + * @param checkHammer: Boolean, Specified Check Hammer Pattern ... + * @param checkMorningStar: Boolean, Specified Check Morning Star Pattern ... + * @param checkBullishMarubozu: Boolean, Specified Check Marubozu Pattern ... + * @param checkBullishEngulfing: Boolean, Specified Check Engulfing Pattern ... + * + * @return ( bool ) + */ + bool HasBullishPattern( + XOHCL &bar, + int loopback = 0, + int verifications = 1, + bool checkHammer = true, + bool checkMorningStar = true, + bool checkBullishMarubozu = true, + bool checkBullishEngulfing = true // + ) + { + // + bool result = false; + + // + result = bar.IsValid(); + if (!result) + { + return result; + } + + // + if (verifications <= 0) + { + verifications = 1; + } + + // + int founded = 0; + + // + int idx = bar.Index(); + for (int i = idx; i <= idx + loopback; i++) + { + // + XOHCL iBar; + result = iBar.Init( + bar.symbol, + bar.period, + i // + ); + if (!result) + { + break; + } + + // + bool isHammer = + !checkHammer + ? false + : IsHammer(iBar); + if (isHammer) + { + founded++; + } + + // + bool isMorningStar = + !checkMorningStar + ? false + : IsMorningStar(iBar); + if (isMorningStar) + { + founded++; + } + + // + bool isBullishMarubozu = + !checkBullishMarubozu + ? false + : IsBullishMarubozu(iBar); + if (isBullishMarubozu) + { + founded++; + } + + // + bool isBullishEngulfing = + !checkBullishEngulfing + ? false + : IsBullishEngulfing(iBar); + if (isBullishEngulfing) + { + founded++; + } + + // + } + + // + result = + result && + founded >= verifications; + + // + return result; + } + + /** + * Check Specified Bar Has Bearish Pattern or not ... + * + * @param bar: XOHCL instance, Specified Bar ... + * @param loopback: Integer, Loopback Length for Patterns ... + * @param verifications: Integer, Number of Given Verifications ... + * @param checkShootingStar: Boolean, Specified Check Shooting Star Pattern ... + * @param checkEveningStar: Boolean, Specified Check Evening Star Pattern ... + * @param checkBearishMarubozu: Boolean, Specified Check Marubozu Pattern ... + * @param checkBearishEngulfing: Boolean, Specified Check Engulfing Pattern ... + * + * @return ( bool ) + */ + bool HasBearishPattern( + XOHCL &bar, + int loopback = 0, + int verifications = 1, + bool checkShootingStar = true, + bool checkEveningStar = true, + bool checkBearishMarubozu = true, + bool checkBearishEngulfing = true // + ) + { + // + bool result = false; + + // + result = bar.IsValid(); + if (!result) + { + return result; + } + + // + if (verifications <= 0) + { + verifications = 1; + } + + // + int founded = 0; + + // + int idx = bar.Index(); + for (int i = idx - 1; i <= idx + loopback; i++) + { + // + XOHCL iBar; + result = iBar.Init( + bar.symbol, + bar.period, + i // + ); + if (!result) + { + break; + } + + // + bool isShootingStar = + !checkShootingStar + ? false + : IsShootingStar(iBar); + if (isShootingStar) + { + founded++; + } + + // + bool isEveningStar = + !checkEveningStar + ? false + : IsEveningStar(iBar); + if (isEveningStar) + { + founded++; + } + + // + bool isBearishMarubozu = + !checkBearishMarubozu + ? false + : IsBearishMarubozu(iBar); + if (isBearishMarubozu) + { + founded++; + } + + // + bool isBearishEngulfing = + !checkBearishEngulfing + ? false + : IsBearishEngulfing(iBar); + if (isBearishEngulfing) + { + founded++; + } + + // + } + + // + result = + result && + founded >= verifications; + + // + return result; + } + + // + // Commons ... + + /** + * Check Specified Bar's Range is Extended or not ... + * + * @param bar: XOHCL instance, Specified Bar ... + * @param loopback: Integer, Loopback Length ... + * + * @return ( bool ) + */ + bool HasExtendedRange( + XOHCL &bar, + int loopback = 3 // + ) + { + // + bool result = false; + + // + if (loopback < 3) + { + loopback = 3; + } + + // + result = bar.IsValid(); + if (!result) + { + return result; + } + + // + int index = bar.Index(); + int start = index + 1; + int end = start + loopback; + int count = end - start; + result = count >= 1; + if (!result) + { + return result; + } + + // + double sum = 0; + XOHCL iBar = bar; + for (int i = start; i < end; i++) + { + // + bool isRetrieved = iBar.GetPreviousBar(iBar); + if (!isRetrieved) + { + continue; + } + + // + sum += iBar.GetRange(); + } + + // + result = sum > 0; + if (!result) + { + return result; + } + + // + double avg = sum / count; + + // + result = bar.GetRange() >= avg; + + // + return result; + } + + /** + * Check Specified Bar's Body is Extended or not ... + * + * @param bar: XOHCL instance, Specified Bar ... + * @param loopback: Integer, Loopback Length ... + * + * @return ( bool ) + */ + bool HasExtendedBody( + XOHCL &bar, + int loopback = 3 // + ) + { + // + bool result = false; + + // + if (loopback < 3) + { + loopback = 3; + } + + // + result = bar.IsValid(); + if (!result) + { + return result; + } + + // + int index = bar.Index(); + int start = index + 1; + int end = start + loopback; + int count = end - start; + result = count >= 1; + if (!result) + { + return result; + } + + // + double sum = 0; + XOHCL iBar = bar; + for (int i = start; i < end; i++) + { + // + bool isRetrieved = iBar.GetPreviousBar(iBar); + if (!isRetrieved) + { + continue; + } + + // + sum += iBar.GetBody(); + } + + // + result = sum > 0; + if (!result) + { + return result; + } + + // + double avg = sum / count; + + // + result = bar.GetBody() >= avg; + + // + return result; + } + + /** + * Check Specified Bar's Body and Range is Extended or not ... + * + * @param bar: XOHCL instance, Specified Bar ... + * @param loopback: Integer, Loopback Length ... + * + * @return ( bool ) + */ + bool IsExtended( + XOHCL &bar, + int loopback = 3 // + ) + { + // + bool result = false; + + // + bool hasExtendedBody = HasExtendedBody(bar, loopback); + bool hasExtendedRange = HasExtendedRange(bar, loopback); + result = hasExtendedBody && + hasExtendedRange; + + // + return result; + } + + /** + * Check Specified Bar is Swing High or not ... + * + * @param bar: XOHCL instnce ... + * @param range: Integer, Specified Range ... + * + * @return ( bool ) + */ + bool IsSwingHigh( + XOHCL &bar, + int range = 2 // + ) + { + // + bool result = false; + + // + if (range < 1) + { + range = 1; + } + + // + result = bar.IsValid(); + if (!result) + { + return result; + } + + // + int index = bar.Index(); + result = range > 0 && + index >= range; + if (!result) + { + return result; + } + + // + string symbol = bar.symbol; + ENUM_TIMEFRAMES period = bar.period; + + // + for (int i = 1; i <= range; i++) + { + // + // Prev Bar ... + XOHCL iPrevBar; + result = iPrevBar.Init( + symbol, + period, + index + i // + ); + if (!result) + { + break; + } + + // + // Next Bar ... + XOHCL iNextBar; + result = iNextBar.Init( + symbol, + period, + index - i // + ); + if (!result) + { + break; + } + + // + result = bar.high >= iPrevBar.high && + bar.high >= iNextBar.high; + if (!result) + { + break; + } + } + + // + return result; + } + + /** + * Check Specified Bar is Swing Low or not ... + * + * @param bar: XOHCL instnce ... + * @param range: Integer, Specified Range ... + * + * @return ( bool ) + */ + bool IsSwingLow( + XOHCL &bar, + int range = 2 // + ) + { + // + bool result = false; + + // + if (range < 1) + { + range = 1; + } + + // + result = bar.IsValid(); + if (!result) + { + return result; + } + + // + int index = bar.Index(); + result = range > 0 && + index >= range; + if (!result) + { + return result; + } + + // + string symbol = bar.symbol; + ENUM_TIMEFRAMES period = bar.period; + + // + for (int i = 1; i <= range; i++) + { + // + // Prev Bar ... + XOHCL iPrevBar; + result = iPrevBar.Init( + symbol, + period, + index + i // + ); + if (!result) + { + break; + } + + // + // Next Bar ... + XOHCL iNextBar; + result = iNextBar.Init( + symbol, + period, + index - i // + ); + if (!result) + { + break; + } + + // + result = bar.low <= iPrevBar.low && + bar.low <= iNextBar.low; + if (!result) + { + break; + } + } + + // + return result; + } + + /** + * Check Specified Bar is Swing or not ... + * + * @param bar: XOHCL instnce ... + * @param dir: ENUM_X_DIRECTION member ... + * @param range: Integer, Specified Range ... + * + * @return ( bool ) + */ + bool IsSwing( + XOHCL &bar, + ENUM_X_DIRECTION &dir, + int range = 2 // + ) + { + // + bool result = false; + + // + dir = X_DIRECTION_NONE; + + // + bool isSwingLow = IsSwingLow(bar, range); + bool isSwingHigh = IsSwingHigh(bar, range); + + // + result = isSwingLow || + isSwingHigh; + if (result) + { + // + if (isSwingLow) + { + dir = X_DIRECTION_BULLISH; + } + else + { + dir = X_DIRECTION_BEARISH; + } + } + + // + return result; + } + + /** + * Check a Bar is Momentum Bar or not ... + * + * @param bar: XOHCL instance ... + * @param dir: ENUM_X_DIRECTION member ... + * @param extend: Integer ... + * @param bodyPercent: Double ... + * + * @return ( bool ) + */ + bool IsMomentumBar( + XOHCL &bar, + ENUM_X_DIRECTION &dir, + int extend = 1, + double bodyPercent = 70 // + ) + { + // + bool result = false; + + // + if (extend < 0) + { + extend = 0; + } + + // + if (bodyPercent < 50) + { + bodyPercent = 50; + } + + // + dir = X_DIRECTION_NONE; + + // + result = bar.IsValid() && + bar.Index() > 0; + if (!result) + { + return result; + } + + // + if (extend > 0) + { + // + result = IsExtended( + bar, + extend // + ); + + // + if (!result) + { + return result; + } + } + + // + double body = bar.GetBody(); + double rp = GetBarRangePercent(bar); + + // + result = body >= rp * bodyPercent; + + // + if (result) + { + // + dir = + bar.IsBullish() + ? X_DIRECTION_BULLISH + : X_DIRECTION_BEARISH; + } + + // + return result; + } + + /** + * Check a Bar is Rejection Bar or not ... + * + * @param bar: XOHCL instance ... + * @param dir: ENUM_X_DIRECTION member ... + * @param extend: Integer ... + * @param shadowPercent: Double ... + * + * @return ( bool ) + */ + bool IsRejectionBar( + XOHCL &bar, + ENUM_X_DIRECTION &dir, + int extend = 1, + double shadowPercent = 60 // + ) + { + // + bool result = false; + + // + if (extend < 0) + { + extend = 0; + } + + // + if (shadowPercent < 50) + { + shadowPercent = 50; + } + + // + dir = X_DIRECTION_NONE; + + // + result = bar.IsValid() && + bar.Index() > 0; + if (!result) + { + return result; + } + + // + if (extend > 0) + { + // + result = IsExtended( + bar, + extend // + ); + + // + if (!result) + { + return result; + } + } + + // + double body = bar.GetBody(); + double range = bar.GetRange(); + double shadows = bar.GetShadows(); + double lowShadow = bar.GetLowShadow(); + double highShadow = bar.GetHighShadow(); + double rp = GetBarRangePercent(bar); + + // + result = shadows >= rp * shadowPercent; + + // + if (result) + { + // + dir = + lowShadow > highShadow + ? X_DIRECTION_BULLISH + : X_DIRECTION_BEARISH; + } + + // + return result; + } + + /** + * Check Specified Bar is Engulfing Bar or not ... + * + * @param bar: XOHCL instance ... + * @param dir: ENUM_X_DIRECTION member ... + * @param extend: Integer ... + * @param bodyPercent: Double ... + * + * @return ( bool ) + */ + bool IsEngulfBar( + XOHCL &bar, + ENUM_X_DIRECTION &dir, + int extend = 1, + double bodyPercent = 60 // + ) + { + // + bool result = false; + + // + if (extend < 0) + { + extend = 0; + } + + // + if (bodyPercent < 50) + { + bodyPercent = 50; + } + + // + dir = X_DIRECTION_NONE; + + // + result = bar.IsValid() && + bar.Index() > 0; + if (!result) + { + return result; + } + + // + // Previous Bar ... + XOHCL pBar; + result = bar.GetPreviousBar(pBar); + if (!result) + { + return result; + } + + // + if (extend > 0) + { + // + result = IsExtended( + pBar, + extend // + ); + + // + if (!result) + { + return result; + } + } + + // + // Check Engulfig ... + result = + bar.GetUp() > pBar.GetUp() && + bar.GetDown() < pBar.GetDown(); + if (!result) + { + return result; + } + + // + // Check Engulfing Direction ... + bool isBullishEngulfed = + pBar.IsBearish() && + bar.IsBullish(); + bool isBearishEngulfed = + pBar.IsBullish() && + bar.IsBearish(); + + // + result = isBullishEngulfed || + isBearishEngulfed; + if (!result) + { + return result; + } + + // + dir = isBullishEngulfed + ? X_DIRECTION_BULLISH + : X_DIRECTION_BEARISH; + + // + return result; + } + + /** + * Check Specified Bar is Pin Bar or not ... + * + * @param bar: XOHCL instance ... + * @param dir: ENUM_X_DIRECTION member ... + * @param extend: Integer ... + * @param shadowPercent: Double ... + * @param bodyPercent: Double ... + * + * @return ( bool ) + */ + bool IsPinBar( + XOHCL &bar, + ENUM_X_DIRECTION &dir, + int extend = 1, + double shadowPercent = 65, + double bodyPercent = 25 // + ) + { + // + bool result = false; + + // + dir = X_DIRECTION_NONE; + + // + result = bar.IsValid() && + bar.Index() > 0 && + bodyPercent > 0 && + shadowPercent > 0 && + bodyPercent < shadowPercent; + if (!result) + { + return result; + } + + // + // Chack Range Extends ... + if (extend > 0) + { + // + result = HasExtendedRange( + bar, + extend // + ); + if (!result) + { + return result; + } + } + + // + // Check Body ... + double rangePercent = GetBarRangePercent(bar); + result = rangePercent > 0; + if (!result) + { + return result; + } + + // + double body = bar.GetBody(); + double highShadow = bar.GetHighShadow(); + double lowShadow = bar.GetLowShadow(); + + // + // Check Body ... + result = body / rangePercent >= bodyPercent; + if (!result) + { + return result; + } + + // + bool isPassedHighShadow = + highShadow / rangePercent >= shadowPercent; + bool isPassedLowShadow = + lowShadow / rangePercent >= shadowPercent; + result = + isPassedLowShadow || + isPassedHighShadow; + if (!result) + { + return result; + } + + // + dir = isPassedLowShadow + ? X_DIRECTION_BULLISH + : X_DIRECTION_BEARISH; + + // + return result; + } + + /** + * Decision Bar (Pin, Momentum or Rejection) ... + * + * @param bar: XOHCL instance ... + * @param dir: ENUM_X_DIRECTION member ... + * @param extend: Integer ... + * @param shadowForPinAndRejectionBarPercent: Double ... + * @param bodyForPinBarPercent: Double ... + * @param bodyForEngulfBarPercent: Double ... + * @param bodyForMomentumBarPercent: Double ... + * + * @return ( bool ) + */ + bool IsDecisionBar( + XOHCL &bar, + ENUM_X_DIRECTION &dir, + int extend = 1, + double shadowForPinAndRejectionBarPercent = 65, + double bodyForPinBarPercent = 25, + double bodyForEngulfBarPercent = 65, + double bodyForMomentumBarPercent = 70 // + ) + { + // + bool result = false; + + // + dir = X_DIRECTION_NONE; + + // + result = bar.IsValid() && + bar.Index() > 0; + if (!result) + { + return result; + } + + // + // Pin Bar ... + ENUM_X_DIRECTION pinDir; + bool isPiBar = IsPinBar( + bar, + pinDir, + extend, + shadowForPinAndRejectionBarPercent, + bodyForPinBarPercent // + ); + + // + // Engulfing Bar ... + ENUM_X_DIRECTION engulfDir; + bool isEngulfBar = IsEngulfBar( + bar, + engulfDir, + extend, + bodyForEngulfBarPercent // + ); + + // + // Momentum Bar ... + ENUM_X_DIRECTION momentumDir; + bool isMomentumBar = IsMomentumBar( + bar, + momentumDir, + extend, + bodyForMomentumBarPercent // + ); + + // + // Rejection Bar ... + ENUM_X_DIRECTION rejectionDir; + bool isRejectionBar = IsRejectionBar( + bar, + rejectionDir, + extend, + shadowForPinAndRejectionBarPercent // + ); + + // + result = isPiBar || + isEngulfBar || + isMomentumBar || + isRejectionBar; + if (result) + { + // + if (isPiBar) + { + dir = pinDir; + } + else if (isEngulfBar) + { + dir = engulfDir; + } + else if (isMomentumBar) + { + dir = momentumDir; + } + else + { + dir = rejectionDir; + } + } + + // + result = IsBullish(dir) || + IsBearish(dir); + + // + return result; + } + + /** + * Check Fibonacci Level 382 Pressure ... + * + * @param bar: XOHCL instance ... + * @param dir: ENUM_X_DIRECTION member ... + * + * @return ( bool ) + */ + bool HasFiboPressure( + XOHCL &bar, + ENUM_X_DIRECTION &dir // + ) + { + // + bool result = false; + + // + dir = X_DIRECTION_NONE; + + // + result = bar.IsValid(); + if (!result) + { + return result; + } + + // + double bearishFib382 = GetFibonacciLevel( + bar.high, + bar.low, + 0.382, + 1 // + ); + double bullishFib382 = GetFibonacciLevel( + bar.high, + bar.low, + 0.382, + -1 // + ); + + // + bool isBullish = bar.GetDown() > bearishFib382; + bool isBearish = bar.GetUp() < bullishFib382; + + // + result = isBullish || + isBearish; + if (!result) + { + return result; + } + + // + dir = isBullish + ? X_DIRECTION_BULLISH + : X_DIRECTION_BEARISH; + + // + return result; + } + + // + // Support and Resistance Zones ... + + /** + * Check a Bar is Support Bar or not ... + * + * @param bar: XOHCL instance ... + * @param range: Integer, Specified Verifiation Range ... + * + * @return ( bool ) + */ + bool IsSupport( + XOHCL &bar, + int range = 21 // + ) + { + // + bool result = false; + + // + if (range < 2) + { + range = 2; + } + + // + result = bar.IsValid(); + if (!result) + { + return result; + } + + // + int index = bar.Index(); + result = range > 0 && + index >= range; + if (!result) + { + return result; + } + + // + string symbol = bar.symbol; + ENUM_TIMEFRAMES period = bar.period; + + // + for (int i = 1; i <= range; i++) + { + // + int prevIDX = index + i; + int nextIDX = index - 1; + + // + // Prev Bar ... + XOHCL iPrevBar; + result = iPrevBar.Init( + symbol, + period, + prevIDX // + ); + if (!result) + { + break; + } + + // + // Next Bar ... + XOHCL iNextBar; + result = iNextBar.Init( + symbol, + period, + nextIDX // + ); + if (!result) + { + break; + } + + // + result = bar.low <= iPrevBar.low && + bar.low <= iNextBar.low; + if (!result) + { + break; + } + } + + // + return result; + } + + /** + * Check a Bar Has Support or not ... + * + * @param bar: XOHCL instance ... + * @param supportBar: XOHCL instance Specified Support Bar ... + * @param rage: int, + * @return ( bool ) + */ + bool HasSupport( + XOHCL &bar, + XOHCL &supportBar, + int range = 21 // + ) + { + // + bool result = false; + + // + result = bar.IsValid(); + if (!result) + { + return result; + } + + // + int barIndex = bar.Index() + range; + result = IsValidIndex(barIndex); + if (!result) + { + // + supportBar.Clean(); + return result; + } + result = supportBar.Init( + bar.symbol, + bar.period, + barIndex // + ); + + // + result = supportBar.low < supportBar.GetDown(); + if (!result) + { + // + supportBar.Clean(); + return result; + } + + // + double selectedValue = supportBar.GetDown(); + + // + int llIDX = bar.FindLowestIndex(range - 1, MODE_LOW); + result = IsValidIndex(llIDX); + if (!result) + { + // + supportBar.Clean(); + return result; + } + + // + double llValue = iLow( + bar.symbol, + bar.period, + llIDX // + ); + + // + result = llValue >= selectedValue; + if (!result) + { + // + supportBar.Clean(); + return result; + } + + // + result = supportBar.IsValid(); + + // + return result; + } + + /** + * Check a Bar is Resistance Bar or not ... + * + * @param bar: XOHCL instance ... + * @param range: Integer, Specified Verifiation Range ... + * + * @return ( bool ) + */ + bool IsResistance( + XOHCL &bar, + int range = 21 // + ) + { + // + bool result = false; + + // + if (range < 2) + { + range = 2; + } + + // + result = bar.IsValid(); + if (!result) + { + return result; + } + + // + int index = bar.Index(); + result = range > 0 && + index >= range; + if (!result) + { + return result; + } + + // + string symbol = bar.symbol; + ENUM_TIMEFRAMES period = bar.period; + + // + for (int i = 1; i <= range; i++) + { + // + int prevIDX = index + i; + int nextIDX = index - 1; + + // + // Prev Bar ... + XOHCL iPrevBar; + result = iPrevBar.Init( + symbol, + period, + prevIDX // + ); + if (!result) + { + break; + } + + // + // Next Bar ... + XOHCL iNextBar; + result = iNextBar.Init( + symbol, + period, + nextIDX // + ); + if (!result) + { + break; + } + + // + result = bar.high >= iPrevBar.high && + bar.high >= iNextBar.high; + if (!result) + { + break; + } + } + + // + return result; + } + + /** + * Check a Bar Has Resistance or not ... + * + * @param bar: XOHCL instance ... + * @param resistanceBar: XOHCL instance Specified Resistance Bar ... + * @param rage: int, + * @return ( bool ) + */ + bool HasResistance( + XOHCL &bar, + XOHCL &resistanceBar, + int range = 21 // + ) + { + // + bool result = false; + + // + result = bar.IsValid(); + if (!result) + { + return result; + } + + // + int barIndex = bar.Index() + range; + result = IsValidIndex(barIndex); + if (!result) + { + // + resistanceBar.Clean(); + return result; + } + result = resistanceBar.Init( + bar.symbol, + bar.period, + barIndex // + ); + + // + result = resistanceBar.low < resistanceBar.GetDown(); + if (!result) + { + // + resistanceBar.Clean(); + return result; + } + + // + double selectedValue = resistanceBar.GetUp(); + + // + int hhIDX = bar.FindHighestIndex(range - 1, MODE_HIGH); + result = IsValidIndex(hhIDX); + if (!result) + { + // + resistanceBar.Clean(); + return result; + } + + // + double hhValue = iHigh( + bar.symbol, + bar.period, + hhIDX // + ); + + // + result = hhValue >= selectedValue; + if (!result) + { + // + resistanceBar.Clean(); + return result; + } + + // + result = resistanceBar.IsValid(); + + // + return result; + } + + // + // Order Blocks ... + + /** + * Detect an Order Block Based on Given Bar ... + * + * @param bar: XOHCL instance, Specified Start Bar ... + * @param ob: XOHCL instance, Fill it if Order Block Found ... + * @param dir: ENUM_X_DIRECTION member, Specified Founded Order Block Direction ... + * @param sameBars: Integer, Specified Min Same Bars for Detecting Order Block ... + * + * @return ( bool ) + */ + bool HasOrderBlock( + XOHCL &bar, + XOHCL &ob, + ENUM_X_DIRECTION &dir, + int sameBars = 3 // + ) + { + // + bool result = false; + + // + ob.Clean(); + dir = X_DIRECTION_NONE; + + // + if (sameBars < 1) + { + sameBars = 1; + } + + // + result = bar.IsValid(); + if (!result) + { + return result; + } + + // + int index = 0; + result = HasSameBars( + bar, + dir, + index, + sameBars // + ); + if (!result) + { + return result; + } + + // + int obIndex = index; + result = ob.Init( + bar.symbol, + bar.period, + obIndex // + ); + if (!result) + { + return result; + } + + // + return result; + } + + // + // Fair Value Gaps ... + + /** + * Detect a Fair Value Gap Based on Given Bar ... + * + * @param bar: XOHCL instance, Specified Start Bar ... + * @param dir: ENUM_X_DIRECTION member, Specified Founded Order Block Direction ... + * @param sameBars: Integer, Specified Min Same Bars for Detecting Order Block ... + * + * @return ( bool ) + */ + bool HasFairValueGap( + XOHCL &bar, + XOHCL &prevBar, + XOHCL &nextBar, + ENUM_X_DIRECTION &dir, + int sameBars = 3 // + ) + { + // + bool result = false; + + // + prevBar.Clean(); + nextBar.Clean(); + dir = X_DIRECTION_NONE; + + // + if (sameBars < 1) + { + sameBars = 1; + } + + // + result = bar.IsValid(); + if (!result) + { + return result; + } + + // + int index = 0; + result = HasSameBars( + bar, + dir, + index, + sameBars // + ); + if (!result) + { + return result; + } + + // + bool isBullish = IsBullish(dir); + + // + int to = bar.Index() + 1; + int from = index + 1; + for (int i = from; i > to; i--) + { + // + result = prevBar.Init( + bar.symbol, + bar.period, + i // + ); + if (!result) + { + break; + } + + // + result = nextBar.Init( + bar.symbol, + bar.period, + i - 2 // + ); + if (!result) + { + break; + } + + // + result = isBullish + ? prevBar.high < nextBar.low + : prevBar.low > nextBar.high; + if (result) + { + break; + } + } + + // + if (!result) + { + // + prevBar.Clean(); + nextBar.Clean(); + dir = X_DIRECTION_NONE; + } + + // + return result; + } + + // + // Bar CHOCH ... + + /** + * Check Specified Bar Has PullBack or not ... + * + * @param dir: ENUM_X_DIRECTION member, Specified Direction ... + * @param bar: XOHCL instance, Speciied Bar ... + * @param loopback: Integer, loopback Length ... + * @param forceBody: Boolean, Specified Choch Happens only by Bar's Body ... + * + * @return ( bool ) + */ + bool HasPullBack( + ENUM_X_DIRECTION &dir, + XOHCL &bar, + int loopback = 3, + bool forceBody = false // + ) + { + // + bool result = false; + + // + dir = X_DIRECTION_NONE; + + // + if (loopback < 1) + { + loopback = 1; + } + + // + result = bar.IsValid(); + if (!result) + { + return result; + } + + // + string symbol = bar.symbol; + ENUM_TIMEFRAMES period = bar.period; + + // + // Calculate Loopback Data ... + int index = -1; + int start = -1; + int end = -1; + int count = -1; + result = CalculateLoopBackData( + index, + start, + end, + count, + bar, + loopback // + ); + if (!result) + { + return result; + } + + // + // Calculate Loopback HH and LL Data ... + int hhIDX = -1; + double hh = -1; + int llIDX = -1; + double ll = -1; + result = CalculateLoopbackHLData( + hhIDX, + hh, + llIDX, + ll, + bar, + loopback // + ); + if (!result) + { + return result; + } + + // + bool isBullishDirection = + bar.high > hh && + bar.low > ll; + bool isBearishDirection = + bar.high < hh && + bar.low < ll; + result = isBullishDirection || + isBearishDirection; + if (!result) + { + return result; + } + + // + if (forceBody) + { + // + isBullishDirection = + bar.GetUp() > hh && + bar.GetDown() > ll; + isBearishDirection = + bar.GetUp() < hh && + bar.GetDown() < ll; + result = isBullishDirection || + isBearishDirection; + if (!result) + { + return result; + } + } + + // + // Check Bar's Direction in related to CHOCH Direction ... + result = + isBullishDirection + ? bar.IsBullish() + : bar.IsBearish(); + if (!result) + { + return result; + } + + // + // Set Direction ... + dir = + isBullishDirection + ? X_DIRECTION_BULLISH + : X_DIRECTION_BEARISH; + + // + // Check Loopback End Bar ... + XOHCL endBar; + result = endBar.Init( + symbol, + period, + end - 1 // + ); + if (!result) + { + return result; + } + + // + // End Bar Must be InDirect by Specified Bar ... + result = + isBullishDirection + ? endBar.IsBearish() + : endBar.IsBullish(); + + // + // Check Loopback for Directional Bars ... + + // + return result; + } + + // + // Tools ... + + // + bool IsStrong( + XOHCL &bar, + double percent = 50 // Percent of Body + ) + { + // + bool result = false; + + // + result = bar.IsValid() && + bar.Index() > 0; + if (!result) + { + return result; + } + + // + result = + (bar.GetRange() * percent) / 100 <= bar.GetBody(); + + // + return result; + } + + // + bool HasStrongLowShadow( + XOHCL &bar, + double percent = 50, // Percent of Body + int __loopback = 2, + double _sharpRatio = 2.5 // + ) + { + // + bool result = false; + + // + result = bar.IsValid() && + bar.Index() > 0; + if (!result) + { + return result; + } + + // + result = + (bar.GetRange() * percent) / 100 <= bar.GetLowShadow(); + if (!result) + { + return result; + } + + // + if (__loopback < 0) + { + __loopback = 2; + } + + // + if (_sharpRatio < 0) + { + _sharpRatio = 2.5; + } + + // + result = bar.Index() > __loopback; + if (!result) + { + return result; + } + + // + // Get Highest High and Lowest Low in loopback Range ... + int startIndex = bar.Index() - __loopback; + int endIndex = bar.Index() + __loopback; + int requiredBars = MathAbs(endIndex - startIndex); + + // + // Highs ... + double highs[]; + int copiedHighs = CopyHigh( + bar.symbol, + bar.period, + startIndex, + requiredBars, + highs // + ); + + // + result = copiedHighs == requiredBars; + if (!result) + { + return result; + } + + // + int highestHighIDX = ArrayMaximum(highs); + result = IsValidIndex(highestHighIDX); + if (!result) + { + return result; + } + + // + double highestHigh = highs[highestHighIDX]; + + // + // Lows ... + double lows[]; + int copiedLows = CopyLow( + bar.symbol, + bar.period, + startIndex, + requiredBars, + lows // + ); + + // + result = copiedLows == requiredBars; + if (!result) + { + return result; + } + + // + int lowestLowIDX = ArrayMinimum(lows); + result = IsValidIndex(lowestLowIDX); + if (!result) + { + return result; + } + + // + double lowestLow = lows[lowestLowIDX]; + + // + result = bar.low == lowestLow && + highestHigh > bar.high; + if (!result) + { + return result; + } + + // + // Try to Validate Sharp Ratio ... + + // + Clean(highs); + Clean(lows); + + // + // Left Side ... + startIndex = bar.Index() + 1; + endIndex = startIndex + (__loopback / 2) - 1; + requiredBars = MathAbs(endIndex - startIndex); + + // + copiedHighs = CopyHigh( + bar.symbol, + bar.period, + startIndex, + requiredBars, + highs // + ); + result = copiedHighs == requiredBars; + if (!result) + { + return result; + } + + // + highestHighIDX = ArrayMaximum(highs); + result = IsValidIndex(highestHighIDX); + if (!result) + { + return result; + } + + // + highestHigh = highs[highestHighIDX]; + + // + copiedLows = CopyLow( + bar.symbol, + bar.period, + startIndex, + requiredBars, + lows // + ); + result = copiedLows == requiredBars; + if (!result) + { + return result; + } + + // + lowestLowIDX = ArrayMinimum(lows); + result = IsValidIndex(lowestLowIDX); + if (!result) + { + return result; + } + + // + lowestLow = lows[lowestLowIDX]; + + // + double leftDiff = highestHigh - lowestLow; + + // + Clean(highs); + Clean(lows); + + // + // Right Side ... + startIndex = bar.Index() - 1; + endIndex = startIndex - (__loopback / 2) + 1; + requiredBars = MathAbs(endIndex - startIndex); + + // + copiedHighs = CopyHigh( + bar.symbol, + bar.period, + startIndex, + requiredBars, + highs // + ); + result = copiedHighs == requiredBars; + if (!result) + { + return result; + } + + // + highestHighIDX = ArrayMaximum(highs); + result = IsValidIndex(highestHighIDX); + if (!result) + { + return result; + } + + // + highestHigh = highs[highestHighIDX]; + + // + copiedLows = CopyLow( + bar.symbol, + bar.period, + startIndex, + requiredBars, + lows // + ); + result = copiedLows == requiredBars; + if (!result) + { + return result; + } + + // + lowestLowIDX = ArrayMinimum(lows); + result = IsValidIndex(lowestLowIDX); + if (!result) + { + return result; + } + + // + lowestLow = lows[lowestLowIDX]; + + // + double rightDiff = highestHigh - lowestLow; + double diff = MathMax(leftDiff, rightDiff); + result = bar.GetLowShadow() >= (diff / 100) * _sharpRatio; + + // + return result; + } + + // + bool HasStrongHighShadow( + XOHCL &bar, + double percent = 50, // Percent of Body + int __loopback = 2, + double _sharpRatio = 2.5 // + ) + { + // + bool result = false; + + // + result = bar.IsValid() && bar.Index() > 0; + if (!result) + { + return result; + } + + // + result = + (bar.GetRange() * percent) / 100 <= bar.GetHighShadow(); + if (!result) + { + return result; + } + + // + if (__loopback < 0) + { + __loopback = 2; + } + + // + if (_sharpRatio < 0) + { + _sharpRatio = 2.5; + } + + // + result = bar.Index() > __loopback; + if (!result) + { + return result; + } + + // + // Get Highest High and Lowest Low in loopback Range ... + int startIndex = bar.Index() - __loopback; + int endIndex = bar.Index() + __loopback; + int requiredBars = MathAbs(endIndex - startIndex); + + // + // Highs ... + double highs[]; + int copiedHighs = CopyHigh( + bar.symbol, + bar.period, + startIndex, + requiredBars, + highs // + ); + + // + result = copiedHighs == requiredBars; + if (!result) + { + return result; + } + + // + int highestHighIDX = ArrayMaximum(highs); + result = IsValidIndex(highestHighIDX); + if (!result) + { + return result; + } + + // + double highestHigh = highs[highestHighIDX]; + + // + // Lows ... + double lows[]; + int copiedLows = CopyLow( + bar.symbol, + bar.period, + startIndex, + requiredBars, + lows // + ); + + // + result = copiedLows == requiredBars; + if (!result) + { + return result; + } + + // + int lowestLowIDX = ArrayMinimum(lows); + result = IsValidIndex(lowestLowIDX); + if (!result) + { + return result; + } + + // + double lowestLow = lows[lowestLowIDX]; + + // + result = bar.high == highestHigh && + lowestLow < bar.low; + if (!result) + { + return result; + } + + // + // Try to Validate Sharp Ratio ... + + // + Clean(highs); + Clean(lows); + + // + // Left Side ... + startIndex = bar.Index() + 1; + endIndex = startIndex + (__loopback / 2) - 1; + requiredBars = MathAbs(endIndex - startIndex); + + // + copiedHighs = CopyHigh( + bar.symbol, + bar.period, + startIndex, + requiredBars, + highs // + ); + result = copiedHighs == requiredBars; + if (!result) + { + return result; + } + + // + highestHighIDX = ArrayMaximum(highs); + result = IsValidIndex(highestHighIDX); + if (!result) + { + return result; + } + + // + highestHigh = highs[highestHighIDX]; + + // + copiedLows = CopyLow( + bar.symbol, + bar.period, + startIndex, + requiredBars, + lows // + ); + result = copiedLows == requiredBars; + if (!result) + { + return result; + } + + // + lowestLowIDX = ArrayMinimum(lows); + result = IsValidIndex(lowestLowIDX); + if (!result) + { + return result; + } + + // + lowestLow = lows[lowestLowIDX]; + + // + double leftDiff = highestHigh - lowestLow; + + // + Clean(highs); + Clean(lows); + + // + // Right Side ... + startIndex = bar.Index() - 1; + endIndex = startIndex - (__loopback / 2) + 1; + requiredBars = MathAbs(endIndex - startIndex); + + // + copiedHighs = CopyHigh( + bar.symbol, + bar.period, + startIndex, + requiredBars, + highs // + ); + result = copiedHighs == requiredBars; + if (!result) + { + return result; + } + + // + highestHighIDX = ArrayMaximum(highs); + result = IsValidIndex(highestHighIDX); + if (!result) + { + return result; + } + + // + highestHigh = highs[highestHighIDX]; + + // + copiedLows = CopyLow( + bar.symbol, + bar.period, + startIndex, + requiredBars, + lows // + ); + result = copiedLows == requiredBars; + if (!result) + { + return result; + } + + // + lowestLowIDX = ArrayMinimum(lows); + result = IsValidIndex(lowestLowIDX); + if (!result) + { + return result; + } + + // + lowestLow = lows[lowestLowIDX]; + + // + double rightDiff = highestHigh - lowestLow; + double diff = MathMax(leftDiff, rightDiff); + result = bar.GetHighShadow() >= (diff / 100) * _sharpRatio; + + // + return result; + } + + // + bool IsStrongBullish( + XOHCL &bar, + double percent = 50 // Percent of Body + ) + { + // + bool result = false; + + // + result = + bar.IsValid() && + bar.IsBullish() && + IsStrong(bar, percent); + + // + return result; + } + + // + bool IsStrongBearish( + XOHCL &bar, + double percent = 50 // Percent of Body + ) + { + // + bool result = false; + + // + result = + bar.IsValid() && + bar.IsBearish() && + IsStrong(bar, percent); + + // + return result; + } + + // + bool IsSharpBullish( + XOHCL &bar, + int __loopback = 2, + double _sharpRatio = 2.5 // + ) + { + // + bool result = false; + + // + result = bar.IsValid(); + if (!result) + { + return result; + } + + // + if (__loopback < 0) + { + __loopback = 2; + } + + // + if (_sharpRatio < 0) + { + _sharpRatio = 2.5; + } + + // + int hIDX = bar.FindHighestIndex( + __loopback, + MODE_HIGH // + ); + int lIDX = bar.FindLowestIndex( + __loopback, + MODE_LOW // + ); + + // + result = + // + hIDX >= 0 && + lIDX >= 0 && + MathAbs(hIDX - bar.Index()) < 2 + // + ; + + // + if (!result) + { + return result; + } + + // + XOHCL hBar; + result = hBar.Init( + bar.symbol, + bar.period, + hIDX // + ); + if (!result) + { + return result; + } + + // + XOHCL lBar; + result = lBar.Init( + bar.symbol, + bar.period, + lIDX // + ); + if (!result) + { + return result; + } + + // + double lhDif = hBar.high - lBar.low; + + // + int hhIDX = hBar.FindHighestIndex( + __loopback, + MODE_HIGH // + ); + + // + int llIDX = lBar.FindLowestIndex( + __loopback, + MODE_LOW // + ); + + // + XOHCL hhBar; + result = hhBar.Init( + bar.symbol, + bar.period, + hhIDX + hIDX // + ); + if (!result) + { + return result; + } + + // + XOHCL llBar; + result = llBar.Init( + bar.symbol, + bar.period, + llIDX + lIDX // + ); + if (!result) + { + return result; + } + + // + double llhhDif = hhBar.high - llBar.low; + + // + result = + // + lBar.low > llBar.low && + hBar.high > hhBar.high && + lhDif >= llhhDif * _sharpRatio + // + ; + + // + return result; + } + + // + bool IsSharpBearish( + XOHCL &bar, + int __loopback = 2, + double _sharpRatio = 2.5 // + ) + { + // + bool result = false; + + // + result = bar.IsValid(); + if (!result) + { + return result; + } + + // + if (__loopback < 0) + { + __loopback = 2; + } + + // + if (_sharpRatio < 0) + { + _sharpRatio = 2.5; + } + + // + int hIDX = bar.FindHighestIndex( + __loopback, + MODE_HIGH // + ); + int lIDX = bar.FindLowestIndex( + __loopback, + MODE_LOW // + ); + + // + result = + // + hIDX >= 0 && + lIDX >= 0 && + MathAbs(hIDX - bar.Index()) < 2 + // + ; + + // + if (!result) + { + return result; + } + + // + XOHCL hBar; + result = hBar.Init( + bar.symbol, + bar.period, + hIDX // + ); + if (!result) + { + return result; + } + + // + XOHCL lBar; + result = lBar.Init( + bar.symbol, + bar.period, + lIDX // + ); + if (!result) + { + return result; + } + + // + double lhDif = hBar.high - lBar.low; + + // + int hhIDX = hBar.FindHighestIndex( + __loopback, + MODE_HIGH // + ); + + // + int llIDX = lBar.FindLowestIndex( + __loopback, + MODE_LOW // + ); + + // + XOHCL hhBar; + result = hhBar.Init( + bar.symbol, + bar.period, + hhIDX + hIDX // + ); + if (!result) + { + return result; + } + + // + XOHCL llBar; + result = llBar.Init( + bar.symbol, + bar.period, + llIDX + lIDX // + ); + if (!result) + { + return result; + } + + // + double llhhDif = hhBar.high - llBar.low; + + // + result = + // + lBar.low < llBar.low && + hBar.high < hhBar.high && + lhDif >= llhhDif * _sharpRatio + // + ; + + // + return result; + } + + // + // + // + + // + // Retrieve Bullish Pressure ... + double GetBullishPressure( + XOHCL &bar, + int __loopback = 7 // + ) + { + // + double result = 0; + + // + if (!bar.IsValid()) + { + return result; + } + + // + XOHCL bars[]; + int barsCount = GetBars( + bars, + bar.symbol, + bar.period, + bar.Index(), + __loopback // + ); + if (!IsValidSize(barsCount)) + { + return result; + } + + // + for (int i = 0; i < barsCount; i++) + { + result += bars[i].GetLowShadow(); + } + + // + return result; + } + + // + // Retrieve Bearish Pressure ... + double GetBearishPressure( + XOHCL &bar, + int __loopback = 7 // + ) + { + // + double result = 0; + + // + if (!bar.IsValid()) + { + return result; + } + + // + XOHCL bars[]; + int barsCount = GetBars( + bars, + bar.symbol, + bar.period, + bar.Index(), + __loopback // + ); + if (!IsValidSize(barsCount)) + { + return result; + } + + // + for (int i = 0; i < barsCount; i++) + { + result += bars[i].GetHighShadow(); + } + + // + return result; + } + + // + bool HasBullishPressure( + XOHCL &bar, + int __loopback = 7 // + ) + { + // + bool result = false; + + // + if (__loopback < 0) + { + __loopback = 7; + } + + // + result = bar.IsValid(); + if (!result) + { + return result; + } + + // + double bullishPressure = GetBullishPressure(bar, __loopback); + double bearishPressure = GetBearishPressure(bar, __loopback); + + // + result = + // + bullishPressure > 0 && + bearishPressure >= 0 && + bullishPressure > bearishPressure + // + ; + + // + return result; + } + + // + bool HasBearishPressure( + XOHCL &bar, + int __loopback = 7 // + ) + { + // + bool result = false; + + // + if (__loopback < 0) + { + __loopback = 7; + } + + // + result = bar.IsValid(); + if (!result) + { + return result; + } + + // + double bullishPressure = GetBullishPressure(bar, __loopback); + double bearishPressure = GetBearishPressure(bar, __loopback); + + // + result = + // + bearishPressure > 0 && + bullishPressure >= 0 && + bearishPressure > bullishPressure + // + ; + + // + return result; + } + + // + // Retrieve Bullish Power ... + double GetBullishPower( + XOHCL &bar, + int __loopback = 7 // + ) + { + // + double result = 0; + + // + if (!bar.IsValid()) + { + return result; + } + + // + XOHCL bars[]; + int barsCount = GetBars( + bars, + bar.symbol, + bar.period, + bar.Index(), + __loopback // + ); + if (!IsValidSize(barsCount)) + { + return result; + } + + // + for (int i = 0; i < barsCount; i++) + { + // + if (bars[i].IsBullish()) + { + result += bars[i].GetBody(); + } + } + + // + return result; + } + + // + // Retrieve Bearish Pressure ... + double GetBearishPower( + XOHCL &bar, + int __loopback = 7 // + ) + { + // + double result = 0; + + // + if (!bar.IsValid()) + { + return result; + } + + // + XOHCL bars[]; + int barsCount = GetBars( + bars, + bar.symbol, + bar.period, + bar.Index(), + __loopback // + ); + if (!IsValidSize(barsCount)) + { + return result; + } + + // + for (int i = 0; i < barsCount; i++) + { + // + if (bars[i].IsBearish()) + { + result += bars[i].GetBody(); + } + } + + // + return result; + } + + // + bool HasBullishPower( + XOHCL &bar, + int __loopback = 7 // + ) + { + // + bool result = false; + + // + if (__loopback < 0) + { + __loopback = 7; + } + + // + result = bar.IsValid(); + if (!result) + { + return result; + } + + // + double bullishPressure = GetBullishPower(bar, __loopback); + double bearishPressure = GetBearishPower(bar, __loopback); + + // + result = + // + bullishPressure > 0 && + bearishPressure >= 0 && + bullishPressure > bearishPressure + // + ; + + // + return result; + } + + // + bool HasBearishPower( + XOHCL &bar, + int __loopback = 7 // + ) + { + // + bool result = false; + + // + if (__loopback < 0) + { + __loopback = 7; + } + + // + result = bar.IsValid(); + if (!result) + { + return result; + } + + // + double bullishPressure = GetBullishPower(bar, __loopback); + double bearishPressure = GetBearishPower(bar, __loopback); + + // + result = + // + bearishPressure > 0 && + bullishPressure >= 0 && + bearishPressure > bullishPressure + // + ; + + // + return result; + } + + // + // Decisions ... + + // + bool IsBullishDecision( + XOHCL &bar, + double percent = 70 // Percent of Body + ) + { + // + bool result = false; + + // + result = + // + bar.IsValid() && + bar.Index() > 0 && + bar.IsBullish() && + (bar.GetRange() * percent) / 100 <= bar.GetBody() + // + ; + + // + return result; + } + + // + bool IsBearishDecision( + XOHCL &bar, + double percent = 70 // Percent of Body + ) + { + // + bool result = false; + + // + result = + // + bar.IsValid() && + bar.Index() > 0 && + bar.IsBearish() && + (bar.GetRange() * percent) / 100 <= bar.GetBody() + // + ; + + // + return result; + } + + // + // Candlestic Patterns ... + + // + // Check Doji ... + bool IsDoji( + XOHCL &bar // + ) + { + // + bool result = false; + + // + // Validate Content and Ignore 0 Bar + // since it is not Completed ... + result = bar.IsValid() && bar.Index() > 0; + if (!result) + { + return result; + } + + // + result = bar.open == bar.close; + + // + return result; + } + + // + // Check Hammer ... + bool IsHammer( + XOHCL &bar, + double _upShadowFactor = 0.1, + double _downShadowFactor = 0.6, + bool applyFib382Check = true, + bool applyPrevShadowCheck = true // + ) + { + // + bool result = false; + + // + // Validate Content and Ignore 0 Bar + // since it is not Completed ... + result = bar.IsValid() && bar.Index() > 0; + if (!result) + { + return result; + } + + // + if (_upShadowFactor < 0) + { + _upShadowFactor = 0.1; + } + + // + if (_downShadowFactor < 0) + { + _upShadowFactor = 0.6; + } + + // + double range = bar.GetRange(); + + // + // Check Upper Shadow Must be 0 or Under 10% ... + double upShadow = bar.GetHighShadow(); + result = upShadow < range * _upShadowFactor; + if (!result) + { + return result; + } + + // + // Check Down Shadow Must at least 60% ... + double downShadow = bar.GetLowShadow(); + result = downShadow > range * _downShadowFactor; + if (!result) + { + return result; + } + + // + // Check Fib 382 ... + if (result && applyFib382Check) + { + // + double fib382 = GetFibonacciLevel( + bar.high, + bar.low, + 0.382, + -1 // + ); + result = bar.GetDown() > fib382; + } + + // + // Check Shadow Based on Prev Bar ... + if (result && applyPrevShadowCheck) + { + // + XOHCL pBar; + result = bar.GetPreviousBar(pBar); + if (!result) + { + return result; + } + + // + result = bar.low < pBar.low; + } + + // + return result; + } + + // + // Check Sgooting Star ... + // Reversal Hammer ... + bool IsShootingStar( + XOHCL &bar, + double _upShadowFactor = 0.6, + double _downShadowFactor = 0.1, + bool applyFib382Check = true, + bool applyPrevShadowCheck = true // + ) + { + // + bool result = false; + + // + // Validate Content and Ignore 0 Bar + // since it is not Completed ... + result = bar.IsValid() && bar.Index() > 0; + if (!result) + { + return result; + } + + // + if (_upShadowFactor < 0) + { + _upShadowFactor = 0.6; + } + + // + if (_downShadowFactor < 0) + { + _upShadowFactor = 0.1; + } + + // + double range = bar.GetRange(); + + // + // Check Upper Shadow Must be 0 or Under 10% ... + double upShadow = bar.GetHighShadow(); + result = upShadow > range * _upShadowFactor; + if (!result) + { + return result; + } + + // + // Check Down Shadow Must at least 60% ... + double downShadow = bar.GetLowShadow(); + result = downShadow < range * _downShadowFactor; + if (!result) + { + return result; + } + + // + // Check Fib 382 ... + if (result && applyFib382Check) + { + // + double fib382 = GetFibonacciLevel( + bar.high, + bar.low, + 0.382, + 1 // + ); + result = bar.GetUp() < fib382; + } + + // + // Check Shadow Based on Prev Bar ... + if (result && applyPrevShadowCheck) + { + // + XOHCL pBar; + result = bar.GetPreviousBar(pBar); + if (!result) + { + return result; + } + + // + result = bar.high > pBar.high; + } + + // + return result; + } + + // + // Check Bullish Engulfing ... + bool IsBullishEngulfing( + XOHCL &bar, + double _engulfBarBodyFactor = 0.7 // + ) + { + // + bool result = false; + + // + // Validate Content and Ignore 0 Bar + // since it is not Completed ... + result = bar.IsValid() && bar.Index() > 0; + if (!result) + { + return result; + } + + // + if (_engulfBarBodyFactor < 0) + { + _engulfBarBodyFactor = 0.7; + } + + // + // Check Bar Is Bullish ... + result = bar.IsBullish(); + if (!result) + { + return result; + } + + // + // Retrieve Previous Bar ... + XOHCL pBar; + result = bar.GetPreviousBar(pBar); + if (!result) + { + return result; + } + + // + double range = bar.GetRange(); + double body = bar.GetBody(); + + // + // Check Prev Bar Must Bearish ... + result = pBar.IsBearish(); + if (!result) + { + return result; + } + + // + // Check Shadows Engulf Prev Bar ... + result = + // + bar.high > pBar.high && + bar.low <= pBar.low + // + ; + if (!result) + { + return result; + } + + // + // Check Engulfed Bar Must Inside Engulfer Body ... + result = + // + bar.GetUp() > pBar.GetUp() && + bar.GetDown() < pBar.GetDown() + // + ; + if (!result) + { + return result; + } + + // + // Check Body of Engulfing Bar ... + if (result && _engulfBarBodyFactor > 0) + { + result = body >= range * _engulfBarBodyFactor; + } + + // + return result; + } + + // + // Check Bearish Engulfing ... + bool IsBearishEngulfing( + XOHCL &bar, + double _engulfBarBodyFactor = 0.7 // + ) + { + // + bool result = false; + + // + // Validate Content and Ignore 0 Bar + // since it is not Completed ... + result = bar.IsValid() && bar.Index() > 0; + if (!result) + { + return result; + } + + // + if (_engulfBarBodyFactor < 0) + { + _engulfBarBodyFactor = 0.7; + } + + // + // Check Bar Is Bearish ... + result = bar.IsBearish(); + if (!result) + { + return result; + } + + // + // Retrieve Previous Bar ... + XOHCL pBar; + result = bar.GetPreviousBar(pBar); + if (!result) + { + return result; + } + + // + double range = bar.GetRange(); + double body = bar.GetBody(); + + // + // Check Prev Bar Must Bullish ... + result = pBar.IsBullish(); + if (!result) + { + return result; + } + + // + // Check Shadows Engulf Prev Bar ... + result = bar.high >= pBar.high && + bar.low < pBar.low; + if (!result) + { + return result; + } + + // + // Check Engulfed Bar Must Inside Engulfer Body ... + result = + // + bar.GetUp() > pBar.GetUp() && + bar.GetDown() < pBar.GetDown() + // + ; + if (!result) + { + return result; + } + + // + // Check Body of Engulfing Bar ... + if (result && _engulfBarBodyFactor > 0) + { + result = body >= range * _engulfBarBodyFactor; + } + + // + return result; + } + + // + // Check Morning Star Pattern ... + bool IsMorningStar( + XOHCL &bar, + double _middleRangeFactor = 0.3, + double _startBodyFactor = 0.6, + bool forceCheckMiddleBarDirection = true, + bool forceCheckStartBody = true // + ) + { + // + bool result = false; + + // + // Validate Content and Ignore 0 Bar + // since it is not Completed ... + result = bar.IsValid() && bar.Index() > 0; + if (!result) + { + return result; + } + + // + if (_middleRangeFactor < 0) + { + _middleRangeFactor = 0.3; + } + + // + if (_startBodyFactor < 0) + { + _startBodyFactor = 0.6; + } + + // + // Current Bar Must be Bullish ... + result = bar.IsBullish(); + if (!result) + { + return result; + } + + // + // Retrieve Previous Bar ... + XOHCL pBar; + result = bar.GetPreviousBar(pBar); + if (!result) + { + return result; + } + + // + // Prev Bar must be Bearish ... + if (result && forceCheckMiddleBarDirection) + { + // + result = pBar.IsBearish(); + if (!result) + { + return result; + } + } + + // + // Retrieve Previous Bar of Prev Bar ... + XOHCL ppBar; + result = pBar.GetPreviousBar(ppBar); + if (!result) + { + return result; + } + + // + // Prev Of Prev Bar Must be Bearish ... + result = ppBar.IsBearish(); + if (!result) + { + return result; + } + + // + double range = bar.GetRange(); + double pRange = pBar.GetRange(); + double ppRange = ppBar.GetRange(); + + // + // Middle Bar must be Smaller than Ratio of other ... + result = + // + pRange < range * _middleRangeFactor && + pRange < ppRange * _middleRangeFactor + // + ; + if (!result) + { + return result; + } + + // + if (result && forceCheckStartBody) + { + // + result = ppBar.GetBody() > ppRange * _startBodyFactor; + if (!result) + { + return result; + } + } + + // + return result; + } + + // + // Check Evening Star Pattern ... + bool IsEveningStar( + XOHCL &bar, + double _middleRangeFactor = 0.3, + double _startBodyFactor = 0.6, + bool forceCheckMiddleBarDirection = true, + bool forceCheckStartBody = true // + ) + { + // + bool result = false; + + // + // Validate Content and Ignore 0 Bar + // since it is not Completed ... + result = bar.IsValid() && bar.Index() > 0; + if (!result) + { + return result; + } + + // + if (_middleRangeFactor < 0) + { + _middleRangeFactor = 0.3; + } + + // + if (_startBodyFactor < 0) + { + _startBodyFactor = 0.6; + } + + // + // Current Bar Must be Bearish ... + result = bar.IsBearish(); + if (!result) + { + return result; + } + + // + // Retrieve Previous Bar ... + XOHCL pBar; + result = bar.GetPreviousBar(pBar); + if (!result) + { + return result; + } + + // + // Prev Bar must be Bullish ... + if (result && forceCheckMiddleBarDirection) + { + // + result = pBar.IsBullish(); + if (!result) + { + return result; + } + } + + // + // Retrieve Previous Bar of Prev Bar ... + XOHCL ppBar; + result = pBar.GetPreviousBar(ppBar); + if (!result) + { + return result; + } + + // + // Prev Of Prev Bar Must be Bullish ... + result = ppBar.IsBullish(); + if (!result) + { + return result; + } + + // + double range = bar.GetRange(); + double pRange = pBar.GetRange(); + double ppRange = ppBar.GetRange(); + + // + // Middle Bar must be Smaller than Ratio of other ... + result = + // + pRange < range * _middleRangeFactor && + pRange < ppRange * _middleRangeFactor + // + ; + if (!result) + { + return result; + } + + // + if (result && forceCheckStartBody) + { + // + result = ppBar.GetBody() > ppRange * _startBodyFactor; + if (!result) + { + return result; + } + } + + // + return result; + } + + // + // Bullish Marubozu ... + bool IsBullishMarubozu(XOHCL &bar) + { + // + bool result = false; + + // + result = bar.IsValid() && bar.Index() > 0; + if (!result) + { + return result; + } + + // + result = bar.IsBullish(); + if (!result) + { + return result; + } + + // + result = + // + bar.GetUp() == bar.high && + bar.GetDown() == bar.low + // + ; + + // + return result; + } + + // + // Bearish Marubozu ... + bool IsBearishMarubozu(XOHCL &bar) + { + // + bool result = false; + + // + result = bar.IsValid() && bar.Index() > 0; + if (!result) + { + return result; + } + + // + result = bar.IsBearish(); + if (!result) + { + return result; + } + + // + result = + // + bar.GetUp() == bar.high && + bar.GetDown() == bar.low + // + ; + + // + return result; + } + + // + // Contextual Patterns ... + + // + // Check Swing High ... + bool IsBarSwingHigh(XOHCL &bar) + { + // + bool result = false; + + // + // Validate Content and Ignore 0 Bar + // since it is not Completed ... + result = bar.IsValid() && bar.Index() > 0; + if (!result) + { + return result; + } + + // + // Current Bar Must be Bearish ... + result = bar.IsBearish(); + if (!result) + { + return result; + } + + // + // Retrieve Prev Bar ... + XOHCL pBar; + result = bar.GetPreviousBar(pBar); + if (!result) + { + return result; + } + + // + // Prev Bar Must be Bullish ... + result = pBar.IsBullish(); + if (!result) + { + return result; + } + + // + // Retrieve Prev of Prev Bar ... + XOHCL ppBar; + result = pBar.GetPreviousBar(ppBar); + if (!result) + { + return result; + } + + // + // Prev of Prev Bar Must be Bullish ... + result = ppBar.IsBullish(); + if (!result) + { + return result; + } + + // + // Check All Highs ... + result = + // + bar.high < pBar.high && + pBar.high > ppBar.high + // + ; + + // + return result; + } + + // + // Find Simple 3 Candle Based Swing High ... + bool IsSimpleSwingHigh( + XOHCL &bar, + double thresholdInPoint = 1 // + ) + { + // + bool result = false; + + // + int index = bar.Index(); + result = index > 0; + if (!result) + { + return result; + } + + // + XOHCL nextBar; + result = bar.GetNextBar(nextBar); + if (!result) + { + return result; + } + + // + XOHCL prevBar; + result = bar.GetPreviousBar(prevBar); + if (!result) + { + return result; + } + + // + double point = GetPoints(bar.symbol); + double requiredOffset = point * thresholdInPoint; + + // + result = + bar.high > nextBar.high && + bar.high > prevBar.high && + (thresholdInPoint <= 0 + ? true + : MathAbs( + MathMax( + nextBar.high, + prevBar.high) - + bar.high) >= requiredOffset); + + // + return result; + } + + // + // Find Last Swing High ... + bool FindLastSwingHigh( + XOHCL &bar, + XOHCL &swing // + ) + { + // + bool result = false; + + // + swing.Clean(); + + // + result = bar.IsValid(); + if (!result) + { + return result; + } + + // + int totalBars = iBars( + bar.symbol, + bar.period // + ); + int maxAllowed = MathMin(100, (totalBars / 100)); + + // + int idx = bar.Index(); + for (int i = idx; i <= idx + maxAllowed; i++) + { + // + swing.Clean(); + result = swing.Init( + bar.symbol, + bar.period, + i // + ); + if (!result) + { + // + swing.Clean(); + break; + } + + // + result = IsBarSwingHigh(swing); + if (result) + { + break; + } + } + + // + return result; + } + + // + // Check Swing Low ... + bool IsBarSwingLow(XOHCL &bar) + { + // + bool result = false; + + // + // Validate Content and Ignore 0 Bar + // since it is not Completed ... + result = bar.IsValid() && bar.Index() > 0; + if (!result) + { + return result; + } + + // + // Current Bar Must be Bullish ... + result = bar.IsBullish(); + if (!result) + { + return result; + } + + // + // Retrieve Prev Bar ... + XOHCL pBar; + result = bar.GetPreviousBar(pBar); + if (!result) + { + return result; + } + + // + // Prev Bar Must be Bearish ... + result = pBar.IsBearish(); + if (!result) + { + return result; + } + + // + // Retrieve Prev of Prev Bar ... + XOHCL ppBar; + result = pBar.GetPreviousBar(ppBar); + if (!result) + { + return result; + } + + // + // Prev of Prev Bar Must be Bearish ... + result = ppBar.IsBearish(); + if (!result) + { + return result; + } + + // + // Check All Lows ... + result = + // + bar.low > pBar.low && + pBar.low < ppBar.low + // + ; + + // + return result; + } + + // + // Find Simple 3 Candle Based Swing Low ... + bool IsSimpleSwingLow( + XOHCL &bar, + double thresholdInPoint = 1 // + ) + { + // + bool result = false; + + // + int index = bar.Index(); + result = index > 0; + if (!result) + { + return result; + } + + // + XOHCL nextBar; + result = bar.GetNextBar(nextBar); + if (!result) + { + return result; + } + + // + XOHCL prevBar; + result = bar.GetPreviousBar(prevBar); + if (!result) + { + return result; + } + + // + double point = GetPoints(bar.symbol); + double requiredOffset = point * thresholdInPoint; + + // + result = + bar.low < nextBar.low && + bar.low < prevBar.low && + (thresholdInPoint <= 0 + ? true + : MathAbs( + MathMax( + nextBar.low, + prevBar.low) - + bar.low) >= requiredOffset); + + // + return result; + } + + // + // Find Last Swing Low ... + bool FindLastSwingLow( + XOHCL &bar, + XOHCL &swing // + ) + { + // + bool result = false; + + // + swing.Clean(); + + // + result = bar.IsValid(); + if (!result) + { + return result; + } + + // + int totalBars = iBars( + bar.symbol, + bar.period // + ); + int maxAllowed = MathMin(100, (totalBars / 100)); + + // + int idx = bar.Index(); + for (int i = idx; i <= idx + maxAllowed; i++) + { + // + swing.Clean(); + result = swing.Init( + bar.symbol, + bar.period, + i // + ); + if (!result) + { + // + swing.Clean(); + break; + } + + // + result = IsBarSwingLow(swing); + if (result) + { + break; + } + } + + // + return result; + } + + // + // Check Bullish FVG ... + bool HasBullishFVG( + XOHCL &bar, + double &upper, + double &lower, + datetime &start, + datetime &end, + bool forceMiddleBarCheck = true, + bool forceCheckLastBarDirection = false // + ) + { + // + bool result = false; + + // + upper = 0; + lower = 0; + + // + end = NULL; + start = NULL; + + // + // Validate Content and Ignore 0 Bar + // since it is not Completed ... + result = bar.IsValid() && bar.Index() > 0; + if (!result) + { + return result; + } + + // + // Current Bar Must be Bullish ... + result = + !forceCheckLastBarDirection + ? true + : bar.IsBullish(); + if (!result) + { + return result; + } + + // + // Retrieve Prev Bar ... + XOHCL pBar; + result = bar.GetPreviousBar(pBar); + if (!result) + { + return result; + } + + // + // Prev Bar Must be Bullish ... + result = pBar.IsBullish(); + if (!result) + { + return result; + } + + // + // Retrieve Prev of Prev Bar ... + XOHCL ppBar; + result = pBar.GetPreviousBar(ppBar); + if (!result) + { + return result; + } + + // + // Prev of Prev Bar Must be Bullish ... + result = ppBar.IsBullish(); + if (!result) + { + return result; + } + + // + // Other Conditions ... + result = + // + bar.low > ppBar.high + // + ; + + // + // Check Middle Bar Range ... + if (result && forceMiddleBarCheck) + { + // + result = + // + pBar.high > bar.low && + pBar.low < ppBar.high + // + ; + + // + if (!result) + { + return result; + } + } + + // + if (result) + { + // + end = bar.time; + upper = bar.low; + lower = ppBar.high; + start = ppBar.time; + } + + // + return result; + } + + // + // Check Bearish FVG ... + bool HasBearishFVG( + XOHCL &bar, + double &upper, + double &lower, + datetime &start, + datetime &end, + bool forceMiddleBarCheck = true, + bool forceCheckLastBarDirection = false // + ) + { + // + bool result = false; + + // + upper = 0; + lower = 0; + + // + end = NULL; + start = NULL; + + // + // Validate Content and Ignore 0 Bar + // since it is not Completed ... + result = bar.IsValid() && bar.Index() > 0; + if (!result) + { + return result; + } + + // + // Current Bar Must be Bearish ... + result = + !forceCheckLastBarDirection + ? true + : bar.IsBullish(); + if (!result) + { + return result; + } + + // + // Retrieve Prev Bar ... + XOHCL pBar; + result = bar.GetPreviousBar(pBar); + if (!result) + { + return result; + } + + // + // Prev Bar Must be Bearish ... + result = pBar.IsBearish(); + if (!result) + { + return result; + } + + // + // Retrieve Prev of Prev Bar ... + XOHCL ppBar; + result = pBar.GetPreviousBar(ppBar); + if (!result) + { + return result; + } + + // + // Prev of Prev Bar Must be Bearish ... + result = ppBar.IsBearish(); + if (!result) + { + return result; + } + + // + // Other Conditions ... + result = + // + bar.high < ppBar.low + // + ; + + // + // Check Middle Bar Range ... + if (result && forceMiddleBarCheck) + { + // + result = + // + pBar.high > bar.low && + pBar.low < ppBar.high + // + ; + + // + if (!result) + { + return result; + } + } + + // + if (result) + { + // + end = bar.time; + lower = bar.high; + upper = ppBar.low; + start = ppBar.time; + } + + // + return result; + } + + // + // Find Support ... + bool HasSupport( + XOHCL &bar, + XOHCL &dest, + ENUM_X_PRICE type = X_PRICE_CLOSE, + int _loopback = 21, + int tries = 100 // + ) + { + // + bool result = false; + + // + dest.Clean(); + + // + if (_loopback < 0) + { + _loopback = 21; + } + + // + if (tries < 0) + { + tries = 100; + } + + // + result = bar.IsValid(); + if (!result) + { + return result; + } + + // + double price = bar.GetPrice(type); + + // + for (int i = 1; i < tries; i++) + { + // + int _length = _loopback * i; + + // + int lowestIDX = bar.FindLowestIndex( + _length, + MODE_LOW // + ); + result = IsValidIndex(lowestIDX); + if (!result) + { + break; + } + + // + XOHCL iLBar; + result = iLBar.Init( + bar.symbol, + bar.period, + lowestIDX // + ); + if (!result) + { + break; + } + + // + result = + // + price > iLBar.high + // + ; + if (result) + { + // + dest = iLBar; + break; + } + } + + // + result = dest.IsValid(); + + // + return result; + } + + // + // Find Resistance ... + bool HasResistance( + XOHCL &bar, + XOHCL &dest, + ENUM_X_PRICE type = X_PRICE_CLOSE, + int _loopback = 21, + int tries = 100 // + ) + { + // + bool result = false; + + // + dest.Clean(); + + // + if (_loopback < 0) + { + _loopback = 21; + } + + // + if (tries < 0) + { + tries = 100; + } + + // + result = bar.IsValid(); + if (!result) + { + return result; + } + + // + double price = bar.GetPrice(type); + + // + for (int i = 1; i < tries; i++) + { + // + int _length = _loopback * i; + + // + int highestIDX = bar.FindHighestIndex( + _length, + MODE_LOW // + ); + result = IsValidIndex(highestIDX); + if (!result) + { + break; + } + + // + XOHCL iHBar; + result = iHBar.Init( + bar.symbol, + bar.period, + highestIDX // + ); + if (!result) + { + break; + } + + // + result = + // + price < iHBar.high + // + ; + if (result) + { + // + dest = iHBar; + break; + } + } + + // + result = dest.IsValid(); + + // + return result; + } + + // + // Trend Detection ... + + // + // Find Bullish Trend ... + bool HasBullishTrend( + XOHCL &bar, + XOHCL &highSwingBars[], + XOHCL &lowSwingBars[], + bool forceMethod2 = false, + int _loopback = 3, + int tries = 3, + ENUM_X_PRICE type = X_PRICE_CLOSE // + ) + { + // + bool result = false; + + // + Clean(lowSwingBars); + Clean(highSwingBars); + + // + result = bar.IsValid(); + if (!result) + { + return result; + } + + // + double price = bar.GetPrice(type); + + // + int lastIDX = bar.Index(); + double lastH = 0; + double lastL = 0; + for (int i = 1; i < tries + 1; i++) + { + // + // Use Regular Method ... + if (!forceMethod2) + { + // + int iHIDX = FindSwing( + bar.symbol, + bar.period, + X_SWING_HIGH, + _loopback, + lastIDX // + ); + result = IsValidIndex(iHIDX); + if (!result) + { + break; + } + + // + XOHCL iHBar; + result = iHBar.Init( + bar.symbol, + bar.period, + iHIDX // + ); + if (!result) + { + break; + } + + // + double iH = iHBar.high; + bool isIHAccepted = + // + iH > 0 && + ( + // + lastH == 0 + ? true + : iH < lastH + // + ) + // + ; + if (isIHAccepted) + { + // + AddRef( + iHBar, + highSwingBars // + ); + + // + lastH = iH; + lastIDX = iHIDX; + } + + // + int iLIDX = FindSwing( + bar.symbol, + bar.period, + X_SWING_LOW, + _loopback, + lastIDX // + ); + result = IsValidIndex(iLIDX); + if (!result) + { + break; + } + + // + XOHCL iLBar; + result = iLBar.Init( + bar.symbol, + bar.period, + iLIDX // + ); + if (!result) + { + break; + } + + // + double iL = iLBar.low; + bool isILAccepted = + // + iL > 0 && + ( + // + lastL == 0 + ? true + : iL < lastL + // + ) + // + ; + if (isILAccepted) + { + // + AddRef( + iLBar, + lowSwingBars // + ); + + // + lastL = iL; + lastIDX = iLIDX; + } + } + // + // Use Other MEthod ... + else + { + // + int _length = i * _loopback; + int start = + // + i == 1 + ? 1 + : _length - _loopback + // + ; + + // + int iHIDX = iHighest( + bar.symbol, + bar.period, + MODE_HIGH, + _loopback, + start // + ); + result = IsValidIndex(iHIDX); + if (!result) + { + break; + } + + // + XOHCL iHBar; + result = iHBar.Init( + bar.symbol, + bar.period, + iHIDX // + ); + if (!result) + { + break; + } + + // + double iH = iHBar.high; + bool isIHAccepted = + // + iH > 0 && + ( + // + lastH == 0 + ? true + : iH < lastH + // + ) + // + ; + if (isIHAccepted) + { + // + AddRef( + iHBar, + highSwingBars // + ); + + // + lastH = iH; + lastIDX = iHIDX; + } + + // + int iLIDX = iLowest( + bar.symbol, + bar.period, + MODE_LOW, + _loopback, + start // + ); + result = IsValidIndex(iLIDX); + if (!result) + { + break; + } + + // + XOHCL iLBar; + result = iLBar.Init( + bar.symbol, + bar.period, + iLIDX // + ); + if (!result) + { + break; + } + + // + double iL = iLBar.low; + bool isILAccepted = + // + iL > 0 && + ( + // + lastL == 0 + ? true + : iL < lastL + // + ) + // + ; + if (isILAccepted) + { + // + AddRef( + iLBar, + lowSwingBars // + ); + + // + lastL = iL; + lastIDX = iLIDX; + } + } + } + + // + if (result) + { + // + result = + // + ArraySize(lowSwingBars) == tries && + ArraySize(highSwingBars) == tries + // + ; + } + + // + if (!result) + { + // + Clean(lowSwingBars); + Clean(highSwingBars); + } + + // + return result; + } + + // + // Find Bearish Trend ... + bool HasBearishTrend( + XOHCL &bar, + XOHCL &highSwingBars[], + XOHCL &lowSwingBars[], + bool forceMethod2 = false, + int _loopback = 3, + int tries = 3, + ENUM_X_PRICE type = X_PRICE_CLOSE // + ) + { + // + bool result = false; + + // + Clean(lowSwingBars); + Clean(highSwingBars); + + // + result = bar.IsValid(); + if (!result) + { + return result; + } + + // + double price = bar.GetPrice(type); + + // + int lastIDX = bar.Index(); + double lastH = 0; + double lastL = 0; + for (int i = 1; i < tries + 1; i++) + { + // + // Use Regular Method ... + if (!forceMethod2) + { + // + int iHIDX = FindSwing( + bar.symbol, + bar.period, + X_SWING_HIGH, + _loopback, + lastIDX // + ); + result = IsValidIndex(iHIDX); + if (!result) + { + break; + } + + // + XOHCL iHBar; + result = iHBar.Init( + bar.symbol, + bar.period, + iHIDX // + ); + if (!result) + { + break; + } + + // + double iH = iHBar.high; + bool isIHAccepted = + // + iH > 0 && + ( + // + lastH == 0 + ? true + : iH > lastH + // + ) + // + ; + if (isIHAccepted) + { + // + AddRef( + iHBar, + highSwingBars // + ); + + // + lastH = iH; + lastIDX = iHIDX; + } + + // + int iLIDX = FindSwing( + bar.symbol, + bar.period, + X_SWING_LOW, + _loopback, + lastIDX // + ); + result = IsValidIndex(iLIDX); + if (!result) + { + break; + } + + // + XOHCL iLBar; + result = iLBar.Init( + bar.symbol, + bar.period, + iLIDX // + ); + if (!result) + { + break; + } + + // + double iL = iLBar.low; + bool isILAccepted = + // + iL > 0 && + ( + // + lastL == 0 + ? true + : iL > lastL + // + ) + // + ; + if (isILAccepted) + { + // + AddRef( + iLBar, + lowSwingBars // + ); + + // + lastL = iL; + lastIDX = iLIDX; + } + } + // + // Use Other MEthod ... + else + { + // + int _length = i * _loopback; + int start = + // + i == 1 + ? 1 + : _length - _loopback + // + ; + + // + int iHIDX = iHighest( + bar.symbol, + bar.period, + MODE_HIGH, + _loopback, + start // + ); + result = IsValidIndex(iHIDX); + if (!result) + { + break; + } + + // + XOHCL iHBar; + result = iHBar.Init( + bar.symbol, + bar.period, + iHIDX // + ); + if (!result) + { + break; + } + + // + double iH = iHBar.high; + bool isIHAccepted = + // + iH > 0 && + ( + // + lastH == 0 + ? true + : iH > lastH + // + ) + // + ; + if (isIHAccepted) + { + // + AddRef( + iHBar, + highSwingBars // + ); + + // + lastH = iH; + lastIDX = iHIDX; + } + + // + int iLIDX = iLowest( + bar.symbol, + bar.period, + MODE_LOW, + _loopback, + start // + ); + result = IsValidIndex(iLIDX); + if (!result) + { + break; + } + + // + XOHCL iLBar; + result = iLBar.Init( + bar.symbol, + bar.period, + iLIDX // + ); + if (!result) + { + break; + } + + // + double iL = iLBar.low; + bool isILAccepted = + // + iL > 0 && + ( + // + lastL == 0 + ? true + : iL > lastL + // + ) + // + ; + if (isILAccepted) + { + // + AddRef( + iLBar, + lowSwingBars // + ); + + // + lastL = iL; + lastIDX = iLIDX; + } + } + } + + // + if (result) + { + // + result = + // + ArraySize(lowSwingBars) == tries && + ArraySize(highSwingBars) == tries + // + ; + } + + // + if (!result) + { + // + Clean(lowSwingBars); + Clean(highSwingBars); + } + + // + return result; + } + + // + // Order Blocks ... + + // + // Find Bullish Order Block ... + bool HasBullishOrderBlock( + XOHCL &bar, + XOHCL &orderBlock, + int _minimumSameBars = 4 // + ) + { + // + bool result = false; + + // + orderBlock.Clean(); + + // + result = bar.IsValid(); + if (!result) + { + return result; + } + + // + if (_minimumSameBars < 0) + { + _minimumSameBars = 4; + } + + // + XOHCL cBar; + int founded = 0; + int cIDX = bar.Index(); + bool isEnough = false; + while (!isEnough) + { + // + result = cBar.Init( + bar.symbol, + bar.period, + cIDX // + ); + if (!result) + { + break; + } + + // + result = cBar.IsBullish(); + if (!result && cBar.IsBearish()) + { + break; + } + + // + cIDX++; + founded++; + } + + // + // Here we have to check founded and if it's fill + // our requirements ... + // cIDX is Order Block Index ... + result = + // + cBar.IsValid() && + bar.high > cBar.high && + founded >= _minimumSameBars + // + ; + if (!result) + { + return result; + } + + // + result = orderBlock.Init( + bar.symbol, + bar.period, + cIDX // + ); + if (!result) + { + // + orderBlock.Clean(); + return result; + } + + // + return result; + } + + // + // Find Bearish Order Block ... + bool HasBearishOrderBlock( + XOHCL &bar, + XOHCL &orderBlock, + int _minimumSameBars = 4 // + ) + { + // + bool result = false; + + // + orderBlock.Clean(); + + // + result = bar.IsValid(); + if (!result) + { + return result; + } + + // + if (_minimumSameBars < 0) + { + _minimumSameBars = 4; + } + + // + XOHCL cBar; + int founded = 0; + int cIDX = bar.Index(); + bool isEnough = false; + while (!isEnough) + { + // + bool isInited = cBar.Init( + bar.symbol, + bar.period, + cIDX // + ); + + // + result = cBar.IsBearish(); + if (!result && cBar.IsBullish()) + { + break; + } + + // + cIDX++; + founded++; + } + + // + // Here we have to check founded and if it's fill + // our requirements ... + // cIDX is Order Block Index ... + result = + // + cBar.IsValid() && + bar.high < cBar.low && + founded >= _minimumSameBars + // + ; + if (!result) + { + return result; + } + + // + result = orderBlock.Init( + bar.symbol, + bar.period, + cIDX // + ); + if (!result) + { + // + orderBlock.Clean(); + return result; + } + + // + return result; + } + + // + protected: + // + + // + private: + // + + // + // Props ... + + // + // Actions ... + + // +}; + +// \ No newline at end of file diff --git a/BKPS/14031206/Classes/x-saherelm.x-cobject.class.ex5 b/BKPS/14031206/Classes/x-saherelm.x-cobject.class.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..20ff8b7a461ded6fec7ee3a8fccedc60af8da59b GIT binary patch literal 14036 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 literal 0 HcmV?d00001 diff --git a/BKPS/14031206/Classes/x-saherelm.x-cobject.class.mq5 b/BKPS/14031206/Classes/x-saherelm.x-cobject.class.mq5 new file mode 100644 index 0000000..e1752ee --- /dev/null +++ b/BKPS/14031206/Classes/x-saherelm.x-cobject.class.mq5 @@ -0,0 +1,3850 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 Class Library +// -------------------------------------- +// Name: XChartObjects +// Description: provides all require Chart Objects ... +// +// +// Maintainer: +// ------------ +// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) +// +////////////////////////////////////////////////////// +// +// Global Properties ... +#property library +#property copyright "Copyright 2023, SaherElm IT Center" +#property link "https://www.saherelm.ir" +#property version "1.00" +#property strict + +// +#include "../Libraries/x-saherelm.x-poi.lib.mq5" +#include "../Libraries/x-saherelm.x-trade.lib.mq5" + +// +#include +#include +#include +#include +#include +#include + +// +// Definitions ... + +enum ENUM_XCHARTOBJECTS +{ + // + // Global ... + X_ZONE_OBJ = 7860, + X_BOX_OBJ = 7861, + X_BAR_ARROW_OBJ = 7862, + // + X_SIGNAL_OBJ = 8860, + X_TREND_OBJ = 8861, + X_XPVPIVOT_OBJ = 8862, + X_OHCL_OBJ = 8863, + X_RR_OBJ = 8864, + // + // Structured ... + X_TRADE_DAY_OBJ = 9860, + X_MARKET_SESSION_OBJ = 9861, + X_SWING_HIGH_OBJ = 9862, + X_SWING_LOW_OBJ = 9863, + X_BULLISH_MOMENTUM_BAR_OBJ = 9864, + X_BEARISH_MOMENTUM_BAR_OBJ = 9865, + X_BULLISH_REJECTION_BAR_OBJ = 9866, + X_BEARISH_REJECTION_BAR_OBJ = 9867, + X_SUPPORT_ZONE_OBJ = 9868, + X_RESISTANCE_ZONE_OBJ = 9869, + X_SUPPLY_ZONE_OBJ = 9870, + X_DEMAND_ZONE_OBJ = 9871, + X_BULLISH_ORDERBLOCK_OBJ = 9872, + X_BEARISH_ORDERBLOCK_OBJ = 9873, + X_BULLISH_FVG_OBJ = 9874, + X_BEARISH_FVG_OBJ = 9875, + X_TICK_ZONE_OBJ = 9876, + X_TICKS_ZONE_OBJ = 9877, + X_CONSOLIDATION_ZONE_OBJ = 9878, +}; + +enum ENUM_X_CHART_IDS +{ + X_TO, + X_FROM, + X_UPPER, + X_LOWER, + X_ENTRY, + X_TARGET, + X_SL, + X_TP, + X_BAR_H_SHW, + X_BAR_BDY, + X_BAR_L_SHW, +}; + +string ToString(ENUM_X_CHART_IDS value) +{ + // + string result = NULL; + + // + switch (value) + { + // + case X_TO: + result = "TO"; + break; + + // + case X_FROM: + result = "FROM"; + break; + + // + case X_UPPER: + result = "UPPER"; + break; + + // + case X_LOWER: + result = "LOWER"; + break; + + // + case X_ENTRY: + result = "ENTRY"; + break; + + // + case X_TARGET: + result = "TARGET"; + break; + + // + case X_SL: + result = "SL"; + break; + + // + case X_TP: + result = "TP"; + break; + + // + case X_BAR_H_SHW: + result = "HSHW"; + break; + + // + case X_BAR_BDY: + result = "BODY"; + break; + + // + case X_BAR_L_SHW: + result = "LSHW"; + break; + + // + } + + // + return result; +} + +// +// Implementation ... + +// +// Global Chart Objects ... + +// +// Bas Chart Object ... +class XCBaseObject : public CChartObject +{ + // + public: + // + + // + // Getter(s) / Setter(s) ... + + /** + * Get Object Specified Name ... + * + * @return ( string ) + */ + string ObjName() + { + return mObjName; + } + + /** + * Set Object Specified Name ... + * + * @param value: String ... + */ + void ObjName(string value) + { + mObjName = value; + } + + // + private: + // + + // + // Props ... + string mObjName; // Object Specified Name ... + + // +}; + +class XCBarArrowObject : public XCBaseObject +{ + // + public: + // + + /** + * Creator ... + * + * @param chart_id: Long, Specified Chart ID ... + * @param name: String, Specified Object ID ... + * @param window: Integer, Specified Chart Window ID ... + * @param swing: XCSwing instance ... + * + * @return ( bool ) + */ + bool CreateByBar( + long chart_id, + string name, + int window, + int arrow, + XOHCL &bar, + ENUM_X_PRICE priceType // + ) + { + // + bool result = false; + + // + result = + // + bar.IsValid() && + IsValid(name) + // + ; + if (!result) + { + return result; + } + + // + datetime time = bar.time; + double price = bar.GetPrice(priceType); + + // + result = mArrow.Create( + chart_id, + name, + window, + time, + price, + (char)arrow // + ); + + // + if (result) + { + ObjName(name); + } + + // + return result; + } + + // + // Virtual ... + + // + // Setter(s) ... + + /** + * Set Arrow Anchor ... + * + * @param value: ENUM_ARROW_ANCHOR member ... + */ + void ArrowAnchor(ENUM_ARROW_ANCHOR value) + { + mArrow.Anchor(value); + } + + /** + * Set Arrow Color ... + * + * @param value: Color ... + */ + void ArrowColor(color value) + { + mArrow.Color(value); + } + + /** + * Set Arrow Width ... + * + * @param value: Integer ... + */ + void ArrowWidth(int value) + { + mArrow.Width(value); + } + + // + private: + // + CChartObjectArrow mArrow; + + // +}; + +// +// Swing ... +class XCSwingObject : public XCBarArrowObject +{ + // + public: + // + + /** + * Creator ... + * + * @param chart_id: Long, Specified Chart ID ... + * @param window: Integer, Specified Chart Window ID ... + * @param swing: XCSwing instance ... + * @param prefix: String ... + * + * @return ( bool ) + */ + bool CreateBySwing( + long chart_id, + int window, + int arrow, + XCSwing &swing, + string prefix = NULL // + ) + { + // + bool result = false; + + // + result = + // + swing.IsValid() + // + ; + if (!result) + { + return result; + } + + // + string name = swing.GetTag(); + if (IsValid(prefix)) + { + name = prefix + "_" + name; + } + + // + XOHCL bar; + result = swing.FillBar(bar); + if (!result) + { + return result; + } + + // + ENUM_X_PRICE price = swing.IsSwingHigh() + ? X_PRICE_HIGH + : X_PRICE_LOW; + + // + result = CreateByBar( + chart_id, + name, + window, + arrow, + bar, + price // + ); + + // + if (result) + { + ObjName(name); + } + + // + return result; + } +}; + +// +// Swing High ... +class XCSwingHighObject : public XCSwingObject +{ + // + public: + // + + /** + * Creator ... + * + * @param chart_id: Long, Specified Chart ID ... + * @param window: Integer, Specified Chart Window ID ... + * @param arrow: Integer, Specified Arrow Code ... + * @param swing: XCSwing instance ... + * @param prefix: String ... + * + * @return ( bool ) + */ + bool Create( + long chart_id, + int window, + int arrow, + XCSwing &swing, + string prefix = NULL // + ) + { + // + bool result = false; + + // + result = swing.IsValid() && + swing.IsSwingHigh(); + if (!result) + { + return result; + } + + // + result = CreateBySwing( + chart_id, + window, + arrow, + swing, + prefix // + ); + + // + return result; + } + + /** + * Retrieve Object Type ... + * + * @return ( ENUM_XCHARTOBJECTS ) + */ + virtual ENUM_XCHARTOBJECTS Type() + { + return X_SWING_HIGH_OBJ; + } + + // +}; + +// +// Swing Low ... +class XCSwingLowObject : public XCSwingObject +{ + // + public: + // + + /** + * Creator ... + * + * @param chart_id: Long, Specified Chart ID ... + * @param window: Integer, Specified Chart Window ID ... + * @param arrow: Integer, Specified Arrow Code ... + * @param swing: XCSwing instance ... + * @param prefix: String ... + * + * @return ( bool ) + */ + bool Create( + long chart_id, + int window, + int arrow, + XCSwing &swing, + string prefix = NULL // + ) + { + // + bool result = false; + + // + result = swing.IsValid() && + swing.IsSwingLow(); + if (!result) + { + return result; + } + + // + result = CreateBySwing( + chart_id, + window, + arrow, + swing, + prefix // + ); + + // + return result; + } + + /** + * Retrieve Object Type ... + * + * @return ( ENUM_XCHARTOBJECTS ) + */ + virtual ENUM_XCHARTOBJECTS Type() + { + return X_SWING_LOW_OBJ; + } + + // +}; + +// +// Momentum ... +class XCMomentumBarObject : public XCBarArrowObject +{ + // + public: + // + + /** + * Creator ... + * + * @param chart_id: Long, Specified Chart ID ... + * @param window: Integer, Specified Chart Window ID ... + * @param momentumBar: XCMomentumBar instance ... + * @param prefix: String ... + * + * @return ( bool ) + */ + bool CreateByMomentum( + long chart_id, + int window, + int arrow, + XCMomentumBar &momentumBar, + string prefix = NULL // + ) + { + // + bool result = false; + + // + result = + // + momentumBar.IsValid() + // + ; + if (!result) + { + return result; + } + + // + string name = momentumBar.GetTag(); + if (IsValid(prefix)) + { + name = prefix + "_" + name; + } + + // + XOHCL bar; + result = momentumBar.FillBar(bar); + if (!result) + { + return result; + } + + // + ENUM_X_PRICE price = momentumBar.IsBullish() + ? X_PRICE_LOW + : X_PRICE_HIGH; + + // + result = CreateByBar( + chart_id, + name, + window, + arrow, + bar, + price // + ); + + // + if (result) + { + ObjName(name); + } + + // + return result; + } +}; + +// +// Bullish Momentum Bar ... +class XCBullishMomentumBarObject : public XCMomentumBarObject +{ + // + public: + // + + /** + * Creator ... + * + * @param chart_id: Long, Specified Chart ID ... + * @param window: Integer, Specified Chart Window ID ... + * @param arrow: Integer, Specified Arrow Code ... + * @param momentumBar: XCMomentumBar instance ... + * @param prefix: String ... + * + * @return ( bool ) + */ + bool Create( + long chart_id, + int window, + int arrow, + XCMomentumBar &momentumBar, + string prefix = NULL // + ) + { + // + bool result = false; + + // + result = momentumBar.IsValid() && + momentumBar.IsBullish(); + if (!result) + { + return result; + } + + // + result = CreateByMomentum( + chart_id, + window, + arrow, + momentumBar, + prefix // + ); + + // + return result; + } + + /** + * Retrieve Object Type ... + * + * @return ( ENUM_XCHARTOBJECTS ) + */ + virtual ENUM_XCHARTOBJECTS Type() + { + return X_BULLISH_MOMENTUM_BAR_OBJ; + } + + // +}; + +// +// Bearish Momentum Bar ... +class XCBearishMomentumBarObject : public XCMomentumBarObject +{ + // + public: + // + + /** + * Creator ... + * + * @param chart_id: Long, Specified Chart ID ... + * @param window: Integer, Specified Chart Window ID ... + * @param arrow: Integer, Specified Arrow Code ... + * @param momentumBar: XCMomentumBar instance ... + * @param prefix: String ... + * + * @return ( bool ) + */ + bool Create( + long chart_id, + int window, + int arrow, + XCMomentumBar &momentumBar, + string prefix = NULL // + ) + { + // + bool result = false; + + // + result = momentumBar.IsValid() && + momentumBar.IsBearish(); + if (!result) + { + return result; + } + + // + result = CreateByMomentum( + chart_id, + window, + arrow, + momentumBar, + prefix // + ); + + // + return result; + } + + /** + * Retrieve Object Type ... + * + * @return ( ENUM_XCHARTOBJECTS ) + */ + virtual ENUM_XCHARTOBJECTS Type() + { + return X_BEARISH_MOMENTUM_BAR_OBJ; + } + + // +}; + +// +// Rejection ... +class XCRejectionBarObject : public XCBarArrowObject +{ + // + public: + // + + /** + * Creator ... + * + * @param chart_id: Long, Specified Chart ID ... + * @param window: Integer, Specified Chart Window ID ... + * @param rejectionBar: XCRejectionBar instance ... + * @param prefix: String ... + * + * @return ( bool ) + */ + bool CreateByRejection( + long chart_id, + int window, + int arrow, + XCRejectionBar &rejectionBar, + string prefix = NULL // + ) + { + // + bool result = false; + + // + result = + // + rejectionBar.IsValid() + // + ; + if (!result) + { + return result; + } + + // + string name = rejectionBar.GetTag(); + if (IsValid(prefix)) + { + name = prefix + "_" + name; + } + + // + XOHCL bar; + result = rejectionBar.FillBar(bar); + if (!result) + { + return result; + } + + // + ENUM_X_PRICE price = rejectionBar.IsBullish() + ? X_PRICE_LOW + : X_PRICE_HIGH; + + // + result = CreateByBar( + chart_id, + name, + window, + arrow, + bar, + price // + ); + + // + if (result) + { + ObjName(name); + } + + // + return result; + } +}; + +// +// Bullish Rejection Bar ... +class XCBullishRejectionBarObject : public XCRejectionBarObject +{ + // + public: + // + + /** + * Creator ... + * + * @param chart_id: Long, Specified Chart ID ... + * @param window: Integer, Specified Chart Window ID ... + * @param arrow: Integer, Specified Arrow Code ... + * @param rejectionBar: XCRejectionBar instance ... + * @param prefix: String ... + * + * @return ( bool ) + */ + bool Create( + long chart_id, + int window, + int arrow, + XCRejectionBar &rejectionBar, + string prefix = NULL // + ) + { + // + bool result = false; + + // + result = rejectionBar.IsValid() && + rejectionBar.IsBullish(); + if (!result) + { + return result; + } + + // + result = CreateByRejection( + chart_id, + window, + arrow, + rejectionBar, + prefix // + ); + + // + return result; + } + + /** + * Retrieve Object Type ... + * + * @return ( ENUM_XCHARTOBJECTS ) + */ + virtual ENUM_XCHARTOBJECTS Type() + { + return X_BULLISH_REJECTION_BAR_OBJ; + } + + // +}; + +// +// Bearish Rejection Bar ... +class XCBearishRejectionBarObject : public XCRejectionBarObject +{ + // + public: + // + + /** + * Creator ... + * + * @param chart_id: Long, Specified Chart ID ... + * @param window: Integer, Specified Chart Window ID ... + * @param arrow: Integer, Specified Arrow Code ... + * @param rejectionBar: XCRejectionBar instance ... + * @param prefix: String ... + * + * @return ( bool ) + */ + bool Create( + long chart_id, + int window, + int arrow, + XCRejectionBar &rejectionBar, + string prefix = NULL // + ) + { + // + bool result = false; + + // + result = rejectionBar.IsValid() && + rejectionBar.IsBearish(); + if (!result) + { + return result; + } + + // + result = CreateByRejection( + chart_id, + window, + arrow, + rejectionBar, + prefix // + ); + + // + return result; + } + + /** + * Retrieve Object Type ... + * + * @return ( ENUM_XCHARTOBJECTS ) + */ + virtual ENUM_XCHARTOBJECTS Type() + { + return X_BEARISH_REJECTION_BAR_OBJ; + } + + // +}; + +// +// XCZoneObject ... +class XCZoneObject : public XCBaseObject +{ + // + public: + // + + /** + * Creator ... + * + * @param chart_id: Long, Specified Chart ID ... + * @param name: String, Specified Object Identifier on Chart ... + * @param window: Integer, Specified Chart Window ID ... + * @param zone: XCZone instance ... + * @param prefix: String ... + * + * @return ( bool ) + */ + bool CreateByZone( + long chart_id, + string name, + int window, + XCZone &zone, + string prefix = NULL // + ) + { + // + bool result = false; + + // + bool isValidFrom = zone.IsValidFrom(); + bool isValidBoundary = zone.IsValidBoundary(); + + // + result = + // + IsValid(name) && + isValidFrom && + isValidBoundary + // + ; + if (!result) + { + return result; + } + + // + if (IsValid(prefix)) + { + name = prefix + "_" + name; + } + + // + datetime from = zone.From(); + datetime to = NormalizeTime(zone.To()); + + // + double upper = zone.Upper(); + double lower = zone.Lower(); + + // + result = mRect.Create( + chart_id, + name, + window, + from, + upper, + to, + lower // + ); + + // + if (result) + { + ObjName(name); + } + + // + return result; + } + + // + // Virtual ... + + /** + * Retrieve Object Type ... + * + * @return ( ENUM_XCHARTOBJECTS ) + */ + virtual ENUM_XCHARTOBJECTS Type() + { + return X_ZONE_OBJ; + } + + // + // Setter(s) ... + + /** + * Set Zone Width ... + * + * @param value: Integer ... + */ + void ZoneWidth(int value) + { + // + if (value < 1) + { + value = 1; + } + + // + mRect.Width(value); + } + + /** + * Set Zone Color ... + * + * @param value: Color ... + */ + void ZoneColor(color value) + { + mRect.Color(value); + } + + /** + * Set Zone Style ... + * + * @param value: ENUM_LINE_STYLE member ... + */ + void ZoneStyle(ENUM_LINE_STYLE value) + { + mRect.Style(value); + } + + /** + * Set Zone Fill ... + * + * @param value: Boolean ... + */ + void ZoneFill(bool value) + { + mRect.Fill(value); + } + + // + private: + // + CChartObjectRectangle mRect; + + // +}; + +// +// Support Zone ... +class XCSupportZoneObject : public XCZoneObject +{ + // + public: + // + + /** + * Creator ... + * + * @param chart_id: Long, Specified Chart ID ... + * @param window: Integer, Specified Chart Window ID ... + * @param zone: XCSupportZone instance ... + * @param prefix: String ... + * + * @return ( bool ) + */ + bool Create( + long chart_id, + int window, + XCSupportZone &zone, + string prefix = NULL // + ) + { + // + bool result = false; + + // + result = zone.IsValid(); + if (!result) + { + return result; + } + + // + string name = zone.GetTag(); + + // + result = CreateByZone( + chart_id, + name, + window, + zone, + prefix // + ); + + // + return result; + } + + // + // Virtual ... + + /** + * Retrieve Object Type ... + * + * @return ( ENUM_XCHARTOBJECTS ) + */ + virtual ENUM_XCHARTOBJECTS Type() + { + return X_SUPPORT_ZONE_OBJ; + } +}; + +// +// Resistance Zone ... +class XCResistanceZoneObject : public XCZoneObject +{ + // + public: + // + + /** + * Creator ... + * + * @param chart_id: Long, Specified Chart ID ... + * @param window: Integer, Specified Chart Window ID ... + * @param zone: XCResistanceZone instance ... + * @param prefix: String ... + * + * @return ( bool ) + */ + bool Create( + long chart_id, + int window, + XCResistanceZone &zone, + string prefix = NULL // + ) + { + // + bool result = false; + + // + result = zone.IsValid(); + if (!result) + { + return result; + } + + // + string name = zone.GetTag(); + + // + result = CreateByZone( + chart_id, + name, + window, + zone, + prefix // + ); + + // + return result; + } + + // + // Virtual ... + + /** + * Retrieve Object Type ... + * + * @return ( ENUM_XCHARTOBJECTS ) + */ + virtual ENUM_XCHARTOBJECTS Type() + { + return X_RESISTANCE_ZONE_OBJ; + } +}; + +// +// Supply Zone ... +class XCSupplyZoneObject : public XCZoneObject +{ + // + public: + // + + /** + * Creator ... + * + * @param chart_id: Long, Specified Chart ID ... + * @param window: Integer, Specified Chart Window ID ... + * @param zone: XCSupplyZone instance ... + * @param prefix: String ... + * + * @return ( bool ) + */ + bool Create( + long chart_id, + int window, + XCSupplyZone &zone, + string prefix = NULL // + ) + { + // + bool result = false; + + // + result = zone.IsValid(); + if (!result) + { + return result; + } + + // + string name = zone.GetTag(); + + // + result = CreateByZone( + chart_id, + name, + window, + zone, + prefix // + ); + + // + return result; + } + + // + // Virtual ... + + /** + * Retrieve Object Type ... + * + * @return ( ENUM_XCHARTOBJECTS ) + */ + virtual ENUM_XCHARTOBJECTS Type() + { + return X_SUPPLY_ZONE_OBJ; + } +}; + +// +// Demand Zone ... +class XCDemandZoneObject : public XCZoneObject +{ + // + public: + // + + /** + * Creator ... + * + * @param chart_id: Long, Specified Chart ID ... + * @param window: Integer, Specified Chart Window ID ... + * @param zone: XCDemandZone instance ... + * @param prefix: String ... + * + * @return ( bool ) + */ + bool Create( + long chart_id, + int window, + XCDemandZone &zone, + string prefix = NULL // + ) + { + // + bool result = false; + + // + result = zone.IsValid(); + if (!result) + { + return result; + } + + // + string name = zone.GetTag(); + + // + result = CreateByZone( + chart_id, + name, + window, + zone, + prefix // + ); + + // + return result; + } + + // + // Virtual ... + + /** + * Retrieve Object Type ... + * + * @return ( ENUM_XCHARTOBJECTS ) + */ + virtual ENUM_XCHARTOBJECTS Type() + { + return X_DEMAND_ZONE_OBJ; + } +}; + +// +// Bullish Order Block ... +class XCBullishOrderBlockObject : public XCZoneObject +{ + // + public: + // + + /** + * Creator ... + * + * @param chart_id: Long, Specified Chart ID ... + * @param window: Integer, Specified Chart Window ID ... + * @param zone: XCOrderBlock instance ... + * @param prefix: String ... + * + * @return ( bool ) + */ + bool Create( + long chart_id, + int window, + XCOrderBlock &zone, + string prefix = NULL // + ) + { + // + bool result = false; + + // + result = zone.IsValid() && + zone.IsBullish(); + if (!result) + { + return result; + } + + // + string name = zone.GetTag(); + + // + result = CreateByZone( + chart_id, + name, + window, + zone, + prefix // + ); + + // + return result; + } + + // + // Virtual ... + + /** + * Retrieve Object Type ... + * + * @return ( ENUM_XCHARTOBJECTS ) + */ + virtual ENUM_XCHARTOBJECTS Type() + { + return X_BULLISH_ORDERBLOCK_OBJ; + } +}; + +// +// Bearish Order Block ... +class XCBearishOrderBlockObject : public XCZoneObject +{ + // + public: + // + + /** + * Creator ... + * + * @param chart_id: Long, Specified Chart ID ... + * @param window: Integer, Specified Chart Window ID ... + * @param zone: XCOrderBlock instance ... + * @param prefix: String ... + * + * @return ( bool ) + */ + bool Create( + long chart_id, + int window, + XCOrderBlock &zone, + string prefix = NULL // + ) + { + // + bool result = false; + + // + result = zone.IsValid() && + zone.IsBearish(); + if (!result) + { + return result; + } + + // + string name = zone.GetTag(); + + // + result = CreateByZone( + chart_id, + name, + window, + zone, + prefix // + ); + + // + return result; + } + + // + // Virtual ... + + /** + * Retrieve Object Type ... + * + * @return ( ENUM_XCHARTOBJECTS ) + */ + virtual ENUM_XCHARTOBJECTS Type() + { + return X_BULLISH_ORDERBLOCK_OBJ; + } +}; + +// +// Bullish Fair Value Gaps ... +class XCBullishFairValueGapObject : public XCZoneObject +{ + // + public: + // + + /** + * Creator ... + * + * @param chart_id: Long, Specified Chart ID ... + * @param window: Integer, Specified Chart Window ID ... + * @param zone: XCOrderBlock instance ... + * @param prefix: String ... + * + * @return ( bool ) + */ + bool Create( + long chart_id, + int window, + XCFVG &zone, + string prefix = NULL // + ) + { + // + bool result = false; + + // + result = zone.IsValid() && + zone.IsBullish(); + if (!result) + { + return result; + } + + // + string name = zone.GetTag(); + + // + result = CreateByZone( + chart_id, + name, + window, + zone, + prefix // + ); + + // + return result; + } + + // + // Virtual ... + + /** + * Retrieve Object Type ... + * + * @return ( ENUM_XCHARTOBJECTS ) + */ + virtual ENUM_XCHARTOBJECTS Type() + { + return X_BULLISH_FVG_OBJ; + } +}; + +class XCConsolidationZoneObject : public XCBaseObject +{ + // + public: + // + + /** + * Creator ... + * + * @param chart_id: Long, Specified Chart ID ... + * @param window: Integer, Specified Chart Window ID ... + * @param zone: XConsolidationZone instance ... + * @param prefix: String ... + * + * @return ( bool ) + */ + bool Create( + long chart_id, + int window, + XConsolidationZone &zone, + string prefix = NULL // + ) + { + // + bool result = false; + + // + result = zone.IsValid(); + if (!result) + { + return result; + } + + // + string name = zone.GetTag(); + if (IsValid(prefix)) + { + name = prefix + "_" + name; + } + + // + result = mRect.Create( + chart_id, + name, + window, + zone.From(), + zone.upper, + TimeCurrent(), + zone.lower // + ); + + // + if (result) + { + ObjName(name); + } + + // + return result; + } + + // + // Virtual ... + + /** + * Retrieve Object Type ... + * + * @return ( ENUM_XCHARTOBJECTS ) + */ + virtual ENUM_XCHARTOBJECTS Type() + { + return X_CONSOLIDATION_ZONE_OBJ; + } + + // + // Setter(s) ... + + /** + * Set Zone Width ... + * + * @param value: Integer ... + */ + void ZoneWidth(int value) + { + // + if (value < 1) + { + value = 1; + } + + // + mRect.Width(value); + } + + /** + * Set Zone Color ... + * + * @param value: Color ... + */ + void ZoneColor(color value) + { + mRect.Color(value); + } + + /** + * Set Zone Style ... + * + * @param value: ENUM_LINE_STYLE member ... + */ + void ZoneStyle(ENUM_LINE_STYLE value) + { + mRect.Style(value); + } + + /** + * Set Zone Fill ... + * + * @param value: Boolean ... + */ + void ZoneFill(bool value) + { + mRect.Fill(value); + } + + // + private: + // + CChartObjectRectangle mRect; + + // +}; + +// +// Bearish Fair Value Gaps ... +class XCBearishFairValueGapObject : public XCZoneObject +{ + // + public: + // + + /** + * Creator ... + * + * @param chart_id: Long, Specified Chart ID ... + * @param window: Integer, Specified Chart Window ID ... + * @param zone: XCOrderBlock instance ... + * @param prefix: String ... + * + * @return ( bool ) + */ + bool Create( + long chart_id, + int window, + XCFVG &zone, + string prefix = NULL // + ) + { + // + bool result = false; + + // + result = zone.IsValid() && + zone.IsBearish(); + if (!result) + { + return result; + } + + // + string name = zone.GetTag(); + + // + result = CreateByZone( + chart_id, + name, + window, + zone, + prefix // + ); + + // + return result; + } + + // + // Virtual ... + + /** + * Retrieve Object Type ... + * + * @return ( ENUM_XCHARTOBJECTS ) + */ + virtual ENUM_XCHARTOBJECTS Type() + { + return X_BEARISH_FVG_OBJ; + } +}; + +// +// Signal ... +class XCSignalObject : public XCBaseObject +{ + // + public: + // + + // + // Constructor ... + void XCSignalObject() + { + } + + // + // Deconstructor ... + void ~XCSignalObject() + { + } + + /** + * Create a Signal Object on Chart ... + * + * @param chart_id: Long ... + * @param name: String ... + * @param window: Integer ... + * @param signal: XSignal instance ... + * + * @return ( bool ) + */ + bool Create( + long chart_id, + const int window, + XSignal &signal, + string prefix = NULL // + ) + { + // + bool result = false; + + // + result = signal.IsValid(); + if (!result) + { + return result; + } + + // + string name = signal.GetTag(); + if (IsValid(prefix)) + { + name = prefix + "_" + name; + } + string nameMD5 = ToMD5(name); + + // + int delay = (PeriodSeconds(signal.period) * 2); + datetime time1 = (datetime)((int)signal.time - delay); + datetime time2 = (datetime)((int)signal.time + delay); + + // + // TP ... + string tpName = ToString(X_TP) + "_" + nameMD5; + result = mTPTrend.Create( + chart_id, + tpName, + window, + time1, + signal.tp, + time2, + signal.tp // + ); + if (!result) + { + return result; + } + + // + // SL ... + string slName = ToString(X_SL) + "_" + nameMD5; + result = mSLTrend.Create( + chart_id, + slName, + window, + time1, + signal.sl, + time2, + signal.sl // + ); + if (!result) + { + // + mTPTrend.Delete(); + return result; + } + + // + // TARGET ... + if (signal.target > 0) + { + // + string targetName = ToString(X_TARGET) + "_" + nameMD5; + result = mTargetTrend.Create( + chart_id, + targetName, + window, + time1, + signal.target, + time2, + signal.target // + ); + if (!result) + { + // + mTPTrend.Delete(); + mSLTrend.Delete(); + return result; + } + } + + // + // ENTRY ... + string entrName = ToString(X_ENTRY) + "_" + nameMD5; + result = mEntryTrend.Create( + chart_id, + entrName, + window, + time1, + signal.entry, + time2, + signal.entry // + ); + if (!result) + { + // + mTPTrend.Delete(); + mSLTrend.Delete(); + mTargetTrend.Delete(); + return result; + } + + // + // Set Object Name ... + ObjName(name); + + // + return result; + } + + // + // Setter(s) ... + + // + // TP ... + + /** + * Set TP Width ... + * + * @param value: Integer ... + */ + void TPWidth(int value) + { + // + if (value < 1) + { + value = 1; + } + + // + mTPTrend.Width(value); + } + + /** + * Set TP Color ... + * + * @param value: Color ... + */ + void TPColor(color value) + { + mTPTrend.Color(value); + } + + /** + * Set TP Style ... + * + * @param value: ENUM_LINE_STYLE ... + */ + void TPStyle(ENUM_LINE_STYLE value) + { + mTPTrend.Style(value); + } + + // + // SL ... + + /** + * Set SL Width ... + * + * @param value: Integer ... + */ + void SLWidth(int value) + { + // + if (value < 1) + { + value = 1; + } + + // + mSLTrend.Width(value); + } + + /** + * Set SL Color ... + * + * @param value: Color ... + */ + void SLColor(color value) + { + mSLTrend.Color(value); + } + + /** + * Set SL Style ... + * + * @param value: ENUM_LINE_STYLE ... + */ + void SLStyle(ENUM_LINE_STYLE value) + { + mSLTrend.Style(value); + } + + // + // TARGET ... + + /** + * Set Target Width ... + * + * @param value: Integer ... + */ + void TargetWidth(int value) + { + // + if (value < 1) + { + value = 1; + } + + // + mTargetTrend.Width(value); + } + + /** + * Set Target Color ... + * + * @param value: Color ... + */ + void TargetColor(color value) + { + mTargetTrend.Color(value); + } + + /** + * Set Target Style ... + * + * @param value: ENUM_LINE_STYLE ... + */ + void TargetStyle(ENUM_LINE_STYLE value) + { + mTargetTrend.Style(value); + } + + // + // ENTRY ... + + /** + * Set Entry Width ... + * + * @param value: Integer ... + */ + void EntryWidth(int value) + { + // + if (value < 1) + { + value = 1; + } + + // + mEntryTrend.Width(value); + } + + /** + * Set Entry Color ... + * + * @param value: Color ... + */ + void EntryColor(color value) + { + mEntryTrend.Color(value); + } + + /** + * Set Entry Style ... + * + * @param value: ENUM_LINE_STYLE ... + */ + void EntryStyle(ENUM_LINE_STYLE value) + { + mEntryTrend.Style(value); + } + + /** + * Retrieve Object Type ... + * + * @return ( ENUM_XCHARTOBJECTS ) + */ + virtual ENUM_XCHARTOBJECTS Type() + { + return X_SIGNAL_OBJ; + } + + // + private: + // + + // + CChartObjectTrend mTPTrend; + CChartObjectTrend mSLTrend; + CChartObjectTrend mEntryTrend; + CChartObjectTrend mTargetTrend; +}; + +class XCOHCLObject : public XCBaseObject +{ + // + public: + // + + /** + * Creator ... + * + * @param chart_id: Long, Specified Chart ID ... + * @param window: Integer, Specified Chart Window ID ... + * @param pivot: XPVPivot instance ... + * @param prefix: String ... + * + * @return ( bool ) + */ + bool Create( + long chart_id, + int window, + XOHCL &bar, + datetime to, + string prefix = NULL // + ) + { + // + bool result = false; + + // + result = bar.IsValid() && + IsValid(to); + if (!result) + { + return result; + } + + // + string name = bar.GetTag(); + if (IsValid(prefix)) + { + name = prefix + "_" + name; + } + string nameMD5 = ToMD5(name); + + // + // High Shadow ... + string hShadowName = ToString(X_BAR_H_SHW) + "_" + nameMD5; + + // + result = mHighShadowRect.Create( + chart_id, + hShadowName, + window, + bar.time, + bar.high, + to, + bar.GetUp() // + ); + if (!result) + { + return result; + } + + // + // Body ... + string bodyName = ToString(X_BAR_BDY) + "_" + nameMD5; + + // + result = mBodyRect.Create( + chart_id, + bodyName, + window, + bar.time, + bar.GetUp(), + to, + bar.GetDown() // + ); + if (!result) + { + // + mHighShadowRect.Delete(); + mHighShadowRect.Detach(); + return result; + } + + // + // Low Shadow ... + string lShadowName = ToString(X_BAR_L_SHW) + "_" + nameMD5; + + // + result = mLowShadowRect.Create( + chart_id, + lShadowName, + window, + bar.time, + bar.GetDown(), + to, + bar.low // + ); + if (!result) + { + // + mBodyRect.Delete(); + mBodyRect.Detach(); + mHighShadowRect.Delete(); + mHighShadowRect.Detach(); + return result; + } + + // + if (result) + { + ObjName(name); + } + + // + return result; + } + + // + // Getter(s) / Setter(s) ... + + /** + * Set High Shadow Width ... + * + * @param value: Integer ... + */ + void HighShadowWidth(int value) + { + // + if (value < 1) + { + value = 1; + } + + // + mHighShadowRect.Width(value); + } + + /** + * Set High Shadow Color ... + * + * @param value: Color ... + */ + void HighShadowColor(color value) + { + mHighShadowRect.Color(value); + } + + /** + * Set High Shadow Style ... + * + * @param value: ENUM_LINE_STYLE member ... + */ + void HighShadowStyle(ENUM_LINE_STYLE value) + { + mHighShadowRect.Style(value); + } + + /** + * Set High Shadow Fill ... + * + * @param value: Boolean ... + */ + void HighShadowFill(bool value) + { + mHighShadowRect.Fill(value); + } + + /** + * Set Body Width ... + * + * @param value: Integer ... + */ + void BodyWidth(int value) + { + // + if (value < 1) + { + value = 1; + } + + // + mBodyRect.Width(value); + } + + /** + * Set Body Color ... + * + * @param value: Color ... + */ + void BodyColor(color value) + { + mBodyRect.Color(value); + } + + /** + * Set Body Style ... + * + * @param value: ENUM_LINE_STYLE member ... + */ + void BodyStyle(ENUM_LINE_STYLE value) + { + mBodyRect.Style(value); + } + + /** + * Set Body Fill ... + * + * @param value: Boolean ... + */ + void BodyFill(bool value) + { + mBodyRect.Fill(value); + } + + /** + * Set Low Shadow Width ... + * + * @param value: Integer ... + */ + void LowShadowWidth(int value) + { + // + if (value < 1) + { + value = 1; + } + + // + mLowShadowRect.Width(value); + } + + /** + * Set Low Shadow Color ... + * + * @param value: Color ... + */ + void LowShadowColor(color value) + { + mLowShadowRect.Color(value); + } + + /** + * Set Low Shadow Style ... + * + * @param value: ENUM_LINE_STYLE member ... + */ + void LowShadowStyle(ENUM_LINE_STYLE value) + { + mLowShadowRect.Style(value); + } + + /** + * Set Low Shadow Fill ... + * + * @param value: Boolean ... + */ + void LowShadowFill(bool value) + { + mLowShadowRect.Fill(value); + } + + void BarSpes( + int width = 1, + color clr = clrNONE, + ENUM_LINE_STYLE style = STYLE_SOLID, + bool fill = false // + ) + { + // + BodyWidth(width); + LowShadowWidth(width); + HighShadowWidth(width); + + // + BodyColor(clr); + LowShadowColor(clr); + HighShadowColor(clr); + + // + BodyStyle(style); + LowShadowStyle(style); + HighShadowStyle(style); + + // + BodyFill(fill); + LowShadowFill(fill); + HighShadowFill(fill); + } + + // + // Virtual ... + + /** + * Retrieve Object Type ... + * + * @return ( ENUM_XCHARTOBJECTS ) + */ + virtual ENUM_XCHARTOBJECTS Type() + { + return X_OHCL_OBJ; + } + + // + private: + // + + // + // Props ... + CChartObjectRectangle mHighShadowRect; + CChartObjectRectangle mBodyRect; + CChartObjectRectangle mLowShadowRect; +}; + +class XCBoxObject : public XCBaseObject +{ + // + public: + // + + /** + * Creator ... + * + * @param chart_id: Long, Specified Chart ID ... + * @param window: Integer, Specified Chart Window ID ... + * @param pivot: XPVPivot instance ... + * @param prefix: String ... + * + * @return ( bool ) + */ + bool Create( + long chart_id, + int window, + string name, + double upper, + double lower, + datetime from, + datetime to, + string prefix = NULL // + ) + { + // + bool result = false; + + // + result = + upper > 0 && + lower > 0 && + to > from && + IsValid(to) && + IsValid(name) && + IsValid(from) && + upper > lower; + if (!result) + { + return result; + } + + // + if (IsValid(prefix)) + { + name = prefix + "_" + name; + } + string nameMD5 = ToMD5(name); + + // + result = mRect.Create( + chart_id, + name, + window, + from, + upper, + to, + lower // + ); + if (!result) + { + return result; + } + + // + if (result) + { + ObjName(name); + } + + // + return result; + } + + // + // Getter(s) / Setter(s) ... + + /** + * Set Width ... + * + * @param value: Integer ... + */ + void BoxWidth(int value) + { + // + if (value < 1) + { + value = 1; + } + + // + mRect.Width(value); + } + + /** + * Set Color ... + * + * @param value: Color ... + */ + void BoxColor(color value) + { + mRect.Color(value); + } + + /** + * Set Style ... + * + * @param value: ENUM_LINE_STYLE member ... + */ + void BoxStyle(ENUM_LINE_STYLE value) + { + mRect.Style(value); + } + + /** + * Set Fill ... + * + * @param value: Boolean ... + */ + void BoxFill(bool value) + { + mRect.Fill(value); + } + + // + // Virtual ... + + /** + * Retrieve Object Type ... + * + * @return ( ENUM_XCHARTOBJECTS ) + */ + virtual ENUM_XCHARTOBJECTS Type() + { + return X_BOX_OBJ; + } + + // + private: + // + + // + // Props ... + CChartObjectRectangle mRect; +}; + +class XCRRObject : public XCBaseObject +{ + // + public: + // + + /** + * Creator ... + * + * @param chart_id: Long, Specified Chart ID ... + * @param window: Integer, Specified Chart Window ID ... + * @param rr: XRR instance Reference ... + * @param prefix: String ... + * + * @return ( bool ) + */ + bool Create( + long chart_id, + int window, + XRR &rr, + string prefix = NULL // + ) + { + // + bool result = false; + + // + result = rr.IsValid(); + if (!result) + { + return result; + } + + // + string name = rr.GetTag(); + if (IsValid(prefix)) + { + name = prefix + "_" + name; + } + string nameMD5 = ToMD5(name); + + // + bool isLong = IsLong(rr.type); + + // + double price1 = rr.entry; + double price2 = rr.sl; + + // + datetime time1 = rr.time; + datetime time2 = (datetime)((int)rr.time + 5 * PeriodSeconds(rr.period)); + + // + result = mFibo.Create( + chart_id, + name, + window, + time1, + price1, + time2, + price2 // + ); + if (!result) + { + return result; + } + + // + mRR = rr; + ObjName(name); + + // + int tpsCount = ArraySize(rr.tps); + int levels = tpsCount + 2; + result = mFibo.LevelsCount(levels); + if (!result) + { + return result; + } + + // + // Set Fibo Levels ... + + // + result = mFibo.LevelValue(0, 0); + if (!result) + { + return result; + } + result = mFibo.LevelDescription(0, "SL"); + if (!result) + { + return result; + } + + // + result = mFibo.LevelValue(1, 1.0); + if (!result) + { + return result; + } + result = mFibo.LevelDescription(1, "Entry"); + if (!result) + { + return result; + } + + // + for (int i = 0; i < tpsCount; i++) + { + // + int idx = i + 2; + double level = 1.0 + rr.tps[i]; + string description = "TP " + ToString(rr.tps[i]); + + // + result = mFibo.LevelValue( + idx, + level // + ); + if (!result) + { + break; + } + + // + result = mFibo.LevelDescription( + idx, + description // + ); + if (!result) + { + break; + } + } + if (!result) + { + return result; + } + + // + return result; + } + + // + // Getter(s) / Setter(s) ... + + // + // Virtual ... + + /** + * Retrieve Object Type ... + * + * @return ( ENUM_XCHARTOBJECTS ) + */ + virtual ENUM_XCHARTOBJECTS Type() + { + return X_RR_OBJ; + } + + // + private: + // + + // + // Props ... + XRR mRR; + CChartObjectFibo mFibo; + + // + bool SetSLProps( + int width = 1, + color clr = clrRed, + ENUM_LINE_STYLE style = STYLE_SOLID, + string description = "" // + ) + { + // + bool result = false; + + // + result = SetLevelProps( + 0, + width, + clr, + style, + description // + ); + + // + return result; + } + + // + bool SetEntryProps( + int width = 1, + color clr = clrOrange, + ENUM_LINE_STYLE style = STYLE_SOLID, + string description = "" // + ) + { + // + bool result = false; + + // + result = SetLevelProps( + 0, + width, + clr, + style, + description // + ); + + // + return result; + } + + // + bool SetTPProps( + double tpValue, + int width = 1, + color clr = clrLime, + ENUM_LINE_STYLE style = STYLE_SOLID, + string description = "" // + ) + { + // + bool result = false; + + // + int tpIDX = FindIndex( + tpValue, + mRR.tps // + ); + result = IsValidIndex(tpIDX); + if (!result) + { + return result; + } + + // + tpIDX += 2; + + // + result = SetLevelProps( + tpIDX, + width, + clr, + style, + description // + ); + + // + return result; + } + + // + bool SetLevelProps( + int id, + int width = 1, + color clr = clrYellow, + ENUM_LINE_STYLE style = STYLE_SOLID, + string description = "" // + ) + { + // + bool result = false; + + // + // Color ... + result = mFibo.LevelColor( + id, + clr // + ); + if (!result) + { + return result; + } + + // + // Style ... + result = mFibo.LevelStyle( + id, + style // + ); + if (!result) + { + return result; + } + + // + // Width ... + if (width > 0) + { + // + result = mFibo.LevelWidth( + id, + width // + ); + if (!result) + { + return result; + } + } + + // + // Description ... + if (IsValid(description)) + { + // + result = mFibo.LevelDescription( + id, + description // + ); + if (!result) + { + return result; + } + } + + // + return result; + } +}; + +class XCTrendObject : public XCBaseObject +{ + // + public: + // + + /** + * Creator ... + * + * @param chart_id: Long, Specified Chart ID ... + * @param window: Integer, Specified Chart Window ID ... + * @param rr: XRR instance Reference ... + * @param prefix: String ... + * + * @return ( bool ) + */ + bool Create( + long chart_id, + int window, + XPoint &swings[], + bool useMinAsStart = true, + string prefix = NULL // + ) + { + // + bool result = false; + + // + int count = ArraySize(swings); + result = + count >= 2 && + IsValidSize(count); + if (!result) + { + return result; + } + + // + double min = 0; + datetime minAt = NULL; + + // + double max = 0; + datetime maxAt = NULL; + + // + // Etract Min/Max ... + for (int i = 0; i < count; i++) + { + // + XPoint iPoint = swings[i]; + + // + if (!iPoint.IsValid()) + { + // + iPoint.Clean(); + continue; + } + + // + bool canSetMin = + min == 0 + ? true + : min > iPoint.value; + if (canSetMin) + { + // + minAt = iPoint.at; + min = iPoint.value; + } + + // + bool canSetMax = + max == 0 + ? true + : max < iPoint.value; + if (canSetMax) + { + // + maxAt = iPoint.at; + max = iPoint.value; + } + + // + iPoint.Clean(); + } + + // + double first = + useMinAsStart + ? min + : max; + datetime firstTime = + useMinAsStart + ? minAt + : maxAt; + + // + double second = + useMinAsStart + ? max + : min; + datetime secondTime = + useMinAsStart + ? maxAt + : minAt; + + // + // Validate Points ... + result = + // + first > 0 && + second > 0 && + (useMinAsStart + ? first <= second + : first >= second) && + IsSpecifiedValid(firstTime) && + IsSpecifiedValid(secondTime) + // + ; + if (!result) + { + return result; + } + + // + ENUM_X_DIRECTION dir = + useMinAsStart + ? X_DIRECTION_BULLISH + : X_DIRECTION_BEARISH; + + // + string name = "XTRND" + ToString(dir) + "_" + ToString(first) + "_" + ToString(second); + if (IsValid(prefix)) + { + name = prefix + "_" + name; + } + string nameMD5 = ToMD5(name); + + // + result = mTrend.Create( + chart_id, + name, + window, + firstTime, + first, + secondTime, + second // + ); + if (!result) + { + return result; + } + + // + ObjName(name); + + // + return result; + } + + /** + * Creator ... + * + * @param chart_id: Long, Specified Chart ID ... + * @param window: Integer, Specified Chart Window ID ... + * @param rr: XRR instance Reference ... + * @param prefix: String ... + * + * @return ( bool ) + */ + bool Create( + long chart_id, + int window, + XSwingPoint &swings[], + string prefix = NULL // + ) + { + // + bool result = false; + + // + int count = ArraySize(swings); + result = + count >= 2 && + IsValidSize(count); + if (!result) + { + return result; + } + + // + ENUM_X_SWING_TYPE type = swings[0].type; + bool isSwingLows = type == X_SWING_LOW; + + // + double values[]; + int valuesCount = ExtractSwings( + swings, + values // + ); + result = valuesCount == count; + if (!result) + { + return result; + } + + // + int firstIDX = -1; + double first = 0; + datetime firstTime = NULL; + + // + int secondIDX = -1; + double second = 0; + datetime secondTime = NULL; + + // + if (isSwingLows) + { + // + first = GetMin( + values, + firstIDX, + 0, + 0 // + ); + if (IsValidIndex(firstIDX)) + { + // + firstTime = swings[firstIDX].time; + + // + second = FindBiggerThan( + first, + values, + true // + ); + secondIDX = FindIndex( + second, + values // + ); + if (IsValidIndex(secondIDX)) + { + secondTime = swings[secondIDX].time; + } + } + } + else + { + // + first = GetMax( + values, + firstIDX, + 0, + 0 // + ); + if (IsValidIndex(firstIDX)) + { + // + firstTime = swings[firstIDX].time; + + // + second = FindLesserThan( + first, + values, + true // + ); + secondIDX = FindIndex( + second, + values // + ); + if (IsValidIndex(secondIDX)) + { + secondTime = swings[secondIDX].time; + } + } + } + + // + // Validate Points ... + result = + // + IsValidIndex(firstIDX) && + IsValidIndex(secondIDX) && + // + IsSpecifiedValid(firstTime) && + IsSpecifiedValid(secondTime) && + // + (isSwingLows + ? first < second + : first > second) + // + ; + if (!result) + { + return result; + } + + // + string name = ToString(type) + "_" + ToString(first) + "_" + ToString(second); + if (IsValid(prefix)) + { + name = prefix + "_" + name; + } + string nameMD5 = ToMD5(name); + + // + result = mTrend.Create( + chart_id, + name, + window, + firstTime, + first, + secondTime, + second // + ); + if (!result) + { + return result; + } + + // + ObjName(name); + + // + return result; + } + + // + // Getter(s) / Setter(s) ... + + /** + * Set Trend Color ... + * + * @param value: Color ... + */ + void TrendColor(color value) + { + mTrend.Color(value); + } + + void TrendRayLeft(bool value) + { + mTrend.RayLeft(value); + } + + void TrendRayRight(bool value) + { + mTrend.RayRight(value); + } + + // + // Virtual ... + + /** + * Retrieve Object Type ... + * + * @return ( ENUM_XCHARTOBJECTS ) + */ + virtual ENUM_XCHARTOBJECTS Type() + { + return X_TREND_OBJ; + } + + // + private: + // + + // + // Props ... + CChartObjectTrend mTrend; +}; + +// +// Zone Ticks ... + +// +// Specify How to Draws Specified Levels ... +struct XTickZoneLevelSpecs +{ + // + double percent; // Max Allowed Percent of Tick Zone ... + + // + // Label Info ... + color labelColor; + string labelFont; + int labelFontSize; + double labelAngel; + + // + // Zone Info ... + bool zoneFill; + int zoneWidth; + color zoneColor; + ENUM_LINE_STYLE zoneStyle; + + // + // Constructor ... + XTickZoneLevelSpecs() + { + Default(); + } + + // + // Tools ... + + /** + * Initialize Drawing Specs ... + * + * @param _percent: Double, Max Allowed Percent ... + * @param _labelColor: Color, Specified Label Color ... + * @param _zoneColoe: Color, Specified Zone Color ... + * @param _zoneFill: Boolean, Specified Fill Zone or not ... + * @param _zoneStyle: ENUM_LINE_STYLE member, Specified Zone Style ... + * @param _labelFontSize: Integer, Specified Label Font Size ... + * @param _labelFont: String, Specified Label Font Name ... + * @param _labelAngel: Double, Specified Label Angel ... + * + * @return ( bool ) + */ + bool Init( + double _percent, + color _labelColor = clrWhite, + color _zoneColor = clrWhite, + bool _zoneFill = false, + ENUM_LINE_STYLE _zoneStyle = STYLE_DOT, + int _zoneWidth = 1, + int _labelFontSize = 12, + string _labelFont = "Arial", + double _labelAngel = 0 // + ) + { + // + bool result = false; + + // + Default(); + + // + result = _percent > 0; + if (!result) + { + return result; + } + + // + percent = _percent; + labelColor = _labelColor; + zoneColor = _zoneColor; + zoneFill = _zoneFill; + zoneStyle = _zoneStyle; + + // + if (_zoneWidth > 0) + { + zoneWidth = _zoneWidth; + } + + // + if (_labelFontSize > 0) + { + labelFontSize = _labelFontSize; + } + + // + if (IsSpecifiedValid(_labelFont)) + { + labelFont = _labelFont; + } + + // + if (_labelAngel >= 0) + { + labelAngel = _labelAngel; + } + + // + result = IsValid(); + + // + return result; + } + + /** + * Set Default Properties ... + */ + void Default() + { + // + percent = 0; + + // + // Label ... + labelAngel = 0; + labelFontSize = 13; + labelFont = "Arial"; + labelColor = clrWhite; + + // + // Zone ... + zoneWidth = 1; + zoneFill = false; + zoneColor = clrWhite; + zoneStyle = STYLE_DOT; + } + + /** + * Validate ... + * + * @return ( bool ) + */ + bool IsValid() + { + // + bool result = false; + + // + result = + // + percent > 0 && + // + // Zone ... + zoneWidth > 0 && + // + // Label ... + labelFontSize > 0 && + IsSpecifiedValid(labelFont) + // + ; + + // + return result; + } + + // +}; + +class XCTickZoneObject : public XCBaseObject +{ + // + public: + // + + /** + * Creator ... + * + * @param chart_id: Long, Specified Chart ID ... + * @param window: Integer, Specified Chart Window ID ... + * @param name: String, Specify Chart Object Identifier ... + * @param from: Datetime ... + * @param to: Datetime ... + * @param zone: XCTickZone instance ... + * @param prefix: String ... + * + * @return ( bool ) + */ + bool Create( + long chart_id, + int window, + string name, + datetime from, + datetime to, + XCTickZone *zone, + string prefix = NULL // + ) + { + // + bool result = false; + + // + result = + IsValid(name) && + zone.IsValid() && + IsValid(to) && + IsValid(from); + if (!result) + { + return result; + } + + // + double points = GetPoints(zone.symbol); + if (points <= 0) + { + points = 1; + } + double distance = 1 * points; + + // + if (IsValid(prefix)) + { + name = prefix + "_" + name; + } + + // + string rectName = "TKZ_" + name; + result = mRect.Create( + chart_id, + rectName, + window, + from, + zone.high, + to, + zone.low // + ); + if (!result) + { + return result; + } + + // + int fromToDiff = ((int)to - (int)from); + datetime labelsDate = (datetime)((int)to - (fromToDiff / 5)); + + // + string lblName = "LBLT_" + name; + result = mTLabel.Create( + chart_id, + lblName, + window, + labelsDate, + zone.high - distance // + ); + if (!result) + { + return result; + } + + // + mTLabel.Description("T: " + ToString(zone.percent) + "%"); + + // + string lblVName = "LBLV_" + name; + result = mVLabel.Create( + chart_id, + lblVName, + window, + labelsDate, + zone.low + (2.5 * distance) // + ); + if (!result) + { + return result; + } + + // + mVLabel.Description("V: " + ToString(zone.volumePercent) + "%"); + + // + ObjName(name); + + // + return result; + } + + // + // Virtual ... + + /** + * Retrieve Object Type ... + * + * @return ( ENUM_XCHARTOBJECTS ) + */ + virtual ENUM_XCHARTOBJECTS Type() + { + return X_TICK_ZONE_OBJ; + } + + // + // Getter(s) / Setter(s) ... + + /** + * Set Zone Width ... + * + * @param value: Integer ... + */ + void ZoneWidth(int value) + { + // + if (value < 1) + { + value = 1; + } + + // + mRect.Width(value); + } + + /** + * Set Zone Color ... + * + * @param value: Color ... + */ + void ZoneColor(color value) + { + mRect.Color(value); + } + + /** + * Set Zone Style ... + * + * @param value: ENUM_LINE_STYLE member ... + */ + void ZoneStyle(ENUM_LINE_STYLE value) + { + mRect.Style(value); + } + + /** + * Set Zone Fill ... + * + * @param value: Boolean ... + */ + void ZoneFill(bool value) + { + mRect.Fill(value); + } + + /** + * Set Label Color ... + * + * @param value: Color ... + */ + void LabelColor(color value) + { + // + mTLabel.Color(value); + mVLabel.Color(value); + } + + /** + * Set Label Size ... + * + * @param value: Integer ... + */ + void LabelSize(int value) + { + // + mTLabel.FontSize(value); + mVLabel.FontSize(value); + } + + /** + * Set Label Font ... + * + * @param value: String ... + */ + void LabelFont(string value) + { + // + mTLabel.Font(value); + mVLabel.Font(value); + } + + /** + * Set Label Angle ... + * + * @param value: double ... + */ + void LabelAngle(double value) + { + // + mTLabel.Angle(value); + mVLabel.Angle(value); + } + + // + private: + // + // Props ... + CChartObjectRectangle mRect; + CChartObjectLabel mTLabel; + CChartObjectLabel mVLabel; + + // +}; +class XCTicksZoneObject : public XCBaseObject +{ + // + public: + // + + // + void ~XCTicksZoneObject() + { + mZones.Clear(); + } + + /** + * Creator ... + * + * @param chart_id: Long, Specified Chart ID ... + * @param window: Integer, Specified Chart Window ID ... + * @param zone: XCTicksZone instance ... + * @param prefix: String ... + * + * @return ( bool ) + */ + bool Create( + long chart_id, + int window, + XCTicksZone &zone, + XTickZoneLevelSpecs &specs[], + string prefix = NULL // + ) + { + // + bool result = false; + + // + result = zone.IsValid(); + if (!result) + { + return result; + } + + // + string name = zone.GetTag(); + int levels = zone.Levels(); + result = levels > 0; + if (!result) + { + return result; + } + + // + for (int i = 0; i < levels; i++) + { + // + XCTickZone *iZone = zone.GetZone(i); + XCTickZoneObject *iObj; + iObj = new XCTickZoneObject(); + bool isCreated = iObj.Create( + chart_id, + window, + ToString(i) + "_" + name, + zone.From(), + zone.To(), + iZone, + prefix // + ); + if (!isCreated) + { + break; + } + + // + XTickZoneLevelSpecs iSpec; + bool hasSpecs = FindSpecs( + iZone, + iSpec, + specs // + ); + if (hasSpecs) + { + // + // Label ... + iObj.LabelFont(iSpec.labelFont); + iObj.LabelAngle(iSpec.labelAngel); + iObj.LabelColor(iSpec.labelColor); + iObj.LabelSize(iSpec.labelFontSize); + + // + // Zone ... + iObj.ZoneFill(iSpec.zoneFill); + iObj.ZoneColor(iSpec.zoneColor); + iObj.ZoneWidth(iSpec.zoneWidth); + iObj.ZoneStyle(iSpec.zoneStyle); + } + + // + mZones.Add(iObj); + } + + // + if (result) + { + ObjName(name); + } + else + { + mZones.Clear(); + } + + // + return result; + } + + // + // Virtual ... + + /** + * Retrieve Object Type ... + * + * @return ( ENUM_XCHARTOBJECTS ) + */ + virtual ENUM_XCHARTOBJECTS Type() + { + return X_TICKS_ZONE_OBJ; + } + + // + // Getter(s) / Setter(s) ... + + // + // Actions ... + + /** + * Destroy Object ... + */ + void Destroy() + { + mZones.Clear(); + } + + /** + * Find Specified TickZone Drawing Specs ... + * + * @param zone: XCTickZone instance, reference to Search For it ... + * @param spec: XTickZoneLevelSpecs instance, reference to Result ... + * @param specs: XTickZoneLevelSpecs instance Collection for Search ... + * + * @return ( bool ) + */ + bool FindSpecs( + XCTickZone *zone, + XTickZoneLevelSpecs &spec, + XTickZoneLevelSpecs &specs[] // + ) + { + // + bool result = false; + + // + int count = ArraySize(specs); + result = + zone.IsValid() && + IsValidSize(count); + if (!result) + { + return result; + } + + // + for (int i = 0; i < count; i++) + { + // + XTickZoneLevelSpecs iSpecs = specs[i]; + + // + bool isSpecValidForZone = + !spec.IsValid() + ? zone.percent <= iSpecs.percent + : zone.percent <= iSpecs.percent && + spec.percent > iSpecs.percent; + if (isSpecValidForZone) + { + spec = iSpecs; + } + } + + // + result = spec.IsValid(); + + // + return result; + } + + // + private: + // + // Props ... + CArrayObj mZones; + + // +}; + +// \ No newline at end of file diff --git a/BKPS/14031206/Classes/x-saherelm.x-expert.class.ex5 b/BKPS/14031206/Classes/x-saherelm.x-expert.class.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..175bcbfb7884f9be88758271cc0e8d084003596a GIT binary patch literal 12110 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 literal 0 HcmV?d00001 diff --git a/BKPS/14031206/Classes/x-saherelm.x-expert.class.mq5 b/BKPS/14031206/Classes/x-saherelm.x-expert.class.mq5 new file mode 100644 index 0000000..db922b4 --- /dev/null +++ b/BKPS/14031206/Classes/x-saherelm.x-expert.class.mq5 @@ -0,0 +1,967 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 Class Library +// -------------------------------------- +// Name: XCBaseExpert +// Description: provides all based classes for use ... +// +// +// Maintainer: +// ------------ +// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) +// +////////////////////////////////////////////////////// +// +// Global Properties ... +#property library +#property copyright "Copyright 2023, SaherElm IT Center" +#property link "https://www.saherelm.ir" +#property version "1.00" +#property strict + +// +// Imports ... +#include "../Classes/x-saherelm.x-alert.class.mq5" +#include "../Classes/x-saherelm.x-trade.class.mq5" + +// +// Definitions ... +string XCBaseExpertToken = "XCBaseEA"; + +// +// Inputs ... + +// +// Implementations ... +class XCBaseExpert : public XCBaseAlert +{ + // + public: + // + + // + XCTrade *mTrader; // Trader of Expert Adviser ... + + // + // Constructur(s) ... + void XCBaseExpert() + { + } + + // + // Deconstructor ... + void ~XCBaseExpert() + { + // + delete mTrader; + + // + ZeroMemory(mTrader); + } + + // + // Getter(s) / Setter(s) ... + + // + // Common ... + + /** + * Get Magic Number ... + * + * @return ( long ) + */ + long MagicNumber() + { + return mMagicNumber; + } + + /** + * Set Magic Number ... + * + * @param value: Long ... + */ + void MagicNumber(long value) + { + // + mMagicNumber = value; + ReConfigure(); + } + + /** + * Get Slippage ... + * + * @return ( int ) + */ + int Slippage() + { + return mSlippage; + } + + /** + * Set Slippage ... + * + * @param value: Integer ... + */ + void Slippage(int value) + { + // + mSlippage = value; + ReConfigure(); + } + + /** + * Get Tag Prefix ... + * + * @return ( string ) + */ + string TagPrefix() + { + return mTagPrefix; + } + + /** + * Set Tag Prefix ... + * + * @param value: String ... + */ + void TagPrefix(string value) + { + // + mTagPrefix = value; + ReConfigure(); + } + + // + // Symbol ... + + /** + * Get Period ... + * + * @return ( ENUM_TIMEFRAMES ) + */ + ENUM_TIMEFRAMES GetPeriod() + { + return mPeriod; + } + + /** + * Set Period ... + * + * @param value: ENUM_TIMEFRAMES member ... + */ + void SetPeriod(ENUM_TIMEFRAMES value) + { + // + mPeriod = value; + ReConfigure(); + } + + /** + * Get Symbol ... + * + * @return ( string ) + */ + string GetSymbol() + { + return mSymbol; + } + + /** + * Set Symbol ... + * + * @param value: String ... + */ + void SetSymbol(string value) + { + // + mSymbol = value; + ReConfigure(); + } + + /** + * Get Multi Symbol is Enable or Not ... + * + * @return ( bool ) + */ + bool MultiSymbol() + { + return mMultiSymbol; + } + + /** + * Set Multi Symbol is Enable or Not ... + * + * @param value: Boolean ... + */ + void MultiSymbol(bool value) + { + // + mMultiSymbol = value; + ReConfigure(); + } + + /** + * Get Multi Provided Symbols ... + * + * @return ( string ) + */ + string Symbols() + { + return mSymbols; + } + + /** + * Set Multi Provided Symbols ... + * + * @param value: String ... + */ + void Symbols(string value) + { + // + mSymbols = value; + ReConfigure(); + } + + // + // Signalling ... + + /** + * Get Force Disable Signalling ... + * + * @return ( bool ) + */ + bool Disabled() + { + return mDisabled; + } + + /** + * Set Force Disable Signalling ... + * + * @param value: Boolean ... + */ + void Disabled(bool value) + { + // + mDisabled = value; + ReConfigure(); + } + + /** + * Get Allow Long Signals ... + * + * @return ( bool ) + */ + bool AllowLong() + { + return mAllowLong; + } + + /** + * Set Allow Long Signals ... + * + * @param value: Boolean ... + */ + void AllowLong(bool value) + { + // + mAllowLong = value; + ReConfigure(); + } + + /** + * Get Allow Short Signalling ... + * + * @return ( bool ) + */ + bool AllowShort() + { + return mAllowShort; + } + + /** + * Set Allow Short Signalling ... + * + * @param value: Boolean ... + */ + void AllowShort(bool value) + { + // + mAllowShort = value; + ReConfigure(); + } + + // + // Reports ... + + /** + * Get Report New Month State ... + * + * @return ( bool ) + */ + bool ReportNewMonths() + { + return mReportNewMonths; + } + + /** + * Set Report New Month State ... + * + * @param value: Boolean ... + */ + void ReportNewMonths(bool value) + { + // + mReportNewMonths = value; + ReConfigure(); + } + + /** + * Get Report New Weeks State ... + * + * @return ( bool ) + */ + bool ReportNewWeeks() + { + return mReportNewWeeks; + } + + /** + * Set Report New Weeks State ... + * + * @param value: Boolean ... + */ + void ReportNewWeeks(bool value) + { + // + mReportNewWeeks = value; + ReConfigure(); + } + + /** + * Get Report New Days State ... + * + * @return ( bool ) + */ + bool ReportNewDays() + { + return mReportNewDays; + } + + /** + * Set Report New Days State ... + * + * @param value: Boolean ... + */ + void ReportNewDays(bool value) + { + // + mReportNewDays = value; + ReConfigure(); + } + + /** + * Get Report New Hours State ... + * + * @return ( bool ) + */ + bool ReportNewHours() + { + return mReportNewHours; + } + + /** + * Set Report New Hours State ... + * + * @param value: Boolean ... + */ + void ReportNewHours(bool value) + { + // + mReportNewHours = value; + ReConfigure(); + } + + // + // Actions ... + + /** + * Handle Expert OnInit Event ... + * + * @return ( bool ) + */ + bool HandleOnInit() + { + // + bool result = false; + + // + string message = ""; + + // + // Validate Input ... + result = ValidateInputs(); + if (!result) + { + // + message = "Invalid Inputs ...."; + + // + Alert(message); + } + + // + // Initial All Requirements ... + result = InitEA(); + if (!result) + { + return result; + } + + // + // Initial All GUI Requirements ... + result = InitGUI(); + if (!result) + { + return result; + } + + // + message = "Initialized Successfully ..."; + Alert(message); + + // + return result; + } + + /** + * Handle Expert OnDeInit Event ... + */ + void HandleOnDeInit() + { + // + // Destroy all GUI Requirements ... + DestroyGUI(); + + // + // Alert De Initialization Succeeded ... + string msg = "De Initialized Successfully ..."; + Alert(msg); + + // + // Destroy all EA Requirements ... + DestroyEA(); + } + + /** + * Handle Expert OnTick Event ... + */ + void HandleOnTick() + { + // + UpdateGUI(); + HandleReportTime(); + HandleStrategiesOnTick(); + HandleStrategiesGuard(); + } + + /** + * Handle Expert OnTrade Event ... + */ + void HandleOnTrade() + { + mTrader.HandleOnTrade(); + } + + /** + * Handle Expert OnTimer Event ... + */ + void HandleOnTimer() + { + } + + /** + * Handle Expert OnChart Event ... + */ + void HandleOnChartEvent( + const int id, + const long &lparam, + const double &dparam, + const string &sparam // + ) + { + } + + // + // Virtual Actions ... + + /** + * Apply Default Configurations ... + */ + virtual void DefaultConfigure() + { + // + // Commons ... + Slippage(10); + TagPrefix(""); + MagicNumber(1694056); + + // + // Symbol ... + SetSymbol(_Symbol); + SetPeriod(_Period); + MultiSymbol(false); + Symbols("EURUSDb,GBPUSDb,USDJPYb,USDCHFb,DowJones30,XAUUSDb"); + + // + // Signalling ... + Disabled(false); + AllowLong(true); + AllowShort(true); + + // + string tag = GetTag(); + + // + // Alert ... + SetAlertPrefix(tag); + SetAlertLogAlerts(true); + SetAlertPushAlerts(true); + SetAlertMailAlerts(false); + SetAlertEnableAlerts(true); + SetAlertTerminalAlerts(false); + + // + // Reports ... + ReportNewDays(true); + ReportNewWeeks(false); + ReportNewHours(false); + ReportNewMonths(false); + } + + /** + * Vaslidate Inputs ... + * + * @return ( virtual bool ) + */ + virtual bool ValidateInputs() + { + // + bool result = false; + + // + string errMessage = ""; + + // + bool isCommonValid = ( + // + mSlippage > 0 && + mMagicNumber > 0 + // + ); + if (!isCommonValid) + { + // + errMessage += "common configurations error;" + "\n"; + } + + // + result = + // + // Common ... + isCommonValid && + // + // Otere ... + true + // + ; + + // + if (!result) + { + // + // Since here Logger not Initiallized, we Use Raw Print Command ... + errMessage = " Errors: \n" + errMessage; + Alert(errMessage); + } + + // + return result; + } + + // + // Initializers and DeInitializers ... + + /** + * Initial EA Requirements ... + * + * @return ( virtual bool ) + */ + virtual bool InitEA() + { + // + bool result = false; + + // + // Initialize Indicator Helpers ... + + // + // Create Trader Instance and Configure it ... + mTrader = new XCTrade( + mSlippage, + mMagicNumber // + ); + + // + return result; + } + + /** + * Destroy Initialized Requirements ... + */ + virtual void DestroyEA() + { + // + delete mTrader; + + // + ZeroMemory(mTrader); + } + + /** + * GUI Initialize if required ... + * + * @return ( virtual bool ) + */ + virtual bool InitGUI() + { + // + bool result = false; + + // + result = true; + + // + return result; + } + + /** + * Update All GUI Contents ... + */ + virtual void UpdateGUI() + { + } + + /** + * Destroy all Initialized GUi Elements ... + */ + virtual void DestroyGUI() + { + } + + // + // Event Handlers ... + + /** + * Calls When a Position's SL Triggered ... + * + * @param deal: XDeal instance ... + */ + virtual void HandleOnStopLossTriggered(const XDeal &deal) + { + HandleReportBalance(); + } + + /** + * Calls When a Position's TP Triggered ... + * + * @param deal: XDeal instance ... + */ + virtual void HandleOnTakeProfitTriggered(const XDeal &deal) + { + HandleReportBalance(); + } + + /** + * Handle Force Close a Position ... + * + * @param ticket: Position Ticket ... + * @param position: XPosition ... + * @param comment: Closing Comment ... + */ + virtual void HandleOnPositionForceClosed( + const ulong ticket, + const XPosition &position, + const string comment // + ) + { + HandleReportBalance(); + } + + /** + * Handle Position Modified ... + * + * @param ticket: ULONG ... + * @param profit: Double ... + * @param comment: String ... + */ + virtual void HandleOnPositionModified( + const ulong ticket, + const double profit, + const string comment // + ) + { + } + + /** + * Handle Position Partially Closed ... + * + * @param ticket: ULONG ... + * @param profit: Double ... + * @param comment: String ... + */ + virtual void HandleOnPositionPartialClosed( + const ulong ticket, + const double profit, + const string comment // + ) + { + } + + /** + * Handle Deals Changed ... + * + * @param count: Integer, Number of Changes ... + */ + virtual void HandleOnDealsChanged(int count) + { + } + + /** + * Handle Orders Changed ... + * + * @param count: Integer, Number of Changes ... + */ + virtual void HandleOnOrdersChanged(int count) + { + } + + /** + * Handle Positions Changed ... + * + * @param count: Integer, Number of Changes ... + */ + virtual void HandleOnPositionsChanged(int count) + { + } + + /** + * Do All Signalling Processing Here ... + */ + virtual void HandleStrategiesOnTick() + { + } + + /** + * Check Strategies for Guards and then Apply Them ... + */ + virtual void HandleStrategiesGuard() + { + } + + // + // Time Handlers ... + + virtual void HandleOnNewMonth() + { + } + + virtual void HandleOnNewWeek() + { + } + + virtual void HandleOnNewDay() + { + } + + virtual void HandleOnNewHour() + { + } + + virtual void ReConfigure() + { + } + + /** + * Generate Identifier Tag ... + * + * @return ( virtual string ) + */ + virtual string GetTag() + { + // + string result = NULL; + + // + string tagPrefix = TagPrefix(); + if (IsValid(tagPrefix)) + { + result = tagPrefix; + } + else + { + result = ""; + } + + // + result = + XCBaseExpertToken + result; + + // + return result; + } + + // + protected: + // + + // + // Props ... + + // + XTimeTracker mTimeTracker; // Time Tracker for Providing Reports ... + + // + // Actions ... + + /** + * Report Account Balance ... + */ + void HandleReportBalance() + { + // + if (!IsRunningOnTestMode()) + { + return; + } + + // + string msg = "Balance: " + ToString(mTrader.mAccount.GetBalance()); + Log(msg); + } + + /** + * Time Reporting based on Inputs ... + */ + void HandleReportTime() + { + // + // Monthly Report .... + if (mTimeTracker.IsNewMonth()) + { + // + HandleOnNewMonth(); + + // + if (mReportNewMonths) + { + // + string msg = "New Month ..."; + + // + Alert(msg); + } + } + + // + // Weekly Report .... + if (mTimeTracker.IsNewWeek()) + { + // + HandleOnNewWeek(); + + // + if (mReportNewWeeks) + { + // + string msg = "New Week ..."; + + // + Alert(msg); + } + } + + // + // Daily Report .... + if (mTimeTracker.IsNewDay()) + { + // + HandleOnNewDay(); + + // + if (mReportNewDays) + { + // + string msg = "New Day ..."; + + // + Alert(msg); + } + } + + // + // Hourly Report .... + if (mTimeTracker.IsNewHour()) + { + // + HandleOnNewHour(); + + // + if (mReportNewHours) + { + // + string msg = "New Hour ..."; + + // + Alert(msg); + } + } + } + + // + private: + // + + // + // Props ... + + // + // Common ... + long mMagicNumber; // Magic Number ... + int mSlippage; // Slippage ... + string mTagPrefix; // Tag Prefix ... + + // + // Symbol ... + ENUM_TIMEFRAMES mPeriod; // Period ... + string mSymbol; // Symbol ... + bool mMultiSymbol; // Multi Symbol is Enable or Not ... + string mSymbols; // Multi Provided Symbols ... + + // + // Signalling ... + bool mDisabled; // Force Disable Signalling ... + bool mAllowLong; // Allow Long Signals ... + bool mAllowShort; // Allow Short Signals ... + + // + // Reports ... + bool mReportNewMonths; // Report New Month ... + bool mReportNewWeeks; // Report New Weeks ... + bool mReportNewDays; // Report New Days ... + bool mReportNewHours; // Report New Hours ... + + // +}; + +// \ No newline at end of file diff --git a/BKPS/14031206/Classes/x-saherelm.x-helper.class.ex5 b/BKPS/14031206/Classes/x-saherelm.x-helper.class.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..d2f8bea30f6700552306570e125d8daa294093a2 GIT binary patch literal 7110 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 ZIFdMZm(Un$4~pag4$*3LWn2{AwjG8Xx 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 p16tyhQihe6TxV=WH|!e4u5PiC@VYDuowR&5 0; + + // + return result; + } + + // + // END Provided Functions ... + // + + // + // Protected ... + protected: + // + // Destintion Folder Path ... + string mPath; + + // + // WEB Request Timeout Value ... + int mTimeout; + + // + // WEB Request's Response ... + string mResponse; + + // + // Error Value ... + int mError; + + // + // Private ... + private: + // + // Reset Errors State ... + void ResetState() + { + // + // Reset Errors ... + mError = -1; + mResponse = ""; + ResetLastError(); + } + + // + // Generate Full File Path ... + string GetFilePath(string fileName) + { + // + string result = ""; + + // + result = + // + Path() + "\\" + fileName + // + ; + + // + return result; + } +}; + +// +// Tools ... + +// +// 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; +} + +// \ No newline at end of file diff --git a/BKPS/14031206/Classes/x-saherelm.x-md5.class.ex5 b/BKPS/14031206/Classes/x-saherelm.x-md5.class.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..0df3ba3cfa4d15d3a6bd1b2db0c69072d600cb74 GIT binary patch literal 5058 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 literal 0 HcmV?d00001 diff --git a/BKPS/14031206/Classes/x-saherelm.x-md5.class.mq5 b/BKPS/14031206/Classes/x-saherelm.x-md5.class.mq5 new file mode 100644 index 0000000..e5cc201 --- /dev/null +++ b/BKPS/14031206/Classes/x-saherelm.x-md5.class.mq5 @@ -0,0 +1,445 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 Class Library +// ---------------------------------------------- +// Name: XSCMD5 +// Description: Provides MD5 Hashing Requirements ... +// +// +// Maintainer: +// ------------ +// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) +// +////////////////////////////////////////////////////// +// +// Global Properties ... +#property library +#property copyright "Copyright 2023, SaherElm IT Center" +#property link "https://www.saherelm.ir" +#property version "1.00" +#property strict + +// +// START Definitions ... +// + +// +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 Definitions ... +// + +// +// XCMD5 a library for Hashing ... +class XCMD5 +{ + // + // Public Provides ... + public: + // + // Protected Provides ... + + // + // Constructor ... + XCMD5(void) + { + } + + // + // Deconstructor ... + ~XCMD5(void) + { + } + + // + // Hash Specified Char Array ... + string Hash( + uchar &mSource[], // Specify Char Array to Hash + int mLength = 0 // Specify Length of Char Array which required to hash + ) + { + // + string result = ""; + + // + int sourceCount = ArraySize(mSource); + + // + // Validate Args ... + if ( + sourceCount <= 0 || + (sourceCount > 0 && mLength > sourceCount)) + { + return result; + } + + // + // Normalize Args ... + if (mLength == 0) + { + mLength = sourceCount; + } + + // + // Init MD5 ... + MD5Init(); + + // + // Update Buffer ... + MD5Update(mSource, mLength); + + // + // Calculate Result ... + result = MD5Final(); + + // + return result; + } + + // + // Hash Specified String ... + string Hash( + string mSource // Specified String + ) + { + // + string result = ""; + + // + // Converts String to Char Array ... + uchar bytes[]; + StringToCharArray( + mSource, + bytes, + 0, + StringLen(mSource)); + + // + 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; + } +}; diff --git a/BKPS/14031206/Classes/x-saherelm.x-poi.class.ex5 b/BKPS/14031206/Classes/x-saherelm.x-poi.class.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..4a80b61af4592502989799947333a34c95ea1bfb GIT binary patch literal 14730 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 G + +// +// Implementation ... + +// +// POI Detector Class ... +class XCPOIDetector : public XCBaseAlert +{ + // + public: + // + XCPOIDrawer *mDrawer; + + // + // Constructors ... + /** + * Create an Instance ... + * + * @param symbol: String ... + * @param period: ENUM_TIMEFRAMES member ... + */ + void XCPOIDetector( + string symbol, + ENUM_TIMEFRAMES period // + ) + { + // + // Attach Required Properties ... + mSymbol = symbol; + mPeriod = period; + + // + // Initialize Bar Tracker ... + mBarTracker.Init( + mSymbol, + mPeriod // + ); + + // + // Create Default Drawer Instance ... + mDrawer = new XCPOIDrawer(); + + // + // Apply Default Configurations ... + Default(); + } + + // + // Deconstructor ... + void ~XCPOIDetector() + { + Destroy(); + } + + // + // Getter(s) / Setter(s) ... + + /** + * Retrieve Detector Symbol ... + * + * @return ( string ) + */ + string GetSymbol() + { + return mSymbol; + } + + /** + * Retrieve Detector Period ... + * + * @return ( ENUM_TIMEFRAMES ) + */ + ENUM_TIMEFRAMES GetPeriod() + { + return mPeriod; + } + + /** + * Get Max Number of POIs which holds ... + * + * @return ( int ) + */ + int MaxNumberOfPOIs() + { + return mMaxNumberOfPOIs; + } + + /** + * Set Max Number of POIs which holds ... + * 0 => Infinity ... + * + * @param value: Integer ... + */ + void MaxNumberOfPOIs(int value) + { + // + if (value < 0) + { + value = 0; + } + + // + mMaxNumberOfPOIs = value; + } + + /** + * Get Number of POI(s) which must Find at Initializations ... + * + * @return ( int ) + */ + int MaxNumberOfRequiredPOIs() + { + return mMaxNumberOfRequiredPOIs; + } + + /** + * Set Number of POI(s) which must Find at Initializations ... + * 2 is Default ... + * + * @param value: Integer ... + */ + void MaxNumberOfRequiredPOIs(int value) + { + // + if (value < 2) + { + value = 2; + } + + // + mMaxNumberOfRequiredPOIs = value; + } + + /** + * Check Is Locked or not ... + * + * @return ( bool ) + */ + bool IsLocked() + { + return mLock; + } + + // + // POI(s) Configs ... + + // + // Swings ... + + /** + * Get Swing Verification Range Length ... + * + * @return ( int ) + */ + int SwingRange() + { + return mSwingRange; + } + + /** + * Set Swing Verification Range Length ... + * + * @param value: Integer ... + */ + void SwingRange(int value) + { + // + if (value < 0) + { + value = 0; + } + + // + mSwingRange = value; + } + + // + // Momentum Bars ... + + /** + * Get Momentum Bars must Extends Range ... + * + * @return ( int ) + */ + int MomentumBarExtendRange() + { + return mMomentumBarExtendRange; + } + + /** + * Set Momentum Bars must Extends Range ... + * + * @param value: Integer ... + */ + void MomentumBarExtendRange(int value) + { + // + if (value < 0) + { + value = 0; + } + + // + mMomentumBarExtendRange = value; + } + + /** + * Get Momentum Bars Body Percent ... + * + * @return ( double ) + */ + double MomentumBarBodyPercent() + { + return mMomentumBarBodyPercent; + } + + /** + * Set Momentum Bars Body Percent ... + * + * @param value: Double ... + */ + void MomentumBarBodyPercent(double value) + { + // + if (value < 50) + { + value = 50; + } + + // + mMomentumBarBodyPercent = value; + } + + // + // Rejection Bars ... + + /** + * Get Rejection Bars must Extends Range ... + * + * @return ( int ) + */ + int RejectionBarExtendRange() + { + return mRejectionBarExtendRange; + } + + /** + * Set Rejection Bars must Extends Range ... + * + * @param value: Integer ... + */ + void RejectionBarExtendRange(int value) + { + // + if (value < 0) + { + value = 0; + } + + // + mRejectionBarExtendRange = value; + } + + /** + * Get Rejection Bars Shadow Percent ... + * + * @return ( double ) + */ + double RejectionBarShadowPercent() + { + return mRejectionBarShadowPercent; + } + + /** + * Set Rejection Bars Shadow Percent ... + * + * @param value: Double ... + */ + void RejectionBarShadowPercent(double value) + { + // + if (value < 50) + { + value = 50; + } + + // + mRejectionBarShadowPercent = value; + } + + // + // Support and Resistance Zone(s) ... + + /** + * Get Support and Resistance Range for Verification ... + * + * @return ( int ) + */ + int SupportAndResistanceRange() + { + return mSupportAndResistanceRange; + } + + /** + * Set Support and Resistance Range for Verification ... + * + * @param value: Integer ... + */ + void SupportAndResistanceRange(int value) + { + // + if (value < 2) + { + value = 2; + } + + // + mSupportAndResistanceRange = value; + } + + // + // Supply and Demand Zone(s) ... + + /** + * Get Supply and Demand Range Verifications ... + * + * @return ( int ) + */ + int SupplyAndDemandRange() + { + return mSupplyAndDemandRange; + } + + /** + * Set Supply and Demand Range Verifications ... + * + * @param value: Integer ... + */ + void SupplyAndDemandRange(int value) + { + // + if (value < 2) + { + value = 2; + } + + // + mSupplyAndDemandRange = value; + } + + // + // Order Blocks ... + + /** + * Get Order Blocks Detection Bars ... + * + * @return ( int ) + */ + int OrderBlocksSameBars() + { + return mOrderBlocksSameBars; + } + + /** + * Set Order Blocks Detection Bars ... + * + * @param value: Argument 1 + */ + void OrderBlocksSameBars(int value) + { + // + if (value < 0) + { + value = 0; + } + + // + mOrderBlocksSameBars = value; + } + + // + // Fair Value Gaps ... + + /** + * Get Fair Value Gaps Detection Same Bars ... + * + * @return ( int ) + */ + int FairValueGapsSameBars() + { + return mFairValueGapsSameBars; + } + + /** + * Set Fair Value Gaps Detection Same Bars ... + * + * @param value: Integer ... + */ + void FairValueGapsSameBars(int value) + { + // + if (value < 0) + { + value = 0; + } + + // + mFairValueGapsSameBars = value; + } + + // + // Ticks Zone ... + + /** + * Get Ticks Range Levels ... + * + * @return ( int ) + */ + int TicksRangeZoneLevel() + { + return mTicksRangeZoneLevel; + } + + /** + * Set Ticks Range Levels ... + * + * @param value: Integer ... + */ + void TicksRangeZoneLevel(int value) + { + // + if (value < 2) + { + value = 2; + } + + // + mTicksRangeZoneLevel = value; + } + + /** + * Get Ticks Range Zone Loopback Period ... + * + * @return ( int ) + */ + int TicksRangeZoneRange() + { + return mTicksRangeZoneRange; + } + + /** + * Set Ticks Range Zone Loopback Period ... + * + * @param value: Integer ... + */ + void TicksRangeZoneRange(int value) + { + // + if (value < 7) + { + value = 7; + } + + // + mTicksRangeZoneRange = value; + } + + // + // Actions ... + + /** + * Initialize POI Detector ... + */ + void Init() + { + DetectRequiredPOIs(); + } + + /** + * Update POI(s) ... + * + * @param state: an Array Refrence of ENUM_XPOI_EVENTS members ... + */ + int Update( + ENUM_XPOI_EVENTS &state[] // + ) + { + // + int result = 0; + + // + Clean(state); + + // + // Check Bar Tracker if Waits ... + if (!mBarTracker.IsNewBar()) + { + return result; + } + + // + int zIndex = 0; + int cIndex = zIndex + 1; + int pIndex = cIndex + 1; + + // + string symbol = GetSymbol(); + ENUM_TIMEFRAMES period = GetPeriod(); + + // + datetime cTime = TimeCurrent(); + + // + XOHCL zBar; + bool isInited = zBar.Init( + symbol, + period, + zIndex // + ); + if (!isInited) + { + return result; + } + + // + XOHCL cBar; + isInited = cBar.Init( + symbol, + period, + cIndex // + ); + if (!isInited) + { + return result; + } + + // + // POI Detecting ... + bool isDetected = false; + + // + // Swings ... + int iSwingRange = SwingRange(); + if (iSwingRange > 0) + { + // + XOHCL swingBar; + isInited = swingBar.Init( + symbol, + period, + zIndex + iSwingRange // + ); + if (isInited) + { + // + // Swing High ... + isDetected = DetectSwingHigh(swingBar); + if (isDetected) + { + // + ENUM_XPOI_EVENTS event = X_SWING_HIGH_DETECTED; + XCSwing *param; + bool hasItem = GetLastItem( + param, + mSwingHighs // + ); + if (hasItem) + { + // + NotifyEventListeners( + event, + param // + ); + } + + // + Add( + event, + state // + ); + } + + // + // Swing Low ... + isDetected = DetectSwingLow(swingBar); + if (isDetected) + { + // + ENUM_XPOI_EVENTS event = X_SWING_LOW_DETECTED; + XCSwing *param; + bool hasItem = GetLastItem( + param, + mSwingLows // + ); + if (hasItem) + { + // + NotifyEventListeners( + event, + param // + ); + } + + // + Add( + event, + state // + ); + } + } + } + + // + // Bullish Momentum Bars ... + isDetected = DetectBullishMomentumBar(cBar); + if (isDetected) + { + // + ENUM_XPOI_EVENTS event = X_BULLISH_MOMENTUM_BAR_DETECTED; + XCMomentumBar *param; + bool hasItem = GetLastItem( + param, + mBullishMomentumBars // + ); + if (hasItem) + { + // + NotifyEventListeners( + event, + param // + ); + } + + // + Add( + event, + state // + ); + } + + // + // Bearish Momentum Bars ... + isDetected = DetectBearishMomentumBar(cBar); + if (isDetected) + { + // + ENUM_XPOI_EVENTS event = X_BEARISH_MOMENTUM_BAR_DETECTED; + XCMomentumBar *param; + bool hasItem = GetLastItem( + param, + mBearishMomentumBars // + ); + if (hasItem) + { + // + NotifyEventListeners( + event, + param // + ); + } + + // + Add( + event, + state // + ); + } + + // + // Bullish Rejection Bars ... + isDetected = DetectBullishRejectionBar(cBar); + if (isDetected) + { + // + ENUM_XPOI_EVENTS event = X_BULLISH_REJECTION_BAR_DETECTED; + XCRejectionBar *param; + bool hasItem = GetLastItem( + param, + mBullishRejectionBars // + ); + if (hasItem) + { + // + NotifyEventListeners( + event, + param // + ); + } + + // + Add( + event, + state // + ); + } + + // + // Bearish Rejection Bars ... + isDetected = DetectBearishRejectionBar(cBar); + if (isDetected) + { + // + ENUM_XPOI_EVENTS event = X_BEARISH_REJECTION_BAR_DETECTED; + XCRejectionBar *param; + bool hasItem = GetLastItem( + param, + mBearishRejectionBars // + ); + if (hasItem) + { + // + NotifyEventListeners( + event, + param // + ); + } + + // + Add( + event, + state // + ); + } + + // + // Support and Resistance Zones ... + int supResRange = SupportAndResistanceRange(); + if (supResRange > 0) + { + // + XOHCL supResBar; + isInited = supResBar.Init( + symbol, + period, + zIndex + supResRange // + ); + if (isInited) + { + // + // Support Zones ... + isDetected = DetectSupportZone(supResBar); + if (isDetected) + { + // + ENUM_XPOI_EVENTS event = X_SUPPORT_ZONE_DETECTED; + XCSupportZone *param; + bool hasItem = GetLastItem( + param, + mSupportZones // + ); + if (hasItem) + { + // + NotifyEventListeners( + event, + param // + ); + } + + // + Add( + event, + state // + ); + } + + // + // Resistance Zones ... + isDetected = DetectResistanceZone(supResBar); + if (isDetected) + { + // + ENUM_XPOI_EVENTS event = X_RESISTANCE_ZONE_DETECTED; + XCResistanceZone *param; + bool hasItem = GetLastItem( + param, + mResistanceZones // + ); + if (hasItem) + { + // + NotifyEventListeners( + event, + param // + ); + } + + // + Add( + event, + state // + ); + } + } + } + + // + // Supply And Demand Zones ... + int supDemRange = SupplyAndDemandRange(); + if (supDemRange > 0) + { + // + // Supply Zone ... + isDetected = DetectSupplyZone(cBar); + if (isDetected) + { + // + ENUM_XPOI_EVENTS event = X_SUPPLY_ZONE_DETECTED; + XCSupplyZone *param; + bool hasItem = GetLastItem( + param, + mSupplyZones // + ); + if (hasItem) + { + // + NotifyEventListeners( + event, + param // + ); + } + + // + Add( + event, + state // + ); + } + + // + // Demand Zone ... + isDetected = DetectDemandZone(cBar); + if (isDetected) + { + // + ENUM_XPOI_EVENTS event = X_DEMAND_ZONE_DETECTED; + XCDemandZone *param; + bool hasItem = GetLastItem( + param, + mDemandZones // + ); + if (hasItem) + { + // + NotifyEventListeners( + event, + param // + ); + } + + // + Add( + event, + state // + ); + } + } + + // + // Order Blocks ... + int obSameBars = OrderBlocksSameBars(); + if (obSameBars > 0) + { + // + // Bullish Order Block ... + isDetected = DetectBullishOrderBlock(cBar); + if (isDetected) + { + // + ENUM_XPOI_EVENTS event = X_BULLISH_ORDERBLOCK_DETECTED; + XCOrderBlock *param; + bool hasItem = GetLastItem( + param, + mBullishOrderBlocks // + ); + if (hasItem) + { + // + NotifyEventListeners( + event, + param // + ); + } + + // + Add( + event, + state // + ); + } + + // + // Bearish Order Block ... + isDetected = DetectBearishOrderBlock(cBar); + if (isDetected) + { + // + ENUM_XPOI_EVENTS event = X_BEARISH_ORDERBLOCK_DETECTED; + XCOrderBlock *param; + bool hasItem = GetLastItem( + param, + mBearishOrderBlocks // + ); + if (hasItem) + { + // + NotifyEventListeners( + event, + param // + ); + } + + // + Add( + event, + state // + ); + } + } + + // + // Fair Value Gaps ... + int fvgSameBars = FairValueGapsSameBars(); + if (fvgSameBars > 0) + { + // + // Bullish Fair Value Gap ... + isDetected = DetectBullishFairValueGap(cBar); + if (isDetected) + { + // + ENUM_XPOI_EVENTS event = X_BULLISH_FVG_DETECTED; + XCFVG *param; + bool hasItem = GetLastItem( + param, + mBullishFairValueGaps // + ); + if (hasItem) + { + // + NotifyEventListeners( + event, + param // + ); + } + + // + Add( + event, + state // + ); + } + + // + // Bearish Fair Value Gap ... + isDetected = DetectBearishFairValueGap(cBar); + if (isDetected) + { + // + ENUM_XPOI_EVENTS event = X_BEARISH_FVG_DETECTED; + XCFVG *param; + bool hasItem = GetLastItem( + param, + mBearishFairValueGaps // + ); + if (hasItem) + { + // + NotifyEventListeners( + event, + param // + ); + } + + // + Add( + event, + state // + ); + } + } + + // + // Ticks Range Zone ... + int ticksLevels = TicksRangeZoneLevel(); + int ticksRange = TicksRangeZoneRange(); + if (ticksLevels > 0 && + ticksRange > 0) + { + // + isDetected = DetectTicksZoneRange(cBar); + if (isDetected) + { + } + } + + // + ValidatePOIs(cBar); + + // + CleanupUnusedPOIs(); + + // + mBarTracker.Waits(); + + // + result = ArraySize(state); + + // + return result; + } + + /** + * Destroy Class ... + */ + void Destroy() + { + // + DestroyPOIs(); + DestroySessions(); + DestroyEventListeners(); + + // + delete mDrawer; + delete mTicksZone; + + // + ZeroMemory(mDrawer); + ZeroMemory(mTicksZone); + } + + // + // Retrievers ... + + /** + * Get Current State of POIs ... + * + * @param state: XPOIState instance ... + */ + void GetState( + XPOIState &state // + ) + { + // + state.Clean(); + + // + state.symbol = mSymbol; + state.period = mPeriod; + state.time = TimeCurrent(); + + // + Copy( + mSwingHighs, + state.swingHighs // + ); + + // + Copy( + mSwingLows, + state.swingLows // + ); + + // + Copy( + mBullishMomentumBars, + state.bullishMomentumBars // + ); + + // + Copy( + mBearishMomentumBars, + state.bearishMomentumBars // + ); + + // + Copy( + mBullishRejectionBars, + state.bullishRejectionBars // + ); + + // + Copy( + mBearishRejectionBars, + state.bearishRejectionBars // + ); + + // + Copy( + mSupportZones, + state.supportZones // + ); + + // + Copy( + mResistanceZones, + state.resistanceZones // + ); + + // + Copy( + mSupplyZones, + state.supplyZones // + ); + + // + Copy( + mDemandZones, + state.demandZones // + ); + + // + Copy( + mBullishOrderBlocks, + state.bullishOrderBlocks // + ); + + // + Copy( + mBearishOrderBlocks, + state.bearishOrderBlocks // + ); + + // + Copy( + mBullishFairValueGaps, + state.bullishFairValueGaps // + ); + + // + Copy( + mBearishFairValueGaps, + state.bearishFairValueGaps // + ); + + // + state.ticksZone = mTicksZone; + + // + } + + // + // Event Listeners ... + + /** + * Add Event Listener ... + * + * @param listener: TOnPOIEvent instance ... + */ + void AddEventListener(TOnPOIEvent listener) + { + // + Add( + listener, + mEventListeners // + ); + } + + // + // Destroy ... + + /** + * Destroy Detected POI(s) ... + */ + void DestroyPOIs() + { + // + Clean(mSwingHighs); + Clean(mSwingLows); + + // + Clean(mBullishMomentumBars); + Clean(mBearishMomentumBars); + + // + Clean(mBullishRejectionBars); + Clean(mBearishRejectionBars); + + // + Clean(mSupportZones); + Clean(mResistanceZones); + + // + Clean(mSupplyZones); + Clean(mDemandZones); + + // + Clean(mBullishOrderBlocks); + Clean(mBearishOrderBlocks); + + // + Clean(mBullishFairValueGaps); + Clean(mBearishFairValueGaps); + } + + /** + * Destroy Added Sessions ... + */ + void DestroySessions() + { + } + + /** + * Destroy Rejistered Event Handlers ... + */ + void DestroyEventListeners() + { + Clean(mEventListeners); + } + + // + // Virtual Actions ... + + /** + * Apply Default Configurations ... + */ + virtual void Default() + { + // + // Common ... + + // + MaxNumberOfPOIs(10); + MaxNumberOfRequiredPOIs(2); + + // + SwingRange(2); + + // + MomentumBarExtendRange(2); + MomentumBarBodyPercent(70); + + // + RejectionBarExtendRange(0); + RejectionBarShadowPercent(55); + + // + SupportAndResistanceRange(7); + + // + SupplyAndDemandRange(144); + + // + OrderBlocksSameBars(3); + + // + FairValueGapsSameBars(3); + + // + TicksRangeZoneLevel(10); + TicksRangeZoneRange(144); + } + + // + // Detector Functions ... + + /** + * Detect Swing High ... + * + * @param bar: XOHCL instance ... + * + * @return ( bool ) + */ + bool DetectSwingHigh(XOHCL &bar) + { + // + bool result = false; + + // + result = bar.IsValid(); + if (!result) + { + return result; + } + + // + int range = SwingRange(); + int barIndex = bar.Index(); + result = range > 0 && + barIndex >= range; + if (!result) + { + return result; + } + + // + result = mBarAnalyser.IsSwingHigh( + bar, + range // + ); + if (result) + { + // + XCSwing *swing; + swing = new XCSwing(); + result = swing.Init( + bar, + X_POI_SWING_HIGH // + ); + + // + if (result) + { + // + Add( + swing, + mSwingHighs // + ); + } + } + + // + return result; + } + + /** + * Detect Swing Low ... + * + * @param bar: XOHCL instance ... + * + * @return ( bool ) + */ + bool DetectSwingLow(XOHCL &bar) + { + // + bool result = false; + + // + result = bar.IsValid(); + if (!result) + { + return result; + } + + // + int range = SwingRange(); + int barIndex = bar.Index(); + result = range > 0 && + barIndex >= range; + if (!result) + { + return result; + } + + // + result = mBarAnalyser.IsSwingLow( + bar, + range // + ); + if (result) + { + // + XCSwing *swing; + swing = new XCSwing(); + result = swing.Init( + bar, + X_POI_SWING_LOW // + ); + + // + if (result) + { + // + Add( + swing, + mSwingLows // + ); + } + } + + // + return result; + } + + /** + * Detect Bullish Momentum Bar ... + * + * @param bar: XOHCL instance ... + * + * @return ( bool ) + */ + bool DetectBullishMomentumBar(XOHCL &bar) + { + // + bool result = false; + + // + result = bar.IsValid() && + bar.Index() > 0; + if (!result) + { + return result; + } + + // + int extendRange = MomentumBarExtendRange(); + double bodyPercent = MomentumBarBodyPercent(); + ENUM_X_DIRECTION dir; + result = mBarAnalyser.IsMomentumBar( + bar, + dir, + extendRange, + bodyPercent // + ); + result = + result && + dir == X_DIRECTION_BULLISH; + if (result) + { + // + XCMomentumBar *momentumBar; + momentumBar = new XCMomentumBar(); + result = momentumBar.Init(bar); + + // + if (result) + { + // + Add( + momentumBar, + mBullishMomentumBars // + ); + } + } + + // + return result; + } + + /** + * Detect Bearish Momentum Bar ... + * + * @param bar: XOHCL instance ... + * + * @return ( bool ) + */ + bool DetectBearishMomentumBar(XOHCL &bar) + { + // + bool result = false; + + // + result = bar.IsValid() && + bar.Index() > 0; + if (!result) + { + return result; + } + + // + int extendRange = MomentumBarExtendRange(); + double bodyPercent = MomentumBarBodyPercent(); + ENUM_X_DIRECTION dir; + result = mBarAnalyser.IsMomentumBar( + bar, + dir, + extendRange, + bodyPercent // + ); + result = + result && + dir == X_DIRECTION_BEARISH; + if (result) + { + // + XCMomentumBar *momentumBar; + momentumBar = new XCMomentumBar(); + result = momentumBar.Init(bar); + + // + if (result) + { + // + Add( + momentumBar, + mBearishMomentumBars // + ); + } + } + + // + return result; + } + + /** + * Detect Bullish Rejection Bar ... + * + * @param bar: XOHCL instance ... + * + * @return ( bool ) + */ + bool DetectBullishRejectionBar(XOHCL &bar) + { + // + bool result = false; + + // + result = bar.IsValid() && + bar.Index() > 0; + if (!result) + { + return result; + } + + // + int extendRange = RejectionBarExtendRange(); + double shadowPercent = RejectionBarShadowPercent(); + ENUM_X_DIRECTION dir; + result = mBarAnalyser.IsRejectionBar( + bar, + dir, + extendRange, + shadowPercent // + ); + result = + result && + dir == X_DIRECTION_BULLISH; + if (result) + { + // + XCRejectionBar *rejectionBar; + rejectionBar = new XCRejectionBar(); + result = rejectionBar.Init(bar); + + // + if (result) + { + // + Add( + rejectionBar, + mBullishRejectionBars // + ); + } + } + + // + return result; + } + + /** + * Detect Bearish Rejection Bar ... + * + * @param bar: XOHCL instance ... + * + * @return ( bool ) + */ + bool DetectBearishRejectionBar(XOHCL &bar) + { + // + bool result = false; + + // + result = bar.IsValid() && + bar.Index() > 0; + if (!result) + { + return result; + } + + // + int extendRange = RejectionBarExtendRange(); + double shadowPercent = RejectionBarShadowPercent(); + ENUM_X_DIRECTION dir; + result = mBarAnalyser.IsRejectionBar( + bar, + dir, + extendRange, + shadowPercent // + ); + result = + result && + dir == X_DIRECTION_BEARISH; + if (result) + { + // + XCRejectionBar *rejectionBar; + rejectionBar = new XCRejectionBar(); + result = rejectionBar.Init(bar); + + // + if (result) + { + // + Add( + rejectionBar, + mBearishRejectionBars // + ); + } + } + + // + return result; + } + + /** + * Detect Support Zone ... + * + * @param bar: XOHCL instance ... + * + * @return ( bool ) + */ + bool DetectSupportZone(XOHCL &bar) + { + // + bool result = false; + + // + result = bar.IsValid(); + if (!result) + { + return result; + } + + // + int range = SupportAndResistanceRange(); + int barIndex = bar.Index(); + result = range > 0 && + barIndex >= range; + if (!result) + { + return result; + } + + // + result = mBarAnalyser.IsSupport( + bar, + range // + ); + if (result) + { + // + XCSupportZone *support; + support = new XCSupportZone(); + result = support.Init( + bar, + range // + ); + + // + if (result) + { + // + datetime cTime = TimeCurrent(); + support.To(cTime); + + // + Add( + support, + mSupportZones // + ); + } + } + + // + return result; + } + + /** + * Detect Resistance Zone ... + * + * @param bar: XOHCL instance ... + * + * @return ( bool ) + */ + bool DetectResistanceZone(XOHCL &bar) + { + // + bool result = false; + + // + result = bar.IsValid(); + if (!result) + { + return result; + } + + // + int range = SupportAndResistanceRange(); + int barIndex = bar.Index(); + result = range > 0 && + barIndex >= range; + if (!result) + { + return result; + } + + // + result = mBarAnalyser.IsResistance( + bar, + range // + ); + if (result) + { + // + XCResistanceZone *resistance; + resistance = new XCResistanceZone(); + result = resistance.Init( + bar, + range // + ); + + // + if (result) + { + // + Add( + resistance, + mResistanceZones // + ); + } + } + + // + return result; + } + + /** + * Detect Supply Zone ... + * + * @param bar: XOHCL instance ... + * + * @return ( bool ) + */ + bool DetectSupplyZone(XOHCL &bar) + { + // + bool result = false; + + // + result = bar.IsValid(); + if (!result) + { + return result; + } + + // + int range = SupplyAndDemandRange(); + result = range > 0; + if (!result) + { + return result; + } + + // + int hhIDX = -1; + double hh = -1; + + // + int llIDX = -1; + double ll = -1; + + // + result = mBarAnalyser + .CalculateLoopbackHLData( + hhIDX, + hh, + llIDX, + ll, + bar, + range // + ); + if (!result) + { + return result; + } + + // + XOHCL supplyBar; + result = supplyBar.Init( + bar.symbol, + bar.period, + hhIDX // + ); + if (result) + { + // + XCSupplyZone *supply; + supply = new XCSupplyZone(); + result = supply.Init( + supplyBar, + range // + ); + + // + if (result) + { + // + datetime cTime = TimeCurrent(); + supply.To(cTime); + + // + Add( + supply, + mSupplyZones // + ); + } + } + + // + return result; + } + + /** + * Detect Demand Zone ... + * + * @param bar: XOHCL instance ... + * + * @return ( bool ) + */ + bool DetectDemandZone(XOHCL &bar) + { + // + bool result = false; + + // + result = bar.IsValid(); + if (!result) + { + return result; + } + + // + int range = SupplyAndDemandRange(); + result = range > 0; + if (!result) + { + return result; + } + + // + int hhIDX = -1; + double hh = -1; + + // + int llIDX = -1; + double ll = -1; + + // + result = mBarAnalyser + .CalculateLoopbackHLData( + hhIDX, + hh, + llIDX, + ll, + bar, + range // + ); + if (!result) + { + return result; + } + + // + XOHCL demandBar; + result = demandBar.Init( + bar.symbol, + bar.period, + llIDX // + ); + if (result) + { + // + XCDemandZone *demand; + demand = new XCDemandZone(); + result = demand.Init( + demandBar, + range // + ); + + // + if (result) + { + // + datetime cTime = TimeCurrent(); + demand.To(cTime); + + // + Add( + demand, + mDemandZones // + ); + } + } + + // + return result; + } + + /** + * Detect Bullish Order Block ... + * + * @param bar: XOHCL instance ... + * + * @return ( bool ) + */ + bool DetectBullishOrderBlock(XOHCL &bar) + { + // + bool result = false; + + // + result = bar.IsValid(); + if (!result) + { + return result; + } + + // + int sameBars = OrderBlocksSameBars(); + result = sameBars > 0; + if (!result) + { + return result; + } + + // + XOHCL obBar; + ENUM_X_DIRECTION dir; + result = mBarAnalyser + .HasOrderBlock( + bar, + obBar, + dir, + sameBars // + ); + result = + result && + dir == X_DIRECTION_BULLISH; + if (!result) + { + return result; + } + + // + if (result) + { + // + XCOrderBlock *ob; + ob = new XCOrderBlock(); + result = ob.Init( + obBar, + dir // + ); + + // + if (result) + { + // + datetime cTime = TimeCurrent(); + ob.To(cTime); + + // + Add( + ob, + mBullishOrderBlocks // + ); + } + } + + // + return result; + } + + /** + * Detect Bullish Order Block ... + * + * @param bar: XOHCL instance ... + * + * @return ( bool ) + */ + bool DetectBullishOrderBlock( + XOHCL &bar, + XCOrderBlock *&ob // + ) + { + // + bool result = false; + + // + result = bar.IsValid(); + if (!result) + { + return result; + } + + // + int sameBars = OrderBlocksSameBars(); + result = sameBars > 0; + if (!result) + { + return result; + } + + // + XOHCL obBar; + ENUM_X_DIRECTION dir; + result = mBarAnalyser + .HasOrderBlock( + bar, + obBar, + dir, + sameBars // + ); + result = + result && + dir == X_DIRECTION_BULLISH; + if (!result) + { + return result; + } + + // + if (result) + { + // + ob = new XCOrderBlock(); + result = ob.Init( + obBar, + dir // + ); + + // + if (result) + { + // + datetime cTime = TimeCurrent(); + ob.To(cTime); + } + } + + // + return result; + } + + /** + * Detect Bearish Order Block ... + * + * @param bar: XOHCL instance ... + * + * @return ( bool ) + */ + bool DetectBearishOrderBlock(XOHCL &bar) + { + // + bool result = false; + + // + result = bar.IsValid(); + if (!result) + { + return result; + } + + // + int sameBars = OrderBlocksSameBars(); + result = sameBars > 0; + if (!result) + { + return result; + } + + // + XOHCL obBar; + ENUM_X_DIRECTION dir; + result = mBarAnalyser + .HasOrderBlock( + bar, + obBar, + dir, + sameBars // + ); + result = + result && + dir == X_DIRECTION_BEARISH; + if (!result) + { + return result; + } + + // + if (result) + { + // + XCOrderBlock *ob; + ob = new XCOrderBlock(); + result = ob.Init( + obBar, + dir // + ); + + // + if (result) + { + // + datetime cTime = TimeCurrent(); + ob.To(cTime); + + // + Add( + ob, + mBearishOrderBlocks // + ); + } + } + + // + return result; + } + + /** + * Detect Bearish Order Block ... + * + * @param bar: XOHCL instance ... + * + * @return ( bool ) + */ + bool DetectBearishOrderBlock( + XOHCL &bar, + XCOrderBlock *&ob // + ) + { + // + bool result = false; + + // + result = bar.IsValid(); + if (!result) + { + return result; + } + + // + int sameBars = OrderBlocksSameBars(); + result = sameBars > 0; + if (!result) + { + return result; + } + + // + XOHCL obBar; + ENUM_X_DIRECTION dir; + result = mBarAnalyser + .HasOrderBlock( + bar, + obBar, + dir, + sameBars // + ); + result = + result && + dir == X_DIRECTION_BEARISH; + if (!result) + { + return result; + } + + // + if (result) + { + // + ob = new XCOrderBlock(); + result = ob.Init( + obBar, + dir // + ); + + // + if (result) + { + // + datetime cTime = TimeCurrent(); + ob.To(cTime); + } + } + + // + return result; + } + + /** + * Detect Bullish Fair Value Gap ... + * + * @param bar: XOHCL instance ... + * + * @return ( bool ) + */ + bool DetectBullishFairValueGap(XOHCL &bar) + { + // + bool result = false; + + // + result = bar.IsValid(); + if (!result) + { + return result; + } + + // + int sameBars = FairValueGapsSameBars(); + result = sameBars > 0; + if (!result) + { + return result; + } + + // + XOHCL prevBar; + XOHCL nextBar; + ENUM_X_DIRECTION dir; + result = mBarAnalyser + .HasFairValueGap( + bar, + prevBar, + nextBar, + dir, + sameBars // + ); + result = + result && + dir == X_DIRECTION_BULLISH; + if (!result) + { + return result; + } + + // + if (result) + { + // + XCFVG *fvg; + fvg = new XCFVG(); + result = fvg.Init( + prevBar, + nextBar, + dir // + ); + + // + if (result) + { + // + datetime cTime = TimeCurrent(); + fvg.To(cTime); + + // + Add( + fvg, + mBullishFairValueGaps // + ); + } + } + + // + return result; + } + + /** + * Detect Bearish Fair Value Gap ... + * + * @param bar: XOHCL instance ... + * + * @return ( bool ) + */ + bool DetectBearishFairValueGap(XOHCL &bar) + { + // + bool result = false; + + // + result = bar.IsValid(); + if (!result) + { + return result; + } + + // + int sameBars = FairValueGapsSameBars(); + result = sameBars > 0; + if (!result) + { + return result; + } + + // + XOHCL prevBar; + XOHCL nextBar; + ENUM_X_DIRECTION dir; + result = mBarAnalyser + .HasFairValueGap( + bar, + prevBar, + nextBar, + dir, + sameBars // + ); + result = + result && + dir == X_DIRECTION_BEARISH; + if (!result) + { + return result; + } + + // + if (result) + { + // + XCFVG *fvg; + fvg = new XCFVG(); + result = fvg.Init( + prevBar, + nextBar, + dir // + ); + + // + if (result) + { + // + datetime cTime = TimeCurrent(); + fvg.To(cTime); + + // + Add( + fvg, + mBearishFairValueGaps // + ); + } + } + + // + return result; + } + + // + protected: + // + + // + // Actions ... + + /** + * Lock ... + */ + void Lock() + { + mLock = true; + } + + /** + * Unlock ... + */ + void Unlock() + { + mLock = false; + } + + /** + * Detect Required POI(s) ... + * + * @param barIndex: Integer Start bar index ... + * 0 is Default ... + */ + void DetectRequiredPOIs(int barIndex = 0) + { + // + // Validate Reuired POI(s) ... + int requiredPOIs = MaxNumberOfRequiredPOIs(); + if (requiredPOIs <= 0) + { + return; + } + + // + // Locking Detector ... + Lock(); + + // + // Normalize Bar Index ... + if (barIndex < 0) + { + barIndex = 0; + } + + // + int swingLowsCount = 0; + int swingHighsCount = 0; + + // + int bullishMomentumBarsCount = 0; + int bearishMomentumBarsCount = 0; + + // + int bullishRejectionBarsCount = 0; + int bearishRejectionBarsCount = 0; + + // + int supportZonesCount = 0; + int resistanceZonesCount = 0; + + // + int supplyZonesCount = 0; + int demandZonesCount = 0; + + // + int bullishOrderBlocksCount = 0; + int bearishOrderBlocksCount = 0; + + // + int bullishFairValueGapsCount = 0; + int bearishFairValueGapsCount = 0; + + // + bool canContinue = true; + + // + while (canContinue) + { + // + // Swings ... + int iSwingRange = SwingRange(); + if (iSwingRange > 0) + { + // + // Swing Highs ... + swingHighsCount = DetectRequiredSwingHighs(barIndex); + if (swingHighsCount == requiredPOIs) + { + ArrayReverse(mSwingHighs); + } + + // + // Swing Lows ... + swingLowsCount = DetectRequiredSwingLows(barIndex); + if (swingLowsCount == requiredPOIs) + { + ArrayReverse(mSwingLows); + } + } + + // + bool canLookupMomentumBars = + MomentumBarExtendRange() >= 0 && + MomentumBarBodyPercent() > 0; + if (canLookupMomentumBars) + { + // + // + // Bullish Momentum Bars ... + bullishMomentumBarsCount = DetectRequiredBullishMomentumBars(barIndex); + if (bullishMomentumBarsCount == requiredPOIs) + { + ArrayReverse(mBullishMomentumBars); + } + + // + // Bearish Momentum Bars ... + bearishMomentumBarsCount = DetectRequiredBearishMomentumBars(barIndex); + if (bearishMomentumBarsCount == requiredPOIs) + { + ArrayReverse(mBearishMomentumBars); + } + } + + // + bool canLookupRejectionBars = + RejectionBarExtendRange() >= 0 && + RejectionBarShadowPercent() > 0; + if (canLookupRejectionBars) + { + // + // + // Bullish Rejection Bars ... + bullishRejectionBarsCount = DetectRequiredBullishRejectionBars(barIndex); + if (bullishRejectionBarsCount == requiredPOIs) + { + ArrayReverse(mBullishRejectionBars); + } + + // + // Bearish Rejection Bars ... + bearishRejectionBarsCount = DetectRequiredBearishRejectionBars(barIndex); + if (bearishRejectionBarsCount == requiredPOIs) + { + ArrayReverse(mBearishRejectionBars); + } + } + + // + // Support and Resistance Zones ... + int supResRange = SupportAndResistanceRange(); + if (supResRange > 0) + { + // + // Support Zone(s) ... + supportZonesCount = DetectRequiredSupportZones(barIndex); + if (supportZonesCount == requiredPOIs) + { + ArrayReverse(mSupportZones); + } + + // + // Resistance Zone(s) ... + resistanceZonesCount = DetectRequiredResistanceZones(barIndex); + if (resistanceZonesCount == requiredPOIs) + { + ArrayReverse(mResistanceZones); + } + } + + // + // Supply and Demand Zones ... + int supDemRange = SupplyAndDemandRange(); + if (supDemRange > 0) + { + // + supplyZonesCount = DetectRequiredSupplyZones(barIndex); + if (supplyZonesCount == requiredPOIs) + { + ArrayReverse(mSupplyZones); + } + + // + demandZonesCount = DetectRequiredDemandZones(barIndex); + if (demandZonesCount == requiredPOIs) + { + ArrayReverse(mDemandZones); + } + } + + // + // Oder Blocks ... + int obSameBars = OrderBlocksSameBars(); + if (obSameBars > 0) + { + // + // Bullish Order Blocks ... + bullishOrderBlocksCount = DetectRequiredBullishOrderBlocks(barIndex); + if (bullishOrderBlocksCount == requiredPOIs) + { + ArrayReverse(mBullishOrderBlocks); + } + + // + // Bearish Order Blocks ... + bearishOrderBlocksCount = DetectRequiredBearishOrderBlocks(barIndex); + if (bearishOrderBlocksCount == requiredPOIs) + { + ArrayReverse(mBearishOrderBlocks); + } + } + + // + // Fair Value Gaps ... + int fvgSameBars = FairValueGapsSameBars(); + if (fvgSameBars > 0) + { + // + // Bullish Fair Value Gaps ... + bullishFairValueGapsCount = DetectRequiredBullishFairValueGaps(barIndex); + if (bullishFairValueGapsCount == requiredPOIs) + { + ArrayReverse(mBullishFairValueGaps); + } + + // + // Bearish Fair Value Gaps ... + bearishFairValueGapsCount = DetectRequiredBearishFairValueGaps(barIndex); + if (bearishFairValueGapsCount == requiredPOIs) + { + ArrayReverse(mBearishFairValueGaps); + } + } + + // + // Swings ... + bool canContinueSwingHighs = + iSwingRange > 0 + ? swingHighsCount < requiredPOIs + : false; + bool canContinueSwingLows = + iSwingRange > 0 + ? swingLowsCount < requiredPOIs + : false; + + // + // Support and Resistance Zones ... + bool canContinueSupportZones = + supResRange > 0 + ? supportZonesCount < requiredPOIs + : false; + bool canContinueResistanceZones = + supResRange > 0 + ? resistanceZonesCount < requiredPOIs + : false; + + // + // Supply and Demand Zones ... + bool canContinueSupplyZones = + supDemRange > 0 + ? supplyZonesCount < requiredPOIs + : false; + bool canContinueDemandZones = + supDemRange > 0 + ? demandZonesCount < requiredPOIs + : false; + + // + // Order Blocks ... + bool canContinueBullishOrderBlocks = + obSameBars > 0 + ? bullishOrderBlocksCount < requiredPOIs + : false; + bool canContinueBearishOrderBlocks = + obSameBars > 0 + ? bearishOrderBlocksCount < requiredPOIs + : false; + + // + // Fair Value Gaps ... + bool canContinueBullishFairValueGaps = + fvgSameBars > 0 + ? bullishFairValueGapsCount < requiredPOIs + : false; + bool canContinueBearishFairValueGaps = + fvgSameBars > 0 + ? bearishFairValueGapsCount < requiredPOIs + : false; + + // + // Rejection Bars ... + bool canContinueBullishRejectionBars = + canLookupRejectionBars + ? bullishRejectionBarsCount < requiredPOIs + : false; + bool canContinueBearishRejectionBars = + canLookupRejectionBars + ? bearishRejectionBarsCount < requiredPOIs + : false; + + // + // Momentum Bars ... + bool canContinueBullishMomentumBars = + canLookupMomentumBars + ? bullishMomentumBarsCount < requiredPOIs + : false; + bool canContinueBearishMomentumBars = + canLookupMomentumBars + ? bearishMomentumBarsCount < requiredPOIs + : false; + + // + canContinue = + // + // Swings ... + canContinueSwingHighs || + canContinueSwingLows || + // + // Support and Resistance Zones ... + canContinueSupportZones || + canContinueResistanceZones || + // + // Supply and Demand Zones ... + canContinueSupplyZones || + canContinueDemandZones || + // + // Order Blocks ... + canContinueBullishOrderBlocks || + canContinueBearishOrderBlocks || + // + // Fair Value Gaps ... + canContinueBullishFairValueGaps || + canContinueBearishFairValueGaps || + // + // Rejection Bars ... + canContinueBullishRejectionBars || + canContinueBearishRejectionBars || + // + // Momentum Bars ... + canContinueBullishMomentumBars || + canContinueBearishMomentumBars + // + ; + if (canContinue) + { + barIndex++; + } + } + + // + // Unlocking Detector ... + Unlock(); + } + + /** + * Validate Founded POI(s) ... + * + * @param bar: XOHCL instance ... + */ + void ValidatePOIs(XOHCL &bar) + { + } + + /** + * Cleanup Unused Objects ... + */ + void CleanupUnusedPOIs() + { + // + int maxAllowed = MaxNumberOfPOIs(); + if (!IsValidSize(maxAllowed)) + { + return; + } + + // + int swingHighsCount = ArraySize(mSwingHighs); + int swingLowsCount = ArraySize(mSwingLows); + // int tradingDaysCount = ArraySize(mTradingDays); + // int marketSessionsCount = ArraySize(mMarketSessions); + // int momentumBarsCount = ArraySize(mMomentumBars); + // int rejectionBarsCount = ArraySize(mRejectionBars); + // int supportZonesCount = ArraySize(mSupportZones); + // int resistanceZonesCount = ArraySize(mResistanceZones); + // int supplyZonesCount = ArraySize(mSupplyZones); + // int demandZonesCount = ArraySize(mDemandZones); + // int bullishOBsCount = ArraySize(mBullishOrderBlocks); + // int bearishOBsCount = ArraySize(mBearishOrderBlocks); + // int bullishFVGsCount = ArraySize(mBullishFVGs); + // int bearishFVGsCount = ArraySize(mBearishFVGs); + + // + int from = 0; + int requiredPOIs = MaxNumberOfRequiredPOIs(); + int count = maxAllowed - requiredPOIs; + int to = count - 1; + + // + // Swings ... + + // // + // // Swing Highs ... + // if (swingHighsCount >= maxAllowed) + // { + // // + // ArrayRemove( + // mSwingHighs, + // from, + // count // + // ); + // } + + // // + // // Swing Lows ... + // if (swingLowsCount >= maxAllowed) + // { + // // + // ArrayRemove( + // mSwingLows, + // from, + // count // + // ); + // } + + // // + // // Trading Days ... + // if (tradingDaysCount >= maxAllowed) + // { + // // + // ArrayRemove( + // mTradingDays, + // from, + // count // + // ); + + // // + // mTradingDayObjects.DeleteRange( + // from, + // to // + // ); + // } + + // // + // // Market Sessions ... + // if (marketSessionsCount >= maxAllowed) + // { + // // + // ArrayRemove( + // mMarketSessions, + // from, + // count // + // ); + + // // + // mMarketSessionObjects.DeleteRange( + // from, + // to // + // ); + // } + + // // + // // Momentum Bars ... + // if (momentumBarsCount >= maxAllowed) + // { + // // + // ArrayRemove( + // mMomentumBars, + // from, + // count // + // ); + + // // + // mMomentumBarObjects.DeleteRange( + // from, + // to // + // ); + // } + + // // + // // Rejection Bars ... + // if (rejectionBarsCount >= maxAllowed) + // { + // // + // ArrayRemove( + // mRejectionBars, + // from, + // count // + // ); + + // // + // mRejectionBarObjects.DeleteRange( + // from, + // to // + // ); + // } + + // // + // // Support and Resistance Zones ... + + // // + // // Support Zones ... + // if (supportZonesCount >= maxAllowed) + // { + // // + // ArrayRemove( + // mSupportZones, + // from, + // count // + // ); + + // // + // mSupportZoneObjects.DeleteRange( + // from, + // to // + // ); + // } + + // // + // // Resistance Zones ... + // if (resistanceZonesCount >= maxAllowed) + // { + // // + // ArrayRemove( + // mResistanceZones, + // from, + // count // + // ); + + // // + // mResistanceZoneObjects.DeleteRange( + // from, + // to // + // ); + // } + + // // + // // Supply and Demand Zones ... + + // // + // // Supply Zones ... + // if (supplyZonesCount >= maxAllowed) + // { + // // + // ArrayRemove( + // mSupplyZones, + // from, + // count // + // ); + + // // + // mSupplyZoneObjects.DeleteRange( + // from, + // to // + // ); + // } + + // // + // // Demand Zones ... + // if (demandZonesCount >= maxAllowed) + // { + // // + // ArrayRemove( + // mDemandZones, + // from, + // count // + // ); + + // // + // mDemandZoneObjects.DeleteRange( + // from, + // to // + // ); + // } + + // // + // // Order Blocks ... + + // // + // // Bullish Order Blocks ... + // if (bullishOBsCount >= maxAllowed) + // { + // // + // ArrayRemove( + // mBullishOrderBlocks, + // from, + // count // + // ); + + // // + // mBullishOrderBlockObjects.DeleteRange( + // from, + // to // + // ); + // } + + // // + // // Bearish Order Blocks ... + // if (bearishOBsCount >= maxAllowed) + // { + // // + // ArrayRemove( + // mBearishOrderBlocks, + // from, + // count // + // ); + + // // + // mBearishOrderBlockObjects.DeleteRange( + // from, + // to // + // ); + // } + + // // + // // Fair Vakue Gaps ... + + // // + // // Bullish FVGs ... + // if (bullishFVGsCount >= maxAllowed) + // { + // // + // ArrayRemove( + // mBullishFVGs, + // from, + // count // + // ); + + // // + // mBullishFVGObjects.DeleteRange( + // from, + // to // + // ); + // } + + // // + // // Bearish FVGs ... + // if (bearishFVGsCount >= maxAllowed) + // { + // // + // ArrayRemove( + // mBearishFVGs, + // from, + // count // + // ); + + // // + // mBearishFVGObjects.DeleteRange( + // from, + // to // + // ); + // } + + // + } + + /** + * Notify Event Listeners ... + * + * @param event: ENUM_XPOI_EVENTS member, Specified Occured Event ... + * @param param: XCBasePOI implementation, Specified Event Object ... + */ + void NotifyEventListeners( + ENUM_XPOI_EVENTS event, + XCBasePOI *param // + ) + { + // + int count = ArraySize(mEventListeners); + if (!IsValidSize(count)) + { + return; + } + + // + for (int i = 0; i < count; i++) + { + // + mEventListeners[i]( + event, + param // + ); + } + } + + void AddObjectIfNotExists(XCBaseObject *object) + { + // + string name = object.ObjName(); + + // + bool canAdd = true; + int count = mDrawnObjects.Total(); + if (IsValidSize(count)) + { + // + for (int i = 0; i < count; i++) + { + // + string iName = ((XCBaseObject *)mDrawnObjects.At(i)).ObjName(); + + // + if (name == iName) + { + // + canAdd = false; + break; + } + } + } + + // + if (canAdd) + { + mDrawnObjects.Add(object); + } + } + + // + private: + // + + // + // Props ... + + // + bool mLock; // Lock State ... + string mSymbol; // Market Symbol ... + ENUM_TIMEFRAMES mPeriod; // Market Period ... + int mMaxNumberOfPOIs; // Max Allowed Number of POI(s) which Can Holds ... + int mMaxNumberOfRequiredPOIs; // Max Allowed Number of POI(s) which Must Find at Initializion Time ... + + // + CArrayObj mDrawnObjects; // Drawn Objects ... + XBarTracker mBarTracker; // Market Bar Tracker ... + XCBarAnalyser mBarAnalyser; // Bar Analyser ... + + // + TOnPOIEvent mEventListeners[]; // Event Listeners ... + + // + // POI Props ... + + // + // XDay ... + + // + // XSession ... + + // + // XSwing ... + int mSwingRange; // Swing Verification Range Length ... + + // + // Swing High ... + + // + XCSwing *mSwingHighs[]; // Holds Founded Swing Highs ... + + /** + * Detect Required Swing Highs ... + * + * @param barIndex: Integer Start bar index ... + * 0 is Default ... + * + * @return ( int ) + */ + int DetectRequiredSwingHighs(int barIndex = 0) + { + // + int result = 0; + + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + int required = MaxNumberOfRequiredPOIs(); + if (required <= 0) + { + return result; + } + + // + int count = ArraySize(mSwingHighs); + if (count >= required) + { + // + result = count; + return result; + } + + // + int range = SwingRange(); + if (range < 0 || barIndex < range) + { + return result; + } + + // + string symbol = GetSymbol(); + ENUM_TIMEFRAMES period = GetPeriod(); + + // + XOHCL bar; + bool isInited = bar.Init( + symbol, + period, + barIndex // + ); + if (!isInited) + { + return result; + } + + // + DetectSwingHigh(bar); + + // + result = ArraySize(mSwingHighs); + + // + return result; + } + + // + // Swing Low ... + + // + XCSwing *mSwingLows[]; // Holds Founded Swing Lows ... + + /** + * Detect Required Swing Lows ... + * + * @param barIndex: Integer Start bar index ... + * 0 is Default ... + * + * @return ( int ) + */ + int DetectRequiredSwingLows(int barIndex = 0) + { + // + int result = 0; + + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + int required = MaxNumberOfRequiredPOIs(); + if (required <= 0) + { + return result; + } + + // + int count = ArraySize(mSwingLows); + if (count >= required) + { + // + result = count; + return result; + } + + // + int range = SwingRange(); + if (range < 0 || barIndex < range) + { + return result; + } + + // + string symbol = GetSymbol(); + ENUM_TIMEFRAMES period = GetPeriod(); + + // + XOHCL bar; + bool isInited = bar.Init( + symbol, + period, + barIndex // + ); + if (!isInited) + { + return result; + } + + // + DetectSwingLow(bar); + + // + result = ArraySize(mSwingLows); + + // + return result; + } + + // + // Momentum Bars ... + int mMomentumBarExtendRange; // Momentum Bars must Extends Range ... + double mMomentumBarBodyPercent; // Momentum Bars Body Percent ... + + // + // Bullish ... + XCMomentumBar *mBullishMomentumBars[]; // Holds Founded Bullish Momentum Bars ... + + /** + * Detect Required Bullish Momentum Bars ... + * + * @param barIndex: Integer Start bar index ... + * 0 is Default ... + * + * @return ( int ) + */ + int DetectRequiredBullishMomentumBars(int barIndex = 0) + { + // + int result = 0; + + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + int required = MaxNumberOfRequiredPOIs(); + if (required <= 0) + { + return result; + } + + // + int count = ArraySize(mBullishMomentumBars); + if (count >= required) + { + // + result = count; + return result; + } + + // + string symbol = GetSymbol(); + ENUM_TIMEFRAMES period = GetPeriod(); + + // + XOHCL bar; + bool isInited = bar.Init( + symbol, + period, + barIndex // + ); + if (!isInited) + { + return result; + } + + // + DetectBullishMomentumBar(bar); + + // + result = ArraySize(mBullishMomentumBars); + + // + return result; + } + + // + // Bearish ... + XCMomentumBar *mBearishMomentumBars[]; // Holds Founded Bearish Momentum Bars ... + + /** + * Detect Required Bearish Momentum Bars ... + * + * @param barIndex: Integer Start bar index ... + * 0 is Default ... + * + * @return ( int ) + */ + int DetectRequiredBearishMomentumBars(int barIndex = 0) + { + // + int result = 0; + + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + int required = MaxNumberOfRequiredPOIs(); + if (required <= 0) + { + return result; + } + + // + int count = ArraySize(mBearishMomentumBars); + if (count >= required) + { + // + result = count; + return result; + } + + // + string symbol = GetSymbol(); + ENUM_TIMEFRAMES period = GetPeriod(); + + // + XOHCL bar; + bool isInited = bar.Init( + symbol, + period, + barIndex // + ); + if (!isInited) + { + return result; + } + + // + DetectBearishMomentumBar(bar); + + // + result = ArraySize(mBearishMomentumBars); + + // + return result; + } + + // + // Rejection Bars ... + int mRejectionBarExtendRange; // Rejection Bars must Extends Range ... + double mRejectionBarShadowPercent; // Rejection Bars Shadow Percent ... + + // + // Bullish ... + XCRejectionBar *mBullishRejectionBars[]; // Holds Founded Bullish Rejection Bars ... + + /** + * Detect Required Bullish Rejection Bars ... + * + * @param barIndex: Integer Start bar index ... + * 0 is Default ... + * + * @return ( int ) + */ + int DetectRequiredBullishRejectionBars(int barIndex = 0) + { + // + int result = 0; + + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + int required = MaxNumberOfRequiredPOIs(); + if (required <= 0) + { + return result; + } + + // + int count = ArraySize(mBullishRejectionBars); + if (count >= required) + { + // + result = count; + return result; + } + + // + string symbol = GetSymbol(); + ENUM_TIMEFRAMES period = GetPeriod(); + + // + XOHCL bar; + bool isInited = bar.Init( + symbol, + period, + barIndex // + ); + if (!isInited) + { + return result; + } + + // + DetectBullishRejectionBar(bar); + + // + result = ArraySize(mBullishRejectionBars); + + // + return result; + } + + // + // Bearish ... + XCRejectionBar *mBearishRejectionBars[]; // Holds Founded Bearish Rejection Bars ... + + /** + * Detect Required Bearish Rejection Bars ... + * + * @param barIndex: Integer Start bar index ... + * 0 is Default ... + * + * @return ( int ) + */ + int DetectRequiredBearishRejectionBars(int barIndex = 0) + { + // + int result = 0; + + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + int required = MaxNumberOfRequiredPOIs(); + if (required <= 0) + { + return result; + } + + // + int count = ArraySize(mBearishRejectionBars); + if (count >= required) + { + // + result = count; + return result; + } + + // + string symbol = GetSymbol(); + ENUM_TIMEFRAMES period = GetPeriod(); + + // + XOHCL bar; + bool isInited = bar.Init( + symbol, + period, + barIndex // + ); + if (!isInited) + { + return result; + } + + // + DetectBearishRejectionBar(bar); + + // + result = ArraySize(mBearishRejectionBars); + + // + return result; + } + + // + // Support and Resistance Zone ... + int mSupportAndResistanceRange; // Support and Resistance Range for Verification ... + + // + // Support Zone(s) ... + XCSupportZone *mSupportZones[]; // Holds Founded Support Zones ... + + /** + * Detect Required Support Zones ... + * + * @param barIndex: Integer Start bar index ... + * 0 is Default ... + * + * @return ( int ) + */ + int DetectRequiredSupportZones(int barIndex = 0) + { + // + int result = 0; + + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + int required = MaxNumberOfRequiredPOIs(); + if (required <= 0) + { + return result; + } + + // + int count = ArraySize(mSupportZones); + if (count >= required) + { + // + result = count; + return result; + } + + // + int range = SupportAndResistanceRange(); + if (range < 0 || barIndex < range) + { + return result; + } + + // + string symbol = GetSymbol(); + ENUM_TIMEFRAMES period = GetPeriod(); + + // + XOHCL bar; + bool isInited = bar.Init( + symbol, + period, + barIndex // + ); + if (!isInited) + { + return result; + } + + // + DetectSupportZone(bar); + + // + result = ArraySize(mSupportZones); + + // + return result; + } + + // + // Resistance Zone(s) ... + XCResistanceZone *mResistanceZones[]; // Holds Founded Resistance Zones ... + + /** + * Detect Required Resistance Zones ... + * + * @param barIndex: Integer Start bar index ... + * 0 is Default ... + * + * @return ( int ) + */ + int DetectRequiredResistanceZones(int barIndex = 0) + { + // + int result = 0; + + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + int required = MaxNumberOfRequiredPOIs(); + if (required <= 0) + { + return result; + } + + // + int count = ArraySize(mResistanceZones); + if (count >= required) + { + // + result = count; + return result; + } + + // + int range = SupportAndResistanceRange(); + if (range < 0 || barIndex < range) + { + return result; + } + + // + string symbol = GetSymbol(); + ENUM_TIMEFRAMES period = GetPeriod(); + + // + XOHCL bar; + bool isInited = bar.Init( + symbol, + period, + barIndex // + ); + if (!isInited) + { + return result; + } + + // + DetectResistanceZone(bar); + + // + result = ArraySize(mResistanceZones); + + // + return result; + } + + // + // Supply and Demand Zones ... + int mSupplyAndDemandRange; // Supply and Demand Range Verifications ... + + // + // Supply Zone(s) ... + XCSupplyZone *mSupplyZones[]; // Holds Founded Supply Zones ... + + /** + * Detect Required Supply Zones ... + * + * @param barIndex: Integer Start bar index ... + * 0 is Default ... + * + * @return ( int ) + */ + int DetectRequiredSupplyZones(int barIndex) + { + // + int result = 0; + + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + int required = MaxNumberOfRequiredPOIs(); + if (required <= 0) + { + return result; + } + + // + int count = ArraySize(mSupplyZones); + if (count >= required) + { + // + result = count; + return result; + } + + // + int range = SupplyAndDemandRange(); + if (range < 0) + { + return result; + } + + // + string symbol = GetSymbol(); + ENUM_TIMEFRAMES period = GetPeriod(); + + // + XOHCL bar; + bool isInited = bar.Init( + symbol, + period, + barIndex // + ); + if (!isInited) + { + return result; + } + + // + DetectSupplyZone(bar); + + // + result = ArraySize(mSupplyZones); + + // + return result; + } + + // + // Demand Zone(s) ... + XCDemandZone *mDemandZones[]; // Holds Founded Demand Zones ... + + /** + * Detect Required Demand Zones ... + * + * @param barIndex: Integer Start bar index ... + * 0 is Default ... + * + * @return ( int ) + */ + int DetectRequiredDemandZones(int barIndex) + { + // + int result = 0; + + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + int required = MaxNumberOfRequiredPOIs(); + if (required <= 0) + { + return result; + } + + // + int count = ArraySize(mDemandZones); + if (count >= required) + { + // + result = count; + return result; + } + + // + int range = SupplyAndDemandRange(); + if (range < 0) + { + return result; + } + + // + string symbol = GetSymbol(); + ENUM_TIMEFRAMES period = GetPeriod(); + + // + XOHCL bar; + bool isInited = bar.Init( + symbol, + period, + barIndex // + ); + if (!isInited) + { + return result; + } + + // + DetectDemandZone(bar); + + // + result = ArraySize(mDemandZones); + + // + return result; + } + + // + // Order Blocks ... + int mOrderBlocksSameBars; // Order Blocks Detection Bars ... + + // + // Bullish OB ... + XCOrderBlock *mBullishOrderBlocks[]; // Holds Founded Bullish Order Blocks ... + + /** + * Detect Required Bullish Order Blocks ... + * + * @param barIndex: Integer Start bar index ... + * 0 is Default ... + * + * @return ( int ) + */ + int DetectRequiredBullishOrderBlocks(int barIndex) + { + // + int result = 0; + + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + int required = MaxNumberOfRequiredPOIs(); + if (required <= 0) + { + return result; + } + + // + int count = ArraySize(mBullishOrderBlocks); + if (count >= required) + { + // + result = count; + return result; + } + + // + int sameBars = OrderBlocksSameBars(); + if (sameBars < 0) + { + return result; + } + + // + string symbol = GetSymbol(); + ENUM_TIMEFRAMES period = GetPeriod(); + + // + XOHCL bar; + bool isInited = bar.Init( + symbol, + period, + barIndex // + ); + if (!isInited) + { + return result; + } + + // + DetectBullishOrderBlock(bar); + + // + result = ArraySize(mBullishOrderBlocks); + + // + return result; + } + + // + // Bearish OB ... + XCOrderBlock *mBearishOrderBlocks[]; // Holds Founded Bearish Order Blocks ... + + /** + * Detect Required Bearish Order Blocks ... + * + * @param barIndex: Integer Start bar index ... + * 0 is Default ... + * + * @return ( int ) + */ + int DetectRequiredBearishOrderBlocks(int barIndex) + { + // + int result = 0; + + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + int required = MaxNumberOfRequiredPOIs(); + if (required <= 0) + { + return result; + } + + // + int count = ArraySize(mBearishOrderBlocks); + if (count >= required) + { + // + result = count; + return result; + } + + // + int sameBars = OrderBlocksSameBars(); + if (sameBars < 0) + { + return result; + } + + // + string symbol = GetSymbol(); + ENUM_TIMEFRAMES period = GetPeriod(); + + // + XOHCL bar; + bool isInited = bar.Init( + symbol, + period, + barIndex // + ); + if (!isInited) + { + return result; + } + + // + DetectBearishOrderBlock(bar); + + // + result = ArraySize(mBearishOrderBlocks); + + // + return result; + } + + // + // Fair Value Gaps ... + int mFairValueGapsSameBars; // Fair Value Gaps Detection Same Bars ... + + // + // Bullish FVG ... + XCFVG *mBullishFairValueGaps[]; // Holds Founded Bullish Fair Value Gaps ... + + /** + * Detect Required Bullish Fair Value Gaps ... + * + * @param barIndex: Integer Start bar index ... + * 0 is Default ... + * + * @return ( int ) + */ + int DetectRequiredBullishFairValueGaps(int barIndex) + { + // + int result = 0; + + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + int required = MaxNumberOfRequiredPOIs(); + if (required <= 0) + { + return result; + } + + // + int count = ArraySize(mBullishFairValueGaps); + if (count >= required) + { + // + result = count; + return result; + } + + // + int sameBars = FairValueGapsSameBars(); + if (sameBars < 0) + { + return result; + } + + // + string symbol = GetSymbol(); + ENUM_TIMEFRAMES period = GetPeriod(); + + // + XOHCL bar; + bool isInited = bar.Init( + symbol, + period, + barIndex // + ); + if (!isInited) + { + return result; + } + + // + DetectBullishFairValueGap(bar); + + // + result = ArraySize(mBullishFairValueGaps); + + // + return result; + } + + // + // Bearish FVG ... + XCFVG *mBearishFairValueGaps[]; // Holds Founded Bearish Fair Value Gaps ... + + /** + * Detect Required Bearish Fair Value Gaps ... + * + * @param barIndex: Integer Start bar index ... + * 0 is Default ... + * + * @return ( int ) + */ + int DetectRequiredBearishFairValueGaps(int barIndex) + { + // + int result = 0; + + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + int required = MaxNumberOfRequiredPOIs(); + if (required <= 0) + { + return result; + } + + // + int count = ArraySize(mBearishFairValueGaps); + if (count >= required) + { + // + result = count; + return result; + } + + // + int sameBars = FairValueGapsSameBars(); + if (sameBars < 0) + { + return result; + } + + // + string symbol = GetSymbol(); + ENUM_TIMEFRAMES period = GetPeriod(); + + // + XOHCL bar; + bool isInited = bar.Init( + symbol, + period, + barIndex // + ); + if (!isInited) + { + return result; + } + + // + DetectBearishFairValueGap(bar); + + // + result = ArraySize(mBearishFairValueGaps); + + // + return result; + } + + // + // Ticks Range Zones ... + int mTicksRangeZoneLevel; // Ticks Range Levels ... + int mTicksRangeZoneRange; // Ticks Range Zone Loopback Period ... + + // + XCTicksZone *mTicksZone; // Ticks Zone ... + // XCTicksZoneObject *mTicksZoneObject; // Ticks Zone Object ... + + /** + * Detect Ticks Zone Range ... + * + * @param bar: XOHCL instance ... + * + * @return ( bool ) + */ + bool DetectTicksZoneRange(XOHCL &bar) + { + // + bool result = false; + + // + result = bar.IsValid(); + if (!result) + { + return result; + } + + // + int ticksLevels = TicksRangeZoneLevel(); + int ticksRange = TicksRangeZoneRange(); + result = ticksLevels > 0 && + ticksRange > 0; + if (!result) + { + return result; + } + + // + int startBarIndex = bar.Index() + ticksRange; + XOHCL startBar; + result = startBar.Init( + bar.symbol, + bar.period, + startBarIndex // + ); + if (!result) + { + return result; + } + + // + mTicksZone = new XCTicksZone(); + result = mTicksZone.Init( + startBar, + bar // + ); + if (!result) + { + // + mTicksZone = NULL; + return result; + } + + // + return result; + } + + // + // Liquidity Zones ... + + // + // Sell Side ... + + // + // Buy Side ... + + // +}; + +// \ No newline at end of file diff --git a/BKPS/14031206/Classes/x-saherelm.x-poi.drawer.class.ex5 b/BKPS/14031206/Classes/x-saherelm.x-poi.drawer.class.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..172f97817c131a092344e4bbb335dc7092af3e42 GIT binary patch literal 14300 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 literal 0 HcmV?d00001 diff --git a/BKPS/14031206/Classes/x-saherelm.x-poi.drawer.class.mq5 b/BKPS/14031206/Classes/x-saherelm.x-poi.drawer.class.mq5 new file mode 100644 index 0000000..898fa36 --- /dev/null +++ b/BKPS/14031206/Classes/x-saherelm.x-poi.drawer.class.mq5 @@ -0,0 +1,4931 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 Class Library +// -------------------------------------- +// Name: XPOIDrawer +// Description: Provides Point of Interests +// Drawing Tools ... +// +// 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 + +// +// Imports ... +#include "../Classes/x-saherelm.base.class.mq5" +#include "../Classes/x-saherelm.x-cobject.class.mq5" +#include "../Libraries/x-saherelm.x-poi.extensions.lib.mq5" + +// +// Definitions ... +class XCPOIDrawer : public XCBase +{ + // + public: + // + + // + // Constructor ... + void XCPOIDrawer() + { + // + Default(); + } + + // + // Deconstructor ... + void ~XCPOIDrawer() + { + // + Clean(mTicksZoneSpecs); + } + + // + // Setter Getter (s) ... + + /** + * Get Prefix ... + * + * @return ( string ) + */ + string Prefix() + { + return mPrefix; + } + + /** + * Set Prifx ... + * + * @param value: String ... + */ + void Prefix(string value) + { + mPrefix = value; + } + + /** + * Get Chart ID ... + * + * @return ( long ) + */ + long ChartIdentification() + { + return mChartIdentification; + } + + /** + * Set Chart ID ... + * + * @param value: Long ... + */ + void ChartIdentification(long value) + { + // + if (value < 0) + { + value = 0; + } + + // + mChartIdentification = value; + } + + /** + * Get SubWindow Id ... + * + * @return ( int ) + */ + int SubWindowIdentification() + { + return mSubWindowIdentification; + } + + /** + * Set SubWindow Id ... + * + * @param value: Integer ... + */ + void SubWindowIdentification(int value) + { + // + if (value < 0) + { + value = 0; + } + + // + mSubWindowIdentification = value; + } + + // + // XOHCL ... + + /** + * Get Bar Width ... + * + * @return ( int ) + */ + int BarWidth() + { + return mBarWidth; + } + + /** + * Set Bar Width ... + * + * @param value: Integer ... + */ + void BarWidth(int value) + { + // + if (value < 0) + { + value = 0; + } + + // + mBarWidth = value; + } + + /** + * Get Bar Bullish Color ... + * + * @return ( color ) + */ + color BarBullishColor() + { + return mBarBullishColor; + } + + /** + * Set Bar Bullish Color ... + * + * @param value: Color ... + */ + void BarBullishColor(color value) + { + mBarBullishColor = value; + } + + /** + * Get Bar Bearish Color ... + * + * @return ( color ) + */ + color BarBearishColor() + { + return mBarBearishColor; + } + + /** + * Set Bar Bearish Color ... + * + * @param value: Color ... + */ + void BarBearishColor(color value) + { + mBarBearishColor = value; + } + + /** + * Get Fill Bar High Shadow State ... + * + * @return ( bool ) + */ + bool BarFillHighShadow() + { + return mBarFillHighShadow; + } + + /** + * Set Fill Bar High Shadow State ... + * + * @param value: Boolean ... + */ + void BarFillHighShadow(bool value) + { + mBarFillHighShadow = value; + } + + /** + * Get Bar High Shadow Style ... + * + * @return ( ENUM_LINE_STYLE ) + */ + ENUM_LINE_STYLE BarHighShadowStyle() + { + return mBarHighShadowStyle; + } + + /** + * Set Bar High Shadow Style ... + * + * @param value: ENUM_LINE_STYLE member ... + */ + void BarHighShadowStyle(ENUM_LINE_STYLE value) + { + mBarHighShadowStyle = value; + } + + /** + * Get Fill Bar Body State ... + * + * @return ( bool ) + */ + bool BarFillBody() + { + return mBarFillBody; + } + + /** + * Set Fill Bar Body State ... + * + * @param value: Boolean ... + */ + void BarFillBody(bool value) + { + mBarFillBody = value; + } + + /** + * Get Bar Body Style ... + * + * @return ( ENUM_LINE_STYLE ) + */ + ENUM_LINE_STYLE BarBodyStyle() + { + return mBarBodyStyle; + } + + /** + * Set Bar Body Style ... + * + * @param value: ENUM_LINE_STYLE member ... + */ + void BarBodyStyle(ENUM_LINE_STYLE value) + { + mBarBodyStyle = value; + } + + /** + * Get Fill Bar Low Show State ... + * + * @return ( bool ) + */ + bool BarFillLowShadow() + { + return mBarFillLowShadow; + } + + /** + * Set Fill Bar Low Show State ... + * + * @param value: Boolean ... + */ + void BarFillLowShadow(bool value) + { + mBarFillLowShadow = value; + } + + /** + * Get Bar Low Shadow Style ... + * + * @return ( ENUM_LINE_STYLE ) + */ + ENUM_LINE_STYLE BarLowShadowStyle() + { + return mBarLowShadowStyle; + } + + /** + * Set Bar Low Shadow Style ... + * + * @param value: ENUM_LINE_STYLE member ... + */ + void BarLowShadowStyle(ENUM_LINE_STYLE value) + { + mBarLowShadowStyle = value; + } + + // + // Swing Low ... + + /** + * Get Swing Low Width ... + * + * @return ( int ) + */ + int SwingLowWidth() + { + return mSwingLowWidth; + } + + /** + * Set Swing Low Width ... + * + * @param value: Integer ... + */ + void SwingLowWidth(int value) + { + // + if (value < 1) + { + value = 1; + } + + // + mSwingLowWidth = value; + } + + /** + * Get Swing Low Arrow Code ... + * + * @return ( int ) + */ + int SwingLowArrow() + { + return mSwingLowArrow; + } + + /** + * Set Swing Low Arrow Code ... + * + * @param value: Integer ... + */ + void SwingLowArrow(int value) + { + // + mSwingLowArrow = value; + } + + /** + * Get Swing Low Color ... + * + * @return ( color ) + */ + color SwingLowColor() + { + return mSwingLowColor; + } + + /** + * Set Swing Low Color ... + * + * @param value: Color ... + */ + void SwingLowColor(color value) + { + mSwingLowColor = value; + } + + // + // Swing High ... + + /** + * Get Swing High Width ... + * + * @return ( int ) + */ + int SwingHighWidth() + { + return mSwingHighWidth; + } + + /** + * Set Swing High Width ... + * + * @param value: Integer ... + */ + void SwingHighWidth(int value) + { + // + if (value < 1) + { + value = 1; + } + + // + mSwingHighWidth = value; + } + + /** + * Get Swing High Arrow Code ... + * + * @return ( int ) + */ + int SwingHighArrow() + { + return mSwingHighArrow; + } + + /** + * Set Swing High Arrow Code ... + * + * @param value: Integer ... + */ + void SwingHighArrow(int value) + { + // + mSwingHighArrow = value; + } + + /** + * Get Swing High Color ... + * + * @return ( color ) + */ + color SwingHighColor() + { + return mSwingHighColor; + } + + /** + * Set Swing High Color ... + * + * @param value: Color ... + */ + void SwingHighColor(color value) + { + mSwingHighColor = value; + } + + // + // Bullish Momentum Bar ... + + /** + * Get Bullish Momentum Bar Width ... + * + * @return ( int ) + */ + int BullishMomentumBarWidth() + { + return mBullishMomentumBarWidth; + } + + /** + * Set Bullish Momentum Bar Width ... + * + * @param value: Integer ... + */ + void BullishMomentumBarWidth(int value) + { + // + if (value < 1) + { + value = 1; + } + + // + mBullishMomentumBarWidth = value; + } + + /** + * Get Bullish Momentum Bar Arrow Code ... + * + * @return ( int ) + */ + int BullishMomentumBarArrow() + { + return mBullishMomentumBarArrow; + } + + /** + * Set Bullish Momentum Bar Arrow Code ... + * + * @param value: Integer ... + */ + void BullishMomentumBarArrow(int value) + { + // + mBullishMomentumBarArrow = value; + } + + /** + * Get Bullish Momentum Bar Color ... + * + * @return ( color ) + */ + color BullishMomentumBarColor() + { + return mBullishMomentumBarColor; + } + + /** + * Set Bullish Momentum Bar Color ... + * + * @param value: Color ... + */ + void BullishMomentumBarColor(color value) + { + mBullishMomentumBarColor = value; + } + + // + // Bearish Momentum Bar ... + + /** + * Get Bearish Momentum Bar Width ... + * + * @return ( int ) + */ + int BearishMomentumBarWidth() + { + return mBearishMomentumBarWidth; + } + + /** + * Set Bearish Momentum Bar Width ... + * + * @param value: Integer ... + */ + void BearishMomentumBarWidth(int value) + { + // + if (value < 1) + { + value = 1; + } + + // + mBearishMomentumBarWidth = value; + } + + /** + * Get Bearish Momentum Bar Arrow Code ... + * + * @return ( int ) + */ + int BearishMomentumBarArrow() + { + return mBearishMomentumBarArrow; + } + + /** + * Set Bearish Momentum Bar Arrow Code ... + * + * @param value: Integer ... + */ + void BearishMomentumBarArrow(int value) + { + // + mBearishMomentumBarArrow = value; + } + + /** + * Get Bearish Momentum Bar Color ... + * + * @return ( color ) + */ + color BearishMomentumBarColor() + { + return mBearishMomentumBarColor; + } + + /** + * Set Bearish Momentum Bar Color ... + * + * @param value: Color ... + */ + void BearishMomentumBarColor(color value) + { + mBearishMomentumBarColor = value; + } + + // + // Bullish Rejection Bar ... + + /** + * Get Bullish Rejection Bar Width ... + * + * @return ( int ) + */ + int BullishRejectionBarWidth() + { + return mBullishRejectionBarWidth; + } + + /** + * Set Bullish Rejection Bar Width ... + * + * @param value: Integer ... + */ + void BullishRejectionBarWidth(int value) + { + // + if (value < 1) + { + value = 1; + } + + // + mBullishRejectionBarWidth = value; + } + + /** + * Get Bullish Rejection Bar Arrow Code ... + * + * @return ( int ) + */ + int BullishRejectionBarArrow() + { + return mBullishRejectionBarArrow; + } + + /** + * Set Bullish Rejection Bar Arrow Code ... + * + * @param value: Integer ... + */ + void BullishRejectionBarArrow(int value) + { + // + mBullishRejectionBarArrow = value; + } + + /** + * Get Bullish Rejection Bar Color ... + * + * @return ( color ) + */ + color BullishRejectionBarColor() + { + return mBullishRejectionBarColor; + } + + /** + * Set Bullish Rejection Bar Color ... + * + * @param value: Color ... + */ + void BullishRejectionBarColor(color value) + { + mBullishRejectionBarColor = value; + } + + // + // Bearish Rejection Bar ... + + /** + * Get Bearish Rejection Bar Width ... + * + * @return ( int ) + */ + int BearishRejectionBarWidth() + { + return mBearishRejectionBarWidth; + } + + /** + * Set Bearish Rejection Bar Width ... + * + * @param value: Integer ... + */ + void BearishRejectionBarWidth(int value) + { + // + if (value < 1) + { + value = 1; + } + + // + mBearishRejectionBarWidth = value; + } + + /** + * Get Bearish Rejection Bar Arrow Code ... + * + * @return ( int ) + */ + int BearishRejectionBarArrow() + { + return mBearishRejectionBarArrow; + } + + /** + * Set Bearish Rejection Bar Arrow Code ... + * + * @param value: Integer ... + */ + void BearishRejectionBarArrow(int value) + { + // + mBearishRejectionBarArrow = value; + } + + /** + * Get Bearish Rejection Bar Color ... + * + * @return ( color ) + */ + color BearishRejectionBarColor() + { + return mBearishRejectionBarColor; + } + + /** + * Set Bearish Rejection Bar Color ... + * + * @param value: Color ... + */ + void BearishRejectionBarColor(color value) + { + mBearishRejectionBarColor = value; + } + + // + // Supply Zone ... + + /** + * Get Fill Supply Zone ... + * + * @return ( bool ) + */ + bool SupplyZoneFill() + { + return mSupplyZoneFill; + } + + /** + * Set Fill Supply Zone ... + * + * @param value: Boolean ... + */ + void SupplyZoneFill(bool value) + { + mSupplyZoneFill = value; + } + + /** + * Get Supply Zone Width ... + * + * @return ( int ) + */ + int SupplyZoneWidth() + { + return mSupplyZoneWidth; + } + + /** + * Set Supply Zone Width ... + * + * @param value: Integer ... + */ + void SupplyZoneWidth(int value) + { + // + if (value < 1) + { + value = 1; + } + + // + mSupplyZoneWidth = value; + } + + /** + * Get Supply Zone Color ... + * + * @return ( color ) + */ + color SupplyZoneColor() + { + return mSupplyZoneColor; + } + + /** + * Set Supply Zone Color ... + * + * @param value: Color ... + */ + void SupplyZoneColor(color value) + { + mSupplyZoneColor = value; + } + + /** + * Get Supply Zone Style ... + * + * @return ( ENUM_LINE_STYLE ) + */ + ENUM_LINE_STYLE SupplyZoneStyle() + { + return mSupplyZoneStyle; + } + + /** + * Set Supply Zone Style ... + * + * @param value: ENUM_LINE_STYLE member ... + */ + void SupplyZoneStyle(ENUM_LINE_STYLE value) + { + mSupplyZoneStyle = value; + } + + // + // Demand Zone ... + + /** + * Get Fill Demand Zone ... + * + * @return ( bool ) + */ + bool DemandZoneFill() + { + return mDemandZoneFill; + } + + /** + * Set Fill Demand Zone ... + * + * @param value: Boolean ... + */ + void DemandZoneFill(bool value) + { + mDemandZoneFill = value; + } + + /** + * Get Demand Zone Width ... + * + * @return ( int ) + */ + int DemandZoneWidth() + { + return mDemandZoneWidth; + } + + /** + * Set Demand Zone Width ... + * + * @param value: Integer ... + */ + void DemandZoneWidth(int value) + { + // + if (value < 1) + { + value = 1; + } + + // + mDemandZoneWidth = value; + } + + /** + * Get Demand Zone Color ... + * + * @return ( color ) + */ + color DemandZoneColor() + { + return mDemandZoneColor; + } + + /** + * Set Demand Zone Color ... + * + * @param value: Color ... + */ + void DemandZoneColor(color value) + { + mDemandZoneColor = value; + } + + /** + * Get Demand Zone Style ... + * + * @return ( ENUM_LINE_STYLE ) + */ + ENUM_LINE_STYLE DemandZoneStyle() + { + return mDemandZoneStyle; + } + + /** + * Set Demand Zone Style ... + * + * @param value: ENUM_LINE_STYLE member ... + */ + void DemandZoneStyle(ENUM_LINE_STYLE value) + { + mDemandZoneStyle = value; + } + + // + // Resistance Zone ... + + /** + * Get Fill Resistance Zone ... + * + * @return ( bool ) + */ + bool ResistanceZoneFill() + { + return mResistanceZoneFill; + } + + /** + * Set Fill Resistance Zone ... + * + * @param value: Boolean ... + */ + void ResistanceZoneFill(bool value) + { + mResistanceZoneFill = value; + } + + /** + * Get Resistance Zone Width ... + * + * @return ( int ) + */ + int ResistanceZoneWidth() + { + return mResistanceZoneWidth; + } + + /** + * Set Resistance Zone Width ... + * + * @param value: Integer ... + */ + void ResistanceZoneWidth(int value) + { + // + if (value < 1) + { + value = 1; + } + + // + mResistanceZoneWidth = value; + } + + /** + * Get Resistance Zone Color ... + * + * @return ( color ) + */ + color ResistanceZoneColor() + { + return mResistanceZoneColor; + } + + /** + * Set Resistance Zone Color ... + * + * @param value: Color ... + */ + void ResistanceZoneColor(color value) + { + mResistanceZoneColor = value; + } + + /** + * Get Resistance Zone Style ... + * + * @return ( ENUM_LINE_STYLE ) + */ + ENUM_LINE_STYLE ResistanceZoneStyle() + { + return mResistanceZoneStyle; + } + + /** + * Set Resistance Zone Style ... + * + * @param value: ENUM_LINE_STYLE member ... + */ + void ResistanceZoneStyle(ENUM_LINE_STYLE value) + { + mResistanceZoneStyle = value; + } + + // + // Support Zone ... + + /** + * Get Fill Support Zone ... + * + * @return ( bool ) + */ + bool SupportZoneFill() + { + return mSupportZoneFill; + } + + /** + * Set Fill Support Zone ... + * + * @param value: Boolean ... + */ + void SupportZoneFill(bool value) + { + mSupportZoneFill = value; + } + + /** + * Get Support Zone Width ... + * + * @return ( int ) + */ + int SupportZoneWidth() + { + return mSupportZoneWidth; + } + + /** + * Set Support Zone Width ... + * + * @param value: Integer ... + */ + void SupportZoneWidth(int value) + { + // + if (value < 1) + { + value = 1; + } + + // + mSupportZoneWidth = value; + } + + /** + * Get Support Zone Color ... + * + * @return ( color ) + */ + color SupportZoneColor() + { + return mSupportZoneColor; + } + + /** + * Set Support Zone Color ... + * + * @param value: Color ... + */ + void SupportZoneColor(color value) + { + mSupportZoneColor = value; + } + + /** + * Get Support Zone Style ... + * + * @return ( ENUM_LINE_STYLE ) + */ + ENUM_LINE_STYLE SupportZoneStyle() + { + return mSupportZoneStyle; + } + + /** + * Set Support Zone Style ... + * + * @param value: ENUM_LINE_STYLE member ... + */ + void SupportZoneStyle(ENUM_LINE_STYLE value) + { + mSupportZoneStyle = value; + } + + // + // Bullish Order Block ... + + /** + * Get Fill Bullish Order Block ... + * + * @return ( bool ) + */ + bool BullishOrderBlockFill() + { + return mBullishOrderBlockFill; + } + + /** + * Set Fill Bullish Order Block ... + * + * @param value: Boolean ... + */ + void BullishOrderBlockFill(bool value) + { + mBullishOrderBlockFill = value; + } + + /** + * Get Bullish Order Block Width ... + * + * @return ( int ) + */ + int BullishOrderBlockWidth() + { + return mBullishOrderBlockWidth; + } + + /** + * Set Bullish Order Block Width ... + * + * @param value: Integer ... + */ + void BullishOrderBlockWidth(int value) + { + // + if (value < 1) + { + value = 1; + } + + // + mBullishOrderBlockWidth = value; + } + + /** + * Get Bullish Order Block Color ... + * + * @return ( color ) + */ + color BullishOrderBlockColor() + { + return mBullishOrderBlockColor; + } + + /** + * Set Bullish Order Block Color ... + * + * @param value: Color ... + */ + void BullishOrderBlockColor(color value) + { + mBullishOrderBlockColor = value; + } + + /** + * Get Bullish Order Block Style ... + * + * @return ( ENUM_LINE_STYLE ) + */ + ENUM_LINE_STYLE BullishOrderBlockStyle() + { + return mBullishOrderBlockStyle; + } + + /** + * Set Bullish Order Block Style ... + * + * @param value: ENUM_LINE_STYLE member ... + */ + void BullishOrderBlockStyle(ENUM_LINE_STYLE value) + { + mBullishOrderBlockStyle = value; + } + + // + // Bearish Order Block ... + + /** + * Get Fill Bearish Order Block ... + * + * @return ( bool ) + */ + bool BearishOrderBlockFill() + { + return mBearishOrderBlockFill; + } + + /** + * Set Fill Bearish Order Block ... + * + * @param value: Boolean ... + */ + void BearishOrderBlockFill(bool value) + { + mBearishOrderBlockFill = value; + } + + /** + * Get Bearish Order Block Width ... + * + * @return ( int ) + */ + int BearishOrderBlockWidth() + { + return mBearishOrderBlockWidth; + } + + /** + * Set Bearish Order Block Width ... + * + * @param value: Integer ... + */ + void BearishOrderBlockWidth(int value) + { + // + if (value < 1) + { + value = 1; + } + + // + mBearishOrderBlockWidth = value; + } + + /** + * Get Bearish Order Block Color ... + * + * @return ( color ) + */ + color BearishOrderBlockColor() + { + return mBearishOrderBlockColor; + } + + /** + * Set Bearish Order Block Color ... + * + * @param value: Color ... + */ + void BearishOrderBlockColor(color value) + { + mBearishOrderBlockColor = value; + } + + /** + * Get Bearish Order Block Style ... + * + * @return ( ENUM_LINE_STYLE ) + */ + ENUM_LINE_STYLE BearishOrderBlockStyle() + { + return mBearishOrderBlockStyle; + } + + /** + * Set Bearish Order Block Style ... + * + * @param value: ENUM_LINE_STYLE member ... + */ + void BearishOrderBlockStyle(ENUM_LINE_STYLE value) + { + mBearishOrderBlockStyle = value; + } + + // + // Bullish FVG ... + + /** + * Get Fill Bullish FVG ... + * + * @return ( bool ) + */ + bool BullishFVGFill() + { + return mBullishFVGFill; + } + + /** + * Set Fill Bullish FVG ... + * + * @param value: Boolean ... + */ + void BullishFVGFill(bool value) + { + mBullishFVGFill = value; + } + + /** + * Get Bullish FVG Width ... + * + * @return ( int ) + */ + int BullishFVGWidth() + { + return mBullishFVGWidth; + } + + /** + * Set Bullish FVG Width ... + * + * @param value: Integer ... + */ + void BullishFVGWidth(int value) + { + // + if (value < 1) + { + value = 1; + } + + // + mBullishFVGWidth = value; + } + + /** + * Get Bullish FVG Color ... + * + * @return ( color ) + */ + color BullishFVGColor() + { + return mBullishFVGColor; + } + + /** + * Set Bullish FVG Color ... + * + * @param value: Color ... + */ + void BullishFVGColor(color value) + { + mBullishFVGColor = value; + } + + /** + * Get Bullish FVG Style ... + * + * @return ( ENUM_LINE_STYLE ) + */ + ENUM_LINE_STYLE BullishFVGStyle() + { + return mBullishFVGStyle; + } + + /** + * Set Bullish FVG Style ... + * + * @param value: ENUM_LINE_STYLE member ... + */ + void BullishFVGStyle(ENUM_LINE_STYLE value) + { + mBullishFVGStyle = value; + } + + // + // Bearish FVG ... + + /** + * Get Fill Bearish FVG ... + * + * @return ( bool ) + */ + bool BearishFVGFill() + { + return mBearishFVGFill; + } + + /** + * Set Fill Bearish FVG ... + * + * @param value: Boolean ... + */ + void BearishFVGFill(bool value) + { + mBearishFVGFill = value; + } + + /** + * Get Bearish FVG Width ... + * + * @return ( int ) + */ + int BearishFVGWidth() + { + return mBearishFVGWidth; + } + + /** + * Set Bearish FVG Width ... + * + * @param value: Integer ... + */ + void BearishFVGWidth(int value) + { + // + if (value < 1) + { + value = 1; + } + + // + mBearishFVGWidth = value; + } + + /** + * Get Bearish FVG Color ... + * + * @return ( color ) + */ + color BearishFVGColor() + { + return mBearishFVGColor; + } + + /** + * Set Bearish FVG Color ... + * + * @param value: Color ... + */ + void BearishFVGColor(color value) + { + mBearishFVGColor = value; + } + + /** + * Get Bearish FVG Style ... + * + * @return ( ENUM_LINE_STYLE ) + */ + ENUM_LINE_STYLE BearishFVGStyle() + { + return mBearishFVGStyle; + } + + /** + * Set Bearish FVG Style ... + * + * @param value: ENUM_LINE_STYLE member ... + */ + void BearishFVGStyle(ENUM_LINE_STYLE value) + { + mBearishFVGStyle = value; + } + + // + // Virtuals ... + + /** + * Apply Default Configurations ... + */ + virtual void Default() + { + // + // Apply Default Props ... + + // + Prefix(NULL); + ChartIdentification(0); + SubWindowIdentification(0); + + // + BarWidth(1); + BarBearishColor(clrRed); + BarBullishColor(clrLime); + BarFillBody(false); + BarFillHighShadow(false); + BarFillLowShadow(false); + BarBodyStyle(STYLE_DOT); + BarLowShadowStyle(STYLE_DOT); + BarHighShadowStyle(STYLE_DOT); + + // + int arrowWidth = 1; + + // + SwingLowArrow(108); + SwingLowColor(clrAqua); + SwingLowWidth(arrowWidth); + + // + SwingHighArrow(108); + SwingHighWidth(arrowWidth); + SwingHighColor(clrMagenta); + + // + arrowWidth++; + + // + BullishMomentumBarArrow(225); + BullishMomentumBarWidth(arrowWidth); + BullishMomentumBarColor(clrAqua); + + // + BearishMomentumBarArrow(226); + BearishMomentumBarWidth(arrowWidth); + BearishMomentumBarColor(clrMagenta); + + // + arrowWidth++; + + // + BullishRejectionBarArrow(217); + BullishRejectionBarWidth(arrowWidth); + BullishRejectionBarColor(clrAqua); + + // + BearishRejectionBarArrow(218); + BearishRejectionBarWidth(arrowWidth); + BearishRejectionBarColor(clrMagenta); + + // + SupportZoneFill(false); + SupportZoneWidth(1); + SupportZoneStyle(STYLE_DOT); + SupportZoneColor(clrLime); + + // + ResistanceZoneFill(false); + ResistanceZoneWidth(1); + ResistanceZoneStyle(STYLE_DOT); + ResistanceZoneColor(clrRed); + + // + SupplyZoneFill(false); + SupplyZoneWidth(1); + SupplyZoneStyle(STYLE_DOT); + SupplyZoneColor(clrRed); + + // + DemandZoneFill(false); + DemandZoneWidth(1); + DemandZoneStyle(STYLE_DOT); + DemandZoneColor(clrGreen); + + // + BullishOrderBlockFill(false); + BullishOrderBlockWidth(1); + BullishOrderBlockStyle(STYLE_DASHDOT); + BullishOrderBlockColor(clrLime); + + // + BearishOrderBlockFill(false); + BearishOrderBlockWidth(1); + BearishOrderBlockStyle(STYLE_DASHDOT); + BearishOrderBlockColor(clrRed); + + // + BullishFVGFill(false); + BullishFVGWidth(1); + BullishFVGStyle(STYLE_DOT); + BullishFVGColor(clrLime); + + // + BearishFVGFill(false); + BearishFVGWidth(1); + BearishFVGStyle(STYLE_DOT); + BearishFVGColor(clrRed); + + // + // Add Default TickZone Specs ... + bool isSpecsInited = false; + bool fillTickZone = false; + XTickZoneLevelSpecs specs10; + isSpecsInited = specs10.Init( + 10, + clrWhite, + clrWhite, + fillTickZone // + ); + if (isSpecsInited) + { + AddTickZoneLevelSpecs(specs10); + } + + // + XTickZoneLevelSpecs specs20; + isSpecsInited = specs20.Init( + 20, + clrOrange, + clrOrange, + fillTickZone // + ); + if (isSpecsInited) + { + AddTickZoneLevelSpecs(specs20); + } + + // + XTickZoneLevelSpecs specs30; + isSpecsInited = specs30.Init( + 30, + clrOrange, + clrOrange, + fillTickZone // + ); + if (isSpecsInited) + { + AddTickZoneLevelSpecs(specs30); + } + + // + XTickZoneLevelSpecs specs40; + isSpecsInited = specs40.Init( + 40, + clrOrange, + clrOrange, + fillTickZone // + ); + if (isSpecsInited) + { + AddTickZoneLevelSpecs(specs40); + } + + // + XTickZoneLevelSpecs specs50; + isSpecsInited = specs50.Init( + 50, + clrYellow, + clrYellow, + fillTickZone // + ); + if (isSpecsInited) + { + AddTickZoneLevelSpecs(specs50); + } + + // + XTickZoneLevelSpecs specs60; + isSpecsInited = specs60.Init( + 60, + clrYellow, + clrYellow, + fillTickZone // + ); + if (isSpecsInited) + { + AddTickZoneLevelSpecs(specs60); + } + + // + XTickZoneLevelSpecs specs70; + isSpecsInited = specs70.Init( + 70, + clrYellow, + clrYellow, + fillTickZone // + ); + if (isSpecsInited) + { + AddTickZoneLevelSpecs(specs70); + } + + // + XTickZoneLevelSpecs specs80; + isSpecsInited = specs80.Init( + 80, + clrRed, + clrRed, + fillTickZone // + ); + if (isSpecsInited) + { + AddTickZoneLevelSpecs(specs80); + } + + // + XTickZoneLevelSpecs specs90; + isSpecsInited = specs90.Init( + 90, + clrRed, + clrRed, + fillTickZone // + ); + if (isSpecsInited) + { + AddTickZoneLevelSpecs(specs90); + } + + // + XTickZoneLevelSpecs specs100; + isSpecsInited = specs100.Init( + 100, + clrRed, + clrRed, + fillTickZone // + ); + if (isSpecsInited) + { + AddTickZoneLevelSpecs(specs100); + } + + // + } + + // + // Object Creators ... + + // + // Swings ... + + /** + * Create Swing High Object ... + * + * @param swing: XCSwing instance ... + * @param object: XCSwingHighObject pointer ... + * + * @return ( bool ) + */ + bool CreateSwingHigh( + XCSwing &swing, + XCSwingHighObject *&object // + ) + { + // + bool result = false; + + // + object = NULL; + + // + result = + swing.IsValid() && + swing.IsSwingHigh(); + if (!result) + { + return result; + } + + // + string prefix = Prefix(); + long chartID = ChartIdentification(); + int window = SubWindowIdentification(); + + // + int arrow = SwingHighArrow(); + int width = SwingHighWidth(); + color crl = SwingHighColor(); + + // + object = new XCSwingHighObject(); + result = object.Create( + chartID, + window, + arrow, + swing, + prefix // + ); + + // + if (!result) + { + return result; + } + + // + object.ArrowColor(crl); + object.ArrowWidth(width); + object.ArrowAnchor(ANCHOR_BOTTOM); + + // + return result; + } + + /** + * Create Swing Low Object ... + * + * @param swing: XCSwing instance ... + * @param object: XCSwingLowObject pointer ... + * + * @return ( bool ) + */ + bool CreateSwingLow( + XCSwing &swing, + XCSwingLowObject *&object // + ) + { + // + bool result = false; + + // + object = NULL; + + // + result = + swing.IsValid() && + swing.IsSwingLow(); + if (!result) + { + return result; + } + + // + string prefix = Prefix(); + long chartID = ChartIdentification(); + int window = SubWindowIdentification(); + + // + int arrow = SwingLowArrow(); + int width = SwingLowWidth(); + color crl = SwingLowColor(); + + // + object = new XCSwingLowObject(); + result = object.Create( + chartID, + window, + arrow, + swing, + prefix // + ); + + // + if (!result) + { + return result; + } + + // + object.ArrowColor(crl); + object.ArrowWidth(width); + object.ArrowAnchor(ANCHOR_TOP); + + // + return result; + } + + // + // Momentum Bars ... + + /** + * Create Bullish Momentum Bar Object ... + * + * @param momentumBar: XCMomentumBar instance ... + * @param object: XCBullishMomentumObject pointer ... + * + * @return ( bool ) + */ + bool CreateBullishMomentumBar( + XCMomentumBar &momentumBar, + XCBullishMomentumBarObject *&object // + ) + { + // + bool result = false; + + // + object = NULL; + + // + result = + momentumBar.IsValid() && + momentumBar.IsBullish(); + if (!result) + { + return result; + } + + // + string prefix = Prefix(); + long chartID = ChartIdentification(); + int window = SubWindowIdentification(); + + // + int arrow = BullishMomentumBarArrow(); + int width = BullishMomentumBarWidth(); + color crl = BullishMomentumBarColor(); + + // + object = new XCBullishMomentumBarObject(); + result = object.Create( + chartID, + window, + arrow, + momentumBar, + prefix // + ); + + // + if (!result) + { + return result; + } + + // + object.ArrowColor(crl); + object.ArrowWidth(width); + object.ArrowAnchor(ANCHOR_TOP); + + // + return result; + } + + /** + * Create Bearish Momentum Bar Object ... + * + * @param momentumBar: XCMomentumBar instance ... + * @param object: XCBearishMomentumObject pointer ... + * + * @return ( bool ) + */ + bool CreateBearishMomentumBar( + XCMomentumBar &momentumBar, + XCBearishMomentumBarObject *&object // + ) + { + // + bool result = false; + + // + object = NULL; + + // + result = + momentumBar.IsValid() && + momentumBar.IsBearish(); + if (!result) + { + return result; + } + + // + string prefix = Prefix(); + long chartID = ChartIdentification(); + int window = SubWindowIdentification(); + + // + int arrow = BearishMomentumBarArrow(); + int width = BearishMomentumBarWidth(); + color crl = BearishMomentumBarColor(); + + // + object = new XCBearishMomentumBarObject(); + result = object.Create( + chartID, + window, + arrow, + momentumBar, + prefix // + ); + + // + if (!result) + { + return result; + } + + // + object.ArrowColor(crl); + object.ArrowWidth(width); + object.ArrowAnchor(ANCHOR_BOTTOM); + + // + return result; + } + + // + // Rejection Bars ... + + /** + * Create Bullish Rejection Bar Object ... + * + * @param momentumBar: XCRejectionBar instance ... + * @param object: XCBullishRejectionObject pointer ... + * + * @return ( bool ) + */ + bool CreateBullishRejectionBar( + XCRejectionBar &rejectionBar, + XCBullishRejectionBarObject *&object // + ) + { + // + bool result = false; + + // + object = NULL; + + // + result = + rejectionBar.IsValid() && + rejectionBar.IsBullish(); + if (!result) + { + return result; + } + + // + string prefix = Prefix(); + long chartID = ChartIdentification(); + int window = SubWindowIdentification(); + + // + int arrow = BullishRejectionBarArrow(); + int width = BullishRejectionBarWidth(); + color crl = BullishRejectionBarColor(); + + // + object = new XCBullishRejectionBarObject(); + result = object.Create( + chartID, + window, + arrow, + rejectionBar, + prefix // + ); + + // + if (!result) + { + return result; + } + + // + object.ArrowColor(crl); + object.ArrowWidth(width); + object.ArrowAnchor(ANCHOR_TOP); + + // + return result; + } + + /** + * Create Bearish Rejection Bar Object ... + * + * @param rejectionBar: XCRejectionBar instance ... + * @param object: XCBearishRejectionObject pointer ... + * + * @return ( bool ) + */ + bool CreateBearishRejectionBar( + XCRejectionBar &rejectionBar, + XCBearishRejectionBarObject *&object // + ) + { + // + bool result = false; + + // + object = NULL; + + // + result = + rejectionBar.IsValid() && + rejectionBar.IsBearish(); + if (!result) + { + return result; + } + + // + string prefix = Prefix(); + long chartID = ChartIdentification(); + int window = SubWindowIdentification(); + + // + int arrow = BearishRejectionBarArrow(); + int width = BearishRejectionBarWidth(); + color crl = BearishRejectionBarColor(); + + // + object = new XCBearishRejectionBarObject(); + result = object.Create( + chartID, + window, + arrow, + rejectionBar, + prefix // + ); + + // + if (!result) + { + return result; + } + + // + object.ArrowColor(crl); + object.ArrowWidth(width); + object.ArrowAnchor(ANCHOR_BOTTOM); + + // + return result; + } + + // + // Support and Resistance ... + + /** + * Create Support Object ... + * + * @param zone: XCSupportZone instance ... + * @param object: XCSupportZoneObject pointer ... + * + * @return ( bool ) + */ + bool CreateSupportZone( + XCSupportZone &zone, + XCSupportZoneObject *&object // + ) + { + // + bool result = false; + + // + object = NULL; + + // + result = + zone.IsValid(); + if (!result) + { + return result; + } + + // + string prefix = Prefix(); + long chartID = ChartIdentification(); + int window = SubWindowIdentification(); + + // + bool fill = SupportZoneFill(); + int width = SupportZoneWidth(); + color crl = SupportZoneColor(); + ENUM_LINE_STYLE style = SupportZoneStyle(); + + // + object = new XCSupportZoneObject(); + result = object.Create( + chartID, + window, + zone, + prefix // + ); + + // + if (!result) + { + return result; + } + + // + object.ZoneFill(fill); + object.ZoneColor(crl); + object.ZoneWidth(width); + object.ZoneStyle(style); + + // + return result; + } + + /** + * Create Resistance Object ... + * + * @param zone: XCResistanceZone instance ... + * @param object: XCResistanceZoneObject pointer ... + * + * @return ( bool ) + */ + bool CreateResistanceZone( + XCResistanceZone &zone, + XCResistanceZoneObject *&object // + ) + { + // + bool result = false; + + // + object = NULL; + + // + result = + zone.IsValid(); + if (!result) + { + return result; + } + + // + string prefix = Prefix(); + long chartID = ChartIdentification(); + int window = SubWindowIdentification(); + + // + bool fill = ResistanceZoneFill(); + int width = ResistanceZoneWidth(); + color crl = ResistanceZoneColor(); + ENUM_LINE_STYLE style = ResistanceZoneStyle(); + + // + object = new XCResistanceZoneObject(); + result = object.Create( + chartID, + window, + zone, + prefix // + ); + + // + if (!result) + { + return result; + } + + // + object.ZoneFill(fill); + object.ZoneColor(crl); + object.ZoneWidth(width); + object.ZoneStyle(style); + + // + return result; + } + + // + // Supply and Demand Zones ... + + /** + * Create Supply Object ... + * + * @param zone: XCSupplyZone instance ... + * @param object: XCSupplyZoneObject pointer ... + * + * @return ( bool ) + */ + bool CreateSupplyZone( + XCSupplyZone &zone, + XCSupplyZoneObject *&object // + ) + { + // + bool result = false; + + // + object = NULL; + + // + result = + zone.IsValid(); + if (!result) + { + return result; + } + + // + string prefix = Prefix(); + long chartID = ChartIdentification(); + int window = SubWindowIdentification(); + + // + bool fill = SupplyZoneFill(); + int width = SupplyZoneWidth(); + color crl = SupplyZoneColor(); + ENUM_LINE_STYLE style = SupplyZoneStyle(); + + // + object = new XCSupplyZoneObject(); + result = object.Create( + chartID, + window, + zone, + prefix // + ); + + // + if (!result) + { + return result; + } + + // + object.ZoneFill(fill); + object.ZoneColor(crl); + object.ZoneWidth(width); + object.ZoneStyle(style); + + // + return result; + } + + /** + * Create Demand Object ... + * + * @param zone: XCDemandZone instance ... + * @param object: XCDemandZoneObject pointer ... + * + * @return ( bool ) + */ + bool CreateDemandZone( + XCDemandZone &zone, + XCDemandZoneObject *&object // + ) + { + // + bool result = false; + + // + object = NULL; + + // + result = + zone.IsValid(); + if (!result) + { + return result; + } + + // + string prefix = Prefix(); + long chartID = ChartIdentification(); + int window = SubWindowIdentification(); + + // + bool fill = DemandZoneFill(); + int width = DemandZoneWidth(); + color crl = DemandZoneColor(); + ENUM_LINE_STYLE style = DemandZoneStyle(); + + // + object = new XCDemandZoneObject(); + result = object.Create( + chartID, + window, + zone, + prefix // + ); + + // + if (!result) + { + return result; + } + + // + object.ZoneFill(fill); + object.ZoneColor(crl); + object.ZoneWidth(width); + object.ZoneStyle(style); + + // + return result; + } + + // + // Order Blocks ... + + /** + * Create Bullish Order Block Object ... + * + * @param zone: XCOrderBlock instance ... + * @param object: XCBullishOrderBlockObject pointer ... + * + * @return ( bool ) + */ + bool CreateBullishOrderBlock( + XCOrderBlock &zone, + XCBullishOrderBlockObject *&object // + ) + { + // + bool result = false; + + // + object = NULL; + + // + result = + zone.IsValid() && + zone.IsBullish(); + if (!result) + { + return result; + } + + // + string prefix = Prefix(); + long chartID = ChartIdentification(); + int window = SubWindowIdentification(); + + // + bool fill = BullishOrderBlockFill(); + int width = BullishOrderBlockWidth(); + color crl = BullishOrderBlockColor(); + ENUM_LINE_STYLE style = BullishOrderBlockStyle(); + + // + object = new XCBullishOrderBlockObject(); + result = object.Create( + chartID, + window, + zone, + prefix // + ); + + // + if (!result) + { + return result; + } + + // + object.ZoneFill(fill); + object.ZoneColor(crl); + object.ZoneWidth(width); + object.ZoneStyle(style); + + // + return result; + } + + /** + * Create Bearish Order Block Object ... + * + * @param zone: XCOrderBlock instance ... + * @param object: XCBearishOrderBlockObject pointer ... + * + * @return ( bool ) + */ + bool CreateBearishOrderBlock( + XCOrderBlock &zone, + XCBearishOrderBlockObject *&object // + ) + { + // + bool result = false; + + // + object = NULL; + + // + result = + zone.IsValid() && + zone.IsBearish(); + if (!result) + { + return result; + } + + // + string prefix = Prefix(); + long chartID = ChartIdentification(); + int window = SubWindowIdentification(); + + // + bool fill = BearishOrderBlockFill(); + int width = BearishOrderBlockWidth(); + color crl = BearishOrderBlockColor(); + ENUM_LINE_STYLE style = BearishOrderBlockStyle(); + + // + object = new XCBearishOrderBlockObject(); + result = object.Create( + chartID, + window, + zone, + prefix // + ); + + // + if (!result) + { + return result; + } + + // + object.ZoneFill(fill); + object.ZoneColor(crl); + object.ZoneWidth(width); + object.ZoneStyle(style); + + // + return result; + } + + bool CreateOrderBlock( + XCOrderBlock &zone, + XCBaseObject *&object // + ) + { + // + bool result = false; + + // + object = NULL; + + // + result = zone.IsValid(); + if (!result) + { + return result; + } + + // + bool isBullish = zone.IsBullish(); + if (isBullish) + { + // + XCBullishOrderBlockObject *iObj; + result = CreateBullishOrderBlock( + zone, + iObj // + ); + if (result) + { + object = (XCBaseObject *)iObj; + } + } + else + { + // + XCBearishOrderBlockObject *iObj; + result = CreateBearishOrderBlock( + zone, + iObj // + ); + if (result) + { + object = (XCBaseObject *)iObj; + } + } + + // + return result; + } + + // + // Fair Value Gaps ... + + /** + * Create Bullish Fair Value Gap Object ... + * + * @param zone: XCFVG instance ... + * @param object: XCBullishOrderBlockObject pointer ... + * + * @return ( bool ) + */ + bool CreateBullishFairValueGap( + XCFVG &zone, + XCBullishFairValueGapObject *&object // + ) + { + // + bool result = false; + + // + result = zone.IsValid() && + zone.IsBullish(); + if (!result) + { + return result; + } + + // + string prefix = Prefix(); + long chartID = ChartIdentification(); + int window = SubWindowIdentification(); + + // + bool fill = BullishFVGFill(); + int width = BullishFVGWidth(); + color crl = BullishFVGColor(); + ENUM_LINE_STYLE style = BullishFVGStyle(); + + // + object = new XCBullishFairValueGapObject(); + result = object.Create( + chartID, + window, + zone, + prefix // + ); + + // + if (!result) + { + return result; + } + + // + object.ZoneFill(fill); + object.ZoneColor(crl); + object.ZoneWidth(width); + object.ZoneStyle(style); + + // + return result; + } + + /** + * Create Bearish Fair Value Gap Object ... + * + * @param zone: XCFVG instance ... + * @param object: XCBearishOrderBlockObject pointer ... + * + * @return ( bool ) + */ + bool CreateBearishFairValueGap( + XCFVG &zone, + XCBearishFairValueGapObject *&object // + ) + { + // + bool result = false; + + // + result = zone.IsValid() && + zone.IsBearish(); + if (!result) + { + return result; + } + + // + string prefix = Prefix(); + long chartID = ChartIdentification(); + int window = SubWindowIdentification(); + + // + bool fill = BearishFVGFill(); + int width = BearishFVGWidth(); + color crl = BearishFVGColor(); + ENUM_LINE_STYLE style = BearishFVGStyle(); + + // + object = new XCBearishFairValueGapObject(); + result = object.Create( + chartID, + window, + zone, + prefix // + ); + + // + if (!result) + { + return result; + } + + // + object.ZoneFill(fill); + object.ZoneColor(crl); + object.ZoneWidth(width); + object.ZoneStyle(style); + + // + return result; + } + + bool CreateFairValueGap( + XCFVG &zone, + XCBaseObject *&object // + ) + { + // + bool result = false; + + // + object = NULL; + + // + result = zone.IsValid(); + if (!result) + { + return result; + } + + // + bool isBullish = zone.IsBullish(); + if (isBullish) + { + // + XCBullishFairValueGapObject *iObj; + result = CreateBullishFairValueGap( + zone, + iObj // + ); + if (result) + { + object = (XCBaseObject *)iObj; + } + } + else + { + // + XCBearishFairValueGapObject *iObj; + result = CreateBearishFairValueGap( + zone, + iObj // + ); + if (result) + { + object = (XCBaseObject *)iObj; + } + } + + // + return result; + } + + // + // Ticks Zone ... + + /** + * Add Tick Zone Draw Specifications ... + * + * @param specs: XTickZoneLevelSpecs instance ... + */ + void AddTickZoneLevelSpecs( + XTickZoneLevelSpecs &specs // + ) + { + // + if (!specs.IsValid()) + { + return; + } + + // + bool isExists = false; + int count = ArraySize(mTicksZoneSpecs); + if (IsValidSize(count)) + { + // + for (int i = 0; i < count; i++) + { + // + XTickZoneLevelSpecs iSpec = mTicksZoneSpecs[i]; + + // + isExists = specs.percent == iSpec.percent; + if (isExists) + { + break; + } + } + } + if (isExists) + { + return; + } + + // + AddRef( + specs, + mTicksZoneSpecs // + ); + } + + /** + * Draw Specified Ticker Zone ... + * + * @param zone: XCTicksZone instance Specified Ticker Zone ... + * @param object: XCTicksZoneObject pointer ... + * + * @return ( bool ) + */ + bool CreateTicksZone( + XCTicksZone &zone, + XCTicksZoneObject *&object // + ) + { + // + bool result = false; + + // + object = NULL; + + // + result = zone.IsValid(); + if (!result) + { + return result; + } + + // + string prefix = Prefix(); + long chartID = ChartIdentification(); + int window = SubWindowIdentification(); + + // + object = new XCTicksZoneObject(); + result = object.Create( + chartID, + window, + zone, + mTicksZoneSpecs, + prefix // + ); + + // + if (!result) + { + return result; + } + + // + return result; + } + + /** + * Create Trend Line Object ... + * + * @param swings: XSwingPoint instance Collection ... + * + * @return ( bool ) + */ + bool CreateTrend( + XSwingPoint &swings[], + XCTrendObject *&object // + ) + { + // + bool result = false; + + // + object = NULL; + + // + result = ArraySize(swings) >= 2 && + IsValidSize(ArraySize(swings)); + if (!result) + { + return result; + } + + // + string prefix = Prefix(); + long chartID = ChartIdentification(); + int window = SubWindowIdentification(); + + // + object = new XCTrendObject(); + result = object.Create( + chartID, + window, + swings, + prefix // + ); + + // + if (!result) + { + return result; + } + + // + color clrTrend = swings[0].type == X_SWING_LOW + ? SwingLowColor() + : SwingHighColor(); + object.TrendColor(clrTrend); + object.TrendRayRight(true); + + // + return result; + } + + /** + * Create Trend Line Object ... + * + * @param swings: XSwingPoint instance Collection ... + * @param useMinAsStart: Specified Min Value as Start ... + * + * @return ( bool ) + */ + bool CreateTrend( + XPoint &swings[], + XCTrendObject *&object, + bool useMinAsStart = true // + ) + { + // + bool result = false; + + // + object = NULL; + + // + result = ArraySize(swings) >= 2 && + IsValidSize(ArraySize(swings)); + if (!result) + { + return result; + } + + // + string prefix = Prefix(); + long chartID = ChartIdentification(); + int window = SubWindowIdentification(); + + // + object = new XCTrendObject(); + result = object.Create( + chartID, + window, + swings, + useMinAsStart, + prefix // + ); + + // + if (!result) + { + return result; + } + + // + color clrTrend = useMinAsStart + ? SwingLowColor() + : SwingHighColor(); + object.TrendColor(clrTrend); + object.TrendRayRight(true); + + // + return result; + } + + /** + * Create Consolidation Zone Object ... + * + * @param zone: XConsolidationZone instance Reference ... + * + * @return ( bool ) + */ + bool CreateConsolidationZone( + XConsolidationZone &zone, + XCConsolidationZoneObject *&object // + ) + { + // + bool result = false; + + // + object = NULL; + + // + result = zone.IsValid(); + if (!result) + { + return result; + } + + // + string prefix = Prefix(); + long chartID = ChartIdentification(); + int window = SubWindowIdentification(); + + // + color czColor = IsBullish(zone.breakDir) + ? BarBullishColor() + : BarBearishColor(); + + // + object = new XCConsolidationZoneObject(); + result = object.Create( + chartID, + window, + zone, + prefix // + ); + + // + if (result) + { + object.ZoneColor(czColor); + } + + // + return result; + } + + /** + * Create Bar Object ... + * + * @param bar: XOHCL instance Reference ... + * @param object: XCOHCLObject pointer Reference .. + * @param to: Datetime ... + * + * @return ( bool ) + */ + bool CreateBar( + XOHCL &bar, + XCOHCLObject *&object, + datetime to = NULL // + ) + { + // + bool result = false; + + // + object = NULL; + + // + result = bar.IsValid(); + if (!result) + { + return result; + } + + // + to = NormalizeTime(to); + + // + string prefix = Prefix(); + long chartID = ChartIdentification(); + int window = SubWindowIdentification(); + + // + int width = BarWidth(); + + // + color mBullishColor = BarBullishColor(); + color mBearishColor = BarBearishColor(); + + // + bool fillBody = BarFillBody(); + bool fillHighShadow = BarFillHighShadow(); + bool fillLowShadow = BarFillLowShadow(); + + // + ENUM_LINE_STYLE bodyStyle = BarBodyStyle(); + ENUM_LINE_STYLE highShadowStyle = BarHighShadowStyle(); + ENUM_LINE_STYLE lowShadowStyle = BarLowShadowStyle(); + + // + object = new XCOHCLObject(); + result = object.Create( + chartID, + window, + bar, + to, + prefix // + ); + if (result) + { + // + // Apply Styling ... + + // + object.BodyWidth(width); + object.LowShadowWidth(width); + object.HighShadowWidth(width); + + // + object.BodyStyle(bodyStyle); + object.LowShadowStyle(lowShadowStyle); + object.HighShadowStyle(highShadowStyle); + + // + bool isBullish = bar.IsBullish(); + if (isBullish) + { + // + object.BodyColor(mBullishColor); + object.LowShadowColor(mBullishColor); + object.HighShadowColor(mBullishColor); + } + else + { + // + object.BodyColor(mBearishColor); + object.LowShadowColor(mBearishColor); + object.HighShadowColor(mBearishColor); + } + + // + object.BodyFill(fillBody); + object.HighShadowFill(fillHighShadow); + object.LowShadowFill(fillLowShadow); + } + + // + return result; + } + + /** + * Create Bar Arrow Object ... + * + * @param bar: XOHCL instance Reference ... + * @param priceType: ENUM_X_PRICE member ... + * @param arrow: int, Arrow Code ... + * @param clr: color, Arro Color ... + * @param width: int, Arrow Width ... + * @param anchor: ENUM_ARROW_ANCHOR, anchor of Arrow ... + * @param name: string, name of Arrow ... + * + * @return ( bool ) + */ + bool CreateBarArrow( + XOHCL &bar, + XCBarArrowObject *&object, + ENUM_X_PRICE priceType, + int arrow = 159, + color clr = clrYellow, + int width = 3, + ENUM_ARROW_ANCHOR anchor = ANCHOR_BOTTOM, + string name = NULL // + ) + { + // + bool result = false; + + // + object = NULL; + + // + result = bar.IsValid(); + if (!result) + { + return result; + } + + // + string barTag = bar.GetTag(name); + + // + string prefix = Prefix(); + long chartID = ChartIdentification(); + int window = SubWindowIdentification(); + + // + color mBullishColor = BarBullishColor(); + color mBearishColor = BarBearishColor(); + + // + prefix = + (IsValid(prefix) + ? prefix + "_" + : prefix) + + barTag; + + // + object = new XCBarArrowObject(); + result = object + .CreateByBar( + chartID, + prefix, + window, + arrow, + bar, + priceType // + ); + if (result) + { + // + object.ArrowColor(clr); + object.ArrowWidth(width); + } + + // + return result; + } + + /** + * Create Specific Box on Chart ... + * + * @param upper: Double ... + * @param lower: Double ... + * @param from: Datetime ... + * @param to: Datetime ... + * @param clr: Color ... + * @param width: Integer ... + * @param fill: Boolean ... + * @param style: ENUM_LINE_STYLE member ... + * + * @return ( bool ) + */ + bool CreateBox( + XCBoxObject *&object, + double upper, + double lower, + datetime from, + datetime to, + color clr = clrYellowGreen, + int width = 1, + bool fill = false, + ENUM_LINE_STYLE style = STYLE_SOLID // + ) + { + // + bool result = false; + + // + object = NULL; + + // + to = NormalizeTime(to); + + // + string dateStr = ToFormatString(from) + "|" + ToFormatString(to); + string dateMD5 = ToMD5(dateStr); + string name = "XBox_" + + ToString(upper) + "_" + + ToString(lower) + "_" + + dateMD5; + + // + result = + upper > 0 && + lower > 0 && + to > from && + IsValid(to) && + IsValid(name) && + IsValid(from) && + upper > lower; + if (!result) + { + return result; + } + + // + string prefix = Prefix(); + long chartID = ChartIdentification(); + int window = SubWindowIdentification(); + + // + object = new XCBoxObject(); + result = object.Create( + chartID, + window, + name, + upper, + lower, + from, + to, + prefix // + ); + + // + if (!result) + { + return result; + } + + // + object.BoxColor(clr); + object.BoxFill(fill); + object.BoxWidth(width); + object.BoxStyle(style); + + // + return result; + } + + /** + * Create Specific Box on Chart ... + * + * @param box: XBoxZone instance Reference ... + * @param clr: Color ... + * @param width: Integer ... + * @param fill: Boolean ... + * @param style: ENUM_LINE_STYLE member ... + * + * @return ( bool ) + */ + bool CreateBox( + XBoxZone &box, + XCBoxObject *&object, + color clr = clrYellowGreen, + int width = 1, + bool fill = false, + ENUM_LINE_STYLE style = STYLE_SOLID // + ) + { + // + bool result = false; + + // + object = NULL; + + // + result = box.IsValid(); + if (!result) + { + return result; + } + + // + result = CreateBox( + object, + box.upper, + box.lower, + box.from, + box.to, + clr, + width, + fill, + style // + ); + + // + return result; + } + + /** + * Create Specific Risk Reward (RR) on Chart ... + * + * @param rr: XRR instance Reference ... + * + * @return ( bool ) + */ + bool CreateRR( + XRR &rr, + XCRRObject *&object // + ) + { + // + bool result = false; + + // + object = NULL; + + // + result = rr.IsValid(); + if (!result) + { + return result; + } + + // + string prefix = Prefix(); + long chartID = ChartIdentification(); + int window = SubWindowIdentification(); + + // + object = new XCRRObject(); + result = object.Create( + chartID, + window, + rr, + prefix // + ); + if (!result) + { + return result; + } + + // + return result; + } + + /** + * Draw Specified Signal ... + * + * @param signal: XSignal instance ... + */ + bool DrawSignal( + XSignal &signal, + XCSignalObject *&object // + ) + { + // + bool result = false; + + // + object = NULL; + + // + result = signal.IsValid(); + if (!result) + { + return result; + } + + // + string prefix = Prefix(); + long chartID = ChartIdentification(); + int window = SubWindowIdentification(); + + // + object = new XCSignalObject(); + result = object.Create( + chartID, + window, + signal, + prefix // + ); + if (!result) + { + return result; + } + + // + object.TPWidth(1); + object.TPColor(clrGreen); + object.TPWidth(STYLE_DOT); + + // + object.SLWidth(1); + object.SLColor(clrRed); + object.SLWidth(STYLE_DOT); + + // + object.TargetWidth(1); + object.TargetColor(clrLightBlue); + object.TargetWidth(STYLE_DOT); + + // + object.EntryWidth(1); + object.EntryColor(clrYellow); + object.EntryWidth(STYLE_DOT); + + // + return result; + } + + /** + * Draw Specified POI State ... + * + * @param state: XPOIState instance Reference ... + * @param drawnObjects: CArrayObj instance for Holding Drawn Objects ... + * @param drawTicksZone: Boolean ... + * @param ignoreSwingHighs: Boolean ... + * @param ignoreSwingLows: Boolean ... + * @param ignoreSupportZones: Boolean ... + * @param ignoreResistanceZones: Boolean ... + * @param ignoreSupplyZones: Boolean ... + * @param ignoreDemandZones: Boolean ... + * @param ignoreBullishOrderBlocks: Boolean ... + * @param ignoreBearishOrderBlocks: Boolean ... + * @param ignoreBullishFairValueGaps: Boolean ... + * @param ignoreBearishFairValueGaps: Boolean ... + * @param ignoreBullishRejectionBars: Boolean ... + * @param ignoreBearishRejectionBars: Boolean ... + * @param ignoreBullishMomentumBars: Boolean ... + * @param ignoreBearishMomentumBars: Boolean ... + */ + int DrawState( + XPOIState &state, + XCBaseObject *&drawnObjects[], + bool drawTicksZone = false, + bool ignoreSwingHighs = false, + bool ignoreSwingLows = false, + bool ignoreSupportZones = false, + bool ignoreResistanceZones = false, + bool ignoreSupplyZones = false, + bool ignoreDemandZones = false, + bool ignoreBullishOrderBlocks = false, + bool ignoreBearishOrderBlocks = false, + bool ignoreBullishFairValueGaps = false, + bool ignoreBearishFairValueGaps = false, + bool ignoreBullishRejectionBars = false, + bool ignoreBearishRejectionBars = false, + bool ignoreBullishMomentumBars = false, + bool ignoreBearishMomentumBars = false // + ) + { + // + int result = 0; + + // + if (!state.IsValid() || + !state.HasChild()) + { + return result; + } + + // + Clean(drawnObjects); + + // + // SwingHighs ... + if (!ignoreSwingHighs) + { + // + int count = state.CountSwingHighs(); + if (IsValidSize(count)) + { + // + for (int i = 0; i < count; i++) + { + // + XCSwing *iSwing = state.swingHighs[i]; + XCSwingHighObject *iObj; + + // + bool isCreated = CreateSwingHigh( + iSwing, + iObj // + ); + if (isCreated) + { + // + Add( + (XCBaseObject *)iObj, + drawnObjects // + ); + } + } + } + } + + // + // SwingLows ... + if (!ignoreSwingLows) + { + // + int count = state.CountSwingLows(); + if (IsValidSize(count)) + { + // + for (int i = 0; i < count; i++) + { + // + XCSwing *iSwing = state.swingLows[i]; + XCSwingLowObject *iObj; + + // + bool isCreated = CreateSwingLow( + iSwing, + iObj // + ); + if (isCreated) + { + // + Add( + (XCBaseObject *)iObj, + drawnObjects // + ); + } + } + } + } + + // + // SupportZones ... + if (!ignoreSupportZones) + { + // + int count = state.CountSupportZones(); + if (IsValidSize(count)) + { + // + for (int i = 0; i < count; i++) + { + // + XCSupportZone *iZone = state.supportZones[i]; + XCSupportZoneObject *iObj; + + // + bool isCreated = CreateSupportZone( + iZone, + iObj // + ); + if (isCreated) + { + // + Add( + (XCBaseObject *)iObj, + drawnObjects // + ); + } + } + } + } + + // + // ResistanceZones ... + if (!ignoreResistanceZones) + { + // + int count = state.CountResistanceZones(); + if (IsValidSize(count)) + { + // + for (int i = 0; i < count; i++) + { + // + XCResistanceZone *iZone = state.resistanceZones[i]; + XCResistanceZoneObject *iObj; + + // + bool isCreated = CreateResistanceZone( + iZone, + iObj // + ); + if (isCreated) + { + // + Add( + (XCBaseObject *)iObj, + drawnObjects // + ); + } + } + } + } + + // + // SupplyZones ... + if (!ignoreSupplyZones) + { + // + int count = state.CountSupplyZones(); + if (IsValidSize(count)) + { + // + for (int i = 0; i < count; i++) + { + // + XCSupplyZone *iZone = state.supplyZones[i]; + XCSupplyZoneObject *iObj; + + // + bool isCreated = CreateSupplyZone( + iZone, + iObj // + ); + if (isCreated) + { + // + Add( + (XCBaseObject *)iObj, + drawnObjects // + ); + } + } + } + } + + // + // DemandZones ... + if (!ignoreDemandZones) + { + // + int count = state.CountDemandZones(); + if (IsValidSize(count)) + { + // + for (int i = 0; i < count; i++) + { + // + XCDemandZone *iZone = state.demandZones[i]; + XCDemandZoneObject *iObj; + + // + bool isCreated = CreateDemandZone( + iZone, + iObj // + ); + if (isCreated) + { + // + Add( + (XCBaseObject *)iObj, + drawnObjects // + ); + } + } + } + } + + // + // BullishOrderBlocks ... + if (!ignoreBullishOrderBlocks) + { + // + int count = state.CountBullishOrderBlocks(); + if (IsValidSize(count)) + { + // + for (int i = 0; i < count; i++) + { + // + XCOrderBlock *iZone = state.bullishOrderBlocks[i]; + XCBullishOrderBlockObject *iObj; + + // + bool isCreated = CreateBullishOrderBlock( + iZone, + iObj // + ); + if (isCreated) + { + // + Add( + (XCBaseObject *)iObj, + drawnObjects // + ); + } + } + } + } + + // + // BearishOrderBlocks ... + if (!ignoreBearishOrderBlocks) + { + // + int count = state.CountBearishOrderBlocks(); + if (IsValidSize(count)) + { + // + for (int i = 0; i < count; i++) + { + // + XCOrderBlock *iZone = state.bearishOrderBlocks[i]; + XCBearishOrderBlockObject *iObj; + + // + bool isCreated = CreateBearishOrderBlock( + iZone, + iObj // + ); + if (isCreated) + { + // + Add( + (XCBaseObject *)iObj, + drawnObjects // + ); + } + } + } + } + + // + // BullishFairValueGaps ... + if (!ignoreBullishFairValueGaps) + { + // + int count = state.CountBullishFairValueGaps(); + if (IsValidSize(count)) + { + // + for (int i = 0; i < count; i++) + { + // + XCFVG *iZone = state.bullishFairValueGaps[i]; + XCBullishFairValueGapObject *iObj; + + // + bool isCreated = CreateBullishFairValueGap( + iZone, + iObj // + ); + if (isCreated) + { + // + Add( + (XCBaseObject *)iObj, + drawnObjects // + ); + } + } + } + } + + // + // BearishFairValueGaps ... + if (!ignoreBearishFairValueGaps) + { + // + int count = state.CountBearishFairValueGaps(); + if (IsValidSize(count)) + { + // + for (int i = 0; i < count; i++) + { + // + XCFVG *iZone = state.bearishFairValueGaps[i]; + XCBearishFairValueGapObject *iObj; + + // + bool isCreated = CreateBearishFairValueGap( + iZone, + iObj // + ); + if (isCreated) + { + // + Add( + (XCBaseObject *)iObj, + drawnObjects // + ); + } + } + } + } + + // + // BullishRejectionBars ... + if (!ignoreBullishRejectionBars) + { + // + int count = state.CountBullishRejectionBars(); + if (IsValidSize(count)) + { + // + for (int i = 0; i < count; i++) + { + // + XCRejectionBar *iBar = state.bullishRejectionBars[i]; + XCBullishRejectionBarObject *iObj; + + // + bool isCreated = CreateBullishRejectionBar( + iBar, + iObj // + ); + if (isCreated) + { + // + Add( + (XCBaseObject *)iObj, + drawnObjects // + ); + } + } + } + } + + // + // BearishRejectionBars ... + if (!ignoreBearishRejectionBars) + { + // + int count = state.CountBearishRejectionBars(); + if (IsValidSize(count)) + { + // + for (int i = 0; i < count; i++) + { + // + XCRejectionBar *iBar = state.bearishRejectionBars[i]; + XCBearishRejectionBarObject *iObj; + + // + bool isCreated = CreateBearishRejectionBar( + iBar, + iObj // + ); + if (isCreated) + { + // + Add( + (XCBaseObject *)iObj, + drawnObjects // + ); + } + } + } + } + + // + // BullishMomentumBars ... + if (!ignoreBullishMomentumBars) + { + // + int count = state.CountBullishMomentumBars(); + if (IsValidSize(count)) + { + // + for (int i = 0; i < count; i++) + { + // + XCMomentumBar *iBar = state.bullishMomentumBars[i]; + XCBullishMomentumBarObject *iObj; + + // + bool isCreated = CreateBullishMomentumBar( + iBar, + iObj // + ); + if (isCreated) + { + // + Add( + (XCBaseObject *)iObj, + drawnObjects // + ); + } + } + } + } + + // + // BearishMomentumBars ... + if (!ignoreBearishMomentumBars) + { + // + int count = state.CountBearishMomentumBars(); + if (IsValidSize(count)) + { + // + for (int i = 0; i < count; i++) + { + // + XCMomentumBar *iBar = state.bearishMomentumBars[i]; + XCBearishMomentumBarObject *iObj; + + // + bool isCreated = CreateBearishMomentumBar( + iBar, + iObj // + ); + if (isCreated) + { + // + Add( + (XCBaseObject *)iObj, + drawnObjects // + ); + } + } + } + } + + // + if (drawTicksZone && state.ticksZone != NULL) + { + // + XCTicksZoneObject *iObj; + bool isCreated = CreateTicksZone( + state.ticksZone, + iObj // + ); + if (isCreated) + { + Add( + (XCBaseObject *)iObj, + drawnObjects // + ); + } + } + + // + result = ArraySize(drawnObjects); + + // + return result; + } + + // + int DrawOrderBlock( + XCOrderBlock *zone, + XCBaseObject *&objects[], + // + bool drawStartedBar = true, + bool drawActivatedBar = true, + bool drawBreakedBar = true, + bool drawWorkedBar = true, + // + int widthStartedBar = 1, + color clrStartedBar = clrYellow, + ENUM_LINE_STYLE styleStartedBar = STYLE_SOLID, + // + int widthActivatedBar = 1, + color clrActivatedBar = clrLime, + ENUM_LINE_STYLE styleActivatedBar = STYLE_SOLID, + // + int widthBreakedBar = 1, + color clrBreakedBar = clrRed, + ENUM_LINE_STYLE styleBreakedBar = STYLE_SOLID, + // + int widthWorkedBar = 1, + color clrWorkedBar = clrAqua, + ENUM_LINE_STYLE styleWorkedBar = STYLE_SOLID + // + ) + { + // + int result = 0; + + // + Clean(objects); + + // + if (zone == NULL || + !zone.IsValid()) + { + return result; + } + + // + ENUM_X_DIRECTION zoneDir = zone.GetDirection(); + + // + // Started Bar ... + XOHCL startedBar; + bool isBodyOut = false; + bool isStarted = zone + .IsStarted( + zoneDir, + startedBar, + isBodyOut // + ); + if (isStarted) + { + // + datetime iBarTo = startedBar.NextAt(); + + // + XCOHCLObject *iBarObj; + bool isCreated = CreateBar( + startedBar, + iBarObj, + iBarTo // + ); + if (isCreated) + { + // + iBarObj.BodyWidth(widthStartedBar); + iBarObj.LowShadowWidth(widthStartedBar); + iBarObj.HighShadowWidth(widthStartedBar); + + // + iBarObj.BodyStyle(styleStartedBar); + iBarObj.LowShadowStyle(styleStartedBar); + iBarObj.HighShadowStyle(styleStartedBar); + + // + iBarObj.BodyColor(clrStartedBar); + iBarObj.LowShadowColor(clrStartedBar); + iBarObj.HighShadowColor(clrStartedBar); + + // + Add( + (XCBaseObject *)iBarObj, + objects // + ); + } + } + + // + // Activated Bar ... + XOHCL activatedBar; + bool isBodyIn = false; + bool isActivated = zone + .IsActivated( + zoneDir, + activatedBar, + isBodyIn, + false // Force Body Out Started ... + ); + if (isActivated) + { + // + datetime iBarTo = activatedBar.NextAt(); + + // + XCOHCLObject *iBarObj; + bool isCreated = CreateBar( + activatedBar, + iBarObj, + iBarTo // + ); + if (isCreated) + { + // + iBarObj.BodyWidth(widthActivatedBar); + iBarObj.LowShadowWidth(widthActivatedBar); + iBarObj.HighShadowWidth(widthActivatedBar); + + // + iBarObj.BodyStyle(styleActivatedBar); + iBarObj.LowShadowStyle(styleActivatedBar); + iBarObj.HighShadowStyle(styleActivatedBar); + + // + iBarObj.BodyColor(clrActivatedBar); + iBarObj.LowShadowColor(clrActivatedBar); + iBarObj.HighShadowColor(clrActivatedBar); + + // + Add( + (XCBaseObject *)iBarObj, + objects // + ); + } + } + + // + // Breaked Bar ... + XOHCL breakedBar; + isBodyOut = false; + bool isBreaked = zone + .IsBreaked( + zoneDir, + breakedBar, + isBodyOut, + false, // Ignore Start ... + false // Force Body Out Started ... + ); + if (isBreaked) + { + // + datetime iBarTo = breakedBar.NextAt(); + + // + XCOHCLObject *iBarObj; + bool isCreated = CreateBar( + breakedBar, + iBarObj, + iBarTo // + ); + if (isCreated) + { + // + iBarObj.BodyWidth(widthBreakedBar); + iBarObj.LowShadowWidth(widthBreakedBar); + iBarObj.HighShadowWidth(widthBreakedBar); + + // + iBarObj.BodyStyle(styleBreakedBar); + iBarObj.LowShadowStyle(styleBreakedBar); + iBarObj.HighShadowStyle(styleBreakedBar); + + // + iBarObj.BodyColor(clrBreakedBar); + iBarObj.LowShadowColor(clrBreakedBar); + iBarObj.HighShadowColor(clrBreakedBar); + + // + Add( + (XCBaseObject *)iBarObj, + objects // + ); + } + } + + // + // Worked Bar ... + XOHCL workedBar; + isBodyOut = false; + bool isWorked = zone + .IsWorked( + zoneDir, + workedBar, + isBodyOut, + false, // Ignore Activation ... + false, // Force Body Out Started ... + false // Force Body In Activated ... + ); + if (isWorked) + { + // + datetime iBarTo = workedBar.NextAt(); + + // + XCOHCLObject *iBarObj; + bool isCreated = CreateBar( + workedBar, + iBarObj, + iBarTo // + ); + if (isCreated) + { + // + iBarObj.BodyWidth(widthWorkedBar); + iBarObj.LowShadowWidth(widthWorkedBar); + iBarObj.HighShadowWidth(widthWorkedBar); + + // + iBarObj.BodyStyle(styleWorkedBar); + iBarObj.LowShadowStyle(styleWorkedBar); + iBarObj.HighShadowStyle(styleWorkedBar); + + // + iBarObj.BodyColor(clrWorkedBar); + iBarObj.LowShadowColor(clrWorkedBar); + iBarObj.HighShadowColor(clrWorkedBar); + + // + Add( + (XCBaseObject *)iBarObj, + objects // + ); + } + } + + // + XCBaseObject *iObj; + bool isCreated = CreateOrderBlock( + zone, + iObj // + ); + if (isCreated) + { + // + Add( + (XCBaseObject *)iObj, + objects // + ); + } + + // + result = ArraySize(objects); + + // + return result; + } + + // + int DrawFairValueGap( + XCFVG *zone, + XCBaseObject *&objects[], + // + bool drawStartedBar = true, + bool drawActivatedBar = true, + bool drawBreakedBar = true, + bool drawWorkedBar = true, + // + int widthStartedBar = 1, + color clrStartedBar = clrYellow, + ENUM_LINE_STYLE styleStartedBar = STYLE_SOLID, + // + int widthActivatedBar = 1, + color clrActivatedBar = clrLime, + ENUM_LINE_STYLE styleActivatedBar = STYLE_SOLID, + // + int widthBreakedBar = 1, + color clrBreakedBar = clrRed, + ENUM_LINE_STYLE styleBreakedBar = STYLE_SOLID, + // + int widthWorkedBar = 1, + color clrWorkedBar = clrAqua, + ENUM_LINE_STYLE styleWorkedBar = STYLE_SOLID + // + ) + { + // + int result = 0; + + // + Clean(objects); + + // + if (zone == NULL || + !zone.IsValid()) + { + return result; + } + + // + ENUM_X_DIRECTION zoneDir = zone.GetDirection(); + + // + // Started Bar ... + XOHCL startedBar; + bool isBodyOut = false; + bool isStarted = zone + .IsStarted( + zoneDir, + startedBar, + isBodyOut // + ); + if (isStarted) + { + // + datetime iBarTo = startedBar.NextAt(); + + // + XCOHCLObject *iBarObj; + bool isCreated = CreateBar( + startedBar, + iBarObj, + iBarTo // + ); + if (isCreated) + { + // + iBarObj.BodyWidth(widthStartedBar); + iBarObj.LowShadowWidth(widthStartedBar); + iBarObj.HighShadowWidth(widthStartedBar); + + // + iBarObj.BodyStyle(styleStartedBar); + iBarObj.LowShadowStyle(styleStartedBar); + iBarObj.HighShadowStyle(styleStartedBar); + + // + iBarObj.BodyColor(clrStartedBar); + iBarObj.LowShadowColor(clrStartedBar); + iBarObj.HighShadowColor(clrStartedBar); + + // + Add( + (XCBaseObject *)iBarObj, + objects // + ); + } + } + + // + // Activated Bar ... + XOHCL activatedBar; + bool isBodyIn = false; + bool isActivated = zone + .IsActivated( + zoneDir, + activatedBar, + isBodyIn, + false // Force Body Out Started ... + ); + if (isActivated) + { + // + datetime iBarTo = activatedBar.NextAt(); + + // + XCOHCLObject *iBarObj; + bool isCreated = CreateBar( + activatedBar, + iBarObj, + iBarTo // + ); + if (isCreated) + { + // + iBarObj.BodyWidth(widthActivatedBar); + iBarObj.LowShadowWidth(widthActivatedBar); + iBarObj.HighShadowWidth(widthActivatedBar); + + // + iBarObj.BodyStyle(styleActivatedBar); + iBarObj.LowShadowStyle(styleActivatedBar); + iBarObj.HighShadowStyle(styleActivatedBar); + + // + iBarObj.BodyColor(clrActivatedBar); + iBarObj.LowShadowColor(clrActivatedBar); + iBarObj.HighShadowColor(clrActivatedBar); + + // + Add( + (XCBaseObject *)iBarObj, + objects // + ); + } + } + + // + // Breaked Bar ... + XOHCL breakedBar; + isBodyOut = false; + bool isBreaked = zone + .IsBreaked( + zoneDir, + breakedBar, + isBodyOut, + false, // Ignore Start ... + false // Force Body Out Started ... + ); + if (isBreaked) + { + // + datetime iBarTo = breakedBar.NextAt(); + + // + XCOHCLObject *iBarObj; + bool isCreated = CreateBar( + breakedBar, + iBarObj, + iBarTo // + ); + if (isCreated) + { + // + iBarObj.BodyWidth(widthBreakedBar); + iBarObj.LowShadowWidth(widthBreakedBar); + iBarObj.HighShadowWidth(widthBreakedBar); + + // + iBarObj.BodyStyle(styleBreakedBar); + iBarObj.LowShadowStyle(styleBreakedBar); + iBarObj.HighShadowStyle(styleBreakedBar); + + // + iBarObj.BodyColor(clrBreakedBar); + iBarObj.LowShadowColor(clrBreakedBar); + iBarObj.HighShadowColor(clrBreakedBar); + + // + Add( + (XCBaseObject *)iBarObj, + objects // + ); + } + } + + // + // Worked Bar ... + XOHCL workedBar; + isBodyOut = false; + bool isWorked = zone + .IsWorked( + zoneDir, + workedBar, + isBodyOut, + false, // Ignore Activation ... + false, // Force Body Out Started ... + false // Force Body In Activated ... + ); + if (isWorked) + { + // + datetime iBarTo = workedBar.NextAt(); + + // + XCOHCLObject *iBarObj; + bool isCreated = CreateBar( + workedBar, + iBarObj, + iBarTo // + ); + if (isCreated) + { + // + iBarObj.BodyWidth(widthWorkedBar); + iBarObj.LowShadowWidth(widthWorkedBar); + iBarObj.HighShadowWidth(widthWorkedBar); + + // + iBarObj.BodyStyle(styleWorkedBar); + iBarObj.LowShadowStyle(styleWorkedBar); + iBarObj.HighShadowStyle(styleWorkedBar); + + // + iBarObj.BodyColor(clrWorkedBar); + iBarObj.LowShadowColor(clrWorkedBar); + iBarObj.HighShadowColor(clrWorkedBar); + + // + Add( + (XCBaseObject *)iBarObj, + objects // + ); + } + } + + // + XCBaseObject *iObj; + bool isCreated = CreateFairValueGap( + zone, + iObj // + ); + if (isCreated) + { + // + Add( + (XCBaseObject *)iObj, + objects // + ); + } + + // + result = ArraySize(objects); + + // + return result; + } + + // + int DrawOBFVG( + // + XOBFVG &item, + XCBaseObject *&objects[], + // + bool drawOrderBlock = true, + bool drawFairValueGap = true, + bool drawSupplyZones = true, + bool drawDemandZones = true, + bool drawSupportZones = true, + bool drawResistanceZones = true, + // + bool drawOBStartedBar = true, + bool drawOBActivatedBar = true, + bool drawOBBreakedBar = true, + bool drawOBWorkedBar = true, + // + bool drawFVGStartedBar = true, + bool drawFVGActivatedBar = true, + bool drawFVGBreakedBar = true, + bool drawFVGWorkedBar = true, + // + // Order Block Specs ... + // + int widthOBStartedBar = 1, + color clrOBStartedBar = clrYellow, + ENUM_LINE_STYLE styleOBStartedBar = STYLE_SOLID, + // + int widthOBActivatedBar = 1, + color clrOBActivatedBar = clrLime, + ENUM_LINE_STYLE styleOBActivatedBar = STYLE_SOLID, + // + int widthOBBreakedBar = 1, + color clrOBBreakedBar = clrRed, + ENUM_LINE_STYLE styleOBBreakedBar = STYLE_SOLID, + // + int widthOBWorkedBar = 1, + color clrOBWorkedBar = clrAqua, + ENUM_LINE_STYLE styleOBWorkedBar = STYLE_SOLID, + // + // Fair Value Gap Specs ... + // + int widthFVGStartedBar = 1, + color clrFVGStartedBar = clrYellow, + ENUM_LINE_STYLE styleFVGStartedBar = STYLE_SOLID, + // + int widthFVGActivatedBar = 1, + color clrFVGActivatedBar = clrLime, + ENUM_LINE_STYLE styleFVGActivatedBar = STYLE_SOLID, + // + int widthFVGBreakedBar = 1, + color clrFVGBreakedBar = clrRed, + ENUM_LINE_STYLE styleFVGBreakedBar = STYLE_SOLID, + // + int widthFVGWorkedBar = 1, + color clrFVGWorkedBar = clrAqua, + ENUM_LINE_STYLE styleFVGWorkedBar = STYLE_SOLID + // + ) + { + // + int result = 0; + + // + Clean(objects); + + // + bool isValid = item.IsValid(); + if (!isValid) + { + return result; + } + + // + int count = 0; + bool has = false; + bool isCreated = false; + XCBaseObject *tmpObjects[]; + + // + // Order Block ... + has = item.HasOB(); + if (has && + drawOrderBlock) + { + // + Clean(tmpObjects); + count = DrawOrderBlock( + item.ob, + tmpObjects, + drawOBStartedBar, + drawOBActivatedBar, + drawOBBreakedBar, + drawOBWorkedBar, + widthOBStartedBar, + clrOBStartedBar, + styleOBStartedBar, + widthOBActivatedBar, + clrOBActivatedBar, + styleOBActivatedBar, + widthOBBreakedBar, + clrOBBreakedBar, + styleOBBreakedBar, + widthOBWorkedBar, + clrOBWorkedBar, + styleOBWorkedBar // + ); + has = IsValidSize(count); + if (has) + { + // + Copy( + tmpObjects, + objects, + false // + ); + } + } + + // + // Fair Value Gap ... + has = item.HasFVG(); + if (has && + drawFairValueGap) + { + // + Clean(tmpObjects); + count = DrawFairValueGap( + item.fvg, + tmpObjects, + drawFVGStartedBar, + drawFVGActivatedBar, + drawFVGBreakedBar, + drawFVGWorkedBar, + widthFVGStartedBar, + clrFVGStartedBar, + styleFVGStartedBar, + widthFVGActivatedBar, + clrFVGActivatedBar, + styleFVGActivatedBar, + widthFVGBreakedBar, + clrFVGBreakedBar, + styleFVGBreakedBar, + widthFVGWorkedBar, + clrFVGWorkedBar, + styleFVGWorkedBar // + ); + has = IsValidSize(count); + if (has) + { + // + Copy( + tmpObjects, + objects, + false // + ); + } + } + + // + // Supply Zones ... + has = item.HasSupplyZones(); + if (has && + drawSupplyZones) + { + // + Clean(tmpObjects); + count = item.CountSupplyZones(); + for (int i = 0; i < count; i++) + { + // + XCSupplyZoneObject *iZoneObj; + has = CreateSupplyZone( + item.supplyZones[i], + iZoneObj // + ); + if (has) + { + // + Add( + (XCBaseObject *)iZoneObj, + tmpObjects // + ); + } + } + + // + count = ArraySize(tmpObjects); + has = IsValidSize(count); + if (has) + { + // + Copy( + tmpObjects, + objects, + false // + ); + } + } + + // + // Demand Zones ... + has = item.HasDemandZones(); + if (has && + drawDemandZones) + { + // + Clean(tmpObjects); + count = item.CountDemandZones(); + for (int i = 0; i < count; i++) + { + // + XCDemandZoneObject *iZoneObj; + has = CreateDemandZone( + item.demandZones[i], + iZoneObj // + ); + if (has) + { + // + Add( + (XCBaseObject *)iZoneObj, + tmpObjects // + ); + } + } + + // + count = ArraySize(tmpObjects); + has = IsValidSize(count); + if (has) + { + // + Copy( + tmpObjects, + objects, + false // + ); + } + } + + // + // Support Zones ... + has = item.HasSupportZones(); + if (has && + drawSupportZones) + { + // + Clean(tmpObjects); + count = item.CountSupportZones(); + for (int i = 0; i < count; i++) + { + // + XCSupportZoneObject *iZoneObj; + has = CreateSupportZone( + item.supportZones[i], + iZoneObj // + ); + if (has) + { + // + Add( + (XCBaseObject *)iZoneObj, + tmpObjects // + ); + } + } + + // + count = ArraySize(tmpObjects); + has = IsValidSize(count); + if (has) + { + // + Copy( + tmpObjects, + objects, + false // + ); + } + } + + // + // Resistance Zones ... + has = item.HasResistanceZones(); + if (has && + drawResistanceZones) + { + // + Clean(tmpObjects); + count = item.CountResistanceZones(); + for (int i = 0; i < count; i++) + { + // + XCResistanceZoneObject *iZoneObj; + has = CreateResistanceZone( + item.resistanceZones[i], + iZoneObj // + ); + if (has) + { + // + Add( + (XCBaseObject *)iZoneObj, + tmpObjects // + ); + } + } + + // + count = ArraySize(tmpObjects); + has = IsValidSize(count); + if (has) + { + // + Copy( + tmpObjects, + objects, + false // + ); + } + } + + // + Clean(tmpObjects); + + // + result = ArraySize(objects); + + // + return result; + } + + // + protected: + // + + // + private: + // + + // + // Props ... + + // + string mPrefix; // Prefix of Created Objects ... + long mChartIdentification; // Chart Id ... + int mSubWindowIdentification; // Sub Window ... + + // + // XOHCL ... + int mBarWidth; // Bar Width ... + color mBarBullishColor; // Bar Bullish Color ... + color mBarBearishColor; // Bar Bearish Color ... + bool mBarFillHighShadow; // Fill Bar High Shadow ... + ENUM_LINE_STYLE mBarHighShadowStyle; // Bar High Shadow Style ... + bool mBarFillBody; // Fill Bar Body ... + ENUM_LINE_STYLE mBarBodyStyle; // Bar Body Style ... + bool mBarFillLowShadow; // Fill Bar Low Show ... + ENUM_LINE_STYLE mBarLowShadowStyle; // Bar Low Shadow Style ... + + // + // Swing Low ... + int mSwingLowWidth; // Swing Low Width ... + int mSwingLowArrow; // Swing Low Arrow Code ... + color mSwingLowColor; // Swing Low Color ... + + // + // Swing High ... + int mSwingHighWidth; // Swing High Width ... + int mSwingHighArrow; // Swing High Arrow Code ... + color mSwingHighColor; // Swing High Color ... + + // + // Bullish Momentum Bar ... + int mBullishMomentumBarWidth; // Bullish Momentum Bar Width ... + int mBullishMomentumBarArrow; // Bullish Momentum Bar Arrow Code ... + color mBullishMomentumBarColor; // Bullish Momentum Bar Color ... + + // + // Bearish Momentum Bar ... + int mBearishMomentumBarWidth; // Bearish Momentum Bar Width ... + int mBearishMomentumBarArrow; // Bearish Momentum Bar Arrow Code ... + color mBearishMomentumBarColor; // Bearish Momentum Bar Color ... + + // + // Bullish Rejection Bar ... + int mBullishRejectionBarWidth; // Bullish Rejection Bar High Width ... + int mBullishRejectionBarArrow; // Bullish Rejection Bar High Arrow Code ... + color mBullishRejectionBarColor; // Bullish Rejection Bar High Color ... + + // + // Bearish Rejection Bar ... + int mBearishRejectionBarWidth; // Bearish Rejection Bar Width ... + int mBearishRejectionBarArrow; // Bearish Rejection Bar Arrow Code ... + color mBearishRejectionBarColor; // Bearish Rejection Bar Color ... + + // + // Supply Zone ... + bool mSupplyZoneFill; // Fill Supply Zone ... + int mSupplyZoneWidth; // Supply Zone Width ... + color mSupplyZoneColor; // Supply Zone Color ... + ENUM_LINE_STYLE mSupplyZoneStyle; // Supply Zone Style ... + + // + // Demand Zone ... + bool mDemandZoneFill; // Fill Demand Zone ... + int mDemandZoneWidth; // Demand Zone Width ... + color mDemandZoneColor; // Demand Zone Color ... + ENUM_LINE_STYLE mDemandZoneStyle; // Demand Zone Style ... + + // + // Resistance Zone ... + bool mResistanceZoneFill; // Fill Resistance Zone ... + int mResistanceZoneWidth; // Resistance Zone Width ... + color mResistanceZoneColor; // Resistance Zone Color ... + ENUM_LINE_STYLE mResistanceZoneStyle; // Resistance Zone Style ... + + // + // Support Zone ... + bool mSupportZoneFill; // Fill Support Zone ... + int mSupportZoneWidth; // Support Zone Width ... + color mSupportZoneColor; // Support Zone Color ... + ENUM_LINE_STYLE mSupportZoneStyle; // Support Zone Style ... + + // + // Bullish Order Block ... + bool mBullishOrderBlockFill; // Fill Bullish Order Block ... + int mBullishOrderBlockWidth; // Bullish Order Block Width ... + color mBullishOrderBlockColor; // Bullish Order Block Color ... + ENUM_LINE_STYLE mBullishOrderBlockStyle; // Bullish Order Block Style ... + + // + // Bearish Order Block ... + bool mBearishOrderBlockFill; // Fill Bearish Order Block ... + int mBearishOrderBlockWidth; // Bearish Order Block Width ... + color mBearishOrderBlockColor; // Bearish Order Block Color ... + ENUM_LINE_STYLE mBearishOrderBlockStyle; // Bearish Order Block Style ... + + // + // Bullish FVG ... + bool mBullishFVGFill; // Fill Bullish FVG ... + int mBullishFVGWidth; // Bullish FVG Width ... + color mBullishFVGColor; // Bullish FVG Color ... + ENUM_LINE_STYLE mBullishFVGStyle; // Bullish FVG Style ... + + // + // Bearish FVG ... + bool mBearishFVGFill; // Fill Bearish FVG ... + int mBearishFVGWidth; // Bearish FVG Width ... + color mBearishFVGColor; // Bearish FVG Color ... + ENUM_LINE_STYLE mBearishFVGStyle; // Bearish FVG Style ... + + // + // Ticks Zone ... + XTickZoneLevelSpecs mTicksZoneSpecs[]; // Zone Draw Specifications ... + + // +}; \ No newline at end of file diff --git a/BKPS/14031206/Classes/x-saherelm.x-trade.class.ex5 b/BKPS/14031206/Classes/x-saherelm.x-trade.class.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..c26d0e0f638412fe3371b0766f593715eebaefe5 GIT binary patch literal 11862 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 literal 0 HcmV?d00001 diff --git a/BKPS/14031206/Classes/x-saherelm.x-trade.class.mq5 b/BKPS/14031206/Classes/x-saherelm.x-trade.class.mq5 new file mode 100644 index 0000000..7bdd19f --- /dev/null +++ b/BKPS/14031206/Classes/x-saherelm.x-trade.class.mq5 @@ -0,0 +1,3934 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 Class Library +// ---------------------------------------------- +// Name: XSCTrade +// Description: provides all Trade requirements ... +// +// +// Maintainer: +// ------------ +// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) +// +////////////////////////////////////////////////////// +// +// Global Properties ... +#property library +#property copyright "Copyright 2023, SaherElm IT Center" +#property link "https://www.saherelm.ir" +#property version "1.00" +#property strict + +// +// Imports ... +#include "../Classes/x-saherelm.base.class.mq5" +#include "../Classes/x-saherelm.x-account.class.mq5" +#include "../Classes/x-saherelm.x-alert.class.mq5" +#include "../Libraries/x-saherelm.x-trade.lib.mq5" + +// +// Definitions ... + +// +// Overrides ... + +// +// XCTrade Base Class ... +class XCTradeBase : 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)); + } +}; + +// +// Implementation ... + +// +// a Class For Manage Trades and Handle Trading Actions ... +class XCTrade : public XCBase +{ + // + // Public ... + public: + // + // Props ... + XCAccount *mAccount; // Account Info Provider + + // + // Constructors ... + void XCTrade( + int slippage, // Specify Slippage + ulong magicNumber, // Specify Magic Number + double maxAllowedSpread = 0, // Max Allowed Spred for Opening Trades + int maxAllowedPositions = 0, // Max Allowed Positions + double maxAllowedDrawdownFactor = 0 // Max Allowed Drawdown Factor + ) + { + // + // Setting Props ... + mSlippage = slippage; + mMagicNumber = magicNumber; + + // + mMaxAllowedSpread = maxAllowedSpread; + mMaxAllowedPositions = maxAllowedPositions; + mMaxAllowedDrawdownFactor = maxAllowedDrawdownFactor; + + // + mAccount = new XCAccount(); + + // + // Instance Base Trader Class ... + mTrader = new XCTradeBase(); + + // + // Configuring Base Trader Class ... + mTrader.SetAsyncMode(false); + mTrader.SetDeviationInPoints(mSlippage); + mTrader.SetExpertMagicNumber(mMagicNumber); + + // + // Setting Log Level ... + mTrader.LogLevel(LOG_LEVEL_ERRORS); + + // + // OnTrade Context ... + + // + mDaysForRead = 1; + mScanStarted = false; + + // + // Reset On Trade Counter ... + ResetOnTradeContext(); + + // + // Init On Trade Context ... + InitOnTradeContext(); + } + + // + // Deconstructor ... + ~XCTrade() + { + // + // Remove Pointer ... + delete mTrader; + delete mAccount; + + // + ZeroMemory(mTrader); + ZeroMemory(mAccount); + + // + Clean(mOnModifyEventHandlers); + Clean(mStopLossEventHandlers); + Clean(mTakeProfitEventHandlers); + Clean(mOnForceCloseEventHandlers); + Clean(mDealsChangedEventHandlers); + Clean(mOrdersChangedEventHandlers); + Clean(mOnPartialCloseEventHandlers); + Clean(mPositionsChangedEventHandlers); + Clean(mTradeStateChangedEventHandlers); + } + + // + // Props ... + + // + // Retrieve Slippage ... + int GetSlippage() + { + return mSlippage; + } + + // + // Retrieve Magic Number ... + ulong GetMagicNumber() + { + return mMagicNumber; + } + + // + double GetMaxAllowedSpread() + { + return mMaxAllowedSpread; + } + + // + int GetMaxAllowedPositions() + { + return mMaxAllowedPositions; + } + + // + void SetMaxAllowedPositions(int value) + { + // + if (value < 0) + { + value = 0; + } + + // + mMaxAllowedPositions = value; + } + + // + double GetMaxAllowedDrawdownFactor() + { + return mMaxAllowedDrawdownFactor; + } + + // + // Add Event Listeners ... + + // + void AddOnModifyPositionEventHandler(TOnModify handler) + { + // + if (handler == NULL) + { + return; + } + + // + Add( + handler, + mOnModifyEventHandlers + // + ); + } + + // + void AddOnForceClosePositionEventHandler(TOnForceClose handler) + { + // + if (handler == NULL) + { + return; + } + + // + Add( + handler, + mOnForceCloseEventHandlers + // + ); + } + + // + void AddOnPartialClosePositionEventHandler(TOnPartialClose handler) + { + // + if (handler == NULL) + { + return; + } + + // + Add( + handler, + mOnPartialCloseEventHandlers + // + ); + } + + // + // Add New Deals Changed Event Handler ... + void AddOnTradeStateChangedEventHandler(TOnTradeStateChanged handler) + { + // + if (handler == NULL) + { + return; + } + + // + Add( + handler, + mTradeStateChangedEventHandlers + // + ); + } + + // + // Add New Deals Changed Event Handler ... + void AddOnDealsChangedEventHandler(TOnDealsChanged handler) + { + // + if (handler == NULL) + { + return; + } + + // + Add( + handler, + mDealsChangedEventHandlers + // + ); + } + + // + // Add New Orders Changed Event Handler ... + void AddOnOrdersChangedEventHandler(TOnOrdersChanged handler) + { + // + if (handler == NULL) + { + return; + } + + // + Add( + handler, + mOrdersChangedEventHandlers + // + ); + } + + // + // Add New Positions Changed Event Handler ... + void AddOnPositionsChangedEventHandler(TOnPositionsChanged handler) + { + // + if (handler == NULL) + { + return; + } + + // + Add( + handler, + mPositionsChangedEventHandlers + // + ); + } + + // + // Add New Stop Loss Event Handler ... + void AddOnStopLossEventHandler(TOnStopLoss handler) + { + // + if (handler == NULL) + { + return; + } + + // + Add( + handler, + mStopLossEventHandlers + // + ); + } + + // + // Add New Stop Loss Event Handler ... + void AddOnTakeProfitEventHandler(TOnTakeProfit handler) + { + // + if (handler == NULL) + { + return; + } + + // + Add( + handler, + mTakeProfitEventHandlers + // + ); + } + + // + // Functions ... + + // + // Handlers ... + + // + // Process On Trade Requirement ... + // this Only Used when we Have to Proccess OnTrade Event in EA(s) ... + void HandleOnTradeEvent( + XOnTradeHandlerState &result // Hold's Result + ) + { + // + result.Clean(); + + // + if (mScanStarted) + { + // + ProcessOnTradeContext(result); + } + else + { + // + // Init Trade Context ... + InitOnTradeContext(); + + // + return; + } + + // + // Here we Can Check the Start ... + bool isValid = + // + result.IsValid() && + // + !result.hasNewDeal && + !result.hasNewOrder && + !result.hasNewPosition && + !result.hasNewHistoryOrder + // + ; + if (!isValid) + { + return; + } + + // + // State ... + + // + // Notfy Trade State Changed Event ... + NotifyTradeStateChangeEvent(result); + + // + // Deals ... + if (result.hasNewDeal) + { + // + // Notfy Deals Changed Event ... + NotifyDealsChangeEvent(result.newDeals); + + // + // Retrieve Last Deal ... + XDeal deals[]; + int dealsCount = GetDeals(deals); + if (dealsCount > 0) + { + // + XDeal lastDeal = deals[0]; + + // + if (lastDeal.reason == DEAL_REASON_TP) + { + NotifyTakeProfitEvent(lastDeal); + } + else if (lastDeal.reason == DEAL_REASON_SL) + { + NotifyStopLossEvent(lastDeal); + } + } + } + + // + // Orders ... + if (result.hasNewOrder || result.hasNewHistoryOrder) + { + // + // Notfy Orders Changed Event ... + NotifyOrdersChangeEvent(result.newOrders + result.newHistoryOrders); + } + + // + // Positions ... + if (result.hasNewPosition) + { + // + // Notfy Positions Changed Event ... + NotifyPositionsChangeEvent(result.newPositions); + } + } + + // + // This Must be Called Every time OnTrade Event Happening ... + // this Used for Implementing Custom Senarios ... + XOnTradeHandlerState HandleOnTrade() + { + // + // Handle OnTrade Event ... + XOnTradeHandlerState state; + HandleOnTradeEvent(state); + if ( + !state.hasNewDeal && + !state.hasNewOrder && + !state.hasNewPosition && + !state.hasNewHistoryOrder) + { + return state; + } + + // + // State ... + + // + // Notfy Trade State Changed Event ... + NotifyTradeStateChangeEvent(state); + + // + // DEALS ... + if (state.hasNewDeal) + { + // + // Notfy Deals Changed Event ... + NotifyDealsChangeEvent(state.newDeals); + + // + // Retrieve Last Deal ... + XDeal deals[]; + GetDeals(deals); + int dealsCount = ArraySize(deals); + if (dealsCount > 0) + { + // + XDeal lastDeal = deals[0]; + + // + if (lastDeal.reason == DEAL_REASON_TP) + { + NotifyTakeProfitEvent(lastDeal); + } + else if (lastDeal.reason == DEAL_REASON_SL) + { + NotifyStopLossEvent(lastDeal); + } + } + } + + // + // ORDERS ... + if (state.hasNewOrder || state.hasNewHistoryOrder) + { + // + // Notfy Orders Changed Event ... + NotifyOrdersChangeEvent(state.newOrders + state.newHistoryOrders); + } + + // + // POSITIONS ... + if (state.hasNewPosition) + { + // + // Notfy Positions Changed Event ... + NotifyPositionsChangeEvent(state.newPositions); + } + + // + return state; + } + + // + // Trade Actions ... + + // + // Main ... + + // + // Policies ... + + // + // Check Acocunt Balance is Allow new Trades or not ... + bool CheckEquityForTrade() + { + // + bool result = false; + + // + if (mMaxAllowedDrawdownFactor <= 0) + { + // + result = true; + return result; + } + + // + double equity = mAccount.GetEquity(); + double balance = mAccount.GetBalance(); + + // + double selectedBalance = MathMax(equity, balance) - MathMin(equity, balance); + + // + double maxAllowedBalanceDrawDown = GetMaxAllowedEquity(); + + // + result = equity > balance || + (equity <= balance && + selectedBalance <= maxAllowedBalanceDrawDown); + + // + return result; + } + + // + // Check Max Allowed Positions Policy for Trade ... + bool CheckPositionsForTrade() + { + // + bool result = false; + + // + if (mMaxAllowedPositions <= 0) + { + // + result = true; + return result; + } + + // + XPosition positions[]; + int positionsCount = GetPositions(positions); + if (positionsCount <= 0) + { + // + result = true; + return result; + } + + // + result = positionsCount < mMaxAllowedPositions; + + // + return result; + } + + // + // Check Spread is Ok for Executing Specific Signal ... + bool CheckSpreadForSignalExecution(XSignal &mSignal) + { + // + bool result = false; + + // + bool isSpreadCheckEnable = mMaxAllowedSpread > 0; + if (!isSpreadCheckEnable) + { + result = true; + } + else + { + // + // Retrieve Signal Spread ... + double spread = GetSpread(mSignal.symbol); + result = spread <= mMaxAllowedSpread; + } + + // + return result; + } + + // + // Check Account Policy ... + bool CheckAccountPolicy( + XSignal &mSignal, // For Executing Signal + ENUM_X_SIGNAL_EXECUTION_RESULT &state // State Holder + ) + { + // + bool result = false; + + // + // Check Positions For Trade ... + result = CheckPositionsForTrade(); + if (!result) + { + // + state = X_SIGNAL_EXECUTION_FAILED_MAX_REACHED; + return result; + } + + // + // Check Equity For Trade ... + result = CheckEquityForTrade(); + if (!result) + { + // + state = X_SIGNAL_EXECUTION_FAILED_NO_EQUITY; + return result; + } + + // + // Check Spread for Trade ... + result = CheckSpreadForSignalExecution(mSignal); + if (!result) + { + // + state = X_SIGNAL_EXECUTION_FAILED_SPREAD; + return result; + } + + // + return result; + } + + // + // Execute a Signal ... + bool ExecuteSignal( + XSignal &mSignal, // Signal + ENUM_X_SIGNAL_EXECUTION_RESULT &state, // Result + ENUM_ORDER_TYPE_TIME lifetime = ORDER_TIME_GTC, // Order LifeTime + datetime expiration = NULL, // order expiration time + bool checkPolicies = true // Check Account Policies + ) + { + // + bool result = false; + state = X_SIGNAL_EXECUTION_UNKNOWN; + + // + double currentEntry = GetEntry( + mSignal.symbol, + mSignal.type + // + ); + bool isLong = IsLong(mSignal.type); + + // + if (!mSignal.IsValid()) + { + // + state = X_SIGNAL_EXECUTION_FAILED_INVALID_PARAMS; + return result; + } + + // + // Prepare Signal Comment ... + string mSComment = mSignal.GenerateComment(); + if (!Contains(mSComment, mSignal.comment)) + { + mSignal.comment += mSComment; + } + + // + // Handle Market Execution ... + if (mSignal.mode == X_ORDER_MODE_MARKET) + { + // + // Do Apply Policies here ... + bool hasPolicy = !checkPolicies + ? true + : CheckAccountPolicy(mSignal, state); + if (!hasPolicy) + { + result = false; + } + else + { + // + if (isLong) + { + // + result = Buy( + mSignal.symbol, + mSignal.period, + mSignal.volume, + mSignal.entry, + mSignal.sl, + mSignal.tp, + mSignal.comment + // + ); + } + else + { + // + result = Sell( + mSignal.symbol, + mSignal.period, + mSignal.volume, + mSignal.entry, + mSignal.sl, + mSignal.tp, + mSignal.comment + // + ); + } + } + } + // + // Handle Stop Execution ... + else if (mSignal.mode == X_ORDER_MODE_STOP) + { + + // + // Check Conditions ... + + // + // Check Price ... + result = isLong + ? mSignal.entry > currentEntry + : mSignal.entry < currentEntry; + if (!result) + { + // + state = X_SIGNAL_EXECUTION_FAILED_PRICE_ERROR; + return result; + } + + // + // Execute Order ... + if (isLong) + { + // + result = BuyStop( + mSignal.symbol, + mSignal.period, + mSignal.volume, + mSignal.entry, + mSignal.sl, + mSignal.tp, + lifetime, + expiration, + mSignal.comment + // + ); + } + else + { + // + result = SellStop( + mSignal.symbol, + mSignal.period, + mSignal.volume, + mSignal.entry, + mSignal.sl, + mSignal.tp, + lifetime, + expiration, + mSignal.comment + // + ); + } + } + // + // Handle Limit Execution ... + else if (mSignal.mode == X_ORDER_MODE_LIMIT) + { + // + // Check Conditions ... + + // + // Check Price ... + result = isLong + ? mSignal.entry < currentEntry + : mSignal.entry > currentEntry; + if (!result) + { + // + state = X_SIGNAL_EXECUTION_FAILED_PRICE_ERROR; + return result; + } + + // + // Execute Order ... + if (isLong) + { + // + result = BuyLimit( + mSignal.symbol, + mSignal.period, + mSignal.volume, + mSignal.entry, + mSignal.sl, + mSignal.tp, + lifetime, + expiration, + mSignal.comment + // + ); + } + else + { + // + result = SellLimit( + mSignal.symbol, + mSignal.period, + mSignal.volume, + mSignal.entry, + mSignal.sl, + mSignal.tp, + lifetime, + expiration, + mSignal.comment + // + ); + } + } + + // + // Handle Ticket ... + if (result) + { + // + state = X_SIGNAL_EXECUTION_SUCCEED; + + // + ulong ticket; + if (mSignal.mode == X_ORDER_MODE_MARKET) + { + ticket = GetLastOpenPositionTicket(); + } + else + { + ticket = GetLastPlacedOrderTicket(); + } + + // + mSignal.positionId = ticket; + + // + // Handle Store XPositionInfo ... + if (mSignal.mode == X_ORDER_MODE_MARKET) + { + // + // TODO: Implement this ... + } + + // + // Handle Executing Support Signals ... + int supportsCount = ArraySize(mSignal.supports); + if (supportsCount > 0) + { + // + int executed = 0; + for (int i = 0; i < supportsCount; i++) + { + // + XSignal iSupport = mSignal.supports[i]; + + // + int supIndex = i + 1; + string iComment = GenerateSupportTag(ticket); + iSupport.comment = iComment; + + // + bool isExecuted = ExecuteSignal( + iSupport, + state, + lifetime, + expiration + // + ); + if (isExecuted) + { + executed++; + } + } + + // + result = executed == supportsCount; + } + } + + // + return result; + } + + // + // Execute a Collection Of Signals ... + int ExecuteSignals( + XSignal &signals[], // Collection of Signal for Execution + ENUM_X_SIGNAL_EXECUTION_RESULT &states[], // Signal Execution Result + ENUM_ORDER_TYPE_TIME lifetime = ORDER_TIME_GTC, // Order LifeTime + datetime expiration = NULL, // order expiration time + bool checkPolicies = true // Check Account Policies + ) + { + // + int result = 0; + + // + Clean(states); + + // + int signalsCount = ArraySize(signals); + if (signalsCount <= 0) + { + return result; + } + + // + ArrayResize(states, signalsCount); + ArrayInitialize(states, X_SIGNAL_EXECUTION_UNKNOWN); + for (int i = 0; i < signalsCount; i++) + { + // + bool isExecuted = ExecuteSignal( + signals[i], + states[i], + lifetime, + expiration, + checkPolicies + // + ); + + // + if (isExecuted) + { + result++; + } + } + + // + return result; + } + + // + int ExecuteSpecifiedSignals( + XSignal &signals[], // Collection of Signal for Execution + XSignal ¬Executeds[], // Not Executed Signal + ENUM_X_SIGNAL_EXECUTION_RESULT &states[], // Signal Execution Result + ENUM_ORDER_TYPE_TIME lifetime = ORDER_TIME_GTC, // Order LifeTime + datetime expiration = NULL, // order expiration time + bool checkPolicies = true // Check Account Policies + ) + { + // + int result = 0; + + // + Clean(states); + Clean(notExecuteds); + + // + int signalsCount = ArraySize(signals); + if (signalsCount <= 0) + { + return result; + } + + // + ArrayResize(states, signalsCount); + ArrayInitialize(states, X_SIGNAL_EXECUTION_UNKNOWN); + for (int i = 0; i < signalsCount; i++) + { + // + bool isExecuted = ExecuteSignal( + signals[i], + states[i], + lifetime, + expiration + // + ); + + // + if (isExecuted) + { + result++; + } + else + { + // + AddRef( + signals[i], + notExecuteds // + ); + } + } + + // + return result; + } + + // + // Regular Trade Actions ... + + // + // Buy ... + + // + // Force Open a Buy/Long Position ... + bool Buy( + string symbol, // Specified Symbol + ENUM_TIMEFRAMES period, // Specified Trade's Period + double volume, // position volume + double price, // execution price + double sl = 0, // stop loss price + double tp = 0, // take profit price + string comment = NULL // comment + ) + { + // + bool result = false; + + // + ENUM_TIMEFRAMES mPeriod = ExtractPeriod(comment); + if (!IsValid(comment) || + !IsValid(mPeriod)) + { + // + string mPeriodStr = GeneratePeriodTag(period); + + // + comment += mPeriodStr; + } + + // + result = mTrader.Buy( + volume, + symbol, + price, + sl, + tp, + comment + // + ); + + // + return result; + } + + // + // Send BUY LIMIT order ... + bool BuyLimit( + string symbol, // Specified Symbol + ENUM_TIMEFRAMES period, // Specified Trade's Period + double volume, // order volume + double price, // order price + double sl = 0.0, // stop loss price + double tp = 0.0, // take profit price + ENUM_ORDER_TYPE_TIME typeTime = ORDER_TIME_GTC, // order lifetime + datetime expiration = 0, // order expiration time + string comment = NULL // comment + ) + { + // + bool result = false; + + // + ENUM_TIMEFRAMES mPeriod = ExtractPeriod(comment); + if (!IsValid(comment) || + !IsValid(mPeriod)) + { + // + string mPeriodStr = GeneratePeriodTag(period); + + // + comment += mPeriodStr; + } + + // + result = mTrader.BuyLimit( + volume, + price, + symbol, + sl, + tp, + typeTime, + expiration, + comment + // + ); + + // + return result; + } + + // + // Send BUY STOP order ... + bool BuyStop( + string symbol, // Specified Symbol + ENUM_TIMEFRAMES period, // Specified Trade's Period + double volume, // order volume + double price, // order price + double sl = 0.0, // stop loss price + double tp = 0.0, // take profit price + ENUM_ORDER_TYPE_TIME typeTime = ORDER_TIME_GTC, // order lifetime + datetime expiration = 0, // order expiration time + string comment = NULL // comment + ) + { + // + bool result = false; + + // + ENUM_TIMEFRAMES mPeriod = ExtractPeriod(comment); + if (!IsValid(comment) || + !IsValid(mPeriod)) + { + // + string mPeriodStr = GeneratePeriodTag(period); + + // + comment += mPeriodStr; + } + + // + result = mTrader.BuyStop( + volume, + price, + symbol, + sl, + tp, + typeTime, + expiration, + comment + // + ); + + // + return result; + } + + // + // Sell ... + + // + // Force Open a Sell/Short Position ... + bool Sell( + string symbol, // Specified Symbol + ENUM_TIMEFRAMES period, // Specified Trade's Period + double volume, // position volume + double price, // execution price + double sl = 0, // stop loss price + double tp = 0, // take profit price + string comment = NULL // comment + ) + { + // + bool result = false; + + // + ENUM_TIMEFRAMES mPeriod = ExtractPeriod(comment); + if (!IsValid(comment) || + !IsValid(mPeriod)) + { + // + string mPeriodStr = GeneratePeriodTag(period); + + // + comment += mPeriodStr; + } + + // + result = mTrader.Sell( + volume, + symbol, + price, + sl, + tp, + comment + // + ); + + // + return result; + } + + // + // Send SELL LIMIT order ... + bool SellLimit( + string symbol, // Specified Symbol + ENUM_TIMEFRAMES period, // Specified Trade's Period + double volume, // order volume + double price, // order price + double sl = 0.0, // stop loss price + double tp = 0.0, // take profit price + ENUM_ORDER_TYPE_TIME typeTime = ORDER_TIME_GTC, // order lifetime + datetime expiration = 0, // order expiration time + string comment = NULL // comment + ) + { + // + bool result = false; + + // + ENUM_TIMEFRAMES mPeriod = ExtractPeriod(comment); + if (!IsValid(comment) || + !IsValid(mPeriod)) + { + // + string mPeriodStr = GeneratePeriodTag(period); + + // + comment += mPeriodStr; + } + + // + result = mTrader.SellLimit( + volume, + price, + symbol, + sl, + tp, + typeTime, + expiration, + comment + // + ); + + // + return result; + } + + // + // Send SELL STOP order ... + bool SellStop( + string symbol, // Specified Symbol + ENUM_TIMEFRAMES period, // Specified Trade's Period + double volume, // order volume + double price, // order price + double sl = 0.0, // stop loss price + double tp = 0.0, // take profit price + ENUM_ORDER_TYPE_TIME typeTime = ORDER_TIME_GTC, // order lifetime + datetime expiration = 0, // order expiration time + string comment = NULL // comment + ) + { + // + bool result = false; + + // + ENUM_TIMEFRAMES mPeriod = ExtractPeriod(comment); + if (!IsValid(comment) || + !IsValid(mPeriod)) + { + // + string mPeriodStr = GeneratePeriodTag(period); + + // + comment += mPeriodStr; + } + + // + result = mTrader.SellStop( + volume, + price, + symbol, + sl, + tp, + typeTime, + expiration, + comment + // + ); + + // + return result; + } + + // + // Check a Position is Exists Open or not ... + bool IsOpen( + ulong ticket // Specified Position Ticket + ) + { + // + bool result = false; + + // + result = mPositionInfo + .SelectByTicket(ticket); + + // + return result; + } + + // + // Modify Position ... + bool Modify( + const ulong ticket, // position ticket + double sl = 0, // stop loss price + double tp = 0, // take profit + string comment = NULL // comment + ) + { + // + bool result = false; + + // + // Validate Args ... + XPosition position; + result = + GetPosition( + ticket, + position // + ) && + (tp >= 0 || sl >= 0); + if (!result) + { + return result; + } + + // + // Use Position Comment when there isn't new One ... + if (!IsValid(comment) == 0) + { + // + // if there isn't provided Comment + // Use Position Comment for default ... + comment = "Modify " + GetPositionComment(ticket); + } + + // + result = mTrader.PositionModify( + ticket, + sl, + tp, + comment + // + ); + if (result) + { + // + NotifyModifyEvent( + ticket, + position.profit, + comment // + ); + } + + // + return result; + } + + // + // Close Position By Ticket ... + bool Close( + ulong ticket, // Position Ticket + string comment = NULL // Close Position By Specific Comment + ) + { + // + bool result = false; + + // + // Check Position Open ... + XPosition position; + result = GetPosition( + ticket, + position // + ); + if (!result) + { + return result; + } + + // + // Use Default Position Comment if it's Not Provided ... + if (!IsValid(comment)) + { + comment = "Close " + GetPositionComment(ticket); + } + + // + // Close Position By Specific Comment ... + result = mTrader.PositionClose( + ticket, + mSlippage, + comment + // + ); + if (result) + { + // + NotifyForceCloseEvent( + ticket, + position, + comment // + ); + } + + // + return result; + } + + // + // Close Specified Positions ... + int Close( + string comment = NULL, // Close Position By Specific Comment + string symbol = NULL, // Trading Symbol + string provider = NULL, // Signal Provider + ENUM_TIMEFRAMES period = NULL, // Trading Period + ENUM_X_POSITION_TYPES type = NULL, // Long (Buy) or Short (Sell) + bool filterByMagic = true // Get Only Self Open Positions + ) + { + // + int result = 0; + + // + XPosition positions[]; + int positionsCount = GetPositions( + positions, + symbol, + provider, + period, + type, + filterByMagic); + if (positionsCount <= 0) + { + return result; + } + + // + for (int i = 0; i < positionsCount; i++) + { + // + XPosition iPosition = positions[i]; + + // + bool isClosed = Close( + iPosition.ticket, + comment + // + ); + if (isClosed) + { + result++; + } + } + + // + return result; + } + + // + // Close a Collection of Positions ... + int Close( + XPosition &positions[], // Collection of Positions + string comment // Close Comment + ) + { + // + int result = 0; + + // + int positionsCount = ArraySize(positions); + if (positionsCount <= 0) + { + return result; + } + + // + for (int i = 0; i < positionsCount; i++) + { + // + XPosition iPosition = positions[i]; + + // + bool isClosed = Close( + iPosition.ticket, + comment + // + ); + if (isClosed) + { + result++; + } + } + + // + return result; + } + + // + // Close Partial By Ticket ... + bool ClosePartial( + ulong ticket, // Position Ticket + double volume, // Volume Size for Partial Closing + string comment = NULL // Close Position By Specific Comment + ) + { + // + bool result = false; + + // + XPosition position; + result = GetPosition( + ticket, + position // + ); + if (!result) + { + return result; + } + + // + // Use Default Partial Close Comment ... + if (!IsValid(comment)) + { + // + comment += "PClose " + GetPositionComment(ticket); + } + + // + result = mTrader.PositionClosePartial( + ticket, + volume, + mSlippage, + comment + // + ); + if (result) + { + // + NotifyPartialCloseEvent( + ticket, + position.profit, + comment // + ); + } + + // + return result; + } + + // + // Cancel Specific Order ... + bool CancelOrder(ulong ticket) + { + return mTrader + .OrderDelete(ticket); + } + + // + // Cancel Specific Orders ... + int CancelOrders( + XOrder &orders[] // Specified Orders ... + ) + { + // + int result = 0; + + // + int ordersCount = ArraySize(orders); + if (ordersCount <= 0) + { + return result; + } + + // + for (int i = 0; i < ordersCount; i++) + { + // + XOrder iOrder = orders[i]; + + // + bool isDeleted = mTrader + .OrderDelete(iOrder.ticket); + if (isDeleted && !result) + { + result++; + } + } + + // + return result; + } + + // + // Extractors ... + + // + // Positions ... + + // + // Calculate Positions Profit ... + double Profit( + string symbol = NULL, // Trading Symbol + string provider = NULL, // Signal Provider + ENUM_TIMEFRAMES period = NULL, // Trading Period + ENUM_X_POSITION_TYPES type = NULL, // Long (Buy) or Short (Sell) + bool filterByMagic = true // Get Only Self Open Positions + ) + { + // + double result = 0; + + // + // Retrieve Positions ... + XPosition positions[]; + int positionsCount = GetPositions( + positions, + symbol, + provider, + period, + type, + filterByMagic + // + ); + if (positionsCount <= 0) + { + return result; + } + + // + for (int i = 0; i < positionsCount; i++) + { + result += positions[i].profit; + } + + // + return result; + } + + // + // Retrieve Specific Position by Index ... + bool GetPosition( + int index, // Specified Index + XPosition &result // Hold's Result + ) + { + // + bool isInited = result + .ByIndex(index); + + // + return isInited; + } + + // + // Retrieve Specific Position by Ticket ... + bool GetPosition( + ulong ticket, // Specified Ticket + XPosition &result // Hold's Result + ) + { + // + bool isInited = result + .ByTicket(ticket); + + // + return isInited; + } + + // + double GetPositionCommission( + ulong ticket // Specified Ticket + ) + { + // + double result = 0; + + // + XPosition position; + bool hasPosition = GetPosition( + ticket, + position // + ); + if (!hasPosition) + { + return result; + } + + // + XDeal deals[]; + int dealsCount = GetDeals( + deals, + position.symbol, + position.provider, + position.period, + NULL, + DEAL_ENTRY_IN // + ); + if (IsValidSize(dealsCount)) + { + // + for (int i = 0; i < dealsCount; i++) + { + // + XDeal iDeal = deals[i]; + if (iDeal.positionId == ticket) + { + // + result = iDeal.commission; + break; + } + } + } + + // + return result; + } + + // + // Retrieve Positions ... + int GetPositions( + XPosition &result[], // Hold's Result + string symbol = NULL, // Trading Symbol + string provider = NULL, // Signal Provider + ENUM_TIMEFRAMES period = NULL, // Trading Period + ENUM_X_POSITION_TYPES type = NULL, // Long (Buy) or Short (Sell) + bool filterByMagic = true, // Get Only Self Open Positions + bool forceClean = true // Clean Result Array + ) + { + // + int mResult = 0; + + // + int before = ArraySize(result); + + // + if (forceClean) + { + Clean(result); + } + + // + // Count Positions ... + int itemsCount = PositionsTotal(); + if (itemsCount <= 0) + { + return mResult; + } + + // + // Loop Through all Positions ... + for (int i = itemsCount - 1; i >= 0; i--) + { + // + XPosition iItem; + bool isLoaded = iItem.ByIndex(i); + if (!isLoaded) + { + continue; + } + + // + // Now we have to Check Given Filters ... + bool isFiltersPassed = + iItem.IsFiltersPassed( + symbol, + provider, + period, + type, + mMagicNumber, + filterByMagic + // + ); + if (!isFiltersPassed) + { + continue; + } + + // + // Add Filtered Item into Result ... + AddRef( + iItem, + result + // + ); + } + + // + int after = ArraySize(result); + + // + mResult = after - before; + + // + return mResult; + } + + // + void GetPositions( + XPosition &longs[], // Hold's Longs Result + XPosition &shorts[], // Hold's Shorts Result + string symbol = NULL, // Trading Symbol + string provider = NULL, // Signal Provider + ENUM_TIMEFRAMES period = NULL, // Trading Period + bool filterByMagic = true, // Get Only Self Open Positions + bool forceClean = true // Clean Result Array + ) + { + // + // Retrieve Long Positions ... + GetPositions( + longs, + symbol, + provider, + period, + X_POSITION_TYPE_LONG, + filterByMagic, + forceClean // + ); + + // + // Retrieve Short Positions ... + GetPositions( + shorts, + symbol, + provider, + period, + X_POSITION_TYPE_SHORT, + filterByMagic, + forceClean // + ); + } + + // + // Select In Profit Positions ... + int GetInProfitPositions( + XPosition &result[], // Hold's Result + string symbol = NULL, // Trading Symbol + string provider = NULL, // Signal Provider + ENUM_TIMEFRAMES period = NULL, // Trading Period + ENUM_X_POSITION_TYPES type = NULL, // Long (Buy) or Short (Sell) + ENUM_X_POSITION_SELECT_METHODS method = NULL, // Selection Method + bool filterByMagic = true, // Get Only Self Open Positions + bool forceClean = true // Clean Result Array + ) + { + // + int mResult = 0; + + // + int before = ArraySize(result); + + // + if (forceClean) + { + Clean(result); + } + + // + XPosition positions[]; + int positionsCount = GetPositions( + positions, + symbol, + provider, + period, + type, + filterByMagic, + forceClean); + if (positionsCount <= 0) + { + return mResult; + } + + // + XPosition min; + XPosition max; + + // + for (int i = 0; i < positionsCount; i++) + { + // + XPosition iPosition = positions[i]; + + // + if (iPosition.profit <= 0) + { + continue; + } + + // + // Calculate Min and Max ... + + // + // Min ... + if (!min.IsValid() || min.profit <= 0 || min.profit > iPosition.profit) + { + min = iPosition; + } + + // + // Max ... + if (!max.IsValid() || max.profit <= 0 || max.profit < iPosition.profit) + { + max = iPosition; + } + + // + bool isSelectionMethodFilterPassed = + // + (method == NULL || + method == X_POSITION_SELECT_ALL) + ? true + : false; + // + ; + if (!isSelectionMethodFilterPassed) + { + continue; + } + + // + AddRef( + iPosition, + result + // + ); + } + + // + if (min.IsValid() && + (method == X_POSITION_SELECT_MIN || + method == X_POSITION_SELECT_BOTH)) + { + // + AddRef( + min, + result + // + ); + } + + // + if (max.IsValid() && + (method == X_POSITION_SELECT_MAX || + method == X_POSITION_SELECT_BOTH)) + { + // + AddRef( + max, + result + // + ); + } + + // + int after = ArraySize(result); + + // + mResult = after - before; + + // + return mResult; + } + + // + // Select In Drawdown Positions ... + int GetInDrawdownPositions( + XPosition &result[], // Hold's Result + string symbol = NULL, // Trading Symbol + string provider = NULL, // Signal Provider + ENUM_TIMEFRAMES period = NULL, // Trading Period + ENUM_X_POSITION_TYPES type = NULL, // Long (Buy) or Short (Sell) + ENUM_X_POSITION_SELECT_METHODS method = NULL, // Selection Method + bool filterByMagic = true, // Get Only Self Open Positions + bool forceClean = true // Clean Result Array + ) + { + // + int mResult = 0; + + // + int before = ArraySize(result); + + // + if (forceClean) + { + Clean(result); + } + + // + XPosition positions[]; + int positionsCount = GetPositions( + positions, + symbol, + provider, + period, + type, + filterByMagic, + forceClean); + if (positionsCount <= 0) + { + return mResult; + } + + // + XPosition min; + XPosition max; + + // + for (int i = 0; i < positionsCount; i++) + { + // + XPosition iPosition = positions[i]; + + // + if (iPosition.profit >= 0) + { + continue; + } + + // + // Calculate Min and Max ... + + // + // Min ... + if (!min.IsValid() || min.profit <= 0 || min.profit > iPosition.profit) + { + min = iPosition; + } + + // + // Max ... + if (!max.IsValid() || max.profit <= 0 || max.profit < iPosition.profit) + { + max = iPosition; + } + + // + bool isSelectionMethodFilterPassed = + // + (method == NULL || + method == X_POSITION_SELECT_ALL) + ? true + : false; + // + ; + if (!isSelectionMethodFilterPassed) + { + continue; + } + + // + AddRef( + iPosition, + result + // + ); + } + + // + if (min.IsValid() && + (method == X_POSITION_SELECT_MIN || + method == X_POSITION_SELECT_BOTH)) + { + // + AddRef( + min, + result + // + ); + } + + // + if (max.IsValid() && + (method == X_POSITION_SELECT_MAX || + method == X_POSITION_SELECT_BOTH)) + { + // + AddRef( + max, + result + // + ); + } + + // + int after = ArraySize(result); + + // + mResult = after - before; + + // + return mResult; + } + + // + // Orders ... + + // + // Retrieve Specific Order by Index ... + bool GetOrder( + int index, // Specified Index + XOrder &result // Hold's Result + ) + { + // + return result + .ByIndex(index); + } + + // + // Retrieve Specific Positions Orders ... + int GetOrders( + ulong ticket, // Positions Ticket + XOrder &result[], // Hold's Result + bool forceClean = true // Clean Result Array + ) + { + // + int mResult = 0; + + // + // Select History by Specified Ticket ... + bool isHistorySelected = HistorySelectByPosition(ticket); + if (!isHistorySelected) + { + return mResult; + } + + // + int ordersCount = HistoryOrdersTotal(); + if (ordersCount <= 0) + { + return mResult; + } + + // + int before = ArraySize(result); + + // + if (forceClean) + { + Clean(result); + } + + // + for (int i = 0; i < ordersCount; i++) + { + // + XOrder iOrder; + bool isLoaded = iOrder.HistoryByIndex(i); + if (!isLoaded) + { + continue; + } + + // + bool isTicketFilterPassed = + // + iOrder.ticket = ticket + // + ; + if (!isTicketFilterPassed) + { + continue; + } + + // + AddRef( + iOrder, + result + // + ); + } + + // + int after = ArraySize(result); + + // + mResult = after - before; + + // + return mResult; + } + + // + // Retrieve All Orders ... + int GetOrders( + XOrder &result[], // Hold's Result + string symbol = NULL, // Trading Symbol + string provider = NULL, // Signal Provider + ENUM_TIMEFRAMES period = NULL, // Trading Period + ENUM_X_POSITION_TYPES type = NULL, // Long (Buy) or Short (Sell) + ENUM_ORDER_STATE state = NULL, // Order State + bool filterByMagic = true, // Get Only Self Open Positions + bool forceClean = true // Clean Result Array + ) + { + // + int mResult = 0; + + // + int before = ArraySize(result); + + // + if (forceClean) + { + Clean(result); + } + + // + // Count Positions ... + int itemsCount = OrdersTotal(); + if (itemsCount <= 0) + { + return mResult; + } + + // + // Loop Through all Positions ... + for (int i = itemsCount - 1; i >= 0; i--) + { + // + XOrder iItem; + bool isLoaded = iItem.ByIndex(i); + if (!isLoaded) + { + continue; + } + + // + // Now we have to Check Given Filters ... + bool isFiltersPassed = + iItem.IsFiltersPassed( + symbol, + provider, + period, + type, + state, + mMagicNumber, + filterByMagic + // + ); + if (!isFiltersPassed) + { + continue; + } + + // + // Add Filtered Item into Result ... + AddRef( + iItem, + result + // + ); + } + + // + int after = ArraySize(result); + + // + mResult = after - before; + + // + return mResult; + } + + // + // Retrieve Historical Orders ... + int GetOrders( + XOrder &result[], // Hold's Result + string symbol = NULL, // Trading Symbol + string provider = NULL, // Signal Provider + ENUM_TIMEFRAMES period = NULL, // Trading Period + ENUM_X_POSITION_TYPES type = NULL, // Long (Buy) or Short (Sell) + ENUM_ORDER_STATE state = NULL, // Order State + datetime startDate = NULL, // Specify Start Date + datetime endDate = NULL, // Specify End Date + bool filterByMagic = true, // Get Only Self Open Positions + bool forceClean = true // Clean Result Array + ) + { + // + int mResult = 0; + + // + endDate = NormalizeTime(endDate); + + // + if (!IsValid(startDate)) + { + startDate = endDate - PeriodSeconds(PERIOD_D1); + } + + // + bool isHistorySelected = HistorySelect( + startDate, + endDate); + if (!isHistorySelected) + { + return mResult; + } + + // + int before = ArraySize(result); + + // + if (forceClean) + { + Clean(result); + } + + // + // Count Positions ... + int itemsCount = OrdersTotal(); + if (itemsCount <= 0) + { + return mResult; + } + + // + // Loop Through all Positions ... + for (int i = itemsCount - 1; i >= 0; i--) + { + // + XOrder iItem; + bool isLoaded = iItem.HistoryByIndex(i); + if (!isLoaded) + { + continue; + } + + // + // Now we have to Check Given Filters ... + bool isFiltersPassed = + iItem.IsFiltersPassed( + symbol, + provider, + period, + type, + state, + mMagicNumber, + filterByMagic + // + ); + if (!isFiltersPassed) + { + continue; + } + + // + // Add Filtered Item into Result ... + AddRef( + iItem, + result + // + ); + } + + // + int after = ArraySize(result); + + // + mResult = after - before; + + // + return mResult; + } + + // + // Deals ... + + // + // Retrieve Specific Deal by Index ... + bool GetDeal( + int index, // Specified Index + XDeal &result // Hold's Result + ) + { + // + return result + .ByIndex(index); + } + + // + bool GetLastDeal( + XDeal &result // Hold's Result + ) + { + // + bool mResult = false; + + // + mResult = HistorySelect(0, TimeCurrent()); + if (!mResult) + { + return mResult; + } + + // + int lastDealIndex = HistoryDealsTotal() - 1; + + // + mResult = GetDeal( + lastDealIndex, + result // + ); + + // + return mResult; + } + + // + // Retrieve Specified Deal's History ... + int GetDealsHistory( + XDeal &deal, // Specified Deal + XOrder &history[], // Deals History + bool forceClean = true // Clean Result Array + ) + { + // + int result = 0; + + // + if (!deal.IsValid()) + { + return result; + } + + // + result = GetOrders( + deal.positionId, + history, + forceClean); + + // + return result; + } + + // + // Retrieve All Deals ... + int GetDeals( + XDeal &result[], // Hold's Result + string symbol = NULL, // Trading Symbol + string provider = NULL, // Signal Provider + ENUM_TIMEFRAMES period = NULL, // Trading Period + ENUM_DEAL_TYPE type = NULL, // Deal Type + ENUM_DEAL_ENTRY entry = NULL, // Deal Entry + ENUM_DEAL_REASON reason = NULL, // Deal Reason + datetime startDate = NULL, // Specify Start Date + datetime endDate = NULL, // Specify End Date + bool filterByMagic = true, // Get Only Self Open Positions + bool forceClean = true // Clean Result Array + ) + { + // + int mResult = 0; + + // + endDate = NormalizeTime(endDate); + + // + if (!IsValid(startDate)) + { + startDate = endDate - PeriodSeconds(PERIOD_D1); + } + + // + bool isHistorySelected = HistorySelect( + startDate, + endDate); + if (!isHistorySelected) + { + return mResult; + } + + // + int before = ArraySize(result); + + // + if (forceClean) + { + Clean(result); + } + + // + // Count Positions ... + int itemsCount = HistoryDealsTotal(); + if (itemsCount <= 0) + { + return mResult; + } + + // + // Loop Through all Positions ... + for (int i = itemsCount - 1; i >= 0; i--) + { + // + XDeal iItem; + bool isLoaded = iItem.ByIndex(i); + if (!isLoaded) + { + continue; + } + + // + // Now we have to Check Given Filters ... + bool isFiltersPassed = + iItem.IsFiltersPassed( + symbol, + provider, + period, + type, + entry, + reason, + mMagicNumber, + filterByMagic + // + ); + if (!isFiltersPassed) + { + continue; + } + + // + // Add Filtered Item into Result ... + AddRef( + iItem, + result + // + ); + } + + // + int after = ArraySize(result); + + // + mResult = after - before; + + // + return mResult; + } + + // + // Support Functions ... + + // + // Check a Position has Support or not ... + bool HasSupport( + ulong ticket, + bool forceOpen = true // + ) + { + // + bool result = false; + + // + result = ticket > 0; + if (!result) + { + return result; + } + + // + if (forceOpen) + { + // + result = IsOpen(ticket); + if (!result) + { + return result; + } + } + + // + XPosition positions[]; + int positionsCount = GetPositions(positions); + result = IsValidSize(positionsCount); + if (!result) + { + return result; + } + + // + // Extract Support Positions ... + XPosition supports[]; + int supportsCount = ExtractSupports( + positions, + supports // + ); + result = IsValidSize(supportsCount); + if (!result) + { + return result; + } + + // + // Loop Through Supports ... + for (int i = 0; i < supportsCount; i++) + { + // + XPosition iSupport = supports[i]; + + // + ulong supportedTicket = ExtractSupportedTicket(iSupport.comment); + ulong eqmSupportedTicket = ExtractEQMSupportedTicket(iSupport.comment); + + // + result = + // + (supportedTicket > 0 && ticket == supportedTicket) + // + || + // + (eqmSupportedTicket > 0 && ticket == eqmSupportedTicket) + // + ; + if (result) + { + break; + } + } + + // + return result; + } + + // + // Retrieve Specific Position's Supports ... + int GetSupports( + ulong ticket, + XPosition &dest[], // Result ... + bool forceOpen = true // + ) + { + // + int result = 0; + + // + Clean(dest); + + // + bool hasSupport = HasSupport( + ticket, + forceOpen // + ); + if (!hasSupport) + { + return result; + } + + // + XPosition positions[]; + int positionsCount = GetPositions(positions); + if (!IsValidSize(positionsCount)) + { + return result; + } + + // + // Extract Support Positions ... + XPosition supports[]; + int supportsCount = ExtractSupports( + positions, + supports // + ); + if (!IsValidSize(supportsCount)) + { + return result; + } + + // + // Loop Through Supports ... + for (int i = 0; i < supportsCount; i++) + { + // + XPosition iSupport = supports[i]; + + // + ulong supportedTicket = ExtractSupportedTicket(iSupport.comment); + ulong eqmSupportedTicket = ExtractEQMSupportedTicket(iSupport.comment); + + // + bool isOwn = + // + (supportedTicket > 0 && ticket == supportedTicket) + // + || + // + (eqmSupportedTicket > 0 && ticket == eqmSupportedTicket) + // + ; + if (isOwn) + { + // + AddRef( + iSupport, + dest // + ); + } + } + + // + result = ArraySize(dest); + + // + return result; + } + + // + // Retrieve Specific Position's Supports ... + int GetSupports( + ulong ticket, + XOrder &dest[], // Result ... + bool forceOpen = true // + ) + { + // + int result = 0; + + // + Clean(dest); + + // + bool hasSupport = HasSupport( + ticket, + forceOpen // + ); + if (!hasSupport) + { + return result; + } + + // + XOrder orders[]; + int ordersCount = GetOrders( + orders, + NULL, // All Symbols ... + NULL, // All Providers ... + NULL, // All Periods ... + X_POSITION_TYPE_ALL, // All Types ... + ORDER_STATE_PLACED, // Untriggere Orders ... + true // + ); + if (!IsValidSize(ordersCount)) + { + return result; + } + + // + // Extract Support Positions ... + XOrder supports[]; + int supportsCount = ExtractSupports( + orders, + supports // + ); + if (!IsValidSize(supportsCount)) + { + return result; + } + + // + // Loop Through Supports ... + for (int i = 0; i < supportsCount; i++) + { + // + XOrder iSupport = supports[i]; + + // + ulong supportedTicket = ExtractSupportedTicket(iSupport.comment); + ulong eqmSupportedTicket = ExtractEQMSupportedTicket(iSupport.comment); + + // + bool isOwn = + // + (supportedTicket > 0 && ticket == supportedTicket) + // + || + // + (eqmSupportedTicket > 0 && ticket == eqmSupportedTicket) + // + ; + if (isOwn) + { + // + AddRef( + iSupport, + dest // + ); + } + } + + // + result = ArraySize(dest); + + // + return result; + } + + // + // Tools ... + + // + // Retrieve Last Open Position Ticket ... + ulong GetLastOpenPositionTicket() + { + // + ulong result = 0; + + int positionsCount = PositionsTotal(); + if (positionsCount <= 0) + { + return result; + } + + // + result = PositionGetTicket(PositionsTotal() - 1); + + // + return result; + } + + // + // Retrieve Last Placed Order Ticket ... + ulong GetLastPlacedOrderTicket() + { + // + ulong result = 0; + + int ordersCount = OrdersTotal(); + if (ordersCount <= 0) + { + return result; + } + + // + if (mOrderInfo.SelectByIndex(ordersCount - 1)) + { + result = mOrderInfo.Ticket(); + } + + // + return result; + } + + // + // Prepare Dynamic Volume ... + double GetDynamicVolume( + string _symbol, + double _balanceFactor, + double _volumeStep // + ) + { + // + double result = 0; + + // + // Validate Inputs ... + if (!IsValid(_symbol) || + _volumeStep <= 0 || + _balanceFactor <= 0) + { + return result; + } + + // + // Retrieve Account Balance ... + double balance = mAccount.GetBalance(); + + // + double bStep = balance / _balanceFactor; + bStep = MathFloor(bStep); + if (bStep == 0) + { + bStep = 1; + } + + // + result = bStep * _volumeStep; + + // + result = NormalizeVolume( + result, + _symbol // + ); + + // + return result; + } + + // + // Protected ... + protected: + // + // Props ... + + // + // Event Listener Notifiers ... + + // + // State ... + void NotifyTradeStateChangeEvent(const XOnTradeHandlerState &state) + { + // + int count = ArraySize(mTradeStateChangedEventHandlers); + if (count <= 0) + { + return; + } + + // + for (int i = 0; i < count; i++) + { + // + TOnTradeStateChanged iHandler = mTradeStateChangedEventHandlers[i]; + iHandler(state); + } + } + + // + // Deals ... + void NotifyDealsChangeEvent(int changes) + { + // + int count = ArraySize(mDealsChangedEventHandlers); + if (count <= 0) + { + return; + } + + // + for (int i = 0; i < count; i++) + { + // + TOnDealsChanged iHandler = mDealsChangedEventHandlers[i]; + iHandler(changes); + } + } + + // + // Orders ... + void NotifyOrdersChangeEvent(int changes) + { + // + int count = ArraySize(mOrdersChangedEventHandlers); + if (count <= 0) + { + return; + } + + // + for (int i = 0; i < count; i++) + { + // + TOnOrdersChanged iHandler = mOrdersChangedEventHandlers[i]; + iHandler(changes); + } + } + + // + // Positions ... + void NotifyPositionsChangeEvent(int changes) + { + // + int count = ArraySize(mPositionsChangedEventHandlers); + if (count <= 0) + { + return; + } + + // + for (int i = 0; i < count; i++) + { + // + TOnPositionsChanged iHandler = mPositionsChangedEventHandlers[i]; + iHandler(changes); + } + } + + // + // StopLoss ... + void NotifyStopLossEvent(const XDeal &deal) + { + // + int count = ArraySize(mStopLossEventHandlers); + if (count <= 0) + { + return; + } + + // + for (int i = 0; i < count; i++) + { + // + TOnStopLoss iHandler = mStopLossEventHandlers[i]; + iHandler(deal); + } + } + + // + // Take Profit ... + void NotifyTakeProfitEvent(const XDeal &deal) + { + // + int count = ArraySize(mTakeProfitEventHandlers); + if (count <= 0) + { + return; + } + + // + for (int i = 0; i < count; i++) + { + // + TOnTakeProfit iHandler = mTakeProfitEventHandlers[i]; + iHandler(deal); + } + } + + // + void NotifyModifyEvent( + ulong ticket, + double profit, + string comment // + ) + { + // + int count = ArraySize(mOnModifyEventHandlers); + if (count <= 0) + { + return; + } + + // + for (int i = 0; i < count; i++) + { + // + TOnModify iHandler = mOnModifyEventHandlers[i]; + iHandler( + ticket, + profit, + comment // + ); + } + } + + // + void NotifyForceCloseEvent( + ulong ticket, + XPosition &position, + string comment // + ) + { + // + int count = ArraySize(mOnForceCloseEventHandlers); + if (count <= 0) + { + return; + } + + // + for (int i = 0; i < count; i++) + { + // + TOnForceClose iHandler = mOnForceCloseEventHandlers[i]; + iHandler( + ticket, + position, + comment // + ); + } + } + + // + void NotifyPartialCloseEvent( + ulong ticket, + double profit, + string comment // + ) + { + // + int count = ArraySize(mOnPartialCloseEventHandlers); + if (count <= 0) + { + return; + } + + // + for (int i = 0; i < count; i++) + { + // + TOnModify iHandler = mOnPartialCloseEventHandlers[i]; + iHandler( + ticket, + profit, + comment // + ); + } + } + + // + // Tools ... + + // + // Retrieve Specified Position Comment ... + string GetPositionComment(ulong ticket) + { + // + string result = NULL; + + // + if (!IsOpen(ticket)) + { + return result; + } + + // + XPosition position; + bool isLoaded = position.ByTicket(ticket); + if (!isLoaded) + { + return result; + } + + // + result = position.comment; + + // + return result; + } + + // + ENUM_TIMEFRAMES GetDealPeriod(XDeal &deal) + { + // + ENUM_TIMEFRAMES result = NULL; + + // + XOrder orders[]; + int ordersCount = GetDealsHistory( + deal, + orders); + if (!ordersCount) + { + return result; + } + + // + for (int i = 0; i < ordersCount; i++) + { + // + XOrder iOrder = orders[i]; + + // + if (IsValid(iOrder.comment)) + { + // + ENUM_TIMEFRAMES iPeriod = ExtractPeriod(iOrder.comment); + if (IsValid(iPeriod)) + { + result = iPeriod; + break; + } + } + } + + // + return result; + } + + // + double GetMaxAllowedEquity() + { + // + double equity = mAccount.GetEquity(); + double balance = mAccount.GetBalance(); + + // + double balanceForFactor = MathAbs(equity - balance); + if (balanceForFactor <= 0) + { + balanceForFactor = balance; + } + else + { + balanceForFactor = equity; + } + + // + double result = balanceForFactor * mMaxAllowedDrawdownFactor; + + // + return result; + } + + // + // Private ... + private: + // + // Props ... + + // + int mSlippage; // Slippage ... + ulong mMagicNumber; // Magic Number (Unique Identifier) ... + + // + double mMaxAllowedSpread; // Max Allowed Spred for Opening Trades + int mMaxAllowedPositions; // Max Allowed Same Positions + double mMaxAllowedDrawdownFactor; // Max Allowed Drawdown Factor + + // + XCTradeBase *mTrader; // Base CTrade Manipulated Instance ... + + // + CDealInfo mDealInfo; // Deals Info ... + COrderInfo mOrderInfo; // Order Info ... + CPositionInfo mPositionInfo; // Positions Info + CHistoryOrderInfo mHistoryOrderInfo; // History Orders Info ... + + // + // Position Info Collector ... + + // + // Tools ... + + // + // OnTrade Event Handlers Section ... + + // + // Props ... + + // + int mDaysForRead; // Reading Dates for Trade History Checker ... + datetime mEndDate; // End Date for Trade history Checking ... + datetime mStartDate; // Start Date for Trade history Checking ... ... + int mOrdersCount; // Number of Active orders ... + int mPositionsCount; // Number of Open positions ... + int mDealsCount; // Number of Deals in the Trade History Checking ... + int mHistoryOrdersCount; // Number of Orders in the Trade History Checking ... + bool mScanStarted; // a Flag of counter relevance ... + + // + // Event Listeners ... + + // + // Deals Changed Event Handlers ... + TOnDealsChanged mDealsChangedEventHandlers[]; + + // + // Orders Changed Event Handlers ... + TOnOrdersChanged mOrdersChangedEventHandlers[]; + + // + // Positions Changed Event Handlers ... + TOnPositionsChanged mPositionsChangedEventHandlers[]; + + // + // Trade State Changed Event Handlers ... + TOnTradeStateChanged mTradeStateChangedEventHandlers[]; + + // + TOnModify mOnModifyEventHandlers[]; + TOnForceClose mOnForceCloseEventHandlers[]; + TOnPartialClose mOnPartialCloseEventHandlers[]; + + // + // TPSL ... + TOnStopLoss mStopLossEventHandlers[]; + TOnTakeProfit mTakeProfitEventHandlers[]; + + // + // Reset On Trade Scanner Context ... + void ResetOnTradeContext() + { + // + mEndDate = TimeCurrent(); + mStartDate = mEndDate - (mDaysForRead * PeriodSeconds(PERIOD_D1)); + } + + // + // Initial Context Of Trade Scanner ... + void InitOnTradeContext() + { + // + ResetLastError(); + + // + mOrdersCount = OrdersTotal(); + mPositionsCount = PositionsTotal(); + + // + // load history ... + bool selected = HistorySelect(mStartDate, mEndDate); + if (!selected) + { + return; + } + + // + // get the current value ... + mDealsCount = HistoryDealsTotal(); + mHistoryOrdersCount = HistoryOrdersTotal(); + + // + mScanStarted = true; + } + + // + // Check Statrt Date In Trade History ... + void CheckStartDateInTradeHistory() + { + // + // initial interval, if we were to start working right now .. + datetime currStart = TimeCurrent() - (mDaysForRead * PeriodSeconds(PERIOD_D1)); + + // + // make sure that the start limit of the trade history has not gone + // more than 1 day over the intended date ... + if (currStart - mStartDate > PeriodSeconds(PERIOD_D1)) + { + // + // correct the start date of history to be loaded in the cache ... + mStartDate = currStart; + + // + // now reload the trade history for the updated interval ... + HistorySelect(mStartDate, mEndDate); + + // + // correct the deal and order counters in history for further comparison + mHistoryOrdersCount = HistoryOrdersTotal(); + mDealsCount = HistoryDealsTotal(); + } + } + + // + // Process On Trade Context ... + void ProcessOnTradeContext( + XOnTradeHandlerState &result // Hold's Result + ) + { + // + mEndDate = TimeCurrent(); + + // + ResetLastError(); + + // + // download trading history from the specified interval to the program cache ... + bool selected = HistorySelect(mStartDate, mEndDate); + if (!selected) + { + return; + } + + // + // get the current values ... + int currOrders = OrdersTotal(); + int currPositions = PositionsTotal(); + int currDeals = HistoryDealsTotal(); + int currHistoryOrders = HistoryOrdersTotal(); + + // + // Orders ... + // check if the number of active orders has been changed ... + if (currOrders != mOrdersCount) + { + // + // number of active orders has been changed ... + result.hasNewOrder = true; + result.newOrders = currOrders - mOrdersCount; + + // + // update the value ... + mOrdersCount = currOrders; + } + + // + // Positions ... + // changes in the number of open positions ... + if (currPositions != mPositionsCount) + { + // + // number of open positions has been changed ... + result.hasNewPosition = true; + result.newPositions = currPositions - mPositionsCount; + + // + // update the value ... + mPositionsCount = currPositions; + } + + // + // Deals ... + // changes in the number of deals in the trade history cache ... + if (currDeals != mDealsCount) + { + // + // number of deals in the trade history cache has been changed ... + result.hasNewDeal = true; + result.newDeals = currDeals - mDealsCount; + + // + // update the value ... + mDealsCount = currDeals; + } + + // + // History Orders ... + // changes in the number of history orders in the trade history cache ... + if (currHistoryOrders != mHistoryOrdersCount) + { + // + // number of history orders in the trade history cache has been changed ... + result.hasNewHistoryOrder = true; + result.newHistoryOrders = currHistoryOrders - mHistoryOrdersCount; + + // + // update the value ... + mHistoryOrdersCount = currHistoryOrders; + } + + // + // checking if it is necessary to change the limits of the trade history to be requested in cache ... + CheckStartDateInTradeHistory(); + } +}; + +// \ No newline at end of file diff --git a/BKPS/14031206/Documents/BKP/Test.ex5 b/BKPS/14031206/Documents/BKP/Test.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..d70d86dfbebf2831ea2dbb5b2144acca279e6158 GIT binary patch literal 8276 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 lastBearishTrend + ? X_DIRECTION_BULLISH + : IsValid(lastBearishTrend) && + lastBearishTrend > lastBullishTrend + ? X_DIRECTION_BEARISH + : X_DIRECTION_NONE; + bool hasTrend = HasDirection(trend); + bool hasBullishTrend = hasTrend && + IsBullish(trend); + bool hasBearishTrend = hasTrend && + IsBearish(trend); + + // + // Order Block ... + has = hasBullishTrend; + if (has) + { + } + has = hasBearishTrend; + if (has) + { + } + + // + // Fair Value Gap ... + has = hasBullishTrend; + if (has) + { + } + has = hasBearishTrend; + if (has) + { + } + + // + // Supply Zone ... + has = hasBearishTrend; + if (has) + { + } + + // + // Resistance Zone ... + has = hasBearishTrend; + if (has) + { + } + + // + // Demand Zone ... + has = hasBullishTrend; + if (has) + { + } + + // + // Support Zone ... + has = hasBullishTrend; + if (has) + { + } + + // + // Draw Inside Zones ... + + // + if (hasInsideOB) + { + // + XCBaseObject *iObj; + bool isCreated = mXWZPOIDrawer + .CreateOrderBlock( + insideOB, + iObj // + ); + // + if (isCreated) + { + mXWZDrawnObjects.Add(iObj); + } + } + + // + if (hasInsideFVG) + { + // + XCBaseObject *iObj; + bool isCreated = mXWZPOIDrawer + .CreateFairValueGap( + insideFVG, + iObj // + ); + // + if (isCreated) + { + mXWZDrawnObjects.Add(iObj); + } + } + + // + if (hasInsideSupply) + { + // + XCSupplyZoneObject *iObj; + bool isCreated = mXWZPOIDrawer + .CreateSupplyZone( + insideSupply, + iObj // + ); + // + if (isCreated) + { + mXWZDrawnObjects.Add(iObj); + } + } + + // + if (hasInsideDemand) + { + // + XCDemandZoneObject *iObj; + bool isCreated = mXWZPOIDrawer + .CreateDemandZone( + insideDemand, + iObj // + ); + // + if (isCreated) + { + mXWZDrawnObjects.Add(iObj); + } + } + + // + if (hasInsideSupport) + { + // + XCSupportZoneObject *iObj; + bool isCreated = mXWZPOIDrawer + .CreateSupportZone( + insideSupport, + iObj // + ); + // + if (isCreated) + { + mXWZDrawnObjects.Add(iObj); + } + } + + // + if (hasInsideResistance) + { + // + XCResistanceZoneObject *iObj; + bool isCreated = mXWZPOIDrawer + .CreateResistanceZone( + insideResistnce, + iObj // + ); + // + if (isCreated) + { + mXWZDrawnObjects.Add(iObj); + } + } diff --git a/BKPS/14031206/Documents/BKP/x-121.smc.xwz.signal.class copy 2.mq5 b/BKPS/14031206/Documents/BKP/x-121.smc.xwz.signal.class copy 2.mq5 new file mode 100644 index 0000000..a604caf --- /dev/null +++ b/BKPS/14031206/Documents/BKP/x-121.smc.xwz.signal.class copy 2.mq5 @@ -0,0 +1,2725 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 X121 SMC Signal Class +// ------------------------------------------------- +// Name: XWZ +// Description: provide all Signalling 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 + +// +// Imports ... +#include "../Classes/x-121.smc.market.cycle.helper.class.mq5" +#include "../Libraries/x-121.smc.guard.lib.mq5" +#include "../Libraries/x-121.smc.lib.mq5" +#include "./x-121.smc.xwz.signal.lib.mq5" + +// +// Definition ... +class XCX121SMCXWZSignalDetector : public XCBase +{ + // + public: + // + // Props ... + X121SMCStrategyXWZSignalConditions mConditions; + X121SMCStrategyXWZSignalConditions mConditionsCollection[]; + + // + // Constructor(s) ... + XCX121SMCXWZSignalDetector() + { + Init(); + } + + // + // Deconstructor ... + ~XCX121SMCXWZSignalDetector() + { + DeInit(); + } + + // + // + // + + // + // Detect Setup Conditions ... + bool DetectSignalSetup( + // + string _symbol, + ENUM_TIMEFRAMES _period, + // + XC121SMCCycleHelper *decisionCycleHelper, + XC121SMCCycleHelper *analyseCycleHelper, + XC121SMCCycleHelper *consolidationCycleHelper, + XC121SMCCycleHelper *visionCycleHelper + // + ) + { + // + bool result = false; + + // + // Validate Cycle Helpers ... + result = + // + visionCycleHelper != NULL && + analyseCycleHelper != NULL && + decisionCycleHelper != NULL && + consolidationCycleHelper != NULL + // + ; + if (!result) + { + // + mConditions.Clean(); + + // + return result; + } + + // + bool isBullish = false; + bool isBearish = false; + + // + int zIndex = 0; + int cIndex = zIndex + 1; + int pIndex = cIndex + 1; + int ppIndex = pIndex + 1; + + // + int loopback = 10; + + // + string symbol = _symbol; + ENUM_TIMEFRAMES period = _period; + + // + mConditions.symbol = symbol; + mConditions.period = period; + + // + double ask = GetAsk(symbol); + double bid = GetBid(symbol); + datetime cTime = TimeCurrent(); + double points = GetPoints(symbol); + + // + double target = 0; + + // + // Cycles Conditions ... + + // + // Decision ... + ENUM_XPOI_EVENTS decisionPoiEvents[]; + ENUM_X_CYCLE_EVENTS decisionCycleEvents[]; + X121SMCCycleConditions decisionConditions; + result = decisionCycleHelper.GetConditions( + decisionCycleEvents, + decisionPoiEvents, + decisionConditions, + zIndex, + loopback // + ); + if (!result) + { + // + mConditions.Clean(); + + // + return result; + } + + // + // Analyse ... + ENUM_XPOI_EVENTS analysePoiEvents[]; + ENUM_X_CYCLE_EVENTS analyseCycleEvents[]; + X121SMCCycleConditions analyseConditions; + result = analyseCycleHelper.GetConditions( + analyseCycleEvents, + analysePoiEvents, + analyseConditions, + zIndex, + loopback // + ); + if (!result) + { + // + mConditions.Clean(); + + // + return result; + } + + // + // Consolidation ... + ENUM_XPOI_EVENTS consolidationPoiEvents[]; + ENUM_X_CYCLE_EVENTS consolidationCycleEvents[]; + X121SMCCycleConditions consolidationConditions; + result = consolidationCycleHelper.GetConditions( + consolidationCycleEvents, + consolidationPoiEvents, + consolidationConditions, + zIndex, + loopback // + ); + if (!result) + { + // + mConditions.Clean(); + + // + return result; + } + + // + // Vision ... + ENUM_XPOI_EVENTS visionPoiEvents[]; + ENUM_X_CYCLE_EVENTS visionCycleEvents[]; + X121SMCCycleConditions visionConditions; + result = visionCycleHelper.GetConditions( + visionCycleEvents, + visionPoiEvents, + visionConditions, + zIndex, + loopback // + ); + if (!result) + { + // + mConditions.Clean(); + + // + return result; + } + + // + // Cycles POI States ... + XPOIState decisionState = decisionConditions.state; + XPOIState analyseState = analyseConditions.state; + XPOIState consolidationState = consolidationConditions.state; + XPOIState visionState = visionConditions.state; + + // + // Cycle X121Conditions ... + X121Conditions decisionXConditions = decisionConditions.x121Conditions; + X121Conditions analyseXConditions = analyseConditions.x121Conditions; + X121Conditions consolidationXConditions = consolidationConditions.x121Conditions; + X121Conditions visionXConditions = visionConditions.x121Conditions; + + // + // Setup Conditions ... + + // + // Check Working Zone ... + bool hasWorkingZone = mConditions.HasWorkingZone(); + if (!hasWorkingZone) + { + // + hasWorkingZone = mConditions.ExtractWorkingZone( + visionState, + consolidationState, + analyseState, + zIndex // + ); + } + + // + result = hasWorkingZone; + if (!result) + { + // + Clean(visionPoiEvents); + Clean(analysePoiEvents); + Clean(decisionPoiEvents); + Clean(visionCycleEvents); + Clean(analyseCycleEvents); + Clean(decisionCycleEvents); + Clean(consolidationPoiEvents); + Clean(consolidationCycleEvents); + + // + visionState.Clean(); + analyseState.Clean(); + decisionState.Clean(); + visionConditions.Clean(); + analyseConditions.Clean(); + visionXConditions.Clean(); + consolidationState.Clean(); + decisionConditions.Clean(); + analyseXConditions.Clean(); + decisionXConditions.Clean(); + consolidationConditions.Clean(); + consolidationXConditions.Clean(); + + // + mConditions.Clean(); + + // + return result; + } + + // + mConditions.UpdateTo(cTime); + + // + // Check Working Zone still Alive ... + ENUM_X_DIRECTION destroyedDir = X_DIRECTION_NONE; + bool isWorkingZoneDestroyed = mConditions + .IsWorkingZoneDestroyed( + destroyedDir, + zIndex, + decisionState.period // + ); + if (isWorkingZoneDestroyed) + { + RemoveWorkingZoneDraws(); + } + + // + result = !isWorkingZoneDestroyed; + if (!result) + { + // + Clean(visionPoiEvents); + Clean(analysePoiEvents); + Clean(decisionPoiEvents); + Clean(visionCycleEvents); + Clean(analyseCycleEvents); + Clean(decisionCycleEvents); + Clean(consolidationPoiEvents); + Clean(consolidationCycleEvents); + + // + visionState.Clean(); + analyseState.Clean(); + decisionState.Clean(); + visionConditions.Clean(); + analyseConditions.Clean(); + visionXConditions.Clean(); + consolidationState.Clean(); + decisionConditions.Clean(); + analyseXConditions.Clean(); + decisionXConditions.Clean(); + consolidationConditions.Clean(); + consolidationXConditions.Clean(); + + // + mConditions.Clean(); + + // + return result; + } + + // + // Detecting Trend ... + ENUM_X_DIRECTION trend; + bool hasTrend = mConditions.DetectTrend( + trend, + period // + ); + bool hasBullishTrend = hasTrend && + IsBullish(trend); + bool hasBearishTrend = hasTrend && + IsBearish(trend); + result = hasTrend; + if (!result) + { + // + Clean(visionPoiEvents); + Clean(analysePoiEvents); + Clean(decisionPoiEvents); + Clean(visionCycleEvents); + Clean(analyseCycleEvents); + Clean(decisionCycleEvents); + Clean(consolidationPoiEvents); + Clean(consolidationCycleEvents); + + // + visionState.Clean(); + analyseState.Clean(); + decisionState.Clean(); + visionConditions.Clean(); + analyseConditions.Clean(); + visionXConditions.Clean(); + consolidationState.Clean(); + decisionConditions.Clean(); + analyseXConditions.Clean(); + decisionXConditions.Clean(); + consolidationConditions.Clean(); + consolidationXConditions.Clean(); + + // + mConditions.Clean(); + + // + return result; + } + + // + bool hasStartZone = mConditions.DetectStartZones( + trend, + consolidationState, + analyseState, + decisionState, + decisionCycleHelper // + ); + + // + mConditions.UpdateTo(cTime); + + // + // Detect Condition Priority ... + ENUM_X121SMC_XWZ_PRIORITY bullishPriority; + ENUM_X121SMC_XWZ_PRIORITY bearishPriority; + mConditions.DetectPriority( + bullishPriority, + bearishPriority // + ); + + // + bool canLookupLong = bullishPriority != X121SMC_XWZ_PRIORITY_NONE && + bullishPriority != X121SMC_XWZ_PRIORITY_WEAK; + bool canLookupShort = bearishPriority != X121SMC_XWZ_PRIORITY_NONE && + bearishPriority != X121SMC_XWZ_PRIORITY_WEAK; + bool isPriorityPassed = + hasBullishTrend + ? canLookupLong + : hasBearishTrend + ? canLookupShort + : false; + + // + // Here we are Make sure we have Correct: + // - WorkSpace ... + // - Trend ... + // - What we looking for: Long or Short ... + // - Priority ... + + // + double pivot = 0; + double point = 0; + ENUM_X_DIRECTION conditionsDir = X_DIRECTION_NONE; + + // + // Detect Start Zone Conditions ... + bool hasConditions = mConditions + .HasConditions( + pivot, + point, + conditionsDir, + decisionState, + zIndex, + decisionState.period // + ); + result = hasConditions; + if (!result) + { + // + Clean(visionPoiEvents); + Clean(analysePoiEvents); + Clean(decisionPoiEvents); + Clean(visionCycleEvents); + Clean(analyseCycleEvents); + Clean(decisionCycleEvents); + Clean(consolidationPoiEvents); + Clean(consolidationCycleEvents); + + // + visionState.Clean(); + analyseState.Clean(); + decisionState.Clean(); + visionConditions.Clean(); + analyseConditions.Clean(); + visionXConditions.Clean(); + consolidationState.Clean(); + decisionConditions.Clean(); + analyseXConditions.Clean(); + decisionXConditions.Clean(); + consolidationConditions.Clean(); + consolidationXConditions.Clean(); + + // + return result; + } + + // + isBullish = IsBullish(conditionsDir); + isBearish = IsBearish(conditionsDir); + + // + double reward; + double amountPercent; + ENUM_X121SMC_XWZ_PRIORITY priority = + isBullish + ? bullishPriority + : bearishPriority; + bool hasRewardAmount = CalculateRiskReward( + priority, + reward, + amountPercent // + ); + + // + // Apply Traget ... + switch (priority) + { + // + case X121SMC_XWZ_PRIORITY_STRONG_HIGH: + // + target = + isBullish + ? mConditions.workingZone.quarter3 + : mConditions.workingZone.quarter1; + break; + + // + case X121SMC_XWZ_PRIORITY_HIGH: + // + target = + isBullish + ? mConditions.workingZone.quarter3 + : mConditions.workingZone.quarter1; + break; + + // + case X121SMC_XWZ_PRIORITY_REGULAR: + // + target = + isBullish + ? mConditions.workingZone.quarter2 + : mConditions.workingZone.quarter2; + break; + + // + case X121SMC_XWZ_PRIORITY_LOW: + // + target = + isBullish + ? mConditions.workingZone.quarter1 + : mConditions.workingZone.quarter3; + break; + + // + default: + target = 0; + break; + } + + // + bool hasLastBullishConsolidationZone = false; + bool hasLastBearishConsolidationZone = false; + bool hasPrevBullishConsolidationZone = false; + bool hasPrevBearishConsolidationZone = false; + XConsolidationZone lastBullishConsolidationZone; + XConsolidationZone lastBearishConsolidationZone; + XConsolidationZone prevBullishConsolidationZone; + XConsolidationZone prevBearishConsolidationZone; + bool isLastBullishConsolidationZoneInsidePivot = false; + bool isPrevBullishConsolidationZoneInsidePivot = false; + bool isLastBearishConsolidationZoneInsidePivot = false; + bool isPrevBearishConsolidationZoneInsidePivot = false; + bool hasConsolidationZones = decisionCycleHelper.HasConsolidationZones(); + if (hasConsolidationZones) + { + // + int cZCount = 0; + XConsolidationZone tmp[]; + + // + cZCount = decisionCycleHelper + .FillConsolidationZones( + X_DIRECTION_BULLISH, + tmp // + ); + if (IsValidSize(cZCount)) + { + // + lastBullishConsolidationZone = tmp[cZCount - 1]; + if (cZCount >= 2) + { + prevBullishConsolidationZone = tmp[cZCount - 2]; + } + } + + // + Clean(tmp); + cZCount = decisionCycleHelper + .FillConsolidationZones( + X_DIRECTION_BEARISH, + tmp // + ); + if (IsValidSize(cZCount)) + { + // + lastBearishConsolidationZone = tmp[cZCount - 1]; + if (cZCount >= 2) + { + prevBearishConsolidationZone = tmp[cZCount - 2]; + } + } + + // + Clean(tmp); + + // + hasLastBullishConsolidationZone = lastBullishConsolidationZone.IsValid(); + hasLastBearishConsolidationZone = lastBearishConsolidationZone.IsValid(); + hasPrevBullishConsolidationZone = prevBullishConsolidationZone.IsValid(); + hasPrevBearishConsolidationZone = prevBearishConsolidationZone.IsValid(); + + // + isLastBullishConsolidationZoneInsidePivot = + // + hasLastBullishConsolidationZone && + (lastBullishConsolidationZone.lower < point && + lastBullishConsolidationZone.upper > pivot) + // + ; + isPrevBullishConsolidationZoneInsidePivot = + // + hasPrevBullishConsolidationZone && + (prevBullishConsolidationZone.lower < point && + prevBullishConsolidationZone.upper > pivot) + // + ; + + // + isLastBearishConsolidationZoneInsidePivot = + // + hasLastBearishConsolidationZone && + (lastBearishConsolidationZone.upper > point && + lastBearishConsolidationZone.lower < pivot) + // + ; + isPrevBearishConsolidationZoneInsidePivot = + // + hasPrevBearishConsolidationZone && + (prevBearishConsolidationZone.upper > point && + prevBearishConsolidationZone.lower < pivot) + // + ; + } + + // + bool isConsolidationZonePassed = + isBullish + // + ? (point > 0 && + pivot > 0 && + pivot < point && + hasPrevBullishConsolidationZone && + point > prevBullishConsolidationZone.upper && + (isLastBullishConsolidationZoneInsidePivot || + isPrevBullishConsolidationZoneInsidePivot)) + : (point > 0 && + pivot > 0 && + pivot > point && + hasPrevBearishConsolidationZone && + point < prevBearishConsolidationZone.lower && + (isLastBearishConsolidationZoneInsidePivot || + isPrevBearishConsolidationZoneInsidePivot)) + // + ; + + // + result = hasConditions && + hasRewardAmount && + isPriorityPassed && + trend == conditionsDir; // && + // isConsolidationZonePassed; + if (!result) + { + // + Clean(visionPoiEvents); + Clean(analysePoiEvents); + Clean(decisionPoiEvents); + Clean(visionCycleEvents); + Clean(analyseCycleEvents); + Clean(decisionCycleEvents); + Clean(consolidationPoiEvents); + Clean(consolidationCycleEvents); + + // + visionState.Clean(); + analyseState.Clean(); + decisionState.Clean(); + visionConditions.Clean(); + analyseConditions.Clean(); + visionXConditions.Clean(); + consolidationState.Clean(); + decisionConditions.Clean(); + analyseXConditions.Clean(); + decisionXConditions.Clean(); + consolidationConditions.Clean(); + consolidationXConditions.Clean(); + + // + lastBullishConsolidationZone.Clean(); + lastBearishConsolidationZone.Clean(); + prevBullishConsolidationZone.Clean(); + prevBearishConsolidationZone.Clean(); + + // + mConditions.Clean(); + + // + return result; + } + + // + mConditions.pivot = pivot; + mConditions.point = point; + mConditions.reward = reward; + mConditions.target = target; + mConditions.setupTime = cTime; + mConditions.priority = priority; + mConditions.dir = conditionsDir; + mConditions.amountPercent = amountPercent; + + // + mConditions.UpdateTo(cTime); + + // + Clean(visionPoiEvents); + Clean(analysePoiEvents); + Clean(decisionPoiEvents); + Clean(visionCycleEvents); + Clean(analyseCycleEvents); + Clean(decisionCycleEvents); + Clean(consolidationPoiEvents); + Clean(consolidationCycleEvents); + + // + visionState.Clean(); + analyseState.Clean(); + decisionState.Clean(); + visionConditions.Clean(); + analyseConditions.Clean(); + visionXConditions.Clean(); + consolidationState.Clean(); + decisionConditions.Clean(); + analyseXConditions.Clean(); + decisionXConditions.Clean(); + consolidationConditions.Clean(); + consolidationXConditions.Clean(); + + // + lastBullishConsolidationZone.Clean(); + lastBearishConsolidationZone.Clean(); + prevBullishConsolidationZone.Clean(); + prevBearishConsolidationZone.Clean(); + + // + return result; + } + + // + // Detect Trigger Conditions ... + bool DetectSignalTrigger( + // + X121SMCStrategyXWZSignalConditions &conditions, + // + string _symbol, + ENUM_TIMEFRAMES _period, + // + XC121SMCCycleHelper *decisionCycleHelper, + XC121SMCCycleHelper *analyseCycleHelper, + XC121SMCCycleHelper *consolidationCycleHelper, + XC121SMCCycleHelper *visionCycleHelper, + // + int maxAllowedSetupAge = 60 + // + ) + { + // + bool result = false; + + // + result = + // + visionCycleHelper != NULL && + analyseCycleHelper != NULL && + decisionCycleHelper != NULL && + consolidationCycleHelper != NULL + // + ; + if (!result) + { + return result; + } + + // + result = conditions.IsSetuped(); + if (!result) + { + return result; + } + + // + datetime setupTime = conditions.setupTime; + ENUM_X_DIRECTION setupDir = conditions.dir; + + // + bool isBullish = IsBullish(setupDir); + bool isBearish = IsBearish(setupDir); + + // + int zIndex = 0; + int cIndex = zIndex + 1; + int pIndex = cIndex + 1; + int ppIndex = pIndex + 1; + + // + int loopback = 10; + + // + string symbol = _symbol; + ENUM_TIMEFRAMES period = _period; + + // + XOHCL zBar; + result = decisionCycleHelper.GetBar( + zBar, + zIndex // + ); + if (!result) + { + return result; + } + + // + XOHCL cBar; + result = decisionCycleHelper.GetBar( + cBar, + cIndex // + ); + if (!result) + { + return result; + } + + // + XOHCL pBar; + result = decisionCycleHelper.GetBar( + pBar, + pIndex // + ); + if (!result) + { + return result; + } + + // + double ask = GetAsk(symbol); + double bid = GetBid(symbol); + datetime cTime = TimeCurrent(); + double points = GetPoints(symbol); + + // + int swingLoopback = 9; + double ll = cBar.FindLowest(swingLoopback, MODE_LOW); + double hh = cBar.FindHighest(swingLoopback, MODE_HIGH); + double llDown = cBar.FindLowesttDown(swingLoopback); + double hhUp = cBar.FindHighestUp(swingLoopback); + + // + // Cycles Conditions ... + + // + // Decision ... + ENUM_XPOI_EVENTS decisionPoiEvents[]; + ENUM_X_CYCLE_EVENTS decisionCycleEvents[]; + X121SMCCycleConditions decisionConditions; + result = decisionCycleHelper.GetConditions( + decisionCycleEvents, + decisionPoiEvents, + decisionConditions, + zIndex, + loopback // + ); + if (!result) + { + // + // Cleanup ... + zBar.Clean(); + cBar.Clean(); + pBar.Clean(); + + // + Clean(decisionPoiEvents); + Clean(decisionCycleEvents); + + // + decisionConditions.Clean(); + + // + return result; + } + + // + // Cycles POI States ... + XPOIState decisionState = decisionConditions.state; + + // + // Cycle X121Conditions ... + X121Conditions decisionXConditions = decisionConditions.x121Conditions; + + // + // Trigger Conditions ... + + // + double point = conditions.point; + bool isPointBreaked = IsBarBreak( + point, + setupDir, + cBar // + ); + + // + // Summary ... + + // + isBullish = + // + isBullish && + isPointBreaked && + cBar.IsBullish() + // + ; + + // + isBearish = + // + isBearish && + isPointBreaked && + cBar.IsBearish() + // + ; + + // + result = isBullish || + isBearish; + if (!result) + { + // + // Cleanup Setup Conditions ... + int setupAge = conditions.GetSetupAge(); + if (IsValidSize(setupAge) && + IsValidSize(maxAllowedSetupAge) && + setupAge >= maxAllowedSetupAge) + { + conditions.Clean(); + } + + // + // Cleanup ... + zBar.Clean(); + cBar.Clean(); + pBar.Clean(); + + // + Clean(decisionPoiEvents); + Clean(decisionCycleEvents); + + // + decisionState.Clean(); + decisionConditions.Clean(); + decisionXConditions.Clean(); + + // + return result; + } + + // + // Detect Nearest Pivot Point ... + + // + double entry = GetEntry( + conditions.symbol, + setupDir // + ); + + // + // Manipulate SL Based on Consolidation Zones ... + + // + double sls[]; + Add( + conditions.pivot, + sls // + ); + + // + // TODO: Add Consolidation Zone for SLs ... + + // + double iAtr = decisionXConditions.atrBuffer[1]; + iAtr *= 2; + + // + double slsMin = GetMin(sls); + double slsMax = GetMax(sls); + + // + double sl = isBullish + ? slsMin - iAtr + : slsMax + iAtr; + double risk = MathAbs(entry - sl); + + // + // Filling Conditions Props ... + conditions.sl = sl; + conditions.triggerTime = cTime; + conditions.type = isBullish + ? X_POSITION_TYPE_LONG + : X_POSITION_TYPE_SHORT; + + // + // Cleanup ... + zBar.Clean(); + cBar.Clean(); + pBar.Clean(); + + // + Clean(decisionPoiEvents); + Clean(decisionCycleEvents); + + // + decisionState.Clean(); + decisionConditions.Clean(); + decisionXConditions.Clean(); + + // + return result; + } + + // + // Detect Guards ... + bool DetectGuards( + // + X121SMCGuard &guards[], + const XPosition &positions[], + // + XC121SMCCycleHelper *decisionCycleHelper, + XC121SMCCycleHelper *analyseCycleHelper, + XC121SMCCycleHelper *consolidationCycleHelper, + XC121SMCCycleHelper *visionCycleHelper + // + ) + { + // + bool result = false; + + // + Clean(guards); + + // + bool isCycleHelpersValid = + // + visionCycleHelper != NULL && + analyseCycleHelper != NULL && + decisionCycleHelper != NULL && + consolidationCycleHelper != NULL + // + ; + + // + result = isCycleHelpersValid; + if (!result) + { + return result; + } + + // + int count = ArraySize(positions); + result = IsValidSize(count); + if (!result) + { + return result; + } + + // + string symbol = decisionCycleHelper.GetSymbol(); + ENUM_TIMEFRAMES period = decisionCycleHelper.GetPeriod(); + string provider = ToString(X_121_SMC_PROVIDER_XWZ); + + // + XPosition ownPositions[]; + XPosition ownLongPositions[]; + XPosition ownShortPositions[]; + for (int i = 0; i < count; i++) + { + // + XPosition iPosition = positions[i]; + bool isOwn = iPosition + .IsFiltersPassed( + symbol, + provider, + NULL, + X_POSITION_TYPE_ALL, + iPosition.magic // + ); + if (isOwn) + { + // + AddRef( + iPosition, + ownPositions // + ); + + // + bool isLong = IsLong(positions[i].type); + if (isLong) + { + // + AddRef( + iPosition, + ownLongPositions // + ); + } + else + { + // + AddRef( + iPosition, + ownShortPositions // + ); + } + } + } + + // + count = ArraySize(ownPositions); + + // + int longsCount = ArraySize(ownLongPositions); + bool hasLongs = IsValidSize(longsCount); + + // + int shortsCount = ArraySize(ownShortPositions); + bool hasShorts = IsValidSize(shortsCount); + + // + result = IsValidSize(count); + if (!result) + { + // + Clean(ownPositions); + Clean(ownLongPositions); + Clean(ownShortPositions); + + // + return result; + } + + // + // + // + + // + // Get Global and Common Guards ... + + // + ENUM_X_121_SMC_GUARD_ACTIONS ignoreGuards[1] = { + X_121_SMC_GUARD_ACTION_TRAIL_STOP // + }; + result = DetectX121SMCGuards( + provider, + guards, + positions, + decisionCycleHelper, + analyseCycleHelper, + consolidationCycleHelper, + visionCycleHelper, + // + ignoreGuards + // + ); + + // + // + // + + // + // Get Custom Implemented Guards ... + + // + // Here we Are Sure there is Positions to Guard ... + // based on Current Provider ... + + // + // Detect Required Data for Analyse Market to Guard Positions ... + + // + int zIndex = 0; + int cIndex = zIndex + 1; + int pIndex = cIndex + 1; + int ppIndex = pIndex + 1; + + // + int loopback = 10; + + // + XOHCL zBar; + result = zBar.Init( + symbol, + period, + zIndex // + ); + if (!result) + { + // + result = HasChild(guards); + return result; + } + + // + XOHCL cBar; + result = cBar.Init( + symbol, + period, + cIndex // + ); + if (!result) + { + // + zBar.Clean(); + result = HasChild(guards); + return result; + } + + // + XOHCL pBar; + result = pBar.Init( + symbol, + period, + pIndex // + ); + if (!result) + { + // + zBar.Clean(); + cBar.Clean(); + result = HasChild(guards); + return result; + } + + // + XOHCL ppBar; + result = ppBar.Init( + symbol, + period, + ppIndex // + ); + if (!result) + { + // + zBar.Clean(); + cBar.Clean(); + pBar.Clean(); + result = HasChild(guards); + return result; + } + + // + double ask = GetAsk(symbol); + double bid = GetBid(symbol); + datetime cTime = TimeCurrent(); + double points = GetPoints(symbol); + + // + + // + // Cycles Conditions ... + + // + // Decision ... + ENUM_XPOI_EVENTS decisionPoiEvents[]; + ENUM_X_CYCLE_EVENTS decisionCycleEvents[]; + X121SMCCycleConditions decisionConditions; + result = decisionCycleHelper.GetConditions( + decisionCycleEvents, + decisionPoiEvents, + decisionConditions, + zIndex, + loopback // + ); + if (!result) + { + // + zBar.Clean(); + cBar.Clean(); + pBar.Clean(); + ppBar.Clean(); + result = HasChild(guards); + return result; + } + + // + // Analyse ... + ENUM_XPOI_EVENTS analysePoiEvents[]; + ENUM_X_CYCLE_EVENTS analyseCycleEvents[]; + X121SMCCycleConditions analyseConditions; + result = analyseCycleHelper.GetConditions( + analyseCycleEvents, + analysePoiEvents, + analyseConditions, + zIndex, + loopback // + ); + if (!result) + { + // + zBar.Clean(); + cBar.Clean(); + pBar.Clean(); + ppBar.Clean(); + + // + Clean(decisionPoiEvents); + Clean(decisionCycleEvents); + + // + decisionConditions.Clean(); + + // + result = HasChild(guards); + return result; + } + + // + // Consolidation ... + ENUM_XPOI_EVENTS consolidationPoiEvents[]; + ENUM_X_CYCLE_EVENTS consolidationCycleEvents[]; + X121SMCCycleConditions consolidationConditions; + result = consolidationCycleHelper.GetConditions( + consolidationCycleEvents, + consolidationPoiEvents, + consolidationConditions, + zIndex, + loopback // + ); + if (!result) + { + // + zBar.Clean(); + cBar.Clean(); + pBar.Clean(); + ppBar.Clean(); + + // + Clean(decisionPoiEvents); + Clean(decisionCycleEvents); + + // + decisionConditions.Clean(); + + // + Clean(analysePoiEvents); + Clean(analyseCycleEvents); + + // + analyseConditions.Clean(); + + // + result = HasChild(guards); + return result; + } + + // + // Vision ... + ENUM_XPOI_EVENTS visionPoiEvents[]; + ENUM_X_CYCLE_EVENTS visionCycleEvents[]; + X121SMCCycleConditions visionConditions; + result = visionCycleHelper.GetConditions( + visionCycleEvents, + visionPoiEvents, + visionConditions, + zIndex, + loopback // + ); + if (!result) + { + // + zBar.Clean(); + cBar.Clean(); + pBar.Clean(); + ppBar.Clean(); + + // + Clean(decisionPoiEvents); + Clean(decisionCycleEvents); + + // + decisionConditions.Clean(); + + // + Clean(analysePoiEvents); + Clean(analyseCycleEvents); + + // + analyseConditions.Clean(); + + // + Clean(consolidationPoiEvents); + Clean(consolidationCycleEvents); + + // + consolidationConditions.Clean(); + + // + result = HasChild(guards); + return result; + } + + // + // Cycles POI States ... + XPOIState decisionState = decisionConditions.state; + XPOIState analyseState = analyseConditions.state; + XPOIState consolidationState = consolidationConditions.state; + XPOIState visionState = visionConditions.state; + + // + // Cycle X121Conditions ... + X121Conditions decisionXConditions = decisionConditions.x121Conditions; + X121Conditions analyseXConditions = analyseConditions.x121Conditions; + X121Conditions consolidationXConditions = consolidationConditions.x121Conditions; + X121Conditions visionXConditions = visionConditions.x121Conditions; + + // + // + // + + // + // Detect Consolidation Zone ... + + // + XBoxZone lastBullishBox; + XBoxZone prevLastBullishBox; + bool hasLastBullishBox = false; + bool hasPrevLastBullishBox = false; + XConsolidationZone lastBullishZone; + bool isLastBullishAbovePrev = false; + bool isLastBullishBelowPrev = false; + XConsolidationZone prevLastBullishZone; + + // + XBoxZone lastBearishBox; + XBoxZone prevLastBearishBox; + bool hasLastBearishBox = false; + bool hasPrevLastBearishBox = false; + XConsolidationZone lastBearishZone; + bool isLastBearishAbovePrev = false; + bool isLastBearishBelowPrev = false; + XConsolidationZone prevLastBearishZone; + + // + int bullishConsolidationZonesCount = 0; + int bearishConsolidationZonesCount = 0; + bool hasBullishConsolidationZones = false; + bool hasBearishConsolidationZones = false; + XConsolidationZone bullishConsolidationZones[]; + XConsolidationZone bearishConsolidationZones[]; + bool hasConsolidationZones = decisionCycleHelper.HasConsolidationZones(); + int consolidationZonesCount = decisionCycleHelper.CountConsolidationZones(); + if (hasConsolidationZones) + { + // + bullishConsolidationZonesCount = decisionCycleHelper + .FillConsolidationZones( + X_DIRECTION_BULLISH, + bullishConsolidationZones // + ); + hasBullishConsolidationZones = IsValidSize(bullishConsolidationZonesCount); + + // + bearishConsolidationZonesCount = decisionCycleHelper + .FillConsolidationZones( + X_DIRECTION_BEARISH, + bearishConsolidationZones // + ); + hasBearishConsolidationZones = IsValidSize(bearishConsolidationZonesCount); + + // + // + // + + // + if (hasBullishConsolidationZones && + bullishConsolidationZonesCount >= 2) + { + // + lastBullishZone = bullishConsolidationZones[bullishConsolidationZonesCount - 1]; + prevLastBullishZone = bullishConsolidationZones[bullishConsolidationZonesCount - 2]; + + // + hasLastBullishBox = ToBox( + lastBullishBox, + lastBullishZone // + ); + hasPrevLastBullishBox = ToBox( + prevLastBullishBox, + prevLastBullishZone // + ); + + // + isLastBullishAbovePrev = hasLastBullishBox && + hasPrevLastBullishBox && + IsBoxAbove( + lastBullishBox, + prevLastBullishBox // + ); + + // + isLastBullishBelowPrev = hasLastBullishBox && + hasPrevLastBullishBox && + IsBoxBelow( + lastBullishBox, + prevLastBullishBox // + ); + } + + // + if (hasBearishConsolidationZones && + bearishConsolidationZonesCount >= 2) + { + // + lastBearishZone = bearishConsolidationZones[bearishConsolidationZonesCount - 1]; + prevLastBearishZone = bearishConsolidationZones[bearishConsolidationZonesCount - 2]; + + // + hasLastBearishBox = ToBox( + lastBearishBox, + lastBearishZone // + ); + hasPrevLastBearishBox = ToBox( + prevLastBearishBox, + prevLastBearishZone // + ); + + // + isLastBearishAbovePrev = hasLastBearishBox && + hasPrevLastBearishBox && + IsBoxAbove( + lastBearishBox, + prevLastBearishBox // + ); + + // + isLastBearishBelowPrev = hasLastBearishBox && + hasPrevLastBearishBox && + IsBoxBelow( + lastBearishBox, + prevLastBearishBox // + ); + } + + // + } + + // + // Detect High Probability Swings ... + bool isSwingLow = + // + cBar.low > pBar.low && + ppBar.low > pBar.low && + // + zBar.low > pBar.low + // + ; + bool isSwingHigh = + // + cBar.high < pBar.high && + ppBar.high < pBar.high && + // + zBar.high < pBar.high + // + ; + bool isStrongSwingLow = + pBar.IsBullish() && + pBar.GetLowShadow() >= pBar.GetBody() * 2; + bool isStrongSwingHigh = + pBar.IsBearish() && + pBar.GetHighShadow() >= pBar.GetBody() * 2; + + // + bool isStrongSwingLowAboveLastBullishBox = + isStrongSwingLow && + hasLastBullishBox && + pBar.low > lastBullishBox.upper; + + // + bool isStrongSwingHighBelowLastBearishBox = + isStrongSwingHigh && + hasLastBearishBox && + pBar.high < lastBearishBox.lower; + + // + // Here We Have all Requirements for Guarding Positions ... + + // + // Available Guards: + // X_121_SMC_GUARD_ACTION_NONE + // X_121_SMC_GUARD_ACTION_CLOSE + // X_121_SMC_GUARD_ACTION_CLOSE_ALL + // X_121_SMC_GUARD_ACTION_CLOSE_LONGS + // X_121_SMC_GUARD_ACTION_CLOSE_SHORTS + // X_121_SMC_GUARD_ACTION_PARTIAL_CLOSE + // X_121_SMC_GUARD_ACTION_TRAIL_STOP + // X_121_SMC_GUARD_ACTION_TRAIL_TARGET + // X_121_SMC_GUARD_ACTION_HEDGE + + // + // X_121_SMC_GUARD_ACTION_CLOSE: + // Close Specified Position on Specified Conditions ... + + // + // X_121_SMC_GUARD_ACTION_CLOSE_ALL: + // Close All Positions on Specified Conditions ... + + // + // X_121_SMC_GUARD_ACTION_CLOSE_LONGS: + // Close All Long Positions on Specified Conditions ... + + // + // X_121_SMC_GUARD_ACTION_CLOSE_SHORTS: + // Close All Short Positions on Specified Conditions ... + + // + // X_121_SMC_GUARD_ACTION_PARTIAL_CLOSE: + // Partial Close Specified Position on Specified Conditions ... + + // + // X_121_SMC_GUARD_ACTION_TRAIL_STOP: + // Trail Stop Specified Position on Specified Conditions ... + + // + // X_121_SMC_GUARD_ACTION_TRAIL_TARGET: + // Trail Target Specified Position on Specified Conditions ... + + // + // X_121_SMC_GUARD_ACTION_HEDGE: + // Hedge all Positions on Specified Conditions ... + + // + // Cleanup Collections ... + + // + Clean(ownPositions); + Clean(ownLongPositions); + Clean(ownShortPositions); + + // + zBar.Clean(); + cBar.Clean(); + pBar.Clean(); + ppBar.Clean(); + + // + Clean(visionPoiEvents); + Clean(analysePoiEvents); + Clean(visionCycleEvents); + Clean(decisionPoiEvents); + Clean(analyseCycleEvents); + Clean(decisionCycleEvents); + Clean(consolidationPoiEvents); + Clean(consolidationCycleEvents); + + // + visionState.Clean(); + analyseState.Clean(); + decisionState.Clean(); + visionConditions.Clean(); + analyseConditions.Clean(); + visionXConditions.Clean(); + decisionConditions.Clean(); + consolidationState.Clean(); + analyseXConditions.Clean(); + decisionXConditions.Clean(); + consolidationConditions.Clean(); + consolidationXConditions.Clean(); + + // + lastBullishBox.Clean(); + lastBearishBox.Clean(); + lastBullishZone.Clean(); + lastBearishZone.Clean(); + prevLastBullishBox.Clean(); + prevLastBearishBox.Clean(); + prevLastBullishZone.Clean(); + prevLastBearishZone.Clean(); + + // + count = ArraySize(guards); + result = IsValidSize(count); + + // + return result; + } + + // + // + // + + // + // Add Conditions to Conditions Collection ... + int AddConditionsIfNotExists( + int maxAllowed = 10 // + ) + { + // + int result = 0; + + // + bool isSetuped = IsValid(mConditions.setupTime) && + HasDirection(mConditions.dir); + if (!isSetuped) + { + return result; + } + + // + int count = ArraySize(mConditionsCollection); + if (IsValidSize(count)) + { + // + // Copy Original Items ... + X121SMCStrategyXWZSignalConditions tmpItems[]; + Copy( + mConditionsCollection, + tmpItems // + ); + + // + // Prese Item Data ... + bool isBullish = IsBullish(mConditions.dir); + + // + for (int i = 0; i < count; i++) + { + // + X121SMCStrategyXWZSignalConditions iItem = tmpItems[i]; + + // + bool canRemove = mConditions.dir == iItem.dir && + mConditions.pivot == iItem.pivot; + if (canRemove) + { + // + ArrayRemove( + mConditionsCollection, + i, + 1 // + ); + } + } + + // + Clean(tmpItems); + } + + // + AddRef( + mConditions, + mConditionsCollection // + ); + + // + // Remove Olds ... + CleanupArray( + mConditionsCollection, + maxAllowed // + ); + + // + result = ArraySize(mConditionsCollection); + + // + return result; + } + + // + // Draw Functions ... + // + + // + void RemoveDraws() + { + mObjects.Clear(); + } + + // + void RemoveWorkingZoneDraws() + { + mWorkingZoneObjects.Clear(); + } + + // + void DrawOrderBlock( + XCOrderBlock *ob, + XCPOIDrawer *drawer, + bool forWorkingZone = false // + ) + { + // + if (ob == NULL || + drawer == NULL) + { + return; + } + + // + ENUM_X_DIRECTION forDir = ob.GetDirection(); + + // + color bullishColor = drawer.BarBullishColor(); + color bearishColor = drawer.BarBearishColor(); + color forColor = IsBullish(forDir) + ? bullishColor + : bearishColor; + + // + // Draw Order Block ... + XCBaseObject *obj; + bool isCreated = drawer.CreateOrderBlock( + ob, + obj // + ); + if (isCreated) + { + // + if (forWorkingZone) + { + mWorkingZoneObjects.Add(obj); + } + else + { + mObjects.Add(obj); + } + } + + // + ulong chartID = drawer.ChartIdentification(); + int subWindow = drawer.SubWindowIdentification(); + + // + XOHCL startedBar; + ENUM_X_DIRECTION startedDir; + bool isStarted = ob.IsStarted( + forDir, + startedBar, + startedDir // + ); + if (isStarted) + { + // + datetime to = startedBar.time + (PeriodSeconds(startedBar.period)); + + // + XCOHCLObject *obj; + bool isCreated = drawer.CreateBar( + startedBar, + obj, + to // + ); + if (isCreated) + { + // + obj.BodyColor(clrYellow); + obj.HighShadowColor(clrYellow); + obj.LowShadowColor(clrYellow); + + // + obj.BodyStyle(STYLE_SOLID); + obj.HighShadowStyle(STYLE_SOLID); + obj.LowShadowStyle(STYLE_SOLID); + + // + if (forWorkingZone) + { + mWorkingZoneObjects.Add(obj); + } + else + { + mObjects.Add(obj); + } + } + + // + string startVLineName = "Start_" + ob.GetTag(); + + // + CChartObjectVLine *startVLine; + startVLine = new CChartObjectVLine(); + isCreated = startVLine.Create( + chartID, + startVLineName, + subWindow, + startedBar.time // + ); + if (isCreated) + { + // + startVLine.Color(forColor); + + // + if (forWorkingZone) + { + mWorkingZoneObjects.Add(startVLine); + } + else + { + mObjects.Add(startVLine); + } + } + } + } + + // + void DrawFairValueGap( + XCFVG *fvg, + XCPOIDrawer *drawer, + bool forWorkingZone = false // + ) + { + // + if (fvg == NULL || + drawer == NULL) + { + return; + } + + // + ENUM_X_DIRECTION forDir = fvg.GetDirection(); + + // + color bullishColor = drawer.BarBullishColor(); + color bearishColor = drawer.BarBearishColor(); + color forColor = IsBullish(forDir) + ? bullishColor + : bearishColor; + + // + // Draw Order Block ... + XCBaseObject *obj; + bool isCreated = drawer.CreateFairValueGap( + fvg, + obj // + ); + if (isCreated) + { + // + if (forWorkingZone) + { + mWorkingZoneObjects.Add(obj); + } + else + { + mObjects.Add(obj); + } + } + + // + ulong chartID = drawer.ChartIdentification(); + int subWindow = drawer.SubWindowIdentification(); + + // + XOHCL startedBar; + ENUM_X_DIRECTION startedDir; + bool isStarted = fvg.IsStarted( + forDir, + startedBar, + startedDir // + ); + if (isStarted) + { + // + datetime to = startedBar.time + (PeriodSeconds(startedBar.period)); + + // + XCOHCLObject *obj; + bool isCreated = drawer.CreateBar( + startedBar, + obj, + to // + ); + if (isCreated) + { + // + obj.BodyColor(clrYellow); + obj.HighShadowColor(clrYellow); + obj.LowShadowColor(clrYellow); + + // + obj.BodyStyle(STYLE_SOLID); + obj.HighShadowStyle(STYLE_SOLID); + obj.LowShadowStyle(STYLE_SOLID); + + // + if (forWorkingZone) + { + mWorkingZoneObjects.Add(obj); + } + else + { + mObjects.Add(obj); + } + } + + // + string startVLineName = "Start_" + fvg.GetTag(); + + // + CChartObjectVLine *startVLine; + startVLine = new CChartObjectVLine(); + isCreated = startVLine.Create( + chartID, + startVLineName, + subWindow, + startedBar.time // + ); + if (isCreated) + { + // + startVLine.Color(forColor); + + // + if (forWorkingZone) + { + mWorkingZoneObjects.Add(startVLine); + } + else + { + mObjects.Add(startVLine); + } + } + } + } + + // + void DrawWorkingZone( + X121SMCStrategyXWZSignalConditions &conditions, + XCPOIDrawer *drawer // + ) + { + // + if (drawer == NULL) + { + return; + } + + // + bool hasWorkingZone = conditions.HasWorkingZone(); + if (!hasWorkingZone) + { + return; + } + + // + string prefix = "WKZ_" + conditions.workingZone.symbol + ToString(conditions.workingZone.period) + "_"; + string tag = prefix + ToString(conditions.workingZone.upper) + "_" + ToString(conditions.workingZone.lower); + string suffix = ToMD5(tag); + + // + string upperName = prefix + "_Upper_" + suffix; + string lowerName = prefix + "_Lower_" + suffix; + string zoneUpperName = prefix + "_ZoneUpper_" + suffix; + string zoneLowerName = prefix + "_ZoneLower_" + suffix; + + // + string q1Name = prefix + "_Q1_" + suffix; + string q2Name = prefix + "_Q2_" + suffix; + string q3Name = prefix + "_Q3_" + suffix; + + // + ulong chartID = drawer.ChartIdentification(); + int subWindow = drawer.SubWindowIdentification(); + + // + bool isCreated = false; + + // + // Check For Trend Approced ... + bool isTrendApproved = conditions.HasOrderBlock() && + conditions.HasFairValueGap(); + if (isTrendApproved) + { + // + DrawOrderBlock( + conditions.orderBlock, + drawer, + true // + ); + + // + DrawFairValueGap( + conditions.fairValueGap, + drawer, + true // + ); + } + + // + XCSupplyZoneObject *iSupObj; + isCreated = drawer.CreateSupplyZone( + conditions.supplyZone, + iSupObj // + ); + if (isCreated) + { + mWorkingZoneObjects.Add(iSupObj); + } + + // + XCDemandZoneObject *iDemObj; + isCreated = drawer.CreateDemandZone( + conditions.demandZone, + iDemObj // + ); + if (isCreated) + { + mWorkingZoneObjects.Add(iDemObj); + } + + // + // Lower ... + CChartObjectTrend *lowerHLine; + lowerHLine = new CChartObjectTrend(); + isCreated = lowerHLine.Create( + chartID, + lowerName, + subWindow, + conditions.workingZone.from, + conditions.workingZone.lower, + conditions.workingZone.to, + conditions.workingZone.lower // + ); + if (isCreated) + { + // + lowerHLine.Color(clrLime); + mWorkingZoneObjects.Add(lowerHLine); + } + + // + CChartObjectTrend *upperHLine; + upperHLine = new CChartObjectTrend(); + isCreated = upperHLine.Create( + chartID, + upperName, + subWindow, + conditions.workingZone.from, + conditions.workingZone.upper, + conditions.workingZone.to, + conditions.workingZone.upper // + ); + if (isCreated) + { + // + upperHLine.Color(clrLime); + mWorkingZoneObjects.Add(upperHLine); + } + + // + CChartObjectTrend *zoneLowerHLine; + zoneLowerHLine = new CChartObjectTrend(); + isCreated = zoneLowerHLine.Create( + chartID, + zoneLowerName, + subWindow, + conditions.workingZone.from, + conditions.workingZone.zoneLower, + conditions.workingZone.to, + conditions.workingZone.zoneLower // + ); + if (isCreated) + { + // + zoneLowerHLine.Color(clrRed); + mWorkingZoneObjects.Add(zoneLowerHLine); + } + + // + CChartObjectTrend *zoneUpperHLine; + zoneUpperHLine = new CChartObjectTrend(); + isCreated = zoneUpperHLine.Create( + chartID, + zoneUpperName, + subWindow, + conditions.workingZone.from, + conditions.workingZone.zoneUpper, + conditions.workingZone.to, + conditions.workingZone.zoneUpper // + ); + if (isCreated) + { + // + zoneUpperHLine.Color(clrRed); + mWorkingZoneObjects.Add(zoneUpperHLine); + } + + // + CChartObjectTrend *quarter1HLine; + quarter1HLine = new CChartObjectTrend(); + isCreated = quarter1HLine.Create( + chartID, + q1Name, + subWindow, + conditions.workingZone.from, + conditions.workingZone.quarter1, + conditions.workingZone.to, + conditions.workingZone.quarter1 // + ); + if (isCreated) + { + // + quarter1HLine.Color(clrYellow); + mWorkingZoneObjects.Add(quarter1HLine); + } + + // + CChartObjectTrend *quarter2HLine; + quarter2HLine = new CChartObjectTrend(); + isCreated = quarter2HLine.Create( + chartID, + q2Name, + subWindow, + conditions.workingZone.from, + conditions.workingZone.quarter2, + conditions.workingZone.to, + conditions.workingZone.quarter2 // + ); + if (isCreated) + { + // + quarter2HLine.Color(clrYellow); + mWorkingZoneObjects.Add(quarter2HLine); + } + + // + CChartObjectTrend *quarter3HLine; + quarter3HLine = new CChartObjectTrend(); + isCreated = quarter3HLine.Create( + chartID, + q3Name, + subWindow, + conditions.workingZone.from, + conditions.workingZone.quarter3, + conditions.workingZone.to, + conditions.workingZone.quarter3 // + ); + if (isCreated) + { + // + quarter3HLine.Color(clrYellow); + mWorkingZoneObjects.Add(quarter3HLine); + } + + // + } + + // + void DrawConditions( + X121SMCStrategyXWZSignalConditions &conditions, + XCPOIDrawer *drawer, + bool forceClean = false // + ) + { + // + if (drawer == NULL) + { + return; + } + + // + if (forceClean) + { + mObjects.Clear(); + } + + // + bool isCreated = false; + + // + ulong chartID = drawer.ChartIdentification(); + int subWindow = drawer.SubWindowIdentification(); + color bullishColor = drawer.BarBullishColor(); + color bearishColor = drawer.BarBearishColor(); + + // + // Start Zones ... + bool hasStartZones = conditions.HasStartZones(); + if (hasStartZones) + { + // + int count = conditions.CountStartZones(); + for (int i = 0; i < count; i++) + { + // + bool isBullish = conditions.startZones[i].IsBullish(); + + // + bool hasOB = conditions.startZones[i].HasOB(); + if (hasOB) + { + // // + // XCBaseObject *iObj; + // isCreated = drawer.CreateOrderBlock( + // conditions.startZones[i].ob, + // iObj // + // ); + + // // + // if (isCreated) + // { + // mObjects.Add(iObj); + // } + + // + DrawOrderBlock( + conditions.startZones[i].ob, + drawer // + ); + } + + // + bool hasFVG = conditions.startZones[i].HasFVG(); + if (hasFVG) + { + // // + // XCBaseObject *iObj; + // isCreated = drawer.CreateFairValueGap( + // conditions.startZones[i].fvg, + // iObj // + // ); + + // // + // if (isCreated) + // { + // mObjects.Add(iObj); + // } + + // + DrawFairValueGap( + conditions.startZones[i].fvg, + drawer // + ); + } + + // // + // bool hasSupply = conditions.startZones[i].HasSupply(); + // if (hasSupply) + // { + // // + // XCSupplyZoneObject *iObj; + // isCreated = drawer.CreateSupplyZone( + // conditions.startZones[i].supply, + // iObj // + // ); + + // // + // if (isCreated) + // { + // mObjects.Add(iObj); + // } + // } + + // // + // bool hasDemand = conditions.startZones[i].HasDemand(); + // if (hasDemand) + // { + // // + // XCDemandZoneObject *iObj; + // isCreated = drawer.CreateDemandZone( + // conditions.startZones[i].demand, + // iObj // + // ); + + // // + // if (isCreated) + // { + // mObjects.Add(iObj); + // } + // } + + // // + // bool hasSupport = conditions.startZones[i].HasSupport(); + // if (hasSupport) + // { + // // + // XCSupportZoneObject *iObj; + // isCreated = drawer.CreateSupportZone( + // conditions.startZones[i].support, + // iObj // + // ); + + // // + // if (isCreated) + // { + // mObjects.Add(iObj); + // } + // } + + // // + // bool hasResistance = conditions.startZones[i].HasResistance(); + // if (hasResistance) + // { + // // + // XCResistanceZoneObject *iObj; + // isCreated = drawer.CreateResistanceZone( + // conditions.startZones[i].resistance, + // iObj // + // ); + + // // + // if (isCreated) + // { + // mObjects.Add(iObj); + // } + // } + + // + // + // + + // + string bName = ""; + int arrowCode = 0; + string bSuffix = ""; + color arrowColor = clrNONE; + ENUM_X_PRICE bPrice = X_PRICE_CLOSE; + + // + bool hasSwingBar = conditions.startZones[i].swingBar.IsValid(); + if (hasSwingBar) + { + // + bSuffix = ToMD5(conditions.startZones[i].swingBar.GetTag()); + bName = + (isBullish + ? "SWING_LOW" + : "SWING_HIGH") + + "_" + bSuffix; + arrowCode = 159; + arrowColor = + isBullish + ? bullishColor + : bearishColor; + bPrice = + isBullish + ? X_PRICE_LOW + : X_PRICE_HIGH; + + // + XCBarArrowObject *iObj; + iObj = new XCBarArrowObject(); + isCreated = iObj.CreateByBar( + chartID, + bName, + subWindow, + arrowCode, + conditions.startZones[i].swingBar, + bPrice // + ); + if (isCreated) + { + // + iObj.ArrowColor(arrowColor); + + // + mObjects.Add(iObj); + } + } + + // + bool hasBreakerBar = conditions.startZones[i].breakerBar.IsValid(); + if (hasBreakerBar) + { + // + bSuffix = ToMD5(conditions.startZones[i].breakerBar.GetTag()); + bName = + (isBullish + ? "BULL_BREAKER" + : "BEAR_BREAKER") + + "_" + bSuffix; + arrowCode = + isBullish + ? 71 + : 72; + arrowColor = + isBullish + ? bullishColor + : bearishColor; + bPrice = + isBullish + ? X_PRICE_LOW + : X_PRICE_HIGH; + + // + XCBarArrowObject *iObj; + iObj = new XCBarArrowObject(); + isCreated = iObj.CreateByBar( + chartID, + bName, + subWindow, + arrowCode, + conditions.startZones[i].breakerBar, + bPrice // + ); + if (isCreated) + { + // + iObj.ArrowColor(arrowColor); + + // + mObjects.Add(iObj); + } + } + + // + bool hasMomentumBar = conditions.startZones[i].momentumBar.IsValid(); + if (hasMomentumBar) + { + // + bSuffix = ToMD5(conditions.startZones[i].momentumBar.GetTag()); + bName = + (isBullish + ? "BULL_MOMENTUM" + : "BEAR_MOMENTUM") + + "_" + bSuffix; + arrowCode = + isBullish + ? 233 + : 234; + arrowColor = + isBullish + ? bullishColor + : bearishColor; + bPrice = + isBullish + ? X_PRICE_LOW + : X_PRICE_HIGH; + + // + XCBarArrowObject *iObj; + iObj = new XCBarArrowObject(); + isCreated = iObj.CreateByBar( + chartID, + bName, + subWindow, + arrowCode, + conditions.startZones[i].momentumBar, + bPrice // + ); + if (isCreated) + { + // + iObj.ArrowColor(arrowColor); + + // + mObjects.Add(iObj); + } + } + + // + bool hasRejectionBar = conditions.startZones[i].rejectionBar.IsValid(); + if (hasRejectionBar) + { + // + bSuffix = ToMD5(conditions.startZones[i].rejectionBar.GetTag()); + bName = + (isBullish + ? "BULL_REJECTION" + : "BEAR_REJECTION") + + "_" + bSuffix; + arrowCode = + isBullish + ? 241 + : 242; + arrowColor = + isBullish + ? bullishColor + : bearishColor; + bPrice = + isBullish + ? X_PRICE_LOW + : X_PRICE_HIGH; + + // + XCBarArrowObject *iObj; + iObj = new XCBarArrowObject(); + isCreated = iObj.CreateByBar( + chartID, + bName, + subWindow, + arrowCode, + conditions.startZones[i].rejectionBar, + bPrice // + ); + if (isCreated) + { + // + iObj.ArrowColor(arrowColor); + + // + mObjects.Add(iObj); + } + } + + // + bool hasAppliedBox = conditions.startZones[i].appliedBox.IsValid(); + if (hasAppliedBox) + { + // + arrowColor = + IsBullish(conditions.startZones[i].appliedBox.dir) + ? bullishColor + : bearishColor; + + // + XCBoxObject *iObj; + isCreated = drawer.CreateBox( + conditions.startZones[i].appliedBox, + iObj // + ); + + // + if (isCreated) + { + // + iObj.BoxWidth(2); + iObj.BoxColor(arrowColor); + + // + mObjects.Add(iObj); + } + } + } + } + } + + // + protected: + // + + // + private: + // + // Props ... + CArrayObj mObjects; + CArrayObj mWorkingZoneObjects; + + /** + * Initialize ... + */ + void Init() + { + } + + /** + * DeInitialize ... + */ + void DeInit() + { + // + RemoveDraws(); + mConditions.Clean(); + RemoveWorkingZoneDraws(); + Clean(mConditionsCollection); + } + + // + // Helpers ... + + // + bool CalculateRiskReward( + ENUM_X121SMC_XWZ_PRIORITY priority, + double &reward, + double &amountPercent // + ) + { + // + bool result = false; + + // + reward = 0; + amountPercent = 0; + + // + result = priority != X121SMC_XWZ_PRIORITY_NONE; + if (!result) + { + return result; + } + + // + switch (priority) + { + // + case X121SMC_XWZ_PRIORITY_STRONG_HIGH: + // + reward = 6; + amountPercent = 2; + break; + + // + case X121SMC_XWZ_PRIORITY_HIGH: + // + reward = 4; + amountPercent = 2; + break; + + // + case X121SMC_XWZ_PRIORITY_REGULAR: + // + reward = 3; + amountPercent = 1.5; + break; + + // + case X121SMC_XWZ_PRIORITY_LOW: + // + reward = 2; + amountPercent = 1; + break; + + // + case X121SMC_XWZ_PRIORITY_WEAK: + // + reward = 1; + amountPercent = 0.5; + break; + } + + // + result = + // + reward > 0 && + amountPercent > 0 + // + ; + + // + return result; + } + + // +}; + +// \ No newline at end of file diff --git a/BKPS/14031206/Documents/BKP/x-121.smc.xwz.signal.class copy.mq5 b/BKPS/14031206/Documents/BKP/x-121.smc.xwz.signal.class copy.mq5 new file mode 100644 index 0000000..485360b --- /dev/null +++ b/BKPS/14031206/Documents/BKP/x-121.smc.xwz.signal.class copy.mq5 @@ -0,0 +1,2725 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 X121 SMC Signal Class +// ------------------------------------------------- +// Name: XWZ +// Description: provide all Signalling 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 + +// +// Imports ... +#include "../Classes/x-121.smc.market.cycle.helper.class.mq5" +#include "../Libraries/x-121.smc.guard.lib.mq5" +#include "../Libraries/x-121.smc.lib.mq5" +#include "./x-121.smc.xwz.signal.lib.mq5" + +// +// Definition ... +class XCX121SMCXWZSignalDetector : public XCBase +{ + // + public: + // + // Props ... + X121SMCStrategyXWZSignalConditions mConditions; + X121SMCStrategyXWZSignalConditions mConditionsCollection[]; + + // + // Constructor(s) ... + XCX121SMCXWZSignalDetector() + { + Init(); + } + + // + // Deconstructor ... + ~XCX121SMCXWZSignalDetector() + { + DeInit(); + } + + // + // + // + + // + // Detect Setup Conditions ... + bool DetectSignalSetup( + // + string _symbol, + ENUM_TIMEFRAMES _period, + // + XC121SMCCycleHelper *decisionCycleHelper, + XC121SMCCycleHelper *analyseCycleHelper, + XC121SMCCycleHelper *consolidationCycleHelper, + XC121SMCCycleHelper *visionCycleHelper + // + ) + { + // + bool result = false; + + // + // Validate Cycle Helpers ... + result = + // + visionCycleHelper != NULL && + analyseCycleHelper != NULL && + decisionCycleHelper != NULL && + consolidationCycleHelper != NULL + // + ; + if (!result) + { + // + mConditions.Clean(); + + // + return result; + } + + // + bool isBullish = false; + bool isBearish = false; + + // + int zIndex = 0; + int cIndex = zIndex + 1; + int pIndex = cIndex + 1; + int ppIndex = pIndex + 1; + + // + int loopback = 10; + + // + string symbol = _symbol; + ENUM_TIMEFRAMES period = _period; + + // + mConditions.symbol = symbol; + mConditions.period = period; + + // + double ask = GetAsk(symbol); + double bid = GetBid(symbol); + datetime cTime = TimeCurrent(); + double points = GetPoints(symbol); + + // + double target = 0; + + // + // Cycles Conditions ... + + // + // Decision ... + ENUM_XPOI_EVENTS decisionPoiEvents[]; + ENUM_X_CYCLE_EVENTS decisionCycleEvents[]; + X121SMCCycleConditions decisionConditions; + result = decisionCycleHelper.GetConditions( + decisionCycleEvents, + decisionPoiEvents, + decisionConditions, + zIndex, + loopback // + ); + if (!result) + { + // + mConditions.Clean(); + + // + return result; + } + + // + // Analyse ... + ENUM_XPOI_EVENTS analysePoiEvents[]; + ENUM_X_CYCLE_EVENTS analyseCycleEvents[]; + X121SMCCycleConditions analyseConditions; + result = analyseCycleHelper.GetConditions( + analyseCycleEvents, + analysePoiEvents, + analyseConditions, + zIndex, + loopback // + ); + if (!result) + { + // + mConditions.Clean(); + + // + return result; + } + + // + // Consolidation ... + ENUM_XPOI_EVENTS consolidationPoiEvents[]; + ENUM_X_CYCLE_EVENTS consolidationCycleEvents[]; + X121SMCCycleConditions consolidationConditions; + result = consolidationCycleHelper.GetConditions( + consolidationCycleEvents, + consolidationPoiEvents, + consolidationConditions, + zIndex, + loopback // + ); + if (!result) + { + // + mConditions.Clean(); + + // + return result; + } + + // + // Vision ... + ENUM_XPOI_EVENTS visionPoiEvents[]; + ENUM_X_CYCLE_EVENTS visionCycleEvents[]; + X121SMCCycleConditions visionConditions; + result = visionCycleHelper.GetConditions( + visionCycleEvents, + visionPoiEvents, + visionConditions, + zIndex, + loopback // + ); + if (!result) + { + // + mConditions.Clean(); + + // + return result; + } + + // + // Cycles POI States ... + XPOIState decisionState = decisionConditions.state; + XPOIState analyseState = analyseConditions.state; + XPOIState consolidationState = consolidationConditions.state; + XPOIState visionState = visionConditions.state; + + // + // Cycle X121Conditions ... + X121Conditions decisionXConditions = decisionConditions.x121Conditions; + X121Conditions analyseXConditions = analyseConditions.x121Conditions; + X121Conditions consolidationXConditions = consolidationConditions.x121Conditions; + X121Conditions visionXConditions = visionConditions.x121Conditions; + + // + // Setup Conditions ... + + // + // Check Working Zone ... + bool hasWorkingZone = mConditions.HasWorkingZone(); + if (!hasWorkingZone) + { + // + hasWorkingZone = mConditions.ExtractWorkingZone( + visionState, + consolidationState, + analyseState, + zIndex // + ); + } + + // + result = hasWorkingZone; + if (!result) + { + // + Clean(visionPoiEvents); + Clean(analysePoiEvents); + Clean(decisionPoiEvents); + Clean(visionCycleEvents); + Clean(analyseCycleEvents); + Clean(decisionCycleEvents); + Clean(consolidationPoiEvents); + Clean(consolidationCycleEvents); + + // + visionState.Clean(); + analyseState.Clean(); + decisionState.Clean(); + visionConditions.Clean(); + analyseConditions.Clean(); + visionXConditions.Clean(); + consolidationState.Clean(); + decisionConditions.Clean(); + analyseXConditions.Clean(); + decisionXConditions.Clean(); + consolidationConditions.Clean(); + consolidationXConditions.Clean(); + + // + mConditions.Clean(); + + // + return result; + } + + // + mConditions.UpdateTo(cTime); + + // + // Check Working Zone still Alive ... + ENUM_X_DIRECTION destroyedDir = X_DIRECTION_NONE; + bool isWorkingZoneDestroyed = mConditions + .IsWorkingZoneDestroyed( + destroyedDir, + zIndex, + decisionState.period // + ); + if (isWorkingZoneDestroyed) + { + RemoveWorkingZoneDraws(); + } + + // + result = !isWorkingZoneDestroyed; + if (!result) + { + // + Clean(visionPoiEvents); + Clean(analysePoiEvents); + Clean(decisionPoiEvents); + Clean(visionCycleEvents); + Clean(analyseCycleEvents); + Clean(decisionCycleEvents); + Clean(consolidationPoiEvents); + Clean(consolidationCycleEvents); + + // + visionState.Clean(); + analyseState.Clean(); + decisionState.Clean(); + visionConditions.Clean(); + analyseConditions.Clean(); + visionXConditions.Clean(); + consolidationState.Clean(); + decisionConditions.Clean(); + analyseXConditions.Clean(); + decisionXConditions.Clean(); + consolidationConditions.Clean(); + consolidationXConditions.Clean(); + + // + mConditions.Clean(); + + // + return result; + } + + // + // Detecting Trend ... + ENUM_X_DIRECTION trend; + bool hasTrend = mConditions.DetectTrend( + trend, + period // + ); + bool hasBullishTrend = hasTrend && + IsBullish(trend); + bool hasBearishTrend = hasTrend && + IsBearish(trend); + result = hasTrend; + if (!result) + { + // + Clean(visionPoiEvents); + Clean(analysePoiEvents); + Clean(decisionPoiEvents); + Clean(visionCycleEvents); + Clean(analyseCycleEvents); + Clean(decisionCycleEvents); + Clean(consolidationPoiEvents); + Clean(consolidationCycleEvents); + + // + visionState.Clean(); + analyseState.Clean(); + decisionState.Clean(); + visionConditions.Clean(); + analyseConditions.Clean(); + visionXConditions.Clean(); + consolidationState.Clean(); + decisionConditions.Clean(); + analyseXConditions.Clean(); + decisionXConditions.Clean(); + consolidationConditions.Clean(); + consolidationXConditions.Clean(); + + // + mConditions.Clean(); + + // + return result; + } + + // + bool hasStartZone = mConditions.DetectStartZones( + trend, + analyseState, + analyseState, + decisionState, + decisionCycleHelper // + ); + + // + mConditions.UpdateTo(cTime); + + // + // Detect Condition Priority ... + ENUM_X121SMC_XWZ_PRIORITY bullishPriority; + ENUM_X121SMC_XWZ_PRIORITY bearishPriority; + mConditions.DetectPriority( + bullishPriority, + bearishPriority // + ); + + // + bool canLookupLong = bullishPriority != X121SMC_XWZ_PRIORITY_NONE && + bullishPriority != X121SMC_XWZ_PRIORITY_WEAK; + bool canLookupShort = bearishPriority != X121SMC_XWZ_PRIORITY_NONE && + bearishPriority != X121SMC_XWZ_PRIORITY_WEAK; + bool isPriorityPassed = + hasBullishTrend + ? canLookupLong + : hasBearishTrend + ? canLookupShort + : false; + + // + // Here we are Make sure we have Correct: + // - WorkSpace ... + // - Trend ... + // - What we looking for: Long or Short ... + // - Priority ... + + // + double pivot = 0; + double point = 0; + ENUM_X_DIRECTION conditionsDir = X_DIRECTION_NONE; + + // + // Detect Start Zone Conditions ... + bool hasConditions = mConditions + .HasConditions( + pivot, + point, + conditionsDir, + decisionState, + zIndex, + decisionState.period // + ); + result = hasConditions; + if (!result) + { + // + Clean(visionPoiEvents); + Clean(analysePoiEvents); + Clean(decisionPoiEvents); + Clean(visionCycleEvents); + Clean(analyseCycleEvents); + Clean(decisionCycleEvents); + Clean(consolidationPoiEvents); + Clean(consolidationCycleEvents); + + // + visionState.Clean(); + analyseState.Clean(); + decisionState.Clean(); + visionConditions.Clean(); + analyseConditions.Clean(); + visionXConditions.Clean(); + consolidationState.Clean(); + decisionConditions.Clean(); + analyseXConditions.Clean(); + decisionXConditions.Clean(); + consolidationConditions.Clean(); + consolidationXConditions.Clean(); + + // + return result; + } + + // + isBullish = IsBullish(conditionsDir); + isBearish = IsBearish(conditionsDir); + + // + double reward; + double amountPercent; + ENUM_X121SMC_XWZ_PRIORITY priority = + isBullish + ? bullishPriority + : bearishPriority; + bool hasRewardAmount = CalculateRiskReward( + priority, + reward, + amountPercent // + ); + + // + // Apply Traget ... + switch (priority) + { + // + case X121SMC_XWZ_PRIORITY_STRONG_HIGH: + // + target = + isBullish + ? mConditions.workingZone.quarter3 + : mConditions.workingZone.quarter1; + break; + + // + case X121SMC_XWZ_PRIORITY_HIGH: + // + target = + isBullish + ? mConditions.workingZone.quarter3 + : mConditions.workingZone.quarter1; + break; + + // + case X121SMC_XWZ_PRIORITY_REGULAR: + // + target = + isBullish + ? mConditions.workingZone.quarter2 + : mConditions.workingZone.quarter2; + break; + + // + case X121SMC_XWZ_PRIORITY_LOW: + // + target = + isBullish + ? mConditions.workingZone.quarter1 + : mConditions.workingZone.quarter3; + break; + + // + default: + target = 0; + break; + } + + // + bool hasLastBullishConsolidationZone = false; + bool hasLastBearishConsolidationZone = false; + bool hasPrevBullishConsolidationZone = false; + bool hasPrevBearishConsolidationZone = false; + XConsolidationZone lastBullishConsolidationZone; + XConsolidationZone lastBearishConsolidationZone; + XConsolidationZone prevBullishConsolidationZone; + XConsolidationZone prevBearishConsolidationZone; + bool isLastBullishConsolidationZoneInsidePivot = false; + bool isPrevBullishConsolidationZoneInsidePivot = false; + bool isLastBearishConsolidationZoneInsidePivot = false; + bool isPrevBearishConsolidationZoneInsidePivot = false; + bool hasConsolidationZones = decisionCycleHelper.HasConsolidationZones(); + if (hasConsolidationZones) + { + // + int cZCount = 0; + XConsolidationZone tmp[]; + + // + cZCount = decisionCycleHelper + .FillConsolidationZones( + X_DIRECTION_BULLISH, + tmp // + ); + if (IsValidSize(cZCount)) + { + // + lastBullishConsolidationZone = tmp[cZCount - 1]; + if (cZCount >= 2) + { + prevBullishConsolidationZone = tmp[cZCount - 2]; + } + } + + // + Clean(tmp); + cZCount = decisionCycleHelper + .FillConsolidationZones( + X_DIRECTION_BEARISH, + tmp // + ); + if (IsValidSize(cZCount)) + { + // + lastBearishConsolidationZone = tmp[cZCount - 1]; + if (cZCount >= 2) + { + prevBearishConsolidationZone = tmp[cZCount - 2]; + } + } + + // + Clean(tmp); + + // + hasLastBullishConsolidationZone = lastBullishConsolidationZone.IsValid(); + hasLastBearishConsolidationZone = lastBearishConsolidationZone.IsValid(); + hasPrevBullishConsolidationZone = prevBullishConsolidationZone.IsValid(); + hasPrevBearishConsolidationZone = prevBearishConsolidationZone.IsValid(); + + // + isLastBullishConsolidationZoneInsidePivot = + // + hasLastBullishConsolidationZone && + (lastBullishConsolidationZone.lower < point && + lastBullishConsolidationZone.upper > pivot) + // + ; + isPrevBullishConsolidationZoneInsidePivot = + // + hasPrevBullishConsolidationZone && + (prevBullishConsolidationZone.lower < point && + prevBullishConsolidationZone.upper > pivot) + // + ; + + // + isLastBearishConsolidationZoneInsidePivot = + // + hasLastBearishConsolidationZone && + (lastBearishConsolidationZone.upper > point && + lastBearishConsolidationZone.lower < pivot) + // + ; + isPrevBearishConsolidationZoneInsidePivot = + // + hasPrevBearishConsolidationZone && + (prevBearishConsolidationZone.upper > point && + prevBearishConsolidationZone.lower < pivot) + // + ; + } + + // + bool isConsolidationZonePassed = + isBullish + // + ? (point > 0 && + pivot > 0 && + pivot < point && + hasPrevBullishConsolidationZone && + point > prevBullishConsolidationZone.upper && + (isLastBullishConsolidationZoneInsidePivot || + isPrevBullishConsolidationZoneInsidePivot)) + : (point > 0 && + pivot > 0 && + pivot > point && + hasPrevBearishConsolidationZone && + point < prevBearishConsolidationZone.lower && + (isLastBearishConsolidationZoneInsidePivot || + isPrevBearishConsolidationZoneInsidePivot)) + // + ; + + // + result = hasConditions && + hasRewardAmount && + isPriorityPassed && + trend == conditionsDir; // && + // isConsolidationZonePassed; + if (!result) + { + // + Clean(visionPoiEvents); + Clean(analysePoiEvents); + Clean(decisionPoiEvents); + Clean(visionCycleEvents); + Clean(analyseCycleEvents); + Clean(decisionCycleEvents); + Clean(consolidationPoiEvents); + Clean(consolidationCycleEvents); + + // + visionState.Clean(); + analyseState.Clean(); + decisionState.Clean(); + visionConditions.Clean(); + analyseConditions.Clean(); + visionXConditions.Clean(); + consolidationState.Clean(); + decisionConditions.Clean(); + analyseXConditions.Clean(); + decisionXConditions.Clean(); + consolidationConditions.Clean(); + consolidationXConditions.Clean(); + + // + lastBullishConsolidationZone.Clean(); + lastBearishConsolidationZone.Clean(); + prevBullishConsolidationZone.Clean(); + prevBearishConsolidationZone.Clean(); + + // + mConditions.Clean(); + + // + return result; + } + + // + mConditions.pivot = pivot; + mConditions.point = point; + mConditions.reward = reward; + mConditions.target = target; + mConditions.setupTime = cTime; + mConditions.priority = priority; + mConditions.dir = conditionsDir; + mConditions.amountPercent = amountPercent; + + // + mConditions.UpdateTo(cTime); + + // + Clean(visionPoiEvents); + Clean(analysePoiEvents); + Clean(decisionPoiEvents); + Clean(visionCycleEvents); + Clean(analyseCycleEvents); + Clean(decisionCycleEvents); + Clean(consolidationPoiEvents); + Clean(consolidationCycleEvents); + + // + visionState.Clean(); + analyseState.Clean(); + decisionState.Clean(); + visionConditions.Clean(); + analyseConditions.Clean(); + visionXConditions.Clean(); + consolidationState.Clean(); + decisionConditions.Clean(); + analyseXConditions.Clean(); + decisionXConditions.Clean(); + consolidationConditions.Clean(); + consolidationXConditions.Clean(); + + // + lastBullishConsolidationZone.Clean(); + lastBearishConsolidationZone.Clean(); + prevBullishConsolidationZone.Clean(); + prevBearishConsolidationZone.Clean(); + + // + return result; + } + + // + // Detect Trigger Conditions ... + bool DetectSignalTrigger( + // + X121SMCStrategyXWZSignalConditions &conditions, + // + string _symbol, + ENUM_TIMEFRAMES _period, + // + XC121SMCCycleHelper *decisionCycleHelper, + XC121SMCCycleHelper *analyseCycleHelper, + XC121SMCCycleHelper *consolidationCycleHelper, + XC121SMCCycleHelper *visionCycleHelper, + // + int maxAllowedSetupAge = 30 + // + ) + { + // + bool result = false; + + // + result = + // + visionCycleHelper != NULL && + analyseCycleHelper != NULL && + decisionCycleHelper != NULL && + consolidationCycleHelper != NULL + // + ; + if (!result) + { + return result; + } + + // + result = conditions.IsSetuped(); + if (!result) + { + return result; + } + + // + datetime setupTime = conditions.setupTime; + ENUM_X_DIRECTION setupDir = conditions.dir; + + // + bool isBullish = IsBullish(setupDir); + bool isBearish = IsBearish(setupDir); + + // + int zIndex = 0; + int cIndex = zIndex + 1; + int pIndex = cIndex + 1; + int ppIndex = pIndex + 1; + + // + int loopback = 10; + + // + string symbol = _symbol; + ENUM_TIMEFRAMES period = _period; + + // + XOHCL zBar; + result = decisionCycleHelper.GetBar( + zBar, + zIndex // + ); + if (!result) + { + return result; + } + + // + XOHCL cBar; + result = decisionCycleHelper.GetBar( + cBar, + cIndex // + ); + if (!result) + { + return result; + } + + // + XOHCL pBar; + result = decisionCycleHelper.GetBar( + pBar, + pIndex // + ); + if (!result) + { + return result; + } + + // + double ask = GetAsk(symbol); + double bid = GetBid(symbol); + datetime cTime = TimeCurrent(); + double points = GetPoints(symbol); + + // + int swingLoopback = 9; + double ll = cBar.FindLowest(swingLoopback, MODE_LOW); + double hh = cBar.FindHighest(swingLoopback, MODE_HIGH); + double llDown = cBar.FindLowesttDown(swingLoopback); + double hhUp = cBar.FindHighestUp(swingLoopback); + + // + // Cycles Conditions ... + + // + // Decision ... + ENUM_XPOI_EVENTS decisionPoiEvents[]; + ENUM_X_CYCLE_EVENTS decisionCycleEvents[]; + X121SMCCycleConditions decisionConditions; + result = decisionCycleHelper.GetConditions( + decisionCycleEvents, + decisionPoiEvents, + decisionConditions, + zIndex, + loopback // + ); + if (!result) + { + // + // Cleanup ... + zBar.Clean(); + cBar.Clean(); + pBar.Clean(); + + // + Clean(decisionPoiEvents); + Clean(decisionCycleEvents); + + // + decisionConditions.Clean(); + + // + return result; + } + + // + // Cycles POI States ... + XPOIState decisionState = decisionConditions.state; + + // + // Cycle X121Conditions ... + X121Conditions decisionXConditions = decisionConditions.x121Conditions; + + // + // Trigger Conditions ... + + // + double point = conditions.point; + bool isPointBreaked = IsBarBreak( + point, + setupDir, + cBar // + ); + + // + // Summary ... + + // + isBullish = + // + isBullish && + isPointBreaked && + cBar.IsBullish() + // + ; + + // + isBearish = + // + isBearish && + isPointBreaked && + cBar.IsBearish() + // + ; + + // + result = isBullish || + isBearish; + if (!result) + { + // + // Cleanup Setup Conditions ... + int setupAge = conditions.GetSetupAge(); + if (IsValidSize(setupAge) && + IsValidSize(maxAllowedSetupAge) && + setupAge >= maxAllowedSetupAge) + { + conditions.Clean(); + } + + // + // Cleanup ... + zBar.Clean(); + cBar.Clean(); + pBar.Clean(); + + // + Clean(decisionPoiEvents); + Clean(decisionCycleEvents); + + // + decisionState.Clean(); + decisionConditions.Clean(); + decisionXConditions.Clean(); + + // + return result; + } + + // + // Detect Nearest Pivot Point ... + + // + double entry = GetEntry( + conditions.symbol, + setupDir // + ); + + // + // Manipulate SL Based on Consolidation Zones ... + + // + double sls[]; + Add( + conditions.pivot, + sls // + ); + + // + // TODO: Add Consolidation Zone for SLs ... + + // + double iAtr = decisionXConditions.atrBuffer[1]; + iAtr *= 2; + + // + double slsMin = GetMin(sls); + double slsMax = GetMax(sls); + + // + double sl = isBullish + ? slsMin - iAtr + : slsMax + iAtr; + double risk = MathAbs(entry - sl); + + // + // Filling Conditions Props ... + conditions.sl = sl; + conditions.triggerTime = cTime; + conditions.type = isBullish + ? X_POSITION_TYPE_LONG + : X_POSITION_TYPE_SHORT; + + // + // Cleanup ... + zBar.Clean(); + cBar.Clean(); + pBar.Clean(); + + // + Clean(decisionPoiEvents); + Clean(decisionCycleEvents); + + // + decisionState.Clean(); + decisionConditions.Clean(); + decisionXConditions.Clean(); + + // + return result; + } + + // + // Detect Guards ... + bool DetectGuards( + // + X121SMCGuard &guards[], + const XPosition &positions[], + // + XC121SMCCycleHelper *decisionCycleHelper, + XC121SMCCycleHelper *analyseCycleHelper, + XC121SMCCycleHelper *consolidationCycleHelper, + XC121SMCCycleHelper *visionCycleHelper + // + ) + { + // + bool result = false; + + // + Clean(guards); + + // + bool isCycleHelpersValid = + // + visionCycleHelper != NULL && + analyseCycleHelper != NULL && + decisionCycleHelper != NULL && + consolidationCycleHelper != NULL + // + ; + + // + result = isCycleHelpersValid; + if (!result) + { + return result; + } + + // + int count = ArraySize(positions); + result = IsValidSize(count); + if (!result) + { + return result; + } + + // + string symbol = decisionCycleHelper.GetSymbol(); + ENUM_TIMEFRAMES period = decisionCycleHelper.GetPeriod(); + string provider = ToString(X_121_SMC_PROVIDER_XWZ); + + // + XPosition ownPositions[]; + XPosition ownLongPositions[]; + XPosition ownShortPositions[]; + for (int i = 0; i < count; i++) + { + // + XPosition iPosition = positions[i]; + bool isOwn = iPosition + .IsFiltersPassed( + symbol, + provider, + NULL, + X_POSITION_TYPE_ALL, + iPosition.magic // + ); + if (isOwn) + { + // + AddRef( + iPosition, + ownPositions // + ); + + // + bool isLong = IsLong(positions[i].type); + if (isLong) + { + // + AddRef( + iPosition, + ownLongPositions // + ); + } + else + { + // + AddRef( + iPosition, + ownShortPositions // + ); + } + } + } + + // + count = ArraySize(ownPositions); + + // + int longsCount = ArraySize(ownLongPositions); + bool hasLongs = IsValidSize(longsCount); + + // + int shortsCount = ArraySize(ownShortPositions); + bool hasShorts = IsValidSize(shortsCount); + + // + result = IsValidSize(count); + if (!result) + { + // + Clean(ownPositions); + Clean(ownLongPositions); + Clean(ownShortPositions); + + // + return result; + } + + // + // + // + + // + // Get Global and Common Guards ... + + // + ENUM_X_121_SMC_GUARD_ACTIONS ignoreGuards[1] = { + X_121_SMC_GUARD_ACTION_TRAIL_STOP // + }; + result = DetectX121SMCGuards( + provider, + guards, + positions, + decisionCycleHelper, + analyseCycleHelper, + consolidationCycleHelper, + visionCycleHelper, + // + ignoreGuards + // + ); + + // + // + // + + // + // Get Custom Implemented Guards ... + + // + // Here we Are Sure there is Positions to Guard ... + // based on Current Provider ... + + // + // Detect Required Data for Analyse Market to Guard Positions ... + + // + int zIndex = 0; + int cIndex = zIndex + 1; + int pIndex = cIndex + 1; + int ppIndex = pIndex + 1; + + // + int loopback = 10; + + // + XOHCL zBar; + result = zBar.Init( + symbol, + period, + zIndex // + ); + if (!result) + { + // + result = HasChild(guards); + return result; + } + + // + XOHCL cBar; + result = cBar.Init( + symbol, + period, + cIndex // + ); + if (!result) + { + // + zBar.Clean(); + result = HasChild(guards); + return result; + } + + // + XOHCL pBar; + result = pBar.Init( + symbol, + period, + pIndex // + ); + if (!result) + { + // + zBar.Clean(); + cBar.Clean(); + result = HasChild(guards); + return result; + } + + // + XOHCL ppBar; + result = ppBar.Init( + symbol, + period, + ppIndex // + ); + if (!result) + { + // + zBar.Clean(); + cBar.Clean(); + pBar.Clean(); + result = HasChild(guards); + return result; + } + + // + double ask = GetAsk(symbol); + double bid = GetBid(symbol); + datetime cTime = TimeCurrent(); + double points = GetPoints(symbol); + + // + + // + // Cycles Conditions ... + + // + // Decision ... + ENUM_XPOI_EVENTS decisionPoiEvents[]; + ENUM_X_CYCLE_EVENTS decisionCycleEvents[]; + X121SMCCycleConditions decisionConditions; + result = decisionCycleHelper.GetConditions( + decisionCycleEvents, + decisionPoiEvents, + decisionConditions, + zIndex, + loopback // + ); + if (!result) + { + // + zBar.Clean(); + cBar.Clean(); + pBar.Clean(); + ppBar.Clean(); + result = HasChild(guards); + return result; + } + + // + // Analyse ... + ENUM_XPOI_EVENTS analysePoiEvents[]; + ENUM_X_CYCLE_EVENTS analyseCycleEvents[]; + X121SMCCycleConditions analyseConditions; + result = analyseCycleHelper.GetConditions( + analyseCycleEvents, + analysePoiEvents, + analyseConditions, + zIndex, + loopback // + ); + if (!result) + { + // + zBar.Clean(); + cBar.Clean(); + pBar.Clean(); + ppBar.Clean(); + + // + Clean(decisionPoiEvents); + Clean(decisionCycleEvents); + + // + decisionConditions.Clean(); + + // + result = HasChild(guards); + return result; + } + + // + // Consolidation ... + ENUM_XPOI_EVENTS consolidationPoiEvents[]; + ENUM_X_CYCLE_EVENTS consolidationCycleEvents[]; + X121SMCCycleConditions consolidationConditions; + result = consolidationCycleHelper.GetConditions( + consolidationCycleEvents, + consolidationPoiEvents, + consolidationConditions, + zIndex, + loopback // + ); + if (!result) + { + // + zBar.Clean(); + cBar.Clean(); + pBar.Clean(); + ppBar.Clean(); + + // + Clean(decisionPoiEvents); + Clean(decisionCycleEvents); + + // + decisionConditions.Clean(); + + // + Clean(analysePoiEvents); + Clean(analyseCycleEvents); + + // + analyseConditions.Clean(); + + // + result = HasChild(guards); + return result; + } + + // + // Vision ... + ENUM_XPOI_EVENTS visionPoiEvents[]; + ENUM_X_CYCLE_EVENTS visionCycleEvents[]; + X121SMCCycleConditions visionConditions; + result = visionCycleHelper.GetConditions( + visionCycleEvents, + visionPoiEvents, + visionConditions, + zIndex, + loopback // + ); + if (!result) + { + // + zBar.Clean(); + cBar.Clean(); + pBar.Clean(); + ppBar.Clean(); + + // + Clean(decisionPoiEvents); + Clean(decisionCycleEvents); + + // + decisionConditions.Clean(); + + // + Clean(analysePoiEvents); + Clean(analyseCycleEvents); + + // + analyseConditions.Clean(); + + // + Clean(consolidationPoiEvents); + Clean(consolidationCycleEvents); + + // + consolidationConditions.Clean(); + + // + result = HasChild(guards); + return result; + } + + // + // Cycles POI States ... + XPOIState decisionState = decisionConditions.state; + XPOIState analyseState = analyseConditions.state; + XPOIState consolidationState = consolidationConditions.state; + XPOIState visionState = visionConditions.state; + + // + // Cycle X121Conditions ... + X121Conditions decisionXConditions = decisionConditions.x121Conditions; + X121Conditions analyseXConditions = analyseConditions.x121Conditions; + X121Conditions consolidationXConditions = consolidationConditions.x121Conditions; + X121Conditions visionXConditions = visionConditions.x121Conditions; + + // + // + // + + // + // Detect Consolidation Zone ... + + // + XBoxZone lastBullishBox; + XBoxZone prevLastBullishBox; + bool hasLastBullishBox = false; + bool hasPrevLastBullishBox = false; + XConsolidationZone lastBullishZone; + bool isLastBullishAbovePrev = false; + bool isLastBullishBelowPrev = false; + XConsolidationZone prevLastBullishZone; + + // + XBoxZone lastBearishBox; + XBoxZone prevLastBearishBox; + bool hasLastBearishBox = false; + bool hasPrevLastBearishBox = false; + XConsolidationZone lastBearishZone; + bool isLastBearishAbovePrev = false; + bool isLastBearishBelowPrev = false; + XConsolidationZone prevLastBearishZone; + + // + int bullishConsolidationZonesCount = 0; + int bearishConsolidationZonesCount = 0; + bool hasBullishConsolidationZones = false; + bool hasBearishConsolidationZones = false; + XConsolidationZone bullishConsolidationZones[]; + XConsolidationZone bearishConsolidationZones[]; + bool hasConsolidationZones = decisionCycleHelper.HasConsolidationZones(); + int consolidationZonesCount = decisionCycleHelper.CountConsolidationZones(); + if (hasConsolidationZones) + { + // + bullishConsolidationZonesCount = decisionCycleHelper + .FillConsolidationZones( + X_DIRECTION_BULLISH, + bullishConsolidationZones // + ); + hasBullishConsolidationZones = IsValidSize(bullishConsolidationZonesCount); + + // + bearishConsolidationZonesCount = decisionCycleHelper + .FillConsolidationZones( + X_DIRECTION_BEARISH, + bearishConsolidationZones // + ); + hasBearishConsolidationZones = IsValidSize(bearishConsolidationZonesCount); + + // + // + // + + // + if (hasBullishConsolidationZones && + bullishConsolidationZonesCount >= 2) + { + // + lastBullishZone = bullishConsolidationZones[bullishConsolidationZonesCount - 1]; + prevLastBullishZone = bullishConsolidationZones[bullishConsolidationZonesCount - 2]; + + // + hasLastBullishBox = ToBox( + lastBullishBox, + lastBullishZone // + ); + hasPrevLastBullishBox = ToBox( + prevLastBullishBox, + prevLastBullishZone // + ); + + // + isLastBullishAbovePrev = hasLastBullishBox && + hasPrevLastBullishBox && + IsBoxAbove( + lastBullishBox, + prevLastBullishBox // + ); + + // + isLastBullishBelowPrev = hasLastBullishBox && + hasPrevLastBullishBox && + IsBoxBelow( + lastBullishBox, + prevLastBullishBox // + ); + } + + // + if (hasBearishConsolidationZones && + bearishConsolidationZonesCount >= 2) + { + // + lastBearishZone = bearishConsolidationZones[bearishConsolidationZonesCount - 1]; + prevLastBearishZone = bearishConsolidationZones[bearishConsolidationZonesCount - 2]; + + // + hasLastBearishBox = ToBox( + lastBearishBox, + lastBearishZone // + ); + hasPrevLastBearishBox = ToBox( + prevLastBearishBox, + prevLastBearishZone // + ); + + // + isLastBearishAbovePrev = hasLastBearishBox && + hasPrevLastBearishBox && + IsBoxAbove( + lastBearishBox, + prevLastBearishBox // + ); + + // + isLastBearishBelowPrev = hasLastBearishBox && + hasPrevLastBearishBox && + IsBoxBelow( + lastBearishBox, + prevLastBearishBox // + ); + } + + // + } + + // + // Detect High Probability Swings ... + bool isSwingLow = + // + cBar.low > pBar.low && + ppBar.low > pBar.low && + // + zBar.low > pBar.low + // + ; + bool isSwingHigh = + // + cBar.high < pBar.high && + ppBar.high < pBar.high && + // + zBar.high < pBar.high + // + ; + bool isStrongSwingLow = + pBar.IsBullish() && + pBar.GetLowShadow() >= pBar.GetBody() * 2; + bool isStrongSwingHigh = + pBar.IsBearish() && + pBar.GetHighShadow() >= pBar.GetBody() * 2; + + // + bool isStrongSwingLowAboveLastBullishBox = + isStrongSwingLow && + hasLastBullishBox && + pBar.low > lastBullishBox.upper; + + // + bool isStrongSwingHighBelowLastBearishBox = + isStrongSwingHigh && + hasLastBearishBox && + pBar.high < lastBearishBox.lower; + + // + // Here We Have all Requirements for Guarding Positions ... + + // + // Available Guards: + // X_121_SMC_GUARD_ACTION_NONE + // X_121_SMC_GUARD_ACTION_CLOSE + // X_121_SMC_GUARD_ACTION_CLOSE_ALL + // X_121_SMC_GUARD_ACTION_CLOSE_LONGS + // X_121_SMC_GUARD_ACTION_CLOSE_SHORTS + // X_121_SMC_GUARD_ACTION_PARTIAL_CLOSE + // X_121_SMC_GUARD_ACTION_TRAIL_STOP + // X_121_SMC_GUARD_ACTION_TRAIL_TARGET + // X_121_SMC_GUARD_ACTION_HEDGE + + // + // X_121_SMC_GUARD_ACTION_CLOSE: + // Close Specified Position on Specified Conditions ... + + // + // X_121_SMC_GUARD_ACTION_CLOSE_ALL: + // Close All Positions on Specified Conditions ... + + // + // X_121_SMC_GUARD_ACTION_CLOSE_LONGS: + // Close All Long Positions on Specified Conditions ... + + // + // X_121_SMC_GUARD_ACTION_CLOSE_SHORTS: + // Close All Short Positions on Specified Conditions ... + + // + // X_121_SMC_GUARD_ACTION_PARTIAL_CLOSE: + // Partial Close Specified Position on Specified Conditions ... + + // + // X_121_SMC_GUARD_ACTION_TRAIL_STOP: + // Trail Stop Specified Position on Specified Conditions ... + + // + // X_121_SMC_GUARD_ACTION_TRAIL_TARGET: + // Trail Target Specified Position on Specified Conditions ... + + // + // X_121_SMC_GUARD_ACTION_HEDGE: + // Hedge all Positions on Specified Conditions ... + + // + // Cleanup Collections ... + + // + Clean(ownPositions); + Clean(ownLongPositions); + Clean(ownShortPositions); + + // + zBar.Clean(); + cBar.Clean(); + pBar.Clean(); + ppBar.Clean(); + + // + Clean(visionPoiEvents); + Clean(analysePoiEvents); + Clean(visionCycleEvents); + Clean(decisionPoiEvents); + Clean(analyseCycleEvents); + Clean(decisionCycleEvents); + Clean(consolidationPoiEvents); + Clean(consolidationCycleEvents); + + // + visionState.Clean(); + analyseState.Clean(); + decisionState.Clean(); + visionConditions.Clean(); + analyseConditions.Clean(); + visionXConditions.Clean(); + decisionConditions.Clean(); + consolidationState.Clean(); + analyseXConditions.Clean(); + decisionXConditions.Clean(); + consolidationConditions.Clean(); + consolidationXConditions.Clean(); + + // + lastBullishBox.Clean(); + lastBearishBox.Clean(); + lastBullishZone.Clean(); + lastBearishZone.Clean(); + prevLastBullishBox.Clean(); + prevLastBearishBox.Clean(); + prevLastBullishZone.Clean(); + prevLastBearishZone.Clean(); + + // + count = ArraySize(guards); + result = IsValidSize(count); + + // + return result; + } + + // + // + // + + // + // Add Conditions to Conditions Collection ... + int AddConditionsIfNotExists( + int maxAllowed = 10 // + ) + { + // + int result = 0; + + // + bool isSetuped = IsValid(mConditions.setupTime) && + HasDirection(mConditions.dir); + if (!isSetuped) + { + return result; + } + + // + int count = ArraySize(mConditionsCollection); + if (IsValidSize(count)) + { + // + // Copy Original Items ... + X121SMCStrategyXWZSignalConditions tmpItems[]; + Copy( + mConditionsCollection, + tmpItems // + ); + + // + // Prese Item Data ... + bool isBullish = IsBullish(mConditions.dir); + + // + for (int i = 0; i < count; i++) + { + // + X121SMCStrategyXWZSignalConditions iItem = tmpItems[i]; + + // + bool canRemove = mConditions.dir == iItem.dir && + mConditions.pivot == iItem.pivot; + if (canRemove) + { + // + ArrayRemove( + mConditionsCollection, + i, + 1 // + ); + } + } + + // + Clean(tmpItems); + } + + // + AddRef( + mConditions, + mConditionsCollection // + ); + + // + // Remove Olds ... + CleanupArray( + mConditionsCollection, + maxAllowed // + ); + + // + result = ArraySize(mConditionsCollection); + + // + return result; + } + + // + // Draw Functions ... + // + + // + void RemoveDraws() + { + mObjects.Clear(); + } + + // + void RemoveWorkingZoneDraws() + { + mWorkingZoneObjects.Clear(); + } + + // + void DrawOrderBlock( + XCOrderBlock *ob, + XCPOIDrawer *drawer, + bool forWorkingZone = false // + ) + { + // + if (ob == NULL || + drawer == NULL) + { + return; + } + + // + ENUM_X_DIRECTION forDir = ob.GetDirection(); + + // + color bullishColor = drawer.BarBullishColor(); + color bearishColor = drawer.BarBearishColor(); + color forColor = IsBullish(forDir) + ? bullishColor + : bearishColor; + + // + // Draw Order Block ... + XCBaseObject *obj; + bool isCreated = drawer.CreateOrderBlock( + ob, + obj // + ); + if (isCreated) + { + // + if (forWorkingZone) + { + mWorkingZoneObjects.Add(obj); + } + else + { + mObjects.Add(obj); + } + } + + // + ulong chartID = drawer.ChartIdentification(); + int subWindow = drawer.SubWindowIdentification(); + + // + XOHCL startedBar; + ENUM_X_DIRECTION startedDir; + bool isStarted = ob.IsStarted( + forDir, + startedBar, + startedDir // + ); + if (isStarted) + { + // + datetime to = startedBar.time + (PeriodSeconds(startedBar.period)); + + // + XCOHCLObject *obj; + bool isCreated = drawer.CreateBar( + startedBar, + obj, + to // + ); + if (isCreated) + { + // + obj.BodyColor(clrYellow); + obj.HighShadowColor(clrYellow); + obj.LowShadowColor(clrYellow); + + // + obj.BodyStyle(STYLE_SOLID); + obj.HighShadowStyle(STYLE_SOLID); + obj.LowShadowStyle(STYLE_SOLID); + + // + if (forWorkingZone) + { + mWorkingZoneObjects.Add(obj); + } + else + { + mObjects.Add(obj); + } + } + + // + string startVLineName = "Start_" + ob.GetTag(); + + // + CChartObjectVLine *startVLine; + startVLine = new CChartObjectVLine(); + isCreated = startVLine.Create( + chartID, + startVLineName, + subWindow, + startedBar.time // + ); + if (isCreated) + { + // + startVLine.Color(forColor); + + // + if (forWorkingZone) + { + mWorkingZoneObjects.Add(startVLine); + } + else + { + mObjects.Add(startVLine); + } + } + } + } + + // + void DrawFairValueGap( + XCFVG *fvg, + XCPOIDrawer *drawer, + bool forWorkingZone = false // + ) + { + // + if (fvg == NULL || + drawer == NULL) + { + return; + } + + // + ENUM_X_DIRECTION forDir = fvg.GetDirection(); + + // + color bullishColor = drawer.BarBullishColor(); + color bearishColor = drawer.BarBearishColor(); + color forColor = IsBullish(forDir) + ? bullishColor + : bearishColor; + + // + // Draw Order Block ... + XCBaseObject *obj; + bool isCreated = drawer.CreateFairValueGap( + fvg, + obj // + ); + if (isCreated) + { + // + if (forWorkingZone) + { + mWorkingZoneObjects.Add(obj); + } + else + { + mObjects.Add(obj); + } + } + + // + ulong chartID = drawer.ChartIdentification(); + int subWindow = drawer.SubWindowIdentification(); + + // + XOHCL startedBar; + ENUM_X_DIRECTION startedDir; + bool isStarted = fvg.IsStarted( + forDir, + startedBar, + startedDir // + ); + if (isStarted) + { + // + datetime to = startedBar.time + (PeriodSeconds(startedBar.period)); + + // + XCOHCLObject *obj; + bool isCreated = drawer.CreateBar( + startedBar, + obj, + to // + ); + if (isCreated) + { + // + obj.BodyColor(clrYellow); + obj.HighShadowColor(clrYellow); + obj.LowShadowColor(clrYellow); + + // + obj.BodyStyle(STYLE_SOLID); + obj.HighShadowStyle(STYLE_SOLID); + obj.LowShadowStyle(STYLE_SOLID); + + // + if (forWorkingZone) + { + mWorkingZoneObjects.Add(obj); + } + else + { + mObjects.Add(obj); + } + } + + // + string startVLineName = "Start_" + fvg.GetTag(); + + // + CChartObjectVLine *startVLine; + startVLine = new CChartObjectVLine(); + isCreated = startVLine.Create( + chartID, + startVLineName, + subWindow, + startedBar.time // + ); + if (isCreated) + { + // + startVLine.Color(forColor); + + // + if (forWorkingZone) + { + mWorkingZoneObjects.Add(startVLine); + } + else + { + mObjects.Add(startVLine); + } + } + } + } + + // + void DrawWorkingZone( + X121SMCStrategyXWZSignalConditions &conditions, + XCPOIDrawer *drawer // + ) + { + // + if (drawer == NULL) + { + return; + } + + // + bool hasWorkingZone = conditions.HasWorkingZone(); + if (!hasWorkingZone) + { + return; + } + + // + string prefix = "WKZ_" + conditions.workingZone.symbol + ToString(conditions.workingZone.period) + "_"; + string tag = prefix + ToString(conditions.workingZone.upper) + "_" + ToString(conditions.workingZone.lower); + string suffix = ToMD5(tag); + + // + string upperName = prefix + "_Upper_" + suffix; + string lowerName = prefix + "_Lower_" + suffix; + string zoneUpperName = prefix + "_ZoneUpper_" + suffix; + string zoneLowerName = prefix + "_ZoneLower_" + suffix; + + // + string q1Name = prefix + "_Q1_" + suffix; + string q2Name = prefix + "_Q2_" + suffix; + string q3Name = prefix + "_Q3_" + suffix; + + // + ulong chartID = drawer.ChartIdentification(); + int subWindow = drawer.SubWindowIdentification(); + + // + bool isCreated = false; + + // + // Check For Trend Approced ... + bool isTrendApproved = conditions.HasOrderBlock() && + conditions.HasFairValueGap(); + if (isTrendApproved) + { + // + DrawOrderBlock( + conditions.orderBlock, + drawer, + true // + ); + + // + DrawFairValueGap( + conditions.fairValueGap, + drawer, + true // + ); + } + + // + XCSupplyZoneObject *iSupObj; + isCreated = drawer.CreateSupplyZone( + conditions.supplyZone, + iSupObj // + ); + if (isCreated) + { + mWorkingZoneObjects.Add(iSupObj); + } + + // + XCDemandZoneObject *iDemObj; + isCreated = drawer.CreateDemandZone( + conditions.demandZone, + iDemObj // + ); + if (isCreated) + { + mWorkingZoneObjects.Add(iDemObj); + } + + // + // Lower ... + CChartObjectTrend *lowerHLine; + lowerHLine = new CChartObjectTrend(); + isCreated = lowerHLine.Create( + chartID, + lowerName, + subWindow, + conditions.workingZone.from, + conditions.workingZone.lower, + conditions.workingZone.to, + conditions.workingZone.lower // + ); + if (isCreated) + { + // + lowerHLine.Color(clrLime); + mWorkingZoneObjects.Add(lowerHLine); + } + + // + CChartObjectTrend *upperHLine; + upperHLine = new CChartObjectTrend(); + isCreated = upperHLine.Create( + chartID, + upperName, + subWindow, + conditions.workingZone.from, + conditions.workingZone.upper, + conditions.workingZone.to, + conditions.workingZone.upper // + ); + if (isCreated) + { + // + upperHLine.Color(clrLime); + mWorkingZoneObjects.Add(upperHLine); + } + + // + CChartObjectTrend *zoneLowerHLine; + zoneLowerHLine = new CChartObjectTrend(); + isCreated = zoneLowerHLine.Create( + chartID, + zoneLowerName, + subWindow, + conditions.workingZone.from, + conditions.workingZone.zoneLower, + conditions.workingZone.to, + conditions.workingZone.zoneLower // + ); + if (isCreated) + { + // + zoneLowerHLine.Color(clrRed); + mWorkingZoneObjects.Add(zoneLowerHLine); + } + + // + CChartObjectTrend *zoneUpperHLine; + zoneUpperHLine = new CChartObjectTrend(); + isCreated = zoneUpperHLine.Create( + chartID, + zoneUpperName, + subWindow, + conditions.workingZone.from, + conditions.workingZone.zoneUpper, + conditions.workingZone.to, + conditions.workingZone.zoneUpper // + ); + if (isCreated) + { + // + zoneUpperHLine.Color(clrRed); + mWorkingZoneObjects.Add(zoneUpperHLine); + } + + // + CChartObjectTrend *quarter1HLine; + quarter1HLine = new CChartObjectTrend(); + isCreated = quarter1HLine.Create( + chartID, + q1Name, + subWindow, + conditions.workingZone.from, + conditions.workingZone.quarter1, + conditions.workingZone.to, + conditions.workingZone.quarter1 // + ); + if (isCreated) + { + // + quarter1HLine.Color(clrYellow); + mWorkingZoneObjects.Add(quarter1HLine); + } + + // + CChartObjectTrend *quarter2HLine; + quarter2HLine = new CChartObjectTrend(); + isCreated = quarter2HLine.Create( + chartID, + q2Name, + subWindow, + conditions.workingZone.from, + conditions.workingZone.quarter2, + conditions.workingZone.to, + conditions.workingZone.quarter2 // + ); + if (isCreated) + { + // + quarter2HLine.Color(clrYellow); + mWorkingZoneObjects.Add(quarter2HLine); + } + + // + CChartObjectTrend *quarter3HLine; + quarter3HLine = new CChartObjectTrend(); + isCreated = quarter3HLine.Create( + chartID, + q3Name, + subWindow, + conditions.workingZone.from, + conditions.workingZone.quarter3, + conditions.workingZone.to, + conditions.workingZone.quarter3 // + ); + if (isCreated) + { + // + quarter3HLine.Color(clrYellow); + mWorkingZoneObjects.Add(quarter3HLine); + } + + // + } + + // + void DrawConditions( + X121SMCStrategyXWZSignalConditions &conditions, + XCPOIDrawer *drawer, + bool forceClean = false // + ) + { + // + if (drawer == NULL) + { + return; + } + + // + if (forceClean) + { + mObjects.Clear(); + } + + // + bool isCreated = false; + + // + ulong chartID = drawer.ChartIdentification(); + int subWindow = drawer.SubWindowIdentification(); + color bullishColor = drawer.BarBullishColor(); + color bearishColor = drawer.BarBearishColor(); + + // + // Start Zones ... + bool hasStartZones = conditions.HasStartZones(); + if (hasStartZones) + { + // + int count = conditions.CountStartZones(); + for (int i = 0; i < count; i++) + { + // + bool isBullish = conditions.startZones[i].IsBullish(); + + // + bool hasOB = conditions.startZones[i].HasOB(); + if (hasOB) + { + // // + // XCBaseObject *iObj; + // isCreated = drawer.CreateOrderBlock( + // conditions.startZones[i].ob, + // iObj // + // ); + + // // + // if (isCreated) + // { + // mObjects.Add(iObj); + // } + + // + DrawOrderBlock( + conditions.startZones[i].ob, + drawer // + ); + } + + // + bool hasFVG = conditions.startZones[i].HasFVG(); + if (hasFVG) + { + // // + // XCBaseObject *iObj; + // isCreated = drawer.CreateFairValueGap( + // conditions.startZones[i].fvg, + // iObj // + // ); + + // // + // if (isCreated) + // { + // mObjects.Add(iObj); + // } + + // + DrawFairValueGap( + conditions.startZones[i].fvg, + drawer // + ); + } + + // // + // bool hasSupply = conditions.startZones[i].HasSupply(); + // if (hasSupply) + // { + // // + // XCSupplyZoneObject *iObj; + // isCreated = drawer.CreateSupplyZone( + // conditions.startZones[i].supply, + // iObj // + // ); + + // // + // if (isCreated) + // { + // mObjects.Add(iObj); + // } + // } + + // // + // bool hasDemand = conditions.startZones[i].HasDemand(); + // if (hasDemand) + // { + // // + // XCDemandZoneObject *iObj; + // isCreated = drawer.CreateDemandZone( + // conditions.startZones[i].demand, + // iObj // + // ); + + // // + // if (isCreated) + // { + // mObjects.Add(iObj); + // } + // } + + // // + // bool hasSupport = conditions.startZones[i].HasSupport(); + // if (hasSupport) + // { + // // + // XCSupportZoneObject *iObj; + // isCreated = drawer.CreateSupportZone( + // conditions.startZones[i].support, + // iObj // + // ); + + // // + // if (isCreated) + // { + // mObjects.Add(iObj); + // } + // } + + // // + // bool hasResistance = conditions.startZones[i].HasResistance(); + // if (hasResistance) + // { + // // + // XCResistanceZoneObject *iObj; + // isCreated = drawer.CreateResistanceZone( + // conditions.startZones[i].resistance, + // iObj // + // ); + + // // + // if (isCreated) + // { + // mObjects.Add(iObj); + // } + // } + + // + // + // + + // + string bName = ""; + int arrowCode = 0; + string bSuffix = ""; + color arrowColor = clrNONE; + ENUM_X_PRICE bPrice = X_PRICE_CLOSE; + + // + bool hasSwingBar = conditions.startZones[i].swingBar.IsValid(); + if (hasSwingBar) + { + // + bSuffix = ToMD5(conditions.startZones[i].swingBar.GetTag()); + bName = + (isBullish + ? "SWING_LOW" + : "SWING_HIGH") + + "_" + bSuffix; + arrowCode = 159; + arrowColor = + isBullish + ? bullishColor + : bearishColor; + bPrice = + isBullish + ? X_PRICE_LOW + : X_PRICE_HIGH; + + // + XCBarArrowObject *iObj; + iObj = new XCBarArrowObject(); + isCreated = iObj.CreateByBar( + chartID, + bName, + subWindow, + arrowCode, + conditions.startZones[i].swingBar, + bPrice // + ); + if (isCreated) + { + // + iObj.ArrowColor(arrowColor); + + // + mObjects.Add(iObj); + } + } + + // + bool hasBreakerBar = conditions.startZones[i].breakerBar.IsValid(); + if (hasBreakerBar) + { + // + bSuffix = ToMD5(conditions.startZones[i].breakerBar.GetTag()); + bName = + (isBullish + ? "BULL_BREAKER" + : "BEAR_BREAKER") + + "_" + bSuffix; + arrowCode = + isBullish + ? 71 + : 72; + arrowColor = + isBullish + ? bullishColor + : bearishColor; + bPrice = + isBullish + ? X_PRICE_LOW + : X_PRICE_HIGH; + + // + XCBarArrowObject *iObj; + iObj = new XCBarArrowObject(); + isCreated = iObj.CreateByBar( + chartID, + bName, + subWindow, + arrowCode, + conditions.startZones[i].breakerBar, + bPrice // + ); + if (isCreated) + { + // + iObj.ArrowColor(arrowColor); + + // + mObjects.Add(iObj); + } + } + + // + bool hasMomentumBar = conditions.startZones[i].momentumBar.IsValid(); + if (hasMomentumBar) + { + // + bSuffix = ToMD5(conditions.startZones[i].momentumBar.GetTag()); + bName = + (isBullish + ? "BULL_MOMENTUM" + : "BEAR_MOMENTUM") + + "_" + bSuffix; + arrowCode = + isBullish + ? 233 + : 234; + arrowColor = + isBullish + ? bullishColor + : bearishColor; + bPrice = + isBullish + ? X_PRICE_LOW + : X_PRICE_HIGH; + + // + XCBarArrowObject *iObj; + iObj = new XCBarArrowObject(); + isCreated = iObj.CreateByBar( + chartID, + bName, + subWindow, + arrowCode, + conditions.startZones[i].momentumBar, + bPrice // + ); + if (isCreated) + { + // + iObj.ArrowColor(arrowColor); + + // + mObjects.Add(iObj); + } + } + + // + bool hasRejectionBar = conditions.startZones[i].rejectionBar.IsValid(); + if (hasRejectionBar) + { + // + bSuffix = ToMD5(conditions.startZones[i].rejectionBar.GetTag()); + bName = + (isBullish + ? "BULL_REJECTION" + : "BEAR_REJECTION") + + "_" + bSuffix; + arrowCode = + isBullish + ? 241 + : 242; + arrowColor = + isBullish + ? bullishColor + : bearishColor; + bPrice = + isBullish + ? X_PRICE_LOW + : X_PRICE_HIGH; + + // + XCBarArrowObject *iObj; + iObj = new XCBarArrowObject(); + isCreated = iObj.CreateByBar( + chartID, + bName, + subWindow, + arrowCode, + conditions.startZones[i].rejectionBar, + bPrice // + ); + if (isCreated) + { + // + iObj.ArrowColor(arrowColor); + + // + mObjects.Add(iObj); + } + } + + // + bool hasAppliedBox = conditions.startZones[i].appliedBox.IsValid(); + if (hasAppliedBox) + { + // + arrowColor = + IsBullish(conditions.startZones[i].appliedBox.dir) + ? bullishColor + : bearishColor; + + // + XCBoxObject *iObj; + isCreated = drawer.CreateBox( + conditions.startZones[i].appliedBox, + iObj // + ); + + // + if (isCreated) + { + // + iObj.BoxWidth(2); + iObj.BoxColor(arrowColor); + + // + mObjects.Add(iObj); + } + } + } + } + } + + // + protected: + // + + // + private: + // + // Props ... + CArrayObj mObjects; + CArrayObj mWorkingZoneObjects; + + /** + * Initialize ... + */ + void Init() + { + } + + /** + * DeInitialize ... + */ + void DeInit() + { + // + RemoveDraws(); + mConditions.Clean(); + RemoveWorkingZoneDraws(); + Clean(mConditionsCollection); + } + + // + // Helpers ... + + // + bool CalculateRiskReward( + ENUM_X121SMC_XWZ_PRIORITY priority, + double &reward, + double &amountPercent // + ) + { + // + bool result = false; + + // + reward = 0; + amountPercent = 0; + + // + result = priority != X121SMC_XWZ_PRIORITY_NONE; + if (!result) + { + return result; + } + + // + switch (priority) + { + // + case X121SMC_XWZ_PRIORITY_STRONG_HIGH: + // + reward = 6; + amountPercent = 2; + break; + + // + case X121SMC_XWZ_PRIORITY_HIGH: + // + reward = 4; + amountPercent = 2; + break; + + // + case X121SMC_XWZ_PRIORITY_REGULAR: + // + reward = 3; + amountPercent = 1.5; + break; + + // + case X121SMC_XWZ_PRIORITY_LOW: + // + reward = 2; + amountPercent = 1; + break; + + // + case X121SMC_XWZ_PRIORITY_WEAK: + // + reward = 1; + amountPercent = 0.5; + break; + } + + // + result = + // + reward > 0 && + amountPercent > 0 + // + ; + + // + return result; + } + + // +}; + +// \ No newline at end of file diff --git a/BKPS/14031206/Documents/BKP/x-121.smc.xwz.signal.class.mq5 b/BKPS/14031206/Documents/BKP/x-121.smc.xwz.signal.class.mq5 new file mode 100644 index 0000000..24a476f --- /dev/null +++ b/BKPS/14031206/Documents/BKP/x-121.smc.xwz.signal.class.mq5 @@ -0,0 +1,2725 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 X121 SMC Signal Class +// ------------------------------------------------- +// Name: XWZ +// Description: provide all Signalling 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 + +// +// Imports ... +#include "../Classes/x-121.smc.market.cycle.helper.class.mq5" +#include "../Libraries/x-121.smc.guard.lib.mq5" +#include "../Libraries/x-121.smc.lib.mq5" +#include "./x-121.smc.xwz.signal.lib.mq5" + +// +// Definition ... +class XCX121SMCXWZSignalDetector : public XCBase +{ + // + public: + // + // Props ... + X121SMCStrategyXWZSignalConditions mConditions; + X121SMCStrategyXWZSignalConditions mConditionsCollection[]; + + // + // Constructor(s) ... + XCX121SMCXWZSignalDetector() + { + Init(); + } + + // + // Deconstructor ... + ~XCX121SMCXWZSignalDetector() + { + DeInit(); + } + + // + // + // + + // + // Detect Setup Conditions ... + bool DetectSignalSetup( + // + string _symbol, + ENUM_TIMEFRAMES _period, + // + XC121SMCCycleHelper *decisionCycleHelper, + XC121SMCCycleHelper *analyseCycleHelper, + XC121SMCCycleHelper *consolidationCycleHelper, + XC121SMCCycleHelper *visionCycleHelper + // + ) + { + // + bool result = false; + + // + // Validate Cycle Helpers ... + result = + // + visionCycleHelper != NULL && + analyseCycleHelper != NULL && + decisionCycleHelper != NULL && + consolidationCycleHelper != NULL + // + ; + if (!result) + { + // + mConditions.Clean(); + + // + return result; + } + + // + bool isBullish = false; + bool isBearish = false; + + // + int zIndex = 0; + int cIndex = zIndex + 1; + int pIndex = cIndex + 1; + int ppIndex = pIndex + 1; + + // + int loopback = 10; + + // + string symbol = _symbol; + ENUM_TIMEFRAMES period = _period; + + // + mConditions.symbol = symbol; + mConditions.period = period; + + // + double ask = GetAsk(symbol); + double bid = GetBid(symbol); + datetime cTime = TimeCurrent(); + double points = GetPoints(symbol); + + // + double target = 0; + + // + // Cycles Conditions ... + + // + // Decision ... + ENUM_XPOI_EVENTS decisionPoiEvents[]; + ENUM_X_CYCLE_EVENTS decisionCycleEvents[]; + X121SMCCycleConditions decisionConditions; + result = decisionCycleHelper.GetConditions( + decisionCycleEvents, + decisionPoiEvents, + decisionConditions, + zIndex, + loopback // + ); + if (!result) + { + // + mConditions.Clean(); + + // + return result; + } + + // + // Analyse ... + ENUM_XPOI_EVENTS analysePoiEvents[]; + ENUM_X_CYCLE_EVENTS analyseCycleEvents[]; + X121SMCCycleConditions analyseConditions; + result = analyseCycleHelper.GetConditions( + analyseCycleEvents, + analysePoiEvents, + analyseConditions, + zIndex, + loopback // + ); + if (!result) + { + // + mConditions.Clean(); + + // + return result; + } + + // + // Consolidation ... + ENUM_XPOI_EVENTS consolidationPoiEvents[]; + ENUM_X_CYCLE_EVENTS consolidationCycleEvents[]; + X121SMCCycleConditions consolidationConditions; + result = consolidationCycleHelper.GetConditions( + consolidationCycleEvents, + consolidationPoiEvents, + consolidationConditions, + zIndex, + loopback // + ); + if (!result) + { + // + mConditions.Clean(); + + // + return result; + } + + // + // Vision ... + ENUM_XPOI_EVENTS visionPoiEvents[]; + ENUM_X_CYCLE_EVENTS visionCycleEvents[]; + X121SMCCycleConditions visionConditions; + result = visionCycleHelper.GetConditions( + visionCycleEvents, + visionPoiEvents, + visionConditions, + zIndex, + loopback // + ); + if (!result) + { + // + mConditions.Clean(); + + // + return result; + } + + // + // Cycles POI States ... + XPOIState decisionState = decisionConditions.state; + XPOIState analyseState = analyseConditions.state; + XPOIState consolidationState = consolidationConditions.state; + XPOIState visionState = visionConditions.state; + + // + // Cycle X121Conditions ... + X121Conditions decisionXConditions = decisionConditions.x121Conditions; + X121Conditions analyseXConditions = analyseConditions.x121Conditions; + X121Conditions consolidationXConditions = consolidationConditions.x121Conditions; + X121Conditions visionXConditions = visionConditions.x121Conditions; + + // + // Setup Conditions ... + + // + // Check Working Zone ... + bool hasWorkingZone = mConditions.HasWorkingZone(); + if (!hasWorkingZone) + { + // + hasWorkingZone = mConditions.ExtractWorkingZone( + visionState, + consolidationState, + analyseState, + zIndex // + ); + } + + // + result = hasWorkingZone; + if (!result) + { + // + Clean(visionPoiEvents); + Clean(analysePoiEvents); + Clean(decisionPoiEvents); + Clean(visionCycleEvents); + Clean(analyseCycleEvents); + Clean(decisionCycleEvents); + Clean(consolidationPoiEvents); + Clean(consolidationCycleEvents); + + // + visionState.Clean(); + analyseState.Clean(); + decisionState.Clean(); + visionConditions.Clean(); + analyseConditions.Clean(); + visionXConditions.Clean(); + consolidationState.Clean(); + decisionConditions.Clean(); + analyseXConditions.Clean(); + decisionXConditions.Clean(); + consolidationConditions.Clean(); + consolidationXConditions.Clean(); + + // + mConditions.Clean(); + + // + return result; + } + + // + mConditions.UpdateTo(cTime); + + // + // Check Working Zone still Alive ... + ENUM_X_DIRECTION destroyedDir = X_DIRECTION_NONE; + bool isWorkingZoneDestroyed = mConditions + .IsWorkingZoneDestroyed( + destroyedDir, + zIndex, + decisionState.period // + ); + if (isWorkingZoneDestroyed) + { + RemoveWorkingZoneDraws(); + } + + // + result = !isWorkingZoneDestroyed; + if (!result) + { + // + Clean(visionPoiEvents); + Clean(analysePoiEvents); + Clean(decisionPoiEvents); + Clean(visionCycleEvents); + Clean(analyseCycleEvents); + Clean(decisionCycleEvents); + Clean(consolidationPoiEvents); + Clean(consolidationCycleEvents); + + // + visionState.Clean(); + analyseState.Clean(); + decisionState.Clean(); + visionConditions.Clean(); + analyseConditions.Clean(); + visionXConditions.Clean(); + consolidationState.Clean(); + decisionConditions.Clean(); + analyseXConditions.Clean(); + decisionXConditions.Clean(); + consolidationConditions.Clean(); + consolidationXConditions.Clean(); + + // + mConditions.Clean(); + + // + return result; + } + + // + // Detecting Trend ... + ENUM_X_DIRECTION trend; + bool hasTrend = mConditions.DetectTrend( + trend, + period // + ); + bool hasBullishTrend = hasTrend && + IsBullish(trend); + bool hasBearishTrend = hasTrend && + IsBearish(trend); + result = hasTrend; + if (!result) + { + // + Clean(visionPoiEvents); + Clean(analysePoiEvents); + Clean(decisionPoiEvents); + Clean(visionCycleEvents); + Clean(analyseCycleEvents); + Clean(decisionCycleEvents); + Clean(consolidationPoiEvents); + Clean(consolidationCycleEvents); + + // + visionState.Clean(); + analyseState.Clean(); + decisionState.Clean(); + visionConditions.Clean(); + analyseConditions.Clean(); + visionXConditions.Clean(); + consolidationState.Clean(); + decisionConditions.Clean(); + analyseXConditions.Clean(); + decisionXConditions.Clean(); + consolidationConditions.Clean(); + consolidationXConditions.Clean(); + + // + mConditions.Clean(); + + // + return result; + } + + // + // bool hasStartZone = mConditions.DetectStartZones( + // trend, + // consolidationState, + // analyseState, + // decisionState, + // decisionCycleHelper // + // ); + + // + mConditions.UpdateTo(cTime); + + // + // Detect Condition Priority ... + ENUM_X121SMC_XWZ_PRIORITY bullishPriority; + ENUM_X121SMC_XWZ_PRIORITY bearishPriority; + mConditions.DetectPriority( + bullishPriority, + bearishPriority // + ); + + // + bool canLookupLong = bullishPriority != X121SMC_XWZ_PRIORITY_NONE && + bullishPriority != X121SMC_XWZ_PRIORITY_WEAK; + bool canLookupShort = bearishPriority != X121SMC_XWZ_PRIORITY_NONE && + bearishPriority != X121SMC_XWZ_PRIORITY_WEAK; + bool isPriorityPassed = + hasBullishTrend + ? canLookupLong + : hasBearishTrend + ? canLookupShort + : false; + + // + // Here we are Make sure we have Correct: + // - WorkSpace ... + // - Trend ... + // - What we looking for: Long or Short ... + // - Priority ... + + // + double pivot = 0; + double point = 0; + ENUM_X_DIRECTION conditionsDir = X_DIRECTION_NONE; + + // + // Detect Start Zone Conditions ... + bool hasConditions = mConditions + .HasConditions( + pivot, + point, + conditionsDir, + decisionState, + zIndex, + decisionState.period // + ); + result = hasConditions; + if (!result) + { + // + Clean(visionPoiEvents); + Clean(analysePoiEvents); + Clean(decisionPoiEvents); + Clean(visionCycleEvents); + Clean(analyseCycleEvents); + Clean(decisionCycleEvents); + Clean(consolidationPoiEvents); + Clean(consolidationCycleEvents); + + // + visionState.Clean(); + analyseState.Clean(); + decisionState.Clean(); + visionConditions.Clean(); + analyseConditions.Clean(); + visionXConditions.Clean(); + consolidationState.Clean(); + decisionConditions.Clean(); + analyseXConditions.Clean(); + decisionXConditions.Clean(); + consolidationConditions.Clean(); + consolidationXConditions.Clean(); + + // + return result; + } + + // + isBullish = IsBullish(conditionsDir); + isBearish = IsBearish(conditionsDir); + + // + double reward; + double amountPercent; + ENUM_X121SMC_XWZ_PRIORITY priority = + isBullish + ? bullishPriority + : bearishPriority; + bool hasRewardAmount = CalculateRiskReward( + priority, + reward, + amountPercent // + ); + + // + // Apply Traget ... + switch (priority) + { + // + case X121SMC_XWZ_PRIORITY_STRONG_HIGH: + // + target = + isBullish + ? mConditions.workingZone.quarter3 + : mConditions.workingZone.quarter1; + break; + + // + case X121SMC_XWZ_PRIORITY_HIGH: + // + target = + isBullish + ? mConditions.workingZone.quarter3 + : mConditions.workingZone.quarter1; + break; + + // + case X121SMC_XWZ_PRIORITY_REGULAR: + // + target = + isBullish + ? mConditions.workingZone.quarter2 + : mConditions.workingZone.quarter2; + break; + + // + case X121SMC_XWZ_PRIORITY_LOW: + // + target = + isBullish + ? mConditions.workingZone.quarter1 + : mConditions.workingZone.quarter3; + break; + + // + default: + target = 0; + break; + } + + // + bool hasLastBullishConsolidationZone = false; + bool hasLastBearishConsolidationZone = false; + bool hasPrevBullishConsolidationZone = false; + bool hasPrevBearishConsolidationZone = false; + XConsolidationZone lastBullishConsolidationZone; + XConsolidationZone lastBearishConsolidationZone; + XConsolidationZone prevBullishConsolidationZone; + XConsolidationZone prevBearishConsolidationZone; + bool isLastBullishConsolidationZoneInsidePivot = false; + bool isPrevBullishConsolidationZoneInsidePivot = false; + bool isLastBearishConsolidationZoneInsidePivot = false; + bool isPrevBearishConsolidationZoneInsidePivot = false; + bool hasConsolidationZones = decisionCycleHelper.HasConsolidationZones(); + if (hasConsolidationZones) + { + // + int cZCount = 0; + XConsolidationZone tmp[]; + + // + cZCount = decisionCycleHelper + .FillConsolidationZones( + X_DIRECTION_BULLISH, + tmp // + ); + if (IsValidSize(cZCount)) + { + // + lastBullishConsolidationZone = tmp[cZCount - 1]; + if (cZCount >= 2) + { + prevBullishConsolidationZone = tmp[cZCount - 2]; + } + } + + // + Clean(tmp); + cZCount = decisionCycleHelper + .FillConsolidationZones( + X_DIRECTION_BEARISH, + tmp // + ); + if (IsValidSize(cZCount)) + { + // + lastBearishConsolidationZone = tmp[cZCount - 1]; + if (cZCount >= 2) + { + prevBearishConsolidationZone = tmp[cZCount - 2]; + } + } + + // + Clean(tmp); + + // + hasLastBullishConsolidationZone = lastBullishConsolidationZone.IsValid(); + hasLastBearishConsolidationZone = lastBearishConsolidationZone.IsValid(); + hasPrevBullishConsolidationZone = prevBullishConsolidationZone.IsValid(); + hasPrevBearishConsolidationZone = prevBearishConsolidationZone.IsValid(); + + // + isLastBullishConsolidationZoneInsidePivot = + // + hasLastBullishConsolidationZone && + (lastBullishConsolidationZone.lower < point && + lastBullishConsolidationZone.upper > pivot) + // + ; + isPrevBullishConsolidationZoneInsidePivot = + // + hasPrevBullishConsolidationZone && + (prevBullishConsolidationZone.lower < point && + prevBullishConsolidationZone.upper > pivot) + // + ; + + // + isLastBearishConsolidationZoneInsidePivot = + // + hasLastBearishConsolidationZone && + (lastBearishConsolidationZone.upper > point && + lastBearishConsolidationZone.lower < pivot) + // + ; + isPrevBearishConsolidationZoneInsidePivot = + // + hasPrevBearishConsolidationZone && + (prevBearishConsolidationZone.upper > point && + prevBearishConsolidationZone.lower < pivot) + // + ; + } + + // + bool isConsolidationZonePassed = + isBullish + // + ? (point > 0 && + pivot > 0 && + pivot < point && + hasPrevBullishConsolidationZone && + point > prevBullishConsolidationZone.upper && + (isLastBullishConsolidationZoneInsidePivot || + isPrevBullishConsolidationZoneInsidePivot)) + : (point > 0 && + pivot > 0 && + pivot > point && + hasPrevBearishConsolidationZone && + point < prevBearishConsolidationZone.lower && + (isLastBearishConsolidationZoneInsidePivot || + isPrevBearishConsolidationZoneInsidePivot)) + // + ; + + // + result = hasConditions && + hasRewardAmount && + isPriorityPassed && + trend == conditionsDir; // && + // isConsolidationZonePassed; + if (!result) + { + // + Clean(visionPoiEvents); + Clean(analysePoiEvents); + Clean(decisionPoiEvents); + Clean(visionCycleEvents); + Clean(analyseCycleEvents); + Clean(decisionCycleEvents); + Clean(consolidationPoiEvents); + Clean(consolidationCycleEvents); + + // + visionState.Clean(); + analyseState.Clean(); + decisionState.Clean(); + visionConditions.Clean(); + analyseConditions.Clean(); + visionXConditions.Clean(); + consolidationState.Clean(); + decisionConditions.Clean(); + analyseXConditions.Clean(); + decisionXConditions.Clean(); + consolidationConditions.Clean(); + consolidationXConditions.Clean(); + + // + lastBullishConsolidationZone.Clean(); + lastBearishConsolidationZone.Clean(); + prevBullishConsolidationZone.Clean(); + prevBearishConsolidationZone.Clean(); + + // + mConditions.Clean(); + + // + return result; + } + + // + mConditions.pivot = pivot; + mConditions.point = point; + mConditions.reward = reward; + mConditions.target = target; + mConditions.setupTime = cTime; + mConditions.priority = priority; + mConditions.dir = conditionsDir; + mConditions.amountPercent = amountPercent; + + // + mConditions.UpdateTo(cTime); + + // + Clean(visionPoiEvents); + Clean(analysePoiEvents); + Clean(decisionPoiEvents); + Clean(visionCycleEvents); + Clean(analyseCycleEvents); + Clean(decisionCycleEvents); + Clean(consolidationPoiEvents); + Clean(consolidationCycleEvents); + + // + visionState.Clean(); + analyseState.Clean(); + decisionState.Clean(); + visionConditions.Clean(); + analyseConditions.Clean(); + visionXConditions.Clean(); + consolidationState.Clean(); + decisionConditions.Clean(); + analyseXConditions.Clean(); + decisionXConditions.Clean(); + consolidationConditions.Clean(); + consolidationXConditions.Clean(); + + // + lastBullishConsolidationZone.Clean(); + lastBearishConsolidationZone.Clean(); + prevBullishConsolidationZone.Clean(); + prevBearishConsolidationZone.Clean(); + + // + return result; + } + + // + // Detect Trigger Conditions ... + bool DetectSignalTrigger( + // + X121SMCStrategyXWZSignalConditions &conditions, + // + string _symbol, + ENUM_TIMEFRAMES _period, + // + XC121SMCCycleHelper *decisionCycleHelper, + XC121SMCCycleHelper *analyseCycleHelper, + XC121SMCCycleHelper *consolidationCycleHelper, + XC121SMCCycleHelper *visionCycleHelper, + // + int maxAllowedSetupAge = 30 + // + ) + { + // + bool result = false; + + // + result = + // + visionCycleHelper != NULL && + analyseCycleHelper != NULL && + decisionCycleHelper != NULL && + consolidationCycleHelper != NULL + // + ; + if (!result) + { + return result; + } + + // + result = conditions.IsSetuped(); + if (!result) + { + return result; + } + + // + datetime setupTime = conditions.setupTime; + ENUM_X_DIRECTION setupDir = conditions.dir; + + // + bool isBullish = IsBullish(setupDir); + bool isBearish = IsBearish(setupDir); + + // + int zIndex = 0; + int cIndex = zIndex + 1; + int pIndex = cIndex + 1; + int ppIndex = pIndex + 1; + + // + int loopback = 10; + + // + string symbol = _symbol; + ENUM_TIMEFRAMES period = _period; + + // + XOHCL zBar; + result = decisionCycleHelper.GetBar( + zBar, + zIndex // + ); + if (!result) + { + return result; + } + + // + XOHCL cBar; + result = decisionCycleHelper.GetBar( + cBar, + cIndex // + ); + if (!result) + { + return result; + } + + // + XOHCL pBar; + result = decisionCycleHelper.GetBar( + pBar, + pIndex // + ); + if (!result) + { + return result; + } + + // + double ask = GetAsk(symbol); + double bid = GetBid(symbol); + datetime cTime = TimeCurrent(); + double points = GetPoints(symbol); + + // + int swingLoopback = 9; + double ll = cBar.FindLowest(swingLoopback, MODE_LOW); + double hh = cBar.FindHighest(swingLoopback, MODE_HIGH); + double llDown = cBar.FindLowesttDown(swingLoopback); + double hhUp = cBar.FindHighestUp(swingLoopback); + + // + // Cycles Conditions ... + + // + // Decision ... + ENUM_XPOI_EVENTS decisionPoiEvents[]; + ENUM_X_CYCLE_EVENTS decisionCycleEvents[]; + X121SMCCycleConditions decisionConditions; + result = decisionCycleHelper.GetConditions( + decisionCycleEvents, + decisionPoiEvents, + decisionConditions, + zIndex, + loopback // + ); + if (!result) + { + // + // Cleanup ... + zBar.Clean(); + cBar.Clean(); + pBar.Clean(); + + // + Clean(decisionPoiEvents); + Clean(decisionCycleEvents); + + // + decisionConditions.Clean(); + + // + return result; + } + + // + // Cycles POI States ... + XPOIState decisionState = decisionConditions.state; + + // + // Cycle X121Conditions ... + X121Conditions decisionXConditions = decisionConditions.x121Conditions; + + // + // Trigger Conditions ... + + // + double point = conditions.point; + bool isPointBreaked = IsBarBreak( + point, + setupDir, + cBar // + ); + + // + // Summary ... + + // + isBullish = + // + isBullish && + isPointBreaked && + cBar.IsBullish() + // + ; + + // + isBearish = + // + isBearish && + isPointBreaked && + cBar.IsBearish() + // + ; + + // + result = isBullish || + isBearish; + if (!result) + { + // + // Cleanup Setup Conditions ... + int setupAge = conditions.GetSetupAge(); + if (IsValidSize(setupAge) && + IsValidSize(maxAllowedSetupAge) && + setupAge >= maxAllowedSetupAge) + { + conditions.Clean(); + } + + // + // Cleanup ... + zBar.Clean(); + cBar.Clean(); + pBar.Clean(); + + // + Clean(decisionPoiEvents); + Clean(decisionCycleEvents); + + // + decisionState.Clean(); + decisionConditions.Clean(); + decisionXConditions.Clean(); + + // + return result; + } + + // + // Detect Nearest Pivot Point ... + + // + double entry = GetEntry( + conditions.symbol, + setupDir // + ); + + // + // Manipulate SL Based on Consolidation Zones ... + + // + double sls[]; + Add( + conditions.pivot, + sls // + ); + + // + // TODO: Add Consolidation Zone for SLs ... + + // + double iAtr = decisionXConditions.atrBuffer[1]; + iAtr *= 2; + + // + double slsMin = GetMin(sls); + double slsMax = GetMax(sls); + + // + double sl = isBullish + ? slsMin - iAtr + : slsMax + iAtr; + double risk = MathAbs(entry - sl); + + // + // Filling Conditions Props ... + conditions.sl = sl; + conditions.triggerTime = cTime; + conditions.type = isBullish + ? X_POSITION_TYPE_LONG + : X_POSITION_TYPE_SHORT; + + // + // Cleanup ... + zBar.Clean(); + cBar.Clean(); + pBar.Clean(); + + // + Clean(decisionPoiEvents); + Clean(decisionCycleEvents); + + // + decisionState.Clean(); + decisionConditions.Clean(); + decisionXConditions.Clean(); + + // + return result; + } + + // + // Detect Guards ... + bool DetectGuards( + // + X121SMCGuard &guards[], + const XPosition &positions[], + // + XC121SMCCycleHelper *decisionCycleHelper, + XC121SMCCycleHelper *analyseCycleHelper, + XC121SMCCycleHelper *consolidationCycleHelper, + XC121SMCCycleHelper *visionCycleHelper + // + ) + { + // + bool result = false; + + // + Clean(guards); + + // + bool isCycleHelpersValid = + // + visionCycleHelper != NULL && + analyseCycleHelper != NULL && + decisionCycleHelper != NULL && + consolidationCycleHelper != NULL + // + ; + + // + result = isCycleHelpersValid; + if (!result) + { + return result; + } + + // + int count = ArraySize(positions); + result = IsValidSize(count); + if (!result) + { + return result; + } + + // + string symbol = decisionCycleHelper.GetSymbol(); + ENUM_TIMEFRAMES period = decisionCycleHelper.GetPeriod(); + string provider = ToString(X_121_SMC_PROVIDER_XWZ); + + // + XPosition ownPositions[]; + XPosition ownLongPositions[]; + XPosition ownShortPositions[]; + for (int i = 0; i < count; i++) + { + // + XPosition iPosition = positions[i]; + bool isOwn = iPosition + .IsFiltersPassed( + symbol, + provider, + NULL, + X_POSITION_TYPE_ALL, + iPosition.magic // + ); + if (isOwn) + { + // + AddRef( + iPosition, + ownPositions // + ); + + // + bool isLong = IsLong(positions[i].type); + if (isLong) + { + // + AddRef( + iPosition, + ownLongPositions // + ); + } + else + { + // + AddRef( + iPosition, + ownShortPositions // + ); + } + } + } + + // + count = ArraySize(ownPositions); + + // + int longsCount = ArraySize(ownLongPositions); + bool hasLongs = IsValidSize(longsCount); + + // + int shortsCount = ArraySize(ownShortPositions); + bool hasShorts = IsValidSize(shortsCount); + + // + result = IsValidSize(count); + if (!result) + { + // + Clean(ownPositions); + Clean(ownLongPositions); + Clean(ownShortPositions); + + // + return result; + } + + // + // + // + + // + // Get Global and Common Guards ... + + // + ENUM_X_121_SMC_GUARD_ACTIONS ignoreGuards[1] = { + X_121_SMC_GUARD_ACTION_TRAIL_STOP // + }; + result = DetectX121SMCGuards( + provider, + guards, + positions, + decisionCycleHelper, + analyseCycleHelper, + consolidationCycleHelper, + visionCycleHelper, + // + ignoreGuards + // + ); + + // + // + // + + // + // Get Custom Implemented Guards ... + + // + // Here we Are Sure there is Positions to Guard ... + // based on Current Provider ... + + // + // Detect Required Data for Analyse Market to Guard Positions ... + + // + int zIndex = 0; + int cIndex = zIndex + 1; + int pIndex = cIndex + 1; + int ppIndex = pIndex + 1; + + // + int loopback = 10; + + // + XOHCL zBar; + result = zBar.Init( + symbol, + period, + zIndex // + ); + if (!result) + { + // + result = HasChild(guards); + return result; + } + + // + XOHCL cBar; + result = cBar.Init( + symbol, + period, + cIndex // + ); + if (!result) + { + // + zBar.Clean(); + result = HasChild(guards); + return result; + } + + // + XOHCL pBar; + result = pBar.Init( + symbol, + period, + pIndex // + ); + if (!result) + { + // + zBar.Clean(); + cBar.Clean(); + result = HasChild(guards); + return result; + } + + // + XOHCL ppBar; + result = ppBar.Init( + symbol, + period, + ppIndex // + ); + if (!result) + { + // + zBar.Clean(); + cBar.Clean(); + pBar.Clean(); + result = HasChild(guards); + return result; + } + + // + double ask = GetAsk(symbol); + double bid = GetBid(symbol); + datetime cTime = TimeCurrent(); + double points = GetPoints(symbol); + + // + + // + // Cycles Conditions ... + + // + // Decision ... + ENUM_XPOI_EVENTS decisionPoiEvents[]; + ENUM_X_CYCLE_EVENTS decisionCycleEvents[]; + X121SMCCycleConditions decisionConditions; + result = decisionCycleHelper.GetConditions( + decisionCycleEvents, + decisionPoiEvents, + decisionConditions, + zIndex, + loopback // + ); + if (!result) + { + // + zBar.Clean(); + cBar.Clean(); + pBar.Clean(); + ppBar.Clean(); + result = HasChild(guards); + return result; + } + + // + // Analyse ... + ENUM_XPOI_EVENTS analysePoiEvents[]; + ENUM_X_CYCLE_EVENTS analyseCycleEvents[]; + X121SMCCycleConditions analyseConditions; + result = analyseCycleHelper.GetConditions( + analyseCycleEvents, + analysePoiEvents, + analyseConditions, + zIndex, + loopback // + ); + if (!result) + { + // + zBar.Clean(); + cBar.Clean(); + pBar.Clean(); + ppBar.Clean(); + + // + Clean(decisionPoiEvents); + Clean(decisionCycleEvents); + + // + decisionConditions.Clean(); + + // + result = HasChild(guards); + return result; + } + + // + // Consolidation ... + ENUM_XPOI_EVENTS consolidationPoiEvents[]; + ENUM_X_CYCLE_EVENTS consolidationCycleEvents[]; + X121SMCCycleConditions consolidationConditions; + result = consolidationCycleHelper.GetConditions( + consolidationCycleEvents, + consolidationPoiEvents, + consolidationConditions, + zIndex, + loopback // + ); + if (!result) + { + // + zBar.Clean(); + cBar.Clean(); + pBar.Clean(); + ppBar.Clean(); + + // + Clean(decisionPoiEvents); + Clean(decisionCycleEvents); + + // + decisionConditions.Clean(); + + // + Clean(analysePoiEvents); + Clean(analyseCycleEvents); + + // + analyseConditions.Clean(); + + // + result = HasChild(guards); + return result; + } + + // + // Vision ... + ENUM_XPOI_EVENTS visionPoiEvents[]; + ENUM_X_CYCLE_EVENTS visionCycleEvents[]; + X121SMCCycleConditions visionConditions; + result = visionCycleHelper.GetConditions( + visionCycleEvents, + visionPoiEvents, + visionConditions, + zIndex, + loopback // + ); + if (!result) + { + // + zBar.Clean(); + cBar.Clean(); + pBar.Clean(); + ppBar.Clean(); + + // + Clean(decisionPoiEvents); + Clean(decisionCycleEvents); + + // + decisionConditions.Clean(); + + // + Clean(analysePoiEvents); + Clean(analyseCycleEvents); + + // + analyseConditions.Clean(); + + // + Clean(consolidationPoiEvents); + Clean(consolidationCycleEvents); + + // + consolidationConditions.Clean(); + + // + result = HasChild(guards); + return result; + } + + // + // Cycles POI States ... + XPOIState decisionState = decisionConditions.state; + XPOIState analyseState = analyseConditions.state; + XPOIState consolidationState = consolidationConditions.state; + XPOIState visionState = visionConditions.state; + + // + // Cycle X121Conditions ... + X121Conditions decisionXConditions = decisionConditions.x121Conditions; + X121Conditions analyseXConditions = analyseConditions.x121Conditions; + X121Conditions consolidationXConditions = consolidationConditions.x121Conditions; + X121Conditions visionXConditions = visionConditions.x121Conditions; + + // + // + // + + // + // Detect Consolidation Zone ... + + // + XBoxZone lastBullishBox; + XBoxZone prevLastBullishBox; + bool hasLastBullishBox = false; + bool hasPrevLastBullishBox = false; + XConsolidationZone lastBullishZone; + bool isLastBullishAbovePrev = false; + bool isLastBullishBelowPrev = false; + XConsolidationZone prevLastBullishZone; + + // + XBoxZone lastBearishBox; + XBoxZone prevLastBearishBox; + bool hasLastBearishBox = false; + bool hasPrevLastBearishBox = false; + XConsolidationZone lastBearishZone; + bool isLastBearishAbovePrev = false; + bool isLastBearishBelowPrev = false; + XConsolidationZone prevLastBearishZone; + + // + int bullishConsolidationZonesCount = 0; + int bearishConsolidationZonesCount = 0; + bool hasBullishConsolidationZones = false; + bool hasBearishConsolidationZones = false; + XConsolidationZone bullishConsolidationZones[]; + XConsolidationZone bearishConsolidationZones[]; + bool hasConsolidationZones = decisionCycleHelper.HasConsolidationZones(); + int consolidationZonesCount = decisionCycleHelper.CountConsolidationZones(); + if (hasConsolidationZones) + { + // + bullishConsolidationZonesCount = decisionCycleHelper + .FillConsolidationZones( + X_DIRECTION_BULLISH, + bullishConsolidationZones // + ); + hasBullishConsolidationZones = IsValidSize(bullishConsolidationZonesCount); + + // + bearishConsolidationZonesCount = decisionCycleHelper + .FillConsolidationZones( + X_DIRECTION_BEARISH, + bearishConsolidationZones // + ); + hasBearishConsolidationZones = IsValidSize(bearishConsolidationZonesCount); + + // + // + // + + // + if (hasBullishConsolidationZones && + bullishConsolidationZonesCount >= 2) + { + // + lastBullishZone = bullishConsolidationZones[bullishConsolidationZonesCount - 1]; + prevLastBullishZone = bullishConsolidationZones[bullishConsolidationZonesCount - 2]; + + // + hasLastBullishBox = ToBox( + lastBullishBox, + lastBullishZone // + ); + hasPrevLastBullishBox = ToBox( + prevLastBullishBox, + prevLastBullishZone // + ); + + // + isLastBullishAbovePrev = hasLastBullishBox && + hasPrevLastBullishBox && + IsBoxAbove( + lastBullishBox, + prevLastBullishBox // + ); + + // + isLastBullishBelowPrev = hasLastBullishBox && + hasPrevLastBullishBox && + IsBoxBelow( + lastBullishBox, + prevLastBullishBox // + ); + } + + // + if (hasBearishConsolidationZones && + bearishConsolidationZonesCount >= 2) + { + // + lastBearishZone = bearishConsolidationZones[bearishConsolidationZonesCount - 1]; + prevLastBearishZone = bearishConsolidationZones[bearishConsolidationZonesCount - 2]; + + // + hasLastBearishBox = ToBox( + lastBearishBox, + lastBearishZone // + ); + hasPrevLastBearishBox = ToBox( + prevLastBearishBox, + prevLastBearishZone // + ); + + // + isLastBearishAbovePrev = hasLastBearishBox && + hasPrevLastBearishBox && + IsBoxAbove( + lastBearishBox, + prevLastBearishBox // + ); + + // + isLastBearishBelowPrev = hasLastBearishBox && + hasPrevLastBearishBox && + IsBoxBelow( + lastBearishBox, + prevLastBearishBox // + ); + } + + // + } + + // + // Detect High Probability Swings ... + bool isSwingLow = + // + cBar.low > pBar.low && + ppBar.low > pBar.low && + // + zBar.low > pBar.low + // + ; + bool isSwingHigh = + // + cBar.high < pBar.high && + ppBar.high < pBar.high && + // + zBar.high < pBar.high + // + ; + bool isStrongSwingLow = + pBar.IsBullish() && + pBar.GetLowShadow() >= pBar.GetBody() * 2; + bool isStrongSwingHigh = + pBar.IsBearish() && + pBar.GetHighShadow() >= pBar.GetBody() * 2; + + // + bool isStrongSwingLowAboveLastBullishBox = + isStrongSwingLow && + hasLastBullishBox && + pBar.low > lastBullishBox.upper; + + // + bool isStrongSwingHighBelowLastBearishBox = + isStrongSwingHigh && + hasLastBearishBox && + pBar.high < lastBearishBox.lower; + + // + // Here We Have all Requirements for Guarding Positions ... + + // + // Available Guards: + // X_121_SMC_GUARD_ACTION_NONE + // X_121_SMC_GUARD_ACTION_CLOSE + // X_121_SMC_GUARD_ACTION_CLOSE_ALL + // X_121_SMC_GUARD_ACTION_CLOSE_LONGS + // X_121_SMC_GUARD_ACTION_CLOSE_SHORTS + // X_121_SMC_GUARD_ACTION_PARTIAL_CLOSE + // X_121_SMC_GUARD_ACTION_TRAIL_STOP + // X_121_SMC_GUARD_ACTION_TRAIL_TARGET + // X_121_SMC_GUARD_ACTION_HEDGE + + // + // X_121_SMC_GUARD_ACTION_CLOSE: + // Close Specified Position on Specified Conditions ... + + // + // X_121_SMC_GUARD_ACTION_CLOSE_ALL: + // Close All Positions on Specified Conditions ... + + // + // X_121_SMC_GUARD_ACTION_CLOSE_LONGS: + // Close All Long Positions on Specified Conditions ... + + // + // X_121_SMC_GUARD_ACTION_CLOSE_SHORTS: + // Close All Short Positions on Specified Conditions ... + + // + // X_121_SMC_GUARD_ACTION_PARTIAL_CLOSE: + // Partial Close Specified Position on Specified Conditions ... + + // + // X_121_SMC_GUARD_ACTION_TRAIL_STOP: + // Trail Stop Specified Position on Specified Conditions ... + + // + // X_121_SMC_GUARD_ACTION_TRAIL_TARGET: + // Trail Target Specified Position on Specified Conditions ... + + // + // X_121_SMC_GUARD_ACTION_HEDGE: + // Hedge all Positions on Specified Conditions ... + + // + // Cleanup Collections ... + + // + Clean(ownPositions); + Clean(ownLongPositions); + Clean(ownShortPositions); + + // + zBar.Clean(); + cBar.Clean(); + pBar.Clean(); + ppBar.Clean(); + + // + Clean(visionPoiEvents); + Clean(analysePoiEvents); + Clean(visionCycleEvents); + Clean(decisionPoiEvents); + Clean(analyseCycleEvents); + Clean(decisionCycleEvents); + Clean(consolidationPoiEvents); + Clean(consolidationCycleEvents); + + // + visionState.Clean(); + analyseState.Clean(); + decisionState.Clean(); + visionConditions.Clean(); + analyseConditions.Clean(); + visionXConditions.Clean(); + decisionConditions.Clean(); + consolidationState.Clean(); + analyseXConditions.Clean(); + decisionXConditions.Clean(); + consolidationConditions.Clean(); + consolidationXConditions.Clean(); + + // + lastBullishBox.Clean(); + lastBearishBox.Clean(); + lastBullishZone.Clean(); + lastBearishZone.Clean(); + prevLastBullishBox.Clean(); + prevLastBearishBox.Clean(); + prevLastBullishZone.Clean(); + prevLastBearishZone.Clean(); + + // + count = ArraySize(guards); + result = IsValidSize(count); + + // + return result; + } + + // + // + // + + // + // Add Conditions to Conditions Collection ... + int AddConditionsIfNotExists( + int maxAllowed = 10 // + ) + { + // + int result = 0; + + // + bool isSetuped = IsValid(mConditions.setupTime) && + HasDirection(mConditions.dir); + if (!isSetuped) + { + return result; + } + + // + int count = ArraySize(mConditionsCollection); + if (IsValidSize(count)) + { + // + // Copy Original Items ... + X121SMCStrategyXWZSignalConditions tmpItems[]; + Copy( + mConditionsCollection, + tmpItems // + ); + + // + // Prese Item Data ... + bool isBullish = IsBullish(mConditions.dir); + + // + for (int i = 0; i < count; i++) + { + // + X121SMCStrategyXWZSignalConditions iItem = tmpItems[i]; + + // + bool canRemove = mConditions.dir == iItem.dir && + mConditions.pivot == iItem.pivot; + if (canRemove) + { + // + ArrayRemove( + mConditionsCollection, + i, + 1 // + ); + } + } + + // + Clean(tmpItems); + } + + // + AddRef( + mConditions, + mConditionsCollection // + ); + + // + // Remove Olds ... + CleanupArray( + mConditionsCollection, + maxAllowed // + ); + + // + result = ArraySize(mConditionsCollection); + + // + return result; + } + + // + // Draw Functions ... + // + + // + void RemoveDraws() + { + mObjects.Clear(); + } + + // + void RemoveWorkingZoneDraws() + { + mWorkingZoneObjects.Clear(); + } + + // + void DrawOrderBlock( + XCOrderBlock *ob, + XCPOIDrawer *drawer, + bool forWorkingZone = false // + ) + { + // + if (ob == NULL || + drawer == NULL) + { + return; + } + + // + ENUM_X_DIRECTION forDir = ob.GetDirection(); + + // + color bullishColor = drawer.BarBullishColor(); + color bearishColor = drawer.BarBearishColor(); + color forColor = IsBullish(forDir) + ? bullishColor + : bearishColor; + + // + // Draw Order Block ... + XCBaseObject *obj; + bool isCreated = drawer.CreateOrderBlock( + ob, + obj // + ); + if (isCreated) + { + // + if (forWorkingZone) + { + mWorkingZoneObjects.Add(obj); + } + else + { + mObjects.Add(obj); + } + } + + // + ulong chartID = drawer.ChartIdentification(); + int subWindow = drawer.SubWindowIdentification(); + + // + XOHCL startedBar; + ENUM_X_DIRECTION startedDir; + bool isStarted = ob.IsStarted( + forDir, + startedBar, + startedDir // + ); + if (isStarted) + { + // + datetime to = startedBar.time + (PeriodSeconds(startedBar.period)); + + // + XCOHCLObject *obj; + bool isCreated = drawer.CreateBar( + startedBar, + obj, + to // + ); + if (isCreated) + { + // + obj.BodyColor(clrYellow); + obj.HighShadowColor(clrYellow); + obj.LowShadowColor(clrYellow); + + // + obj.BodyStyle(STYLE_SOLID); + obj.HighShadowStyle(STYLE_SOLID); + obj.LowShadowStyle(STYLE_SOLID); + + // + if (forWorkingZone) + { + mWorkingZoneObjects.Add(obj); + } + else + { + mObjects.Add(obj); + } + } + + // + string startVLineName = "Start_" + ob.GetTag(); + + // + CChartObjectVLine *startVLine; + startVLine = new CChartObjectVLine(); + isCreated = startVLine.Create( + chartID, + startVLineName, + subWindow, + startedBar.time // + ); + if (isCreated) + { + // + startVLine.Color(forColor); + + // + if (forWorkingZone) + { + mWorkingZoneObjects.Add(startVLine); + } + else + { + mObjects.Add(startVLine); + } + } + } + } + + // + void DrawFairValueGap( + XCFVG *fvg, + XCPOIDrawer *drawer, + bool forWorkingZone = false // + ) + { + // + if (fvg == NULL || + drawer == NULL) + { + return; + } + + // + ENUM_X_DIRECTION forDir = fvg.GetDirection(); + + // + color bullishColor = drawer.BarBullishColor(); + color bearishColor = drawer.BarBearishColor(); + color forColor = IsBullish(forDir) + ? bullishColor + : bearishColor; + + // + // Draw Order Block ... + XCBaseObject *obj; + bool isCreated = drawer.CreateFairValueGap( + fvg, + obj // + ); + if (isCreated) + { + // + if (forWorkingZone) + { + mWorkingZoneObjects.Add(obj); + } + else + { + mObjects.Add(obj); + } + } + + // + ulong chartID = drawer.ChartIdentification(); + int subWindow = drawer.SubWindowIdentification(); + + // + XOHCL startedBar; + ENUM_X_DIRECTION startedDir; + bool isStarted = fvg.IsStarted( + forDir, + startedBar, + startedDir // + ); + if (isStarted) + { + // + datetime to = startedBar.time + (PeriodSeconds(startedBar.period)); + + // + XCOHCLObject *obj; + bool isCreated = drawer.CreateBar( + startedBar, + obj, + to // + ); + if (isCreated) + { + // + obj.BodyColor(clrYellow); + obj.HighShadowColor(clrYellow); + obj.LowShadowColor(clrYellow); + + // + obj.BodyStyle(STYLE_SOLID); + obj.HighShadowStyle(STYLE_SOLID); + obj.LowShadowStyle(STYLE_SOLID); + + // + if (forWorkingZone) + { + mWorkingZoneObjects.Add(obj); + } + else + { + mObjects.Add(obj); + } + } + + // + string startVLineName = "Start_" + fvg.GetTag(); + + // + CChartObjectVLine *startVLine; + startVLine = new CChartObjectVLine(); + isCreated = startVLine.Create( + chartID, + startVLineName, + subWindow, + startedBar.time // + ); + if (isCreated) + { + // + startVLine.Color(forColor); + + // + if (forWorkingZone) + { + mWorkingZoneObjects.Add(startVLine); + } + else + { + mObjects.Add(startVLine); + } + } + } + } + + // + void DrawWorkingZone( + X121SMCStrategyXWZSignalConditions &conditions, + XCPOIDrawer *drawer // + ) + { + // + if (drawer == NULL) + { + return; + } + + // + bool hasWorkingZone = conditions.HasWorkingZone(); + if (!hasWorkingZone) + { + return; + } + + // + string prefix = "WKZ_" + conditions.workingZone.symbol + ToString(conditions.workingZone.period) + "_"; + string tag = prefix + ToString(conditions.workingZone.upper) + "_" + ToString(conditions.workingZone.lower); + string suffix = ToMD5(tag); + + // + string upperName = prefix + "_Upper_" + suffix; + string lowerName = prefix + "_Lower_" + suffix; + string zoneUpperName = prefix + "_ZoneUpper_" + suffix; + string zoneLowerName = prefix + "_ZoneLower_" + suffix; + + // + string q1Name = prefix + "_Q1_" + suffix; + string q2Name = prefix + "_Q2_" + suffix; + string q3Name = prefix + "_Q3_" + suffix; + + // + ulong chartID = drawer.ChartIdentification(); + int subWindow = drawer.SubWindowIdentification(); + + // + bool isCreated = false; + + // + // Check For Trend Approced ... + bool isTrendApproved = conditions.HasOrderBlock() && + conditions.HasFairValueGap(); + if (isTrendApproved) + { + // + DrawOrderBlock( + conditions.orderBlock, + drawer, + true // + ); + + // + DrawFairValueGap( + conditions.fairValueGap, + drawer, + true // + ); + } + + // + XCSupplyZoneObject *iSupObj; + isCreated = drawer.CreateSupplyZone( + conditions.supplyZone, + iSupObj // + ); + if (isCreated) + { + mWorkingZoneObjects.Add(iSupObj); + } + + // + XCDemandZoneObject *iDemObj; + isCreated = drawer.CreateDemandZone( + conditions.demandZone, + iDemObj // + ); + if (isCreated) + { + mWorkingZoneObjects.Add(iDemObj); + } + + // + // Lower ... + CChartObjectTrend *lowerHLine; + lowerHLine = new CChartObjectTrend(); + isCreated = lowerHLine.Create( + chartID, + lowerName, + subWindow, + conditions.workingZone.from, + conditions.workingZone.lower, + conditions.workingZone.to, + conditions.workingZone.lower // + ); + if (isCreated) + { + // + lowerHLine.Color(clrLime); + mWorkingZoneObjects.Add(lowerHLine); + } + + // + CChartObjectTrend *upperHLine; + upperHLine = new CChartObjectTrend(); + isCreated = upperHLine.Create( + chartID, + upperName, + subWindow, + conditions.workingZone.from, + conditions.workingZone.upper, + conditions.workingZone.to, + conditions.workingZone.upper // + ); + if (isCreated) + { + // + upperHLine.Color(clrLime); + mWorkingZoneObjects.Add(upperHLine); + } + + // + CChartObjectTrend *zoneLowerHLine; + zoneLowerHLine = new CChartObjectTrend(); + isCreated = zoneLowerHLine.Create( + chartID, + zoneLowerName, + subWindow, + conditions.workingZone.from, + conditions.workingZone.zoneLower, + conditions.workingZone.to, + conditions.workingZone.zoneLower // + ); + if (isCreated) + { + // + zoneLowerHLine.Color(clrRed); + mWorkingZoneObjects.Add(zoneLowerHLine); + } + + // + CChartObjectTrend *zoneUpperHLine; + zoneUpperHLine = new CChartObjectTrend(); + isCreated = zoneUpperHLine.Create( + chartID, + zoneUpperName, + subWindow, + conditions.workingZone.from, + conditions.workingZone.zoneUpper, + conditions.workingZone.to, + conditions.workingZone.zoneUpper // + ); + if (isCreated) + { + // + zoneUpperHLine.Color(clrRed); + mWorkingZoneObjects.Add(zoneUpperHLine); + } + + // + CChartObjectTrend *quarter1HLine; + quarter1HLine = new CChartObjectTrend(); + isCreated = quarter1HLine.Create( + chartID, + q1Name, + subWindow, + conditions.workingZone.from, + conditions.workingZone.quarter1, + conditions.workingZone.to, + conditions.workingZone.quarter1 // + ); + if (isCreated) + { + // + quarter1HLine.Color(clrYellow); + mWorkingZoneObjects.Add(quarter1HLine); + } + + // + CChartObjectTrend *quarter2HLine; + quarter2HLine = new CChartObjectTrend(); + isCreated = quarter2HLine.Create( + chartID, + q2Name, + subWindow, + conditions.workingZone.from, + conditions.workingZone.quarter2, + conditions.workingZone.to, + conditions.workingZone.quarter2 // + ); + if (isCreated) + { + // + quarter2HLine.Color(clrYellow); + mWorkingZoneObjects.Add(quarter2HLine); + } + + // + CChartObjectTrend *quarter3HLine; + quarter3HLine = new CChartObjectTrend(); + isCreated = quarter3HLine.Create( + chartID, + q3Name, + subWindow, + conditions.workingZone.from, + conditions.workingZone.quarter3, + conditions.workingZone.to, + conditions.workingZone.quarter3 // + ); + if (isCreated) + { + // + quarter3HLine.Color(clrYellow); + mWorkingZoneObjects.Add(quarter3HLine); + } + + // + } + + // + void DrawConditions( + X121SMCStrategyXWZSignalConditions &conditions, + XCPOIDrawer *drawer, + bool forceClean = false // + ) + { + // + if (drawer == NULL) + { + return; + } + + // + if (forceClean) + { + mObjects.Clear(); + } + + // + bool isCreated = false; + + // + ulong chartID = drawer.ChartIdentification(); + int subWindow = drawer.SubWindowIdentification(); + color bullishColor = drawer.BarBullishColor(); + color bearishColor = drawer.BarBearishColor(); + + // + // Start Zones ... + bool hasStartZones = conditions.HasStartZones(); + if (hasStartZones) + { + // + int count = conditions.CountStartZones(); + for (int i = 0; i < count; i++) + { + // + bool isBullish = conditions.startZones[i].IsBullish(); + + // + bool hasOB = conditions.startZones[i].HasOB(); + if (hasOB) + { + // // + // XCBaseObject *iObj; + // isCreated = drawer.CreateOrderBlock( + // conditions.startZones[i].ob, + // iObj // + // ); + + // // + // if (isCreated) + // { + // mObjects.Add(iObj); + // } + + // + DrawOrderBlock( + conditions.startZones[i].ob, + drawer // + ); + } + + // + bool hasFVG = conditions.startZones[i].HasFVG(); + if (hasFVG) + { + // // + // XCBaseObject *iObj; + // isCreated = drawer.CreateFairValueGap( + // conditions.startZones[i].fvg, + // iObj // + // ); + + // // + // if (isCreated) + // { + // mObjects.Add(iObj); + // } + + // + DrawFairValueGap( + conditions.startZones[i].fvg, + drawer // + ); + } + + // // + // bool hasSupply = conditions.startZones[i].HasSupply(); + // if (hasSupply) + // { + // // + // XCSupplyZoneObject *iObj; + // isCreated = drawer.CreateSupplyZone( + // conditions.startZones[i].supply, + // iObj // + // ); + + // // + // if (isCreated) + // { + // mObjects.Add(iObj); + // } + // } + + // // + // bool hasDemand = conditions.startZones[i].HasDemand(); + // if (hasDemand) + // { + // // + // XCDemandZoneObject *iObj; + // isCreated = drawer.CreateDemandZone( + // conditions.startZones[i].demand, + // iObj // + // ); + + // // + // if (isCreated) + // { + // mObjects.Add(iObj); + // } + // } + + // // + // bool hasSupport = conditions.startZones[i].HasSupport(); + // if (hasSupport) + // { + // // + // XCSupportZoneObject *iObj; + // isCreated = drawer.CreateSupportZone( + // conditions.startZones[i].support, + // iObj // + // ); + + // // + // if (isCreated) + // { + // mObjects.Add(iObj); + // } + // } + + // // + // bool hasResistance = conditions.startZones[i].HasResistance(); + // if (hasResistance) + // { + // // + // XCResistanceZoneObject *iObj; + // isCreated = drawer.CreateResistanceZone( + // conditions.startZones[i].resistance, + // iObj // + // ); + + // // + // if (isCreated) + // { + // mObjects.Add(iObj); + // } + // } + + // + // + // + + // + string bName = ""; + int arrowCode = 0; + string bSuffix = ""; + color arrowColor = clrNONE; + ENUM_X_PRICE bPrice = X_PRICE_CLOSE; + + // + bool hasSwingBar = conditions.startZones[i].swingBar.IsValid(); + if (hasSwingBar) + { + // + bSuffix = ToMD5(conditions.startZones[i].swingBar.GetTag()); + bName = + (isBullish + ? "SWING_LOW" + : "SWING_HIGH") + + "_" + bSuffix; + arrowCode = 159; + arrowColor = + isBullish + ? bullishColor + : bearishColor; + bPrice = + isBullish + ? X_PRICE_LOW + : X_PRICE_HIGH; + + // + XCBarArrowObject *iObj; + iObj = new XCBarArrowObject(); + isCreated = iObj.CreateByBar( + chartID, + bName, + subWindow, + arrowCode, + conditions.startZones[i].swingBar, + bPrice // + ); + if (isCreated) + { + // + iObj.ArrowColor(arrowColor); + + // + mObjects.Add(iObj); + } + } + + // + bool hasBreakerBar = conditions.startZones[i].breakerBar.IsValid(); + if (hasBreakerBar) + { + // + bSuffix = ToMD5(conditions.startZones[i].breakerBar.GetTag()); + bName = + (isBullish + ? "BULL_BREAKER" + : "BEAR_BREAKER") + + "_" + bSuffix; + arrowCode = + isBullish + ? 71 + : 72; + arrowColor = + isBullish + ? bullishColor + : bearishColor; + bPrice = + isBullish + ? X_PRICE_LOW + : X_PRICE_HIGH; + + // + XCBarArrowObject *iObj; + iObj = new XCBarArrowObject(); + isCreated = iObj.CreateByBar( + chartID, + bName, + subWindow, + arrowCode, + conditions.startZones[i].breakerBar, + bPrice // + ); + if (isCreated) + { + // + iObj.ArrowColor(arrowColor); + + // + mObjects.Add(iObj); + } + } + + // + bool hasMomentumBar = conditions.startZones[i].momentumBar.IsValid(); + if (hasMomentumBar) + { + // + bSuffix = ToMD5(conditions.startZones[i].momentumBar.GetTag()); + bName = + (isBullish + ? "BULL_MOMENTUM" + : "BEAR_MOMENTUM") + + "_" + bSuffix; + arrowCode = + isBullish + ? 233 + : 234; + arrowColor = + isBullish + ? bullishColor + : bearishColor; + bPrice = + isBullish + ? X_PRICE_LOW + : X_PRICE_HIGH; + + // + XCBarArrowObject *iObj; + iObj = new XCBarArrowObject(); + isCreated = iObj.CreateByBar( + chartID, + bName, + subWindow, + arrowCode, + conditions.startZones[i].momentumBar, + bPrice // + ); + if (isCreated) + { + // + iObj.ArrowColor(arrowColor); + + // + mObjects.Add(iObj); + } + } + + // + bool hasRejectionBar = conditions.startZones[i].rejectionBar.IsValid(); + if (hasRejectionBar) + { + // + bSuffix = ToMD5(conditions.startZones[i].rejectionBar.GetTag()); + bName = + (isBullish + ? "BULL_REJECTION" + : "BEAR_REJECTION") + + "_" + bSuffix; + arrowCode = + isBullish + ? 241 + : 242; + arrowColor = + isBullish + ? bullishColor + : bearishColor; + bPrice = + isBullish + ? X_PRICE_LOW + : X_PRICE_HIGH; + + // + XCBarArrowObject *iObj; + iObj = new XCBarArrowObject(); + isCreated = iObj.CreateByBar( + chartID, + bName, + subWindow, + arrowCode, + conditions.startZones[i].rejectionBar, + bPrice // + ); + if (isCreated) + { + // + iObj.ArrowColor(arrowColor); + + // + mObjects.Add(iObj); + } + } + + // + bool hasAppliedBox = conditions.startZones[i].appliedBox.IsValid(); + if (hasAppliedBox) + { + // + arrowColor = + IsBullish(conditions.startZones[i].appliedBox.dir) + ? bullishColor + : bearishColor; + + // + XCBoxObject *iObj; + isCreated = drawer.CreateBox( + conditions.startZones[i].appliedBox, + iObj // + ); + + // + if (isCreated) + { + // + iObj.BoxWidth(2); + iObj.BoxColor(arrowColor); + + // + mObjects.Add(iObj); + } + } + } + } + } + + // + protected: + // + + // + private: + // + // Props ... + CArrayObj mObjects; + CArrayObj mWorkingZoneObjects; + + /** + * Initialize ... + */ + void Init() + { + } + + /** + * DeInitialize ... + */ + void DeInit() + { + // + RemoveDraws(); + mConditions.Clean(); + RemoveWorkingZoneDraws(); + Clean(mConditionsCollection); + } + + // + // Helpers ... + + // + bool CalculateRiskReward( + ENUM_X121SMC_XWZ_PRIORITY priority, + double &reward, + double &amountPercent // + ) + { + // + bool result = false; + + // + reward = 0; + amountPercent = 0; + + // + result = priority != X121SMC_XWZ_PRIORITY_NONE; + if (!result) + { + return result; + } + + // + switch (priority) + { + // + case X121SMC_XWZ_PRIORITY_STRONG_HIGH: + // + reward = 6; + amountPercent = 2; + break; + + // + case X121SMC_XWZ_PRIORITY_HIGH: + // + reward = 4; + amountPercent = 2; + break; + + // + case X121SMC_XWZ_PRIORITY_REGULAR: + // + reward = 3; + amountPercent = 1.5; + break; + + // + case X121SMC_XWZ_PRIORITY_LOW: + // + reward = 2; + amountPercent = 1; + break; + + // + case X121SMC_XWZ_PRIORITY_WEAK: + // + reward = 1; + amountPercent = 0.5; + break; + } + + // + result = + // + reward > 0 && + amountPercent > 0 + // + ; + + // + return result; + } + + // +}; + +// \ No newline at end of file diff --git a/BKPS/14031206/Documents/BKP/x-121.smc.xwz.signal.lib copy 2.mq5 b/BKPS/14031206/Documents/BKP/x-121.smc.xwz.signal.lib copy 2.mq5 new file mode 100644 index 0000000..9a7025d --- /dev/null +++ b/BKPS/14031206/Documents/BKP/x-121.smc.xwz.signal.lib copy 2.mq5 @@ -0,0 +1,3749 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 X121 SMC Signal Class +// ------------------------------------------------- +// Name: XWZ +// Description: provide all Signalling 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 + +// +// Imports ... +// #include "../../Libraries/x-trade.lib" +#include "../Classes/x-121.smc.market.cycle.helper.class.mq5" +#include "../Libraries/x-121.smc.guard.lib.mq5" +#include "../Libraries/x-121.smc.lib.mq5" + +// +enum ENUM_X121SMC_XWZ_PRIORITY +{ + X121SMC_XWZ_PRIORITY_NONE, + X121SMC_XWZ_PRIORITY_WEAK, + X121SMC_XWZ_PRIORITY_LOW, + X121SMC_XWZ_PRIORITY_REGULAR, + X121SMC_XWZ_PRIORITY_HIGH, + X121SMC_XWZ_PRIORITY_STRONG_HIGH, +}; + +// +struct X121SMCXWZZone +{ + // + // Props ... + XCFVG *fvg; + XCOrderBlock *ob; + XCSupplyZone *supply; + XCDemandZone *demand; + XCSupportZone *support; + XCResistanceZone *resistance; + + // + XOHCL swingBar; + XOHCL breakerBar; + XOHCL momentumBar; + XOHCL rejectionBar; + XBoxZone appliedBox; + + // + // Constructor ... + X121SMCXWZZone() + { + Clean(); + } + + // + // Tools ... + + // + void Clean() + { + // + ZeroMemory(ob); + ZeroMemory(fvg); + ZeroMemory(supply); + ZeroMemory(demand); + ZeroMemory(support); + ZeroMemory(resistance); + + // + swingBar.Clean(); + breakerBar.Clean(); + appliedBox.Clean(); + momentumBar.Clean(); + rejectionBar.Clean(); + } + + // + bool IsValid() + { + // + return HasOB() && + HasFVG() && + HasDirection(); + } + + // + bool AsBox(XBoxZone &box) + { + // + bool result = false; + + // + box.Clean(); + + // + result = IsValid() && + HasDirection(); + if (!result) + { + return result; + } + + // + XBoxZone obBox; + bool hasOBBox = ToBox( + obBox, + ob // + ); + result = hasOBBox; + if (!result) + { + // + box.Clean(); + obBox.Clean(); + return result; + } + + // + box = obBox; + + // + obBox.Clean(); + + // + bool hasOB = HasOB(); + bool hasFVG = HasFVG(); + bool hasSupply = HasSupply(); + bool hasDemand = HasDemand(); + bool hasSupport = HasSupport(); + bool hasResistance = HasResistance(); + + // + // OB Compared since box used obBox ... + + // + if (hasFVG) + { + // + if (fvg.Upper() > box.upper) + { + box.upper = fvg.Upper(); + } + + // + if (fvg.Lower() < box.lower) + { + box.lower = fvg.Lower(); + } + } + + // + result = box.IsValid(); + + // + return result; + } + + // + bool HasOB() + { + return ob != NULL && + ob.IsValid(); + } + + // + bool HasFVG() + { + return fvg != NULL && + fvg.IsValid(); + } + + // + bool HasSupply() + { + return supply != NULL && + supply.IsValid(); + } + + // + bool HasDemand() + { + return demand != NULL && + demand.IsValid(); + } + + // + bool HasSupport() + { + return support != NULL && + support.IsValid(); + } + + // + bool HasResistance() + { + return resistance != NULL && + resistance.IsValid(); + } + + // + bool IsBullish() + { + // + return HasOB() && + ob.IsBullish() && + HasFVG() && + fvg.IsBullish(); + } + + // + bool IsBearish() + { + // + return HasOB() && + ob.IsBearish() && + HasFVG() && + fvg.IsBearish(); + } + + // + bool HasDirection() + { + return IsBullish() || + IsBearish(); + } + + // + bool ValidateZone( + int barIndex = 0, + ENUM_TIMEFRAMES forPeriod = NULL // + ) + { + // + bool result = false; + + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + result = IsValid() && + HasDirection(); + if (!result) + { + return result; + } + + // + string symbol = ob.GetSymbol(); + if (forPeriod == NULL) + { + forPeriod = ob.GetPeriod(); + } + ENUM_X_DIRECTION forDir = GetDirection(); + + // + XOHCL cBar; + result = cBar.Init( + symbol, + forPeriod, + barIndex + 1 // + ); + if (!result) + { + // + cBar.Clean(); + return result; + } + + // + bool isBreaked = + IsBullish(forDir) + ? cBar.close < ob.Lower() || + cBar.close < fvg.Lower() + : cBar.close > ob.Upper() || + cBar.close > fvg.Upper(); + result = !isBreaked; + + // + cBar.Clean(); + + // + return result; + } + + // + ENUM_X_DIRECTION GetDirection() + { + // + ENUM_X_DIRECTION result = X_DIRECTION_NONE; + + // + bool hasDirection = HasDirection(); + if (!hasDirection) + { + return result; + } + + // + bool isBullish = IsBullish(); + + // + result = + isBullish + ? X_DIRECTION_BULLISH + : X_DIRECTION_BEARISH; + + // + return result; + } + + // + bool IsPriceInside( + XBoxZone &box, + int barIndex = 0, + ENUM_TIMEFRAMES forPeriod = NULL, + bool forceOB = false, + bool forceFVG = false // + ) + { + // + bool result = false; + + // + box.Clean(); + + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + result = IsValid() && + HasOB() && + HasFVG() && + HasDirection(); + if (!result) + { + return result; + } + + // + string symbol = ob.GetSymbol(); + if (forPeriod == NULL) + { + forPeriod = ob.GetPeriod(); + } + + // + ENUM_X_DIRECTION forDir = ob.GetDirection(); + bool isBullish = IsBullish(forDir); + + // + // Check Start Bars ... + + // + XOHCL obStartedBar; + ENUM_X_DIRECTION obStartedDir; + bool isOBStarted = ob.IsStarted( + forDir, + obStartedBar, + obStartedDir // + ); + result = isOBStarted; + if (!result) + { + return result; + } + + // + XOHCL fvgStartedBar; + ENUM_X_DIRECTION fvgStartedDir; + bool isFVGStarted = fvg.IsStarted( + forDir, + fvgStartedBar, + fvgStartedDir // + ); + result = isFVGStarted; + if (!result) + { + return result; + } + + // + // Retrieve Bars ... + + // + XOHCL zBar; + result = zBar.Init( + symbol, + forPeriod, + barIndex // + ); + if (!result) + { + // + box.Clean(); + zBar.Clean(); + + // + return result; + } + + // + XOHCL cBar; + result = zBar.GetPreviousBar(cBar); + if (!result) + { + // + box.Clean(); + zBar.Clean(); + cBar.Clean(); + + // + return result; + } + + // + XOHCL pBar; + result = cBar.GetPreviousBar(pBar); + if (!result) + { + // + box.Clean(); + zBar.Clean(); + cBar.Clean(); + pBar.Clean(); + + // + return result; + } + + // + bool isPriceInsideOB = X121SMCXWZCheckPriceInside( + zBar, + cBar, + ob.Upper(), + ob.Lower() // + ); + + // + // isBullish + // ? ( + // // + // pBar.close > ob.Upper() && + // cBar.low <= ob.Upper() && + // cBar.close <= ob.Upper() && + // zBar.open <= ob.Upper() + // // + // ) + // : ( + // // + // pBar.close < ob.Lower() && + // cBar.high >= ob.Lower() && + // cBar.close >= ob.Lower() && + // zBar.open >= ob.Lower() + // // + // ); + + // + bool isPriceInsideFVG = X121SMCXWZCheckPriceInside( + zBar, + cBar, + fvg.Upper(), + fvg.Lower() // + ); + + // + // isBullish + // ? ( + // // + // pBar.close > fvg.Upper() && + // cBar.low <= fvg.Upper() && + // cBar.close <= fvg.Upper() && + // zBar.open <= fvg.Upper() + // // + // ) + // : ( + // // + // pBar.close < fvg.Lower() && + // cBar.high >= fvg.Lower() && + // cBar.close >= fvg.Lower() && + // zBar.open >= fvg.Lower() + // // + // ); + + // + if ((forceOB && forceFVG) || + (!forceOB && !forceFVG)) + { + // + result = + isPriceInsideOB || + isPriceInsideFVG; + } + else if (forceOB) + { + result = isPriceInsideOB; + } + else if (forceFVG) + { + result = isPriceInsideFVG; + } + + // + if (result) + { + // + if (isPriceInsideOB && !isPriceInsideFVG) + { + // + result = ToBox( + box, + ob // + ); + } + else if (isPriceInsideFVG && !isPriceInsideOB) + { + // + result = ToBox( + box, + fvg // + ); + } + else if (isPriceInsideOB && isPriceInsideFVG) + { + result = AsBox(box); + } + } + + // + zBar.Clean(); + cBar.Clean(); + pBar.Clean(); + + // + return result; + } + + // + bool HasInsideConditions( + XPOIState &state, + int barIndex = 0, + ENUM_TIMEFRAMES forPeriod = NULL // + ) + { + // + bool result = false; + + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + swingBar.Clean(); + breakerBar.Clean(); + appliedBox.Clean(); + momentumBar.Clean(); + rejectionBar.Clean(); + + // + XBoxZone zoneBox; + bool hasBox = AsBox(zoneBox); + + // + result = hasBox && + IsValid() && + HasDirection() && + state.IsValid() && + state.HasChild(); + if (!result) + { + // + swingBar.Clean(); + breakerBar.Clean(); + appliedBox.Clean(); + momentumBar.Clean(); + rejectionBar.Clean(); + + // + return result; + } + + // + string symbol = zoneBox.symbol; + if (!IsValid(forPeriod)) + { + forPeriod = zoneBox.period; + } + datetime cTime = iTime( + symbol, + forPeriod, + barIndex // + ); + + // + ENUM_X_DIRECTION forDir = zoneBox.dir; + bool isBullish = IsBullish(forDir); + + // + int count = 0; + bool has = false; + + // + XBoxZone supResBoxes[]; + int supresBoxesCount = 0; + bool hasSupResBoxes = false; + + // + has = state.HasSupportZones(); + if (has) + { + // + count = state.CountSupportZones(); + for (int i = 0; i < count; i++) + { + // + XCSupportZone *iZone = state.supportZones[i]; + + // + iZone.To(cTime); + + // + XBoxZone iBox; + bool hasBox = ToBox( + iBox, + iZone // + ); + if (!hasBox) + { + // + iBox.Clean(); + continue; + } + + // + // Check From ... + bool isInside = IsBoxInside( + iBox, + zoneBox // + ); + if (!isInside) + { + // + iBox.Clean(); + continue; + } + + // + AddRef( + iBox, + supResBoxes // + ); + + // + iBox.Clean(); + ZeroMemory(iZone); + } + + // + supresBoxesCount = ArraySize(supResBoxes); + hasSupResBoxes = IsValidSize(supresBoxesCount); + } + + // + has = state.HasResistanceZones(); + if (has) + { + // + count = state.CountResistanceZones(); + for (int i = 0; i < count; i++) + { + // + XCResistanceZone *iZone = state.resistanceZones[i]; + + // + iZone.To(cTime); + + // + XBoxZone iBox; + bool hasBox = ToBox( + iBox, + iZone // + ); + if (!hasBox) + { + // + iBox.Clean(); + continue; + } + + // + // Check From ... + bool isInside = IsBoxInside( + iBox, + zoneBox // + ); + if (!isInside) + { + // + iBox.Clean(); + continue; + } + + // + AddRef( + iBox, + supResBoxes // + ); + + // + iBox.Clean(); + ZeroMemory(iZone); + } + + // + supresBoxesCount = ArraySize(supResBoxes); + hasSupResBoxes = IsValidSize(supresBoxesCount); + } + + // + result = hasSupResBoxes; + if (!result) + { + // + Clean(supResBoxes); + + // + swingBar.Clean(); + breakerBar.Clean(); + appliedBox.Clean(); + momentumBar.Clean(); + rejectionBar.Clean(); + + // + return result; + } + + // + for (int i = 0; i < supresBoxesCount; i++) + { + // + XBoxZone iBox = supResBoxes[i]; + + // + bool hasBoxConditions = HasBoxConitions( + iBox, + state, + barIndex, + forPeriod // + ); + if (hasBoxConditions) + { + // + appliedBox = iBox; + result = true; + iBox.Clean(); + break; + } + + // + iBox.Clean(); + } + + // + if (!result) + { + // + swingBar.Clean(); + breakerBar.Clean(); + appliedBox.Clean(); + momentumBar.Clean(); + rejectionBar.Clean(); + } + + // + Clean(supResBoxes); + + // + return result; + } + + // + bool HasBoxConitions( + XBoxZone &box, + XPOIState &state, + int barIndex = 0, + ENUM_TIMEFRAMES forPeriod = NULL // + ) + { + // + bool result = false; + + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + result = box.IsValid() && + IsValid() && + HasDirection(); + if (!result) + { + // + swingBar.Clean(); + breakerBar.Clean(); + appliedBox.Clean(); + momentumBar.Clean(); + rejectionBar.Clean(); + + // + return result; + } + + // + string symbol = box.symbol; + if (forPeriod == NULL) + { + forPeriod = box.period; + } + ENUM_X_DIRECTION forDir = box.dir; + bool isBullish = IsBullish(forDir); + + // + // Detect Bars ... + + // + XOHCL zBar; + result = zBar.Init( + symbol, + forPeriod, + barIndex // + ); + if (!result) + { + // + zBar.Clean(); + + // + swingBar.Clean(); + breakerBar.Clean(); + appliedBox.Clean(); + momentumBar.Clean(); + rejectionBar.Clean(); + + // + return result; + } + + // + XOHCL cBar; + result = zBar.GetPreviousBar(cBar); + if (!result) + { + // + zBar.Clean(); + cBar.Clean(); + + // + swingBar.Clean(); + breakerBar.Clean(); + appliedBox.Clean(); + momentumBar.Clean(); + rejectionBar.Clean(); + + // + return result; + } + + // + XOHCL pBar; + result = cBar.GetPreviousBar(pBar); + if (!result) + { + // + zBar.Clean(); + cBar.Clean(); + pBar.Clean(); + + // + swingBar.Clean(); + breakerBar.Clean(); + appliedBox.Clean(); + momentumBar.Clean(); + rejectionBar.Clean(); + + // + return result; + } + + // + XOHCL ppBar; + result = pBar.GetPreviousBar(ppBar); + if (!result) + { + // + zBar.Clean(); + cBar.Clean(); + pBar.Clean(); + ppBar.Clean(); + + // + swingBar.Clean(); + breakerBar.Clean(); + appliedBox.Clean(); + momentumBar.Clean(); + rejectionBar.Clean(); + + // + return result; + } + + // + double fiboPressureLevel = GetFiboLevelValue(X_FIBO_LEVEL_382); + + // + double fiboUpDown = GetFibonacciLevel( + pBar.high, + pBar.low, + X_FIBO_LEVEL_382, + X_DIRECTION_BEARISH // + ); + double fiboDownUp = GetFibonacciLevel( + pBar.high, + pBar.low, + X_FIBO_LEVEL_382, + X_DIRECTION_BULLISH // + ); + + // + bool hasFiboToUpPressure = + fiboDownUp > 0 && + fiboDownUp <= pBar.GetDown(); + bool hasFiboToDownPressure = + fiboUpDown > 0 && + fiboUpDown >= pBar.GetUp(); + + // + double appliedPrice = + isBullish + ? box.upper + : box.lower; + + // + // Check Swing Low ... + bool isSwingLow = + // + pBar.low < ppBar.low && + pBar.low < cBar.low && + zBar.open > pBar.low && + // + appliedPrice > pBar.low && + appliedPrice < pBar.GetDown() + // + ; + bool isPressuredSwingLow = + isSwingLow && + hasFiboToUpPressure; + bool isPressuredStrongSwingLow = + pBar.IsBullish() && + isPressuredSwingLow; + + // + bool isSwingHigh = + // + pBar.high > ppBar.high && + pBar.high > cBar.high && + zBar.open < pBar.high && + // + appliedPrice < pBar.high && + appliedPrice > pBar.GetUp() + // + ; + bool isPressuredSwingHigh = + isSwingHigh && + hasFiboToDownPressure; + bool isPressuredStrongSwingHigh = + pBar.IsBearish() && + isPressuredSwingHigh; + + // + bool hasValidSwing = + isBullish + ? isSwingLow + : isSwingHigh; + bool hasValidPressuredSwing = + isBullish + ? isPressuredSwingLow + : isPressuredSwingHigh; + bool hasValidPressuredStrongSwing = + isBullish + ? isPressuredStrongSwingLow + : isPressuredStrongSwingHigh; + if (hasValidSwing) + { + swingBar = pBar; + } + if (hasValidPressuredSwing) + { + swingBar = pBar; + } + if (hasValidPressuredStrongSwing) + { + swingBar = pBar; + } + + // + bool isCBarBreaked = IsBarBreak( + appliedPrice, + forDir, + cBar // + ); + if (isCBarBreaked) + { + breakerBar = cBar; + } + bool isPBarBreaked = IsBarBreak( + appliedPrice, + forDir, + pBar // + ); + if (!isCBarBreaked && isPBarBreaked) + { + breakerBar = pBar; + } + else + { + isPBarBreaked = false; + } + bool isPPBarBreaked = IsBarBreak( + appliedPrice, + forDir, + ppBar // + ); + if (!isCBarBreaked && + !isPBarBreaked && + isPPBarBreaked) + { + breakerBar = ppBar; + } + else + { + isPPBarBreaked = false; + } + bool isBoxBreaked = isCBarBreaked || + isPBarBreaked || + isPPBarBreaked; + + // + bool isCBarRejected = IsBarReject( + appliedPrice, + forDir, + cBar // + ); + if (isCBarRejected) + { + rejectionBar = cBar; + } + bool isPBarRejected = IsBarReject( + appliedPrice, + forDir, + pBar // + ); + if (!isCBarRejected && isPBarRejected) + { + rejectionBar = pBar; + } + else + { + isPBarRejected = false; + } + bool isPPBarRejected = IsBarReject( + appliedPrice, + forDir, + ppBar // + ); + if (!isCBarRejected && + !isPBarRejected && + isPPBarRejected) + { + rejectionBar = ppBar; + } + else + { + isPPBarRejected = false; + } + bool isBoxRejected = isCBarRejected || + isPBarRejected || + isPPBarRejected; + + // + result = + // + isBoxBreaked || + isBoxRejected || + hasValidPressuredSwing + // + ; + if (!result) + { + // + swingBar.Clean(); + breakerBar.Clean(); + appliedBox.Clean(); + momentumBar.Clean(); + rejectionBar.Clean(); + } + else + { + appliedBox = box; + } + + // + zBar.Clean(); + cBar.Clean(); + pBar.Clean(); + ppBar.Clean(); + + // + return result; + } + + // +}; + +// +struct X121SMCXWZWorkingZone +{ + // + string symbol; + ENUM_TIMEFRAMES period; + + // + double upper; + double lower; + + // + double zoneUpper; + double zoneLower; + + // + double quarter1; + double quarter2; + double quarter3; + + // + datetime to; + datetime from; + + // + XOHCL swingBar; + XOHCL breakerBar; + XOHCL momentumBar; + XOHCL rejectionBar; + XBoxZone appliedBox; + + // + X121SMCXWZWorkingZone() + { + Clean(); + } + + // + void Clean() + { + // + upper = 0; + lower = 0; + quarter1 = 0; + quarter2 = 0; + quarter3 = 0; + zoneLower = 0; + zoneUpper = 0; + + // + from = NULL; + symbol = NULL; + period = NULL; + + // + CleanConditionBars(); + + // + ZeroMemory(this); + } + + // + void CleanConditionBars() + { + // + swingBar.Clean(); + breakerBar.Clean(); + appliedBox.Clean(); + momentumBar.Clean(); + rejectionBar.Clean(); + } + + // + bool IsValid() + { + // + bool result = false; + + // + result = + lower > 0 && + upper > 0 && + quarter1 > 0 && + quarter2 > 0 && + quarter3 > 0 && + upper > lower && + zoneLower > 0 && + zoneUpper > 0 && + IsValid(from) && + IsValid(symbol) && + IsValid(period) && + zoneUpper > upper && + zoneLower < lower; + + // + return result; + } + + // + bool IsDestroyed( + ENUM_X_DIRECTION &destroyedDir, + int barIndex = 0, + ENUM_TIMEFRAMES forPeriod = NULL // + ) + { + // + bool result = false; + + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + if (!IsValid(forPeriod)) + { + forPeriod = period; + } + + // + destroyedDir = X_DIRECTION_NONE; + + // + result = IsValid(); + if (!result) + { + return result; + } + + // + XOHCL bar; + result = bar.Init( + symbol, + forPeriod, + barIndex // + ); + if (!result) + { + return result; + } + + // + bool isUpperBreaked = + bar.high > zoneUpper && + bar.close > zoneUpper; + + // + bool isLowerBreaked = + bar.low < zoneLower && + bar.close < zoneLower; + + // + result = isUpperBreaked || + isLowerBreaked; + if (result) + { + // + destroyedDir = + isUpperBreaked + ? X_DIRECTION_BULLISH + : X_DIRECTION_BEARISH; + } + + // + return result; + } + + // +}; + +// +// Definitions ... +struct X121SMCStrategyXWZSignalConditions +{ + // + // Props ... + + // + string symbol; + ENUM_TIMEFRAMES period; + + // + double sl; + double target; + double reward; + double amountPercent; + ENUM_X_DIRECTION dir; + ENUM_X_POSITION_TYPES type; + + // + // Setup Props ... + + // + datetime setupTime; + datetime triggerTime; + + // + double pivot; + double point; + + // + ENUM_X121SMC_XWZ_PRIORITY priority; + + // + // Working Zone ... + XCFVG *fairValueGap; + XCOrderBlock *orderBlock; + XCSupplyZone *supplyZone; + XCDemandZone *demandZone; + X121SMCXWZWorkingZone workingZone; + + // + // X121SMCXWZZone startZone; + X121SMCXWZZone startZones[]; + + // + // Constructor ... + X121SMCStrategyXWZSignalConditions() + { + Clean(); + } + + // + // Tools ... + + /** + * Cleaning Up ... + */ + void Clean() + { + // + sl = 0; + target = 0; + + // + dir = X_DIRECTION_NONE; + type = X_POSITION_TYPE_NONE; + + // + symbol = NULL; + period = NULL; + setupTime = NULL; + triggerTime = NULL; + + // + ExtensionClean(); + + // + ZeroMemory(this); + } + + /** + * Check Condition is Setting Up ... + * + * @param dir: ENUM_X_DIRECTION member, Setting Up Direction ... + * + * @return ( bool ) + */ + bool IsSetuped() + { + // + bool result = false; + + // + result = IsValid(setupTime) && + HasDirection(dir); + if (!result) + { + return result; + } + + // + return result; + } + + /** + * Calculate Setup Age ... + * + * @return ( int ) + */ + int GetSetupAge() + { + // + int result = 0; + + // + if (!IsSetuped()) + { + return result; + } + + // + result = (int)(TimeCurrent() - setupTime) / PeriodSeconds(period); + + // + return result; + } + + /** + * Detect How we Can Trigger Signal ... + * + * @return ( bool ) + */ + bool CanTrigger() + { + // + bool result = false; + + // + result = + // + sl > 0 && + IsValid(symbol) && + IsValid(period) && + IsValid(triggerTime) && + type != X_POSITION_TYPE_ALL && + type != X_POSITION_TYPE_NONE + // + ; + + // + return result; + } + + // + // Extensions ... + + /** + * Clean Additional Properties ... + */ + void ExtensionClean() + { + // + pivot = 0; + point = 0; + + // + target = 0; + reward = 0; + amountPercent = 0; + + // + ZeroMemory(supplyZone); + + // + ZeroMemory(demandZone); + + // + ZeroMemory(orderBlock); + + // + ZeroMemory(fairValueGap); + + // + // startZone.Clean(); + Clean(startZones); + + // + workingZone.Clean(); + } + + // + // + // + + // + bool HasWorkingZone() + { + return workingZone.IsValid(); + } + + // + bool HasOrderBlock() + { + return orderBlock != NULL && + orderBlock.IsValid(); + } + + // + bool HasFairValueGap() + { + return fairValueGap != NULL && + fairValueGap.IsValid(); + } + + // + bool HasSupplyZone() + { + return supplyZone != NULL && + supplyZone.IsValid(); + } + + // + bool HasDemandZone() + { + return demandZone != NULL && + demandZone.IsValid(); + } + + // + bool HasStartZones() + { + return HasChild(startZones); + } + + // + int CountStartZones() + { + return ArraySize(startZones); + } + + // + void UpdateTo(datetime value = NULL) + { + // + value = NormalizeTime(value); + + // + bool hasSupplyZone = HasSupplyZone(); + if (hasSupplyZone) + { + supplyZone.To(value); + } + + // + bool hasDemandZone = HasDemandZone(); + if (hasDemandZone) + { + demandZone.To(value); + } + + // + bool hasOrderBlock = HasOrderBlock(); + if (hasOrderBlock) + { + orderBlock.To(value); + } + + // + bool hasFairValueGap = HasFairValueGap(); + if (hasFairValueGap) + { + fairValueGap.To(value); + } + + // + // Working Zone ... + bool hasWorkingZone = HasWorkingZone(); + if (hasWorkingZone) + { + workingZone.to = value; + } + + // + // Start Zone ... + bool hasStartZones = HasStartZones(); + if (hasStartZones) + { + // + int count = CountStartZones(); + for (int i = 0; i < count; i++) + { + // + bool hasOB = startZones[i].HasOB(); + if (hasOB) + { + startZones[i].ob.To(value); + } + + // + bool hasFVG = startZones[i].HasFVG(); + if (hasFVG) + { + startZones[i].fvg.To(value); + } + + // + bool hasSupply = startZones[i].HasSupply(); + if (hasSupply) + { + startZones[i].supply.To(value); + } + + // + bool hasDemand = startZones[i].HasDemand(); + if (hasDemand) + { + startZones[i].demand.To(value); + } + + // + bool hasSupport = startZones[i].HasSupport(); + if (hasSupport) + { + startZones[i].support.To(value); + } + + // + bool hasResistance = startZones[i].HasResistance(); + if (hasResistance) + { + startZones[i].resistance.To(value); + } + } + } + } + + // + // + // + + // + // Working Zone is an Area which + // we decide to trade inside it ... + bool ExtractWorkingZone( + XPOIState &htfState, + XPOIState &mtfState, + XPOIState &stfState, + int barIndex = 0 // + ) + { + // + bool result = false; + + // + if (barIndex < 0) + { + barIndex = 0; + } + int zIndex = barIndex; + + // + result = !HasWorkingZone(); + if (!result) + { + return result; + } + + // + result = IsValid(symbol) && + IsValid(period); + if (!result) + { + // + Clean(); + return result; + } + + // + datetime cTime = iTime( + symbol, + period, + zIndex // + ); + + // + result = + // + htfState.IsValid() && + htfState.HasChild() && + htfState.HasSupplyZones() && + htfState.HasDemandZones() && + // + mtfState.IsValid() && + mtfState.HasChild() && + mtfState.HasSupplyZones() && + mtfState.HasDemandZones() && + // + stfState.IsValid() && + stfState.HasChild() + // + ; + if (!result) + { + return result; + } + + // + // Retrieve Highest Supply Zone ... + int hSupplyIDX = GetHighest(htfState.supplyZones); + int lDemandIDX = GetLowest(htfState.demandZones); + + // + result = + // + IsValidIndex(hSupplyIDX) && + IsValidIndex(lDemandIDX) + // + ; + if (!result) + { + return result; + } + + // + supplyZone = htfState.supplyZones[hSupplyIDX]; + demandZone = htfState.demandZones[lDemandIDX]; + + // + result = + // + supplyZone != NULL && + demandZone != NULL && + supplyZone.IsValid() && + demandZone.IsValid() + // + ; + if (!result) + { + // + Clean(); + return result; + } + + // + // Check Validation of Supply and Demand Zones ... + lDemandIDX = GetLowest(mtfState.demandZones); + hSupplyIDX = GetHighest(mtfState.supplyZones); + result = IsValidIndex(lDemandIDX) && + IsValidIndex(hSupplyIDX); + if (!result) + { + // + Clean(); + return result; + } + + // + // Validate Supply and Demand ... + bool isMTFHSupplyInside = + IsInside( + mtfState.supplyZones[hSupplyIDX], + supplyZone); + bool isMTFLDemandInside = + IsInside( + mtfState.demandZones[lDemandIDX], + demandZone // + ); + if (isMTFHSupplyInside && + !isMTFLDemandInside) + { + demandZone = mtfState.demandZones[lDemandIDX]; + } + else if (!isMTFHSupplyInside && + isMTFLDemandInside) + { + supplyZone = mtfState.supplyZones[hSupplyIDX]; + } + else if (isMTFHSupplyInside && + isMTFLDemandInside) + { + // + supplyZone = mtfState.supplyZones[hSupplyIDX]; + demandZone = mtfState.demandZones[lDemandIDX]; + } + + // + // Check Zones Validation ... + bool hasTrend = + supplyZone != NULL && + supplyZone.IsValid() && + demandZone != NULL && + demandZone.IsValid(); + result = hasTrend; + if (!result) + { + // + Clean(); + return result; + } + + // + datetime from = MathMax( + supplyZone.From(), + demandZone.From()); + + // + int fromIndex = iBarShift( + symbol, + period, + from // + ); + + // + // Detect Trend ... + ENUM_X_DIRECTION trend = X_DIRECTION_NONE; + datetime supplyTouch = NULL; + datetime demandTouch = NULL; + for (int i = zIndex; i < fromIndex; i++) + { + // + XOHCL iBar; + bool isInited = iBar.Init( + symbol, + period, + i // + ); + if (!isInited) + { + continue; + } + + // + bool isTouchSupplyZone = + // + iBar.low < supplyZone.Lower() && + iBar.GetUp() > supplyZone.Lower() + // + ; + if (isTouchSupplyZone && + !IsValid(supplyTouch)) + { + supplyTouch = iBar.time; + } + + // + bool isTouchDemandZone = + // + iBar.high > demandZone.Upper() && + iBar.GetDown() < demandZone.Upper() + // + ; + if (isTouchDemandZone && + !IsValid(demandTouch)) + { + demandTouch = iBar.time; + } + + // + bool canBreak = + IsValid(supplyTouch) && + IsValid(demandTouch); + + // + iBar.Clean(); + + // + if (canBreak) + { + break; + } + } + + // + hasTrend = + // + IsValid(supplyTouch) || + IsValid(demandTouch) + // + ; + if (hasTrend) + { + // + trend = + // + supplyTouch > demandTouch + ? X_DIRECTION_BEARISH + : X_DIRECTION_BULLISH + // + ; + } + + // + // Check Trend ... + result = hasTrend; + if (!result) + { + // + Clean(); + return result; + } + + // + bool hasBullishTrend = IsBullish(trend); + bool hasBearishTrend = IsBearish(trend); + + // + // Find Order Block and FVG for Trend Approve ... + + // + bool isBullishTrendApproved = false; + bool isBearishTrendApproved = false; + + // + // Now We Have to Detect at least One OrderBlock with FVG ... + // for Trend Approvement ... + bool hasOrderBlock = HasOrderBlock(); + bool hasFairValueGap = HasFairValueGap(); + if (!hasOrderBlock && + !hasFairValueGap) + { + // + int count = 0; + bool has = false; + + // + XCFVG *fvg = NULL; + XCOrderBlock *ob = NULL; + + // + has = mtfState.HasBullishOrderBlocks(); + count = mtfState.CountBullishOrderBlocks(); + + // + if (has) + { + // + // Check Order Block ... + for (int i = 0; i < count; i++) + { + // + XCOrderBlock *iOB = mtfState.bullishOrderBlocks[i]; + + // + iOB.To(cTime); + + // + // Check From Passes ... + bool isFromPassed = iOB.From() > demandZone.From(); + if (!isFromPassed) + { + continue; + } + + // + // Must inside DemandZone ... + bool isInsideDemand = IsInsideDiff( + iOB, + demandZone // + ); + if (!isInsideDemand) + { + continue; + } + + // + // Check Started ... + XOHCL startedBar; + ENUM_X_DIRECTION startedDir; + bool isStarted = iOB.IsStarted( + X_DIRECTION_BULLISH, + startedBar, + startedDir // + ); + if (!isStarted) + { + // + startedBar.Clean(); + continue; + } + + // + // Converts to Box ... + XBoxZone obBox; + bool hasOBBox = ToBox( + obBox, + iOB // + ); + if (!hasOBBox) + { + // + obBox.Clean(); + startedBar.Clean(); + continue; + } + + // + // Check Zone Must not Used before ... + bool isUsed = IsBoxUsed( + obBox, + startedBar.Index() - 1, + zIndex // + ); + if (isUsed) + { + // + obBox.Clean(); + startedBar.Clean(); + continue; + } + + // + ob = iOB; + + // + obBox.Clean(); + startedBar.Clean(); + + // + break; + } + + // + // Detect Fair Value Gap ... + if (ob != NULL && + ob.IsValid()) + { + // + has = stfState.HasBullishFairValueGaps(); + count = stfState.CountBullishFairValueGaps(); + if (has) + { + // + // Check Fir Value Gap ... + for (int i = 0; i < count; i++) + { + // + XCFVG *iFVG = stfState.bullishFairValueGaps[i]; + + // + iFVG.To(cTime); + + // + // Check From Passes ... + bool isFromPassed = iFVG.From() > ob.From(); + if (!isFromPassed) + { + continue; + } + + // + // Check Started ... + XOHCL startedBar; + ENUM_X_DIRECTION startedDir; + bool isStarted = iFVG.IsStarted( + X_DIRECTION_BULLISH, + startedBar, + startedDir // + ); + if (!isStarted) + { + // + startedBar.Clean(); + continue; + } + + // + // Converts to Box ... + XBoxZone fvgBox; + bool hasFVGBox = ToBox( + fvgBox, + iFVG // + ); + if (!hasFVGBox) + { + // + fvgBox.Clean(); + startedBar.Clean(); + continue; + } + + // + // Check Inside Order Block ... + bool isInside = IsInsideDiff( + iFVG, + ob, + true // Force Side Out ... + ); + if (!isInside) + { + continue; + } + + // + fvg = iFVG; + + // + fvgBox.Clean(); + startedBar.Clean(); + + // + break; + } + } + else + { + // + ob = NULL; + } + } + + // + if (ob != NULL && + fvg != NULL) + { + // + orderBlock = ob; + fairValueGap = fvg; + } + + // + hasOrderBlock = HasOrderBlock(); + hasFairValueGap = HasFairValueGap(); + isBullishTrendApproved = hasOrderBlock && + hasFairValueGap; + } + + // + if (!isBullishTrendApproved) + { + // + has = mtfState.HasBearishOrderBlocks(); + count = mtfState.CountBearishOrderBlocks(); + + // + if (has) + { + // + // Check Order Block ... + for (int i = 0; i < count; i++) + { + // + XCOrderBlock *iOB = mtfState.bearishOrderBlocks[i]; + + // + iOB.To(cTime); + + // + // Check From Passes ... + bool isFromPassed = iOB.From() > supplyZone.From(); + if (!isFromPassed) + { + continue; + } + + // + // Must inside DemandZone ... + bool isInsideDemand = IsInsideDiff( + iOB, + supplyZone // + ); + if (!isInsideDemand) + { + continue; + } + + // + // Check Started ... + XOHCL startedBar; + ENUM_X_DIRECTION startedDir; + bool isStarted = iOB.IsStarted( + X_DIRECTION_BEARISH, + startedBar, + startedDir // + ); + if (!isStarted) + { + // + startedBar.Clean(); + continue; + } + + // + // Converts to Box ... + XBoxZone obBox; + bool hasOBBox = ToBox( + obBox, + iOB // + ); + if (!hasOBBox) + { + // + obBox.Clean(); + startedBar.Clean(); + continue; + } + + // + // Check Zone Must not Used before ... + bool isUsed = IsBoxUsed( + obBox, + startedBar.Index() - 1, + zIndex // + ); + if (isUsed) + { + // + obBox.Clean(); + startedBar.Clean(); + continue; + } + + // + ob = iOB; + + // + obBox.Clean(); + startedBar.Clean(); + + // + break; + } + + // + // Detect Fair Value Gap ... + if (ob != NULL && + ob.IsValid()) + { + // + has = stfState.HasBearishFairValueGaps(); + count = stfState.CountBearishFairValueGaps(); + if (has) + { + // + // Check Fir Value Gap ... + for (int i = 0; i < count; i++) + { + // + XCFVG *iFVG = stfState.bearishFairValueGaps[i]; + + // + iFVG.To(cTime); + + // + // Check From Passes ... + bool isFromPassed = iFVG.From() > ob.From(); + if (!isFromPassed) + { + continue; + } + + // + // Check Started ... + XOHCL startedBar; + ENUM_X_DIRECTION startedDir; + bool isStarted = iFVG.IsStarted( + X_DIRECTION_BEARISH, + startedBar, + startedDir // + ); + if (!isStarted) + { + // + startedBar.Clean(); + continue; + } + + // + // Converts to Box ... + XBoxZone fvgBox; + bool hasFVGBox = ToBox( + fvgBox, + iFVG // + ); + if (!hasFVGBox) + { + // + fvgBox.Clean(); + startedBar.Clean(); + continue; + } + + // + // Check Inside Order Block ... + bool isInside = IsInsideDiff( + iFVG, + ob, + true // Force Side Out ... + ); + if (!isInside) + { + continue; + } + + // + fvg = iFVG; + + // + fvgBox.Clean(); + startedBar.Clean(); + + // + break; + } + } + else + { + // + ob = NULL; + } + } + + // + if (ob != NULL && + fvg != NULL) + { + // + orderBlock = ob; + fairValueGap = fvg; + } + + // + hasOrderBlock = HasOrderBlock(); + hasFairValueGap = HasFairValueGap(); + isBearishTrendApproved = hasOrderBlock && + hasFairValueGap; + } + } + } + + // + // Check Trend Approved ... + bool isTrendApproved = + hasOrderBlock && + hasFairValueGap && + (isBullishTrendApproved || + isBearishTrendApproved); + result = isTrendApproved; + if (!result) + { + // + Clean(); + return result; + } + + // + // Prepare Working Zone ... + workingZone.symbol = symbol; + workingZone.period = period; + + // + workingZone.upper = supplyZone.Lower(); + workingZone.zoneUpper = supplyZone.Upper(); + + // + workingZone.lower = demandZone.Upper(); + workingZone.zoneLower = demandZone.Lower(); + + // + workingZone.from = from; + + // + double upper = workingZone.upper; + double range = + workingZone.upper - workingZone.lower; + double ranegPercent = range / 100; + double quarterValue = ranegPercent * 25; + + // + workingZone.quarter1 = upper - (quarterValue * 1); + workingZone.quarter2 = upper - (quarterValue * 2); + workingZone.quarter3 = upper - (quarterValue * 3); + + // + result = workingZone.IsValid(); + if (!result) + { + Clean(); + } + + // + return result; + } + + // + bool IsWorkingZoneDestroyed( + ENUM_X_DIRECTION &destroyedDir, + int barIndex = 0, + ENUM_TIMEFRAMES forPeriod = NULL // + ) + { + // + bool result = false; + + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + if (!IsValid(forPeriod)) + { + forPeriod = period; + } + + // + destroyedDir = X_DIRECTION_NONE; + + // + result = workingZone.IsValid(); + if (!result) + { + return result; + } + + // + result = workingZone.IsDestroyed( + destroyedDir, + barIndex, + forPeriod // + ); + + // + return result; + } + + // + bool DetectTrend( + ENUM_X_DIRECTION &trend, + int barIndex = 0, + ENUM_TIMEFRAMES forPeriod = NULL // + ) + { + // + bool result = false; + + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + if (forPeriod == NULL) + { + forPeriod = period; + } + + // + trend = X_DIRECTION_NONE; + + // + result = HasWorkingZone(); + if (!result) + { + return result; + } + + // + int FromIndex = iBarShift( + symbol, + forPeriod, + workingZone.from // + ); + + // + datetime supplyTouch = NULL; + datetime demandTouch = NULL; + for (int i = barIndex; i < FromIndex; i++) + { + // + XOHCL iBar; + bool isInited = iBar.Init( + symbol, + forPeriod, + i // + ); + if (!isInited) + { + continue; + } + + // + bool isTouchSupplyZone = + // + iBar.low < supplyZone.Lower() && + iBar.GetUp() > supplyZone.Lower() + // + ; + if (isTouchSupplyZone && + !IsValid(supplyTouch)) + { + supplyTouch = iBar.time; + } + + // + bool isTouchDemandZone = + // + iBar.high > demandZone.Upper() && + iBar.GetDown() < demandZone.Upper() + // + ; + if (isTouchDemandZone && + !IsValid(demandTouch)) + { + demandTouch = iBar.time; + } + + // + bool canBreak = + IsValid(supplyTouch) && + IsValid(demandTouch); + + // + iBar.Clean(); + + // + if (canBreak) + { + break; + } + } + + // + result = + // + IsValid(supplyTouch) || + IsValid(demandTouch) + // + ; + if (result) + { + // + trend = + // + supplyTouch > demandTouch + ? X_DIRECTION_BEARISH + : X_DIRECTION_BULLISH + // + ; + } + + // + return result; + } + + // + bool DetectStartZones( + ENUM_X_DIRECTION forDir, + XPOIState &obState, + XPOIState &fvgState, + XPOIState &otherState, + XC121SMCCycleHelper *cycleHelper // + ) + { + // + bool result = false; + + // + result = obState.IsValid() && + obState.HasChild() && + fvgState.IsValid() && + fvgState.HasChild() && + otherState.IsValid() && + otherState.HasChild() && + HasDirection(forDir); + if (!result) + { + return result; + } + + // + bool isBullish = IsBullish(forDir); + + // + int idx = -1; + int count = 0; + int has = false; + + // + X121SMCXWZZone startZone; + X121SMCXWZZone lastStartZone; + bool hasLastStartZone = HasStartZones(); + if (hasLastStartZone) + { + // + int startZonesCount = CountStartZones(); + lastStartZone = startZones[startZonesCount - 1]; + } + + // + if (isBullish) + { + // + has = obState.HasBullishOrderBlocks(); + if (has) + { + // + count = obState.CountBullishOrderBlocks(); + for (int i = 0; i < count; i++) + { + // + XCOrderBlock *iOB = obState.bullishOrderBlocks[i]; + + // + bool isFromPassed = + !hasLastStartZone + ? true + : iOB.From() > lastStartZone.ob.From(); + if (!isFromPassed) + { + // + ZeroMemory(iOB); + continue; + } + + // + XOHCL startedBar; + ENUM_X_DIRECTION startedDir; + bool isStarted = iOB.IsStarted( + forDir, + startedBar, + startedDir // + ); + if (!isStarted) + { + // + ZeroMemory(iOB); + startedBar.Clean(); + continue; + } + + // + XOHCL activatedBar; + ENUM_X_DIRECTION activatedDir; + bool isActivated = iOB.IsActivated( + forDir, + activatedBar, + activatedDir // + ); + if (isActivated) + { + // + ZeroMemory(iOB); + startedBar.Clean(); + activatedBar.Clean(); + continue; + } + + // + // Validate Zone Iverse Breake ... + XOHCL breakedBar; + ENUM_X_DIRECTION breakedDir; + bool isBreaked = iOB.IsBreaked( + Opposit(forDir), + breakedBar, + breakedDir, + true // Ignore Activation ... + ); + if (isBreaked) + { + // + ZeroMemory(iOB); + startedBar.Clean(); + breakedBar.Clean(); + activatedBar.Clean(); + continue; + } + + // + bool isPlacePassed = + !IsInsideDiff( + iOB, + demandZone // + ) && + (!hasLastStartZone + ? workingZone.IsValid() && + HasOrderBlock() && + forDir == orderBlock.GetDirection() + ? IsAbove( + iOB, + orderBlock, + true // Ignore Inside ... + ) + : true + : lastStartZone.HasOB() && + IsAbove( + iOB, + lastStartZone.ob, + true // Ignore Inside ... + )); + if (!isPlacePassed) + { + // + ZeroMemory(iOB); + startedBar.Clean(); + activatedBar.Clean(); + continue; + } + + // + // Attache OB ... + startZone.ob = iOB; + + // + // Now we Have to Find Specified FVG ... + has = fvgState.HasBullishFairValueGaps(); + if (has) + { + // + int jCount = fvgState.CountBullishFairValueGaps(); + for (int j = 0; j < jCount; j++) + { + // + XCFVG *jFVG = fvgState.bullishFairValueGaps[j]; + + // + startedBar.Clean(); + startedDir = X_DIRECTION_NONE; + isStarted = jFVG.IsStarted( + forDir, + startedBar, + startedDir // + ); + if (!isStarted) + { + // + ZeroMemory(jFVG); + startedBar.Clean(); + continue; + } + + // + activatedBar.Clean(); + activatedDir = X_DIRECTION_NONE; + isActivated = jFVG.IsActivated( + forDir, + activatedBar, + activatedDir // + ); + if (isActivated) + { + // + ZeroMemory(jFVG); + startedBar.Clean(); + activatedBar.Clean(); + continue; + } + + // + // Validate Zone Iverse Breake ... + breakedBar.Clean(); + breakedDir = X_DIRECTION_NONE; + bool isBreaked = jFVG.IsBreaked( + Opposit(forDir), + breakedBar, + breakedDir, + true // Ignore Activation ... + ); + if (isBreaked) + { + // + ZeroMemory(jFVG); + startedBar.Clean(); + breakedBar.Clean(); + activatedBar.Clean(); + continue; + } + + // + isPlacePassed = + // + !IsInsideDiff( + jFVG, + demandZone // + ) && + IsAboveDiff( + jFVG, + iOB, + true // Ignore Inside ... + ) + // + ; + if (!isPlacePassed) + { + // + ZeroMemory(jFVG); + startedBar.Clean(); + activatedBar.Clean(); + } + + // + startZone.fvg = jFVG; + } + } + + // + startedBar.Clean(); + activatedBar.Clean(); + } + } + } + else + { + // + has = obState.HasBearishOrderBlocks(); + if (has) + { + // + count = obState.CountBearishOrderBlocks(); + for (int i = 0; i < count; i++) + { + // + XCOrderBlock *iOB = obState.bearishOrderBlocks[i]; + + // + bool isFromPassed = + !hasLastStartZone + ? true + : iOB.From() > lastStartZone.ob.From(); + if (!isFromPassed) + { + // + ZeroMemory(iOB); + continue; + } + + // + XOHCL startedBar; + ENUM_X_DIRECTION startedDir; + bool isStarted = iOB.IsStarted( + forDir, + startedBar, + startedDir // + ); + if (!isStarted) + { + // + ZeroMemory(iOB); + startedBar.Clean(); + continue; + } + + // + XOHCL activatedBar; + ENUM_X_DIRECTION activatedDir; + bool isActivated = iOB.IsActivated( + forDir, + activatedBar, + activatedDir // + ); + if (isActivated) + { + // + ZeroMemory(iOB); + startedBar.Clean(); + activatedBar.Clean(); + continue; + } + + // + // Validate Zone Iverse Breake ... + XOHCL breakedBar; + ENUM_X_DIRECTION breakedDir; + bool isBreaked = iOB.IsBreaked( + Opposit(forDir), + breakedBar, + breakedDir, + true // Ignore Activation ... + ); + if (isBreaked) + { + // + ZeroMemory(iOB); + startedBar.Clean(); + breakedBar.Clean(); + activatedBar.Clean(); + continue; + } + + // + bool isPlacePassed = + !IsInsideDiff( + iOB, + supplyZone // + ) && + (!hasLastStartZone + ? workingZone.IsValid() && + HasOrderBlock() && + forDir == orderBlock.GetDirection() + ? IsBelow( + iOB, + orderBlock, + true // Ignore Inside ... + ) + : true + : lastStartZone.HasOB() && + IsBelow( + iOB, + lastStartZone.ob, + true // Ignore Inside ... + )); + if (!isPlacePassed) + { + // + ZeroMemory(iOB); + startedBar.Clean(); + activatedBar.Clean(); + continue; + } + + // + // Attache OB ... + startZone.ob = iOB; + + // + // Now we Have to Find Specified FVG ... + has = fvgState.HasBearishFairValueGaps(); + if (has) + { + // + int jCount = fvgState.CountBearishFairValueGaps(); + for (int j = 0; j < jCount; j++) + { + // + XCFVG *jFVG = fvgState.bearishFairValueGaps[j]; + + // + startedBar.Clean(); + startedDir = X_DIRECTION_NONE; + isStarted = jFVG.IsStarted( + forDir, + startedBar, + startedDir // + ); + if (!isStarted) + { + // + ZeroMemory(jFVG); + startedBar.Clean(); + continue; + } + + // + activatedBar.Clean(); + activatedDir = X_DIRECTION_NONE; + isActivated = jFVG.IsActivated( + forDir, + activatedBar, + activatedDir // + ); + if (isActivated) + { + // + ZeroMemory(jFVG); + startedBar.Clean(); + activatedBar.Clean(); + continue; + } + + // + // Validate Zone Iverse Breake ... + breakedBar.Clean(); + breakedDir = X_DIRECTION_NONE; + bool isBreaked = jFVG.IsBreaked( + Opposit(forDir), + breakedBar, + breakedDir, + true // Ignore Activation ... + ); + if (isBreaked) + { + // + ZeroMemory(jFVG); + startedBar.Clean(); + breakedBar.Clean(); + activatedBar.Clean(); + continue; + } + + // + isPlacePassed = + // + !IsInsideDiff( + jFVG, + supplyZone // + ) && + IsBelowDiff( + jFVG, + iOB, + true // Ignore Inside ... + ) + // + ; + if (!isPlacePassed) + { + // + ZeroMemory(jFVG); + startedBar.Clean(); + activatedBar.Clean(); + } + + // + startZone.fvg = jFVG; + } + } + + // + startedBar.Clean(); + activatedBar.Clean(); + } + } + } + + // + bool hasOBFVG = startZone.HasOB() && + startZone.HasFVG(); + result = hasOBFVG; + if (!result) + { + // + startZone.Clean(); + lastStartZone.Clean(); + + // + return result; + } + + // + XBoxZone startBox; + bool hasStartBox = startZone.AsBox(startBox); + result = hasStartBox; + if (!result) + { + // + startBox.Clean(); + startZone.Clean(); + lastStartZone.Clean(); + + // + return result; + } + + // + // Detect Other Zones Inside Box ... + XBoxZone tmpBoxes[]; + + // + // Supply Zones ... + has = otherState.HasSupplyZones(); + if (has) + { + // + count = ToBox( + otherState.supplyZones, + tmpBoxes // + ); + + // + has = IsValidSize(count); + if (has) + { + // + for (int i = 0; i < count; i++) + { + // + XBoxZone iBox = tmpBoxes[i]; + + // + bool isPlacePassed = + // + IsBoxInside( + iBox, + startBox, + false, + false // + ) + // + ; + if (!isPlacePassed) + { + // + iBox.Clean(); + continue; + } + + // + startZone.supply = otherState.supplyZones[i]; + + // + iBox.Clean(); + break; + } + } + } + + // + // Demand Zones ... + Clean(tmpBoxes); + has = otherState.HasDemandZones(); + if (has) + { + // + count = ToBox( + otherState.demandZones, + tmpBoxes // + ); + + // + has = IsValidSize(count); + if (has) + { + // + for (int i = 0; i < count; i++) + { + // + XBoxZone iBox = tmpBoxes[i]; + + // + bool isPlacePassed = + // + IsBoxInside( + iBox, + startBox, + false, + false // + ) + // + ; + if (!isPlacePassed) + { + // + iBox.Clean(); + continue; + } + + // + startZone.demand = otherState.demandZones[i]; + + // + iBox.Clean(); + break; + } + } + } + + // + // Support Zones ... + Clean(tmpBoxes); + has = otherState.HasSupportZones(); + if (has) + { + // + count = ToBox( + otherState.supportZones, + tmpBoxes // + ); + + // + has = IsValidSize(count); + if (has) + { + // + for (int i = 0; i < count; i++) + { + // + XBoxZone iBox = tmpBoxes[i]; + + // + bool isPlacePassed = + // + IsBoxInside( + iBox, + startBox, + false, + false // + ) + // + ; + if (!isPlacePassed) + { + // + iBox.Clean(); + continue; + } + + // + startZone.support = otherState.supportZones[i]; + + // + iBox.Clean(); + break; + } + } + } + + // + // Resistance Zones ... + Clean(tmpBoxes); + has = otherState.HasResistanceZones(); + if (has) + { + // + count = ToBox( + otherState.resistanceZones, + tmpBoxes // + ); + + // + has = IsValidSize(count); + if (has) + { + // + for (int i = 0; i < count; i++) + { + // + XBoxZone iBox = tmpBoxes[i]; + + // + bool isPlacePassed = + // + IsBoxInside( + iBox, + startBox, + false, + false // + ) + // + ; + if (!isPlacePassed) + { + // + iBox.Clean(); + continue; + } + + // + startZone.resistance = otherState.resistanceZones[i]; + + // + iBox.Clean(); + break; + } + } + } + + // + result = startZone.IsValid() && + startZone.HasDirection(); + if (result) + { + // + AddRef( + startZone, + startZones // + ); + } + + // + Clean(tmpBoxes); + startBox.Clean(); + startZone.Clean(); + lastStartZone.Clean(); + + // + return result; + } + + // + void ValidateStartZones( + int barIndex = 0, + ENUM_TIMEFRAMES forPeriod = NULL // + ) + { + // + bool has = HasStartZones(); + if (!has) + { + return; + } + + // + X121SMCXWZZone tmpZones[]; + int count = CountStartZones(); + Copy( + startZones, + tmpZones // + ); + for (int i = 0; i < count; i++) + { + // + bool isValid = tmpZones[i].ValidateZone( + barIndex, + forPeriod // + ); + if (!isValid) + { + // + ArrayRemove( + startZones, + i, + 1 // + ); + } + } + + // + Clean(tmpZones); + } + + // + void DetectPriority( + ENUM_X121SMC_XWZ_PRIORITY &bullish, + ENUM_X121SMC_XWZ_PRIORITY &bearish, + int barIndex = 0, + ENUM_TIMEFRAMES forPeriod = NULL // + ) + { + // + bullish = X121SMC_XWZ_PRIORITY_NONE; + bearish = X121SMC_XWZ_PRIORITY_NONE; + + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + if (!IsValid(forPeriod)) + { + forPeriod = period; + } + + // + bool hasWorkingZone = HasWorkingZone(); + if (!hasWorkingZone) + { + return; + } + + // + XOHCL zBar; + bool isInited = zBar.Init( + symbol, + forPeriod, + barIndex // + ); + if (!isInited) + { + // + zBar.Clean(); + return; + } + + // + XOHCL cBar; + isInited = zBar.GetPreviousBar(cBar); + if (!isInited) + { + // + zBar.Clean(); + cBar.Clean(); + return; + } + + // + // ZoneUpper, Upper ... + if (cBar.low > workingZone.upper && + cBar.high < workingZone.zoneUpper && + zBar.low > workingZone.upper && + zBar.high < workingZone.zoneUpper) + { + // + bullish = X121SMC_XWZ_PRIORITY_NONE; + bearish = X121SMC_XWZ_PRIORITY_STRONG_HIGH; + } + // + // Upper, Quarter1 ... + else if (cBar.low > workingZone.quarter1 && + cBar.high < workingZone.upper && + zBar.low > workingZone.quarter1 && + zBar.high < workingZone.upper) + { + // + bullish = X121SMC_XWZ_PRIORITY_WEAK; + bearish = X121SMC_XWZ_PRIORITY_HIGH; + } + // + // Quarter1, Quarter2 ... + else if (cBar.low > workingZone.quarter2 && + cBar.high < workingZone.quarter1 && + zBar.low > workingZone.quarter2 && + zBar.high < workingZone.quarter1) + { + // + bullish = X121SMC_XWZ_PRIORITY_LOW; + bearish = X121SMC_XWZ_PRIORITY_REGULAR; + } + // + // Quarter2, Quarter3 ... + else if (cBar.low > workingZone.quarter3 && + cBar.high < workingZone.quarter2 && + zBar.low > workingZone.quarter3 && + zBar.high < workingZone.quarter2) + { + // + bullish = X121SMC_XWZ_PRIORITY_REGULAR; + bearish = X121SMC_XWZ_PRIORITY_LOW; + } + // + // Quarter3, Lower ... + else if (cBar.low > workingZone.lower && + cBar.high < workingZone.quarter3 && + zBar.low > workingZone.lower && + zBar.high < workingZone.quarter3) + { + // + bullish = X121SMC_XWZ_PRIORITY_HIGH; + bearish = X121SMC_XWZ_PRIORITY_WEAK; + } + // + // Lower, ZoneLower ... + else if (cBar.low > workingZone.zoneLower && + cBar.high < workingZone.lower && + zBar.low > workingZone.zoneLower && + zBar.high < workingZone.lower) + { + // + bullish = X121SMC_XWZ_PRIORITY_STRONG_HIGH; + bearish = X121SMC_XWZ_PRIORITY_NONE; + } + + // + zBar.Clean(); + cBar.Clean(); + } + + // + bool HasConditions( + double &_pivot, + double &_point, + ENUM_X_DIRECTION &conditionsDir, + XPOIState &state, + int barIndex = 0, + ENUM_TIMEFRAMES forPeriod = NULL // + ) + { + // + bool result = false; + + // + _pivot = 0; + _point = 0; + conditionsDir = X_DIRECTION_NONE; + + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + if (forPeriod == NULL) + { + forPeriod = period; + } + + // + result = + // + IsValid(symbol) && + IsValid(period) && + state.IsValid() && + HasWorkingZone() && + state.HasChild() + // + ; + if (!result) + { + return result; + } + + // + result = false; + + // + ValidateStartZones( + barIndex, + forPeriod // + ); + + // + // Detect Conditions Based On Start Zones ... + bool hasStartZones = HasStartZones(); + if (hasStartZones) + { + // + int selectedIndex = -1; + int count = CountStartZones(); + for (int i = 0; i < count; i++) + { + // + X121SMCXWZZone iStartZone = startZones[i]; + + // + XBoxZone selectedBox; + bool hasConditions = false; + bool isBullish = iStartZone.IsBullish(); + + // + // Conditions Inside Box ... + bool isPriceInside = iStartZone.IsPriceInside( + selectedBox, + barIndex, + forPeriod, + false, + false // + ); + if (isPriceInside) + { + // + // hasConditions = iStartZone.HasInsideConditions( + // state, + // barIndex, + // period // + // ); + + // + hasConditions = true; + + // + if (hasConditions) + { + // + _pivot = + // + isBullish + ? selectedBox.lower + : selectedBox.upper + // + ; + + // + _point = + // + isBullish + ? selectedBox.upper + : selectedBox.lower + // + ; + + // + conditionsDir = selectedBox.dir; + result = hasConditions; + iStartZone.Clean(); + break; + } + } + + // // + // // Order Block Rejection Conditions ... + // bool hasOBBox = ToBox( + // selectedBox, + // iStartZone.ob // + // ); + // if (hasOBBox && + // !hasConditions) + // { + // // + // hasConditions = iStartZone.HasBoxConitions( + // selectedBox, + // state, + // barIndex, + // forPeriod // + // ); + + // // + // if (hasConditions) + // { + // // + // _pivot = + // // + // isBullish + // ? selectedBox.lower + // : selectedBox.upper + // // + // ; + + // // + // _point = + // // + // isBullish + // ? selectedBox.upper + // : selectedBox.lower + // // + // ; + + // // + // conditionsDir = selectedBox.dir; + // result = hasConditions; + // iStartZone.Clean(); + // break; + // } + // } + + // // + // // Fair Value Gap Rejection Conditions ... + // bool hasFVGBox = ToBox( + // selectedBox, + // iStartZone.fvg // + // ); + // if (hasFVGBox) + // { + // // + // hasConditions = iStartZone.HasBoxConitions( + // selectedBox, + // state, + // barIndex, + // forPeriod // + // ); + + // // + // if (hasConditions) + // { + // // + // _pivot = + // // + // isBullish + // ? selectedBox.lower + // : selectedBox.upper + // // + // ; + + // // + // _point = + // // + // isBullish + // ? selectedBox.upper + // : selectedBox.lower + // // + // ; + + // // + // conditionsDir = selectedBox.dir; + // result = hasConditions; + // iStartZone.Clean(); + // break; + // } + // } + + // + iStartZone.Clean(); + } + + // + if (result && + IsValidIndex(selectedIndex)) + { + // + ArrayRemove( + startZones, + selectedIndex, + 1 // + ); + } + } + + // + // Detect Conditions Based On Working Zones ... + if (!result) + { + // + // Detect Result Based On WorkingZone ... + } + + // + if (!result) + { + // + _point = 0; + _pivot = 0; + conditionsDir = X_DIRECTION_NONE; + + // + return result; + } + + // + return result; + } + + // +}; + +// +bool X121SMCXWZCheckPriceInside( + XOHCL &zBar, + XOHCL &cBar, + double upper, + double lower // +) +{ + // + bool result = false; + + // + result = zBar.IsValid() && + cBar.IsValid() && + upper > 0 && + lower > 0 && + upper > lower && + zBar.time > cBar.time; + if (!result) + { + return result; + } + + // + result = + // + zBar.high < upper && + cBar.high < upper && + // + zBar.low > lower && + cBar.low > lower + // + ; + + // + return result; +} + +// \ No newline at end of file diff --git a/BKPS/14031206/Documents/BKP/x-121.smc.xwz.signal.lib copy.mq5 b/BKPS/14031206/Documents/BKP/x-121.smc.xwz.signal.lib copy.mq5 new file mode 100644 index 0000000..9a7025d --- /dev/null +++ b/BKPS/14031206/Documents/BKP/x-121.smc.xwz.signal.lib copy.mq5 @@ -0,0 +1,3749 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 X121 SMC Signal Class +// ------------------------------------------------- +// Name: XWZ +// Description: provide all Signalling 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 + +// +// Imports ... +// #include "../../Libraries/x-trade.lib" +#include "../Classes/x-121.smc.market.cycle.helper.class.mq5" +#include "../Libraries/x-121.smc.guard.lib.mq5" +#include "../Libraries/x-121.smc.lib.mq5" + +// +enum ENUM_X121SMC_XWZ_PRIORITY +{ + X121SMC_XWZ_PRIORITY_NONE, + X121SMC_XWZ_PRIORITY_WEAK, + X121SMC_XWZ_PRIORITY_LOW, + X121SMC_XWZ_PRIORITY_REGULAR, + X121SMC_XWZ_PRIORITY_HIGH, + X121SMC_XWZ_PRIORITY_STRONG_HIGH, +}; + +// +struct X121SMCXWZZone +{ + // + // Props ... + XCFVG *fvg; + XCOrderBlock *ob; + XCSupplyZone *supply; + XCDemandZone *demand; + XCSupportZone *support; + XCResistanceZone *resistance; + + // + XOHCL swingBar; + XOHCL breakerBar; + XOHCL momentumBar; + XOHCL rejectionBar; + XBoxZone appliedBox; + + // + // Constructor ... + X121SMCXWZZone() + { + Clean(); + } + + // + // Tools ... + + // + void Clean() + { + // + ZeroMemory(ob); + ZeroMemory(fvg); + ZeroMemory(supply); + ZeroMemory(demand); + ZeroMemory(support); + ZeroMemory(resistance); + + // + swingBar.Clean(); + breakerBar.Clean(); + appliedBox.Clean(); + momentumBar.Clean(); + rejectionBar.Clean(); + } + + // + bool IsValid() + { + // + return HasOB() && + HasFVG() && + HasDirection(); + } + + // + bool AsBox(XBoxZone &box) + { + // + bool result = false; + + // + box.Clean(); + + // + result = IsValid() && + HasDirection(); + if (!result) + { + return result; + } + + // + XBoxZone obBox; + bool hasOBBox = ToBox( + obBox, + ob // + ); + result = hasOBBox; + if (!result) + { + // + box.Clean(); + obBox.Clean(); + return result; + } + + // + box = obBox; + + // + obBox.Clean(); + + // + bool hasOB = HasOB(); + bool hasFVG = HasFVG(); + bool hasSupply = HasSupply(); + bool hasDemand = HasDemand(); + bool hasSupport = HasSupport(); + bool hasResistance = HasResistance(); + + // + // OB Compared since box used obBox ... + + // + if (hasFVG) + { + // + if (fvg.Upper() > box.upper) + { + box.upper = fvg.Upper(); + } + + // + if (fvg.Lower() < box.lower) + { + box.lower = fvg.Lower(); + } + } + + // + result = box.IsValid(); + + // + return result; + } + + // + bool HasOB() + { + return ob != NULL && + ob.IsValid(); + } + + // + bool HasFVG() + { + return fvg != NULL && + fvg.IsValid(); + } + + // + bool HasSupply() + { + return supply != NULL && + supply.IsValid(); + } + + // + bool HasDemand() + { + return demand != NULL && + demand.IsValid(); + } + + // + bool HasSupport() + { + return support != NULL && + support.IsValid(); + } + + // + bool HasResistance() + { + return resistance != NULL && + resistance.IsValid(); + } + + // + bool IsBullish() + { + // + return HasOB() && + ob.IsBullish() && + HasFVG() && + fvg.IsBullish(); + } + + // + bool IsBearish() + { + // + return HasOB() && + ob.IsBearish() && + HasFVG() && + fvg.IsBearish(); + } + + // + bool HasDirection() + { + return IsBullish() || + IsBearish(); + } + + // + bool ValidateZone( + int barIndex = 0, + ENUM_TIMEFRAMES forPeriod = NULL // + ) + { + // + bool result = false; + + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + result = IsValid() && + HasDirection(); + if (!result) + { + return result; + } + + // + string symbol = ob.GetSymbol(); + if (forPeriod == NULL) + { + forPeriod = ob.GetPeriod(); + } + ENUM_X_DIRECTION forDir = GetDirection(); + + // + XOHCL cBar; + result = cBar.Init( + symbol, + forPeriod, + barIndex + 1 // + ); + if (!result) + { + // + cBar.Clean(); + return result; + } + + // + bool isBreaked = + IsBullish(forDir) + ? cBar.close < ob.Lower() || + cBar.close < fvg.Lower() + : cBar.close > ob.Upper() || + cBar.close > fvg.Upper(); + result = !isBreaked; + + // + cBar.Clean(); + + // + return result; + } + + // + ENUM_X_DIRECTION GetDirection() + { + // + ENUM_X_DIRECTION result = X_DIRECTION_NONE; + + // + bool hasDirection = HasDirection(); + if (!hasDirection) + { + return result; + } + + // + bool isBullish = IsBullish(); + + // + result = + isBullish + ? X_DIRECTION_BULLISH + : X_DIRECTION_BEARISH; + + // + return result; + } + + // + bool IsPriceInside( + XBoxZone &box, + int barIndex = 0, + ENUM_TIMEFRAMES forPeriod = NULL, + bool forceOB = false, + bool forceFVG = false // + ) + { + // + bool result = false; + + // + box.Clean(); + + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + result = IsValid() && + HasOB() && + HasFVG() && + HasDirection(); + if (!result) + { + return result; + } + + // + string symbol = ob.GetSymbol(); + if (forPeriod == NULL) + { + forPeriod = ob.GetPeriod(); + } + + // + ENUM_X_DIRECTION forDir = ob.GetDirection(); + bool isBullish = IsBullish(forDir); + + // + // Check Start Bars ... + + // + XOHCL obStartedBar; + ENUM_X_DIRECTION obStartedDir; + bool isOBStarted = ob.IsStarted( + forDir, + obStartedBar, + obStartedDir // + ); + result = isOBStarted; + if (!result) + { + return result; + } + + // + XOHCL fvgStartedBar; + ENUM_X_DIRECTION fvgStartedDir; + bool isFVGStarted = fvg.IsStarted( + forDir, + fvgStartedBar, + fvgStartedDir // + ); + result = isFVGStarted; + if (!result) + { + return result; + } + + // + // Retrieve Bars ... + + // + XOHCL zBar; + result = zBar.Init( + symbol, + forPeriod, + barIndex // + ); + if (!result) + { + // + box.Clean(); + zBar.Clean(); + + // + return result; + } + + // + XOHCL cBar; + result = zBar.GetPreviousBar(cBar); + if (!result) + { + // + box.Clean(); + zBar.Clean(); + cBar.Clean(); + + // + return result; + } + + // + XOHCL pBar; + result = cBar.GetPreviousBar(pBar); + if (!result) + { + // + box.Clean(); + zBar.Clean(); + cBar.Clean(); + pBar.Clean(); + + // + return result; + } + + // + bool isPriceInsideOB = X121SMCXWZCheckPriceInside( + zBar, + cBar, + ob.Upper(), + ob.Lower() // + ); + + // + // isBullish + // ? ( + // // + // pBar.close > ob.Upper() && + // cBar.low <= ob.Upper() && + // cBar.close <= ob.Upper() && + // zBar.open <= ob.Upper() + // // + // ) + // : ( + // // + // pBar.close < ob.Lower() && + // cBar.high >= ob.Lower() && + // cBar.close >= ob.Lower() && + // zBar.open >= ob.Lower() + // // + // ); + + // + bool isPriceInsideFVG = X121SMCXWZCheckPriceInside( + zBar, + cBar, + fvg.Upper(), + fvg.Lower() // + ); + + // + // isBullish + // ? ( + // // + // pBar.close > fvg.Upper() && + // cBar.low <= fvg.Upper() && + // cBar.close <= fvg.Upper() && + // zBar.open <= fvg.Upper() + // // + // ) + // : ( + // // + // pBar.close < fvg.Lower() && + // cBar.high >= fvg.Lower() && + // cBar.close >= fvg.Lower() && + // zBar.open >= fvg.Lower() + // // + // ); + + // + if ((forceOB && forceFVG) || + (!forceOB && !forceFVG)) + { + // + result = + isPriceInsideOB || + isPriceInsideFVG; + } + else if (forceOB) + { + result = isPriceInsideOB; + } + else if (forceFVG) + { + result = isPriceInsideFVG; + } + + // + if (result) + { + // + if (isPriceInsideOB && !isPriceInsideFVG) + { + // + result = ToBox( + box, + ob // + ); + } + else if (isPriceInsideFVG && !isPriceInsideOB) + { + // + result = ToBox( + box, + fvg // + ); + } + else if (isPriceInsideOB && isPriceInsideFVG) + { + result = AsBox(box); + } + } + + // + zBar.Clean(); + cBar.Clean(); + pBar.Clean(); + + // + return result; + } + + // + bool HasInsideConditions( + XPOIState &state, + int barIndex = 0, + ENUM_TIMEFRAMES forPeriod = NULL // + ) + { + // + bool result = false; + + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + swingBar.Clean(); + breakerBar.Clean(); + appliedBox.Clean(); + momentumBar.Clean(); + rejectionBar.Clean(); + + // + XBoxZone zoneBox; + bool hasBox = AsBox(zoneBox); + + // + result = hasBox && + IsValid() && + HasDirection() && + state.IsValid() && + state.HasChild(); + if (!result) + { + // + swingBar.Clean(); + breakerBar.Clean(); + appliedBox.Clean(); + momentumBar.Clean(); + rejectionBar.Clean(); + + // + return result; + } + + // + string symbol = zoneBox.symbol; + if (!IsValid(forPeriod)) + { + forPeriod = zoneBox.period; + } + datetime cTime = iTime( + symbol, + forPeriod, + barIndex // + ); + + // + ENUM_X_DIRECTION forDir = zoneBox.dir; + bool isBullish = IsBullish(forDir); + + // + int count = 0; + bool has = false; + + // + XBoxZone supResBoxes[]; + int supresBoxesCount = 0; + bool hasSupResBoxes = false; + + // + has = state.HasSupportZones(); + if (has) + { + // + count = state.CountSupportZones(); + for (int i = 0; i < count; i++) + { + // + XCSupportZone *iZone = state.supportZones[i]; + + // + iZone.To(cTime); + + // + XBoxZone iBox; + bool hasBox = ToBox( + iBox, + iZone // + ); + if (!hasBox) + { + // + iBox.Clean(); + continue; + } + + // + // Check From ... + bool isInside = IsBoxInside( + iBox, + zoneBox // + ); + if (!isInside) + { + // + iBox.Clean(); + continue; + } + + // + AddRef( + iBox, + supResBoxes // + ); + + // + iBox.Clean(); + ZeroMemory(iZone); + } + + // + supresBoxesCount = ArraySize(supResBoxes); + hasSupResBoxes = IsValidSize(supresBoxesCount); + } + + // + has = state.HasResistanceZones(); + if (has) + { + // + count = state.CountResistanceZones(); + for (int i = 0; i < count; i++) + { + // + XCResistanceZone *iZone = state.resistanceZones[i]; + + // + iZone.To(cTime); + + // + XBoxZone iBox; + bool hasBox = ToBox( + iBox, + iZone // + ); + if (!hasBox) + { + // + iBox.Clean(); + continue; + } + + // + // Check From ... + bool isInside = IsBoxInside( + iBox, + zoneBox // + ); + if (!isInside) + { + // + iBox.Clean(); + continue; + } + + // + AddRef( + iBox, + supResBoxes // + ); + + // + iBox.Clean(); + ZeroMemory(iZone); + } + + // + supresBoxesCount = ArraySize(supResBoxes); + hasSupResBoxes = IsValidSize(supresBoxesCount); + } + + // + result = hasSupResBoxes; + if (!result) + { + // + Clean(supResBoxes); + + // + swingBar.Clean(); + breakerBar.Clean(); + appliedBox.Clean(); + momentumBar.Clean(); + rejectionBar.Clean(); + + // + return result; + } + + // + for (int i = 0; i < supresBoxesCount; i++) + { + // + XBoxZone iBox = supResBoxes[i]; + + // + bool hasBoxConditions = HasBoxConitions( + iBox, + state, + barIndex, + forPeriod // + ); + if (hasBoxConditions) + { + // + appliedBox = iBox; + result = true; + iBox.Clean(); + break; + } + + // + iBox.Clean(); + } + + // + if (!result) + { + // + swingBar.Clean(); + breakerBar.Clean(); + appliedBox.Clean(); + momentumBar.Clean(); + rejectionBar.Clean(); + } + + // + Clean(supResBoxes); + + // + return result; + } + + // + bool HasBoxConitions( + XBoxZone &box, + XPOIState &state, + int barIndex = 0, + ENUM_TIMEFRAMES forPeriod = NULL // + ) + { + // + bool result = false; + + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + result = box.IsValid() && + IsValid() && + HasDirection(); + if (!result) + { + // + swingBar.Clean(); + breakerBar.Clean(); + appliedBox.Clean(); + momentumBar.Clean(); + rejectionBar.Clean(); + + // + return result; + } + + // + string symbol = box.symbol; + if (forPeriod == NULL) + { + forPeriod = box.period; + } + ENUM_X_DIRECTION forDir = box.dir; + bool isBullish = IsBullish(forDir); + + // + // Detect Bars ... + + // + XOHCL zBar; + result = zBar.Init( + symbol, + forPeriod, + barIndex // + ); + if (!result) + { + // + zBar.Clean(); + + // + swingBar.Clean(); + breakerBar.Clean(); + appliedBox.Clean(); + momentumBar.Clean(); + rejectionBar.Clean(); + + // + return result; + } + + // + XOHCL cBar; + result = zBar.GetPreviousBar(cBar); + if (!result) + { + // + zBar.Clean(); + cBar.Clean(); + + // + swingBar.Clean(); + breakerBar.Clean(); + appliedBox.Clean(); + momentumBar.Clean(); + rejectionBar.Clean(); + + // + return result; + } + + // + XOHCL pBar; + result = cBar.GetPreviousBar(pBar); + if (!result) + { + // + zBar.Clean(); + cBar.Clean(); + pBar.Clean(); + + // + swingBar.Clean(); + breakerBar.Clean(); + appliedBox.Clean(); + momentumBar.Clean(); + rejectionBar.Clean(); + + // + return result; + } + + // + XOHCL ppBar; + result = pBar.GetPreviousBar(ppBar); + if (!result) + { + // + zBar.Clean(); + cBar.Clean(); + pBar.Clean(); + ppBar.Clean(); + + // + swingBar.Clean(); + breakerBar.Clean(); + appliedBox.Clean(); + momentumBar.Clean(); + rejectionBar.Clean(); + + // + return result; + } + + // + double fiboPressureLevel = GetFiboLevelValue(X_FIBO_LEVEL_382); + + // + double fiboUpDown = GetFibonacciLevel( + pBar.high, + pBar.low, + X_FIBO_LEVEL_382, + X_DIRECTION_BEARISH // + ); + double fiboDownUp = GetFibonacciLevel( + pBar.high, + pBar.low, + X_FIBO_LEVEL_382, + X_DIRECTION_BULLISH // + ); + + // + bool hasFiboToUpPressure = + fiboDownUp > 0 && + fiboDownUp <= pBar.GetDown(); + bool hasFiboToDownPressure = + fiboUpDown > 0 && + fiboUpDown >= pBar.GetUp(); + + // + double appliedPrice = + isBullish + ? box.upper + : box.lower; + + // + // Check Swing Low ... + bool isSwingLow = + // + pBar.low < ppBar.low && + pBar.low < cBar.low && + zBar.open > pBar.low && + // + appliedPrice > pBar.low && + appliedPrice < pBar.GetDown() + // + ; + bool isPressuredSwingLow = + isSwingLow && + hasFiboToUpPressure; + bool isPressuredStrongSwingLow = + pBar.IsBullish() && + isPressuredSwingLow; + + // + bool isSwingHigh = + // + pBar.high > ppBar.high && + pBar.high > cBar.high && + zBar.open < pBar.high && + // + appliedPrice < pBar.high && + appliedPrice > pBar.GetUp() + // + ; + bool isPressuredSwingHigh = + isSwingHigh && + hasFiboToDownPressure; + bool isPressuredStrongSwingHigh = + pBar.IsBearish() && + isPressuredSwingHigh; + + // + bool hasValidSwing = + isBullish + ? isSwingLow + : isSwingHigh; + bool hasValidPressuredSwing = + isBullish + ? isPressuredSwingLow + : isPressuredSwingHigh; + bool hasValidPressuredStrongSwing = + isBullish + ? isPressuredStrongSwingLow + : isPressuredStrongSwingHigh; + if (hasValidSwing) + { + swingBar = pBar; + } + if (hasValidPressuredSwing) + { + swingBar = pBar; + } + if (hasValidPressuredStrongSwing) + { + swingBar = pBar; + } + + // + bool isCBarBreaked = IsBarBreak( + appliedPrice, + forDir, + cBar // + ); + if (isCBarBreaked) + { + breakerBar = cBar; + } + bool isPBarBreaked = IsBarBreak( + appliedPrice, + forDir, + pBar // + ); + if (!isCBarBreaked && isPBarBreaked) + { + breakerBar = pBar; + } + else + { + isPBarBreaked = false; + } + bool isPPBarBreaked = IsBarBreak( + appliedPrice, + forDir, + ppBar // + ); + if (!isCBarBreaked && + !isPBarBreaked && + isPPBarBreaked) + { + breakerBar = ppBar; + } + else + { + isPPBarBreaked = false; + } + bool isBoxBreaked = isCBarBreaked || + isPBarBreaked || + isPPBarBreaked; + + // + bool isCBarRejected = IsBarReject( + appliedPrice, + forDir, + cBar // + ); + if (isCBarRejected) + { + rejectionBar = cBar; + } + bool isPBarRejected = IsBarReject( + appliedPrice, + forDir, + pBar // + ); + if (!isCBarRejected && isPBarRejected) + { + rejectionBar = pBar; + } + else + { + isPBarRejected = false; + } + bool isPPBarRejected = IsBarReject( + appliedPrice, + forDir, + ppBar // + ); + if (!isCBarRejected && + !isPBarRejected && + isPPBarRejected) + { + rejectionBar = ppBar; + } + else + { + isPPBarRejected = false; + } + bool isBoxRejected = isCBarRejected || + isPBarRejected || + isPPBarRejected; + + // + result = + // + isBoxBreaked || + isBoxRejected || + hasValidPressuredSwing + // + ; + if (!result) + { + // + swingBar.Clean(); + breakerBar.Clean(); + appliedBox.Clean(); + momentumBar.Clean(); + rejectionBar.Clean(); + } + else + { + appliedBox = box; + } + + // + zBar.Clean(); + cBar.Clean(); + pBar.Clean(); + ppBar.Clean(); + + // + return result; + } + + // +}; + +// +struct X121SMCXWZWorkingZone +{ + // + string symbol; + ENUM_TIMEFRAMES period; + + // + double upper; + double lower; + + // + double zoneUpper; + double zoneLower; + + // + double quarter1; + double quarter2; + double quarter3; + + // + datetime to; + datetime from; + + // + XOHCL swingBar; + XOHCL breakerBar; + XOHCL momentumBar; + XOHCL rejectionBar; + XBoxZone appliedBox; + + // + X121SMCXWZWorkingZone() + { + Clean(); + } + + // + void Clean() + { + // + upper = 0; + lower = 0; + quarter1 = 0; + quarter2 = 0; + quarter3 = 0; + zoneLower = 0; + zoneUpper = 0; + + // + from = NULL; + symbol = NULL; + period = NULL; + + // + CleanConditionBars(); + + // + ZeroMemory(this); + } + + // + void CleanConditionBars() + { + // + swingBar.Clean(); + breakerBar.Clean(); + appliedBox.Clean(); + momentumBar.Clean(); + rejectionBar.Clean(); + } + + // + bool IsValid() + { + // + bool result = false; + + // + result = + lower > 0 && + upper > 0 && + quarter1 > 0 && + quarter2 > 0 && + quarter3 > 0 && + upper > lower && + zoneLower > 0 && + zoneUpper > 0 && + IsValid(from) && + IsValid(symbol) && + IsValid(period) && + zoneUpper > upper && + zoneLower < lower; + + // + return result; + } + + // + bool IsDestroyed( + ENUM_X_DIRECTION &destroyedDir, + int barIndex = 0, + ENUM_TIMEFRAMES forPeriod = NULL // + ) + { + // + bool result = false; + + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + if (!IsValid(forPeriod)) + { + forPeriod = period; + } + + // + destroyedDir = X_DIRECTION_NONE; + + // + result = IsValid(); + if (!result) + { + return result; + } + + // + XOHCL bar; + result = bar.Init( + symbol, + forPeriod, + barIndex // + ); + if (!result) + { + return result; + } + + // + bool isUpperBreaked = + bar.high > zoneUpper && + bar.close > zoneUpper; + + // + bool isLowerBreaked = + bar.low < zoneLower && + bar.close < zoneLower; + + // + result = isUpperBreaked || + isLowerBreaked; + if (result) + { + // + destroyedDir = + isUpperBreaked + ? X_DIRECTION_BULLISH + : X_DIRECTION_BEARISH; + } + + // + return result; + } + + // +}; + +// +// Definitions ... +struct X121SMCStrategyXWZSignalConditions +{ + // + // Props ... + + // + string symbol; + ENUM_TIMEFRAMES period; + + // + double sl; + double target; + double reward; + double amountPercent; + ENUM_X_DIRECTION dir; + ENUM_X_POSITION_TYPES type; + + // + // Setup Props ... + + // + datetime setupTime; + datetime triggerTime; + + // + double pivot; + double point; + + // + ENUM_X121SMC_XWZ_PRIORITY priority; + + // + // Working Zone ... + XCFVG *fairValueGap; + XCOrderBlock *orderBlock; + XCSupplyZone *supplyZone; + XCDemandZone *demandZone; + X121SMCXWZWorkingZone workingZone; + + // + // X121SMCXWZZone startZone; + X121SMCXWZZone startZones[]; + + // + // Constructor ... + X121SMCStrategyXWZSignalConditions() + { + Clean(); + } + + // + // Tools ... + + /** + * Cleaning Up ... + */ + void Clean() + { + // + sl = 0; + target = 0; + + // + dir = X_DIRECTION_NONE; + type = X_POSITION_TYPE_NONE; + + // + symbol = NULL; + period = NULL; + setupTime = NULL; + triggerTime = NULL; + + // + ExtensionClean(); + + // + ZeroMemory(this); + } + + /** + * Check Condition is Setting Up ... + * + * @param dir: ENUM_X_DIRECTION member, Setting Up Direction ... + * + * @return ( bool ) + */ + bool IsSetuped() + { + // + bool result = false; + + // + result = IsValid(setupTime) && + HasDirection(dir); + if (!result) + { + return result; + } + + // + return result; + } + + /** + * Calculate Setup Age ... + * + * @return ( int ) + */ + int GetSetupAge() + { + // + int result = 0; + + // + if (!IsSetuped()) + { + return result; + } + + // + result = (int)(TimeCurrent() - setupTime) / PeriodSeconds(period); + + // + return result; + } + + /** + * Detect How we Can Trigger Signal ... + * + * @return ( bool ) + */ + bool CanTrigger() + { + // + bool result = false; + + // + result = + // + sl > 0 && + IsValid(symbol) && + IsValid(period) && + IsValid(triggerTime) && + type != X_POSITION_TYPE_ALL && + type != X_POSITION_TYPE_NONE + // + ; + + // + return result; + } + + // + // Extensions ... + + /** + * Clean Additional Properties ... + */ + void ExtensionClean() + { + // + pivot = 0; + point = 0; + + // + target = 0; + reward = 0; + amountPercent = 0; + + // + ZeroMemory(supplyZone); + + // + ZeroMemory(demandZone); + + // + ZeroMemory(orderBlock); + + // + ZeroMemory(fairValueGap); + + // + // startZone.Clean(); + Clean(startZones); + + // + workingZone.Clean(); + } + + // + // + // + + // + bool HasWorkingZone() + { + return workingZone.IsValid(); + } + + // + bool HasOrderBlock() + { + return orderBlock != NULL && + orderBlock.IsValid(); + } + + // + bool HasFairValueGap() + { + return fairValueGap != NULL && + fairValueGap.IsValid(); + } + + // + bool HasSupplyZone() + { + return supplyZone != NULL && + supplyZone.IsValid(); + } + + // + bool HasDemandZone() + { + return demandZone != NULL && + demandZone.IsValid(); + } + + // + bool HasStartZones() + { + return HasChild(startZones); + } + + // + int CountStartZones() + { + return ArraySize(startZones); + } + + // + void UpdateTo(datetime value = NULL) + { + // + value = NormalizeTime(value); + + // + bool hasSupplyZone = HasSupplyZone(); + if (hasSupplyZone) + { + supplyZone.To(value); + } + + // + bool hasDemandZone = HasDemandZone(); + if (hasDemandZone) + { + demandZone.To(value); + } + + // + bool hasOrderBlock = HasOrderBlock(); + if (hasOrderBlock) + { + orderBlock.To(value); + } + + // + bool hasFairValueGap = HasFairValueGap(); + if (hasFairValueGap) + { + fairValueGap.To(value); + } + + // + // Working Zone ... + bool hasWorkingZone = HasWorkingZone(); + if (hasWorkingZone) + { + workingZone.to = value; + } + + // + // Start Zone ... + bool hasStartZones = HasStartZones(); + if (hasStartZones) + { + // + int count = CountStartZones(); + for (int i = 0; i < count; i++) + { + // + bool hasOB = startZones[i].HasOB(); + if (hasOB) + { + startZones[i].ob.To(value); + } + + // + bool hasFVG = startZones[i].HasFVG(); + if (hasFVG) + { + startZones[i].fvg.To(value); + } + + // + bool hasSupply = startZones[i].HasSupply(); + if (hasSupply) + { + startZones[i].supply.To(value); + } + + // + bool hasDemand = startZones[i].HasDemand(); + if (hasDemand) + { + startZones[i].demand.To(value); + } + + // + bool hasSupport = startZones[i].HasSupport(); + if (hasSupport) + { + startZones[i].support.To(value); + } + + // + bool hasResistance = startZones[i].HasResistance(); + if (hasResistance) + { + startZones[i].resistance.To(value); + } + } + } + } + + // + // + // + + // + // Working Zone is an Area which + // we decide to trade inside it ... + bool ExtractWorkingZone( + XPOIState &htfState, + XPOIState &mtfState, + XPOIState &stfState, + int barIndex = 0 // + ) + { + // + bool result = false; + + // + if (barIndex < 0) + { + barIndex = 0; + } + int zIndex = barIndex; + + // + result = !HasWorkingZone(); + if (!result) + { + return result; + } + + // + result = IsValid(symbol) && + IsValid(period); + if (!result) + { + // + Clean(); + return result; + } + + // + datetime cTime = iTime( + symbol, + period, + zIndex // + ); + + // + result = + // + htfState.IsValid() && + htfState.HasChild() && + htfState.HasSupplyZones() && + htfState.HasDemandZones() && + // + mtfState.IsValid() && + mtfState.HasChild() && + mtfState.HasSupplyZones() && + mtfState.HasDemandZones() && + // + stfState.IsValid() && + stfState.HasChild() + // + ; + if (!result) + { + return result; + } + + // + // Retrieve Highest Supply Zone ... + int hSupplyIDX = GetHighest(htfState.supplyZones); + int lDemandIDX = GetLowest(htfState.demandZones); + + // + result = + // + IsValidIndex(hSupplyIDX) && + IsValidIndex(lDemandIDX) + // + ; + if (!result) + { + return result; + } + + // + supplyZone = htfState.supplyZones[hSupplyIDX]; + demandZone = htfState.demandZones[lDemandIDX]; + + // + result = + // + supplyZone != NULL && + demandZone != NULL && + supplyZone.IsValid() && + demandZone.IsValid() + // + ; + if (!result) + { + // + Clean(); + return result; + } + + // + // Check Validation of Supply and Demand Zones ... + lDemandIDX = GetLowest(mtfState.demandZones); + hSupplyIDX = GetHighest(mtfState.supplyZones); + result = IsValidIndex(lDemandIDX) && + IsValidIndex(hSupplyIDX); + if (!result) + { + // + Clean(); + return result; + } + + // + // Validate Supply and Demand ... + bool isMTFHSupplyInside = + IsInside( + mtfState.supplyZones[hSupplyIDX], + supplyZone); + bool isMTFLDemandInside = + IsInside( + mtfState.demandZones[lDemandIDX], + demandZone // + ); + if (isMTFHSupplyInside && + !isMTFLDemandInside) + { + demandZone = mtfState.demandZones[lDemandIDX]; + } + else if (!isMTFHSupplyInside && + isMTFLDemandInside) + { + supplyZone = mtfState.supplyZones[hSupplyIDX]; + } + else if (isMTFHSupplyInside && + isMTFLDemandInside) + { + // + supplyZone = mtfState.supplyZones[hSupplyIDX]; + demandZone = mtfState.demandZones[lDemandIDX]; + } + + // + // Check Zones Validation ... + bool hasTrend = + supplyZone != NULL && + supplyZone.IsValid() && + demandZone != NULL && + demandZone.IsValid(); + result = hasTrend; + if (!result) + { + // + Clean(); + return result; + } + + // + datetime from = MathMax( + supplyZone.From(), + demandZone.From()); + + // + int fromIndex = iBarShift( + symbol, + period, + from // + ); + + // + // Detect Trend ... + ENUM_X_DIRECTION trend = X_DIRECTION_NONE; + datetime supplyTouch = NULL; + datetime demandTouch = NULL; + for (int i = zIndex; i < fromIndex; i++) + { + // + XOHCL iBar; + bool isInited = iBar.Init( + symbol, + period, + i // + ); + if (!isInited) + { + continue; + } + + // + bool isTouchSupplyZone = + // + iBar.low < supplyZone.Lower() && + iBar.GetUp() > supplyZone.Lower() + // + ; + if (isTouchSupplyZone && + !IsValid(supplyTouch)) + { + supplyTouch = iBar.time; + } + + // + bool isTouchDemandZone = + // + iBar.high > demandZone.Upper() && + iBar.GetDown() < demandZone.Upper() + // + ; + if (isTouchDemandZone && + !IsValid(demandTouch)) + { + demandTouch = iBar.time; + } + + // + bool canBreak = + IsValid(supplyTouch) && + IsValid(demandTouch); + + // + iBar.Clean(); + + // + if (canBreak) + { + break; + } + } + + // + hasTrend = + // + IsValid(supplyTouch) || + IsValid(demandTouch) + // + ; + if (hasTrend) + { + // + trend = + // + supplyTouch > demandTouch + ? X_DIRECTION_BEARISH + : X_DIRECTION_BULLISH + // + ; + } + + // + // Check Trend ... + result = hasTrend; + if (!result) + { + // + Clean(); + return result; + } + + // + bool hasBullishTrend = IsBullish(trend); + bool hasBearishTrend = IsBearish(trend); + + // + // Find Order Block and FVG for Trend Approve ... + + // + bool isBullishTrendApproved = false; + bool isBearishTrendApproved = false; + + // + // Now We Have to Detect at least One OrderBlock with FVG ... + // for Trend Approvement ... + bool hasOrderBlock = HasOrderBlock(); + bool hasFairValueGap = HasFairValueGap(); + if (!hasOrderBlock && + !hasFairValueGap) + { + // + int count = 0; + bool has = false; + + // + XCFVG *fvg = NULL; + XCOrderBlock *ob = NULL; + + // + has = mtfState.HasBullishOrderBlocks(); + count = mtfState.CountBullishOrderBlocks(); + + // + if (has) + { + // + // Check Order Block ... + for (int i = 0; i < count; i++) + { + // + XCOrderBlock *iOB = mtfState.bullishOrderBlocks[i]; + + // + iOB.To(cTime); + + // + // Check From Passes ... + bool isFromPassed = iOB.From() > demandZone.From(); + if (!isFromPassed) + { + continue; + } + + // + // Must inside DemandZone ... + bool isInsideDemand = IsInsideDiff( + iOB, + demandZone // + ); + if (!isInsideDemand) + { + continue; + } + + // + // Check Started ... + XOHCL startedBar; + ENUM_X_DIRECTION startedDir; + bool isStarted = iOB.IsStarted( + X_DIRECTION_BULLISH, + startedBar, + startedDir // + ); + if (!isStarted) + { + // + startedBar.Clean(); + continue; + } + + // + // Converts to Box ... + XBoxZone obBox; + bool hasOBBox = ToBox( + obBox, + iOB // + ); + if (!hasOBBox) + { + // + obBox.Clean(); + startedBar.Clean(); + continue; + } + + // + // Check Zone Must not Used before ... + bool isUsed = IsBoxUsed( + obBox, + startedBar.Index() - 1, + zIndex // + ); + if (isUsed) + { + // + obBox.Clean(); + startedBar.Clean(); + continue; + } + + // + ob = iOB; + + // + obBox.Clean(); + startedBar.Clean(); + + // + break; + } + + // + // Detect Fair Value Gap ... + if (ob != NULL && + ob.IsValid()) + { + // + has = stfState.HasBullishFairValueGaps(); + count = stfState.CountBullishFairValueGaps(); + if (has) + { + // + // Check Fir Value Gap ... + for (int i = 0; i < count; i++) + { + // + XCFVG *iFVG = stfState.bullishFairValueGaps[i]; + + // + iFVG.To(cTime); + + // + // Check From Passes ... + bool isFromPassed = iFVG.From() > ob.From(); + if (!isFromPassed) + { + continue; + } + + // + // Check Started ... + XOHCL startedBar; + ENUM_X_DIRECTION startedDir; + bool isStarted = iFVG.IsStarted( + X_DIRECTION_BULLISH, + startedBar, + startedDir // + ); + if (!isStarted) + { + // + startedBar.Clean(); + continue; + } + + // + // Converts to Box ... + XBoxZone fvgBox; + bool hasFVGBox = ToBox( + fvgBox, + iFVG // + ); + if (!hasFVGBox) + { + // + fvgBox.Clean(); + startedBar.Clean(); + continue; + } + + // + // Check Inside Order Block ... + bool isInside = IsInsideDiff( + iFVG, + ob, + true // Force Side Out ... + ); + if (!isInside) + { + continue; + } + + // + fvg = iFVG; + + // + fvgBox.Clean(); + startedBar.Clean(); + + // + break; + } + } + else + { + // + ob = NULL; + } + } + + // + if (ob != NULL && + fvg != NULL) + { + // + orderBlock = ob; + fairValueGap = fvg; + } + + // + hasOrderBlock = HasOrderBlock(); + hasFairValueGap = HasFairValueGap(); + isBullishTrendApproved = hasOrderBlock && + hasFairValueGap; + } + + // + if (!isBullishTrendApproved) + { + // + has = mtfState.HasBearishOrderBlocks(); + count = mtfState.CountBearishOrderBlocks(); + + // + if (has) + { + // + // Check Order Block ... + for (int i = 0; i < count; i++) + { + // + XCOrderBlock *iOB = mtfState.bearishOrderBlocks[i]; + + // + iOB.To(cTime); + + // + // Check From Passes ... + bool isFromPassed = iOB.From() > supplyZone.From(); + if (!isFromPassed) + { + continue; + } + + // + // Must inside DemandZone ... + bool isInsideDemand = IsInsideDiff( + iOB, + supplyZone // + ); + if (!isInsideDemand) + { + continue; + } + + // + // Check Started ... + XOHCL startedBar; + ENUM_X_DIRECTION startedDir; + bool isStarted = iOB.IsStarted( + X_DIRECTION_BEARISH, + startedBar, + startedDir // + ); + if (!isStarted) + { + // + startedBar.Clean(); + continue; + } + + // + // Converts to Box ... + XBoxZone obBox; + bool hasOBBox = ToBox( + obBox, + iOB // + ); + if (!hasOBBox) + { + // + obBox.Clean(); + startedBar.Clean(); + continue; + } + + // + // Check Zone Must not Used before ... + bool isUsed = IsBoxUsed( + obBox, + startedBar.Index() - 1, + zIndex // + ); + if (isUsed) + { + // + obBox.Clean(); + startedBar.Clean(); + continue; + } + + // + ob = iOB; + + // + obBox.Clean(); + startedBar.Clean(); + + // + break; + } + + // + // Detect Fair Value Gap ... + if (ob != NULL && + ob.IsValid()) + { + // + has = stfState.HasBearishFairValueGaps(); + count = stfState.CountBearishFairValueGaps(); + if (has) + { + // + // Check Fir Value Gap ... + for (int i = 0; i < count; i++) + { + // + XCFVG *iFVG = stfState.bearishFairValueGaps[i]; + + // + iFVG.To(cTime); + + // + // Check From Passes ... + bool isFromPassed = iFVG.From() > ob.From(); + if (!isFromPassed) + { + continue; + } + + // + // Check Started ... + XOHCL startedBar; + ENUM_X_DIRECTION startedDir; + bool isStarted = iFVG.IsStarted( + X_DIRECTION_BEARISH, + startedBar, + startedDir // + ); + if (!isStarted) + { + // + startedBar.Clean(); + continue; + } + + // + // Converts to Box ... + XBoxZone fvgBox; + bool hasFVGBox = ToBox( + fvgBox, + iFVG // + ); + if (!hasFVGBox) + { + // + fvgBox.Clean(); + startedBar.Clean(); + continue; + } + + // + // Check Inside Order Block ... + bool isInside = IsInsideDiff( + iFVG, + ob, + true // Force Side Out ... + ); + if (!isInside) + { + continue; + } + + // + fvg = iFVG; + + // + fvgBox.Clean(); + startedBar.Clean(); + + // + break; + } + } + else + { + // + ob = NULL; + } + } + + // + if (ob != NULL && + fvg != NULL) + { + // + orderBlock = ob; + fairValueGap = fvg; + } + + // + hasOrderBlock = HasOrderBlock(); + hasFairValueGap = HasFairValueGap(); + isBearishTrendApproved = hasOrderBlock && + hasFairValueGap; + } + } + } + + // + // Check Trend Approved ... + bool isTrendApproved = + hasOrderBlock && + hasFairValueGap && + (isBullishTrendApproved || + isBearishTrendApproved); + result = isTrendApproved; + if (!result) + { + // + Clean(); + return result; + } + + // + // Prepare Working Zone ... + workingZone.symbol = symbol; + workingZone.period = period; + + // + workingZone.upper = supplyZone.Lower(); + workingZone.zoneUpper = supplyZone.Upper(); + + // + workingZone.lower = demandZone.Upper(); + workingZone.zoneLower = demandZone.Lower(); + + // + workingZone.from = from; + + // + double upper = workingZone.upper; + double range = + workingZone.upper - workingZone.lower; + double ranegPercent = range / 100; + double quarterValue = ranegPercent * 25; + + // + workingZone.quarter1 = upper - (quarterValue * 1); + workingZone.quarter2 = upper - (quarterValue * 2); + workingZone.quarter3 = upper - (quarterValue * 3); + + // + result = workingZone.IsValid(); + if (!result) + { + Clean(); + } + + // + return result; + } + + // + bool IsWorkingZoneDestroyed( + ENUM_X_DIRECTION &destroyedDir, + int barIndex = 0, + ENUM_TIMEFRAMES forPeriod = NULL // + ) + { + // + bool result = false; + + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + if (!IsValid(forPeriod)) + { + forPeriod = period; + } + + // + destroyedDir = X_DIRECTION_NONE; + + // + result = workingZone.IsValid(); + if (!result) + { + return result; + } + + // + result = workingZone.IsDestroyed( + destroyedDir, + barIndex, + forPeriod // + ); + + // + return result; + } + + // + bool DetectTrend( + ENUM_X_DIRECTION &trend, + int barIndex = 0, + ENUM_TIMEFRAMES forPeriod = NULL // + ) + { + // + bool result = false; + + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + if (forPeriod == NULL) + { + forPeriod = period; + } + + // + trend = X_DIRECTION_NONE; + + // + result = HasWorkingZone(); + if (!result) + { + return result; + } + + // + int FromIndex = iBarShift( + symbol, + forPeriod, + workingZone.from // + ); + + // + datetime supplyTouch = NULL; + datetime demandTouch = NULL; + for (int i = barIndex; i < FromIndex; i++) + { + // + XOHCL iBar; + bool isInited = iBar.Init( + symbol, + forPeriod, + i // + ); + if (!isInited) + { + continue; + } + + // + bool isTouchSupplyZone = + // + iBar.low < supplyZone.Lower() && + iBar.GetUp() > supplyZone.Lower() + // + ; + if (isTouchSupplyZone && + !IsValid(supplyTouch)) + { + supplyTouch = iBar.time; + } + + // + bool isTouchDemandZone = + // + iBar.high > demandZone.Upper() && + iBar.GetDown() < demandZone.Upper() + // + ; + if (isTouchDemandZone && + !IsValid(demandTouch)) + { + demandTouch = iBar.time; + } + + // + bool canBreak = + IsValid(supplyTouch) && + IsValid(demandTouch); + + // + iBar.Clean(); + + // + if (canBreak) + { + break; + } + } + + // + result = + // + IsValid(supplyTouch) || + IsValid(demandTouch) + // + ; + if (result) + { + // + trend = + // + supplyTouch > demandTouch + ? X_DIRECTION_BEARISH + : X_DIRECTION_BULLISH + // + ; + } + + // + return result; + } + + // + bool DetectStartZones( + ENUM_X_DIRECTION forDir, + XPOIState &obState, + XPOIState &fvgState, + XPOIState &otherState, + XC121SMCCycleHelper *cycleHelper // + ) + { + // + bool result = false; + + // + result = obState.IsValid() && + obState.HasChild() && + fvgState.IsValid() && + fvgState.HasChild() && + otherState.IsValid() && + otherState.HasChild() && + HasDirection(forDir); + if (!result) + { + return result; + } + + // + bool isBullish = IsBullish(forDir); + + // + int idx = -1; + int count = 0; + int has = false; + + // + X121SMCXWZZone startZone; + X121SMCXWZZone lastStartZone; + bool hasLastStartZone = HasStartZones(); + if (hasLastStartZone) + { + // + int startZonesCount = CountStartZones(); + lastStartZone = startZones[startZonesCount - 1]; + } + + // + if (isBullish) + { + // + has = obState.HasBullishOrderBlocks(); + if (has) + { + // + count = obState.CountBullishOrderBlocks(); + for (int i = 0; i < count; i++) + { + // + XCOrderBlock *iOB = obState.bullishOrderBlocks[i]; + + // + bool isFromPassed = + !hasLastStartZone + ? true + : iOB.From() > lastStartZone.ob.From(); + if (!isFromPassed) + { + // + ZeroMemory(iOB); + continue; + } + + // + XOHCL startedBar; + ENUM_X_DIRECTION startedDir; + bool isStarted = iOB.IsStarted( + forDir, + startedBar, + startedDir // + ); + if (!isStarted) + { + // + ZeroMemory(iOB); + startedBar.Clean(); + continue; + } + + // + XOHCL activatedBar; + ENUM_X_DIRECTION activatedDir; + bool isActivated = iOB.IsActivated( + forDir, + activatedBar, + activatedDir // + ); + if (isActivated) + { + // + ZeroMemory(iOB); + startedBar.Clean(); + activatedBar.Clean(); + continue; + } + + // + // Validate Zone Iverse Breake ... + XOHCL breakedBar; + ENUM_X_DIRECTION breakedDir; + bool isBreaked = iOB.IsBreaked( + Opposit(forDir), + breakedBar, + breakedDir, + true // Ignore Activation ... + ); + if (isBreaked) + { + // + ZeroMemory(iOB); + startedBar.Clean(); + breakedBar.Clean(); + activatedBar.Clean(); + continue; + } + + // + bool isPlacePassed = + !IsInsideDiff( + iOB, + demandZone // + ) && + (!hasLastStartZone + ? workingZone.IsValid() && + HasOrderBlock() && + forDir == orderBlock.GetDirection() + ? IsAbove( + iOB, + orderBlock, + true // Ignore Inside ... + ) + : true + : lastStartZone.HasOB() && + IsAbove( + iOB, + lastStartZone.ob, + true // Ignore Inside ... + )); + if (!isPlacePassed) + { + // + ZeroMemory(iOB); + startedBar.Clean(); + activatedBar.Clean(); + continue; + } + + // + // Attache OB ... + startZone.ob = iOB; + + // + // Now we Have to Find Specified FVG ... + has = fvgState.HasBullishFairValueGaps(); + if (has) + { + // + int jCount = fvgState.CountBullishFairValueGaps(); + for (int j = 0; j < jCount; j++) + { + // + XCFVG *jFVG = fvgState.bullishFairValueGaps[j]; + + // + startedBar.Clean(); + startedDir = X_DIRECTION_NONE; + isStarted = jFVG.IsStarted( + forDir, + startedBar, + startedDir // + ); + if (!isStarted) + { + // + ZeroMemory(jFVG); + startedBar.Clean(); + continue; + } + + // + activatedBar.Clean(); + activatedDir = X_DIRECTION_NONE; + isActivated = jFVG.IsActivated( + forDir, + activatedBar, + activatedDir // + ); + if (isActivated) + { + // + ZeroMemory(jFVG); + startedBar.Clean(); + activatedBar.Clean(); + continue; + } + + // + // Validate Zone Iverse Breake ... + breakedBar.Clean(); + breakedDir = X_DIRECTION_NONE; + bool isBreaked = jFVG.IsBreaked( + Opposit(forDir), + breakedBar, + breakedDir, + true // Ignore Activation ... + ); + if (isBreaked) + { + // + ZeroMemory(jFVG); + startedBar.Clean(); + breakedBar.Clean(); + activatedBar.Clean(); + continue; + } + + // + isPlacePassed = + // + !IsInsideDiff( + jFVG, + demandZone // + ) && + IsAboveDiff( + jFVG, + iOB, + true // Ignore Inside ... + ) + // + ; + if (!isPlacePassed) + { + // + ZeroMemory(jFVG); + startedBar.Clean(); + activatedBar.Clean(); + } + + // + startZone.fvg = jFVG; + } + } + + // + startedBar.Clean(); + activatedBar.Clean(); + } + } + } + else + { + // + has = obState.HasBearishOrderBlocks(); + if (has) + { + // + count = obState.CountBearishOrderBlocks(); + for (int i = 0; i < count; i++) + { + // + XCOrderBlock *iOB = obState.bearishOrderBlocks[i]; + + // + bool isFromPassed = + !hasLastStartZone + ? true + : iOB.From() > lastStartZone.ob.From(); + if (!isFromPassed) + { + // + ZeroMemory(iOB); + continue; + } + + // + XOHCL startedBar; + ENUM_X_DIRECTION startedDir; + bool isStarted = iOB.IsStarted( + forDir, + startedBar, + startedDir // + ); + if (!isStarted) + { + // + ZeroMemory(iOB); + startedBar.Clean(); + continue; + } + + // + XOHCL activatedBar; + ENUM_X_DIRECTION activatedDir; + bool isActivated = iOB.IsActivated( + forDir, + activatedBar, + activatedDir // + ); + if (isActivated) + { + // + ZeroMemory(iOB); + startedBar.Clean(); + activatedBar.Clean(); + continue; + } + + // + // Validate Zone Iverse Breake ... + XOHCL breakedBar; + ENUM_X_DIRECTION breakedDir; + bool isBreaked = iOB.IsBreaked( + Opposit(forDir), + breakedBar, + breakedDir, + true // Ignore Activation ... + ); + if (isBreaked) + { + // + ZeroMemory(iOB); + startedBar.Clean(); + breakedBar.Clean(); + activatedBar.Clean(); + continue; + } + + // + bool isPlacePassed = + !IsInsideDiff( + iOB, + supplyZone // + ) && + (!hasLastStartZone + ? workingZone.IsValid() && + HasOrderBlock() && + forDir == orderBlock.GetDirection() + ? IsBelow( + iOB, + orderBlock, + true // Ignore Inside ... + ) + : true + : lastStartZone.HasOB() && + IsBelow( + iOB, + lastStartZone.ob, + true // Ignore Inside ... + )); + if (!isPlacePassed) + { + // + ZeroMemory(iOB); + startedBar.Clean(); + activatedBar.Clean(); + continue; + } + + // + // Attache OB ... + startZone.ob = iOB; + + // + // Now we Have to Find Specified FVG ... + has = fvgState.HasBearishFairValueGaps(); + if (has) + { + // + int jCount = fvgState.CountBearishFairValueGaps(); + for (int j = 0; j < jCount; j++) + { + // + XCFVG *jFVG = fvgState.bearishFairValueGaps[j]; + + // + startedBar.Clean(); + startedDir = X_DIRECTION_NONE; + isStarted = jFVG.IsStarted( + forDir, + startedBar, + startedDir // + ); + if (!isStarted) + { + // + ZeroMemory(jFVG); + startedBar.Clean(); + continue; + } + + // + activatedBar.Clean(); + activatedDir = X_DIRECTION_NONE; + isActivated = jFVG.IsActivated( + forDir, + activatedBar, + activatedDir // + ); + if (isActivated) + { + // + ZeroMemory(jFVG); + startedBar.Clean(); + activatedBar.Clean(); + continue; + } + + // + // Validate Zone Iverse Breake ... + breakedBar.Clean(); + breakedDir = X_DIRECTION_NONE; + bool isBreaked = jFVG.IsBreaked( + Opposit(forDir), + breakedBar, + breakedDir, + true // Ignore Activation ... + ); + if (isBreaked) + { + // + ZeroMemory(jFVG); + startedBar.Clean(); + breakedBar.Clean(); + activatedBar.Clean(); + continue; + } + + // + isPlacePassed = + // + !IsInsideDiff( + jFVG, + supplyZone // + ) && + IsBelowDiff( + jFVG, + iOB, + true // Ignore Inside ... + ) + // + ; + if (!isPlacePassed) + { + // + ZeroMemory(jFVG); + startedBar.Clean(); + activatedBar.Clean(); + } + + // + startZone.fvg = jFVG; + } + } + + // + startedBar.Clean(); + activatedBar.Clean(); + } + } + } + + // + bool hasOBFVG = startZone.HasOB() && + startZone.HasFVG(); + result = hasOBFVG; + if (!result) + { + // + startZone.Clean(); + lastStartZone.Clean(); + + // + return result; + } + + // + XBoxZone startBox; + bool hasStartBox = startZone.AsBox(startBox); + result = hasStartBox; + if (!result) + { + // + startBox.Clean(); + startZone.Clean(); + lastStartZone.Clean(); + + // + return result; + } + + // + // Detect Other Zones Inside Box ... + XBoxZone tmpBoxes[]; + + // + // Supply Zones ... + has = otherState.HasSupplyZones(); + if (has) + { + // + count = ToBox( + otherState.supplyZones, + tmpBoxes // + ); + + // + has = IsValidSize(count); + if (has) + { + // + for (int i = 0; i < count; i++) + { + // + XBoxZone iBox = tmpBoxes[i]; + + // + bool isPlacePassed = + // + IsBoxInside( + iBox, + startBox, + false, + false // + ) + // + ; + if (!isPlacePassed) + { + // + iBox.Clean(); + continue; + } + + // + startZone.supply = otherState.supplyZones[i]; + + // + iBox.Clean(); + break; + } + } + } + + // + // Demand Zones ... + Clean(tmpBoxes); + has = otherState.HasDemandZones(); + if (has) + { + // + count = ToBox( + otherState.demandZones, + tmpBoxes // + ); + + // + has = IsValidSize(count); + if (has) + { + // + for (int i = 0; i < count; i++) + { + // + XBoxZone iBox = tmpBoxes[i]; + + // + bool isPlacePassed = + // + IsBoxInside( + iBox, + startBox, + false, + false // + ) + // + ; + if (!isPlacePassed) + { + // + iBox.Clean(); + continue; + } + + // + startZone.demand = otherState.demandZones[i]; + + // + iBox.Clean(); + break; + } + } + } + + // + // Support Zones ... + Clean(tmpBoxes); + has = otherState.HasSupportZones(); + if (has) + { + // + count = ToBox( + otherState.supportZones, + tmpBoxes // + ); + + // + has = IsValidSize(count); + if (has) + { + // + for (int i = 0; i < count; i++) + { + // + XBoxZone iBox = tmpBoxes[i]; + + // + bool isPlacePassed = + // + IsBoxInside( + iBox, + startBox, + false, + false // + ) + // + ; + if (!isPlacePassed) + { + // + iBox.Clean(); + continue; + } + + // + startZone.support = otherState.supportZones[i]; + + // + iBox.Clean(); + break; + } + } + } + + // + // Resistance Zones ... + Clean(tmpBoxes); + has = otherState.HasResistanceZones(); + if (has) + { + // + count = ToBox( + otherState.resistanceZones, + tmpBoxes // + ); + + // + has = IsValidSize(count); + if (has) + { + // + for (int i = 0; i < count; i++) + { + // + XBoxZone iBox = tmpBoxes[i]; + + // + bool isPlacePassed = + // + IsBoxInside( + iBox, + startBox, + false, + false // + ) + // + ; + if (!isPlacePassed) + { + // + iBox.Clean(); + continue; + } + + // + startZone.resistance = otherState.resistanceZones[i]; + + // + iBox.Clean(); + break; + } + } + } + + // + result = startZone.IsValid() && + startZone.HasDirection(); + if (result) + { + // + AddRef( + startZone, + startZones // + ); + } + + // + Clean(tmpBoxes); + startBox.Clean(); + startZone.Clean(); + lastStartZone.Clean(); + + // + return result; + } + + // + void ValidateStartZones( + int barIndex = 0, + ENUM_TIMEFRAMES forPeriod = NULL // + ) + { + // + bool has = HasStartZones(); + if (!has) + { + return; + } + + // + X121SMCXWZZone tmpZones[]; + int count = CountStartZones(); + Copy( + startZones, + tmpZones // + ); + for (int i = 0; i < count; i++) + { + // + bool isValid = tmpZones[i].ValidateZone( + barIndex, + forPeriod // + ); + if (!isValid) + { + // + ArrayRemove( + startZones, + i, + 1 // + ); + } + } + + // + Clean(tmpZones); + } + + // + void DetectPriority( + ENUM_X121SMC_XWZ_PRIORITY &bullish, + ENUM_X121SMC_XWZ_PRIORITY &bearish, + int barIndex = 0, + ENUM_TIMEFRAMES forPeriod = NULL // + ) + { + // + bullish = X121SMC_XWZ_PRIORITY_NONE; + bearish = X121SMC_XWZ_PRIORITY_NONE; + + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + if (!IsValid(forPeriod)) + { + forPeriod = period; + } + + // + bool hasWorkingZone = HasWorkingZone(); + if (!hasWorkingZone) + { + return; + } + + // + XOHCL zBar; + bool isInited = zBar.Init( + symbol, + forPeriod, + barIndex // + ); + if (!isInited) + { + // + zBar.Clean(); + return; + } + + // + XOHCL cBar; + isInited = zBar.GetPreviousBar(cBar); + if (!isInited) + { + // + zBar.Clean(); + cBar.Clean(); + return; + } + + // + // ZoneUpper, Upper ... + if (cBar.low > workingZone.upper && + cBar.high < workingZone.zoneUpper && + zBar.low > workingZone.upper && + zBar.high < workingZone.zoneUpper) + { + // + bullish = X121SMC_XWZ_PRIORITY_NONE; + bearish = X121SMC_XWZ_PRIORITY_STRONG_HIGH; + } + // + // Upper, Quarter1 ... + else if (cBar.low > workingZone.quarter1 && + cBar.high < workingZone.upper && + zBar.low > workingZone.quarter1 && + zBar.high < workingZone.upper) + { + // + bullish = X121SMC_XWZ_PRIORITY_WEAK; + bearish = X121SMC_XWZ_PRIORITY_HIGH; + } + // + // Quarter1, Quarter2 ... + else if (cBar.low > workingZone.quarter2 && + cBar.high < workingZone.quarter1 && + zBar.low > workingZone.quarter2 && + zBar.high < workingZone.quarter1) + { + // + bullish = X121SMC_XWZ_PRIORITY_LOW; + bearish = X121SMC_XWZ_PRIORITY_REGULAR; + } + // + // Quarter2, Quarter3 ... + else if (cBar.low > workingZone.quarter3 && + cBar.high < workingZone.quarter2 && + zBar.low > workingZone.quarter3 && + zBar.high < workingZone.quarter2) + { + // + bullish = X121SMC_XWZ_PRIORITY_REGULAR; + bearish = X121SMC_XWZ_PRIORITY_LOW; + } + // + // Quarter3, Lower ... + else if (cBar.low > workingZone.lower && + cBar.high < workingZone.quarter3 && + zBar.low > workingZone.lower && + zBar.high < workingZone.quarter3) + { + // + bullish = X121SMC_XWZ_PRIORITY_HIGH; + bearish = X121SMC_XWZ_PRIORITY_WEAK; + } + // + // Lower, ZoneLower ... + else if (cBar.low > workingZone.zoneLower && + cBar.high < workingZone.lower && + zBar.low > workingZone.zoneLower && + zBar.high < workingZone.lower) + { + // + bullish = X121SMC_XWZ_PRIORITY_STRONG_HIGH; + bearish = X121SMC_XWZ_PRIORITY_NONE; + } + + // + zBar.Clean(); + cBar.Clean(); + } + + // + bool HasConditions( + double &_pivot, + double &_point, + ENUM_X_DIRECTION &conditionsDir, + XPOIState &state, + int barIndex = 0, + ENUM_TIMEFRAMES forPeriod = NULL // + ) + { + // + bool result = false; + + // + _pivot = 0; + _point = 0; + conditionsDir = X_DIRECTION_NONE; + + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + if (forPeriod == NULL) + { + forPeriod = period; + } + + // + result = + // + IsValid(symbol) && + IsValid(period) && + state.IsValid() && + HasWorkingZone() && + state.HasChild() + // + ; + if (!result) + { + return result; + } + + // + result = false; + + // + ValidateStartZones( + barIndex, + forPeriod // + ); + + // + // Detect Conditions Based On Start Zones ... + bool hasStartZones = HasStartZones(); + if (hasStartZones) + { + // + int selectedIndex = -1; + int count = CountStartZones(); + for (int i = 0; i < count; i++) + { + // + X121SMCXWZZone iStartZone = startZones[i]; + + // + XBoxZone selectedBox; + bool hasConditions = false; + bool isBullish = iStartZone.IsBullish(); + + // + // Conditions Inside Box ... + bool isPriceInside = iStartZone.IsPriceInside( + selectedBox, + barIndex, + forPeriod, + false, + false // + ); + if (isPriceInside) + { + // + // hasConditions = iStartZone.HasInsideConditions( + // state, + // barIndex, + // period // + // ); + + // + hasConditions = true; + + // + if (hasConditions) + { + // + _pivot = + // + isBullish + ? selectedBox.lower + : selectedBox.upper + // + ; + + // + _point = + // + isBullish + ? selectedBox.upper + : selectedBox.lower + // + ; + + // + conditionsDir = selectedBox.dir; + result = hasConditions; + iStartZone.Clean(); + break; + } + } + + // // + // // Order Block Rejection Conditions ... + // bool hasOBBox = ToBox( + // selectedBox, + // iStartZone.ob // + // ); + // if (hasOBBox && + // !hasConditions) + // { + // // + // hasConditions = iStartZone.HasBoxConitions( + // selectedBox, + // state, + // barIndex, + // forPeriod // + // ); + + // // + // if (hasConditions) + // { + // // + // _pivot = + // // + // isBullish + // ? selectedBox.lower + // : selectedBox.upper + // // + // ; + + // // + // _point = + // // + // isBullish + // ? selectedBox.upper + // : selectedBox.lower + // // + // ; + + // // + // conditionsDir = selectedBox.dir; + // result = hasConditions; + // iStartZone.Clean(); + // break; + // } + // } + + // // + // // Fair Value Gap Rejection Conditions ... + // bool hasFVGBox = ToBox( + // selectedBox, + // iStartZone.fvg // + // ); + // if (hasFVGBox) + // { + // // + // hasConditions = iStartZone.HasBoxConitions( + // selectedBox, + // state, + // barIndex, + // forPeriod // + // ); + + // // + // if (hasConditions) + // { + // // + // _pivot = + // // + // isBullish + // ? selectedBox.lower + // : selectedBox.upper + // // + // ; + + // // + // _point = + // // + // isBullish + // ? selectedBox.upper + // : selectedBox.lower + // // + // ; + + // // + // conditionsDir = selectedBox.dir; + // result = hasConditions; + // iStartZone.Clean(); + // break; + // } + // } + + // + iStartZone.Clean(); + } + + // + if (result && + IsValidIndex(selectedIndex)) + { + // + ArrayRemove( + startZones, + selectedIndex, + 1 // + ); + } + } + + // + // Detect Conditions Based On Working Zones ... + if (!result) + { + // + // Detect Result Based On WorkingZone ... + } + + // + if (!result) + { + // + _point = 0; + _pivot = 0; + conditionsDir = X_DIRECTION_NONE; + + // + return result; + } + + // + return result; + } + + // +}; + +// +bool X121SMCXWZCheckPriceInside( + XOHCL &zBar, + XOHCL &cBar, + double upper, + double lower // +) +{ + // + bool result = false; + + // + result = zBar.IsValid() && + cBar.IsValid() && + upper > 0 && + lower > 0 && + upper > lower && + zBar.time > cBar.time; + if (!result) + { + return result; + } + + // + result = + // + zBar.high < upper && + cBar.high < upper && + // + zBar.low > lower && + cBar.low > lower + // + ; + + // + return result; +} + +// \ No newline at end of file diff --git a/BKPS/14031206/Documents/BKP/x-121.smc.xwz.signal.lib.mq5 b/BKPS/14031206/Documents/BKP/x-121.smc.xwz.signal.lib.mq5 new file mode 100644 index 0000000..ac6f042 --- /dev/null +++ b/BKPS/14031206/Documents/BKP/x-121.smc.xwz.signal.lib.mq5 @@ -0,0 +1,3560 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 X121 SMC Signal Class +// ------------------------------------------------- +// Name: XWZ +// Description: provide all Signalling 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 + +// +// Imports ... +// #include "../../Libraries/x-trade.lib" +#include "../Classes/x-121.smc.market.cycle.helper.class.mq5" +#include "../Libraries/x-121.smc.guard.lib.mq5" +#include "../Libraries/x-121.smc.lib.mq5" + +// +enum ENUM_X121SMC_XWZ_PRIORITY +{ + X121SMC_XWZ_PRIORITY_NONE, + X121SMC_XWZ_PRIORITY_WEAK, + X121SMC_XWZ_PRIORITY_LOW, + X121SMC_XWZ_PRIORITY_REGULAR, + X121SMC_XWZ_PRIORITY_HIGH, + X121SMC_XWZ_PRIORITY_STRONG_HIGH, +}; + +// +struct X121SMCXWZZone +{ + // + // Props ... + XCFVG *fvg; + XCOrderBlock *ob; + XCSupplyZone *supply; + XCDemandZone *demand; + XCSupportZone *support; + XCResistanceZone *resistance; + + // + XOHCL swingBar; + XOHCL breakerBar; + XOHCL momentumBar; + XOHCL rejectionBar; + XBoxZone appliedBox; + + // + // Constructor ... + X121SMCXWZZone() + { + Clean(); + } + + // + // Tools ... + + // + void Clean() + { + // + ZeroMemory(ob); + ZeroMemory(fvg); + ZeroMemory(supply); + ZeroMemory(demand); + ZeroMemory(support); + ZeroMemory(resistance); + + // + swingBar.Clean(); + breakerBar.Clean(); + appliedBox.Clean(); + momentumBar.Clean(); + rejectionBar.Clean(); + } + + // + bool IsValid() + { + // + return HasOB() && + HasFVG() && + HasDirection(); + } + + // + bool AsBox(XBoxZone &box) + { + // + bool result = false; + + // + box.Clean(); + + // + result = IsValid() && + HasDirection(); + if (!result) + { + return result; + } + + // + XBoxZone obBox; + bool hasOBBox = ToBox( + obBox, + ob // + ); + result = hasOBBox; + if (!result) + { + // + box.Clean(); + obBox.Clean(); + return result; + } + + // + box = obBox; + + // + obBox.Clean(); + + // + bool hasOB = HasOB(); + bool hasFVG = HasFVG(); + bool hasSupply = HasSupply(); + bool hasDemand = HasDemand(); + bool hasSupport = HasSupport(); + bool hasResistance = HasResistance(); + + // + // OB Compared since box used obBox ... + + // + if (hasFVG) + { + // + if (fvg.Upper() > box.upper) + { + box.upper = fvg.Upper(); + } + + // + if (fvg.Lower() < box.lower) + { + box.lower = fvg.Lower(); + } + } + + // + result = box.IsValid(); + + // + return result; + } + + // + bool HasOB() + { + return ob != NULL && + ob.IsValid(); + } + + // + bool HasFVG() + { + return fvg != NULL && + fvg.IsValid(); + } + + // + bool HasSupply() + { + return supply != NULL && + supply.IsValid(); + } + + // + bool HasDemand() + { + return demand != NULL && + demand.IsValid(); + } + + // + bool HasSupport() + { + return support != NULL && + support.IsValid(); + } + + // + bool HasResistance() + { + return resistance != NULL && + resistance.IsValid(); + } + + // + bool IsBullish() + { + // + return HasOB() && + ob.IsBullish() && + HasFVG() && + fvg.IsBullish(); + } + + // + bool IsBearish() + { + // + return HasOB() && + ob.IsBearish() && + HasFVG() && + fvg.IsBearish(); + } + + // + bool HasDirection() + { + return IsBullish() || + IsBearish(); + } + + // + ENUM_X_DIRECTION GetDirection() + { + // + ENUM_X_DIRECTION result = X_DIRECTION_NONE; + + // + bool hasDirection = HasDirection(); + if (!hasDirection) + { + return result; + } + + // + bool isBullish = IsBullish(); + + // + result = + isBullish + ? X_DIRECTION_BULLISH + : X_DIRECTION_BEARISH; + + // + return result; + } + + // + bool IsPriceInside( + XBoxZone &box, + int barIndex = 0, + ENUM_TIMEFRAMES forPeriod = NULL, + bool forceOB = false, + bool forceFVG = false // + ) + { + // + bool result = false; + + // + box.Clean(); + + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + result = IsValid() && + HasOB() && + HasFVG() && + HasDirection(); + if (!result) + { + return result; + } + + // + string symbol = ob.GetSymbol(); + if (forPeriod == NULL) + { + forPeriod = ob.GetPeriod(); + } + + // + ENUM_X_DIRECTION forDir = ob.GetDirection(); + bool isBullish = IsBullish(forDir); + + // + // Check Start Bars ... + + // + XOHCL obStartedBar; + ENUM_X_DIRECTION obStartedDir; + bool isOBStarted = ob.IsStarted( + forDir, + obStartedBar, + obStartedDir // + ); + result = isOBStarted; + if (!result) + { + return result; + } + + // + XOHCL fvgStartedBar; + ENUM_X_DIRECTION fvgStartedDir; + bool isFVGStarted = fvg.IsStarted( + forDir, + fvgStartedBar, + fvgStartedDir // + ); + result = isFVGStarted; + if (!result) + { + return result; + } + + // + // Retrieve Bars ... + + // + XOHCL zBar; + result = zBar.Init( + symbol, + forPeriod, + barIndex // + ); + if (!result) + { + // + box.Clean(); + zBar.Clean(); + + // + return result; + } + + // + XOHCL cBar; + result = zBar.GetPreviousBar(cBar); + if (!result) + { + // + box.Clean(); + zBar.Clean(); + cBar.Clean(); + + // + return result; + } + + // + XOHCL pBar; + result = cBar.GetPreviousBar(pBar); + if (!result) + { + // + box.Clean(); + zBar.Clean(); + cBar.Clean(); + pBar.Clean(); + + // + return result; + } + + // + bool isPriceInsideOB = X121SMCXWZCheckPriceInside( + zBar, + cBar, + ob.Upper(), + ob.Lower() // + ); + + // + // isBullish + // ? ( + // // + // pBar.close > ob.Upper() && + // cBar.low <= ob.Upper() && + // cBar.close <= ob.Upper() && + // zBar.open <= ob.Upper() + // // + // ) + // : ( + // // + // pBar.close < ob.Lower() && + // cBar.high >= ob.Lower() && + // cBar.close >= ob.Lower() && + // zBar.open >= ob.Lower() + // // + // ); + + // + bool isPriceInsideFVG = X121SMCXWZCheckPriceInside( + zBar, + cBar, + fvg.Upper(), + fvg.Lower() // + ); + + // + // isBullish + // ? ( + // // + // pBar.close > fvg.Upper() && + // cBar.low <= fvg.Upper() && + // cBar.close <= fvg.Upper() && + // zBar.open <= fvg.Upper() + // // + // ) + // : ( + // // + // pBar.close < fvg.Lower() && + // cBar.high >= fvg.Lower() && + // cBar.close >= fvg.Lower() && + // zBar.open >= fvg.Lower() + // // + // ); + + // + if ((forceOB && forceFVG) || + (!forceOB && !forceFVG)) + { + // + result = + isPriceInsideOB || + isPriceInsideFVG; + } + else if (forceOB) + { + result = isPriceInsideOB; + } + else if (forceFVG) + { + result = isPriceInsideFVG; + } + + // + if (result) + { + // + if (isPriceInsideOB && !isPriceInsideFVG) + { + // + result = ToBox( + box, + ob // + ); + } + else if (isPriceInsideFVG && !isPriceInsideOB) + { + // + result = ToBox( + box, + fvg // + ); + } + else if (isPriceInsideOB && isPriceInsideFVG) + { + result = AsBox(box); + } + } + + // + zBar.Clean(); + cBar.Clean(); + pBar.Clean(); + + // + return result; + } + + // + bool HasInsideConditions( + XPOIState &state, + int barIndex = 0, + ENUM_TIMEFRAMES forPeriod = NULL // + ) + { + // + bool result = false; + + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + swingBar.Clean(); + breakerBar.Clean(); + appliedBox.Clean(); + momentumBar.Clean(); + rejectionBar.Clean(); + + // + XBoxZone zoneBox; + bool hasBox = AsBox(zoneBox); + + // + result = hasBox && + IsValid() && + HasDirection() && + state.IsValid() && + state.HasChild(); + if (!result) + { + // + swingBar.Clean(); + breakerBar.Clean(); + appliedBox.Clean(); + momentumBar.Clean(); + rejectionBar.Clean(); + + // + return result; + } + + // + string symbol = zoneBox.symbol; + if (!IsValid(forPeriod)) + { + forPeriod = zoneBox.period; + } + datetime cTime = iTime( + symbol, + forPeriod, + barIndex // + ); + + // + ENUM_X_DIRECTION forDir = zoneBox.dir; + bool isBullish = IsBullish(forDir); + + // + int count = 0; + bool has = false; + + // + XBoxZone supResBoxes[]; + int supresBoxesCount = 0; + bool hasSupResBoxes = false; + + // + has = state.HasSupportZones(); + if (has) + { + // + count = state.CountSupportZones(); + for (int i = 0; i < count; i++) + { + // + XCSupportZone *iZone = state.supportZones[i]; + + // + iZone.To(cTime); + + // + XBoxZone iBox; + bool hasBox = ToBox( + iBox, + iZone // + ); + if (!hasBox) + { + // + iBox.Clean(); + continue; + } + + // + // Check From ... + bool isInside = IsBoxInside( + iBox, + zoneBox // + ); + if (!isInside) + { + // + iBox.Clean(); + continue; + } + + // + AddRef( + iBox, + supResBoxes // + ); + + // + iBox.Clean(); + ZeroMemory(iZone); + } + + // + supresBoxesCount = ArraySize(supResBoxes); + hasSupResBoxes = IsValidSize(supresBoxesCount); + } + + // + has = state.HasResistanceZones(); + if (has) + { + // + count = state.CountResistanceZones(); + for (int i = 0; i < count; i++) + { + // + XCResistanceZone *iZone = state.resistanceZones[i]; + + // + iZone.To(cTime); + + // + XBoxZone iBox; + bool hasBox = ToBox( + iBox, + iZone // + ); + if (!hasBox) + { + // + iBox.Clean(); + continue; + } + + // + // Check From ... + bool isInside = IsBoxInside( + iBox, + zoneBox // + ); + if (!isInside) + { + // + iBox.Clean(); + continue; + } + + // + AddRef( + iBox, + supResBoxes // + ); + + // + iBox.Clean(); + ZeroMemory(iZone); + } + + // + supresBoxesCount = ArraySize(supResBoxes); + hasSupResBoxes = IsValidSize(supresBoxesCount); + } + + // + result = hasSupResBoxes; + if (!result) + { + // + Clean(supResBoxes); + + // + swingBar.Clean(); + breakerBar.Clean(); + appliedBox.Clean(); + momentumBar.Clean(); + rejectionBar.Clean(); + + // + return result; + } + + // + for (int i = 0; i < supresBoxesCount; i++) + { + // + XBoxZone iBox = supResBoxes[i]; + + // + bool hasBoxConditions = HasBoxConitions( + iBox, + state, + barIndex, + forPeriod // + ); + if (hasBoxConditions) + { + // + appliedBox = iBox; + result = true; + iBox.Clean(); + break; + } + + // + iBox.Clean(); + } + + // + if (!result) + { + // + swingBar.Clean(); + breakerBar.Clean(); + appliedBox.Clean(); + momentumBar.Clean(); + rejectionBar.Clean(); + } + + // + Clean(supResBoxes); + + // + return result; + } + + // + bool HasBoxConitions( + XBoxZone &box, + XPOIState &state, + int barIndex = 0, + ENUM_TIMEFRAMES forPeriod = NULL // + ) + { + // + bool result = false; + + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + result = box.IsValid() && + IsValid() && + HasDirection(); + if (!result) + { + // + swingBar.Clean(); + breakerBar.Clean(); + appliedBox.Clean(); + momentumBar.Clean(); + rejectionBar.Clean(); + + // + return result; + } + + // + string symbol = box.symbol; + if (forPeriod == NULL) + { + forPeriod = box.period; + } + ENUM_X_DIRECTION forDir = box.dir; + bool isBullish = IsBullish(forDir); + + // + // Detect Bars ... + + // + XOHCL zBar; + result = zBar.Init( + symbol, + forPeriod, + barIndex // + ); + if (!result) + { + // + zBar.Clean(); + + // + swingBar.Clean(); + breakerBar.Clean(); + appliedBox.Clean(); + momentumBar.Clean(); + rejectionBar.Clean(); + + // + return result; + } + + // + XOHCL cBar; + result = zBar.GetPreviousBar(cBar); + if (!result) + { + // + zBar.Clean(); + cBar.Clean(); + + // + swingBar.Clean(); + breakerBar.Clean(); + appliedBox.Clean(); + momentumBar.Clean(); + rejectionBar.Clean(); + + // + return result; + } + + // + XOHCL pBar; + result = cBar.GetPreviousBar(pBar); + if (!result) + { + // + zBar.Clean(); + cBar.Clean(); + pBar.Clean(); + + // + swingBar.Clean(); + breakerBar.Clean(); + appliedBox.Clean(); + momentumBar.Clean(); + rejectionBar.Clean(); + + // + return result; + } + + // + XOHCL ppBar; + result = pBar.GetPreviousBar(ppBar); + if (!result) + { + // + zBar.Clean(); + cBar.Clean(); + pBar.Clean(); + ppBar.Clean(); + + // + swingBar.Clean(); + breakerBar.Clean(); + appliedBox.Clean(); + momentumBar.Clean(); + rejectionBar.Clean(); + + // + return result; + } + + // + double fiboPressureLevel = GetFiboLevelValue(X_FIBO_LEVEL_382); + + // + double fiboUpDown = GetFibonacciLevel( + pBar.high, + pBar.low, + X_FIBO_LEVEL_382, + X_DIRECTION_BEARISH // + ); + double fiboDownUp = GetFibonacciLevel( + pBar.high, + pBar.low, + X_FIBO_LEVEL_382, + X_DIRECTION_BULLISH // + ); + + // + bool hasFiboToUpPressure = + fiboDownUp > 0 && + fiboDownUp <= pBar.GetDown(); + bool hasFiboToDownPressure = + fiboUpDown > 0 && + fiboUpDown >= pBar.GetUp(); + + // + double appliedPrice = + isBullish + ? box.upper + : box.lower; + + // + // Check Swing Low ... + bool isSwingLow = + // + pBar.low < ppBar.low && + pBar.low < cBar.low && + zBar.open > pBar.low && + // + appliedPrice > pBar.low && + appliedPrice < pBar.GetDown() + // + ; + bool isPressuredSwingLow = + isSwingLow && + hasFiboToUpPressure; + bool isPressuredStrongSwingLow = + pBar.IsBullish() && + isPressuredSwingLow; + + // + bool isSwingHigh = + // + pBar.high > ppBar.high && + pBar.high > cBar.high && + zBar.open < pBar.high && + // + appliedPrice < pBar.high && + appliedPrice > pBar.GetUp() + // + ; + bool isPressuredSwingHigh = + isSwingHigh && + hasFiboToDownPressure; + bool isPressuredStrongSwingHigh = + pBar.IsBearish() && + isPressuredSwingHigh; + + // + bool hasValidSwing = + isBullish + ? isSwingLow + : isSwingHigh; + bool hasValidPressuredSwing = + isBullish + ? isPressuredSwingLow + : isPressuredSwingHigh; + bool hasValidPressuredStrongSwing = + isBullish + ? isPressuredStrongSwingLow + : isPressuredStrongSwingHigh; + if (hasValidSwing) + { + swingBar = pBar; + } + if (hasValidPressuredSwing) + { + swingBar = pBar; + } + if (hasValidPressuredStrongSwing) + { + swingBar = pBar; + } + + // + bool isCBarBreaked = IsBarBreak( + appliedPrice, + forDir, + cBar // + ); + if (isCBarBreaked) + { + breakerBar = cBar; + } + bool isPBarBreaked = IsBarBreak( + appliedPrice, + forDir, + pBar // + ); + if (!isCBarBreaked && isPBarBreaked) + { + breakerBar = pBar; + } + else + { + isPBarBreaked = false; + } + bool isPPBarBreaked = IsBarBreak( + appliedPrice, + forDir, + ppBar // + ); + if (!isCBarBreaked && + !isPBarBreaked && + isPPBarBreaked) + { + breakerBar = ppBar; + } + else + { + isPPBarBreaked = false; + } + bool isBoxBreaked = isCBarBreaked || + isPBarBreaked || + isPPBarBreaked; + + // + bool isCBarRejected = IsBarReject( + appliedPrice, + forDir, + cBar // + ); + if (isCBarRejected) + { + rejectionBar = cBar; + } + bool isPBarRejected = IsBarReject( + appliedPrice, + forDir, + pBar // + ); + if (!isCBarRejected && isPBarRejected) + { + rejectionBar = pBar; + } + else + { + isPBarRejected = false; + } + bool isPPBarRejected = IsBarReject( + appliedPrice, + forDir, + ppBar // + ); + if (!isCBarRejected && + !isPBarRejected && + isPPBarRejected) + { + rejectionBar = ppBar; + } + else + { + isPPBarRejected = false; + } + bool isBoxRejected = isCBarRejected || + isPBarRejected || + isPPBarRejected; + + // + result = + // + isBoxBreaked || + isBoxRejected || + hasValidPressuredSwing + // + ; + if (!result) + { + // + swingBar.Clean(); + breakerBar.Clean(); + appliedBox.Clean(); + momentumBar.Clean(); + rejectionBar.Clean(); + } + else + { + appliedBox = box; + } + + // + zBar.Clean(); + cBar.Clean(); + pBar.Clean(); + ppBar.Clean(); + + // + return result; + } + + // +}; + +// +struct X121SMCXWZWorkingZone +{ + // + string symbol; + ENUM_TIMEFRAMES period; + + // + double upper; + double lower; + + // + double zoneUpper; + double zoneLower; + + // + double quarter1; + double quarter2; + double quarter3; + + // + datetime to; + datetime from; + + // + XOHCL swingBar; + XOHCL breakerBar; + XOHCL momentumBar; + XOHCL rejectionBar; + XBoxZone appliedBox; + + // + X121SMCXWZWorkingZone() + { + Clean(); + } + + // + void Clean() + { + // + upper = 0; + lower = 0; + quarter1 = 0; + quarter2 = 0; + quarter3 = 0; + zoneLower = 0; + zoneUpper = 0; + + // + from = NULL; + symbol = NULL; + period = NULL; + + // + CleanConditionBars(); + + // + ZeroMemory(this); + } + + // + void CleanConditionBars() + { + // + swingBar.Clean(); + breakerBar.Clean(); + appliedBox.Clean(); + momentumBar.Clean(); + rejectionBar.Clean(); + } + + // + bool IsValid() + { + // + bool result = false; + + // + result = + lower > 0 && + upper > 0 && + quarter1 > 0 && + quarter2 > 0 && + quarter3 > 0 && + upper > lower && + zoneLower > 0 && + zoneUpper > 0 && + IsValid(from) && + IsValid(symbol) && + IsValid(period) && + zoneUpper > upper && + zoneLower < lower; + + // + return result; + } + + // + bool IsDestroyed( + ENUM_X_DIRECTION &destroyedDir, + int barIndex = 0, + ENUM_TIMEFRAMES forPeriod = NULL // + ) + { + // + bool result = false; + + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + if (!IsValid(forPeriod)) + { + forPeriod = period; + } + + // + destroyedDir = X_DIRECTION_NONE; + + // + result = IsValid(); + if (!result) + { + return result; + } + + // + XOHCL bar; + result = bar.Init( + symbol, + forPeriod, + barIndex // + ); + if (!result) + { + return result; + } + + // + bool isUpperBreaked = + bar.high > zoneUpper && + bar.close > zoneUpper; + + // + bool isLowerBreaked = + bar.low < zoneLower && + bar.close < zoneLower; + + // + result = isUpperBreaked || + isLowerBreaked; + if (result) + { + // + destroyedDir = + isUpperBreaked + ? X_DIRECTION_BULLISH + : X_DIRECTION_BEARISH; + } + + // + return result; + } + + // +}; + +// +// Definitions ... +struct X121SMCStrategyXWZSignalConditions +{ + // + // Props ... + + // + string symbol; + ENUM_TIMEFRAMES period; + + // + double sl; + double target; + double reward; + double amountPercent; + ENUM_X_DIRECTION dir; + ENUM_X_POSITION_TYPES type; + + // + // Setup Props ... + + // + datetime setupTime; + datetime triggerTime; + + // + double pivot; + double point; + + // + ENUM_X121SMC_XWZ_PRIORITY priority; + + // + // Working Zone ... + XCFVG *fairValueGap; + XCOrderBlock *orderBlock; + XCSupplyZone *supplyZone; + XCDemandZone *demandZone; + X121SMCXWZWorkingZone workingZone; + + // + // X121SMCXWZZone startZone; + X121SMCXWZZone startZones[]; + + // + // Constructor ... + X121SMCStrategyXWZSignalConditions() + { + Clean(); + } + + // + // Tools ... + + /** + * Cleaning Up ... + */ + void Clean() + { + // + sl = 0; + target = 0; + + // + dir = X_DIRECTION_NONE; + type = X_POSITION_TYPE_NONE; + + // + symbol = NULL; + period = NULL; + setupTime = NULL; + triggerTime = NULL; + + // + ExtensionClean(); + + // + ZeroMemory(this); + } + + /** + * Check Condition is Setting Up ... + * + * @param dir: ENUM_X_DIRECTION member, Setting Up Direction ... + * + * @return ( bool ) + */ + bool IsSetuped() + { + // + bool result = false; + + // + result = IsValid(setupTime) && + HasDirection(dir); + if (!result) + { + return result; + } + + // + return result; + } + + /** + * Calculate Setup Age ... + * + * @return ( int ) + */ + int GetSetupAge() + { + // + int result = 0; + + // + if (!IsSetuped()) + { + return result; + } + + // + result = (int)(TimeCurrent() - setupTime) / PeriodSeconds(period); + + // + return result; + } + + /** + * Detect How we Can Trigger Signal ... + * + * @return ( bool ) + */ + bool CanTrigger() + { + // + bool result = false; + + // + result = + // + sl > 0 && + IsValid(symbol) && + IsValid(period) && + IsValid(triggerTime) && + type != X_POSITION_TYPE_ALL && + type != X_POSITION_TYPE_NONE + // + ; + + // + return result; + } + + // + // Extensions ... + + /** + * Clean Additional Properties ... + */ + void ExtensionClean() + { + // + pivot = 0; + point = 0; + + // + target = 0; + reward = 0; + amountPercent = 0; + + // + ZeroMemory(supplyZone); + + // + ZeroMemory(demandZone); + + // + ZeroMemory(orderBlock); + + // + ZeroMemory(fairValueGap); + + // + // startZone.Clean(); + Clean(startZones); + + // + workingZone.Clean(); + } + + // + // + // + + // + bool HasWorkingZone() + { + return workingZone.IsValid(); + } + + // + bool HasOrderBlock() + { + return orderBlock != NULL && + orderBlock.IsValid(); + } + + // + bool HasFairValueGap() + { + return fairValueGap != NULL && + fairValueGap.IsValid(); + } + + // + bool HasSupplyZone() + { + return supplyZone != NULL && + supplyZone.IsValid(); + } + + // + bool HasDemandZone() + { + return demandZone != NULL && + demandZone.IsValid(); + } + + // + bool HasStartZones() + { + return HasChild(startZones); + } + + // + int CountStartZones() + { + return ArraySize(startZones); + } + + // + void UpdateTo(datetime value = NULL) + { + // + value = NormalizeTime(value); + + // + bool hasSupplyZone = HasSupplyZone(); + if (hasSupplyZone) + { + supplyZone.To(value); + } + + // + bool hasDemandZone = HasDemandZone(); + if (hasDemandZone) + { + demandZone.To(value); + } + + // + bool hasOrderBlock = HasOrderBlock(); + if (hasOrderBlock) + { + orderBlock.To(value); + } + + // + bool hasFairValueGap = HasFairValueGap(); + if (hasFairValueGap) + { + fairValueGap.To(value); + } + + // + // Working Zone ... + bool hasWorkingZone = HasWorkingZone(); + if (hasWorkingZone) + { + workingZone.to = value; + } + + // + // Start Zone ... + bool hasStartZones = HasStartZones(); + if (hasStartZones) + { + // + int count = CountStartZones(); + for (int i = 0; i < count; i++) + { + // + bool hasOB = startZones[i].HasOB(); + if (hasOB) + { + startZones[i].ob.To(value); + } + + // + bool hasFVG = startZones[i].HasFVG(); + if (hasFVG) + { + startZones[i].fvg.To(value); + } + + // + bool hasSupply = startZones[i].HasSupply(); + if (hasSupply) + { + startZones[i].supply.To(value); + } + + // + bool hasDemand = startZones[i].HasDemand(); + if (hasDemand) + { + startZones[i].demand.To(value); + } + + // + bool hasSupport = startZones[i].HasSupport(); + if (hasSupport) + { + startZones[i].support.To(value); + } + + // + bool hasResistance = startZones[i].HasResistance(); + if (hasResistance) + { + startZones[i].resistance.To(value); + } + } + } + } + + // + // + // + + // + // Working Zone is an Area which + // we decide to trade inside it ... + bool ExtractWorkingZone( + XPOIState &htfState, + XPOIState &mtfState, + XPOIState &stfState, + int barIndex = 0 // + ) + { + // + bool result = false; + + // + if (barIndex < 0) + { + barIndex = 0; + } + int zIndex = barIndex; + + // + result = !HasWorkingZone(); + if (!result) + { + return result; + } + + // + result = IsValid(symbol) && + IsValid(period); + if (!result) + { + // + Clean(); + return result; + } + + // + datetime cTime = iTime( + symbol, + period, + zIndex // + ); + + // + result = + // + htfState.IsValid() && + htfState.HasChild() && + htfState.HasSupplyZones() && + htfState.HasDemandZones() && + // + mtfState.IsValid() && + mtfState.HasChild() && + mtfState.HasSupplyZones() && + mtfState.HasDemandZones() && + // + stfState.IsValid() && + stfState.HasChild() + // + ; + if (!result) + { + return result; + } + + // + // Retrieve Highest Supply Zone ... + int hSupplyIDX = GetHighest(htfState.supplyZones); + int lDemandIDX = GetLowest(htfState.demandZones); + + // + result = + // + IsValidIndex(hSupplyIDX) && + IsValidIndex(lDemandIDX) + // + ; + if (!result) + { + return result; + } + + // + supplyZone = htfState.supplyZones[hSupplyIDX]; + demandZone = htfState.demandZones[lDemandIDX]; + + // + result = + // + supplyZone != NULL && + demandZone != NULL && + supplyZone.IsValid() && + demandZone.IsValid() + // + ; + if (!result) + { + // + Clean(); + return result; + } + + // + // Check Validation of Supply and Demand Zones ... + lDemandIDX = GetLowest(mtfState.demandZones); + hSupplyIDX = GetHighest(mtfState.supplyZones); + result = IsValidIndex(lDemandIDX) && + IsValidIndex(hSupplyIDX); + if (!result) + { + // + Clean(); + return result; + } + + // + // Validate Supply and Demand ... + bool isMTFHSupplyInside = + IsInside( + mtfState.supplyZones[hSupplyIDX], + supplyZone); + bool isMTFLDemandInside = + IsInside( + mtfState.demandZones[lDemandIDX], + demandZone // + ); + if (isMTFHSupplyInside && + !isMTFLDemandInside) + { + demandZone = mtfState.demandZones[lDemandIDX]; + } + else if (!isMTFHSupplyInside && + isMTFLDemandInside) + { + supplyZone = mtfState.supplyZones[hSupplyIDX]; + } + else if (isMTFHSupplyInside && + isMTFLDemandInside) + { + // + supplyZone = mtfState.supplyZones[hSupplyIDX]; + demandZone = mtfState.demandZones[lDemandIDX]; + } + + // + // Check Zones Validation ... + bool hasTrend = + supplyZone != NULL && + supplyZone.IsValid() && + demandZone != NULL && + demandZone.IsValid(); + result = hasTrend; + if (!result) + { + // + Clean(); + return result; + } + + // + datetime from = MathMax( + supplyZone.From(), + demandZone.From()); + + // + int fromIndex = iBarShift( + symbol, + period, + from // + ); + + // + // Detect Trend ... + ENUM_X_DIRECTION trend = X_DIRECTION_NONE; + datetime supplyTouch = NULL; + datetime demandTouch = NULL; + for (int i = zIndex; i < fromIndex; i++) + { + // + XOHCL iBar; + bool isInited = iBar.Init( + symbol, + period, + i // + ); + if (!isInited) + { + continue; + } + + // + bool isTouchSupplyZone = + // + iBar.low < supplyZone.Lower() && + iBar.GetUp() > supplyZone.Lower() + // + ; + if (isTouchSupplyZone && + !IsValid(supplyTouch)) + { + supplyTouch = iBar.time; + } + + // + bool isTouchDemandZone = + // + iBar.high > demandZone.Upper() && + iBar.GetDown() < demandZone.Upper() + // + ; + if (isTouchDemandZone && + !IsValid(demandTouch)) + { + demandTouch = iBar.time; + } + + // + bool canBreak = + IsValid(supplyTouch) && + IsValid(demandTouch); + + // + iBar.Clean(); + + // + if (canBreak) + { + break; + } + } + + // + hasTrend = + // + IsValid(supplyTouch) || + IsValid(demandTouch) + // + ; + if (hasTrend) + { + // + trend = + // + supplyTouch > demandTouch + ? X_DIRECTION_BEARISH + : X_DIRECTION_BULLISH + // + ; + } + + // + // Check Trend ... + result = hasTrend; + if (!result) + { + // + Clean(); + return result; + } + + // + bool hasBullishTrend = IsBullish(trend); + bool hasBearishTrend = IsBearish(trend); + + // + // Find Order Block and FVG for Trend Approve ... + + // + bool isBullishTrendApproved = false; + bool isBearishTrendApproved = false; + + // + // Now We Have to Detect at least One OrderBlock with FVG ... + // for Trend Approvement ... + bool hasOrderBlock = HasOrderBlock(); + bool hasFairValueGap = HasFairValueGap(); + if (!hasOrderBlock && + !hasFairValueGap) + { + // + int count = 0; + bool has = false; + + // + XCFVG *fvg = NULL; + XCOrderBlock *ob = NULL; + + // + has = mtfState.HasBullishOrderBlocks(); + count = mtfState.CountBullishOrderBlocks(); + + // + if (has) + { + // + // Check Order Block ... + for (int i = 0; i < count; i++) + { + // + XCOrderBlock *iOB = mtfState.bullishOrderBlocks[i]; + + // + iOB.To(cTime); + + // + // Check From Passes ... + bool isFromPassed = iOB.From() > demandZone.From(); + if (!isFromPassed) + { + continue; + } + + // + // Must inside DemandZone ... + bool isInsideDemand = IsInsideDiff( + iOB, + demandZone // + ); + if (!isInsideDemand) + { + continue; + } + + // + // Check Started ... + XOHCL startedBar; + ENUM_X_DIRECTION startedDir; + bool isStarted = iOB.IsStarted( + X_DIRECTION_BULLISH, + startedBar, + startedDir // + ); + if (!isStarted) + { + // + startedBar.Clean(); + continue; + } + + // + // Converts to Box ... + XBoxZone obBox; + bool hasOBBox = ToBox( + obBox, + iOB // + ); + if (!hasOBBox) + { + // + obBox.Clean(); + startedBar.Clean(); + continue; + } + + // + // Check Zone Must not Used before ... + bool isUsed = IsBoxUsed( + obBox, + startedBar.Index() - 1, + zIndex // + ); + if (isUsed) + { + // + obBox.Clean(); + startedBar.Clean(); + continue; + } + + // + ob = iOB; + + // + obBox.Clean(); + startedBar.Clean(); + + // + break; + } + + // + // Detect Fair Value Gap ... + if (ob != NULL && + ob.IsValid()) + { + // + has = stfState.HasBullishFairValueGaps(); + count = stfState.CountBullishFairValueGaps(); + if (has) + { + // + // Check Fir Value Gap ... + for (int i = 0; i < count; i++) + { + // + XCFVG *iFVG = stfState.bullishFairValueGaps[i]; + + // + iFVG.To(cTime); + + // + // Check From Passes ... + bool isFromPassed = iFVG.From() > ob.From(); + if (!isFromPassed) + { + continue; + } + + // + // Check Started ... + XOHCL startedBar; + ENUM_X_DIRECTION startedDir; + bool isStarted = iFVG.IsStarted( + X_DIRECTION_BULLISH, + startedBar, + startedDir // + ); + if (!isStarted) + { + // + startedBar.Clean(); + continue; + } + + // + // Converts to Box ... + XBoxZone fvgBox; + bool hasFVGBox = ToBox( + fvgBox, + iFVG // + ); + if (!hasFVGBox) + { + // + fvgBox.Clean(); + startedBar.Clean(); + continue; + } + + // + // Check Inside Order Block ... + bool isInside = IsInsideDiff( + iFVG, + ob, + true // Force Side Out ... + ); + if (!isInside) + { + continue; + } + + // + fvg = iFVG; + + // + fvgBox.Clean(); + startedBar.Clean(); + + // + break; + } + } + else + { + // + ob = NULL; + } + } + + // + if (ob != NULL && + fvg != NULL) + { + // + orderBlock = ob; + fairValueGap = fvg; + } + + // + hasOrderBlock = HasOrderBlock(); + hasFairValueGap = HasFairValueGap(); + isBullishTrendApproved = hasOrderBlock && + hasFairValueGap; + } + + // + if (!isBullishTrendApproved) + { + // + has = mtfState.HasBearishOrderBlocks(); + count = mtfState.CountBearishOrderBlocks(); + + // + if (has) + { + // + // Check Order Block ... + for (int i = 0; i < count; i++) + { + // + XCOrderBlock *iOB = mtfState.bearishOrderBlocks[i]; + + // + iOB.To(cTime); + + // + // Check From Passes ... + bool isFromPassed = iOB.From() > supplyZone.From(); + if (!isFromPassed) + { + continue; + } + + // + // Must inside DemandZone ... + bool isInsideDemand = IsInsideDiff( + iOB, + supplyZone // + ); + if (!isInsideDemand) + { + continue; + } + + // + // Check Started ... + XOHCL startedBar; + ENUM_X_DIRECTION startedDir; + bool isStarted = iOB.IsStarted( + X_DIRECTION_BEARISH, + startedBar, + startedDir // + ); + if (!isStarted) + { + // + startedBar.Clean(); + continue; + } + + // + // Converts to Box ... + XBoxZone obBox; + bool hasOBBox = ToBox( + obBox, + iOB // + ); + if (!hasOBBox) + { + // + obBox.Clean(); + startedBar.Clean(); + continue; + } + + // + // Check Zone Must not Used before ... + bool isUsed = IsBoxUsed( + obBox, + startedBar.Index() - 1, + zIndex // + ); + if (isUsed) + { + // + obBox.Clean(); + startedBar.Clean(); + continue; + } + + // + ob = iOB; + + // + obBox.Clean(); + startedBar.Clean(); + + // + break; + } + + // + // Detect Fair Value Gap ... + if (ob != NULL && + ob.IsValid()) + { + // + has = stfState.HasBearishFairValueGaps(); + count = stfState.CountBearishFairValueGaps(); + if (has) + { + // + // Check Fir Value Gap ... + for (int i = 0; i < count; i++) + { + // + XCFVG *iFVG = stfState.bearishFairValueGaps[i]; + + // + iFVG.To(cTime); + + // + // Check From Passes ... + bool isFromPassed = iFVG.From() > ob.From(); + if (!isFromPassed) + { + continue; + } + + // + // Check Started ... + XOHCL startedBar; + ENUM_X_DIRECTION startedDir; + bool isStarted = iFVG.IsStarted( + X_DIRECTION_BEARISH, + startedBar, + startedDir // + ); + if (!isStarted) + { + // + startedBar.Clean(); + continue; + } + + // + // Converts to Box ... + XBoxZone fvgBox; + bool hasFVGBox = ToBox( + fvgBox, + iFVG // + ); + if (!hasFVGBox) + { + // + fvgBox.Clean(); + startedBar.Clean(); + continue; + } + + // + // Check Inside Order Block ... + bool isInside = IsInsideDiff( + iFVG, + ob, + true // Force Side Out ... + ); + if (!isInside) + { + continue; + } + + // + fvg = iFVG; + + // + fvgBox.Clean(); + startedBar.Clean(); + + // + break; + } + } + else + { + // + ob = NULL; + } + } + + // + if (ob != NULL && + fvg != NULL) + { + // + orderBlock = ob; + fairValueGap = fvg; + } + + // + hasOrderBlock = HasOrderBlock(); + hasFairValueGap = HasFairValueGap(); + isBearishTrendApproved = hasOrderBlock && + hasFairValueGap; + } + } + } + + // + // Check Trend Approved ... + bool isTrendApproved = + hasOrderBlock && + hasFairValueGap && + (isBullishTrendApproved || + isBearishTrendApproved); + result = isTrendApproved; + if (!result) + { + // + Clean(); + return result; + } + + // + // Prepare Working Zone ... + workingZone.symbol = symbol; + workingZone.period = period; + + // + workingZone.upper = supplyZone.Lower(); + workingZone.zoneUpper = supplyZone.Upper(); + + // + workingZone.lower = demandZone.Upper(); + workingZone.zoneLower = demandZone.Lower(); + + // + workingZone.from = from; + + // + double upper = workingZone.upper; + double range = + workingZone.upper - workingZone.lower; + double ranegPercent = range / 100; + double quarterValue = ranegPercent * 25; + + // + workingZone.quarter1 = upper - (quarterValue * 1); + workingZone.quarter2 = upper - (quarterValue * 2); + workingZone.quarter3 = upper - (quarterValue * 3); + + // + result = workingZone.IsValid(); + if (!result) + { + Clean(); + } + + // + return result; + } + + // + bool IsWorkingZoneDestroyed( + ENUM_X_DIRECTION &destroyedDir, + int barIndex = 0, + ENUM_TIMEFRAMES forPeriod = NULL // + ) + { + // + bool result = false; + + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + if (!IsValid(forPeriod)) + { + forPeriod = period; + } + + // + destroyedDir = X_DIRECTION_NONE; + + // + result = workingZone.IsValid(); + if (!result) + { + return result; + } + + // + result = workingZone.IsDestroyed( + destroyedDir, + barIndex, + forPeriod // + ); + + // + return result; + } + + // + bool DetectTrend( + ENUM_X_DIRECTION &trend, + int barIndex = 0, + ENUM_TIMEFRAMES forPeriod = NULL // + ) + { + // + bool result = false; + + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + if (forPeriod == NULL) + { + forPeriod = period; + } + + // + trend = X_DIRECTION_NONE; + + // + result = HasWorkingZone(); + if (!result) + { + return result; + } + + // + int FromIndex = iBarShift( + symbol, + forPeriod, + workingZone.from // + ); + + // + datetime supplyTouch = NULL; + datetime demandTouch = NULL; + for (int i = barIndex; i < FromIndex; i++) + { + // + XOHCL iBar; + bool isInited = iBar.Init( + symbol, + forPeriod, + i // + ); + if (!isInited) + { + continue; + } + + // + bool isTouchSupplyZone = + // + iBar.low < supplyZone.Lower() && + iBar.GetUp() > supplyZone.Lower() + // + ; + if (isTouchSupplyZone && + !IsValid(supplyTouch)) + { + supplyTouch = iBar.time; + } + + // + bool isTouchDemandZone = + // + iBar.high > demandZone.Upper() && + iBar.GetDown() < demandZone.Upper() + // + ; + if (isTouchDemandZone && + !IsValid(demandTouch)) + { + demandTouch = iBar.time; + } + + // + bool canBreak = + IsValid(supplyTouch) && + IsValid(demandTouch); + + // + iBar.Clean(); + + // + if (canBreak) + { + break; + } + } + + // + result = + // + IsValid(supplyTouch) || + IsValid(demandTouch) + // + ; + if (result) + { + // + trend = + // + supplyTouch > demandTouch + ? X_DIRECTION_BEARISH + : X_DIRECTION_BULLISH + // + ; + } + + // + return result; + } + + // + bool DetectStartZones( + ENUM_X_DIRECTION forDir, + XPOIState &obState, + XPOIState &fvgState, + XPOIState &otherState, + XC121SMCCycleHelper *cycleHelper // + ) + { + // + bool result = false; + + // + result = obState.IsValid() && + obState.HasChild() && + fvgState.IsValid() && + fvgState.HasChild() && + otherState.IsValid() && + otherState.HasChild() && + HasDirection(forDir); + if (!result) + { + return result; + } + + // + bool isBullish = IsBullish(forDir); + + // + int idx = -1; + int count = 0; + int has = false; + + // + X121SMCXWZZone startZone; + X121SMCXWZZone lastStartZone; + bool hasLastStartZone = HasStartZones(); + if (hasLastStartZone) + { + // + int startZonesCount = CountStartZones(); + lastStartZone = startZones[startZonesCount - 1]; + } + + // + if (isBullish) + { + // + has = obState.HasBullishOrderBlocks(); + if (has) + { + // + count = obState.CountBullishOrderBlocks(); + for (int i = 0; i < count; i++) + { + // + XCOrderBlock *iOB = obState.bullishOrderBlocks[i]; + + // + bool isFromPassed = + !hasLastStartZone + ? true + : iOB.From() > lastStartZone.ob.From(); + if (!isFromPassed) + { + // + ZeroMemory(iOB); + continue; + } + + // + XOHCL startedBar; + ENUM_X_DIRECTION startedDir; + bool isStarted = iOB.IsStarted( + forDir, + startedBar, + startedDir // + ); + if (!isStarted) + { + // + ZeroMemory(iOB); + startedBar.Clean(); + continue; + } + + // + XOHCL activatedBar; + ENUM_X_DIRECTION activatedDir; + bool isActivated = iOB.IsActivated( + forDir, + activatedBar, + activatedDir // + ); + if (isActivated) + { + // + ZeroMemory(iOB); + startedBar.Clean(); + activatedBar.Clean(); + continue; + } + + // + bool isPlacePassed = + !IsInsideDiff( + iOB, + demandZone // + ) && + (!hasLastStartZone + ? workingZone.IsValid() && + HasOrderBlock() && + forDir == orderBlock.GetDirection() + ? IsAbove( + iOB, + orderBlock, + true // Ignore Inside ... + ) + : true + : lastStartZone.HasOB() && + IsAbove( + iOB, + lastStartZone.ob, + true // Ignore Inside ... + )); + if (!isPlacePassed) + { + // + ZeroMemory(iOB); + startedBar.Clean(); + activatedBar.Clean(); + continue; + } + + // + // Attache OB ... + startZone.ob = iOB; + + // + // Now we Have to Find Specified FVG ... + has = fvgState.HasBullishFairValueGaps(); + if (has) + { + // + int jCount = fvgState.CountBullishFairValueGaps(); + for (int j = 0; j < jCount; j++) + { + // + XCFVG *jFVG = fvgState.bullishFairValueGaps[j]; + + // + startedBar.Clean(); + startedDir = X_DIRECTION_NONE; + isStarted = jFVG.IsStarted( + forDir, + startedBar, + startedDir // + ); + if (!isStarted) + { + // + ZeroMemory(jFVG); + startedBar.Clean(); + continue; + } + + // + activatedBar.Clean(); + activatedDir = X_DIRECTION_NONE; + isActivated = jFVG.IsActivated( + forDir, + activatedBar, + activatedDir // + ); + if (isActivated) + { + // + ZeroMemory(jFVG); + startedBar.Clean(); + activatedBar.Clean(); + continue; + } + + // + isPlacePassed = + // + !IsInsideDiff( + jFVG, + demandZone // + ) && + IsAboveDiff( + jFVG, + iOB, + true // Ignore Inside ... + ) + // + ; + if (!isPlacePassed) + { + // + ZeroMemory(jFVG); + startedBar.Clean(); + activatedBar.Clean(); + } + + // + startZone.fvg = jFVG; + } + } + + // + startedBar.Clean(); + activatedBar.Clean(); + } + } + } + else + { + // + has = obState.HasBearishOrderBlocks(); + if (has) + { + // + count = obState.CountBearishOrderBlocks(); + for (int i = 0; i < count; i++) + { + // + XCOrderBlock *iOB = obState.bearishOrderBlocks[i]; + + // + bool isFromPassed = + !hasLastStartZone + ? true + : iOB.From() > lastStartZone.ob.From(); + if (!isFromPassed) + { + // + ZeroMemory(iOB); + continue; + } + + // + XOHCL startedBar; + ENUM_X_DIRECTION startedDir; + bool isStarted = iOB.IsStarted( + forDir, + startedBar, + startedDir // + ); + if (!isStarted) + { + // + ZeroMemory(iOB); + startedBar.Clean(); + continue; + } + + // + XOHCL activatedBar; + ENUM_X_DIRECTION activatedDir; + bool isActivated = iOB.IsActivated( + forDir, + activatedBar, + activatedDir // + ); + if (isActivated) + { + // + ZeroMemory(iOB); + startedBar.Clean(); + activatedBar.Clean(); + continue; + } + + // + bool isPlacePassed = + !IsInsideDiff( + iOB, + supplyZone // + ) && + (!hasLastStartZone + ? workingZone.IsValid() && + HasOrderBlock() && + forDir == orderBlock.GetDirection() + ? IsBelow( + iOB, + orderBlock, + true // Ignore Inside ... + ) + : true + : lastStartZone.HasOB() && + IsBelow( + iOB, + lastStartZone.ob, + true // Ignore Inside ... + )); + if (!isPlacePassed) + { + // + ZeroMemory(iOB); + startedBar.Clean(); + activatedBar.Clean(); + continue; + } + + // + // Attache OB ... + startZone.ob = iOB; + + // + // Now we Have to Find Specified FVG ... + has = fvgState.HasBearishFairValueGaps(); + if (has) + { + // + int jCount = fvgState.CountBearishFairValueGaps(); + for (int j = 0; j < jCount; j++) + { + // + XCFVG *jFVG = fvgState.bearishFairValueGaps[j]; + + // + startedBar.Clean(); + startedDir = X_DIRECTION_NONE; + isStarted = jFVG.IsStarted( + forDir, + startedBar, + startedDir // + ); + if (!isStarted) + { + // + ZeroMemory(jFVG); + startedBar.Clean(); + continue; + } + + // + activatedBar.Clean(); + activatedDir = X_DIRECTION_NONE; + isActivated = jFVG.IsActivated( + forDir, + activatedBar, + activatedDir // + ); + if (isActivated) + { + // + ZeroMemory(jFVG); + startedBar.Clean(); + activatedBar.Clean(); + continue; + } + + // + isPlacePassed = + // + !IsInsideDiff( + jFVG, + supplyZone // + ) && + IsBelowDiff( + jFVG, + iOB, + true // Ignore Inside ... + ) + // + ; + if (!isPlacePassed) + { + // + ZeroMemory(jFVG); + startedBar.Clean(); + activatedBar.Clean(); + } + + // + startZone.fvg = jFVG; + } + } + + // + startedBar.Clean(); + activatedBar.Clean(); + } + } + } + + // + bool hasOBFVG = startZone.HasOB() && + startZone.HasFVG(); + result = hasOBFVG; + if (!result) + { + // + startZone.Clean(); + lastStartZone.Clean(); + + // + return result; + } + + // + XBoxZone startBox; + bool hasStartBox = startZone.AsBox(startBox); + result = hasStartBox; + if (!result) + { + // + startBox.Clean(); + startZone.Clean(); + lastStartZone.Clean(); + + // + return result; + } + + // + // Detect Other Zones Inside Box ... + XBoxZone tmpBoxes[]; + + // + // Supply Zones ... + has = otherState.HasSupplyZones(); + if (has) + { + // + count = ToBox( + otherState.supplyZones, + tmpBoxes // + ); + + // + has = IsValidSize(count); + if (has) + { + // + for (int i = 0; i < count; i++) + { + // + XBoxZone iBox = tmpBoxes[i]; + + // + bool isPlacePassed = + // + IsBoxInside( + iBox, + startBox, + false, + false // + ) + // + ; + if (!isPlacePassed) + { + // + iBox.Clean(); + continue; + } + + // + startZone.supply = otherState.supplyZones[i]; + + // + iBox.Clean(); + break; + } + } + } + + // + // Demand Zones ... + Clean(tmpBoxes); + has = otherState.HasDemandZones(); + if (has) + { + // + count = ToBox( + otherState.demandZones, + tmpBoxes // + ); + + // + has = IsValidSize(count); + if (has) + { + // + for (int i = 0; i < count; i++) + { + // + XBoxZone iBox = tmpBoxes[i]; + + // + bool isPlacePassed = + // + IsBoxInside( + iBox, + startBox, + false, + false // + ) + // + ; + if (!isPlacePassed) + { + // + iBox.Clean(); + continue; + } + + // + startZone.demand = otherState.demandZones[i]; + + // + iBox.Clean(); + break; + } + } + } + + // + // Support Zones ... + Clean(tmpBoxes); + has = otherState.HasSupportZones(); + if (has) + { + // + count = ToBox( + otherState.supportZones, + tmpBoxes // + ); + + // + has = IsValidSize(count); + if (has) + { + // + for (int i = 0; i < count; i++) + { + // + XBoxZone iBox = tmpBoxes[i]; + + // + bool isPlacePassed = + // + IsBoxInside( + iBox, + startBox, + false, + false // + ) + // + ; + if (!isPlacePassed) + { + // + iBox.Clean(); + continue; + } + + // + startZone.support = otherState.supportZones[i]; + + // + iBox.Clean(); + break; + } + } + } + + // + // Resistance Zones ... + Clean(tmpBoxes); + has = otherState.HasResistanceZones(); + if (has) + { + // + count = ToBox( + otherState.resistanceZones, + tmpBoxes // + ); + + // + has = IsValidSize(count); + if (has) + { + // + for (int i = 0; i < count; i++) + { + // + XBoxZone iBox = tmpBoxes[i]; + + // + bool isPlacePassed = + // + IsBoxInside( + iBox, + startBox, + false, + false // + ) + // + ; + if (!isPlacePassed) + { + // + iBox.Clean(); + continue; + } + + // + startZone.resistance = otherState.resistanceZones[i]; + + // + iBox.Clean(); + break; + } + } + } + + // + result = startZone.IsValid() && + startZone.HasDirection(); + if (result) + { + // + AddRef( + startZone, + startZones // + ); + } + + // + Clean(tmpBoxes); + startBox.Clean(); + startZone.Clean(); + lastStartZone.Clean(); + + // + return result; + } + + // + void DetectPriority( + ENUM_X121SMC_XWZ_PRIORITY &bullish, + ENUM_X121SMC_XWZ_PRIORITY &bearish, + int barIndex = 0, + ENUM_TIMEFRAMES forPeriod = NULL // + ) + { + // + bullish = X121SMC_XWZ_PRIORITY_NONE; + bearish = X121SMC_XWZ_PRIORITY_NONE; + + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + if (!IsValid(forPeriod)) + { + forPeriod = period; + } + + // + bool hasWorkingZone = HasWorkingZone(); + if (!hasWorkingZone) + { + return; + } + + // + XOHCL zBar; + bool isInited = zBar.Init( + symbol, + forPeriod, + barIndex // + ); + if (!isInited) + { + // + zBar.Clean(); + return; + } + + // + XOHCL cBar; + isInited = zBar.GetPreviousBar(cBar); + if (!isInited) + { + // + zBar.Clean(); + cBar.Clean(); + return; + } + + // + // ZoneUpper, Upper ... + if (cBar.low > workingZone.upper && + cBar.high < workingZone.zoneUpper && + zBar.low > workingZone.upper && + zBar.high < workingZone.zoneUpper) + { + // + bullish = X121SMC_XWZ_PRIORITY_NONE; + bearish = X121SMC_XWZ_PRIORITY_STRONG_HIGH; + } + // + // Upper, Quarter1 ... + else if (cBar.low > workingZone.quarter1 && + cBar.high < workingZone.upper && + zBar.low > workingZone.quarter1 && + zBar.high < workingZone.upper) + { + // + bullish = X121SMC_XWZ_PRIORITY_WEAK; + bearish = X121SMC_XWZ_PRIORITY_HIGH; + } + // + // Quarter1, Quarter2 ... + else if (cBar.low > workingZone.quarter2 && + cBar.high < workingZone.quarter1 && + zBar.low > workingZone.quarter2 && + zBar.high < workingZone.quarter1) + { + // + bullish = X121SMC_XWZ_PRIORITY_LOW; + bearish = X121SMC_XWZ_PRIORITY_REGULAR; + } + // + // Quarter2, Quarter3 ... + else if (cBar.low > workingZone.quarter3 && + cBar.high < workingZone.quarter2 && + zBar.low > workingZone.quarter3 && + zBar.high < workingZone.quarter2) + { + // + bullish = X121SMC_XWZ_PRIORITY_REGULAR; + bearish = X121SMC_XWZ_PRIORITY_LOW; + } + // + // Quarter3, Lower ... + else if (cBar.low > workingZone.lower && + cBar.high < workingZone.quarter3 && + zBar.low > workingZone.lower && + zBar.high < workingZone.quarter3) + { + // + bullish = X121SMC_XWZ_PRIORITY_HIGH; + bearish = X121SMC_XWZ_PRIORITY_WEAK; + } + // + // Lower, ZoneLower ... + else if (cBar.low > workingZone.zoneLower && + cBar.high < workingZone.lower && + zBar.low > workingZone.zoneLower && + zBar.high < workingZone.lower) + { + // + bullish = X121SMC_XWZ_PRIORITY_STRONG_HIGH; + bearish = X121SMC_XWZ_PRIORITY_NONE; + } + + // + zBar.Clean(); + cBar.Clean(); + } + + // + bool HasConditions( + double &_pivot, + double &_point, + ENUM_X_DIRECTION &conditionsDir, + XPOIState &state, + int barIndex = 0, + ENUM_TIMEFRAMES forPeriod = NULL // + ) + { + // + bool result = false; + + // + _pivot = 0; + _point = 0; + conditionsDir = X_DIRECTION_NONE; + + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + if (forPeriod == NULL) + { + forPeriod = period; + } + + // + result = + // + IsValid(symbol) && + IsValid(period) && + state.IsValid() && + HasWorkingZone() && + state.HasChild() + // + ; + if (!result) + { + return result; + } + + // + result = false; + + // + // Detect Conditions Based On Start Zones ... + bool hasStartZones = HasStartZones(); + if (hasStartZones) + { + // + int selectedIndex = -1; + int count = CountStartZones(); + for (int i = 0; i < count; i++) + { + // + X121SMCXWZZone iStartZone = startZones[i]; + + // + XBoxZone selectedBox; + bool hasConditions = false; + bool isBullish = iStartZone.IsBullish(); + + // + // Conditions Inside Box ... + bool isPriceInside = iStartZone.IsPriceInside( + selectedBox, + barIndex, + forPeriod, + false, + false // + ); + if (isPriceInside) + { + // + // hasConditions = iStartZone.HasInsideConditions( + // state, + // barIndex, + // period // + // ); + + // + hasConditions = true; + + // + if (hasConditions) + { + // + _pivot = + // + isBullish + ? selectedBox.lower + : selectedBox.upper + // + ; + + // + _point = + // + isBullish + ? selectedBox.upper + : selectedBox.lower + // + ; + + // + conditionsDir = selectedBox.dir; + result = hasConditions; + iStartZone.Clean(); + break; + } + } + + // // + // // Order Block Rejection Conditions ... + // bool hasOBBox = ToBox( + // selectedBox, + // iStartZone.ob // + // ); + // if (hasOBBox && + // !hasConditions) + // { + // // + // hasConditions = iStartZone.HasBoxConitions( + // selectedBox, + // state, + // barIndex, + // forPeriod // + // ); + + // // + // if (hasConditions) + // { + // // + // _pivot = + // // + // isBullish + // ? selectedBox.lower + // : selectedBox.upper + // // + // ; + + // // + // _point = + // // + // isBullish + // ? selectedBox.upper + // : selectedBox.lower + // // + // ; + + // // + // conditionsDir = selectedBox.dir; + // result = hasConditions; + // iStartZone.Clean(); + // break; + // } + // } + + // // + // // Fair Value Gap Rejection Conditions ... + // bool hasFVGBox = ToBox( + // selectedBox, + // iStartZone.fvg // + // ); + // if (hasFVGBox) + // { + // // + // hasConditions = iStartZone.HasBoxConitions( + // selectedBox, + // state, + // barIndex, + // forPeriod // + // ); + + // // + // if (hasConditions) + // { + // // + // _pivot = + // // + // isBullish + // ? selectedBox.lower + // : selectedBox.upper + // // + // ; + + // // + // _point = + // // + // isBullish + // ? selectedBox.upper + // : selectedBox.lower + // // + // ; + + // // + // conditionsDir = selectedBox.dir; + // result = hasConditions; + // iStartZone.Clean(); + // break; + // } + // } + + // + iStartZone.Clean(); + } + + // + if (result && + IsValidIndex(selectedIndex)) + { + // + ArrayRemove( + startZones, + selectedIndex, + 1 // + ); + } + } + + // + // Detect Conditions Based On Working Zones ... + if (!result) + { + // + // Detect Result Based On WorkingZone ... + } + + // + if (!result) + { + // + _point = 0; + _pivot = 0; + conditionsDir = X_DIRECTION_NONE; + + // + return result; + } + + // + return result; + } + + // +}; + +// +bool X121SMCXWZCheckPriceInside( + XOHCL &zBar, + XOHCL &cBar, + double upper, + double lower // +) +{ + // + bool result = false; + + // + result = zBar.IsValid() && + cBar.IsValid() && + upper > 0 && + lower > 0 && + upper > lower && + zBar.time > cBar.time; + if (!result) + { + return result; + } + + // + result = + // + zBar.high < upper && + cBar.high < upper && + // + zBar.low > lower && + cBar.low > lower + // + ; + + // + return result; +} + +// \ No newline at end of file diff --git a/BKPS/14031206/Documents/BKP/xsupdem/plib.tmp.codes.mq5 b/BKPS/14031206/Documents/BKP/xsupdem/plib.tmp.codes.mq5 new file mode 100644 index 0000000..f99ce31 --- /dev/null +++ b/BKPS/14031206/Documents/BKP/xsupdem/plib.tmp.codes.mq5 @@ -0,0 +1,2732 @@ + +/** + * Sort Order Blocks / Fair Value Gaps based on Place and Remove unused ... + */ +template +void OrderedSortZones( + T *youngest, + T *&items[] // +) +{ + // + int count = ArraySize(items); + if (youngest == NULL || + !youngest.IsValid() || + !IsValidSize(count)) + { + return; + } + + // + ENUM_X_DIRECTION dir = youngest.GetDirection(); + bool isBullish = IsBullish(dir); + + // + T *tmp[]; + T *lastOB = youngest; + while (IsValidSize(count)) + { + // + // Detect Youngest of Collection ... + int idx = GetYoungest(items); + T *iChild = items[idx]; + ArrayRemove( + items, + idx, + 1 // + ); + count = ArraySize(items); + + // + // Check Direction Must be Same ... + ENUM_X_DIRECTION iDir = iChild.GetDirection(); + bool isSameDir = dir == iDir; + if (!isSameDir) + { + continue; + } + + // + // Check Creation time Sequence ... + bool isFromPassed = lastOB.From() > iChild.From(); + if (!isFromPassed) + { + continue; + } + + // + // Check Order Block Place ... + bool isPlacePassed = + isBullish + ? IsBelow( + iChild, + lastOB, + true // Ignore Inside ... + ) + : IsAbove( + iOB, + lastOB, + true // Ignore Inside ... + ); + if (!isPlacePassed) + { + continue; + } + + // + // Update Last OB ... + lastOB = iChild; + Add( + iChild, + tmp // + ); + + // + } + + // + // Update Ordered Sorted Order Blocks ... + count = ArraySize(tmp); + if (IsValidSize(count)) + { + // + Copy( + tmp, + orderBlocks // + ); + } +} +template +void OrderedSortZones( + T *&items[] // +) +{ + // + int count = ArraySize(items); + if (!IsValidSize(count)) + { + return; + } + + // + // Detect Youngest ... + int youngestIDX = GetYoungest( + items // + ); + bool hasYoungest = IsValidSize(youngestIDX); + if (!hasYoungest) + { + return; + } + + // + T *youngest = items[youngestIDX]; + ArrayRemove( + items, + youngestIDX, + 1 // + ); + count = ArraySize(items); + if (!IsValidSize(count)) + { + // + Add( + youngest, + items // + ); + + // + return; + } + + // + if (youngest == NULL || + !youngest.IsValid()) + { + return; + } + + // + ENUM_X_DIRECTION dir = youngest.GetDirection(); + bool isBullish = IsBullish(dir); + + // + T *tmp[]; + T *lastOB = youngest; + while (IsValidSize(count)) + { + // + // Detect Youngest of Collection ... + int idx = GetYoungest(items); + T *iChild = items[idx]; + ArrayRemove( + items, + idx, + 1 // + ); + count = ArraySize(items); + + // + // Check Direction Must be Same ... + ENUM_X_DIRECTION iDir = iChild.GetDirection(); + bool isSameDir = dir == iDir; + if (!isSameDir) + { + continue; + } + + // + // Check Creation time Sequence ... + bool isFromPassed = lastOB.From() > iChild.From(); + if (!isFromPassed) + { + continue; + } + + // + // Check Order Block Place ... + bool isPlacePassed = + isBullish + ? IsBelow( + iChild, + lastOB, + true // Ignore Inside ... + ) + : IsAbove( + iChild, + lastOB, + true // Ignore Inside ... + ); + if (!isPlacePassed) + { + continue; + } + + // + // Update Last OB ... + lastOB = iChild; + Add( + iChild, + tmp // + ); + + // + } + + // + // Update Ordered Sorted Order Blocks ... + count = ArraySize(tmp); + if (IsValidSize(count)) + { + // + Copy( + tmp, + items // + ); + } +} + +void OrderedSortBoxes( + XBoxZone &items[] // +) +{ + // + int count = ArraySize(items); + if (!IsValidSize(count)) + { + return; + } + + // + // Detect Youngest ... + int youngestIDX = GetYoungest( + items // + ); + bool hasYoungest = IsValidSize(youngestIDX); + if (!hasYoungest) + { + return; + } + + // + XBoxZone youngest = items[youngestIDX]; + ArrayRemove( + items, + youngestIDX, + 1 // + ); + count = ArraySize(items); + if (!IsValidSize(count)) + { + // + AddRef( + youngest, + items // + ); + + // + return; + } + + // + if (!youngest.IsValid()) + { + return; + } + + // + ENUM_X_DIRECTION dir = youngest.dir; + bool isBullish = IsBullish(dir); + + // + XBoxZone tmp[]; + XBoxZone last = youngest; + while (IsValidSize(count)) + { + // + // Detect Youngest of Collection ... + int idx = GetYoungest(items); + XBoxZone iChild = items[idx]; + ArrayRemove( + items, + idx, + 1 // + ); + count = ArraySize(items); + + // + // Check Direction Must be Same ... + ENUM_X_DIRECTION iDir = iChild.dir; + bool isSameDir = dir == iDir; + if (!isSameDir) + { + continue; + } + + // + // Check Creation time Sequence ... + bool isFromPassed = last.from > iChild.from; + if (!isFromPassed) + { + continue; + } + + // + // Check Order Block Place ... + bool isPlacePassed = + isBullish + ? IsBoxBelow( + iChild, + last, + true // Ignore Inside ... + ) + : IsBoxAbove( + iChild, + last, + true // Ignore Inside ... + ); + if (!isPlacePassed) + { + continue; + } + + // + // Update Last OB ... + last = iChild; + AddRef( + iChild, + tmp // + ); + + // + } + + // + // Update Ordered Sorted Order Blocks ... + count = ArraySize(tmp); + if (IsValidSize(count)) + { + // + Copy( + tmp, + items // + ); + } +} + +/** + * Extract Order Flows Swing Points ... + * + * @param type: ENUM_X_SWING_TYPE member ... + * @param swings: double Collection ... + * + * @return ( int ) + */ +int ExtractSwingPoints( + ENUM_X_SWING_TYPE type, + XCOrderBlock *&orderBlocks[], + XSwingPoint &swings[] // +) +{ + // + int result = 0; + + // + Clean(swings); + + // + int count = ArraySize(orderBlocks); + + // + if (type == X_NO_SWING || + !IsValidSize(count)) + { + return result; + } + + // + bool lookingForSwingLows = type == X_SWING_LOW; + + // + for (int i = 0; i < count; i++) + { + // + XCOrderBlock *iOB = orderBlocks[i]; + + // + string iSymbol = iOB.GetSymbol(); + ENUM_TIMEFRAMES iPeriod = iOB.GetPeriod(); + + // + int fromIndex = iBarShift( + iSymbol, + iPeriod, + iOB.From() // + ); + + // + fromIndex++; + + // + double iValue = 0; + datetime iVTime = NULL; + if (lookingForSwingLows) + { + // + int idx = iLowest( + iSymbol, + iPeriod, + MODE_LOW, + fromIndex // + ); + + // + if (IsValidIndex(idx)) + { + // + iValue = iLow( + iSymbol, + iPeriod, + idx // + ); + + // + iVTime = iTime( + iSymbol, + iPeriod, + idx // + ); + } + } + else + { + // + int idx = iHighest( + iSymbol, + iPeriod, + MODE_HIGH, + fromIndex // + ); + + // + if (IsValidIndex(idx)) + { + // + iValue = iHigh( + iSymbol, + iPeriod, + idx // + ); + + // + iVTime = iTime( + iSymbol, + iPeriod, + idx // + ); + } + } + + // + if (iValue > 0) + { + // + XSwingPoint iSwingP; + + // + iSwingP.type = type; + iSwingP.time = iVTime; + iSwingP.swing = iValue; + iSwingP.symbol = iSymbol; + iSwingP.period = iPeriod; + + // + if (iSwingP.IsValid()) + { + // + AddRef( + iSwingP, + swings // + ); + } + + // + iSwingP.Clean(); + } + } + + // + result = ArraySize(swings); + + // + return result; +} + + +// +bool IsRejectBox( + ENUM_X_DIRECTION &forDir, + XOHCL &bar, + XBoxZone &box, + XPOIState &state, + XOHCL &swingBar, + XOHCL &rejectBar, + XOHCL &breakerBar, + XOHCL &momentumBar, + bool forceSwingRejection = true // +) +{ + // + bool result = false; + + // + swingBar.Clean(); + rejectBar.Clean(); + breakerBar.Clean(); + momentumBar.Clean(); + + // + result = bar.IsValid() && + box.IsValid() && + state.IsValid() && + state.HasChild() && + HasDirection(forDir); + if (!result) + { + return result; + } + + // + bool isBullish = IsBullish(forDir); + + // + double appliedPrice = + isBullish + ? box.upper + : box.lower; + + // + // Fetch Required Bars ... + + // + XOHCL cBar; + result = bar.GetPreviousBar(cBar); + if (!result) + { + return result; + } + + // + XOHCL pBar; + result = cBar.GetPreviousBar(pBar); + if (!result) + { + return result; + } + + // + XOHCL ppBar; + result = pBar.GetPreviousBar(ppBar); + if (!result) + { + return result; + } + + // + // Check Directional Swing Type ... + ENUM_X_SWING_TYPE swingType = + isBullish + ? X_SWING_LOW + : X_SWING_HIGH; + + // + bool isSwingLow = + // + pBar.low < ppBar.low && + pBar.low < cBar.low && + bar.open > pBar.low && + // + appliedPrice > pBar.low && + appliedPrice < pBar.GetDown() + // + ; + + // + bool isSwingHigh = + // + pBar.high > ppBar.high && + pBar.high > cBar.high && + bar.open < pBar.high && + // + appliedPrice < pBar.high && + appliedPrice > pBar.GetUp() + // + ; + + // + // Force Rejected By Swing ... + if (forceSwingRejection) + { + // + result = swingType == X_SWING_HIGH + ? isSwingHigh + : swingType == X_SWING_LOW + ? isSwingLow + : false; + if (!result) + { + return result; + } + } + + // + bool hasValidSwing = + isBullish + ? isSwingLow + : isSwingHigh; + if (hasValidSwing) + { + swingBar = pBar; + } + + // + bool isCBarBreaked = IsBarBreak( + appliedPrice, + forDir, + cBar // + ); + if (isCBarBreaked) + { + breakerBar = cBar; + } + bool isPBarBreaked = IsBarBreak( + appliedPrice, + forDir, + pBar // + ); + if (isPBarBreaked) + { + breakerBar = pBar; + } + bool isPPBarBreaked = IsBarBreak( + appliedPrice, + forDir, + ppBar // + ); + if (isPPBarBreaked) + { + breakerBar = ppBar; + } + bool isBoxBreaked = isCBarBreaked || + isPBarBreaked || + isPPBarBreaked; + + // + bool isCBarRejected = IsBarReject( + appliedPrice, + forDir, + cBar // + ); + if (isCBarRejected) + { + rejectBar = cBar; + } + bool isPBarRejected = IsBarReject( + appliedPrice, + forDir, + pBar // + ); + if (isPBarRejected) + { + rejectBar = pBar; + } + bool isPPBarRejected = IsBarReject( + appliedPrice, + forDir, + ppBar // + ); + if (isPPBarRejected) + { + rejectBar = ppBar; + } + bool isBoxRejected = isCBarRejected || + isPBarRejected || + isPPBarRejected; + + // + int count = 0; + + // + bool hasRejectionBar = false; + if (isBullish) + { + // + count = state.CountBullishRejectionBars(); + for (int i = 0; i < count; i++) + { + // + XCRejectionBar *iZone = state.bullishRejectionBars[i]; + + // + XOHCL iBar; + bool isFilled = iZone.FillBar(iBar); + if (!isFilled) + { + continue; + } + + // + int iBarIndex = iBar.Index(); + + // + hasRejectionBar = + // + (iBarIndex == cBar.Index() || + iBarIndex == pBar.Index()) + // + ; + if (hasRejectionBar) + { + // + if (!rejectBar.IsValid()) + { + rejectBar = iBar; + } + + // + break; + } + } + } + else + { + // + count = state.CountBearishRejectionBars(); + for (int i = 0; i < count; i++) + { + // + XCRejectionBar *iZone = state.bearishRejectionBars[i]; + + // + XOHCL iBar; + bool isFilled = iZone.FillBar(iBar); + if (!isFilled) + { + continue; + } + + // + int iBarIndex = iBar.Index(); + + // + hasRejectionBar = + // + (iBarIndex == cBar.Index() || + iBarIndex == pBar.Index()) + // + ; + if (hasRejectionBar) + { + // + if (!rejectBar.IsValid()) + { + rejectBar = iBar; + } + + // + break; + } + } + } + + // + bool hasMomentumBar = false; + if (isBullish) + { + // + count = state.CountBullishMomentumBars(); + for (int i = 0; i < count; i++) + { + // + XCMomentumBar *iZone = state.bullishMomentumBars[i]; + + // + XOHCL iBar; + bool isFilled = iZone.FillBar(iBar); + if (!isFilled) + { + continue; + } + + // + int iBarIndex = iBar.Index(); + + // + hasMomentumBar = + // + (iBarIndex == cBar.Index() || + iBarIndex == pBar.Index()) + // + ; + if (hasMomentumBar) + { + // + if (!momentumBar.IsValid()) + { + momentumBar = iBar; + } + + // + break; + } + } + } + else + { + // + count = state.CountBearishMomentumBars(); + for (int i = 0; i < count; i++) + { + // + XCMomentumBar *iZone = state.bearishMomentumBars[i]; + + // + XOHCL iBar; + bool isFilled = iZone.FillBar(iBar); + if (!isFilled) + { + continue; + } + + // + int iBarIndex = iBar.Index(); + + // + hasMomentumBar = + // + (iBarIndex == cBar.Index() || + iBarIndex == pBar.Index()) + // + ; + if (hasMomentumBar) + { + // + if (!momentumBar.IsValid()) + { + momentumBar = iBar; + } + + // + break; + } + } + } + + // + bool hasSwing = false; + if (isBullish) + { + // + count = state.CountSwingLows(); + for (int i = 0; i < count; i++) + { + // + XCSwing *iSwing = state.swingLows[i]; + + // + XOHCL iBar; + bool isFilled = iSwing.FillBar(iBar); + if (!isFilled) + { + continue; + } + + // + int iBarIndex = iBar.Index(); + + // + hasSwing = + // + (iBarIndex == cBar.Index() || + iBarIndex == pBar.Index()) + // + ; + if (hasSwing) + { + // + if (!swingBar.IsValid()) + { + swingBar = iBar; + } + + // + break; + } + } + } + else + { + // + count = state.CountSwingHighs(); + for (int i = 0; i < count; i++) + { + // + XCSwing *iSwing = state.swingHighs[i]; + + // + XOHCL iBar; + bool isFilled = iSwing.FillBar(iBar); + if (!isFilled) + { + continue; + } + + // + int iBarIndex = iBar.Index(); + + // + hasSwing = + // + (iBarIndex == cBar.Index() || + iBarIndex == pBar.Index()) + // + ; + if (hasSwing) + { + // + if (!swingBar.IsValid()) + { + swingBar = iBar; + } + + // + break; + } + } + } + + // + bool hasRequiredValidations = + // + (hasRejectionBar || + hasMomentumBar) + // + || + // + (hasRejectionBar || + hasSwing) + // + || + // + (hasMomentumBar || + hasSwing) + // + ; + + // + result = + // + (isBoxBreaked && + (hasRequiredValidations || + hasValidSwing)) + // + || + // + (isBoxRejected && + (hasRequiredValidations || + hasValidSwing)) + // + ; + + // + return result; +} + + +template +void UpdateTo( + T *&source[], + datetime time = NULL // +) +{ + // + if (!IsValid(time)) + { + time = TimeCurrent(); + } + + // + int count = ArraySize(source); + if (!IsValidSize(count)) + { + return; + } + + // + for (int i = 0; i < count; i++) + { + source[i].To(time); + } +} + + +template +bool IsReject( + ENUM_X_DIRECTION forDir, + XOHCL &bar, + T *source, + XPOIState &state, + XOHCL &swingBar, + XOHCL &rejectBar, + XOHCL &breakerBar, + XOHCL &momentumBar, + bool forceSwingRejection = true // +) +{ + // + bool result = false; + + // + XBoxZone sourceBox; + result = ToBox( + sourceBox, + source // + ); + if (!result) + { + return result; + } + + // + result = IsRejectBox( + forDir, + bar, + sourceBox, + state, + swingBar, + rejectBar, + breakerBar, + momentumBar, + forceSwingRejection // + ); + + // + return result; +} + + + // + bool HasConditions( + ENUM_X_DIRECTION &conditionsDir, + XPOIState &state, + int barIndex = 0, + ENUM_TIMEFRAMES forPeriod = NULL // + ) + { + // + bool result = false; + + // + conditionsDir = X_DIRECTION_NONE; + + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + if (forPeriod == NULL) + { + forPeriod = period; + } + + // + result = + // + IsValid(symbol) && + IsValid(period) && + state.IsValid() && + HasWorkingZone() && + state.HasChild() + // + ; + if (!result) + { + return result; + } + + // + result = false; + + // + // Detect Conditions Based On Start Zones ... + bool hasStartZones = HasStartZones(); + if (hasStartZones) + { + // + int count = CountStartZones(); + for (int i = 0; i < count; i++) + { + // + X121SMCXWZZone iStartZone = startZones[i]; + + // + XBoxZone insideBox; + bool isPriceInside = iStartZone.IsPriceInside( + insideBox, + barIndex, + forPeriod // + ); + if (!isPriceInside) + { + // + iStartZone.Clean(); + continue; + } + + // + Print("PriceInside ..."); + + // + bool hasConditions = iStartZone.HasCondition( + insideBox, + state, + barIndex, + forPeriod // + ); + if (!hasConditions) + { + // + iStartZone.Clean(); + continue; + } + + // + iStartZone.Clean(); + } + } + + // + // Detect Conditions Based On Working Zones ... + if (!result) + { + // + // Detect Result Based On WorkingZone ... + } + + // + return result; + } + + + // + bool HasCondition( + XBoxZone &box, + XPOIState &state, + int barIndex = 0, + ENUM_TIMEFRAMES forPeriod = NULL // + ) + { + // + bool result = false; + + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + swingBar.Clean(); + breakerBar.Clean(); + appliedBox.Clean(); + momentumBar.Clean(); + rejectionBar.Clean(); + + // + result = IsValid() && + box.IsValid() && + HasDirection() && + state.IsValid() && + state.HasChild(); + if (!result) + { + // + swingBar.Clean(); + breakerBar.Clean(); + appliedBox.Clean(); + momentumBar.Clean(); + rejectionBar.Clean(); + + // + return result; + } + + // + string symbol = box.symbol; + if (!IsValid(forPeriod)) + { + forPeriod = box.period; + } + datetime cTime = iTime( + symbol, + forPeriod, + barIndex // + ); + + // + ENUM_X_DIRECTION forDir = box.dir; + bool isBullish = IsBullish(forDir); + + // + int supportsCount = 0; + bool hasSupports = false; + XCSupportZone *supports[]; + + // + int resistancesCount = 0; + bool hasResistances = false; + XCResistanceZone *resistances[]; + + // + XBoxZone supResBoxes[]; + int supresBoxesCount = 0; + bool hasSupResBoxes = false; + + // + int count = 0; + bool has = false; + + // + has = state.HasSupportZones(); + if (has) + { + // + count = state.CountSupportZones(); + for (int i = 0; i < count; i++) + { + // + XCSupportZone *iZone = state.supportZones[i]; + + // + iZone.To(cTime); + + // + XBoxZone iBox; + bool hasBox = ToBox( + iBox, + iZone // + ); + if (!hasBox) + { + // + iBox.Clean(); + continue; + } + + // + // Check From ... + bool isInside = IsBoxInside( + iBox, + box // + ); + if (!isInside) + { + // + iBox.Clean(); + continue; + } + + // + Add( + iZone, + supports // + ); + + // + AddRef( + iBox, + supResBoxes // + ); + + // + iBox.Clean(); + } + + // + supportsCount = ArraySize(supports); + hasSupports = IsValidSize(supportsCount); + + // + supresBoxesCount = ArraySize(supResBoxes); + hasSupResBoxes = IsValidSize(supresBoxesCount); + } + + // + has = state.HasResistanceZones(); + if (has) + { + // + count = state.CountResistanceZones(); + for (int i = 0; i < count; i++) + { + // + XCResistanceZone *iZone = state.resistanceZones[i]; + + // + iZone.To(cTime); + + // + XBoxZone iBox; + bool hasBox = ToBox( + iBox, + iZone // + ); + if (!hasBox) + { + // + iBox.Clean(); + continue; + } + + // + // Check From ... + bool isInside = IsBoxInside( + iBox, + box // + ); + if (!isInside) + { + // + iBox.Clean(); + continue; + } + + // + Add( + iZone, + resistances // + ); + + // + AddRef( + iBox, + supResBoxes // + ); + + // + iBox.Clean(); + } + + // + resistancesCount = ArraySize(resistances); + hasResistances = IsValidSize(resistancesCount); + + // + supresBoxesCount = ArraySize(supResBoxes); + hasSupResBoxes = IsValidSize(supresBoxesCount); + } + + // + result = hasSupResBoxes; + if (!result) + { + // + Clean(supports); + Clean(resistances); + Clean(supResBoxes); + + // + swingBar.Clean(); + breakerBar.Clean(); + appliedBox.Clean(); + momentumBar.Clean(); + rejectionBar.Clean(); + + // + return result; + } + + // // + // AddRef( + // box, + // supResBoxes // + // ); + + // + // Detect Bars ... + + // + XOHCL zBar; + result = zBar.Init( + symbol, + forPeriod, + barIndex // + ); + if (!result) + { + // + zBar.Clean(); + Clean(supports); + Clean(resistances); + Clean(supResBoxes); + + // + swingBar.Clean(); + breakerBar.Clean(); + appliedBox.Clean(); + momentumBar.Clean(); + rejectionBar.Clean(); + + // + return result; + } + + // + XOHCL cBar; + result = zBar.GetPreviousBar(cBar); + if (!result) + { + // + zBar.Clean(); + cBar.Clean(); + Clean(supports); + Clean(resistances); + Clean(supResBoxes); + + // + swingBar.Clean(); + breakerBar.Clean(); + appliedBox.Clean(); + momentumBar.Clean(); + rejectionBar.Clean(); + + // + return result; + } + + // + XOHCL pBar; + result = cBar.GetPreviousBar(pBar); + if (!result) + { + // + zBar.Clean(); + cBar.Clean(); + pBar.Clean(); + Clean(supports); + Clean(resistances); + Clean(supResBoxes); + + // + swingBar.Clean(); + breakerBar.Clean(); + appliedBox.Clean(); + momentumBar.Clean(); + rejectionBar.Clean(); + + // + return result; + } + + // + XOHCL ppBar; + result = pBar.GetPreviousBar(ppBar); + if (!result) + { + // + zBar.Clean(); + cBar.Clean(); + pBar.Clean(); + ppBar.Clean(); + Clean(supports); + Clean(resistances); + Clean(supResBoxes); + + // + swingBar.Clean(); + breakerBar.Clean(); + appliedBox.Clean(); + momentumBar.Clean(); + rejectionBar.Clean(); + + // + return result; + } + + // + // Check Conditions ... + + // + // Detect Start Senario ... + + // + double fiboPressureLevel = GetFiboLevelValue(X_FIBO_LEVEL_382); + + // + double fiboUpDown = GetFibonacciLevel( + pBar.high, + pBar.low, + X_FIBO_LEVEL_382, + X_DIRECTION_BEARISH // + ); + double fiboDownUp = GetFibonacciLevel( + pBar.high, + pBar.low, + X_FIBO_LEVEL_382, + X_DIRECTION_BULLISH // + ); + + // + bool hasFiboToUpPressure = + fiboDownUp > 0 && + fiboDownUp <= pBar.GetDown(); + bool hasFiboToDownPressure = + fiboUpDown > 0 && + fiboUpDown >= pBar.GetUp(); + + // + int selectedBoxIDX = -1; + for (int j = 0; j < supresBoxesCount; j++) + { + // + double appliedPrice = + isBullish + ? supResBoxes[j].lower + : supResBoxes[j].upper; + + // + // Check Swing Low ... + bool isSwingLow = + // + pBar.low < ppBar.low && + pBar.low < cBar.low && + zBar.open > pBar.low && + // + appliedPrice > pBar.low && + appliedPrice < pBar.GetDown() + // + ; + bool isPressuredSwingLow = + isSwingLow && + hasFiboToUpPressure; + bool isPressuredStrongSwingLow = + pBar.IsBullish() && + isPressuredSwingLow; + + // + bool isSwingHigh = + // + pBar.high > ppBar.high && + pBar.high > cBar.high && + zBar.open < pBar.high && + // + appliedPrice < pBar.high && + appliedPrice > pBar.GetUp() + // + ; + bool isPressuredSwingHigh = + isSwingHigh && + hasFiboToDownPressure; + bool isPressuredStrongSwingHigh = + pBar.IsBearish() && + isPressuredSwingHigh; + + // + bool hasValidSwing = + isBullish + ? isSwingLow + : isSwingHigh; + bool hasValidPressuredSwing = + isBullish + ? isPressuredSwingLow + : isPressuredSwingHigh; + bool hasValidPressuredStrongSwing = + isBullish + ? isPressuredStrongSwingLow + : isPressuredStrongSwingHigh; + if (hasValidSwing) + { + swingBar = pBar; + } + if (hasValidPressuredSwing) + { + swingBar = pBar; + } + if (hasValidPressuredStrongSwing) + { + swingBar = pBar; + } + + // + bool isCBarBreaked = IsBarBreak( + appliedPrice, + forDir, + cBar // + ); + if (isCBarBreaked) + { + breakerBar = cBar; + } + bool isPBarBreaked = IsBarBreak( + appliedPrice, + forDir, + pBar // + ); + if (!isCBarBreaked && isPBarBreaked) + { + breakerBar = pBar; + } + else + { + isPBarBreaked = false; + } + bool isPPBarBreaked = IsBarBreak( + appliedPrice, + forDir, + ppBar // + ); + if (!isCBarBreaked && + !isPBarBreaked && + isPPBarBreaked) + { + breakerBar = ppBar; + } + else + { + isPPBarBreaked = false; + } + bool isBoxBreaked = isCBarBreaked || + isPBarBreaked || + isPPBarBreaked; + + // + bool isCBarRejected = IsBarReject( + appliedPrice, + forDir, + cBar // + ); + if (isCBarRejected) + { + rejectionBar = cBar; + } + bool isPBarRejected = IsBarReject( + appliedPrice, + forDir, + pBar // + ); + if (!isCBarRejected && isPBarRejected) + { + rejectionBar = pBar; + } + else + { + isPBarRejected = false; + } + bool isPPBarRejected = IsBarReject( + appliedPrice, + forDir, + ppBar // + ); + if (!isCBarRejected && + !isPBarRejected && + isPPBarRejected) + { + rejectionBar = ppBar; + } + else + { + isPPBarRejected = false; + } + bool isBoxRejected = isCBarRejected || + isPBarRejected || + isPPBarRejected; + + // + bool hasRejectionBar = false; + if (isBullish) + { + // + count = state.CountBullishRejectionBars(); + for (int i = 0; i < count; i++) + { + // + XCRejectionBar *iZone = state.bullishRejectionBars[i]; + + // + XOHCL iBar; + bool isFilled = iZone.FillBar(iBar); + if (!isFilled) + { + continue; + } + + // + int iBarIndex = iBar.Index(); + + // + hasRejectionBar = + // + (iBarIndex == cBar.Index() || + iBarIndex == pBar.Index()) + // + ; + if (hasRejectionBar) + { + // + if (!rejectionBar.IsValid()) + { + rejectionBar = iBar; + } + + // + break; + } + } + } + else + { + // + count = state.CountBearishRejectionBars(); + for (int i = 0; i < count; i++) + { + // + XCRejectionBar *iZone = state.bearishRejectionBars[i]; + + // + XOHCL iBar; + bool isFilled = iZone.FillBar(iBar); + if (!isFilled) + { + continue; + } + + // + int iBarIndex = iBar.Index(); + + // + hasRejectionBar = + // + (iBarIndex == cBar.Index() || + iBarIndex == pBar.Index()) + // + ; + if (hasRejectionBar) + { + // + if (!rejectionBar.IsValid()) + { + rejectionBar = iBar; + } + + // + break; + } + } + } + + // + bool hasMomentumBar = false; + if (isBullish) + { + // + count = state.CountBullishMomentumBars(); + for (int i = 0; i < count; i++) + { + // + XCMomentumBar *iZone = state.bullishMomentumBars[i]; + + // + XOHCL iBar; + bool isFilled = iZone.FillBar(iBar); + if (!isFilled) + { + continue; + } + + // + int iBarIndex = iBar.Index(); + + // + hasMomentumBar = + // + (iBarIndex == cBar.Index() || + iBarIndex == pBar.Index()) + // + ; + if (hasMomentumBar) + { + // + if (!momentumBar.IsValid()) + { + momentumBar = iBar; + } + + // + break; + } + } + } + else + { + // + count = state.CountBearishMomentumBars(); + for (int i = 0; i < count; i++) + { + // + XCMomentumBar *iZone = state.bearishMomentumBars[i]; + + // + XOHCL iBar; + bool isFilled = iZone.FillBar(iBar); + if (!isFilled) + { + continue; + } + + // + int iBarIndex = iBar.Index(); + + // + hasMomentumBar = + // + (iBarIndex == cBar.Index() || + iBarIndex == pBar.Index()) + // + ; + if (hasMomentumBar) + { + // + if (!momentumBar.IsValid()) + { + momentumBar = iBar; + } + + // + break; + } + } + } + + // + bool hasSwing = false; + if (isBullish) + { + // + count = state.CountSwingLows(); + for (int i = 0; i < count; i++) + { + // + XCSwing *iSwing = state.swingLows[i]; + + // + XOHCL iBar; + bool isFilled = iSwing.FillBar(iBar); + if (!isFilled) + { + continue; + } + + // + int iBarIndex = iBar.Index(); + + // + hasSwing = + // + (iBarIndex == cBar.Index() || + iBarIndex == pBar.Index()) + // + ; + if (hasSwing) + { + // + if (!swingBar.IsValid()) + { + swingBar = iBar; + } + + // + break; + } + } + } + else + { + // + count = state.CountSwingHighs(); + for (int i = 0; i < count; i++) + { + // + XCSwing *iSwing = state.swingHighs[i]; + + // + XOHCL iBar; + bool isFilled = iSwing.FillBar(iBar); + if (!isFilled) + { + continue; + } + + // + int iBarIndex = iBar.Index(); + + // + hasSwing = + // + (iBarIndex == cBar.Index() || + iBarIndex == pBar.Index()) + // + ; + if (hasSwing) + { + // + if (!swingBar.IsValid()) + { + swingBar = iBar; + } + + // + break; + } + } + } + + // + bool hasRequiredValidations = + // + (hasRejectionBar || + hasMomentumBar) + // + || + // + (hasRejectionBar || + hasSwing) + // + || + // + (hasMomentumBar || + hasSwing) + // + ; + + // + result = + // + (isBoxBreaked && + (hasRequiredValidations || + hasValidPressuredSwing)) + // + || + // + (isBoxRejected && + (hasRequiredValidations || + hasValidPressuredSwing)) + // + ; + if (result) + { + // + selectedBoxIDX = j; + break; + } + } + + // + result = + result && + (isBullish + ? zBar.open >= box.upper + : zBar.open <= box.lower) && + IsValidIndex(selectedBoxIDX); + if (result) + { + appliedBox = supResBoxes[selectedBoxIDX]; + } + + // + zBar.Clean(); + cBar.Clean(); + pBar.Clean(); + ppBar.Clean(); + Clean(supports); + Clean(resistances); + Clean(supResBoxes); + + // + return result; + } + + + + // + ulong chartID = visionCycleHelper.mPOIDrawer.ChartIdentification(); + int subWindow = visionCycleHelper.mPOIDrawer.SubWindowIdentification(); + + // + if (pivot > 0) + { + // + string name = "Pivot_" + symbol + ToString(period) + ToString(pivot) + "_"; + CChartObjectHLine *iObj; + iObj = new CChartObjectHLine(); + bool isCreated = iObj.Create( + chartID, + name, + subWindow, + pivot // + ); + if (isCreated) + { + // + iObj.Color(clrLime); + mObjects.Add(iObj); + } + } + + // + if (point > 0) + { + // + string name = "Point_" + symbol + ToString(period) + ToString(pivot) + "_"; + CChartObjectHLine *iObj; + iObj = new CChartObjectHLine(); + bool isCreated = iObj.Create( + chartID, + name, + subWindow, + point // + ); + if (isCreated) + { + // + iObj.Color(clrLime); + mObjects.Add(iObj); + } + } + + + + // + RemoveDraws(); + + // + if (hasLastBullishConsolidationZone) + { + // + XCConsolidationZoneObject *iObj; + bool isCreated = visionCycleHelper + .mPOIDrawer + .CreateConsolidationZone( + lastBullishConsolidationZone, + iObj // + ); + if (isCreated) + { + mObjects.Add(iObj); + } + } + + // + if (hasLastBearishConsolidationZone) + { + // + XCConsolidationZoneObject *iObj; + bool isCreated = visionCycleHelper + .mPOIDrawer + .CreateConsolidationZone( + lastBearishConsolidationZone, + iObj // + ); + if (isCreated) + { + mObjects.Add(iObj); + } + } + + // + if (hasPrevBullishConsolidationZone) + { + // + XCConsolidationZoneObject *iObj; + bool isCreated = visionCycleHelper + .mPOIDrawer + .CreateConsolidationZone( + prevBullishConsolidationZone, + iObj // + ); + if (isCreated) + { + mObjects.Add(iObj); + } + } + + // + if (hasPrevBearishConsolidationZone) + { + // + XCConsolidationZoneObject *iObj; + bool isCreated = visionCycleHelper + .mPOIDrawer + .CreateConsolidationZone( + prevBearishConsolidationZone, + iObj // + ); + if (isCreated) + { + mObjects.Add(iObj); + } + } + +////////////////////////////////////////////////////////////////////////////////////////////// + + // + XPOIState state; + mXWZPOIDetector.GetState(state); + + // + ENUM_X_DIRECTION trend = + IsValid(lastBullishTrend) && + lastBullishTrend > lastBearishTrend + ? X_DIRECTION_BULLISH + : IsValid(lastBearishTrend) && + lastBearishTrend > lastBullishTrend + ? X_DIRECTION_BEARISH + : X_DIRECTION_NONE; + bool hasTrend = HasDirection(trend); + bool hasBullishTrend = hasTrend && + IsBullish(trend); + bool hasBearishTrend = hasTrend && + IsBearish(trend); + + // + // Order Block ... + has = hasBullishTrend && + state.HasBullishOrderBlocks(); + if (has) + { + // + XCOrderBlock *tmps[]; + count = ExtractInsideZones( + iBar, + state.bullishOrderBlocks, + tmps // + ); + has = IsValidSize(count); + if (has) + { + // + idx = GetLowest(tmps); + hasInsideOB = IsValidIndex(idx); + if (hasInsideOB) + { + insideOB = tmps[idx]; + } + } + + // + Clean(tmps); + } + has = hasBearishTrend && + state.HasBearishOrderBlocks(); + if (has) + { + // + XCOrderBlock *tmps[]; + count = ExtractInsideZones( + iBar, + state.bearishOrderBlocks, + tmps // + ); + has = IsValidSize(count); + if (has) + { + // + idx = GetHighest(tmps); + hasInsideOB = IsValidIndex(idx); + if (hasInsideOB) + { + insideOB = tmps[idx]; + } + } + + // + Clean(tmps); + } + + // + // Fair Value Gap ... + has = hasBullishTrend && + state.HasBullishFairValueGaps(); + if (has) + { + // + XCFVG *tmps[]; + count = ExtractInsideZones( + iBar, + state.bullishFairValueGaps, + tmps // + ); + has = IsValidSize(count); + if (has) + { + // + idx = GetLowest(tmps); + hasInsideFVG = IsValidIndex(idx); + if (hasInsideFVG) + { + insideFVG = tmps[idx]; + } + } + + // + Clean(tmps); + } + has = hasBearishTrend && + state.HasBearishFairValueGaps(); + if (has) + { + // + XCFVG *tmps[]; + count = ExtractInsideZones( + iBar, + state.bearishFairValueGaps, + tmps // + ); + has = IsValidSize(count); + if (has) + { + // + idx = GetHighest(tmps); + hasInsideFVG = IsValidIndex(idx); + if (hasInsideFVG) + { + insideFVG = tmps[idx]; + } + } + + // + Clean(tmps); + } + + // + // Supply Zone ... + has = hasBearishTrend && + state.HasSupplyZones(); + if (has) + { + // + XCSupplyZone *tmps[]; + count = ExtractInsideZones( + iBar, + state.supplyZones, + tmps // + ); + has = IsValidSize(count); + if (has) + { + // + idx = GetHighest(tmps); + hasInsideSupply = IsValidIndex(idx); + if (hasInsideSupply) + { + insideSupply = tmps[idx]; + } + } + + // + Clean(tmps); + } + + // + // Resistance Zone ... + has = hasBearishTrend && + state.HasResistanceZones(); + if (has) + { + // + XCResistanceZone *tmps[]; + count = ExtractInsideZones( + iBar, + state.resistanceZones, + tmps // + ); + has = IsValidSize(count); + if (has) + { + // + idx = GetHighest(tmps); + hasInsideResistance = IsValidIndex(idx); + if (hasInsideResistance) + { + insideResistnce = tmps[idx]; + } + } + + // + Clean(tmps); + } + + // + // Demand Zone ... + has = hasBullishTrend && + state.HasDemandZones(); + if (has) + { + // + XCDemandZone *tmps[]; + count = ExtractInsideZones( + iBar, + state.demandZones, + tmps // + ); + has = IsValidSize(count); + if (has) + { + // + idx = GetLowest(tmps); + hasInsideDemand = IsValidIndex(idx); + if (hasInsideDemand) + { + insideDemand = tmps[idx]; + } + } + + // + Clean(tmps); + } + + // + // Support Zone ... + has = hasBullishTrend && + state.HasSupportZones(); + if (has) + { + // + XCSupportZone *tmps[]; + count = ExtractInsideZones( + iBar, + state.supportZones, + tmps // + ); + has = IsValidSize(count); + if (has) + { + // + idx = GetLowest(tmps); + hasInsideSupport = IsValidIndex(idx); + if (hasInsideSupport) + { + insideSupport = tmps[idx]; + } + } + + // + Clean(tmps); + } + + + ////////////////////////////////////////////////////////// + + + // // + // // Calculate Rejection Values ... + + // // + // double fiboUpDown = GetFibonacciLevel( + // iBar.high, + // iBar.low, + // X_FIBO_LEVEL_382, + // X_DIRECTION_BEARISH // + // ); + // double fiboDownUp = GetFibonacciLevel( + // iBar.high, + // iBar.low, + // X_FIBO_LEVEL_382, + // X_DIRECTION_BULLISH // + // ); + + // // + // bool hasFiboToUpPressure = + // fiboDownUp > 0 && + // fiboDownUp <= iBar.GetDown(); + // bool hasFiboToDownPressure = + // fiboUpDown > 0 && + // fiboUpDown >= iBar.GetUp(); + + // // + // bool isLongReject = + // // + // iBar.low < iMa && + // iBar.high >= iMa && + // iBar.GetDown() >= iMa + // // + // ; + // bool isStrongLongReject = + // iBar.IsBullish() && + // isLongReject; + // bool isPressuredLongReject = + // isLongReject && + // hasFiboToUpPressure; + // bool isPressuredStrongLongReject = + // isStrongLongReject && + // isPressuredLongReject; + + // // + // bool isShortReject = + // // + // iBar.high > iMa && + // iBar.low <= iMa && + // iBar.GetUp() <= iMa + // // + // ; + // bool isStrongShortReject = + // iBar.IsBearish() && + // isShortReject; + // bool isPressuredShortReject = + // isShortReject && + // hasFiboToDownPressure; + // bool isPressuredStrongShortReject = + // isStrongShortReject && + // isPressuredShortReject; + + // // + // double iLongRejectValue = 0; + // double iShortRejectValue = 0; + + // // + // bool isAppliedLongReject = false; + // bool isAppliedShortReject = false; + // switch (rejectionType) + // { + // // + // case XWZ_REJECTION_BAR: + // isAppliedLongReject = isLongReject; + // isAppliedShortReject = isShortReject; + // break; + + // // + // case XWZ_REJECTION_STRONG_BAR: + // isAppliedLongReject = isStrongLongReject; + // isAppliedShortReject = isStrongShortReject; + // break; + + // // + // case XWZ_REJECTION_PRESSURED_BAR: + // isAppliedLongReject = isPressuredLongReject; + // isAppliedShortReject = isPressuredShortReject; + // break; + + // // + // case XWZ_REJECTION_STRONG_PRESSURED_BAR: + // isAppliedLongReject = isPressuredStrongLongReject; + // isAppliedShortReject = isPressuredStrongShortReject; + // break; + // } + + // // + // // Calculate Rejection Verification Values ... + + // // + // int iLLIDX = pBar + // .FindLowestIndex( + // rejectionVerificationLength, + // MODE_LOW // + // ); + // datetime iLLTime = iTime( + // _Symbol, + // _Period, + // iLLIDX // + // ); + // double iLL = iLow( + // _Symbol, + // _Period, + // iLLIDX // + // ); + + // // + // int iHHIDX = pBar + // .FindHighestIndex( + // rejectionVerificationLength, + // MODE_HIGH // + // ); + // datetime iHHTime = iTime( + // _Symbol, + // _Period, + // iHHIDX // + // ); + // double iHH = iHigh( + // _Symbol, + // _Period, + // iHHIDX // + // ); + + // // + // bool isLLBreaked = false; + // bool isHHBreaked = false; + // if (rejectionVerificationLength > 0) + // { + // // + // for (int i = bar_index + 1; i < bar_index + rejectionVerificationLength; i++) + // { + // // + // double iMaValue = maBuffer[i]; + + // // + // XOHCL iBar; + // bool isInited = iBar.Init( + // _Symbol, + // _Period, + // i // + // ); + // if (!isInited) + // { + // // + // iBar.Clean(); + // isLLBreaked = true; + // isHHBreaked = true; + // break; + // } + + // // + // if (!isLLBreaked) + // { + // isLLBreaked = iBar.low < iMaValue; + // } + + // // + // if (!isHHBreaked) + // { + // isHHBreaked = iBar.high > iMaValue; + // } + + // // + // if (isLLBreaked && + // isHHBreaked) + // { + // break; + // } + // } + // } + + // // + // // Validate Rejections ... + + // // + // // -[] Before Reject Long, price + // // must not touch Ma from Up for at least 3 Bar ... + // bool isValidAppliedLongReject = + // !isLLBreaked && + // isAppliedLongReject; + + // // + // // -[] Before Reject Short Price + // // must no touch Ma from down at least 3 Bar ... + // bool isValidAppliedShortReject = + // !isHHBreaked && + // isAppliedShortReject; + + // // + // if (isValidAppliedLongReject) + // { + // iLongRejectValue = iBar.low - points10; + // } + // else + // { + // iLongRejectValue = 0; + // } + + // // + // if (isValidAppliedShortReject) + // { + // iShortRejectValue = iBar.high + points10; + // } + // else + // { + // iShortRejectValue = 0; + // } + + // // + // // Draw Verification Box ... + // if (isValidAppliedLongReject || + // isValidAppliedShortReject) + // { + // // + // datetime time1 = iTime( + // _Symbol, + // _Period, + // iBar.Index() + rejectionVerificationLength // + // ); + // datetime time2 = iTime( + // _Symbol, + // _Period, + // iBar.Index() + 0 // + // ); + // string llName = ToString(iLLIDX) + "_" + + // ToString(iLL) + "_" + + // ToMD5(iLLTime); + // CChartObjectTrend *llTrend; + // llTrend = new CChartObjectTrend(); + // bool isCreated = llTrend.Create( + // 0, + // llName, + // 0, + // time1, + // iLL, + // time2, + // iLL // + // ); + // if (isCreated) + // { + // mXWZDrawnObjects.Add(llTrend); + // } + + // // + // string hhName = ToString(iHHIDX) + "_" + + // ToString(iHH) + "_" + + // ToMD5(iHHTime); + // CChartObjectTrend *hhTrend; + // hhTrend = new CChartObjectTrend(); + // isCreated = hhTrend.Create( + // 0, + // hhName, + // 0, + // time1, + // iHH, + // time2, + // iHH // + // ); + // if (isCreated) + // { + // mXWZDrawnObjects.Add(hhTrend); + // } + // } + + // // + // int idx = -1; + // int count = 0; + // bool has = false; + + // // + // ENUM_X_DIRECTION trend = + // IsValid(lastBullishTrend) && + // lastBullishTrend > lastBearishTrend + // ? X_DIRECTION_BULLISH + // : IsValid(lastBearishTrend) && + // lastBearishTrend > lastBullishTrend + // ? X_DIRECTION_BEARISH + // : X_DIRECTION_NONE; + // bool hasTrend = HasDirection(trend); + // bool hasBullishTrend = hasTrend && + // IsBullish(trend); + // bool hasBearishTrend = hasTrend && + // IsBearish(trend); + + // // + // // Filling Buffers ... + + // // + // longSLBuffer[bar_index] = iLongSL; + // shortSLBuffer[bar_index] = iShortSL; + + + /////////////////////////////////////////////////// + + // + // Draw ... + bool isBullish = signalZone.ob.IsBullish(); + bool isCreated = false; + XCBaseObject *iObj = NULL; + if (isBullish) + { + // + XCBullishOrderBlockObject *mObj; + isCreated = visionCycleHelper.mPOIDrawer + .CreateBullishOrderBlock( + signalZone.ob, + mObj // + ); + + // + if (isCreated) + { + // + mObj.ZoneWidth(2); + mObj.ZoneColor(clrGold); + mObj.ZoneStyle(STYLE_SOLID); + + // + iObj = (XCBaseObject *)mObj; + } + } + else + { + // + XCBearishOrderBlockObject *mObj; + isCreated = visionCycleHelper.mPOIDrawer + .CreateBearishOrderBlock( + signalZone.ob, + mObj // + ); + + // + if (isCreated) + { + // + mObj.ZoneWidth(2); + mObj.ZoneColor(clrGold); + mObj.ZoneStyle(STYLE_SOLID); + + // + iObj = (XCBaseObject *)mObj; + } + } + + // + if (isCreated) + { + mWorkingZoneObjects.Add(iObj); + } + + // + Print("Signal Zone ..."); diff --git a/BKPS/14031206/Documents/BKP/xsupdem/tmp.signal.mq5 b/BKPS/14031206/Documents/BKP/xsupdem/tmp.signal.mq5 new file mode 100644 index 0000000..e67d938 --- /dev/null +++ b/BKPS/14031206/Documents/BKP/xsupdem/tmp.signal.mq5 @@ -0,0 +1,1234 @@ +///////////////////////////////////////////////////////////////////////////////////////////////////// + +else if (isPriceRejected) +{ + // + bool hasRejectedOB = rejectedOB != NULL; + bool hasRejectedFVG = rejectedFVG != NULL; + + // // + // if (hasRejectedOB) + // { + // // + // DrawX121SMCXSupDemOBSOrderBlock( + // rejectedOB, + // consolidationCycleHelper.mPOIDrawer // + // ); + // } + + // // + // if (hasRejectedFVG) + // { + // // + // DrawX121SMCXSupDemOBSFairValueGap( + // rejectedFVG, + // consolidationCycleHelper.mPOIDrawer // + // ); + // } + + // // + // if (!hasRejectedOB && + // !hasRejectedFVG) + // { + // // + // if (hasInsideSupDemZone) + // { + // // + // double min = 0; + // double max = 0; + // bool canSetMin = false; + // bool canSetMax = false; + + // // + // if (swingBar.IsValid()) + // { + // // + // canSetMin = + // min == 0 || min > swingBar.low; + // if (canSetMin) + // { + // min = swingBar.low; + // } + + // // + // canSetMax = + // max == 0 || max < swingBar.high; + // if (canSetMax) + // { + // max = swingBar.high; + // } + // } + + // // + // if (rejectBar.IsValid()) + // { + // // + // canSetMin = + // min == 0 || min > rejectBar.low; + // if (canSetMin) + // { + // min = rejectBar.low; + // } + + // // + // canSetMax = + // max == 0 || max < rejectBar.high; + // if (canSetMax) + // { + // max = rejectBar.high; + // } + // } + + // // + // if (breakerBar.IsValid()) + // { + // // + // canSetMin = + // min == 0 || min > breakerBar.low; + // if (canSetMin) + // { + // min = breakerBar.low; + // } + + // // + // canSetMax = + // max == 0 || max < breakerBar.high; + // if (canSetMax) + // { + // max = breakerBar.high; + // } + // } + + // // + // if (momentumBar.IsValid()) + // { + // // + // canSetMin = + // min == 0 || min > momentumBar.low; + // if (canSetMin) + // { + // min = momentumBar.low; + // } + + // // + // canSetMax = + // max == 0 || max < momentumBar.high; + // if (canSetMax) + // { + // max = momentumBar.high; + // } + // } + + // // + // upper = max; + // lower = min; + + // // + // if (hasInsideSupplyZone) + // { + // // + // isInsideZoneDirectionBullish = false; + // isInsideZoneDirectionBearish = true; + + // // + // lower = GetEntry( + // conditions.symbol, + // POSITION_TYPE_SELL // + // ); + // } + + // // + // if (hasInsideDemandZone) + // { + // // + // isInsideZoneDirectionBullish = true; + // isInsideZoneDirectionBearish = false; + + // // + // upper = GetEntry( + // conditions.symbol, + // POSITION_TYPE_BUY // + // ); + // } + // } + // } +} + +///////////////////////////////////////////////////////////////////////////////////////////////////// + + // + if (!hasInsideZone && + !hasRejectedZone && + hasInsideSupDemZone) + { + // + // Check Supply and Demand Zone Rejection ... + if (hasInsideSupplyZone) + { + // + isPriceRejected = IsReject( + X_DIRECTION_BEARISH, + decisionZBar, + insideSupplyZone, + decisionState, + swingBar, + rejectBar, + breakerBar, + momentumBar, + false // + ); + } + else if (hasInsideDemandZone) + { + // + isPriceRejected = IsReject( + X_DIRECTION_BULLISH, + decisionZBar, + insideDemandZone, + decisionState, + swingBar, + rejectBar, + breakerBar, + momentumBar, + false // + ); + } + } + +///////////////////////////////////////////////////////////////////////////////////////////////////// + + // // + // // Detect Overal Trend ... + // ENUM_X_DIRECTION trend; + // bool hasTrend = mConditions.DetectTrend( + // trend, + // zIndex // + // ); + // bool hasBullishTrend = + // // + // hasTrend && + // IsBullish(trend) + // // + // ; + // bool hasBearishTrend = + // // + // hasTrend && + // IsBearish(trend) + // // + // ; + // result = hasTrend; + // if (!result) + // { + // return result; + // } + + // // + // // Now We Have to Detect at least One OrderBlock with FVG ... + // // for Trend Approvement ... + // bool hasOrderBlock = mConditions.HasOrderBlock(); + // bool hasFairValueGap = mConditions.HasFairValueGap(); + // if (!hasOrderBlock && + // !hasFairValueGap) + // { + // // + // int count = 0; + // bool has = false; + + // // + // XCFVG *fvg = NULL; + // XCOrderBlock *ob = NULL; + + // // + // if (hasBullishTrend) + // { + // // + // has = consolidationState.HasBullishOrderBlocks(); + // count = consolidationState.CountBullishOrderBlocks(); + + // // + // if (has) + // { + // // + // // Check Order Block ... + // for (int i = 0; i < count; i++) + // { + // // + // XCOrderBlock *iOB = consolidationState.bullishOrderBlocks[i]; + + // // + // iOB.To(cTime); + + // // + // // Check From Passes ... + // bool isFromPassed = iOB.From() > mConditions.demandZone.From(); + // if (!isFromPassed) + // { + // continue; + // } + + // // + // // Must inside DemandZone ... + // bool isInsideDemand = IsInsideDiff( + // iOB, + // mConditions.demandZone // + // ); + // if (!isInsideDemand) + // { + // continue; + // } + + // // + // // Check Started ... + // XOHCL startedBar; + // ENUM_X_DIRECTION startedDir; + // bool isStarted = iOB.IsStarted( + // X_DIRECTION_BULLISH, + // startedBar, + // startedDir // + // ); + // if (!isStarted) + // { + // // + // startedBar.Clean(); + // continue; + // } + + // // + // // Converts to Box ... + // XBoxZone obBox; + // bool hasOBBox = ToBox( + // obBox, + // iOB // + // ); + // if (!hasOBBox) + // { + // // + // obBox.Clean(); + // startedBar.Clean(); + // continue; + // } + + // // + // // Check Zone Must not Used before ... + // bool isUsed = IsBoxUsed( + // obBox, + // startedBar.Index() - 1, + // zIndex // + // ); + // if (isUsed) + // { + // // + // obBox.Clean(); + // startedBar.Clean(); + // continue; + // } + + // // + // ob = iOB; + + // // + // obBox.Clean(); + // startedBar.Clean(); + + // // + // break; + // } + + // // + // // Detect Fair Value Gap ... + // if (ob != NULL && + // ob.IsValid()) + // { + // // + // has = analyseState.HasBullishFairValueGaps(); + // count = analyseState.CountBullishFairValueGaps(); + // if (has) + // { + // // + // // Check Fir Value Gap ... + // for (int i = 0; i < count; i++) + // { + // // + // XCFVG *iFVG = analyseState.bullishFairValueGaps[i]; + + // // + // iFVG.To(cTime); + + // // + // // Check From Passes ... + // bool isFromPassed = iFVG.From() > ob.From(); + // if (!isFromPassed) + // { + // continue; + // } + + // // + // // Check Started ... + // XOHCL startedBar; + // ENUM_X_DIRECTION startedDir; + // bool isStarted = iFVG.IsStarted( + // X_DIRECTION_BULLISH, + // startedBar, + // startedDir // + // ); + // if (!isStarted) + // { + // // + // startedBar.Clean(); + // continue; + // } + + // // + // // Converts to Box ... + // XBoxZone fvgBox; + // bool hasFVGBox = ToBox( + // fvgBox, + // iFVG // + // ); + // if (!hasFVGBox) + // { + // // + // fvgBox.Clean(); + // startedBar.Clean(); + // continue; + // } + + // // + // // Check Inside Order Block ... + // bool isInside = IsInsideDiff( + // iFVG, + // ob, + // true // Force Side Out ... + // ); + // if (!isInside) + // { + // continue; + // } + + // // + // fvg = iFVG; + + // // + // fvgBox.Clean(); + // startedBar.Clean(); + + // // + // break; + // } + // } + // else + // { + // // + // ob = NULL; + // } + // } + // } + // } + // else if (hasBearishTrend) + // { + // // + // has = consolidationState.HasBearishOrderBlocks(); + // count = consolidationState.CountBearishOrderBlocks(); + + // // + // if (has) + // { + // // + // // Check Order Block ... + // for (int i = 0; i < count; i++) + // { + // // + // XCOrderBlock *iOB = consolidationState.bearishOrderBlocks[i]; + + // // + // iOB.To(cTime); + + // // + // // Check From Passes ... + // bool isFromPassed = iOB.From() > mConditions.supplyZone.From(); + // if (!isFromPassed) + // { + // continue; + // } + + // // + // // Must inside DemandZone ... + // bool isInsideDemand = IsInsideDiff( + // iOB, + // mConditions.supplyZone // + // ); + // if (!isInsideDemand) + // { + // continue; + // } + + // // + // // Check Started ... + // XOHCL startedBar; + // ENUM_X_DIRECTION startedDir; + // bool isStarted = iOB.IsStarted( + // X_DIRECTION_BEARISH, + // startedBar, + // startedDir // + // ); + // if (!isStarted) + // { + // // + // startedBar.Clean(); + // continue; + // } + + // // + // // Converts to Box ... + // XBoxZone obBox; + // bool hasOBBox = ToBox( + // obBox, + // iOB // + // ); + // if (!hasOBBox) + // { + // // + // obBox.Clean(); + // startedBar.Clean(); + // continue; + // } + + // // + // // Check Zone Must not Used before ... + // bool isUsed = IsBoxUsed( + // obBox, + // startedBar.Index() - 1, + // zIndex // + // ); + // if (isUsed) + // { + // // + // obBox.Clean(); + // startedBar.Clean(); + // continue; + // } + + // // + // ob = iOB; + + // // + // obBox.Clean(); + // startedBar.Clean(); + + // // + // break; + // } + + // // + // // Detect Fair Value Gap ... + // if (ob != NULL && + // ob.IsValid()) + // { + // // + // has = analyseState.HasBearishFairValueGaps(); + // count = analyseState.CountBearishFairValueGaps(); + // if (has) + // { + // // + // // Check Fir Value Gap ... + // for (int i = 0; i < count; i++) + // { + // // + // XCFVG *iFVG = analyseState.bearishFairValueGaps[i]; + + // // + // iFVG.To(cTime); + + // // + // // Check From Passes ... + // bool isFromPassed = iFVG.From() > ob.From(); + // if (!isFromPassed) + // { + // continue; + // } + + // // + // // Check Started ... + // XOHCL startedBar; + // ENUM_X_DIRECTION startedDir; + // bool isStarted = iFVG.IsStarted( + // X_DIRECTION_BEARISH, + // startedBar, + // startedDir // + // ); + // if (!isStarted) + // { + // // + // startedBar.Clean(); + // continue; + // } + + // // + // // Converts to Box ... + // XBoxZone fvgBox; + // bool hasFVGBox = ToBox( + // fvgBox, + // iFVG // + // ); + // if (!hasFVGBox) + // { + // // + // fvgBox.Clean(); + // startedBar.Clean(); + // continue; + // } + + // // + // // Check Inside Order Block ... + // bool isInside = IsInsideDiff( + // iFVG, + // ob, + // true // Force Side Out ... + // ); + // if (!isInside) + // { + // continue; + // } + + // // + // fvg = iFVG; + + // // + // fvgBox.Clean(); + // startedBar.Clean(); + + // // + // break; + // } + // } + // else + // { + // // + // ob = NULL; + // } + // } + // } + // } + + // // + // if (ob != NULL && + // fvg != NULL) + // { + // // + // mConditions.orderBlock = ob; + // mConditions.fairValueGap = fvg; + // } + + // // + // hasOrderBlock = mConditions.HasOrderBlock(); + // hasFairValueGap = mConditions.HasFairValueGap(); + // } + + // // + // bool isTrendApproved = hasOrderBlock && + // hasFairValueGap; + // result = isTrendApproved; + // if (!result) + // { + // return result; + // } + + // // + // mConditions.UpdateTo(cTime); + + // // + // // TODO: Remove ... + // RemoveDraws(); + // DrawConditions( + // mConditions, + // visionCycleHelper.mPOIDrawer // + // ); + + // // + // // Now We have to Detect Start Zones ... + // int count = 0; + // bool has = false; + + // + + // // + // XBoxZone targetBoxes[]; + // if (hasBullishTrend) + // { + // // + // // + // } + // else if (hasBearishTrend) + // { + // // + // // Demand Zones ... + // has = consolidationState.HasDemandZones(); + // count = consolidationState.CountDemandZones(); + // XBoxZone demandBox; + + // // + // if (has) + // { + // // + // XCDemandZone *demands[]; + // for (int i = 0; i < count; i++) + // { + // // + // XCDemandZone *iZone = consolidationState.demandZones[i]; + + // // + // iZone.To(cTime); + + // // + // // Check Price ... + // bool isPricePassed = decisionCBar.low > iZone.Upper(); + // if (!isPricePassed) + // { + // continue; + // } + + // // + // XBoxZone iBox; + // bool hasBox = ToBox( + // iBox, + // iZone // + // ); + // if (!hasBox) + // { + // // + // iBox.Clean(); + // continue; + // } + + // // // + // // XCDemandZoneObject *iObj; + // // bool isCreated = visionCycleHelper + // // .mPOIDrawer + // // .CreateDemandZone( + // // iZone, + // // iObj // + // // ); + + // // + // Add( + // iZone, + // demands // + // ); + + // // + // // AddRef( + // // iBox, + // // targetBoxes // + // // ); + + // // + // iBox.Clean(); + // } + + // // + // count = ArraySize(demands); + // has = IsValidSize(count); + // if (has) + // { + // // + // int lowestIDX = GetLowest(demands); + // int highestIDX = GetHighest(demands); + // int youngestIDX = GetYoungest(demands); + // bool hasHighAndLow = + // IsValidIndex(lowestIDX) && + // IsValidIndex(highestIDX) && + // IsValidIndex(youngestIDX); + // if (hasHighAndLow) + // { + // // + // XBoxZone box; + + // // + // box.symbol = demands[highestIDX].GetSymbol(); + // box.period = demands[highestIDX].GetPeriod(); + + // // + // box.to = cTime; + // box.dir = X_DIRECTION_BULLISH; + // box.from = demands[youngestIDX].From(); + // box.type = demands[highestIDX].TypeAsString(); + + // // + // box.upper = demands[highestIDX].Upper(); + // box.lower = demands[lowestIDX].Lower(); + + // // + // bool isValid = box.IsValid(); + // if (isValid) + // { + // // // + // // XCBoxObject *iBoxObj; + // // bool isCreated = visionCycleHelper + // // .mPOIDrawer + // // .CreateBox( + // // box, + // // iBoxObj // + // // ); + + // // // + // // if (isCreated) + // // { + // // // + // // color boxColor = + // // IsBullish(box.dir) + // // ? clrAqua + // // : clrMagenta; + + // // // + // // ENUM_LINE_STYLE boxStyle = STYLE_DOT; + + // // // + // // iBoxObj.BoxColor(boxColor); + // // iBoxObj.BoxStyle(boxStyle); + + // // // + // // Print("BOX ..."); + + // // } + + // // + // demandBox = box; + // } + + // // + // box.Clean(); + // } + // } + // } + + // // + // // Bullish Order Blocks ... + // // has = consolidationState.HasBullishOrderBlocks(); + // // count = consolidationState.CountBullishOrderBlocks(); + + // // + // // if (has) + // // { + // // // + // // for (int i = 0; i < count; i++) + // // { + // // // + // // XCOrderBlock *iZone = consolidationState.bullishOrderBlocks[i]; + + // // // + // // iZone.To(cTime); + + // // // + // // // Check Price ... + // // bool isPricePassed = decisionCBar.low > iZone.Upper(); + // // if (!isPricePassed) + // // { + // // continue; + // // } + + // // // + // // XBoxZone iBox; + // // bool hasBox = ToBox( + // // iBox, + // // iZone // + // // ); + // // if (!hasBox) + // // { + // // // + // // iBox.Clean(); + // // continue; + // // } + + // // // + // // AddRef( + // // iBox, + // // targetBoxes // + // // ); + + // // // + // // iBox.Clean(); + // // } + // // } + + // // + // // Bullish Fair Value Gaps ... + // // has = consolidationState.HasBullishFairValueGaps(); + // // count = consolidationState.CountBullishFairValueGaps(); + + // // + // // if (has) + // // { + // // // + // // for (int i = 0; i < count; i++) + // // { + // // // + // // XCFVG *iZone = consolidationState.bullishFairValueGaps[i]; + + // // // + // // iZone.To(cTime); + + // // // + // // // Check Price ... + // // bool isPricePassed = decisionCBar.low > iZone.Upper(); + // // if (!isPricePassed) + // // { + // // continue; + // // } + + // // // + // // XBoxZone iBox; + // // bool hasBox = ToBox( + // // iBox, + // // iZone // + // // ); + // // if (!hasBox) + // // { + // // // + // // iBox.Clean(); + // // continue; + // // } + + // // // + // // AddRef( + // // iBox, + // // targetBoxes // + // // ); + + // // // + // // iBox.Clean(); + // // } + // // } + // } + + // // + // count = ArraySize(targetBoxes); + // has = IsValidSize(count); + // if (has) + // { + // // + // for (int i = 0; i < count; i++) + // { + // // + // XBoxZone iBox = targetBoxes[i]; + + // // + // XCBoxObject *iBoxObj; + // bool isCreated = visionCycleHelper + // .mPOIDrawer + // .CreateBox( + // iBox, + // iBoxObj // + // ); + + // // + // iBox.Clean(); + // } + // } + +///////////////////////////////////////////////////////////////////////////////////////////////////// + + // + // When FVg is Worked ... + else + { + // + XCFVG *fvgs[]; + if (isBullish) + { + // + Copy( + analyseState.bullishFairValueGaps, + fvgs // + ); + } + else + { + // + Copy( + analyseState.bearishFairValueGaps, + fvgs // + ); + } + + // + // int count = ArraySize(fvgs); + // bool has = IsValidSize(count); + // if (has) + // { + // // + // for (int i = 0; i < count; i++) + // { + // // + // XCBaseObject *iObj; + // bool isCreate = visionCycleHelper + // .mPOIDrawer + // .CreateFairValueGap( + // fvgs[i], + // iObj // + // ); + // } + // } + + // + // Extract UnActivated FVGs ... + int fvgsCount = FilterZones( + // + fvgs, + // + trend, + NULL, // For Period ... + workerBar.time, + // + // Start ... + XZONE_STATE_IGNORED, + true, // Force Body Out ... + // + // Activation ... + XZONE_STATE_FAILED, + false, // Force Body Out ... + // + // Breaktion ... + XZONE_STATE_IGNORED, + false, // Force Body Out ... + // + // Works ... + XZONE_STATE_IGNORED, + false, // Body Out ... + // + true, // Apply Sorting ... + true // Ignore Inside ... + ); + + // + bool has = IsValidSize(fvgsCount); + if (has) + { + // + int youngestIDX = GetYoungest(fvgs); + has = IsValidIndex(youngestIDX); + if (has) + { + // + workingZone + .orderFlow[youngestOBFVGIDX] + .fvg = fvgs[youngestIDX]; + + // + workingZone.UpdateTo(cTime); + + // + XCBaseObject *iFVGObj; + bool isCreated = visionCycleHelper + .mPOIDrawer.CreateFairValueGap( + fvgs[youngestIDX], + iFVGObj // + ); + if (isCreated) + { + Print(""); + } + } + } + } + +///////////////////////////////////////////////////////////////////////////////////////////////////// + + // + // TODO: Neews to Review ... + else if ( + isOBWorked && + isFVGWorked && + isOBActivated && + isFVGActivated && + fvgActivationBar.time >= obActivationBar.time && + fvgActivationBar.time <= obActivationBar.NextAt() && + obWorkerBar.time > fvgWorkerBar.time) + { + // + XOHCL iBar; + bool isBarPassed = iBar.Init( + symbol, + period, + zIndex // + ); + + // + if (isBarPassed) + { + // + bool isBarInsideFVG = + isBullish + ? ( + // + iBar.low < workingZone.orderFlow[youngestOBFVGIDX].fvg.Upper() && + iBar.high > workingZone.orderFlow[youngestOBFVGIDX].fvg.Lower() && + // + consolidationZBar.low < workingZone.orderFlow[youngestOBFVGIDX].fvg.Upper() + // + ) + : ( + // + iBar.high > workingZone.orderFlow[youngestOBFVGIDX].fvg.Lower() && + iBar.low < workingZone.orderFlow[youngestOBFVGIDX].fvg.Upper() && + // + consolidationZBar.high > workingZone.orderFlow[youngestOBFVGIDX].fvg.Lower() + // + ); + if (isBarInsideFVG) + { + Print(""); + } + } + + // + iBar.Clean(); + } + +///////////////////////////////////////////////////////////////////////////////////////////////////// + + + // + // TODO: + // Remove Drawn Objects ... + + // // + // if (hasNewOB) + // { + // // + // XCBaseObject *iObj; + // bool isCreated = visionCycleHelper + // .mPOIDrawer + // .CreateOrderBlock( + // newOB, + // iObj // + // ); + // Print("New OB"); + // } + + // // + // if (hasNewFVG) + // { + // // + // XCBaseObject *iObj; + // bool isCreated = visionCycleHelper + // .mPOIDrawer + // .CreateFairValueGap( + // newFVG, + // iObj // + // ); + // Print("New FVG"); + // } + + // // + // if (hasNewAnalyseOB) + // { + // // + // XCBaseObject *iObj; + // bool isCreated = analyseCycleHelper + // .mPOIDrawer + // .CreateOrderBlock( + // newAnalyseOB, + // iObj // + // ); + // Print("New OB"); + // } + + // // + // if (hasNewAnalyseFVG) + // { + // // + // XCBaseObject *iObj; + // bool isCreated = analyseCycleHelper + // .mPOIDrawer + // .CreateFairValueGap( + // newAnalyseFVG, + // iObj // + // ); + // Print("New FVG"); + // } + +///////////////////////////////////////////////////////////////////////////////////////////////////// + + // + XPoint llPoint; + llPoint.value = iLL; + llPoint.at = iLLTime; + + // + // + + // + XPoint hhPoint; + hhPoint.value = iHH; + hhPoint.at = iHHTime; + + // + XPoint llSwings[]; + AddRef( + llPoint, + llSwings // + ); + + // + llPoint.at = iHHTime; + AddRef( + llPoint, + llSwings // + ); + + // + // + + // + XPoint hhSwings[]; + + // + hhPoint.at = iLLTime; + AddRef( + hhPoint, + hhSwings // + ); + + // + hhPoint.at = iHHTime; + AddRef( + hhPoint, + hhSwings // + ); + + // + XCTrendObject *llTrendObj; + bool isCreated = mXWZPOIDrawer.CreateTrend( + llSwings, + llTrendObj // + ); + if (isCreated) + { + mXWZDrawnObjects.Add(llTrendObj); + } + + // + XCTrendObject *hhTrendObj; + isCreated = mXWZPOIDrawer.CreateTrend( + hhSwings, + hhTrendObj // + ); + if (isCreated) + { + mXWZDrawnObjects.Add(hhTrendObj); + } + + // + // + + // + Clean(llSwings); + Clean(hhSwings); + llPoint.Clean(); + hhPoint.Clean(); + +///////////////////////////////////////////////////////////////////////////////////////////////////// + + +///////////////////////////////////////////////////////////////////////////////////////////////////// + diff --git a/BKPS/14031206/Documents/BKP/xsupdem/x-121.smc.expert.alert.class.mq5 b/BKPS/14031206/Documents/BKP/xsupdem/x-121.smc.expert.alert.class.mq5 new file mode 100644 index 0000000..680898a --- /dev/null +++ b/BKPS/14031206/Documents/BKP/xsupdem/x-121.smc.expert.alert.class.mq5 @@ -0,0 +1,2458 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 Class Library +// -------------------------------------- +// Name: XC121SMCExpert +// Description: provides all based classes for use ... +// +// +// Maintainer: +// ------------ +// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) +// +////////////////////////////////////////////////////// +// +// Global Properties ... +#property library +#property copyright "Copyright 2023, SaherElm IT Center" +#property link "https://www.saherelm.ir" +#property version "1.00" +#property strict + +// +// Imports ... +#include "../../Classes/x-saherelm.x-expert.class.mq5" +#include "../../Helpers/x-saherelm.x121.xcc.helper.mq5" +#include "../../Helpers/x-saherelm.x121.xct.helper.mq5" +#include "../Classes/x-121.smc.x-tradehandler.class.mq5" +#include "../Libraries/x-121.smc.lib.mq5" +#include "../Strategy/x-121.smc.strategy.class.mq5" + +// +// Definitions ... +string XC121SMCExpertToken = "XC121SMCEA"; + +// +// Implementation ... + +class XC121SMCExpert : public XCBaseExpert +{ + // + public: + // + XCX121XCCHelper *xccHelper; + XCX121XCTHelper *xctHelper; + + // + // Signal Event Listener ... + TOnStopLoss OnPositionSLEventListener; + TOnTakeProfit OnPositionTPEventListener; + TOnPartialClose OnPositionPartialCloseEventListener; + TOnModify OnPositionModifiedEventListener; + TOnForceClose OnPositionForceCloseEventListener; + + // + TOnDealsChanged OnDealsChangedEventListener; + TOnOrdersChanged OnOrdersChangedEventListener; + TOnPositionsChanged OnPositionsChangedEventListener; + + // + TOnX121SMCSignal OnSignalEventListener; + + // + // Constructor(s) ... + XC121SMCExpert() + { + } + + // + // Deconstructor(s) ... + ~XC121SMCExpert() + { + Clean(mStrategies); + } + + // + // Getter(s) / Setter(s) ... + + // + // Signalling Props ... + + /** + * Get Allow Long Signals State ... + * + * @return ( bool ) + */ + bool AllowLong() + { + return mAllowLong; + } + + /** + * Set Allow Long Signals State ... + * + * @param value: Boolean ... + */ + void AllowLong(bool value) + { + // + mAllowLong = value; + ReConfigure(); + } + + /** + * Get Allow Short Signals State ... + * + * @return ( bool ) + */ + bool AllowShort() + { + return mAllowShort; + } + + /** + * Set Allow Short Signals State ... + * + * @param value: Boolean ... + */ + void AllowShort(bool value) + { + // + mAllowShort = value; + ReConfigure(); + } + + /** + * Get Max Allowed Long Signals ... + * 0 => Unlimited ... + * + * @return ( int ) + */ + int MaxAllowedLongs() + { + return mMaxAllowedLongs; + } + + /** + * Set Max Allowed Long Signals ... + * + * @param value: Integer ... + * 0 => Unlimited ... + */ + void MaxAllowedLongs(int value) + { + // + if (value < 0) + { + value = 0; + } + + // + mMaxAllowedLongs = value; + ReConfigure(); + } + + /** + * Get Max Allowed Short Signals ... + * 0 => Unlimited ... + * + * @return ( int ) + */ + int MaxAllowedShorts() + { + return mMaxAllowedShorts; + } + + /** + * Set Max Allowed Short Signals ... + * + * @param value: Integer ... + * 0 => Unlimited ... + */ + void MaxAllowedShorts(int value) + { + // + if (value < 0) + { + value = 0; + } + + // + mMaxAllowedShorts = value; + ReConfigure(); + } + + /** + * Get Use Max Allowed Signal Types Per Symbol State ... + * + * @return ( bool ) + */ + bool UseMaxAllowedSignalsPerSymbol() + { + return mUseMaxAllowedSignalsPerSymbol; + } + + /** + * Set Use Max Allowed Signal Types Per Symbol State ... + * + * @param value: Boolean ... + */ + void UseMaxAllowedSignalsPerSymbol(bool value) + { + // + mUseMaxAllowedSignalsPerSymbol = false; + ReConfigure(); + } + + /** + * Get Last Position Profit In Points for Accept new Signal ... + * 0 => Accept All ... + * + * @return ( double ) + */ + double LastPositionProfitForAcceptNextInPoint() + { + return mLastPositionProfitForAcceptNextInPoint; + } + + /** + * Set Last Position Profit In Points for Accept new Signal ... + * + * @param value: Double ... + * 0 => Accept All ... + */ + void LastPositionProfitForAcceptNextInPoint(double value) + { + // + if (value < 0) + { + value = 0; + } + + // + mLastPositionProfitForAcceptNextInPoint = value; + ReConfigure(); + } + + /** + * Get Delay between two Signals in Bars ... + * 0 => Accept All ... + * + * @return ( int ) + */ + int DelaysBetweenTwoSignalsInBar() + { + return mDelaysBetweenTwoSignalsInBar; + } + + /** + * Set Delay between two Signals in Bars ... + * + * @param value: Integer ... + * 0 => Accept All ... + */ + void DelaysBetweenTwoSignalsInBar(int value) + { + // + if (value < 0) + { + value = 0; + } + + // + mDelaysBetweenTwoSignalsInBar = value; + ReConfigure(); + } + + /** + * Get Max Allowed Spread for Signalling ... + * 0 => Accept All ... + * + * @return ( double ) + */ + double MaxAllowedSpread() + { + return mMaxAllowedSpread; + } + + /** + * Set Max Allowed Spread for Signalling ... + * + * @param value: Double ... + * 0 => Accept All ... + */ + void MaxAllowedSpread(double value) + { + // + if (value < 0) + { + value = 0; + } + + // + mMaxAllowedSpread = value; + ReConfigure(); + } + + /** + * Get Minimum Spread Verification for Signalling ... + * 0 => Ignore ... + * + * @return ( int ) + */ + int MinRequiredVerificationForSpreadPass() + { + return mMinRequiredVerificationForSpreadPass; + } + + /** + * Set Minimum Spread Verification for Signalling ... + * + * @param value: Integer ... + * 0 => Ignore ... + */ + void MinRequiredVerificationForSpreadPass(int value) + { + // + if (value < 0) + { + value = 0; + } + + // + mMinRequiredVerificationForSpreadPass = value; + ReConfigure(); + } + + // + // Trade ... + + /** + * Get Allow Open Trade On Signals State ... + * + * @return ( bool ) + */ + bool AllowTrade() + { + return mAllowTrade; + } + + /** + * Set Allow Open Trade On Signals State ... + * + * @param value: Boolean ... + */ + void AllowTrade(bool value) + { + mAllowTrade = value; + } + + /** + * Get Enable Trade on Signals on Time ... + * + * @return ( string ) + */ + string StartTradeAt() + { + return mStartTradeAt; + } + + /** + * Set Enable Trade on Signals on Time ... + * + * @param value: String ... + */ + void StartTradeAt(string value) + { + mStartTradeAt = value; + } + + /** + * Get Enable Trade on Signals on Time ... + * + * @return ( string ) + */ + string StopTradeAt() + { + return mStopTradeAt; + } + + /** + * Set Enable Trade on Signals on Time ... + * + * @param value: String ... + */ + void StopTradeAt(string value) + { + mStopTradeAt = value; + } + + /** + * Get Enable Close All Trades on Signals on Time ... + * + * @return ( string ) + */ + string CloseAllTradesAt() + { + return mCloseAllTradesAt; + } + + /** + * Set Enable Close All Trades on Signals on Time ... + * + * @param value: String ... + */ + void CloseAllTradesAt(string value) + { + mCloseAllTradesAt = value; + } + + // + // Risk Management Props ... + + /** + * Get Risk to Reward Ratio ... + * + * @return ( double ) + */ + double R2R() + { + return mR2R; + } + + /** + * Set Risk to Reward Ratio ... + * + * @param value: Double ... + */ + void R2R(double value) + { + // + if (value < 1) + { + value = 1; + } + + // + mR2R = value; + ReConfigure(); + } + + /** + * Get Static Volume ... + * + * @return ( double ) + */ + double Volume() + { + return mVolume; + } + + /** + * Set Static Volume ... + * + * @param value: Double ... + */ + void Volume(double value) + { + // + if (value < 0.01) + { + value = 0.01; + } + + // + mVolume = value; + ReConfigure(); + } + + /** + * Get Static Balance for Calculate Trade Volume ... + * + * @return ( double ) + */ + double StaticBalance() + { + return mStaticBalance; + } + + /** + * Set Static Balance for Calculate Trade Volume ... + * + * @param value: Argument 1 + */ + void StaticBalance(double value) + { + // + if (value < 0) + { + value = 0; + } + + // + mStaticBalance = value; + } + + /** + * Get Balance Used In Each Trade ... + * + * @return ( double ) + */ + double BalancePerTrade() + { + return mBalancePerTrade; + } + + /** + * Set Balance Used In Each Trade ... + * + * @param value: Argument 1 + */ + void BalancePerTrade(double value) + { + // + if (value < 0) + { + value = 0; + } + + // + mBalancePerTrade = value; + } + + /** + * Get Risk Percent Per Balance in Each Trade ... + * + * @return ( double ) + */ + double RiskPercentPerBalance() + { + return mRiskPercentPerBalance; + } + + /** + * Set Risk Percent Per Balance in Each Trade ... + * + * @param value: Double + */ + void RiskPercentPerBalance(double value) + { + // + if (value < 0) + { + value = 0; + } + + // + mRiskPercentPerBalance = value; + ReConfigure(); + } + + /** + * Get Dynamic Risk Management State ... + * + * @return ( bool ) + */ + bool DynamicRiskManagement() + { + return mDynamicRiskManagement; + } + + /** + * Set Dynamic Risk Management State ... + * + * @param value: Boolean ... + */ + void DynamicRiskManagement(bool value) + { + // + mDynamicRiskManagement = value; + ReConfigure(); + } + + /** + * Get Use Dynamic Volume State ... + * + * @return ( bool ) + */ + bool UseDynamicVolume() + { + return mUseDynamicVolume; + } + + /** + * Set Use Dynamic Volume State ... + * + * @param value: Boolean ... + */ + void UseDynamicVolume(bool value) + { + // + mUseDynamicVolume = value; + ReConfigure(); + } + + /** + * Get Increase Volume Step ... + * + * @return ( double ) + */ + double DynamicVolumeStep() + { + return mDynamicVolumeStep; + } + + /** + * Set Increase Volume Step ... + * + * @param value: Double ... + */ + void DynamicVolumeStep(double value) + { + // + if (value < 0.01) + { + value = 0.01; + } + + // + mDynamicVolumeStep = value; + ReConfigure(); + } + + /** + * Get Balance Factor for Generate Dynamic Volume ... + * + * @return ( double ) + */ + double DynamicVolumeBalanceFactor() + { + return mDynamicVolumeBalanceFactor; + } + + /** + * Set Balance Factor for Generate Dynamic Volume ... + * + * @param value: Double ... + */ + void DynamicVolumeBalanceFactor(double value) + { + // + if (value < 0) + { + value = 0; + } + + // + mDynamicVolumeBalanceFactor = value; + ReConfigure(); + } + + /** + * Get Max Allowed Drawdown Percent for Open Trades ... + * 0 => Ignore ... + * min => 0 ... + * max => 100 ... + * + * @return ( double ) + */ + double MaxAllowedDrawdownToOpenTrades() + { + return mMaxAllowedDrawdownToOpenTrades; + } + + /** + * Set Max Allowed Drawdown Percent for Open Trades ... + * + * @param value: Double ... + * 0 => Ignore ... + * min => 0 ... + * max => 100 ... + */ + void MaxAllowedDrawdownToOpenTrades(double value) + { + // + if (value < 0) + { + value = 0; + } + + // + if (value > 50) + { + value = 50; + } + + // + mMaxAllowedDrawdownToOpenTrades = value; + ReConfigure(); + } + + /** + * Get Max Allowed SL for Pause Signalling Per Symbol ... + * 0 => Unlimited ... + * + * @return ( int ) + */ + int MaxAllowedSLToPauseSignallingPerSymbol() + { + return mMaxAllowedSLToPauseSignallingPerSymbol; + } + + /** + * Set Max Allowed SL for Pause Signalling Per Symbol ... + * + * @param value: Integer ... + * 0 => Unlimited ... + */ + void MaxAllowedSLToPauseSignallingPerSymbol(int value) + { + // + if (value < 0) + { + value = 0; + } + + // + mMaxAllowedSLToPauseSignallingPerSymbol = value; + ReConfigure(); + } + + /** + * Get Pause Signalling Per Symbol afte Max Allowed SL Reached In Seconds ... + * 0 => Ignore ... + * + * @return ( int ) + */ + int PauseSignallingAfterReachesMaxAllowedSLInSecconds() + { + return mPauseSignallingAfterReachesMaxAllowedSLInSecconds; + } + + /** + * Set Pause Signalling Per Symbol afte Max Allowed SL Reached In Seconds ... + * + * @param value: Integer ... + * 0 => Ignore ... + */ + void PauseSignallingAfterReachesMaxAllowedSLInSecconds(int value) + { + // + if (value < 0) + { + value = 0; + } + + // + mPauseSignallingAfterReachesMaxAllowedSLInSecconds = value; + ReConfigure(); + } + + // + // Protection Props ... + + /** + * Get Allow Hedge Positions State ... + * + * @return ( bool ) + */ + bool AllowHedging() + { + return mAllowHedging; + } + + /** + * Set Allow Hedge Positions State ... + * + * @param value: Boolean ... + */ + void AllowHedging(bool value) + { + // + mAllowHedging = value; + ReConfigure(); + } + + /** + * Get Minimum Open Positions for Hedging ... + * 0 => Ignore ... + * + * @return ( int ) + */ + int MinOpenTradesFroHedging() + { + return mMinOpenTradesFroHedging; + } + + /** + * Set Minimum Open Positions for Hedging ... + * + * @param value: Integer ... + * 0 => Ignore ... + */ + void MinOpenTradesFroHedging(int value) + { + // + if (value < 0) + { + value = 0; + } + + // + mMinOpenTradesFroHedging = value; + ReConfigure(); + } + + /** + * Get Minimum Volume Step for Hedging ... + * 0 => Ignore ... + * + * @return ( double ) + */ + double HedgingMinVolumeStep() + { + return mHedgingMinVolumeStep; + } + + /** + * Set Minimum Volume Step for Hedging ... + * + * @param value: Double ... + * 0 => Ignore ... + */ + void HedgingMinVolumeStep(double value) + { + // + if (value < 0) + { + value = 0; + } + + // + if (value > 0 && value < 0.01) + { + value = 0.01; + } + + // + if (value > 0 && value > 0.1) + { + value = 0.1; + } + + // + mHedgingMinVolumeStep = value; + ReConfigure(); + } + + /** + * Get Minimum Required Profit Per Volume Step for Hedging ... + * 0 => Ignore ... + * + * @return ( double ) + */ + double HedgeingMinRequiredProfitPerVolumeStep() + { + return mHedgeingMinRequiredProfitPerVolumeStep; + } + + /** + * Set Minimum Required Profit Per Volume Step for Hedging ... + * + * @param value: Double ... + * 0 => Ignore ... + */ + void HedgeingMinRequiredProfitPerVolumeStep(double value) + { + // + if (value < 0) + { + value = 0; + } + + // + mHedgeingMinRequiredProfitPerVolumeStep = value; + ReConfigure(); + } + + // + // Actions ... + + /** + * Handle OnSignalRecieved Event ... + * + * @param signal: XSignal instance ... + * @param conditions: X121SMCStrategyConditions instance ... + */ + void HandleOnSignalRecieved( + XSignal &signal, + X121SMCStrategyConditions &conditions // + ) + { + // + // Check Signal and Conditions Validations ... + + // + if (!signal.IsValid()) + { + return; + } + + // + if (!conditions.IsValid()) + { + return; + } + + // + bool isLong = IsLong(signal.type); + + // + // Notify When a Raw (Unfiltered) Signal Recieved + // if it's Provided ... + bool mAlertRawSignals = false; + if (mAlertRawSignals) + { + // + string msg = "Raw " + (IsLong(signal.type) ? "Long" : "Short") + + " Signal Recieved: (" + signal.provider + "," + + signal.symbol + "," + + ToString(signal.period) + + ") ..."; + + // + Alert(msg); + } + + // + // Apply Volume On Signal ... + ApplyVolumeOnSignal(signal); + + // + // Chekc Signalling Enable or not ... + bool canContinue = + isLong + ? AllowLong() + : AllowShort(); + if (!canContinue) + { + return; + } + + // + // TODO: Apply Filtering On Signal ... + bool isFiltered = false; + if (isFiltered) + { + // + mTradeHandler.Remove(signal); + return; + } + + // + // Attach Conditions Summary to Signal ... + string conditionsSummary = conditions.GenerateSummary( + false, + false, + true, + false // + ); + + // + // TODO: Retrieve Conditions Summary based on Filter ... + signal.conditions = conditionsSummary; + + // + datetime currentTime = TimeCurrent(); + + // + // Chack Allow Trades ... + bool allowTrade = AllowTrade(); + if (allowTrade) + { + // + string startTime = StartTradeAt(); + string endTime = StopTradeAt(); + bool isTimePassed = IsTimeInRange( + TimeCurrent(), + startTime, + endTime // + ); + + // + if (isTimePassed) + { + // + // Execute Signal Using Trade Handler ... + ENUM_X_SIGNAL_EXECUTION_RESULT state; + bool isExecuted = mTradeHandler.ExecuteSignal( + signal, + conditions, + state, + false // ignore Policies ... + ); + } + } + else + { + // + // Only Alert Signals ... + string msg = (IsLong(signal.type) + ? "Long" + : "Short") + + " Signal Recieved: (" + + signal.provider + "," + + signal.symbol + "," + + ToString(signal.period) + + ") ..."; + + // + Alert(msg); + } + + // + signal.Clean(); + conditions.Clean(); + } + + // + // Override Actions ... + + /** + * Apply Default Configurations ... + */ + void DefaultConfigure() override + { + // + // Commons ... + Slippage(10); + TagPrefix(""); + MagicNumber(1694056); + + // + // Symbol ... + SetSymbol(_Symbol); + SetPeriod(_Period); + MultiSymbol(false); + Symbols("EURUSDb,GBPUSDb,USDJPYb,USDCHFb,DowJones30,XAUUSDb"); + + // + // Signalling ... + Disabled(false); + AllowLong(true); + AllowShort(true); + + // + string tag = GetTag(); + + // + // Alert ... + SetAlertPrefix(tag); + SetAlertLogAlerts(true); + SetAlertPushAlerts(true); + SetAlertMailAlerts(false); + SetAlertEnableAlerts(true); + SetAlertTerminalAlerts(false); + + // + // Reports ... + ReportNewDays(true); + ReportNewWeeks(false); + ReportNewHours(false); + ReportNewMonths(false); + + // + R2R(1); + + // + // Volume Default Configurations ... + Volume(0.01); + UseDynamicVolume(false); + DynamicVolumeStep(0.01); + DynamicVolumeBalanceFactor(200); + + // + RiskPercentPerBalance(0); + DynamicRiskManagement(false); + } + + /** + * Vaslidate Inputs ... + * + * @return ( bool ) + */ + bool ValidateInputs() override + { + // + bool result = false; + + // + string errMessage = ""; + + // + bool isCommonValid = ( + // + Slippage() > 0 && + MagicNumber() > 0 + // + ); + if (!isCommonValid) + { + // + errMessage += "common configurations error;" + "\n"; + } + + // + // Checking Volume ... + bool isVolumeValid = true; + if (UseDynamicVolume()) + { + // + isVolumeValid = + DynamicVolumeStep() > 0 && + DynamicVolumeBalanceFactor() > 0; + if (!isVolumeValid) + { + errMessage += "Dynamic Volume configurations error;" + "\n"; + } + } + isVolumeValid = isVolumeValid && + Volume() > 0; + if (!isVolumeValid) + { + errMessage += "Static Volume configurations error;" + "\n"; + } + + // + result = + // + // Common ... + isCommonValid && + // + // Volume Coniguration ... + isVolumeValid && + // + // Otere ... + true + // + ; + + // + if (!result) + { + // + // Since here Logger not Initiallized, we Use Raw Print Command ... + errMessage = " Errors: \n" + errMessage; + Alert(errMessage); + } + + // + return result; + } + + // + // Initializers and DeInitializers ... + + /** + * Initial EA Requirements ... + * + * @return ( bool ) + */ + bool InitEA() override + { + // + bool result = true; + + // + // Initialize Indicator Helpers ... + + // + X121XCCInputs xccInputs; + xccInputs.Default(); + xccHelper = new XCX121XCCHelper(); + result = xccHelper.Init( + _Symbol, + _Period, + xccInputs // + ); + if (!result) + { + return result; + } + + // + X121XCTInputs xctInputs; + xctInputs.Default(); + xctHelper = new XCX121XCTHelper(); + result = xctHelper.Init( + _Symbol, + _Period, + xctInputs // + ); + if (!result) + { + return result; + } + + // + // Configure Alerts ... + SetAlertPrefix(GetTag()); + SetAlertEnableAlerts(GetAlertEnableAlerts()); + SetAlertLogAlerts(GetAlertLogAlerts()); + SetAlertMailAlerts(GetAlertMailAlerts()); + SetAlertPushAlerts(GetAlertPushAlerts()); + SetAlertTerminalAlerts(GetAlertTerminalAlerts()); + + // + // Create Trader Instance and Configure it ... + mTrader = new XCTrade( + Slippage(), + MagicNumber() // + ); + mTrader.AddOnStopLossEventHandler(OnPositionSLEventListener); + mTrader.AddOnTakeProfitEventHandler(OnPositionTPEventListener); + mTrader.AddOnDealsChangedEventHandler(OnDealsChangedEventListener); + mTrader.AddOnOrdersChangedEventHandler(OnOrdersChangedEventListener); + mTrader.AddOnModifyPositionEventHandler(OnPositionModifiedEventListener); + mTrader.AddOnPositionsChangedEventHandler(OnPositionsChangedEventListener); + mTrader.AddOnForceClosePositionEventHandler(OnPositionForceCloseEventListener); + mTrader.AddOnPartialClosePositionEventHandler(OnPositionPartialCloseEventListener); + + // + // Initialize Trade Handler ... + mTradeHandler = new XC121SMCTradeHandler(mTrader); + mTradeHandler.SaveTrades(false); + mTradeHandler.SaveSignals(false); + mTradeHandler.SaveConditions(false); + + // + ReConfigureTradeHandler(); + + // + // Parsers ... + XSymbolParser _symbolParser; + + // + // Single Symbol ... + if (!MultiSymbol()) + { + // + // Register Strategy ... + + // + // Create Class Instance ... + XCX121SMCBaseStrategy *iX121SMCStrategy; + iX121SMCStrategy = new XCX121SMCStrategy( + _Symbol, + _Period // + ); + + // + iX121SMCStrategy.AddXSignalEventHandler(OnSignalEventListener); + + // + ConfigureStrategy(iX121SMCStrategy); + RegisterStrategy(iX121SMCStrategy); + } + // + // Multi Symbol ... + else + { + // + // Parse Symbols ... + string symbols[]; + int symbolsCount = SplitContent( + symbols, + Symbols() // + ); + result = IsValidSize(symbolsCount); + if (!result) + { + return result; + } + + // + for (int i = 0; i < symbolsCount; i++) + { + // + // Select Symbol ... + string iSymbol = symbols[i]; + + // + // Register Strategy Based On Symbol ... + + // + // Parse Symbol ... + bool isEURUSD = _symbolParser.IsEURUSD(_Symbol); + bool isGBPUSD = _symbolParser.IsGBPUSD(_Symbol); + bool isEURGBP = _symbolParser.IsEURGBP(_Symbol); + bool isUSDCHF = _symbolParser.IsUSDCHF(_Symbol); + bool isEURCHF = _symbolParser.IsEURCHF(_Symbol); + bool isUSDJPY = _symbolParser.IsUSDJPY(_Symbol); + bool isEURJPY = _symbolParser.IsEURJPY(_Symbol); + bool isUSDCAD = _symbolParser.IsUSDCAD(_Symbol); + bool isEURCAD = _symbolParser.IsEURCAD(_Symbol); + bool isAUDUSD = _symbolParser.IsAUDUSD(_Symbol); + bool isEURAUD = _symbolParser.IsEURAUD(_Symbol); + bool isNZDUSD = _symbolParser.IsNZDUSD(_Symbol); + bool isEURNZD = _symbolParser.IsEURNZD(_Symbol); + + // + // Check Symbol Can Register or not ... + bool canRegisterStrategy = true; + + // + if (canRegisterStrategy) + { + // + // Create Class Instance ... + XCX121SMCBaseStrategy *iX121SMCStrategy; + iX121SMCStrategy = new XCX121SMCStrategy( + iSymbol, + _Period // + ); + + // + iX121SMCStrategy.AddXSignalEventHandler(OnSignalEventListener); + + // + // Register Strategy ... + ConfigureStrategy(iX121SMCStrategy); + RegisterStrategy(iX121SMCStrategy); + } + } + + // + Clean(symbols); + } + + // + return result; + } + + /** + * Destroy all Initialized EA Requirements ... + */ + void DestroyEA() override + { + // + ZeroMemory(xccHelper); + ZeroMemory(xctHelper); + ZeroMemory(mTradeHandler); + + // + delete xccHelper; + delete xctHelper; + delete mTradeHandler; + + // + Clean(mStrategies); + } + + /** + * Call all Registered Strategies On Tick ... + */ + void HandleStrategiesOnTick() override + { + // + // Check Force Close ... + string forceCloseTimeStr = CloseAllTradesAt(); + if (IsValid(forceCloseTimeStr)) + { + // + datetime forceCloseTime = ParseDateTimeFromTimeString(forceCloseTimeStr); + bool canForceClose = IsTimeInRange( + TimeCurrent(), + forceCloseTime // + ) && + !mIsForceCloseAtTime; + if (canForceClose) + { + mIsForceCloseAtTime = mTradeHandler.ForceClose(); + } + } + + // + // Update Positions Data ... + mTradeHandler.UpdateData(); + + // + // Protect Positions ... + mTradeHandler.HandleProtection(); + + // + int count = ArraySize(mStrategies); + if (!IsValidSize(count)) + { + return; + } + + // + for (int i = 0; i < count; i++) + { + // + // Call Tick Handler Function ... + mStrategies[i].HandleTick(); + } + } + + /** + * Handle Strategies Guards ... + */ + void HandleStrategiesGuard() override + { + // + int count = ArraySize(mStrategies); + if (!IsValidSize(count)) + { + return; + } + + // + XPosition positions[]; + int positionsCount = mTrader.GetPositions( + positions, // Result ... + NULL, // Symbol ... + NULL, // Provider ... + NULL, // Period ... + X_POSITION_TYPE_ALL // All Types ... + ); + if (!IsValidSize(positionsCount)) + { + return; + } + + // + for (int i = 0; i < count; i++) + { + // + // Call Tick Handler Function ... + X121SMCGuard iGuards[]; + bool hasGuards = mStrategies[i].HandleGuard( + iGuards, + positions // + ); + if (hasGuards) + { + HandleGuards(iGuards); + } + } + + // + Clean(positions); + } + + // + // Event Handlers ... + + /** + * Calls When a Deals Changed Triggered ... + * + * @param count: Integer, Number of Changes ... + */ + void HandleOnDealsChanged(int count) override + { + } + + /** + * Calls When a Order Changed Triggered ... + * + * @param count: Integer, Number of Changes ... + */ + void HandleOnOrdersChanged(int count) override + { + } + + /** + * Calls When a Positions Changed Triggered ... + * + * @param count: Integer, Number of Changes ... + */ + void HandleOnPositionsChanged(int count) override + { + // + if (IsValidSize(count)) + { + mTradeHandler.HandleNewPosition(); + } + } + + /** + * Calls When a Position's SL Triggered ... + * + * @param deal: XDeal instance ... + */ + void HandleOnStopLossTriggered(const XDeal &deal) override + { + // + // Finish ... + mTradeHandler.Finish(deal); + + // + HandleReportBalance(); + } + + /** + * Calls When a Position's TP Triggered ... + * + * @param deal: XDeal instance ... + */ + void HandleOnTakeProfitTriggered(const XDeal &deal) override + { + // + // Finish ... + mTradeHandler.Finish(deal); + + // + bool useDynamicRiskManagement = DynamicRiskManagement(); + if (useDynamicRiskManagement) + { + mTradeHandler.ResetSymbolInfo(deal.symbol); + } + + // + HandleReportBalance(); + } + + /** + * Handle Force Close a Position ... + * + * @param ticket: Position Ticket ... + * @param position: XPosition ... + * @param comment: Closing Comment ... + */ + void HandleOnPositionForceClosed( + const ulong ticket, + const XPosition &position, + const string comment // + ) override + { + // + // Finish ... + mTradeHandler.Finish( + ticket, + position, + comment // + ); + + // + HandleReportBalance(); + } + + /** + * Reset All Paused Symbols on Each New Days ... + */ + void HandleOnNewDay() override + { + // + mIsForceCloseAtTime = false; + mTradeHandler.ResumePausedSymbols(); + } + + /** + * Re Configure Materials on Properties Changed ... + */ + void ReConfigure() override + { + // + ReConfigureTradeHandler(); + ReConfigureAllStrategies(); + } + + /** + * Generate Identifier Tag ... + * + * @return ( string ) + */ + string GetTag() override + { + // + string result = NULL; + + // + string tagPrefix = TagPrefix(); + if (IsValid(tagPrefix)) + { + result = tagPrefix; + } + else + { + result = ""; + } + + // + result = + XC121SMCExpertToken + result; + + // + return result; + } + + // + protected: + // + + // + // Props ... + + // + XC121SMCTradeHandler *mTradeHandler; // Trade Handler ... + XCX121SMCBaseStrategy *mStrategies[]; // Registere Strategies in EA ... + + // + // Actions ... + + /** + * Apply Volume Based On Configurations on Signal ... + * + * @param signal: XSignal instance + */ + void ApplyVolumeOnSignal(XSignal &signal) + { + // + if (signal.ignoreEAVolume) + { + return; + } + + // + double staticVolume = Volume(); + double fVolume = staticVolume > 0 + ? staticVolume + : 0.01; + + // + double staticBalance = StaticBalance(); + double accountBalance = mTrader.mAccount.GetBalance(); + double balance = staticBalance > 0 + ? staticBalance + : accountBalance; + + // + bool useDynamicVolume = UseDynamicVolume(); + double balancePerTrade = BalancePerTrade(); + double dynamicVolumeStep = DynamicVolumeStep(); + double riskPercentPerBalance = RiskPercentPerBalance(); + bool allowDynamicRiskManagement = DynamicRiskManagement(); + double dynamicVolumeBalanceFactor = DynamicVolumeBalanceFactor(); + + // + // Apply Static Volume ... + bool allowStaticVolume = staticVolume > 0; + + // + // Apply Dynamic Volume ... + bool aloowApplyDynamicVolume = useDynamicVolume && + dynamicVolumeStep && + dynamicVolumeBalanceFactor; + + // + // Apply Risk Per Trade Volume ... + bool allowApplyRiskPerTradeVolume = + !aloowApplyDynamicVolume && + riskPercentPerBalance > 0; + + // + // Apply Balance Per Trade Volume ... + bool allowApplyBalacePerTradeVolume = + !aloowApplyDynamicVolume && + !allowApplyRiskPerTradeVolume && + balancePerTrade > 0; + + // + // First Check Dynamic Volume ... + if (aloowApplyDynamicVolume) + { + // + // Dynamic Volume ... + double dVolume = mTrader.GetDynamicVolume( + signal.symbol, + dynamicVolumeBalanceFactor, + dynamicVolumeStep // + ); + if (dVolume < fVolume) + { + dVolume = fVolume; + } + + // + signal.volume = dVolume; + } + else if (allowApplyRiskPerTradeVolume) + { + // + double riskAmountPerBalance = (riskPercentPerBalance * balance) / 100; + + // + double risk = signal.GetRisk(); + double points = GetPoints(signal.symbol); + double riskInPoints = risk / points; + + // + double volume = mTrader.mAccount.CalculateVolume( + signal.symbol, + riskAmountPerBalance, + riskInPoints // + ); + if (volume <= 0) + { + volume = fVolume; + } + + // + // Check Dynamic Risk Management ... + bool allowDynamicRiskManagement = DynamicRiskManagement(); + if (allowDynamicRiskManagement) + { + // + // Calculate Dynamic Additional Risk Management Volume Multiplier ... + double mAdditionalRiskMultiplier = CalculateAdditionalVolumeMultiplier(signal); + if (mAdditionalRiskMultiplier < 1) + { + mAdditionalRiskMultiplier = 1; + } + + // + volume *= mAdditionalRiskMultiplier; + } + + // + signal.volume = volume; + } + else if (allowApplyBalacePerTradeVolume) + { + // + double risk = signal.GetRisk(); + double points = GetPoints(signal.symbol); + double riskInPoints = risk / points; + + // + double volume = mTrader.mAccount.CalculateVolume( + signal.symbol, + balancePerTrade, + riskInPoints // + ); + if (volume <= 0) + { + volume = fVolume; + } + + // + signal.volume = volume; + } + else if (allowStaticVolume) + { + signal.volume = staticVolume; + } + else + { + signal.volume = fVolume; + } + + // + // Normalize Signal Volume ... + signal.volume = NormalizeVolume( + signal.volume, + signal.symbol // + ); + } + + /** + * Configure Startegy ... + */ + void ConfigureStrategy(XCX121SMCBaseStrategy *&strategy) + { + // + if (strategy == NULL) + { + return; + } + + // + // Configure Alerts ... + strategy.SetAlertPrefix(GetTag()); + strategy.SetAlertLogAlerts(GetAlertLogAlerts()); + strategy.SetAlertMailAlerts(GetAlertMailAlerts()); + strategy.SetAlertPushAlerts(GetAlertPushAlerts()); + strategy.SetAlertEnableAlerts(GetAlertEnableAlerts()); + strategy.SetAlertTerminalAlerts(GetAlertTerminalAlerts()); + + // + // Confiugre Signalling ... + + // + strategy.R2R(R2R()); + strategy.AllowLong(AllowLong()); + strategy.AllowShort(AllowShort()); + strategy.MaxAllowedSpread(20); + // strategy.MaxAllowedSaveTicks(150); + // strategy.MinRequiredTicksForSpreadPass(100); + + // + if (Disabled()) + { + strategy.Disable(); + } + else + { + strategy.Enable(); + } + + // + } + + /** + * Register an Strategy in EA ... + * + * @param strategy: XCX121SMCBaseStrategy instance ... + */ + void RegisterStrategy(XCX121SMCBaseStrategy *strategy) + { + // + if (strategy == NULL) + { + return; + } + + // + ArrayResize( + mStrategies, + ArraySize(mStrategies) + 1 // + ); + + // + mStrategies[ArraySize(mStrategies) - 1] = strategy; + } + + /** + * Re Configure All Registered Strategies ... + */ + void ReConfigureAllStrategies() + { + // + int count = ArraySize(mStrategies); + if (!IsValidSize(count)) + { + return; + } + + // + for (int i = 0; i < count; i++) + { + // + ConfigureStrategy(mStrategies[i]); + } + } + + /** + * Re Configure Trade Handler ... + */ + void ReConfigureTradeHandler() + { + // + if (mTradeHandler == NULL) + { + return; + } + + // + // Configure Alerts ... + mTradeHandler.SetAlertPrefix(GetTag()); + mTradeHandler.SetAlertEnableAlerts(GetAlertEnableAlerts()); + mTradeHandler.SetAlertLogAlerts(GetAlertLogAlerts()); + mTradeHandler.SetAlertMailAlerts(GetAlertMailAlerts()); + mTradeHandler.SetAlertPushAlerts(GetAlertPushAlerts()); + mTradeHandler.SetAlertTerminalAlerts(GetAlertTerminalAlerts()); + + // + mTradeHandler.AllowLong(AllowLong()); + mTradeHandler.AllowShort(AllowShort()); + mTradeHandler.MaxAllowedLongs(MaxAllowedLongs()); + mTradeHandler.MaxAllowedShorts(MaxAllowedShorts()); + mTradeHandler.UseMaxAllowedSignalsPerSymbol(UseMaxAllowedSignalsPerSymbol()); + mTradeHandler.LastPositionProfitForAcceptNextInPoint(LastPositionProfitForAcceptNextInPoint()); + mTradeHandler.DelaysBetweenTwoSignalsInBar(DelaysBetweenTwoSignalsInBar()); + mTradeHandler.MaxAllowedSpread(MaxAllowedSpread()); + mTradeHandler.MaxAllowedDrawdownToOpenTrades(MaxAllowedDrawdownToOpenTrades()); + mTradeHandler.MaxAllowedSLToPauseSignallingPerSymbol(MaxAllowedSLToPauseSignallingPerSymbol()); + mTradeHandler.PauseSignallingAfterReachesMaxAllowedSLInSecconds(PauseSignallingAfterReachesMaxAllowedSLInSecconds()); + mTradeHandler.AllowHedging(AllowHedging()); + mTradeHandler.MinOpenTradesFroHedging(MinOpenTradesFroHedging()); + mTradeHandler.HedgingMinVolumeStep(HedgingMinVolumeStep()); + mTradeHandler.HedgeingMinRequiredProfitPerVolumeStep(HedgeingMinRequiredProfitPerVolumeStep()); + } + + // + private: + // + + // + // Props ... + + // + // Signalling Props ... + bool mAllowLong; // Allow Long Signals ... + bool mAllowShort; // Allow Short Signals ... + int mMaxAllowedLongs; // Max Allowed Long Signals ... + int mMaxAllowedShorts; // Max Allowed Short Signals ... + bool mUseMaxAllowedSignalsPerSymbol; // Use Max Allowed Signal Types Per Symbol ... + double mLastPositionProfitForAcceptNextInPoint; // Last Position Profit In Points for Accept new Signal ... + int mDelaysBetweenTwoSignalsInBar; // Delay between two Signals in Bars ... + double mMaxAllowedSpread; // Max Allowed Spread for Signalling ... + int mMinRequiredVerificationForSpreadPass; // Minimum Spread Verification for Signalling ... + + // + // Trade ... + bool mAllowTrade; // Allow Open Trade On Signals ... + string mStartTradeAt; // Enable Trade on Signals on Time ... + string mStopTradeAt; // Enable Trade on Signals on Time ... + string mCloseAllTradesAt; // Enable Close All Trades on Signals on Time ... + + // + bool mIsForceCloseAtTime; + + // + // Risk Management Props ... + double mR2R; // Signallers Risk to Reward Ratio ... + double mVolume; // Static Volume ... + double mStaticBalance; // Static Balance for Calculate Trade Volume ... + double mBalancePerTrade; // Balance Used in Each Trade ... + double mRiskPercentPerBalance; // Risk Percent Per Balance in Each Trade ... + bool mDynamicRiskManagement; // Dynamic Risk Management ... + bool mUseDynamicVolume; // Use Dynamic Volume ... + double mDynamicVolumeStep; // Increase Volume Step ... + double mDynamicVolumeBalanceFactor; // Balance Factor for Generate Dynamic Volume ... + double mMaxAllowedDrawdownToOpenTrades; // Max Allowed Drawdown for Open Trades ... + int mMaxAllowedSLToPauseSignallingPerSymbol; // Max Allowed SL for Pause Signalling Per Symbol ... + int mPauseSignallingAfterReachesMaxAllowedSLInSecconds; // Pause Signalling Per Symbol afte Max Allowed SL Reached In Seconds ... + + // + // Protection Props ... + bool mAllowHedging; // Allow Hedge Positions ... + int mMinOpenTradesFroHedging; // Minimum Open Positions for Hedging ... + double mHedgingMinVolumeStep; // Minimum Volume Step for Hedging ... + double mHedgeingMinRequiredProfitPerVolumeStep; // Minimum Required Profit Per Volume Step for Hedging ... + + // + double CalculateAdditionalVolumeMultiplier(XSignal &signal) + { + // + double result = 0; + + // + if (!signal.IsValid()) + { + return result; + } + + // + X121SMCSymbolPositionInfo info; + bool hasInfo = mTradeHandler.GetSymbolInfo( + signal.symbol, + info // + ); + if (!hasInfo) + { + return result; + } + + // + if (info.countedSLs >= 2) + { + result = (info.countedSLs / 2) + 1; + } + + // + return result; + } + + /** + * Handle Guard Actions ... + * + * @param guards: X121SMCGuard instance Collection ... + */ + void HandleGuards(X121SMCGuard &guards[]) + { + // + int count = ArraySize(guards); + if (!IsValidSize(guards)) + { + return; + } + + // + for (int i = 0; i < count; i++) + { + // + X121SMCGuard iGuard = guards[i]; + + // + if (!iGuard.IsValid()) + { + continue; + } + + // + // Here we Have to Handle Guard Actions ... + + // + // Close ... + bool canClose = + NotEmpty(iGuard.ticket) && + iGuard.action == X_121_SMC_GUARD_ACTION_CLOSE; + + // + // Close All ... + bool canCloseAll = iGuard.action == X_121_SMC_GUARD_ACTION_CLOSE_ALL; + + // + // Close Longs ... + bool canCloseLongs = iGuard.action == X_121_SMC_GUARD_ACTION_CLOSE_LONGS; + + // + // Close Shorts ... + bool canCloseShorts = iGuard.action == X_121_SMC_GUARD_ACTION_CLOSE_SHORTS; + + // + // Partial Close ... + bool canPartialClose = + NotEmpty(iGuard.ticket) && + iGuard.volumeMultiplier > 0 && + iGuard.action == X_121_SMC_GUARD_ACTION_PARTIAL_CLOSE; + + // + // Trail Stop ... + bool canTrailStop = + iGuard.sl > 0 && + NotEmpty(iGuard.ticket) && + iGuard.action == X_121_SMC_GUARD_ACTION_TRAIL_STOP; + + // + // Trail Target ... + bool canTrailTarget = + iGuard.tp > 0 && + NotEmpty(iGuard.ticket) && + iGuard.action == X_121_SMC_GUARD_ACTION_TRAIL_TARGET; + + // + // Hedge ... + bool canHedge = iGuard.action == X_121_SMC_GUARD_ACTION_HEDGE; + + // + // Check is Guard Valid ... + bool isValidGuardAction = + canHedge || + canClose || + canCloseAll || + canTrailStop || + canCloseLongs || + canTrailTarget || + canCloseShorts || + canPartialClose; + if (!isValidGuardAction) + { + continue; + } + + // + // Now we Sure to Have a Valid Guard ... + // Start to o Guard Actions ... + + // + // Close All ... + if (canCloseAll) + { + // + XPosition positions[]; + int positionsCount = + mTrader + .GetPositions( + positions, // Result ... + iGuard.symbol, + iGuard.provider, + NULL, // Period ... + X_POSITION_TYPE_ALL, // All Types ... + true // Filter by Magic ... + ); + if (IsValidSize(positionsCount)) + { + // + string comment = "Guard Close All ..."; + string message = "Guard Close All (" + ToString(positionsCount) + ") Positions Successfully ..."; + int forceClosed = mTradeHandler.ForceClose( + positions, + comment, + message // + ); + + // + if (forceClosed) + { + RestEA(120 * 60); + } + } + } + + // + // Close Longs ... + if (canCloseLongs) + { + // + XPosition longPositions[]; + XPosition shortPositions[]; + mTrader + .GetPositions( + longPositions, // Result ... + shortPositions, // Result ... + iGuard.symbol, + iGuard.provider, + NULL, // Period ... + true // Filter by Magic ... + ); + + // + int longPositionsCount = ArraySize(longPositions); + bool hasLongPositions = IsValidSize(longPositionsCount); + + // + int shortPositionsCount = ArraySize(shortPositions); + bool hasShortPositions = IsValidSize(shortPositionsCount); + + // + if (hasLongPositions) + { + // + string comment = "Guard Close Longs ..."; + string message = "Guard Close (" + ToString(longPositionsCount) + ") Long Positions Successfully ..."; + bool isClosed = mTradeHandler.ForceClose( + longPositions, + comment, + message // + ); + + // + if (isClosed) + { + RestEA(120 * 60); + } + } + } + + // + // Close Shorts ... + if (canCloseShorts) + { + // + XPosition longPositions[]; + XPosition shortPositions[]; + mTrader + .GetPositions( + longPositions, // Result ... + shortPositions, // Result ... + iGuard.symbol, + iGuard.provider, + NULL, // Period ... + true // Filter by Magic ... + ); + + // + int longPositionsCount = ArraySize(longPositions); + bool hasLongPositions = IsValidSize(longPositionsCount); + + // + int shortPositionsCount = ArraySize(shortPositions); + bool hasShortPositions = IsValidSize(shortPositionsCount); + + // + if (hasShortPositions) + { + // + string comment = "Guard Close Shorts ..."; + string message = "Guard Close (" + ToString(shortPositionsCount) + ") Short Positions Successfully ..."; + bool isClosed = mTradeHandler.ForceClose( + shortPositions, + comment, + message // + ); + + // + if (isClosed) + { + RestEA(120 * 60); + } + } + } + + // + // Close ... + if (canClose) + { + // + XPosition iPosition; + bool hasPosition = mTrader.GetPosition( + iGuard.ticket, + iPosition // + ); + + // + bool isLong = IsLong(iPosition.type); + + // + if (hasPosition) + { + // + XPosition positions[]; + AddRef( + iPosition, + positions // + ); + + // + string comment = "Guard Close ..."; + string message = "Guard Close " + (isLong ? "Long" : "Short") + " Position: (" + ToString(iGuard.ticket) + ") Successfully ..."; + bool isClosed = mTradeHandler.ForceClose( + positions, + comment, + message // + ); + + // + if (isClosed) + { + RestEA(120 * 60); + } + } + } + + // + // Partial Close ... + if (canPartialClose) + { + // + XPosition iPosition; + bool hasPosition = mTrader.GetPosition( + iGuard.ticket, + iPosition // + ); + + // + bool isLong = IsLong(iPosition.type); + + // + if (hasPosition) + { + // + // Normalize Volume Multiplier ... + double vMult = iGuard.volumeMultiplier; + if (vMult > 0.5) + { + vMult = 0.5; + } + if (vMult < 0) + { + vMult = 0.5; + } + + // + // Calculate and Normalize Volume ... + double volume = iPosition.volume * iGuard.volumeMultiplier; + volume = NormalizeVolume( + volume, + iPosition.symbol // + ); + + // + string comment = "Guard Partially Closed: " + ToString(volume) + " ..."; + string message = "Guard Partially Closed " + (isLong ? "Long" : "Short") + ": " + ToString(volume) + " Successfully ..."; + bool isModified = mTrader.ClosePartial( + iPosition.ticket, + volume, + comment // + ); + if (isModified) + { + // + mTradeHandler.Alert(message); + + // + if (volume == iPosition.volume) + { + // + mTradeHandler.Finish( + iPosition.ticket, + iPosition, + comment // + ); + + // + RestEA(120 * 60); + } + } + } + } + + // + // Hedge ... + if (canHedge) + { + // + XPosition positions[]; + int positionsCount = + mTrader + .GetPositions( + positions, // Result ... + iGuard.symbol, + iGuard.provider, + NULL, // Period ... + X_POSITION_TYPE_ALL, // All Types ... + true // Filter by Magic ... + ); + if (IsValidSize(positionsCount)) + { + // + int longs = 0; + double longProfits = 0; + double longVolumes = 0; + + // + int shorts = 0; + double shortProfits = 0; + double shortVolumes = 0; + CountPositions( + positions, + longs, + longProfits, + longVolumes, + shorts, + shortProfits, + shortVolumes // + ); + + // + int count = longs + shorts; + double profits = longProfits + shortProfits; + double volumes = longVolumes + shortVolumes; + + // + bool canDoHedge = + count > 0 && + profits > 0 && + volumes > 0; + if (canDoHedge) + { + // + string comment = "Guard Hedge ..."; + string message = "Guard Hedge (" + ToString(count) + ") Positions by: (" + ToString(profits) + ") Successfully ..."; + bool isClosed = mTradeHandler.ForceClose( + positions, + comment, + message // + ); + + // + if (isClosed) + { + RestEA(120 * 60); + } + } + } + } + + // + // Trail Stop ... + if (canTrailStop) + { + // + XPosition iPosition; + bool hasPosition = mTrader.GetPosition( + iGuard.ticket, + iPosition // + ); + + // + bool isLong = IsLong(iPosition.type); + + // + bool canDoTrail = + hasPosition && + iPosition.profit > 0 && + isLong + ? iPosition.price > iGuard.sl && + (iPosition.sl == 0 || + iPosition.sl < iGuard.sl) + : iPosition.price < iGuard.sl && + (iPosition.sl == 0 || + iPosition.sl > iGuard.sl); + if (canDoTrail) + { + // + string comment = "Guard Trail Stop ..."; + string message = "Guard Trail " + (isLong ? "Long" : "Short") + " Position: (" + ToString(iGuard.ticket) + ") Stop Successfully ..."; + bool isModified = mTrader.Modify( + iPosition.ticket, + iGuard.sl, + iPosition.tp, + comment // + ); + if (isModified) + { + mTradeHandler.Alert(message); + } + } + } + + // + // Trail Target ... + if (canTrailTarget) + { + // + XPosition iPosition; + bool hasPosition = mTrader.GetPosition( + iGuard.ticket, + iPosition // + ); + + // + bool isLong = IsLong(iPosition.type); + + // + bool canDoTrail = + hasPosition && + iGuard.tp != iPosition.tp && + isLong + ? iGuard.tp > iPosition.price + : iGuard.tp < iPosition.price; + if (canDoTrail) + { + // + string comment = "Guard Trail Target ..."; + string message = "Guard Trail " + (isLong ? "Long" : "Short") + " Position: (" + ToString(iGuard.ticket) + ") Target Successfully ..."; + bool isModified = mTrader.Modify( + iPosition.ticket, + iPosition.sl, + iGuard.tp, + comment // + ); + if (isModified) + { + mTradeHandler.Alert(message); + } + } + } + } + + // + Clean(guards); + Clean(guards); + } + + // + void RestEA(int seconds) + { + // + } + + // +}; + +// \ No newline at end of file diff --git a/BKPS/14031206/Documents/BKP/xsupdem/x-121.smc.xsupdemobs.signal.class.mq5 b/BKPS/14031206/Documents/BKP/xsupdem/x-121.smc.xsupdemobs.signal.class.mq5 new file mode 100644 index 0000000..1e58957 --- /dev/null +++ b/BKPS/14031206/Documents/BKP/xsupdem/x-121.smc.xsupdemobs.signal.class.mq5 @@ -0,0 +1,3699 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 X121 SMC Signal Class +// ------------------------------------------------- +// Name: XSupDemOBS +// Description: provide all Signalling 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 + +// +// Imports ... +#include "../Classes/x-121.smc.market.cycle.helper.class.mq5" +#include "../Libraries/x-121.smc.guard.lib.mq5" +#include "../Libraries/x-121.smc.lib.mq5" +#include "./x-121.smc.xsupdemobs.signal.lib.mq5" + +// +// Definition ... +class XCX121SMCXSupDemOBSSignalDetector : public XCBase +{ + // + public: + // + // Props ... + X121SMCStrategyXSupDemOBSSignalConditions mConditions; + X121SMCStrategyXSupDemOBSSignalConditions mConditionsCollection[]; + + // + // Constructor(s) ... + XCX121SMCXSupDemOBSSignalDetector() + { + Init(); + } + + // + // Deconstructor ... + ~XCX121SMCXSupDemOBSSignalDetector() + { + DeInit(); + } + + // + // + // + + // + // Detect Setup Conditions ... + bool DetectSignalSetup( + // + string _symbol, + ENUM_TIMEFRAMES _period, + // + XC121SMCCycleHelper *decisionCycleHelper, + XC121SMCCycleHelper *analyseCycleHelper, + XC121SMCCycleHelper *consolidationCycleHelper, + XC121SMCCycleHelper *visionCycleHelper + // + ) + { + // + bool result = false; + + // + // Validate Cycle Helpers ... + result = + // + visionCycleHelper != NULL && + analyseCycleHelper != NULL && + decisionCycleHelper != NULL && + consolidationCycleHelper != NULL + // + ; + if (!result) + { + return result; + } + + // + bool isBullish = false; + bool isBearish = false; + + // + int zIndex = 0; + int cIndex = zIndex + 1; + int pIndex = cIndex + 1; + int ppIndex = pIndex + 1; + + // + int loopback = 10; + + // + string symbol = _symbol; + ENUM_TIMEFRAMES period = _period; + + // + mConditions.symbol = symbol; + mConditions.period = period; + + // + double ask = GetAsk(symbol); + double bid = GetBid(symbol); + datetime cTime = TimeCurrent(); + double points = GetPoints(symbol); + + // + double target = 0; + + // + // Cycles Conditions ... + + // + // Decision ... + ENUM_XPOI_EVENTS decisionPoiEvents[]; + ENUM_X_CYCLE_EVENTS decisionCycleEvents[]; + X121SMCCycleConditions decisionConditions; + result = decisionCycleHelper.GetConditions( + decisionCycleEvents, + decisionPoiEvents, + decisionConditions, + zIndex, + loopback // + ); + if (!result) + { + return result; + } + + // + // Analyse ... + ENUM_XPOI_EVENTS analysePoiEvents[]; + ENUM_X_CYCLE_EVENTS analyseCycleEvents[]; + X121SMCCycleConditions analyseConditions; + result = analyseCycleHelper.GetConditions( + analyseCycleEvents, + analysePoiEvents, + analyseConditions, + zIndex, + loopback // + ); + if (!result) + { + return result; + } + + // + // Consolidation ... + ENUM_XPOI_EVENTS consolidationPoiEvents[]; + ENUM_X_CYCLE_EVENTS consolidationCycleEvents[]; + X121SMCCycleConditions consolidationConditions; + result = consolidationCycleHelper.GetConditions( + consolidationCycleEvents, + consolidationPoiEvents, + consolidationConditions, + zIndex, + loopback // + ); + if (!result) + { + return result; + } + + // + // Vision ... + ENUM_XPOI_EVENTS visionPoiEvents[]; + ENUM_X_CYCLE_EVENTS visionCycleEvents[]; + X121SMCCycleConditions visionConditions; + result = visionCycleHelper.GetConditions( + visionCycleEvents, + visionPoiEvents, + visionConditions, + zIndex, + loopback // + ); + if (!result) + { + return result; + } + + // + // Cycles POI States ... + XPOIState decisionState = decisionConditions.state; + XPOIState analyseState = analyseConditions.state; + XPOIState consolidationState = consolidationConditions.state; + XPOIState visionState = visionConditions.state; + + // + // Cycle X121Conditions ... + X121Conditions decisionXConditions = decisionConditions.x121Conditions; + X121Conditions analyseXConditions = analyseConditions.x121Conditions; + X121Conditions consolidationXConditions = consolidationConditions.x121Conditions; + X121Conditions visionXConditions = visionConditions.x121Conditions; + + // + // Setup Conditions ... + + // + XOHCL decisionZBar; + XOHCL decisionCBar; + XOHCL decisionPBar; + double decisionCBarBullishZoneChechValue = 0; + double decisionCBarBearishZoneChechValue = 0; + + // + result = decisionZBar.Init( + decisionState.symbol, + decisionState.period, + 0 // + ); + if (!result) + { + // + Clean(visionPoiEvents); + Clean(analysePoiEvents); + Clean(decisionPoiEvents); + Clean(visionCycleEvents); + Clean(analyseCycleEvents); + Clean(decisionCycleEvents); + Clean(consolidationPoiEvents); + Clean(consolidationCycleEvents); + + // + visionState.Clean(); + analyseState.Clean(); + decisionZBar.Clean(); + decisionCBar.Clean(); + decisionPBar.Clean(); + decisionState.Clean(); + visionConditions.Clean(); + analyseConditions.Clean(); + visionXConditions.Clean(); + consolidationState.Clean(); + decisionConditions.Clean(); + analyseXConditions.Clean(); + decisionXConditions.Clean(); + consolidationConditions.Clean(); + consolidationXConditions.Clean(); + + // + return result; + } + + // + result = decisionZBar + .GetPreviousBar(decisionCBar); + if (!result) + { + // + Clean(visionPoiEvents); + Clean(analysePoiEvents); + Clean(decisionPoiEvents); + Clean(visionCycleEvents); + Clean(analyseCycleEvents); + Clean(decisionCycleEvents); + Clean(consolidationPoiEvents); + Clean(consolidationCycleEvents); + + // + visionState.Clean(); + analyseState.Clean(); + decisionZBar.Clean(); + decisionCBar.Clean(); + decisionPBar.Clean(); + decisionState.Clean(); + visionConditions.Clean(); + analyseConditions.Clean(); + visionXConditions.Clean(); + consolidationState.Clean(); + decisionConditions.Clean(); + analyseXConditions.Clean(); + decisionXConditions.Clean(); + consolidationConditions.Clean(); + consolidationXConditions.Clean(); + + // + return result; + } + + // + result = decisionCBar + .GetPreviousBar(decisionPBar); + if (!result) + { + // + Clean(visionPoiEvents); + Clean(analysePoiEvents); + Clean(decisionPoiEvents); + Clean(visionCycleEvents); + Clean(analyseCycleEvents); + Clean(decisionCycleEvents); + Clean(consolidationPoiEvents); + Clean(consolidationCycleEvents); + + // + visionState.Clean(); + analyseState.Clean(); + decisionZBar.Clean(); + decisionCBar.Clean(); + decisionPBar.Clean(); + decisionState.Clean(); + visionConditions.Clean(); + analyseConditions.Clean(); + visionXConditions.Clean(); + consolidationState.Clean(); + decisionConditions.Clean(); + analyseXConditions.Clean(); + decisionXConditions.Clean(); + consolidationConditions.Clean(); + consolidationXConditions.Clean(); + + // + return result; + } + + // + decisionCBarBullishZoneChechValue = decisionCBar + .GetZoneCheckValue(X_DIRECTION_BULLISH); + decisionCBarBearishZoneChechValue = decisionCBar + .GetZoneCheckValue(X_DIRECTION_BEARISH); + + // + mConditions.UpdateTo(); + + // + // 1- Detect Valid Working Area ... + + // + bool hasVisionHighestSupplyZone = mConditions.HasVisionHighestSupplyZone(); + bool hasConsolidationHighestSupplyZone = mConditions.HasConsolidationHighestSupplyZone(); + + // + bool hasVisionLowestDemandZone = mConditions.HasVisionLowestDemandZone(); + bool hasConsolidationLowestDemandZone = mConditions.HasConsolidationLowestDemandZone(); + + // + bool hasWorkingZone = mConditions.workingZone.IsValid(); + + // + bool isDestroyed = false; + ENUM_X_DIRECTION destroyedDir; + + // + XOHCL trendStartBar; + ENUM_X_DIRECTION trendDir; + bool hasTrend = false; + bool hasBullishTrend = false; + bool hasBearishTrend = false; + + // + if (!hasVisionHighestSupplyZone) + { + // + int hasZones = visionState.HasSupplyZones(); + int zonesCount = visionState.HasSupplyZones(); + + // + if (hasZones) + { + // + int idx = GetHighest(visionState.supplyZones); + hasVisionHighestSupplyZone = IsValidIndex(idx); + if (hasVisionHighestSupplyZone) + { + // + // Validate Zone ... + XCSupplyZone *zone = visionState.supplyZones[idx]; + bool isBelow = IsBelow( + decisionCBarBearishZoneChechValue, + zone // + ); + if (isBelow) + { + mConditions.visionHighestSupplyZone = zone; + } + } + } + + // + hasVisionHighestSupplyZone = mConditions.HasVisionHighestSupplyZone(); + } + + // + if (!hasVisionLowestDemandZone) + { + // + int hasZones = visionState.HasDemandZones(); + int zonesCount = visionState.HasDemandZones(); + + // + if (hasZones) + { + // + int idx = GetLowest(visionState.demandZones); + hasVisionLowestDemandZone = IsValidIndex(idx); + if (hasVisionLowestDemandZone) + { + // + // Validate Zone ... + XCDemandZone *zone = visionState.demandZones[idx]; + bool isAbove = IsAbove( + decisionCBarBullishZoneChechValue, + zone // + ); + if (isAbove) + { + mConditions.visionLowestDemandZone = zone; + } + } + } + + // + hasVisionLowestDemandZone = mConditions.HasVisionLowestDemandZone(); + } + + // + if (!hasConsolidationHighestSupplyZone) + { + // + int hasZones = consolidationState.HasSupplyZones(); + int zonesCount = consolidationState.HasSupplyZones(); + + // + if (hasZones) + { + // + int idx = GetHighest(consolidationState.supplyZones); + hasConsolidationHighestSupplyZone = IsValidIndex(idx); + if (hasConsolidationHighestSupplyZone) + { + // + // Validate Zone ... + XCSupplyZone *zone = consolidationState.supplyZones[idx]; + bool isBelow = IsBelow( + decisionCBarBearishZoneChechValue, + zone // + ); + if (isBelow) + { + // + if (mConditions.workingZone.IsValid()) + { + // + RemoveDraws(); + result = false; + mConditions.Clean(); + RemoveWorkingZoneDraws(); + + // + return result; + } + + // + mConditions.consolidationHighestSupplyZone = zone; + } + } + } + + // + hasConsolidationHighestSupplyZone = mConditions.HasConsolidationHighestSupplyZone(); + } + + // + if (!hasConsolidationLowestDemandZone) + { + // + int hasZones = consolidationState.HasDemandZones(); + int zonesCount = consolidationState.HasDemandZones(); + + // + if (hasZones) + { + // + int idx = GetLowest(consolidationState.demandZones); + hasConsolidationLowestDemandZone = IsValidIndex(idx); + if (hasConsolidationLowestDemandZone) + { + // + // Validate Zone ... + XCDemandZone *zone = consolidationState.demandZones[idx]; + bool isAbove = IsAbove( + decisionCBarBullishZoneChechValue, + zone // + ); + if (isAbove) + { + // + if (mConditions.workingZone.IsValid()) + { + // + RemoveDraws(); + result = false; + mConditions.Clean(); + RemoveWorkingZoneDraws(); + + // + return result; + } + + // + mConditions.consolidationLowestDemandZone = zone; + } + } + } + + // + hasConsolidationLowestDemandZone = mConditions.HasConsolidationLowestDemandZone(); + } + + // + // 2- Detect Working Zone ... + if (!hasWorkingZone) + { + hasWorkingZone = mConditions.ExtractWorkingZone(); + } + + // + // Here we Can Detect Price Inside SupDem Zones ... + + // + bool isPriceInsideSupplyZone = false; + bool isPriceInsideDemandZone = false; + bool isPriceInsideVisionSupplyZone = false; + bool isPriceInsideVisionDemandZone = false; + bool isPriceInsideConsolidationSupplyZone = false; + bool isPriceInsideConsolidationDemandZone = false; + if (hasVisionLowestDemandZone) + { + // + double iUpper = mConditions.visionLowestDemandZone.Upper(); + double iLower = mConditions.visionLowestDemandZone.Lower(); + + // + isPriceInsideVisionDemandZone = + // + decisionZBar.high < iUpper && + decisionCBar.high < iUpper && + // + decisionZBar.low > iLower && + decisionCBar.low > iLower + // + ; + } + if (hasVisionHighestSupplyZone) + { + // + double iUpper = mConditions.visionHighestSupplyZone.Upper(); + double iLower = mConditions.visionHighestSupplyZone.Lower(); + + // + isPriceInsideVisionSupplyZone = + // + decisionZBar.high < iUpper && + decisionCBar.high < iUpper && + // + decisionZBar.low > iLower && + decisionCBar.low > iLower + // + ; + } + if (hasConsolidationLowestDemandZone) + { + // + double iUpper = mConditions.consolidationLowestDemandZone.Upper(); + double iLower = mConditions.consolidationLowestDemandZone.Lower(); + + // + isPriceInsideConsolidationDemandZone = + // + decisionZBar.high < iUpper && + decisionCBar.high < iUpper && + // + decisionZBar.low > iLower && + decisionCBar.low > iLower + // + ; + } + if (hasConsolidationHighestSupplyZone) + { + // + double iUpper = mConditions.consolidationHighestSupplyZone.Upper(); + double iLower = mConditions.consolidationHighestSupplyZone.Lower(); + + // + isPriceInsideConsolidationSupplyZone = + // + decisionZBar.high < iUpper && + decisionCBar.high < iUpper && + // + decisionZBar.low > iLower && + decisionCBar.low > iLower + // + ; + } + + // + isPriceInsideSupplyZone = isPriceInsideVisionSupplyZone || + isPriceInsideConsolidationSupplyZone; + if (isPriceInsideSupplyZone) + { + // + if (isPriceInsideVisionSupplyZone) + { + mConditions.insideSupplyZone = mConditions.visionHighestSupplyZone; + } + else if (isPriceInsideConsolidationSupplyZone) + { + mConditions.insideSupplyZone = mConditions.consolidationHighestSupplyZone; + } + } + + // + isPriceInsideDemandZone = isPriceInsideVisionDemandZone || + isPriceInsideConsolidationDemandZone; + if (isPriceInsideDemandZone) + { + // + if (isPriceInsideVisionDemandZone) + { + mConditions.insideDemandZone = mConditions.visionLowestDemandZone; + } + else if (isPriceInsideConsolidationDemandZone) + { + mConditions.insideDemandZone = mConditions.consolidationLowestDemandZone; + } + } + + // + // Check Working Zone Destroy ... + isDestroyed = mConditions.IsWorkingZoneDestroyed( + destroyedDir, // Direction ... + 0, // Bar Index ... + decisionState.period // Period ... + ); + if (isDestroyed) + { + // + Clean(visionPoiEvents); + Clean(analysePoiEvents); + Clean(decisionPoiEvents); + Clean(visionCycleEvents); + Clean(analyseCycleEvents); + Clean(decisionCycleEvents); + Clean(consolidationPoiEvents); + Clean(consolidationCycleEvents); + + // + visionState.Clean(); + analyseState.Clean(); + decisionZBar.Clean(); + decisionCBar.Clean(); + decisionPBar.Clean(); + decisionState.Clean(); + visionConditions.Clean(); + analyseConditions.Clean(); + visionXConditions.Clean(); + consolidationState.Clean(); + decisionConditions.Clean(); + analyseXConditions.Clean(); + decisionXConditions.Clean(); + consolidationConditions.Clean(); + consolidationXConditions.Clean(); + + // + result = false; + mConditions.Clean(); + RemoveDraws(); + RemoveWorkingZoneDraws(); + + // + return result; + } + + // + // 2- Detect Market Trend Based On Nearest Zone Hunting ... + hasTrend = mConditions.DetectOveralTrend( + trendStartBar, + trendDir, + 0 // + ); + hasBullishTrend = IsBullish(trendDir); + hasBearishTrend = IsBearish(trendDir); + + // + result = hasTrend; + if (!result) + { + // + Clean(visionPoiEvents); + Clean(analysePoiEvents); + Clean(decisionPoiEvents); + Clean(visionCycleEvents); + Clean(analyseCycleEvents); + Clean(decisionCycleEvents); + Clean(consolidationPoiEvents); + Clean(consolidationCycleEvents); + + // + visionState.Clean(); + analyseState.Clean(); + decisionZBar.Clean(); + decisionCBar.Clean(); + decisionPBar.Clean(); + decisionState.Clean(); + visionConditions.Clean(); + analyseConditions.Clean(); + visionXConditions.Clean(); + consolidationState.Clean(); + decisionConditions.Clean(); + analyseXConditions.Clean(); + decisionXConditions.Clean(); + consolidationConditions.Clean(); + consolidationXConditions.Clean(); + + // + RemoveDraws(); + RemoveWorkingZoneDraws(); + + // + return result; + } + + // + // 3- Checking Price Inside Valid Quarters Based on Trend ... + + // + // in Bullish Trend: + // ----------------------------- + // - if Price Under Lower: HIGH; + // - if Price Under Quarter 3 and Above Lower: REGULAR; + // - if Price Under Quarter 2 and Above Quarter 3: LOW; + // - if Price Above Quarter 2: NONE; + + // + // in Bearish Trend: + // ----------------------------- + // - if Price Above Upper: HIGH; + // - if Price Above Quarter 1 and Below Upper: REGULAR; + // - if Price Above Quarter 2 and Below Quarter 1: LOW; + // - if Price Below Quarter 2: NONE; + + // + ENUM_X121SMC_XSUPDEMOBS_PRIORITY bullishPriority = X121SMC_XSUPDEMOBS_PRIORITY_NONE; + ENUM_X121SMC_XSUPDEMOBS_PRIORITY bearishPriority = X121SMC_XSUPDEMOBS_PRIORITY_NONE; + + // + bool isInQuarter0 = CheckPriceInside( + decisionZBar, + decisionCBar, + mConditions.workingZone.zoneUpper, + mConditions.workingZone.upper // + ); + bool isInQuarter1 = CheckPriceInside( + decisionZBar, + decisionCBar, + mConditions.workingZone.upper, + mConditions.workingZone.quarter1 // + ); + bool isInQuarter2 = CheckPriceInside( + decisionZBar, + decisionCBar, + mConditions.workingZone.quarter1, + mConditions.workingZone.quarter2 // + ); + bool isInQuarter3 = CheckPriceInside( + decisionZBar, + decisionCBar, + mConditions.workingZone.quarter2, + mConditions.workingZone.quarter3 // + ); + bool isInQuarter4 = CheckPriceInside( + decisionZBar, + decisionCBar, + mConditions.workingZone.quarter3, + mConditions.workingZone.lower // + ); + bool isInQuarter5 = CheckPriceInside( + decisionZBar, + decisionCBar, + mConditions.workingZone.lower, + mConditions.workingZone.zoneLower // + ); + + // + if (isInQuarter0) + { + // + bullishPriority = X121SMC_XSUPDEMOBS_PRIORITY_NONE; + bearishPriority = X121SMC_XSUPDEMOBS_PRIORITY_HIGH; + } + else if (isInQuarter1) + { + // + bullishPriority = X121SMC_XSUPDEMOBS_PRIORITY_NONE; + bearishPriority = X121SMC_XSUPDEMOBS_PRIORITY_REGULAR; + } + else if (isInQuarter2) + { + // + bullishPriority = X121SMC_XSUPDEMOBS_PRIORITY_WEAK; + bearishPriority = X121SMC_XSUPDEMOBS_PRIORITY_LOW; + } + else if (isInQuarter3) + { + // + bullishPriority = X121SMC_XSUPDEMOBS_PRIORITY_LOW; + bearishPriority = X121SMC_XSUPDEMOBS_PRIORITY_WEAK; + } + else if (isInQuarter4) + { + // + bullishPriority = X121SMC_XSUPDEMOBS_PRIORITY_REGULAR; + bearishPriority = X121SMC_XSUPDEMOBS_PRIORITY_NONE; + } + else if (isInQuarter5) + { + // + bullishPriority = X121SMC_XSUPDEMOBS_PRIORITY_HIGH; + bearishPriority = X121SMC_XSUPDEMOBS_PRIORITY_NONE; + } + + // + bool lookingForLong = bullishPriority != X121SMC_XSUPDEMOBS_PRIORITY_NONE; + bool lookingForShort = bearishPriority != X121SMC_XSUPDEMOBS_PRIORITY_NONE; + + // + result = lookingForLong || + lookingForShort; + if (!result) + { + // + Clean(visionPoiEvents); + Clean(analysePoiEvents); + Clean(visionCycleEvents); + Clean(decisionPoiEvents); + Clean(analyseCycleEvents); + Clean(decisionCycleEvents); + Clean(consolidationPoiEvents); + Clean(consolidationCycleEvents); + + // + visionState.Clean(); + analyseState.Clean(); + decisionZBar.Clean(); + decisionCBar.Clean(); + decisionPBar.Clean(); + decisionState.Clean(); + visionConditions.Clean(); + analyseConditions.Clean(); + visionXConditions.Clean(); + consolidationState.Clean(); + decisionConditions.Clean(); + analyseXConditions.Clean(); + decisionXConditions.Clean(); + consolidationConditions.Clean(); + consolidationXConditions.Clean(); + + // + RemoveDraws(); + RemoveWorkingZoneDraws(); + + // + return result; + } + + // + // Detect Order Blocks in Direction of Trend ... + XCOrderBlock *obs[]; + Copy( + consolidationState.bullishOrderBlocks, + obs // + ); + Copy( + consolidationState.bearishOrderBlocks, + obs // + ); + + // + // Validate OB FVG ... + XCFVG *fvgs[]; + Copy( + analyseState.bullishFairValueGaps, + fvgs // + ); + Copy( + analyseState.bearishFairValueGaps, + fvgs // + ); + + // + int obsCount = ArraySize(obs); + bool hasOBs = IsValidSize(obsCount); + + // + int fvgsCount = ArraySize(fvgs); + bool hasFVGs = IsValidSize(fvgsCount); + + // + bool hasOBFVGs = mConditions.HasOBFVGs(); + int obFVGsCount = mConditions.CountOBFVGs(); + + // + if (hasOBs && + hasFVGs && + !hasOBFVGs) + { + // + for (int i = 0; i < obsCount; i++) + { + // + XCOrderBlock *iOB = obs[i]; + + // + // Check Ob Index inside OB FVGS ... + bool isOBFVGExists = false; + hasOBFVGs = mConditions.HasOBFVGs(); + obFVGsCount = mConditions.CountOBFVGs(); + if (hasOBFVGs) + { + // + for (int j = 0; j < obFVGsCount; j++) + { + // + bool isSame = IsSame( + mConditions.obFVGs[j].ob, + iOB // + ); + + // + if (isSame) + { + // + isOBFVGExists = true; + break; + } + } + } + if (isOBFVGExists) + { + continue; + } + + // + for (int j = 0; j < fvgsCount; j++) + { + // + XCFVG *jFVG = fvgs[j]; + + // + ENUM_TIMEFRAMES jPeriod = jFVG.GetPeriod(); + if (jPeriod != PERIOD_M15) + { + Print(ToString(jPeriod)); + } + + // + XOBFVG iOBFVG; + + // + iOBFVG.time = cTime; + iOBFVG.symbol = iOB.GetSymbol(); + iOBFVG.period = iOB.GetPeriod(); + + // + iOBFVG.ob = iOB; + iOBFVG.fvg = jFVG; + + // + bool isValidOBFVG = iOBFVG.IsValid(); + if (isValidOBFVG) + { + // + AddRef( + iOBFVG, + mConditions.obFVGs // + ); + + // + iOBFVG.Clean(); + + // + break; + } + + // + iOBFVG.Clean(); + } + } + + // + hasOBFVGs = mConditions.HasOBFVGs(); + obFVGsCount = mConditions.CountOBFVGs(); + } + + // + // Now We Have to Check OBFVGs ... + result = hasOBFVGs; + if (!result) + { + // + Clean(obs); + Clean(fvgs); + + // + Clean(visionPoiEvents); + Clean(analysePoiEvents); + Clean(decisionPoiEvents); + Clean(visionCycleEvents); + Clean(analyseCycleEvents); + Clean(decisionCycleEvents); + Clean(consolidationPoiEvents); + Clean(consolidationCycleEvents); + + // + visionState.Clean(); + analyseState.Clean(); + decisionZBar.Clean(); + decisionCBar.Clean(); + decisionPBar.Clean(); + decisionState.Clean(); + visionConditions.Clean(); + analyseConditions.Clean(); + visionXConditions.Clean(); + consolidationState.Clean(); + decisionConditions.Clean(); + analyseXConditions.Clean(); + decisionXConditions.Clean(); + consolidationConditions.Clean(); + consolidationXConditions.Clean(); + + // + RemoveDraws(); + RemoveWorkingZoneDraws(); + + // + return result; + } + + // + // Detect Un Activated POI(s) ... + // including: + // - Order Blocks; + // - Fair Value Gaps; + + // + bool hasUnActivatedOBs = false; + bool hasUnActivatedFVGs = false; + for (int i = 0; i < obFVGsCount; i++) + { + // + bool iHasUnActivatedOBs = mConditions.obFVGs[i].HasUnActivatedOBs(); + bool iHasUnActivatedFVGs = mConditions.obFVGs[i].HasUnActivatedFVGs(); + + // + if (hasOBs) + { + // + for (int j = 0; j < obsCount; j++) + { + mConditions.obFVGs[i].AddUnActivatedOB( + obs[j], + decisionZBar // + ); + } + + // + iHasUnActivatedOBs = mConditions.obFVGs[i].HasUnActivatedOBs(); + } + + // + if (hasFVGs) + { + // + for (int j = 0; j < fvgsCount; j++) + { + mConditions.obFVGs[i].AddUnActivatedFVG( + fvgs[j], + decisionZBar // + ); + } + + // + iHasUnActivatedFVGs = mConditions.obFVGs[i].HasUnActivatedFVGs(); + } + + // + if (iHasUnActivatedOBs && + !hasUnActivatedOBs) + { + hasUnActivatedOBs = iHasUnActivatedOBs; + } + + // + if (iHasUnActivatedFVGs && + !hasUnActivatedFVGs) + { + hasUnActivatedFVGs = iHasUnActivatedFVGs; + } + } + + // + result = + (isPriceInsideSupplyZone || + isPriceInsideDemandZone) + ? true + : (hasUnActivatedOBs || + hasUnActivatedFVGs); + if (!result) + { + // + Clean(obs); + Clean(fvgs); + + // + Clean(visionPoiEvents); + Clean(analysePoiEvents); + Clean(visionCycleEvents); + Clean(decisionPoiEvents); + Clean(analyseCycleEvents); + Clean(decisionCycleEvents); + Clean(consolidationPoiEvents); + Clean(consolidationCycleEvents); + + // + visionState.Clean(); + analyseState.Clean(); + decisionZBar.Clean(); + decisionCBar.Clean(); + decisionPBar.Clean(); + decisionState.Clean(); + visionConditions.Clean(); + analyseConditions.Clean(); + visionXConditions.Clean(); + consolidationState.Clean(); + decisionConditions.Clean(); + analyseXConditions.Clean(); + decisionXConditions.Clean(); + consolidationConditions.Clean(); + consolidationXConditions.Clean(); + + // + RemoveDraws(); + RemoveWorkingZoneDraws(); + + // + return result; + } + + // + // Now We Have to Wait for Price Inside Box ... + + // + XOHCL swingBar; + XOHCL rejectBar; + XOHCL breakerBar; + XOHCL momentumBar; + bool isPriceRejected = false; + XCFVG *insideFVG = mConditions.insideFVG; + XCFVG *rejectedFVG = mConditions.rejectedFVG; + XCOrderBlock *insideOB = mConditions.insideOB; + XCOrderBlock *rejectedOB = mConditions.rejectedOB; + XCSupplyZone *insideSupplyZone = mConditions.insideSupplyZone; + XCDemandZone *insideDemandZone = mConditions.insideDemandZone; + + // + bool hasInsideOB = insideOB != NULL && + insideOB.IsValid(); + bool hasInsideFVG = insideFVG != NULL && + insideFVG.IsValid(); + bool hasInsideZone = hasInsideOB || + hasInsideFVG; + bool hasRejectedOB = rejectedOB != NULL && + rejectedOB.IsValid(); + bool hasRejectedFVG = rejectedFVG != NULL && + rejectedFVG.IsValid(); + bool hasRejectedZone = hasRejectedOB || + hasRejectedFVG; + bool hasInsideSupplyZone = insideSupplyZone != NULL && + insideSupplyZone.IsValid(); + bool hasInsideDemandZone = insideDemandZone != NULL && + insideDemandZone.IsValid(); + bool hasInsideSupDemZone = hasInsideSupplyZone || + hasInsideDemandZone; + if (!hasInsideZone) + { + // + for (int i = 0; i < obFVGsCount; i++) + { + // + bool iOBFVGHasUnActivatedOBs = mConditions.obFVGs[i].HasUnActivatedOBs(); + int iOBFVGUnActivatedOBsCount = mConditions.obFVGs[i].CountUnActivatedOBs(); + + // + bool iOBFVGHasUnActivatedFVGs = mConditions.obFVGs[i].HasUnActivatedFVGs(); + int iOBFVGUnActivatedFVGsCount = mConditions.obFVGs[i].CountUnActivatedFVGs(); + + // + // Detect Inside Zones ... + + // + if (!hasInsideOB && + iOBFVGHasUnActivatedOBs) + { + // + int idx = -1; + for (int j = 0; j < iOBFVGUnActivatedOBsCount; j++) + { + // + ENUM_X_DIRECTION iForDir = mConditions.obFVGs[i].unActivatedOBs[j].GetDirection(); + bool isIBullish = IsBullish(iForDir); + + // + bool isInsideFromUpper = IsInside( + decisionZBar.low, + mConditions.obFVGs[i].unActivatedOBs[j] // + ); + bool isInsideFromLower = IsInside( + decisionZBar.high, + mConditions.obFVGs[i].unActivatedOBs[j] // + ); + + // + bool isInside = + isBullish + ? isInsideFromUpper + : isInsideFromLower; + if (isInside) + { + // + idx = j; + insideOB = mConditions.obFVGs[i].unActivatedOBs[j]; + mConditions.insideOB = insideOB; + break; + } + } + + // + if (IsValidIndex(idx)) + { + // + ArrayRemove( + mConditions.obFVGs[i].unActivatedOBs, + idx, + 1 // + ); + } + } + + // + if (insideOB == NULL && + !hasInsideFVG && + iOBFVGHasUnActivatedFVGs) + { + // + int idx = -1; + for (int j = 0; j < iOBFVGUnActivatedFVGsCount; j++) + { + // + ENUM_X_DIRECTION iForDir = mConditions.obFVGs[i].unActivatedFVGs[j].GetDirection(); + bool isIBullish = IsBullish(iForDir); + + // + bool isInsideFromUpper = IsInside( + decisionZBar.low, + mConditions.obFVGs[i].unActivatedFVGs[j] // + ); + bool isInsideFromLower = IsInside( + decisionZBar.high, + mConditions.obFVGs[i].unActivatedFVGs[j] // + ); + + // + bool isInside = + isBullish + ? isInsideFromUpper + : isInsideFromLower; + if (isInside) + { + // + idx = j; + insideFVG = mConditions.obFVGs[i].unActivatedFVGs[j]; + mConditions.insideFVG = insideFVG; + break; + } + } + + // + if (IsValidIndex(idx)) + { + // + ArrayRemove( + mConditions.obFVGs[i].unActivatedFVGs, + idx, + 1 // + ); + } + } + } + + // + hasInsideOB = insideOB != NULL && + insideOB.IsValid(); + hasInsideFVG = insideFVG != NULL && + insideFVG.IsValid(); + hasInsideZone = hasInsideOB || + hasInsideFVG; + + // + // Here Detect Inside or Rejected Zones inside Supply and Demand Zones ... + // For Using them for Positions ... + if (!hasInsideZone && + hasInsideSupDemZone) + { + // + ENUM_X_DIRECTION forDir = + hasInsideSupplyZone + ? X_DIRECTION_BEARISH + : X_DIRECTION_BULLISH; + + // + bool isLookingForBullish = IsBullish(forDir); + + // + XCFVG *fvgs[]; + XCOrderBlock *obs[]; + int obsCount = 0; + int fvgsCount = 0; + bool hasOBs = false; + bool hasFVGs = false; + + // + if (isLookingForBullish) + { + // + Copy( + analyseState.bullishOrderBlocks, + obs // + ); + FilterZones( + insideDemandZone, + obs, + true, // Filter Direction ... + true, // Filter From ... + true, // Filter Price ... + true, // Ignore Out of Box ... + true, // Apply Sort ... + true // Ignore Inside ... + ); + + // + Copy( + analyseState.bullishFairValueGaps, + fvgs // + ); + FilterZones( + insideDemandZone, + fvgs, + true, // Filter Direction ... + true, // Filter From ... + true, // Filter Price ... + true, // Ignore Out of Box ... + true, // Apply Sort ... + true // Ignore Inside ... + ); + } + else + { + // + Copy( + analyseState.bearishOrderBlocks, + obs // + ); + FilterZones( + insideSupplyZone, + obs, + true, // Filter Direction ... + true, // Filter From ... + true, // Filter Price ... + false, // Ignore Out of Box ... + true, // Apply Sort ... + true // Ignore Inside ... + ); + + // + Copy( + analyseState.bearishFairValueGaps, + fvgs // + ); + FilterZones( + insideSupplyZone, + fvgs, + true, // Filter Direction ... + true, // Filter From ... + true, // Filter Price ... + false, // Ignore Out of Box ... + true, // Apply Sort ... + true // Ignore Inside ... + ); + } + + // + obsCount = ArraySize(obs); + fvgsCount = ArraySize(fvgs); + + // + hasOBs = IsValidSize(obsCount); + hasFVGs = IsValidSize(fvgsCount); + + // + if (hasOBs || + hasFVGs) + { + // + if (hasOBs) + { + // + for (int i = 0; i < obsCount; i++) + { + // + ENUM_X_DIRECTION iForDir = obs[i].GetDirection(); + bool isIBullish = IsBullish(iForDir); + + // + isPriceRejected = false; + // IsReject( + // iForDir, + // decisionZBar, + // obs[i], + // decisionState, + // swingBar, + // rejectBar, + // breakerBar, + // momentumBar, + // false // + // ); + if (isPriceRejected) + { + // + rejectedOB = obs[i]; + mConditions.rejectedOB = rejectedOB; + } + + // + bool isInsideFromUpper = IsInside( + decisionZBar.low, + obs[i] // + ); + bool isInsideFromLower = IsInside( + decisionZBar.high, + obs[i] // + ); + + // + bool isInside = + isBullish + ? isInsideFromUpper + : isInsideFromLower; + if (isInside) + { + // + insideOB = obs[i]; + mConditions.insideOB = obs[i]; + break; + } + } + } + + // + hasInsideOB = insideOB != NULL && + insideOB.IsValid(); + // + hasRejectedOB = rejectedOB != NULL && + rejectedOB.IsValid(); + + // + if (hasFVGs && + !hasInsideOB && + !hasRejectedOB) + { + // + for (int i = 0; i < fvgsCount; i++) + { + // + ENUM_X_DIRECTION iForDir = fvgs[i].GetDirection(); + bool isIBullish = IsBullish(iForDir); + + // + isPriceRejected = false; + // IsReject( + // iForDir, + // decisionZBar, + // fvgs[i], + // decisionState, + // swingBar, + // rejectBar, + // breakerBar, + // momentumBar, + // false // + // ); + if (isPriceRejected) + { + // + rejectedFVG = fvgs[i]; + mConditions.rejectedFVG = rejectedFVG; + } + + // + bool isInsideFromUpper = IsInside( + decisionZBar.low, + fvgs[i] // + ); + bool isInsideFromLower = IsInside( + decisionZBar.high, + fvgs[i] // + ); + + // + bool isInside = + isBullish + ? isInsideFromUpper + : isInsideFromLower; + if (isInside) + { + // + insideFVG = fvgs[i]; + mConditions.insideFVG = fvgs[i]; + break; + } + } + } + } + + // + Clean(obs); + Clean(fvgs); + } + + // + mConditions.UpdateTo(cTime); + + // + hasInsideOB = insideOB != NULL && + insideOB.IsValid(); + hasInsideFVG = insideFVG != NULL && + insideFVG.IsValid(); + hasInsideZone = hasInsideOB || + hasInsideFVG; + + // + hasRejectedOB = rejectedOB != NULL && + rejectedOB.IsValid(); + hasRejectedFVG = rejectedFVG != NULL && + rejectedFVG.IsValid(); + hasRejectedZone = hasRejectedOB || + hasRejectedFVG; + + // + if (hasInsideSupDemZone && + (hasInsideZone || + hasRejectedZone)) + { + // + RemoveDraws(); + RemoveWorkingZoneDraws(); + + // + // Set Target Based On Supply or Demand Zone ... + + // + // Supply Zone ... + if (isPriceInsideSupplyZone) + { + target = mConditions.workingZone.quarter1; + } + + // + // Demand Zone ... + if (isPriceInsideDemandZone) + { + target = mConditions.workingZone.quarter3; + } + } + } + + // + result = hasInsideZone || + hasRejectedZone; + if (!result) + { + // + decisionZBar.Clean(); + decisionCBar.Clean(); + decisionPBar.Clean(); + + // + swingBar.Clean(); + rejectBar.Clean(); + breakerBar.Clean(); + momentumBar.Clean(); + + // + Clean(obs); + Clean(fvgs); + + // + Clean(visionPoiEvents); + Clean(analysePoiEvents); + Clean(visionCycleEvents); + Clean(decisionPoiEvents); + Clean(analyseCycleEvents); + Clean(decisionCycleEvents); + Clean(consolidationPoiEvents); + Clean(consolidationCycleEvents); + + // + visionState.Clean(); + analyseState.Clean(); + decisionState.Clean(); + visionConditions.Clean(); + analyseConditions.Clean(); + visionXConditions.Clean(); + consolidationState.Clean(); + decisionConditions.Clean(); + analyseXConditions.Clean(); + decisionXConditions.Clean(); + consolidationConditions.Clean(); + consolidationXConditions.Clean(); + + // + ZeroMemory(insideOB); + ZeroMemory(insideFVG); + ZeroMemory(rejectedOB); + ZeroMemory(rejectedFVG); + ZeroMemory(insideSupplyZone); + ZeroMemory(insideDemandZone); + + // + return result; + } + + // + // Waiting for Price Breakes Inside Zone ... + + // + double upper = 0; + double lower = 0; + bool isInsideZoneDirectionBullish = false; + bool isInsideZoneDirectionBearish = false; + + // + if (hasInsideOB) + { + // + upper = insideOB.Upper(); + lower = insideOB.Lower(); + + // + isInsideZoneDirectionBullish = insideOB.IsBullish(); + isInsideZoneDirectionBearish = insideOB.IsBearish(); + } + else if (hasInsideFVG) + { + // + upper = insideFVG.Upper(); + lower = insideFVG.Lower(); + + // + isInsideZoneDirectionBullish = insideFVG.IsBullish(); + isInsideZoneDirectionBearish = insideFVG.IsBearish(); + } + + // + // Cleanup Unused Objects ... + // + decisionZBar.Clean(); + decisionCBar.Clean(); + decisionPBar.Clean(); + + // + ZeroMemory(insideOB); + ZeroMemory(insideFVG); + ZeroMemory(rejectedOB); + ZeroMemory(rejectedFVG); + ZeroMemory(insideSupplyZone); + ZeroMemory(insideDemandZone); + + // + Clean(visionPoiEvents); + Clean(analysePoiEvents); + Clean(visionCycleEvents); + Clean(decisionPoiEvents); + Clean(analyseCycleEvents); + Clean(decisionCycleEvents); + Clean(consolidationPoiEvents); + Clean(consolidationCycleEvents); + + // + visionState.Clean(); + analyseState.Clean(); + decisionZBar.Clean(); + decisionCBar.Clean(); + decisionPBar.Clean(); + decisionState.Clean(); + visionConditions.Clean(); + analyseConditions.Clean(); + visionXConditions.Clean(); + consolidationState.Clean(); + decisionConditions.Clean(); + analyseXConditions.Clean(); + decisionXConditions.Clean(); + consolidationConditions.Clean(); + consolidationXConditions.Clean(); + + // + // Summarize Conditions ... + + // + bool isCondition1Bullish = + // + hasBullishTrend && + isInsideZoneDirectionBullish && + bullishPriority != X121SMC_XSUPDEMOBS_PRIORITY_NONE + // + ; + + // + bool isCondition1Bearish = + // + hasBearishTrend && + isInsideZoneDirectionBearish && + bearishPriority != X121SMC_XSUPDEMOBS_PRIORITY_NONE + // + ; + + // + bool hasCondition1 = isCondition1Bullish || + isCondition1Bearish; + if (hasCondition1) + { + // + ENUM_X_DIRECTION pzDir = + isCondition1Bullish + ? X_DIRECTION_BULLISH + : X_DIRECTION_BEARISH; + + // + double point = GetEntry( + mConditions.symbol, + pzDir // + ); + + // + double longPivot = lower; // triggerXConditions.valesBuffer[1]; + double shortPivot = upper; // triggerXConditions.peaksBuffer[1]; + + // + // Manipulate Conditions Point ... + + // + mConditions.point = + isCondition1Bullish + ? shortPivot + : longPivot; + + // + // Manipulate Conditions Pivot ... + + // + mConditions.pivot = + isCondition1Bullish + ? longPivot + : shortPivot; + } + + // + // Summarize Conditions ... + // + + // + isBullish = + // + isCondition1Bullish + // + ; + + // + isBearish = + // + isCondition1Bearish + // + ; + + // + result = isBullish || + isBearish; + if (!result) + { + return result; + } + + // + double reward; + double amountPercent; + ENUM_X121SMC_XSUPDEMOBS_PRIORITY priority = + isBullish + ? bullishPriority + : bearishPriority; + bool hasRewardAmount = CalculateRiskReward( + priority, + reward, + amountPercent // + ); + result = hasRewardAmount; + if (!result) + { + return result; + } + + // + mConditions.setupTime = cTime; + mConditions.dir = + isBullish + ? X_DIRECTION_BULLISH + : X_DIRECTION_BEARISH; + + // + mConditions.reward = reward; + mConditions.target = target; + mConditions.priority = priority; + mConditions.amountPercent = amountPercent; + + // + swingBar.Clean(); + rejectBar.Clean(); + breakerBar.Clean(); + momentumBar.Clean(); + + // + return result; + } + + // + // Detect Trigger Conditions ... + bool DetectSignalTrigger( + // + X121SMCStrategyXSupDemOBSSignalConditions &conditions, + // + string _symbol, + ENUM_TIMEFRAMES _period, + // + XC121SMCCycleHelper *decisionCycleHelper, + XC121SMCCycleHelper *analyseCycleHelper, + XC121SMCCycleHelper *consolidationCycleHelper, + XC121SMCCycleHelper *visionCycleHelper, + // + int maxAllowedSetupAge = 60 + // + ) + { + // + bool result = false; + + // + result = + // + visionCycleHelper != NULL && + analyseCycleHelper != NULL && + decisionCycleHelper != NULL && + consolidationCycleHelper != NULL + // + ; + if (!result) + { + return result; + } + + // + result = conditions.IsSetuped(); + if (!result) + { + return result; + } + + // + datetime setupTime = conditions.setupTime; + ENUM_X_DIRECTION setupDir = conditions.dir; + + // + bool isBullish = IsBullish(setupDir); + bool isBearish = IsBearish(setupDir); + + // + int zIndex = 0; + int cIndex = zIndex + 1; + int pIndex = cIndex + 1; + int ppIndex = pIndex + 1; + + // + int loopback = 10; + + // + string symbol = _symbol; + ENUM_TIMEFRAMES period = _period; + + // + XOHCL zBar; + result = decisionCycleHelper.GetBar( + zBar, + zIndex // + ); + if (!result) + { + return result; + } + + // + XOHCL cBar; + result = decisionCycleHelper.GetBar( + cBar, + cIndex // + ); + if (!result) + { + return result; + } + + // + XOHCL pBar; + result = decisionCycleHelper.GetBar( + pBar, + pIndex // + ); + if (!result) + { + return result; + } + + // + double ask = GetAsk(symbol); + double bid = GetBid(symbol); + datetime cTime = TimeCurrent(); + double points = GetPoints(symbol); + + // + int swingLoopback = 9; + double ll = cBar.FindLowest(swingLoopback, MODE_LOW); + double hh = cBar.FindHighest(swingLoopback, MODE_HIGH); + double llDown = cBar.FindLowesttDown(swingLoopback); + double hhUp = cBar.FindHighestUp(swingLoopback); + + // + // Cycles Conditions ... + + // + // Decision ... + ENUM_XPOI_EVENTS decisionPoiEvents[]; + ENUM_X_CYCLE_EVENTS decisionCycleEvents[]; + X121SMCCycleConditions decisionConditions; + result = decisionCycleHelper.GetConditions( + decisionCycleEvents, + decisionPoiEvents, + decisionConditions, + zIndex, + loopback // + ); + if (!result) + { + // + // Cleanup ... + zBar.Clean(); + cBar.Clean(); + pBar.Clean(); + + // + Clean(decisionPoiEvents); + Clean(decisionCycleEvents); + + // + decisionConditions.Clean(); + + // + return result; + } + + // + // Cycles POI States ... + XPOIState decisionState = decisionConditions.state; + + // + // Cycle X121Conditions ... + X121Conditions decisionXConditions = decisionConditions.x121Conditions; + + // + // Trigger Conditions ... + + // + double point = conditions.point; + bool isPointBreaked = IsBarBreak( + point, + setupDir, + cBar // + ); + + // + // Summary ... + + // + isBullish = + // + isBullish && + isPointBreaked + // + ; + + // + isBearish = + // + isBearish && + isPointBreaked + // + ; + + // + result = isBullish || + isBearish; + if (!result) + { + // + // Cleanup Setup Conditions ... + int setupAge = conditions.GetSetupAge(); + if (IsValidSize(setupAge) && + IsValidSize(maxAllowedSetupAge) && + setupAge >= maxAllowedSetupAge) + { + conditions.Clean(); + } + + // + // Cleanup ... + zBar.Clean(); + cBar.Clean(); + pBar.Clean(); + + // + Clean(decisionPoiEvents); + Clean(decisionCycleEvents); + + // + decisionState.Clean(); + decisionConditions.Clean(); + decisionXConditions.Clean(); + + // + return result; + } + + // + // Detect Nearest Pivot Point ... + + // + double entry = GetEntry( + conditions.symbol, + setupDir // + ); + + // + // Manipulate SL Based on Consolidation Zones ... + XConsolidationZone cZone; + bool hasCZone = decisionCycleHelper.GetActiveConsolidationZone(cZone); + bool hasCZones = decisionCycleHelper.HasConsolidationZones(); + int cZonesCount = decisionCycleHelper.CountConsolidationZones(); + if (!hasCZone && + hasCZones) + { + // + hasCZone = decisionCycleHelper.GetLastDirectionalConsolidationZone( + conditions.dir, + cZone // + ); + } + + // + double sls[]; + Add( + conditions.pivot, + sls // + ); + + // + if (hasCZone) + { + // + conditions.consolidationZone = cZone; + + // + if (isBullish) + { + // + Add( + cZone.lower, + sls // + ); + } + else + { + // + Add( + cZone.upper, + sls // + ); + } + } + + // + double iAtr = decisionXConditions.atrBuffer[1]; + iAtr *= 2; + + // + double slsMin = GetMin(sls); + double slsMax = GetMax(sls); + + // + double sl = isBullish + ? slsMin - iAtr + : slsMax + iAtr; + double risk = MathAbs(entry - sl); + + // + // Filling Conditions Props ... + conditions.sl = sl; + conditions.triggerTime = cTime; + conditions.type = isBullish + ? X_POSITION_TYPE_LONG + : X_POSITION_TYPE_SHORT; + + // + // Cleanup ... + zBar.Clean(); + cBar.Clean(); + pBar.Clean(); + + // + Clean(decisionPoiEvents); + Clean(decisionCycleEvents); + + // + decisionState.Clean(); + decisionConditions.Clean(); + decisionXConditions.Clean(); + + // + return result; + } + + // + // Detect Guards ... + bool DetectGuards( + // + X121SMCGuard &guards[], + const XPosition &positions[], + // + XC121SMCCycleHelper *decisionCycleHelper, + XC121SMCCycleHelper *analyseCycleHelper, + XC121SMCCycleHelper *consolidationCycleHelper, + XC121SMCCycleHelper *visionCycleHelper + // + ) + { + // + bool result = false; + + // + Clean(guards); + + // + bool isCycleHelpersValid = + // + visionCycleHelper != NULL && + analyseCycleHelper != NULL && + decisionCycleHelper != NULL && + consolidationCycleHelper != NULL + // + ; + + // + result = isCycleHelpersValid; + if (!result) + { + return result; + } + + // + int count = ArraySize(positions); + result = IsValidSize(count); + if (!result) + { + return result; + } + + // + string symbol = decisionCycleHelper.GetSymbol(); + ENUM_TIMEFRAMES period = decisionCycleHelper.GetPeriod(); + string provider = ToString(X_121_SMC_PROVIDER_XSUPDEMOBS); + + // + XPosition ownPositions[]; + XPosition ownLongPositions[]; + XPosition ownShortPositions[]; + for (int i = 0; i < count; i++) + { + // + XPosition iPosition = positions[i]; + bool isOwn = iPosition + .IsFiltersPassed( + symbol, + provider, + NULL, + X_POSITION_TYPE_ALL, + iPosition.magic // + ); + if (isOwn) + { + // + AddRef( + iPosition, + ownPositions // + ); + + // + bool isLong = IsLong(positions[i].type); + if (isLong) + { + // + AddRef( + iPosition, + ownLongPositions // + ); + } + else + { + // + AddRef( + iPosition, + ownShortPositions // + ); + } + } + } + + // + count = ArraySize(ownPositions); + + // + int longsCount = ArraySize(ownLongPositions); + bool hasLongs = IsValidSize(longsCount); + + // + int shortsCount = ArraySize(ownShortPositions); + bool hasShorts = IsValidSize(shortsCount); + + // + result = IsValidSize(count); + if (!result) + { + // + Clean(ownPositions); + Clean(ownLongPositions); + Clean(ownShortPositions); + + // + return result; + } + + // + // + // + + // + // Get Global and Common Guards ... + + // + ENUM_X_121_SMC_GUARD_ACTIONS ignoreGuards[1] = { + X_121_SMC_GUARD_ACTION_TRAIL_STOP}; + result = DetectX121SMCGuards( + provider, + guards, + positions, + decisionCycleHelper, + analyseCycleHelper, + consolidationCycleHelper, + visionCycleHelper, + // + ignoreGuards + // + ); + + // + // + // + + // + // Get Custom Implemented Guards ... + + // + // Here we Are Sure there is Positions to Guard ... + // based on Current Provider ... + + // + // Detect Required Data for Analyse Market to Guard Positions ... + + // + int zIndex = 0; + int cIndex = zIndex + 1; + int pIndex = cIndex + 1; + int ppIndex = pIndex + 1; + + // + int loopback = 10; + + // + XOHCL zBar; + result = zBar.Init( + symbol, + period, + zIndex // + ); + if (!result) + { + // + result = HasChild(guards); + return result; + } + + // + XOHCL cBar; + result = cBar.Init( + symbol, + period, + cIndex // + ); + if (!result) + { + // + zBar.Clean(); + result = HasChild(guards); + return result; + } + + // + XOHCL pBar; + result = pBar.Init( + symbol, + period, + pIndex // + ); + if (!result) + { + // + zBar.Clean(); + cBar.Clean(); + result = HasChild(guards); + return result; + } + + // + XOHCL ppBar; + result = ppBar.Init( + symbol, + period, + ppIndex // + ); + if (!result) + { + // + zBar.Clean(); + cBar.Clean(); + pBar.Clean(); + result = HasChild(guards); + return result; + } + + // + double ask = GetAsk(symbol); + double bid = GetBid(symbol); + datetime cTime = TimeCurrent(); + double points = GetPoints(symbol); + + // + + // + // Cycles Conditions ... + + // + // Decision ... + ENUM_XPOI_EVENTS decisionPoiEvents[]; + ENUM_X_CYCLE_EVENTS decisionCycleEvents[]; + X121SMCCycleConditions decisionConditions; + result = decisionCycleHelper.GetConditions( + decisionCycleEvents, + decisionPoiEvents, + decisionConditions, + zIndex, + loopback // + ); + if (!result) + { + // + zBar.Clean(); + cBar.Clean(); + pBar.Clean(); + ppBar.Clean(); + result = HasChild(guards); + return result; + } + + // + // Analyse ... + ENUM_XPOI_EVENTS analysePoiEvents[]; + ENUM_X_CYCLE_EVENTS analyseCycleEvents[]; + X121SMCCycleConditions analyseConditions; + result = analyseCycleHelper.GetConditions( + analyseCycleEvents, + analysePoiEvents, + analyseConditions, + zIndex, + loopback // + ); + if (!result) + { + // + zBar.Clean(); + cBar.Clean(); + pBar.Clean(); + ppBar.Clean(); + + // + Clean(decisionPoiEvents); + Clean(decisionCycleEvents); + + // + decisionConditions.Clean(); + + // + result = HasChild(guards); + return result; + } + + // + // Consolidation ... + ENUM_XPOI_EVENTS consolidationPoiEvents[]; + ENUM_X_CYCLE_EVENTS consolidationCycleEvents[]; + X121SMCCycleConditions consolidationConditions; + result = consolidationCycleHelper.GetConditions( + consolidationCycleEvents, + consolidationPoiEvents, + consolidationConditions, + zIndex, + loopback // + ); + if (!result) + { + // + zBar.Clean(); + cBar.Clean(); + pBar.Clean(); + ppBar.Clean(); + + // + Clean(decisionPoiEvents); + Clean(decisionCycleEvents); + + // + decisionConditions.Clean(); + + // + Clean(analysePoiEvents); + Clean(analyseCycleEvents); + + // + analyseConditions.Clean(); + + // + result = HasChild(guards); + return result; + } + + // + // Vision ... + ENUM_XPOI_EVENTS visionPoiEvents[]; + ENUM_X_CYCLE_EVENTS visionCycleEvents[]; + X121SMCCycleConditions visionConditions; + result = visionCycleHelper.GetConditions( + visionCycleEvents, + visionPoiEvents, + visionConditions, + zIndex, + loopback // + ); + if (!result) + { + // + zBar.Clean(); + cBar.Clean(); + pBar.Clean(); + ppBar.Clean(); + + // + Clean(decisionPoiEvents); + Clean(decisionCycleEvents); + + // + decisionConditions.Clean(); + + // + Clean(analysePoiEvents); + Clean(analyseCycleEvents); + + // + analyseConditions.Clean(); + + // + Clean(consolidationPoiEvents); + Clean(consolidationCycleEvents); + + // + consolidationConditions.Clean(); + + // + result = HasChild(guards); + return result; + } + + // + // Cycles POI States ... + XPOIState decisionState = decisionConditions.state; + XPOIState analyseState = analyseConditions.state; + XPOIState consolidationState = consolidationConditions.state; + XPOIState visionState = visionConditions.state; + + // + // Cycle X121Conditions ... + X121Conditions decisionXConditions = decisionConditions.x121Conditions; + X121Conditions analyseXConditions = analyseConditions.x121Conditions; + X121Conditions consolidationXConditions = consolidationConditions.x121Conditions; + X121Conditions visionXConditions = visionConditions.x121Conditions; + + // + // + // + + // + // Detect Consolidation Zone ... + + // + XBoxZone lastBullishBox; + XBoxZone prevLastBullishBox; + bool hasLastBullishBox = false; + bool hasPrevLastBullishBox = false; + XConsolidationZone lastBullishZone; + bool isLastBullishAbovePrev = false; + bool isLastBullishBelowPrev = false; + XConsolidationZone prevLastBullishZone; + + // + XBoxZone lastBearishBox; + XBoxZone prevLastBearishBox; + bool hasLastBearishBox = false; + bool hasPrevLastBearishBox = false; + XConsolidationZone lastBearishZone; + bool isLastBearishAbovePrev = false; + bool isLastBearishBelowPrev = false; + XConsolidationZone prevLastBearishZone; + + // + int bullishConsolidationZonesCount = 0; + int bearishConsolidationZonesCount = 0; + bool hasBullishConsolidationZones = false; + bool hasBearishConsolidationZones = false; + XConsolidationZone bullishConsolidationZones[]; + XConsolidationZone bearishConsolidationZones[]; + bool hasConsolidationZones = decisionCycleHelper.HasConsolidationZones(); + int consolidationZonesCount = decisionCycleHelper.CountConsolidationZones(); + if (hasConsolidationZones) + { + // + bullishConsolidationZonesCount = decisionCycleHelper + .FillConsolidationZones( + X_DIRECTION_BULLISH, + bullishConsolidationZones // + ); + hasBullishConsolidationZones = IsValidSize(bullishConsolidationZonesCount); + + // + bearishConsolidationZonesCount = decisionCycleHelper + .FillConsolidationZones( + X_DIRECTION_BEARISH, + bearishConsolidationZones // + ); + hasBearishConsolidationZones = IsValidSize(bearishConsolidationZonesCount); + + // + // + // + + // + if (hasBullishConsolidationZones && + bullishConsolidationZonesCount >= 2) + { + // + lastBullishZone = bullishConsolidationZones[bullishConsolidationZonesCount - 1]; + prevLastBullishZone = bullishConsolidationZones[bullishConsolidationZonesCount - 2]; + + // + hasLastBullishBox = ToBox( + lastBullishBox, + lastBullishZone // + ); + hasPrevLastBullishBox = ToBox( + prevLastBullishBox, + prevLastBullishZone // + ); + + // + isLastBullishAbovePrev = hasLastBullishBox && + hasPrevLastBullishBox && + IsBoxAbove( + lastBullishBox, + prevLastBullishBox // + ); + + // + isLastBullishBelowPrev = hasLastBullishBox && + hasPrevLastBullishBox && + IsBoxBelow( + lastBullishBox, + prevLastBullishBox // + ); + } + + // + if (hasBearishConsolidationZones && + bearishConsolidationZonesCount >= 2) + { + // + lastBearishZone = bearishConsolidationZones[bearishConsolidationZonesCount - 1]; + prevLastBearishZone = bearishConsolidationZones[bearishConsolidationZonesCount - 2]; + + // + hasLastBearishBox = ToBox( + lastBearishBox, + lastBearishZone // + ); + hasPrevLastBearishBox = ToBox( + prevLastBearishBox, + prevLastBearishZone // + ); + + // + isLastBearishAbovePrev = hasLastBearishBox && + hasPrevLastBearishBox && + IsBoxAbove( + lastBearishBox, + prevLastBearishBox // + ); + + // + isLastBearishBelowPrev = hasLastBearishBox && + hasPrevLastBearishBox && + IsBoxBelow( + lastBearishBox, + prevLastBearishBox // + ); + } + + // + } + + // + // Detect High Probability Swings ... + bool isSwingLow = + // + cBar.low > pBar.low && + ppBar.low > pBar.low && + // + zBar.low > pBar.low + // + ; + bool isSwingHigh = + // + cBar.high < pBar.high && + ppBar.high < pBar.high && + // + zBar.high < pBar.high + // + ; + bool isStrongSwingLow = + pBar.IsBullish() && + pBar.GetLowShadow() >= pBar.GetBody() * 2; + bool isStrongSwingHigh = + pBar.IsBearish() && + pBar.GetHighShadow() >= pBar.GetBody() * 2; + + // + bool isStrongSwingLowAboveLastBullishBox = + isStrongSwingLow && + hasLastBullishBox && + pBar.low > lastBullishBox.upper; + + // + bool isStrongSwingHighBelowLastBearishBox = + isStrongSwingHigh && + hasLastBearishBox && + pBar.high < lastBearishBox.lower; + + // + // Here We Have all Requirements for Guarding Positions ... + + // + // Available Guards: + // X_121_SMC_GUARD_ACTION_NONE + // X_121_SMC_GUARD_ACTION_CLOSE + // X_121_SMC_GUARD_ACTION_CLOSE_ALL + // X_121_SMC_GUARD_ACTION_CLOSE_LONGS + // X_121_SMC_GUARD_ACTION_CLOSE_SHORTS + // X_121_SMC_GUARD_ACTION_PARTIAL_CLOSE + // X_121_SMC_GUARD_ACTION_TRAIL_STOP + // X_121_SMC_GUARD_ACTION_TRAIL_TARGET + // X_121_SMC_GUARD_ACTION_HEDGE + + // + // X_121_SMC_GUARD_ACTION_CLOSE: + // Close Specified Position on Specified Conditions ... + + // + // X_121_SMC_GUARD_ACTION_CLOSE_ALL: + // Close All Positions on Specified Conditions ... + + // + // X_121_SMC_GUARD_ACTION_CLOSE_LONGS: + // Close All Long Positions on Specified Conditions ... + + // + // X_121_SMC_GUARD_ACTION_CLOSE_SHORTS: + // Close All Short Positions on Specified Conditions ... + + // + // X_121_SMC_GUARD_ACTION_PARTIAL_CLOSE: + // Partial Close Specified Position on Specified Conditions ... + + // + // X_121_SMC_GUARD_ACTION_TRAIL_STOP: + // Trail Stop Specified Position on Specified Conditions ... + + // + // X_121_SMC_GUARD_ACTION_TRAIL_TARGET: + // Trail Target Specified Position on Specified Conditions ... + + // + // X_121_SMC_GUARD_ACTION_HEDGE: + // Hedge all Positions on Specified Conditions ... + + // + // Cleanup Collections ... + + // + Clean(ownPositions); + Clean(ownLongPositions); + Clean(ownShortPositions); + + // + zBar.Clean(); + cBar.Clean(); + pBar.Clean(); + ppBar.Clean(); + + // + Clean(visionPoiEvents); + Clean(analysePoiEvents); + Clean(visionCycleEvents); + Clean(decisionPoiEvents); + Clean(analyseCycleEvents); + Clean(decisionCycleEvents); + Clean(consolidationPoiEvents); + Clean(consolidationCycleEvents); + + // + visionState.Clean(); + analyseState.Clean(); + decisionState.Clean(); + visionConditions.Clean(); + analyseConditions.Clean(); + visionXConditions.Clean(); + decisionConditions.Clean(); + consolidationState.Clean(); + analyseXConditions.Clean(); + decisionXConditions.Clean(); + consolidationConditions.Clean(); + consolidationXConditions.Clean(); + + // + lastBullishBox.Clean(); + lastBearishBox.Clean(); + lastBullishZone.Clean(); + lastBearishZone.Clean(); + prevLastBullishBox.Clean(); + prevLastBearishBox.Clean(); + prevLastBullishZone.Clean(); + prevLastBearishZone.Clean(); + + // + count = ArraySize(guards); + result = IsValidSize(count); + + // + return result; + } + + // + // + // + + // + // Add Conditions to Conditions Collection ... + int AddConditionsIfNotExists( + int maxAllowed = 10 // + ) + { + // + int result = 0; + + // + bool isSetuped = IsValid(mConditions.setupTime) && + HasDirection(mConditions.dir); + if (!isSetuped) + { + return result; + } + + // + int count = ArraySize(mConditionsCollection); + if (IsValidSize(count)) + { + // + // Copy Original Items ... + X121SMCStrategyXSupDemOBSSignalConditions tmpItems[]; + Copy( + mConditionsCollection, + tmpItems // + ); + + // + // Prese Item Data ... + bool isBullish = IsBullish(mConditions.dir); + + // + for (int i = 0; i < count; i++) + { + // + X121SMCStrategyXSupDemOBSSignalConditions iItem = tmpItems[i]; + + // + bool canRemove = mConditions.dir == iItem.dir && + mConditions.pivot == iItem.pivot; + if (canRemove) + { + // + ArrayRemove( + mConditionsCollection, + i, + 1 // + ); + } + } + + // + Clean(tmpItems); + } + + // + AddRef( + mConditions, + mConditionsCollection // + ); + + // + // Remove Olds ... + CleanupArray( + mConditionsCollection, + maxAllowed // + ); + + // + result = ArraySize(mConditionsCollection); + + // + return result; + } + + // + // Draw Functions ... + // + + // + void RemoveDraws() + { + mObjects.Clear(); + } + + // + void RemoveWorkingZoneDraws() + { + mWorkingZoneObjects.Clear(); + } + + // + void DrawOrderBlock( + XCOrderBlock *ob, + XCPOIDrawer *drawer // + ) + { + // + if (ob == NULL || + drawer == NULL) + { + return; + } + + // + ENUM_X_DIRECTION forDir = ob.GetDirection(); + + // + color bullishColor = drawer.BarBullishColor(); + color bearishColor = drawer.BarBearishColor(); + color forColor = IsBullish(forDir) + ? bullishColor + : bearishColor; + + // + // Draw Order Block ... + XCBaseObject *obj; + bool isCreated = drawer.CreateOrderBlock( + ob, + obj // + ); + if (isCreated) + { + mObjects.Add(obj); + } + + // + ulong chartID = drawer.ChartIdentification(); + int subWindow = drawer.SubWindowIdentification(); + + // + XOHCL startedBar; + ENUM_X_DIRECTION startedDir; + bool isStarted = ob.IsStarted( + forDir, + startedBar, + startedDir // + ); + if (isStarted) + { + // + datetime to = startedBar.time + (PeriodSeconds(startedBar.period)); + + // + XCOHCLObject *obj; + bool isCreated = drawer.CreateBar( + startedBar, + obj, + to // + ); + if (isCreated) + { + // + obj.BodyColor(clrYellow); + obj.HighShadowColor(clrYellow); + obj.LowShadowColor(clrYellow); + + // + obj.BodyStyle(STYLE_SOLID); + obj.HighShadowStyle(STYLE_SOLID); + obj.LowShadowStyle(STYLE_SOLID); + + // + mObjects.Add(obj); + } + + // + string startVLineName = "Start_" + ob.GetTag(); + + // + CChartObjectVLine *startVLine; + startVLine = new CChartObjectVLine(); + isCreated = startVLine.Create( + chartID, + startVLineName, + subWindow, + startedBar.time // + ); + if (isCreated) + { + // + startVLine.Color(forColor); + + // + mObjects.Add(startVLine); + } + } + } + + // + void DrawFairValueGap( + XCFVG *fvg, + XCPOIDrawer *drawer // + ) + { + // + if (fvg == NULL || + drawer == NULL) + { + return; + } + + // + ENUM_X_DIRECTION forDir = fvg.GetDirection(); + + // + color bullishColor = drawer.BarBullishColor(); + color bearishColor = drawer.BarBearishColor(); + color forColor = IsBullish(forDir) + ? bullishColor + : bearishColor; + + // + // Draw Order Block ... + XCBaseObject *obj; + bool isCreated = drawer.CreateFairValueGap( + fvg, + obj // + ); + if (isCreated) + { + mObjects.Add(obj); + } + + // + ulong chartID = drawer.ChartIdentification(); + int subWindow = drawer.SubWindowIdentification(); + + // + XOHCL startedBar; + ENUM_X_DIRECTION startedDir; + bool isStarted = fvg.IsStarted( + forDir, + startedBar, + startedDir // + ); + if (isStarted) + { + // + datetime to = startedBar.time + (PeriodSeconds(startedBar.period)); + + // + XCOHCLObject *obj; + bool isCreated = drawer.CreateBar( + startedBar, + obj, + to // + ); + if (isCreated) + { + // + obj.BodyColor(clrYellow); + obj.HighShadowColor(clrYellow); + obj.LowShadowColor(clrYellow); + + // + obj.BodyStyle(STYLE_SOLID); + obj.HighShadowStyle(STYLE_SOLID); + obj.LowShadowStyle(STYLE_SOLID); + + // + mObjects.Add(obj); + } + + // + string startVLineName = "Start_" + fvg.GetTag(); + + // + CChartObjectVLine *startVLine; + startVLine = new CChartObjectVLine(); + isCreated = startVLine.Create( + chartID, + startVLineName, + subWindow, + startedBar.time // + ); + if (isCreated) + { + // + startVLine.Color(forColor); + + // + mObjects.Add(startVLine); + } + } + } + + // + void DrawWorkingZone( + X121SMCStrategyXSupDemOBSSignalConditions &conditions, + XCPOIDrawer *drawer // + ) + { + // + if (drawer == NULL) + { + return; + } + + // + bool isCreated = false; + + // + bool hasVisionHighestSupplyZone = conditions.HasVisionHighestSupplyZone(); + if (hasVisionHighestSupplyZone) + { + // + XCSupplyZoneObject *ivhSupObj; + isCreated = drawer.CreateSupplyZone( + conditions.visionHighestSupplyZone, + ivhSupObj // + ); + if (isCreated) + { + mWorkingZoneObjects.Add(ivhSupObj); + } + } + + // + bool hasConsolidationHighestSupplyZone = conditions.HasConsolidationHighestSupplyZone(); + if (hasConsolidationHighestSupplyZone) + { + // + XCSupplyZoneObject *ichSupObj; + isCreated = drawer.CreateSupplyZone( + conditions.consolidationHighestSupplyZone, + ichSupObj // + ); + if (isCreated) + { + mWorkingZoneObjects.Add(ichSupObj); + } + } + + // + bool hasVisionLowestDemandZone = conditions.HasVisionLowestDemandZone(); + if (hasVisionLowestDemandZone) + { + // + XCDemandZoneObject *ivlSupObj; + isCreated = drawer.CreateDemandZone( + conditions.visionLowestDemandZone, + ivlSupObj // + ); + if (isCreated) + { + mWorkingZoneObjects.Add(ivlSupObj); + } + } + + // + bool hasConsolidationLowestDemandZone = conditions.HasConsolidationLowestDemandZone(); + if (hasConsolidationLowestDemandZone) + { + // + XCDemandZoneObject *iclSupObj; + isCreated = drawer.CreateDemandZone( + conditions.consolidationLowestDemandZone, + iclSupObj // + ); + if (isCreated) + { + mWorkingZoneObjects.Add(iclSupObj); + } + } + + // + bool hasWorkingZone = conditions.workingZone.IsValid(); + if (hasWorkingZone) + { + // + string zonePrefix = "X121_WZ_" + conditions.workingZone.symbol + "_" + ToString(conditions.workingZone.period); + string fromStr = ToFormatString(conditions.workingZone.from); + string fromMD5 = ToMD5(fromStr); + + // + string upperName = zonePrefix + "_Upper_" + fromMD5; + string lowerName = zonePrefix + "_Lower_" + fromMD5; + string zoneUpperName = zonePrefix + "_ZoneUpper_" + fromMD5; + string zoneLowerName = zonePrefix + "_ZoneLower_" + fromMD5; + + // + string q1Name = zonePrefix + "_Q1_" + fromMD5; + string q2Name = zonePrefix + "_Q2_" + fromMD5; + string q3Name = zonePrefix + "_Q3_" + fromMD5; + + // + ulong chartID = drawer.ChartIdentification(); + int subWindow = drawer.SubWindowIdentification(); + + // + bool isCreated = false; + + // + // Lower ... + CChartObjectHLine *lowerHLine; + lowerHLine = new CChartObjectHLine(); + isCreated = lowerHLine.Create( + chartID, + lowerName, + subWindow, + conditions.workingZone.lower // + ); + if (isCreated) + { + // + lowerHLine.Color(clrLime); + mWorkingZoneObjects.Add(lowerHLine); + } + + // + CChartObjectHLine *upperHLine; + upperHLine = new CChartObjectHLine(); + isCreated = upperHLine.Create( + chartID, + upperName, + subWindow, + conditions.workingZone.upper // + ); + if (isCreated) + { + // + upperHLine.Color(clrLime); + mWorkingZoneObjects.Add(upperHLine); + } + + // + CChartObjectHLine *zoneLowerHLine; + zoneLowerHLine = new CChartObjectHLine(); + isCreated = zoneLowerHLine.Create( + chartID, + zoneLowerName, + subWindow, + conditions.workingZone.zoneLower // + ); + if (isCreated) + { + // + zoneLowerHLine.Color(clrRed); + mWorkingZoneObjects.Add(zoneLowerHLine); + } + + // + CChartObjectHLine *zoneUpperHLine; + zoneUpperHLine = new CChartObjectHLine(); + isCreated = zoneUpperHLine.Create( + chartID, + zoneUpperName, + subWindow, + conditions.workingZone.zoneUpper // + ); + if (isCreated) + { + // + zoneUpperHLine.Color(clrRed); + mWorkingZoneObjects.Add(zoneUpperHLine); + } + + // + CChartObjectHLine *quarter1HLine; + quarter1HLine = new CChartObjectHLine(); + isCreated = quarter1HLine.Create( + chartID, + q1Name, + subWindow, + conditions.workingZone.quarter1 // + ); + if (isCreated) + { + // + quarter1HLine.Color(clrYellow); + mWorkingZoneObjects.Add(quarter1HLine); + } + + // + CChartObjectHLine *quarter2HLine; + quarter2HLine = new CChartObjectHLine(); + isCreated = quarter2HLine.Create( + chartID, + q2Name, + subWindow, + conditions.workingZone.quarter2 // + ); + if (isCreated) + { + // + quarter2HLine.Color(clrYellow); + mWorkingZoneObjects.Add(quarter2HLine); + } + + // + CChartObjectHLine *quarter3HLine; + quarter3HLine = new CChartObjectHLine(); + isCreated = quarter3HLine.Create( + chartID, + q3Name, + subWindow, + conditions.workingZone.quarter3 // + ); + if (isCreated) + { + // + quarter3HLine.Color(clrYellow); + mWorkingZoneObjects.Add(quarter3HLine); + } + } + } + + // + void DrawConditions( + X121SMCStrategyXSupDemOBSSignalConditions &conditions, + XCPOIDrawer *drawer, + bool forceClean = false // + ) + { + // + if (drawer == NULL) + { + return; + } + + // + if (forceClean) + { + mObjects.Clear(); + } + + // + bool isCreated = false; + + // + int obFVGsCount = ArraySize(conditions.obFVGs); + bool hasOBFVGs = IsValidSize(obFVGsCount); + if (hasOBFVGs) + { + // + for (int i = 0; i < obFVGsCount; i++) + { + // + XOBFVG iOBFVG = conditions.obFVGs[i]; + + // + DrawOrderBlock( + iOBFVG.ob, + drawer // + ); + + // + DrawFairValueGap( + iOBFVG.fvg, + drawer // + ); + + // + int hasUnActivatedOBs = iOBFVG.HasUnActivatedOBs(); + int unActivatedOBsCount = iOBFVG.CountUnActivatedOBs(); + if (hasUnActivatedOBs) + { + // + for (int j = 0; j < unActivatedOBsCount; j++) + { + // + DrawOrderBlock( + iOBFVG.unActivatedOBs[j], + drawer // + ); + } + } + + // + int hasUnActivatedFVGs = iOBFVG.HasUnActivatedFVGs(); + int unActivatedFVGsCount = iOBFVG.CountUnActivatedFVGs(); + if (hasUnActivatedFVGs) + { + // + for (int j = 0; j < unActivatedFVGsCount; j++) + { + // + DrawFairValueGap( + iOBFVG.unActivatedFVGs[j], + drawer // + ); + } + } + } + } + + // + int insideZoneWidth = 1; + color insideZoneColor = clrYellow; + bool hasInsideOB = conditions.insideOB != NULL && + conditions.insideOB.IsValid(); + if (hasInsideOB) + { + // + bool isBullish = conditions.insideOB.IsBullish(); + + // + XCBaseObject *iObj = NULL; + isCreated = false; + if (isBullish) + { + // + XCBullishOrderBlockObject *iiObj; + isCreated = drawer.CreateBullishOrderBlock( + conditions.insideOB, + iiObj // + ); + + // + if (isCreated) + { + // + iiObj.ZoneColor(insideZoneColor); + iiObj.ZoneWidth(insideZoneWidth); + + // + iObj = (XCBaseObject *)iiObj; + } + } + else + { + // + XCBearishOrderBlockObject *iiObj; + isCreated = drawer.CreateBearishOrderBlock( + conditions.insideOB, + iiObj // + ); + + // + if (isCreated) + { + // + iiObj.ZoneColor(insideZoneColor); + iiObj.ZoneWidth(insideZoneWidth); + + // + iObj = (XCBaseObject *)iiObj; + } + } + + // + if (isCreated) + { + mObjects.Add(iObj); + } + } + + // + bool hasInsideFVG = conditions.insideFVG != NULL && + conditions.insideFVG.IsValid(); + if (hasInsideFVG) + { + // + bool isBullish = conditions.insideFVG.IsBullish(); + + // + XCBaseObject *iObj = NULL; + isCreated = false; + if (isBullish) + { + // + XCBullishFairValueGapObject *iiObj; + isCreated = drawer.CreateBullishFairValueGap( + conditions.insideFVG, + iiObj // + ); + + // + if (isCreated) + { + // + iiObj.ZoneColor(insideZoneColor); + iiObj.ZoneWidth(insideZoneWidth); + + // + iObj = (XCBaseObject *)iiObj; + } + } + else + { + // + XCBearishFairValueGapObject *iiObj; + isCreated = drawer.CreateBearishFairValueGap( + conditions.insideFVG, + iiObj // + ); + + // + if (isCreated) + { + // + iiObj.ZoneColor(insideZoneColor); + iiObj.ZoneWidth(insideZoneWidth); + + // + iObj = (XCBaseObject *)iiObj; + } + } + + // + if (isCreated) + { + mObjects.Add(iObj); + } + } + + // + bool hasConsolidationZone = conditions.consolidationZone.IsValid(); + if (hasConsolidationZone) + { + // + XCConsolidationZoneObject *iObj; + isCreated = drawer.CreateConsolidationZone( + conditions.consolidationZone, + iObj // + ); + + // + if (isCreated) + { + mObjects.Add(iObj); + } + } + } + + // + protected: + // + + // + private: + // + // Props ... + CArrayObj mObjects; + CArrayObj mWorkingZoneObjects; + + /** + * Initialize ... + */ + void Init() + { + } + + /** + * DeInitialize ... + */ + void DeInit() + { + // + RemoveDraws(); + mConditions.Clean(); + RemoveWorkingZoneDraws(); + Clean(mConditionsCollection); + } + + // + // Helpers ... + + // + bool CheckPriceInside( + XOHCL &zBar, + XOHCL &cBar, + double upper, + double lower // + ) + { + // + bool result = false; + + // + result = zBar.IsValid() && + cBar.IsValid() && + upper > 0 && + lower > 0 && + upper > lower && + zBar.time > cBar.time; + if (!result) + { + return result; + } + + // + result = + // + zBar.high < upper && + cBar.high < upper && + // + zBar.low > lower && + cBar.low > lower + // + ; + + // + return result; + } + + // + bool CalculateRiskReward( + ENUM_X121SMC_XSUPDEMOBS_PRIORITY priority, + double &reward, + double &amountPercent // + ) + { + // + bool result = false; + + // + reward = 0; + amountPercent = 0; + + // + result = priority != X121SMC_XSUPDEMOBS_PRIORITY_NONE; + if (!result) + { + return result; + } + + // + switch (priority) + { + // + case X121SMC_XSUPDEMOBS_PRIORITY_HIGH: + // + reward = 6; + amountPercent = 2; + break; + + // + case X121SMC_XSUPDEMOBS_PRIORITY_REGULAR: + // + reward = 6; + amountPercent = 1.5; + break; + + // + case X121SMC_XSUPDEMOBS_PRIORITY_LOW: + // + reward = 4; + amountPercent = 1; + break; + + // + case X121SMC_XSUPDEMOBS_PRIORITY_WEAK: + // + reward = 2; + amountPercent = 0.5; + break; + } + + // + result = + // + reward > 0 && + amountPercent > 0 + // + ; + + // + return result; + } + + // +}; + +// \ No newline at end of file diff --git a/BKPS/14031206/Documents/BKP/xsupdem/x-121.smc.xsupdemobs.signal.lib.mq5 b/BKPS/14031206/Documents/BKP/xsupdem/x-121.smc.xsupdemobs.signal.lib.mq5 new file mode 100644 index 0000000..c5df488 --- /dev/null +++ b/BKPS/14031206/Documents/BKP/xsupdem/x-121.smc.xsupdemobs.signal.lib.mq5 @@ -0,0 +1,1686 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 X121 SMC Signal Class +// ------------------------------------------------- +// Name: XSupDemOBS +// Description: provide all Signalling 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 + +// +// Imports ... +// #include "../../Libraries/x-trade.lib" +#include "../Classes/x-121.smc.market.cycle.helper.class.mq5" +#include "../Libraries/x-121.smc.guard.lib.mq5" +#include "../Libraries/x-121.smc.lib.mq5" + +// +enum ENUM_X121SMC_XSUPDEMOBS_PRIORITY +{ + X121SMC_XSUPDEMOBS_PRIORITY_NONE, + X121SMC_XSUPDEMOBS_PRIORITY_WEAK, + X121SMC_XSUPDEMOBS_PRIORITY_LOW, + X121SMC_XSUPDEMOBS_PRIORITY_REGULAR, + X121SMC_XSUPDEMOBS_PRIORITY_HIGH, +}; + +// +struct XOBFVG +{ + // + string symbol; + ENUM_TIMEFRAMES period; + + // + datetime time; + + // + XCOrderBlock *ob; + XCFVG *fvg; + + // + XCFVG *unActivatedFVGs[]; + XCOrderBlock *unActivatedOBs[]; + + // + XOBFVG() + { + Clean(); + } + + // + void Clean() + { + // + ob = NULL; + fvg = NULL; + time = NULL; + symbol = NULL; + period = NULL; + + // + Clean(unActivatedOBs); + Clean(unActivatedFVGs); + + // + ZeroMemory(this); + } + + // + bool IsValid() + { + // + bool result = false; + + // + result = + // + ob != NULL && + ob.IsValid() && + fvg != NULL && + fvg.IsValid() && + ob.From() < fvg.From() && + IsValid(time) && + IsValid(symbol) && + IsValid(period) + // + ; + if (!result) + { + return result; + } + + // + ENUM_X_DIRECTION mDir = GetDirection(); + + // + // Validate Order Block ... + + // + // Validate Started Zones ... + XOHCL obStartedBar; + ENUM_X_DIRECTION obStartedDir; + bool isStarted = ob.IsStarted( + mDir, + obStartedBar, + obStartedDir // + ); + result = isStarted; + if (!result) + { + return result; + } + + // + // Validate InActive Zone ... + XOHCL obActivatedBar; + ENUM_X_DIRECTION obActivatedDir; + bool isActivated = ob.IsActivated( + mDir, + obActivatedBar, + obActivatedDir // + ); + result = !isActivated; + if (!result) + { + return result; + } + + // + // Validate Zone Iverse Breake ... + XOHCL obBreakedBar; + ENUM_X_DIRECTION obBreakedDir; + bool isBreaked = ob.IsBreaked( + Opposit(mDir), + obBreakedBar, + obBreakedDir, + true // Ignore Activation ... + ); + result = !isBreaked; + if (!result) + { + return result; + } + + // + // Checking Dirction(s) ... + result = + HasDirection(mDir) && + mDir == fvg.GetDirection(); + if (!result) + { + return result; + } + + // + // Validate FVG From Date ... + + // + // Checking FVG Place ... + + // + bool isBullish = IsBullish(mDir); + + // + bool isAbove = IsAboveDiff( + fvg, + ob, + true // Ignore Inside ... + ); + + // + bool isBelow = IsBelowDiff( + fvg, + ob, + true // Ignore Inside ... + ); + + // + result = + isBullish + ? isAbove + : isBelow; + if (!result) + { + return result; + } + + // + // Check FVG Must Be Started ... + XOHCL fvgStartedBar; + ENUM_X_DIRECTION fvgStartedDir; + isStarted = fvg.IsStarted( + mDir, + fvgStartedBar, + fvgStartedDir // + ); + result = isStarted; + if (!result) + { + return result; + } + + // + // Check FVg Not Breaked in Reversal Direction ... + XOHCL fvgBreakedBar; + ENUM_X_DIRECTION fvgBreakedDir; + isBreaked = fvg.IsBreaked( + Opposit(mDir), + fvgBreakedBar, + fvgBreakedDir, + true // Ignore Activation ... + ); + result = !isBreaked; + if (!result) + { + return result; + } + + // + return result; + } + + // + ENUM_X_DIRECTION GetDirection() + { + return ob.GetDirection(); + } + + // + int CountUnActivatedOBs() + { + return ArraySize(unActivatedOBs); + } + + // + bool HasUnActivatedOBs() + { + return IsValidSize(CountUnActivatedOBs()); + } + + // + bool AddUnActivatedOB( + XCOrderBlock *_ob, + XOHCL &bar // + ) + { + // + bool result = false; + + // + result = IsValid() && + bar.IsValid() && + _ob != NULL && + _ob.IsValid(); + if (!result) + { + return result; + } + + // + // Check Order Block is not Same as Current OB ... + bool isSame = IsSame( + _ob, + ob // + ); + result = !isSame; + if (!result) + { + return result; + } + + // + ENUM_X_DIRECTION mDir = GetDirection(); + bool isBullish = IsBullish(mDir); + + // + // Check Bars ... + XOHCL pBar; + result = bar.GetPreviousBar(pBar); + if (!result) + { + return result; + } + + // + bool isPricePassed = + isBullish + ? IsAbove( + bar.low, + _ob // + ) && + IsAbove( + pBar.low, + _ob // + ) + : IsBelow( + bar.high, + _ob // + ) && + IsBelow( + pBar.high, + _ob // + ); + result = isPricePassed; + if (!result) + { + return result; + } + + // + // Validate Order Block is Not Activated ... + + // + // Validate Started Zones ... + XOHCL obStartedBar; + ENUM_X_DIRECTION obStartedDir; + bool isStarted = _ob.IsStarted( + mDir, + obStartedBar, + obStartedDir // + ); + result = isStarted; + if (!result) + { + return result; + } + + // + // Validate InActive Zone ... + XOHCL obActivatedBar; + ENUM_X_DIRECTION obActivatedDir; + bool isActivated = _ob.IsActivated( + mDir, + obActivatedBar, + obActivatedDir // + ); + result = !isActivated; + if (!result) + { + return result; + } + + // + // Validate Zone Iverse Breake ... + XOHCL obBreakedBar; + ENUM_X_DIRECTION obBreakedDir; + bool isBreaked = _ob.IsBreaked( + Opposit(mDir), + obBreakedBar, + obBreakedDir, + true // Ignore Activation ... + ); + result = !isBreaked; + if (!result) + { + return result; + } + + // + int idx = FindIndex( + _ob, + unActivatedOBs // + ); + result = !IsValidIndex(idx); + if (!result) + { + return result; + } + + // + bool isLastPassed = true; + bool isAboveLast = false; + bool isBelowLast = false; + XCOrderBlock *lastOB = NULL; + int unActivatedOBsCount = CountUnActivatedOBs(); + bool hasUnActivatedOBs = HasUnActivatedOBs(); + if (hasUnActivatedOBs) + { + lastOB = unActivatedOBs[unActivatedOBsCount - 1]; + } + bool hasLastOB = lastOB != NULL && + lastOB.IsValid(); + if (hasLastOB) + { + // + isAboveLast = IsAbove( + _ob, + lastOB, + true // Ignore Inside ... + ); + + // + isBelowLast = IsBelow( + _ob, + lastOB, + true // Ignore Inside ... + ); + + // + isLastPassed = + isBullish + ? isAboveLast + : isBelowLast; + } + result = isLastPassed; + if (!result) + { + return result; + } + + // + Add( + _ob, + unActivatedOBs // + ); + + // + return result; + } + + // + int CountUnActivatedFVGs() + { + return ArraySize(unActivatedFVGs); + } + + // + bool HasUnActivatedFVGs() + { + return IsValidSize(CountUnActivatedFVGs()); + } + + // + bool AddUnActivatedFVG( + XCFVG *_fvg, + XOHCL &bar // + ) + { + // + bool result = false; + + // + result = IsValid() && + bar.IsValid() && + _fvg != NULL && + _fvg.IsValid(); + if (!result) + { + return result; + } + + // + // Check Order Block is not Same as Current OB ... + bool isSame = IsSame( + _fvg, + fvg // + ); + result = !isSame; + if (!result) + { + return result; + } + + // + ENUM_X_DIRECTION mDir = GetDirection(); + bool isBullish = IsBullish(mDir); + + // + // Check Bars ... + XOHCL pBar; + result = bar.GetPreviousBar(pBar); + if (!result) + { + return result; + } + + // + bool isPricePassed = + isBullish + ? IsAbove( + bar.low, + _fvg // + ) && + IsAbove( + pBar.low, + _fvg // + ) + : IsBelow( + bar.high, + _fvg // + ) && + IsBelow( + pBar.high, + _fvg // + ); + result = isPricePassed; + if (!result) + { + return result; + } + + // + // Validate Order Block is Not Activated ... + + // + // Validate Started Zones ... + XOHCL fvgStartedBar; + ENUM_X_DIRECTION fvgStartedDir; + bool isStarted = _fvg.IsStarted( + mDir, + fvgStartedBar, + fvgStartedDir // + ); + result = isStarted; + if (!result) + { + return result; + } + + // + // Validate InActive Zone ... + XOHCL fvgActivatedBar; + ENUM_X_DIRECTION fvgActivatedDir; + bool isActivated = _fvg.IsActivated( + mDir, + fvgActivatedBar, + fvgActivatedDir // + ); + result = !isActivated; + if (!result) + { + return result; + } + + // + // Validate Zone Iverse Breake ... + XOHCL fvgBreakedBar; + ENUM_X_DIRECTION fvgBreakedDir; + bool isBreaked = _fvg.IsBreaked( + Opposit(mDir), + fvgBreakedBar, + fvgBreakedDir, + true // Ignore Activation ... + ); + result = !isBreaked; + if (!result) + { + return result; + } + + // + int idx = FindIndex( + _fvg, + unActivatedFVGs // + ); + result = !IsValidIndex(idx); + if (!result) + { + return result; + } + + // + XCFVG *lastFVG = NULL; + bool isLastPassed = true; + bool isAboveLast = false; + bool isBelowLast = false; + int unActivatedFVGsCount = CountUnActivatedFVGs(); + bool hasUnActivatedFVGs = HasUnActivatedFVGs(); + if (hasUnActivatedFVGs) + { + lastFVG = unActivatedFVGs[unActivatedFVGsCount - 1]; + } + bool hasLastFVG = lastFVG != NULL && + lastFVG.IsValid(); + if (hasLastFVG) + { + // + isAboveLast = IsAbove( + _fvg, + lastFVG, + true // Ignore Inside ... + ); + + // + isBelowLast = IsBelow( + _fvg, + lastFVG, + true // Ignore Inside ... + ); + + // + isLastPassed = + isBullish + ? isAboveLast + : isBelowLast; + } + result = isLastPassed; + if (!result) + { + return result; + } + + // + Add( + _fvg, + unActivatedFVGs // + ); + + // + return result; + } +}; + +// +struct X121SMCXSupDemOBSWorkingZone +{ + // + string symbol; + ENUM_TIMEFRAMES period; + + // + double upper; + double lower; + + // + double zoneUpper; + double zoneLower; + + // + double quarter1; + double quarter2; + double quarter3; + + // + datetime from; + + // + X121SMCXSupDemOBSWorkingZone() + { + Clean(); + } + + // + void Clean() + { + // + upper = 0; + lower = 0; + quarter1 = 0; + quarter2 = 0; + quarter3 = 0; + zoneLower = 0; + zoneUpper = 0; + + // + from = NULL; + symbol = NULL; + period = NULL; + + // + ZeroMemory(this); + } + + // + bool IsValid() + { + // + bool result = false; + + // + result = + lower > 0 && + upper > 0 && + quarter1 > 0 && + quarter2 > 0 && + quarter3 > 0 && + upper > lower && + zoneLower > 0 && + zoneUpper > 0 && + IsValid(from) && + IsValid(symbol) && + IsValid(period) && + zoneUpper > upper && + zoneLower < lower; + + // + return result; + } + + // + bool DetectOveralTrend( + XOHCL &touchedBar, + ENUM_X_DIRECTION &trendDir, + int barIndex = 0 // + ) + { + // + bool result = false; + + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + trendDir = X_DIRECTION_NONE; + + // + result = IsValid(); + if (!result) + { + return result; + } + + // + int fromBarIndex = iBarShift( + symbol, + period, + from // + ); + result = IsValidIndex(fromBarIndex); + if (!result) + { + return result; + } + + // + XOHCL nearestUpperTouchedBar; + XOHCL nearestLowerTouchedBar; + bool hasNearestUpperTouchedBar = false; + bool hasNearestLowerTouchedBar = false; + for (int i = barIndex; i < fromBarIndex; i++) + { + // + XOHCL iBar; + bool isInited = iBar.Init( + symbol, + period, + i // + ); + + // + hasNearestUpperTouchedBar = nearestUpperTouchedBar.IsValid(); + if (!hasNearestUpperTouchedBar) + { + // + bool isBarTouchedUpper = iBar.high > upper; + if (isBarTouchedUpper) + { + // + nearestUpperTouchedBar = iBar; + hasNearestUpperTouchedBar = true; + } + } + + // + hasNearestLowerTouchedBar = nearestLowerTouchedBar.IsValid(); + if (!hasNearestLowerTouchedBar) + { + // + bool isBarTouchedLower = iBar.low < lower; + if (isBarTouchedLower) + { + // + nearestLowerTouchedBar = iBar; + hasNearestLowerTouchedBar = true; + } + } + + // + if (hasNearestUpperTouchedBar && + hasNearestLowerTouchedBar) + { + break; + } + } + + // + result = hasNearestUpperTouchedBar || + hasNearestLowerTouchedBar; + if (result) + { + // + if (hasNearestUpperTouchedBar && + !hasNearestLowerTouchedBar) + { + // + trendDir = X_DIRECTION_BEARISH; + touchedBar = nearestUpperTouchedBar; + } + else if (!hasNearestUpperTouchedBar && + hasNearestLowerTouchedBar) + { + // + trendDir = X_DIRECTION_BULLISH; + touchedBar = nearestLowerTouchedBar; + } + else if (hasNearestUpperTouchedBar && + hasNearestLowerTouchedBar) + { + // + trendDir = + nearestUpperTouchedBar.time < nearestLowerTouchedBar.time + ? X_DIRECTION_BULLISH + : X_DIRECTION_BEARISH; + + // + if (IsBullish(trendDir)) + { + touchedBar = nearestLowerTouchedBar; + } + else + { + touchedBar = nearestUpperTouchedBar; + } + } + } + + // + return result; + } + + // + bool IsDestroyed( + ENUM_X_DIRECTION &destroyedDir, + int barIndex = 0, + ENUM_TIMEFRAMES forPeriod = NULL // + ) + { + // + bool result = false; + + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + if (!IsValid(forPeriod)) + { + forPeriod = period; + } + + // + destroyedDir = X_DIRECTION_NONE; + + // + result = IsValid(); + if (!result) + { + return result; + } + + // + XOHCL bar; + result = bar.Init( + symbol, + forPeriod, + barIndex // + ); + if (!result) + { + return result; + } + + // + bool isUpperBreaked = + bar.high > zoneUpper && + bar.close > zoneUpper; + + // + bool isLowerBreaked = + bar.low < zoneLower && + bar.close < zoneLower; + + // + result = isUpperBreaked || + isLowerBreaked; + if (result) + { + // + destroyedDir = + isUpperBreaked + ? X_DIRECTION_BULLISH + : X_DIRECTION_BEARISH; + } + + // + return result; + } + + // +}; + +// +// Definitions ... +struct X121SMCStrategyXSupDemOBSSignalConditions +{ + // + // Props ... + + // + string symbol; + ENUM_TIMEFRAMES period; + + // + double sl; + double target; + double reward; + double amountPercent; + ENUM_X_DIRECTION dir; + ENUM_X_POSITION_TYPES type; + + // + // Setup Props ... + + // + datetime setupTime; + datetime triggerTime; + + // + double pivot; + double point; + + // + ENUM_X121SMC_XSUPDEMOBS_PRIORITY priority; + + // + // Working Zone ... + + // + XCSupplyZone *visionHighestSupplyZone; + XCSupplyZone *consolidationHighestSupplyZone; + + // + XCDemandZone *visionLowestDemandZone; + XCDemandZone *consolidationLowestDemandZone; + + // + XCFVG *insideFVG; + XCOrderBlock *insideOB; + + // + XCFVG *rejectedFVG; + XCOrderBlock *rejectedOB; + + // + XCSupplyZone *insideSupplyZone; + XCDemandZone *insideDemandZone; + + // + XConsolidationZone consolidationZone; + + // + XOBFVG obFVGs[]; + + // + X121SMCXSupDemOBSWorkingZone workingZone; + + // + // Constructor ... + X121SMCStrategyXSupDemOBSSignalConditions() + { + Clean(); + } + + // + // Tools ... + + /** + * Cleaning Up ... + */ + void Clean() + { + // + sl = 0; + target = 0; + + // + dir = X_DIRECTION_NONE; + type = X_POSITION_TYPE_NONE; + + // + symbol = NULL; + period = NULL; + setupTime = NULL; + triggerTime = NULL; + + // + ExtensionClean(); + + // + ZeroMemory(this); + } + + /** + * Check Condition is Setting Up ... + * + * @param dir: ENUM_X_DIRECTION member, Setting Up Direction ... + * + * @return ( bool ) + */ + bool IsSetuped() + { + // + bool result = false; + + // + result = IsValid(setupTime) && + HasDirection(dir); + if (!result) + { + return result; + } + + // + return result; + } + + /** + * Calculate Setup Age ... + * + * @return ( int ) + */ + int GetSetupAge() + { + // + int result = 0; + + // + if (!IsSetuped()) + { + return result; + } + + // + result = (int)(TimeCurrent() - setupTime) / PeriodSeconds(period); + + // + return result; + } + + /** + * Detect How we Can Trigger Signal ... + * + * @return ( bool ) + */ + bool CanTrigger() + { + // + bool result = false; + + // + result = + // + sl > 0 && + IsValid(symbol) && + IsValid(period) && + IsValid(triggerTime) && + type != X_POSITION_TYPE_ALL && + type != X_POSITION_TYPE_NONE + // + ; + + // + return result; + } + + // + // Extensions ... + + /** + * Clean Additional Properties ... + */ + void ExtensionClean() + { + // + pivot = 0; + point = 0; + + // + reward = 0; + amountPercent = 0; + + // + Clean(obFVGs); + workingZone.Clean(); + consolidationZone.Clean(); + + // + insideOB = NULL; + insideFVG = NULL; + rejectedOB = NULL; + rejectedFVG = NULL; + insideSupplyZone = NULL; + insideDemandZone = NULL; + + // + visionLowestDemandZone = NULL; + visionHighestSupplyZone = NULL; + consolidationLowestDemandZone = NULL; + consolidationHighestSupplyZone = NULL; + + // + ZeroMemory(visionLowestDemandZone); + ZeroMemory(visionHighestSupplyZone); + ZeroMemory(consolidationLowestDemandZone); + ZeroMemory(consolidationHighestSupplyZone); + + // + priority = X121SMC_XSUPDEMOBS_PRIORITY_NONE; + } + + // + // + // + + // + bool HasVisionHighestSupplyZone() + { + // + return visionHighestSupplyZone != NULL && + visionHighestSupplyZone.IsValid(); + } + + // + bool HasConsolidationHighestSupplyZone() + { + // + return consolidationHighestSupplyZone != NULL && + consolidationHighestSupplyZone.IsValid(); + } + + // + bool HasVisionLowestDemandZone() + { + // + return visionLowestDemandZone != NULL && + visionLowestDemandZone.IsValid(); + } + + // + bool HasConsolidationLowestDemandZone() + { + // + return consolidationLowestDemandZone != NULL && + consolidationLowestDemandZone.IsValid(); + } + + // + // X_DIRECTION_BULLISH: + // Supply Zone of Consolidation Cycle appears inside + // Supply Zone of Vision Cycle ... + // + // X_DIRECTION_BEARISH: + // Demnad Zone of Consolidation Cycle appears inside + // Demnad Zone of Vision Cycle ... + bool HasHighImpactSide(ENUM_X_DIRECTION &highImpactDir) + { + // + bool result = false; + + // + highImpactDir = X_DIRECTION_NONE; + + // + bool isSupplyInside = false; + bool hasVisionHighestSupplyZone = HasVisionHighestSupplyZone(); + bool hasConsolidationHighestSupplyZone = HasConsolidationHighestSupplyZone(); + if (hasVisionHighestSupplyZone && + hasConsolidationHighestSupplyZone) + { + isSupplyInside = IsInside( + consolidationHighestSupplyZone, + visionHighestSupplyZone // + ); + } + + // + bool isDemandInside = false; + bool hasVisionLowestDemandZone = HasVisionLowestDemandZone(); + bool hasConsolidationLowestDemandZone = HasConsolidationLowestDemandZone(); + if (hasVisionLowestDemandZone && + hasConsolidationLowestDemandZone) + { + // + isDemandInside = IsInside( + consolidationLowestDemandZone, + visionLowestDemandZone // + ); + } + + // + result = isSupplyInside || + isDemandInside; + if (result) + { + // + highImpactDir = + isSupplyInside + ? X_DIRECTION_BULLISH + : X_DIRECTION_BEARISH; + } + + // + return result; + } + + // + datetime ExtractNearestFromDate() + { + // + datetime result = NULL; + + // + bool hasVisionLowestDemandZone = HasVisionLowestDemandZone(); + bool hasVisionHighestSupplyZone = HasVisionHighestSupplyZone(); + bool hasConsolidationLowestDemandZone = HasConsolidationLowestDemandZone(); + bool hasConsolidationHighestSupplyZone = HasConsolidationHighestSupplyZone(); + if (hasVisionLowestDemandZone) + { + // + bool canSet = + !IsValid(result) + ? true + : visionLowestDemandZone.From() > result; + if (canSet) + { + result = visionLowestDemandZone.From(); + } + } + if (hasVisionHighestSupplyZone) + { + // + bool canSet = + !IsValid(result) + ? true + : visionHighestSupplyZone.From() > result; + if (canSet) + { + result = visionHighestSupplyZone.From(); + } + } + if (hasConsolidationLowestDemandZone) + { + // + bool canSet = + !IsValid(result) + ? true + : consolidationLowestDemandZone.From() > result; + if (canSet) + { + result = consolidationLowestDemandZone.From(); + } + } + if (hasConsolidationHighestSupplyZone) + { + // + bool canSet = + !IsValid(result) + ? true + : consolidationHighestSupplyZone.From() > result; + if (canSet) + { + result = consolidationHighestSupplyZone.From(); + } + } + + // + return result; + } + + // + datetime ExtractFarestFromDate() + { + // + datetime result = NULL; + + // + bool hasVisionLowestDemandZone = HasVisionLowestDemandZone(); + bool hasVisionHighestSupplyZone = HasVisionHighestSupplyZone(); + bool hasConsolidationLowestDemandZone = HasConsolidationLowestDemandZone(); + bool hasConsolidationHighestSupplyZone = HasConsolidationHighestSupplyZone(); + if (hasVisionLowestDemandZone) + { + // + bool canSet = + !IsValid(result) + ? true + : visionLowestDemandZone.From() < result; + if (canSet) + { + result = visionLowestDemandZone.From(); + } + } + if (hasVisionHighestSupplyZone) + { + // + bool canSet = + !IsValid(result) + ? true + : visionHighestSupplyZone.From() < result; + if (canSet) + { + result = visionHighestSupplyZone.From(); + } + } + if (hasConsolidationLowestDemandZone) + { + // + bool canSet = + !IsValid(result) + ? true + : consolidationLowestDemandZone.From() < result; + if (canSet) + { + result = consolidationLowestDemandZone.From(); + } + } + if (hasConsolidationHighestSupplyZone) + { + // + bool canSet = + !IsValid(result) + ? true + : consolidationHighestSupplyZone.From() < result; + if (canSet) + { + result = consolidationHighestSupplyZone.From(); + } + } + + // + return result; + } + + // + int CountOBFVGs() + { + return ArraySize(obFVGs); + } + + // + bool HasOBFVGs() + { + return IsValidSize(CountOBFVGs()); + } + + // + // Working Zone is an Area which + // we decide to trade inside it ... + bool ExtractWorkingZone( + int barIndex = 0, + ENUM_TIMEFRAMES forPeriod = NULL // + ) + { + // + bool result = false; + + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + if (!IsValid(forPeriod)) + { + forPeriod = period; + } + + // + result = workingZone.IsValid(); + if (result) + { + return result; + } + + // + XOHCL bar; + result = bar.Init( + symbol, + forPeriod, + barIndex // + ); + + // + double upper = 0; + double lower = 0; + double quarter1 = 0; + double quarter2 = 0; + double quarter3 = 0; + double zoneUpper = 0; + double zoneLower = 0; + + // + ENUM_X_DIRECTION highImpactDir; + bool hasHighImpactSide = HasHighImpactSide(highImpactDir); + result = hasHighImpactSide; + if (!result) + { + return result; + } + + // + // Select Newest Zone From time ... + datetime from = ExtractFarestFromDate(); + + // + bool isSupplyHighImpacted = IsBullish(highImpactDir); + bool isDemandHighImpacted = IsBearish(highImpactDir); + + // + if (isSupplyHighImpacted) + { + // + upper = visionHighestSupplyZone.Lower(); + if (HasConsolidationLowestDemandZone()) + { + lower = consolidationLowestDemandZone.Upper(); + } + else + { + lower = visionLowestDemandZone.Upper(); + } + + // + zoneUpper = visionHighestSupplyZone.Upper(); + if (HasConsolidationLowestDemandZone()) + { + zoneLower = consolidationLowestDemandZone.Lower(); + } + else + { + zoneLower = visionLowestDemandZone.Lower(); + } + } + else + { + // + if (HasConsolidationHighestSupplyZone()) + { + upper = consolidationHighestSupplyZone.Lower(); + } + else + { + upper = visionHighestSupplyZone.Lower(); + } + lower = visionLowestDemandZone.Upper(); + + // + if (HasConsolidationHighestSupplyZone()) + { + zoneUpper = consolidationHighestSupplyZone.Upper(); + } + else + { + zoneUpper = visionHighestSupplyZone.Upper(); + } + zoneLower = visionLowestDemandZone.Lower(); + } + + // + result = + lower > 0 && + upper > 0 && + upper > lower && + zoneUpper > 0 && + zoneLower > 0 && + zoneUpper > upper && + zoneLower < lower; + if (!result) + { + return result; + } + + // + double range = (upper - lower) / 100; + double quarter = range * 25; + + // + quarter1 = upper - (1 * quarter); + quarter2 = upper - (2 * quarter); + quarter3 = upper - (3 * quarter); + + // + workingZone.from = from; + workingZone.upper = upper; + workingZone.lower = lower; + workingZone.symbol = symbol; + workingZone.period = period; + workingZone.quarter1 = quarter1; + workingZone.quarter2 = quarter2; + workingZone.quarter3 = quarter3; + workingZone.zoneUpper = zoneUpper; + workingZone.zoneLower = zoneLower; + + // + result = workingZone.IsValid(); + + // + return result; + } + + // + bool IsWorkingZoneDestroyed( + ENUM_X_DIRECTION &destroyedDir, + int barIndex = 0, + ENUM_TIMEFRAMES forPeriod = NULL // + ) + { + // + bool result = false; + + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + if (!IsValid(forPeriod)) + { + forPeriod = period; + } + + // + destroyedDir = X_DIRECTION_NONE; + + // + result = workingZone.IsValid(); + if (!result) + { + return result; + } + + // + result = workingZone.IsDestroyed( + destroyedDir, + barIndex, + forPeriod // + ); + + // + return result; + } + + // + bool DetectOveralTrend( + XOHCL &touchedBar, + ENUM_X_DIRECTION &trendDir, + int barIndex = 0 // + ) + { + // + bool result = false; + + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + trendDir = X_DIRECTION_NONE; + + // + result = workingZone.IsValid(); + if (!result) + { + return result; + } + + // + result = workingZone.DetectOveralTrend( + touchedBar, + trendDir, + barIndex // + ); + + // + return result; + } + + // + void UpdateTo(datetime value = NULL) + { + // + value = NormalizeTime(value); + + // + bool hasVisionLowestDemandZone = HasVisionLowestDemandZone(); + if (hasVisionLowestDemandZone) + { + visionLowestDemandZone.To(value); + } + + bool hasVisionHighestSupplyZone = HasVisionHighestSupplyZone(); + if (hasVisionHighestSupplyZone) + { + visionHighestSupplyZone.To(value); + } + + bool hasConsolidationLowestDemandZone = HasConsolidationLowestDemandZone(); + if (hasConsolidationLowestDemandZone) + { + consolidationLowestDemandZone.To(value); + } + + bool hasConsolidationHighestSupplyZone = HasConsolidationHighestSupplyZone(); + if (hasConsolidationHighestSupplyZone) + { + consolidationHighestSupplyZone.To(value); + } + + // + bool hasInsideOB = insideOB != NULL && + insideOB.IsValid(); + if (hasInsideOB) + { + insideOB.To(value); + } + + // + bool hasInsideFVG = insideFVG != NULL && + insideFVG.IsValid(); + if (hasInsideFVG) + { + insideFVG.To(value); + } + + // + bool hasOBFVGs = HasOBFVGs(); + int obFVGsCount = CountOBFVGs(); + if (hasOBFVGs) + { + // + for (int i = 0; i < obFVGsCount; i++) + { + // + obFVGs[i].ob.To(value); + obFVGs[i].fvg.To(value); + + // + bool hasUnActivatedOBs = obFVGs[i].HasUnActivatedOBs(); + int unActivatedOBsCount = obFVGs[i].CountUnActivatedOBs(); + if (hasUnActivatedOBs) + { + // + for (int j = 0; j < unActivatedOBsCount; j++) + { + obFVGs[i].unActivatedOBs[j].To(value); + } + } + + // + bool hasUnActivatedFVGs = obFVGs[i].HasUnActivatedFVGs(); + int unActivatedFVGsCount = obFVGs[i].CountUnActivatedFVGs(); + if (hasUnActivatedFVGs) + { + // + for (int j = 0; j < unActivatedFVGsCount; j++) + { + obFVGs[i].unActivatedFVGs[j].To(value); + } + } + } + } + } + + // +}; diff --git a/BKPS/14031206/Documents/BKP/xsupdem/x-121.smc.xwz.signal.class.mq5 b/BKPS/14031206/Documents/BKP/xsupdem/x-121.smc.xwz.signal.class.mq5 new file mode 100644 index 0000000..757942e --- /dev/null +++ b/BKPS/14031206/Documents/BKP/xsupdem/x-121.smc.xwz.signal.class.mq5 @@ -0,0 +1,2996 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 X121 SMC Signal Class +// ------------------------------------------------- +// Name: XWZ +// Description: provide all Signalling 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 + +// +// Imports ... +#include "../Classes/x-121.smc.market.cycle.helper.class.mq5" +#include "../Libraries/x-121.smc.guard.lib.mq5" +#include "../Libraries/x-121.smc.lib.mq5" +#include "./x-121.smc.xwz.signal.lib.mq5" + +// +// Definition ... +class XCX121SMCXWZSignalDetector : public XCBase +{ + // + public: + // + // Props ... + X121SMCStrategyXWZSignalConditions mConditions; + X121SMCStrategyXWZSignalConditions mConditionsCollection[]; + + // + // Constructor(s) ... + XCX121SMCXWZSignalDetector() + { + Init(); + } + + // + // Deconstructor ... + ~XCX121SMCXWZSignalDetector() + { + DeInit(); + } + + // + // + // + + // + // Detect Setup Conditions ... + bool DetectSignalSetup( + // + string _symbol, + ENUM_TIMEFRAMES _period, + // + XC121SMCCycleHelper *decisionCycleHelper, + XC121SMCCycleHelper *analyseCycleHelper, + XC121SMCCycleHelper *consolidationCycleHelper, + XC121SMCCycleHelper *visionCycleHelper + // + ) + { + // + bool result = false; + + // + // Validate Cycle Helpers ... + result = + // + visionCycleHelper != NULL && + analyseCycleHelper != NULL && + decisionCycleHelper != NULL && + consolidationCycleHelper != NULL + // + ; + if (!result) + { + // + mConditions.Clean(); + + // + return result; + } + + // + bool isBullish = false; + bool isBearish = false; + + // + int zIndex = 0; + int cIndex = zIndex + 1; + int pIndex = cIndex + 1; + int ppIndex = pIndex + 1; + + // + int loopback = 10; + + // + string symbol = _symbol; + ENUM_TIMEFRAMES period = _period; + + // + mConditions.symbol = symbol; + mConditions.period = period; + + // + double ask = GetAsk(symbol); + double bid = GetBid(symbol); + datetime cTime = TimeCurrent(); + double points = GetPoints(symbol); + + // + double target = 0; + + // + // Cycles Conditions ... + + // + // Decision ... + ENUM_XPOI_EVENTS decisionPoiEvents[]; + ENUM_X_CYCLE_EVENTS decisionCycleEvents[]; + X121SMCCycleConditions decisionConditions; + result = decisionCycleHelper.GetConditions( + decisionCycleEvents, + decisionPoiEvents, + decisionConditions, + zIndex, + loopback // + ); + if (!result) + { + // + mConditions.Clean(); + + // + return result; + } + + // + // Analyse ... + ENUM_XPOI_EVENTS analysePoiEvents[]; + ENUM_X_CYCLE_EVENTS analyseCycleEvents[]; + X121SMCCycleConditions analyseConditions; + result = analyseCycleHelper.GetConditions( + analyseCycleEvents, + analysePoiEvents, + analyseConditions, + zIndex, + loopback // + ); + if (!result) + { + // + mConditions.Clean(); + + // + return result; + } + + // + // Consolidation ... + ENUM_XPOI_EVENTS consolidationPoiEvents[]; + ENUM_X_CYCLE_EVENTS consolidationCycleEvents[]; + X121SMCCycleConditions consolidationConditions; + result = consolidationCycleHelper.GetConditions( + consolidationCycleEvents, + consolidationPoiEvents, + consolidationConditions, + zIndex, + loopback // + ); + if (!result) + { + // + mConditions.Clean(); + + // + return result; + } + + // + // Vision ... + ENUM_XPOI_EVENTS visionPoiEvents[]; + ENUM_X_CYCLE_EVENTS visionCycleEvents[]; + X121SMCCycleConditions visionConditions; + result = visionCycleHelper.GetConditions( + visionCycleEvents, + visionPoiEvents, + visionConditions, + zIndex, + loopback // + ); + if (!result) + { + // + mConditions.Clean(); + + // + return result; + } + + // + // Cycles POI States ... + XPOIState decisionState = decisionConditions.state; + XPOIState analyseState = analyseConditions.state; + XPOIState consolidationState = consolidationConditions.state; + XPOIState visionState = visionConditions.state; + + // + // Cycle X121Conditions ... + X121Conditions decisionXConditions = decisionConditions.x121Conditions; + X121Conditions analyseXConditions = analyseConditions.x121Conditions; + X121Conditions consolidationXConditions = consolidationConditions.x121Conditions; + X121Conditions visionXConditions = visionConditions.x121Conditions; + + // + // Setup Conditions ... + + // + XOHCL decisionZBar; + XOHCL decisionCBar; + XOHCL decisionPBar; + double decisionCBarBullishZoneChechValue = 0; + double decisionCBarBearishZoneChechValue = 0; + + // + result = decisionZBar.Init( + decisionState.symbol, + decisionState.period, + 0 // + ); + if (!result) + { + // + Clean(visionPoiEvents); + Clean(analysePoiEvents); + Clean(decisionPoiEvents); + Clean(visionCycleEvents); + Clean(analyseCycleEvents); + Clean(decisionCycleEvents); + Clean(consolidationPoiEvents); + Clean(consolidationCycleEvents); + + // + visionState.Clean(); + analyseState.Clean(); + decisionZBar.Clean(); + decisionCBar.Clean(); + decisionPBar.Clean(); + decisionState.Clean(); + visionConditions.Clean(); + analyseConditions.Clean(); + visionXConditions.Clean(); + consolidationState.Clean(); + decisionConditions.Clean(); + analyseXConditions.Clean(); + decisionXConditions.Clean(); + consolidationConditions.Clean(); + consolidationXConditions.Clean(); + + // + mConditions.Clean(); + + // + return result; + } + + // + result = decisionZBar + .GetPreviousBar(decisionCBar); + if (!result) + { + // + Clean(visionPoiEvents); + Clean(analysePoiEvents); + Clean(decisionPoiEvents); + Clean(visionCycleEvents); + Clean(analyseCycleEvents); + Clean(decisionCycleEvents); + Clean(consolidationPoiEvents); + Clean(consolidationCycleEvents); + + // + visionState.Clean(); + analyseState.Clean(); + decisionZBar.Clean(); + decisionCBar.Clean(); + decisionPBar.Clean(); + decisionState.Clean(); + visionConditions.Clean(); + analyseConditions.Clean(); + visionXConditions.Clean(); + consolidationState.Clean(); + decisionConditions.Clean(); + analyseXConditions.Clean(); + decisionXConditions.Clean(); + consolidationConditions.Clean(); + consolidationXConditions.Clean(); + + // + mConditions.Clean(); + + // + return result; + } + + // + result = decisionCBar + .GetPreviousBar(decisionPBar); + if (!result) + { + // + Clean(visionPoiEvents); + Clean(analysePoiEvents); + Clean(decisionPoiEvents); + Clean(visionCycleEvents); + Clean(analyseCycleEvents); + Clean(decisionCycleEvents); + Clean(consolidationPoiEvents); + Clean(consolidationCycleEvents); + + // + visionState.Clean(); + analyseState.Clean(); + decisionZBar.Clean(); + decisionCBar.Clean(); + decisionPBar.Clean(); + decisionState.Clean(); + visionConditions.Clean(); + analyseConditions.Clean(); + visionXConditions.Clean(); + consolidationState.Clean(); + decisionConditions.Clean(); + analyseXConditions.Clean(); + decisionXConditions.Clean(); + consolidationConditions.Clean(); + consolidationXConditions.Clean(); + + // + mConditions.Clean(); + + // + return result; + } + + // + decisionCBarBullishZoneChechValue = decisionCBar + .GetZoneCheckValue(X_DIRECTION_BULLISH); + decisionCBarBearishZoneChechValue = decisionCBar + .GetZoneCheckValue(X_DIRECTION_BEARISH); + + // + // Check Working Zone ... + bool hasWorkingZone = mConditions.HasWorkingZone(); + if (!hasWorkingZone) + { + // + hasWorkingZone = mConditions.ExtractWorkingZone( + visionState, + consolidationState, + analyseState, + zIndex // + ); + } + + // + result = hasWorkingZone; + if (!result) + { + // + Clean(visionPoiEvents); + Clean(analysePoiEvents); + Clean(decisionPoiEvents); + Clean(visionCycleEvents); + Clean(analyseCycleEvents); + Clean(decisionCycleEvents); + Clean(consolidationPoiEvents); + Clean(consolidationCycleEvents); + + // + visionState.Clean(); + analyseState.Clean(); + decisionZBar.Clean(); + decisionCBar.Clean(); + decisionPBar.Clean(); + decisionState.Clean(); + visionConditions.Clean(); + analyseConditions.Clean(); + visionXConditions.Clean(); + consolidationState.Clean(); + decisionConditions.Clean(); + analyseXConditions.Clean(); + decisionXConditions.Clean(); + consolidationConditions.Clean(); + consolidationXConditions.Clean(); + + // + RemoveDraws(); + RemoveWorkingZoneDraws(); + + // + mConditions.Clean(); + + // + return result; + } + + // + mConditions.UpdateTo(cTime); + + // + // Check Working Zone still Alive ... + ENUM_X_DIRECTION destroyedDir = X_DIRECTION_NONE; + bool isWorkingZoneDestroyed = mConditions + .IsWorkingZoneDestroyed( + destroyedDir, + zIndex, + decisionState.period // + ); + if (isWorkingZoneDestroyed) + { + RemoveWorkingZoneDraws(); + } + + // + result = !isWorkingZoneDestroyed; + if (!result) + { + // + Clean(visionPoiEvents); + Clean(analysePoiEvents); + Clean(decisionPoiEvents); + Clean(visionCycleEvents); + Clean(analyseCycleEvents); + Clean(decisionCycleEvents); + Clean(consolidationPoiEvents); + Clean(consolidationCycleEvents); + + // + visionState.Clean(); + analyseState.Clean(); + decisionZBar.Clean(); + decisionCBar.Clean(); + decisionPBar.Clean(); + decisionState.Clean(); + visionConditions.Clean(); + analyseConditions.Clean(); + visionXConditions.Clean(); + consolidationState.Clean(); + decisionConditions.Clean(); + analyseXConditions.Clean(); + decisionXConditions.Clean(); + consolidationConditions.Clean(); + consolidationXConditions.Clean(); + + // + RemoveDraws(); + RemoveWorkingZoneDraws(); + + // + mConditions.Clean(); + + // + return result; + } + + // + // Detecting Trend ... + ENUM_X_DIRECTION trend; + bool hasTrend = mConditions.DetectTrend( + trend, + period // + ); + bool hasBullishTrend = hasTrend && + IsBullish(trend); + bool hasBearishTrend = hasTrend && + IsBearish(trend); + result = hasTrend; + if (!result) + { + // + Clean(visionPoiEvents); + Clean(analysePoiEvents); + Clean(decisionPoiEvents); + Clean(visionCycleEvents); + Clean(analyseCycleEvents); + Clean(decisionCycleEvents); + Clean(consolidationPoiEvents); + Clean(consolidationCycleEvents); + + // + visionState.Clean(); + analyseState.Clean(); + decisionZBar.Clean(); + decisionCBar.Clean(); + decisionPBar.Clean(); + decisionState.Clean(); + visionConditions.Clean(); + analyseConditions.Clean(); + visionXConditions.Clean(); + consolidationState.Clean(); + decisionConditions.Clean(); + analyseXConditions.Clean(); + decisionXConditions.Clean(); + consolidationConditions.Clean(); + consolidationXConditions.Clean(); + + // + RemoveDraws(); + RemoveWorkingZoneDraws(); + + // + mConditions.Clean(); + + // + return result; + } + + // + // Detect Start Zones ... + bool hasStartZone = mConditions.HasStartZone(); + if (!hasStartZone) + { + // + hasStartZone = mConditions.DetectStartZone( + trend, + analyseState, + decisionCycleHelper // + ); + } + + // + mConditions.UpdateTo(cTime); + + // + // Detect Condition Priority ... + ENUM_X121SMC_XWZ_PRIORITY bullishPriority; + ENUM_X121SMC_XWZ_PRIORITY bearishPriority; + mConditions.DetectPriority( + bullishPriority, + bearishPriority // + ); + + // + bool canLookupLong = bullishPriority != X121SMC_XWZ_PRIORITY_NONE && + bullishPriority != X121SMC_XWZ_PRIORITY_WEAK; + bool canLookupShort = bearishPriority != X121SMC_XWZ_PRIORITY_NONE && + bearishPriority != X121SMC_XWZ_PRIORITY_WEAK; + bool isPriorityPassed = + hasBullishTrend + ? canLookupLong + : hasBearishTrend + ? canLookupShort + : false; + + // + double pivot = 0; + double point = 0; + bool hasCondition = false; + ENUM_X_DIRECTION conditionsDir = X_DIRECTION_NONE; + + // + // Detect Start Zone Based Conditions ... + if (hasStartZone) + { + // + DrawConditions( + mConditions, + visionCycleHelper.mPOIDrawer // + ); + + // + // Detect Start Zone Conditions ... + hasCondition = mConditions + .startZone + .HasCondition( + decisionState, + zIndex, + NULL // period // + ); + conditionsDir = mConditions + .startZone + .GetDirection(); + if (hasCondition) + { + // + XBoxZone startZoneBox; + bool hasBox = mConditions.startZone.AsBox(startZoneBox); + if (hasBox) + { + // + bool isBullish = IsBullish(conditionsDir); + + // + pivot = + isBullish + ? startZoneBox.lower + : startZoneBox.upper; + + // + point = + isBullish + ? startZoneBox.upper + : startZoneBox.lower; + } + } + } + + // + RemoveWorkingZoneDraws(); + DrawWorkingZone(mConditions, visionCycleHelper.mPOIDrawer); + + // + // Detect Supply and Deman Zone Based Conditions ... + if (!hasCondition) + { + // + bool isPriceInsideSupplyZone = + bearishPriority == X121SMC_XWZ_PRIORITY_STRONG_HIGH; + + // + bool isPriceInsideDemandZone = + bullishPriority == X121SMC_XWZ_PRIORITY_STRONG_HIGH; + + // + bool isPriceInsideSupDem = isPriceInsideSupplyZone || + isPriceInsideDemandZone; + if (isPriceInsideSupDem) + { + // + hasCondition = mConditions.HasWorkingZoneConditions( + conditionsDir, + decisionState // + ); + + // + if (hasCondition) + { + // + if (IsBullish(conditionsDir)) + { + // + pivot = mConditions.demandZone.Lower(); + point = mConditions.demandZone.Upper(); + } + else if (IsBearish(conditionsDir)) + { + // + pivot = mConditions.supplyZone.Upper(); + point = mConditions.supplyZone.Lower(); + } + } + } + } + + // + isBullish = IsBullish(conditionsDir); + isBearish = IsBearish(conditionsDir); + + // + double reward; + double amountPercent; + ENUM_X121SMC_XWZ_PRIORITY priority = + isBullish + ? bullishPriority + : bearishPriority; + bool hasRewardAmount = CalculateRiskReward( + priority, + reward, + amountPercent // + ); + + // + bool hasLastBullishConsolidationZone = false; + bool hasLastBearishConsolidationZone = false; + bool hasPrevBullishConsolidationZone = false; + bool hasPrevBearishConsolidationZone = false; + XConsolidationZone lastBullishConsolidationZone; + XConsolidationZone lastBearishConsolidationZone; + XConsolidationZone prevBullishConsolidationZone; + XConsolidationZone prevBearishConsolidationZone; + bool hasConsolidationZones = decisionCycleHelper.HasConsolidationZones(); + if (hasConsolidationZones) + { + // + int cZCount = 0; + XConsolidationZone tmp[]; + + // + cZCount = decisionCycleHelper + .FillConsolidationZones( + X_DIRECTION_BULLISH, + tmp // + ); + if (IsValidSize(cZCount)) + { + // + lastBullishConsolidationZone = tmp[cZCount - 1]; + if (cZCount >= 2) + { + prevBullishConsolidationZone = tmp[cZCount - 2]; + } + } + + // + Clean(tmp); + cZCount = decisionCycleHelper + .FillConsolidationZones( + X_DIRECTION_BEARISH, + tmp // + ); + if (IsValidSize(cZCount)) + { + // + lastBearishConsolidationZone = tmp[cZCount - 1]; + if (cZCount >= 2) + { + prevBearishConsolidationZone = tmp[cZCount - 2]; + } + } + + // + Clean(tmp); + + // + hasLastBullishConsolidationZone = lastBullishConsolidationZone.IsValid(); + hasLastBearishConsolidationZone = lastBearishConsolidationZone.IsValid(); + hasPrevBullishConsolidationZone = prevBullishConsolidationZone.IsValid(); + hasPrevBearishConsolidationZone = prevBearishConsolidationZone.IsValid(); + } + + // + RemoveDraws(); + + // + if (hasLastBullishConsolidationZone) + { + // + XCConsolidationZoneObject *iObj; + bool isCreated = visionCycleHelper + .mPOIDrawer + .CreateConsolidationZone( + lastBullishConsolidationZone, + iObj // + ); + if (isCreated) + { + mObjects.Add(iObj); + } + } + + // + if (hasLastBearishConsolidationZone) + { + // + XCConsolidationZoneObject *iObj; + bool isCreated = visionCycleHelper + .mPOIDrawer + .CreateConsolidationZone( + lastBearishConsolidationZone, + iObj // + ); + if (isCreated) + { + mObjects.Add(iObj); + } + } + + // + if (hasPrevBullishConsolidationZone) + { + // + XCConsolidationZoneObject *iObj; + bool isCreated = visionCycleHelper + .mPOIDrawer + .CreateConsolidationZone( + prevBullishConsolidationZone, + iObj // + ); + if (isCreated) + { + mObjects.Add(iObj); + } + } + + // + if (hasPrevBearishConsolidationZone) + { + // + XCConsolidationZoneObject *iObj; + bool isCreated = visionCycleHelper + .mPOIDrawer + .CreateConsolidationZone( + prevBearishConsolidationZone, + iObj // + ); + if (isCreated) + { + mObjects.Add(iObj); + } + } + + // + bool isConsolidationZonePassed = + isBullish + ? (point > 0 && + hasPrevBullishConsolidationZone && + point >= prevBullishConsolidationZone.upper) + : (point > 0 && + hasPrevBearishConsolidationZone && + point <= prevBearishConsolidationZone.lower); + + // + result = hasCondition && + hasRewardAmount && + isPriorityPassed && + trend == conditionsDir && + isConsolidationZonePassed; + if (!result) + { + // + Clean(visionPoiEvents); + Clean(analysePoiEvents); + Clean(decisionPoiEvents); + Clean(visionCycleEvents); + Clean(analyseCycleEvents); + Clean(decisionCycleEvents); + Clean(consolidationPoiEvents); + Clean(consolidationCycleEvents); + + // + visionState.Clean(); + analyseState.Clean(); + decisionZBar.Clean(); + decisionCBar.Clean(); + decisionPBar.Clean(); + decisionState.Clean(); + visionConditions.Clean(); + analyseConditions.Clean(); + visionXConditions.Clean(); + consolidationState.Clean(); + decisionConditions.Clean(); + analyseXConditions.Clean(); + decisionXConditions.Clean(); + consolidationConditions.Clean(); + consolidationXConditions.Clean(); + + // + lastBullishConsolidationZone.Clean(); + lastBearishConsolidationZone.Clean(); + prevBullishConsolidationZone.Clean(); + prevBearishConsolidationZone.Clean(); + + // + mConditions.Clean(); + + // + return result; + } + + // + // Apply Traget ... + switch (priority) + { + // + case X121SMC_XWZ_PRIORITY_STRONG_HIGH: + // + target = + isBullish + ? mConditions.workingZone.quarter3 + : mConditions.workingZone.quarter1; + break; + + // + case X121SMC_XWZ_PRIORITY_HIGH: + // + target = + isBullish + ? mConditions.workingZone.quarter3 + : mConditions.workingZone.quarter1; + break; + + // + case X121SMC_XWZ_PRIORITY_REGULAR: + // + target = + isBullish + ? mConditions.workingZone.quarter2 + : mConditions.workingZone.quarter2; + break; + + // + case X121SMC_XWZ_PRIORITY_LOW: + // + target = + isBullish + ? mConditions.workingZone.quarter1 + : mConditions.workingZone.quarter3; + break; + + // + default: + target = 0; + break; + } + + // + mConditions.pivot = pivot; + mConditions.point = point; + mConditions.reward = reward; + mConditions.target = target; + mConditions.setupTime = cTime; + mConditions.priority = priority; + mConditions.dir = conditionsDir; + mConditions.amountPercent = amountPercent; + + // + mConditions.UpdateTo(cTime); + + // + DrawConditions( + mConditions, + visionCycleHelper.mPOIDrawer // + ); + + // + Clean(visionPoiEvents); + Clean(analysePoiEvents); + Clean(decisionPoiEvents); + Clean(visionCycleEvents); + Clean(analyseCycleEvents); + Clean(decisionCycleEvents); + Clean(consolidationPoiEvents); + Clean(consolidationCycleEvents); + + // + visionState.Clean(); + analyseState.Clean(); + decisionZBar.Clean(); + decisionCBar.Clean(); + decisionPBar.Clean(); + decisionState.Clean(); + visionConditions.Clean(); + analyseConditions.Clean(); + visionXConditions.Clean(); + consolidationState.Clean(); + decisionConditions.Clean(); + analyseXConditions.Clean(); + decisionXConditions.Clean(); + consolidationConditions.Clean(); + consolidationXConditions.Clean(); + + // + lastBullishConsolidationZone.Clean(); + lastBearishConsolidationZone.Clean(); + prevBullishConsolidationZone.Clean(); + prevBearishConsolidationZone.Clean(); + + // + return result; + } + + // + // Detect Trigger Conditions ... + bool DetectSignalTrigger( + // + X121SMCStrategyXWZSignalConditions &conditions, + // + string _symbol, + ENUM_TIMEFRAMES _period, + // + XC121SMCCycleHelper *decisionCycleHelper, + XC121SMCCycleHelper *analyseCycleHelper, + XC121SMCCycleHelper *consolidationCycleHelper, + XC121SMCCycleHelper *visionCycleHelper, + // + int maxAllowedSetupAge = 60 + // + ) + { + // + bool result = false; + + // + result = + // + visionCycleHelper != NULL && + analyseCycleHelper != NULL && + decisionCycleHelper != NULL && + consolidationCycleHelper != NULL + // + ; + if (!result) + { + return result; + } + + // + result = conditions.IsSetuped(); + if (!result) + { + return result; + } + + // + datetime setupTime = conditions.setupTime; + ENUM_X_DIRECTION setupDir = conditions.dir; + + // + bool isBullish = IsBullish(setupDir); + bool isBearish = IsBearish(setupDir); + + // + int zIndex = 0; + int cIndex = zIndex + 1; + int pIndex = cIndex + 1; + int ppIndex = pIndex + 1; + + // + int loopback = 10; + + // + string symbol = _symbol; + ENUM_TIMEFRAMES period = _period; + + // + XOHCL zBar; + result = decisionCycleHelper.GetBar( + zBar, + zIndex // + ); + if (!result) + { + return result; + } + + // + XOHCL cBar; + result = decisionCycleHelper.GetBar( + cBar, + cIndex // + ); + if (!result) + { + return result; + } + + // + XOHCL pBar; + result = decisionCycleHelper.GetBar( + pBar, + pIndex // + ); + if (!result) + { + return result; + } + + // + double ask = GetAsk(symbol); + double bid = GetBid(symbol); + datetime cTime = TimeCurrent(); + double points = GetPoints(symbol); + + // + int swingLoopback = 9; + double ll = cBar.FindLowest(swingLoopback, MODE_LOW); + double hh = cBar.FindHighest(swingLoopback, MODE_HIGH); + double llDown = cBar.FindLowesttDown(swingLoopback); + double hhUp = cBar.FindHighestUp(swingLoopback); + + // + // Cycles Conditions ... + + // + // Decision ... + ENUM_XPOI_EVENTS decisionPoiEvents[]; + ENUM_X_CYCLE_EVENTS decisionCycleEvents[]; + X121SMCCycleConditions decisionConditions; + result = decisionCycleHelper.GetConditions( + decisionCycleEvents, + decisionPoiEvents, + decisionConditions, + zIndex, + loopback // + ); + if (!result) + { + // + // Cleanup ... + zBar.Clean(); + cBar.Clean(); + pBar.Clean(); + + // + Clean(decisionPoiEvents); + Clean(decisionCycleEvents); + + // + decisionConditions.Clean(); + + // + return result; + } + + // + // Cycles POI States ... + XPOIState decisionState = decisionConditions.state; + + // + // Cycle X121Conditions ... + X121Conditions decisionXConditions = decisionConditions.x121Conditions; + + // + // Trigger Conditions ... + + // + double point = conditions.point; + bool isPointBreaked = IsBarBreak( + point, + setupDir, + cBar // + ); + + // + // Summary ... + + // + isBullish = + // + isBullish + // && + // isPointBreaked + // + ; + + // + isBearish = + // + isBearish + // && + // isPointBreaked + // + ; + + // + result = isBullish || + isBearish; + if (!result) + { + // + // Cleanup Setup Conditions ... + int setupAge = conditions.GetSetupAge(); + if (IsValidSize(setupAge) && + IsValidSize(maxAllowedSetupAge) && + setupAge >= maxAllowedSetupAge) + { + conditions.Clean(); + } + + // + // Cleanup ... + zBar.Clean(); + cBar.Clean(); + pBar.Clean(); + + // + Clean(decisionPoiEvents); + Clean(decisionCycleEvents); + + // + decisionState.Clean(); + decisionConditions.Clean(); + decisionXConditions.Clean(); + + // + return result; + } + + // + // Detect Nearest Pivot Point ... + + // + double entry = GetEntry( + conditions.symbol, + setupDir // + ); + + // + // Manipulate SL Based on Consolidation Zones ... + + // + double sls[]; + Add( + conditions.pivot, + sls // + ); + + // + double iAtr = decisionXConditions.atrBuffer[1]; + iAtr *= 2; + + // + double slsMin = GetMin(sls); + double slsMax = GetMax(sls); + + // + double sl = isBullish + ? slsMin - iAtr + : slsMax + iAtr; + double risk = MathAbs(entry - sl); + + // + // Filling Conditions Props ... + conditions.sl = sl; + conditions.triggerTime = cTime; + conditions.type = isBullish + ? X_POSITION_TYPE_LONG + : X_POSITION_TYPE_SHORT; + + // + // Cleanup ... + zBar.Clean(); + cBar.Clean(); + pBar.Clean(); + + // + Clean(decisionPoiEvents); + Clean(decisionCycleEvents); + + // + decisionState.Clean(); + decisionConditions.Clean(); + decisionXConditions.Clean(); + + // + return result; + } + + // + // Detect Guards ... + bool DetectGuards( + // + X121SMCGuard &guards[], + const XPosition &positions[], + // + XC121SMCCycleHelper *decisionCycleHelper, + XC121SMCCycleHelper *analyseCycleHelper, + XC121SMCCycleHelper *consolidationCycleHelper, + XC121SMCCycleHelper *visionCycleHelper + // + ) + { + // + bool result = false; + + // + Clean(guards); + + // + bool isCycleHelpersValid = + // + visionCycleHelper != NULL && + analyseCycleHelper != NULL && + decisionCycleHelper != NULL && + consolidationCycleHelper != NULL + // + ; + + // + // TODO: Implement Guards ... + return false; + + // + result = isCycleHelpersValid; + if (!result) + { + return result; + } + + // + int count = ArraySize(positions); + result = IsValidSize(count); + if (!result) + { + return result; + } + + // + string symbol = decisionCycleHelper.GetSymbol(); + ENUM_TIMEFRAMES period = decisionCycleHelper.GetPeriod(); + string provider = ToString(X_121_SMC_PROVIDER_XWZ); + + // + XPosition ownPositions[]; + XPosition ownLongPositions[]; + XPosition ownShortPositions[]; + for (int i = 0; i < count; i++) + { + // + XPosition iPosition = positions[i]; + bool isOwn = iPosition + .IsFiltersPassed( + symbol, + provider, + NULL, + X_POSITION_TYPE_ALL, + iPosition.magic // + ); + if (isOwn) + { + // + AddRef( + iPosition, + ownPositions // + ); + + // + bool isLong = IsLong(positions[i].type); + if (isLong) + { + // + AddRef( + iPosition, + ownLongPositions // + ); + } + else + { + // + AddRef( + iPosition, + ownShortPositions // + ); + } + } + } + + // + count = ArraySize(ownPositions); + + // + int longsCount = ArraySize(ownLongPositions); + bool hasLongs = IsValidSize(longsCount); + + // + int shortsCount = ArraySize(ownShortPositions); + bool hasShorts = IsValidSize(shortsCount); + + // + result = IsValidSize(count); + if (!result) + { + // + Clean(ownPositions); + Clean(ownLongPositions); + Clean(ownShortPositions); + + // + return result; + } + + // + // + // + + // + // Get Global and Common Guards ... + + // + ENUM_X_121_SMC_GUARD_ACTIONS ignoreGuards[1] = { + X_121_SMC_GUARD_ACTION_TRAIL_STOP}; + result = DetectX121SMCGuards( + provider, + guards, + positions, + decisionCycleHelper, + analyseCycleHelper, + consolidationCycleHelper, + visionCycleHelper, + // + ignoreGuards + // + ); + + // + // + // + + // + // Get Custom Implemented Guards ... + + // + // Here we Are Sure there is Positions to Guard ... + // based on Current Provider ... + + // + // Detect Required Data for Analyse Market to Guard Positions ... + + // + int zIndex = 0; + int cIndex = zIndex + 1; + int pIndex = cIndex + 1; + int ppIndex = pIndex + 1; + + // + int loopback = 10; + + // + XOHCL zBar; + result = zBar.Init( + symbol, + period, + zIndex // + ); + if (!result) + { + // + result = HasChild(guards); + return result; + } + + // + XOHCL cBar; + result = cBar.Init( + symbol, + period, + cIndex // + ); + if (!result) + { + // + zBar.Clean(); + result = HasChild(guards); + return result; + } + + // + XOHCL pBar; + result = pBar.Init( + symbol, + period, + pIndex // + ); + if (!result) + { + // + zBar.Clean(); + cBar.Clean(); + result = HasChild(guards); + return result; + } + + // + XOHCL ppBar; + result = ppBar.Init( + symbol, + period, + ppIndex // + ); + if (!result) + { + // + zBar.Clean(); + cBar.Clean(); + pBar.Clean(); + result = HasChild(guards); + return result; + } + + // + double ask = GetAsk(symbol); + double bid = GetBid(symbol); + datetime cTime = TimeCurrent(); + double points = GetPoints(symbol); + + // + + // + // Cycles Conditions ... + + // + // Decision ... + ENUM_XPOI_EVENTS decisionPoiEvents[]; + ENUM_X_CYCLE_EVENTS decisionCycleEvents[]; + X121SMCCycleConditions decisionConditions; + result = decisionCycleHelper.GetConditions( + decisionCycleEvents, + decisionPoiEvents, + decisionConditions, + zIndex, + loopback // + ); + if (!result) + { + // + zBar.Clean(); + cBar.Clean(); + pBar.Clean(); + ppBar.Clean(); + result = HasChild(guards); + return result; + } + + // + // Analyse ... + ENUM_XPOI_EVENTS analysePoiEvents[]; + ENUM_X_CYCLE_EVENTS analyseCycleEvents[]; + X121SMCCycleConditions analyseConditions; + result = analyseCycleHelper.GetConditions( + analyseCycleEvents, + analysePoiEvents, + analyseConditions, + zIndex, + loopback // + ); + if (!result) + { + // + zBar.Clean(); + cBar.Clean(); + pBar.Clean(); + ppBar.Clean(); + + // + Clean(decisionPoiEvents); + Clean(decisionCycleEvents); + + // + decisionConditions.Clean(); + + // + result = HasChild(guards); + return result; + } + + // + // Consolidation ... + ENUM_XPOI_EVENTS consolidationPoiEvents[]; + ENUM_X_CYCLE_EVENTS consolidationCycleEvents[]; + X121SMCCycleConditions consolidationConditions; + result = consolidationCycleHelper.GetConditions( + consolidationCycleEvents, + consolidationPoiEvents, + consolidationConditions, + zIndex, + loopback // + ); + if (!result) + { + // + zBar.Clean(); + cBar.Clean(); + pBar.Clean(); + ppBar.Clean(); + + // + Clean(decisionPoiEvents); + Clean(decisionCycleEvents); + + // + decisionConditions.Clean(); + + // + Clean(analysePoiEvents); + Clean(analyseCycleEvents); + + // + analyseConditions.Clean(); + + // + result = HasChild(guards); + return result; + } + + // + // Vision ... + ENUM_XPOI_EVENTS visionPoiEvents[]; + ENUM_X_CYCLE_EVENTS visionCycleEvents[]; + X121SMCCycleConditions visionConditions; + result = visionCycleHelper.GetConditions( + visionCycleEvents, + visionPoiEvents, + visionConditions, + zIndex, + loopback // + ); + if (!result) + { + // + zBar.Clean(); + cBar.Clean(); + pBar.Clean(); + ppBar.Clean(); + + // + Clean(decisionPoiEvents); + Clean(decisionCycleEvents); + + // + decisionConditions.Clean(); + + // + Clean(analysePoiEvents); + Clean(analyseCycleEvents); + + // + analyseConditions.Clean(); + + // + Clean(consolidationPoiEvents); + Clean(consolidationCycleEvents); + + // + consolidationConditions.Clean(); + + // + result = HasChild(guards); + return result; + } + + // + // Cycles POI States ... + XPOIState decisionState = decisionConditions.state; + XPOIState analyseState = analyseConditions.state; + XPOIState consolidationState = consolidationConditions.state; + XPOIState visionState = visionConditions.state; + + // + // Cycle X121Conditions ... + X121Conditions decisionXConditions = decisionConditions.x121Conditions; + X121Conditions analyseXConditions = analyseConditions.x121Conditions; + X121Conditions consolidationXConditions = consolidationConditions.x121Conditions; + X121Conditions visionXConditions = visionConditions.x121Conditions; + + // + // + // + + // + // Detect Consolidation Zone ... + + // + XBoxZone lastBullishBox; + XBoxZone prevLastBullishBox; + bool hasLastBullishBox = false; + bool hasPrevLastBullishBox = false; + XConsolidationZone lastBullishZone; + bool isLastBullishAbovePrev = false; + bool isLastBullishBelowPrev = false; + XConsolidationZone prevLastBullishZone; + + // + XBoxZone lastBearishBox; + XBoxZone prevLastBearishBox; + bool hasLastBearishBox = false; + bool hasPrevLastBearishBox = false; + XConsolidationZone lastBearishZone; + bool isLastBearishAbovePrev = false; + bool isLastBearishBelowPrev = false; + XConsolidationZone prevLastBearishZone; + + // + int bullishConsolidationZonesCount = 0; + int bearishConsolidationZonesCount = 0; + bool hasBullishConsolidationZones = false; + bool hasBearishConsolidationZones = false; + XConsolidationZone bullishConsolidationZones[]; + XConsolidationZone bearishConsolidationZones[]; + bool hasConsolidationZones = decisionCycleHelper.HasConsolidationZones(); + int consolidationZonesCount = decisionCycleHelper.CountConsolidationZones(); + if (hasConsolidationZones) + { + // + bullishConsolidationZonesCount = decisionCycleHelper + .FillConsolidationZones( + X_DIRECTION_BULLISH, + bullishConsolidationZones // + ); + hasBullishConsolidationZones = IsValidSize(bullishConsolidationZonesCount); + + // + bearishConsolidationZonesCount = decisionCycleHelper + .FillConsolidationZones( + X_DIRECTION_BEARISH, + bearishConsolidationZones // + ); + hasBearishConsolidationZones = IsValidSize(bearishConsolidationZonesCount); + + // + // + // + + // + if (hasBullishConsolidationZones && + bullishConsolidationZonesCount >= 2) + { + // + lastBullishZone = bullishConsolidationZones[bullishConsolidationZonesCount - 1]; + prevLastBullishZone = bullishConsolidationZones[bullishConsolidationZonesCount - 2]; + + // + hasLastBullishBox = ToBox( + lastBullishBox, + lastBullishZone // + ); + hasPrevLastBullishBox = ToBox( + prevLastBullishBox, + prevLastBullishZone // + ); + + // + isLastBullishAbovePrev = hasLastBullishBox && + hasPrevLastBullishBox && + IsBoxAbove( + lastBullishBox, + prevLastBullishBox // + ); + + // + isLastBullishBelowPrev = hasLastBullishBox && + hasPrevLastBullishBox && + IsBoxBelow( + lastBullishBox, + prevLastBullishBox // + ); + } + + // + if (hasBearishConsolidationZones && + bearishConsolidationZonesCount >= 2) + { + // + lastBearishZone = bearishConsolidationZones[bearishConsolidationZonesCount - 1]; + prevLastBearishZone = bearishConsolidationZones[bearishConsolidationZonesCount - 2]; + + // + hasLastBearishBox = ToBox( + lastBearishBox, + lastBearishZone // + ); + hasPrevLastBearishBox = ToBox( + prevLastBearishBox, + prevLastBearishZone // + ); + + // + isLastBearishAbovePrev = hasLastBearishBox && + hasPrevLastBearishBox && + IsBoxAbove( + lastBearishBox, + prevLastBearishBox // + ); + + // + isLastBearishBelowPrev = hasLastBearishBox && + hasPrevLastBearishBox && + IsBoxBelow( + lastBearishBox, + prevLastBearishBox // + ); + } + + // + } + + // + // Detect High Probability Swings ... + bool isSwingLow = + // + cBar.low > pBar.low && + ppBar.low > pBar.low && + // + zBar.low > pBar.low + // + ; + bool isSwingHigh = + // + cBar.high < pBar.high && + ppBar.high < pBar.high && + // + zBar.high < pBar.high + // + ; + bool isStrongSwingLow = + pBar.IsBullish() && + pBar.GetLowShadow() >= pBar.GetBody() * 2; + bool isStrongSwingHigh = + pBar.IsBearish() && + pBar.GetHighShadow() >= pBar.GetBody() * 2; + + // + bool isStrongSwingLowAboveLastBullishBox = + isStrongSwingLow && + hasLastBullishBox && + pBar.low > lastBullishBox.upper; + + // + bool isStrongSwingHighBelowLastBearishBox = + isStrongSwingHigh && + hasLastBearishBox && + pBar.high < lastBearishBox.lower; + + // + // Here We Have all Requirements for Guarding Positions ... + + // + // Available Guards: + // X_121_SMC_GUARD_ACTION_NONE + // X_121_SMC_GUARD_ACTION_CLOSE + // X_121_SMC_GUARD_ACTION_CLOSE_ALL + // X_121_SMC_GUARD_ACTION_CLOSE_LONGS + // X_121_SMC_GUARD_ACTION_CLOSE_SHORTS + // X_121_SMC_GUARD_ACTION_PARTIAL_CLOSE + // X_121_SMC_GUARD_ACTION_TRAIL_STOP + // X_121_SMC_GUARD_ACTION_TRAIL_TARGET + // X_121_SMC_GUARD_ACTION_HEDGE + + // + // X_121_SMC_GUARD_ACTION_CLOSE: + // Close Specified Position on Specified Conditions ... + + // + // X_121_SMC_GUARD_ACTION_CLOSE_ALL: + // Close All Positions on Specified Conditions ... + + // + // X_121_SMC_GUARD_ACTION_CLOSE_LONGS: + // Close All Long Positions on Specified Conditions ... + + // + // X_121_SMC_GUARD_ACTION_CLOSE_SHORTS: + // Close All Short Positions on Specified Conditions ... + + // + // X_121_SMC_GUARD_ACTION_PARTIAL_CLOSE: + // Partial Close Specified Position on Specified Conditions ... + + // + // X_121_SMC_GUARD_ACTION_TRAIL_STOP: + // Trail Stop Specified Position on Specified Conditions ... + + // + // X_121_SMC_GUARD_ACTION_TRAIL_TARGET: + // Trail Target Specified Position on Specified Conditions ... + + // + // X_121_SMC_GUARD_ACTION_HEDGE: + // Hedge all Positions on Specified Conditions ... + + // + // Cleanup Collections ... + + // + Clean(ownPositions); + Clean(ownLongPositions); + Clean(ownShortPositions); + + // + zBar.Clean(); + cBar.Clean(); + pBar.Clean(); + ppBar.Clean(); + + // + Clean(visionPoiEvents); + Clean(analysePoiEvents); + Clean(visionCycleEvents); + Clean(decisionPoiEvents); + Clean(analyseCycleEvents); + Clean(decisionCycleEvents); + Clean(consolidationPoiEvents); + Clean(consolidationCycleEvents); + + // + visionState.Clean(); + analyseState.Clean(); + decisionState.Clean(); + visionConditions.Clean(); + analyseConditions.Clean(); + visionXConditions.Clean(); + decisionConditions.Clean(); + consolidationState.Clean(); + analyseXConditions.Clean(); + decisionXConditions.Clean(); + consolidationConditions.Clean(); + consolidationXConditions.Clean(); + + // + lastBullishBox.Clean(); + lastBearishBox.Clean(); + lastBullishZone.Clean(); + lastBearishZone.Clean(); + prevLastBullishBox.Clean(); + prevLastBearishBox.Clean(); + prevLastBullishZone.Clean(); + prevLastBearishZone.Clean(); + + // + count = ArraySize(guards); + result = IsValidSize(count); + + // + return result; + } + + // + // + // + + // + // Add Conditions to Conditions Collection ... + int AddConditionsIfNotExists( + int maxAllowed = 10 // + ) + { + // + int result = 0; + + // + bool isSetuped = IsValid(mConditions.setupTime) && + HasDirection(mConditions.dir); + if (!isSetuped) + { + return result; + } + + // + int count = ArraySize(mConditionsCollection); + if (IsValidSize(count)) + { + // + // Copy Original Items ... + X121SMCStrategyXWZSignalConditions tmpItems[]; + Copy( + mConditionsCollection, + tmpItems // + ); + + // + // Prese Item Data ... + bool isBullish = IsBullish(mConditions.dir); + + // + for (int i = 0; i < count; i++) + { + // + X121SMCStrategyXWZSignalConditions iItem = tmpItems[i]; + + // + bool canRemove = mConditions.dir == iItem.dir && + mConditions.pivot == iItem.pivot; + if (canRemove) + { + // + ArrayRemove( + mConditionsCollection, + i, + 1 // + ); + } + } + + // + Clean(tmpItems); + } + + // + AddRef( + mConditions, + mConditionsCollection // + ); + + // + // Remove Olds ... + CleanupArray( + mConditionsCollection, + maxAllowed // + ); + + // + result = ArraySize(mConditionsCollection); + + // + return result; + } + + // + // Draw Functions ... + // + + // + void RemoveDraws() + { + mObjects.Clear(); + } + + // + void RemoveWorkingZoneDraws() + { + mWorkingZoneObjects.Clear(); + } + + // + void DrawOrderBlock( + XCOrderBlock *ob, + XCPOIDrawer *drawer, + bool forWorkingZone = false // + ) + { + // + if (ob == NULL || + drawer == NULL) + { + return; + } + + // + ENUM_X_DIRECTION forDir = ob.GetDirection(); + + // + color bullishColor = drawer.BarBullishColor(); + color bearishColor = drawer.BarBearishColor(); + color forColor = IsBullish(forDir) + ? bullishColor + : bearishColor; + + // + // Draw Order Block ... + XCBaseObject *obj; + bool isCreated = drawer.CreateOrderBlock( + ob, + obj // + ); + if (isCreated) + { + // + if (forWorkingZone) + { + mWorkingZoneObjects.Add(obj); + } + else + { + mObjects.Add(obj); + } + } + + // + ulong chartID = drawer.ChartIdentification(); + int subWindow = drawer.SubWindowIdentification(); + + // + XOHCL startedBar; + ENUM_X_DIRECTION startedDir; + bool isStarted = ob.IsStarted( + forDir, + startedBar, + startedDir // + ); + if (isStarted) + { + // + datetime to = startedBar.time + (PeriodSeconds(startedBar.period)); + + // + XCOHCLObject *obj; + bool isCreated = drawer.CreateBar( + startedBar, + obj, + to // + ); + if (isCreated) + { + // + obj.BodyColor(clrYellow); + obj.HighShadowColor(clrYellow); + obj.LowShadowColor(clrYellow); + + // + obj.BodyStyle(STYLE_SOLID); + obj.HighShadowStyle(STYLE_SOLID); + obj.LowShadowStyle(STYLE_SOLID); + + // + if (forWorkingZone) + { + mWorkingZoneObjects.Add(obj); + } + else + { + mObjects.Add(obj); + } + } + + // + string startVLineName = "Start_" + ob.GetTag(); + + // + CChartObjectVLine *startVLine; + startVLine = new CChartObjectVLine(); + isCreated = startVLine.Create( + chartID, + startVLineName, + subWindow, + startedBar.time // + ); + if (isCreated) + { + // + startVLine.Color(forColor); + + // + if (forWorkingZone) + { + mWorkingZoneObjects.Add(startVLine); + } + else + { + mObjects.Add(startVLine); + } + } + } + } + + // + void DrawFairValueGap( + XCFVG *fvg, + XCPOIDrawer *drawer, + bool forWorkingZone = false // + ) + { + // + if (fvg == NULL || + drawer == NULL) + { + return; + } + + // + ENUM_X_DIRECTION forDir = fvg.GetDirection(); + + // + color bullishColor = drawer.BarBullishColor(); + color bearishColor = drawer.BarBearishColor(); + color forColor = IsBullish(forDir) + ? bullishColor + : bearishColor; + + // + // Draw Order Block ... + XCBaseObject *obj; + bool isCreated = drawer.CreateFairValueGap( + fvg, + obj // + ); + if (isCreated) + { + // + if (forWorkingZone) + { + mWorkingZoneObjects.Add(obj); + } + else + { + mObjects.Add(obj); + } + } + + // + ulong chartID = drawer.ChartIdentification(); + int subWindow = drawer.SubWindowIdentification(); + + // + XOHCL startedBar; + ENUM_X_DIRECTION startedDir; + bool isStarted = fvg.IsStarted( + forDir, + startedBar, + startedDir // + ); + if (isStarted) + { + // + datetime to = startedBar.time + (PeriodSeconds(startedBar.period)); + + // + XCOHCLObject *obj; + bool isCreated = drawer.CreateBar( + startedBar, + obj, + to // + ); + if (isCreated) + { + // + obj.BodyColor(clrYellow); + obj.HighShadowColor(clrYellow); + obj.LowShadowColor(clrYellow); + + // + obj.BodyStyle(STYLE_SOLID); + obj.HighShadowStyle(STYLE_SOLID); + obj.LowShadowStyle(STYLE_SOLID); + + // + if (forWorkingZone) + { + mWorkingZoneObjects.Add(obj); + } + else + { + mObjects.Add(obj); + } + } + + // + string startVLineName = "Start_" + fvg.GetTag(); + + // + CChartObjectVLine *startVLine; + startVLine = new CChartObjectVLine(); + isCreated = startVLine.Create( + chartID, + startVLineName, + subWindow, + startedBar.time // + ); + if (isCreated) + { + // + startVLine.Color(forColor); + + // + if (forWorkingZone) + { + mWorkingZoneObjects.Add(startVLine); + } + else + { + mObjects.Add(startVLine); + } + } + } + } + + // + void DrawWorkingZone( + X121SMCStrategyXWZSignalConditions &conditions, + XCPOIDrawer *drawer // + ) + { + // + if (drawer == NULL) + { + return; + } + + // + bool hasWorkingZone = conditions.HasWorkingZone(); + if (!hasWorkingZone) + { + return; + } + + // + string prefix = "WKZ_" + conditions.workingZone.symbol + ToString(conditions.workingZone.period) + "_"; + string tag = prefix + ToString(conditions.workingZone.upper) + "_" + ToString(conditions.workingZone.lower); + string suffix = ToMD5(tag); + + // + string upperName = prefix + "_Upper_" + suffix; + string lowerName = prefix + "_Lower_" + suffix; + string zoneUpperName = prefix + "_ZoneUpper_" + suffix; + string zoneLowerName = prefix + "_ZoneLower_" + suffix; + + // + string q1Name = prefix + "_Q1_" + suffix; + string q2Name = prefix + "_Q2_" + suffix; + string q3Name = prefix + "_Q3_" + suffix; + + // + ulong chartID = drawer.ChartIdentification(); + int subWindow = drawer.SubWindowIdentification(); + + // + bool isCreated = false; + + // + // Check For Trend Approced ... + bool isTrendApproved = conditions.HasOrderBlock() && + conditions.HasFairValueGap(); + if (isTrendApproved) + { + // + DrawOrderBlock( + conditions.orderBlock, + drawer, + true // + ); + + // + DrawFairValueGap( + conditions.fairValueGap, + drawer, + true // + ); + } + + // + XCSupplyZoneObject *iSupObj; + isCreated = drawer.CreateSupplyZone( + conditions.supplyZone, + iSupObj // + ); + if (isCreated) + { + mWorkingZoneObjects.Add(iSupObj); + } + + // + XCDemandZoneObject *iDemObj; + isCreated = drawer.CreateDemandZone( + conditions.demandZone, + iDemObj // + ); + if (isCreated) + { + mWorkingZoneObjects.Add(iDemObj); + } + + // + // Lower ... + CChartObjectTrend *lowerHLine; + lowerHLine = new CChartObjectTrend(); + isCreated = lowerHLine.Create( + chartID, + lowerName, + subWindow, + conditions.workingZone.from, + conditions.workingZone.lower, + conditions.workingZone.to, + conditions.workingZone.lower // + ); + if (isCreated) + { + // + lowerHLine.Color(clrLime); + mWorkingZoneObjects.Add(lowerHLine); + } + + // + CChartObjectTrend *upperHLine; + upperHLine = new CChartObjectTrend(); + isCreated = upperHLine.Create( + chartID, + upperName, + subWindow, + conditions.workingZone.from, + conditions.workingZone.upper, + conditions.workingZone.to, + conditions.workingZone.upper // + ); + if (isCreated) + { + // + upperHLine.Color(clrLime); + mWorkingZoneObjects.Add(upperHLine); + } + + // + CChartObjectTrend *zoneLowerHLine; + zoneLowerHLine = new CChartObjectTrend(); + isCreated = zoneLowerHLine.Create( + chartID, + zoneLowerName, + subWindow, + conditions.workingZone.from, + conditions.workingZone.zoneLower, + conditions.workingZone.to, + conditions.workingZone.zoneLower // + ); + if (isCreated) + { + // + zoneLowerHLine.Color(clrRed); + mWorkingZoneObjects.Add(zoneLowerHLine); + } + + // + CChartObjectTrend *zoneUpperHLine; + zoneUpperHLine = new CChartObjectTrend(); + isCreated = zoneUpperHLine.Create( + chartID, + zoneUpperName, + subWindow, + conditions.workingZone.from, + conditions.workingZone.zoneUpper, + conditions.workingZone.to, + conditions.workingZone.zoneUpper // + ); + if (isCreated) + { + // + zoneUpperHLine.Color(clrRed); + mWorkingZoneObjects.Add(zoneUpperHLine); + } + + // + CChartObjectTrend *quarter1HLine; + quarter1HLine = new CChartObjectTrend(); + isCreated = quarter1HLine.Create( + chartID, + q1Name, + subWindow, + conditions.workingZone.from, + conditions.workingZone.quarter1, + conditions.workingZone.to, + conditions.workingZone.quarter1 // + ); + if (isCreated) + { + // + quarter1HLine.Color(clrYellow); + mWorkingZoneObjects.Add(quarter1HLine); + } + + // + CChartObjectTrend *quarter2HLine; + quarter2HLine = new CChartObjectTrend(); + isCreated = quarter2HLine.Create( + chartID, + q2Name, + subWindow, + conditions.workingZone.from, + conditions.workingZone.quarter2, + conditions.workingZone.to, + conditions.workingZone.quarter2 // + ); + if (isCreated) + { + // + quarter2HLine.Color(clrYellow); + mWorkingZoneObjects.Add(quarter2HLine); + } + + // + CChartObjectTrend *quarter3HLine; + quarter3HLine = new CChartObjectTrend(); + isCreated = quarter3HLine.Create( + chartID, + q3Name, + subWindow, + conditions.workingZone.from, + conditions.workingZone.quarter3, + conditions.workingZone.to, + conditions.workingZone.quarter3 // + ); + if (isCreated) + { + // + quarter3HLine.Color(clrYellow); + mWorkingZoneObjects.Add(quarter3HLine); + } + + // + } + + // + void DrawConditions( + X121SMCStrategyXWZSignalConditions &conditions, + XCPOIDrawer *drawer, + bool forceClean = false // + ) + { + // + if (drawer == NULL) + { + return; + } + + // + if (forceClean) + { + mObjects.Clear(); + } + + // + bool isCreated = false; + + // + ulong chartID = drawer.ChartIdentification(); + int subWindow = drawer.SubWindowIdentification(); + color bullishColor = drawer.BarBullishColor(); + color bearishColor = drawer.BarBearishColor(); + + // + // Start Zone ... + bool hasStartZone = conditions.HasStartZone(); + if (hasStartZone) + { + // + bool isBullish = conditions.startZone.IsBullish(); + + // + bool hasOB = conditions.startZone.HasOB(); + if (hasOB) + { + // // + // XCBaseObject *iObj; + // isCreated = drawer.CreateOrderBlock( + // conditions.startZone.ob, + // iObj // + // ); + + // // + // if (isCreated) + // { + // mObjects.Add(iObj); + // } + + // + DrawOrderBlock( + conditions.startZone.ob, + drawer // + ); + } + + // + bool hasFVG = conditions.startZone.HasFVG(); + if (hasFVG) + { + // // + // XCBaseObject *iObj; + // isCreated = drawer.CreateFairValueGap( + // conditions.startZone.fvg, + // iObj // + // ); + + // // + // if (isCreated) + // { + // mObjects.Add(iObj); + // } + + // + DrawFairValueGap( + conditions.startZone.fvg, + drawer // + ); + } + + // + bool hasSupply = conditions.startZone.HasSupply(); + if (hasSupply) + { + // + XCSupplyZoneObject *iObj; + isCreated = drawer.CreateSupplyZone( + conditions.startZone.supply, + iObj // + ); + + // + if (isCreated) + { + mObjects.Add(iObj); + } + } + + // + bool hasDemand = conditions.startZone.HasDemand(); + if (hasDemand) + { + // + XCDemandZoneObject *iObj; + isCreated = drawer.CreateDemandZone( + conditions.startZone.demand, + iObj // + ); + + // + if (isCreated) + { + mObjects.Add(iObj); + } + } + + // + bool hasSupport = conditions.startZone.HasSupport(); + if (hasSupport) + { + // + XCSupportZoneObject *iObj; + isCreated = drawer.CreateSupportZone( + conditions.startZone.support, + iObj // + ); + + // + if (isCreated) + { + mObjects.Add(iObj); + } + } + + // + bool hasResistance = conditions.startZone.HasResistance(); + if (hasResistance) + { + // + XCResistanceZoneObject *iObj; + isCreated = drawer.CreateResistanceZone( + conditions.startZone.resistance, + iObj // + ); + + // + if (isCreated) + { + mObjects.Add(iObj); + } + } + + // + bool hasBullishCZone = conditions.startZone.HasBullishConsolidationZone(); + if (hasBullishCZone) + { + // + XCConsolidationZoneObject *iObj; + isCreated = drawer.CreateConsolidationZone( + conditions.startZone.bullishConsolidationZone, + iObj // + ); + + // + if (isCreated) + { + mObjects.Add(iObj); + } + } + + // + bool hasBearishCZone = conditions.startZone.HasBearishConsolidationZone(); + if (hasBearishCZone) + { + // + XCConsolidationZoneObject *iObj; + isCreated = drawer.CreateConsolidationZone( + conditions.startZone.bearishConsolidationZone, + iObj // + ); + + // + if (isCreated) + { + mObjects.Add(iObj); + } + } + + // + // + // + + // + string bName = ""; + int arrowCode = 0; + string bSuffix = ""; + color arrowColor = clrNONE; + ENUM_X_PRICE bPrice = X_PRICE_CLOSE; + + // + bool hasSwingBar = conditions.startZone.swingBar.IsValid(); + if (hasSwingBar) + { + // + bSuffix = ToMD5(conditions.startZone.swingBar.GetTag()); + bName = + (isBullish + ? "SWING_LOW" + : "SWING_HIGH") + + "_" + bSuffix; + arrowCode = 159; + arrowColor = + isBullish + ? bullishColor + : bearishColor; + bPrice = + isBullish + ? X_PRICE_LOW + : X_PRICE_HIGH; + + // + XCBarArrowObject *iObj; + iObj = new XCBarArrowObject(); + isCreated = iObj.CreateByBar( + chartID, + bName, + subWindow, + arrowCode, + conditions.startZone.swingBar, + bPrice // + ); + if (isCreated) + { + // + iObj.ArrowColor(arrowColor); + + // + mObjects.Add(iObj); + } + } + + // + bool hasBreakerBar = conditions.startZone.breakerBar.IsValid(); + if (hasBreakerBar) + { + // + bSuffix = ToMD5(conditions.startZone.breakerBar.GetTag()); + bName = + (isBullish + ? "BULL_BREAKER" + : "BEAR_BREAKER") + + "_" + bSuffix; + arrowCode = + isBullish + ? 71 + : 72; + arrowColor = + isBullish + ? bullishColor + : bearishColor; + bPrice = + isBullish + ? X_PRICE_LOW + : X_PRICE_HIGH; + + // + XCBarArrowObject *iObj; + iObj = new XCBarArrowObject(); + isCreated = iObj.CreateByBar( + chartID, + bName, + subWindow, + arrowCode, + conditions.startZone.breakerBar, + bPrice // + ); + if (isCreated) + { + // + iObj.ArrowColor(arrowColor); + + // + mObjects.Add(iObj); + } + } + + // + bool hasMomentumBar = conditions.startZone.momentumBar.IsValid(); + if (hasMomentumBar) + { + // + bSuffix = ToMD5(conditions.startZone.momentumBar.GetTag()); + bName = + (isBullish + ? "BULL_MOMENTUM" + : "BEAR_MOMENTUM") + + "_" + bSuffix; + arrowCode = + isBullish + ? 233 + : 234; + arrowColor = + isBullish + ? bullishColor + : bearishColor; + bPrice = + isBullish + ? X_PRICE_LOW + : X_PRICE_HIGH; + + // + XCBarArrowObject *iObj; + iObj = new XCBarArrowObject(); + isCreated = iObj.CreateByBar( + chartID, + bName, + subWindow, + arrowCode, + conditions.startZone.momentumBar, + bPrice // + ); + if (isCreated) + { + // + iObj.ArrowColor(arrowColor); + + // + mObjects.Add(iObj); + } + } + + // + bool hasRejectionBar = conditions.startZone.rejectionBar.IsValid(); + if (hasRejectionBar) + { + // + bSuffix = ToMD5(conditions.startZone.rejectionBar.GetTag()); + bName = + (isBullish + ? "BULL_REJECTION" + : "BEAR_REJECTION") + + "_" + bSuffix; + arrowCode = + isBullish + ? 241 + : 242; + arrowColor = + isBullish + ? bullishColor + : bearishColor; + bPrice = + isBullish + ? X_PRICE_LOW + : X_PRICE_HIGH; + + // + XCBarArrowObject *iObj; + iObj = new XCBarArrowObject(); + isCreated = iObj.CreateByBar( + chartID, + bName, + subWindow, + arrowCode, + conditions.startZone.rejectionBar, + bPrice // + ); + if (isCreated) + { + // + iObj.ArrowColor(arrowColor); + + // + mObjects.Add(iObj); + } + } + + // + bool hasAppliedBox = conditions.startZone.appliedBox.IsValid(); + if (hasAppliedBox) + { + // + arrowColor = + IsBullish(conditions.startZone.appliedBox.dir) + ? bullishColor + : bearishColor; + + // + XCBoxObject *iObj; + isCreated = drawer.CreateBox( + conditions.startZone.appliedBox, + iObj // + ); + + // + if (isCreated) + { + // + iObj.BoxWidth(2); + iObj.BoxColor(arrowColor); + + // + mObjects.Add(iObj); + } + } + } + } + + // + protected: + // + + // + private: + // + // Props ... + CArrayObj mObjects; + CArrayObj mWorkingZoneObjects; + + /** + * Initialize ... + */ + void Init() + { + } + + /** + * DeInitialize ... + */ + void DeInit() + { + // + RemoveDraws(); + mConditions.Clean(); + RemoveWorkingZoneDraws(); + Clean(mConditionsCollection); + } + + // + // Helpers ... + + // + bool CalculateRiskReward( + ENUM_X121SMC_XWZ_PRIORITY priority, + double &reward, + double &amountPercent // + ) + { + // + bool result = false; + + // + reward = 0; + amountPercent = 0; + + // + result = priority != X121SMC_XWZ_PRIORITY_NONE; + if (!result) + { + return result; + } + + // + switch (priority) + { + // + case X121SMC_XWZ_PRIORITY_STRONG_HIGH: + // + reward = 6; + amountPercent = 2; + break; + + // + case X121SMC_XWZ_PRIORITY_HIGH: + // + reward = 4; + amountPercent = 2; + break; + + // + case X121SMC_XWZ_PRIORITY_REGULAR: + // + reward = 3; + amountPercent = 1.5; + break; + + // + case X121SMC_XWZ_PRIORITY_LOW: + // + reward = 2; + amountPercent = 1; + break; + + // + case X121SMC_XWZ_PRIORITY_WEAK: + // + reward = 1; + amountPercent = 0.5; + break; + } + + // + result = + // + reward > 0 && + amountPercent > 0 + // + ; + + // + return result; + } + + // +}; + +// \ No newline at end of file diff --git a/BKPS/14031206/Documents/BKP/xsupdem/x-121.smc.xwz.signal.lib.mq5 b/BKPS/14031206/Documents/BKP/xsupdem/x-121.smc.xwz.signal.lib.mq5 new file mode 100644 index 0000000..23b7f26 --- /dev/null +++ b/BKPS/14031206/Documents/BKP/xsupdem/x-121.smc.xwz.signal.lib.mq5 @@ -0,0 +1,3283 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 X121 SMC Signal Class +// ------------------------------------------------- +// Name: XWZ +// Description: provide all Signalling 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 + +// +// Imports ... +// #include "../../Libraries/x-trade.lib" +#include "../Classes/x-121.smc.market.cycle.helper.class.mq5" +#include "../Libraries/x-121.smc.guard.lib.mq5" +#include "../Libraries/x-121.smc.lib.mq5" + +// +enum ENUM_X121SMC_XWZ_PRIORITY +{ + X121SMC_XWZ_PRIORITY_NONE, + X121SMC_XWZ_PRIORITY_WEAK, + X121SMC_XWZ_PRIORITY_LOW, + X121SMC_XWZ_PRIORITY_REGULAR, + X121SMC_XWZ_PRIORITY_HIGH, + X121SMC_XWZ_PRIORITY_STRONG_HIGH, +}; + +// +struct X121SMCXWZZone +{ + // + // Props ... + XCFVG *fvg; + XCOrderBlock *ob; + XCSupplyZone *supply; + XCDemandZone *demand; + XCSupportZone *support; + XCResistanceZone *resistance; + XConsolidationZone bullishConsolidationZone; + XConsolidationZone bearishConsolidationZone; + + // + XOHCL swingBar; + XOHCL breakerBar; + XOHCL momentumBar; + XOHCL rejectionBar; + XBoxZone appliedBox; + + // + // Constructor ... + X121SMCXWZZone() + { + Clean(); + } + + // + // Tools ... + + // + void Clean() + { + // + ZeroMemory(ob); + ZeroMemory(fvg); + ZeroMemory(supply); + ZeroMemory(demand); + ZeroMemory(support); + ZeroMemory(resistance); + + // + swingBar.Clean(); + breakerBar.Clean(); + appliedBox.Clean(); + momentumBar.Clean(); + rejectionBar.Clean(); + + // + bullishConsolidationZone.Clean(); + bearishConsolidationZone.Clean(); + } + + // + bool IsValid() + { + // + return HasOB() && + HasFVG() && + HasDirection(); + } + + // + bool AsBox(XBoxZone &box) + { + // + bool result = false; + + // + box.Clean(); + + // + result = IsValid() && + HasDirection(); + if (!result) + { + return result; + } + + // + XBoxZone obBox; + bool hasOBBox = ToBox( + obBox, + ob // + ); + result = hasOBBox; + if (!result) + { + // + box.Clean(); + obBox.Clean(); + return result; + } + + // + box = obBox; + + // + obBox.Clean(); + + // + bool hasOB = HasOB(); + bool hasFVG = HasFVG(); + bool hasSupply = HasSupply(); + bool hasDemand = HasDemand(); + bool hasSupport = HasSupport(); + bool hasResistance = HasResistance(); + + // + // OB Compared since box used obBox ... + + // + if (hasFVG) + { + // + if (fvg.Upper() > box.upper) + { + box.upper = fvg.Upper(); + } + + // + if (fvg.Lower() < box.lower) + { + box.lower = fvg.Lower(); + } + } + + // + result = box.IsValid(); + + // + return result; + } + + // + bool HasOB() + { + return ob != NULL && + ob.IsValid(); + } + + // + bool HasFVG() + { + return fvg != NULL && + fvg.IsValid(); + } + + // + bool HasSupply() + { + return supply != NULL && + supply.IsValid(); + } + + // + bool HasDemand() + { + return demand != NULL && + demand.IsValid(); + } + + // + bool HasSupport() + { + return support != NULL && + support.IsValid(); + } + + // + bool HasResistance() + { + return resistance != NULL && + resistance.IsValid(); + } + + // + bool HasBullishConsolidationZone() + { + return bullishConsolidationZone.IsValid() && + bullishConsolidationZone.IsBreaked() && + IsBullish(bullishConsolidationZone.breakDir); + } + + // + bool HasBearishConsolidationZone() + { + return bearishConsolidationZone.IsValid() && + bearishConsolidationZone.IsBreaked() && + IsBullish(bearishConsolidationZone.breakDir); + } + + // + bool IsBullish() + { + // + return HasOB() && + ob.IsBullish() && + HasFVG() && + fvg.IsBullish() && + HasSupport() && + HasDemand(); + } + + // + bool IsBearish() + { + // + return HasOB() && + ob.IsBearish() && + HasFVG() && + fvg.IsBearish() && + HasSupply() && + HasResistance(); + } + + // + bool HasDirection() + { + return IsBullish() || + IsBearish(); + } + + // + ENUM_X_DIRECTION GetDirection() + { + // + ENUM_X_DIRECTION result = X_DIRECTION_NONE; + + // + bool hasDirection = HasDirection(); + if (!hasDirection) + { + return result; + } + + // + bool isBullish = IsBullish(); + + // + result = + isBullish + ? X_DIRECTION_BULLISH + : X_DIRECTION_BEARISH; + + // + return result; + } + + // + bool HasCondition( + XPOIState &state, + int barIndex = 0, + ENUM_TIMEFRAMES forPeriod = NULL // + ) + { + // + bool result = false; + + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + swingBar.Clean(); + breakerBar.Clean(); + appliedBox.Clean(); + momentumBar.Clean(); + rejectionBar.Clean(); + + // + result = IsValid() && + HasDirection() && + state.IsValid() && + state.HasChild(); + if (!result) + { + // + swingBar.Clean(); + breakerBar.Clean(); + appliedBox.Clean(); + momentumBar.Clean(); + rejectionBar.Clean(); + + // + return result; + } + + // + string symbol = ob.GetSymbol(); + if (!IsValid(forPeriod)) + { + forPeriod = ob.GetPeriod(); + } + datetime cTime = iTime( + symbol, + forPeriod, + barIndex // + ); + + // + bool isInside = IsPriceInside( + barIndex, + forPeriod // + ); + result = isInside; + if (!result) + { + return result; + } + + // + XBoxZone box; + result = AsBox(box); + if (!result) + { + // + box.Clean(); + + // + swingBar.Clean(); + breakerBar.Clean(); + appliedBox.Clean(); + momentumBar.Clean(); + rejectionBar.Clean(); + + // + return result; + } + + // + bool isBullish = IsBullish(); + ENUM_X_DIRECTION forDir = box.dir; + + // + int supportsCount = 0; + bool hasSupports = false; + XCSupportZone *supports[]; + + // + int resistancesCount = 0; + bool hasResistances = false; + XCResistanceZone *resistances[]; + + // + XBoxZone supResBoxes[]; + int supresBoxesCount = 0; + bool hasSupResBoxes = false; + + // + int count = 0; + bool has = false; + + // + has = state.HasSupportZones(); + if (has) + { + // + count = state.CountSupportZones(); + for (int i = 0; i < count; i++) + { + // + XCSupportZone *iZone = state.supportZones[i]; + + // + iZone.To(cTime); + + // + XBoxZone iBox; + bool hasBox = ToBox( + iBox, + iZone // + ); + if (!hasBox) + { + // + iBox.Clean(); + continue; + } + + // + // Check From ... + bool isInside = IsBoxInside( + iBox, + box // + ); + if (!isInside) + { + // + iBox.Clean(); + continue; + } + + // + Add( + iZone, + supports // + ); + + // + AddRef( + iBox, + supResBoxes // + ); + + // + iBox.Clean(); + } + + // + supportsCount = ArraySize(supports); + hasSupports = IsValidSize(supportsCount); + + // + supresBoxesCount = ArraySize(supResBoxes); + hasSupResBoxes = IsValidSize(supresBoxesCount); + } + + // + has = state.HasResistanceZones(); + if (has) + { + // + count = state.CountResistanceZones(); + for (int i = 0; i < count; i++) + { + // + XCResistanceZone *iZone = state.resistanceZones[i]; + + // + iZone.To(cTime); + + // + XBoxZone iBox; + bool hasBox = ToBox( + iBox, + iZone // + ); + if (!hasBox) + { + // + iBox.Clean(); + continue; + } + + // + // Check From ... + bool isInside = IsBoxInside( + iBox, + box // + ); + if (!isInside) + { + // + iBox.Clean(); + continue; + } + + // + Add( + iZone, + resistances // + ); + + // + AddRef( + iBox, + supResBoxes // + ); + + // + iBox.Clean(); + } + + // + resistancesCount = ArraySize(resistances); + hasResistances = IsValidSize(resistancesCount); + + // + supresBoxesCount = ArraySize(supResBoxes); + hasSupResBoxes = IsValidSize(supresBoxesCount); + } + + // + result = hasSupResBoxes; + if (!result) + { + // + box.Clean(); + Clean(supports); + Clean(resistances); + Clean(supResBoxes); + + // + swingBar.Clean(); + breakerBar.Clean(); + appliedBox.Clean(); + momentumBar.Clean(); + rejectionBar.Clean(); + + // + return result; + } + + // + // Detect Bars ... + + // + XOHCL zBar; + result = zBar.Init( + symbol, + forPeriod, + barIndex // + ); + if (!result) + { + // + box.Clean(); + zBar.Clean(); + Clean(supports); + Clean(resistances); + Clean(supResBoxes); + + // + swingBar.Clean(); + breakerBar.Clean(); + appliedBox.Clean(); + momentumBar.Clean(); + rejectionBar.Clean(); + + // + return result; + } + + // + XOHCL cBar; + result = zBar.GetPreviousBar(cBar); + if (!result) + { + // + box.Clean(); + zBar.Clean(); + cBar.Clean(); + Clean(supports); + Clean(resistances); + Clean(supResBoxes); + + // + swingBar.Clean(); + breakerBar.Clean(); + appliedBox.Clean(); + momentumBar.Clean(); + rejectionBar.Clean(); + + // + return result; + } + + // + XOHCL pBar; + result = cBar.GetPreviousBar(pBar); + if (!result) + { + // + box.Clean(); + zBar.Clean(); + cBar.Clean(); + pBar.Clean(); + Clean(supports); + Clean(resistances); + Clean(supResBoxes); + + // + swingBar.Clean(); + breakerBar.Clean(); + appliedBox.Clean(); + momentumBar.Clean(); + rejectionBar.Clean(); + + // + return result; + } + + // + XOHCL ppBar; + result = pBar.GetPreviousBar(ppBar); + if (!result) + { + // + box.Clean(); + zBar.Clean(); + cBar.Clean(); + pBar.Clean(); + ppBar.Clean(); + Clean(supports); + Clean(resistances); + Clean(supResBoxes); + + // + swingBar.Clean(); + breakerBar.Clean(); + appliedBox.Clean(); + momentumBar.Clean(); + rejectionBar.Clean(); + + // + return result; + } + + // + // Check Conditions ... + + // + // Detect Start Senario ... + + // + double fiboPressureLevel = GetFiboLevelValue(X_FIBO_LEVEL_382); + + // + double fiboUpDown = GetFibonacciLevel( + pBar.high, + pBar.low, + X_FIBO_LEVEL_382, + X_DIRECTION_BEARISH // + ); + double fiboDownUp = GetFibonacciLevel( + pBar.high, + pBar.low, + X_FIBO_LEVEL_382, + X_DIRECTION_BULLISH // + ); + + // + bool hasFiboToUpPressure = + fiboDownUp > 0 && + fiboDownUp <= pBar.GetDown(); + bool hasFiboToDownPressure = + fiboUpDown > 0 && + fiboUpDown >= pBar.GetUp(); + + // + int selectedBoxIDX = -1; + for (int j = 0; j < supresBoxesCount; j++) + { + // + double appliedPrice = + isBullish + ? supResBoxes[j].lower + : supResBoxes[j].upper; + + // + // Check Swing Low ... + bool isSwingLow = + // + pBar.low < ppBar.low && + pBar.low < cBar.low && + zBar.open > pBar.low && + // + appliedPrice > pBar.low && + appliedPrice < pBar.GetDown() + // + ; + bool isPressuredSwingLow = + isSwingLow && + hasFiboToUpPressure; + bool isPressuredStrongSwingLow = + pBar.IsBullish() && + isPressuredSwingLow; + + // + bool isSwingHigh = + // + pBar.high > ppBar.high && + pBar.high > cBar.high && + zBar.open < pBar.high && + // + appliedPrice < pBar.high && + appliedPrice > pBar.GetUp() + // + ; + bool isPressuredSwingHigh = + isSwingHigh && + hasFiboToDownPressure; + bool isPressuredStrongSwingHigh = + pBar.IsBearish() && + isPressuredSwingHigh; + + // + bool hasValidSwing = + isBullish + ? isSwingLow + : isSwingHigh; + bool hasValidPressuredSwing = + isBullish + ? isPressuredSwingLow + : isPressuredSwingHigh; + bool hasValidPressuredStrongSwing = + isBullish + ? isPressuredStrongSwingLow + : isPressuredStrongSwingHigh; + if (hasValidSwing) + { + swingBar = pBar; + } + if (hasValidPressuredSwing) + { + swingBar = pBar; + } + if (hasValidPressuredStrongSwing) + { + swingBar = pBar; + } + + // + bool isCBarBreaked = IsBarBreak( + appliedPrice, + forDir, + cBar // + ); + if (isCBarBreaked) + { + breakerBar = cBar; + } + bool isPBarBreaked = IsBarBreak( + appliedPrice, + forDir, + pBar // + ); + if (!isCBarBreaked && isPBarBreaked) + { + breakerBar = pBar; + } + else + { + isPBarBreaked = false; + } + bool isPPBarBreaked = IsBarBreak( + appliedPrice, + forDir, + ppBar // + ); + if (!isCBarBreaked && + !isPBarBreaked && + isPPBarBreaked) + { + breakerBar = ppBar; + } + else + { + isPPBarBreaked = false; + } + bool isBoxBreaked = isCBarBreaked || + isPBarBreaked || + isPPBarBreaked; + + // + bool isCBarRejected = IsBarReject( + appliedPrice, + forDir, + cBar // + ); + if (isCBarRejected) + { + rejectionBar = cBar; + } + bool isPBarRejected = IsBarReject( + appliedPrice, + forDir, + pBar // + ); + if (!isCBarRejected && isPBarRejected) + { + rejectionBar = pBar; + } + else + { + isPBarRejected = false; + } + bool isPPBarRejected = IsBarReject( + appliedPrice, + forDir, + ppBar // + ); + if (!isCBarRejected && + !isPBarRejected && + isPPBarRejected) + { + rejectionBar = ppBar; + } + else + { + isPPBarRejected = false; + } + bool isBoxRejected = isCBarRejected || + isPBarRejected || + isPPBarRejected; + + // + bool hasRejectionBar = false; + if (isBullish) + { + // + count = state.CountBullishRejectionBars(); + for (int i = 0; i < count; i++) + { + // + XCRejectionBar *iZone = state.bullishRejectionBars[i]; + + // + XOHCL iBar; + bool isFilled = iZone.FillBar(iBar); + if (!isFilled) + { + continue; + } + + // + int iBarIndex = iBar.Index(); + + // + hasRejectionBar = + // + (iBarIndex == cBar.Index() || + iBarIndex == pBar.Index()) + // + ; + if (hasRejectionBar) + { + // + if (!rejectionBar.IsValid()) + { + rejectionBar = iBar; + } + + // + break; + } + } + } + else + { + // + count = state.CountBearishRejectionBars(); + for (int i = 0; i < count; i++) + { + // + XCRejectionBar *iZone = state.bearishRejectionBars[i]; + + // + XOHCL iBar; + bool isFilled = iZone.FillBar(iBar); + if (!isFilled) + { + continue; + } + + // + int iBarIndex = iBar.Index(); + + // + hasRejectionBar = + // + (iBarIndex == cBar.Index() || + iBarIndex == pBar.Index()) + // + ; + if (hasRejectionBar) + { + // + if (!rejectionBar.IsValid()) + { + rejectionBar = iBar; + } + + // + break; + } + } + } + + // + bool hasMomentumBar = false; + if (isBullish) + { + // + count = state.CountBullishMomentumBars(); + for (int i = 0; i < count; i++) + { + // + XCMomentumBar *iZone = state.bullishMomentumBars[i]; + + // + XOHCL iBar; + bool isFilled = iZone.FillBar(iBar); + if (!isFilled) + { + continue; + } + + // + int iBarIndex = iBar.Index(); + + // + hasMomentumBar = + // + (iBarIndex == cBar.Index() || + iBarIndex == pBar.Index()) + // + ; + if (hasMomentumBar) + { + // + if (!momentumBar.IsValid()) + { + momentumBar = iBar; + } + + // + break; + } + } + } + else + { + // + count = state.CountBearishMomentumBars(); + for (int i = 0; i < count; i++) + { + // + XCMomentumBar *iZone = state.bearishMomentumBars[i]; + + // + XOHCL iBar; + bool isFilled = iZone.FillBar(iBar); + if (!isFilled) + { + continue; + } + + // + int iBarIndex = iBar.Index(); + + // + hasMomentumBar = + // + (iBarIndex == cBar.Index() || + iBarIndex == pBar.Index()) + // + ; + if (hasMomentumBar) + { + // + if (!momentumBar.IsValid()) + { + momentumBar = iBar; + } + + // + break; + } + } + } + + // + bool hasSwing = false; + if (isBullish) + { + // + count = state.CountSwingLows(); + for (int i = 0; i < count; i++) + { + // + XCSwing *iSwing = state.swingLows[i]; + + // + XOHCL iBar; + bool isFilled = iSwing.FillBar(iBar); + if (!isFilled) + { + continue; + } + + // + int iBarIndex = iBar.Index(); + + // + hasSwing = + // + (iBarIndex == cBar.Index() || + iBarIndex == pBar.Index()) + // + ; + if (hasSwing) + { + // + if (!swingBar.IsValid()) + { + swingBar = iBar; + } + + // + break; + } + } + } + else + { + // + count = state.CountSwingHighs(); + for (int i = 0; i < count; i++) + { + // + XCSwing *iSwing = state.swingHighs[i]; + + // + XOHCL iBar; + bool isFilled = iSwing.FillBar(iBar); + if (!isFilled) + { + continue; + } + + // + int iBarIndex = iBar.Index(); + + // + hasSwing = + // + (iBarIndex == cBar.Index() || + iBarIndex == pBar.Index()) + // + ; + if (hasSwing) + { + // + if (!swingBar.IsValid()) + { + swingBar = iBar; + } + + // + break; + } + } + } + + // + bool hasRequiredValidations = + // + (hasRejectionBar || + hasMomentumBar) + // + || + // + (hasRejectionBar || + hasSwing) + // + || + // + (hasMomentumBar || + hasSwing) + // + ; + + // + result = + // + (isBoxBreaked && + (hasRequiredValidations || + hasValidPressuredSwing)) + // + || + // + (isBoxRejected && + (hasRequiredValidations || + hasValidPressuredSwing)) + // + ; + if (result) + { + // + selectedBoxIDX = j; + break; + } + } + + // + result = + result && + (isBullish + ? zBar.open > box.upper + : zBar.open < box.lower) && + IsValidIndex(selectedBoxIDX); + if (result) + { + appliedBox = supResBoxes[selectedBoxIDX]; + } + + // + box.Clean(); + zBar.Clean(); + cBar.Clean(); + pBar.Clean(); + ppBar.Clean(); + Clean(supports); + Clean(resistances); + Clean(supResBoxes); + + // + return result; + } + + // + bool IsPriceInside( + int barIndex = 0, + ENUM_TIMEFRAMES forPeriod = NULL // + ) + { + // + bool result = false; + + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + result = IsValid() && + HasOB() && + HasFVG() && + HasDirection(); + if (!result) + { + return result; + } + + // + string symbol = ob.GetSymbol(); + if (forPeriod == NULL) + { + forPeriod = ob.GetPeriod(); + } + + // + ENUM_X_DIRECTION forDir = ob.GetDirection(); + bool isBullish = IsBullish(forDir); + + // + // Check Start Bars ... + + // + XOHCL obStartedBar; + ENUM_X_DIRECTION obStartedDir; + bool isOBStarted = ob.IsStarted( + forDir, + obStartedBar, + obStartedDir // + ); + result = isOBStarted; + if (!result) + { + return result; + } + + // + XOHCL fvgStartedBar; + ENUM_X_DIRECTION fvgStartedDir; + bool isFVGStarted = fvg.IsStarted( + forDir, + fvgStartedBar, + fvgStartedDir // + ); + result = isFVGStarted; + if (!result) + { + return result; + } + + // + // Get Zone Box ... + XBoxZone box; + bool hasBox = AsBox(box); + result = hasBox; + if (!result) + { + // + box.Clean(); + + // + return result; + } + + // + // Retrieve Bars ... + + // + XOHCL zBar; + result = zBar.Init( + symbol, + forPeriod, + barIndex // + ); + if (!result) + { + // + box.Clean(); + zBar.Clean(); + + // + return result; + } + + // + XOHCL cBar; + result = zBar.GetPreviousBar(cBar); + if (!result) + { + // + box.Clean(); + zBar.Clean(); + cBar.Clean(); + + // + return result; + } + + // + XOHCL pBar; + result = cBar.GetPreviousBar(pBar); + if (!result) + { + // + box.Clean(); + zBar.Clean(); + cBar.Clean(); + pBar.Clean(); + + // + return result; + } + + // + result = + // + isBullish + ? ( + // + pBar.low > box.upper && + cBar.low <= box.upper && + zBar.open <= box.upper + // + ) + : ( + // + pBar.high < box.lower && + cBar.high >= box.lower && + zBar.open >= box.lower + // + ) + // + ; + + // + box.Clean(); + zBar.Clean(); + cBar.Clean(); + pBar.Clean(); + + // + return result; + } + + // +}; + +// +struct X121SMCXWZWorkingZone +{ + // + string symbol; + ENUM_TIMEFRAMES period; + + // + double upper; + double lower; + + // + double zoneUpper; + double zoneLower; + + // + double quarter1; + double quarter2; + double quarter3; + + // + datetime to; + datetime from; + + // + XOHCL swingBar; + XOHCL breakerBar; + XOHCL momentumBar; + XOHCL rejectionBar; + XBoxZone appliedBox; + + // + X121SMCXWZWorkingZone() + { + Clean(); + } + + // + void Clean() + { + // + upper = 0; + lower = 0; + quarter1 = 0; + quarter2 = 0; + quarter3 = 0; + zoneLower = 0; + zoneUpper = 0; + + // + from = NULL; + symbol = NULL; + period = NULL; + + // + CleanConditionBars(); + + // + ZeroMemory(this); + } + + // + void CleanConditionBars() + { + // + swingBar.Clean(); + breakerBar.Clean(); + appliedBox.Clean(); + momentumBar.Clean(); + rejectionBar.Clean(); + } + + // + bool IsValid() + { + // + bool result = false; + + // + result = + lower > 0 && + upper > 0 && + quarter1 > 0 && + quarter2 > 0 && + quarter3 > 0 && + upper > lower && + zoneLower > 0 && + zoneUpper > 0 && + IsValid(from) && + IsValid(symbol) && + IsValid(period) && + zoneUpper > upper && + zoneLower < lower; + + // + return result; + } + + // + bool IsDestroyed( + ENUM_X_DIRECTION &destroyedDir, + int barIndex = 0, + ENUM_TIMEFRAMES forPeriod = NULL // + ) + { + // + bool result = false; + + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + if (!IsValid(forPeriod)) + { + forPeriod = period; + } + + // + destroyedDir = X_DIRECTION_NONE; + + // + result = IsValid(); + if (!result) + { + return result; + } + + // + XOHCL bar; + result = bar.Init( + symbol, + forPeriod, + barIndex // + ); + if (!result) + { + return result; + } + + // + bool isUpperBreaked = + bar.high > zoneUpper && + bar.close > zoneUpper; + + // + bool isLowerBreaked = + bar.low < zoneLower && + bar.close < zoneLower; + + // + result = isUpperBreaked || + isLowerBreaked; + if (result) + { + // + destroyedDir = + isUpperBreaked + ? X_DIRECTION_BULLISH + : X_DIRECTION_BEARISH; + } + + // + return result; + } + + // +}; + +// +// Definitions ... +struct X121SMCStrategyXWZSignalConditions +{ + // + // Props ... + + // + string symbol; + ENUM_TIMEFRAMES period; + + // + double sl; + double target; + double reward; + double amountPercent; + ENUM_X_DIRECTION dir; + ENUM_X_POSITION_TYPES type; + + // + // Setup Props ... + + // + datetime setupTime; + datetime triggerTime; + + // + double pivot; + double point; + + // + ENUM_X121SMC_XWZ_PRIORITY priority; + + // + // Working Zone ... + XCFVG *fairValueGap; + XCOrderBlock *orderBlock; + XCSupplyZone *supplyZone; + XCDemandZone *demandZone; + X121SMCXWZWorkingZone workingZone; + + // + X121SMCXWZZone startZone; + + // + // Constructor ... + X121SMCStrategyXWZSignalConditions() + { + Clean(); + } + + // + // Tools ... + + /** + * Cleaning Up ... + */ + void Clean() + { + // + sl = 0; + target = 0; + + // + dir = X_DIRECTION_NONE; + type = X_POSITION_TYPE_NONE; + + // + symbol = NULL; + period = NULL; + setupTime = NULL; + triggerTime = NULL; + + // + ExtensionClean(); + + // + ZeroMemory(this); + } + + /** + * Check Condition is Setting Up ... + * + * @param dir: ENUM_X_DIRECTION member, Setting Up Direction ... + * + * @return ( bool ) + */ + bool IsSetuped() + { + // + bool result = false; + + // + result = IsValid(setupTime) && + HasDirection(dir); + if (!result) + { + return result; + } + + // + return result; + } + + /** + * Calculate Setup Age ... + * + * @return ( int ) + */ + int GetSetupAge() + { + // + int result = 0; + + // + if (!IsSetuped()) + { + return result; + } + + // + result = (int)(TimeCurrent() - setupTime) / PeriodSeconds(period); + + // + return result; + } + + /** + * Detect How we Can Trigger Signal ... + * + * @return ( bool ) + */ + bool CanTrigger() + { + // + bool result = false; + + // + result = + // + sl > 0 && + IsValid(symbol) && + IsValid(period) && + IsValid(triggerTime) && + type != X_POSITION_TYPE_ALL && + type != X_POSITION_TYPE_NONE + // + ; + + // + return result; + } + + // + // Extensions ... + + /** + * Clean Additional Properties ... + */ + void ExtensionClean() + { + // + pivot = 0; + point = 0; + + // + target = 0; + reward = 0; + amountPercent = 0; + + // + ZeroMemory(supplyZone); + + // + ZeroMemory(demandZone); + + // + ZeroMemory(orderBlock); + + // + ZeroMemory(fairValueGap); + + // + startZone.Clean(); + + // + workingZone.Clean(); + } + + // + // + // + + // + bool HasWorkingZone() + { + return workingZone.IsValid(); + } + + // + bool HasOrderBlock() + { + return orderBlock != NULL && + orderBlock.IsValid(); + } + + // + bool HasFairValueGap() + { + return fairValueGap != NULL && + fairValueGap.IsValid(); + } + + // + bool HasSupplyZone() + { + return supplyZone != NULL && + supplyZone.IsValid(); + } + + // + bool HasDemandZone() + { + return demandZone != NULL && + demandZone.IsValid(); + } + + // + bool HasStartZone() + { + return startZone.IsValid(); + } + + // + void UpdateTo(datetime value = NULL) + { + // + value = NormalizeTime(value); + + // + bool hasSupplyZone = HasSupplyZone(); + if (hasSupplyZone) + { + supplyZone.To(value); + } + + // + bool hasDemandZone = HasDemandZone(); + if (hasDemandZone) + { + demandZone.To(value); + } + + // + bool hasOrderBlock = HasOrderBlock(); + if (hasOrderBlock) + { + orderBlock.To(value); + } + + // + bool hasFairValueGap = HasFairValueGap(); + if (hasFairValueGap) + { + fairValueGap.To(value); + } + + // + // Working Zone ... + bool hasWorkingZone = HasWorkingZone(); + if (hasWorkingZone) + { + workingZone.to = value; + } + + // + // Start Zone ... + bool hasStartZone = HasStartZone(); + if (hasStartZone) + { + // + bool hasOB = startZone.HasOB(); + if (hasOB) + { + startZone.ob.To(value); + } + + // + bool hasFVG = startZone.HasFVG(); + if (hasFVG) + { + startZone.fvg.To(value); + } + + // + bool hasSupply = startZone.HasSupply(); + if (hasSupply) + { + startZone.supply.To(value); + } + + // + bool hasDemand = startZone.HasDemand(); + if (hasDemand) + { + startZone.demand.To(value); + } + + // + bool hasSupport = startZone.HasSupport(); + if (hasSupport) + { + startZone.support.To(value); + } + + // + bool hasResistance = startZone.HasResistance(); + if (hasResistance) + { + startZone.resistance.To(value); + } + + // + bool hasBullishCZone = startZone.HasBullishConsolidationZone(); + if (hasBullishCZone) + { + // startZone.bullishConsolidationZone.to = cTime; + } + + // + bool hasBearishCZone = startZone.HasBearishConsolidationZone(); + if (hasBearishCZone) + { + // startZone.bearishConsolidationZone.to = cTime; + } + } + } + + // + // + // + + // + // Working Zone is an Area which + // we decide to trade inside it ... + bool ExtractWorkingZone( + XPOIState &htfState, + XPOIState &mtfState, + XPOIState &stfState, + int barIndex = 0 // + ) + { + // + bool result = false; + + // + if (barIndex < 0) + { + barIndex = 0; + } + int zIndex = barIndex; + + // + result = !HasWorkingZone(); + if (!result) + { + return result; + } + + // + result = IsValid(symbol) && + IsValid(period); + if (!result) + { + // + Clean(); + return result; + } + + // + datetime cTime = iTime( + symbol, + period, + zIndex // + ); + + // + result = + // + htfState.IsValid() && + htfState.HasChild() && + htfState.HasSupplyZones() && + htfState.HasDemandZones() && + // + mtfState.IsValid() && + mtfState.HasChild() && + mtfState.HasSupplyZones() && + mtfState.HasDemandZones() && + // + stfState.IsValid() && + stfState.HasChild() + // + ; + if (!result) + { + return result; + } + + // + // Retrieve Highest Supply Zone ... + int hSupplyIDX = GetHighest(htfState.supplyZones); + int lDemandIDX = GetLowest(htfState.demandZones); + + // + result = + // + IsValidIndex(hSupplyIDX) && + IsValidIndex(lDemandIDX) + // + ; + if (!result) + { + return result; + } + + // + supplyZone = htfState.supplyZones[hSupplyIDX]; + demandZone = htfState.demandZones[lDemandIDX]; + + // + result = + // + supplyZone != NULL && + demandZone != NULL && + supplyZone.IsValid() && + demandZone.IsValid() + // + ; + if (!result) + { + // + Clean(); + return result; + } + + // + // Check Validation of Supply and Demand Zones ... + lDemandIDX = GetLowest(mtfState.demandZones); + hSupplyIDX = GetHighest(mtfState.supplyZones); + result = IsValidIndex(lDemandIDX) && + IsValidIndex(hSupplyIDX); + if (!result) + { + // + Clean(); + return result; + } + + // + // Validate Supply and Demand ... + bool isMTFHSupplyInside = + IsInside( + mtfState.supplyZones[hSupplyIDX], + supplyZone); + bool isMTFLDemandInside = + IsInside( + mtfState.demandZones[lDemandIDX], + demandZone // + ); + if (isMTFHSupplyInside && + !isMTFLDemandInside) + { + demandZone = mtfState.demandZones[lDemandIDX]; + } + else if (!isMTFHSupplyInside && + isMTFLDemandInside) + { + supplyZone = mtfState.supplyZones[hSupplyIDX]; + } + else if (isMTFHSupplyInside && + isMTFLDemandInside) + { + // + supplyZone = mtfState.supplyZones[hSupplyIDX]; + demandZone = mtfState.demandZones[lDemandIDX]; + } + + // + // Check Zones Validation ... + bool hasTrend = + supplyZone != NULL && + supplyZone.IsValid() && + demandZone != NULL && + demandZone.IsValid(); + result = hasTrend; + if (!result) + { + // + Clean(); + return result; + } + + // + datetime from = MathMax( + supplyZone.From(), + demandZone.From()); + + // + int fromIndex = iBarShift( + symbol, + period, + from // + ); + + // + // Detect Trend ... + ENUM_X_DIRECTION trend = X_DIRECTION_NONE; + datetime supplyTouch = NULL; + datetime demandTouch = NULL; + for (int i = zIndex; i < fromIndex; i++) + { + // + XOHCL iBar; + bool isInited = iBar.Init( + symbol, + period, + i // + ); + if (!isInited) + { + continue; + } + + // + bool isTouchSupplyZone = + // + iBar.low < supplyZone.Lower() && + iBar.GetUp() > supplyZone.Lower() + // + ; + if (isTouchSupplyZone && + !IsValid(supplyTouch)) + { + supplyTouch = iBar.time; + } + + // + bool isTouchDemandZone = + // + iBar.high > demandZone.Upper() && + iBar.GetDown() < demandZone.Upper() + // + ; + if (isTouchDemandZone && + !IsValid(demandTouch)) + { + demandTouch = iBar.time; + } + + // + bool canBreak = + IsValid(supplyTouch) && + IsValid(demandTouch); + + // + iBar.Clean(); + + // + if (canBreak) + { + break; + } + } + + // + hasTrend = + // + IsValid(supplyTouch) || + IsValid(demandTouch) + // + ; + if (hasTrend) + { + // + trend = + // + supplyTouch > demandTouch + ? X_DIRECTION_BEARISH + : X_DIRECTION_BULLISH + // + ; + } + + // + // Check Trend ... + result = hasTrend; + if (!result) + { + // + Clean(); + return result; + } + + // + bool hasBullishTrend = IsBullish(trend); + bool hasBearishTrend = IsBearish(trend); + + // + // Find Order Block and FVG for Trend Approve ... + + // + bool isBullishTrendApproved = false; + bool isBearishTrendApproved = false; + + // + // Now We Have to Detect at least One OrderBlock with FVG ... + // for Trend Approvement ... + bool hasOrderBlock = HasOrderBlock(); + bool hasFairValueGap = HasFairValueGap(); + if (!hasOrderBlock && + !hasFairValueGap) + { + // + int count = 0; + bool has = false; + + // + XCFVG *fvg = NULL; + XCOrderBlock *ob = NULL; + + // + has = mtfState.HasBullishOrderBlocks(); + count = mtfState.CountBullishOrderBlocks(); + + // + if (has) + { + // + // Check Order Block ... + for (int i = 0; i < count; i++) + { + // + XCOrderBlock *iOB = mtfState.bullishOrderBlocks[i]; + + // + iOB.To(cTime); + + // + // Check From Passes ... + bool isFromPassed = iOB.From() > demandZone.From(); + if (!isFromPassed) + { + continue; + } + + // + // Must inside DemandZone ... + bool isInsideDemand = IsInsideDiff( + iOB, + demandZone // + ); + if (!isInsideDemand) + { + continue; + } + + // + // Check Started ... + XOHCL startedBar; + ENUM_X_DIRECTION startedDir; + bool isStarted = iOB.IsStarted( + X_DIRECTION_BULLISH, + startedBar, + startedDir // + ); + if (!isStarted) + { + // + startedBar.Clean(); + continue; + } + + // + // Converts to Box ... + XBoxZone obBox; + bool hasOBBox = ToBox( + obBox, + iOB // + ); + if (!hasOBBox) + { + // + obBox.Clean(); + startedBar.Clean(); + continue; + } + + // + // Check Zone Must not Used before ... + bool isUsed = IsBoxUsed( + obBox, + startedBar.Index() - 1, + zIndex // + ); + if (isUsed) + { + // + obBox.Clean(); + startedBar.Clean(); + continue; + } + + // + ob = iOB; + + // + obBox.Clean(); + startedBar.Clean(); + + // + break; + } + + // + // Detect Fair Value Gap ... + if (ob != NULL && + ob.IsValid()) + { + // + has = stfState.HasBullishFairValueGaps(); + count = stfState.CountBullishFairValueGaps(); + if (has) + { + // + // Check Fir Value Gap ... + for (int i = 0; i < count; i++) + { + // + XCFVG *iFVG = stfState.bullishFairValueGaps[i]; + + // + iFVG.To(cTime); + + // + // Check From Passes ... + bool isFromPassed = iFVG.From() > ob.From(); + if (!isFromPassed) + { + continue; + } + + // + // Check Started ... + XOHCL startedBar; + ENUM_X_DIRECTION startedDir; + bool isStarted = iFVG.IsStarted( + X_DIRECTION_BULLISH, + startedBar, + startedDir // + ); + if (!isStarted) + { + // + startedBar.Clean(); + continue; + } + + // + // Converts to Box ... + XBoxZone fvgBox; + bool hasFVGBox = ToBox( + fvgBox, + iFVG // + ); + if (!hasFVGBox) + { + // + fvgBox.Clean(); + startedBar.Clean(); + continue; + } + + // + // Check Inside Order Block ... + bool isInside = IsInsideDiff( + iFVG, + ob, + true // Force Side Out ... + ); + if (!isInside) + { + continue; + } + + // + fvg = iFVG; + + // + fvgBox.Clean(); + startedBar.Clean(); + + // + break; + } + } + else + { + // + ob = NULL; + } + } + + // + if (ob != NULL && + fvg != NULL) + { + // + orderBlock = ob; + fairValueGap = fvg; + } + + // + hasOrderBlock = HasOrderBlock(); + hasFairValueGap = HasFairValueGap(); + isBullishTrendApproved = hasOrderBlock && + hasFairValueGap; + } + + // + if (!isBullishTrendApproved) + { + // + has = mtfState.HasBearishOrderBlocks(); + count = mtfState.CountBearishOrderBlocks(); + + // + if (has) + { + // + // Check Order Block ... + for (int i = 0; i < count; i++) + { + // + XCOrderBlock *iOB = mtfState.bearishOrderBlocks[i]; + + // + iOB.To(cTime); + + // + // Check From Passes ... + bool isFromPassed = iOB.From() > supplyZone.From(); + if (!isFromPassed) + { + continue; + } + + // + // Must inside DemandZone ... + bool isInsideDemand = IsInsideDiff( + iOB, + supplyZone // + ); + if (!isInsideDemand) + { + continue; + } + + // + // Check Started ... + XOHCL startedBar; + ENUM_X_DIRECTION startedDir; + bool isStarted = iOB.IsStarted( + X_DIRECTION_BEARISH, + startedBar, + startedDir // + ); + if (!isStarted) + { + // + startedBar.Clean(); + continue; + } + + // + // Converts to Box ... + XBoxZone obBox; + bool hasOBBox = ToBox( + obBox, + iOB // + ); + if (!hasOBBox) + { + // + obBox.Clean(); + startedBar.Clean(); + continue; + } + + // + // Check Zone Must not Used before ... + bool isUsed = IsBoxUsed( + obBox, + startedBar.Index() - 1, + zIndex // + ); + if (isUsed) + { + // + obBox.Clean(); + startedBar.Clean(); + continue; + } + + // + ob = iOB; + + // + obBox.Clean(); + startedBar.Clean(); + + // + break; + } + + // + // Detect Fair Value Gap ... + if (ob != NULL && + ob.IsValid()) + { + // + has = stfState.HasBearishFairValueGaps(); + count = stfState.CountBearishFairValueGaps(); + if (has) + { + // + // Check Fir Value Gap ... + for (int i = 0; i < count; i++) + { + // + XCFVG *iFVG = stfState.bearishFairValueGaps[i]; + + // + iFVG.To(cTime); + + // + // Check From Passes ... + bool isFromPassed = iFVG.From() > ob.From(); + if (!isFromPassed) + { + continue; + } + + // + // Check Started ... + XOHCL startedBar; + ENUM_X_DIRECTION startedDir; + bool isStarted = iFVG.IsStarted( + X_DIRECTION_BEARISH, + startedBar, + startedDir // + ); + if (!isStarted) + { + // + startedBar.Clean(); + continue; + } + + // + // Converts to Box ... + XBoxZone fvgBox; + bool hasFVGBox = ToBox( + fvgBox, + iFVG // + ); + if (!hasFVGBox) + { + // + fvgBox.Clean(); + startedBar.Clean(); + continue; + } + + // + // Check Inside Order Block ... + bool isInside = IsInsideDiff( + iFVG, + ob, + true // Force Side Out ... + ); + if (!isInside) + { + continue; + } + + // + fvg = iFVG; + + // + fvgBox.Clean(); + startedBar.Clean(); + + // + break; + } + } + else + { + // + ob = NULL; + } + } + + // + if (ob != NULL && + fvg != NULL) + { + // + orderBlock = ob; + fairValueGap = fvg; + } + + // + hasOrderBlock = HasOrderBlock(); + hasFairValueGap = HasFairValueGap(); + isBearishTrendApproved = hasOrderBlock && + hasFairValueGap; + } + } + } + + // + // Check Trend Approved ... + bool isTrendApproved = + hasOrderBlock && + hasFairValueGap && + (isBullishTrendApproved || + isBearishTrendApproved); + result = isTrendApproved; + if (!result) + { + // + Clean(); + return result; + } + + // + // Prepare Working Zone ... + workingZone.symbol = symbol; + workingZone.period = period; + + // + workingZone.upper = supplyZone.Lower(); + workingZone.zoneUpper = supplyZone.Upper(); + + // + workingZone.lower = demandZone.Upper(); + workingZone.zoneLower = demandZone.Lower(); + + // + workingZone.from = from; + + // + double upper = workingZone.upper; + double range = + workingZone.upper - workingZone.lower; + double ranegPercent = range / 100; + double quarterValue = ranegPercent * 25; + + // + workingZone.quarter1 = upper - (quarterValue * 1); + workingZone.quarter2 = upper - (quarterValue * 2); + workingZone.quarter3 = upper - (quarterValue * 3); + + // + result = workingZone.IsValid(); + if (!result) + { + Clean(); + } + + // + return result; + } + + // + bool IsWorkingZoneDestroyed( + ENUM_X_DIRECTION &destroyedDir, + int barIndex = 0, + ENUM_TIMEFRAMES forPeriod = NULL // + ) + { + // + bool result = false; + + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + if (!IsValid(forPeriod)) + { + forPeriod = period; + } + + // + destroyedDir = X_DIRECTION_NONE; + + // + result = workingZone.IsValid(); + if (!result) + { + return result; + } + + // + result = workingZone.IsDestroyed( + destroyedDir, + barIndex, + forPeriod // + ); + + // + return result; + } + + // + bool DetectTrend( + ENUM_X_DIRECTION &trend, + int barIndex = 0, + ENUM_TIMEFRAMES forPeriod = NULL // + ) + { + // + bool result = false; + + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + if (forPeriod == NULL) + { + forPeriod = period; + } + + // + trend = X_DIRECTION_NONE; + + // + result = HasWorkingZone(); + if (!result) + { + return result; + } + + // + int FromIndex = iBarShift( + symbol, + forPeriod, + workingZone.from // + ); + + // + datetime supplyTouch = NULL; + datetime demandTouch = NULL; + for (int i = barIndex; i < FromIndex; i++) + { + // + XOHCL iBar; + bool isInited = iBar.Init( + symbol, + forPeriod, + i // + ); + if (!isInited) + { + continue; + } + + // + bool isTouchSupplyZone = + // + iBar.low < supplyZone.Lower() && + iBar.GetUp() > supplyZone.Lower() + // + ; + if (isTouchSupplyZone && + !IsValid(supplyTouch)) + { + supplyTouch = iBar.time; + } + + // + bool isTouchDemandZone = + // + iBar.high > demandZone.Upper() && + iBar.GetDown() < demandZone.Upper() + // + ; + if (isTouchDemandZone && + !IsValid(demandTouch)) + { + demandTouch = iBar.time; + } + + // + bool canBreak = + IsValid(supplyTouch) && + IsValid(demandTouch); + + // + iBar.Clean(); + + // + if (canBreak) + { + break; + } + } + + // + result = + // + IsValid(supplyTouch) || + IsValid(demandTouch) + // + ; + if (result) + { + // + trend = + // + supplyTouch > demandTouch + ? X_DIRECTION_BEARISH + : X_DIRECTION_BULLISH + // + ; + } + + // + return result; + } + + // + bool DetectStartZone( + ENUM_X_DIRECTION forDir, + XPOIState &state, + XC121SMCCycleHelper *cycleHelper // + ) + { + // + bool result = false; + + // + result = state.IsValid() && + state.HasChild() && + HasDirection(forDir); + if (!result) + { + return result; + } + + // + bool isBullish = IsBullish(forDir); + + // + int idx = -1; + int count = 0; + int has = false; + + // + // Supply Zones ... + has = state.HasSupplyZones(); + if (has) + { + // + idx = GetYoungest(state.supplyZones); + if (IsValidIndex(idx)) + { + startZone.supply = state.supplyZones[idx]; + } + } + + // + // Demand Zones ... + has = state.HasDemandZones(); + if (has) + { + // + idx = GetYoungest(state.demandZones); + if (IsValidIndex(idx)) + { + startZone.demand = state.demandZones[idx]; + } + } + + // + // Support Zones ... + has = state.HasSupportZones(); + if (has) + { + // + idx = GetYoungest(state.supportZones); + if (IsValidIndex(idx)) + { + startZone.support = state.supportZones[idx]; + } + } + + // + // Resistance Zones ... + has = state.HasResistanceZones(); + if (has) + { + // + idx = GetYoungest(state.resistanceZones); + if (IsValidIndex(idx)) + { + startZone.resistance = state.resistanceZones[idx]; + } + } + + // + // Other Zones ... + if (isBullish) + { + // + // Order Block ... + has = state.HasBullishOrderBlocks(); + if (has) + { + // + idx = GetYoungest(state.bullishOrderBlocks); + if (IsValidIndex(idx)) + { + startZone.ob = state.bullishOrderBlocks[idx]; + } + } + + // + // Fair Value Gap ... + has = state.HasBullishFairValueGaps(); + if (has) + { + // + idx = GetYoungest(state.bullishFairValueGaps); + if (IsValidIndex(idx)) + { + startZone.fvg = state.bullishFairValueGaps[idx]; + } + } + } + else + { + // + // Order Block ... + has = state.HasBearishOrderBlocks(); + if (has) + { + // + idx = GetYoungest(state.bearishOrderBlocks); + if (IsValidIndex(idx)) + { + startZone.ob = state.bearishOrderBlocks[idx]; + } + } + + // + // Fair Value Gap ... + has = state.HasBearishFairValueGaps(); + if (has) + { + // + idx = GetYoungest(state.bearishFairValueGaps); + if (IsValidIndex(idx)) + { + startZone.fvg = state.bearishFairValueGaps[idx]; + } + } + } + + // + bool hasOBFVG = startZone.HasOB() && + startZone.HasFVG(); + bool isOBStarted = false; + bool isFVGStarted = false; + bool isOBActivated = false; + bool isFVGActivated = false; + bool isOBInsideFVG = false; + bool isFVGInsideOB = false; + if (hasOBFVG) + { + // + ENUM_X_DIRECTION forDir = startZone.ob.GetDirection(); + + // + XOHCL startedBar; + ENUM_X_DIRECTION startedDir; + + // + isOBStarted = startZone.ob.IsStarted( + forDir, + startedBar, + startedDir // + ); + + // + isOBActivated = startZone.ob.IsActivated( + forDir, + startedBar, + startedDir // + ); + + // + forDir = startZone.fvg.GetDirection(); + + // + isFVGStarted = startZone.fvg.IsStarted( + forDir, + startedBar, + startedDir // + ); + + // + isFVGActivated = startZone.fvg.IsActivated( + forDir, + startedBar, + startedDir // + ); + + // + isOBInsideFVG = + IsInsideDiff( + startZone.ob, + startZone.fvg // + ) || + (isBullish + ? IsAboveDiff( + startZone.ob, + startZone.fvg, + true // IgnoreInside + ) + : IsBelowDiff( + startZone.ob, + startZone.fvg, + true // IgnoreInside + )); + // + isFVGInsideOB = + IsInsideDiff( + startZone.fvg, + startZone.ob // + ) || + (isBullish + ? IsAboveDiff( + startZone.fvg, + startZone.ob, + true // IgnoreInside + ) + : IsBelowDiff( + startZone.fvg, + startZone.ob, + true // IgnoreInside + )); + + // + startedBar.Clean(); + } + + // + result = + isOBStarted && + isFVGStarted && + !isOBActivated && + !isFVGActivated && + startZone.IsValid() && + (isOBInsideFVG || + isFVGInsideOB) && + (isBullish + ? startZone.IsBullish() + : startZone.IsBearish()); + if (!result) + { + // + startZone.Clean(); + + // + return result; + } + + // + return result; + } + + // + void DetectPriority( + ENUM_X121SMC_XWZ_PRIORITY &bullish, + ENUM_X121SMC_XWZ_PRIORITY &bearish, + int barIndex = 0, + ENUM_TIMEFRAMES forPeriod = NULL // + ) + { + // + bullish = X121SMC_XWZ_PRIORITY_NONE; + bearish = X121SMC_XWZ_PRIORITY_NONE; + + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + if (!IsValid(forPeriod)) + { + forPeriod = period; + } + + // + bool hasWorkingZone = HasWorkingZone(); + if (!hasWorkingZone) + { + return; + } + + // + XOHCL zBar; + bool isInited = zBar.Init( + symbol, + forPeriod, + barIndex // + ); + if (!isInited) + { + // + zBar.Clean(); + return; + } + + // + XOHCL cBar; + isInited = zBar.GetPreviousBar(cBar); + if (!isInited) + { + // + zBar.Clean(); + cBar.Clean(); + return; + } + + // + // ZoneUpper, Upper ... + if (cBar.low > workingZone.upper && + cBar.high < workingZone.zoneUpper && + zBar.low > workingZone.upper && + zBar.high < workingZone.zoneUpper) + { + // + bullish = X121SMC_XWZ_PRIORITY_NONE; + bearish = X121SMC_XWZ_PRIORITY_STRONG_HIGH; + } + // + // Upper, Quarter1 ... + else if (cBar.low > workingZone.quarter1 && + cBar.high < workingZone.upper && + zBar.low > workingZone.quarter1 && + zBar.high < workingZone.upper) + { + // + bullish = X121SMC_XWZ_PRIORITY_WEAK; + bearish = X121SMC_XWZ_PRIORITY_HIGH; + } + // + // Quarter1, Quarter2 ... + else if (cBar.low > workingZone.quarter2 && + cBar.high < workingZone.quarter1 && + zBar.low > workingZone.quarter2 && + zBar.high < workingZone.quarter1) + { + // + bullish = X121SMC_XWZ_PRIORITY_LOW; + bearish = X121SMC_XWZ_PRIORITY_REGULAR; + } + // + // Quarter2, Quarter3 ... + else if (cBar.low > workingZone.quarter3 && + cBar.high < workingZone.quarter2 && + zBar.low > workingZone.quarter3 && + zBar.high < workingZone.quarter2) + { + // + bullish = X121SMC_XWZ_PRIORITY_REGULAR; + bearish = X121SMC_XWZ_PRIORITY_LOW; + } + // + // Quarter3, Lower ... + else if (cBar.low > workingZone.lower && + cBar.high < workingZone.quarter3 && + zBar.low > workingZone.lower && + zBar.high < workingZone.quarter3) + { + // + bullish = X121SMC_XWZ_PRIORITY_HIGH; + bearish = X121SMC_XWZ_PRIORITY_WEAK; + } + // + // Lower, ZoneLower ... + else if (cBar.low > workingZone.zoneLower && + cBar.high < workingZone.lower && + zBar.low > workingZone.zoneLower && + zBar.high < workingZone.lower) + { + // + bullish = X121SMC_XWZ_PRIORITY_STRONG_HIGH; + bearish = X121SMC_XWZ_PRIORITY_NONE; + } + + // + zBar.Clean(); + cBar.Clean(); + } + + // + bool HasWorkingZoneConditions( + ENUM_X_DIRECTION &conditionsDir, + XPOIState &state, + int barIndex = 0, + ENUM_TIMEFRAMES forPeriod = NULL // + ) + { + // + bool result = false; + + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + conditionsDir = X_DIRECTION_NONE; + + // + result = HasWorkingZone(); + if (!result) + { + return result; + } + + // + XBoxZone appliedBox; + + // + // Clean Condition Bars ... + workingZone.CleanConditionBars(); + + // + // Validate ... + result = state.IsValid() && + state.HasChild(); + if (!result) + { + // + workingZone.CleanConditionBars(); + return result; + } + + // + if (!IsValid(forPeriod)) + { + forPeriod = period; + } + + // + datetime cTime = iTime( + symbol, + forPeriod, + barIndex // + ); + + // + // Check Supply Zone ... + + // + XBoxZone supplyBox; + bool hasSupplyBox = + supplyZone != NULL && + supplyZone.IsValid() && + ToBox( + supplyBox, + supplyZone // + ); + if (hasSupplyBox) + { + // + result = CheckBoxForTradeConditions( + supplyBox, + appliedBox, + workingZone.swingBar, + workingZone.breakerBar, + workingZone.rejectionBar, + workingZone.momentumBar, + state, + barIndex, + forPeriod // + ); + + // + if (result) + { + conditionsDir = X_DIRECTION_BEARISH; + } + } + + // + // Check Demand Zone ... + XBoxZone demandBox; + bool hasDemandBox = false; + if (!result) + { + // + hasDemandBox = + demandZone != NULL && + demandZone.IsValid() && + ToBox( + demandBox, + demandZone // + ); + if (hasDemandBox) + { + // + result = CheckBoxForTradeConditions( + demandBox, + appliedBox, + workingZone.swingBar, + workingZone.breakerBar, + workingZone.rejectionBar, + workingZone.momentumBar, + state, + barIndex, + forPeriod // + ); + + // + if (result) + { + conditionsDir = X_DIRECTION_BULLISH; + } + } + } + + // + if (!result) + { + workingZone.CleanConditionBars(); + } + + // + supplyBox.Clean(); + demandBox.Clean(); + appliedBox.Clean(); + + // + return result; + } + + // + double GetSpread() + { + // + double result = 0; + + // + if (!IsValid(symbol)) + { + return result; + } + + // + result = GetSpread( + symbol // + ); + + // + return result; + } + + // +}; diff --git a/BKPS/14031206/Documents/BKP/xsupdem/x-saherelm.x-121.smc.alert.ea.mq5 b/BKPS/14031206/Documents/BKP/xsupdem/x-saherelm.x-121.smc.alert.ea.mq5 new file mode 100644 index 0000000..1eb6e98 --- /dev/null +++ b/BKPS/14031206/Documents/BKP/xsupdem/x-saherelm.x-121.smc.alert.ea.mq5 @@ -0,0 +1,464 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center XTest MQL5 Expert Advisor +// ------------------------------------------------- +// Name: X121SMCEA +// Description: an Exper Advisor which used Panels +// +// 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 X121SMCEA" +#property strict + +// +#define ShortName "X121SMCEA" + +// +// Imports ... +#include "../X121SMCEA/Experts/x-121.smc.expert.alert.class.mq5" + +// +// Inputs ... + +// +// Common ... +input group "Common"; +input long eaMagicNumber = 78692110; // Magic Number +input int eaSlippage = 10; // Slippgae +input string eaLogSuffix = ""; // Log Suffix + +// +// Symbols ... +input group "Symbols"; +input bool eaMultiSymbol = false; // Use Multi Symbol +input string eaSymbols = "EURUSDb"; // Trading Symbols + +// +// Signalling ... +input group "Signalling"; +input bool eaAllowLong = true; // Allow Long Signals +input bool eaAllowShort = true; // Allow Short Signals +input int eaMaxAllowedLongs = 5; // Max Allowed Long Signals +input int eaMaxAllowedShorts = 5; // Max Allowed Short Signals +input bool eaUseMaxAllowedSignalsPerSymbol = true; // Use Max Allowed Signal Types Per Symbol +input double eaLastPositionProfitForAcceptNextInPoint = 0; // Last Position Profit In Points for Accept new Signal +input int eaDelaysBetweenTwoSignalsInBar = 0; // Delay between two Signals in Bars +input double eaMaxAllowedSpread = 25; // Max Allowed Spread for Signalling +input int eaMinRequiredVerificationForSpreadPass = 20; // Minimum Spread Verification for Signalling + +// +// Trade ... +input group "Trade"; +input bool eaAllowTrade = false; // Allow Open Trade On Signals +input string eaStartTradeAt = ""; // Enable Trade on Signals on Time +input string eaStopTradeAt = ""; // Enable Trade on Signals on Time +input string eaCloseAllTradesAt = ""; // Enable Close All Trades on Signals on Time + +// +// Risk Management ... +input group "Risk Management"; +input double eaR2R = 4; // Signallers Risk to Reward Ratio +input double eaVolume = 0; // Static Volume +input double eaStaticBalance = 1000; // Static Balance +input double eaBalancePerTrade = 10; // Balance Used in Each Trade +input double eaRiskPercentPerBalance = 0; // Risk Percent Per Balance in Each Trade +input bool eaDynamicRiskManagement = false; // Dynamic Risk Management +input bool eaUseDynamicVolume = false; // Use Dynamic Volume +input double eaDynamicVolumeStep = 0.01; // Increase Volume Step +input double eaDynamicVolumeBalanceFactor = 200; // Balance Factor for Generate Dynamic Volume +input double eaMaxAllowedDrawdownToOpenTrades = 3; // Max Allowed Drawdown for Open Trades +input int eaMaxAllowedSLToPauseSignallingPerSymbol = 2; // Max Allowed SL for Pause Signalling Per Symbol +input int eaPauseSignallingAfterReachesMaxAllowedSLInSecconds = 7200; // Pause Signalling Per Symbol afte Max Allowed SL Reached In Seconds + +// +// Protection ... +input group "Protection"; +input bool eaAllowHedging = false; // Allow Hedge Positions +input int eaMinOpenTradesFroHedging = 4; // Minimum Open Positions for Hedging +input double eaHedgingMinVolumeStep = 0.01; // Minimum Volume Step for Hedging +input double eaHedgeingMinRequiredProfitPerVolumeStep = 2.0; // Minimum Required Profit Per Volume Step for Hedging + +// +// Alert ... +// Here we Provider All Requirements for +// Configuring Alert Provider ... +input group "Alert"; +input bool eaEnableAlerts = true; // Enable Alerts +input bool eaLogAlerts = true; // Log Alerts +input bool eaMailAlerts = false; // Mail Alerts +input bool eaPushAlerts = true; // Push Alerts +input bool eaTerminalAlerts = false; // Terminal Alerts + +// +// Time Report ... +input group "Reports"; +input bool eaReportNewMonths = false; // Report New Month +input bool eaReportNewWeeks = false; // Report New Weeks +input bool eaReportNewDays = true; // Report New Days +input bool eaReportNewHours = false; // Report New Hours + +// +// Define Local Variables ... + +XC121SMCExpert *eaExpert; + +// +// Event Handlers ... + +// +// Initialization ... +int OnInit() +{ + // + // Validate Inputs and Required Parameters + // for EA to Works fine ... + if (!ValidateInputs()) + { + return INIT_PARAMETERS_INCORRECT; + } + + // + // Initialize Timer ... + if (!InitTimer()) + { + return INIT_FAILED; + } + + // + // Configure EA Expert Class ... + eaExpert = new XC121SMCExpert(); + + // + // Event Handlers ... + eaExpert.OnSignalEventListener = OnSignalRecieved; + eaExpert.OnDealsChangedEventListener = OnDealsChanged; + eaExpert.OnOrdersChangedEventListener = OnOrdersChanged; + eaExpert.OnPositionSLEventListener = OnStopLossTriggered; + eaExpert.OnPositionTPEventListener = OnTakeProfitTriggered; + eaExpert.OnPositionsChangedEventListener = OnPositionsChanged; + eaExpert.OnPositionForceCloseEventListener = OnPositionForceClosed; + + // + // Common ... + eaExpert.MagicNumber(eaMagicNumber); + eaExpert.Slippage(eaSlippage); + eaExpert.TagPrefix(eaLogSuffix); + + // + // Symbol ... + eaExpert.SetSymbol(_Symbol); + eaExpert.SetPeriod(_Period); + eaExpert.Symbols(eaSymbols); + eaExpert.MultiSymbol(eaMultiSymbol); + + // + // Signalling ... + eaExpert.AllowLong(eaAllowLong); + eaExpert.AllowShort(eaAllowShort); + eaExpert.MaxAllowedLongs(eaMaxAllowedLongs); + eaExpert.MaxAllowedShorts(eaMaxAllowedShorts); + eaExpert.UseMaxAllowedSignalsPerSymbol(eaUseMaxAllowedSignalsPerSymbol); + eaExpert.LastPositionProfitForAcceptNextInPoint(eaLastPositionProfitForAcceptNextInPoint); + eaExpert.DelaysBetweenTwoSignalsInBar(eaDelaysBetweenTwoSignalsInBar); + eaExpert.MaxAllowedSpread(eaMaxAllowedSpread); + eaExpert.MinRequiredVerificationForSpreadPass(eaMinRequiredVerificationForSpreadPass); + + // + // Trade ... + eaExpert.AllowTrade(eaAllowTrade); + eaExpert.StartTradeAt(eaStartTradeAt); + eaExpert.StopTradeAt(eaStopTradeAt); + eaExpert.CloseAllTradesAt(eaCloseAllTradesAt); + + // + // Risk Management ... + eaExpert.R2R(eaR2R); + eaExpert.Volume(eaVolume); + eaExpert.StaticBalance(eaStaticBalance); + eaExpert.BalancePerTrade(eaBalancePerTrade); + eaExpert.RiskPercentPerBalance(eaRiskPercentPerBalance); + eaExpert.DynamicRiskManagement(eaDynamicRiskManagement); + eaExpert.UseDynamicVolume(eaUseDynamicVolume); + eaExpert.DynamicVolumeStep(eaDynamicVolumeStep); + eaExpert.DynamicVolumeBalanceFactor(eaDynamicVolumeBalanceFactor); + eaExpert.MaxAllowedDrawdownToOpenTrades(eaMaxAllowedDrawdownToOpenTrades); + eaExpert.MaxAllowedSLToPauseSignallingPerSymbol(eaMaxAllowedSLToPauseSignallingPerSymbol); + eaExpert.PauseSignallingAfterReachesMaxAllowedSLInSecconds(eaPauseSignallingAfterReachesMaxAllowedSLInSecconds); + + // + // Protection ... + eaExpert.AllowHedging(eaAllowHedging); + eaExpert.MinOpenTradesFroHedging(eaMinOpenTradesFroHedging); + eaExpert.HedgingMinVolumeStep(eaHedgingMinVolumeStep); + eaExpert.HedgeingMinRequiredProfitPerVolumeStep(eaHedgeingMinRequiredProfitPerVolumeStep); + + // + // Alert ... + eaExpert.SetAlertEnableAlerts(eaEnableAlerts); + eaExpert.SetAlertLogAlerts(eaLogAlerts); + eaExpert.SetAlertMailAlerts(eaMailAlerts); + eaExpert.SetAlertPushAlerts(eaPushAlerts); + eaExpert.SetAlertTerminalAlerts(eaTerminalAlerts); + + // + // Reports ... + eaExpert.ReportNewMonths(eaReportNewMonths); + eaExpert.ReportNewWeeks(eaReportNewWeeks); + eaExpert.ReportNewDays(eaReportNewDays); + eaExpert.ReportNewHours(eaReportNewHours); + + // + bool isInited = eaExpert.HandleOnInit(); + if (!isInited) + { + 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 + + // + // Destroy Timer ... + eaExpert.HandleOnDeInit(); + + // + delete eaExpert; + + // + ZeroMemory(eaExpert); +} + +// +// On Tick Handler ... +void OnTick() +{ + eaExpert.HandleOnTick(); +} + +// +// Handle On Trade Event ... +void OnTrade() +{ + eaExpert.HandleOnTrade(); +} + +// +// On Timer ... +void OnTimer() +{ + eaExpert.HandleOnTimer(); +} + +// +// Chart Event Handler ... +void OnChartEvent( + const int id, + const long &lparam, + const double &dparam, + const string &sparam // +) +{ + eaExpert.HandleOnChartEvent(id, lparam, dparam, sparam); +} + +// +// Event Listeners ... + +/** + * Do What we Want by Specific Signal ... + * + * @param signal: XSignal instance ... + * @param conditions: XStrategyConditions instance ... + */ +void OnSignalRecieved( + XSignal &signal, + X121SMCStrategyConditions &conditions // +) +{ + // + eaExpert.HandleOnSignalRecieved( + signal, + conditions // + ); +} + +/** + * Handle StopLoss Triggered Positions ... + * + * @param deal: XDeal instance ... + */ +void OnStopLossTriggered(const XDeal &deal) +{ + eaExpert.HandleOnStopLossTriggered(deal); +} + +/** + * Handle Take Profit Triggered Positions ... + * + * @param deal: XDeal instance ... + */ +void OnTakeProfitTriggered(const XDeal &deal) +{ + eaExpert.HandleOnTakeProfitTriggered(deal); +} + +/** + * Handle Force Close a Position ... + * + * @param ticket: ULONG ... + * @param position: XPosition instance ... + * @param comment: String ... + */ +void OnPositionForceClosed( + const ulong ticket, + const XPosition &position, + const string comment // +) +{ + // + eaExpert.HandleOnPositionForceClosed( + ticket, + position, + comment // + ); +} + +/** + * Handle Deals Changes ... + * + * @param count: Integer, Number of Changes ... + */ +void OnDealsChanged(int count) +{ + eaExpert.HandleOnDealsChanged(count); +} + +/** + * Handle Orders Changes ... + * + * @param count: Integer, Number of Changes ... + */ +void OnOrdersChanged(int count) +{ + eaExpert.HandleOnOrdersChanged(count); +} + +/** + * Handle Positions Changes ... + * + * @param count: Integer, Number of Changes ... + */ +void OnPositionsChanged(int count) +{ + eaExpert.HandleOnPositionsChanged(count); +} + +// +// Custom Functions ... + +/** + * Validate all Inputs of Expert Adviser ... + * + * @return ( bool ) + */ +bool ValidateInputs() +{ + // + bool result = false; + + // + string errMessage = ""; + + // + bool isCommonValid = ( + // + eaSlippage > 0 && + eaMagicNumber > 0 + // + ); + if (!isCommonValid) + { + // + errMessage += "common configurations error;" + "\n"; + } + + // + result = + // + // Common ... + isCommonValid && + // + // Otere ... + true + // + ; + + // + if (!result) + { + // + // Since here Logger not Initiallized, we Use Raw Print Command ... + Print(ShortName + " Errors: \n", errMessage); + } + + // + return result; +} + +/** + * Initialize Timer ... + * + * @return ( bool ) + */ +bool InitTimer() +{ + // + bool result = false; + + // + // TODO: Initialize Timer if necessary ... + // result = EventSetTimer(1); + // result = EventSetMillisecondTimer(100); + result = true; + + // + return result; +} + +/** + * Destroy Timer ... + */ +void DestroyTimer() +{ + // + // TODO: Use This ... + // EventKillTimer(); +} + +// diff --git a/BKPS/14031206/Documents/Diagrams/Position Protection.drawio b/BKPS/14031206/Documents/Diagrams/Position Protection.drawio new file mode 100644 index 0000000..d425cb2 --- /dev/null +++ b/BKPS/14031206/Documents/Diagrams/Position Protection.drawio @@ -0,0 +1,279 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/BKPS/14031206/Documents/JsModules/x-color.tools.js b/BKPS/14031206/Documents/JsModules/x-color.tools.js new file mode 100644 index 0000000..c3ac5f9 --- /dev/null +++ b/BKPS/14031206/Documents/JsModules/x-color.tools.js @@ -0,0 +1,506 @@ +/** + * XColor Tools Module ... + * a module for handle colorify text contents in node js ... + * + * Maintainer + * + * Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) + */ + +// +//#region Module Imports ... +const XValueTools = require("./x-value.tools"); +//#endregion + +// +//#region Constants ... +/** + * these are available style which can applied to an string ... + */ +const AVAILABLE_STYLES = { + // + Bold: "\x1b[1m", + Dim: "\x1b[2m", + Underlined: "\x1b[4m", + Blink: "\x1b[5m", + ReverseFandB: "\x1b[7m", + Hidden: "\x1b[8m", + // + // Commonly used for reset all Styles ... + Reset: "\x1b[0m" +}; + +/** + * these are available foreground colors which can applied to an string ... + */ +const AVAILABLE_FOREGROUND_COLORS = { + Default: "\x1b[39m", + Black: "\x1b[30m", + Red: "\x1b[31m", + Green: "\x1b[32m", + Yellow: "\x1b[33m", + Blue: "\x1b[34m", + Magenta: "\x1b[35m", + Cyan: "\x1b[36m", + LightGray: "\x1b[37m", + DarkGray: "\x1b[90m", + LightRed: "\x1b[91m", + LightGreen: "\x1b[92m", + LightYellow: "\x1b[93m", + LightBlue: "\x1b[94m", + LightMagenta: "\x1b[95m", + LightCyan: "\x1b[96m", + White: "\x1b[97m", +}; + +/** + * these are available background colors which can applied to an string ... + */ +const AVAILABLE_BACKGROUND_COLORS = { + Default: "\x1b[49m", + Black: "\x1b[40m", + Red: "\x1b[41m", + Green: "\x1b[42m", + Yellow: "\x1b[43m", + Blue: "\x1b[44m", + Magenta: "\x1b[45m", + Cyan: "\x1b[46m", + LightGray: "\x1b[47m", + DarkGray: "\x1b[100m", + LightRed: "\x1b[101m", + LightGreen: "\x1b[102m", + LightYellow: "\x1b[103m", + LightBlue: "\x1b[104m", + LightMagenta: "\x1b[105m", + LightCyan: "\x1b[106m", + White: "\x1b[107m", +}; + +/** + * these are available style names, which exports from module and + * users can use them ... + */ +const STYLE_NAMES = { + Bold: "Bold", + Dim: "Dim", + Underlined: "Underlined", + Blink: "Blink", + ReverseFandB: "ReverseFandB", + Hidden: "Hidden", + Reset: "Reset", +}; + +/** + * these are available color names, which exports from module and + * users can use them ... + */ +const COLOR_NAMES = { + Default: "Default", + Black: "Black", + Red: "Red", + Green: "Green", + Yellow: "Yellow", + Blue: "Blue", + Magenta: "Magenta", + Cyan: "Cyan", + LightGray: "LightGray", + DarkGray: "DarkGray", + LightRed: "LightRed", + LightGreen: "LightGreen", + LightYellow: "LightYellow", + LightBlue: "LightBlue", + LightMagenta: "LightMagenta", + LightCyan: "LightCyan", + White: "White", +}; +//#endregion + +// +//#region Actions ... +/** + * apply specified style and color on a content ... + * + * @param {string} content specified content for styling ... + * @param {string} color specific color name for using to styling ... + * @param {string} style soecufic style name to use ... + * @param {boolean} toForeground apply specified color as foreground ... + * @param {boolean} toBackground apply specified color as background ... + * @returns {string} styled content ... + */ +function apply( + content, + color, + style, + toForeground = true, + toBackground = false +) { + // + let result = content; + + // + // Validate Arg ... + if (!XValueTools.isValidArg(content)) { + return result; + } + + // + // Detect and Validate Style and Apply it ... + let eStyle = AVAILABLE_STYLES[style]; + if (XValueTools.isValidArg(eStyle)) { + result = `${eStyle}${result}${AVAILABLE_STYLES.Reset}`; + } + + // + // Detect and Validate Foreground Color and Apply it ... + let eFColor = AVAILABLE_FOREGROUND_COLORS[color]; + if ( + !!toForeground + && XValueTools.isValidArg(eFColor) + ) { + result = `${eFColor}${result}${AVAILABLE_STYLES.Reset}`; + } + + // + // Detect and Validate Background Color and Apply it ... + let eBColor = AVAILABLE_BACKGROUND_COLORS[color]; + if ( + !!toBackground + && XValueTools.isValidArg(eBColor) + ) { + result = `${eBColor}${result}${AVAILABLE_STYLES.Reset}`; + } + +} + +/** + * apply specific style on a content ... + * + * @param {string} content specific content which going to styled ... + * @param {string} style a member of STYLE_NAMES which specified that which style going to applied to content ... + * @returns {string} styled content ... + */ +function applyStyle(content, style) { + // + // Validate Arg ... + if (!XValueTools.isValidArg(content)) { + return content; + } + + // + let eStyle = AVAILABLE_STYLES[style]; + if (eStyle === undefined) { + return content; + } + + // + return `${eStyle}${content}${AVAILABLE_STYLES.Reset}`; +} + +/** + * apply specific foreground color on a content ... + * + * @param {string} content specific content which going to colorified ... + * @param {string} color a member of COLOR_NAMES which specified that which color going to applied to content ... + * @returns {string} colorified content ... + */ +function applyForegroundColor(content, color) { + // + // Validate Arg ... + if (!XValueTools.isValidArg(content)) { + return content; + } + + // + let eColor = AVAILABLE_FOREGROUND_COLORS[color]; + if (eColor === undefined) { + return content; + } + + // + return `${eColor}${content}${AVAILABLE_STYLES.Reset}`; +} + +/** + * apply specific background color on a content ... + * + * @param {string} content specific content which going to colorified ... + * @param {string} color a member of COLOR_NAMES which specified that which color going to applied to content ... + * @returns {string} colorified content ... + */ +function applyBackgroundColor(content, color) { + // + // Validate Arg ... + if (!XValueTools.isValidArg(content)) { + return content; + } + + // + let eColor = AVAILABLE_BACKGROUND_COLORS[color]; + if (eColor === undefined) { + return content; + } + + // + return `${eColor}${content}${AVAILABLE_STYLES.Reset}`; +} + +/** + * generate style and color applier expression ... + * + * @param {string} color specific color name for using to styling ... + * @param {string} style soecufic style name to use ... + * @param {boolean} reset close applier string by reset styles ... + * @param {boolean} toForeground apply specified color as foreground ... + * @param {boolean} toBackground apply specified color as background ... + * @returns {string} style and color applier string ... + */ +function getApplier( + style = "", + color = "", + reset = false, + toForeground = true, + toBackground = false +) { + // + let result = ""; + + // + // Detect and Validate Style and Apply it ... + let eStyle = AVAILABLE_STYLES[style]; + if (XValueTools.isValidArg(eStyle)) { + result = `${eStyle}`; + } + + // + // Detect and Validate Foreground Color and Apply it ... + let eFColor = AVAILABLE_FOREGROUND_COLORS[color]; + if ( + !!toForeground + && XValueTools.isValidArg(eFColor) + ) { + result = `${eFColor}`; + } + + // + // Detect and Validate Background Color and Apply it ... + let eBColor = AVAILABLE_BACKGROUND_COLORS[color]; + if ( + !!toBackground + && XValueTools.isValidArg(eBColor) + ) { + result = `${eBColor}`; + } + + // + if ( + !!reset && + result.length > 0 + ) { + result = `${result}${AVAILABLE_STYLES.Reset}`; + } + + // + return result; +} + +/** + * generate style applier expression ... + * + * @param {string} style soecufic style name to use ... + * @param {boolean} reset close applier string by reset styles ... + * @returns {string} style applier string ... + */ +function getStyleApplier( + style = "", + reset = false +) { + // + let result = ""; + + // + // Detect and Validate Style and Apply it ... + let eStyle = AVAILABLE_STYLES[style]; + if (XValueTools.isValidArg(eStyle)) { + result = `${eStyle}`; + } + + // + if ( + !!reset && + result.length > 0 + ) { + result = `${result}${AVAILABLE_STYLES.Reset}`; + } + + // + return result; +} + +/** + * generate color applier expression ... + * + * @param {string} color specific color name for using to styling ... + * @param {boolean} reset close applier string by reset styles ... + * @param {boolean} toForeground apply specified color as foreground ... + * @param {boolean} toBackground apply specified color as background ... + * @returns {string} color applier string ... + */ +function getColorApplier( + color = "", + reset = false, + toForeground = true, + toBackground = false +) { + // + let result = ""; + + // + // Detect and Validate Foreground Color and Apply it ... + let eFColor = AVAILABLE_FOREGROUND_COLORS[color]; + if ( + !!toForeground + && XValueTools.isValidArg(eFColor) + ) { + result = `${eFColor}`; + } + + // + // Detect and Validate Background Color and Apply it ... + let eBColor = AVAILABLE_BACKGROUND_COLORS[color]; + if ( + !!toBackground + && XValueTools.isValidArg(eBColor) + ) { + result = `${eBColor}`; + } + + // + if ( + !!reset && + result.length > 0 + ) { + result = `${result}${AVAILABLE_STYLES.Reset}`; + } + + // + return result; +} + +/** + * colorified specific content ... + * + * @param {string} content specified content for styling ... + * @param {string} color specific color name for using to styling ... + * @param {boolean} toForeground apply specified color as foreground ... + * @param {boolean} toBackground apply specified color as background ... + * @returns {string} + */ +function colorifyContent( + content = "", + color = "", + toForeground = true, + toBackground = false +) { + // + let result = content; + + // + if (!XValueTools.isValidArg(content)) { + return result; + } + + // + // Finde Colors ... + + // + // Detect and Validate Foreground Color and Apply it ... + let eFColor = AVAILABLE_FOREGROUND_COLORS[color]; + if ( + !!toForeground + && XValueTools.isValidArg(eFColor) + ) { + result = `${eFColor}${result}`; + } + + // + // Detect and Validate Background Color and Apply it ... + let eBColor = AVAILABLE_BACKGROUND_COLORS[color]; + if ( + !!toBackground + && XValueTools.isValidArg(eBColor) + ) { + result = `${eBColor}${result}`; + } + + // + if ( + result.length > 0 + && ( + XValueTools.isValidArg(eFColor) || + XValueTools.isValidArg(eBColor) + ) + ) { + result = `${result}${AVAILABLE_STYLES.Reset}`; + } + + // + return result; +} + +/** + * apply style on specific content ... + * + * @param {string} content specified content for styling ... + * @param {string} style soecufic style name to use ... + * @returns {string} + */ +function stylifiyContent( + content = "", + style = "", +) { + // + let result = content; + + // + if (!XValueTools.isValidArg(content)) { + return result; + } + + // + // Detect and Validate Style and Apply it ... + let eStyle = AVAILABLE_STYLES[style]; + if (XValueTools.isValidArg(eStyle)) { + result = `${eStyle}${result}`; + } + + // + if ( + result.length > 0 + && XValueTools.isValidArg(eStyle) + ) { + result = `${result}${AVAILABLE_STYLES.Reset}`; + } + + // + return result; +} +//#endregion + +// +//#region Module Exports ... +module.exports = { + // + STYLE_NAMES, + COLOR_NAMES, + // + apply, + applyStyle, + getApplier, + getColorApplier, + getStyleApplier, + colorifyContent, + stylifiyContent, + applyForegroundColor, + applyBackgroundColor, +} +//#endregion \ No newline at end of file diff --git a/BKPS/14031206/Documents/JsModules/x-file.tools.js b/BKPS/14031206/Documents/JsModules/x-file.tools.js new file mode 100644 index 0000000..2a3535d --- /dev/null +++ b/BKPS/14031206/Documents/JsModules/x-file.tools.js @@ -0,0 +1,887 @@ +/** + * XFile Tools Module ... + * a module for handle all file/folder manipulating task in node js ... + * + * Maintainer + * + * Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) + */ + +// +//#region Module Imports ... +const fs = require('fs'); +const os = require('os'); +const Path = require('path'); +const http = require('http'); +const https = require('https'); +const XValueTools = require('./x-value.tools'); +//#endregion + +// +//#region Constants ... +/** + * current os path separators ... + */ +const PathSeparator = Path.sep; + +/** + * current directory ... + */ +const CurrentDir = __dirname; +//#endregion + +// +//#region Actions ... +// +//#region Global ... +/** + * retrieve a path status ... + * + * @param {string} path a path value to check ... + * @returns an stat object ... + */ +function getStatus(path = '') { + // + if (!XValueTools.isValidArg(path)) { + return undefined; + } + + // + return fs.statSync(path); +} + +/** + * retrieve user's Home path ... + * + * @returns {string} a path ... + */ +function getHomePath() { + return os.homedir(); +} +//#endregion + +// +//#region Path ... +/** + * retrieve the base name of specific address path ... + * + * @param {string} path address of file or folder ... + * @returns string ... + */ +function basename(path = '') { + // + if (!XValueTools.isValidArg(path)) { + return ''; + } + + // + const result = Path.basename(path); + return result; +} + +/** + * join several path segments together ... + * + * @param {...string} path path params ... + * @returns a joined paths ... + */ +function joinPath(...path) { + return Path.join(...path); +} + +/** + * resolve a relative path to absolute ... + * + * @param {string[]} path a path value to check ... + * @returns {string} + */ +function resolvePath(...path) { + return Path.resolve(...path); +} +//#endregion + +// +//#region File ... +/** + * determines a path destination is a file or not ... + * + * @param {string} path a path value to check ... + * @returns a boolean value ... + */ +function isFileExists(path = '') { + // + if (!XValueTools.isValidArg(path)) { + return false; + } + + // + try { + const stat = getStatus(path); + if (!stat) { + return false; + } + + // + return stat.isFile(); + } catch { + return false; + } +} + +/** + * remove a file ... + * + * @param {string} path a file path ... + * @returns {Promise} action done or not ... + */ +function removeFile(path = '') { + return new Promise((resolve) => { + // + if (!isFileExists(path)) { + resolve(false); + } + + // + fs.unlink(path, (err) => { + // + if (err) { + resolve(false); + return; + } + + // + resolve(true); + }); + }); +} + +/** + * copy a file to destination path ... + * + * @param {string} source source file path ... + * @param {string} dest dest folder path ... + * @returns {Promise} action done or not ... + */ +function copyFile( + source = '', + dest = '' +) { + return new Promise((resolve) => { + // + if ( + !isFileExists(source) || + !isDirectoryExists(dest) + ) { + resolve(false); + return; + } + + // + const destFilePath = Path.join(dest, Path.basename(source)); + fs.copyFile(source, destFilePath, (err) => { + // + if (err) { + resolve(false); + return; + } + + // + resolve(true); + }); + }); +} + +/** + * reading specified file content ... + * + * @param {string} path a file path ... + * @returns {Promise} file content ... + */ +function readFile(path = '') { + return new Promise((resolve) => { + // + if (!isFileExists(path)) { + resolve(''); + return; + } + + // + fs.readFile(path, 'utf8', (err, content) => { + // + if (err) { + resolve(undefined); + return; + } + + // + resolve(content); + }); + }); +} + +/** + * write content to a file ... + * + * @param {string} path a file path ... + * @param {string} content the content which going to write to the file ... + * @param {bool} overwrite determines file overwrite if exists ... + * @returns {Promise} action done or not ... + */ +function writeFile( + path = '', + content = '', + overwrite = true +) { + return new Promise((resolve) => { + // + if (isFileExists(path) && !overwrite) { + // + resolve(false); + return; + } + + // + // Normalize Content ... + content = XValueTools.isValidArg(content) ? + content : + ''; + + // + fs.writeFile(path, content, (err) => { + // + if (err) { + // + resolve(false); + return; + } + + // + resolve(true); + }); + }); +} + +/** + * create a file ... + * + * @param {string} path file path ... + * @param {string} fileName file name ... + * @returns {Promise} action done or not ... + */ +function createFile( + path = '', + fileName = '' +) { + return new Promise((resolve) => { + // + const filePath = Path.join(path, fileName); + if ( + isFileExists(filePath) || + !XValueTools.isValidArg(path) || + !XValueTools.isValidArg(fileName) + ) { + // + resolve(false); + return; + } + + // + fs.writeFile(filePath, '', (err) => { + // + if (err) { + // + resolve(false); + return; + } + + // + resolve(true); + }); + }); +} + +/** + * remove a file name extension ... + * + * @param {string} name + * @returns {string} name without extension ... + */ +function removeFileExtension(name = '') { + return name.substring(0, name.lastIndexOf('.')) || name; +} + +/** + * retrieve a file extension ... + * + * @param {string} path a path which locate a file ... + * @returns {string} + */ +function getFileExtension(path = '') { + // + let result = ""; + + // + // Validate Arg ... + if ( + !XValueTools.isValidArg(path) + || !isFileExists(path) + ) { + return result; + } + + // + // Retrieve just file name ... + const fileName = basename(path); + result = fileName.replace( + removeFileExtension(fileName), + "" + ); + + // + return result; +} + +/** + * retrieve all files list recursively from specific path ... + * + * @param {string} path a source folder path ... + * @param {string[]} extensions which file extensions need to be listed, live empty for all files ... + * @returns {Promise} + */ +async function getRecursiveFilesList( + path = "", + extensions = [] +) { + // + let result = []; + + // + // Validate Args ... + if ( + !XValueTools.isValidArg(path) + || !isDirectoryExists(path) + ) { + return result; + } + + // + const contents = await getDirectoryContents(path); + for (const item of contents) { + // + const itemPath = joinPath( + path, + item + ); + + // + const isItemFile = isFileExists(itemPath); + if (isItemFile) { + // + const itemFileExtension = getFileExtension(itemPath); + const isFileInSupportedExtensions = + extensions === undefined || extensions.length === 0 + ? true + : extensions.includes(itemFileExtension) + ; + if (isFileInSupportedExtensions) { + result.push(itemPath); + } + } else if (isDirectoryExists(itemPath)) { + // + const itemPathFiles = await getRecursiveFilesList(itemPath, extensions); + result.push(...itemPathFiles); + } + } + + // + return result; +} + +/** + * Extract Specific files from a folder and it's content ... + * + * @param {string} path Folder Path ... + * @returns + */ +async function extractFiles(path = "", ext = [], excludeWorkspaceFolders = []) { + // + const result = []; + + // + if (!ext || ext.length == 0) { + return result; + } + + // + const pathContent = await getDirectoryContents(path); + if (!pathContent || pathContent.length == 0) { + return result; + } + + // + // Loop through Content ... + for (const c of pathContent) { + // + // Prepare full path ... + const cPath = joinPath(path, c); + + // + // check content path is file or not ... + const isCFile = isFileExists(cPath); + const isCDirectory = isDirectoryExists(cPath); + if (isCFile) { + // + // Check it is MQL file or not ... + const cExt = getFileExtension(cPath); + if (ext.includes(cExt)) { + result.push(cPath); + } + } else if (isCDirectory) { + // + const destFolderName = basename(cPath); + const isExcluded = excludeWorkspaceFolders.includes(destFolderName); + if (isExcluded) { + continue; + } + + // + const cFiles = await extractFiles(cPath, ext); + if (cFiles && cFiles.length > 0) { + result.push(...cFiles); + } + } + } + + // + return result; +} +//#endregion + +// +//#region Directory ... +/** + * create a directory ... + * + * @param {string} path destination path including dir name ... + * @param {boolean} recursive create directories recursively ... + * @returns action done or not ... + */ +function createDirectory( + path = '', + recursive = true +) { + // + let result = false; + + // + if ( + isDirectoryExists(path) || + !XValueTools.isValidArg(path) + ) { + return false; + } + + // + try { + // + fs.mkdirSync(path, { recursive: recursive }); + result = true; + return result; + } catch { + return false; + } +} + +/** + * remove a directory ... + * + * @param {string} path destination path including dir name ... + * @param {boolean} recursive removes directories recursively ... + * @returns {Promise} action done or not ... + */ +function removeDirectory( + path = '', + recursive = false +) { + return new Promise((resolve) => { + // + if (!isDirectoryExists(path)) { + resolve(false); + return; + } + + // + fs.rm(path, { + recursive + }, (err) => { + // + if (err) { + resolve(false); + return; + } + + // + resolve(true); + }); + }); +} + +/** + * determines a path destination is a directory or not ... + * + * @param {string} path a folder path ... + * @returns represent destnation path is Directory or not ... + */ +function isDirectoryExists(path = '') { + // + if (!XValueTools.isValidArg(path)) { + return false; + } + + // + try { + // + const isExists = fs.existsSync(path); + if (!isExists) { + return false; + } + + // + const stat = getStatus(path); + if (!stat) { + return false; + } + + // + const result = stat.isDirectory(); + return result; + } catch { + return false; + } +} + +/** + * retrieve a directory content ... + * + * @param {string} path a folder path ... + * @returns {Promise} a collection of folder files ... + */ +function getDirectoryContents(path = '') { + return new Promise((resolve) => { + // + if (!isDirectoryExists(path)) { + resolve([]); + return; + } + + // + fs.readdir(path, (err, content) => { + // + if (err) { + resolve([]); + return; + } + + // + resolve(content); + }); + }); +} + +/** + * retrieve a directory files ... + * + * @param {string} path a folder path ... + * @returns {Promise} a collection of folder files ... + */ +function getDirectoryFiles( + path = '', + containsHiddenFiles = false +) { + return new Promise((resolve) => { + // + if (!isDirectoryExists(path)) { + resolve([]); + return; + } + + // + fs.readdir(path, (err, content) => { + // + if (err) { + resolve([]); + return; + } + + // + if (!containsHiddenFiles) { + content = content.filter(c => !c.startsWith('.')); + } + + // + const result = []; + content + .forEach(c => { + // + const cPath = Path.join(path, c); + if (isFileExists(cPath)) { + result.push(c); + } + }); + + // + resolve(result); + }); + }); +} + +/** + * retrieve a directory folders ... + * + * @param {string} path a folder path ... + * @returns {Promise} a collection of folder names ... + */ +function getDirectoryFolders(path = '') { + return new Promise((resolve) => { + // + if (!isDirectoryExists(path)) { + resolve([]); + return; + } + + // + fs.readdir(path, (err, content) => { + // + if (err) { + resolve([]); + return; + } + + // + const result = []; + content.forEach(c => { + // + const cPath = Path.join(path, c); + if (isDirectoryExists(cPath)) { + result.push(c); + } + }); + + // + resolve(result); + }); + }); +} + +/** + * copy a folder with all of it's content to dest ... + * + * @param {string} source source folder path ... + * @param {string} dest dest folder path ... + * @returns {Promise} action done or not ... + */ +async function copyFolder( + source = '', + dest = '' +) { + // + if ( + !isDirectoryExists(source) || + !XValueTools.isValidArg(dest) || + !XValueTools.isValidArg(source) + ) { + return false; + } + + // + const folderName = Path.basename(source); + const destPath = Path.join(dest, folderName); + + // + // Create Dest Path folder if not exists ... + if (!isDirectoryExists(destPath)) { + // + let result = createDirectory(destPath, true); + if (!result) { + return false; + } + } + + // + // Files ... + const files = await getDirectoryFiles(source); + if (files && files.constructor === Array && files.length > 0) { + // + const filesPromises = files.map(file => copyFile(Path.join(source, file), destPath)); + const filesResult = (await Promise.all(filesPromises)).every(r => !!r); + if (!filesResult) { + return false; + } + } + + // + // Folders ... + const folders = await getDirectoryFolders(source); + if (folders && folders.constructor === Array && folders.length > 0) { + // + const folderPromises = folders.map(folder => copyFolder(Path.join(source, folder), destPath)); + const filesResult = (await Promise.all(folderPromises)).every(r => !!r); + if (!filesResult) { + return false; + } + } + + // + return true; +} +//#endregion + +// +//#region Downloader ... +/** + * download a file from specific url and store it ... + * + * @param {string} filepath the file name and path which required to put download file on it ... + * @param {string} url the web url for downloading ... + */ +function download(filepath, url) { + // + // Validate Args ... + if ( + !XValueTools.isValidArg(url) + || !XValueTools.isValidURL(url) + || !XValueTools.isValidArg(filepath) + ) { + return; + } + + // + var file = fs.createWriteStream(filepath); + + // + if (url.startsWith('https:')) { + https.get(url, function (response) { + response.pipe(file); + }); + } else if (url.startsWith('http:')) { + http.get(url, function (response) { + response.pipe(file); + }); + } +} +//#endregion + +// +//#region JSON ... +/** + * read and parse a JSON content from a file ... + * + * @param {string} path source file path ... + * @returns {any} + */ +function readJSON(path = "") { + // + // Validate Args ... + if (!isFileExists(path)) { + return undefined; + } + + // + let result = undefined; + try { + result = require(path); + } catch { + result = undefined; + } + + // + return result; +} + +/** + * write a JSON Object content into a file ... + * + * @param {string} path dest file path ... + * @param {any} content an object which required to write to file ... + * @returns {Promise} + */ +async function writeJSON( + path = "", + content = undefined +) { + // + let result = false; + + // + // Validate Args ... + if (!XValueTools.isValidArg(path)) { + return result; + } + + // + // Normallize Content ... + if (content === undefined) { + content = {}; + } + + // + const contentString = XValueTools.beautifyJSON(content); + + // + result = await writeFile( + path, + contentString, + true + ); + + // + return result; +} +//#endregion +//#endregion + +// +//#region Module Exports ... +module.exports = { + // + CurrentDir, + PathSeparator, + + // + getStatus, + getHomePath, + + // + basename, + joinPath, + resolvePath, + + // + download, + + // + readJSON, + writeJSON, + + // + copyFile, + readFile, + writeFile, + createFile, + removeFile, + isFileExists, + getFileExtension, + removeFileExtension, + getRecursiveFilesList, + extractFiles, + + // + copyFolder, + createDirectory, + removeDirectory, + isDirectoryExists, + getDirectoryFiles, + getDirectoryFolders, + getDirectoryContents, +}; +//#endregion \ No newline at end of file diff --git a/BKPS/14031206/Documents/JsModules/x-shell.tools.js b/BKPS/14031206/Documents/JsModules/x-shell.tools.js new file mode 100644 index 0000000..0ee13de --- /dev/null +++ b/BKPS/14031206/Documents/JsModules/x-shell.tools.js @@ -0,0 +1,219 @@ +/** + * XShell Tools Module ... + * a module for handling shell actions and retrieve OS Info in node js ... + * + * Maintainer + * + * Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) + */ + +// +//#region Imports ... +const os = require('os'); +const process = require('process'); +const { exec } = require("child_process"); +const XFileTools = require('./x-file.tools'); +//#endregion + +// +//#region Constants ... +// +const OS = { + Aix: 'aix', + Darwin: 'darwin', + FreeBSD: 'freebsd', + Linux: 'linux', + OpenBSD: 'openbsd', + SnOS: 'sunos', + Windows: 'win32' +}; + +// +const isWindows = process.platform === OS.Windows; +//#endregion + +// +//#region Actions ... +// +//#region Pure shell commands ... +/** + * execute a command using NodeJS on shell ... + * + * @param {string} cmd command to execute ... + * @param {string} cwd working directory ... + * + * @returns Promise instance ... + */ +function execute(cmd, cwd) { + return new Promise((resolve, reject) => { + // + if (!cmd || cmd.toString().length === 0 || (cwd && !XFileTools.isDirectoryExists(cwd))) { + reject('invalid args ...'); + return; + } + + // + exec(cmd, { cwd }, (err, result, stdError) => { + // + if (err) { + reject(err); + return; + } + + // + if (stdError) { + // + // reject(stdError); + // return; + } + + // + resolve(result); + }); + }); +}; + +/** + * determines a command exists on host or not ... + * + * @param {string} name specific command name ... + * + * @returns boolean Promise ... + */ +function checkCommandExists(name) { + return new Promise(resolve => { + // + if (!name) { + resolve(false); + return; + } + + // + const cmd = isWindows ? `${name} >nul 2>&1` : `type ${name} >/dev/null 2>&1`; + execute(cmd).then(result => { + resolve(true); + }) + .catch(err => { + resolve(false); + }); + }); +} +//#endregion + +// +//#region required commands state ... +/** + * check al required commands exists or not ... + * + * @returns + */ +async function isRequiredCommandsExists() { + // + let result = false; + + // + // const isTarExists = await isTarCommandExists(); + // const isCatExists = await isCatCommandExists(); + // const isGrepExists = await isGrepCommandExists(); + // const isSedExists = await isSedCommandExists(); + const isNpmExists = await isNpmCommandExists(); + const isNgExists = await isNgCommandExists(); + const isIonicExists = await isIonicCommandExists(); + const isCordovaExists = await isCordovaCommandExists(); + + // + result = isNpmExists + && isNgExists + && isIonicExists + && isCordovaExists + ; + + // + return result; +} + +/** + * retrieve required commands state object ... + * + * @returns + */ +async function getRequiredCommandsStates() { + // + const result = {}; + + // + // const isTarExists = await isTarCommandExists(); + // const isCatExists = await isCatCommandExists(); + // const isGrepExists = await isGrepCommandExists(); + // const isSedExists = await isSedCommandExists(); + const isNpmExists = await isNpmCommandExists(); + const isNgExists = await isNgCommandExists(); + const isIonicExists = await isIonicCommandExists(); + const isCordovaExists = await isCordovaCommandExists(); + + // + result['npm'] = isNpmExists; + result['ng'] = isNgExists; + result['ionic'] = isIonicExists; + result['cordova'] = isCordovaExists; + + // + return result; +} +//#endregion + +// +//#region Commonly used Command Checkers ... +/** + * determines npm command exists or not ... + * + * @returns + */ +function isNpmCommandExists() { + return checkCommandExists('npm'); +} + +/** + * determines ng command exists or not ... + * + * @returns + */ +function isNgCommandExists() { + return checkCommandExists('ng'); +} + +/** + * determines ionic command exists or not ... + * + * @returns + */ +function isIonicCommandExists() { + return checkCommandExists('ionic'); +} + +/** + * determines cordova command exists or not ... + * + * @returns + */ +function isCordovaCommandExists() { + return checkCommandExists('cordova'); +} +//#endregion +//#endregion + +// +//#region Module Exports ... +module.exports = { + // + execute, + checkCommandExists, + isRequiredCommandsExists, + getRequiredCommandsStates, + + // + isNgCommandExists, + isIonicCommandExists, + isCordovaCommandExists, +} +//#endregion \ No newline at end of file diff --git a/BKPS/14031206/Documents/JsModules/x-type-detector.tools.js b/BKPS/14031206/Documents/JsModules/x-type-detector.tools.js new file mode 100644 index 0000000..86ed3d8 --- /dev/null +++ b/BKPS/14031206/Documents/JsModules/x-type-detector.tools.js @@ -0,0 +1,268 @@ +/** + * DataType Tools Module ... + * a module for manipulate and detect supported data types in node js ... + * + * Maintainer + * + * Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) + */ + +// +//#region Constants ... +/** + * all supported data types ... + */ +const DataTypes = { + Null: 'null', + Date: 'date', + Array: 'array', + Object: 'object', + String: 'string', + Number: 'number', + Unknown: 'unknown', + Boolean: 'boolean', + Function: 'function', + Undefined: 'undefined', +}; +//#endregion + +// +//#region Actions ... +/** + * detect type of a content ... + * + * @param {any} value the content which going to check ... + * @returns + */ +function getType(value) { + // + const type = typeof value; + + // + let result = DataTypes.Unknown; + let dateIdentifier = '[object Date]'; + let constructor = value && value.constructor ? + value.constructor.toString() : + ''; + + // + switch (type) { + // + case 'undefined': + result = DataTypes.Undefined; + break; + + // + case 'boolean': + result = DataTypes.Boolean; + break; + + // + case 'string': + result = DataTypes.String; + break; + + // + case 'number': + result = DataTypes.Number; + break; + + // + case 'function': + result = DataTypes.Function; + break; + + // + case 'object': + // + // Null ... + if (value === null) { + result = DataTypes.Null; + } else + // + // Array ... + if (Array.isArray(value)) { + result = DataTypes.Array; + } else + // + // Data ... + if ( + value instanceof Date || + isFunction(value.getMonth) || + constructor.includes(dateIdentifier) || + Object.prototype.toString.call(value) === dateIdentifier + ) { + result = DataTypes.Date; + } else + // + // Object ... + { + result = DataTypes.Object; + } + break; + + // + default: + result = DataTypes.Unknown; + break; + } + + // + return result; +} + +/** + * retrieve an object constructor ... + * + * @param {any} value the content which going to check ... + * @returns + */ +function getConstructor(value) { + // + const result = value && value.constructor ? + value.constructor.toString() : + ''; + + // + return result; +} + +/** + * retrieve an object prototype ... + * + * @param {any} value the content which going to check ... + * @returns + */ +function getPrototype(value) { + // + const result = value ? + Object.prototype.toString.call(value) : + ''; + + // + return result; +} + +/** + * check an object is null or not ... + * + * @param {any} value the content which going to check ... + * @returns + */ +function isNull(value) { + return getType(value) === DataTypes.Null; +} + +/** + * check an object is undefined or not ... + * + * @param {any} value the content which going to check ... + * @returns + */ +function isUndefined(value) { + return getType(value) === DataTypes.Undefined; +} + +/** + * check an object is null or undefined or not ... + * + * @param {any} value the content which going to check ... + * @returns + */ +function isNullOrUndefined(value) { + return isNull(value) || isUndefined(value); +} + +/** + * check an object is a date or not ... + * + * @param {any} value the content which going to check ... + * @returns + */ +function isDate(value) { + return getType(value) === DataTypes.Date; +} + +/** + * check an object is number or not ... + * + * @param {any} value the content which going to check ... + * @returns + */ +function isNumber(value) { + return getType(value) === DataTypes.Number; +} + +/** + * check an object is string or not ... + * + * @param {any} value the content which going to check ... + * @returns + */ +function isString(value) { + return getType(value) === DataTypes.String; +} + +/** + * check an object is boolean or not ... + * + * @param {any} value the content which going to check ... + * @returns + */ +function isBoolean(value) { + return getType(value) === DataTypes.Boolean; +} + +/** + * check an object is an Array or not ... + * + * @param {any} value the content which going to check ... + * @returns + */ +function isArray(value) { + return getType(value) === DataTypes.Array; +} + +/** + * check an object is and Object or not ... + * + * @param {any} value the content which going to check ... + * @returns + */ +function isObject(value) { + return getType(value) === DataTypes.Object; +} + +/** + * check an object is a Function or not ... + * + * @param {any} value the content which going to check ... + * @returns + */ +function isFunction(value) { + return getType(value) === DataTypes.Function; +} +//#endregion + +// +//#region Module Exports ... +module.exports = { + // + DataTypes, + + // + getType, + getConstructor, + getPrototype, + isNull, + isUndefined, + isNullOrUndefined, + isDate, + isNumber, + isString, + isBoolean, + isArray, + isObject, + isFunction, +} +//#endregion \ No newline at end of file diff --git a/BKPS/14031206/Documents/JsModules/x-value.tools.js b/BKPS/14031206/Documents/JsModules/x-value.tools.js new file mode 100644 index 0000000..81cfcc4 --- /dev/null +++ b/BKPS/14031206/Documents/JsModules/x-value.tools.js @@ -0,0 +1,1528 @@ +/** + * Value Tools Module ... + * a module for Validate args and values ... + * + * Maintainer + * + * Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) + */ + +// +//#region Imports ... +const XTypeTools = require('./x-type-detector.tools'); +//#endregion + +// +//#region Actions ... +/** +* validate a value as an argument ... +* +* @param {string} value the value which going to validate ... +* @returns +*/ +function isValidArg(value) { + // + let result = false; + + // + result = value && + value.length > 0; + + // + return result; +} + +/** + * validate a collection of valuea as an arguments ... + * + * @param {string|string[]} values the value collection which going to checked ... + * @returns + */ +function isValidArgs(values) { + // + // Normalize Values ... + const normalValues = toNormalArray(values); + if (!hasChildArray(normalValues)) { + return false; + } + + // + let result = normalValues.every(nv => isValidArg(nv)); + return result; +} + +/** + * converts content to an array object ... + * + * @param {string|string[]} content the content which required to normalized ... + * @returns {string[]} array object ... + */ +function toNormalArray(content = '') { + // + // Validate Args ... + if (!isValidArg(content)) { + return []; + } + + // + const result = Array.isArray(content) ? + [...content] : + content.includes(',') && + content !== ',' ? + [...content.split(',')] : + [content]; + + // + return result; +} + +/** + * determines value is array and has atleast one child ... + * + * @param {any} value the value which going to checked ... + * @returns {boolean} result of checking ... + */ +function hasChildArray(value) { + // + let result = false; + result = value && + Array.isArray(value) && + value.length > 0; + + // + return result; +} + +/** + * check an string is ends with specified symbol ... + * + * @param {string} symbol specified search symbol ... + * @param {string} value specified search content ... + * @param {boolean} ignoreCase specified search case sensitive or not ... + * @returns + */ +function endsWidth( + symbol = '', + value = '', + ignoreCase = true +) { + // + if (!isValidArg(value)) { + return false; + } + + // + if (!isValidArg(symbol)) { + return true; + } + + // + // TODO: uncomment it if necessary ... + // symbol = symbol.trim(); + + // + let result = false; + const subtractedContent = value.substring(value.length - symbol.length); + result = !!ignoreCase ? + subtractedContent + .toLowerCase() === symbol + .toLowerCase() : + subtractedContent === symbol; + + // + return result; +} + +/** + * surround specified content by provided symbol ... + * + * @param {string} symbol surround string ... + * @param {string} content used content to surrounded by symbol ... + * @returns surrounded content ... + */ +function surroundBy( + symbol = '', + content = '' +) { + // + // Validate Args ... + if (!isValidArg(content)) { + content = ''; + } + + // + if (!isValidArg(symbol)) { + symbol = ''; + } + + // + if (isSurrounded(symbol, content)) { + return content; + } + + // + const result = `${symbol}${content}${symbol}`; + return result; +} + +/** + * convert a parsed sign to clear string ... + * + * @param {string} value a parsed content ... + * @returns clear parsed signs ... + */ +function toStringExpression(value) { + // + let result = ''; + result = value; + + // + if ( + !value || + !isValidArg(value) || + !isSurroundedString(value) + ) { + return result; + } + + // + const startSymbol = value.charAt(0); + const endSymbol = value.charAt(value.length - 1); + + // + if (startSymbol !== endSymbol) { + return result; + } + + // + if ( + startSymbol === "\"" || + startSymbol === "\'" + ) { + result = clearSurround(startSymbol, value); + } + + // + return result; +} + + + +/** + * find and cleare proposed candidates from specified content ... + * + * @param {string|string[]} candidates the proposed string(s) whic going to cleared from content ... + * @param {string} content the destination content which used to find and replace candidates on it ... + * @returns cleared content ... + */ +function clearContent( + candidates, + content +) { + // + // Validate Args ... + if ( + !candidates || + !isValidArg(content) + ) { + return ''; + } + + // + // Normalize candidates ... + const normalCandidates = toNormalArray(candidates) + .filter(c => isValidArg(c)); + if (!hasChildArray(normalCandidates)) { + return content; + } + + // + // define regexp for content ... + const regExpExpression = normalCandidates.join('|'); + const regExp = new RegExp( + regExpExpression, + 'gi' + ); + + // + let result = ''; + result = content.replace(regExp, ''); + + // + return result; +} + +/** + * clear surrounded symbol from content ... + * + * @param {string} symbol specified search symbol ... + * @param {string} content specified content to clear ... + * @returns + */ +function clearSurround( + symbol = '', + content = '' +) { + // + // Validate Args ... + if ( + !isValidArg(content) || + (isValidArg(symbol) && + symbol.length >= content.length - 1) + ) { + return ''; + } + + // + // Validate Surround ... + if (!isSurrounded(symbol, content)) { + return content; + } + + // + if (!isValidArg(symbol)) { + return content; + } + + // + let result = content.substring(symbol.length, content.length - symbol.length); + return result; +} + +/** + * clear object sign ... + * + * @param {string} content + * @returns cleared content ... + */ +function clearObjectSurround(content = '') { + // + // Validate Args ... + if ( + !isValidArg(content) || + !isSurroundedObject(content) + ) { + return content; + } + + // + const endIndex = content.length - ( + endsWidth('}', content) ? + 1 : + endsWidth('},', content) || + endsWidth('};', content) || + endsWidth('}\n', content) ? + 2 : + 0 + ); + + // + const result = content.substring(1, endIndex); + return result; +} + +/** + * clear array sign ... + * + * @param {string} content + * @returns cleared content ... + */ +function clearArraySurround(content = '') { + // + // Validate Args ... + if ( + !isValidArg(content) || + !isSurroundedArray(content) + ) { + return content; + } + + // + const endIndex = content.length - ( + endsWidth(']', content) ? + 1 : + endsWidth('],', content) || + endsWidth('];', content) || + endsWidth(']\n', content) ? + 2 : + 0 + ); + + // + const result = content.substring(1, endIndex); + return result; +} + +/** + * slice a content to individual parts ... + * + * @param {number|number[]} indexes which indexes used to slice ... + * @param {strng} content the content which going to sliced ... + * @returns sliced parts of content ... + */ +function sliceContent(indexes, content) { + // + // Validate Args ... + if ( + !isValidArg(indexes) || + !isValidArg(content) + ) { + return []; + } + + // + // Normalize indexes ... + const normalIndexes = toNormalArray(indexes) + .filter(index => index > -1 && index < content.length); + if (!hasChildArray(normalIndexes)) { + return []; + } + + // + let result = ['']; + result.pop(); + + // + let lastIndex = 0; + for (const index of normalIndexes) { + // + const part = content.substring(lastIndex, index); + if (isValidArg(part)) { + result.push(part.trim()); + } + + // + lastIndex = index + 1; + } + + // + // check remained parts ... + if (lastIndex < content.length) { + // + const part = content.substring(lastIndex); + if (isValidArg(part)) { + result.push(part.trim()); + } + } + + // + return result; +} + + + +/** + * check an string is starts and ends with specified symbol ... + * + * @param {string} symbol specified search symbol ... + * @param {string} content specified search content ... + * @param {boolean} ignoreCase specified search case sensitive or not ... + * @returns + */ +function isSurrounded( + symbol = '', + content = '', + ignoreCase = true +) { + // + // Validate Args ... + if (!isValidArg(content)) { + return false; + } + + // + if (!isValidArg(symbol)) { + return true; + } + + // + symbol = symbol.trim(); + + // + let result = false; + result = (!!ignoreCase ? + content + .toLowerCase() + .startsWith(symbol.toLowerCase()) : + content.startsWith(symbol) + ) && + endsWidth(symbol, content, ignoreCase); + + // + return result; +} + +/** + * determines a content is an string surrounded value or not ... + * + * @param {string} content a content which going to check ... + * @returns + */ +function isSurroundedString(content = '') { + // + // Validate Args ... + if (!isValidArg(content)) { + return false; + } + + // + let result = false; + result = ( + content.startsWith('\'') && + ( + endsWidth('\'', content) || + endsWidth('\',', content) || + endsWidth('\';', content) || + endsWidth('\'\n', content) + ) || + content.startsWith('\"') && + ( + endsWidth('\"', content) || + endsWidth('\",', content) || + endsWidth('\";', content) || + endsWidth('\"\n', content) + ) || + content.startsWith('`') && + ( + endsWidth('\`', content) || + endsWidth('\`,', content) || + endsWidth('\`;', content) || + endsWidth('\`\n', content) + ) + ); + return result; +} + +/** + * check a content is an array content or not ... + * + * @param {string} content + * @returns + */ +function isSurroundedArray(content = '') { + // + // Validate Args ... + if (!isValidArg(content)) { + return false; + } + + // + let result = false; + result = content.startsWith('[') && + ( + endsWidth(']', content) || + endsWidth('],', content) || + endsWidth('];', content) || + endsWidth(']\n', content) + ); + return result; +} + +/** + * check a content is an object content or not ... + * + * @param {string} content + * @returns + */ +function isSurroundedObject(content = '') { + // + // Validate Args ... + if (!isValidArg(content)) { + return false; + } + + // + let result = false; + result = content.startsWith('{') && + ( + endsWidth('}', content) || + endsWidth('},', content) || + endsWidth('};', content) || + endsWidth('}\n', content) + ); + return result; +} + +/** + * check an index model is contains inside anothers or not ... + * + * @param {{ start: number, end: number}} source the source index model to check ... + * @param {...{ start: number, end: number}} dest the collection of index models which going to check ... + * @returns + */ +function isIndexInside(source, ...dest) { + // + let result = false; + + // + // Validate Args ... + if (!source || !dest) { + return result; + } + + // + // Check idx is standard ... + if ( + !source || + !source.end || + !source.start || + source.start > source.end + ) { + return false; + } + + // + // Check types of destinations ... + for (let index of dest) { + // + // Check idx is standard ... + if ( + !index || + !index.end || + !index.start || + index.start > index.end + ) { + return false; + } + } + + // + if (dest.includes(source)) { + dest = dest.filter(d => d !== source); + } + + // + const insideContentIndex = dest.find(dIndex => { + // + const result = source.start >= dIndex.start && + source.start <= dIndex.end && + source.end >= dIndex.start && + source.end <= dIndex.end; + return result; + }); + + // + result = insideContentIndex; + return result; +} + +/** + * check a number exists in + * @param {number} idx the number which going to check ... + * @param {{ start: number, end: number}} index the index model + * @returns + */ +function isInsideIndex(idx = -1, index) { + // + let result = false; + + // + // Validate Args ... + if ( + !index || + !index.hasOwnProperty('end') || + !index.hasOwnProperty('start') + ) { + return result; + } + + // + result = idx > index.start && idx < index.end; + return result; +} + +/** + * determines an object is key/value and type ... + * + * @param {any} content the object which we are going to check ... + * @returns + */ +function isKeyValueType(content) { + // + const result = content && + content.hasOwnProperty('key') && + content.hasOwnProperty('type') && + content.hasOwnProperty('value'); + + // + return result; +} + + + +/** + * find all indexes of token(s) in content ... + * + * @param {string|string[]} tokens the tokens which require to search ... + * @param {string} content the content which using to search ... + * @returns {number[]} all occured indexes ... + */ +function findAllIndexes( + tokens, + content +) { + // + // Validate Args ... + if ( + !isValidArg(tokens) || + !isValidArg(content) + ) { + return []; + } + + // + // normalize tokens ... + const normalTokens = toNormalArray(tokens); + if (!hasChildArray(normalTokens)) { + return []; + } + + // + // Parse contents ... + let match; + const result = []; + const regExp = new RegExp( + normalTokens.join('|'), + 'g' + ); + while ((match = regExp.exec(content)) !== null) { + result.push(match.index); + } + if (!hasChildArray(result)) { + return []; + } + + // + return result; +} + +/** + * find nearest symbol in a content from specified index ... + * + * @param {string|string[]} candidates specifies which symbols to find ... + * @param {string} content te content for seasrch ... + * @param {number} startFromIndex the index of start position ... + * @returns + */ +function findNearest( + candidates, + content = '', + startFromIndex = 0 +) { + // + // Validate Args ... + if ( + !isValidArg(content) || + !isValidArg(candidates) || + !isValidArg(content.trim()) + ) { + return ''; + } + + // + // Normalize Content ... + content = content.trim(); + + // + // Normalize Starts From ... + startFromIndex = startFromIndex < 0 || startFromIndex > content.length - 1 ? 0 : startFromIndex; + + // + // Normalize Symbols ... + const normalCandidates = toNormalArray(candidates); + if (!hasChildArray(normalCandidates)) { + return ''; + } + + // + let nearestIndex = findNearestIndex( + normalCandidates, + content, + startFromIndex + ); + if (nearestIndex < 0) { + return ''; + } + + // + let result = content.substring( + nearestIndex, + nearestIndex + Math.max(...normalCandidates.map(nc => nc.length)) + ).trim(); + return result; +} + +/** + * search candidates in content and find nearest one and return it ... + * + * @param {string|string[]} candidates which candidates required to check ... + * @param {string} content the content which required to search candidates ... + * @param {number} startFromIndex the proposed index to start searching content from on ... + * @returns + */ +function findNearestIndex( + candidates = [''], + content = '', + startFromIndex = 0, + ignoreClosedItems = false +) { + // + // Validate Args ... + if ( + !isValidArg(content) || + !isValidArg(candidates) + ) { + return -1; + } + + // + // Mormalize startFromIndex value ... + startFromIndex = startFromIndex < 0 ? + 0 : + startFromIndex > content.length - 1 ? + content.length - 1 : + startFromIndex; + + // + // Normalize candidates ... + let normalCandidates = toNormalArray(candidates); + + // + if (!!ignoreClosedItems) { + normalCandidates = normalCandidates + .map(c => content.indexOf( + c, + startFromIndex + ) + ).map(c => +c) + .filter(c => +c > -1); + } else { + normalCandidates = findAllIndexesOutOfCloseds(normalCandidates, content) + .filter(c => c >= startFromIndex); + } + if (!hasChildArray(normalCandidates)) { + return -1; + } + + // + let result = -1; + result = Math.min(...normalCandidates); + + // + return result; +} + +/** + * find close index of specific sign in destination content ... + * + * @param {string} openSymbol open of area sign ... + * @param {string} closeSymbol close of area sign ... + * @param {string} content the destination content for parsing ... + * @param {number} startsFrom an start index of content for start parsing ... + * @returns + */ +function findCloseIndex( + openSymbol = '', + closeSymbol = '', + content = '', + startsFrom = -1 +) { + // + // Validate Args ... + if ( + startsFrom < 0 || + !isValidArg(content) || + !isValidArg(openSymbol) || + !isValidArg(closeSymbol) || + openSymbol === closeSymbol || + !content.includes(openSymbol) || + !content.includes(closeSymbol) || + startsFrom > content.length - 1 + ) { + return -1; + } + + // + let result = -1; + + // + let index = startsFrom; + const openSignStack = []; + while (index < content.length) { + // + const openCandidate = content.substring(index, index + openSymbol.length); + const closeCandidate = content.substring(index, index + closeSymbol.length); + + // + if (openCandidate === openSymbol) { + openSignStack.push(index); + } else if (closeCandidate === closeSymbol) { + // + if (openSignStack.length > 0) { + openSignStack.pop(); + } + + // + if (openSignStack.length === 0) { + result = index; + break; + } + } + + // + index++; + } + + // + return result; +} + +/** + * find closed contents of specific sign in destination content ... + * + * @param {string} openSymbol open of area sign ... + * @param {string} closeSymbol close of area sign ... + * @param {string} content the destination content for parsing ... + * @param {number} startsFrom an start index of content for start parsing ... + * @returns + */ +function findClosedContent( + openSymbol = '', + closeSymbol = '', + content = '', + startsFrom = 0, +) { + // + let result = [{ + start: -1, + end: -1, + content: '' + }]; + result.pop(); + + // + // Validate Args ... + if ( + !isValidArg(content) || + !isValidArg(openSymbol) || + !isValidArg(closeSymbol) || + !content.includes(openSymbol) || + !content.includes(closeSymbol) || + openSymbol.length >= content.length || + closeSymbol.length >= content.length + ) { + return result; + } + + // + // Normalize Start From ... + startsFrom = startsFrom < 0 || startsFrom >= content.length ? 0 : startsFrom; + + // + let canContinue = true; + while (!!canContinue) { + // + let openSymbolIndex = content.indexOf(openSymbol, startsFrom); + if (openSymbolIndex < 0) { + // + canContinue = false; + continue; + } + + // + let closeSymbolIndex = findCloseIndex( + openSymbol, + closeSymbol, + content, + openSymbolIndex + ); + if (closeSymbolIndex < 0) { + // + canContinue = false; + continue; + } + if (content.charAt(closeSymbolIndex) !== closeSymbol) { + closeSymbolIndex++; + } + + // + // Prevent ${} string interpolations ... + if ( + openSymbol === '{' && + openSymbolIndex - 1 >= 0 + ) { + // + const prevChar = content.charAt(openSymbolIndex - 1); + if (prevChar === '$') { + continue; + } + } + + // + const item = content + .substring(openSymbolIndex, closeSymbolIndex + 1) + .trim(); + startsFrom = closeSymbolIndex + 1; + result.push({ + start: openSymbolIndex, + end: closeSymbolIndex, + content: item + }); + } + + // + if (!hasChildArray(result)) { + return result; + } + + // + return result; +} + +/** + * extract a collection of closed contents exists in a content ... + * + * @param symbols a collection of open and close contents ... + * @param {string} content a content for searching inside it ... + * @returns a collection of closed content ... + */ +function findClosedContents( + symbols = [ + { + openSymbol: '', + closeSymbol: '' + } + ], + content = '' +) { + // + let result = [{ + start: -1, + end: -1, + content: '' + }]; + result.pop(); + + // + if ( + !isValidArg(content) || + !hasChildArray(symbols) + ) { + return []; + } + + // + symbols.forEach(symbol => { + // + const closedContent = findClosedContent( + symbol.openSymbol, + symbol.closeSymbol, + content + ); + + // + if (hasChildArray(closedContent)) { + result.push( + ...closedContent + ); + } + }); + + // + return result; +} + +/** + * find all string content closed items ... + * + * @param {string} content a content which going to search ... + * @returns a collection of index descriptors ... + */ +function findClosedStrings(content = '') { + // + // Validate Args ... + if (!isValidArg(content)) { + return []; + } + + // + // there are 3 types of strings ... + // ' " and ` + + // + const token1 = '\''; + const token1Stack = [0]; + token1Stack.pop(); + + // + const token2 = '"'; + const token2Stack = [0]; + token2Stack.pop(); + + // + const token3 = '`'; + const token3Stack = [0]; + token3Stack.pop(); + + // + const result = [ + { + start: -1, + end: -1, + content: '' + } + ]; + result.pop(); + + // + for (let i = 0; i < content.length; i++) { + // + const currentChart = content.charAt(i); + + // + //#region Token 1 ... + if (currentChart === token1) { + // + if (!hasChildArray(token1Stack)) { + token1Stack.push(i); + } else { + // + const start = token1Stack.pop(); + const end = i + 1; + const pContent = content.substring(start, end); + result.push({ + start, + end, + content: pContent + }); + } + } + //#endregion + + // + //#region Token 2 ... + if (currentChart === token2) { + // + if (!hasChildArray(token2Stack)) { + token2Stack.push(i); + } else { + // + const start = token2Stack.pop(); + const end = i + 1; + const pContent = content.substring(start, end); + result.push({ + start, + end, + content: pContent + }); + } + } + //#endregion + + // + //#region Token 3 ... + if (currentChart === token3) { + // + if (!hasChildArray(token3Stack)) { + token3Stack.push(i); + } else { + // + const start = token3Stack.pop(); + const end = i + 1; + const pContent = content.substring(start, end); + result.push({ + start, + end, + content: pContent + }); + } + } + //#endregion + } + + // + return result; +} + +/** + * find container indexes from within indexes ... + * + * @param {...{start: number, end: number}} index the collection of indexes to find beiggers inside ... + * @returns + */ +function findContainerIndexes(...index) { + // + let result = [ + { + start: -1, + end: -1, + content: '' + } + ]; + result.pop(); + + // + let concatedIndexes = []; + for (let idx of index) { + // + // Index Childs ... + for (let iix of idx) { + // + // Check idx is standard ... + if ( + !iix || + !iix.end || + !iix.start || + iix.start > iix.end + ) { + continue; + } + + // + // Check index inside another index ... + concatedIndexes.push(iix); + } + } + + // + if (!hasChildArray(concatedIndexes)) { + return result; + } + + // + for (let ccIdx of concatedIndexes) { + // + const isInside = isIndexInside(ccIdx, ...concatedIndexes); + if (isInside) { + continue; + } + + // + if (hasChildArray(result)) { + // + const isInsideResult = isIndexInside(ccIdx, ...result); + if (isInsideResult) { + continue; + } + } + + // + result.push(ccIdx); + } + + // + return result; +} + +/** + * find all tokens indexes inside a content which they are not inside closed items ... + * + * @param {string|string[]} tokens the tokens which require to search ... + * @param {string} content the content which using to search ... + * @returns + */ +function findAllIndexesOutOfCloseds1( + tokens, + content, +) { + // + // Validate Args ... + if (!isValidArg(content)) { + return []; + } + + // + // Extract token Indexes ... + const tokensIndexes = findAllIndexes(tokens, content); + if (!hasChildArray(tokensIndexes)) { + return []; + } + + // + // Extract Closed Objects Indexes ... + const closedArrays = findClosedContent('[', ']', content); + const closedObjects = findClosedContent('{', '}', content); + const closedStrings = findClosedStrings(content); + if ( + !hasChildArray(closedObjects) && + !hasChildArray(closedArrays) && + !hasChildArray(closedStrings) + ) { + return tokensIndexes; + } + + // + // find bigger sloded ... + let containerClosedItems = findContainerIndexes( + closedArrays, + closedObjects, + closedStrings + ).filter(i => !isSurroundedString(i.content)); + + // + let result = [-1]; + result.pop(); + + // + for (let tIdx of tokensIndexes) { + // + let canAdd = true; + for (let ccIndex of containerClosedItems) { + // + canAdd = isInsideIndex(tIdx, ccIndex); + if (canAdd) { + break; + } + } + + // + if (!canAdd) { + result.push(tIdx); + } + } + + // + return result; +} + +/** + * find all tokens indexes inside a content which they are not inside closed items ... + * + * @param {string|string[]} tokens the tokens which require to search ... + * @param {string} content the content which using to search ... + * @returns + */ +function findAllIndexesOutOfCloseds( + tokens, + content, +) { + // + // Define Result ... + let result = [-1]; + result.pop(); + + // + // Validate Args ... + if (!isValidArg(content)) { + return []; + } + + // + // Normalize Tokens ... + const normalizeTokens = toNormalArray(tokens); + if (!hasChildArray(normalizeTokens)) { + return result; + } + + // + // Extract Closed Objects Indexes ... + let openSymbols = [ + '{', + '[', + '\'', + '"', + '`' + ]; + let closeSymbols = [ + '}', + ']', + '\'', + '"', + '`' + ]; + let openStack = []; + let lastOpenSymbol = ''; + let lastClosedIndex = -1; + for (let i = 0; i < content.length; i++) { + // + const prevChar = content.charAt(i - 1) || ''; + const char = content.charAt(i); + const nextChar = content.charAt(i + 1) || ''; + + // + const isToken = normalizeTokens.includes(char); + const isOpenSymbol = openSymbols.includes(char); + const isCloseSymbol = closeSymbols.includes(char); + + // + if (isOpenSymbol && lastOpenSymbol !== char) { + openStack.push(i); + lastOpenSymbol = char === '\'' || char === '"' || char === '`' ? char : lastOpenSymbol; + } else if (isCloseSymbol) { + // + lastOpenSymbol = char === '\'' || char === '"' || char === '`' ? '' : lastOpenSymbol; + let lastPop = openStack.pop(); + if (openStack.length === 0) { + lastClosedIndex = lastPop; + } + } else if (isToken) { + if ( + i > lastClosedIndex && + openStack.length === 0 + ) { + result.push(i); + } + } + } + + // + return result; +} +//#endregion + +// +//#region Validator Actions ... +/** + * check specified value is Valid URL Address or not ... + * + * @param {string} value specified string which required to check + * @returns {boolean} + */ +function isValidURL(value = "") { + // + if (!isValidArg(value)) { + return false; + } + + const pattern = new RegExp( + '^([a-zA-Z]+:\\/\\/)?' + // protocol + '((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|' + // domain name + '((\\d{1,3}\\.){3}\\d{1,3}))' + // OR IP (v4) address + '(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*' + // port and path + '(\\?[;&a-z\\d%_.~+=-]*)?' + // query string + '(\\#[-a-z\\d_]*)?$', // fragment locator + 'i' + ); + + // + const result = pattern.test(value); + return result; +} + +/** + * check specified value is Valid URL Address or not ... + * + * @param {string} value specified string which required to check + */ +function isValidEmail(value = "") { + // + if (!isValidArg(value)) { + return false; + } + + // + const pattern = /[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}/gim; + + // + const result = pattern.test(value); + return result; +} +//#endregion + +// +//#region Normallizers ... +/** + * normallize an string ... + * + * @param {string} value specified value ... + * @returns {string} + */ +function toNormalString(value = "") { + // + if (!XTypeTools.isString(value)) { + value = ""; + } + + // + const result = value + .trim() + .toLowerCase(); + + // + return result; +} +//#endregion + +// +//#region Beautifiers ... +/** + * converts an object to string based on json and beautify result ... + * + * @param {any} object + * @returns {string} + */ +function beautifyJSON(object = undefined) { + // + // TODO: Complete this ... + let result = ""; + + // + // validate object ... + if (object === undefined) { + return result; + } + + // + // Convert result ... + result = JSON.stringify( + object, + null, + 4 + ); + + // + return result; +} +//#endregion + +// +//#region Module Exports ... +module.exports = { + // + endsWidth, + surroundBy, + isValidArg, + isValidArgs, + toNormalArray, + hasChildArray, + toStringExpression, + + // + sliceContent, + clearContent, + clearSurround, + clearArraySurround, + clearObjectSurround, + + // + isSurrounded, + isIndexInside, + isInsideIndex, + isKeyValueType, + isSurroundedArray, + isSurroundedString, + isSurroundedObject, + + // + findNearest, + findAllIndexes, + findCloseIndex, + findNearestIndex, + findClosedContent, + findClosedStrings, + findClosedContents, + findAllIndexesOutOfCloseds, + + // + // Validator Actions ... + isValidURL, + isValidEmail, + + // + // Normallizers ... + toNormalString, + + // + beautifyJSON, +} +//#endregion \ No newline at end of file diff --git a/BKPS/14031206/Documents/Temlates/x-saherelm.x-ea.template.ea.mq5 b/BKPS/14031206/Documents/Temlates/x-saherelm.x-ea.template.ea.mq5 new file mode 100644 index 0000000..ec3e257 --- /dev/null +++ b/BKPS/14031206/Documents/Temlates/x-saherelm.x-ea.template.ea.mq5 @@ -0,0 +1,542 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center XTest MQL5 Expert Advisor +// ------------------------------------------------- +// Name: XEATemplate +// Description: a Template For Exper Advisors +// +// Maintainer: +// ------------ +// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) +// +//////////////////////////////////////////////////////x +// +// Global Properties ... +#property copyright "Copyright 2023, SaherElm IT Center" +#property link "https://saherelm.ir" +#property version "1.00" +#property description "SaherElm XEATemplate" +#property strict + +// +#define ShortName "XEATemplate" + +// +// Imports ... +#include "../Classes/x-saherelm.xalert.class.mq5" +#include "../Classes/x-saherelm.xtrade.class.mq5" +#include "../Helpers/x-saherelm.xcc.helper.mq5" +#include "../Helpers/x-saherelm.xct.helper.mq5" + +// +// Inputs ... + +// +// Common ... +input group "Common"; +input long eaMagicNumber = 78692110; // Magic Number +input int eaSlippage = 10; // Slippgae +input string eaLogSuffix = ""; // Log Suffix + +// +// Alert ... +// Here we Provider All Requirements for +// Configuring Alert Provider ... +input group "Alert"; +input bool eAEnableAlerts = true; // Enable Alerts +input bool eALogAlerts = true; // Log Alerts +input bool eAMailAlerts = false; // Mail Alerts +input bool eAPushAlerts = false; // Push Alerts +input bool eATerminalAlerts = false; // Terminal Alerts + +// +// Time Report ... +input group "Reports"; +input bool eaReportNewMonths = false; // Report New Month +input bool eaReportNewWeeks = false; // Report New Weeks +input bool eaReportNewDays = false; // Report New Days +input bool eaReportNewHours = false; // Report New Hours + +// +// Define Local Variables ... + +// +string eaLogTag; // EA Log Prefix ... +XSCAlert *eaAlert; // Alert Provider for Expert Adviser ... +XSCTrade *eaTrader; // Trader of Expert Adviser ... +XTimeTracker eaTimeTracker; // Time Tracker for Providing Reports ... +XSCXCTHelper *eaCHelper; // Bar Timer Indicator Helper class ... +XSCXCCHelper *eaCCHelper; // Chart Styler Indicator Helper Class ... + +// +// Event Handlers ... + +// +// Initialization ... +int OnInit() +{ + // + // Validate Inputs and Required Parameters + // for EA to Works fine ... + if (!ValidateInputs()) + { + return INIT_PARAMETERS_INCORRECT; + } + + // + // Initialize Timer ... + if (!InitTimer()) { + return INIT_FAILED; + } + + // + // Initialize all Requirements ... + if (!InitEA()) + { + return INIT_FAILED; + } + + // + // Initialize all GUI Objects and Classes ... + if (!InitGUI()) + { + return INIT_FAILED; + } + + // + // Alert Initialization ... + string msg = "Initialized Successfully ..."; + eaAlert.Alert(msg); + + // + // 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 + + // + // Destroy Timer ... + DestroyTimer(); + + // + // Destroy all GUI Requirements ... + DestroyGUI(); + + // + // Alert De Initialization Succeeded ... + string msg = "De Initialized Successfully ..."; + eaAlert.Alert(msg); + + // + // Destroy all EA Requirements ... + DestroyEA(); +} + +// +// On Tick Handler ... +void OnTick() +{ + // + UpdateGUI(); + HandleReportTime(); + UpdatePositionsState(); + + // + // TODO: Implemetn Tick Processors Algorithm ... +} + +// +// Handle On Trade Event ... +void OnTrade() +{ + eaTrader.HandleOnTrade(); +} + +// +// On Timer ... +void OnTimer() +{ + // + // TODO: Implement Time Based Functionalities ... +} + +// +// Chart Event Handler ... +void OnChartEvent( + const int id, + const long &lparam, + const double &dparam, + const string &sparam // +) +{ + // + // Handle OnClick Event ... + if (id == CHARTEVENT_OBJECT_CLICK) + { + HandleOnClickEvent(sparam); + } +} + +// +// Custom Event Handlers ... + +/** + * Handle StopLoss Triggered Positions ... + * + * @param deal: XDeal ... + */ +void OnStopLossTriggered(const XDeal &deal) +{ + // + HandleReportBalance(); +} + +/** + * Handle Take Profit Triggered Positions ... + * + * @param deal: XDeal ... + */ +void OnTakeProfitTriggered(const XDeal &deal) +{ + // + HandleReportBalance(); +} + +/** + * Handle Force Close a Position ... + * + * @param ticket: Position Ticket ... + * @param position: XPosition ... + * @param comment: Closing Comment ... + */ +void OnPositionForceClosed( + const ulong ticket, + const XPosition &position, + const string comment // +) +{ + // + HandleReportBalance(); +} + +// +// Custom Functions ... + +/** + * Validate all Inputs of Expert Adviser ... + * + * @return ( bool ) + */ +bool ValidateInputs() +{ + // + bool result = false; + + // + string errMessage = ""; + + // + bool isCommonValid = ( + // + eaSlippage > 0 && + eaMagicNumber > 0 + // + ); + if (!isCommonValid) + { + // + errMessage += "common configurations error;" + "\n"; + } + + // + result = + // + // Common ... + isCommonValid && + // + // Otere ... + true + // + ; + + // + if (!result) + { + // + // Since here Logger not Initiallized, we Use Raw Print Command ... + Print(ShortName + " Errors: \n", errMessage); + } + + // + return result; +} + +/** + * Initialize Timer ... + * + * @return ( bool ) + */ +bool InitTimer() { + // + bool result = false; + + // + // TODO: Initialize Timer if necessary ... + // result = EventSetTimer(1); + // result = EventSetMillisecondTimer(100); + result = true; + + // + return result; +} + +/** + * Destroy Timer ... + */ +void DestroyTimer() { + // + // TODO: Use This ... + // EventKillTimer(); +} + +/** + * Initialize all Requirements for Working Fine ... + * + * @return ( bool ) + */ +bool InitEA() +{ + // + bool result = false; + + // + // Locally Apply Changes on Prefix ... + eaLogTag = ShortName + ">" + eaLogSuffix; + + // + // Bar Timer ... + XCTInputs ctInputs; + ctInputs.Default(); // Default Configurations ... + eaCHelper = new XSCXCTHelper(); + result = eaCHelper.Init( + _Symbol, + _Period, + ctInputs // + ); + if (!result) + { + return result; + } + + // + // Bar Styles ... + XCCInputs ccInputs; + ccInputs.Default(); // Default Configurations ... + eaCCHelper = new XSCXCCHelper(); + result = eaCCHelper.Init( + _Symbol, + _Period, + ccInputs // + ); + if (!result) + { + return result; + } + + // + // Create Instance of Alert Class and Configure it ... + eaAlert = new XSCAlert(); + eaAlert.SetPrefix(eaLogTag); + eaAlert.SetLogAlerts(eALogAlerts); + eaAlert.SetMailAlerts(eAMailAlerts); + eaAlert.SetPushAlerts(eAPushAlerts); + eaAlert.SetEnableAlerts(eAEnableAlerts); + eaAlert.SetTerminalAlerts(eATerminalAlerts); + + // + // Create Trader Instance and Configure it ... + eaTrader = new XSCTrade( + eaSlippage, + eaMagicNumber // + ); + eaTrader.AddOnStopLossEventHandler(OnStopLossTriggered); + eaTrader.AddOnTakeProfitEventHandler(OnTakeProfitTriggered); + eaTrader.AddOnForceClosePositionEventHandler(OnPositionForceClosed); + + // + return result; +} + +/** + * Destroy all Initialized EA Requirements ... + */ +void DestroyEA() +{ + // + delete eaCHelper; + delete eaCCHelper; + + // + delete eaAlert; +} + +/** + * Initialize all GUI Requirements for EA ... + * + * @return ( bool ) + */ +bool InitGUI() +{ + // + bool result = false; + + // + // TODO: Fix This ... + result = true; + + // + return result; +} + +/** + * Update GUI based on Each Ticks ... + */ +void UpdateGUI() +{ + // + // TODO: Implement this ... +} + +/** + * Destroy all Initialized GUi Requirements ... + */ +void DestroyGUI() +{ + // + // TODO: Complete this ... +} + +// +// Others ... + +/** + * Update Positions States ... + */ +void UpdatePositionsState() +{ + // + // TODO: Implement this ... +} + +/** + * Handle On Click Event for GUI Components ... + * + * @param name: Object Name ... + */ +void HandleOnClickEvent(string name) +{ + // + if (!IsValid(name)) + { + return; + } + + // + bool isClicked = false; + + // + // TODO: Implement Chart Objects On Click ... + + // + if (isClicked) + { + UpdateGUI(); + } +} + +/** + * Report Account Balance ... + */ +void HandleReportBalance() +{ + // + if (!IsRunningOnTestMode()) + { + return; + } + + // + string msg = "Balance: " + ToString(eaTrader.mAccount.GetBalance()); + eaAlert.Log(msg); +} + +/** + * Time Reporting based on Inputs ... + */ +void HandleReportTime() +{ + // + // Monthly Report .... + if (eaReportNewMonths && + eaTimeTracker.IsNewMonth()) + { + // + string msg = "New Month ..."; + + // + eaAlert.Alert(msg); + } + + // + // Weekly Report .... + if (eaReportNewWeeks && + eaTimeTracker.IsNewWeek()) + { + // + string msg = "New Week ..."; + + // + eaAlert.Alert(msg); + } + + // + // Daily Report .... + if (eaReportNewDays && + eaTimeTracker.IsNewDay()) + { + // + string msg = "New Day ..."; + + // + eaAlert.Alert(msg); + } + + // + // Hourly Report .... + if (eaReportNewHours && + eaTimeTracker.IsNewHour()) + { + // + string msg = "New Hour ..."; + + // + eaAlert.Alert(msg); + } +} + +// diff --git a/BKPS/14031206/Documents/Temlates/x-saherelm.x-panel.ea.mq5 b/BKPS/14031206/Documents/Temlates/x-saherelm.x-panel.ea.mq5 new file mode 100644 index 0000000..c04228d --- /dev/null +++ b/BKPS/14031206/Documents/Temlates/x-saherelm.x-panel.ea.mq5 @@ -0,0 +1,575 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center XTest MQL5 Expert Advisor +// ------------------------------------------------- +// Name: XPanelEA +// Description: an Exper Advisor which used Panels +// +// Maintainer: +// ------------ +// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) +// +//////////////////////////////////////////////////////x +// +// Global Properties ... +#property copyright "Copyright 2023, SaherElm IT Center" +#property link "https://saherelm.ir" +#property version "1.00" +#property description "SaherElm XPanelEA" +#property strict + +// +#define ShortName "XPANELEA" + +// +// Imports ... +#include "../Classes/x-saherelm.x-app-dialog.class.mq5" +#include "../Classes/x-saherelm.xalert.class.mq5" +#include "../Classes/x-saherelm.xtrade.class.mq5" +#include "../Helpers/x-saherelm.xcc.helper.mq5" +#include "../Helpers/x-saherelm.xct.helper.mq5" + +// +// Inputs ... + +// +// Common ... +input group "Common"; +input long eaMagicNumber = 78692110; // Magic Number +input int eaSlippage = 10; // Slippgae +input string eaLogSuffix = ""; // Log Suffix + +// +// Alert ... +// Here we Provider All Requirements for +// Configuring Alert Provider ... +input group "Alert"; +input bool eAEnableAlerts = true; // Enable Alerts +input bool eALogAlerts = true; // Log Alerts +input bool eAMailAlerts = false; // Mail Alerts +input bool eAPushAlerts = false; // Push Alerts +input bool eATerminalAlerts = false; // Terminal Alerts + +// +// Time Report ... +input group "Reports"; +input bool eaReportNewMonths = false; // Report New Month +input bool eaReportNewWeeks = false; // Report New Weeks +input bool eaReportNewDays = false; // Report New Days +input bool eaReportNewHours = false; // Report New Hours + +// +// Define Local Variables ... + +// +string eaLogTag; // EA Log Prefix ... +XSCAlert *eaAlert; // Alert Provider for Expert Adviser ... +XSCTrade *eaTrader; // Trader of Expert Adviser ... +XTimeTracker eaTimeTracker; // Time Tracker for Providing Reports ... +XSCXCTHelper *eaCTHelper; // Bar Timer Indicator Helper class ... +XSCXCCHelper *eaCCHelper; // Chart Styler Indicator Helper Class ... + +// +XCAppDialog eaMainWindow; // EA Main Dialog ... + +// +// Event Handlers ... + +// +// Initialization ... +int OnInit() +{ + // + // Validate Inputs and Required Parameters + // for EA to Works fine ... + if (!ValidateInputs()) + { + return INIT_PARAMETERS_INCORRECT; + } + + // + // Initialize Timer ... + if (!InitTimer()) + { + return INIT_FAILED; + } + + // + // Initialize all Requirements ... + if (!InitEA()) + { + return INIT_FAILED; + } + + // + // Initialize all GUI Objects and Classes ... + if (!InitGUI()) + { + return INIT_FAILED; + } + + // + // Alert Initialization ... + string msg = "Initialized Successfully ..."; + eaAlert.Alert(msg); + + // + // 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 + + // + // Destroy Timer ... + DestroyTimer(); + + // + // Destroy all GUI Requirements ... + DestroyGUI(); + + // + // Alert De Initialization Succeeded ... + string msg = "De Initialized Successfully ..."; + eaAlert.Alert(msg); + + // + // Destroy all EA Requirements ... + DestroyEA(); +} + +// +// On Tick Handler ... +void OnTick() +{ + // + UpdateGUI(); + HandleReportTime(); + UpdatePositionsState(); + + // + // TODO: Implemetn Tick Processors Algorithm ... +} + +// +// Handle On Trade Event ... +void OnTrade() +{ + eaTrader.HandleOnTrade(); +} + +// +// On Timer ... +void OnTimer() +{ + // + // TODO: Implement Time Based Functionalities ... +} + +// +// Chart Event Handler ... +void OnChartEvent( + const int id, + const long &lparam, + const double &dparam, + const string &sparam // +) +{ + // + // Apply Chart Event on Main Window ... + eaMainWindow.ChartEvent(id, lparam, dparam, sparam); + + // + // Handle OnClick Event ... + if (id == CHARTEVENT_OBJECT_CLICK) + { + HandleOnClickEvent(sparam); + } +} + +// +// Custom Event Handlers ... + +/** + * Handle StopLoss Triggered Positions ... + * + * @param deal: XDeal ... + */ +void OnStopLossTriggered(const XDeal &deal) +{ + // + HandleReportBalance(); +} + +/** + * Handle Take Profit Triggered Positions ... + * + * @param deal: XDeal ... + */ +void OnTakeProfitTriggered(const XDeal &deal) +{ + // + HandleReportBalance(); +} + +/** + * Handle Force Close a Position ... + * + * @param ticket: Position Ticket ... + * @param position: XPosition ... + * @param comment: Closing Comment ... + */ +void OnPositionForceClosed( + const ulong ticket, + const XPosition &position, + const string comment // +) +{ + // + HandleReportBalance(); +} + +// +// Custom Functions ... + +/** + * Validate all Inputs of Expert Adviser ... + * + * @return ( bool ) + */ +bool ValidateInputs() +{ + // + bool result = false; + + // + string errMessage = ""; + + // + bool isCommonValid = ( + // + eaSlippage > 0 && + eaMagicNumber > 0 + // + ); + if (!isCommonValid) + { + // + errMessage += "common configurations error;" + "\n"; + } + + // + result = + // + // Common ... + isCommonValid && + // + // Otere ... + true + // + ; + + // + if (!result) + { + // + // Since here Logger not Initiallized, we Use Raw Print Command ... + Print(ShortName + " Errors: \n", errMessage); + } + + // + return result; +} + +/** + * Initialize Timer ... + * + * @return ( bool ) + */ +bool InitTimer() +{ + // + bool result = false; + + // + // TODO: Initialize Timer if necessary ... + // result = EventSetTimer(1); + // result = EventSetMillisecondTimer(100); + result = true; + + // + return result; +} + +/** + * Destroy Timer ... + */ +void DestroyTimer() +{ + // + // TODO: Use This ... + // EventKillTimer(); +} + +/** + * Initialize all Requirements for Working Fine ... + * + * @return ( bool ) + */ +bool InitEA() +{ + // + bool result = false; + + // + // Locally Apply Changes on Prefix ... + eaLogTag = ShortName + ">" + eaLogSuffix; + + // + // Bar Timer ... + XCTInputs ctInputs; + ctInputs.Default(); // Default Configurations ... + eaCTHelper = new XSCXCTHelper(); + result = eaCTHelper.Init( + _Symbol, + _Period, + ctInputs // + ); + if (!result) + { + return result; + } + + // + // Bar Styles ... + XCCInputs ccInputs; + ccInputs.Default(); // Default Configurations ... + eaCCHelper = new XSCXCCHelper(); + result = eaCCHelper.Init( + _Symbol, + _Period, + ccInputs // + ); + if (!result) + { + return result; + } + + // + // Create Instance of Alert Class and Configure it ... + eaAlert = new XSCAlert(); + eaAlert.SetPrefix(eaLogTag); + eaAlert.SetLogAlerts(eALogAlerts); + eaAlert.SetMailAlerts(eAMailAlerts); + eaAlert.SetPushAlerts(eAPushAlerts); + eaAlert.SetEnableAlerts(eAEnableAlerts); + eaAlert.SetTerminalAlerts(eATerminalAlerts); + + // + // Create Trader Instance and Configure it ... + eaTrader = new XSCTrade( + eaSlippage, + eaMagicNumber // + ); + eaTrader.AddOnStopLossEventHandler(OnStopLossTriggered); + eaTrader.AddOnTakeProfitEventHandler(OnTakeProfitTriggered); + eaTrader.AddOnForceClosePositionEventHandler(OnPositionForceClosed); + + // + return result; +} + +/** + * Destroy all Initialized EA Requirements ... + */ +void DestroyEA() +{ + // + delete eaCTHelper; + delete eaCCHelper; + + // + delete eaAlert; +} + +/** + * Initialize all GUI Requirements for EA ... + * + * @return ( bool ) + */ +bool InitGUI() +{ + // + bool result = false; + + // + // Initialize Application Main Window ... + result = eaMainWindow.Create( + ChartID(), + ShortName, // Dialog Name ... + 0, // SubWindow ... + 10, // X1 ... + 35, // Y1 ... + 300, // X2 ... + 200 // Y2 ... + ); + + // + // Configuring Dialog ... + // eaMainWindow.MinimizeButton(false); // Hide Minimize Button ... + // eaMainWindow.CloseButton(false); // Hide Close Button ... + eaMainWindow.BackgroundColor(clrBlack); + // result = true; + + // + // Try To Run Main Window ... + if (result) + { + eaMainWindow.Run(); + } + + // + return result; +} + +/** + * Update GUI based on Each Ticks ... + */ +void UpdateGUI() +{ + // + // TODO: Implement this ... +} + +/** + * Destroy all Initialized GUi Requirements ... + */ +void DestroyGUI() +{ + // + eaMainWindow.Destroy(); +} + +// +// Others ... + +/** + * Update Positions States ... + */ +void UpdatePositionsState() +{ + // + // TODO: Implement this ... +} + +/** + * Handle On Click Event for GUI Components ... + * + * @param name: Object Name ... + */ +void HandleOnClickEvent(string name) +{ + // + if (!IsValid(name)) + { + return; + } + + // + bool isClicked = false; + + // + // TODO: Implement Chart Objects On Click ... + + // + if (isClicked) + { + UpdateGUI(); + } +} + +/** + * Report Account Balance ... + */ +void HandleReportBalance() +{ + // + if (!IsRunningOnTestMode()) + { + return; + } + + // + string msg = "Balance: " + ToString(eaTrader.mAccount.GetBalance()); + eaAlert.Log(msg); +} + +/** + * Time Reporting based on Inputs ... + */ +void HandleReportTime() +{ + // + // Monthly Report .... + if (eaReportNewMonths && + eaTimeTracker.IsNewMonth()) + { + // + string msg = "New Month ..."; + + // + eaAlert.Alert(msg); + } + + // + // Weekly Report .... + if (eaReportNewWeeks && + eaTimeTracker.IsNewWeek()) + { + // + string msg = "New Week ..."; + + // + eaAlert.Alert(msg); + } + + // + // Daily Report .... + if (eaReportNewDays && + eaTimeTracker.IsNewDay()) + { + // + string msg = "New Day ..."; + + // + eaAlert.Alert(msg); + } + + // + // Hourly Report .... + if (eaReportNewHours && + eaTimeTracker.IsNewHour()) + { + // + string msg = "New Hour ..."; + + // + eaAlert.Alert(msg); + } +} + +// diff --git a/BKPS/14031206/Experts/Advisors/ExpertMACD.ex5 b/BKPS/14031206/Experts/Advisors/ExpertMACD.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..91268bb6d69dffa14b8f6a6456738383ac7c8ac7 GIT binary patch literal 136234 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 z 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 literal 0 HcmV?d00001 diff --git a/BKPS/14031206/Experts/Advisors/ExpertMACD.mq5 b/BKPS/14031206/Experts/Advisors/ExpertMACD.mq5 new file mode 100644 index 0000000..0e4c57c --- /dev/null +++ b/BKPS/14031206/Experts/Advisors/ExpertMACD.mq5 @@ -0,0 +1,168 @@ +//+------------------------------------------------------------------+ +//| ExpertMACD.mq5 | +//| Copyright 2000-2025, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2000-2025, MetaQuotes Ltd." +#property link "https://www.mql5.com" +#property version "1.00" +//+------------------------------------------------------------------+ +//| Include | +//+------------------------------------------------------------------+ +#include +#include +#include +#include +//+------------------------------------------------------------------+ +//| Inputs | +//+------------------------------------------------------------------+ +//--- inputs for expert +input string Inp_Expert_Title ="ExpertMACD"; +int Expert_MagicNumber =10981; +bool Expert_EveryTick =false; +//--- inputs for signal +input int Inp_Signal_MACD_PeriodFast =12; +input int Inp_Signal_MACD_PeriodSlow =24; +input int Inp_Signal_MACD_PeriodSignal=9; +input int Inp_Signal_MACD_TakeProfit =50; +input int Inp_Signal_MACD_StopLoss =20; +//+------------------------------------------------------------------+ +//| Global expert object | +//+------------------------------------------------------------------+ +CExpert ExtExpert; +//+------------------------------------------------------------------+ +//| Initialization function of the expert | +//+------------------------------------------------------------------+ +int OnInit(void) + { +//--- Initializing expert + if(!ExtExpert.Init(Symbol(),Period(),Expert_EveryTick,Expert_MagicNumber)) + { + //--- failed + printf(__FUNCTION__+": error initializing expert"); + ExtExpert.Deinit(); + return(-1); + } +//--- Creation of signal object + CSignalMACD *signal=new CSignalMACD; + if(signal==NULL) + { + //--- failed + printf(__FUNCTION__+": error creating signal"); + ExtExpert.Deinit(); + return(-2); + } +//--- Add signal to expert (will be deleted automatically)) + if(!ExtExpert.InitSignal(signal)) + { + //--- failed + printf(__FUNCTION__+": error initializing signal"); + ExtExpert.Deinit(); + return(-3); + } +//--- Set signal parameters + signal.PeriodFast(Inp_Signal_MACD_PeriodFast); + signal.PeriodSlow(Inp_Signal_MACD_PeriodSlow); + signal.PeriodSignal(Inp_Signal_MACD_PeriodSignal); + signal.TakeLevel(Inp_Signal_MACD_TakeProfit); + signal.StopLevel(Inp_Signal_MACD_StopLoss); +//--- Check signal parameters + if(!signal.ValidationSettings()) + { + //--- failed + printf(__FUNCTION__+": error signal parameters"); + ExtExpert.Deinit(); + return(-4); + } +//--- Creation of trailing object + CTrailingNone *trailing=new CTrailingNone; + if(trailing==NULL) + { + //--- failed + printf(__FUNCTION__+": error creating trailing"); + ExtExpert.Deinit(); + return(-5); + } +//--- Add trailing to expert (will be deleted automatically)) + if(!ExtExpert.InitTrailing(trailing)) + { + //--- failed + printf(__FUNCTION__+": error initializing trailing"); + ExtExpert.Deinit(); + return(-6); + } +//--- Set trailing parameters +//--- Check trailing parameters + if(!trailing.ValidationSettings()) + { + //--- failed + printf(__FUNCTION__+": error trailing parameters"); + ExtExpert.Deinit(); + return(-7); + } +//--- Creation of money object + CMoneyNone *money=new CMoneyNone; + if(money==NULL) + { + //--- failed + printf(__FUNCTION__+": error creating money"); + ExtExpert.Deinit(); + return(-8); + } +//--- Add money to expert (will be deleted automatically)) + if(!ExtExpert.InitMoney(money)) + { + //--- failed + printf(__FUNCTION__+": error initializing money"); + ExtExpert.Deinit(); + return(-9); + } +//--- Set money parameters +//--- Check money parameters + if(!money.ValidationSettings()) + { + //--- failed + printf(__FUNCTION__+": error money parameters"); + ExtExpert.Deinit(); + return(-10); + } +//--- Tuning of all necessary indicators + if(!ExtExpert.InitIndicators()) + { + //--- failed + printf(__FUNCTION__+": error initializing indicators"); + ExtExpert.Deinit(); + return(-11); + } +//--- succeed + return(INIT_SUCCEEDED); + } +//+------------------------------------------------------------------+ +//| Deinitialization function of the expert | +//+------------------------------------------------------------------+ +void OnDeinit(const int reason) + { + ExtExpert.Deinit(); + } +//+------------------------------------------------------------------+ +//| Function-event handler "tick" | +//+------------------------------------------------------------------+ +void OnTick(void) + { + ExtExpert.OnTick(); + } +//+------------------------------------------------------------------+ +//| Function-event handler "trade" | +//+------------------------------------------------------------------+ +void OnTrade(void) + { + ExtExpert.OnTrade(); + } +//+------------------------------------------------------------------+ +//| Function-event handler "timer" | +//+------------------------------------------------------------------+ +void OnTimer(void) + { + ExtExpert.OnTimer(); + } +//+------------------------------------------------------------------+ diff --git a/BKPS/14031206/Experts/Advisors/ExpertMAMA.ex5 b/BKPS/14031206/Experts/Advisors/ExpertMAMA.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..d729e2f1039ed28c99bd4aced4792eed2c9a4fd5 GIT binary patch literal 145544 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 z�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 P{X?P4h; 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 k-==}q1}W-j3gD~&G-|3))^d!XyS +#include +#include +#include +//+------------------------------------------------------------------+ +//| Inputs | +//+------------------------------------------------------------------+ +//--- inputs for expert +input string Inp_Expert_Title ="ExpertMAMA"; +int Expert_MagicNumber =12003; +bool Expert_EveryTick =false; +//--- inputs for signal +input int Inp_Signal_MA_Period =12; +input int Inp_Signal_MA_Shift =6; +input ENUM_MA_METHOD Inp_Signal_MA_Method =MODE_SMA; +input ENUM_APPLIED_PRICE Inp_Signal_MA_Applied =PRICE_CLOSE; +//--- inputs for trailing +input int Inp_Trailing_MA_Period =12; +input int Inp_Trailing_MA_Shift =0; +input ENUM_MA_METHOD Inp_Trailing_MA_Method =MODE_SMA; +input ENUM_APPLIED_PRICE Inp_Trailing_MA_Applied=PRICE_CLOSE; +//+------------------------------------------------------------------+ +//| Global expert object | +//+------------------------------------------------------------------+ +CExpert ExtExpert; +//+------------------------------------------------------------------+ +//| Initialization function of the expert | +//+------------------------------------------------------------------+ +int OnInit(void) + { +//--- Initializing expert + if(!ExtExpert.Init(Symbol(),Period(),Expert_EveryTick,Expert_MagicNumber)) + { + //--- failed + printf(__FUNCTION__+": error initializing expert"); + ExtExpert.Deinit(); + return(-1); + } +//--- Creation of signal object + CSignalMA *signal=new CSignalMA; + if(signal==NULL) + { + //--- failed + printf(__FUNCTION__+": error creating signal"); + ExtExpert.Deinit(); + return(-2); + } +//--- Add signal to expert (will be deleted automatically)) + if(!ExtExpert.InitSignal(signal)) + { + //--- failed + printf(__FUNCTION__+": error initializing signal"); + ExtExpert.Deinit(); + return(-3); + } +//--- Set signal parameters + signal.PeriodMA(Inp_Signal_MA_Period); + signal.Shift(Inp_Signal_MA_Shift); + signal.Method(Inp_Signal_MA_Method); + signal.Applied(Inp_Signal_MA_Applied); +//--- Check signal parameters + if(!signal.ValidationSettings()) + { + //--- failed + printf(__FUNCTION__+": error signal parameters"); + ExtExpert.Deinit(); + return(-4); + } +//--- Creation of trailing object + CTrailingMA *trailing=new CTrailingMA; + if(trailing==NULL) + { + //--- failed + printf(__FUNCTION__+": error creating trailing"); + ExtExpert.Deinit(); + return(-5); + } +//--- Add trailing to expert (will be deleted automatically)) + if(!ExtExpert.InitTrailing(trailing)) + { + //--- failed + printf(__FUNCTION__+": error initializing trailing"); + ExtExpert.Deinit(); + return(-6); + } +//--- Set trailing parameters + trailing.Period(Inp_Trailing_MA_Period); + trailing.Shift(Inp_Trailing_MA_Shift); + trailing.Method(Inp_Trailing_MA_Method); + trailing.Applied(Inp_Trailing_MA_Applied); +//--- Check trailing parameters + if(!trailing.ValidationSettings()) + { + //--- failed + printf(__FUNCTION__+": error trailing parameters"); + ExtExpert.Deinit(); + return(-7); + } +//--- Creation of money object + CMoneyNone *money=new CMoneyNone; + if(money==NULL) + { + //--- failed + printf(__FUNCTION__+": error creating money"); + ExtExpert.Deinit(); + return(-8); + } +//--- Add money to expert (will be deleted automatically)) + if(!ExtExpert.InitMoney(money)) + { + //--- failed + printf(__FUNCTION__+": error initializing money"); + ExtExpert.Deinit(); + return(-9); + } +//--- Set money parameters +//--- Check money parameters + if(!money.ValidationSettings()) + { + //--- failed + printf(__FUNCTION__+": error money parameters"); + ExtExpert.Deinit(); + return(-10); + } +//--- Tuning of all necessary indicators + if(!ExtExpert.InitIndicators()) + { + //--- failed + printf(__FUNCTION__+": error initializing indicators"); + ExtExpert.Deinit(); + return(-11); + } +//--- succeed + return(INIT_SUCCEEDED); + } +//+------------------------------------------------------------------+ +//| Deinitialization function of the expert | +//+------------------------------------------------------------------+ +void OnDeinit(const int reason) + { + ExtExpert.Deinit(); + } +//+------------------------------------------------------------------+ +//| Function-event handler "tick" | +//+------------------------------------------------------------------+ +void OnTick(void) + { + ExtExpert.OnTick(); + } +//+------------------------------------------------------------------+ +//| Function-event handler "trade" | +//+------------------------------------------------------------------+ +void OnTrade(void) + { + ExtExpert.OnTrade(); + } +//+------------------------------------------------------------------+ +//| Function-event handler "timer" | +//+------------------------------------------------------------------+ +void OnTimer(void) + { + ExtExpert.OnTimer(); + } +//+------------------------------------------------------------------+ diff --git a/BKPS/14031206/Experts/Advisors/ExpertMAPSAR.ex5 b/BKPS/14031206/Experts/Advisors/ExpertMAPSAR.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..9eb2c8c38e4a0403d2c8bfa03132e82f4919cfd7 GIT binary patch literal 142958 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Ⓢ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 z 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
cQJocvr`^j+z=4jUnk zH4p8d!Ir8-M<0zn`&kN|cR1F4uuMXe#hC%GEYVA-sha(G;*1P8L86sEo7kMdp1>-s#@5qa)-o z7WAkas2qF2F)3OkttL5ydFfKztB(4A{%f1ss4gMPf;mB8JJ=-?@+uj!p-h3M_mG|; z0F?1QrLqVKM+B9L3POL;1BUQX(GqJcphBJo3`bt5?`d+GoGZ9tLfCnu8`?CZvxyN6 z^_J>mTN46Kf+FL)+W|vnt{+l4j{%5()RD}Y1dYlav=3$0(fS3l3yggL{4~>kU5_XS zI_*ea@Y`s=a^m(OP`7wW6yVN=i=hB>e8q0TD*q=-77&}A&s{^OM*_66Rr_>x)?>m| z+!H%P?0Ha4a^+xyHMx62_$sn;Sb!Nlq0?eIN5twMS7&)F@`;hKs>5X!1e?A3EY;1D!*7E-&4 z_DFR)QAJxNbHi6@Qv8QVqHDw^3-9zTP9b)NEouiqZLxv|Y4Gt2KUGnVl%9C)`O%q< z8rgC@p;Q;}uQ>wpvD5;KK)=6I*~ff^VMkG_Wu-lq#s~yE&dV}h=~HXeu`elMK=d@z zduM9zC2MwaZuV{Wc!g}Jg06u+WGTsBMKGlsUrMusN1TA z47wzHLdQnDiOGP1;_7xPiWB`!BMuH`$Wz|k^cJ#GgBy{dLX={XH5rma+_`3f*xI|M zy`{w2m@7<@j{>)k7%d@n8xe%f=I~o3hzycTKrJf^)Z=A$@S<>8s$h;`J=ZY4rw?7Y ze5GJ>j~B-R@HtOx$dhr5-Fx=HBio!@F-z0pqPV&4pN-x6I3eNQGm9nrFSTq*_J!=X zAef$@XHr52koA3fGu`s-#q@XekTpet!O+g7KaM|k1cvFWT_r(49qv;OSz%L7YWs9O zpQgAi?_}MoEBc?3&HYDWQzWdN2?B%tE#4>OQ9*gBxykcq=m=63i`vCz&1G#GwKgIQ zI62a}vwh!d>^}f{YraB0T_j`R#o%^X=59l3vtCITXZ0*gNp{guee-Zcamlc?+xLo!W{a7US6>9w&CS>;;=~wq%I6_7UW@1vb3Qa8pU1HcPzN$bB6A&=AwTNIp4y=fJi@85olC3x=WBRZb_WH#V`zQweou4A2I4HZ zI42Qq9lLjz2+P-|ap{uW%mtlU3Fn*h5Ny~>>LsnxdC<@a=`<<5@3Dl^X~L$&QZ)b{ z*$2}(JZ(Xqs3AFvQN{<`5{Ny6Z4k@a{X-8t!UID6UJ z=wD4gBiEkTpHoP!wAc9{r8(csQrph$e%(cO^y#-j=huU|ZyGBo1UKIu-!0u%^AYAD zOL{ae<*xbdBm2@@Y_QdMN7Z5nhS|4@1i3t>13aLr>$I&JgYDgvC;0$+m$~x7`Cl;O zZ&H*ran=G82^^W6_K_QHm@%p!hS)!Ih|BRS=nDXLjNGfQcYD*V7t_DQCj@f52HGC2%KU^i z47I4AatPe66sf1&kCl^D6duN<-jWE4?WLEgPcsfDri1pdRY+eFuzt#oLmuNuH3aSKD{|<_6jIRtE7-91DN@XmI7EY`4*k@{v z%vIwB-ojR_qtUspjX$trT1J~;2ARlisa-r4wX*LD5y{i@-)7C<#dWN1BNl9!Smbc^ zA7bBN;>Op9&GLCyW4qXpx!SOg?^2nS9aE5`bjg-t5$KEa^zNvQ3(ysK4)<^3tOw!J zb+5~Qc84cZOyhRlKn}>ALx1ie!JG1C*gS#dsgyVPJnYZyt$n>rA-$ za(keoSXVy-h2Mu^LiFvS2?T+pC z4uUj8iOdtW4kt-6-6QtIAM*uVhSvd^#1u+U@G6c3T9QhSAZ^$|FHfk3gP*FRiPvS^ zErg+i-QzRLcCHxbVX@jOn4Tsz3j4mCb>e8y!Y7{NK?B!U zTzty#424j`>`kr)>fQ{N-YL~A&U+gtNavPs-DN@u5Nr=j2x2a-J8($PlWs)b|A%lD z-g>Dens8(1!tE9hfWmG;k}D+02J;kgwI4m7G(2BFpeq?sQ-taa!S5FUW{lq{y(N1~ z7L<@_>d21yz1af231CW!$pAsy4(7?5;M>LM4s(0Vie4A0+XSvg+R3>VQxVvAf8p%p z6qOpvo5@3Rc6Gb-uHneA(y@~4M^F^x61P-?Aj3|W$AesM07F2$zujPW`lj9o?-V3A)H~uW zYR4RoY7ZMw%X`$RY+V-d{f-7o5G;=k?h0aO9W)@^V?v5qiony6Cux6wGd42O5LyQ~ zEXsMCO9c2;8Kx|vBo0iZo4?7*($>|GbwPDM;9FGGZxamS=QhUxQyX3^uBcE?@=<5q zHAOQbU#!Z@o@%hb6v0jj%B{e;1RkvvZ`vQ8;sf4qo}z(h4`TREzu5!Gc)re z?Je8}iMrsnKtN<{^x+VHTqV+Y)4I_L!{IZA_M4-T{JRIs1MEDJkXOPPf;>HJ3ipoW zfADmxKV}D^_V1{CQQ)5nWodl2_UtUYfedfL*m3X@P}UX(9Q_?TJzDI%ORHGNtC6in2FDbKyU!5MdtXvXCYKCR9*`wX9F5ezLs3 z*~TY3z;Q^phH9q5bW>DDp?RF}h}b3I+)D7j3L}mi()%fhzw&Aw%gRNvwjhd4;DS1l z*P(=6RMVC?+-baAE7=33FmGq@hYA0#B+e&MdH^2D@D2oKzc@PbBE#dkQpSRck|kAU z`J)-T>_K4-mzK;v!|)Ypzl=mJxVYV&oHFiiCBDZEotcwUq^}q7tb(=&q-Az#UTe12 z61dA2yXv$d!GdJ2uNXr0Vlv%oVZ*?xcCS&{OSyDiU)uGG*&dA2wOeWN(Jfb6A10ml zcmc|{FPqDSy^xy|#>E-eTuOhJi!K)ICs$csh!Jampq&NX8@Y-o#Ml>rAYCk!;#2t5 zcvT9_fM~T`2ZnHz>;;ecA^v}x!0Hwyr#CsmY`+HPMOH}B38So%wC!0gu7R_1#ZB36 z@RedB4@r2`4X*lp?LXP=m)F?Rsve2i=`OK+UzGS5`+&7Y=F+YeKJiPaIOKHTvhodrv5}Q=^j}+cvn<9OgVYqyh<8^G(3@h zrj|eVh*F)SgJVaTLG5k4Mw3gKGvpsTP-vO`0h?$Ddx*pR#(HY{uB_j~~N%XH(6Sll2)$eya3=!>HSjV0#+xYt+?E(32kvksBJ< zI+1o%TNu8FL#JjE^LAMYqZs9V{~9oYDqOV27OrPbzV#i3_FJ2|>}v2Ln9h~iK3Hd^ zRyV+FkW47`P!(E=%0t5-K**R+BPtvYpb@H$hWTAUVS}yCN`q=@2C`~{QQ7op`evB; zy_qzYYX9SWIrk4ik{q>kA)*sW&l6B;3T#41d~R)}q#6tIlt~vk8F6YKuL%-CAWUA8@fj$NOxAPv_Klvz) zC6Guqn}RR)h0ofy;8YFM(=>VdFIi(VmOmaDE|cr07AY`Zd&(mKv0K}BMT}yJ-4pAj zzEAytmpil#DR##?V(es7G1ASD{@tc`S0WmfM5?X6O6*}uQSlT#sc#D&Q4O@%kA2H6P4~E2089``bS2dUg6cu2#*~eYCGGfBQfG3 z@MR`(GIq2B^MTIgtaF^Ky9>}~>UCV`_pqyU?Up4vlP#UMs3T^+n9Qu^+3FrcMFLDu z&gPNHa`>dK2)}PfWBB^=AdFqe3^c`)R-d0G^o=dlQsD#}Ev=#e8q%i|tOg@r27rMy zluxrwvd>S@@EJ}YEJ?9KKo49&ds?QV2RANgnynFJF@TBjQQ_f*lYfI~q93=r zk@S0N$5Z?H3bBW(Eeoed-v1~&gG({2Amj4_xh}2zVHPfsjYf4cA^sU5n6=`PQnrLc zfcMj9HSb1bB>A3r{ctKznN+{S>O-G!KcU+_b}pH!9}BbkJKDxGe^oY2ALuHYH?9$M za#0{B4W^oohf4!6{Qa~ueZg=Tby_a5ik)a?W)@Vp7(U z{BD3f0e8O05?I7(>g|t+IyDm>y6ZgHBQvel5xA+lA|0Wni8f*Ktm+!6Q#6FaFXNhY z&APHrW`12j*63nh5xZw#PnrqQ+47^4V?T_+j!I@Pwm%wN6d8S&Awcjz5m}AkvK3-A z$JL9K5&$l8zhxQn}%>CLdH+>N=B=_FM zu^^#;_(%b@QKAoi`Wslc+p?`IMiypHsFX2)5stP@&%v3iGO_gMoxCcoz9ow`H`A`U zX`ikn{2#!9qkf2XDCO=#GpjNAQ;|!EU-g22BB6|f;$pc$dtr2U@lJUS&}E4?)>9HK zhEhrecEW#ucv{Yqh2VHdHKT#$YH-W7pe`VA{*w=NtAw(~S;%!B0 zb)@eTC}{+e(`f!|c$V2qIE2l>{m^Eo@{919AT0Vi!#Pb6>+E zEK10}m!Z^NS@HyO``vH(v@tV=?Ao^)|T(-E$hKZM?)4LT?riw1a4hu#2p{?{@{w1sAT3}K}`xw3`!y+ z!B-pYQd*GWKe#z@fVw0?r`;xWZZe)mT-;#N{Rp9qP&HopF0d%OFNGcWuZY#+l+I0e z-MH}qHqt@Xi4l$!`G_);+~bK3hM*q8o?Wpr13T^U%$Z>10$C>Xo7DlfeY zDS`^|4~%W`?(>d?Er^cxVb8tI13;RSYo2{27$ICwnPi$wo&p)-s9!6YuoaUp<>hWU zJzEIj4zwRF!h{)$WZ(a8OHLl^<-LN<4Va6+&q*G!wls#c1G&~W@|Tkv1uGNRy{8P+ z*2Mw8bmmM}zi+Jdhb%*9Lx_X{I?c9!YW9ul76kHZoYaD5&p$s> zS%1%y)g&2tA}|8j*LWVtMX!w1?$NJ%|ItyFgKhkw*`@!x-P>K4&1r)hI}S(=yF+f@BC!;Qy6XDGeUQUJ z6YfUKN`7$Wi0986ha^Ys3y^`OG??1598~^o+QP#xiWM3Eq7C)EV7iv>qQYTaqyQ>pcK{x&d|$?~OH0g-M?}l)R&tAn4CCKyG8~QN znxmkh%G#zzWtCAOE3Sh!C9=))-Y)Hc0ESYC&4j zEoS^X^)6Cvt@<`A|Ksy#cp61F?(89rQJt&7NG82u+SIIT2K*UoDw?JXRcr)?!aXZC z=Rd|6)Ri9+`_vc}Yvpo2sWq5WC<$N60IBxr_mo6UJzb}FEAFL({dP>eDS!e$dA zfvQ5_k~O+ez`8iF7#To+@e;>K(l`|YUf61LE8_u0x^&Uk8nmMTuFQ8;U|cI71Qr82 zZHOC>WPN!(uz^qo8}}FtN`gyQQjBD2P?--s~8Kqutris>e_0DFxX+M^; zeSfmvql0Ts*ReHI1`0^ebebZsEf>aUBmrxei21@$#A^8yp679Q$4UBu) z{7=?#22xKA!D=#(v0mB$P0Uwtkr+#H*@~U=+%eK-X0UUua91)ySx_O3KzXo;+yu%# z9%M+&Z^1({DM;*c7kh+{Ref*k{DNI-ulN_3%6Uv8py$t+HWOr;=lLostBTb4G<&H~ z!fK(qHr96|C_1hli8$x=O{>Q*Fln^A#Dbm_?BQ_OCK&jRce#Z(xioKYqeTGOlgwhA zYNZ$$Ex$Rx9C?&Jq4lL5r$mIGE~a>t;MPX0jYwEy$YDNBf0iHn;paXX1W~`3;Iq;* z$#$wO=4N9Q&EBCdj|l~p3j2N}WWX}HC`+h^T)}rQ#^%B~Zn)wm@U65(rB-nf7-TTc zqq%!@AhvCVbaNJf%w5+R&Hj25IkMK@&uZ|lh)RST3^}ReG3_5!`d&htjBH<$-FgCe zEBuKwnJEaGKkmI=@XzuKgIwM4m?w4G&qlfSX=P|kyP@6+lCc-xhQ;ar3zFc->v#{0 z@ryMwqV|24I%b4i`xsNRZMGP<@&FrMFhtTf*mo{C1@Ae6C_ zW<{yM&=wSv6seBqNQ&3->A=CYQHI_Eq);^AtyslUN7ADMI-#9Q1@AcAshH^L4yz@i znW3dn!*8gCccZO59c3A(mHN)ukbZdcV1pRYuzlH0nTE;3t7{J9oazi*mBdm;pPgV` zfizRT9yx5x3O`2pwx_ZpFK;NVg`NOqQgc6NAh*C`t)L=ZnA7IlrKpwu5IR^{N7aK- zm>yY2FS>fgbX6N*4@SbjlknGYKcHNP3?n47Iu8Rf>fmK_Y7Ivg4VJKfgzXQa)8U*` z3VL*DxC`5wUUYk3YQA0~KtcTUZ|gF5;(AeTq)5x_ay$&p#gEOPnZ{w8)>0$fOi>v# z2?rTv^J28j-_$?R%lB}PEksKKt$cGohO|$tYLloFb(-5%jRPi_iosidoeKxPMZpW( zMGvdfy+C)N$ArnVBt=Y^M;o-D_G5Cb#&9}GU`T{$gS_nnB-N#rN`QWVQV+iDsjroD zGf4AU*mQ)5ZBwNq-^gJZRD7^gJ`+J#?t?tm+3x*Pb!)`&PtXNe5c$Swv^1!N{IoeYT-1ZsDp`cgNj|Q*b=$ z=;#tA!Jevx2dN#}5*;?(SC*B`AbbMa!XCvbw6M`@K*q_xHTRjObx^cJiAtd5Q`F^K zlkYq|k~ZIZS8ceO){ z#8FwyEy_pzY$T@A$3OQerq`6&OT)>yEMU+h&n7t0xb@Y|_)~lf)LyR3J~W5PrA;j5 zUQu9$Tq4|O``4{$1mo`IREdNer>|-mI`GxulknZr7icHZ>@wq5oRm?GbJ{XuY&zU>2i6I`V@*;{=?`Yq}Wam-p#4x^?XckvB1)NJ||7 z)LKMN-qJ`p+lBXD$a|lwn5jL5! zR07u17@l~9^;2sN2G)i~GVK-ztL%j+m@ESFhht&K#YmfkEo$Y*itRI}5Fhx9{HVsM z+m`UXcea$)wC4{3Fqyax71OLkl-{2CbhSNs&VA=N{KernpG+lV6_f$F|_zv0w_D32io3Y{E zwTFDSVZeQOxYL)Xp(vpbe znWWe@mbjww5k4&IF%`$qXXTXTzD4{3w(@VB$eZ7%il=PAE3ZmpXZ=Cq76mv~G9r^nOi>T7ah4!{?%F?wAnD#9w_|Et>@26QrspI{{@yX{M{XT@ zv?&F&h_AlujHp~8K$_3v^wrTLPNX+mUK7MDucYcTS)%QI4mIc6XqqOI9F3M_eXi13 zO*y-j)Bm+LhY;9_Q*7U7HUtdF$7_RGKp_*7K`=_7d;&n-DcG;(aDT*FW<^tj-Bah^ zI23gK*z(0`z2P^qhe%U(mtg8@uo7gTX8d~r27pY_eX=h5O*&u9&vTaC!nH`=$AKMT zaFLW|$HZSzHeS$n*c;_T$kLp4_<_IQ>IJ97;yZRvTd0Ss9E17|L#4M9!L+Kx&Q86RU(Ffly~FOst)Ha7J{7XhDX~JjeX@FG#US_|j6t>NsNL{>CD3*v!?UV+Y%S zH3sukmEB;!&tvQFPFGQ^jsybQvt&_cNL9fzJ;K5k>>`ZgU>JZt<1Rb$kh3+Nu-KWRV2ul};B3QXY_s*}(|=2;(JBR)GbuxvNO zG_ElU55R{<;?A5VQIszqmaJoNUn)4THK`Aczw48@mc zG5r#^Xr>tt8AxgoNtMBXQyn$x#~M}mx+|2RuH!qC?Xw=JSJC((9yvY-GCf`SduPCC zB-;J=;sYZ-EQP-ST zsQu@|hTgkP4u~ZkdPJGwhyy^iI%iQBN2U7#THG5g?bg%Vyzehv95xgG^N(syfp9^@ z7H!&5RkD5m%Z=F<#PF#Nr^hpZ_SaBth2G5jf25uXp9!CHX>#v&OXhbr{0W;0dj52pX+Fxx=JJHQ{ zyt@&rQLX2uC}A z&4k$BNF^eJ%@@ICEu24qe<&A~l#^nCzD~Er?R!>>iUnUB-PCxF7Opjo%Zt1>X-yDK z%O`EUlY!!fkcvNWF7yp?{+E*_eSu`>?t{?(()fgL1RPRnH=-mkiT$23{?Mz(1QyrnR>nrJ%RiOySqu7v9BEQ}6+jIOCSw?4$gtoX- z(@sB%JnHw@Q0>U`Dx#T|Exjqxi*W8jLnb%EO`B1^fzY|tGMS_bTg0BNNl6XC+2LF^DL@gPr+b zT1n-ZBz6eDHYT&e%zCZ8!LM64nZ9jjDQUo|A|7$synUCkbm^+J283?X0$sL&4vgD1 z#U7kmXG^gjem?9ZnZ+G4|AlONOcexiut3=+r+)x=v3TX}@239C{?6;C0^YYyQ_I`u2u_iUaCe9DEvSk7qV z0I=BA&Xyz|WfaVM4(wBiFI_7R87A9TKpv1j2Gr~7!2%*vIIq=a1Bqdj5gCP`6J*0| zc!L*56TmpdnzB{$e0QfplvozgmYm?c&njmnk@*>JfW1fbk`~Mx;w8VLh3-5@m%6-6*l0*$CGvaXWr~MOJgtY~*a*ah znAzJdx)HyZT=s=#C@SjZ0Ew9-XIj!vobgi1N+tmDM&h)m?yWw=09LmP?=j=stSjS9 z*Pnw}gpIUI+Q$8a z;QYGm-~K-F3)&`E_$G|-LzkKW$|KkL@QZ1yo2Iivzz1hFmDW#227u`r$WQ)V{JX6Qs_e?DH;E3+>M_hUviXQY7c<;Y&k>OoQxzBjn31=L zXpI+UicvmqojykCEKntQb~t&+&NNhw`0f0W-BINBDF_QIe4KGjK^dsXVp5y!^DZwE z^u)mzl28YWG4rG`CbFd?y*KC>U(;@TD0=k|g)aF~jk2JB{1sRBrEh;@7bI+!xGFk0 zGeYOEDe%;<4fQzP%P=cqIkZ#0A$1bn3u4T8x;0M8XGUD>&)ul22VC>vM0r-Y zd9X)B>*1h*p^ZZ0MNPiH12m(pFcw&n3|Np{9?`HoW7}D+dz0GU!K_mmKTE#fv*m3B z{9dCEzBP~SKmNkWN&+&Chl!t*UXB)y2-#o>j^k4w>JbiH?m#&}zk>TfLl(06_k`UZ z5d0u6SFIc;S%8liEd&oFP=uWY4)R=X^JGFdW*o}7+&pyE|B`QP*7hfeFwZ-MXW5YNHYUvnVcb7Cr5 ze_dl;E&G_4>6;R1yeAdRhkm*a$j2S~auBra3|YNQd3eyPFT&b=?FvBuz>B=Wo_`M+ zcG>YPtaFbc*w=pzNw#NTBJzs2`Y+c|I1y89&Zhk#-*;HDZ z0byFq&#BWmS6;oe z^~iB&v66RHsy1I=Sn$PYZbg+KOq*do`1>yN26R}p9!~9^%#%y)R%r;(!20%o^wF9y zt81vNVBGgfA_amV=Pnr|%20`|b zM*7Ao;g;9qfrod9>3M|~>Gjg72=!6TVf<6si7vF_6wsnZRe_q$--#yB>o0Qfq1%=->++BU%|W!KRfbCI_%9!>{^^nHmx zXA;jVv!7N4D961cPo9oOB2fFV2h4pv~Gl)41*bFuR zw|v{pV%DrccxRyU^`4UZr-(8<(FqVjC;uYz)<(x^hb`uXlA_IVvzZ?DXO7n9wnDo|3CK*xy4oLJm_SKkjP4ggD$MGWMc>!DE#@jLcfPi8v zilo-LfJY+D?l0sSZA^r=35fMc7^}`-7^}u9XaO9OW$SfrN5QmV9ZC;*j7s}i`1=0l z3jga*gqSLGDFKIfV2agyC?_U0%h}sm`VSS|PH)KK^2hQwWqI5{VQUVklqEu~4&%sH z3ru@~WzmzVff4Hj3??%^cEpW+4OFkAO5lTYj?bKVQ%J<+quFD{fPs|htwBd2EkN1H zE83(tc?fI($X<36=kZO}S=+n6{Z6r1QDTrXJgw*>mah)DokRBt@jx_YL)c!`9#Us! zE(Qdaeu#gK)|ti(nED6&K<`Ey>mo`-5-<@CIpKaapT6ORQIsXtdp%3tnrpl@%~7#k za_N6=?TsVxsLyO4Ui(Xg2kY9RxPZ+%&&m=JUk>jotGkL@OY>ezTm&K4rB;)@8l;Lw z>KZ?@W2i;0)wc2N8WuQXS8Qp{%|tS8+taffw7>k4EW zgY;93AI?&Miu+WPoqXzJFrJTrv2oPI#qkJjm8yu;DkH$d>d9Y9O$xA+3+A~%FZ+MQ zhmC6l4jrq2ppDTHrZrXuJr>?pE5>^AO_|SmO2C}ka#kGH^~o&aJ(~#?@q*~M6U!B+ z%Q>R)d*8F&lOsK(g~6eL@}hpWBs~ugReYN2@}&wSIzn%7vY%-Iwor5Ub)qen(L+6k z-~A(-in?Q8+TrpJ#xo1!Lk5C`n+Q+0F%}}7)0&jpo%ClVX*ucxD)F`RHS3Jn9bsFp z1r^;uJfPz^c8bI4&A=wIYUcDG)0G+8vlB=I7_oXt{|acsA{gVGzTw3lxqP)ogOp6OL&FNd|9Rq@G<$?hU!>Ojgd^l_3mfqY}3}sPYWKC&&SX~=)r_rGV4AV$UANXzH;j&pp@W~3$XRX1u*ANyILivHJ5c?OC| z)cNCe|NMko-mvQ_W=5#si9UeidFWn{LILz)r+Xc9=E-zHOfmy-qSKTJ3pF~N=<5{Ndq7}R@@(zDD zU!#kZn*Gs>%borU%}L9`J>EanGcCAfT}s`l|14-f;!QT;rC3ImUp{Eu;|894yQo#5 zcWtEmuPfnBdYF;>_GT~qxP{!=aYcx$izH4v+Q_Z`|A*(}V(UtCoE zuW#ww))fF#*-P^1xC|A8@o(D3#a-EdQ-B*dg73Ju1(_pWVckIMd=AyIwijSGOxy_3 zs;mHBF2c3&Q8X&?GJ?2x&e<)8?{ESb89S7NOViH;aMF-va3Pg+gj-9Prq)pN;HPD4 z#XLFtxwSe#T?N~}zZde69MtW%45Rl)0Z$HG)<*cMM&2fob54R)kL1N^V{zQ!29pKd zKKbICpyCWbT@E7jx5ha1zcu9ai<90O!}rGM*z4R~w{*4+wr=-$4q07keiZLxO-p4B9YzGl;5dQE;%3aPyY{YS-l+3v?u0TQDW8%o ziN%EM8Ze|LIUJ~dC>YBag+`Dv;9(xONE`AwStKYhDv_%t(s0XW=rZWD-&X7V|&X)S%n&#WxDcK%Wx9S{!f8{NK|J!FdZr+_^e8f9d(NPk6 z1H|{;w*p`eg0&YfvP?9ZXGK@9*=KrsD+JqEcccMJbc3`{2RyGDtQA ztji_bgR$`Y)f+`XguzWndWsK2?IVtz8c33BX(d3{8{kG8-GLOgBRupIF-@cb)CEsS z7Rdj^z3S}~!8pr}_TEBgw8jrZiP&)Q3rgYAr2qVuUC)3oj!-O{_&G-&ETh#nS+hDw z#{NV_B##!IX6(Hju&Qeg=<=jfz zv$%z)rdfaY<`%!ZHa$FS=~6KCW|*j0<4`6q0~_XYmnGtu-H|+svW$@SQ>BO*LDnNg zJS01k_M%U&st!@6tP?<$5}JxRmFAZfAs)We%_@z zZTQcvV#C`MV~fE-WD=;Z*zW+K+(s)9F~}h5l;$YYlaZ z%uAZTe0hc0888)X&T~VZj-LVRJWj7zXjv;>L%!>BoG$!+bW3a2ExX@8QK-k9|2WbR z)|s9tl|j*1(D_830?|c-Ffh(Y1x{c|(&TF?DGEImirH4j&De~OYW5YWP>l+#qckpe z(C!qBd#hAX%hJ&Se&^Ljn-UL4=0V%jwSJ<4%AQq@+C5^16Zk8Bt^hG+soDxZgvi1b zYdBy{>WxOJZbM^;8~j9>c#R=X4nkGFwr_GeN2Ci>m7&3F z2tKQecb%v^qo%@8tMFD2DksY|U%*@gQlWP|>Y$2%Imfu|YG{G5p1SD8b_UB~23`7i z#pSQmMn$LwzU%{UihRv~A_P!0?KX>V$`(5~xJHq46CGTEi(_sk57kh86YcD5)jZaJcW|*m3R) zUP2ppq!E%IjZO9%+I$tAWsB@wk`{E5HLhS(=7BT(XE`;>XPavuMBs~DG8aG@kj)aA zWgy?&ip;TkE{6`C!(flL)k`DbExNP)xI2`J9*+RVC{#_0GAt7M!6DXYwBYiy17~P0Wi@rNT zxNUN|F$;sgaD?^+6$_Yy@NG({h;ebD`nG~{VorstfERJ{N zDX-w!*Y@=c?xhDvVt5D&?4GJn*dOg&t_{D4=PU@nM-gH$*E@A$W$4Or_0J1zG!?hg zv3pT`vR6$(z%5gZ(O_Qc$(qVh#J;TnruG~$2BA#&j4wO&?+W7;<~RI;z84OhEgUZ= z>N?@a4t?f7Ut(sN$=(N-aKH09E{3xSXZk1CB+d*KixJr=YP-7SF^(SA8_%!v6x89R zaU-&KvS975W<{%HC;UgJ3{g(PlAie_tuS;#(F+b0aR|Z=nx`aY7-bo$Pm@~IOx1?` zfO-n~S*3l(Ab2#JZ602t&}*%a6`u&)0UKI&g^)R1)wAnxe?N5%*2}zz4L~Ijq)f6* z4iSj6HaFIrr2WT6UoRyxG-hmpNW9qk%6%*02a%`s-(G42z5mj*WqRhohHUvs&QHQo z6s`nHhL>-8Cafn7^qo&xpdDa!>N(fD1hqX7Dk18Ba1Vu@ymTJU_!2^BxOZiVf2Ct! zrm?{3)PBk_S9=u?4O1~?Apn3l@39!+Iah?OEjC_&F@9_FyD0LN>87JOD1gf)nzO5j zc?Ia(v{M-IEJX362XmHpuJ?+U&kl;pdgj&q8cIDRMJsSD{9cjiUc-68fMZ~Ebuf!d z#NiB8a@N?J<%7qCMwXQ%K}M>bLn>6EpQg*tPa=X%hu$^;3yf`yo5QpD@R+1YXG%fy zM~l1HghxwZH6Wq(tme1N#1e%YlV%Eb$wX0BF7g`Am7AJp=rVKexx&hi&I${i*|1&7 zmZUTGg89y3tXd)GWXkMhr54sM+}|<0#9D0B2emg@621UV&DN+nQtc?#*)Gvo%hcnJ zNb|zqn!!O_0HA-+{JHgdjhY6^zDQQS~fBUw=^h(Jw9L-1%?1@te=O*ay|f3sd)N9(A8!0gCcgtZ#WsZR1#ihZTlG zjD+>}eJ~vAm#QuO2GmoFHyE^4r(ABwFYgFOB`UeytxLYt#_ePl%h11n5S_bf`l# z{IKRGO|~=~JD~bBdUBXyJPQ}Q9}cOftquSU4pQyqO9{q|n%mZc(sHZ0?yV0dvZD*W zA~D-0Zoo#dTy_Snir+u4a9S>Kg)#rmtl4Py+`9Cm{&a`lFKL9`?!y7b_Mbr@>r68? z&1Xj~QPJD?Ra}~&Q05B1$Q1!c+gh?GxEVfb1u} zdB!dGh{Tz~qF94TyNLbSD_@6a~kE$K)4BLgnLi9L`~;!QJ_aTSsQeT zOnEHs5Pb3@xb2f1&NK~AKp~(oVO3?oEd6WJpMjfKHQz*w#$91~yMy5ef$O#ko8Bnp z`jJKHIw=UHo6waX`qEk&yc2d?uy=(7wM2-cT%UD8+4Av<8eHd~GT0mO- z4=PaQw*T&Nn}QDR|~X@qacR0%&Y8Be+{rAbbXzux`5ueTpvY~V+h$wE5U*(%N|QBOBH z?MysvI>wDtg!C77BZLW!vRo}PMjI&+h$PWbd3)BAWf7h;bV~Wd`L}gmbH;Cz5wT?UBjVbVq78EHsl6S2`(iPJfAo{Er^HDzPkPlTXN zKtDpfIZ>Iyr$Xqrh1!j75o=OIuz?MWYv}^vH^)QFM;9m@08{x!No16aMDV01`3S3N3aEhy*l2me!OwASu=nA zQ9e%Zy)+ou zH+{p9W%nSr!g8NuHM^!6jcFI*!D5H4bZ4wS=QCKI6`h2;$}wD!W!uYRCBvl^<#afB zQV|fhBCI$px_nI0{Awybi<=}u!4xoVcZsSzhi}mI$``T3)?O1x*>cbV)GC!ykis?8 z6aBjR__##1Og1z2%i=Zk70n@mV}olyXABZFquyzc9wgq{_T?x`fM>qQ243F$UL3R6%}GipsUK#WhxELtJY7g z^(B|bb1bT@^CEr&DKZtWspP1D61CAW(P*nAkTGf96B{#&MaZu_OtT?NI$UTX1 zAl&o9%{muwFP>$oxMBHu->?yCjI6yj)G-z&^FRXR&N2+6J4zvp14GQNIT{g{6wS$` z1M#aET{7`EHl{Yqv&@xiFx8Gb&*adn@M*2~LjO#z(5ulm^D48mKNFM9UDfnYK`O-? z%^$QN1MlE-`tP#PZpv+xU1nIh54umHR+h?drjN`-nhWu$YN4Up7{U3>!u){(QpZStqqr0WX5Bg-H=a|G*vS-n_Fe9w1l5*+0!L7-OG5 zfr4aQWopqrj2O?9p(>`BDd8VOVpp^kcL9Bji9= z{_3T$Ex*Q3FUY5o^8{mEImJC4GSt@XfV9;f0EWJt-B;VG24yRriW>??eRcjTZQU~S z08OCpV`Dw?e0+S`0E~)+e5v;$tsO=2^7^JcOk+ zbdWR}4qQdgk}~J1(NlaY4R3Hl5@weAmN+wIQP&hR2y18OgugFye}6K*?Q9_X=)PeG z4;ij;M%dPFK9--1? zp#5xA=l6l*d2R$$c7(0`=Wr7xds9kL6Md3a2a2LKIHL+|&EDnYFd+>Uuc}7Y5~kmP zh^qcl$pLWV+>^+qdGoq5x|#q2^liM9P7U9L`JG!li)U7QRXm}0cA}TOIxt3TOOk<_ zyeTJzRFg2Y#zy&Fa+UP%U&Z4NR}5ugWu}oj3=iw4u>_z->XK!K!cmBO!vperu81K! zX$b>P%wS}APjtp@>6mAl_`hl}@ga)Xv5=A*i~-(Ri(a(}YLerv?5PEZVi{8E-Oa<$ zoN}ev5hlldua{`ZaY;f@*^Sxpi0~v$NSPSJa|wGhd@;uu^^;B9eBPK>c<9m&)>D2m znVz_O2xy+;hqC5H*&%!FxVhc(NC=h$N%9qBdg6uS{o5suO&y$TfaNZIobj^sVk-XB zJf-f{sLC4CJOGNjt;oMi=wb4xl$=>3iu5yldSzYKp*UH6-Mqb3R|o9R>tTogp`pT>OfSO}u znKdJaI}V**Xg)er0B$iUi&(`Fx%J(pN?6Qoudcv8V9;@uiA}jzrFE=*Qj{R;L+3y; zc@VKMRVK(bhiME-1_hxAv>OeWKAMi`Z8wuO@Q{|($WwJ7E6PYUv6K9pezer4yyy#g zp`ews0csnr9O&&%Gfsw$vM5Du2;S{t#g};-fD|%XALVwO zmq~Qlb;7D3)cG9|s8|sqN{liAn19m!$tni>woS*RP($G_^e;uNT{8hrgN*uYo`yV< zt1K0Yea4_<90rRIX;^hk^2PwwbNXa%SZ3AkNFXWGmTlM3#mV|;=rQ9K6_8y8dx=Bn zf+&wXyO~L(L5@%t{W%m~rvs0PpdRF7>(9jpesaE!i}w9+}hyt3C-bm74zod^i5PJkLjk%vA0iMUfz;vzQE zi4QBYdw70eqhl4D?tYX9ADX^om+KYJO6DPC@GLTo!~1ruL36 z26ETh*3=sHF9xkKj3x=q50*6qZG5_Jp zO>d6#St%DehSxt2^cpD(sYJ+|y0J4YX6s}RN|Cd#B!lZkibX}{OaC`=c+?n8Jx2-L zX+|r?<-y#Pt(t&J;RdY4^LPtdD*p4(jS)8}J*)mxpBC~v=sQ(>91JwSA5jf| zhSmqyWBYiBT|DOP07mv$_0gLKn_bhL=1JF>tN-m(~#p7x5*@>_2i%-=^(xP z`$-ZU8dUx}(alZ2<`ohwgU;J%>NfAxp=mDm2-2~#C&&MFc2xZ4Xzi@L-M|M}DK-W~ zuX0iTWCj#DJV)^p)NxhZ!gE%xnlXA)cC!Wv!ZTbm2Dsf(ynF4DUq)yOBD(p1Y7qY5 z>J-zL7oJ+NSkrUt&k1E+a8BSeV5}lP2xyE{W8#d{C-k#KNv{RS_&t)p)N6Tf%!F8) z41ape{>C|Rman2Q18#M%h}U0(Xbm_AQXeMdiN`yAemIw3Y1iccDub}xHrWqfdPd0lu@UhVGA^AH(DwALed;&n0!|2i`f~ODj7-g?rCsupW4f&-hQRW1DBb5FY{wM@5Dlu zxf*j%E)$GQ9|G$dg|8q55zKm^hI>tKKw@+VvHOf_pwYf%C%pa?P(b5owqm2?+G^Qo z{q=|6$pzHl33NiJJeo`^-QzYMsL!B}BbHX6&rj|xAm#!6O2m#b6XemK#f&c~Ej)Z* zpz%-P2x_*c=3y$bq`J9l#?~K-T!%JN$jM zWCw}vTdi2x<1`JYDXW6JdDk zanaP0nobx!zHw5OE(zQu4J)vzBT~6GR4E`5#MHIt=V26qz$Bkx?QpfcV_|lB6&01g zKll3BfJ*f-poh!cqnOb00`bv26x|VqkLEJiWsN*Mo((}A*w~Yz1+^8#2^>;)ul2t@ z`rjUrMIbd?huA-fLOA3w?VP@8ij5)V{>8>#Gi%gzC$LI3EZ`Yzcw;h0B60kZf@`bf zWw0kzmGa=H#rX8mZ#{q?!YJ=_OPJG_fl%QPdz)I1%f}sUw?>jV9u8TdBD9|*jC^bPYhSytWf_ST2V=Tm zaZ`E=Or3RRy%a*w{GonRk<-Ex#%5KsQ#^n-SxA5fK3(G|5ES<$zm|#CpdyMcIni6q zzQ&}XT*qR>F`QL3@?;2^(Dl5L?dRdUAjUNAsp%oiyVRDr>!R^M7^WNDAAIu-d>e0K zLSW4Z;|6nFl*zJkR=xdLu8bap)!$Qr`N>~V`J^U{PEHOeG`XjJI){{JBi)}4#E0(g zz*<&@U}d(sZK^WJPNT7m{GzsRay=oPm>gS<#&S=Id>Zt9qIx&>0t;g?_mMS0rT)Yfa9&J ziNTF9J!)W8@ZOP(^=6IRqloD5nlIi`t)9sPxGN>-1i)1MAbJdHqB^*D9Mj%DKA{7a z59eSHDNio#yDz-jg6RJN9Fg+tp8hcV5x62V=)02bZ0{0{j@dH%3&x7_&n}(9&y$e0 zb1XB8?=Wxz(!hsK(_<2asH@fUh+`?fKf0zWZN)W1xa-AxXE+usOpE$xA;L+QF-N=% zM@&4>=6FO4+#&|#lAvgNsf*v#*fk2=L~LPZTFoAQXs<(2!7@YURTNBo_|%={w3SsL zo!6+zPWvn$hw*}FF>br0Q;+z!K_oLS($EJrnsk0T2+5no?N)TOoy7Pors_Iu5K{4W zh;sJPNM@#F+Zp#fKT0t^XCm#L>(M7qSj)`}8egafZ61u(a7g@b#MY%ys+8_uGtdQO z!-J#O*G?~RVNqecqp<8t-xethWY|^1-hxROrD6fSwNbVZDiTpbYuhrL z#8IZtg8dKf<#W?@@Yvhi7cFSp&301-{HFbSETYxLh$j5QXReC$(hm!wb|=>}@<5L+ zHH?u{XiK88#f`3Zan63iUaF zGOdtv-vBc>l&^^3VMGcpAn!DlVVEkJQ$eMF$*uNscxFXpkO)gMZ-DILw)Tb=!_Bw` zxQtRnG5bb1bQ#>j`~m#_4=!E8<6bidoh{FFW&e^ESbUcfBZI?9h)UWySj`~AvFZl# z49!U#K5sg2kqRI0Y30eA6{Wz*h7gGcQpp!LP@{zs6=D{7eBziHcZQ?9;qk?WFJ7Ge zq`fUn6rR%TtBj2V0i7#4p7JB&%t0x|LC;CJZB~Bn2HEHH9Bw>{^Ad~0oSKC@PZNf- zvUgCewcHTku{YULJ5gz7BZNCFh$rbJ@&J{ zg&jJ>E*5?%SE+HONZ3Pyslrq)??FCRbfCqlk9PyK9C^{n)O&P8UZX@OkLGiLA7N>< zYNB2Qx7jG_paz_!wgM)VCeBK&7^eCYAwAXAWI_=WrplP7-7J|yh~Fih75%`n=K`(^ z1O0e4`i4dD3J@!j5(aQw`&0Os@th)}pF6aT_BQ;9o#N@)ynp7az6d35 z+O*F3XHfv+j&%DmiUKTF9YVEoJXXKOgcjgDfO=qXjjg02-m`~>qJ}7FyLA0d-^MLI z5|0J#1p;63FKqc$vmp=be*S4B@kunb-{x?>)VtdCPFiFM)p;SlqQLcBS7g*sy{{;K zGoUKXKu=g~zp>C!8GrR$KFh$jU@b?pG2fZ$h^rdf z%8?8rp0+k;V#mDFR1eYpRK;g!Mt2dxBwrX7y{%Y)tU@xj0iFtzWpv^}th>D_J9gIL zx3uUeAmfKB@Xc1KO{l6hAscQ|Moy|kZ(4SYGp>F{UDpkV-gR-#9NIwNCWB;1>;zeh z$GH&BZ-Ba+fz8!hKrVi~6v?`8mvY<55D+hy+;nNe8Xipr7ErC-T7%626H3raFsE#Y zl>R?05dex#qYkuytA&I34VX=AI)5OMZcf=`F*F2aQ9z=CAYD}cX?34=agvPcoGT#m zyY4iGPP|F*j+*7Caia}>f3}7Er|iB^`LMk{SGRQ_Jz{Vzs+4R0_S5;C-q5-8PC#~3 z!_rL^+eMvg{(BUn0+1p+594?Bi$=@Zy+RUnAg5s}BDz5bJ|r z0G{hpOzTmaIY7;)>aKbpS3S}C4)~o=31M>Hbf57Fb4IhF9f2q+UefkCFwmLB`q)A+ z56I)3JNsw{c>i}GZDz_@YFqFD>w8d0wg&rkCyxE~sNH*A&ao@MQsjugWo9X`MeglW z3v=1{cr}swK|BXk7!>g%^pW}JzkU69axztP7=*V&{Q^B@R+%)-d~AQEJr|oz4Neu> z2P&$~?aLGEdlO$PkpkE<0ukYRG+vU&o)fA+J8EP(Lrwku*1FM1wq^zajlqM}9XTd( zs{9A!^a*cPEC8CJqk`l9~`j^-ykLc``36!qU?s?5}JKnF$V#6 zQ16d~Bs>?C*s*?D>03(TEbi(qd&kLDk(1Fiqc!P% zKEBlG1?M#yaOAomY3`=@A>-Yz1F_fI8C6BnrCY1J%Wpqz{;ekb8kW~X3}~sWS%DZ? zE%t>J)XgHY2kF|rAO5HhSIL5?f<=C3*zRmnMyRp4#%Co@=#kzPjzl$%MDQ-V?>mrL z8-W=wF1!c~%!S`TZcG`P%0<~0p$07vDfU~(6rc{1@r($PCO-1s3!fZB6|NRwgn>a2 zQjelJ8-B&;o59ULmte@c2O#0uK~NTGvkYe#>Jdl2Y-Ec1D}&$|f_{+AuL-#*zPp#F0G z`$ra|hXab1iSo>rYefbf^pKcr1_gtFO*ZWZuRk_A8&b8HHl=Pr%OS-NMFF~OI-0hP z@*aYunKveB6F<5r$}|pLx1WAP;ZP4}eZ6rZJ5VO++u%FLuOqtvm+9SbRqC^!dkw8|gq}n_>aV=`yu0Dbs#GIgxY{H!y`2sEkrpVov`q5Bsg` zeVT-F%i`kPqvWJ3&pn(q2OlWJ1~XYl9LlzgU?j#SO|K*LmC3`qG^}wJiwbMQ#pQsJ zk`IfPEhdnt*GLz_9L67*fn`e6$H2{WRQ$$qFkSeYw)aCUZYM{^V67V5fl4hgE+b&w z(n!fvZ{ELiLCG>FQL!NUGIK8Hkbg+cqh=kjP|^1vdJD zVwn8d=>`tQe&41!3=kkb6&VNRv`G|YGrg8_8j7D?jgmKw z>Cr+tVVR@QB_~+;CTUc*u2o;C%Vgs$)s;yr>!``j3{g_OY8%A;QzzF~F733J+9- zP*BoRdoK0>{pHm7L@q3bjdC*AFPi(|EpF^Y^Okh~9{ZX5od`!}0EdHIKmR7y0^xJb zETomZ^ZEe|MBL*lyfo|Sg-yZZ<}Ar78_i3UhAPnbVgL%*EC=^;Rhk>>iEwHk3KOFH zo^}W^t?8;io*~SyDMk&8F)zqNt2y~8r}w%e8ErmY;e8BLwDoA2_KmWFopglTfll1& z&fs-xeu1W&*dxWwBA{mS;-aaocl;cSW5h(7g*Y%etxqrA+nS~pCBSms4(77K6yS;) zC5&2d{oLC%VE4WPk7+jm!vRH&62xFG42RWmN@)qC(!EJC5A1ZNCh zI@|B@P@kiH6yigc=~WEZV7^-zDV>s^SA!dt9ftIFDwOQLn_ ztGvh(7x^6$ine_v7qmHO#)q^NPsSek2oCGA-nGnYUI)A|ODJX*ZkXFbc^8hs$W~Dy zJD==Q0{J3asjgEz+vY9G?)4kYy}5g@F?>6cBEKXtpIEi`G)}{VFjqx}UNA&6zuEvi zJhc2!RX%seh+q{gye|$v{bODC$GR>!X&mV`R=j*FD*Ad|qWzfnbC99RLK(Ba+$1Gl zZtr4|!yV*G8H0by1MVjJ;d{UC$RS}7unCV}19g15=ZguIV$q>MWJQXv0FhK|-QB3Y zB_9Jr7{W!GY;xIVNoC?^_9xWNpF&J$(vv6`n|N|UH)|7hW~UF;8WI6@3_QNm0_86O z(VyTRdVemc?o?3>=an_}jFG1V8$3j{Bkc@iQ=<3eq|KHmdfLPSnEx-%){LlGy+XL% zMwm$sw@L|s1cb;@MOX!BXZIz3gsmdnq>5O`C{x$1p<#V^w%Y-9Qf}$Y`r`bprH=28 zF%fz#M9W)2$EICAv%aRox)>7eRMo9yiulWdXTv*tVna93@rIiP+|f7DG$xcr%kpfC zXr-;v&u${nfVpna%ngCUnHKIm#&_Ss8y=8!*Z9A(eP4QPZatT#em0OcO^e7R2 zg=JHscY^FKzlEu=nWjB1kKT4HPaPE`@to&Teb)%~)62+*rBPKp5K=!ka%EI{H^b1q zV_nCid;Lx>20W@=ohRP|geP5;hepSNWOX7n(Frd*9l7lR_x=8Wg3fy1@NHDKO=<^G zXuc;&}_e;ujmSkAi|QH zKVLL{3dT;LtY0=`4sC>$`jg0qgAehsVP(p`NZK2RgJk@xYZUw^zgmZ?mT~JaTs;JK zo)V3fM1*{1Y8O+3YsEWa(_1dprggr-9 zl2N?|BLU=Qx+#zqnyeD**_TRiG5en?`c{op1->}i^_J52l>*Vj5>XA=_b+qrxaWm) zCXN58r}e?74U4)=nsa@J;}_1E{{va-noM?pYtfRT>s*l2`3cVGzxU)>qBtG^VL(Mc zO`NtGSe_(5hgvV$f^$u+pv7Ix^dXg~+jEqWucONB%)SlrWM3el69=F#+<(PO99tV- zm(*BMA|`sv&gaYthGRE)&UQfz2a~S@sP59ii5H}-PC!^k1JL^=6PA)|D+l7G)fz7> z7%7!UxH10sc~Fa~xMAW&K(0o4lc^L(fg^U}{L8E9%!^tTeI;xdhy|FEpNch%R#F=y zO6$g-dlN-Y+J(=36mpBFf7_M*GRHB;V#U{iNzi+Gzl8l7C?A#E8-+`%uhZEAzEDv0=E^pe&uz6o1|05(x)qPJ&j^n zOmK7JW}2?>s~WXVk)~G5>A#gxDE3Y@33JiCfM84(>20K(00C-oNF1%oS0{S zyV=`P6r4*UZcp+E)so&PjZNt#Q(0_yxJiwyd2aGxC12Q^NON66N0q{k_`o7enY13t zE$$={CJjs|C3z(-9ufxg(Y+#Uuwy1QEnNpx~jy~N0e6DRq0QxClLiZA$80{@I{3jSTei+F|`-uj=e@>wo1!y{DVedQmEi!&3-K ztXj{nL+(Gx$qXDmaJS(Wuj@^yBlM*}ml%(twBfbJ`Gk!&-^AfASV zZ1a!wL3DQdbqR0GM>Hs22i~{%sewF((17&jdetUTG&`SK(#JKuP(4@Y5cn)5Wq^$p!JPRa`jN(cRL>Y~gA+rsA z1LLiMmRpMnB)F`EfL1-Zyxyf(uwO?S0@`-6|6N~=2>oNMCr&~&-t^5;0utXNdyoa5 zGU7At?rwg*@JDe`>eM#DJ<9dQITMvS70zcDRaXdN2XsfAoqPiA9&i%*o z2c*u}>;W%RSjd$5-yQCgKv1tCovnUo{+ibWawl1Ik-yT~qE;pxfPH z+;G-2u9JqmWjqyD2NK^#o&|br08*p+`pw)1IFGq*2}GwhvO#P;u!;<^jMW*tb0>ACW^6_<(Moj+-T8BT0Ugj>R+s1+(FxV8 z+U+8xo4}yvI+qI)pJu=?ww7QtNd+~t&bh9Jf>=MEmyN5y=4DMwGrCs02qA=My7^hQ zvC~AB7pC@m2xxt8)^$@w*))aR++1wmsQ@axRX?FHtaB#5F=glc*UxB6iQ=Z}q{$r6bwpj!&O4+&c1yp(PHx=dFYdwuDC889t(c8v zVK*Lqc2O9t1%zyBQrUIdCt_siWA|OUH6Ig6^2ws(lnf_vHk}d#7&{M&vU&qyw>}{{ z8%!;H$P=~CK9fX|BwjX(`8%X{{3UUQr_Sux&Pe*x!nXJfpnTAb&V-roGqObZ9u+Q@ z47mo$NuAZ?vZ-~88%!7L0KV>QhveC@t%7OD!JK3FP`_zaGYzN>TGa-%J!Z`+rH+EQ zVXlYBdANn_MB-N`yJojhQH7Pw|2JWpGjY=khj^nChCjhJ5vxRo#HU!$b&X)z+R#=a z8NhN1`M&`TlKrqqLgqIaEj5Tb->%1MXVg9TFrSJD3`#v@)wO?9Xe3n9?bywwp?6-r zwvkxuMZ~PCk{PucXQHGiqc@%Ubzf77GU+^m%naE;nE!NU`cRSb0gt;|}i)!%O(oFuJHY#krLS7M_myla~j)2ptPZKO?wQ5*i zvcI_Vq+c*;9rCQi{qaYE7eWQQ_D|L&R)T2M_HZ}dp&m+aqL_asB{?sKR z_kK&^#&MfO-Kh)xc~^o1b}_Rm1>bl|h~<`?LC2bmjX%Zl=rH2s z(~8V|0c9A?$7QyivD7EOWGF$bsZubzkMA-;hR*3VimE&lDCHHGvYnD@W;`R&%FL5W zqf$ClJf=dY^rq=aMp`z1YcQ>jM3v#Vi$+V*N(@JpQY^K*l(-!@?Ki*?s#;&Gg9 z;JQ5Fymbz~{Qj>At{d({L?fw`iv_okf5Zn^-TACIGIPZC3Z-AF78*FCAjPeNgAff^ z!MIyO0IBc)m16lNT121?VEN%nJ7~vmvQr$ zb3CkhxeUA(yD9upQZcupnH$Zfm5Iw7p}FT{6zx86grtrGro!4qLa!Lw66afD@3vS& zg+WUnGzjU6sUsQj?PluchSrcI{d{C$NziPa>P$|&H?9;AiwFA=y5_%S7C#IWY`ZX4 z>L78ftSmfcm>oyia$LSm$x(bwz?vKerC#@^<>#0+o(tYHG!vPGdsTjNZ`2oP?FhR^ zL4wl-87X`exrm_*2^2WX!_b4uU!H-~RD(<)HSr;zx}}og|t2kC^ExDazVmlj;R=B zS&oS8;0TX;aqFFSWm%i-adaiItL!~*gMiX%58n4;U&Su)C`!M^QyO%^NuFsvQVu@6 z*TT1ti!o#8?tVnrF|wMNfCr-pRhXI{nJts>Yx(ab&ZU08aM<2KnE-VwzjelHYRcMl zrjNNIyT&NePTdGJt1`7(HE*xnL-Mi=F`jY8$EGY74v0Dv0`@qG4r2VdzDStL-sU;c zc12#v#)R*&>Ao^K#(mdE&8>G!U=>Bf-ub5gIuQ3(PhyiNfdA*^%~bGJqCG_IW=*mW zigjt9NFVq)>LTw}t`&-T4QRPtUAV}W$abJp?6?|<1>_Hs1-3Z8nK#gYzQA$IaP<^~ ziQi;TMmA5h`dNwE-?QbNuegBzHWnZ;9;7~LR)>3Z)FQ{e14&}G4K2SK&&Phe_o^rV z`_Z@;5bLr7Z7l0KsP4k7z1;TmCe8(-o^fRp`0MjD<$Y5PXn5@2a?KudbMpgvt9zwK z;G+fib7PJ(rl2CXk~z}rDM?{ zk^W~XVK%Cg_BR4Ng0X+#U3_;_PsNziQ39!pHnOW#GJ9S#CG z;VuVA`8ft{#VnzdCxX)|Dyq8U6>OG&7-z{bty_javiN#>RcZs1(W6w{frnbm&B;$X zF|!!d&33s8kE>qlgPY}UN@DAa3cm<1gZKYSBkAuao$%|p_=O}rrzsDM~S0+EIrxblZ zcTB)EwA2*48sLljAaC6QE)EN61hs(vtJRXs0%#1T-fnUG4kSkRIMsUTB*?ieq_Vip zM>5u*z0E%Wz<{Sna_#b!+e;}fl>QTiINePPKSYlio7*hY5OQiC^StU^7A>bBdIj|N z-+}#?NVrvVBMlz!0X6M%H`$~OV=3DbA{*j)0s2~zcY;?ZHih!ZinQ_6(1vZy#qsLS zVBg2Ztz-XWvFz@0?Sbb+zp0(md`{}Jldp0Gj$zu~IX03JDnVlT-5CgTeyW)Gd)BbX EI-|rq0ssI2 literal 0 HcmV?d00001 diff --git a/BKPS/14031206/Experts/Advisors/ExpertMAPSAR.mq5 b/BKPS/14031206/Experts/Advisors/ExpertMAPSAR.mq5 new file mode 100644 index 0000000..1eae701 --- /dev/null +++ b/BKPS/14031206/Experts/Advisors/ExpertMAPSAR.mq5 @@ -0,0 +1,171 @@ +//+------------------------------------------------------------------+ +//| ExpertMAPSAR.mq5 | +//| Copyright 2000-2025, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2000-2025, MetaQuotes Ltd." +#property link "https://www.mql5.com" +#property version "1.00" +//+------------------------------------------------------------------+ +//| Include | +//+------------------------------------------------------------------+ +#include +#include +#include +#include +//+------------------------------------------------------------------+ +//| Inputs | +//+------------------------------------------------------------------+ +//--- inputs for expert +input string Inp_Expert_Title ="ExpertMAPSAR"; +int Expert_MagicNumber =14598; +bool Expert_EveryTick =false; +//--- inputs for signal +input int Inp_Signal_MA_Period =12; +input int Inp_Signal_MA_Shift =6; +input ENUM_MA_METHOD Inp_Signal_MA_Method =MODE_SMA; +input ENUM_APPLIED_PRICE Inp_Signal_MA_Applied =PRICE_CLOSE; +//--- inputs for trailing +input double Inp_Trailing_ParabolicSAR_Step =0.02; +input double Inp_Trailing_ParabolicSAR_Maximum=0.2; +//+------------------------------------------------------------------+ +//| Global expert object | +//+------------------------------------------------------------------+ +CExpert ExtExpert; +//+------------------------------------------------------------------+ +//| Initialization function of the expert | +//+------------------------------------------------------------------+ +int OnInit(void) + { +//--- Initializing expert + if(!ExtExpert.Init(Symbol(),Period(),Expert_EveryTick,Expert_MagicNumber)) + { + //--- failed + printf(__FUNCTION__+": error initializing expert"); + ExtExpert.Deinit(); + return(-1); + } +//--- Creation of signal object + CSignalMA *signal=new CSignalMA; + if(signal==NULL) + { + //--- failed + printf(__FUNCTION__+": error creating signal"); + ExtExpert.Deinit(); + return(-2); + } +//--- Add signal to expert (will be deleted automatically)) + if(!ExtExpert.InitSignal(signal)) + { + //--- failed + printf(__FUNCTION__+": error initializing signal"); + ExtExpert.Deinit(); + return(-3); + } +//--- Set signal parameters + signal.PeriodMA(Inp_Signal_MA_Period); + signal.Shift(Inp_Signal_MA_Shift); + signal.Method(Inp_Signal_MA_Method); + signal.Applied(Inp_Signal_MA_Applied); +//--- Check signal parameters + if(!signal.ValidationSettings()) + { + //--- failed + printf(__FUNCTION__+": error signal parameters"); + ExtExpert.Deinit(); + return(-4); + } +//--- Creation of trailing object + CTrailingPSAR *trailing=new CTrailingPSAR; + if(trailing==NULL) + { + //--- failed + printf(__FUNCTION__+": error creating trailing"); + ExtExpert.Deinit(); + return(-5); + } +//--- Add trailing to expert (will be deleted automatically)) + if(!ExtExpert.InitTrailing(trailing)) + { + //--- failed + printf(__FUNCTION__+": error initializing trailing"); + ExtExpert.Deinit(); + return(-6); + } +//--- Set trailing parameters + trailing.Step(Inp_Trailing_ParabolicSAR_Step); + trailing.Maximum(Inp_Trailing_ParabolicSAR_Maximum); +//--- Check trailing parameters + if(!trailing.ValidationSettings()) + { + //--- failed + printf(__FUNCTION__+": error trailing parameters"); + ExtExpert.Deinit(); + return(-7); + } +//--- Creation of money object + CMoneyNone *money=new CMoneyNone; + if(money==NULL) + { + //--- failed + printf(__FUNCTION__+": error creating money"); + ExtExpert.Deinit(); + return(-8); + } +//--- Add money to expert (will be deleted automatically)) + if(!ExtExpert.InitMoney(money)) + { + //--- failed + printf(__FUNCTION__+": error initializing money"); + ExtExpert.Deinit(); + return(-9); + } +//--- Set money parameters +//--- Check money parameters + if(!money.ValidationSettings()) + { + //--- failed + printf(__FUNCTION__+": error money parameters"); + ExtExpert.Deinit(); + return(-10); + } +//--- Tuning of all necessary indicators + if(!ExtExpert.InitIndicators()) + { + //--- failed + printf(__FUNCTION__+": error initializing indicators"); + ExtExpert.Deinit(); + return(-11); + } +//--- succeed + return(INIT_SUCCEEDED); + } +//+------------------------------------------------------------------+ +//| Deinitialization function of the expert | +//+------------------------------------------------------------------+ +void OnDeinit(const int reason) + { + ExtExpert.Deinit(); + } +//+------------------------------------------------------------------+ +//| Function-event handler "tick" | +//+------------------------------------------------------------------+ +void OnTick(void) + { + ExtExpert.OnTick(); + } +//+------------------------------------------------------------------+ +//| Function-event handler "trade" | +//+------------------------------------------------------------------+ +void OnTrade(void) + { + ExtExpert.OnTrade(); + } +//+------------------------------------------------------------------+ +//| Function-event handler "timer" | +//+------------------------------------------------------------------+ +void OnTimer(void) + { + ExtExpert.OnTimer(); + } +//+------------------------------------------------------------------+ diff --git a/BKPS/14031206/Experts/Advisors/ExpertMAPSARSizeOptimized.ex5 b/BKPS/14031206/Experts/Advisors/ExpertMAPSARSizeOptimized.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..8423b80a65ca848a182bd4bcd6f4d77d124409aa GIT binary patch literal 147354 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

hY+`5C!E-Er08Gl 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↱V1}s;T!WYn13g2W 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 +#include +#include +#include +#include +#include +#include +#include +#include +//+------------------------------------------------------------------+ +//| defines | +//+------------------------------------------------------------------+ +//--- indents and gaps +#define INDENT_LEFT (11) // indent from left (with allowance for border width) +#define INDENT_TOP (11) // indent from top (with allowance for border width) +#define INDENT_RIGHT (11) // indent from right (with allowance for border width) +#define INDENT_BOTTOM (11) // indent from bottom (with allowance for border width) +#define CONTROLS_GAP_X (5) // gap by X coordinate +#define CONTROLS_GAP_Y (5) // gap by Y coordinate +//--- for buttons +#define BUTTON_WIDTH (100) // size by X coordinate +#define BUTTON_HEIGHT (20) // size by Y coordinate +//--- for the indication area +#define EDIT_HEIGHT (20) // size by Y coordinate +//--- for group controls +#define GROUP_WIDTH (150) // size by X coordinate +#define LIST_HEIGHT (179) // size by Y coordinate +#define RADIO_HEIGHT (56) // size by Y coordinate +#define CHECK_HEIGHT (93) // size by Y coordinate +//+------------------------------------------------------------------+ +//| Class CControlsDialog | +//| Usage: main dialog of the Controls application | +//+------------------------------------------------------------------+ +class CControlsDialog : public CAppDialog + { +private: + CEdit m_edit; // the display field object + CButton m_button1; // the button object + CButton m_button2; // the button object + CButton m_button3; // the fixed button object + CSpinEdit m_spin_edit; // the up-down object + CDatePicker m_date; // the datepicker object + CListView m_list_view; // the list object + CComboBox m_combo_box; // the dropdown list object + CRadioGroup m_radio_group; // the radio buttons group object + CCheckGroup m_check_group; // the check box group object + +public: + CControlsDialog(void); + ~CControlsDialog(void); + //--- create + virtual bool Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2); + //--- chart event handler + virtual bool OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam); + +protected: + //--- create dependent controls + bool CreateEdit(void); + bool CreateButton1(void); + bool CreateButton2(void); + bool CreateButton3(void); + bool CreateSpinEdit(void); + bool CreateDate(void); + bool CreateListView(void); + bool CreateComboBox(void); + bool CreateRadioGroup(void); + bool CreateCheckGroup(void); + //--- handlers of the dependent controls events + void OnClickButton1(void); + void OnClickButton2(void); + void OnClickButton3(void); + void OnChangeSpinEdit(void); + void OnChangeDate(void); + void OnChangeListView(void); + void OnChangeComboBox(void); + void OnChangeRadioGroup(void); + void OnChangeCheckGroup(void); + }; +//+------------------------------------------------------------------+ +//| Event Handling | +//+------------------------------------------------------------------+ +EVENT_MAP_BEGIN(CControlsDialog) + ON_EVENT(ON_CLICK,m_button1,OnClickButton1) + ON_EVENT(ON_CLICK,m_button2,OnClickButton2) + ON_EVENT(ON_CLICK,m_button3,OnClickButton3) + ON_EVENT(ON_CHANGE,m_spin_edit,OnChangeSpinEdit) + ON_EVENT(ON_CHANGE,m_date,OnChangeDate) + ON_EVENT(ON_CHANGE,m_list_view,OnChangeListView) + ON_EVENT(ON_CHANGE,m_combo_box,OnChangeComboBox) + ON_EVENT(ON_CHANGE,m_radio_group,OnChangeRadioGroup) + ON_EVENT(ON_CHANGE,m_check_group,OnChangeCheckGroup) +EVENT_MAP_END(CAppDialog) +//+------------------------------------------------------------------+ +//| Constructor | +//+------------------------------------------------------------------+ +CControlsDialog::CControlsDialog(void) + { + } +//+------------------------------------------------------------------+ +//| Destructor | +//+------------------------------------------------------------------+ +CControlsDialog::~CControlsDialog(void) + { + } +//+------------------------------------------------------------------+ +//| Create | +//+------------------------------------------------------------------+ +bool CControlsDialog::Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2) + { + if(!CAppDialog::Create(chart,name,subwin,x1,y1,x2,y2)) + return(false); +//--- create dependent controls + if(!CreateEdit()) + return(false); + if(!CreateButton1()) + return(false); + if(!CreateButton2()) + return(false); + if(!CreateButton3()) + return(false); + if(!CreateSpinEdit()) + return(false); + if(!CreateListView()) + return(false); + if(!CreateDate()) + return(false); + if(!CreateRadioGroup()) + return(false); + if(!CreateCheckGroup()) + return(false); + if(!CreateComboBox()) + return(false); +//--- succeed + return(true); + } +//+------------------------------------------------------------------+ +//| Create the display field | +//+------------------------------------------------------------------+ +bool CControlsDialog::CreateEdit(void) + { +//--- coordinates + int x1=INDENT_LEFT; + int y1=INDENT_TOP; + int x2=ClientAreaWidth()-INDENT_RIGHT; + int y2=y1+EDIT_HEIGHT; +//--- create + if(!m_edit.Create(m_chart_id,m_name+"Edit",m_subwin,x1,y1,x2,y2)) + return(false); + if(!m_edit.ReadOnly(true)) + return(false); + if(!Add(m_edit)) + return(false); +//--- succeed + return(true); + } +//+------------------------------------------------------------------+ +//| Create the "Button1" button | +//+------------------------------------------------------------------+ +bool CControlsDialog::CreateButton1(void) + { +//--- coordinates + int x1=INDENT_LEFT; + int y1=INDENT_TOP+(EDIT_HEIGHT+CONTROLS_GAP_Y); + int x2=x1+BUTTON_WIDTH; + int y2=y1+BUTTON_HEIGHT; +//--- create + if(!m_button1.Create(m_chart_id,m_name+"Button1",m_subwin,x1,y1,x2,y2)) + return(false); + if(!m_button1.Text("Button1")) + return(false); + if(!Add(m_button1)) + return(false); +//--- succeed + return(true); + } +//+------------------------------------------------------------------+ +//| Create the "Button2" button | +//+------------------------------------------------------------------+ +bool CControlsDialog::CreateButton2(void) + { +//--- coordinates + int x1=INDENT_LEFT+(BUTTON_WIDTH+CONTROLS_GAP_X); + int y1=INDENT_TOP+(EDIT_HEIGHT+CONTROLS_GAP_Y); + int x2=x1+BUTTON_WIDTH; + int y2=y1+BUTTON_HEIGHT; +//--- create + if(!m_button2.Create(m_chart_id,m_name+"Button2",m_subwin,x1,y1,x2,y2)) + return(false); + if(!m_button2.Text("Button2")) + return(false); + if(!Add(m_button2)) + return(false); +//--- succeed + return(true); + } +//+------------------------------------------------------------------+ +//| Create the "Button3" fixed button | +//+------------------------------------------------------------------+ +bool CControlsDialog::CreateButton3(void) + { +//--- coordinates + int x1=INDENT_LEFT+2*(BUTTON_WIDTH+CONTROLS_GAP_X); + int y1=INDENT_TOP+(EDIT_HEIGHT+CONTROLS_GAP_Y); + int x2=x1+BUTTON_WIDTH; + int y2=y1+BUTTON_HEIGHT; +//--- create + if(!m_button3.Create(m_chart_id,m_name+"Button3",m_subwin,x1,y1,x2,y2)) + return(false); + if(!m_button3.Text("Locked")) + return(false); + if(!Add(m_button3)) + return(false); + m_button3.Locking(true); +//--- succeed + return(true); + } +//+------------------------------------------------------------------+ +//| Create the "SpinEdit" element | +//+------------------------------------------------------------------+ +bool CControlsDialog::CreateSpinEdit(void) + { +//--- coordinates + int x1=INDENT_LEFT; + int y1=INDENT_TOP+(EDIT_HEIGHT+CONTROLS_GAP_Y)+(BUTTON_HEIGHT+CONTROLS_GAP_Y); + int x2=x1+GROUP_WIDTH; + int y2=y1+EDIT_HEIGHT; +//--- create + if(!m_spin_edit.Create(m_chart_id,m_name+"SpinEdit",m_subwin,x1,y1,x2,y2)) + return(false); + if(!Add(m_spin_edit)) + return(false); + m_spin_edit.MinValue(10); + m_spin_edit.MaxValue(1000); + m_spin_edit.Value(100); +//--- succeed + return(true); + } +//+------------------------------------------------------------------+ +//| Create the "DatePicker" element | +//+------------------------------------------------------------------+ +bool CControlsDialog::CreateDate(void) + { +//--- coordinates + int x1=INDENT_LEFT+GROUP_WIDTH+2*CONTROLS_GAP_X; + int y1=INDENT_TOP+(EDIT_HEIGHT+CONTROLS_GAP_Y)+(BUTTON_HEIGHT+CONTROLS_GAP_Y); + int x2=x1+GROUP_WIDTH; + int y2=y1+EDIT_HEIGHT; +//--- create + if(!m_date.Create(m_chart_id,m_name+"Date",m_subwin,x1,y1,x2,y2)) + return(false); + if(!Add(m_date)) + return(false); + m_date.Value(TimeCurrent()); +//--- succeed + return(true); + } +//+------------------------------------------------------------------+ +//| Create the "ListView" element | +//+------------------------------------------------------------------+ +bool CControlsDialog::CreateListView(void) + { +//--- coordinates + int x1=INDENT_LEFT+GROUP_WIDTH+2*CONTROLS_GAP_X; + int y1=INDENT_TOP+(EDIT_HEIGHT+CONTROLS_GAP_Y)+ + (BUTTON_HEIGHT+CONTROLS_GAP_Y)+ + (EDIT_HEIGHT+2*CONTROLS_GAP_Y); + int x2=x1+GROUP_WIDTH; + int y2=y1+LIST_HEIGHT-CONTROLS_GAP_Y; +//--- create + if(!m_list_view.Create(m_chart_id,m_name+"ListView",m_subwin,x1,y1,x2,y2)) + return(false); + if(!Add(m_list_view)) + return(false); +//--- fill out with strings + for(int i=0;i<16;i++) + if(!m_list_view.AddItem("Item "+IntegerToString(i))) + return(false); +//--- succeed + return(true); + } +//+------------------------------------------------------------------+ +//| Create the "ComboBox" element | +//+------------------------------------------------------------------+ +bool CControlsDialog::CreateComboBox(void) + { +//--- coordinates + int x1=INDENT_LEFT; + int y1=INDENT_TOP+(EDIT_HEIGHT+CONTROLS_GAP_Y)+ + (BUTTON_HEIGHT+CONTROLS_GAP_Y)+ + (EDIT_HEIGHT+CONTROLS_GAP_Y); + int x2=x1+GROUP_WIDTH; + int y2=y1+EDIT_HEIGHT; +//--- create + if(!m_combo_box.Create(m_chart_id,m_name+"ComboBox",m_subwin,x1,y1,x2,y2)) + return(false); + if(!Add(m_combo_box)) + return(false); +//--- fill out with strings + for(int i=0;i<16;i++) + if(!m_combo_box.ItemAdd("Item "+IntegerToString(i))) + return(false); +//--- succeed + return(true); + } +//+------------------------------------------------------------------+ +//| Create the "RadioGroup" element | +//+------------------------------------------------------------------+ +bool CControlsDialog::CreateRadioGroup(void) + { +//--- coordinates + int x1=INDENT_LEFT; + int y1=INDENT_TOP+(EDIT_HEIGHT+CONTROLS_GAP_Y)+ + (BUTTON_HEIGHT+CONTROLS_GAP_Y)+ + (EDIT_HEIGHT+CONTROLS_GAP_Y)+ + (EDIT_HEIGHT+CONTROLS_GAP_Y); + int x2=x1+GROUP_WIDTH; + int y2=y1+RADIO_HEIGHT; +//--- create + if(!m_radio_group.Create(m_chart_id,m_name+"RadioGroup",m_subwin,x1,y1,x2,y2)) + return(false); + if(!Add(m_radio_group)) + return(false); +//--- fill out with strings + for(int i=0;i<3;i++) + if(!m_radio_group.AddItem("Item "+IntegerToString(i),1< +#include +#include +#include +//--- +input double InpLots =0.1; // Lots +input int InpTakeProfit =50; // Take Profit (in pips) +input int InpTrailingStop =30; // Trailing Stop Level (in pips) +input int InpMACDOpenLevel =3; // MACD open level (in pips) +input int InpMACDCloseLevel=2; // MACD close level (in pips) +input int InpMATrendPeriod =26; // MA trend period +//--- +int ExtTimeOut=10; // time out in seconds between trade operations +//+------------------------------------------------------------------+ +//| MACD Sample expert class | +//+------------------------------------------------------------------+ +class CSampleExpert + { +protected: + double m_adjusted_point; // point value adjusted for 3 or 5 points + CTrade m_trade; // trading object + CSymbolInfo m_symbol; // symbol info object + CPositionInfo m_position; // trade position object + CAccountInfo m_account; // account info wrapper + //--- indicators + int m_handle_macd; // MACD indicator handle + int m_handle_ema; // moving average indicator handle + //--- indicator buffers + double m_buff_MACD_main[]; // MACD indicator main buffer + double m_buff_MACD_signal[]; // MACD indicator signal buffer + double m_buff_EMA[]; // EMA indicator buffer + //--- indicator data for processing + double m_macd_current; + double m_macd_previous; + double m_signal_current; + double m_signal_previous; + double m_ema_current; + double m_ema_previous; + //--- + double m_macd_open_level; + double m_macd_close_level; + double m_traling_stop; + double m_take_profit; + +public: + CSampleExpert(void); + ~CSampleExpert(void); + bool Init(void); + void Deinit(void); + bool Processing(void); + +protected: + bool InitCheckParameters(const int digits_adjust); + bool InitIndicators(void); + bool LongClosed(void); + bool ShortClosed(void); + bool LongModified(void); + bool ShortModified(void); + bool LongOpened(void); + bool ShortOpened(void); + }; +//--- global expert +CSampleExpert ExtExpert; +//+------------------------------------------------------------------+ +//| Constructor | +//+------------------------------------------------------------------+ +CSampleExpert::CSampleExpert(void) : m_adjusted_point(0), + m_handle_macd(INVALID_HANDLE), + m_handle_ema(INVALID_HANDLE), + m_macd_current(0), + m_macd_previous(0), + m_signal_current(0), + m_signal_previous(0), + m_ema_current(0), + m_ema_previous(0), + m_macd_open_level(0), + m_macd_close_level(0), + m_traling_stop(0), + m_take_profit(0) + { + ArraySetAsSeries(m_buff_MACD_main,true); + ArraySetAsSeries(m_buff_MACD_signal,true); + ArraySetAsSeries(m_buff_EMA,true); + } +//+------------------------------------------------------------------+ +//| Destructor | +//+------------------------------------------------------------------+ +CSampleExpert::~CSampleExpert(void) + { + } +//+------------------------------------------------------------------+ +//| Initialization and checking for input parameters | +//+------------------------------------------------------------------+ +bool CSampleExpert::Init(void) + { +//--- initialize common information + m_symbol.Name(Symbol()); // symbol + m_trade.SetExpertMagicNumber(MACD_MAGIC); // magic + m_trade.SetMarginMode(); + m_trade.SetTypeFillingBySymbol(Symbol()); +//--- tuning for 3 or 5 digits + int digits_adjust=1; + if(m_symbol.Digits()==3 || m_symbol.Digits()==5) + digits_adjust=10; + m_adjusted_point=m_symbol.Point()*digits_adjust; +//--- set default deviation for trading in adjusted points + m_macd_open_level =InpMACDOpenLevel*m_adjusted_point; + m_macd_close_level=InpMACDCloseLevel*m_adjusted_point; + m_traling_stop =InpTrailingStop*m_adjusted_point; + m_take_profit =InpTakeProfit*m_adjusted_point; +//--- set default deviation for trading in adjusted points + m_trade.SetDeviationInPoints(3*digits_adjust); +//--- + if(!InitCheckParameters(digits_adjust)) + return(false); + if(!InitIndicators()) + return(false); +//--- succeed + return(true); + } +//+------------------------------------------------------------------+ +//| Checking for input parameters | +//+------------------------------------------------------------------+ +bool CSampleExpert::InitCheckParameters(const int digits_adjust) + { +//--- initial data checks + if(InpTakeProfit*digits_adjustm_symbol.LotsMax()) + { + printf("Lots amount must be in the range from %f to %f",m_symbol.LotsMin(),m_symbol.LotsMax()); + return(false); + } + if(MathAbs(InpLots/m_symbol.LotsStep()-MathRound(InpLots/m_symbol.LotsStep()))>1.0E-10) + { + printf("Lots amount is not corresponding with lot step %f",m_symbol.LotsStep()); + return(false); + } +//--- warning + if(InpTakeProfit<=InpTrailingStop) + printf("Warning: Trailing Stop must be less than Take Profit"); +//--- succeed + return(true); + } +//+------------------------------------------------------------------+ +//| Initialization of the indicators | +//+------------------------------------------------------------------+ +bool CSampleExpert::InitIndicators(void) + { +//--- create MACD indicator + if(m_handle_macd==INVALID_HANDLE) + if((m_handle_macd=iMACD(NULL,0,12,26,9,PRICE_CLOSE))==INVALID_HANDLE) + { + printf("Error creating MACD indicator"); + return(false); + } +//--- create EMA indicator and add it to collection + if(m_handle_ema==INVALID_HANDLE) + if((m_handle_ema=iMA(NULL,0,InpMATrendPeriod,0,MODE_EMA,PRICE_CLOSE))==INVALID_HANDLE) + { + printf("Error creating EMA indicator"); + return(false); + } +//--- succeed + return(true); + } +//+------------------------------------------------------------------+ +//| Check for long position closing | +//+------------------------------------------------------------------+ +bool CSampleExpert::LongClosed(void) + { + bool res=false; +//--- should it be closed? + if(m_macd_current>0) + if(m_macd_currentm_signal_previous) + if(m_macd_current>m_macd_close_level) + { + //--- close position + if(m_trade.PositionClose(Symbol())) + printf("Long position by %s to be closed",Symbol()); + else + printf("Error closing position by %s : '%s'",Symbol(),m_trade.ResultComment()); + //--- processed and cannot be modified + res=true; + } +//--- result + return(res); + } +//+------------------------------------------------------------------+ +//| Check for short position closing | +//+------------------------------------------------------------------+ +bool CSampleExpert::ShortClosed(void) + { + bool res=false; +//--- should it be closed? + if(m_macd_current<0) + if(m_macd_current>m_signal_current && m_macd_previousm_macd_close_level) + { + //--- close position + if(m_trade.PositionClose(Symbol())) + printf("Short position by %s to be closed",Symbol()); + else + printf("Error closing position by %s : '%s'",Symbol(),m_trade.ResultComment()); + //--- processed and cannot be modified + res=true; + } +//--- result + return(res); + } +//+------------------------------------------------------------------+ +//| Check for long position modifying | +//+------------------------------------------------------------------+ +bool CSampleExpert::LongModified(void) + { + bool res=false; +//--- check for trailing stop + if(InpTrailingStop>0) + { + if(m_symbol.Bid()-m_position.PriceOpen()>m_adjusted_point*InpTrailingStop) + { + double sl=NormalizeDouble(m_symbol.Bid()-m_traling_stop,m_symbol.Digits()); + double tp=m_position.TakeProfit(); + if(m_position.StopLoss()0) + { + if((m_position.PriceOpen()-m_symbol.Ask())>(m_adjusted_point*InpTrailingStop)) + { + double sl=NormalizeDouble(m_symbol.Ask()+m_traling_stop,m_symbol.Digits()); + double tp=m_position.TakeProfit(); + if(m_position.StopLoss()>sl || m_position.StopLoss()==0.0) + { + //--- modify position + if(m_trade.PositionModify(Symbol(),sl,tp)) + printf("Short position by %s to be modified",Symbol()); + else + { + printf("Error modifying position by %s : '%s'",Symbol(),m_trade.ResultComment()); + printf("Modify parameters : SL=%f,TP=%f",sl,tp); + } + //--- modified and must exit from expert + res=true; + } + } + } +//--- result + return(res); + } +//+------------------------------------------------------------------+ +//| Check for long position opening | +//+------------------------------------------------------------------+ +bool CSampleExpert::LongOpened(void) + { + bool res=false; +//--- check for long position (BUY) possibility + if(m_macd_current<0) + if(m_macd_current>m_signal_current && m_macd_previous(m_macd_open_level) && m_ema_current>m_ema_previous) + { + double price=m_symbol.Ask(); + double tp =m_symbol.Bid()+m_take_profit; + //--- check for free money + if(m_account.FreeMarginCheck(Symbol(),ORDER_TYPE_BUY,InpLots,price)<0.0) + printf("We have no money. Free Margin = %f",m_account.FreeMargin()); + else + { + //--- open position + if(m_trade.PositionOpen(Symbol(),ORDER_TYPE_BUY,InpLots,price,0.0,tp)) + printf("Position by %s to be opened",Symbol()); + else + { + printf("Error opening BUY position by %s : '%s'",Symbol(),m_trade.ResultComment()); + printf("Open parameters : price=%f,TP=%f",price,tp); + } + } + //--- in any case we must exit from expert + res=true; + } +//--- result + return(res); + } +//+------------------------------------------------------------------+ +//| Check for short position opening | +//+------------------------------------------------------------------+ +bool CSampleExpert::ShortOpened(void) + { + bool res=false; +//--- check for short position (SELL) possibility + if(m_macd_current>0) + if(m_macd_currentm_signal_previous) + if(m_macd_current>(m_macd_open_level) && m_ema_current=limit_time) + { + //--- check for data + if(Bars(Symbol(),Period())>2*InpMATrendPeriod) + { + //--- change limit time by timeout in seconds if processed + if(ExtExpert.Processing()) + limit_time=TimeCurrent()+ExtTimeOut; + } + } + } +//+------------------------------------------------------------------+ diff --git a/BKPS/14031206/Experts/Examples/Math 3D Morpher/Functions.mqh b/BKPS/14031206/Experts/Examples/Math 3D Morpher/Functions.mqh new file mode 100644 index 0000000..1f27019 --- /dev/null +++ b/BKPS/14031206/Experts/Examples/Math 3D Morpher/Functions.mqh @@ -0,0 +1,372 @@ +//+------------------------------------------------------------------+ +//| Functions.mqh | +//| Copyright 2000-2025, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ + +//--- custom function y=f(x,y) +typedef double(*MathFunction)(double,double); + +//+------------------------------------------------------------------+ +//| math functions | +//+------------------------------------------------------------------+ +enum EnMathFunction + { + Peaks=0, + Chomolungma=1, + ClimberDream=2, + Granite=3, + Hedgehog=4, + Hill=5, + Josephine=6, + Screw=7, + DoubleScrew=8, + MultiExtremalScrew=9, + Sink=10, + Skin=11, + Trapfall=12, + }; +//+------------------------------------------------------------------+ +//| Names of the math functions | +//+------------------------------------------------------------------+ +const string ExtFunctionsNames[]= + { + "Peaks", + "Chomolungma", + "Climber Dream", + "Granite", + "Hedgehog", + "Hill", + "Josephine", + "Screw", + "Double Screw", + "Multi Extremal Screw", + "Sinc", + "Skin", + "Trapfall" + }; +//+------------------------------------------------------------------+ +//| Function Peaks | +//+------------------------------------------------------------------+ +double PeaksFunction(double x,double y) + { + double res = 3*MathPow((1-x),2)*MathExp(-x*x-(y+1)*(y+1))-10*(0.2*x-MathPow(x,3)-MathPow(y,5))*MathExp(-x*x-y*y)-1/3*MathExp(-(x+1)*(x+1)-y*y); +//--- + return(res); + } +//+------------------------------------------------------------------+ +//| Function Chomolungma | +//+------------------------------------------------------------------+ +double ChomolungmaFunction(double x,double y) + { + double a= MathCos(x*x)+MathCos(y*y); + double b= MathPow(MathCos(5*x*y),5); + double c=1.0/MathPow(2,b); +//--- calculate result + double res=a-c; +//--- + return(res); + } +//+------------------------------------------------------------------+ +//| Function ClimberDream | +//+------------------------------------------------------------------+ +double ClimberDreamFunction(double x,double y) + { + double a= MathSin(MathSqrt(MathAbs(x - 1.3) + MathAbs(y))); + double b= MathCos(MathSqrt(MathAbs(MathSin(x))) + MathSqrt(MathAbs(MathSin(y)))); + double f=a+b; +//--- calculate result + double res=MathPow(f,4); +//--- + return(res); + } +//+------------------------------------------------------------------+ +//| Function Granite | +//+------------------------------------------------------------------+ +double GraniteFunction(double x,double y) + { + double a= MathPow(MathSin(MathSqrt(MathAbs(x)+MathAbs(y))),2); + double b= MathPow(MathCos(MathSqrt(MathAbs(x)+MathAbs(y))),2); +//--- calculate result + double res=a*b; +//--- + return(res); + } +//+------------------------------------------------------------------+ +//| Function Hedgehog | +//+------------------------------------------------------------------+ +double HedgehogFunction(double x,double y) + { + double a1=MathSin(MathSqrt(MathAbs(x-2)+MathAbs(y))); + double a2=MathCos(MathSqrt(MathAbs(MathSin(x)))+MathSqrt(MathAbs(MathSin(y)))); +//--- calculate result + double res=a1+a2; +//--- + return(res); + } +//+------------------------------------------------------------------+ +//| Function Hill | +//+------------------------------------------------------------------+ +double HillFunction(double x,double y) + { +//--- calculate result + double res=MathExp(-x*x-y*y); +//--- + return(res); + } +//+------------------------------------------------------------------+ +//| Function Josephine | +//+------------------------------------------------------------------+ +double JosephineFunction(double x,double y) + { + double a= MathSin(MathPow(MathAbs(x)+MathAbs(y),0.5)); + double b= MathCos(MathPow(MathAbs(x),0.5)+MathPow(MathAbs(y),0.5)); +//--- calculate function + double res=a+b; +//--- + return(res); + } +//+------------------------------------------------------------------+ +//| Function Screw | +//+------------------------------------------------------------------+ +double ScrewFunction(double x,double y) + { + double a=(y==0)?0:((x*y<0)?MathArctan(x/y):MathArctan(x/y)+M_PI); + double b=x*x+y*y; + double f=MathSin(b+a); +//--- calculate result + double res=(f*f); +//--- + return(res); + } +//+------------------------------------------------------------------+ +//| Function DoubleScrew | +//+------------------------------------------------------------------+ +double DoubleScrewFunction(double x,double y) + { + double a=(y==0)?0:((x*y<0)?MathArctan(x/y):MathArctan(x/y)+M_PI); + double b=x*x+y*y; + double res1=MathCos(b/2+a*3); + res1=((res1*res1)/sqrt(b+1)-0.2); + double res2=MathCos(b/2-a*3); + res2=((res2*res2)/sqrt(b+1)-0.2); + double f=fmax(res1,res2); +//--- calculate result + double res=(f>0)?f:0; +//--- + return(res); + } +//+------------------------------------------------------------------+ +//| Function MultiExtremalScrew | +//+------------------------------------------------------------------+ +double MultiExtremalScrewFunction(double x,double y) + { + double a=(y==0)?0:((x*y<0)?MathArctan(x/y):MathArctan(x/y)+M_PI); + double b=x*x+y*y; + double res1=MathCos(b/2+a*3); + res1=((res1*res1)/sqrt(b+1)-0.2); + double res2=MathCos(b/2-a*3); + res2=((res2*res2)/sqrt(b+1)-0.2); +//--- calculate function + double res=fmin(res1,res2); +//--- + return(res); + } +//+------------------------------------------------------------------+ +//| Function Sink | +//+------------------------------------------------------------------+ +double SinkFunction(double x,double y) + { + static double k=5.0; + static double p=6.0; +//--- calculate result + double res=MathSin(x*x+y*y)+k*MathExp(-p*x*x-p*y*y); +//--- + return(res); + } +//+------------------------------------------------------------------+ +//| Function Skin | +//+------------------------------------------------------------------+ +double SkinFunction(double x,double y) + { + double a1=2*x*x; + double a2=2*y*y; + double b1=MathCos(a1)-1.1; + b1=b1*b1; + double c1=MathSin(0.5*x)-1.2; + c1=c1*c1; + double d1=MathCos(a2)-1.1; + d1=d1*d1; + double e1=MathSin(0.5*y)-1.2; + e1=e1*e1; +//--- calculate result + double res=b1+c1-d1+e1; +//--- + return(res); + } +//+------------------------------------------------------------------+ +//| Function Trapfall | +//+------------------------------------------------------------------+ +double TrapfallFunction(double x,double y) + { + double a1=MathSqrt(MathAbs(MathSin(x-1.0))); + double b1=MathSqrt(MathAbs(MathSin(y+2.0))); +//--- calculate result + double res=-MathSqrt(MathAbs(MathSin(MathSin(a1+b1)))); +//--- + return(res); + } +//+------------------------------------------------------------------+ +//| GenerateFunctionData | +//+------------------------------------------------------------------+ +void GenerateFunctionData(double &data[],int &x_size,int &y_size,double x_min,double x_max,double y_min,double y_max,MathFunction function) + { + double dx = 0.1; + double dy = 0.1; +//--- + x_size = (int)((x_max - x_min)/dx) + 1; + y_size = (int)((y_max - y_min)/dy) + 1; + ArrayResize(data,x_size*y_size); +//--- + for(int j = 0; j < y_size; j++) + { + for(int i = 0; i < x_size; i++) + { + double x = x_min + i*dx; + double y = y_min + j*dy; + data[j*x_size + i] = function(x,y); + } + } + } +//+------------------------------------------------------------------+ +//| GenerateData | +//+------------------------------------------------------------------+ +void GenerateData(EnMathFunction function_id,double &data[],int &x_size,int &y_size) + { +//--- + switch(function_id) + { + case Peaks: + GenerateFunctionData(data,x_size,y_size,-3.0,+3.0,-3.0,+3.0,PeaksFunction); + break; + case Chomolungma: + GenerateFunctionData(data,x_size,y_size,-2.0,+2.0,-2.0,+2.0,ChomolungmaFunction); + break; + case ClimberDream: + GenerateFunctionData(data,x_size,y_size,-10.0,+10.0,-10.0,+10.0,ClimberDreamFunction); + break; + case Granite: + GenerateFunctionData(data,x_size,y_size,-4.0,+4.0,-4.0,+4.0,GraniteFunction); + break; + case Hedgehog: + GenerateFunctionData(data,x_size,y_size,-10.0,+10.0,-10.0,+10.0,HedgehogFunction); + break; + case Hill: + GenerateFunctionData(data,x_size,y_size,-1.5,+1.5,-1.5,+1.5,HillFunction); + break; + case Josephine: + GenerateFunctionData(data,x_size,y_size,-200.0,+200.0,-200.0,+200.0,JosephineFunction); + break; + case Screw: + GenerateFunctionData(data,x_size,y_size,-3.0,+3.0,-3.0,+3.0,ScrewFunction); + break; + case DoubleScrew: + GenerateFunctionData(data,x_size,y_size,-3.0,+3.0,-3.0,+3.0,DoubleScrewFunction); + break; + case MultiExtremalScrew: + GenerateFunctionData(data,x_size,y_size,-3.0,+3.0,-3.0,+3.0,MultiExtremalScrewFunction); + break; + case Sink: + GenerateFunctionData(data,x_size,y_size,-3.0,+3.0,-3.0,+3.0,SinkFunction); + break; + case Skin: + GenerateFunctionData(data,x_size,y_size,-5.0,+5.0,-5.0,+5.0,SkinFunction); + break; + case Trapfall: + GenerateFunctionData(data,x_size,y_size,-5.0,+5.0,-5.0,+5.0,TrapfallFunction); + break; + } + } +//+------------------------------------------------------------------+ +//| GenerateFunctionDataFixedSize | +//+------------------------------------------------------------------+ +bool GenerateFunctionDataFixedSize(int x_size,int y_size,double &data[],double x_min,double x_max,double y_min,double y_max,MathFunction function) + { + if(x_size<2 || y_size<2) + { + PrintFormat("Error in data sizes: x_size=%d,y_size=%d",x_size,y_size); + return(false); + } + double dx = (x_max - x_min)/(x_size-1); + double dy = (y_max - y_min)/(y_size-1); + ArrayResize(data,x_size*y_size); +//--- + for(int j = 0; j < y_size; j++) + { + for(int i = 0; i < x_size; i++) + { + double x = x_min + i*dx; + double y = y_min + j*dy; + data[j*x_size + i] = function(x,y); + } + } + return(true); + } +//+------------------------------------------------------------------+ +//| GenerateDataFixedSize | +//+------------------------------------------------------------------+ +bool GenerateDataFixedSize(int x_size,int y_size,EnMathFunction function_id,double &data[]) + { + if(x_size<2 || y_size<2) + { + PrintFormat("Error in data sizes: x_size=%d,y_size=%d",x_size,y_size); + return(false); + } + bool result=false; +//--- + switch(function_id) + { + case Peaks: + result=GenerateFunctionDataFixedSize(x_size,y_size,data,-3.0,+3.0,-3.0,+3.0,PeaksFunction); + break; + case Chomolungma: + result=GenerateFunctionDataFixedSize(x_size,y_size,data,-2.0,+2.0,-2.0,+2.0,ChomolungmaFunction); + break; + case ClimberDream: + result=GenerateFunctionDataFixedSize(x_size,y_size,data,-10.0,+10.0,-10.0,+10.0,ClimberDreamFunction); + break; + case Granite: + result=GenerateFunctionDataFixedSize(x_size,y_size,data,-4.0,+4.0,-4.0,+4.0,GraniteFunction); + break; + case Hedgehog: + result=GenerateFunctionDataFixedSize(x_size,y_size,data,-10.0,+10.0,-10.0,+10.0,HedgehogFunction); + break; + case Hill: + result=GenerateFunctionDataFixedSize(x_size,y_size,data,-1.5,+1.5,-1.5,+1.5,HillFunction); + break; + case Josephine: + result=GenerateFunctionDataFixedSize(x_size,y_size,data,-200.0,+200.0,-200.0,+200.0,JosephineFunction); + break; + case Screw: + result=GenerateFunctionDataFixedSize(x_size,y_size,data,-3.0,+3.0,-3.0,+3.0,ScrewFunction); + break; + case DoubleScrew: + result=GenerateFunctionDataFixedSize(x_size,y_size,data,-3.0,+3.0,-3.0,+3.0,DoubleScrewFunction); + break; + case MultiExtremalScrew: + result=GenerateFunctionDataFixedSize(x_size,y_size,data,-3.0,+3.0,-3.0,+3.0,MultiExtremalScrewFunction); + break; + case Sink: + result=GenerateFunctionDataFixedSize(x_size,y_size,data,-3.0,+3.0,-3.0,+3.0,SinkFunction); + break; + case Skin: + result=GenerateFunctionDataFixedSize(x_size,y_size,data,-5.0,+5.0,-5.0,+5.0,SkinFunction); + break; + case Trapfall: + result=GenerateFunctionDataFixedSize(x_size,y_size,data,-5.0,+5.0,-5.0,+5.0,TrapfallFunction); + break; + } +//--- + return(result); + } +//+------------------------------------------------------------------+ diff --git a/BKPS/14031206/Experts/Examples/Math 3D Morpher/Math 3D Morpher.ex5 b/BKPS/14031206/Experts/Examples/Math 3D Morpher/Math 3D Morpher.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..c186737c50e3ab115d7699d84e7592b3d4adf496 GIT binary patch literal 68560 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 literal 0 HcmV?d00001 diff --git a/BKPS/14031206/Experts/Examples/Math 3D Morpher/Math 3D Morpher.mq5 b/BKPS/14031206/Experts/Examples/Math 3D Morpher/Math 3D Morpher.mq5 new file mode 100644 index 0000000000000000000000000000000000000000..2ecc8cb9f707a6a78a2a2ed1f037af5b48b7f16e GIT binary patch literal 35776 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 literal 0 HcmV?d00001 diff --git a/BKPS/14031206/Experts/Examples/Math 3D Morpher/Textures/checker.bmp b/BKPS/14031206/Experts/Examples/Math 3D Morpher/Textures/checker.bmp new file mode 100644 index 0000000000000000000000000000000000000000..0d65c538b8a39a3d5491f1c40a5a63e7eeb26943 GIT binary patch literal 196662 zcmeIy!3l&g00q&=Hem@{fd%Z{=F^aCND=Qc0Y&jJF!S+uU*j{@x!&u$9*%t-<6Lj= z+28l`zCRsmV0Neh8bA0$;|HHj&>Coh)_|=a-PVuZ0Cog)_|=a-PVuZ0Cog)_|=a-PVuZ0Cog)_|=a-PVuZ0Cog)_|=a-PVuZ0Cog)_|=a-PVuZ0Cog z)_|=a-PVuZ0Cog)_|=a z-PVuZ0qocsqqjh7paoh3wtjS5KY9za z23nvsVCzS>^`o~yYoG;M1Gav2TR(aWv<6zBHDK#UxAmj9Kx?1{S_8IzbXz}q3$zAW zpfzCYN4NE(w?J#41zH2Peso(udJD7$TA(#x>qocsqqjh7paoh3wtjS5KY9za23nvs zVCzS>^`o~yYoG;M1Gav2TR(aWv<6zBHDK#UxAmj9Kx?1{S_8IzbXz}q3$zAWpfzCY zN4NE(w?J#41zH2Peso(udJD7$TA(#x>qocsqqjh7paoh3wtjS5KY9za23nvsVCzS> z^`o~yYoG;M1Gav2TR(aWv<6zBHDK#UxAmj9Kx?1{S_8IzbXz}q3$zAWpfzCYN4NE( zw?J#41zH2Peso(udJD7$TA(#x>qocsqqjh7paoh3wtjS5KY9za23nvsVCzS>^`o~y zYoG;M1Gav2TR(aWv<6zBHDK#UxAmj9Kx?1{S_8IzbXz}q3$zAWpfzCYN4NE(w?J#4 z1zH2Peso(udJD7$TA(#x>qocsqqjh7paoh3wtjS5KY9za23nvsVCzS>^`o~yYoG;M z1Gav2TR(aWv<6zBHDK#UxAmj9Kx?1{S_8IzbXz}q3$zAWpfzCYN4NE(w?J#41zH2P zeso(udJD7$TA(#x>qocsqqjh7paoh3wtjS5KY9za23nvsVCzS>^`o~yYoG;M1Gav2 zTR(aWv<6zBHDK#UxAmj9Kx?1{S_8IzbXz}q3$zAWpfzCYN4NE(w?J#41zH2Peso(u zdJD7$TA(#x>qocsqqjh7paoh3wtjS5KY9za23nvsVCzS>^`o~yYoG;M1Gav2TR(aW zv<6zBHDK#UxAmj9Kx?1{S_8IzbXz}q3$zAWpfzCYN4NE(w?J#41zH2Peso(udJD7$ zTA(#x>qocsqqjh7paoh3wtjS5KY9za23nvsVCzS>^`o~yYoG;M1Gav2TR-|Ap@6C! literal 0 HcmV?d00001 diff --git a/BKPS/14031206/Experts/Examples/Math 3D/Functions.mqh b/BKPS/14031206/Experts/Examples/Math 3D/Functions.mqh new file mode 100644 index 0000000000000000000000000000000000000000..40aed1c5efbcc92dcb88e4d3b4e4da01eee84951 GIT binary patch literal 16008 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 literal 0 HcmV?d00001 diff --git a/BKPS/14031206/Experts/Examples/Math 3D/Math 3D.ico b/BKPS/14031206/Experts/Examples/Math 3D/Math 3D.ico new file mode 100644 index 0000000000000000000000000000000000000000..0d881c483aa3257a60ffa0cb79f5df28be796884 GIT binary patch literal 16958 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 literal 0 HcmV?d00001 diff --git a/BKPS/14031206/Experts/Examples/Math 3D/Math 3D.mq5 b/BKPS/14031206/Experts/Examples/Math 3D/Math 3D.mq5 new file mode 100644 index 0000000000000000000000000000000000000000..f95451d8f52512bd6eec2a7d448be9a17bb1594a GIT binary patch literal 6986 zcmd^DU2hXd6ur-t`X4q%NUne+qT&VQhc+Y?QbU3<5vc?^ti!D1gAQs0K`V8+!s z?&cWHmKq)79=(p&4QM@8YYp%}hs`pb@tqN__v$D1eiyQiG3Rq#+|8GJHQ+;iSo0C~ zn8@?<(LuBiJ>23gQ>+tUqgPB+UJugf2gEQ_T(jhT3HI@3&+NXlb=v zc^ShKN7(Iw$|qlrAp`mxcwXT-<1Y0V*DGCZ!JF4{{Zn}dYNa4El^65XQ=W2V#5l^p zRgP6gFcDKP8{23IOZA{lCa()VK%0B)7a7ZBTNaR0TsIBtnlp)+en77@-x^{xRQ*%` zU1cM%|8GViXVxhv(8I~d9{%aUWTh#;sP|Lb4?2qdj2<-9{JSl`DVNN}%qNV-BghzF zMiz6hU7aWBW5(wY&o*TZ9`^(}ohbM&|LMm^YPII_ZWl=RrGvY>xLyDO$9wV^m;-8) zYuIC(v5w5}>#5Y=vC9HGHz4D3Il=@H(9jbNDzzmU`Ao}L`e~I}^=>nxy%JA&ZJYhL|4b0p= z_k@_o)o}w^f!^>AQm5F{_T~E-vfn~$x>fc~)PYUd%JM}liJZ)VhwnFG)yKFxs3AL$ z{0N@04c1rR`&97I;8#`hp2{<5zXf@eSd<#%)hSLHf$aTa3o}9(uiqs#G|xWV;L3fNQ&!eRO};y z7=O&rpOJl$4uJ0Gug;R}uR#fYdOmFrd&Mu!|?`hq8 zUnAY}M0KVNj1{}D1+-xHnyN0G&7iUMoz%`(c*cn51I**xQnkqT=S8`% zkVV;3dgKt#09J8+h>7pUYlbUk)wx^kfLVV6pMj@+%gjb#`-q ziX(%k%mMUx16#3!EI%bOr?U^BJqL(JzQO*eALU~2KZ{Yo?+UEBYb$YjaiBIKX zhqZC-qG#&hYD2FsY6@%19%gN$11;o#9233BSsXg7NhxZ*dZ@eqrNZBv?0gV{oMKxxs(5$?ofHrajUVOC8dCcKm3F&sw+I;jy865`9d;I~Ax18axqHf)kGXpAWKiZdg7?I&mb)}>tR}W$Pu%s$jW*C?4V_x-P_XkGo5NG^ zG-LLFQQsPs9mnjH+9`7ZPq<4@X;7fi46Qr%*!@16t_G++VUtZp(pnZN(Vwwn4%dj4 zv?5zl*Wr=YF-PC&*mKA;_AEKYafl`(hhaCeTw>3_bLLj$m1IHVWyyjmQv1w%uO;@> zc6jm}bL=DZm(H(#zXW}UP{<3?VRBBq#6GSb93gTPvQPG zF2JC*HX}uaymE}M6VS;&diEG%>XxHCfvU-9jIFh|xV^^m>jZs;IkxA>d8KOmGLlNE zvPc72@?p$hwSZ*Daj{;Z9b&CZr~MQ;LfKnHl=pTl*T!1f z`8s1Eo>2_%L zT%<~Fh$oLom_t678ZJXL#2#Z8_scl`E~XY0?|_=r;d()I_0VkYaziu9pp^JgmR^6p zKh&}Pe%F`3#=UnH_d*?>wwXyLcPa*~?ApQWw;P#c>^K_wu!E>RCpmuUhQCm0}D2d)Dypz4xx; z2;ExT_uaN%tDdsdi^u1yvX5ET*R>sW8C^QlDBsk{A2aS!V}362uKS!nhfHUl33XFl z^bS9rS|+u?wu8UsAXAUuruP#zom3yb*Peq#y{pcXgIXZk2S=a08c^f)oum$4+Q&a* zt~y|OiC2_28UE2Zp&n7!qCV)$%>`ZKId@eERrYbs>P5Y(U)x3CX)W@q%@-?w?tb`h Xr9<~t%J^cc47%&O7kb1MzH|KmV{T=I literal 0 HcmV?d00001 diff --git a/BKPS/14031206/Experts/Examples/Math 3D/Sets/Chomolungma.set b/BKPS/14031206/Experts/Examples/Math 3D/Sets/Chomolungma.set new file mode 100644 index 0000000000000000000000000000000000000000..09a45991e367d211dec2055272376dd3072d9413 GIT binary patch literal 684 zcma))PfNp45X9#!_#JZdqSAVmo&-VAtJq_W&l+r#&?KVbXIFo-kJO5XO33>&yE{8O z$=Bz(3f(GcqfV6?)!Z9BvL5M13-x-^1^Y^+238|EuOp+NDuEO_)Pc<9{0g*yqar_X zDucJDwu0X=?=5_;Y{56Y>tM=CT-|_LOB)^6)VxRC5_F%k0+=$@XuM#t#9 zJ#_c0txNXI{@rhV-sfPRv8KlCGp6@995{dQcrLr%Z*K{=#)v)7=M-PCBrh?SIkToq km};gT|Am>RJJCD(O@iS>XR%Lo3NnpzM&>*D^MB=k117(F_5c6? literal 0 HcmV?d00001 diff --git a/BKPS/14031206/Experts/Examples/Math 3D/Sets/ClimberDream.set b/BKPS/14031206/Experts/Examples/Math 3D/Sets/ClimberDream.set new file mode 100644 index 0000000000000000000000000000000000000000..3536542206ad9fcc17dc6d2c2e5fab715cd2ebb9 GIT binary patch literal 696 zcmb7?K}*9>5QOI}_#blfqEZD<(vu(vdKG)D@mYg52~8?0{&w}7eI`~s6e)e#x4Sbt zJIUwAsR~^yX{An;8r9qz-E;2gN^|vk&>7Dsm0EK;llwY43Q&nmpSb0az+IpB4dW}koteN+@m+V+^J`!KT?n!?g{mnY~VU3>Y&1-ZF z&f7yzzZhMzXZG)Q^m&_udB+-z*{5vpceo~g=jXlbdOzM0ZVeTCp5qj6u%s`smpQYh lbC_zj9=?UCjyI||%$o$mfsVeTi4KWQB0J<}8<^R@Fkk1ee9`~_ literal 0 HcmV?d00001 diff --git a/BKPS/14031206/Experts/Examples/Math 3D/Sets/DoubleScrew.set b/BKPS/14031206/Experts/Examples/Math 3D/Sets/DoubleScrew.set new file mode 100644 index 0000000000000000000000000000000000000000..61c3cbc4d1a211fbca79f0e798b0cc108ee6b43c GIT binary patch literal 684 zcma))PfNp45X9#!_#JZdqEhi9NKb+w=vC~o#%B$+NoW#L@w2PH*+*){LnY+>ncbb8 zo#gBDT!n6xv{t7|jcV?V9$61`qq%xL>4N=Pr3O|bIjm-2!x%vI4GGD$V8|b3N#V>MmG+ zv^KD!ETVuqY=W~iLSdy2R%bZ!$ lB}_F_kN?6{XIs%b`b~o2NT;z+bPRG5=Zws@@@N0b{{|`%d;tIe literal 0 HcmV?d00001 diff --git a/BKPS/14031206/Experts/Examples/Math 3D/Sets/Granite.set b/BKPS/14031206/Experts/Examples/Math 3D/Sets/Granite.set new file mode 100644 index 0000000000000000000000000000000000000000..3356136f09f8e15efa34e38bf530803dbf8d1a99 GIT binary patch literal 684 zcma))PfNp45X9#!_#JZdqEghG^dty^Ud0}3eAZB#geDOcKfC&yeWX@AR6^dL+1=UM zNxnYMRp?epYjvvBsOH}2k@Y|~nyc57F4&({YG5^z^ExsLsuD<{eeKCy&aXfVI4bfJ zr!shZYAg61^WMVe$`*Xhy9%bP#MKR`wY1T3Ma_HEEkJiEE8u#i(roTA*MnZD?t=A4 zYeQ^^8LY{fR+gu*@(#?}dYBe^i%1I8%!k}dW~^A3oUdVbr@xN=W*z;oM)&mOH9AJ; z?V-D0ZCtWv_V0e<^DYPTj5Rf8pEA9_;lTNW$8*{BesfE>HAd`tKBxGCC3%Ut%$YS^ k!c;T$_%BR#x)r^n-y|50bQb$W#~>$h&d6*lfA+8ZZz&gi0ssI2 literal 0 HcmV?d00001 diff --git a/BKPS/14031206/Experts/Examples/Math 3D/Sets/Hedgehog.set b/BKPS/14031206/Experts/Examples/Math 3D/Sets/Hedgehog.set new file mode 100644 index 0000000000000000000000000000000000000000..c543a3fbd1081f7a7d24929c8f3f4ad96c0a86ff GIT binary patch literal 692 zcma))K}*9>5QOI}_#blfqEbOm(vu(vdKG)D@mYg52~8?0{&w}7eI`~sR7zj=?e5IZ zPV)J2szTRFTB%c|Mm6_F_ndpW(p_(_xCHYSxCPm5$_lt%K$^`n=DO1}=q^}) zv^Lb%v4b_a)5`J|R^E}bwjQR1UZavCYvz6KB|BD}kHnX-d(vM=f3psLSfgip^BNt4 z^Y+lwFGiQ_nf<#Rect9^-mwN__9@%@9j=Mr`FSt9-jBD0TSLX3=Qzb1Ea^+^WzMYW l9HyGBhi_r3MVB}TVIt)+{OD=_bYTN2%+tbpqkq}kkKp?kf6?t}G5 zYfEm78LY{bR+gu*@}8Kr4KOYB7MT=LGaquVn6YMk;(P_WJN9?xahhs`bF)|9d5`JCblR@5ctGH2Fw l0aL@&)4wp&=~niZeq}Hm=_K}2$3#l1%$sBLEyVnvh;I&Wd|m(m literal 0 HcmV?d00001 diff --git a/BKPS/14031206/Experts/Examples/Math 3D/Sets/Josephine.set b/BKPS/14031206/Experts/Examples/Math 3D/Sets/Josephine.set new file mode 100644 index 0000000000000000000000000000000000000000..8d82f2c93b358d470bbb34c2249e8beeb652b601 GIT binary patch literal 688 zcma))K}*9>5QOI}_#blfqM#nUNKb+w=vC~o#%B%MBs7Vr_}kTQ_K~#Wp;G#?Z+B;Q zc9QR}a}~N((psG=HLAHcdgMINjTY+lqzj%eDm8FAllwY43Q&nmp?&SiT<)*P7I0Mb zC!#WVd$1M!uKC%*XJku$&3_e4S&7jNS!-!y;tI@1;Fe@}DJ$T518FwTSm;5opu1q* zXlg|GH2Fw j2~*A1tR~xEg~sUGaqsA*XS6X zw}J{Mo?B{G=PGooq_sL#YE*M?^vHUk8_m`0Nf+$TDmAbg$$1?a1yu>8(7yI$F6URE1soOm ziBlQ8J+&45j(Kn4b7c#@=3NC-R^sXg)LPo;xT5Ag>K358lofEjQfW5#nCn3=RCmGp zqqQM6#0=KtOe@P%Sa}C#Z9Pm2y+tGiYUV@kB{Np6OU~D@yVGAsf3uE$SfhJ-@){kZ z^Y+l)uQo2(Gy8YH@p+endB&O=vrn1c-*Djk!Q;8?dcV0P+!`bHJfBm1!IHehT;|N0 lE@7&fdi)orI@^lg(QgtAM>>stqGOPgIA>(Gl|TDe{x>PFd;kCd literal 0 HcmV?d00001 diff --git a/BKPS/14031206/Experts/Examples/Math 3D/Sets/Sink.set b/BKPS/14031206/Experts/Examples/Math 3D/Sets/Sink.set new file mode 100644 index 0000000000000000000000000000000000000000..4da1d77a9126b447ca5d524190c4a4ce72c4591b GIT binary patch literal 686 zcma))PfNp45X9#!_#JZdqSE3~dJ+UduVRliK5MW|N|T6+pI!aUJ`yV)Dk1OB?C$LB zBwwHBDs-!)ty)!TRC90i$aRFBCyq1iDssvK#PzN%X^DEE-j*9%m zsSMtZ+6sQhyl>!h1X2rP=CbucaU7LgRFnUA@b%viBLbH0Y%o&Gxdn|1KR8r{>A*XS6W zw}QpHqCnlDx!R=FFNd lVXB#W_!nlHYO)i*qvIqvPIMOgM5iFrIA>(OlRy7g{x=hhd@29{ literal 0 HcmV?d00001 diff --git a/BKPS/14031206/Experts/Examples/Math 3D/Sets/Skin.set b/BKPS/14031206/Experts/Examples/Math 3D/Sets/Skin.set new file mode 100644 index 0000000000000000000000000000000000000000..4d2bf73aa7a781c4a88d52b4f57437665b072360 GIT binary patch literal 686 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 y>p1JrL@h5E3|+??3(#k#Bi5pE!M}}rMEX?q + +input double MaximumRisk = 0.02; // Maximum Risk in percentage +input double DecreaseFactor = 3; // Descrease factor +input int MovingPeriod = 12; // Moving Average period +input int MovingShift = 6; // Moving Average shift +//--- +int ExtHandle=0; +bool ExtHedging=false; +CTrade ExtTrade; + +#define MA_MAGIC 1234501 +//+------------------------------------------------------------------+ +//| Calculate optimal lot size | +//+------------------------------------------------------------------+ +double TradeSizeOptimized(void) + { + double price=0.0; + double margin=0.0; +//--- select lot size + if(!SymbolInfoDouble(_Symbol,SYMBOL_ASK,price)) + return(0.0); + if(!OrderCalcMargin(ORDER_TYPE_BUY,_Symbol,1.0,price,margin)) + return(0.0); + if(margin<=0.0) + return(0.0); + + double lot=NormalizeDouble(AccountInfoDouble(ACCOUNT_MARGIN_FREE)*MaximumRisk/margin,2); +//--- calculate number of losses orders without a break + if(DecreaseFactor>0) + { + //--- select history for access + HistorySelect(0,TimeCurrent()); + //--- + int orders=HistoryDealsTotal(); // total history deals + int losses=0; // number of losses orders without a break + + for(int i=orders-1;i>=0;i--) + { + ulong ticket=HistoryDealGetTicket(i); + if(ticket==0) + { + Print("HistoryDealGetTicket failed, no trade history"); + break; + } + //--- check symbol + if(HistoryDealGetString(ticket,DEAL_SYMBOL)!=_Symbol) + continue; + //--- check Expert Magic number + if(HistoryDealGetInteger(ticket,DEAL_MAGIC)!=MA_MAGIC) + continue; + //--- check profit + double profit=HistoryDealGetDouble(ticket,DEAL_PROFIT); + if(profit>0.0) + break; + if(profit<0.0) + losses++; + } + //--- + if(losses>1) + lot=NormalizeDouble(lot-lot*losses/DecreaseFactor,1); + } +//--- normalize and check limits + double stepvol=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP); + lot=stepvol*NormalizeDouble(lot/stepvol,0); + + double minvol=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN); + if(lotmaxvol) + lot=maxvol; +//--- return trading volume + return(lot); + } +//+------------------------------------------------------------------+ +//| Check for open position conditions | +//+------------------------------------------------------------------+ +void CheckForOpen(void) + { + MqlRates rt[2]; +//--- go trading only for first ticks of new bar + if(CopyRates(_Symbol,_Period,0,2,rt)!=2) + { + Print("CopyRates of ",_Symbol," failed, no history"); + return; + } + if(rt[1].tick_volume>1) + return; +//--- get current Moving Average + double ma[1]; + if(CopyBuffer(ExtHandle,0,0,1,ma)!=1) + { + Print("CopyBuffer from iMA failed, no data"); + return; + } +//--- check signals + ENUM_ORDER_TYPE signal=WRONG_VALUE; + + if(rt[0].open>ma[0] && rt[0].closema[0]) + signal=ORDER_TYPE_BUY; // buy conditions + } +//--- additional checking + if(signal!=WRONG_VALUE) + { + if(TerminalInfoInteger(TERMINAL_TRADE_ALLOWED) && Bars(_Symbol,_Period)>100) + ExtTrade.PositionOpen(_Symbol,signal,TradeSizeOptimized(), + SymbolInfoDouble(_Symbol,signal==ORDER_TYPE_SELL ? SYMBOL_BID:SYMBOL_ASK), + 0,0); + } +//--- + } +//+------------------------------------------------------------------+ +//| Check for close position conditions | +//+------------------------------------------------------------------+ +void CheckForClose(void) + { + MqlRates rt[2]; +//--- go trading only for first ticks of new bar + if(CopyRates(_Symbol,_Period,0,2,rt)!=2) + { + Print("CopyRates of ",_Symbol," failed, no history"); + return; + } + if(rt[1].tick_volume>1) + return; +//--- get current Moving Average + double ma[1]; + if(CopyBuffer(ExtHandle,0,0,1,ma)!=1) + { + Print("CopyBuffer from iMA failed, no data"); + return; + } +//--- positions already selected before + bool signal=false; + long type=PositionGetInteger(POSITION_TYPE); + + if(type==(long)POSITION_TYPE_BUY && rt[0].open>ma[0] && rt[0].closema[0]) + signal=true; +//--- additional checking + if(signal) + { + if(TerminalInfoInteger(TERMINAL_TRADE_ALLOWED) && Bars(_Symbol,_Period)>100) + ExtTrade.PositionClose(_Symbol,3); + } +//--- + } +//+------------------------------------------------------------------+ +//| Position select depending on netting or hedging | +//+------------------------------------------------------------------+ +bool SelectPosition() + { + bool res=false; +//--- check position in Hedging mode + if(ExtHedging) + { + uint total=PositionsTotal(); + for(uint i=0; ifQlg-|3RVwvVr8?bD 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 +#include + +#define SIGNAL_BUY 1 // Buy signal +#define SIGNAL_NOT 0 // no trading signal +#define SIGNAL_SELL -1 // Sell signal + +#define CLOSE_LONG 2 // signal to close Long +#define CLOSE_SHORT -2 // signal to close Short + +//--- Input parameters +input int InpAverBodyPeriod=12; // period for calculating average candlestick size +input int InpPeriodCCI =37; // CCI period +input ENUM_APPLIED_PRICE InpPrice=PRICE_CLOSE; // price type + +//--- trade parameters +input uint InpDuration=10; // position holding time in bars +input uint InpSL =200; // Stop Loss in points +input uint InpTP =200; // Take Profit in points +input uint InpSlippage=10; // slippage in points +//--- money management parameters +input double InpLot =0.1; // lot +//--- Expert ID +input long InpMagicNumber=120100; // Magic Number + +//--- global variables +int ExtAvgBodyPeriod; // average candlestick calculation period +int ExtSignalOpen =0; // Buy/Sell signal +int ExtSignalClose =0; // signal to close a position +string ExtPatternInfo =""; // current pattern information +string ExtDirection =""; // position opening direction +bool ExtPatternDetected=false; // pattern detected +bool ExtConfirmed =false; // pattern confirmed +bool ExtCloseByTime =true; // requires closing by time +bool ExtCheckPassed =true; // status checking error + +//--- indicator handle +int ExtIndicatorHandle=INVALID_HANDLE; + +//--- service objects +CTrade ExtTrade; +CSymbolInfo ExtSymbolInfo; +//+------------------------------------------------------------------+ +//| Expert initialization function | +//+------------------------------------------------------------------+ +int OnInit() + { + Print("InpSL=", InpSL); + Print("InpTP=", InpTP); +//--- set parameters for trading operations + ExtTrade.SetDeviationInPoints(InpSlippage); // slippage + ExtTrade.SetExpertMagicNumber(InpMagicNumber); // Expert Advisor ID + ExtTrade.LogLevel(LOG_LEVEL_ERRORS); // logging level + + ExtAvgBodyPeriod=InpAverBodyPeriod; +//--- indicator initialization + ExtIndicatorHandle=iCCI(_Symbol, _Period, InpPeriodCCI, InpPrice); + if(ExtIndicatorHandle==INVALID_HANDLE) + { + Print("Error creating CCI indicator"); + return(INIT_FAILED); + } +//--- OK + return(INIT_SUCCEEDED); + } +//+------------------------------------------------------------------+ +//| Expert deinitialization function | +//+------------------------------------------------------------------+ +void OnDeinit(const int reason) + { +//--- release indicator handle + IndicatorRelease(ExtIndicatorHandle); + } +//+------------------------------------------------------------------+ +//| Expert tick function | +//+------------------------------------------------------------------+ +void OnTick() + { +//--- save the next bar start time; all checks at bar opening only + static datetime next_bar_open=0; + +//--- Phase 1 - check the emergence of a new bar and update the status + if(TimeCurrent()>=next_bar_open) + { + //--- get the current state of environment on the new bar + // namely, set the values of global variables: + // ExtPatternDetected - pattern detection + // ExtConfirmed - pattern confirmation + // ExtSignalOpen - signal to open + // ExtSignalClose - signal to close + // ExtPatternInfo - current pattern information + if(CheckState()) + { + //--- set the new bar opening time + next_bar_open=TimeCurrent(); + next_bar_open-=next_bar_open%PeriodSeconds(_Period); + next_bar_open+=PeriodSeconds(_Period); + + //--- report the emergence of a new bar only once within a bar + if(ExtPatternDetected && ExtConfirmed) + Print(ExtPatternInfo); + } + else + { + //--- error getting the status, retry on the next tick + return; + } + } + +//--- Phase 2 - if there is a signal and no position in this direction + if(ExtSignalOpen && !PositionExist(ExtSignalOpen)) + { + Print("\r\nSignal to open position ", ExtDirection); + PositionOpen(); + if(PositionExist(ExtSignalOpen)) + ExtSignalOpen=SIGNAL_NOT; + } + +//--- Phase 3 - close if there is a signal to close + if(ExtSignalClose && PositionExist(ExtSignalClose)) + { + Print("\r\nSignal to close position ", ExtDirection); + CloseBySignal(ExtSignalClose); + if(!PositionExist(ExtSignalClose)) + ExtSignalClose=SIGNAL_NOT; + } + +//--- Phase 4 - close upon expiration + if(ExtCloseByTime && PositionExpiredByTimeExist()) + { + CloseByTime(); + ExtCloseByTime=PositionExpiredByTimeExist(); + } + } +//+------------------------------------------------------------------+ +//| Get the current environment and check for a pattern | +//+------------------------------------------------------------------+ +bool CheckState() + { +//--- check if there is a pattern + if(!CheckPattern()) + { + Print("Error, failed to check pattern"); + return(false); + } + +//--- check for confirmation + if(!CheckConfirmation()) + { + Print("Error, failed to check pattern confirmation"); + return(false); + } +//--- if there is no confirmation, cancel the signal + if(!ExtConfirmed) + ExtSignalOpen=SIGNAL_NOT; + +//--- check if there is a signal to close a position + if(!CheckCloseSignal()) + { + Print("Error, failed to check the closing signal"); + return(false); + } + +//--- if positions are to be closed after certain holding time in bars + if(InpDuration) + ExtCloseByTime=true; // set flag to close upon expiration + +//--- all checks done + return(true); + } +//+------------------------------------------------------------------+ +//| Open a position in the direction of the signal | +//+------------------------------------------------------------------+ +bool PositionOpen() + { + ExtSymbolInfo.Refresh(); + ExtSymbolInfo.RefreshRates(); + + double price=0; +//--- Stop Loss and Take Profit are not set by default + double stoploss=0.0; + double takeprofit=0.0; + + int digits=ExtSymbolInfo.Digits(); + double point=ExtSymbolInfo.Point(); + double spread=ExtSymbolInfo.Ask()-ExtSymbolInfo.Bid(); + +//--- uptrend + if(ExtSignalOpen==SIGNAL_BUY) + { + price=NormalizeDouble(ExtSymbolInfo.Ask(), digits); + //--- if Stop Loss is set + if(InpSL>0) + { + if(spread>=InpSL*point) + { + PrintFormat("StopLoss (%d points) <= current spread = %.0f points. Spread value will be used", InpSL, spread/point); + stoploss = NormalizeDouble(price-spread, digits); + } + else + stoploss = NormalizeDouble(price-InpSL*point, digits); + } + //--- if Take Profit is set + if(InpTP>0) + { + if(spread>=InpTP*point) + { + PrintFormat("TakeProfit (%d points) < current spread = %.0f points. Spread value will be used", InpTP, spread/point); + takeprofit = NormalizeDouble(price+spread, digits); + } + else + takeprofit = NormalizeDouble(price+InpTP*point, digits); + } + + if(!ExtTrade.Buy(InpLot, Symbol(), price, stoploss, takeprofit)) + { + PrintFormat("Failed %s buy %G at %G (sl=%G tp=%G) failed. Ask=%G error=%d", + Symbol(), InpLot, price, stoploss, takeprofit, ExtSymbolInfo.Ask(), GetLastError()); + return(false); + } + } + +//--- downtrend + if(ExtSignalOpen==SIGNAL_SELL) + { + price=NormalizeDouble(ExtSymbolInfo.Bid(), digits); + //--- if Stop Loss is set + if(InpSL>0) + { + if(spread>=InpSL*point) + { + PrintFormat("StopLoss (%d points) <= current spread = %.0f points. Spread value will be used", InpSL, spread/point); + stoploss = NormalizeDouble(price+spread, digits); + } + else + stoploss = NormalizeDouble(price+InpSL*point, digits); + } + //--- if Take Profit is set + if(InpTP>0) + { + if(spread>=InpTP*point) + { + PrintFormat("TakeProfit (%d points) < current spread = %.0f points. Spread value will be used", InpTP, spread/point); + takeprofit = NormalizeDouble(price-spread, digits); + } + else + takeprofit = NormalizeDouble(price-InpTP*point, digits); + } + + if(!ExtTrade.Sell(InpLot, Symbol(), price, stoploss, takeprofit)) + { + PrintFormat("Failed %s sell at %G (sl=%G tp=%G) failed. Bid=%G error=%d", + Symbol(), price, stoploss, takeprofit, ExtSymbolInfo.Bid(), GetLastError()); + ExtTrade.PrintResult(); + Print(" "); + return(false); + } + } + + return(true); + } +//+------------------------------------------------------------------+ +//| Close a position based on the specified signal | +//+------------------------------------------------------------------+ +void CloseBySignal(int type_close) + { +//--- if there is no signal to close, return successful completion + if(type_close==SIGNAL_NOT) + return; +//--- if there are no positions opened by our EA + if(PositionExist(ExtSignalClose)==0) + return; + +//--- closing direction + long type; + switch(type_close) + { + case CLOSE_SHORT: + type=POSITION_TYPE_SELL; + break; + case CLOSE_LONG: + type=POSITION_TYPE_BUY; + break; + default: + Print("Error! Signal to close not detected"); + return; + } + +//--- check all positions and close ours based on the signal + int positions=PositionsTotal(); + for(int i=positions-1; i>=0; i--) + { + ulong ticket=PositionGetTicket(i); + if(ticket!=0) + { + //--- get the name of the symbol and the position id (magic) + string symbol=PositionGetString(POSITION_SYMBOL); + long magic =PositionGetInteger(POSITION_MAGIC); + //--- if they correspond to our values + if(symbol==Symbol() && magic==InpMagicNumber) + { + if(PositionGetInteger(POSITION_TYPE)==type) + { + ExtTrade.PositionClose(ticket, InpSlippage); + ExtTrade.PrintResult(); + Print(" "); + } + } + } + } + } +//+------------------------------------------------------------------+ +//| Close positions upon holding time expiration in bars | +//+------------------------------------------------------------------+ +void CloseByTime() + { +//--- if there are no positions opened by our EA + if(PositionExist(ExtSignalOpen)==0) + return; + +//--- check all positions and close ours based on the holding time in bars + int positions=PositionsTotal(); + for(int i=positions-1; i>=0; i--) + { + ulong ticket=PositionGetTicket(i); + if(ticket!=0) + { + //--- get the name of the symbol and the position id (magic) + string symbol=PositionGetString(POSITION_SYMBOL); + long magic =PositionGetInteger(POSITION_MAGIC); + //--- if they correspond to our values + if(symbol==Symbol() && magic==InpMagicNumber) + { + //--- position opening time + datetime open_time=(datetime)PositionGetInteger(POSITION_TIME); + //--- check position holding time in bars + if(BarsHold(open_time)>=(int)InpDuration) + { + Print("\r\nTime to close position #", ticket); + ExtTrade.PositionClose(ticket, InpSlippage); + ExtTrade.PrintResult(); + Print(" "); + } + } + } + } + } +//+------------------------------------------------------------------+ +//| Returns true if there are open positions | +//+------------------------------------------------------------------+ +bool PositionExist(int signal_direction) + { + bool check_type=(signal_direction!=SIGNAL_NOT); + +//--- what positions to search + ENUM_POSITION_TYPE search_type=WRONG_VALUE; + if(check_type) + switch(signal_direction) + { + case SIGNAL_BUY: + search_type=POSITION_TYPE_BUY; + break; + case SIGNAL_SELL: + search_type=POSITION_TYPE_SELL; + break; + case CLOSE_LONG: + search_type=POSITION_TYPE_BUY; + break; + case CLOSE_SHORT: + search_type=POSITION_TYPE_SELL; + break; + default: + //--- entry direction is not specified; nothing to search + return(false); + } + +//--- go through the list of all positions + int positions=PositionsTotal(); + for(int i=0; i=(int)InpDuration)) + return(true); + } + } + } + +//--- open position not found + return(false); + } +//+------------------------------------------------------------------+ +//| Checks position closing time in bars | +//+------------------------------------------------------------------+ +int BarsHold(datetime open_time) + { +//--- first run a basic simple check + if(TimeCurrent()-open_timeAvgBody(1)) && // long black + (Open(2)-Close(2)>AvgBody(1)) && + (Open(1)-Close(1)>AvgBody(1)) && + (MidPoint(2)AvgBody(1)) && // long white + (Close(2)-Open(2)>AvgBody(1)) && + (Close(1)-Open(1)>AvgBody(1)) && + (MidPoint(2)>MidPoint(3)) && // higher midpoints + (MidPoint(1)>MidPoint(2))) + { + ExtPatternDetected=true; + ExtSignalOpen=SIGNAL_BUY; + ExtPatternInfo="\r\n3 White Soldiers detected"; + ExtDirection="Buy"; + return(true); + } + +//--- result of checking + return(ExtCheckPassed); + } +//+------------------------------------------------------------------+ +//| Returns true in case of successful confirmation check | +//+------------------------------------------------------------------+ +bool CheckConfirmation() + { + ExtConfirmed=false; +//--- if there is no pattern, do not search for confirmation + if(!ExtPatternDetected) + return(true); + +//--- get the value of the stochastic indicator to confirm the signal + double signal=CCI(1); + if(signal==EMPTY_VALUE) + { + //--- failed to get indicator value, check failed + return(false); + } + +//--- check the Buy signal + if(ExtSignalOpen==SIGNAL_BUY && (signal<-50)) + { + ExtConfirmed=true; + ExtPatternInfo+="\r\n Confirmed: CCI<-50"; + } + +//--- check the Sell signal + if(ExtSignalOpen==SIGNAL_SELL && (signal>50)) + { + ExtConfirmed=true; + ExtPatternInfo+="\r\n Confirmed: CCI>50"; + } + +//--- successful completion of the check + return(true); + } +//+------------------------------------------------------------------+ +//| Check if there is a signal to close | +//+------------------------------------------------------------------+ +bool CheckCloseSignal() + { + ExtSignalClose=false; +//--- if there is a signal to enter the market, do not check the signal to close + if(ExtSignalOpen!=SIGNAL_NOT) + return(true); + +//--- check if there is a signal to close a long position + if(((CCI(1)<80) && (CCI(2)>80)) || ((CCI(1)<-80) && (CCI(2)>-80))) + { + //--- there is a signal to close a long position + ExtSignalClose=CLOSE_LONG; + ExtDirection="Long"; + } + +//--- check if there is a signal to close a short position + if(((CCI(1)>-80) && (CCI(2)<-80)) || ((CCI(1)>80) && (CCI(2)<80))) + { + //--- there is a signal to close a short position + ExtSignalClose=CLOSE_SHORT; + ExtDirection="Short"; + } + +//--- successful completion of the check + return(true); + } +//+------------------------------------------------------------------+ +//| CCI indicator value at the specified bar | +//+------------------------------------------------------------------+ +double CCI(int index) + { + double indicator_values[]; + if(CopyBuffer(ExtIndicatorHandle, 0, index, 1, indicator_values)<0) + { + //--- if the copying fails, report the error code + PrintFormat("Failed to copy data from the CCI indicator, error code %d", GetLastError()); + return(EMPTY_VALUE); + } + return(indicator_values[0]); + } +//+------------------------------------------------------------------+ diff --git a/BKPS/14031206/Experts/Free Robots/BlackCrows WhiteSoldiers MFI.ex5 b/BKPS/14031206/Experts/Free Robots/BlackCrows WhiteSoldiers MFI.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..b5ee6a5782b01739a749505ec71eac55f7b24d49 GIT binary patch literal 42308 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 literal 0 HcmV?d00001 diff --git a/BKPS/14031206/Experts/Free Robots/BlackCrows WhiteSoldiers MFI.mq5 b/BKPS/14031206/Experts/Free Robots/BlackCrows WhiteSoldiers MFI.mq5 new file mode 100644 index 0000000..e9bb791 --- /dev/null +++ b/BKPS/14031206/Experts/Free Robots/BlackCrows WhiteSoldiers MFI.mq5 @@ -0,0 +1,657 @@ +//+------------------------------------------------------------------+ +//| BlackCrows WhiteSoldiers MFI.mq5 | +//| Copyright 2024, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2024, MetaQuotes Ltd." +#property link "https://www.mql5.com" +#property version "1.00" + +#include +#include + +#define SIGNAL_BUY 1 // Buy signal +#define SIGNAL_NOT 0 // no trading signal +#define SIGNAL_SELL -1 // Sell signal + +#define CLOSE_LONG 2 // signal to close Long +#define CLOSE_SHORT -2 // signal to close Short + +//--- Input parameters +input int InpAverBodyPeriod=12; // period for calculating average candlestick size +input int InpPeriodMFI =37; // MFI period +input ENUM_APPLIED_VOLUME InpVolume=VOLUME_TICK; // volume type + +//--- trade parameters +input uint InpDuration=10; // position holding time in bars +input uint InpSL =200; // Stop Loss in points +input uint InpTP =200; // Take Profit in points +input uint InpSlippage=10; // slippage in points +//--- money management parameters +input double InpLot =0.1; // lot +//--- Expert ID +input long InpMagicNumber=120200; // Magic Number + +//--- global variables +int ExtAvgBodyPeriod; // average candlestick calculation period +int ExtSignalOpen =0; // Buy/Sell signal +int ExtSignalClose =0; // signal to close a position +string ExtPatternInfo =""; // current pattern information +string ExtDirection =""; // position opening direction +bool ExtPatternDetected=false; // pattern detected +bool ExtConfirmed =false; // pattern confirmed +bool ExtCloseByTime =true; // requires closing by time +bool ExtCheckPassed =true; // status checking error + +//--- indicator handle +int ExtIndicatorHandle=INVALID_HANDLE; + +//--- service objects +CTrade ExtTrade; +CSymbolInfo ExtSymbolInfo; +//+------------------------------------------------------------------+ +//| Expert initialization function | +//+------------------------------------------------------------------+ +int OnInit() + { + Print("InpSL=", InpSL); + Print("InpTP=", InpTP); +//--- set parameters for trading operations + ExtTrade.SetDeviationInPoints(InpSlippage); // slippage + ExtTrade.SetExpertMagicNumber(InpMagicNumber); // Expert Advisor ID + ExtTrade.LogLevel(LOG_LEVEL_ERRORS); // logging level + + ExtAvgBodyPeriod=InpAverBodyPeriod; +//--- indicator initialization + ExtIndicatorHandle=iMFI(_Symbol, _Period, InpPeriodMFI, InpVolume); + if(ExtIndicatorHandle==INVALID_HANDLE) + { + Print("Error creating MFI indicator"); + return(INIT_FAILED); + } +//--- OK + return(INIT_SUCCEEDED); + } +//+------------------------------------------------------------------+ +//| Expert deinitialization function | +//+------------------------------------------------------------------+ +void OnDeinit(const int reason) + { +//--- release indicator handle + IndicatorRelease(ExtIndicatorHandle); + } +//+------------------------------------------------------------------+ +//| Expert tick function | +//+------------------------------------------------------------------+ +void OnTick() + { +//--- save the next bar start time; all checks at bar opening only + static datetime next_bar_open=0; + +//--- Phase 1 - check the emergence of a new bar and update the status + if(TimeCurrent()>=next_bar_open) + { + //--- get the current state of environment on the new bar + // namely, set the values of global variables: + // ExtPatternDetected - pattern detection + // ExtConfirmed - pattern confirmation + // ExtSignalOpen - signal to open + // ExtSignalClose - signal to close + // ExtPatternInfo - current pattern information + if(CheckState()) + { + //--- set the new bar opening time + next_bar_open=TimeCurrent(); + next_bar_open-=next_bar_open%PeriodSeconds(_Period); + next_bar_open+=PeriodSeconds(_Period); + + //--- report the emergence of a new bar only once within a bar + if(ExtPatternDetected && ExtConfirmed) + Print(ExtPatternInfo); + } + else + { + //--- error getting the status, retry on the next tick + return; + } + } + +//--- Phase 2 - if there is a signal and no position in this direction + if(ExtSignalOpen && !PositionExist(ExtSignalOpen)) + { + Print("\r\nSignal to open position ", ExtDirection); + PositionOpen(); + if(PositionExist(ExtSignalOpen)) + ExtSignalOpen=SIGNAL_NOT; + } + +//--- Phase 3 - close if there is a signal to close + if(ExtSignalClose && PositionExist(ExtSignalClose)) + { + Print("\r\nSignal to close position ", ExtDirection); + CloseBySignal(ExtSignalClose); + if(!PositionExist(ExtSignalClose)) + ExtSignalClose=SIGNAL_NOT; + } + +//--- Phase 4 - close upon expiration + if(ExtCloseByTime && PositionExpiredByTimeExist()) + { + CloseByTime(); + ExtCloseByTime=PositionExpiredByTimeExist(); + } + } +//+------------------------------------------------------------------+ +//| Get the current environment and check for a pattern | +//+------------------------------------------------------------------+ +bool CheckState() + { +//--- check if there is a pattern + if(!CheckPattern()) + { + Print("Error, failed to check pattern"); + return(false); + } + +//--- check for confirmation + if(!CheckConfirmation()) + { + Print("Error, failed to check pattern confirmation"); + return(false); + } +//--- if there is no confirmation, cancel the signal + if(!ExtConfirmed) + ExtSignalOpen=SIGNAL_NOT; + +//--- check if there is a signal to close a position + if(!CheckCloseSignal()) + { + Print("Error, failed to check the closing signal"); + return(false); + } + +//--- if positions are to be closed after certain holding time in bars + if(InpDuration) + ExtCloseByTime=true; // set flag to close upon expiration + +//--- all checks done + return(true); + } +//+------------------------------------------------------------------+ +//| Open a position in the direction of the signal | +//+------------------------------------------------------------------+ +bool PositionOpen() + { + ExtSymbolInfo.Refresh(); + ExtSymbolInfo.RefreshRates(); + + double price=0; +//--- Stop Loss and Take Profit are not set by default + double stoploss=0.0; + double takeprofit=0.0; + + int digits=ExtSymbolInfo.Digits(); + double point=ExtSymbolInfo.Point(); + double spread=ExtSymbolInfo.Ask()-ExtSymbolInfo.Bid(); + +//--- uptrend + if(ExtSignalOpen==SIGNAL_BUY) + { + price=NormalizeDouble(ExtSymbolInfo.Ask(), digits); + //--- if Stop Loss is set + if(InpSL>0) + { + if(spread>=InpSL*point) + { + PrintFormat("StopLoss (%d points) <= current spread = %.0f points. Spread value will be used", InpSL, spread/point); + stoploss = NormalizeDouble(price-spread, digits); + } + else + stoploss = NormalizeDouble(price-InpSL*point, digits); + } + //--- if Take Profit is set + if(InpTP>0) + { + if(spread>=InpTP*point) + { + PrintFormat("TakeProfit (%d points) < current spread = %.0f points. Spread value will be used", InpTP, spread/point); + takeprofit = NormalizeDouble(price+spread, digits); + } + else + takeprofit = NormalizeDouble(price+InpTP*point, digits); + } + + if(!ExtTrade.Buy(InpLot, Symbol(), price, stoploss, takeprofit)) + { + PrintFormat("Failed %s buy %G at %G (sl=%G tp=%G) failed. Ask=%G error=%d", + Symbol(), InpLot, price, stoploss, takeprofit, ExtSymbolInfo.Ask(), GetLastError()); + return(false); + } + } + +//--- downtrend + if(ExtSignalOpen==SIGNAL_SELL) + { + price=NormalizeDouble(ExtSymbolInfo.Bid(), digits); + //--- if Stop Loss is set + if(InpSL>0) + { + if(spread>=InpSL*point) + { + PrintFormat("StopLoss (%d points) <= current spread = %.0f points. Spread value will be used", InpSL, spread/point); + stoploss = NormalizeDouble(price+spread, digits); + } + else + stoploss = NormalizeDouble(price+InpSL*point, digits); + } + //--- if Take Profit is set + if(InpTP>0) + { + if(spread>=InpTP*point) + { + PrintFormat("TakeProfit (%d points) < current spread = %.0f points. Spread value will be used", InpTP, spread/point); + takeprofit = NormalizeDouble(price-spread, digits); + } + else + takeprofit = NormalizeDouble(price-InpTP*point, digits); + } + + if(!ExtTrade.Sell(InpLot, Symbol(), price, stoploss, takeprofit)) + { + PrintFormat("Failed %s sell at %G (sl=%G tp=%G) failed. Bid=%G error=%d", + Symbol(), price, stoploss, takeprofit, ExtSymbolInfo.Bid(), GetLastError()); + ExtTrade.PrintResult(); + Print(" "); + return(false); + } + } + + return(true); + } +//+------------------------------------------------------------------+ +//| Close a position based on the specified signal | +//+------------------------------------------------------------------+ +void CloseBySignal(int type_close) + { +//--- if there is no signal to close, return successful completion + if(type_close==SIGNAL_NOT) + return; +//--- if there are no positions opened by our EA + if(PositionExist(ExtSignalClose)==0) + return; + +//--- closing direction + long type; + switch(type_close) + { + case CLOSE_SHORT: + type=POSITION_TYPE_SELL; + break; + case CLOSE_LONG: + type=POSITION_TYPE_BUY; + break; + default: + Print("Error! Signal to close not detected"); + return; + } + +//--- check all positions and close ours based on the signal + int positions=PositionsTotal(); + for(int i=positions-1; i>=0; i--) + { + ulong ticket=PositionGetTicket(i); + if(ticket!=0) + { + //--- get the name of the symbol and the position id (magic) + string symbol=PositionGetString(POSITION_SYMBOL); + long magic =PositionGetInteger(POSITION_MAGIC); + //--- if they correspond to our values + if(symbol==Symbol() && magic==InpMagicNumber) + { + if(PositionGetInteger(POSITION_TYPE)==type) + { + ExtTrade.PositionClose(ticket, InpSlippage); + ExtTrade.PrintResult(); + Print(" "); + } + } + } + } + } +//+------------------------------------------------------------------+ +//| Close positions upon holding time expiration in bars | +//+------------------------------------------------------------------+ +void CloseByTime() + { +//--- if there are no positions opened by our EA + if(PositionExist(ExtSignalOpen)==0) + return; + +//--- check all positions and close ours based on the holding time in bars + int positions=PositionsTotal(); + for(int i=positions-1; i>=0; i--) + { + ulong ticket=PositionGetTicket(i); + if(ticket!=0) + { + //--- get the name of the symbol and the position id (magic) + string symbol=PositionGetString(POSITION_SYMBOL); + long magic =PositionGetInteger(POSITION_MAGIC); + //--- if they correspond to our values + if(symbol==Symbol() && magic==InpMagicNumber) + { + //--- position opening time + datetime open_time=(datetime)PositionGetInteger(POSITION_TIME); + //--- check position holding time in bars + if(BarsHold(open_time)>=(int)InpDuration) + { + Print("\r\nTime to close position #", ticket); + ExtTrade.PositionClose(ticket, InpSlippage); + ExtTrade.PrintResult(); + Print(" "); + } + } + } + } + } +//+------------------------------------------------------------------+ +//| Returns true if there are open positions | +//+------------------------------------------------------------------+ +bool PositionExist(int signal_direction) + { + bool check_type=(signal_direction!=SIGNAL_NOT); + +//--- what positions to search + ENUM_POSITION_TYPE search_type=WRONG_VALUE; + if(check_type) + switch(signal_direction) + { + case SIGNAL_BUY: + search_type=POSITION_TYPE_BUY; + break; + case SIGNAL_SELL: + search_type=POSITION_TYPE_SELL; + break; + case CLOSE_LONG: + search_type=POSITION_TYPE_BUY; + break; + case CLOSE_SHORT: + search_type=POSITION_TYPE_SELL; + break; + default: + //--- entry direction is not specified; nothing to search + return(false); + } + +//--- go through the list of all positions + int positions=PositionsTotal(); + for(int i=0; i=(int)InpDuration)) + return(true); + } + } + } + +//--- open position not found + return(false); + } +//+------------------------------------------------------------------+ +//| Checks position closing time in bars | +//+------------------------------------------------------------------+ +int BarsHold(datetime open_time) + { +//--- first run a basic simple check + if(TimeCurrent()-open_timeAvgBody(1)) && // long black + (Open(2)-Close(2)>AvgBody(1)) && + (Open(1)-Close(1)>AvgBody(1)) && + (MidPoint(2)AvgBody(1)) && // long white + (Close(2)-Open(2)>AvgBody(1)) && + (Close(1)-Open(1)>AvgBody(1)) && + (MidPoint(2)>MidPoint(3)) && // higher midpoints + (MidPoint(1)>MidPoint(2))) + { + ExtPatternDetected=true; + ExtSignalOpen=SIGNAL_BUY; + ExtPatternInfo="\r\n3 White Soldiers detected"; + ExtDirection="Buy"; + return(true); + } + +//--- result of checking + return(ExtCheckPassed); + } +//+------------------------------------------------------------------+ +//| Returns true in case of successful confirmation check | +//+------------------------------------------------------------------+ +bool CheckConfirmation() + { + ExtConfirmed=false; +//--- if there is no pattern, do not search for confirmation + if(!ExtPatternDetected) + return(true); + +//--- get the value of the stochastic indicator to confirm the signal + double signal=MFI(1); + if(signal==EMPTY_VALUE) + { + //--- failed to get indicator value, check failed + return(false); + } + +//--- check the Buy signal + if(ExtSignalOpen==SIGNAL_BUY && (signal<40)) + { + ExtConfirmed=true; + ExtPatternInfo+="\r\n Confirmed: MFI<40"; + } + +//--- check the Sell signal + if(ExtSignalOpen==SIGNAL_SELL && (signal>60)) + { + ExtConfirmed=true; + ExtPatternInfo+="\r\n Confirmed: MFI>60"; + } + +//--- successful completion of the check + return(true); + } +//+------------------------------------------------------------------+ +//| Check if there is a signal to close | +//+------------------------------------------------------------------+ +bool CheckCloseSignal() + { + ExtSignalClose=false; +//--- if there is a signal to enter the market, do not check the signal to close + if(ExtSignalOpen!=SIGNAL_NOT) + return(true); + +//--- check if there is a signal to close a long position + if(((MFI(1)<70) && (MFI(2)>70)) || ((MFI(1)<30) && (MFI(2)>30))) + { + //--- there is a signal to close a long position + ExtSignalClose=CLOSE_LONG; + ExtDirection="Long"; + } + +//--- check if there is a signal to close a short position + if(((MFI(1)>30) && (MFI(2)<30)) || ((MFI(1)>70) && (MFI(2)<70))) + { + //--- there is a signal to close a short position + ExtSignalClose=CLOSE_SHORT; + ExtDirection="Short"; + } + +//--- successful completion of the check + return(true); + } +//+------------------------------------------------------------------+ +//| MFI indicator value at the specified bar | +//+------------------------------------------------------------------+ +double MFI(int index) + { + double indicator_values[]; + if(CopyBuffer(ExtIndicatorHandle, 0, index, 1, indicator_values)<0) + { + //--- if the copying fails, report the error code + PrintFormat("Failed to copy data from the MFI indicator, error code %d", GetLastError()); + return(EMPTY_VALUE); + } + return(indicator_values[0]); + } +//+------------------------------------------------------------------+ diff --git a/BKPS/14031206/Experts/Free Robots/BlackCrows WhiteSoldiers RSI.ex5 b/BKPS/14031206/Experts/Free Robots/BlackCrows WhiteSoldiers RSI.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..fe15ad99df8be72d5caa19e665bf1ed150f87287 GIT binary patch literal 42440 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 +#include + +#define SIGNAL_BUY 1 // Buy signal +#define SIGNAL_NOT 0 // no trading signal +#define SIGNAL_SELL -1 // Sell signal + +#define CLOSE_LONG 2 // signal to close Long +#define CLOSE_SHORT -2 // signal to close Short + +//--- Input parameters +input int InpAverBodyPeriod=12; // period for calculating average candlestick size +input int InpPeriodRSI =37; // RSI period +input ENUM_APPLIED_PRICE InpPrice=PRICE_CLOSE; // price type + +//--- trade parameters +input uint InpDuration=10; // position holding time in bars +input uint InpSL =200; // Stop Loss in points +input uint InpTP =200; // Take Profit in points +input uint InpSlippage=10; // slippage in points +//--- money management parameters +input double InpLot =0.1; // lot +//--- Expert ID +input long InpMagicNumber=120300; // Magic Number + +//--- global variables +int ExtAvgBodyPeriod; // average candlestick calculation period +int ExtSignalOpen =0; // Buy/Sell signal +int ExtSignalClose =0; // signal to close a position +string ExtPatternInfo =""; // current pattern information +string ExtDirection =""; // position opening direction +bool ExtPatternDetected=false; // pattern detected +bool ExtConfirmed =false; // pattern confirmed +bool ExtCloseByTime =true; // requires closing by time +bool ExtCheckPassed =true; // status checking error + +//--- indicator handle +int ExtIndicatorHandle=INVALID_HANDLE; + +//--- service objects +CTrade ExtTrade; +CSymbolInfo ExtSymbolInfo; +//+------------------------------------------------------------------+ +//| Expert initialization function | +//+------------------------------------------------------------------+ +int OnInit() + { + Print("InpSL=", InpSL); + Print("InpTP=", InpTP); +//--- set parameters for trading operations + ExtTrade.SetDeviationInPoints(InpSlippage); // slippage + ExtTrade.SetExpertMagicNumber(InpMagicNumber); // Expert Advisor ID + ExtTrade.LogLevel(LOG_LEVEL_ERRORS); // logging level + + ExtAvgBodyPeriod=InpAverBodyPeriod; +//--- indicator initialization + ExtIndicatorHandle=iRSI(_Symbol, _Period, InpPeriodRSI, InpPrice); + if(ExtIndicatorHandle==INVALID_HANDLE) + { + Print("Error creating CCI indicator"); + return(INIT_FAILED); + } +//--- OK + return(INIT_SUCCEEDED); + } +//+------------------------------------------------------------------+ +//| Expert deinitialization function | +//+------------------------------------------------------------------+ +void OnDeinit(const int reason) + { +//--- release indicator handle + IndicatorRelease(ExtIndicatorHandle); + } +//+------------------------------------------------------------------+ +//| Expert tick function | +//+------------------------------------------------------------------+ +void OnTick() + { +//--- save the next bar start time; all checks at bar opening only + static datetime next_bar_open=0; + +//--- Phase 1 - check the emergence of a new bar and update the status + if(TimeCurrent()>=next_bar_open) + { + //--- get the current state of environment on the new bar + // namely, set the values of global variables: + // ExtPatternDetected - pattern detection + // ExtConfirmed - pattern confirmation + // ExtSignalOpen - signal to open + // ExtSignalClose - signal to close + // ExtPatternInfo - current pattern information + if(CheckState()) + { + //--- set the new bar opening time + next_bar_open=TimeCurrent(); + next_bar_open-=next_bar_open%PeriodSeconds(_Period); + next_bar_open+=PeriodSeconds(_Period); + + //--- report the emergence of a new bar only once within a bar + if(ExtPatternDetected && ExtConfirmed) + Print(ExtPatternInfo); + } + else + { + //--- error getting the status, retry on the next tick + return; + } + } + +//--- Phase 2 - if there is a signal and no position in this direction + if(ExtSignalOpen && !PositionExist(ExtSignalOpen)) + { + Print("\r\nSignal to open position ", ExtDirection); + PositionOpen(); + if(PositionExist(ExtSignalOpen)) + ExtSignalOpen=SIGNAL_NOT; + } + +//--- Phase 3 - close if there is a signal to close + if(ExtSignalClose && PositionExist(ExtSignalClose)) + { + Print("\r\nSignal to close position ", ExtDirection); + CloseBySignal(ExtSignalClose); + if(!PositionExist(ExtSignalClose)) + ExtSignalClose=SIGNAL_NOT; + } + +//--- Phase 4 - close upon expiration + if(ExtCloseByTime && PositionExpiredByTimeExist()) + { + CloseByTime(); + ExtCloseByTime=PositionExpiredByTimeExist(); + } + } +//+------------------------------------------------------------------+ +//| Get the current environment and check for a pattern | +//+------------------------------------------------------------------+ +bool CheckState() + { +//--- check if there is a pattern + if(!CheckPattern()) + { + Print("Error, failed to check pattern"); + return(false); + } + +//--- check for confirmation + if(!CheckConfirmation()) + { + Print("Error, failed to check pattern confirmation"); + return(false); + } +//--- if there is no confirmation, cancel the signal + if(!ExtConfirmed) + ExtSignalOpen=SIGNAL_NOT; + +//--- check if there is a signal to close a position + if(!CheckCloseSignal()) + { + Print("Error, failed to check the closing signal"); + return(false); + } + +//--- if positions are to be closed after certain holding time in bars + if(InpDuration) + ExtCloseByTime=true; // set flag to close upon expiration + +//--- all checks done + return(true); + } +//+------------------------------------------------------------------+ +//| Open a position in the direction of the signal | +//+------------------------------------------------------------------+ +bool PositionOpen() + { + ExtSymbolInfo.Refresh(); + ExtSymbolInfo.RefreshRates(); + + double price=0; +//--- Stop Loss and Take Profit are not set by default + double stoploss=0.0; + double takeprofit=0.0; + + int digits=ExtSymbolInfo.Digits(); + double point=ExtSymbolInfo.Point(); + double spread=ExtSymbolInfo.Ask()-ExtSymbolInfo.Bid(); + +//--- uptrend + if(ExtSignalOpen==SIGNAL_BUY) + { + price=NormalizeDouble(ExtSymbolInfo.Ask(), digits); + //--- if Stop Loss is set + if(InpSL>0) + { + if(spread>=InpSL*point) + { + PrintFormat("StopLoss (%d points) <= current spread = %.0f points. Spread value will be used", InpSL, spread/point); + stoploss = NormalizeDouble(price-spread, digits); + } + else + stoploss = NormalizeDouble(price-InpSL*point, digits); + } + //--- if Take Profit is set + if(InpTP>0) + { + if(spread>=InpTP*point) + { + PrintFormat("TakeProfit (%d points) < current spread = %.0f points. Spread value will be used", InpTP, spread/point); + takeprofit = NormalizeDouble(price+spread, digits); + } + else + takeprofit = NormalizeDouble(price+InpTP*point, digits); + } + + if(!ExtTrade.Buy(InpLot, Symbol(), price, stoploss, takeprofit)) + { + PrintFormat("Failed %s buy %G at %G (sl=%G tp=%G) failed. Ask=%G error=%d", + Symbol(), InpLot, price, stoploss, takeprofit, ExtSymbolInfo.Ask(), GetLastError()); + return(false); + } + } + +//--- downtrend + if(ExtSignalOpen==SIGNAL_SELL) + { + price=NormalizeDouble(ExtSymbolInfo.Bid(), digits); + //--- if Stop Loss is set + if(InpSL>0) + { + if(spread>=InpSL*point) + { + PrintFormat("StopLoss (%d points) <= current spread = %.0f points. Spread value will be used", InpSL, spread/point); + stoploss = NormalizeDouble(price+spread, digits); + } + else + stoploss = NormalizeDouble(price+InpSL*point, digits); + } + //--- if Take Profit is set + if(InpTP>0) + { + if(spread>=InpTP*point) + { + PrintFormat("TakeProfit (%d points) < current spread = %.0f points. Spread value will be used", InpTP, spread/point); + takeprofit = NormalizeDouble(price-spread, digits); + } + else + takeprofit = NormalizeDouble(price-InpTP*point, digits); + } + + if(!ExtTrade.Sell(InpLot, Symbol(), price, stoploss, takeprofit)) + { + PrintFormat("Failed %s sell at %G (sl=%G tp=%G) failed. Bid=%G error=%d", + Symbol(), price, stoploss, takeprofit, ExtSymbolInfo.Bid(), GetLastError()); + ExtTrade.PrintResult(); + Print(" "); + return(false); + } + } + + return(true); + } +//+------------------------------------------------------------------+ +//| Close a position based on the specified signal | +//+------------------------------------------------------------------+ +void CloseBySignal(int type_close) + { +//--- if there is no signal to close, return successful completion + if(type_close==SIGNAL_NOT) + return; +//--- if there are no positions opened by our EA + if(PositionExist(ExtSignalClose)==0) + return; + +//--- closing direction + long type; + switch(type_close) + { + case CLOSE_SHORT: + type=POSITION_TYPE_SELL; + break; + case CLOSE_LONG: + type=POSITION_TYPE_BUY; + break; + default: + Print("Error! Signal to close not detected"); + return; + } + +//--- check all positions and close ours based on the signal + int positions=PositionsTotal(); + for(int i=positions-1; i>=0; i--) + { + ulong ticket=PositionGetTicket(i); + if(ticket!=0) + { + //--- get the name of the symbol and the position id (magic) + string symbol=PositionGetString(POSITION_SYMBOL); + long magic =PositionGetInteger(POSITION_MAGIC); + //--- if they correspond to our values + if(symbol==Symbol() && magic==InpMagicNumber) + { + if(PositionGetInteger(POSITION_TYPE)==type) + { + ExtTrade.PositionClose(ticket, InpSlippage); + ExtTrade.PrintResult(); + Print(" "); + } + } + } + } + } +//+------------------------------------------------------------------+ +//| Close positions upon holding time expiration in bars | +//+------------------------------------------------------------------+ +void CloseByTime() + { +//--- if there are no positions opened by our EA + if(PositionExist(ExtSignalOpen)==0) + return; + +//--- check all positions and close ours based on the holding time in bars + int positions=PositionsTotal(); + for(int i=positions-1; i>=0; i--) + { + ulong ticket=PositionGetTicket(i); + if(ticket!=0) + { + //--- get the name of the symbol and the position id (magic) + string symbol=PositionGetString(POSITION_SYMBOL); + long magic =PositionGetInteger(POSITION_MAGIC); + //--- if they correspond to our values + if(symbol==Symbol() && magic==InpMagicNumber) + { + //--- position opening time + datetime open_time=(datetime)PositionGetInteger(POSITION_TIME); + //--- check position holding time in bars + if(BarsHold(open_time)>=(int)InpDuration) + { + Print("\r\nTime to close position #", ticket); + ExtTrade.PositionClose(ticket, InpSlippage); + ExtTrade.PrintResult(); + Print(" "); + } + } + } + } + } +//+------------------------------------------------------------------+ +//| Returns true if there are open positions | +//+------------------------------------------------------------------+ +bool PositionExist(int signal_direction) + { + bool check_type=(signal_direction!=SIGNAL_NOT); + +//--- what positions to search + ENUM_POSITION_TYPE search_type=WRONG_VALUE; + if(check_type) + switch(signal_direction) + { + case SIGNAL_BUY: + search_type=POSITION_TYPE_BUY; + break; + case SIGNAL_SELL: + search_type=POSITION_TYPE_SELL; + break; + case CLOSE_LONG: + search_type=POSITION_TYPE_BUY; + break; + case CLOSE_SHORT: + search_type=POSITION_TYPE_SELL; + break; + default: + //--- entry direction is not specified; nothing to search + return(false); + } + +//--- go through the list of all positions + int positions=PositionsTotal(); + for(int i=0; i=(int)InpDuration)) + return(true); + } + } + } + +//--- open position not found + return(false); + } +//+------------------------------------------------------------------+ +//| Checks position closing time in bars | +//+------------------------------------------------------------------+ +int BarsHold(datetime open_time) + { +//--- first run a basic simple check + if(TimeCurrent()-open_timeAvgBody(1)) && // long black + (Open(2)-Close(2)>AvgBody(1)) && + (Open(1)-Close(1)>AvgBody(1)) && + (MidPoint(2)AvgBody(1)) && // long white + (Close(2)-Open(2)>AvgBody(1)) && + (Close(1)-Open(1)>AvgBody(1)) && + (MidPoint(2)>MidPoint(3)) && // higher midpoints + (MidPoint(1)>MidPoint(2))) + { + ExtPatternDetected=true; + ExtSignalOpen=SIGNAL_BUY; + ExtPatternInfo="\r\n3 White Soldiers detected"; + ExtDirection="Buy"; + return(true); + } + +//--- result of checking + return(ExtCheckPassed); + } +//+------------------------------------------------------------------+ +//| Returns true in case of successful confirmation check | +//+------------------------------------------------------------------+ +bool CheckConfirmation() + { + ExtConfirmed=false; +//--- if there is no pattern, do not search for confirmation + if(!ExtPatternDetected) + return(true); + +//--- get the value of the stochastic indicator to confirm the signal + double signal=RSI(1); + if(signal==EMPTY_VALUE) + { + //--- failed to get indicator value, check failed + return(false); + } + +//--- check the Buy signal + if(ExtSignalOpen==SIGNAL_BUY && (signal<40)) + { + ExtConfirmed=true; + ExtPatternInfo+="\r\n Confirmed: RSI<40"; + } + +//--- check the Sell signal + if(ExtSignalOpen==SIGNAL_SELL && (signal>60)) + { + ExtConfirmed=true; + ExtPatternInfo+="\r\n Confirmed: RSI>60"; + } + +//--- successful completion of the check + return(true); + } +//+------------------------------------------------------------------+ +//| Check if there is a signal to close | +//+------------------------------------------------------------------+ +bool CheckCloseSignal() + { + ExtSignalClose=false; +//--- if there is a signal to enter the market, do not check the signal to close + if(ExtSignalOpen!=SIGNAL_NOT) + return(true); + +//--- check if there is a signal to close a long position + if(((RSI(1)<70) && (RSI(2)>70)) || ((RSI(1)<30) && (RSI(2)>30))) + { + //--- there is a signal to close a long position + ExtSignalClose=CLOSE_LONG; + ExtDirection="Long"; + } + +//--- check if there is a signal to close a short position + if(((RSI(1)>30) && (RSI(2)<30)) || ((RSI(1)>70) && (RSI(2)<70))) + { + //--- there is a signal to close a short position + ExtSignalClose=CLOSE_SHORT; + ExtDirection="Short"; + } + +//--- successful completion of the check + return(true); + } +//+------------------------------------------------------------------+ +//| RSI indicator value at the specified bar | +//+------------------------------------------------------------------+ +double RSI(int index) + { + double indicator_values[]; + if(CopyBuffer(ExtIndicatorHandle, 0, index, 1, indicator_values)<0) + { + //--- if the copying fails, report the error code + PrintFormat("Failed to copy data from the RSI indicator, error code %d", GetLastError()); + return(EMPTY_VALUE); + } + return(indicator_values[0]); + } +//+------------------------------------------------------------------+ diff --git a/BKPS/14031206/Experts/Free Robots/BlackCrows WhiteSoldiers Stoch.ex5 b/BKPS/14031206/Experts/Free Robots/BlackCrows WhiteSoldiers Stoch.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..fd181e9220e7221c33b7d06d4ebdc16f6cb5c4fd GIT binary patch literal 43334 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 literal 0 HcmV?d00001 diff --git a/BKPS/14031206/Experts/Free Robots/BlackCrows WhiteSoldiers Stoch.mq5 b/BKPS/14031206/Experts/Free Robots/BlackCrows WhiteSoldiers Stoch.mq5 new file mode 100644 index 0000000..81ed611 --- /dev/null +++ b/BKPS/14031206/Experts/Free Robots/BlackCrows WhiteSoldiers Stoch.mq5 @@ -0,0 +1,661 @@ +//+------------------------------------------------------------------+ +//| BlackCrows WhiteSoldiers Stoch.mq5 | +//| Copyright 2024, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2024, MetaQuotes Ltd." +#property link "https://www.mql5.com" +#property version "1.00" + +#include +#include + +#define SIGNAL_BUY 1 // Buy signal +#define SIGNAL_NOT 0 // no trading signal +#define SIGNAL_SELL -1 // Sell signal + +#define CLOSE_LONG 2 // signal to close Long +#define CLOSE_SHORT -2 // signal to close Short + +//--- Input parameters +input int InpAverBodyPeriod=12; // period for calculating average candlestick size +input int InpStochK =47; // period %K +input int InpStochD =9; // period %D +input int InpStochSlow =13; // smoothing period %K +input ENUM_STO_PRICE InpStochApplied =STO_LOWHIGH; // calculation type +input ENUM_MA_METHOD InpStochMA =MODE_SMA; // smoothing type + +//--- trade parameters +input uint InpDuration=10; // position holding time in bars +input uint InpSL =200; // Stop Loss in points +input uint InpTP =200; // Take Profit in points +input uint InpSlippage=10; // slippage in points +//--- money management parameters +input double InpLot =0.1; // lot +//--- Expert ID +input long InpMagicNumber=120400; // Magic Number + +//--- global variables +int ExtAvgBodyPeriod; // average candlestick calculation period +int ExtSignalOpen =0; // Buy/Sell signal +int ExtSignalClose =0; // signal to close a position +string ExtPatternInfo =""; // current pattern information +string ExtDirection =""; // position opening direction +bool ExtPatternDetected=false; // pattern detected +bool ExtConfirmed =false; // pattern confirmed +bool ExtCloseByTime =true; // requires closing by time +bool ExtCheckPassed =true; // status checking error +//--- indicator handle +int ExtIndicatorHandle=INVALID_HANDLE; + +//--- service objects +CTrade ExtTrade; +CSymbolInfo ExtSymbolInfo; +//+------------------------------------------------------------------+ +//| Expert initialization function | +//+------------------------------------------------------------------+ +int OnInit() + { + Print("InpSL=", InpSL); + Print("InpTP=", InpTP); +//--- set parameters for trading operations + ExtTrade.SetDeviationInPoints(InpSlippage); // slippage + ExtTrade.SetExpertMagicNumber(InpMagicNumber); // Expert Advisor ID + ExtTrade.LogLevel(LOG_LEVEL_ERRORS); // logging level + + ExtAvgBodyPeriod=InpAverBodyPeriod; +//--- indicator initialization + ExtIndicatorHandle=iStochastic(_Symbol, _Period, InpStochK, InpStochD, InpStochSlow, InpStochMA, InpStochApplied); + if(ExtIndicatorHandle==INVALID_HANDLE) + { + Print("Error creating iStochastic indicator"); + return(INIT_FAILED); + } +//--- OK + return(INIT_SUCCEEDED); + } +//+------------------------------------------------------------------+ +//| Expert deinitialization function | +//+------------------------------------------------------------------+ +void OnDeinit(const int reason) + { +//--- release indicator handle + IndicatorRelease(ExtIndicatorHandle); + } +//+------------------------------------------------------------------+ +//| Expert tick function | +//+------------------------------------------------------------------+ +void OnTick() + { +//--- save the next bar start time; all checks at bar opening only + static datetime next_bar_open=0; + +//--- Phase 1 - check the emergence of a new bar and update the status + if(TimeCurrent()>=next_bar_open) + { + //--- get the current state of environment on the new bar + // namely, set the values of global variables: + // ExtPatternDetected - pattern detection + // ExtConfirmed - pattern confirmation + // ExtSignalOpen - signal to open + // ExtSignalClose - signal to close + // ExtPatternInfo - current pattern information + if(CheckState()) + { + //--- set the new bar opening time + next_bar_open=TimeCurrent(); + next_bar_open-=next_bar_open%PeriodSeconds(_Period); + next_bar_open+=PeriodSeconds(_Period); + + //--- report the emergence of a new bar only once within a bar + if(ExtPatternDetected && ExtConfirmed) + Print(ExtPatternInfo); + } + else + { + //--- error getting the status, retry on the next tick + return; + } + } + +//--- Phase 2 - if there is a signal and no position in this direction + if(ExtSignalOpen && !PositionExist(ExtSignalOpen)) + { + Print("\r\nSignal to open position ", ExtDirection); + PositionOpen(); + if(PositionExist(ExtSignalOpen)) + ExtSignalOpen=SIGNAL_NOT; + } + +//--- Phase 3 - close if there is a signal to close + if(ExtSignalClose && PositionExist(ExtSignalClose)) + { + Print("\r\nSignal to close position ", ExtDirection); + CloseBySignal(ExtSignalClose); + if(!PositionExist(ExtSignalClose)) + ExtSignalClose=SIGNAL_NOT; + } + +//--- Phase 4 - close upon expiration + if(ExtCloseByTime && PositionExpiredByTimeExist()) + { + CloseByTime(); + ExtCloseByTime=PositionExpiredByTimeExist(); + } + } +//+------------------------------------------------------------------+ +//| Get the current environment and check for a pattern | +//+------------------------------------------------------------------+ +bool CheckState() + { +//--- check if there is a pattern + if(!CheckPattern()) + { + Print("Error, failed to check pattern"); + return(false); + } + +//--- check for confirmation + if(!CheckConfirmation()) + { + Print("Error, failed to check pattern confirmation"); + return(false); + } +//--- if there is no confirmation, cancel the signal + if(!ExtConfirmed) + ExtSignalOpen=SIGNAL_NOT; + +//--- check if there is a signal to close a position + if(!CheckCloseSignal()) + { + Print("Error, failed to check the closing signal"); + return(false); + } + +//--- if positions are to be closed after certain holding time in bars + if(InpDuration) + ExtCloseByTime=true; // set flag to close upon expiration + +//--- all checks done + return(true); + } +//+------------------------------------------------------------------+ +//| Open a position in the direction of the signal | +//+------------------------------------------------------------------+ +bool PositionOpen() + { + ExtSymbolInfo.Refresh(); + ExtSymbolInfo.RefreshRates(); + + double price=0; +//--- Stop Loss and Take Profit are not set by default + double stoploss=0.0; + double takeprofit=0.0; + + int digits=ExtSymbolInfo.Digits(); + double point=ExtSymbolInfo.Point(); + double spread=ExtSymbolInfo.Ask()-ExtSymbolInfo.Bid(); + +//--- uptrend + if(ExtSignalOpen==SIGNAL_BUY) + { + price=NormalizeDouble(ExtSymbolInfo.Ask(), digits); + //--- if Stop Loss is set + if(InpSL>0) + { + if(spread>=InpSL*point) + { + PrintFormat("StopLoss (%d points) <= current spread = %.0f points. Spread value will be used", InpSL, spread/point); + stoploss = NormalizeDouble(price-spread, digits); + } + else + stoploss = NormalizeDouble(price-InpSL*point, digits); + } + //--- if Take Profit is set + if(InpTP>0) + { + if(spread>=InpTP*point) + { + PrintFormat("TakeProfit (%d points) < current spread = %.0f points. Spread value will be used", InpTP, spread/point); + takeprofit = NormalizeDouble(price+spread, digits); + } + else + takeprofit = NormalizeDouble(price+InpTP*point, digits); + } + + if(!ExtTrade.Buy(InpLot, Symbol(), price, stoploss, takeprofit)) + { + PrintFormat("Failed %s buy %G at %G (sl=%G tp=%G) failed. Ask=%G error=%d", + Symbol(), InpLot, price, stoploss, takeprofit, ExtSymbolInfo.Ask(), GetLastError()); + return(false); + } + } + +//--- downtrend + if(ExtSignalOpen==SIGNAL_SELL) + { + price=NormalizeDouble(ExtSymbolInfo.Bid(), digits); + //--- if Stop Loss is set + if(InpSL>0) + { + if(spread>=InpSL*point) + { + PrintFormat("StopLoss (%d points) <= current spread = %.0f points. Spread value will be used", InpSL, spread/point); + stoploss = NormalizeDouble(price+spread, digits); + } + else + stoploss = NormalizeDouble(price+InpSL*point, digits); + } + //--- if Take Profit is set + if(InpTP>0) + { + if(spread>=InpTP*point) + { + PrintFormat("TakeProfit (%d points) < current spread = %.0f points. Spread value will be used", InpTP, spread/point); + takeprofit = NormalizeDouble(price-spread, digits); + } + else + takeprofit = NormalizeDouble(price-InpTP*point, digits); + } + + if(!ExtTrade.Sell(InpLot, Symbol(), price, stoploss, takeprofit)) + { + PrintFormat("Failed %s sell at %G (sl=%G tp=%G) failed. Bid=%G error=%d", + Symbol(), price, stoploss, takeprofit, ExtSymbolInfo.Bid(), GetLastError()); + ExtTrade.PrintResult(); + Print(" "); + return(false); + } + } + + return(true); + } +//+------------------------------------------------------------------+ +//| Close a position based on the specified signal | +//+------------------------------------------------------------------+ +void CloseBySignal(int type_close) + { +//--- if there is no signal to close, return successful completion + if(type_close==SIGNAL_NOT) + return; +//--- if there are no positions opened by our EA + if(PositionExist(ExtSignalClose)==0) + return; + +//--- closing direction + long type; + switch(type_close) + { + case CLOSE_SHORT: + type=POSITION_TYPE_SELL; + break; + case CLOSE_LONG: + type=POSITION_TYPE_BUY; + break; + default: + Print("Error! Signal to close not detected"); + return; + } + +//--- check all positions and close ours based on the signal + int positions=PositionsTotal(); + for(int i=positions-1; i>=0; i--) + { + ulong ticket=PositionGetTicket(i); + if(ticket!=0) + { + //--- get the name of the symbol and the position id (magic) + string symbol=PositionGetString(POSITION_SYMBOL); + long magic =PositionGetInteger(POSITION_MAGIC); + //--- if they correspond to our values + if(symbol==Symbol() && magic==InpMagicNumber) + { + if(PositionGetInteger(POSITION_TYPE)==type) + { + ExtTrade.PositionClose(ticket, InpSlippage); + ExtTrade.PrintResult(); + Print(" "); + } + } + } + } + } +//+------------------------------------------------------------------+ +//| Close positions upon holding time expiration in bars | +//+------------------------------------------------------------------+ +void CloseByTime() + { +//--- if there are no positions opened by our EA + if(PositionExist(ExtSignalOpen)==0) + return; + +//--- check all positions and close ours based on the holding time in bars + int positions=PositionsTotal(); + for(int i=positions-1; i>=0; i--) + { + ulong ticket=PositionGetTicket(i); + if(ticket!=0) + { + //--- get the name of the symbol and the position id (magic) + string symbol=PositionGetString(POSITION_SYMBOL); + long magic =PositionGetInteger(POSITION_MAGIC); + //--- if they correspond to our values + if(symbol==Symbol() && magic==InpMagicNumber) + { + //--- position opening time + datetime open_time=(datetime)PositionGetInteger(POSITION_TIME); + //--- check position holding time in bars + if(BarsHold(open_time)>=(int)InpDuration) + { + Print("\r\nTime to close position #", ticket); + ExtTrade.PositionClose(ticket, InpSlippage); + ExtTrade.PrintResult(); + Print(" "); + } + } + } + } + } +//+------------------------------------------------------------------+ +//| Returns true if there are open positions | +//+------------------------------------------------------------------+ +bool PositionExist(int signal_direction) + { + bool check_type=(signal_direction!=SIGNAL_NOT); + +//--- what positions to search + ENUM_POSITION_TYPE search_type=WRONG_VALUE; + if(check_type) + switch(signal_direction) + { + case SIGNAL_BUY: + search_type=POSITION_TYPE_BUY; + break; + case SIGNAL_SELL: + search_type=POSITION_TYPE_SELL; + break; + case CLOSE_LONG: + search_type=POSITION_TYPE_BUY; + break; + case CLOSE_SHORT: + search_type=POSITION_TYPE_SELL; + break; + default: + //--- entry direction is not specified; nothing to search + return(false); + } + +//--- go through the list of all positions + int positions=PositionsTotal(); + for(int i=0; i=(int)InpDuration)) + return(true); + } + } + } + +//--- open position not found + return(false); + } +//+------------------------------------------------------------------+ +//| Checks position closing time in bars | +//+------------------------------------------------------------------+ +int BarsHold(datetime open_time) + { +//--- first run a basic simple check + if(TimeCurrent()-open_timeAvgBody(1)) && // long black + (Open(2)-Close(2)>AvgBody(1)) && + (Open(1)-Close(1)>AvgBody(1)) && + (MidPoint(2)AvgBody(1)) && // long white + (Close(2)-Open(2)>AvgBody(1)) && + (Close(1)-Open(1)>AvgBody(1)) && + (MidPoint(2)>MidPoint(3)) && // higher midpoints + (MidPoint(1)>MidPoint(2))) + { + ExtPatternDetected=true; + ExtSignalOpen=SIGNAL_BUY; + ExtPatternInfo="\r\n3 White Soldiers detected"; + ExtDirection="Buy"; + return(true); + } + +//--- result of checking + return(ExtCheckPassed); + } +//+------------------------------------------------------------------+ +//| Returns true in case of successful confirmation check | +//+------------------------------------------------------------------+ +bool CheckConfirmation() + { + ExtConfirmed=false; +//--- if there is no pattern, do not search for confirmation + if(!ExtPatternDetected) + return(true); + +//--- get the value of the stochastic indicator to confirm the signal + double signal=StochSignal(1); + if(signal==EMPTY_VALUE) + { + //--- failed to get indicator value, check failed + return(false); + } + +//--- check the Buy signal + if(ExtSignalOpen==SIGNAL_BUY && (signal<30)) + { + ExtConfirmed=true; + ExtPatternInfo+="\r\n Confirmed: StochSignal<30"; + } + +//--- check the Sell signal + if(ExtSignalOpen==SIGNAL_SELL && (signal>70)) + { + ExtConfirmed=true; + ExtPatternInfo+="\r\n Confirmed: StochSignal>70"; + } + +//--- successful completion of the check + return(true); + } +//+------------------------------------------------------------------+ +//| Check if there is a signal to close | +//+------------------------------------------------------------------+ +bool CheckCloseSignal() + { + ExtSignalClose=false; +//--- if there is a signal to enter the market, do not check the signal to close + if(ExtSignalOpen!=SIGNAL_NOT) + return(true); + +//--- check if there is a signal to close a long position + if(((StochSignal(1)<80) && (StochSignal(2)>80))|| // 80 crossed downwards + ((StochSignal(1)<20) && (StochSignal(2)>20))) // 20 crossed downwards + { + //--- there is a signal to close a long position + ExtSignalClose=CLOSE_LONG; + ExtDirection="Long"; + } + +//--- check if there is a signal to close a short position + if((((StochSignal(1)>20) && (StochSignal(2)<20)) || // 20 crossed upwards + ((StochSignal(1)>80) && (StochSignal(2)<80)))) // 80 crossed upwards + { + //--- there is a signal to close a short position + ExtSignalClose=CLOSE_SHORT; + ExtDirection="Short"; + } + +//--- successful completion of the check + return(true); + } +//+------------------------------------------------------------------+ +//| Stochastic indicator value at the specified bar | +//+------------------------------------------------------------------+ +double StochSignal(int index) + { + double indicator_values[]; + if(CopyBuffer(ExtIndicatorHandle, SIGNAL_LINE, index, 1, indicator_values)<0) + { + //--- if the copying fails, report the error code + PrintFormat("Failed to copy data from the iStochastic indicator, error code %d", GetLastError()); + return(EMPTY_VALUE); + } + return(indicator_values[0]); + } +//+------------------------------------------------------------------+ diff --git a/BKPS/14031206/Experts/Free Robots/BullishBearish Engulfing CCI.ex5 b/BKPS/14031206/Experts/Free Robots/BullishBearish Engulfing CCI.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..023d1e4d5b4cb7466713590fbcf4b8d7c88ba0ac GIT binary patch literal 43548 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 ^o z2!To~bu{A@PB|%>MJ?*&ARLpfhl^`LP@si1>u>H37SP};d_J& z)%ObWL}7mJb(?f*c7t|kbo#Ub^hNjcm{BuPpiE!JP(HO87D{Va`e{#9&@hJUUy$pn4+#Ge0{;Av7beLQQ2zNwiCdScJXDkcXaGWUN99_YFRgG+64 zt5QfP1r9}mr>O`!H4)sfb_864`IGo!$lwwCO=>$-15V7Yx~8@Hw!^llv^vxm!4(t_ zv~7$uE6f;x3iz+*7f9OcCEs>D6R(Dqy4<=eX0rEFqnryFA73S-ZATz?1ckPj;h@j! zA`SU!+QKa-h=j`J`oBlg9p~OCUniNKhAn7FCNDR1tF1+MAG$8#dqr3U+_FcVi!x(F zDKb8Lrl=G~2jlO<%1fSfx>{{PkpVc({K2#-O3?Ho7(zU>{Cup^SX( zT}8624GHQ68sBH~I|ckkDeCdT_oHNDh95CNY*Y?%Vkc@cbsBNox0_o zvEC(7O0z z(7PN8x{P&WdQ;Ahl6;GE=WqR}7+o1!Nan(kwDH>*t^+ +#include + +#define SIGNAL_BUY 1 // Buy signal +#define SIGNAL_NOT 0 // no trading signal +#define SIGNAL_SELL -1 // Sell signal + +#define CLOSE_LONG 2 // signal to close Long +#define CLOSE_SHORT -2 // signal to close Short + +//--- Input parameters +input int InpAverBodyPeriod=12; // period for calculating average candlestick size +input int InpMAPeriod =5; // Trend MA period +input int InpPeriodCCI =37; // CCI period +input ENUM_APPLIED_PRICE InpPrice=PRICE_CLOSE; // price type + +//--- trade parameters +input uint InpDuration=10; // position holding time in bars +input uint InpSL =200; // Stop Loss in points +input uint InpTP =200; // Take Profit in points +input uint InpSlippage=10; // slippage in points +//--- money management parameters +input double InpLot =0.1; // lot +//--- Expert ID +input long InpMagicNumber=121100; // Magic Number + +//--- global variables +int ExtAvgBodyPeriod; // average candlestick calculation period +int ExtSignalOpen =0; // Buy/Sell signal +int ExtSignalClose =0; // signal to close a position +string ExtPatternInfo =""; // current pattern information +string ExtDirection =""; // position opening direction +bool ExtPatternDetected=false; // pattern detected +bool ExtConfirmed =false; // pattern confirmed +bool ExtCloseByTime =true; // requires closing by time +bool ExtCheckPassed =true; // status checking error + +//--- indicator handles +int ExtIndicatorHandle=INVALID_HANDLE; +int ExtTrendMAHandle =INVALID_HANDLE; + +//--- service objects +CTrade ExtTrade; +CSymbolInfo ExtSymbolInfo; +//+------------------------------------------------------------------+ +//| Expert initialization function | +//+------------------------------------------------------------------+ +int OnInit() + { + Print("InpSL=", InpSL); + Print("InpTP=", InpTP); +//--- set parameters for trading operations + ExtTrade.SetDeviationInPoints(InpSlippage); // slippage + ExtTrade.SetExpertMagicNumber(InpMagicNumber); // Expert Advisor ID + ExtTrade.LogLevel(LOG_LEVEL_ERRORS); // logging level + + ExtAvgBodyPeriod=InpAverBodyPeriod; +//--- indicator initialization + ExtIndicatorHandle=iCCI(_Symbol, _Period, InpPeriodCCI, InpPrice); + if(ExtIndicatorHandle==INVALID_HANDLE) + { + Print("Error creating CCI indicator"); + return(INIT_FAILED); + } + +//--- trend moving average + ExtTrendMAHandle=iMA(_Symbol, _Period, InpMAPeriod, 0, MODE_SMA, PRICE_CLOSE); + if(ExtIndicatorHandle==INVALID_HANDLE) + { + Print("Error creating Moving Average indicator"); + return(INIT_FAILED); + } + +//--- OK + return(INIT_SUCCEEDED); + } +//+------------------------------------------------------------------+ +//| Expert deinitialization function | +//+------------------------------------------------------------------+ +void OnDeinit(const int reason) + { +//--- release indicator handle + IndicatorRelease(ExtIndicatorHandle); + } +//+------------------------------------------------------------------+ +//| Expert tick function | +//+------------------------------------------------------------------+ +void OnTick() + { +//--- save the next bar start time; all checks at bar opening only + static datetime next_bar_open=0; + +//--- Phase 1 - check the emergence of a new bar and update the status + if(TimeCurrent()>=next_bar_open) + { + //--- get the current state of environment on the new bar + // namely, set the values of global variables: + // ExtPatternDetected - pattern detection + // ExtConfirmed - pattern confirmation + // ExtSignalOpen - signal to open + // ExtSignalClose - signal to close + // ExtPatternInfo - current pattern information + if(CheckState()) + { + //--- set the new bar opening time + next_bar_open=TimeCurrent(); + next_bar_open-=next_bar_open%PeriodSeconds(_Period); + next_bar_open+=PeriodSeconds(_Period); + + //--- report the emergence of a new bar only once within a bar + if(ExtPatternDetected && ExtConfirmed) + Print(ExtPatternInfo); + } + else + { + //--- error getting the status, retry on the next tick + return; + } + } + +//--- Phase 2 - if there is a signal and no position in this direction + if(ExtSignalOpen && !PositionExist(ExtSignalOpen)) + { + Print("\r\nSignal to open position ", ExtDirection); + PositionOpen(); + if(PositionExist(ExtSignalOpen)) + ExtSignalOpen=SIGNAL_NOT; + } + +//--- Phase 3 - close if there is a signal to close + if(ExtSignalClose && PositionExist(ExtSignalClose)) + { + Print("\r\nSignal to close position ", ExtDirection); + CloseBySignal(ExtSignalClose); + if(!PositionExist(ExtSignalClose)) + ExtSignalClose=SIGNAL_NOT; + } + +//--- Phase 4 - close upon expiration + if(ExtCloseByTime && PositionExpiredByTimeExist()) + { + CloseByTime(); + ExtCloseByTime=PositionExpiredByTimeExist(); + } + } +//+------------------------------------------------------------------+ +//| Get the current environment and check for a pattern | +//+------------------------------------------------------------------+ +bool CheckState() + { +//--- check if there is a pattern + if(!CheckPattern()) + { + Print("Error, failed to check pattern"); + return(false); + } + +//--- check for confirmation + if(!CheckConfirmation()) + { + Print("Error, failed to check pattern confirmation"); + return(false); + } +//--- if there is no confirmation, cancel the signal + if(!ExtConfirmed) + ExtSignalOpen=SIGNAL_NOT; + +//--- check if there is a signal to close a position + if(!CheckCloseSignal()) + { + Print("Error, failed to check the closing signal"); + return(false); + } + +//--- if positions are to be closed after certain holding time in bars + if(InpDuration) + ExtCloseByTime=true; // set flag to close upon expiration + +//--- all checks done + return(true); + } +//+------------------------------------------------------------------+ +//| Open a position in the direction of the signal | +//+------------------------------------------------------------------+ +bool PositionOpen() + { + ExtSymbolInfo.Refresh(); + ExtSymbolInfo.RefreshRates(); + + double price=0; +//--- Stop Loss and Take Profit are not set by default + double stoploss=0.0; + double takeprofit=0.0; + + int digits=ExtSymbolInfo.Digits(); + double point=ExtSymbolInfo.Point(); + double spread=ExtSymbolInfo.Ask()-ExtSymbolInfo.Bid(); + +//--- uptrend + if(ExtSignalOpen==SIGNAL_BUY) + { + price=NormalizeDouble(ExtSymbolInfo.Ask(), digits); + //--- if Stop Loss is set + if(InpSL>0) + { + if(spread>=InpSL*point) + { + PrintFormat("StopLoss (%d points) <= current spread = %.0f points. Spread value will be used", InpSL, spread/point); + stoploss = NormalizeDouble(price-spread, digits); + } + else + stoploss = NormalizeDouble(price-InpSL*point, digits); + } + //--- if Take Profit is set + if(InpTP>0) + { + if(spread>=InpTP*point) + { + PrintFormat("TakeProfit (%d points) < current spread = %.0f points. Spread value will be used", InpTP, spread/point); + takeprofit = NormalizeDouble(price+spread, digits); + } + else + takeprofit = NormalizeDouble(price+InpTP*point, digits); + } + + if(!ExtTrade.Buy(InpLot, Symbol(), price, stoploss, takeprofit)) + { + PrintFormat("Failed %s buy %G at %G (sl=%G tp=%G) failed. Ask=%G error=%d", + Symbol(), InpLot, price, stoploss, takeprofit, ExtSymbolInfo.Ask(), GetLastError()); + return(false); + } + } + +//--- downtrend + if(ExtSignalOpen==SIGNAL_SELL) + { + price=NormalizeDouble(ExtSymbolInfo.Bid(), digits); + //--- if Stop Loss is set + if(InpSL>0) + { + if(spread>=InpSL*point) + { + PrintFormat("StopLoss (%d points) <= current spread = %.0f points. Spread value will be used", InpSL, spread/point); + stoploss = NormalizeDouble(price+spread, digits); + } + else + stoploss = NormalizeDouble(price+InpSL*point, digits); + } + //--- if Take Profit is set + if(InpTP>0) + { + if(spread>=InpTP*point) + { + PrintFormat("TakeProfit (%d points) < current spread = %.0f points. Spread value will be used", InpTP, spread/point); + takeprofit = NormalizeDouble(price-spread, digits); + } + else + takeprofit = NormalizeDouble(price-InpTP*point, digits); + } + + if(!ExtTrade.Sell(InpLot, Symbol(), price, stoploss, takeprofit)) + { + PrintFormat("Failed %s sell at %G (sl=%G tp=%G) failed. Bid=%G error=%d", + Symbol(), price, stoploss, takeprofit, ExtSymbolInfo.Bid(), GetLastError()); + ExtTrade.PrintResult(); + Print(" "); + return(false); + } + } + + return(true); + } +//+------------------------------------------------------------------+ +//| Close a position based on the specified signal | +//+------------------------------------------------------------------+ +void CloseBySignal(int type_close) + { +//--- if there is no signal to close, return successful completion + if(type_close==SIGNAL_NOT) + return; +//--- if there are no positions opened by our EA + if(PositionExist(ExtSignalClose)==0) + return; + +//--- closing direction + long type; + switch(type_close) + { + case CLOSE_SHORT: + type=POSITION_TYPE_SELL; + break; + case CLOSE_LONG: + type=POSITION_TYPE_BUY; + break; + default: + Print("Error! Signal to close not detected"); + return; + } + +//--- check all positions and close ours based on the signal + int positions=PositionsTotal(); + for(int i=positions-1; i>=0; i--) + { + ulong ticket=PositionGetTicket(i); + if(ticket!=0) + { + //--- get the name of the symbol and the position id (magic) + string symbol=PositionGetString(POSITION_SYMBOL); + long magic =PositionGetInteger(POSITION_MAGIC); + //--- if they correspond to our values + if(symbol==Symbol() && magic==InpMagicNumber) + { + if(PositionGetInteger(POSITION_TYPE)==type) + { + ExtTrade.PositionClose(ticket, InpSlippage); + ExtTrade.PrintResult(); + Print(" "); + } + } + } + } + } +//+------------------------------------------------------------------+ +//| Close positions upon holding time expiration in bars | +//+------------------------------------------------------------------+ +void CloseByTime() + { +//--- if there are no positions opened by our EA + if(PositionExist(ExtSignalOpen)==0) + return; + +//--- check all positions and close ours based on the holding time in bars + int positions=PositionsTotal(); + for(int i=positions-1; i>=0; i--) + { + ulong ticket=PositionGetTicket(i); + if(ticket!=0) + { + //--- get the name of the symbol and the position id (magic) + string symbol=PositionGetString(POSITION_SYMBOL); + long magic =PositionGetInteger(POSITION_MAGIC); + //--- if they correspond to our values + if(symbol==Symbol() && magic==InpMagicNumber) + { + //--- position opening time + datetime open_time=(datetime)PositionGetInteger(POSITION_TIME); + //--- check position holding time in bars + if(BarsHold(open_time)>=(int)InpDuration) + { + Print("\r\nTime to close position #", ticket); + ExtTrade.PositionClose(ticket, InpSlippage); + ExtTrade.PrintResult(); + Print(" "); + } + } + } + } + } +//+------------------------------------------------------------------+ +//| Returns true if there are open positions | +//+------------------------------------------------------------------+ +bool PositionExist(int signal_direction) + { + bool check_type=(signal_direction!=SIGNAL_NOT); + +//--- what positions to search + ENUM_POSITION_TYPE search_type=WRONG_VALUE; + if(check_type) + switch(signal_direction) + { + case SIGNAL_BUY: + search_type=POSITION_TYPE_BUY; + break; + case SIGNAL_SELL: + search_type=POSITION_TYPE_SELL; + break; + case CLOSE_LONG: + search_type=POSITION_TYPE_BUY; + break; + case CLOSE_SHORT: + search_type=POSITION_TYPE_SELL; + break; + default: + //--- entry direction is not specified; nothing to search + return(false); + } + +//--- go through the list of all positions + int positions=PositionsTotal(); + for(int i=0; i=(int)InpDuration)) + return(true); + } + } + } + +//--- open position not found + return(false); + } +//+------------------------------------------------------------------+ +//| Checks position closing time in bars | +//+------------------------------------------------------------------+ +int BarsHold(datetime open_time) + { +//--- first run a basic simple check + if(TimeCurrent()-open_timeAvgBody(1)) && // body of the candle is higher than average value of the body + (Close(1)CloseAvg(2)) && // uptrend + (Open(1)>Close(2))) // Open price of the bearish candle is higher than close price of the bullish candle + { + ExtPatternDetected=true; + ExtSignalOpen=SIGNAL_SELL; + ExtPatternInfo="\r\nBearish Engulfing detected"; + ExtDirection="Sell"; + return(true); + } + +//--- check Bullish Engulfing + if((Open(2)>Close(2)) && // previous candle is bearish + (Close(1)-Open(1)>AvgBody(1)) && // body of the bullish candle is higher than average value of the body + (Close(1)>Open(2)) && // close price of the bullish candle is higher than open price of the bearish candle + (MidOpenClose(2)50)) + { + ExtConfirmed=true; + ExtPatternInfo+="\r\n Confirmed: CCI>50"; + } + +//--- successful completion of the check + return(true); + } +//+------------------------------------------------------------------+ +//| Check if there is a signal to close | +//+------------------------------------------------------------------+ +bool CheckCloseSignal() + { + ExtSignalClose=false; +//--- if there is a signal to enter the market, do not check the signal to close + if(ExtSignalOpen!=SIGNAL_NOT) + return(true); + +//--- check if there is a signal to close a long position + if(((CCI(1)<80) && (CCI(2)>80)) || ((CCI(1)<-80) && (CCI(2)>-80))) + { + //--- there is a signal to close a long position + ExtSignalClose=CLOSE_LONG; + ExtDirection="Long"; + } + +//--- check if there is a signal to close a short position + if(((CCI(1)>-80) && (CCI(2)<-80)) || ((CCI(1)>80) && (CCI(2)<80))) + { + //--- there is a signal to close a short position + ExtSignalClose=CLOSE_SHORT; + ExtDirection="Short"; + } + +//--- successful completion of the check + return(true); + } +//+------------------------------------------------------------------+ +//| CCI indicator value at the specified bar | +//+------------------------------------------------------------------+ +double CCI(int index) + { + double indicator_values[]; + if(CopyBuffer(ExtIndicatorHandle, 0, index, 1, indicator_values)<0) + { + //--- if the copying fails, report the error code + PrintFormat("Failed to copy data from the CCI indicator, error code %d", GetLastError()); + return(EMPTY_VALUE); + } + return(indicator_values[0]); + } +//+------------------------------------------------------------------+ +//| SMA value at the specified bar | +//+------------------------------------------------------------------+ +double CloseAvg(int index) + { + double indicator_values[]; + if(CopyBuffer(ExtTrendMAHandle, 0, index, 1, indicator_values)<0) + { + //--- if the copying fails, report the error code + PrintFormat("Failed to copy data from the Simple Moving Average indicator, error code %d", GetLastError()); + return(EMPTY_VALUE); + } + return(indicator_values[0]); + } +//+------------------------------------------------------------------+ diff --git a/BKPS/14031206/Experts/Free Robots/BullishBearish Engulfing MFI.ex5 b/BKPS/14031206/Experts/Free Robots/BullishBearish Engulfing MFI.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..11f80bdc32b5fbfc93eec286574735d2e56bf217 GIT binary patch literal 42928 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 literal 0 HcmV?d00001 diff --git a/BKPS/14031206/Experts/Free Robots/BullishBearish Engulfing MFI.mq5 b/BKPS/14031206/Experts/Free Robots/BullishBearish Engulfing MFI.mq5 new file mode 100644 index 0000000..ef447bb --- /dev/null +++ b/BKPS/14031206/Experts/Free Robots/BullishBearish Engulfing MFI.mq5 @@ -0,0 +1,682 @@ +//+------------------------------------------------------------------+ +//| BullishBearish Engulfing MFI.mq5 | +//| Copyright 2024, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2024, MetaQuotes Ltd." +#property link "https://www.mql5.com" +#property version "1.00" + +#include +#include + +#define SIGNAL_BUY 1 // Buy signal +#define SIGNAL_NOT 0 // no trading signal +#define SIGNAL_SELL -1 // Sell signal + +#define CLOSE_LONG 2 // signal to close Long +#define CLOSE_SHORT -2 // signal to close Short + +//--- Input parameters +input int InpAverBodyPeriod=12; // period for calculating average candlestick size +input int InpMAPeriod =5; // Trend MA period +input int InpPeriodMFI =37; // MFI period +input ENUM_APPLIED_VOLUME InpVolume=VOLUME_TICK; // volume type + +//--- trade parameters +input uint InpDuration=10; // position holding time in bars +input uint InpSL =200; // Stop Loss in points +input uint InpTP =200; // Take Profit in points +input uint InpSlippage=10; // slippage in points +//--- money management parameters +input double InpLot =0.1; // lot +//--- Expert ID +input long InpMagicNumber=120600; // Magic Number + +//--- global variables +int ExtAvgBodyPeriod; // average candlestick calculation period +int ExtSignalOpen =0; // Buy/Sell signal +int ExtSignalClose =0; // signal to close a position +string ExtPatternInfo =""; // current pattern information +string ExtDirection =""; // position opening direction +bool ExtPatternDetected=false; // pattern detected +bool ExtConfirmed =false; // pattern confirmed +bool ExtCloseByTime =true; // requires closing by time +bool ExtCheckPassed =true; // status checking error + +//--- indicator handles +int ExtIndicatorHandle=INVALID_HANDLE; +int ExtTrendMAHandle =INVALID_HANDLE; + +//--- service objects +CTrade ExtTrade; +CSymbolInfo ExtSymbolInfo; +//+------------------------------------------------------------------+ +//| Expert initialization function | +//+------------------------------------------------------------------+ +int OnInit() + { + Print("InpSL=", InpSL); + Print("InpTP=", InpTP); +//--- set parameters for trading operations + ExtTrade.SetDeviationInPoints(InpSlippage); // slippage + ExtTrade.SetExpertMagicNumber(InpMagicNumber); // Expert Advisor ID + ExtTrade.LogLevel(LOG_LEVEL_ERRORS); // logging level + + ExtAvgBodyPeriod=InpAverBodyPeriod; +//--- indicator initialization + ExtIndicatorHandle=iMFI(_Symbol, _Period, InpPeriodMFI, InpVolume); + if(ExtIndicatorHandle==INVALID_HANDLE) + { + Print("Error creating MFI indicator"); + return(INIT_FAILED); + } + +//--- trend moving average + ExtTrendMAHandle=iMA(_Symbol, _Period, InpMAPeriod, 0, MODE_SMA, PRICE_CLOSE); + if(ExtIndicatorHandle==INVALID_HANDLE) + { + Print("Error creating Moving Average indicator"); + return(INIT_FAILED); + } + +//--- OK + return(INIT_SUCCEEDED); + } +//+------------------------------------------------------------------+ +//| Expert deinitialization function | +//+------------------------------------------------------------------+ +void OnDeinit(const int reason) + { +//--- release indicator handle + IndicatorRelease(ExtIndicatorHandle); + } +//+------------------------------------------------------------------+ +//| Expert tick function | +//+------------------------------------------------------------------+ +void OnTick() + { +//--- save the next bar start time; all checks at bar opening only + static datetime next_bar_open=0; + +//--- Phase 1 - check the emergence of a new bar and update the status + if(TimeCurrent()>=next_bar_open) + { + //--- get the current state of environment on the new bar + // namely, set the values of global variables: + // ExtPatternDetected - pattern detection + // ExtConfirmed - pattern confirmation + // ExtSignalOpen - signal to open + // ExtSignalClose - signal to close + // ExtPatternInfo - current pattern information + if(CheckState()) + { + //--- set the new bar opening time + next_bar_open=TimeCurrent(); + next_bar_open-=next_bar_open%PeriodSeconds(_Period); + next_bar_open+=PeriodSeconds(_Period); + + //--- report the emergence of a new bar only once within a bar + if(ExtPatternDetected && ExtConfirmed) + Print(ExtPatternInfo); + } + else + { + //--- error getting the status, retry on the next tick + return; + } + } + +//--- Phase 2 - if there is a signal and no position in this direction + if(ExtSignalOpen && !PositionExist(ExtSignalOpen)) + { + Print("\r\nSignal to open position ", ExtDirection); + PositionOpen(); + if(PositionExist(ExtSignalOpen)) + ExtSignalOpen=SIGNAL_NOT; + } + +//--- Phase 3 - close if there is a signal to close + if(ExtSignalClose && PositionExist(ExtSignalClose)) + { + Print("\r\nSignal to close position ", ExtDirection); + CloseBySignal(ExtSignalClose); + if(!PositionExist(ExtSignalClose)) + ExtSignalClose=SIGNAL_NOT; + } + +//--- Phase 4 - close upon expiration + if(ExtCloseByTime && PositionExpiredByTimeExist()) + { + CloseByTime(); + ExtCloseByTime=PositionExpiredByTimeExist(); + } + } +//+------------------------------------------------------------------+ +//| Get the current environment and check for a pattern | +//+------------------------------------------------------------------+ +bool CheckState() + { +//--- check if there is a pattern + if(!CheckPattern()) + { + Print("Error, failed to check pattern"); + return(false); + } + +//--- check for confirmation + if(!CheckConfirmation()) + { + Print("Error, failed to check pattern confirmation"); + return(false); + } +//--- if there is no confirmation, cancel the signal + if(!ExtConfirmed) + ExtSignalOpen=SIGNAL_NOT; + +//--- check if there is a signal to close a position + if(!CheckCloseSignal()) + { + Print("Error, failed to check the closing signal"); + return(false); + } + +//--- if positions are to be closed after certain holding time in bars + if(InpDuration) + ExtCloseByTime=true; // set flag to close upon expiration + +//--- all checks done + return(true); + } +//+------------------------------------------------------------------+ +//| Open a position in the direction of the signal | +//+------------------------------------------------------------------+ +bool PositionOpen() + { + ExtSymbolInfo.Refresh(); + ExtSymbolInfo.RefreshRates(); + + double price=0; +//--- Stop Loss and Take Profit are not set by default + double stoploss=0.0; + double takeprofit=0.0; + + int digits=ExtSymbolInfo.Digits(); + double point=ExtSymbolInfo.Point(); + double spread=ExtSymbolInfo.Ask()-ExtSymbolInfo.Bid(); + +//--- uptrend + if(ExtSignalOpen==SIGNAL_BUY) + { + price=NormalizeDouble(ExtSymbolInfo.Ask(), digits); + //--- if Stop Loss is set + if(InpSL>0) + { + if(spread>=InpSL*point) + { + PrintFormat("StopLoss (%d points) <= current spread = %.0f points. Spread value will be used", InpSL, spread/point); + stoploss = NormalizeDouble(price-spread, digits); + } + else + stoploss = NormalizeDouble(price-InpSL*point, digits); + } + //--- if Take Profit is set + if(InpTP>0) + { + if(spread>=InpTP*point) + { + PrintFormat("TakeProfit (%d points) < current spread = %.0f points. Spread value will be used", InpTP, spread/point); + takeprofit = NormalizeDouble(price+spread, digits); + } + else + takeprofit = NormalizeDouble(price+InpTP*point, digits); + } + + if(!ExtTrade.Buy(InpLot, Symbol(), price, stoploss, takeprofit)) + { + PrintFormat("Failed %s buy %G at %G (sl=%G tp=%G) failed. Ask=%G error=%d", + Symbol(), InpLot, price, stoploss, takeprofit, ExtSymbolInfo.Ask(), GetLastError()); + return(false); + } + } + +//--- downtrend + if(ExtSignalOpen==SIGNAL_SELL) + { + price=NormalizeDouble(ExtSymbolInfo.Bid(), digits); + //--- if Stop Loss is set + if(InpSL>0) + { + if(spread>=InpSL*point) + { + PrintFormat("StopLoss (%d points) <= current spread = %.0f points. Spread value will be used", InpSL, spread/point); + stoploss = NormalizeDouble(price+spread, digits); + } + else + stoploss = NormalizeDouble(price+InpSL*point, digits); + } + //--- if Take Profit is set + if(InpTP>0) + { + if(spread>=InpTP*point) + { + PrintFormat("TakeProfit (%d points) < current spread = %.0f points. Spread value will be used", InpTP, spread/point); + takeprofit = NormalizeDouble(price-spread, digits); + } + else + takeprofit = NormalizeDouble(price-InpTP*point, digits); + } + + if(!ExtTrade.Sell(InpLot, Symbol(), price, stoploss, takeprofit)) + { + PrintFormat("Failed %s sell at %G (sl=%G tp=%G) failed. Bid=%G error=%d", + Symbol(), price, stoploss, takeprofit, ExtSymbolInfo.Bid(), GetLastError()); + ExtTrade.PrintResult(); + Print(" "); + return(false); + } + } + + return(true); + } +//+------------------------------------------------------------------+ +//| Close a position based on the specified signal | +//+------------------------------------------------------------------+ +void CloseBySignal(int type_close) + { +//--- if there is no signal to close, return successful completion + if(type_close==SIGNAL_NOT) + return; +//--- if there are no positions opened by our EA + if(PositionExist(ExtSignalClose)==0) + return; + +//--- closing direction + long type; + switch(type_close) + { + case CLOSE_SHORT: + type=POSITION_TYPE_SELL; + break; + case CLOSE_LONG: + type=POSITION_TYPE_BUY; + break; + default: + Print("Error! Signal to close not detected"); + return; + } + +//--- check all positions and close ours based on the signal + int positions=PositionsTotal(); + for(int i=positions-1; i>=0; i--) + { + ulong ticket=PositionGetTicket(i); + if(ticket!=0) + { + //--- get the name of the symbol and the position id (magic) + string symbol=PositionGetString(POSITION_SYMBOL); + long magic =PositionGetInteger(POSITION_MAGIC); + //--- if they correspond to our values + if(symbol==Symbol() && magic==InpMagicNumber) + { + if(PositionGetInteger(POSITION_TYPE)==type) + { + ExtTrade.PositionClose(ticket, InpSlippage); + ExtTrade.PrintResult(); + Print(" "); + } + } + } + } + } +//+------------------------------------------------------------------+ +//| Close positions upon holding time expiration in bars | +//+------------------------------------------------------------------+ +void CloseByTime() + { +//--- if there are no positions opened by our EA + if(PositionExist(ExtSignalOpen)==0) + return; + +//--- check all positions and close ours based on the holding time in bars + int positions=PositionsTotal(); + for(int i=positions-1; i>=0; i--) + { + ulong ticket=PositionGetTicket(i); + if(ticket!=0) + { + //--- get the name of the symbol and the position id (magic) + string symbol=PositionGetString(POSITION_SYMBOL); + long magic =PositionGetInteger(POSITION_MAGIC); + //--- if they correspond to our values + if(symbol==Symbol() && magic==InpMagicNumber) + { + //--- position opening time + datetime open_time=(datetime)PositionGetInteger(POSITION_TIME); + //--- check position holding time in bars + if(BarsHold(open_time)>=(int)InpDuration) + { + Print("\r\nTime to close position #", ticket); + ExtTrade.PositionClose(ticket, InpSlippage); + ExtTrade.PrintResult(); + Print(" "); + } + } + } + } + } +//+------------------------------------------------------------------+ +//| Returns true if there are open positions | +//+------------------------------------------------------------------+ +bool PositionExist(int signal_direction) + { + bool check_type=(signal_direction!=SIGNAL_NOT); + +//--- what positions to search + ENUM_POSITION_TYPE search_type=WRONG_VALUE; + if(check_type) + switch(signal_direction) + { + case SIGNAL_BUY: + search_type=POSITION_TYPE_BUY; + break; + case SIGNAL_SELL: + search_type=POSITION_TYPE_SELL; + break; + case CLOSE_LONG: + search_type=POSITION_TYPE_BUY; + break; + case CLOSE_SHORT: + search_type=POSITION_TYPE_SELL; + break; + default: + //--- entry direction is not specified; nothing to search + return(false); + } + +//--- go through the list of all positions + int positions=PositionsTotal(); + for(int i=0; i=(int)InpDuration)) + return(true); + } + } + } + +//--- open position not found + return(false); + } +//+------------------------------------------------------------------+ +//| Checks position closing time in bars | +//+------------------------------------------------------------------+ +int BarsHold(datetime open_time) + { +//--- first run a basic simple check + if(TimeCurrent()-open_timeAvgBody(1)) && // body of the candle is higher than average value of the body + (Close(1)CloseAvg(2)) && // uptrend + (Open(1)>Close(2))) // Open price of the bearish candle is higher than close price of the bullish candle + { + ExtPatternDetected=true; + ExtSignalOpen=SIGNAL_SELL; + ExtPatternInfo="\r\nBearish Engulfing detected"; + ExtDirection="Sell"; + return(true); + } + +//--- check Bullish Engulfing + if((Open(2)>Close(2)) && // previous candle is bearish + (Close(1)-Open(1)>AvgBody(1)) && // body of the bullish candle is higher than average value of the body + (Close(1)>Open(2)) && // close price of the bullish candle is higher than open price of the bearish candle + (MidOpenClose(2)60)) + { + ExtConfirmed=true; + ExtPatternInfo+="\r\n Confirmed: MFI>60"; + } + +//--- successful completion of the check + return(true); + } +//+------------------------------------------------------------------+ +//| Check if there is a signal to close | +//+------------------------------------------------------------------+ +bool CheckCloseSignal() + { + ExtSignalClose=false; +//--- if there is a signal to enter the market, do not check the signal to close + if(ExtSignalOpen!=SIGNAL_NOT) + return(true); + +//--- check if there is a signal to close a long position + if(((MFI(1)<70) && (MFI(2)>70)) || ((MFI(1)<30) && (MFI(2)>30))) + { + //--- there is a signal to close a long position + ExtSignalClose=CLOSE_LONG; + ExtDirection="Long"; + } + +//--- check if there is a signal to close a short position + if(((MFI(1)>30) && (MFI(2)<30)) || ((MFI(1)>70) && (MFI(2)<70))) + { + //--- there is a signal to close a short position + ExtSignalClose=CLOSE_SHORT; + ExtDirection="Short"; + } + +//--- successful completion of the check + return(true); + } +//+------------------------------------------------------------------+ +//| MFI indicator value at the specified bar | +//+------------------------------------------------------------------+ +double MFI(int index) + { + double indicator_values[]; + if(CopyBuffer(ExtIndicatorHandle, 0, index, 1, indicator_values)<0) + { + //--- if the copying fails, report the error code + PrintFormat("Failed to copy data from the MFI indicator, error code %d", GetLastError()); + return(EMPTY_VALUE); + } + return(indicator_values[0]); + } +//+------------------------------------------------------------------+ +//| SMA value at the specified bar | +//+------------------------------------------------------------------+ +double CloseAvg(int index) + { + double indicator_values[]; + if(CopyBuffer(ExtTrendMAHandle, 0, index, 1, indicator_values)<0) + { + //--- if the copying fails, report the error code + PrintFormat("Failed to copy data from the Simple Moving Average indicator, error code %d", GetLastError()); + return(EMPTY_VALUE); + } + return(indicator_values[0]); + } +//+------------------------------------------------------------------+ diff --git a/BKPS/14031206/Experts/Free Robots/BullishBearish Engulfing RSI.ex5 b/BKPS/14031206/Experts/Free Robots/BullishBearish Engulfing RSI.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..5627482bf02dcc97be73328a7e255bb84a7c407c GIT binary patch literal 43364 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

dy*l5zDG9?+5m8I@(Z&uI1D96T-CoIXu(-hT8 z|CdkI9SpoWET1XIJrC(X`sxmSb9*Gpyh?I|4%0GUiCPQV!<+hz;}UtG)oegJAXdh3 zU$A@bRTqJtHn5+z)IWSoGI8a zWAu6~_EPwLIXMC=S9{TDp3`j2&DKG}J>BPc>~Ebu1ikb+g)qxnZ0{HR_=()A1Yw!s z{Z*{8^(4;Nr--5{Qv}X;I9-Cae|Vo~P8_XwHl@ayL0xtKteFi9bt13nGiN!8)Z6O& z{V1`143^N&mr-$P%M~~2&nNNAJAKWWqYIiZ|{wW zxq6p&WxS+D`_}#uzVEqL6hRClKub{?b0V2qjC{1L#=f1~6LNQn7I$<~hd-L3!oJHV z=RClZ>cRglu+q1`sP-t8R$u_t2PBPN2!YQxv^*`h z4cG~9zrA@FrG_dCIx2>#`9vf@TI~U^Mr>IgM5C%72<7P7f$mXqZ)N4zC+DxnSyE-b z_ul}o-o^bKFzQdeA>WSCV&+uHczkucjFsQ|!=DU%3=To)JNLnEny|AkFU1YLnSk<} zItkRS2~e8wT%$wwz0GJ<7vR^*J^T3r-9KUU%pCHccUHAOy1+mp6CIH<-EpwaB{v3J z)eEiVJp-Gzf94oVkz4an$LMz20EK|#$W?*syK?!(O zuk7P7niR(k!VA*P&L|o>{4ufg^+ONVU+|qb8TwthYmncfxsX~QbwQwKQ`Sw@pk(f4 z!;pZ18lbYy@YN35fQil$hNFQcF1xG8Fglu$#x6if^|yhNQ;z;RHhw@vD0Oh01o)JG zmDx~#VV`{)z%rGeG^fJpQ{tImghS6u8s9iG5pY;N9XIOESS?9R)RLUUpR&{HE2p8j zmkX{q7hh2%woC#O*2uHNXXqrbtF31+Q_n>dUreET@O3Stt0?(q)VEjb;;fTlory}E z%yFvO@9_NV^J9P$A)G5og!tbb&E%0AKXfw{ZXIdY<=BXS=o)~Z(C@r`)o#2yfXA7| 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 G)TY}i?-4lw literal 0 HcmV?d00001 diff --git a/BKPS/14031206/Experts/Free Robots/BullishBearish Engulfing RSI.mq5 b/BKPS/14031206/Experts/Free Robots/BullishBearish Engulfing RSI.mq5 new file mode 100644 index 0000000..7524628 --- /dev/null +++ b/BKPS/14031206/Experts/Free Robots/BullishBearish Engulfing RSI.mq5 @@ -0,0 +1,682 @@ +//+------------------------------------------------------------------+ +//| BullishBearish Engulfing RSI.mq5 | +//| Copyright 2024, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2024, MetaQuotes Ltd." +#property link "https://www.mql5.com" +#property version "1.00" + +#include +#include + +#define SIGNAL_BUY 1 // Buy signal +#define SIGNAL_NOT 0 // no trading signal +#define SIGNAL_SELL -1 // Sell signal + +#define CLOSE_LONG 2 // signal to close Long +#define CLOSE_SHORT -2 // signal to close Short + +//--- Input parameters +input int InpAverBodyPeriod=12; // period for calculating average candlestick size +input int InpMAPeriod =5; // Trend MA period +input int InpPeriodRSI =37; // RSI period +input ENUM_APPLIED_PRICE InpPrice=PRICE_CLOSE; // price type + +//--- trade parameters +input uint InpDuration=10; // position holding time in bars +input uint InpSL =200; // Stop Loss in points +input uint InpTP =200; // Take Profit in points +input uint InpSlippage=10; // slippage in points +//--- money management parameters +input double InpLot =0.1; // lot +//--- Expert ID +input long InpMagicNumber=121300; // Magic Number + +//--- global variables +int ExtAvgBodyPeriod; // average candlestick calculation period +int ExtSignalOpen =0; // Buy/Sell signal +int ExtSignalClose =0; // signal to close a position +string ExtPatternInfo =""; // current pattern information +string ExtDirection =""; // position opening direction +bool ExtPatternDetected=false; // pattern detected +bool ExtConfirmed =false; // pattern confirmed +bool ExtCloseByTime =true; // requires closing by time +bool ExtCheckPassed =true; // status checking error + +//--- indicator handles +int ExtIndicatorHandle=INVALID_HANDLE; +int ExtTrendMAHandle =INVALID_HANDLE; + +//--- service objects +CTrade ExtTrade; +CSymbolInfo ExtSymbolInfo; +//+------------------------------------------------------------------+ +//| Expert initialization function | +//+------------------------------------------------------------------+ +int OnInit() + { + Print("InpSL=", InpSL); + Print("InpTP=", InpTP); +//--- set parameters for trading operations + ExtTrade.SetDeviationInPoints(InpSlippage); // slippage + ExtTrade.SetExpertMagicNumber(InpMagicNumber); // Expert Advisor ID + ExtTrade.LogLevel(LOG_LEVEL_ERRORS); // logging level + + ExtAvgBodyPeriod=InpAverBodyPeriod; +//--- indicator initialization + ExtIndicatorHandle=iRSI(_Symbol, _Period, InpPeriodRSI, InpPrice); + if(ExtIndicatorHandle==INVALID_HANDLE) + { + Print("Error creating CCI indicator"); + return(INIT_FAILED); + } + +//--- trend moving average + ExtTrendMAHandle=iMA(_Symbol, _Period, InpMAPeriod, 0, MODE_SMA, PRICE_CLOSE); + if(ExtIndicatorHandle==INVALID_HANDLE) + { + Print("Error creating Moving Average indicator"); + return(INIT_FAILED); + } + +//--- OK + return(INIT_SUCCEEDED); + } +//+------------------------------------------------------------------+ +//| Expert deinitialization function | +//+------------------------------------------------------------------+ +void OnDeinit(const int reason) + { +//--- release indicator handle + IndicatorRelease(ExtIndicatorHandle); + } +//+------------------------------------------------------------------+ +//| Expert tick function | +//+------------------------------------------------------------------+ +void OnTick() + { +//--- save the next bar start time; all checks at bar opening only + static datetime next_bar_open=0; + +//--- Phase 1 - check the emergence of a new bar and update the status + if(TimeCurrent()>=next_bar_open) + { + //--- get the current state of environment on the new bar + // namely, set the values of global variables: + // ExtPatternDetected - pattern detection + // ExtConfirmed - pattern confirmation + // ExtSignalOpen - signal to open + // ExtSignalClose - signal to close + // ExtPatternInfo - current pattern information + if(CheckState()) + { + //--- set the new bar opening time + next_bar_open=TimeCurrent(); + next_bar_open-=next_bar_open%PeriodSeconds(_Period); + next_bar_open+=PeriodSeconds(_Period); + + //--- report the emergence of a new bar only once within a bar + if(ExtPatternDetected && ExtConfirmed) + Print(ExtPatternInfo); + } + else + { + //--- error getting the status, retry on the next tick + return; + } + } + +//--- Phase 2 - if there is a signal and no position in this direction + if(ExtSignalOpen && !PositionExist(ExtSignalOpen)) + { + Print("\r\nSignal to open position ", ExtDirection); + PositionOpen(); + if(PositionExist(ExtSignalOpen)) + ExtSignalOpen=SIGNAL_NOT; + } + +//--- Phase 3 - close if there is a signal to close + if(ExtSignalClose && PositionExist(ExtSignalClose)) + { + Print("\r\nSignal to close position ", ExtDirection); + CloseBySignal(ExtSignalClose); + if(!PositionExist(ExtSignalClose)) + ExtSignalClose=SIGNAL_NOT; + } + +//--- Phase 4 - close upon expiration + if(ExtCloseByTime && PositionExpiredByTimeExist()) + { + CloseByTime(); + ExtCloseByTime=PositionExpiredByTimeExist(); + } + } +//+------------------------------------------------------------------+ +//| Get the current environment and check for a pattern | +//+------------------------------------------------------------------+ +bool CheckState() + { +//--- check if there is a pattern + if(!CheckPattern()) + { + Print("Error, failed to check pattern"); + return(false); + } + +//--- check for confirmation + if(!CheckConfirmation()) + { + Print("Error, failed to check pattern confirmation"); + return(false); + } +//--- if there is no confirmation, cancel the signal + if(!ExtConfirmed) + ExtSignalOpen=SIGNAL_NOT; + +//--- check if there is a signal to close a position + if(!CheckCloseSignal()) + { + Print("Error, failed to check the closing signal"); + return(false); + } + +//--- if positions are to be closed after certain holding time in bars + if(InpDuration) + ExtCloseByTime=true; // set flag to close upon expiration + +//--- all checks done + return(true); + } +//+------------------------------------------------------------------+ +//| Open a position in the direction of the signal | +//+------------------------------------------------------------------+ +bool PositionOpen() + { + ExtSymbolInfo.Refresh(); + ExtSymbolInfo.RefreshRates(); + + double price=0; +//--- Stop Loss and Take Profit are not set by default + double stoploss=0.0; + double takeprofit=0.0; + + int digits=ExtSymbolInfo.Digits(); + double point=ExtSymbolInfo.Point(); + double spread=ExtSymbolInfo.Ask()-ExtSymbolInfo.Bid(); + +//--- uptrend + if(ExtSignalOpen==SIGNAL_BUY) + { + price=NormalizeDouble(ExtSymbolInfo.Ask(), digits); + //--- if Stop Loss is set + if(InpSL>0) + { + if(spread>=InpSL*point) + { + PrintFormat("StopLoss (%d points) <= current spread = %.0f points. Spread value will be used", InpSL, spread/point); + stoploss = NormalizeDouble(price-spread, digits); + } + else + stoploss = NormalizeDouble(price-InpSL*point, digits); + } + //--- if Take Profit is set + if(InpTP>0) + { + if(spread>=InpTP*point) + { + PrintFormat("TakeProfit (%d points) < current spread = %.0f points. Spread value will be used", InpTP, spread/point); + takeprofit = NormalizeDouble(price+spread, digits); + } + else + takeprofit = NormalizeDouble(price+InpTP*point, digits); + } + + if(!ExtTrade.Buy(InpLot, Symbol(), price, stoploss, takeprofit)) + { + PrintFormat("Failed %s buy %G at %G (sl=%G tp=%G) failed. Ask=%G error=%d", + Symbol(), InpLot, price, stoploss, takeprofit, ExtSymbolInfo.Ask(), GetLastError()); + return(false); + } + } + +//--- downtrend + if(ExtSignalOpen==SIGNAL_SELL) + { + price=NormalizeDouble(ExtSymbolInfo.Bid(), digits); + //--- if Stop Loss is set + if(InpSL>0) + { + if(spread>=InpSL*point) + { + PrintFormat("StopLoss (%d points) <= current spread = %.0f points. Spread value will be used", InpSL, spread/point); + stoploss = NormalizeDouble(price+spread, digits); + } + else + stoploss = NormalizeDouble(price+InpSL*point, digits); + } + //--- if Take Profit is set + if(InpTP>0) + { + if(spread>=InpTP*point) + { + PrintFormat("TakeProfit (%d points) < current spread = %.0f points. Spread value will be used", InpTP, spread/point); + takeprofit = NormalizeDouble(price-spread, digits); + } + else + takeprofit = NormalizeDouble(price-InpTP*point, digits); + } + + if(!ExtTrade.Sell(InpLot, Symbol(), price, stoploss, takeprofit)) + { + PrintFormat("Failed %s sell at %G (sl=%G tp=%G) failed. Bid=%G error=%d", + Symbol(), price, stoploss, takeprofit, ExtSymbolInfo.Bid(), GetLastError()); + ExtTrade.PrintResult(); + Print(" "); + return(false); + } + } + + return(true); + } +//+------------------------------------------------------------------+ +//| Close a position based on the specified signal | +//+------------------------------------------------------------------+ +void CloseBySignal(int type_close) + { +//--- if there is no signal to close, return successful completion + if(type_close==SIGNAL_NOT) + return; +//--- if there are no positions opened by our EA + if(PositionExist(ExtSignalClose)==0) + return; + +//--- closing direction + long type; + switch(type_close) + { + case CLOSE_SHORT: + type=POSITION_TYPE_SELL; + break; + case CLOSE_LONG: + type=POSITION_TYPE_BUY; + break; + default: + Print("Error! Signal to close not detected"); + return; + } + +//--- check all positions and close ours based on the signal + int positions=PositionsTotal(); + for(int i=positions-1; i>=0; i--) + { + ulong ticket=PositionGetTicket(i); + if(ticket!=0) + { + //--- get the name of the symbol and the position id (magic) + string symbol=PositionGetString(POSITION_SYMBOL); + long magic =PositionGetInteger(POSITION_MAGIC); + //--- if they correspond to our values + if(symbol==Symbol() && magic==InpMagicNumber) + { + if(PositionGetInteger(POSITION_TYPE)==type) + { + ExtTrade.PositionClose(ticket, InpSlippage); + ExtTrade.PrintResult(); + Print(" "); + } + } + } + } + } +//+------------------------------------------------------------------+ +//| Close positions upon holding time expiration in bars | +//+------------------------------------------------------------------+ +void CloseByTime() + { +//--- if there are no positions opened by our EA + if(PositionExist(ExtSignalOpen)==0) + return; + +//--- check all positions and close ours based on the holding time in bars + int positions=PositionsTotal(); + for(int i=positions-1; i>=0; i--) + { + ulong ticket=PositionGetTicket(i); + if(ticket!=0) + { + //--- get the name of the symbol and the position id (magic) + string symbol=PositionGetString(POSITION_SYMBOL); + long magic =PositionGetInteger(POSITION_MAGIC); + //--- if they correspond to our values + if(symbol==Symbol() && magic==InpMagicNumber) + { + //--- position opening time + datetime open_time=(datetime)PositionGetInteger(POSITION_TIME); + //--- check position holding time in bars + if(BarsHold(open_time)>=(int)InpDuration) + { + Print("\r\nTime to close position #", ticket); + ExtTrade.PositionClose(ticket, InpSlippage); + ExtTrade.PrintResult(); + Print(" "); + } + } + } + } + } +//+------------------------------------------------------------------+ +//| Returns true if there are open positions | +//+------------------------------------------------------------------+ +bool PositionExist(int signal_direction) + { + bool check_type=(signal_direction!=SIGNAL_NOT); + +//--- what positions to search + ENUM_POSITION_TYPE search_type=WRONG_VALUE; + if(check_type) + switch(signal_direction) + { + case SIGNAL_BUY: + search_type=POSITION_TYPE_BUY; + break; + case SIGNAL_SELL: + search_type=POSITION_TYPE_SELL; + break; + case CLOSE_LONG: + search_type=POSITION_TYPE_BUY; + break; + case CLOSE_SHORT: + search_type=POSITION_TYPE_SELL; + break; + default: + //--- entry direction is not specified; nothing to search + return(false); + } + +//--- go through the list of all positions + int positions=PositionsTotal(); + for(int i=0; i=(int)InpDuration)) + return(true); + } + } + } + +//--- open position not found + return(false); + } +//+------------------------------------------------------------------+ +//| Checks position closing time in bars | +//+------------------------------------------------------------------+ +int BarsHold(datetime open_time) + { +//--- first run a basic simple check + if(TimeCurrent()-open_timeAvgBody(1)) && // body of the candle is higher than average value of the body + (Close(1)CloseAvg(2)) && // uptrend + (Open(1)>Close(2))) // Open price of the bearish candle is higher than close price of the bullish candle + { + ExtPatternDetected=true; + ExtSignalOpen=SIGNAL_SELL; + ExtPatternInfo="\r\nBearish Engulfing detected"; + ExtDirection="Sell"; + return(true); + } + +//--- check Bullish Engulfing + if((Open(2)>Close(2)) && // previous candle is bearish + (Close(1)-Open(1)>AvgBody(1)) && // body of the bullish candle is higher than average value of the body + (Close(1)>Open(2)) && // close price of the bullish candle is higher than open price of the bearish candle + (MidOpenClose(2)60)) + { + ExtConfirmed=true; + ExtPatternInfo+="\r\n Confirmed: RSI>60"; + } + +//--- successful completion of the check + return(true); + } +//+------------------------------------------------------------------+ +//| Check if there is a signal to close | +//+------------------------------------------------------------------+ +bool CheckCloseSignal() + { + ExtSignalClose=false; +//--- if there is a signal to enter the market, do not check the signal to close + if(ExtSignalOpen!=SIGNAL_NOT) + return(true); + +//--- check if there is a signal to close a long position + if(((RSI(1)<70) && (RSI(2)>70)) || ((RSI(1)<30) && (RSI(2)>30))) + { + //--- there is a signal to close a long position + ExtSignalClose=CLOSE_LONG; + ExtDirection="Long"; + } + +//--- check if there is a signal to close a short position + if(((RSI(1)>30) && (RSI(2)<30)) || ((RSI(1)>70) && (RSI(2)<70))) + { + //--- there is a signal to close a short position + ExtSignalClose=CLOSE_SHORT; + ExtDirection="Short"; + } + +//--- successful completion of the check + return(true); + } +//+------------------------------------------------------------------+ +//| RSI indicator value at the specified bar | +//+------------------------------------------------------------------+ +double RSI(int index) + { + double indicator_values[]; + if(CopyBuffer(ExtIndicatorHandle, 0, index, 1, indicator_values)<0) + { + //--- if the copying fails, report the error code + PrintFormat("Failed to copy data from the RSI indicator, error code %d", GetLastError()); + return(EMPTY_VALUE); + } + return(indicator_values[0]); + } +//+------------------------------------------------------------------+ +//| SMA value at the specified bar | +//+------------------------------------------------------------------+ +double CloseAvg(int index) + { + double indicator_values[]; + if(CopyBuffer(ExtTrendMAHandle, 0, index, 1, indicator_values)<0) + { + //--- if the copying fails, report the error code + PrintFormat("Failed to copy data from the Simple Moving Average indicator, error code %d", GetLastError()); + return(EMPTY_VALUE); + } + return(indicator_values[0]); + } +//+------------------------------------------------------------------+ diff --git a/BKPS/14031206/Experts/Free Robots/BullishBearish Engulfing Stoch.ex5 b/BKPS/14031206/Experts/Free Robots/BullishBearish Engulfing Stoch.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..cee791387fbf795efd5d41b89d0980fb50b2aeff GIT binary patch literal 43960 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ʞ`0r#AE!+^f7OCo(a= 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 literal 0 HcmV?d00001 diff --git a/BKPS/14031206/Experts/Free Robots/BullishBearish Engulfing Stoch.mq5 b/BKPS/14031206/Experts/Free Robots/BullishBearish Engulfing Stoch.mq5 new file mode 100644 index 0000000..7437be3 --- /dev/null +++ b/BKPS/14031206/Experts/Free Robots/BullishBearish Engulfing Stoch.mq5 @@ -0,0 +1,688 @@ +//+------------------------------------------------------------------+ +//| BullishBearish Engulfing Stoch.mq5 | +//| Copyright 2024, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2024, MetaQuotes Ltd." +#property link "https://www.mql5.com" +#property version "1.00" + +#include +#include + +#define SIGNAL_BUY 1 // Buy signal +#define SIGNAL_NOT 0 // no trading signal +#define SIGNAL_SELL -1 // Sell signal + +#define CLOSE_LONG 2 // signal to close Long +#define CLOSE_SHORT -2 // signal to close Short + +//--- Input parameters +input int InpAverBodyPeriod=12; // period for calculating average candlestick size +input int InpMAPeriod =5; // Trend MA period +input int InpStochK =47; // period %K +input int InpStochD =9; // period %D +input int InpStochSlow=13; // smoothing period %K +input ENUM_STO_PRICE InpStochApplied =STO_LOWHIGH; // calculation type +input ENUM_MA_METHOD InpStochMA =MODE_SMA; // smoothing type + +//--- trade parameters +input uint InpDuration=10; // position holding time in bars +input uint InpSL =200; // Stop Loss in points +input uint InpTP =200; // Take Profit in points +input uint InpSlippage=10; // slippage in points +//--- money management parameters +input double InpLot =0.1; // lot +//--- Expert ID +input long InpMagicNumber=121400; // Magic Number + +//--- global variables +int ExtAvgBodyPeriod; // average candlestick calculation period +int ExtSignalOpen =0; // Buy/Sell signal +int ExtSignalClose =0; // signal to close a position +string ExtPatternInfo =""; // current pattern information +string ExtDirection =""; // position opening direction +bool ExtPatternDetected=false; // pattern detected +bool ExtConfirmed =false; // pattern confirmed +bool ExtCloseByTime =true; // requires closing by time +bool ExtCheckPassed =true; // status checking error + +//--- indicator handles +int ExtIndicatorHandle=INVALID_HANDLE; +int ExtTrendMAHandle =INVALID_HANDLE; + +//--- service objects +CTrade ExtTrade; +CSymbolInfo ExtSymbolInfo; +//+------------------------------------------------------------------+ +//| Expert initialization function | +//+------------------------------------------------------------------+ +int OnInit() + { + Print("InpSL=", InpSL); + Print("InpTP=", InpTP); +//--- set parameters for trading operations + ExtTrade.SetDeviationInPoints(InpSlippage); // slippage + ExtTrade.SetExpertMagicNumber(InpMagicNumber); // Expert Advisor ID + ExtTrade.LogLevel(LOG_LEVEL_ERRORS); // logging level + + ExtAvgBodyPeriod=InpAverBodyPeriod; +//--- indicator initialization + ExtIndicatorHandle=iStochastic(_Symbol, _Period, InpStochK, InpStochD, InpStochSlow, InpStochMA, InpStochApplied); + if(ExtIndicatorHandle==INVALID_HANDLE) + { + Print("Error creating iStochastic indicator"); + return(INIT_FAILED); + } + +//--- trend moving average + ExtTrendMAHandle=iMA(_Symbol, _Period, InpMAPeriod,0, MODE_SMA,PRICE_CLOSE); + if(ExtIndicatorHandle==INVALID_HANDLE) + { + Print("Error creating Moving Average indicator"); + return(INIT_FAILED); + } + +//--- OK + return(INIT_SUCCEEDED); + } +//+------------------------------------------------------------------+ +//| Expert deinitialization function | +//+------------------------------------------------------------------+ +void OnDeinit(const int reason) + { +//--- release indicator handle + IndicatorRelease(ExtIndicatorHandle); + } +//+------------------------------------------------------------------+ +//| Expert tick function | +//+------------------------------------------------------------------+ +void OnTick() + { +//--- save the next bar start time; all checks at bar opening only + static datetime next_bar_open=0; + +//--- Phase 1 - check the emergence of a new bar and update the status + if(TimeCurrent()>=next_bar_open) + { + //--- get the current state of environment on the new bar + // namely, set the values of global variables: + // ExtPatternDetected - pattern detection + // ExtConfirmed - pattern confirmation + // ExtSignalOpen - signal to open + // ExtSignalClose - signal to close + // ExtPatternInfo - current pattern information + if(CheckState()) + { + //--- set the new bar opening time + next_bar_open=TimeCurrent(); + next_bar_open-=next_bar_open%PeriodSeconds(_Period); + next_bar_open+=PeriodSeconds(_Period); + + //--- report the emergence of a new bar only once within a bar + if(ExtPatternDetected && ExtConfirmed) + Print(ExtPatternInfo); + } + else + { + //--- error getting the status, retry on the next tick + return; + } + } + +//--- Phase 2 - if there is a signal and no position in this direction + if(ExtSignalOpen && !PositionExist(ExtSignalOpen)) + { + Print("\r\nSignal to open position ", ExtDirection); + PositionOpen(); + if(PositionExist(ExtSignalOpen)) + ExtSignalOpen=SIGNAL_NOT; + } + +//--- Phase 3 - close if there is a signal to close + if(ExtSignalClose && PositionExist(ExtSignalClose)) + { + Print("\r\nSignal to close position ", ExtDirection); + CloseBySignal(ExtSignalClose); + if(!PositionExist(ExtSignalClose)) + ExtSignalClose=SIGNAL_NOT; + } + +//--- Phase 4 - close upon expiration + if(ExtCloseByTime && PositionExpiredByTimeExist()) + { + CloseByTime(); + ExtCloseByTime=PositionExpiredByTimeExist(); + } + } +//+------------------------------------------------------------------+ +//| Get the current environment and check for a pattern | +//+------------------------------------------------------------------+ +bool CheckState() + { +//--- check if there is a pattern + if(!CheckPattern()) + { + Print("Error, failed to check pattern"); + return(false); + } + +//--- check for confirmation + if(!CheckConfirmation()) + { + Print("Error, failed to check pattern confirmation"); + return(false); + } +//--- if there is no confirmation, cancel the signal + if(!ExtConfirmed) + ExtSignalOpen=SIGNAL_NOT; + +//--- check if there is a signal to close a position + if(!CheckCloseSignal()) + { + Print("Error, failed to check the closing signal"); + return(false); + } + +//--- if positions are to be closed after certain holding time in bars + if(InpDuration) + ExtCloseByTime=true; // set flag to close upon expiration + +//--- all checks done + return(true); + } +//+------------------------------------------------------------------+ +//| Open a position in the direction of the signal | +//+------------------------------------------------------------------+ +bool PositionOpen() + { + ExtSymbolInfo.Refresh(); + ExtSymbolInfo.RefreshRates(); + + double price=0; +//--- Stop Loss and Take Profit are not set by default + double stoploss=0.0; + double takeprofit=0.0; + + int digits=ExtSymbolInfo.Digits(); + double point=ExtSymbolInfo.Point(); + double spread=ExtSymbolInfo.Ask()-ExtSymbolInfo.Bid(); + +//--- uptrend + if(ExtSignalOpen==SIGNAL_BUY) + { + price=NormalizeDouble(ExtSymbolInfo.Ask(), digits); + //--- if Stop Loss is set + if(InpSL>0) + { + if(spread>=InpSL*point) + { + PrintFormat("StopLoss (%d points) <= current spread = %.0f points. Spread value will be used", InpSL, spread/point); + stoploss = NormalizeDouble(price-spread, digits); + } + else + stoploss = NormalizeDouble(price-InpSL*point, digits); + } + //--- if Take Profit is set + if(InpTP>0) + { + if(spread>=InpTP*point) + { + PrintFormat("TakeProfit (%d points) < current spread = %.0f points. Spread value will be used", InpTP, spread/point); + takeprofit = NormalizeDouble(price+spread, digits); + } + else + takeprofit = NormalizeDouble(price+InpTP*point, digits); + } + + if(!ExtTrade.Buy(InpLot, Symbol(), price, stoploss, takeprofit)) + { + PrintFormat("Failed %s buy %G at %G (sl=%G tp=%G) failed. Ask=%G error=%d", + Symbol(), InpLot, price, stoploss, takeprofit, ExtSymbolInfo.Ask(), GetLastError()); + return(false); + } + } + +//--- downtrend + if(ExtSignalOpen==SIGNAL_SELL) + { + price=NormalizeDouble(ExtSymbolInfo.Bid(), digits); + //--- if Stop Loss is set + if(InpSL>0) + { + if(spread>=InpSL*point) + { + PrintFormat("StopLoss (%d points) <= current spread = %.0f points. Spread value will be used", InpSL, spread/point); + stoploss = NormalizeDouble(price+spread, digits); + } + else + stoploss = NormalizeDouble(price+InpSL*point, digits); + } + //--- if Take Profit is set + if(InpTP>0) + { + if(spread>=InpTP*point) + { + PrintFormat("TakeProfit (%d points) < current spread = %.0f points. Spread value will be used", InpTP, spread/point); + takeprofit = NormalizeDouble(price-spread, digits); + } + else + takeprofit = NormalizeDouble(price-InpTP*point, digits); + } + + if(!ExtTrade.Sell(InpLot, Symbol(), price, stoploss, takeprofit)) + { + PrintFormat("Failed %s sell at %G (sl=%G tp=%G) failed. Bid=%G error=%d", + Symbol(), price, stoploss, takeprofit, ExtSymbolInfo.Bid(), GetLastError()); + ExtTrade.PrintResult(); + Print(" "); + return(false); + } + } +//--- + return(true); + } +//+------------------------------------------------------------------+ +//| Close a position based on the specified signal | +//+------------------------------------------------------------------+ +void CloseBySignal(int type_close) + { +//--- if there is no signal to close, return successful completion + if(type_close==SIGNAL_NOT) + return; +//--- if there are no positions opened by our EA + if(PositionExist(ExtSignalClose)==0) + return; + +//--- closing direction + long type; + switch(type_close) + { + case CLOSE_SHORT: + type=POSITION_TYPE_SELL; + break; + case CLOSE_LONG: + type=POSITION_TYPE_BUY; + break; + default: + Print("Error! Signal to close not detected"); + return; + } + +//--- check all positions and close ours based on the signal + int positions=PositionsTotal(); + for(int i=positions-1; i>=0; i--) + { + ulong ticket=PositionGetTicket(i); + if(ticket!=0) + { + //--- get the name of the symbol and the position id (magic) + string symbol=PositionGetString(POSITION_SYMBOL); + long magic =PositionGetInteger(POSITION_MAGIC); + //--- if they correspond to our values + if(symbol==Symbol() && magic==InpMagicNumber) + { + if(PositionGetInteger(POSITION_TYPE)==type) + { + ExtTrade.PositionClose(ticket, InpSlippage); + ExtTrade.PrintResult(); + Print(" "); + } + } + } + } + } +//+------------------------------------------------------------------+ +//| Close positions upon holding time expiration in bars | +//+------------------------------------------------------------------+ +void CloseByTime() + { +//--- if there are no positions opened by our EA + if(PositionExist(ExtSignalOpen)==0) + return; + +//--- check all positions and close ours based on the holding time in bars + int positions=PositionsTotal(); + for(int i=positions-1; i>=0; i--) + { + ulong ticket=PositionGetTicket(i); + if(ticket!=0) + { + //--- get the name of the symbol and the position id (magic) + string symbol=PositionGetString(POSITION_SYMBOL); + long magic =PositionGetInteger(POSITION_MAGIC); + //--- if they correspond to our values + if(symbol==Symbol() && magic==InpMagicNumber) + { + //--- position opening time + datetime open_time=(datetime)PositionGetInteger(POSITION_TIME); + //--- check position holding time in bars + if(BarsHold(open_time)>=(int)InpDuration) + { + Print("\r\nTime to close position #", ticket); + ExtTrade.PositionClose(ticket, InpSlippage); + ExtTrade.PrintResult(); + Print(" "); + } + } + } + } + } +//+------------------------------------------------------------------+ +//| Returns true if there are open positions | +//+------------------------------------------------------------------+ +bool PositionExist(int signal_direction) + { + bool check_type=(signal_direction!=SIGNAL_NOT); + +//--- what positions to search + ENUM_POSITION_TYPE search_type=WRONG_VALUE; + if(check_type) + switch(signal_direction) + { + case SIGNAL_BUY: + search_type=POSITION_TYPE_BUY; + break; + case SIGNAL_SELL: + search_type=POSITION_TYPE_SELL; + break; + case CLOSE_LONG: + search_type=POSITION_TYPE_BUY; + break; + case CLOSE_SHORT: + search_type=POSITION_TYPE_SELL; + break; + default: + //--- entry direction is not specified; nothing to search + return(false); + } + +//--- go through the list of all positions + int positions=PositionsTotal(); + for(int i=0; i=(int)InpDuration)) + return(true); + } + } + } + +//--- open position not found + return(false); + } + +//+------------------------------------------------------------------+ +//| Checks position closing time in bars | +//+------------------------------------------------------------------+ +int BarsHold(datetime open_time) + { +//--- first run a basic simple check + if(TimeCurrent()-open_timeAvgBody(1)) && // body of the candle is higher than average value of the body + (Close(1)CloseAvg(2)) && // uptrend + (Open(1)>Close(2))) // Open price of the bearish candle is higher than close price of the bullish candle + { + ExtPatternDetected=true; + ExtSignalOpen=SIGNAL_SELL; + ExtPatternInfo="\r\nBearish Engulfing detected"; + ExtDirection="Sell"; + return(true); + } + +//--- check Bullish Engulfing + if((Open(2)>Close(2)) && // previous candle is bearish + (Close(1)-Open(1)>AvgBody(1)) && // body of the bullish candle is higher than average value of the body + (Close(1)>Open(2)) && // close price of the bullish candle is higher than open price of the bearish candle + (MidOpenClose(2)70)) + { + ExtConfirmed=true; + ExtPatternInfo+="\r\n Confirmed: StochSignal>70"; + } + +//--- successful completion of the check + return(true); + } +//+------------------------------------------------------------------+ +//| Check if there is a signal to close | +//+------------------------------------------------------------------+ +bool CheckCloseSignal() + { + ExtSignalClose=false; +//--- if there is a signal to enter the market, do not check the signal to close + if(ExtSignalOpen!=SIGNAL_NOT) + return(true); + +//--- check if there is a signal to close a long position + if(((StochSignal(1)<80) && (StochSignal(2)>80))|| // 80 crossed downwards + ((StochSignal(1)<20) && (StochSignal(2)>20))) // 20 crossed downwards + { + //--- there is a signal to close a long position + ExtSignalClose=CLOSE_LONG; + ExtDirection="Long"; + } + +//--- check if there is a signal to close a short position + if((((StochSignal(1)>20) && (StochSignal(2)<20)) || // 20 crossed upwards + ((StochSignal(1)>80) && (StochSignal(2)<80)))) // 80 crossed upwards + { + //--- there is a signal to close a short position + ExtSignalClose=CLOSE_SHORT; + ExtDirection="Short"; + } + +//--- successful completion of the check + return(true); + } +//+------------------------------------------------------------------+ +//| Stochastic indicator value at the specified bar | +//+------------------------------------------------------------------+ +double StochSignal(int index) + { + double indicator_values[]; + if(CopyBuffer(ExtIndicatorHandle, SIGNAL_LINE, index, 1, indicator_values)<0) + { + //--- if the copying fails, report the error code + PrintFormat("Failed to copy data from the iStochastic indicator, error code %d", GetLastError()); + return(EMPTY_VALUE); + } + return(indicator_values[0]); + } +//+------------------------------------------------------------------+ +//| SMA value at the specified bar | +//+------------------------------------------------------------------+ +double CloseAvg(int index) + { + double indicator_values[]; + if(CopyBuffer(ExtTrendMAHandle, 0, index, 1, indicator_values)<0) + { + //--- if the copying fails, report the error code + PrintFormat("Failed to copy data from the Simple Moving Average indicator, error code %d", GetLastError()); + return(EMPTY_VALUE); + } + return(indicator_values[0]); + } +//+------------------------------------------------------------------+ diff --git a/BKPS/14031206/Experts/Free Robots/BullishBearish Harami CCI.ex5 b/BKPS/14031206/Experts/Free Robots/BullishBearish Harami CCI.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..ebf82d2a5792e9a7f074750a025a39ae6e6a4b85 GIT binary patch literal 44164 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 literal 0 HcmV?d00001 diff --git a/BKPS/14031206/Experts/Free Robots/BullishBearish Harami CCI.mq5 b/BKPS/14031206/Experts/Free Robots/BullishBearish Harami CCI.mq5 new file mode 100644 index 0000000..b61b438 --- /dev/null +++ b/BKPS/14031206/Experts/Free Robots/BullishBearish Harami CCI.mq5 @@ -0,0 +1,682 @@ +//+------------------------------------------------------------------+ +//| BullishBearish Harami CCI.mq5 | +//| Copyright 2024, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2024, MetaQuotes Ltd." +#property link "https://www.mql5.com" +#property version "1.00" + +#include +#include + +#define SIGNAL_BUY 1 // Buy signal +#define SIGNAL_NOT 0 // no trading signal +#define SIGNAL_SELL -1 // Sell signal + +#define CLOSE_LONG 2 // signal to close Long +#define CLOSE_SHORT -2 // signal to close Short + +//--- Input parameters +input int InpAverBodyPeriod=12; // period for calculating average candlestick size +input int InpMAPeriod =5; // Trend MA period +input int InpPeriodCCI =37; // CCI period +input ENUM_APPLIED_PRICE InpPrice=PRICE_CLOSE; // price type + +//--- trade parameters +input uint InpDuration=10; // position holding time in bars +input uint InpSL =200; // Stop Loss in points +input uint InpTP =200; // Take Profit in points +input uint InpSlippage=10; // slippage in points +//--- money management parameters +input double InpLot =0.1; // lot +//--- Expert ID +input long InpMagicNumber=122100; // Magic Number + +//--- global variables +int ExtAvgBodyPeriod; // average candlestick calculation period +int ExtSignalOpen =0; // Buy/Sell signal +int ExtSignalClose =0; // signal to close a position +string ExtPatternInfo =""; // current pattern information +string ExtDirection =""; // position opening direction +bool ExtPatternDetected=false; // pattern detected +bool ExtConfirmed =false; // pattern confirmed +bool ExtCloseByTime =true; // requires closing by time +bool ExtCheckPassed =true; // status checking error + +//--- indicator handles +int ExtIndicatorHandle=INVALID_HANDLE; +int ExtTrendMAHandle =INVALID_HANDLE; + +//--- service objects +CTrade ExtTrade; +CSymbolInfo ExtSymbolInfo; +//+------------------------------------------------------------------+ +//| Expert initialization function | +//+------------------------------------------------------------------+ +int OnInit() + { + Print("InpSL=", InpSL); + Print("InpTP=", InpTP); +//--- set parameters for trading operations + ExtTrade.SetDeviationInPoints(InpSlippage); // slippage + ExtTrade.SetExpertMagicNumber(InpMagicNumber); // Expert Advisor ID + ExtTrade.LogLevel(LOG_LEVEL_ERRORS); // logging level + + ExtAvgBodyPeriod=InpAverBodyPeriod; +//--- indicator initialization + ExtIndicatorHandle=iCCI(_Symbol, _Period, InpPeriodCCI, InpPrice); + if(ExtIndicatorHandle==INVALID_HANDLE) + { + Print("Error creating CCI indicator"); + return(INIT_FAILED); + } + +//--- trend moving average + ExtTrendMAHandle=iMA(_Symbol, _Period, InpMAPeriod, 0, MODE_SMA, PRICE_CLOSE); + if(ExtIndicatorHandle==INVALID_HANDLE) + { + Print("Error creating Moving Average indicator"); + return(INIT_FAILED); + } + +//--- OK + return(INIT_SUCCEEDED); + } +//+------------------------------------------------------------------+ +//| Expert deinitialization function | +//+------------------------------------------------------------------+ +void OnDeinit(const int reason) + { +//--- release indicator handle + IndicatorRelease(ExtIndicatorHandle); + } +//+------------------------------------------------------------------+ +//| Expert tick function | +//+------------------------------------------------------------------+ +void OnTick() + { +//--- save the next bar start time; all checks at bar opening only + static datetime next_bar_open=0; + +//--- Phase 1 - check the emergence of a new bar and update the status + if(TimeCurrent()>=next_bar_open) + { + //--- get the current state of environment on the new bar + // namely, set the values of global variables: + // ExtPatternDetected - pattern detection + // ExtConfirmed - pattern confirmation + // ExtSignalOpen - signal to open + // ExtSignalClose - signal to close + // ExtPatternInfo - current pattern information + if(CheckState()) + { + //--- set the new bar opening time + next_bar_open=TimeCurrent(); + next_bar_open-=next_bar_open%PeriodSeconds(_Period); + next_bar_open+=PeriodSeconds(_Period); + + //--- report the emergence of a new bar only once within a bar + if(ExtPatternDetected && ExtConfirmed) + Print(ExtPatternInfo); + } + else + { + //--- error getting the status, retry on the next tick + return; + } + } + +//--- Phase 2 - if there is a signal and no position in this direction + if(ExtSignalOpen && !PositionExist(ExtSignalOpen)) + { + Print("\r\nSignal to open position ", ExtDirection); + PositionOpen(); + if(PositionExist(ExtSignalOpen)) + ExtSignalOpen=SIGNAL_NOT; + } + +//--- Phase 3 - close if there is a signal to close + if(ExtSignalClose && PositionExist(ExtSignalClose)) + { + Print("\r\nSignal to close position ", ExtDirection); + CloseBySignal(ExtSignalClose); + if(!PositionExist(ExtSignalClose)) + ExtSignalClose=SIGNAL_NOT; + } + +//--- Phase 4 - close upon expiration + if(ExtCloseByTime && PositionExpiredByTimeExist()) + { + CloseByTime(); + ExtCloseByTime=PositionExpiredByTimeExist(); + } + } +//+------------------------------------------------------------------+ +//| Get the current environment and check for a pattern | +//+------------------------------------------------------------------+ +bool CheckState() + { +//--- check if there is a pattern + if(!CheckPattern()) + { + Print("Error, failed to check pattern"); + return(false); + } + +//--- check for confirmation + if(!CheckConfirmation()) + { + Print("Error, failed to check pattern confirmation"); + return(false); + } +//--- if there is no confirmation, cancel the signal + if(!ExtConfirmed) + ExtSignalOpen=SIGNAL_NOT; + +//--- check if there is a signal to close a position + if(!CheckCloseSignal()) + { + Print("Error, failed to check the closing signal"); + return(false); + } + +//--- if positions are to be closed after certain holding time in bars + if(InpDuration) + ExtCloseByTime=true; // set flag to close upon expiration + +//--- all checks done + return(true); + } +//+------------------------------------------------------------------+ +//| Open a position in the direction of the signal | +//+------------------------------------------------------------------+ +bool PositionOpen() + { + ExtSymbolInfo.Refresh(); + ExtSymbolInfo.RefreshRates(); + + double price=0; +//--- Stop Loss and Take Profit are not set by default + double stoploss=0.0; + double takeprofit=0.0; + + int digits=ExtSymbolInfo.Digits(); + double point=ExtSymbolInfo.Point(); + double spread=ExtSymbolInfo.Ask()-ExtSymbolInfo.Bid(); + +//--- uptrend + if(ExtSignalOpen==SIGNAL_BUY) + { + price=NormalizeDouble(ExtSymbolInfo.Ask(), digits); + //--- if Stop Loss is set + if(InpSL>0) + { + if(spread>=InpSL*point) + { + PrintFormat("StopLoss (%d points) <= current spread = %.0f points. Spread value will be used", InpSL, spread/point); + stoploss = NormalizeDouble(price-spread, digits); + } + else + stoploss = NormalizeDouble(price-InpSL*point, digits); + } + //--- if Take Profit is set + if(InpTP>0) + { + if(spread>=InpTP*point) + { + PrintFormat("TakeProfit (%d points) < current spread = %.0f points. Spread value will be used", InpTP, spread/point); + takeprofit = NormalizeDouble(price+spread, digits); + } + else + takeprofit = NormalizeDouble(price+InpTP*point, digits); + } + + if(!ExtTrade.Buy(InpLot, Symbol(), price, stoploss, takeprofit)) + { + PrintFormat("Failed %s buy %G at %G (sl=%G tp=%G) failed. Ask=%G error=%d", + Symbol(), InpLot, price, stoploss, takeprofit, ExtSymbolInfo.Ask(), GetLastError()); + return(false); + } + } + +//--- downtrend + if(ExtSignalOpen==SIGNAL_SELL) + { + price=NormalizeDouble(ExtSymbolInfo.Bid(), digits); + //--- if Stop Loss is set + if(InpSL>0) + { + if(spread>=InpSL*point) + { + PrintFormat("StopLoss (%d points) <= current spread = %.0f points. Spread value will be used", InpSL, spread/point); + stoploss = NormalizeDouble(price+spread, digits); + } + else + stoploss = NormalizeDouble(price+InpSL*point, digits); + } + //--- if Take Profit is set + if(InpTP>0) + { + if(spread>=InpTP*point) + { + PrintFormat("TakeProfit (%d points) < current spread = %.0f points. Spread value will be used", InpTP, spread/point); + takeprofit = NormalizeDouble(price-spread, digits); + } + else + takeprofit = NormalizeDouble(price-InpTP*point, digits); + } + + if(!ExtTrade.Sell(InpLot, Symbol(), price, stoploss, takeprofit)) + { + PrintFormat("Failed %s sell at %G (sl=%G tp=%G) failed. Bid=%G error=%d", + Symbol(), price, stoploss, takeprofit, ExtSymbolInfo.Bid(), GetLastError()); + ExtTrade.PrintResult(); + Print(" "); + return(false); + } + } + + return(true); + } +//+------------------------------------------------------------------+ +//| Close a position based on the specified signal | +//+------------------------------------------------------------------+ +void CloseBySignal(int type_close) + { +//--- if there is no signal to close, return successful completion + if(type_close==SIGNAL_NOT) + return; +//--- if there are no positions opened by our EA + if(PositionExist(ExtSignalClose)==0) + return; + +//--- closing direction + long type; + switch(type_close) + { + case CLOSE_SHORT: + type=POSITION_TYPE_SELL; + break; + case CLOSE_LONG: + type=POSITION_TYPE_BUY; + break; + default: + Print("Error! Signal to close not detected"); + return; + } + +//--- check all positions and close ours based on the signal + int positions=PositionsTotal(); + for(int i=positions-1; i>=0; i--) + { + ulong ticket=PositionGetTicket(i); + if(ticket!=0) + { + //--- get the name of the symbol and the position id (magic) + string symbol=PositionGetString(POSITION_SYMBOL); + long magic =PositionGetInteger(POSITION_MAGIC); + //--- if they correspond to our values + if(symbol==Symbol() && magic==InpMagicNumber) + { + if(PositionGetInteger(POSITION_TYPE)==type) + { + ExtTrade.PositionClose(ticket, InpSlippage); + ExtTrade.PrintResult(); + Print(" "); + } + } + } + } + } +//+------------------------------------------------------------------+ +//| Close positions upon holding time expiration in bars | +//+------------------------------------------------------------------+ +void CloseByTime() + { +//--- if there are no positions opened by our EA + if(PositionExist(ExtSignalOpen)==0) + return; + +//--- check all positions and close ours based on the holding time in bars + int positions=PositionsTotal(); + for(int i=positions-1; i>=0; i--) + { + ulong ticket=PositionGetTicket(i); + if(ticket!=0) + { + //--- get the name of the symbol and the position id (magic) + string symbol=PositionGetString(POSITION_SYMBOL); + long magic =PositionGetInteger(POSITION_MAGIC); + //--- if they correspond to our values + if(symbol==Symbol() && magic==InpMagicNumber) + { + //--- position opening time + datetime open_time=(datetime)PositionGetInteger(POSITION_TIME); + //--- check position holding time in bars + if(BarsHold(open_time)>=(int)InpDuration) + { + Print("\r\nTime to close position #", ticket); + ExtTrade.PositionClose(ticket, InpSlippage); + ExtTrade.PrintResult(); + Print(" "); + } + } + } + } + } +//+------------------------------------------------------------------+ +//| Returns true if there are open positions | +//+------------------------------------------------------------------+ +bool PositionExist(int signal_direction) + { + bool check_type=(signal_direction!=SIGNAL_NOT); + +//--- what positions to search + ENUM_POSITION_TYPE search_type=WRONG_VALUE; + if(check_type) + switch(signal_direction) + { + case SIGNAL_BUY: + search_type=POSITION_TYPE_BUY; + break; + case SIGNAL_SELL: + search_type=POSITION_TYPE_SELL; + break; + case CLOSE_LONG: + search_type=POSITION_TYPE_BUY; + break; + case CLOSE_SHORT: + search_type=POSITION_TYPE_SELL; + break; + default: + //--- entry direction is not specified; nothing to search + return(false); + } + +//--- go through the list of all positions + int positions=PositionsTotal(); + for(int i=0; i=(int)InpDuration)) + return(true); + } + } + } + +//--- open position not found + return(false); + } +//+------------------------------------------------------------------+ +//| Checks position closing time in bars | +//+------------------------------------------------------------------+ +int BarsHold(datetime open_time) + { +//--- first run a basic simple check + if(TimeCurrent()-open_timeAvgBody(1)) && // the previous candle is bullish, its body is greater than average (long white) + (Close(1)>Open(2)) && // close price of the bearish candle is higher than open price of the bullish candle + (Open(1)CloseAvg(2))) // up trend + { + ExtPatternDetected=true; + ExtSignalOpen=SIGNAL_SELL; + ExtPatternInfo="\r\nBearish Harami detected"; + ExtDirection="Sell"; + return(true); + } + +//--- check Bullish Harami + if((Close(1)>Open(1)) && // the last completed bar is bullish (white day) + ((Open(2)-Close(2))>AvgBody(1)) && // the previous candle is bearish, its body is greater than average (long black) + (Close(1)Close(2)) && // open price of the bullish candle is higher than close price of the bearish candle + (MidPoint(2)50)) + { + ExtConfirmed=true; + ExtPatternInfo+="\r\n Confirmed: CCI>50"; + } + +//--- successful completion of the check + return(true); + } +//+------------------------------------------------------------------+ +//| Check if there is a signal to close | +//+------------------------------------------------------------------+ +bool CheckCloseSignal() + { + ExtSignalClose=false; +//--- if there is a signal to enter the market, do not check the signal to close + if(ExtSignalOpen!=SIGNAL_NOT) + return(true); + +//--- check if there is a signal to close a long position + if(((CCI(1)<80) && (CCI(2)>80)) || ((CCI(1)<-80) && (CCI(2)>-80))) + { + //--- there is a signal to close a long position + ExtSignalClose=CLOSE_LONG; + ExtDirection="Long"; + } + +//--- check if there is a signal to close a short position + if(((CCI(1)>-80) && (CCI(2)<-80)) || ((CCI(1)>80) && (CCI(2)<80))) + { + //--- there is a signal to close a short position + ExtSignalClose=CLOSE_SHORT; + ExtDirection="Short"; + } + +//--- successful completion of the check + return(true); + } +//+------------------------------------------------------------------+ +//| CCI indicator value at the specified bar | +//+------------------------------------------------------------------+ +double CCI(int index) + { + double indicator_values[]; + if(CopyBuffer(ExtIndicatorHandle, 0, index, 1, indicator_values)<0) + { + //--- if the copying fails, report the error code + PrintFormat("Failed to copy data from the CCI indicator, error code %d", GetLastError()); + return(EMPTY_VALUE); + } + return(indicator_values[0]); + } +//+------------------------------------------------------------------+ +//| SMA value at the specified bar | +//+------------------------------------------------------------------+ +double CloseAvg(int index) + { + double indicator_values[]; + if(CopyBuffer(ExtTrendMAHandle, 0, index, 1, indicator_values)<0) + { + //--- if the copying fails, report the error code + PrintFormat("Failed to copy data from the Simple Moving Average indicator, error code %d", GetLastError()); + return(EMPTY_VALUE); + } + return(indicator_values[0]); + } +//+------------------------------------------------------------------+ diff --git a/BKPS/14031206/Experts/Free Robots/BullishBearish Harami MFI.ex5 b/BKPS/14031206/Experts/Free Robots/BullishBearish Harami MFI.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..33871696972b1515b26d1db3fc3b64638cbd1d85 GIT binary patch literal 43098 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 z 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 literal 0 HcmV?d00001 diff --git a/BKPS/14031206/Experts/Free Robots/BullishBearish Harami MFI.mq5 b/BKPS/14031206/Experts/Free Robots/BullishBearish Harami MFI.mq5 new file mode 100644 index 0000000..ff639f8 --- /dev/null +++ b/BKPS/14031206/Experts/Free Robots/BullishBearish Harami MFI.mq5 @@ -0,0 +1,682 @@ +//+------------------------------------------------------------------+ +//| BullishBearish Harami MFI.mq5 | +//| Copyright 2024, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2024, MetaQuotes Ltd." +#property link "https://www.mql5.com" +#property version "1.00" + +#include +#include + +#define SIGNAL_BUY 1 // Buy signal +#define SIGNAL_NOT 0 // no trading signal +#define SIGNAL_SELL -1 // Sell signal + +#define CLOSE_LONG 2 // signal to close Long +#define CLOSE_SHORT -2 // signal to close Short + +//--- Input parameters +input int InpAverBodyPeriod=12; // period for calculating average candlestick size +input int InpMAPeriod =5; // Trend MA period +input int InpPeriodMFI =37; // MFI period +input ENUM_APPLIED_VOLUME InpVolume=VOLUME_TICK; // volume type + +//--- trade parameters +input uint InpDuration=10; // position holding time in bars +input uint InpSL =200; // Stop Loss in points +input uint InpTP =200; // Take Profit in points +input uint InpSlippage=10; // slippage in points +//--- money management parameters +input double InpLot =0.1; // lot +//--- Expert ID +input long InpMagicNumber=121600; // Magic Number + +//--- global variables +int ExtAvgBodyPeriod; // average candlestick calculation period +int ExtSignalOpen =0; // Buy/Sell signal +int ExtSignalClose =0; // signal to close a position +string ExtPatternInfo =""; // current pattern information +string ExtDirection =""; // position opening direction +bool ExtPatternDetected=false; // pattern detected +bool ExtConfirmed =false; // pattern confirmed +bool ExtCloseByTime =true; // requires closing by time +bool ExtCheckPassed =true; // status checking error + +//--- indicator handles +int ExtIndicatorHandle=INVALID_HANDLE; +int ExtTrendMAHandle =INVALID_HANDLE; + +//--- service objects +CTrade ExtTrade; +CSymbolInfo ExtSymbolInfo; +//+------------------------------------------------------------------+ +//| Expert initialization function | +//+------------------------------------------------------------------+ +int OnInit() + { + Print("InpSL=", InpSL); + Print("InpTP=", InpTP); +//--- set parameters for trading operations + ExtTrade.SetDeviationInPoints(InpSlippage); // slippage + ExtTrade.SetExpertMagicNumber(InpMagicNumber); // Expert Advisor ID + ExtTrade.LogLevel(LOG_LEVEL_ERRORS); // logging level + + ExtAvgBodyPeriod=InpAverBodyPeriod; +//--- indicator initialization + ExtIndicatorHandle=iMFI(_Symbol, _Period, InpPeriodMFI, InpVolume); + if(ExtIndicatorHandle==INVALID_HANDLE) + { + Print("Error creating MFI indicator"); + return(INIT_FAILED); + } + +//--- trend moving average + ExtTrendMAHandle=iMA(_Symbol, _Period, InpMAPeriod, 0, MODE_SMA, PRICE_CLOSE); + if(ExtIndicatorHandle==INVALID_HANDLE) + { + Print("Error creating Moving Average indicator"); + return(INIT_FAILED); + } + +//--- OK + return(INIT_SUCCEEDED); + } +//+------------------------------------------------------------------+ +//| Expert deinitialization function | +//+------------------------------------------------------------------+ +void OnDeinit(const int reason) + { +//--- release indicator handle + IndicatorRelease(ExtIndicatorHandle); + } +//+------------------------------------------------------------------+ +//| Expert tick function | +//+------------------------------------------------------------------+ +void OnTick() + { +//--- save the next bar start time; all checks at bar opening only + static datetime next_bar_open=0; + +//--- Phase 1 - check the emergence of a new bar and update the status + if(TimeCurrent()>=next_bar_open) + { + //--- get the current state of environment on the new bar + // namely, set the values of global variables: + // ExtPatternDetected - pattern detection + // ExtConfirmed - pattern confirmation + // ExtSignalOpen - signal to open + // ExtSignalClose - signal to close + // ExtPatternInfo - current pattern information + if(CheckState()) + { + //--- set the new bar opening time + next_bar_open=TimeCurrent(); + next_bar_open-=next_bar_open%PeriodSeconds(_Period); + next_bar_open+=PeriodSeconds(_Period); + + //--- report the emergence of a new bar only once within a bar + if(ExtPatternDetected && ExtConfirmed) + Print(ExtPatternInfo); + } + else + { + //--- error getting the status, retry on the next tick + return; + } + } + +//--- Phase 2 - if there is a signal and no position in this direction + if(ExtSignalOpen && !PositionExist(ExtSignalOpen)) + { + Print("\r\nSignal to open position ", ExtDirection); + PositionOpen(); + if(PositionExist(ExtSignalOpen)) + ExtSignalOpen=SIGNAL_NOT; + } + +//--- Phase 3 - close if there is a signal to close + if(ExtSignalClose && PositionExist(ExtSignalClose)) + { + Print("\r\nSignal to close position ", ExtDirection); + CloseBySignal(ExtSignalClose); + if(!PositionExist(ExtSignalClose)) + ExtSignalClose=SIGNAL_NOT; + } + +//--- Phase 4 - close upon expiration + if(ExtCloseByTime && PositionExpiredByTimeExist()) + { + CloseByTime(); + ExtCloseByTime=PositionExpiredByTimeExist(); + } + } +//+------------------------------------------------------------------+ +//| Get the current environment and check for a pattern | +//+------------------------------------------------------------------+ +bool CheckState() + { +//--- check if there is a pattern + if(!CheckPattern()) + { + Print("Error, failed to check pattern"); + return(false); + } + +//--- check for confirmation + if(!CheckConfirmation()) + { + Print("Error, failed to check pattern confirmation"); + return(false); + } +//--- if there is no confirmation, cancel the signal + if(!ExtConfirmed) + ExtSignalOpen=SIGNAL_NOT; + +//--- check if there is a signal to close a position + if(!CheckCloseSignal()) + { + Print("Error, failed to check the closing signal"); + return(false); + } + +//--- if positions are to be closed after certain holding time in bars + if(InpDuration) + ExtCloseByTime=true; // set flag to close upon expiration + +//--- all checks done + return(true); + } +//+------------------------------------------------------------------+ +//| Open a position in the direction of the signal | +//+------------------------------------------------------------------+ +bool PositionOpen() + { + ExtSymbolInfo.Refresh(); + ExtSymbolInfo.RefreshRates(); + + double price=0; +//--- Stop Loss and Take Profit are not set by default + double stoploss=0.0; + double takeprofit=0.0; + + int digits=ExtSymbolInfo.Digits(); + double point=ExtSymbolInfo.Point(); + double spread=ExtSymbolInfo.Ask()-ExtSymbolInfo.Bid(); + +//--- uptrend + if(ExtSignalOpen==SIGNAL_BUY) + { + price=NormalizeDouble(ExtSymbolInfo.Ask(), digits); + //--- if Stop Loss is set + if(InpSL>0) + { + if(spread>=InpSL*point) + { + PrintFormat("StopLoss (%d points) <= current spread = %.0f points. Spread value will be used", InpSL, spread/point); + stoploss = NormalizeDouble(price-spread, digits); + } + else + stoploss = NormalizeDouble(price-InpSL*point, digits); + } + //--- if Take Profit is set + if(InpTP>0) + { + if(spread>=InpTP*point) + { + PrintFormat("TakeProfit (%d points) < current spread = %.0f points. Spread value will be used", InpTP, spread/point); + takeprofit = NormalizeDouble(price+spread, digits); + } + else + takeprofit = NormalizeDouble(price+InpTP*point, digits); + } + + if(!ExtTrade.Buy(InpLot, Symbol(), price, stoploss, takeprofit)) + { + PrintFormat("Failed %s buy %G at %G (sl=%G tp=%G) failed. Ask=%G error=%d", + Symbol(), InpLot, price, stoploss, takeprofit, ExtSymbolInfo.Ask(), GetLastError()); + return(false); + } + } + +//--- downtrend + if(ExtSignalOpen==SIGNAL_SELL) + { + price=NormalizeDouble(ExtSymbolInfo.Bid(), digits); + //--- if Stop Loss is set + if(InpSL>0) + { + if(spread>=InpSL*point) + { + PrintFormat("StopLoss (%d points) <= current spread = %.0f points. Spread value will be used", InpSL, spread/point); + stoploss = NormalizeDouble(price+spread, digits); + } + else + stoploss = NormalizeDouble(price+InpSL*point, digits); + } + //--- if Take Profit is set + if(InpTP>0) + { + if(spread>=InpTP*point) + { + PrintFormat("TakeProfit (%d points) < current spread = %.0f points. Spread value will be used", InpTP, spread/point); + takeprofit = NormalizeDouble(price-spread, digits); + } + else + takeprofit = NormalizeDouble(price-InpTP*point, digits); + } + + if(!ExtTrade.Sell(InpLot, Symbol(), price, stoploss, takeprofit)) + { + PrintFormat("Failed %s sell at %G (sl=%G tp=%G) failed. Bid=%G error=%d", + Symbol(), price, stoploss, takeprofit, ExtSymbolInfo.Bid(), GetLastError()); + ExtTrade.PrintResult(); + Print(" "); + return(false); + } + } + + return(true); + } +//+------------------------------------------------------------------+ +//| Close a position based on the specified signal | +//+------------------------------------------------------------------+ +void CloseBySignal(int type_close) + { +//--- if there is no signal to close, return successful completion + if(type_close==SIGNAL_NOT) + return; +//--- if there are no positions opened by our EA + if(PositionExist(ExtSignalClose)==0) + return; + +//--- closing direction + long type; + switch(type_close) + { + case CLOSE_SHORT: + type=POSITION_TYPE_SELL; + break; + case CLOSE_LONG: + type=POSITION_TYPE_BUY; + break; + default: + Print("Error! Signal to close not detected"); + return; + } + +//--- check all positions and close ours based on the signal + int positions=PositionsTotal(); + for(int i=positions-1; i>=0; i--) + { + ulong ticket=PositionGetTicket(i); + if(ticket!=0) + { + //--- get the name of the symbol and the position id (magic) + string symbol=PositionGetString(POSITION_SYMBOL); + long magic =PositionGetInteger(POSITION_MAGIC); + //--- if they correspond to our values + if(symbol==Symbol() && magic==InpMagicNumber) + { + if(PositionGetInteger(POSITION_TYPE)==type) + { + ExtTrade.PositionClose(ticket, InpSlippage); + ExtTrade.PrintResult(); + Print(" "); + } + } + } + } + } +//+------------------------------------------------------------------+ +//| Close positions upon holding time expiration in bars | +//+------------------------------------------------------------------+ +void CloseByTime() + { +//--- if there are no positions opened by our EA + if(PositionExist(ExtSignalOpen)==0) + return; + +//--- check all positions and close ours based on the holding time in bars + int positions=PositionsTotal(); + for(int i=positions-1; i>=0; i--) + { + ulong ticket=PositionGetTicket(i); + if(ticket!=0) + { + //--- get the name of the symbol and the position id (magic) + string symbol=PositionGetString(POSITION_SYMBOL); + long magic =PositionGetInteger(POSITION_MAGIC); + //--- if they correspond to our values + if(symbol==Symbol() && magic==InpMagicNumber) + { + //--- position opening time + datetime open_time=(datetime)PositionGetInteger(POSITION_TIME); + //--- check position holding time in bars + if(BarsHold(open_time)>=(int)InpDuration) + { + Print("\r\nTime to close position #", ticket); + ExtTrade.PositionClose(ticket, InpSlippage); + ExtTrade.PrintResult(); + Print(" "); + } + } + } + } + } +//+------------------------------------------------------------------+ +//| Returns true if there are open positions | +//+------------------------------------------------------------------+ +bool PositionExist(int signal_direction) + { + bool check_type=(signal_direction!=SIGNAL_NOT); + +//--- what positions to search + ENUM_POSITION_TYPE search_type=WRONG_VALUE; + if(check_type) + switch(signal_direction) + { + case SIGNAL_BUY: + search_type=POSITION_TYPE_BUY; + break; + case SIGNAL_SELL: + search_type=POSITION_TYPE_SELL; + break; + case CLOSE_LONG: + search_type=POSITION_TYPE_BUY; + break; + case CLOSE_SHORT: + search_type=POSITION_TYPE_SELL; + break; + default: + //--- entry direction is not specified; nothing to search + return(false); + } + +//--- go through the list of all positions + int positions=PositionsTotal(); + for(int i=0; i=(int)InpDuration)) + return(true); + } + } + } + +//--- open position not found + return(false); + } +//+------------------------------------------------------------------+ +//| Checks position closing time in bars | +//+------------------------------------------------------------------+ +int BarsHold(datetime open_time) + { +//--- first run a basic simple check + if(TimeCurrent()-open_timeAvgBody(1)) && // the previous candle is bullish, its body is greater than average (long white) + (Close(1)>Open(2)) && // close price of the bearish candle is higher than open price of the bullish candle + (Open(1)CloseAvg(2))) // up trend + { + ExtPatternDetected=true; + ExtSignalOpen=SIGNAL_SELL; + ExtPatternInfo="\r\nBearish Harami detected"; + ExtDirection="Sell"; + return(true); + } + +//--- check Bullish Harami + if((Close(1)>Open(1)) && // the last completed bar is bullish (white day) + ((Open(2)-Close(2))>AvgBody(1)) && // the previous candle is bearish, its body is greater than average (long black) + (Close(1)Close(2)) && // open price of the bullish candle is higher than close price of the bearish candle + (MidPoint(2)60)) + { + ExtConfirmed=true; + ExtPatternInfo+="\r\n Confirmed: MFI>60"; + } + +//--- successful completion of the check + return(true); + } +//+------------------------------------------------------------------+ +//| Check if there is a signal to close | +//+------------------------------------------------------------------+ +bool CheckCloseSignal() + { + ExtSignalClose=false; +//--- if there is a signal to enter the market, do not check the signal to close + if(ExtSignalOpen!=SIGNAL_NOT) + return(true); + +//--- check if there is a signal to close a long position + if(((MFI(1)<70) && (MFI(2)>70)) || ((MFI(1)<30) && (MFI(2)>30))) + { + //--- there is a signal to close a long position + ExtSignalClose=CLOSE_LONG; + ExtDirection="Long"; + } + +//--- check if there is a signal to close a short position + if(((MFI(1)>30) && (MFI(2)<30)) || ((MFI(1)>70) && (MFI(2)<70))) + { + //--- there is a signal to close a short position + ExtSignalClose=CLOSE_SHORT; + ExtDirection="Short"; + } + +//--- successful completion of the check + return(true); + } +//+------------------------------------------------------------------+ +//| MFI indicator value at the specified bar | +//+------------------------------------------------------------------+ +double MFI(int index) + { + double indicator_values[]; + if(CopyBuffer(ExtIndicatorHandle, 0, index, 1, indicator_values)<0) + { + //--- if the copying fails, report the error code + PrintFormat("Failed to copy data from the MFI indicator, error code %d", GetLastError()); + return(EMPTY_VALUE); + } + return(indicator_values[0]); + } +//+------------------------------------------------------------------+ +//| SMA value at the specified bar | +//+------------------------------------------------------------------+ +double CloseAvg(int index) + { + double indicator_values[]; + if(CopyBuffer(ExtTrendMAHandle, 0, index, 1, indicator_values)<0) + { + //--- if the copying fails, report the error code + PrintFormat("Failed to copy data from the Simple Moving Average indicator, error code %d", GetLastError()); + return(EMPTY_VALUE); + } + return(indicator_values[0]); + } +//+------------------------------------------------------------------+ diff --git a/BKPS/14031206/Experts/Free Robots/BullishBearish Harami RSI.ex5 b/BKPS/14031206/Experts/Free Robots/BullishBearish Harami RSI.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..26f0da0aa84cff4fe27f9703814d989ae50184b7 GIT binary patch literal 43322 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 QGaF%S=}6uYUgl_Ln@m0jY5)KL literal 0 HcmV?d00001 diff --git a/BKPS/14031206/Experts/Free Robots/BullishBearish Harami RSI.mq5 b/BKPS/14031206/Experts/Free Robots/BullishBearish Harami RSI.mq5 new file mode 100644 index 0000000..cf4082a --- /dev/null +++ b/BKPS/14031206/Experts/Free Robots/BullishBearish Harami RSI.mq5 @@ -0,0 +1,682 @@ +//+------------------------------------------------------------------+ +//| BullishBearish Harami RSI.mq5 | +//| Copyright 2024, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2024, MetaQuotes Ltd." +#property link "https://www.mql5.com" +#property version "1.00" + +#include +#include + +#define SIGNAL_BUY 1 // Buy signal +#define SIGNAL_NOT 0 // no trading signal +#define SIGNAL_SELL -1 // Sell signal + +#define CLOSE_LONG 2 // signal to close Long +#define CLOSE_SHORT -2 // signal to close Short + +//--- Input parameters +input int InpAverBodyPeriod=12; // period for calculating average candlestick size +input int InpMAPeriod =5; // Trend MA period +input int InpPeriodRSI =37; // RSI period +input ENUM_APPLIED_PRICE InpPrice=PRICE_CLOSE; // price type + +//--- trade parameters +input uint InpDuration=10; // position holding time in bars +input uint InpSL =200; // Stop Loss in points +input uint InpTP =200; // Take Profit in points +input uint InpSlippage=10; // slippage in points +//--- money management parameters +input double InpLot =0.1; // lot +//--- Expert ID +input long InpMagicNumber=121300; // Magic Number + +//--- global variables +int ExtAvgBodyPeriod; // average candlestick calculation period +int ExtSignalOpen =0; // Buy/Sell signal +int ExtSignalClose =0; // signal to close a position +string ExtPatternInfo =""; // current pattern information +string ExtDirection =""; // position opening direction +bool ExtPatternDetected=false; // pattern detected +bool ExtConfirmed =false; // pattern confirmed +bool ExtCloseByTime =true; // requires closing by time +bool ExtCheckPassed =true; // status checking error + +//--- indicator handles +int ExtIndicatorHandle=INVALID_HANDLE; +int ExtTrendMAHandle =INVALID_HANDLE; + +//--- service objects +CTrade ExtTrade; +CSymbolInfo ExtSymbolInfo; +//+------------------------------------------------------------------+ +//| Expert initialization function | +//+------------------------------------------------------------------+ +int OnInit() + { + Print("InpSL=", InpSL); + Print("InpTP=", InpTP); +//--- set parameters for trading operations + ExtTrade.SetDeviationInPoints(InpSlippage); // slippage + ExtTrade.SetExpertMagicNumber(InpMagicNumber); // Expert Advisor ID + ExtTrade.LogLevel(LOG_LEVEL_ERRORS); // logging level + + ExtAvgBodyPeriod=InpAverBodyPeriod; +//--- indicator initialization + ExtIndicatorHandle=iRSI(_Symbol, _Period, InpPeriodRSI, InpPrice); + if(ExtIndicatorHandle==INVALID_HANDLE) + { + Print("Error creating CCI indicator"); + return(INIT_FAILED); + } + +//--- trend moving average + ExtTrendMAHandle=iMA(_Symbol, _Period, InpMAPeriod, 0, MODE_SMA, PRICE_CLOSE); + if(ExtIndicatorHandle==INVALID_HANDLE) + { + Print("Error creating Moving Average indicator"); + return(INIT_FAILED); + } + +//--- OK + return(INIT_SUCCEEDED); + } +//+------------------------------------------------------------------+ +//| Expert deinitialization function | +//+------------------------------------------------------------------+ +void OnDeinit(const int reason) + { +//--- release indicator handle + IndicatorRelease(ExtIndicatorHandle); + } +//+------------------------------------------------------------------+ +//| Expert tick function | +//+------------------------------------------------------------------+ +void OnTick() + { +//--- save the next bar start time; all checks at bar opening only + static datetime next_bar_open=0; + +//--- Phase 1 - check the emergence of a new bar and update the status + if(TimeCurrent()>=next_bar_open) + { + //--- get the current state of environment on the new bar + // namely, set the values of global variables: + // ExtPatternDetected - pattern detection + // ExtConfirmed - pattern confirmation + // ExtSignalOpen - signal to open + // ExtSignalClose - signal to close + // ExtPatternInfo - current pattern information + if(CheckState()) + { + //--- set the new bar opening time + next_bar_open=TimeCurrent(); + next_bar_open-=next_bar_open%PeriodSeconds(_Period); + next_bar_open+=PeriodSeconds(_Period); + + //--- report the emergence of a new bar only once within a bar + if(ExtPatternDetected && ExtConfirmed) + Print(ExtPatternInfo); + } + else + { + //--- error getting the status, retry on the next tick + return; + } + } + +//--- Phase 2 - if there is a signal and no position in this direction + if(ExtSignalOpen && !PositionExist(ExtSignalOpen)) + { + Print("\r\nSignal to open position ", ExtDirection); + PositionOpen(); + if(PositionExist(ExtSignalOpen)) + ExtSignalOpen=SIGNAL_NOT; + } + +//--- Phase 3 - close if there is a signal to close + if(ExtSignalClose && PositionExist(ExtSignalClose)) + { + Print("\r\nSignal to close position ", ExtDirection); + CloseBySignal(ExtSignalClose); + if(!PositionExist(ExtSignalClose)) + ExtSignalClose=SIGNAL_NOT; + } + +//--- Phase 4 - close upon expiration + if(ExtCloseByTime && PositionExpiredByTimeExist()) + { + CloseByTime(); + ExtCloseByTime=PositionExpiredByTimeExist(); + } + } +//+------------------------------------------------------------------+ +//| Get the current environment and check for a pattern | +//+------------------------------------------------------------------+ +bool CheckState() + { +//--- check if there is a pattern + if(!CheckPattern()) + { + Print("Error, failed to check pattern"); + return(false); + } + +//--- check for confirmation + if(!CheckConfirmation()) + { + Print("Error, failed to check pattern confirmation"); + return(false); + } +//--- if there is no confirmation, cancel the signal + if(!ExtConfirmed) + ExtSignalOpen=SIGNAL_NOT; + +//--- check if there is a signal to close a position + if(!CheckCloseSignal()) + { + Print("Error, failed to check the closing signal"); + return(false); + } + +//--- if positions are to be closed after certain holding time in bars + if(InpDuration) + ExtCloseByTime=true; // set flag to close upon expiration + +//--- all checks done + return(true); + } +//+------------------------------------------------------------------+ +//| Open a position in the direction of the signal | +//+------------------------------------------------------------------+ +bool PositionOpen() + { + ExtSymbolInfo.Refresh(); + ExtSymbolInfo.RefreshRates(); + + double price=0; +//--- Stop Loss and Take Profit are not set by default + double stoploss=0.0; + double takeprofit=0.0; + + int digits=ExtSymbolInfo.Digits(); + double point=ExtSymbolInfo.Point(); + double spread=ExtSymbolInfo.Ask()-ExtSymbolInfo.Bid(); + +//--- uptrend + if(ExtSignalOpen==SIGNAL_BUY) + { + price=NormalizeDouble(ExtSymbolInfo.Ask(), digits); + //--- if Stop Loss is set + if(InpSL>0) + { + if(spread>=InpSL*point) + { + PrintFormat("StopLoss (%d points) <= current spread = %.0f points. Spread value will be used", InpSL, spread/point); + stoploss = NormalizeDouble(price-spread, digits); + } + else + stoploss = NormalizeDouble(price-InpSL*point, digits); + } + //--- if Take Profit is set + if(InpTP>0) + { + if(spread>=InpTP*point) + { + PrintFormat("TakeProfit (%d points) < current spread = %.0f points. Spread value will be used", InpTP, spread/point); + takeprofit = NormalizeDouble(price+spread, digits); + } + else + takeprofit = NormalizeDouble(price+InpTP*point, digits); + } + + if(!ExtTrade.Buy(InpLot, Symbol(), price, stoploss, takeprofit)) + { + PrintFormat("Failed %s buy %G at %G (sl=%G tp=%G) failed. Ask=%G error=%d", + Symbol(), InpLot, price, stoploss, takeprofit, ExtSymbolInfo.Ask(), GetLastError()); + return(false); + } + } + +//--- downtrend + if(ExtSignalOpen==SIGNAL_SELL) + { + price=NormalizeDouble(ExtSymbolInfo.Bid(), digits); + //--- if Stop Loss is set + if(InpSL>0) + { + if(spread>=InpSL*point) + { + PrintFormat("StopLoss (%d points) <= current spread = %.0f points. Spread value will be used", InpSL, spread/point); + stoploss = NormalizeDouble(price+spread, digits); + } + else + stoploss = NormalizeDouble(price+InpSL*point, digits); + } + //--- if Take Profit is set + if(InpTP>0) + { + if(spread>=InpTP*point) + { + PrintFormat("TakeProfit (%d points) < current spread = %.0f points. Spread value will be used", InpTP, spread/point); + takeprofit = NormalizeDouble(price-spread, digits); + } + else + takeprofit = NormalizeDouble(price-InpTP*point, digits); + } + + if(!ExtTrade.Sell(InpLot, Symbol(), price, stoploss, takeprofit)) + { + PrintFormat("Failed %s sell at %G (sl=%G tp=%G) failed. Bid=%G error=%d", + Symbol(), price, stoploss, takeprofit, ExtSymbolInfo.Bid(), GetLastError()); + ExtTrade.PrintResult(); + Print(" "); + return(false); + } + } + + return(true); + } +//+------------------------------------------------------------------+ +//| Close a position based on the specified signal | +//+------------------------------------------------------------------+ +void CloseBySignal(int type_close) + { +//--- if there is no signal to close, return successful completion + if(type_close==SIGNAL_NOT) + return; +//--- if there are no positions opened by our EA + if(PositionExist(ExtSignalClose)==0) + return; + +//--- closing direction + long type; + switch(type_close) + { + case CLOSE_SHORT: + type=POSITION_TYPE_SELL; + break; + case CLOSE_LONG: + type=POSITION_TYPE_BUY; + break; + default: + Print("Error! Signal to close not detected"); + return; + } + +//--- check all positions and close ours based on the signal + int positions=PositionsTotal(); + for(int i=positions-1; i>=0; i--) + { + ulong ticket=PositionGetTicket(i); + if(ticket!=0) + { + //--- get the name of the symbol and the position id (magic) + string symbol=PositionGetString(POSITION_SYMBOL); + long magic =PositionGetInteger(POSITION_MAGIC); + //--- if they correspond to our values + if(symbol==Symbol() && magic==InpMagicNumber) + { + if(PositionGetInteger(POSITION_TYPE)==type) + { + ExtTrade.PositionClose(ticket, InpSlippage); + ExtTrade.PrintResult(); + Print(" "); + } + } + } + } + } +//+------------------------------------------------------------------+ +//| Close positions upon holding time expiration in bars | +//+------------------------------------------------------------------+ +void CloseByTime() + { +//--- if there are no positions opened by our EA + if(PositionExist(ExtSignalOpen)==0) + return; + +//--- check all positions and close ours based on the holding time in bars + int positions=PositionsTotal(); + for(int i=positions-1; i>=0; i--) + { + ulong ticket=PositionGetTicket(i); + if(ticket!=0) + { + //--- get the name of the symbol and the position id (magic) + string symbol=PositionGetString(POSITION_SYMBOL); + long magic =PositionGetInteger(POSITION_MAGIC); + //--- if they correspond to our values + if(symbol==Symbol() && magic==InpMagicNumber) + { + //--- position opening time + datetime open_time=(datetime)PositionGetInteger(POSITION_TIME); + //--- check position holding time in bars + if(BarsHold(open_time)>=(int)InpDuration) + { + Print("\r\nTime to close position #", ticket); + ExtTrade.PositionClose(ticket, InpSlippage); + ExtTrade.PrintResult(); + Print(" "); + } + } + } + } + } +//+------------------------------------------------------------------+ +//| Returns true if there are open positions | +//+------------------------------------------------------------------+ +bool PositionExist(int signal_direction) + { + bool check_type=(signal_direction!=SIGNAL_NOT); + +//--- what positions to search + ENUM_POSITION_TYPE search_type=WRONG_VALUE; + if(check_type) + switch(signal_direction) + { + case SIGNAL_BUY: + search_type=POSITION_TYPE_BUY; + break; + case SIGNAL_SELL: + search_type=POSITION_TYPE_SELL; + break; + case CLOSE_LONG: + search_type=POSITION_TYPE_BUY; + break; + case CLOSE_SHORT: + search_type=POSITION_TYPE_SELL; + break; + default: + //--- entry direction is not specified; nothing to search + return(false); + } + +//--- go through the list of all positions + int positions=PositionsTotal(); + for(int i=0; i=(int)InpDuration)) + return(true); + } + } + } + +//--- open position not found + return(false); + } +//+------------------------------------------------------------------+ +//| Checks position closing time in bars | +//+------------------------------------------------------------------+ +int BarsHold(datetime open_time) + { +//--- first run a basic simple check + if(TimeCurrent()-open_timeAvgBody(1)) && // the previous candle is bullish, its body is greater than average (long white) + (Close(1)>Open(2)) && // close price of the bearish candle is higher than open price of the bullish candle + (Open(1)CloseAvg(2))) // up trend + { + ExtPatternDetected=true; + ExtSignalOpen=SIGNAL_SELL; + ExtPatternInfo="\r\nBearish Harami detected"; + ExtDirection="Sell"; + return(true); + } + +//--- check Bullish Harami + if((Close(1)>Open(1)) && // the last completed bar is bullish (white day) + ((Open(2)-Close(2))>AvgBody(1)) && // the previous candle is bearish, its body is greater than average (long black) + (Close(1)Close(2)) && // open price of the bullish candle is higher than close price of the bearish candle + (MidPoint(2)60)) + { + ExtConfirmed=true; + ExtPatternInfo+="\r\n Confirmed: RSI>60"; + } + +//--- successful completion of the check + return(true); + } +//+------------------------------------------------------------------+ +//| Check if there is a signal to close | +//+------------------------------------------------------------------+ +bool CheckCloseSignal() + { + ExtSignalClose=false; +//--- if there is a signal to enter the market, do not check the signal to close + if(ExtSignalOpen!=SIGNAL_NOT) + return(true); + +//--- check if there is a signal to close a long position + if(((RSI(1)<70) && (RSI(2)>70)) || ((RSI(1)<30) && (RSI(2)>30))) + { + //--- there is a signal to close a long position + ExtSignalClose=CLOSE_LONG; + ExtDirection="Long"; + } + +//--- check if there is a signal to close a short position + if(((RSI(1)>30) && (RSI(2)<30)) || ((RSI(1)>70) && (RSI(2)<70))) + { + //--- there is a signal to close a short position + ExtSignalClose=CLOSE_SHORT; + ExtDirection="Short"; + } + +//--- successful completion of the check + return(true); + } +//+------------------------------------------------------------------+ +//| RSI indicator value at the specified bar | +//+------------------------------------------------------------------+ +double RSI(int index) + { + double indicator_values[]; + if(CopyBuffer(ExtIndicatorHandle, 0, index, 1, indicator_values)<0) + { + //--- if the copying fails, report the error code + PrintFormat("Failed to copy data from the RSI indicator, error code %d", GetLastError()); + return(EMPTY_VALUE); + } + return(indicator_values[0]); + } +//+------------------------------------------------------------------+ +//| SMA value at the specified bar | +//+------------------------------------------------------------------+ +double CloseAvg(int index) + { + double indicator_values[]; + if(CopyBuffer(ExtTrendMAHandle, 0, index, 1, indicator_values)<0) + { + //--- if the copying fails, report the error code + PrintFormat("Failed to copy data from the Simple Moving Average indicator, error code %d", GetLastError()); + return(EMPTY_VALUE); + } + return(indicator_values[0]); + } +//+------------------------------------------------------------------+ diff --git a/BKPS/14031206/Experts/Free Robots/BullishBearish Harami Stoch.ex5 b/BKPS/14031206/Experts/Free Robots/BullishBearish Harami Stoch.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..4e16774701f1e2696c02909fa3313fc40e163f23 GIT binary patch literal 43996 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 literal 0 HcmV?d00001 diff --git a/BKPS/14031206/Experts/Free Robots/BullishBearish Harami Stoch.mq5 b/BKPS/14031206/Experts/Free Robots/BullishBearish Harami Stoch.mq5 new file mode 100644 index 0000000..10c4b8a --- /dev/null +++ b/BKPS/14031206/Experts/Free Robots/BullishBearish Harami Stoch.mq5 @@ -0,0 +1,685 @@ +//+------------------------------------------------------------------+ +//| BullishBearish Harami Stoch.mq5 | +//| Copyright 2024, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2024, MetaQuotes Ltd." +#property link "https://www.mql5.com" +#property version "1.00" + +#include +#include + +#define SIGNAL_BUY 1 // Buy signal +#define SIGNAL_NOT 0 // no trading signal +#define SIGNAL_SELL -1 // Sell signal + +#define CLOSE_LONG 2 // signal to close Long +#define CLOSE_SHORT -2 // signal to close Short + +//--- Input parameters +input int InpAverBodyPeriod=12; // period for calculating average candlestick size +input int InpMAPeriod =5; // Trend MA period +input int InpStochK =47; // period %K +input int InpStochD =9; // period %D +input int InpStochSlow =13; // smoothing period %K +input ENUM_STO_PRICE InpStochApplied=STO_LOWHIGH; // calculation type +input ENUM_MA_METHOD InpStochMA =MODE_SMA; // smoothing type + +//--- trade parameters +input uint InpDuration=10; // position holding time in bars +input uint InpSL =200; // Stop Loss in points +input uint InpTP =200; // Take Profit in points +input uint InpSlippage=10; // slippage in points +//--- money management parameters +input double InpLot =0.1; // lot +//--- Expert ID +input long InpMagicNumber=122400; // Magic Number + +//--- global variables +int ExtAvgBodyPeriod; // average candlestick calculation period +int ExtSignalOpen =0; // Buy/Sell signal +int ExtSignalClose =0; // signal to close a position +string ExtPatternInfo =""; // current pattern information +string ExtDirection =""; // position opening direction +bool ExtPatternDetected=false; // pattern detected +bool ExtConfirmed =false; // pattern confirmed +bool ExtCloseByTime =true; // requires closing by time +bool ExtCheckPassed =true; // status checking error + +//--- indicator handles +int ExtIndicatorHandle=INVALID_HANDLE; +int ExtTrendMAHandle =INVALID_HANDLE; + +//--- service objects +CTrade ExtTrade; +CSymbolInfo ExtSymbolInfo; +//+------------------------------------------------------------------+ +//| Expert initialization function | +//+------------------------------------------------------------------+ +int OnInit() + { + Print("InpSL=", InpSL); + Print("InpTP=", InpTP); +//--- set parameters for trading operations + ExtTrade.SetDeviationInPoints(InpSlippage); // slippage + ExtTrade.SetExpertMagicNumber(InpMagicNumber); // Expert Advisor ID + ExtTrade.LogLevel(LOG_LEVEL_ERRORS); // logging level + + ExtAvgBodyPeriod=InpAverBodyPeriod; +//--- indicator initialization + ExtIndicatorHandle=iStochastic(_Symbol, _Period, InpStochK, InpStochD, InpStochSlow, InpStochMA, InpStochApplied); + if(ExtIndicatorHandle==INVALID_HANDLE) + { + Print("Error creating iStochastic indicator"); + return(INIT_FAILED); + } + +//--- trend moving average + ExtTrendMAHandle=iMA(_Symbol, _Period, InpMAPeriod, 0, MODE_SMA, PRICE_CLOSE); + if(ExtIndicatorHandle==INVALID_HANDLE) + { + Print("Error creating Moving Average indicator"); + return(INIT_FAILED); + } + +//--- OK + return(INIT_SUCCEEDED); + } +//+------------------------------------------------------------------+ +//| Expert deinitialization function | +//+------------------------------------------------------------------+ +void OnDeinit(const int reason) + { +//--- release indicator handle + IndicatorRelease(ExtIndicatorHandle); + } +//+------------------------------------------------------------------+ +//| Expert tick function | +//+------------------------------------------------------------------+ +void OnTick() + { +//--- save the next bar start time; all checks at bar opening only + static datetime next_bar_open=0; + +//--- Phase 1 - check the emergence of a new bar and update the status + if(TimeCurrent()>=next_bar_open) + { + //--- get the current state of environment on the new bar + // namely, set the values of global variables: + // ExtPatternDetected - pattern detection + // ExtConfirmed - pattern confirmation + // ExtSignalOpen - signal to open + // ExtSignalClose - signal to close + // ExtPatternInfo - current pattern information + if(CheckState()) + { + //--- set the new bar opening time + next_bar_open=TimeCurrent(); + next_bar_open-=next_bar_open%PeriodSeconds(_Period); + next_bar_open+=PeriodSeconds(_Period); + + //--- report the emergence of a new bar only once within a bar + if(ExtPatternDetected && ExtConfirmed) + Print(ExtPatternInfo); + } + else + { + //--- error getting the status, retry on the next tick + return; + } + } + +//--- Phase 2 - if there is a signal and no position in this direction + if(ExtSignalOpen && !PositionExist(ExtSignalOpen)) + { + Print("\r\nSignal to open position ", ExtDirection); + PositionOpen(); + if(PositionExist(ExtSignalOpen)) + ExtSignalOpen=SIGNAL_NOT; + } + +//--- Phase 3 - close if there is a signal to close + if(ExtSignalClose && PositionExist(ExtSignalClose)) + { + Print("\r\nSignal to close position ", ExtDirection); + CloseBySignal(ExtSignalClose); + if(!PositionExist(ExtSignalClose)) + ExtSignalClose=SIGNAL_NOT; + } + +//--- Phase 4 - close upon expiration + if(ExtCloseByTime && PositionExpiredByTimeExist()) + { + CloseByTime(); + ExtCloseByTime=PositionExpiredByTimeExist(); + } + } +//+------------------------------------------------------------------+ +//| Get the current environment and check for a pattern | +//+------------------------------------------------------------------+ +bool CheckState() + { +//--- check if there is a pattern + if(!CheckPattern()) + { + Print("Error, failed to check pattern"); + return(false); + } + +//--- check for confirmation + if(!CheckConfirmation()) + { + Print("Error, failed to check pattern confirmation"); + return(false); + } +//--- if there is no confirmation, cancel the signal + if(!ExtConfirmed) + ExtSignalOpen=SIGNAL_NOT; + +//--- check if there is a signal to close a position + if(!CheckCloseSignal()) + { + Print("Error, failed to check the closing signal"); + return(false); + } + +//--- if positions are to be closed after certain holding time in bars + if(InpDuration) + ExtCloseByTime=true; // set flag to close upon expiration + +//--- all checks done + return(true); + } +//+------------------------------------------------------------------+ +//| Open a position in the direction of the signal | +//+------------------------------------------------------------------+ +bool PositionOpen() + { + ExtSymbolInfo.Refresh(); + ExtSymbolInfo.RefreshRates(); + + double price=0; +//--- Stop Loss and Take Profit are not set by default + double stoploss=0.0; + double takeprofit=0.0; + + int digits=ExtSymbolInfo.Digits(); + double point=ExtSymbolInfo.Point(); + double spread=ExtSymbolInfo.Ask()-ExtSymbolInfo.Bid(); + +//--- uptrend + if(ExtSignalOpen==SIGNAL_BUY) + { + price=NormalizeDouble(ExtSymbolInfo.Ask(), digits); + //--- if Stop Loss is set + if(InpSL>0) + { + if(spread>=InpSL*point) + { + PrintFormat("StopLoss (%d points) <= current spread = %.0f points. Spread value will be used", InpSL, spread/point); + stoploss = NormalizeDouble(price-spread, digits); + } + else + stoploss = NormalizeDouble(price-InpSL*point, digits); + } + //--- if Take Profit is set + if(InpTP>0) + { + if(spread>=InpTP*point) + { + PrintFormat("TakeProfit (%d points) < current spread = %.0f points. Spread value will be used", InpTP, spread/point); + takeprofit = NormalizeDouble(price+spread, digits); + } + else + takeprofit = NormalizeDouble(price+InpTP*point, digits); + } + + if(!ExtTrade.Buy(InpLot, Symbol(), price, stoploss, takeprofit)) + { + PrintFormat("Failed %s buy %G at %G (sl=%G tp=%G) failed. Ask=%G error=%d", + Symbol(), InpLot, price, stoploss, takeprofit, ExtSymbolInfo.Ask(), GetLastError()); + return(false); + } + } +//--- downtrend + if(ExtSignalOpen==SIGNAL_SELL) + { + price=NormalizeDouble(ExtSymbolInfo.Bid(), digits); + //--- if Stop Loss is set + if(InpSL>0) + { + if(spread>=InpSL*point) + { + PrintFormat("StopLoss (%d points) <= current spread = %.0f points. Spread value will be used", InpSL, spread/point); + stoploss = NormalizeDouble(price+spread, digits); + } + else + stoploss = NormalizeDouble(price+InpSL*point, digits); + } + //--- if Take Profit is set + if(InpTP>0) + { + if(spread>=InpTP*point) + { + PrintFormat("TakeProfit (%d points) < current spread = %.0f points. Spread value will be used", InpTP, spread/point); + takeprofit = NormalizeDouble(price-spread, digits); + } + else + takeprofit = NormalizeDouble(price-InpTP*point, digits); + } + + if(!ExtTrade.Sell(InpLot, Symbol(), price, stoploss, takeprofit)) + { + PrintFormat("Failed %s sell at %G (sl=%G tp=%G) failed. Bid=%G error=%d", + Symbol(), price, stoploss, takeprofit, ExtSymbolInfo.Bid(), GetLastError()); + ExtTrade.PrintResult(); + Print(" "); + return(false); + } + } + + return(true); + } +//+------------------------------------------------------------------+ +//| Close a position based on the specified signal | +//+------------------------------------------------------------------+ +void CloseBySignal(int type_close) + { +//--- if there is no signal to close, return successful completion + if(type_close==SIGNAL_NOT) + return; +//--- if there are no positions opened by our EA + if(PositionExist(ExtSignalClose)==0) + return; + +//--- closing direction + long type; + switch(type_close) + { + case CLOSE_SHORT: + type=POSITION_TYPE_SELL; + break; + case CLOSE_LONG: + type=POSITION_TYPE_BUY; + break; + default: + Print("Error! Signal to close not detected"); + return; + } + +//--- check all positions and close ours based on the signal + int positions=PositionsTotal(); + for(int i=positions-1; i>=0; i--) + { + ulong ticket=PositionGetTicket(i); + if(ticket!=0) + { + //--- get the name of the symbol and the position id (magic) + string symbol=PositionGetString(POSITION_SYMBOL); + long magic =PositionGetInteger(POSITION_MAGIC); + //--- if they correspond to our values + if(symbol==Symbol() && magic==InpMagicNumber) + { + if(PositionGetInteger(POSITION_TYPE)==type) + { + ExtTrade.PositionClose(ticket, InpSlippage); + ExtTrade.PrintResult(); + Print(" "); + } + } + } + } + } +//+------------------------------------------------------------------+ +//| Close positions upon holding time expiration in bars | +//+------------------------------------------------------------------+ +void CloseByTime() + { +//--- if there are no positions opened by our EA + if(PositionExist(ExtSignalOpen)==0) + return; + +//--- check all positions and close ours based on the holding time in bars + int positions=PositionsTotal(); + for(int i=positions-1; i>=0; i--) + { + ulong ticket=PositionGetTicket(i); + if(ticket!=0) + { + //--- get the name of the symbol and the position id (magic) + string symbol=PositionGetString(POSITION_SYMBOL); + long magic =PositionGetInteger(POSITION_MAGIC); + //--- if they correspond to our values + if(symbol==Symbol() && magic==InpMagicNumber) + { + //--- position opening time + datetime open_time=(datetime)PositionGetInteger(POSITION_TIME); + //--- check position holding time in bars + if(BarsHold(open_time)>=(int)InpDuration) + { + Print("\r\nTime to close position #", ticket); + ExtTrade.PositionClose(ticket, InpSlippage); + ExtTrade.PrintResult(); + Print(" "); + } + } + } + } + } +//+------------------------------------------------------------------+ +//| Returns true if there are open positions | +//+------------------------------------------------------------------+ +bool PositionExist(int signal_direction) + { + bool check_type=(signal_direction!=SIGNAL_NOT); + +//--- what positions to search + ENUM_POSITION_TYPE search_type=WRONG_VALUE; + if(check_type) + switch(signal_direction) + { + case SIGNAL_BUY: + search_type=POSITION_TYPE_BUY; + break; + case SIGNAL_SELL: + search_type=POSITION_TYPE_SELL; + break; + case CLOSE_LONG: + search_type=POSITION_TYPE_BUY; + break; + case CLOSE_SHORT: + search_type=POSITION_TYPE_SELL; + break; + default: + //--- entry direction is not specified; nothing to search + return(false); + } + +//--- go through the list of all positions + int positions=PositionsTotal(); + for(int i=0; i=(int)InpDuration)) + return(true); + } + } + } +//--- open position not found + return(false); + } + +//+------------------------------------------------------------------+ +//| Checks position closing time in bars | +//+------------------------------------------------------------------+ +int BarsHold(datetime open_time) + { +//--- first run a basic simple check + if(TimeCurrent()-open_timeAvgBody(1)) && // the previous candle is bullish, its body is greater than average (long white) + (Close(1)>Open(2)) && // close price of the bearish candle is higher than open price of the bullish candle + (Open(1)CloseAvg(2))) // up trend + { + ExtPatternDetected=true; + ExtSignalOpen=SIGNAL_SELL; + ExtPatternInfo="\r\nBearish Harami detected"; + ExtDirection="Sell"; + return(true); + } + +//--- check Bullish Harami + if((Close(1)>Open(1)) && // the last completed bar is bullish (white day) + ((Open(2)-Close(2))>AvgBody(1)) && // the previous candle is bearish, its body is greater than average (long black) + (Close(1)Close(2)) && // open price of the bullish candle is higher than close price of the bearish candle + (MidPoint(2)70)) + { + ExtConfirmed=true; + ExtPatternInfo+="\r\n Confirmed: StochSignal>70"; + } + +//--- successful completion of the check + return(true); + } +//+------------------------------------------------------------------+ +//| Check if there is a signal to close | +//+------------------------------------------------------------------+ +bool CheckCloseSignal() + { + ExtSignalClose=false; +//--- if there is a signal to enter the market, do not check the signal to close + if(ExtSignalOpen!=SIGNAL_NOT) + return(true); + +//--- check if there is a signal to close a long position + if(((StochSignal(1)<80) && (StochSignal(2)>80))|| // 80 crossed downwards + ((StochSignal(1)<20) && (StochSignal(2)>20))) // 20 crossed downwards + { + //--- there is a signal to close a long position + ExtSignalClose=CLOSE_LONG; + ExtDirection="Long"; + } + +//--- check if there is a signal to close a short position + if((((StochSignal(1)>20) && (StochSignal(2)<20)) || // 20 crossed upwards + ((StochSignal(1)>80) && (StochSignal(2)<80)))) // 80 crossed upwards + { + //--- there is a signal to close a short position + ExtSignalClose=CLOSE_SHORT; + ExtDirection="Short"; + } + +//--- successful completion of the check + return(true); + } +//+------------------------------------------------------------------+ +//| Stochastic indicator value at the specified bar | +//+------------------------------------------------------------------+ +double StochSignal(int index) + { + double indicator_values[]; + if(CopyBuffer(ExtIndicatorHandle, SIGNAL_LINE, index, 1, indicator_values)<0) + { + //--- if the copying fails, report the error code + PrintFormat("Failed to copy data from the iStochastic indicator, error code %d", GetLastError()); + return(EMPTY_VALUE); + } + return(indicator_values[0]); + } +//+------------------------------------------------------------------+ +//| SMA value at the specified bar | +//+------------------------------------------------------------------+ +double CloseAvg(int index) + { + double indicator_values[]; + if(CopyBuffer(ExtTrendMAHandle, 0, index, 1, indicator_values)<0) + { + //--- if the copying fails, report the error code + PrintFormat("Failed to copy data from the Simple Moving Average indicator, error code %d", GetLastError()); + return(EMPTY_VALUE); + } + return(indicator_values[0]); + } +//+------------------------------------------------------------------+ diff --git a/BKPS/14031206/Experts/Free Robots/BullishBearish MeetingLines CCI.ex5 b/BKPS/14031206/Experts/Free Robots/BullishBearish MeetingLines CCI.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..3a01619c1880a61e6a50d690f267761e3bfb570c GIT binary patch literal 42860 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

c-Vqc)Bn*iVd)$=9&&=5Bgu%8 z4L)PFh^hw44#sn5rK%g-s&na>*d>=rww!m~*7@F7hUpR4+7b~(gX0B6<1Rzn!BP+- zZOVJ9R1n*AjN3VgZk);8D|wgDEdlqKW#K%HQd-H-o6hd9%PF6k+fvZk8SJ&sw6X$nlh zGt?^xqPBI^B0Y!apB`Jxl=r~lG0FGFmO`a%KAAzLCQ>A{mJv$Pwh9_FyI~+IrPljR zAVQvErd|uLQU!aAS|gcw${2)Q%dw2}>kjj5oBk%{RKfg*anW-E3j`D!0Fh5p?nDWT z)Q0vXXc@F+4#^3UvB$Aq$R+S$KRJ8$*(@h`5<>z#i-yqPm}R2uw6uLekttV!Q81P) z=K7_1)J$h38oZbo;Nsb0zoH~^pu(g@I+%@Em+Q5chE>mVD?#)BT59Q2d6Y$S?hoi$d(*1FC6{dFL`qb-aYjch1vUT`^g7M0 z1@f$&(dv4rLp5V0gWs5@&3c6C^ktV8RnBsZ3F|IIk$$!^qKpuT;2&=mFzzcRNr%leEgaJ4-Bx}Qp!(=SpCI;Sn`p-I z3H;jAJ?1gW(T}+MPv@904k&8HII9T^V3AOZ*>1SVfK7_joSbDTc@aMj-U(ur^bW6= cJ83d758kj$jBSt3B?V`Vu&rve#9$dzpmNaPH2?qr literal 0 HcmV?d00001 diff --git a/BKPS/14031206/Experts/Free Robots/BullishBearish MeetingLines CCI.mq5 b/BKPS/14031206/Experts/Free Robots/BullishBearish MeetingLines CCI.mq5 new file mode 100644 index 0000000..761f926 --- /dev/null +++ b/BKPS/14031206/Experts/Free Robots/BullishBearish MeetingLines CCI.mq5 @@ -0,0 +1,654 @@ +//+------------------------------------------------------------------+ +//| BullishBearish MeetingLines CCI.mq5 | +//| Copyright 2024, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2024, MetaQuotes Ltd." +#property link "https://www.mql5.com" +#property version "1.00" + +#include +#include + +#define SIGNAL_BUY 1 // Buy signal +#define SIGNAL_NOT 0 // no trading signal +#define SIGNAL_SELL -1 // Sell signal + +#define CLOSE_LONG 2 // signal to close Long +#define CLOSE_SHORT -2 // signal to close Short + +//--- Input parameters +input int InpAverBodyPeriod=12; // period for calculating average candlestick size +input int InpPeriodCCI =37; // CCI period +input ENUM_APPLIED_PRICE InpPrice=PRICE_CLOSE; // price type + +//--- trade parameters +input uint InpDuration=10; // position holding time in bars +input uint InpSL =200; // Stop Loss in points +input uint InpTP =200; // Take Profit in points +input uint InpSlippage=10; // slippage in points +//--- money management parameters +input double InpLot =0.1; // lot +//--- Expert ID +input long InpMagicNumber=123100; // Magic Number + +//--- global variables +int ExtAvgBodyPeriod; // average candlestick calculation period +int ExtSignalOpen =0; // Buy/Sell signal +int ExtSignalClose =0; // signal to close a position +string ExtPatternInfo =""; // current pattern information +string ExtDirection =""; // position opening direction +bool ExtPatternDetected=false; // pattern detected +bool ExtConfirmed =false; // pattern confirmed +bool ExtCloseByTime =true; // requires closing by time +bool ExtCheckPassed =true; // status checking error + +//--- indicator handle +int ExtIndicatorHandle=INVALID_HANDLE; + +//--- service objects +CTrade ExtTrade; +CSymbolInfo ExtSymbolInfo; +//+------------------------------------------------------------------+ +//| Expert initialization function | +//+------------------------------------------------------------------+ +int OnInit() + { + Print("InpSL=", InpSL); + Print("InpTP=", InpTP); +//--- set parameters for trading operations + ExtTrade.SetDeviationInPoints(InpSlippage); // slippage + ExtTrade.SetExpertMagicNumber(InpMagicNumber); // Expert Advisor ID + ExtTrade.LogLevel(LOG_LEVEL_ERRORS); // logging level + + ExtAvgBodyPeriod=InpAverBodyPeriod; +//--- indicator initialization + ExtIndicatorHandle=iCCI(_Symbol, _Period, InpPeriodCCI, InpPrice); + if(ExtIndicatorHandle==INVALID_HANDLE) + { + Print("Error creating CCI indicator"); + return(INIT_FAILED); + } +//--- OK + return(INIT_SUCCEEDED); + } +//+------------------------------------------------------------------+ +//| Expert deinitialization function | +//+------------------------------------------------------------------+ +void OnDeinit(const int reason) + { +//--- release indicator handle + IndicatorRelease(ExtIndicatorHandle); + } +//+------------------------------------------------------------------+ +//| Expert tick function | +//+------------------------------------------------------------------+ +void OnTick() + { +//--- save the next bar start time; all checks at bar opening only + static datetime next_bar_open=0; + +//--- Phase 1 - check the emergence of a new bar and update the status + if(TimeCurrent()>=next_bar_open) + { + //--- get the current state of environment on the new bar + // namely, set the values of global variables: + // ExtPatternDetected - pattern detection + // ExtConfirmed - pattern confirmation + // ExtSignalOpen - signal to open + // ExtSignalClose - signal to close + // ExtPatternInfo - current pattern information + if(CheckState()) + { + //--- set the new bar opening time + next_bar_open=TimeCurrent(); + next_bar_open-=next_bar_open%PeriodSeconds(_Period); + next_bar_open+=PeriodSeconds(_Period); + + //--- report the emergence of a new bar only once within a bar + if(ExtPatternDetected && ExtConfirmed) + Print(ExtPatternInfo); + } + else + { + //--- error getting the status, retry on the next tick + return; + } + } + +//--- Phase 2 - if there is a signal and no position in this direction + if(ExtSignalOpen && !PositionExist(ExtSignalOpen)) + { + Print("\r\nSignal to open position ", ExtDirection); + PositionOpen(); + if(PositionExist(ExtSignalOpen)) + ExtSignalOpen=SIGNAL_NOT; + } + +//--- Phase 3 - close if there is a signal to close + if(ExtSignalClose && PositionExist(ExtSignalClose)) + { + Print("\r\nSignal to close position ", ExtDirection); + CloseBySignal(ExtSignalClose); + if(!PositionExist(ExtSignalClose)) + ExtSignalClose=SIGNAL_NOT; + } + +//--- Phase 4 - close upon expiration + if(ExtCloseByTime && PositionExpiredByTimeExist()) + { + CloseByTime(); + ExtCloseByTime=PositionExpiredByTimeExist(); + } + } +//+------------------------------------------------------------------+ +//| Get the current environment and check for a pattern | +//+------------------------------------------------------------------+ +bool CheckState() + { +//--- check if there is a pattern + if(!CheckPattern()) + { + Print("Error, failed to check pattern"); + return(false); + } + +//--- check for confirmation + if(!CheckConfirmation()) + { + Print("Error, failed to check pattern confirmation"); + return(false); + } +//--- if there is no confirmation, cancel the signal + if(!ExtConfirmed) + ExtSignalOpen=SIGNAL_NOT; + +//--- check if there is a signal to close a position + if(!CheckCloseSignal()) + { + Print("Error, failed to check the closing signal"); + return(false); + } + +//--- if positions are to be closed after certain holding time in bars + if(InpDuration) + ExtCloseByTime=true; // set flag to close upon expiration + +//--- all checks done + return(true); + } +//+------------------------------------------------------------------+ +//| Open a position in the direction of the signal | +//+------------------------------------------------------------------+ +bool PositionOpen() + { + ExtSymbolInfo.Refresh(); + ExtSymbolInfo.RefreshRates(); + + double price=0; +//--- Stop Loss and Take Profit are not set by default + double stoploss=0.0; + double takeprofit=0.0; + + int digits=ExtSymbolInfo.Digits(); + double point=ExtSymbolInfo.Point(); + double spread=ExtSymbolInfo.Ask()-ExtSymbolInfo.Bid(); + +//--- uptrend + if(ExtSignalOpen==SIGNAL_BUY) + { + price=NormalizeDouble(ExtSymbolInfo.Ask(), digits); + //--- if Stop Loss is set + if(InpSL>0) + { + if(spread>=InpSL*point) + { + PrintFormat("StopLoss (%d points) <= current spread = %.0f points. Spread value will be used", InpSL, spread/point); + stoploss = NormalizeDouble(price-spread, digits); + } + else + stoploss = NormalizeDouble(price-InpSL*point, digits); + } + //--- if Take Profit is set + if(InpTP>0) + { + if(spread>=InpTP*point) + { + PrintFormat("TakeProfit (%d points) < current spread = %.0f points. Spread value will be used", InpTP, spread/point); + takeprofit = NormalizeDouble(price+spread, digits); + } + else + takeprofit = NormalizeDouble(price+InpTP*point, digits); + } + + if(!ExtTrade.Buy(InpLot, Symbol(), price, stoploss, takeprofit)) + { + PrintFormat("Failed %s buy %G at %G (sl=%G tp=%G) failed. Ask=%G error=%d", + Symbol(), InpLot, price, stoploss, takeprofit, ExtSymbolInfo.Ask(), GetLastError()); + return(false); + } + } + +//--- downtrend + if(ExtSignalOpen==SIGNAL_SELL) + { + price=NormalizeDouble(ExtSymbolInfo.Bid(), digits); + //--- if Stop Loss is set + if(InpSL>0) + { + if(spread>=InpSL*point) + { + PrintFormat("StopLoss (%d points) <= current spread = %.0f points. Spread value will be used", InpSL, spread/point); + stoploss = NormalizeDouble(price+spread, digits); + } + else + stoploss = NormalizeDouble(price+InpSL*point, digits); + } + //--- if Take Profit is set + if(InpTP>0) + { + if(spread>=InpTP*point) + { + PrintFormat("TakeProfit (%d points) < current spread = %.0f points. Spread value will be used", InpTP, spread/point); + takeprofit = NormalizeDouble(price-spread, digits); + } + else + takeprofit = NormalizeDouble(price-InpTP*point, digits); + } + + if(!ExtTrade.Sell(InpLot, Symbol(), price, stoploss, takeprofit)) + { + PrintFormat("Failed %s sell at %G (sl=%G tp=%G) failed. Bid=%G error=%d", + Symbol(), price, stoploss, takeprofit, ExtSymbolInfo.Bid(), GetLastError()); + ExtTrade.PrintResult(); + Print(" "); + return(false); + } + } + + return(true); + } +//+------------------------------------------------------------------+ +//| Close a position based on the specified signal | +//+------------------------------------------------------------------+ +void CloseBySignal(int type_close) + { +//--- if there is no signal to close, return successful completion + if(type_close==SIGNAL_NOT) + return; +//--- if there are no positions opened by our EA + if(PositionExist(ExtSignalClose)==0) + return; + +//--- closing direction + long type; + switch(type_close) + { + case CLOSE_SHORT: + type=POSITION_TYPE_SELL; + break; + case CLOSE_LONG: + type=POSITION_TYPE_BUY; + break; + default: + Print("Error! Signal to close not detected"); + return; + } + +//--- check all positions and close ours based on the signal + int positions=PositionsTotal(); + for(int i=positions-1; i>=0; i--) + { + ulong ticket=PositionGetTicket(i); + if(ticket!=0) + { + //--- get the name of the symbol and the position id (magic) + string symbol=PositionGetString(POSITION_SYMBOL); + long magic =PositionGetInteger(POSITION_MAGIC); + //--- if they correspond to our values + if(symbol==Symbol() && magic==InpMagicNumber) + { + if(PositionGetInteger(POSITION_TYPE)==type) + { + ExtTrade.PositionClose(ticket, InpSlippage); + ExtTrade.PrintResult(); + Print(" "); + } + } + } + } + } +//+------------------------------------------------------------------+ +//| Close positions upon holding time expiration in bars | +//+------------------------------------------------------------------+ +void CloseByTime() + { +//--- if there are no positions opened by our EA + if(PositionExist(ExtSignalOpen)==0) + return; + +//--- check all positions and close ours based on the holding time in bars + int positions=PositionsTotal(); + for(int i=positions-1; i>=0; i--) + { + ulong ticket=PositionGetTicket(i); + if(ticket!=0) + { + //--- get the name of the symbol and the position id (magic) + string symbol=PositionGetString(POSITION_SYMBOL); + long magic =PositionGetInteger(POSITION_MAGIC); + //--- if they correspond to our values + if(symbol==Symbol() && magic==InpMagicNumber) + { + //--- position opening time + datetime open_time=(datetime)PositionGetInteger(POSITION_TIME); + //--- check position holding time in bars + if(BarsHold(open_time)>=(int)InpDuration) + { + Print("\r\nTime to close position #", ticket); + ExtTrade.PositionClose(ticket, InpSlippage); + ExtTrade.PrintResult(); + Print(" "); + } + } + } + } + } +//+------------------------------------------------------------------+ +//| Returns true if there are open positions | +//+------------------------------------------------------------------+ +bool PositionExist(int signal_direction) + { + bool check_type=(signal_direction!=SIGNAL_NOT); + +//--- what positions to search + ENUM_POSITION_TYPE search_type=WRONG_VALUE; + if(check_type) + switch(signal_direction) + { + case SIGNAL_BUY: + search_type=POSITION_TYPE_BUY; + break; + case SIGNAL_SELL: + search_type=POSITION_TYPE_SELL; + break; + case CLOSE_LONG: + search_type=POSITION_TYPE_BUY; + break; + case CLOSE_SHORT: + search_type=POSITION_TYPE_SELL; + break; + default: + //--- entry direction is not specified; nothing to search + return(false); + } + +//--- go through the list of all positions + int positions=PositionsTotal(); + for(int i=0; i=(int)InpDuration)) + return(true); + } + } + } + +//--- open position not found + return(false); + } +//+------------------------------------------------------------------+ +//| Checks position closing time in bars | +//+------------------------------------------------------------------+ +int BarsHold(datetime open_time) + { +//--- first run a basic simple check + if(TimeCurrent()-open_timeAvgBody(1)) && // long white candle + ((Open(1)-Close(1))>AvgBody(1)) && // long black candle + (MathAbs(Close(1)-Close(2))<0.1*AvgBody(1))) // doji close + { + ExtPatternDetected=true; + ExtSignalOpen=SIGNAL_SELL; + ExtPatternInfo="\r\nBearish MeetingLines detected"; + ExtDirection="Sell"; + return(true); + } + +//--- check Bullish MeetingLines + if((Open(2)-Close(2)>AvgBody(1)) && // long black candle + ((Close(1)-Open(1))>AvgBody(1)) && // long white candle + (MathAbs(Close(1)-Close(2))<0.1*AvgBody(1))) // doji close + { + ExtPatternDetected=true; + ExtSignalOpen=SIGNAL_BUY; + ExtPatternInfo="\r\nBullish MeetingLines detected"; + ExtDirection="Buy"; + return(true); + } + +//--- result of checking + return(ExtCheckPassed); + } + +//+------------------------------------------------------------------+ +//| Returns true in case of successful confirmation check | +//+------------------------------------------------------------------+ +bool CheckConfirmation() + { + ExtConfirmed=false; +//--- if there is no pattern, do not search for confirmation + if(!ExtPatternDetected) + return(true); + +//--- get the value of the stochastic indicator to confirm the signal + double signal=CCI(1); + if(signal==EMPTY_VALUE) + { + //--- failed to get indicator value, check failed + return(false); + } + +//--- check the Buy signal + if(ExtSignalOpen==SIGNAL_BUY && (signal<-50)) + { + ExtConfirmed=true; + ExtPatternInfo+="\r\n Confirmed: CCI<-50"; + } + +//--- check the Sell signal + if(ExtSignalOpen==SIGNAL_SELL && (signal>50)) + { + ExtConfirmed=true; + ExtPatternInfo+="\r\n Confirmed: CCI>50"; + } + +//--- successful completion of the check + return(true); + } +//+------------------------------------------------------------------+ +//| Check if there is a signal to close | +//+------------------------------------------------------------------+ +bool CheckCloseSignal() + { + ExtSignalClose=false; +//--- if there is a signal to enter the market, do not check the signal to close + if(ExtSignalOpen!=SIGNAL_NOT) + return(true); + +//--- check if there is a signal to close a long position + if(((CCI(1)<80) && (CCI(2)>80)) || ((CCI(1)<-80) && (CCI(2)>-80))) + { + //--- there is a signal to close a long position + ExtSignalClose=CLOSE_LONG; + ExtDirection="Long"; + } + +//--- check if there is a signal to close a short position + if(((CCI(1)>-80) && (CCI(2)<-80)) || ((CCI(1)>80) && (CCI(2)<80))) + { + //--- there is a signal to close a short position + ExtSignalClose=CLOSE_SHORT; + ExtDirection="Short"; + } + +//--- successful completion of the check + return(true); + } +//+------------------------------------------------------------------+ +//| CCI indicator value at the specified bar | +//+------------------------------------------------------------------+ +double CCI(int index) + { + double indicator_values[]; + if(CopyBuffer(ExtIndicatorHandle, 0, index, 1, indicator_values)<0) + { + //--- if the copying fails, report the error code + PrintFormat("Failed to copy data from the CCI indicator, error code %d", GetLastError()); + return(EMPTY_VALUE); + } + return(indicator_values[0]); + } +//+------------------------------------------------------------------+ diff --git a/BKPS/14031206/Experts/Free Robots/BullishBearish MeetingLines MFI.ex5 b/BKPS/14031206/Experts/Free Robots/BullishBearish MeetingLines MFI.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..cca7e4119e6e80fcf67e1f28539f35aef2c4e428 GIT binary patch literal 42300 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 literal 0 HcmV?d00001 diff --git a/BKPS/14031206/Experts/Free Robots/BullishBearish MeetingLines MFI.mq5 b/BKPS/14031206/Experts/Free Robots/BullishBearish MeetingLines MFI.mq5 new file mode 100644 index 0000000..375c13d --- /dev/null +++ b/BKPS/14031206/Experts/Free Robots/BullishBearish MeetingLines MFI.mq5 @@ -0,0 +1,652 @@ +//+------------------------------------------------------------------+ +//| BullishBearish MeetingLines MFI.mq5 | +//| Copyright 2024, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2024, MetaQuotes Ltd." +#property link "https://www.mql5.com" +#property version "1.00" + +#include +#include + +#define SIGNAL_BUY 1 // Buy signal +#define SIGNAL_NOT 0 // no trading signal +#define SIGNAL_SELL -1 // Sell signal + +#define CLOSE_LONG 2 // signal to close Long +#define CLOSE_SHORT -2 // signal to close Short + +//--- Input parameters +input int InpAverBodyPeriod=12; // period for calculating average candlestick size +input int InpPeriodMFI =37; // MFI period +input ENUM_APPLIED_VOLUME InpVolume=VOLUME_TICK; // volume type + +//--- trade parameters +input uint InpDuration=10; // position holding time in bars +input uint InpSL =200; // Stop Loss in points +input uint InpTP =200; // Take Profit in points +input uint InpSlippage=10; // slippage in points +//--- money management parameters +input double InpLot=0.1; // lot +//--- Expert ID +input long InpMagicNumber=121200; // Magic Number + +//--- global variables +int ExtAvgBodyPeriod; // average candlestick calculation period +int ExtSignalOpen =0; // Buy/Sell signal +int ExtSignalClose =0; // signal to close a position +string ExtPatternInfo =""; // current pattern information +string ExtDirection =""; // position opening direction +bool ExtPatternDetected=false; // pattern detected +bool ExtConfirmed =false; // pattern confirmed +bool ExtCloseByTime =true; // requires closing by time +bool ExtCheckPassed =true; // status checking error +//--- indicator handle +int ExtIndicatorHandle=INVALID_HANDLE; + +//--- service objects +CTrade ExtTrade; +CSymbolInfo ExtSymbolInfo; +//+------------------------------------------------------------------+ +//| Expert initialization function | +//+------------------------------------------------------------------+ +int OnInit() + { + Print("InpSL=", InpSL); + Print("InpTP=", InpTP); +//--- set parameters for trading operations + ExtTrade.SetDeviationInPoints(InpSlippage); // slippage + ExtTrade.SetExpertMagicNumber(InpMagicNumber); // Expert Advisor ID + ExtTrade.LogLevel(LOG_LEVEL_ERRORS); // logging level + + ExtAvgBodyPeriod=InpAverBodyPeriod; +//--- indicator initialization + ExtIndicatorHandle=iMFI(_Symbol, _Period, InpPeriodMFI, InpVolume); + if(ExtIndicatorHandle==INVALID_HANDLE) + { + Print("Error creating MFI indicator"); + return(INIT_FAILED); + } +//--- OK + return(INIT_SUCCEEDED); + } +//+------------------------------------------------------------------+ +//| Expert deinitialization function | +//+------------------------------------------------------------------+ +void OnDeinit(const int reason) + { +//--- release indicator handle + IndicatorRelease(ExtIndicatorHandle); + } +//+------------------------------------------------------------------+ +//| Expert tick function | +//+------------------------------------------------------------------+ +void OnTick() + { +//--- save the next bar start time; all checks at bar opening only + static datetime next_bar_open=0; + +//--- Phase 1 - check the emergence of a new bar and update the status + if(TimeCurrent()>=next_bar_open) + { + //--- get the current state of environment on the new bar + // namely, set the values of global variables: + // ExtPatternDetected - pattern detection + // ExtConfirmed - pattern confirmation + // ExtSignalOpen - signal to open + // ExtSignalClose - signal to close + // ExtPatternInfo - current pattern information + if(CheckState()) + { + //--- set the new bar opening time + next_bar_open=TimeCurrent(); + next_bar_open-=next_bar_open%PeriodSeconds(_Period); + next_bar_open+=PeriodSeconds(_Period); + + //--- report the emergence of a new bar only once within a bar + if(ExtPatternDetected && ExtConfirmed) + Print(ExtPatternInfo); + } + else + { + //--- error getting the status, retry on the next tick + return; + } + } + +//--- Phase 2 - if there is a signal and no position in this direction + if(ExtSignalOpen && !PositionExist(ExtSignalOpen)) + { + Print("\r\nSignal to open position ", ExtDirection); + PositionOpen(); + if(PositionExist(ExtSignalOpen)) + ExtSignalOpen=SIGNAL_NOT; + } + +//--- Phase 3 - close if there is a signal to close + if(ExtSignalClose && PositionExist(ExtSignalClose)) + { + Print("\r\nSignal to close position ", ExtDirection); + CloseBySignal(ExtSignalClose); + if(!PositionExist(ExtSignalClose)) + ExtSignalClose=SIGNAL_NOT; + } + +//--- Phase 4 - close upon expiration + if(ExtCloseByTime && PositionExpiredByTimeExist()) + { + CloseByTime(); + ExtCloseByTime=PositionExpiredByTimeExist(); + } + } +//+------------------------------------------------------------------+ +//| Get the current environment and check for a pattern | +//+------------------------------------------------------------------+ +bool CheckState() + { +//--- check if there is a pattern + if(!CheckPattern()) + { + Print("Error, failed to check pattern"); + return(false); + } + +//--- check for confirmation + if(!CheckConfirmation()) + { + Print("Error, failed to check pattern confirmation"); + return(false); + } +//--- if there is no confirmation, cancel the signal + if(!ExtConfirmed) + ExtSignalOpen=SIGNAL_NOT; + +//--- check if there is a signal to close a position + if(!CheckCloseSignal()) + { + Print("Error, failed to check the closing signal"); + return(false); + } + +//--- if positions are to be closed after certain holding time in bars + if(InpDuration) + ExtCloseByTime=true; // set flag to close upon expiration + +//--- all checks done + return(true); + } +//+------------------------------------------------------------------+ +//| Open a position in the direction of the signal | +//+------------------------------------------------------------------+ +bool PositionOpen() + { + ExtSymbolInfo.Refresh(); + ExtSymbolInfo.RefreshRates(); + + double price=0; +//--- Stop Loss and Take Profit are not set by default + double stoploss=0.0; + double takeprofit=0.0; + + int digits=ExtSymbolInfo.Digits(); + double point=ExtSymbolInfo.Point(); + double spread=ExtSymbolInfo.Ask()-ExtSymbolInfo.Bid(); + +//--- uptrend + if(ExtSignalOpen==SIGNAL_BUY) + { + price=NormalizeDouble(ExtSymbolInfo.Ask(), digits); + //--- if Stop Loss is set + if(InpSL>0) + { + if(spread>=InpSL*point) + { + PrintFormat("StopLoss (%d points) <= current spread = %.0f points. Spread value will be used", InpSL, spread/point); + stoploss = NormalizeDouble(price-spread, digits); + } + else + stoploss = NormalizeDouble(price-InpSL*point, digits); + } + //--- if Take Profit is set + if(InpTP>0) + { + if(spread>=InpTP*point) + { + PrintFormat("TakeProfit (%d points) < current spread = %.0f points. Spread value will be used", InpTP, spread/point); + takeprofit = NormalizeDouble(price+spread, digits); + } + else + takeprofit = NormalizeDouble(price+InpTP*point, digits); + } + + if(!ExtTrade.Buy(InpLot, Symbol(), price, stoploss, takeprofit)) + { + PrintFormat("Failed %s buy %G at %G (sl=%G tp=%G) failed. Ask=%G error=%d", + Symbol(), InpLot, price, stoploss, takeprofit, ExtSymbolInfo.Ask(), GetLastError()); + return(false); + } + } + +//--- downtrend + if(ExtSignalOpen==SIGNAL_SELL) + { + price=NormalizeDouble(ExtSymbolInfo.Bid(), digits); + //--- if Stop Loss is set + if(InpSL>0) + { + if(spread>=InpSL*point) + { + PrintFormat("StopLoss (%d points) <= current spread = %.0f points. Spread value will be used", InpSL, spread/point); + stoploss = NormalizeDouble(price+spread, digits); + } + else + stoploss = NormalizeDouble(price+InpSL*point, digits); + } + //--- if Take Profit is set + if(InpTP>0) + { + if(spread>=InpTP*point) + { + PrintFormat("TakeProfit (%d points) < current spread = %.0f points. Spread value will be used", InpTP, spread/point); + takeprofit = NormalizeDouble(price-spread, digits); + } + else + takeprofit = NormalizeDouble(price-InpTP*point, digits); + } + + if(!ExtTrade.Sell(InpLot, Symbol(), price, stoploss, takeprofit)) + { + PrintFormat("Failed %s sell at %G (sl=%G tp=%G) failed. Bid=%G error=%d", + Symbol(), price, stoploss, takeprofit, ExtSymbolInfo.Bid(), GetLastError()); + ExtTrade.PrintResult(); + Print(" "); + return(false); + } + } + + return(true); + } +//+------------------------------------------------------------------+ +//| Close a position based on the specified signal | +//+------------------------------------------------------------------+ +void CloseBySignal(int type_close) + { +//--- if there is no signal to close, return successful completion + if(type_close==SIGNAL_NOT) + return; +//--- if there are no positions opened by our EA + if(PositionExist(ExtSignalClose)==0) + return; + +//--- closing direction + long type; + switch(type_close) + { + case CLOSE_SHORT: + type=POSITION_TYPE_SELL; + break; + case CLOSE_LONG: + type=POSITION_TYPE_BUY; + break; + default: + Print("Error! Signal to close not detected"); + return; + } + +//--- check all positions and close ours based on the signal + int positions=PositionsTotal(); + for(int i=positions-1; i>=0; i--) + { + ulong ticket=PositionGetTicket(i); + if(ticket!=0) + { + //--- get the name of the symbol and the position id (magic) + string symbol=PositionGetString(POSITION_SYMBOL); + long magic =PositionGetInteger(POSITION_MAGIC); + //--- if they correspond to our values + if(symbol==Symbol() && magic==InpMagicNumber) + { + if(PositionGetInteger(POSITION_TYPE)==type) + { + ExtTrade.PositionClose(ticket, InpSlippage); + ExtTrade.PrintResult(); + Print(" "); + } + } + } + } + } +//+------------------------------------------------------------------+ +//| Close positions upon holding time expiration in bars | +//+------------------------------------------------------------------+ +void CloseByTime() + { +//--- if there are no positions opened by our EA + if(PositionExist(ExtSignalOpen)==0) + return; + +//--- check all positions and close ours based on the holding time in bars + int positions=PositionsTotal(); + for(int i=positions-1; i>=0; i--) + { + ulong ticket=PositionGetTicket(i); + if(ticket!=0) + { + //--- get the name of the symbol and the position id (magic) + string symbol=PositionGetString(POSITION_SYMBOL); + long magic =PositionGetInteger(POSITION_MAGIC); + //--- if they correspond to our values + if(symbol==Symbol() && magic==InpMagicNumber) + { + //--- position opening time + datetime open_time=(datetime)PositionGetInteger(POSITION_TIME); + //--- check position holding time in bars + if(BarsHold(open_time)>=(int)InpDuration) + { + Print("\r\nTime to close position #", ticket); + ExtTrade.PositionClose(ticket, InpSlippage); + ExtTrade.PrintResult(); + Print(" "); + } + } + } + } + } +//+------------------------------------------------------------------+ +//| Returns true if there are open positions | +//+------------------------------------------------------------------+ +bool PositionExist(int signal_direction) + { + bool check_type=(signal_direction!=SIGNAL_NOT); + +//--- what positions to search + ENUM_POSITION_TYPE search_type=WRONG_VALUE; + if(check_type) + switch(signal_direction) + { + case SIGNAL_BUY: + search_type=POSITION_TYPE_BUY; + break; + case SIGNAL_SELL: + search_type=POSITION_TYPE_SELL; + break; + case CLOSE_LONG: + search_type=POSITION_TYPE_BUY; + break; + case CLOSE_SHORT: + search_type=POSITION_TYPE_SELL; + break; + default: + //--- entry direction is not specified; nothing to search + return(false); + } + +//--- go through the list of all positions + int positions=PositionsTotal(); + for(int i=0; i=(int)InpDuration)) + return(true); + } + } + } + +//--- open position not found + return(false); + } +//+------------------------------------------------------------------+ +//| Checks position closing time in bars | +//+------------------------------------------------------------------+ +int BarsHold(datetime open_time) + { +//--- first run a basic simple check + if(TimeCurrent()-open_timeAvgBody(1)) && // long white candle + ((Open(1)-Close(1))>AvgBody(1)) && // long black candle + (MathAbs(Close(1)-Close(2))<0.1*AvgBody(1))) // doji close + { + ExtPatternDetected=true; + ExtSignalOpen=SIGNAL_SELL; + ExtPatternInfo="\r\nBearish MeetingLines detected"; + ExtDirection="Sell"; + return(true); + } + +//--- check Bullish MeetingLines + if((Open(2)-Close(2)>AvgBody(1)) && // long black candle + ((Close(1)-Open(1))>AvgBody(1)) && // long white candle + (MathAbs(Close(1)-Close(2))<0.1*AvgBody(1))) // doji close + { + ExtPatternDetected=true; + ExtSignalOpen=SIGNAL_BUY; + ExtPatternInfo="\r\nBullish MeetingLines detected"; + ExtDirection="Buy"; + return(true); + } + +//--- result of checking + return(ExtCheckPassed); + } +//+------------------------------------------------------------------+ +//| Returns true in case of successful confirmation check | +//+------------------------------------------------------------------+ +bool CheckConfirmation() + { + ExtConfirmed=false; +//--- if there is no pattern, do not search for confirmation + if(!ExtPatternDetected) + return(true); + +//--- get the value of the stochastic indicator to confirm the signal + double signal=MFI(1); + if(signal==EMPTY_VALUE) + { + //--- failed to get indicator value, check failed + return(false); + } + +//--- check the Buy signal + if(ExtSignalOpen==SIGNAL_BUY && (signal<40)) + { + ExtConfirmed=true; + ExtPatternInfo+="\r\n Confirmed: MFI<40"; + } + +//--- check the Sell signal + if(ExtSignalOpen==SIGNAL_SELL && (signal>60)) + { + ExtConfirmed=true; + ExtPatternInfo+="\r\n Confirmed: MFI>60"; + } + +//--- successful completion of the check + return(true); + } +//+------------------------------------------------------------------+ +//| Check if there is a signal to close | +//+------------------------------------------------------------------+ +bool CheckCloseSignal() + { + ExtSignalClose=false; +//--- if there is a signal to enter the market, do not check the signal to close + if(ExtSignalOpen!=SIGNAL_NOT) + return(true); + +//--- check if there is a signal to close a long position + if(((MFI(1)<70) && (MFI(2)>70)) || ((MFI(1)<30) && (MFI(2)>30))) + { + //--- there is a signal to close a long position + ExtSignalClose=CLOSE_LONG; + ExtDirection="Long"; + } + +//--- check if there is a signal to close a short position + if(((MFI(1)>30) && (MFI(2)<30)) || ((MFI(1)>70) && (MFI(2)<70))) + { + //--- there is a signal to close a short position + ExtSignalClose=CLOSE_SHORT; + ExtDirection="Short"; + } + +//--- successful completion of the check + return(true); + } +//+------------------------------------------------------------------+ +//| MFI indicator value at the specified bar | +//+------------------------------------------------------------------+ +double MFI(int index) + { + double indicator_values[]; + if(CopyBuffer(ExtIndicatorHandle, 0, index, 1, indicator_values)<0) + { + //--- if the copying fails, report the error code + PrintFormat("Failed to copy data from the MFI indicator, error code %d", GetLastError()); + return(EMPTY_VALUE); + } + return(indicator_values[0]); + } +//+------------------------------------------------------------------+ diff --git a/BKPS/14031206/Experts/Free Robots/BullishBearish MeetingLines RSI.ex5 b/BKPS/14031206/Experts/Free Robots/BullishBearish MeetingLines RSI.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..f65cadcacc24171e2d7e6895bcf02716cc2729e7 GIT binary patch literal 42872 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 z z&+K_10pW$Zg}{&P%=R=9*=lbGjZb`L}C{TEW$=o>8RwPj@ zMkJ3QSx!eB{E5D6Lm3N!2+y}C{vMe4$UN^0fYjo{P1 z!OlD0)Kl}+<=`qk+|Z`Akpk>zN&1IZILK_Vd^HGmJ#=ec>~;ZR7mT5XWgsOvV-RnQ z=@MYB?it^V6YE5yZk}p04%ur~Vy{adT9=f=e2;hh1Kvs{z2yx#ez6UxEBPh?8_^!9 z*3XfhaB(KntATUra5o>1W`+T!R;iq1VR)VP?Q9IaK`eMY+Rmi2j{xdrNBD&`XQ4YjSmJHXgZK^d(TtHT|C|$`E1~bc zaS_>Q?qj^ej_|yibsMb~g(=QQgTTG)rMRFaEC+K=<_=txM-KL8Jzdy*ErfSpVqbT3YMwqnP&2~+~h5Jd9DmkW%0d`N0 zS-Xd0KIC>kOS4aLtm)=WEwqrLsDtn75GY>VBQ}yPuzstCpjM;99*v6t;o=uOUte5h z?X;XMk)aX+vj+LFvqfD4`FBKM#qs#OE zL|3z}P98>#bj?TT7QgL8sf5xrLb6S|l!8xT)v> literal 0 HcmV?d00001 diff --git a/BKPS/14031206/Experts/Free Robots/BullishBearish MeetingLines RSI.mq5 b/BKPS/14031206/Experts/Free Robots/BullishBearish MeetingLines RSI.mq5 new file mode 100644 index 0000000..76a9be9 --- /dev/null +++ b/BKPS/14031206/Experts/Free Robots/BullishBearish MeetingLines RSI.mq5 @@ -0,0 +1,653 @@ +//+------------------------------------------------------------------+ +//| BullishBearish MeetingLines RSI.mq5 | +//| Copyright 2024, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2024, MetaQuotes Ltd." +#property link "https://www.mql5.com" +#property version "1.00" + +#include +#include + +#define SIGNAL_BUY 1 // Buy signal +#define SIGNAL_NOT 0 // no trading signal +#define SIGNAL_SELL -1 // Sell signal + +#define CLOSE_LONG 2 // signal to close Long +#define CLOSE_SHORT -2 // signal to close Short + +//--- Input parameters +input int InpAverBodyPeriod=12; // period for calculating average candlestick size +input int InpPeriodRSI =37; // RSI period +input ENUM_APPLIED_PRICE InpPrice=PRICE_CLOSE; // price type + +//--- trade parameters +input uint InpDuration=10; // position holding time in bars +input uint InpSL =200; // Stop Loss in points +input uint InpTP =200; // Take Profit in points +input uint InpSlippage=10; // slippage in points +//--- money management parameters +input double InpLot =0.1; // lot +//--- Expert ID +input long InpMagicNumber=122300; // Magic Number + +//--- global variables +int ExtAvgBodyPeriod; // average candlestick calculation period +int ExtSignalOpen =0; // Buy/Sell signal +int ExtSignalClose =0; // signal to close a position +string ExtPatternInfo =""; // current pattern information +string ExtDirection =""; // position opening direction +bool ExtPatternDetected=false; // pattern detected +bool ExtConfirmed =false; // pattern confirmed +bool ExtCloseByTime =true; // requires closing by time +bool ExtCheckPassed =true; // status checking error +//--- indicator handle +int ExtIndicatorHandle=INVALID_HANDLE; + +//--- service objects +CTrade ExtTrade; +CSymbolInfo ExtSymbolInfo; +//+------------------------------------------------------------------+ +//| Expert initialization function | +//+------------------------------------------------------------------+ +int OnInit() + { + Print("InpSL=", InpSL); + Print("InpTP=", InpTP); +//--- set parameters for trading operations + ExtTrade.SetDeviationInPoints(InpSlippage); // slippage + ExtTrade.SetExpertMagicNumber(InpMagicNumber); // Expert Advisor ID + ExtTrade.LogLevel(LOG_LEVEL_ERRORS); // logging level + + ExtAvgBodyPeriod=InpAverBodyPeriod; +//--- indicator initialization + ExtIndicatorHandle=iRSI(_Symbol, _Period, InpPeriodRSI, InpPrice); + if(ExtIndicatorHandle==INVALID_HANDLE) + { + Print("Error creating CCI indicator"); + return(INIT_FAILED); + } +//--- OK + return(INIT_SUCCEEDED); + } +//+------------------------------------------------------------------+ +//| Expert deinitialization function | +//+------------------------------------------------------------------+ +void OnDeinit(const int reason) + { +//--- release indicator handle + IndicatorRelease(ExtIndicatorHandle); + } +//+------------------------------------------------------------------+ +//| Expert tick function | +//+------------------------------------------------------------------+ +void OnTick() + { +//--- save the next bar start time; all checks at bar opening only + static datetime next_bar_open=0; + +//--- Phase 1 - check the emergence of a new bar and update the status + if(TimeCurrent()>=next_bar_open) + { + //--- get the current state of environment on the new bar + // namely, set the values of global variables: + // ExtPatternDetected - pattern detection + // ExtConfirmed - pattern confirmation + // ExtSignalOpen - signal to open + // ExtSignalClose - signal to close + // ExtPatternInfo - current pattern information + if(CheckState()) + { + //--- set the new bar opening time + next_bar_open=TimeCurrent(); + next_bar_open-=next_bar_open%PeriodSeconds(_Period); + next_bar_open+=PeriodSeconds(_Period); + + //--- report the emergence of a new bar only once within a bar + if(ExtPatternDetected && ExtConfirmed) + Print(ExtPatternInfo); + } + else + { + //--- error getting the status, retry on the next tick + return; + } + } + +//--- Phase 2 - if there is a signal and no position in this direction + if(ExtSignalOpen && !PositionExist(ExtSignalOpen)) + { + Print("\r\nSignal to open position ", ExtDirection); + PositionOpen(); + if(PositionExist(ExtSignalOpen)) + ExtSignalOpen=SIGNAL_NOT; + } + +//--- Phase 3 - close if there is a signal to close + if(ExtSignalClose && PositionExist(ExtSignalClose)) + { + Print("\r\nSignal to close position ", ExtDirection); + CloseBySignal(ExtSignalClose); + if(!PositionExist(ExtSignalClose)) + ExtSignalClose=SIGNAL_NOT; + } + +//--- Phase 4 - close upon expiration + if(ExtCloseByTime && PositionExpiredByTimeExist()) + { + CloseByTime(); + ExtCloseByTime=PositionExpiredByTimeExist(); + } + } +//+------------------------------------------------------------------+ +//| Get the current environment and check for a pattern | +//+------------------------------------------------------------------+ +bool CheckState() + { +//--- check if there is a pattern + if(!CheckPattern()) + { + Print("Error, failed to check pattern"); + return(false); + } + +//--- check for confirmation + if(!CheckConfirmation()) + { + Print("Error, failed to check pattern confirmation"); + return(false); + } +//--- if there is no confirmation, cancel the signal + if(!ExtConfirmed) + ExtSignalOpen=SIGNAL_NOT; + +//--- check if there is a signal to close a position + if(!CheckCloseSignal()) + { + Print("Error, failed to check the closing signal"); + return(false); + } + +//--- if positions are to be closed after certain holding time in bars + if(InpDuration) + ExtCloseByTime=true; // set flag to close upon expiration + +//--- all checks done + return(true); + } +//+------------------------------------------------------------------+ +//| Open a position in the direction of the signal | +//+------------------------------------------------------------------+ +bool PositionOpen() + { + ExtSymbolInfo.Refresh(); + ExtSymbolInfo.RefreshRates(); + + double price=0; +//--- Stop Loss and Take Profit are not set by default + double stoploss=0.0; + double takeprofit=0.0; + + int digits=ExtSymbolInfo.Digits(); + double point=ExtSymbolInfo.Point(); + double spread=ExtSymbolInfo.Ask()-ExtSymbolInfo.Bid(); + +//--- uptrend + if(ExtSignalOpen==SIGNAL_BUY) + { + price=NormalizeDouble(ExtSymbolInfo.Ask(), digits); + //--- if Stop Loss is set + if(InpSL>0) + { + if(spread>=InpSL*point) + { + PrintFormat("StopLoss (%d points) <= current spread = %.0f points. Spread value will be used", InpSL, spread/point); + stoploss = NormalizeDouble(price-spread, digits); + } + else + stoploss = NormalizeDouble(price-InpSL*point, digits); + } + //--- if Take Profit is set + if(InpTP>0) + { + if(spread>=InpTP*point) + { + PrintFormat("TakeProfit (%d points) < current spread = %.0f points. Spread value will be used", InpTP, spread/point); + takeprofit = NormalizeDouble(price+spread, digits); + } + else + takeprofit = NormalizeDouble(price+InpTP*point, digits); + } + + if(!ExtTrade.Buy(InpLot, Symbol(), price, stoploss, takeprofit)) + { + PrintFormat("Failed %s buy %G at %G (sl=%G tp=%G) failed. Ask=%G error=%d", + Symbol(), InpLot, price, stoploss, takeprofit, ExtSymbolInfo.Ask(), GetLastError()); + return(false); + } + } + +//--- downtrend + if(ExtSignalOpen==SIGNAL_SELL) + { + price=NormalizeDouble(ExtSymbolInfo.Bid(), digits); + //--- if Stop Loss is set + if(InpSL>0) + { + if(spread>=InpSL*point) + { + PrintFormat("StopLoss (%d points) <= current spread = %.0f points. Spread value will be used", InpSL, spread/point); + stoploss = NormalizeDouble(price+spread, digits); + } + else + stoploss = NormalizeDouble(price+InpSL*point, digits); + } + //--- if Take Profit is set + if(InpTP>0) + { + if(spread>=InpTP*point) + { + PrintFormat("TakeProfit (%d points) < current spread = %.0f points. Spread value will be used", InpTP, spread/point); + takeprofit = NormalizeDouble(price-spread, digits); + } + else + takeprofit = NormalizeDouble(price-InpTP*point, digits); + } + + if(!ExtTrade.Sell(InpLot, Symbol(), price, stoploss, takeprofit)) + { + PrintFormat("Failed %s sell at %G (sl=%G tp=%G) failed. Bid=%G error=%d", + Symbol(), price, stoploss, takeprofit, ExtSymbolInfo.Bid(), GetLastError()); + ExtTrade.PrintResult(); + Print(" "); + return(false); + } + } + + return(true); + } +//+------------------------------------------------------------------+ +//| Close a position based on the specified signal | +//+------------------------------------------------------------------+ +void CloseBySignal(int type_close) + { +//--- if there is no signal to close, return successful completion + if(type_close==SIGNAL_NOT) + return; +//--- if there are no positions opened by our EA + if(PositionExist(ExtSignalClose)==0) + return; + +//--- closing direction + long type; + switch(type_close) + { + case CLOSE_SHORT: + type=POSITION_TYPE_SELL; + break; + case CLOSE_LONG: + type=POSITION_TYPE_BUY; + break; + default: + Print("Error! Signal to close not detected"); + return; + } + +//--- check all positions and close ours based on the signal + int positions=PositionsTotal(); + for(int i=positions-1; i>=0; i--) + { + ulong ticket=PositionGetTicket(i); + if(ticket!=0) + { + //--- get the name of the symbol and the position id (magic) + string symbol=PositionGetString(POSITION_SYMBOL); + long magic =PositionGetInteger(POSITION_MAGIC); + //--- if they correspond to our values + if(symbol==Symbol() && magic==InpMagicNumber) + { + if(PositionGetInteger(POSITION_TYPE)==type) + { + ExtTrade.PositionClose(ticket, InpSlippage); + ExtTrade.PrintResult(); + Print(" "); + } + } + } + } + } +//+------------------------------------------------------------------+ +//| Close positions upon holding time expiration in bars | +//+------------------------------------------------------------------+ +void CloseByTime() + { +//--- if there are no positions opened by our EA + if(PositionExist(ExtSignalOpen)==0) + return; + +//--- check all positions and close ours based on the holding time in bars + int positions=PositionsTotal(); + for(int i=positions-1; i>=0; i--) + { + ulong ticket=PositionGetTicket(i); + if(ticket!=0) + { + //--- get the name of the symbol and the position id (magic) + string symbol=PositionGetString(POSITION_SYMBOL); + long magic =PositionGetInteger(POSITION_MAGIC); + //--- if they correspond to our values + if(symbol==Symbol() && magic==InpMagicNumber) + { + //--- position opening time + datetime open_time=(datetime)PositionGetInteger(POSITION_TIME); + //--- check position holding time in bars + if(BarsHold(open_time)>=(int)InpDuration) + { + Print("\r\nTime to close position #", ticket); + ExtTrade.PositionClose(ticket, InpSlippage); + ExtTrade.PrintResult(); + Print(" "); + } + } + } + } + } +//+------------------------------------------------------------------+ +//| Returns true if there are open positions | +//+------------------------------------------------------------------+ +bool PositionExist(int signal_direction) + { + bool check_type=(signal_direction!=SIGNAL_NOT); + +//--- what positions to search + ENUM_POSITION_TYPE search_type=WRONG_VALUE; + if(check_type) + switch(signal_direction) + { + case SIGNAL_BUY: + search_type=POSITION_TYPE_BUY; + break; + case SIGNAL_SELL: + search_type=POSITION_TYPE_SELL; + break; + case CLOSE_LONG: + search_type=POSITION_TYPE_BUY; + break; + case CLOSE_SHORT: + search_type=POSITION_TYPE_SELL; + break; + default: + //--- entry direction is not specified; nothing to search + return(false); + } + +//--- go through the list of all positions + int positions=PositionsTotal(); + for(int i=0; i=(int)InpDuration)) + return(true); + } + } + } + +//--- open position not found + return(false); + } + +//+------------------------------------------------------------------+ +//| Checks position closing time in bars | +//+------------------------------------------------------------------+ +int BarsHold(datetime open_time) + { +//--- first run a basic simple check + if(TimeCurrent()-open_timeAvgBody(1)) && // long white candle + ((Open(1)-Close(1))>AvgBody(1)) && // long black candle + (MathAbs(Close(1)-Close(2))<0.1*AvgBody(1))) // doji close + { + ExtPatternDetected=true; + ExtSignalOpen=SIGNAL_SELL; + ExtPatternInfo="\r\nBearish MeetingLines detected"; + ExtDirection="Sell"; + return(true); + } + +//--- check Bullish MeetingLines + if((Open(2)-Close(2)>AvgBody(1)) && // long black candle + ((Close(1)-Open(1))>AvgBody(1)) && // long white candle + (MathAbs(Close(1)-Close(2))<0.1*AvgBody(1))) // doji close + { + ExtPatternDetected=true; + ExtSignalOpen=SIGNAL_BUY; + ExtPatternInfo="\r\nBullish MeetingLines detected"; + ExtDirection="Buy"; + return(true); + } + +//--- result of checking + return(ExtCheckPassed); + } +//+------------------------------------------------------------------+ +//| Returns true in case of successful confirmation check | +//+------------------------------------------------------------------+ +bool CheckConfirmation() + { + ExtConfirmed=false; +//--- if there is no pattern, do not search for confirmation + if(!ExtPatternDetected) + return(true); + +//--- get the value of the stochastic indicator to confirm the signal + double signal=RSI(1); + if(signal==EMPTY_VALUE) + { + //--- failed to get indicator value, check failed + return(false); + } + +//--- check the Buy signal + if(ExtSignalOpen==SIGNAL_BUY && (signal<40)) + { + ExtConfirmed=true; + ExtPatternInfo+="\r\n Confirmed: RSI<40"; + } + +//--- check the Sell signal + if(ExtSignalOpen==SIGNAL_SELL && (signal>60)) + { + ExtConfirmed=true; + ExtPatternInfo+="\r\n Confirmed: RSI>60"; + } + +//--- successful completion of the check + return(true); + } +//+------------------------------------------------------------------+ +//| Check if there is a signal to close | +//+------------------------------------------------------------------+ +bool CheckCloseSignal() + { + ExtSignalClose=false; +//--- if there is a signal to enter the market, do not check the signal to close + if(ExtSignalOpen!=SIGNAL_NOT) + return(true); + +//--- check if there is a signal to close a long position + if(((RSI(1)<70) && (RSI(2)>70)) || ((RSI(1)<30) && (RSI(2)>30))) + { + //--- there is a signal to close a long position + ExtSignalClose=CLOSE_LONG; + ExtDirection="Long"; + } + +//--- check if there is a signal to close a short position + if(((RSI(1)>30) && (RSI(2)<30)) || ((RSI(1)>70) && (RSI(2)<70))) + { + //--- there is a signal to close a short position + ExtSignalClose=CLOSE_SHORT; + ExtDirection="Short"; + } + +//--- successful completion of the check + return(true); + } +//+------------------------------------------------------------------+ +//| RSI indicator value at the specified bar | +//+------------------------------------------------------------------+ +double RSI(int index) + { + double indicator_values[]; + if(CopyBuffer(ExtIndicatorHandle, 0, index, 1, indicator_values)<0) + { + //--- if the copying fails, report the error code + PrintFormat("Failed to copy data from the RSI indicator, error code %d", GetLastError()); + return(EMPTY_VALUE); + } + return(indicator_values[0]); + } +//+------------------------------------------------------------------+ diff --git a/BKPS/14031206/Experts/Free Robots/BullishBearish MeetingLines Stoch.ex5 b/BKPS/14031206/Experts/Free Robots/BullishBearish MeetingLines Stoch.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..4c8f3424a994021e9bf46f26590504ee613a61ac GIT binary patch literal 44070 zcmdSAW2`Vd@Gp35+qP}nwrxMhwr$(CZQHhOpMC##bHChVlg)nHnKXk;)Bc*KZKfGf z4OSpW00?9N5P<&(5a9TK$^X&+Z)&QtA91qBGf= z{-*)><5K*eA#OhYsH0?X;?H6#@?k<}PDe)8E)qlopeF!+6l(v(y`=a$_&46#&HtyL zFn~RP1AqsB6M!XvIe-O#GXMbq69B`1jRk<_KV25U^go{=fFgj)f054rS^xg?%KWF9 z0MPxP1ONZf{vX87|E<7304@Of|Jdz+F&%&{fFpnn0PBAkjsL@K`~O2^|L>;E_#Z-s z|M>qaMcZy-j|vqV=upbZ9dkX9#F>*I;bM6asXQx8S(;2+eKr2EZINSoB~DS4(k4Uf zRJ(ua79GR1J`+Bcz)gH^wmPbIl4QC)BfwIfS*(CC*pWGScr#+HQ{8?DbDhxH6r6ro zjH-Co&MtK&O%I>y#~@Y_mq@3__++L9Eg=jda_)Vqv`OLQ)F2jVH|KB!%-%+D4)m`q2#r^hT3NQqutA>Dut=v2K``D0R}l!9|47a z)Lb3|$~89_2e(?@e|}#;2X3ir&(<}Mw}wReKGnQ9VXmViiby_iJ&Exu8LM=QE~i<) zFDX8q*1Oh)aGoYfZ;?5*UD_qYuhN@k22kMLh^`J70BFYol5sW?hy=d@r1uxOX(Mb@ z0Vk?ih$B_{2@(&OwJySP1U{6b zl?cH@o!n`Qy|3+7tKCF<4M)NpQ3x>44o9q}k_+Y?ZiT)f{|^)a6Uk)<39B!+%fXi6 zhP=6Vz#_r0O_Gk2nb;&o12seM5Urc2BRu<_yT35op=|8l9+e`5bD2A?XNs_wO4zSw z(9MfjNZCag87V%M0?Csc$T3gwC? z92cvQsiYQ+Qpn7QspH^)X`%I5i4C&6a|5@Or2`kx*FnO4f-Ss zv)KpE@6c33+oS8=K;sn_O2hRB_@CrG!4S>1a#!Te?3hyT)AMNO;87K5Q~l^^51vz6 z0o6h*ijl9iqE;XfwGRGl$C;KDJs zXVak(Pwh(-0yVj}1j-ToCBRr+gVir>?3z3h;aNvq9$SWd5_QNKWeS%7O;8Db~}?Rs}gny^tF&X3A*-2!}3QC>xHDmj(mZH@N3@=+PQ z{5C6bD=WL-odDNuh_Yms3WeN|PgxUp9(LB4=0sT|b3T?LO~Ltv1vrQALFv4nX4lHH z*IgG$1>Qm!iTf?(pc088*I2FFcv+AEa>PS4y|nc zE@pr9BZer_H}nezKqmECBd{&?nUFuuZ{qccfSKh-fDioel?MbKg0{keTCnTaX5YYFci+W}l$2s&|qgcL`m zu?ByJ={h}&B+?J&EpKa!4gt+zTkP_(U7EVcZ|+uY=+tTJA)imD13W+ovxxye>D%I=W44{6 z(`ohmsR|<}Sbwwc!l62cUESxJ>UnvWI+G+DIjU>Gi=GZ>f|9hh33(`lgfdMgJces= ztDfCZvSeFhS$MvNX+3qMN0~5XA76{G^fUZ);+qpqpdnXX6#ZgdY>M)!Ai_l|z9g>+ zRY}xxX3#F6PRoqE*-YR54Gz+U(-Z898B(>yFt8Aw69PwlqDL?Tpmw0Dqe&w?lIiB2 z$FzV}kZtQm_Xw=Iqw`f)`Q)SLic=n|>9I1^CpIh>X4Y%dSTUf%5ZXNqu}b_TP*NF@ zHjZ2QotWsQplt^95x<=-^uqtXQQ*Y6AtBiE5T(^E86jumRCeufwEbT)jWGSK_cU7y zU7KI<6z2I*Pb`NSSe%`w1Lupw&F~D)@zNZMNk%-mYG(WU?u7zEjO^Ha>r7OX(aGD9z z*4UG2nfqGg%cnxljr)u*WBkMC;v^o;wmGh!zOC_Rsr(=mOo`qD#R&3vV@Piuj*dd5N0IrqG0@ zi+M^4ajFWkG0O6^pQ&mfGD$5Ru?hWNIC{uJc}7Fh1#(`e^dK@n1R;8n8TQVTS~Uxo z@`mW?JAh*w?y6WSi(|2+5b67Vvct?lT5#n^F?}%!w={0Y82!%l#|P)@g}A#m-?_tA ziTyaacY9SFX3JKwCx$JiR}~kdc3oo$j?+QjVT^9z+s1>jmCFU{3`l*S8Q}T_J?aF4 z3m~;ta1sJ??No3u=SbG($Rdk22(V+B3s*ip)g zm$}`+FN%c)^QXx9_anv1L+uDJANY?LJuN=F#};ELR=!uQJIkZlsI7zUZSldOW48vM zxd7ry0D${kNW`6;#

(KMVa`cS6H3GIWPND{KiFdimfn0yc;nwZC%@DlwQ%Zd zDi4Bfs~6cz#rjl**CBOXi8n90G61B=am;o>W>R}AhRLo}azQ8i;#Ky%i|tPnd2dGY zYs?%SYe0q;C1wC~U?t63@3w*~kA+3NIL(2>?`0z~g5`kipwm3S}0u*w4F+O=P6;3U) zIr!u85+a54$-(xDBIbmJhIy-3c03T+p)AmY0s5`#%PM_TkHjk<+ff)RyB?b7`EJcD zygqIpCZ-QqHGD^fQ)v(@@;kB>0@b85m-jzu3tFeQxWp{(d^JxNtGKwZWtBB1F6ZIV zZ$;_6``=T6ZA3_X4X$YNiNNi*#8Kp+fUePrY*J0!VqFK0j0lg-lMv@r{SLqN%Z9-F z;A~_OuTvH-=`{KX+jx6_O)OKh=>-)pSgn)GN6(te_m?V1avw50NT2VS%xNxH5Q29m zt(-E7@)Fw}#(iXztJ>afp{;O$HzCMdfdYbyHuypRb#dkjZa)2MM@59&Tq-i&gl2wp zPlq&LRp9{*?tA(`f(SqI5zCLmCMXr?@g3~ha3yV2)f-+x5;8>O%MQkBkhc^LOoYV< zAW|Kfb6q|0WTACwdgY9dn5lHA!*So8Dp|es<_|cZ?sjk!T4rv#T*4u-$!9JS{AxQ) zk^`H61(Y^7nAgVbVuRVmGI;_b$Na0-p=D{wk60$@s-Y!6Qgt-XJbZsVK5i;LNVw;y zdM-qmuG;0Bb#v24W#R>H8-UkRE`l7nlRDOM8lKq4^K#Q>%oLE371Y?%YVsBs;+Sj7 z;fpd#tDqiP7N#b03`mqOlAsQ|v=Qg3-j0A+gZ!v%t59deVFLg)_W1r*W9rF_)e`nn zP^uw%2g(;rVWGOhZ`~pmDh`*QPx@_LnX2Q4HxSKIZ2sG^WSxdUKkgV&^n6^idC1KI8pa9O4VM ziCKjZ&OX_9aFBIqMLcXDorNUyIv66)*IfKd*tz@VoG8&&wNg3QBr^d(1$7&az|%c> z|4W@Wt2E}(ZOkE1&>7P)m7v8)3Ejcp<~hvs=dQozVT(VASy!vDaH#xihDcMbBuZ*z z2kk=}lCd%@6QM{Nzu(9AmOJWpYMVX6Sjf^>>OBjY#@p?|74%aBH&ZuQk-E^`r{ zy}#}jzE+x0h$PSbjF`-JLpnrp4H8d@jJ5I(Nw#@P&3wW%cskXWhjleeXf~Na5Y?@Ch zW#y(}T3ViFr&L6?yY`(b?UK`x>b$|X=W*8?%G}uQ^29Jt4}iSHUIXjngP!0 zETxwfv(p@}5d8H>mH67(pe-KVzU7a(kK@;9w-Aa6f6*gAPd#(gIV2_WX$E)tvP;Hyvs;R0CWUbP-Dq|%|EMD zV6n5x+DF&@O$il9vZ@kNR*AV)m*u+tsWlU+H4UV4Jd4uJ6srlRT0!fK))cGgr@1*| z$7xX140%q4V89|JRk_n%eLC-rdkRm_CSk1?jXcc}@NO{RUigbYI(9=p0AS_+@IlK~ zav3_``^u{amgLQ2p_N1oO1Z#Dnu{0o<{_BL_eJd_r1b`W@ZR>pqhg6R3?IZm1I`P( zT4N^51f&qkGtr5~M-|Ns1@!gvCf8mP_yW-yw2&;fGYoloQG3rY9yXx97Fc;=DSIyO z=;jIZPP3*k@D1+vcAwo0xKIT#`sgO3G-Gj=+P{1J^dK60?aMB`o6VHzCnO@nR!Ld> zo=6oOffOvYPE^z1+K-aGUk3htJbYI1TFYZ3Pl0Zg%jJNkP@aOZ`Y+%+Xh13~i$+O& zT4kbi>hit<_B^sM)x*e?k$B+`%_-CRv|`2TT2$>6$`4e42`|)(u|t3y)Q#M zMsS!~WJg$ z-u#P1PE!{Qb<8LdE$fYXRaP|tPwL*fq^ozC>A zM;w{Bsp@LyU31I*A@pSZ*ZAJ@TV^{r*4*}CvX0Q&@C?zVVRb~Q+>;!N^R>fqB}dN- z>Z4rcu&KiO4cR`IP9l_p1-bMnd^LSz7YERzjj?vc-6spv$Ks{(Vzq1!SBt&U)01a* z8Y)EKV6f-=P5-4mcArM2DwwPgJ)&r&du6FYhn=k30NNLl5p{Agr`R4oZE>Np_~+xZ zwxB{)2;Z)|rjUM}G3@xF%|(@^S7+j|?l4&R4>+i~67KJ0e;hX19vG%4{vhnk5WX>l zd9aC=f+FX8E`*GL;rO^gQ^Cl-4Ftd^DHl$2w`7s?kq7tZ{@~;>hgJ{%kc-^{FX9GG z)Xf#?nlhDmkpO{v|CrHA4!MxlWs{nF;fKp{&p9%Qt!{6Bc+ zs36VZoye&nX~-P8 zt*&<$T(ddEOj$@-bMlq&UF>{T|K?zO2jgx|=05yB??jq2>NYzWW zkw6_PqQ4PGsPtqE;VOb}pxoBc&t`TY9_$Z;SzY;6%H&4&-j$q9ihW-p?|qBn(-LOl z3Msfdp7E+P-@HnJg+FBA?ospfrcQ5@_);52BS5=FX_C=g_9L%7{(zOFeLft_v@fP5 zAyQqb_L}tEJ#aeQQ$oy=q?wkB97Pt@fxOXvBD^c-W>5>MYgo4)$I6wFgc(^8gK1Dp zDk?73E=8XzrX_||@mq&j^wXmS{j#`Y{iA+FaZ>YEA8;rq=JCCy?*wBP1;YVEKSDI-+PmY0xJ6PT@nBGg1SPAf1eAL_2uf1H=S>ai{oo zRg52j>cS`|`hiN#VfhkUiuW9@+PIY$Ns z*0G%N+CQ}emLJ|{v;9W)4c41;Z>?S2gGcx(hw5ZV^Q855UaZky`QxG+ z$6~ES(Cq~O)_8Z%_nd}l_7fhL!^^GEc8QetS0^v^;Co4jo4q1#Ym67dkgrda0?htp zEGs1QCmD;%!tBu2hvi+I%$~|t5U9gxz1#9CbLET1SfHwfAGmiO@A0&1D~0?Ia-PYM;*w6D#JR;pf8!ppJ3>poqa& zI*-hNKyP%Tlv+wSP4BBkn8Y%A*^+s~LKAn}4;THU9TwR=>$X;xNXu8o9E?=7)!MDq zv=@e=ob4V5cYg^K%sx*ZJx$%O*v5FpR13$WTLC%2@So~JDb zJo7of^fHua(FCmwEGc~~XTumyYg~k=QPK+6(+@!!n{}?RC~4ddp{`*O6?-WrTu{^j z5>BnMv~5qF(+UtY#iXFZqHGoB-+l5TGFU+sKV5S~n$=3fxiYX)Xgh959rbX!>EsE- z3IL-@Q1p0ViWzmTr}?sMHgj~jzDhwRRg@z=(m^LcUC@urq^UHuAORojL|-I2$3s`+ z+!j!v1@M*;v4@WKZt(Wf zA6DdWhkLKx2-{}ji*gd6Th?zK&s>=KIyAWD>N0{kSzM9$gI8eNHdX34JWeSUE!3f> z3)Gi+$@~d_rbfItkYLw)XH8NT=jhUs8$tMil_mLTNnbRNq?zw6e{b8Pz1;V>h$+{- z!3>>*XJ{SWh=ZvWfl7ulWC?de-WYQ}s`1KiYSCoPDWC>SLAK+HjH0|~8oU+YJyZ{X z_|I+l$p4H^8FEJ>x1q3t4xxd63@{KQ=g}g?8od0$IVh}RSA=oKyF5x0^v8Jv^rm<| z+a)mJy(|s3MwR?7thMPu38bW;bZjPikNmeAmk^=&g?{Vc(Y;=+cZ`oROlB1VG-8+6 z;ss6y{}jzaf{^GoMkTc_-~IrH%SqUVM4U!KZJtqivKjA zF*)*&)!Zyu?B@K0yE!O@EZ|BhXuR#2m6l#wha}F*WG4-%+P%3?(`d@8BGxyr+G0q1(>^4?s zb_5V~YLdhMl9*uq!8RIzeas4Qc3(J=?1OOPBr=b_(_RKM8ehB%T;q(5cjQ3HdoQWb zu(3A8x?yp$x8*_eqC2;;0*3}`(;(R?WpqpPrcuCIL6yaoNGd__D!ipqGiJIlIXtW~Ad87Hvx|J>*-u_V0e49f>Y>ndcMGecd_iI{}iUR^rs zW4!;t`v^*cQQ7>sZ?*diW@avyH1v=Ti#tWY$?Gr~Vcx5$FiGbcTmw10F)v1>5t5K2k7?#FBv zZoo<)L#jI%c)XS*ixkKRiyL-4iNFDyi!;Oo9g7sD^ppKnJxVM)|HAN_Kx0?zi%J~- zQLB~hClX=j*dQs+L5q9Cl`kV_?>}`jJfK>c(4iJ8TxZ`$y=&ajGsZZMH8^tH-gAG- zs!QvWO%OH+kZ2V5?>H(&dceB|`~z_=o)Y7EM;mU2f*Mk#k)3&ljU9?1%R2X4HT6&F z#^e!gZ!obt9#A|BkP>g0M~LL6={!sFe%@O6D|Hb>ssn2ZaK8Yi z$QWf}Rub9&STDY@xD6oXyQ00k+q{N=D`Ne}3}ySUac`MvCF^Bwz{J}g6ewE?IXy{T zXW&fc3z^pL*~*!MyNC)5qwk~YcIxEnrLVrF-^L7_#M*i;UKr|*&r^~$WG8d>=!u-d zOItqVU`1BF^vaE))D%@H_0XSBTZ{&ZD!>A{4FaShjpE}c>l?yy3J0~H@CI6J;ilJS z9y#=QIJ_+QZx8#DG6YN=;=y0_CGG~>Ji{#?B$(OU^?L$$tjIl#KqER9efye#ky3fQ zO^egyk-oEMX4>Yr~B?%3#b7x9x+Z z$)~VbW$}{pdY*es6OoWI)vZGB27b%PtXkDED2VOYZE3eJ_(3>;(8VmWKzehh7SYE7 zQ8y*!F=3gwX<5YdP*wPBQpZbZ6?3)KxZ}$<3zE7B{5HkQUg2lsYWp6071v_g=LKaZ zUt@U0iL5()`A~g{;hfHHfi_*mMUyAdd3q>#-W_QV`(d1{v@9Z?k<$;EbA9Z_tKx$E zuwH!+oKxVW3CTqD(hPWTKByLHtq`q)1HSDNAePrB5**WE_B}||TsEfCC2W8oE|sx- zJX(<6i1HW$!@COdq&bnGU9UViB)Gxr3(9{-DPizUBGHbg<>l0xe9A31@_2<=_t)ys z!(b3VYYrB{7ETkPJ&d=#9+5nQr4}3;{^`BKLBlNYznvg9`1mJ_jl)4#_VtF8036LT zRq#uIDdvj6e#uUc6?G+c(!v@>g^bg2P`4YSbYAw8SftBW32=(2#7T-ZVNrBrUWIl@ zD7m$X*rds@4qq!FNT@r})u&Gox%K!p)(yA-w(TzNjOdjtOT4%VWT!jjIity3T!gs6N{AJ|Wg&A8Rkg;eRF8F1DJ@JaQvmeBO(xD+q9u=WC&IZ6hO zJ(=jrBIxI%mx(}Awxc=j_47ByW5~I~Jw5g|w3Z#Fx;nL|>m0qew5|=C+$<{lSNIYE zrM=izW$cadP9hzxCtE^9CC1`?(r-VEJ_J@S1p7Itk9Z<5^|!QQ@35ph9i4qRta53h zrj@9C*f_w2`z55*b4Y8p`G;$sri%I_vfpgqz0j~o zRu{=N6io)l+s;l^!7}^GN@c#LKV+s`nZ-U$0-?*n*WFPMCt~xP3E=#|b$Z9ooc7$U zFxw2(J@krxs9M=3y83Z^h^E&g^i6`wJSOzCfGBW4_Fy?+0ZJEu|(fFc~ZgXq3IC@MrnW8cH45UJ#`|?A+aDo7RyM zZ0QF%ZC#Bd8$4-X-oJRiH!!2_Y{r*)?1ABb%&L~9&m|(*h1Y^2^PgEve283b>jmfn zSwWrfV5<3M>?CBP69iOrGMi%@B>d7t&NZf~S@wP-(xrBG%QdIawfy8oM?sPuBoKR~ zcUB%jjgKVMAzuuug3X@OJF#!S5pK}PJS1}9=^3yQ7F$anzBcb1hz7%iGyL1!@~H8J z4ICX2DH9Dn30p?EyUcE>jDA7*Ct~wc&xc4=gE{*S_*Xlza50rJ7w4Xzyt$elF*_(M zfOf)%rMMEK(^YioO5ghJS#KmNc4{?E*_OFin@m9P1!KNu-)zuFb&n-|NE8eAZ~+#0 zxz4LiJ=nG{#h!qle$fEecn^m?(3pxA8Kpt^Y{2}!j6MZQ|7=F z-`62c3ycQ#hhG`qAi9+HJL~#8PK)p~yvt!n>WWB4=e+n*$n};p)$d&ZmyC6pN9NTM ziN#5I`zf|lW9Li!dX=31G)#a=x?pX4rmTdpW*qZgapB*ze5MBvh%<-pUPiYzfQGTS zQ?xSEI3~6Uk4V4n`S_Ad36qJyWvy1hAdmbCBD?v9+NI8xc49WWq!woD6R$TL3YjK5 z&rsu={Plgyp;2-AR?ssJsK9vT8D|(pRH-2J_XkpolccH}x$2Rs>;Ce`Xzsauy>@Qf?$g&sn&oDyq_3m>+3baa)E>-L-)uOCu)gHw{ zOpY`Z@VzI^ZYLqns(w&RpGcP}AISMk@H`#ElXFX!^{L5Az!}yJ;W!Po5wVa|OOPU+ zV7L`Xq@>`vEjrK46mjSKdKvOc+C;4^Znq#_Qk!Ud8RX~_YhiSNl#(<9ovnslBUQ5O zm07nVJ!Z8{x~P+d2NQ4%S~hNCoF9w5=tx{&24^m*N5TvgHo`k7sc9|)+`jEGoie59 zrF;b!ZjYrd*s$1|=)rkWFd6FyN0O|=H^oFti5n}ZDVyUt!-k-WDeQEBn_G)`c=bA} z`(AzJa@xSE_?-r!w*LIuQ}*R7L6h1C3;%W!FUf06lM-;VS=ze-z~G&O+jbeParLV9 zkR!Yh=DBv;=wWaZlfG=bu)i10PK3)n>y__#E~_wpY-jn15gw|GI6Ook>B}I$4#VRl zqP{ql~!gW!O7u(n?$3AavEf(z#5` z_{AH|#KpNsBvz2q1}PKsyUqR(-h| zSfD(WE_#5oii~5pZ|KNLEM7TyZ2%ZB9c!v>*Cd*Zlt`g&n81M{1U z{dA8plF^8`!FbiuyA;KKk2NWk`9Z}0F+kk`6$`9M&-CjOqCD9z@4TS43P94Xb5X~4 zkxnz;ZpH+*L$<$Td=d&keGeAcJfwC<<*ufzTv*Sr9XQR2l2TZn8S24n6T?m63{7P$ zPd}{QDoalKh-MR*WoP`rD5Iha*&)Y4igFsG&SIw`K2W` zyEd79xw^)?shxc0G!oE9`T8=><{8427mN0;^46JWC@mS4&!O|LPeeq15!IsJ`Q^%E zz4E9RX&6IR1D__34Rx;Lys5s)!(yofE}Z~RDb_CP_T~$+@dcD@&$*JlnkX1rT4CVH zGJn5DXxMqrKPKLjc>sc;sP&{H?jv{tk+l1(LhC1AZyv{iiiRP zW|k*GsErj^(5!zL>=Qftr_WTwLo*3*1wLI-@&d_vTY*+*`w-7y48YKydYaiqnXY+Z zbxf_MEEO@y?OBJoTpRii5@i;37%ZeKkO;fpgEY#m16Zh|+Y@ETV^z`!-iV+?yTCCY z8eoK+*_N*a0u5K2>7n}Mx|9=A#NkoH@j^Ur-45X+KNAFT#I{qLG5R!D(&z1f{Cm$z zbX1{l-ckW>*4u1ivEk7NUnsdmk?%U9{ka)FvuBH)9WJm)b@VPu{%d2T ziqbrv#Z#s@)ZjgbpOb;!j~OuR>eq%E(C3s-7To-P&)+plhf*A}o388pYY~yFADGS9?A@Z6cm@eT6r2)^G? z-I=PySAa@^+z^*F37bKY<%_^${IlBQjp9P^uVe-2F!NHU_5FwQI)|NbJb0Nt5hfv% zu`z0ZE*3sE3BZ8wGFQOf+@>HEx`GG%aa50P(uIV>?4r9s$Y{`PfoO~nY1HS>XwLfl z4iWK^%hX%dnZd?3Z1igN6EuTFkwMS%`1!y5^jISX&B^}Q0Sv!10?Y$imE~UkbtPW) zg;R?E3-CR#{LY5_OLTp+jC`jBa!^CgXX{8>;Xgd|e4XjVFU*{2cdG&EIX9$3pnb{6 zaSa>NqA8^z_*zZp&*Gq0O?<|Op++@8<2TbVIOJNTNX0-|ZgCxMZ|Zow`HtkUl5Nma zYPo+`V8#zV)f>^Rdn3z!9Ied+h}eG_vZVPpfG-1VHnHXhHA%@hF!WPW3QHQpJJ;t8m6&X(!wM{4}!y4+M*S$c^zp>BIAV3_{UT@^8lF7fN z-BzP|h$AA7>osF>%MxBN1#<1dpHr;m65?cK*&|ne)|XtJrX&(LG(rrK4G9}CrnjB{L8{vk)7Ly9ZbSl zdMlJo!%WvgTqW%@9(V-?cVK92Y})N`*O$$HP3IJBV*0_ai~v$ z%@Q+qhzyf-GNOUFf2gvte2Y}(v)UWXFYq*;%UuDUsUAY*#~nfkzamFS46eVDPRN>^ zp!KHf&^+41jaDlKxk`wn+^c|=ia zdQS6YcXXLmCDlL{cV4X=xP2sci29Go{hO`jWvVF{xQ&wbgJVK!8I&4P4~IF9&7I?{ zwkQGb;;U9m{atnwK*n36BI}QO-+&^RCi16t5CLto`aS%q(yLeg;T<5P0AzFJij;Ew zwRhF0v1q{zk>-F1l

9Us?+Kr;?qfbv_WTpI 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 +#include + +#define SIGNAL_BUY 1 // Buy signal +#define SIGNAL_NOT 0 // no trading signal +#define SIGNAL_SELL -1 // Sell signal + +#define CLOSE_LONG 2 // signal to close Long +#define CLOSE_SHORT -2 // signal to close Short + +//--- Input parameters +input int InpAverBodyPeriod=12; // period for calculating average candlestick size +input int InpMAPeriod =5; // Trend MA period +input int InpStochK =47; // period %K +input int InpStochD =9; // period %D +input int InpStochSlow =13; // smoothing period %K +input ENUM_STO_PRICE InpStochApplied=STO_LOWHIGH; // calculation type +input ENUM_MA_METHOD InpStochMA =MODE_SMA; // smoothing type + +//--- trade parameters +input uint InpDuration=10; // position holding time in bars +input uint InpSL =200; // Stop Loss in points +input uint InpTP =200; // Take Profit in points +input uint InpSlippage=10; // slippage in points +//--- money management parameters +input double InpLot=0.1; // lot +//--- Expert ID +input long InpMagicNumber=120800; // Magic Number + +//--- global variables +int ExtAvgBodyPeriod; // average candlestick calculation period +int ExtSignalOpen =0; // Buy/Sell signal +int ExtSignalClose =0; // signal to close a position +string ExtPatternInfo =""; // current pattern information +string ExtDirection =""; // position opening direction +bool ExtPatternDetected=false; // pattern detected +bool ExtConfirmed =false; // pattern confirmed +bool ExtCloseByTime =true; // requires closing by time +bool ExtCheckPassed =true; // status checking error +//--- indicator handles +int ExtIndicatorHandle=INVALID_HANDLE; +int ExtTrendMAHandle=INVALID_HANDLE; + +//--- service objects +CTrade ExtTrade; +CSymbolInfo ExtSymbolInfo; +//+------------------------------------------------------------------+ +//| Expert initialization function | +//+------------------------------------------------------------------+ +int OnInit() + { + Print("InpSL=", InpSL); + Print("InpTP=", InpTP); +//--- set parameters for trading operations + ExtTrade.SetDeviationInPoints(InpSlippage); // slippage + ExtTrade.SetExpertMagicNumber(InpMagicNumber); // Expert Advisor ID + ExtTrade.LogLevel(LOG_LEVEL_ERRORS); // logging level + + ExtAvgBodyPeriod=InpAverBodyPeriod; +//--- indicator initialization + ExtIndicatorHandle=iStochastic(_Symbol, _Period, InpStochK, InpStochD, InpStochSlow, InpStochMA, InpStochApplied); + if(ExtIndicatorHandle==INVALID_HANDLE) + { + Print("Error creating iStochastic indicator"); + return(INIT_FAILED); + } + +//--- trend moving average + ExtTrendMAHandle=iMA(_Symbol, _Period, InpMAPeriod,0, MODE_SMA,PRICE_CLOSE); + if(ExtIndicatorHandle==INVALID_HANDLE) + { + Print("Error creating Moving Average indicator"); + return(INIT_FAILED); + } + +//--- OK + return(INIT_SUCCEEDED); + } +//+------------------------------------------------------------------+ +//| Expert deinitialization function | +//+------------------------------------------------------------------+ +void OnDeinit(const int reason) + { +//--- release indicator handle + IndicatorRelease(ExtIndicatorHandle); + } +//+------------------------------------------------------------------+ +//| Expert tick function | +//+------------------------------------------------------------------+ +void OnTick() + { +//--- save the next bar start time; all checks at bar opening only + static datetime next_bar_open=0; + +//--- Phase 1 - check the emergence of a new bar and update the status + if(TimeCurrent()>=next_bar_open) + { + //--- get the current state of environment on the new bar + // namely, set the values of global variables: + // ExtPatternDetected - pattern detection + // ExtConfirmed - pattern confirmation + // ExtSignalOpen - signal to open + // ExtSignalClose - signal to close + // ExtPatternInfo - current pattern information + if(CheckState()) + { + //--- set the new bar opening time + next_bar_open=TimeCurrent(); + next_bar_open-=next_bar_open%PeriodSeconds(_Period); + next_bar_open+=PeriodSeconds(_Period); + + //--- report the emergence of a new bar only once within a bar + if(ExtPatternDetected && ExtConfirmed) + Print(ExtPatternInfo); + } + else + { + //--- error getting the status, retry on the next tick + return; + } + } + +//--- Phase 2 - if there is a signal and no position in this direction + if(ExtSignalOpen && !PositionExist(ExtSignalOpen)) + { + Print("\r\nSignal to open position ", ExtDirection); + PositionOpen(); + if(PositionExist(ExtSignalOpen)) + ExtSignalOpen=SIGNAL_NOT; + } + +//--- Phase 3 - close if there is a signal to close + if(ExtSignalClose && PositionExist(ExtSignalClose)) + { + Print("\r\nSignal to close position ", ExtDirection); + CloseBySignal(ExtSignalClose); + if(!PositionExist(ExtSignalClose)) + ExtSignalClose=SIGNAL_NOT; + } + +//--- Phase 4 - close upon expiration + if(ExtCloseByTime && PositionExpiredByTimeExist()) + { + CloseByTime(); + ExtCloseByTime=PositionExpiredByTimeExist(); + } + } +//+------------------------------------------------------------------+ +//| Get the current environment and check for a pattern | +//+------------------------------------------------------------------+ +bool CheckState() + { +//--- check if there is a pattern + if(!CheckPattern()) + { + Print("Error, failed to check pattern"); + return(false); + } + +//--- check for confirmation + if(!CheckConfirmation()) + { + Print("Error, failed to check pattern confirmation"); + return(false); + } +//--- if there is no confirmation, cancel the signal + if(!ExtConfirmed) + ExtSignalOpen=SIGNAL_NOT; + +//--- check if there is a signal to close a position + if(!CheckCloseSignal()) + { + Print("Error, failed to check the closing signal"); + return(false); + } + +//--- if positions are to be closed after certain holding time in bars + if(InpDuration) + ExtCloseByTime=true; // set flag to close upon expiration + +//--- all checks done + return(true); + } +//+------------------------------------------------------------------+ +//| Open a position in the direction of the signal | +//+------------------------------------------------------------------+ +bool PositionOpen() + { + ExtSymbolInfo.Refresh(); + ExtSymbolInfo.RefreshRates(); + + double price=0; +//--- Stop Loss and Take Profit are not set by default + double stoploss=0.0; + double takeprofit=0.0; + + int digits=ExtSymbolInfo.Digits(); + double point=ExtSymbolInfo.Point(); + double spread=ExtSymbolInfo.Ask()-ExtSymbolInfo.Bid(); + +//--- uptrend + if(ExtSignalOpen==SIGNAL_BUY) + { + price=NormalizeDouble(ExtSymbolInfo.Ask(), digits); + //--- if Stop Loss is set + if(InpSL>0) + { + if(spread>=InpSL*point) + { + PrintFormat("StopLoss (%d points) <= current spread = %.0f points. Spread value will be used", InpSL, spread/point); + stoploss = NormalizeDouble(price-spread, digits); + } + else + stoploss = NormalizeDouble(price-InpSL*point, digits); + } + //--- if Take Profit is set + if(InpTP>0) + { + if(spread>=InpTP*point) + { + PrintFormat("TakeProfit (%d points) < current spread = %.0f points. Spread value will be used", InpTP, spread/point); + takeprofit = NormalizeDouble(price+spread, digits); + } + else + takeprofit = NormalizeDouble(price+InpTP*point, digits); + } + + if(!ExtTrade.Buy(InpLot, Symbol(), price, stoploss, takeprofit)) + { + PrintFormat("Failed %s buy %G at %G (sl=%G tp=%G) failed. Ask=%G error=%d", + Symbol(), InpLot, price, stoploss, takeprofit, ExtSymbolInfo.Ask(), GetLastError()); + return(false); + } + } + +//--- downtrend + if(ExtSignalOpen==SIGNAL_SELL) + { + price=NormalizeDouble(ExtSymbolInfo.Bid(), digits); + //--- if Stop Loss is set + if(InpSL>0) + { + if(spread>=InpSL*point) + { + PrintFormat("StopLoss (%d points) <= current spread = %.0f points. Spread value will be used", InpSL, spread/point); + stoploss = NormalizeDouble(price+spread, digits); + } + else + stoploss = NormalizeDouble(price+InpSL*point, digits); + } + //--- if Take Profit is set + if(InpTP>0) + { + if(spread>=InpTP*point) + { + PrintFormat("TakeProfit (%d points) < current spread = %.0f points. Spread value will be used", InpTP, spread/point); + takeprofit = NormalizeDouble(price-spread, digits); + } + else + takeprofit = NormalizeDouble(price-InpTP*point, digits); + } + + if(!ExtTrade.Sell(InpLot, Symbol(), price, stoploss, takeprofit)) + { + PrintFormat("Failed %s sell at %G (sl=%G tp=%G) failed. Bid=%G error=%d", + Symbol(), price, stoploss, takeprofit, ExtSymbolInfo.Bid(), GetLastError()); + ExtTrade.PrintResult(); + Print(" "); + return(false); + } + } + + return(true); + } +//+------------------------------------------------------------------+ +//| Close a position based on the specified signal | +//+------------------------------------------------------------------+ +void CloseBySignal(int type_close) + { +//--- if there is no signal to close, return successful completion + if(type_close==SIGNAL_NOT) + return; +//--- if there are no positions opened by our EA + if(PositionExist(ExtSignalClose)==0) + return; + +//--- closing direction + long type; + switch(type_close) + { + case CLOSE_SHORT: + type=POSITION_TYPE_SELL; + break; + case CLOSE_LONG: + type=POSITION_TYPE_BUY; + break; + default: + Print("Error! Signal to close not detected"); + return; + } + +//--- check all positions and close ours based on the signal + int positions=PositionsTotal(); + for(int i=positions-1; i>=0; i--) + { + ulong ticket=PositionGetTicket(i); + if(ticket!=0) + { + //--- get the name of the symbol and the position id (magic) + string symbol=PositionGetString(POSITION_SYMBOL); + long magic =PositionGetInteger(POSITION_MAGIC); + //--- if they correspond to our values + if(symbol==Symbol() && magic==InpMagicNumber) + { + if(PositionGetInteger(POSITION_TYPE)==type) + { + ExtTrade.PositionClose(ticket, InpSlippage); + ExtTrade.PrintResult(); + Print(" "); + } + } + } + } + } +//+------------------------------------------------------------------+ +//| Close positions upon holding time expiration in bars | +//+------------------------------------------------------------------+ +void CloseByTime() + { +//--- if there are no positions opened by our EA + if(PositionExist(ExtSignalOpen)==0) + return; + +//--- check all positions and close ours based on the holding time in bars + int positions=PositionsTotal(); + for(int i=positions-1; i>=0; i--) + { + ulong ticket=PositionGetTicket(i); + if(ticket!=0) + { + //--- get the name of the symbol and the position id (magic) + string symbol=PositionGetString(POSITION_SYMBOL); + long magic =PositionGetInteger(POSITION_MAGIC); + //--- if they correspond to our values + if(symbol==Symbol() && magic==InpMagicNumber) + { + //--- position opening time + datetime open_time=(datetime)PositionGetInteger(POSITION_TIME); + //--- check position holding time in bars + if(BarsHold(open_time)>=(int)InpDuration) + { + Print("\r\nTime to close position #", ticket); + ExtTrade.PositionClose(ticket, InpSlippage); + ExtTrade.PrintResult(); + Print(" "); + } + } + } + } + } +//+------------------------------------------------------------------+ +//| Returns true if there are open positions | +//+------------------------------------------------------------------+ +bool PositionExist(int signal_direction) + { + bool check_type=(signal_direction!=SIGNAL_NOT); + +//--- what positions to search + ENUM_POSITION_TYPE search_type=WRONG_VALUE; + if(check_type) + switch(signal_direction) + { + case SIGNAL_BUY: + search_type=POSITION_TYPE_BUY; + break; + case SIGNAL_SELL: + search_type=POSITION_TYPE_SELL; + break; + case CLOSE_LONG: + search_type=POSITION_TYPE_BUY; + break; + case CLOSE_SHORT: + search_type=POSITION_TYPE_SELL; + break; + default: + //--- entry direction is not specified; nothing to search + return(false); + } + +//--- go through the list of all positions + int positions=PositionsTotal(); + for(int i=0; i=(int)InpDuration)) + return(true); + } + } + } +//--- open position not found + return(false); + } +//+------------------------------------------------------------------+ +//| Checks position closing time in bars | +//+------------------------------------------------------------------+ +int BarsHold(datetime open_time) + { +//--- first run a basic simple check + if(TimeCurrent()-open_timeAvgBody(1)) && // long body of the white candlestick (long white) + (Close(1)Open(2)) && // close within the previous candlestick body (white) + (MidOpenClose(2)>CloseAvg(2)) && // uptrend + (Open(1)>High(2))) // open above the previous day's High price (open at new high) + { + ExtPatternDetected=true; + ExtSignalOpen=SIGNAL_SELL; + ExtPatternInfo="\r\nDark Cloud Cover detected"; + ExtDirection="Sell"; + return(true); + } + +//--- check Piercing Line + if((Close(1)-Open(1)>AvgBody(1)) && // long body of the white candlestick (long white) + (Open(2)-Close(2)>AvgBody(1)) && // long body of the previous black candlestick (long black) + (Close(1)>Close(2)) && // close within the body + (Close(1)70)) + { + ExtConfirmed=true; + ExtPatternInfo+="\r\n Confirmed: StochSignal>70"; + } + +//--- successful completion of the check + return(true); + } +//+------------------------------------------------------------------+ +//| Check if there is a signal to close | +//+------------------------------------------------------------------+ +bool CheckCloseSignal() + { + ExtSignalClose=false; +//--- if there is a signal to enter the market, do not check the signal to close + if(ExtSignalOpen!=SIGNAL_NOT) + return(true); + +//--- check if there is a signal to close a long position + if(((StochSignal(1)<80) && (StochSignal(2)>80))|| // 80 crossed downwards + ((StochSignal(1)<20) && (StochSignal(2)>20))) // 20 crossed downwards + { + //--- there is a signal to close a long position + ExtSignalClose=CLOSE_LONG; + ExtDirection="Long"; + } + +//--- check if there is a signal to close a short position + if((((StochSignal(1)>20) && (StochSignal(2)<20)) || // 20 crossed upwards + ((StochSignal(1)>80) && (StochSignal(2)<80)))) // 80 crossed upwards + { + //--- there is a signal to close a short position + ExtSignalClose=CLOSE_SHORT; + ExtDirection="Short"; + } + +//--- successful completion of the check + return(true); + } +//+------------------------------------------------------------------+ +//| Stochastic indicator value at the specified bar | +//+------------------------------------------------------------------+ +double StochSignal(int index) + { + double indicator_values[]; + if(CopyBuffer(ExtIndicatorHandle, SIGNAL_LINE, index, 1, indicator_values)<0) + { + //--- if the copying fails, report the error code + PrintFormat("Failed to copy data from the iStochastic indicator, error code %d", GetLastError()); + return(EMPTY_VALUE); + } + return(indicator_values[0]); + } +//+------------------------------------------------------------------+ +//| SMA value at the specified bar | +//+------------------------------------------------------------------+ +double CloseAvg(int index) + { + double indicator_values[]; + if(CopyBuffer(ExtTrendMAHandle, 0, index, 1, indicator_values)<0) + { + //--- if the copying fails, report the error code + PrintFormat("Failed to copy data from the Simple Moving Average indicator, error code %d", GetLastError()); + return(EMPTY_VALUE); + } + return(indicator_values[0]); + } +//+------------------------------------------------------------------+ diff --git a/BKPS/14031206/Experts/Free Robots/HangingMan Hammer CCI.ex5 b/BKPS/14031206/Experts/Free Robots/HangingMan Hammer CCI.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..829afb1a800fa55292cca741b6d8bff9ea7b53a4 GIT binary patch literal 43512 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 literal 0 HcmV?d00001 diff --git a/BKPS/14031206/Experts/Free Robots/HangingMan Hammer CCI.mq5 b/BKPS/14031206/Experts/Free Robots/HangingMan Hammer CCI.mq5 new file mode 100644 index 0000000..d137f14 --- /dev/null +++ b/BKPS/14031206/Experts/Free Robots/HangingMan Hammer CCI.mq5 @@ -0,0 +1,679 @@ +//+------------------------------------------------------------------+ +//| HangingMan Hammer CCI.mq5 | +//| Copyright 2024, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2024, MetaQuotes Ltd." +#property link "https://www.mql5.com" +#property version "1.00" + +#include +#include + +#define SIGNAL_BUY 1 // Buy signal +#define SIGNAL_NOT 0 // no trading signal +#define SIGNAL_SELL -1 // Sell signal + +#define CLOSE_LONG 2 // signal to close Long +#define CLOSE_SHORT -2 // signal to close Short + +//--- Input parameters +input int InpAverBodyPeriod=12; // period for calculating average candlestick size +input int InpMAPeriod =5; // Trend MA period +input int InpPeriodCCI =37; // CCI period +input ENUM_APPLIED_PRICE InpPrice=PRICE_CLOSE; // price type + +//--- trade parameters +input uint InpDuration=10; // position holding time in bars +input uint InpSL =200; // Stop Loss in points +input uint InpTP =200; // Take Profit in points +input uint InpSlippage=10; // slippage in points +//--- money management parameters +input double InpLot=0.1; // lot +//--- Expert ID +input long InpMagicNumber=124100; // Magic Number + +//--- global variables +int ExtAvgBodyPeriod; // average candlestick calculation period +int ExtSignalOpen =0; // Buy/Sell signal +int ExtSignalClose =0; // signal to close a position +string ExtPatternInfo =""; // current pattern information +string ExtDirection =""; // position opening direction +bool ExtPatternDetected=false; // pattern detected +bool ExtConfirmed =false; // pattern confirmed +bool ExtCloseByTime =true; // requires closing by time +bool ExtCheckPassed =true; // status checking error +//--- indicator handles +int ExtIndicatorHandle=INVALID_HANDLE; +int ExtTrendMAHandle=INVALID_HANDLE; + +//--- service objects +CTrade ExtTrade; +CSymbolInfo ExtSymbolInfo; +//+------------------------------------------------------------------+ +//| Expert initialization function | +//+------------------------------------------------------------------+ +int OnInit() + { + Print("InpSL=", InpSL); + Print("InpTP=", InpTP); +//--- set parameters for trading operations + ExtTrade.SetDeviationInPoints(InpSlippage); // slippage + ExtTrade.SetExpertMagicNumber(InpMagicNumber); // Expert Advisor ID + ExtTrade.LogLevel(LOG_LEVEL_ERRORS); // logging level + + ExtAvgBodyPeriod=InpAverBodyPeriod; +//--- indicator initialization + ExtIndicatorHandle=iCCI(_Symbol, _Period, InpPeriodCCI, InpPrice); + if(ExtIndicatorHandle==INVALID_HANDLE) + { + Print("Error creating CCI indicator"); + return(INIT_FAILED); + } + +//--- trend moving average + ExtTrendMAHandle=iMA(_Symbol, _Period, InpMAPeriod, 0, MODE_SMA, PRICE_CLOSE); + if(ExtIndicatorHandle==INVALID_HANDLE) + { + Print("Error creating Moving Average indicator"); + return(INIT_FAILED); + } + +//--- OK + return(INIT_SUCCEEDED); + } +//+------------------------------------------------------------------+ +//| Expert deinitialization function | +//+------------------------------------------------------------------+ +void OnDeinit(const int reason) + { +//--- release indicator handle + IndicatorRelease(ExtIndicatorHandle); + } +//+------------------------------------------------------------------+ +//| Expert tick function | +//+------------------------------------------------------------------+ +void OnTick() + { +//--- save the next bar start time; all checks at bar opening only + static datetime next_bar_open=0; + +//--- Phase 1 - check the emergence of a new bar and update the status + if(TimeCurrent()>=next_bar_open) + { + //--- get the current state of environment on the new bar + // namely, set the values of global variables: + // ExtPatternDetected - pattern detection + // ExtConfirmed - pattern confirmation + // ExtSignalOpen - signal to open + // ExtSignalClose - signal to close + // ExtPatternInfo - current pattern information + if(CheckState()) + { + //--- set the new bar opening time + next_bar_open=TimeCurrent(); + next_bar_open-=next_bar_open%PeriodSeconds(_Period); + next_bar_open+=PeriodSeconds(_Period); + + //--- report the emergence of a new bar only once within a bar + if(ExtPatternDetected && ExtConfirmed) + Print(ExtPatternInfo); + } + else + { + //--- error getting the status, retry on the next tick + return; + } + } + +//--- Phase 2 - if there is a signal and no position in this direction + if(ExtSignalOpen && !PositionExist(ExtSignalOpen)) + { + Print("\r\nSignal to open position ", ExtDirection); + PositionOpen(); + if(PositionExist(ExtSignalOpen)) + ExtSignalOpen=SIGNAL_NOT; + } + +//--- Phase 3 - close if there is a signal to close + if(ExtSignalClose && PositionExist(ExtSignalClose)) + { + Print("\r\nSignal to close position ", ExtDirection); + CloseBySignal(ExtSignalClose); + if(!PositionExist(ExtSignalClose)) + ExtSignalClose=SIGNAL_NOT; + } + +//--- Phase 4 - close upon expiration + if(ExtCloseByTime && PositionExpiredByTimeExist()) + { + CloseByTime(); + ExtCloseByTime=PositionExpiredByTimeExist(); + } + } +//+------------------------------------------------------------------+ +//| Get the current environment and check for a pattern | +//+------------------------------------------------------------------+ +bool CheckState() + { +//--- check if there is a pattern + if(!CheckPattern()) + { + Print("Error, failed to check pattern"); + return(false); + } + +//--- check for confirmation + if(!CheckConfirmation()) + { + Print("Error, failed to check pattern confirmation"); + return(false); + } +//--- if there is no confirmation, cancel the signal + if(!ExtConfirmed) + ExtSignalOpen=SIGNAL_NOT; + +//--- check if there is a signal to close a position + if(!CheckCloseSignal()) + { + Print("Error, failed to check the closing signal"); + return(false); + } + +//--- if positions are to be closed after certain holding time in bars + if(InpDuration) + ExtCloseByTime=true; // set flag to close upon expiration + +//--- all checks done + return(true); + } +//+------------------------------------------------------------------+ +//| Open a position in the direction of the signal | +//+------------------------------------------------------------------+ +bool PositionOpen() + { + ExtSymbolInfo.Refresh(); + ExtSymbolInfo.RefreshRates(); + + double price=0; +//--- Stop Loss and Take Profit are not set by default + double stoploss=0.0; + double takeprofit=0.0; + + int digits=ExtSymbolInfo.Digits(); + double point=ExtSymbolInfo.Point(); + double spread=ExtSymbolInfo.Ask()-ExtSymbolInfo.Bid(); + +//--- uptrend + if(ExtSignalOpen==SIGNAL_BUY) + { + price=NormalizeDouble(ExtSymbolInfo.Ask(), digits); + //--- if Stop Loss is set + if(InpSL>0) + { + if(spread>=InpSL*point) + { + PrintFormat("StopLoss (%d points) <= current spread = %.0f points. Spread value will be used", InpSL, spread/point); + stoploss = NormalizeDouble(price-spread, digits); + } + else + stoploss = NormalizeDouble(price-InpSL*point, digits); + } + //--- if Take Profit is set + if(InpTP>0) + { + if(spread>=InpTP*point) + { + PrintFormat("TakeProfit (%d points) < current spread = %.0f points. Spread value will be used", InpTP, spread/point); + takeprofit = NormalizeDouble(price+spread, digits); + } + else + takeprofit = NormalizeDouble(price+InpTP*point, digits); + } + + if(!ExtTrade.Buy(InpLot, Symbol(), price, stoploss, takeprofit)) + { + PrintFormat("Failed %s buy %G at %G (sl=%G tp=%G) failed. Ask=%G error=%d", + Symbol(), InpLot, price, stoploss, takeprofit, ExtSymbolInfo.Ask(), GetLastError()); + return(false); + } + } + +//--- downtrend + if(ExtSignalOpen==SIGNAL_SELL) + { + price=NormalizeDouble(ExtSymbolInfo.Bid(), digits); + //--- if Stop Loss is set + if(InpSL>0) + { + if(spread>=InpSL*point) + { + PrintFormat("StopLoss (%d points) <= current spread = %.0f points. Spread value will be used", InpSL, spread/point); + stoploss = NormalizeDouble(price+spread, digits); + } + else + stoploss = NormalizeDouble(price+InpSL*point, digits); + } + //--- if Take Profit is set + if(InpTP>0) + { + if(spread>=InpTP*point) + { + PrintFormat("TakeProfit (%d points) < current spread = %.0f points. Spread value will be used", InpTP, spread/point); + takeprofit = NormalizeDouble(price-spread, digits); + } + else + takeprofit = NormalizeDouble(price-InpTP*point, digits); + } + + if(!ExtTrade.Sell(InpLot, Symbol(), price, stoploss, takeprofit)) + { + PrintFormat("Failed %s sell at %G (sl=%G tp=%G) failed. Bid=%G error=%d", + Symbol(), price, stoploss, takeprofit, ExtSymbolInfo.Bid(), GetLastError()); + ExtTrade.PrintResult(); + Print(" "); + return(false); + } + } + + return(true); + } +//+------------------------------------------------------------------+ +//| Close a position based on the specified signal | +//+------------------------------------------------------------------+ +void CloseBySignal(int type_close) + { +//--- if there is no signal to close, return successful completion + if(type_close==SIGNAL_NOT) + return; +//--- if there are no positions opened by our EA + if(PositionExist(ExtSignalClose)==0) + return; + +//--- closing direction + long type; + switch(type_close) + { + case CLOSE_SHORT: + type=POSITION_TYPE_SELL; + break; + case CLOSE_LONG: + type=POSITION_TYPE_BUY; + break; + default: + Print("Error! Signal to close not detected"); + return; + } + +//--- check all positions and close ours based on the signal + int positions=PositionsTotal(); + for(int i=positions-1; i>=0; i--) + { + ulong ticket=PositionGetTicket(i); + if(ticket!=0) + { + //--- get the name of the symbol and the position id (magic) + string symbol=PositionGetString(POSITION_SYMBOL); + long magic =PositionGetInteger(POSITION_MAGIC); + //--- if they correspond to our values + if(symbol==Symbol() && magic==InpMagicNumber) + { + if(PositionGetInteger(POSITION_TYPE)==type) + { + ExtTrade.PositionClose(ticket, InpSlippage); + ExtTrade.PrintResult(); + Print(" "); + } + } + } + } + } +//+------------------------------------------------------------------+ +//| Close positions upon holding time expiration in bars | +//+------------------------------------------------------------------+ +void CloseByTime() + { +//--- if there are no positions opened by our EA + if(PositionExist(ExtSignalOpen)==0) + return; + +//--- check all positions and close ours based on the holding time in bars + int positions=PositionsTotal(); + for(int i=positions-1; i>=0; i--) + { + ulong ticket=PositionGetTicket(i); + if(ticket!=0) + { + //--- get the name of the symbol and the position id (magic) + string symbol=PositionGetString(POSITION_SYMBOL); + long magic =PositionGetInteger(POSITION_MAGIC); + //--- if they correspond to our values + if(symbol==Symbol() && magic==InpMagicNumber) + { + //--- position opening time + datetime open_time=(datetime)PositionGetInteger(POSITION_TIME); + //--- check position holding time in bars + if(BarsHold(open_time)>=(int)InpDuration) + { + Print("\r\nTime to close position #", ticket); + ExtTrade.PositionClose(ticket, InpSlippage); + ExtTrade.PrintResult(); + Print(" "); + } + } + } + } + } +//+------------------------------------------------------------------+ +//| Returns true if there are open positions | +//+------------------------------------------------------------------+ +bool PositionExist(int signal_direction) + { + bool check_type=(signal_direction!=SIGNAL_NOT); + +//--- what positions to search + ENUM_POSITION_TYPE search_type=WRONG_VALUE; + if(check_type) + switch(signal_direction) + { + case SIGNAL_BUY: + search_type=POSITION_TYPE_BUY; + break; + case SIGNAL_SELL: + search_type=POSITION_TYPE_SELL; + break; + case CLOSE_LONG: + search_type=POSITION_TYPE_BUY; + break; + case CLOSE_SHORT: + search_type=POSITION_TYPE_SELL; + break; + default: + //--- entry direction is not specified; nothing to search + return(false); + } + +//--- go through the list of all positions + int positions=PositionsTotal(); + for(int i=0; i=(int)InpDuration)) + return(true); + } + } + } + +//--- open position not found + return(false); + } +//+------------------------------------------------------------------+ +//| Checks position closing time in bars | +//+------------------------------------------------------------------+ +int BarsHold(datetime open_time) + { +//--- first run a basic simple check + if(TimeCurrent()-open_timeCloseAvg(2)) && // up trend + (MathMin(Open(1), Close(1))> (High(1)-(High(1)-Low(1))/3.0)) && // body in upper 1/3 + (Close(1)>Close(2)) && (Open(1)>Open(2))) // body gap + { + ExtPatternDetected=true; + ExtSignalOpen=SIGNAL_SELL; + ExtPatternInfo="\r\nHanging Man detected"; + ExtDirection="Sell"; + return(true); + } + + +//--- check Hammer + if((MidPoint(1)(High(1)-(High(1)-Low(1))/3.0)) && // body in upper 1/3 + (Close(1)50)) + { + ExtConfirmed=true; + ExtPatternInfo+="\r\n Confirmed: CCI>50"; + } + +//--- successful completion of the check + return(true); + } +//+------------------------------------------------------------------+ +//| Check if there is a signal to close | +//+------------------------------------------------------------------+ +bool CheckCloseSignal() + { + ExtSignalClose=false; +//--- if there is a signal to enter the market, do not check the signal to close + if(ExtSignalOpen!=SIGNAL_NOT) + return(true); + +//--- check if there is a signal to close a long position + if(((CCI(1)<80) && (CCI(2)>80)) || ((CCI(1)<-80) && (CCI(2)>-80))) + { + //--- there is a signal to close a long position + ExtSignalClose=CLOSE_LONG; + ExtDirection="Long"; + } + +//--- check if there is a signal to close a short position + if(((CCI(1)>-80) && (CCI(2)<-80)) || ((CCI(1)>80) && (CCI(2)<80))) + { + //--- there is a signal to close a short position + ExtSignalClose=CLOSE_SHORT; + ExtDirection="Short"; + } + +//--- successful completion of the check + return(true); + } +//+------------------------------------------------------------------+ +//| CCI indicator value at the specified bar | +//+------------------------------------------------------------------+ +double CCI(int index) + { + double indicator_values[]; + if(CopyBuffer(ExtIndicatorHandle, 0, index, 1, indicator_values)<0) + { + //--- if the copying fails, report the error code + PrintFormat("Failed to copy data from the CCI indicator, error code %d", GetLastError()); + return(EMPTY_VALUE); + } + return(indicator_values[0]); + } +//+------------------------------------------------------------------+ +//| SMA value at the specified bar | +//+------------------------------------------------------------------+ +double CloseAvg(int index) + { + double indicator_values[]; + if(CopyBuffer(ExtTrendMAHandle, 0, index, 1, indicator_values)<0) + { + //--- if the copying fails, report the error code + PrintFormat("Failed to copy data from the Simple Moving Average indicator, error code %d", GetLastError()); + return(EMPTY_VALUE); + } + return(indicator_values[0]); + } +//+------------------------------------------------------------------+ diff --git a/BKPS/14031206/Experts/Free Robots/HangingMan Hammer MFI.ex5 b/BKPS/14031206/Experts/Free Robots/HangingMan Hammer MFI.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..cbfedf7847a0ba7b0ef188bd522dfcbe32038de9 GIT binary patch literal 41890 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 +#include + +#define SIGNAL_BUY 1 // Buy signal +#define SIGNAL_NOT 0 // no trading signal +#define SIGNAL_SELL -1 // Sell signal + +#define CLOSE_LONG 2 // signal to close Long +#define CLOSE_SHORT -2 // signal to close Short + +//--- Input parameters +input int InpAverBodyPeriod=12; // period for calculating average candlestick size +input int InpMAPeriod =5; // Trend MA period +input int InpPeriodMFI =37; // MFI period +input ENUM_APPLIED_VOLUME InpVolume=VOLUME_TICK; // volume type + +//--- trade parameters +input uint InpDuration=10; // position holding time in bars +input uint InpSL =200; // Stop Loss in points +input uint InpTP =200; // Take Profit in points +input uint InpSlippage=10; // slippage in points +//--- money management parameters +input double InpLot=0.1; // lot +//--- Expert ID +input long InpMagicNumber=123600; // Magic Number + +//--- global variables +int ExtAvgBodyPeriod; // average candlestick calculation period +int ExtSignalOpen =0; // Buy/Sell signal +int ExtSignalClose =0; // signal to close a position +string ExtPatternInfo =""; // current pattern information +string ExtDirection =""; // position opening direction +bool ExtPatternDetected=false; // pattern detected +bool ExtConfirmed =false; // pattern confirmed +bool ExtCloseByTime =true; // requires closing by time +bool ExtCheckPassed =true; // status checking error +//--- indicator handles +int ExtIndicatorHandle=INVALID_HANDLE; +int ExtTrendMAHandle=INVALID_HANDLE; + +//--- service objects +CTrade ExtTrade; +CSymbolInfo ExtSymbolInfo; +//+------------------------------------------------------------------+ +//| Expert initialization function | +//+------------------------------------------------------------------+ +int OnInit() + { + Print("InpSL=", InpSL); + Print("InpTP=", InpTP); +//--- set parameters for trading operations + ExtTrade.SetDeviationInPoints(InpSlippage); // slippage + ExtTrade.SetExpertMagicNumber(InpMagicNumber); // Expert Advisor ID + ExtTrade.LogLevel(LOG_LEVEL_ERRORS); // logging level + + ExtAvgBodyPeriod=InpAverBodyPeriod; +//--- indicator initialization + ExtIndicatorHandle=iMFI(_Symbol, _Period, InpPeriodMFI, InpVolume); + if(ExtIndicatorHandle==INVALID_HANDLE) + { + Print("Error creating MFI indicator"); + return(INIT_FAILED); + } + +//--- trend moving average + ExtTrendMAHandle=iMA(_Symbol, _Period, InpMAPeriod, 0, MODE_SMA, PRICE_CLOSE); + if(ExtIndicatorHandle==INVALID_HANDLE) + { + Print("Error creating Moving Average indicator"); + return(INIT_FAILED); + } + +//--- OK + return(INIT_SUCCEEDED); + } +//+------------------------------------------------------------------+ +//| Expert deinitialization function | +//+------------------------------------------------------------------+ +void OnDeinit(const int reason) + { +//--- release indicator handle + IndicatorRelease(ExtIndicatorHandle); + } +//+------------------------------------------------------------------+ +//| Expert tick function | +//+------------------------------------------------------------------+ +void OnTick() + { +//--- save the next bar start time; all checks at bar opening only + static datetime next_bar_open=0; + +//--- Phase 1 - check the emergence of a new bar and update the status + if(TimeCurrent()>=next_bar_open) + { + //--- get the current state of environment on the new bar + // namely, set the values of global variables: + // ExtPatternDetected - pattern detection + // ExtConfirmed - pattern confirmation + // ExtSignalOpen - signal to open + // ExtSignalClose - signal to close + // ExtPatternInfo - current pattern information + if(CheckState()) + { + //--- set the new bar opening time + next_bar_open=TimeCurrent(); + next_bar_open-=next_bar_open%PeriodSeconds(_Period); + next_bar_open+=PeriodSeconds(_Period); + + //--- report the emergence of a new bar only once within a bar + if(ExtPatternDetected && ExtConfirmed) + Print(ExtPatternInfo); + } + else + { + //--- error getting the status, retry on the next tick + return; + } + } + +//--- Phase 2 - if there is a signal and no position in this direction + if(ExtSignalOpen && !PositionExist(ExtSignalOpen)) + { + Print("\r\nSignal to open position ", ExtDirection); + PositionOpen(); + if(PositionExist(ExtSignalOpen)) + ExtSignalOpen=SIGNAL_NOT; + } + +//--- Phase 3 - close if there is a signal to close + if(ExtSignalClose && PositionExist(ExtSignalClose)) + { + Print("\r\nSignal to close position ", ExtDirection); + CloseBySignal(ExtSignalClose); + if(!PositionExist(ExtSignalClose)) + ExtSignalClose=SIGNAL_NOT; + } + +//--- Phase 4 - close upon expiration + if(ExtCloseByTime && PositionExpiredByTimeExist()) + { + CloseByTime(); + ExtCloseByTime=PositionExpiredByTimeExist(); + } + } +//+------------------------------------------------------------------+ +//| Get the current environment and check for a pattern | +//+------------------------------------------------------------------+ +bool CheckState() + { +//--- check if there is a pattern + if(!CheckPattern()) + { + Print("Error, failed to check pattern"); + return(false); + } + +//--- check for confirmation + if(!CheckConfirmation()) + { + Print("Error, failed to check pattern confirmation"); + return(false); + } +//--- if there is no confirmation, cancel the signal + if(!ExtConfirmed) + ExtSignalOpen=SIGNAL_NOT; + +//--- check if there is a signal to close a position + if(!CheckCloseSignal()) + { + Print("Error, failed to check the closing signal"); + return(false); + } + +//--- if positions are to be closed after certain holding time in bars + if(InpDuration) + ExtCloseByTime=true; // set flag to close upon expiration + +//--- all checks done + return(true); + } +//+------------------------------------------------------------------+ +//| Open a position in the direction of the signal | +//+------------------------------------------------------------------+ +bool PositionOpen() + { + ExtSymbolInfo.Refresh(); + ExtSymbolInfo.RefreshRates(); + + double price=0; +//--- Stop Loss and Take Profit are not set by default + double stoploss=0.0; + double takeprofit=0.0; + + int digits=ExtSymbolInfo.Digits(); + double point=ExtSymbolInfo.Point(); + double spread=ExtSymbolInfo.Ask()-ExtSymbolInfo.Bid(); + +//--- uptrend + if(ExtSignalOpen==SIGNAL_BUY) + { + price=NormalizeDouble(ExtSymbolInfo.Ask(), digits); + //--- if Stop Loss is set + if(InpSL>0) + { + if(spread>=InpSL*point) + { + PrintFormat("StopLoss (%d points) <= current spread = %.0f points. Spread value will be used", InpSL, spread/point); + stoploss = NormalizeDouble(price-spread, digits); + } + else + stoploss = NormalizeDouble(price-InpSL*point, digits); + } + //--- if Take Profit is set + if(InpTP>0) + { + if(spread>=InpTP*point) + { + PrintFormat("TakeProfit (%d points) < current spread = %.0f points. Spread value will be used", InpTP, spread/point); + takeprofit = NormalizeDouble(price+spread, digits); + } + else + takeprofit = NormalizeDouble(price+InpTP*point, digits); + } + + if(!ExtTrade.Buy(InpLot, Symbol(), price, stoploss, takeprofit)) + { + PrintFormat("Failed %s buy %G at %G (sl=%G tp=%G) failed. Ask=%G error=%d", + Symbol(), InpLot, price, stoploss, takeprofit, ExtSymbolInfo.Ask(), GetLastError()); + return(false); + } + } + +//--- downtrend + if(ExtSignalOpen==SIGNAL_SELL) + { + price=NormalizeDouble(ExtSymbolInfo.Bid(), digits); + //--- if Stop Loss is set + if(InpSL>0) + { + if(spread>=InpSL*point) + { + PrintFormat("StopLoss (%d points) <= current spread = %.0f points. Spread value will be used", InpSL, spread/point); + stoploss = NormalizeDouble(price+spread, digits); + } + else + stoploss = NormalizeDouble(price+InpSL*point, digits); + } + //--- if Take Profit is set + if(InpTP>0) + { + if(spread>=InpTP*point) + { + PrintFormat("TakeProfit (%d points) < current spread = %.0f points. Spread value will be used", InpTP, spread/point); + takeprofit = NormalizeDouble(price-spread, digits); + } + else + takeprofit = NormalizeDouble(price-InpTP*point, digits); + } + + if(!ExtTrade.Sell(InpLot, Symbol(), price, stoploss, takeprofit)) + { + PrintFormat("Failed %s sell at %G (sl=%G tp=%G) failed. Bid=%G error=%d", + Symbol(), price, stoploss, takeprofit, ExtSymbolInfo.Bid(), GetLastError()); + ExtTrade.PrintResult(); + Print(" "); + return(false); + } + } + + return(true); + } +//+------------------------------------------------------------------+ +//| Close a position based on the specified signal | +//+------------------------------------------------------------------+ +void CloseBySignal(int type_close) + { +//--- if there is no signal to close, return successful completion + if(type_close==SIGNAL_NOT) + return; +//--- if there are no positions opened by our EA + if(PositionExist(ExtSignalClose)==0) + return; + +//--- closing direction + long type; + switch(type_close) + { + case CLOSE_SHORT: + type=POSITION_TYPE_SELL; + break; + case CLOSE_LONG: + type=POSITION_TYPE_BUY; + break; + default: + Print("Error! Signal to close not detected"); + return; + } + +//--- check all positions and close ours based on the signal + int positions=PositionsTotal(); + for(int i=positions-1; i>=0; i--) + { + ulong ticket=PositionGetTicket(i); + if(ticket!=0) + { + //--- get the name of the symbol and the position id (magic) + string symbol=PositionGetString(POSITION_SYMBOL); + long magic =PositionGetInteger(POSITION_MAGIC); + //--- if they correspond to our values + if(symbol==Symbol() && magic==InpMagicNumber) + { + if(PositionGetInteger(POSITION_TYPE)==type) + { + ExtTrade.PositionClose(ticket, InpSlippage); + ExtTrade.PrintResult(); + Print(" "); + } + } + } + } + } +//+------------------------------------------------------------------+ +//| Close positions upon holding time expiration in bars | +//+------------------------------------------------------------------+ +void CloseByTime() + { +//--- if there are no positions opened by our EA + if(PositionExist(ExtSignalOpen)==0) + return; + +//--- check all positions and close ours based on the holding time in bars + int positions=PositionsTotal(); + for(int i=positions-1; i>=0; i--) + { + ulong ticket=PositionGetTicket(i); + if(ticket!=0) + { + //--- get the name of the symbol and the position id (magic) + string symbol=PositionGetString(POSITION_SYMBOL); + long magic =PositionGetInteger(POSITION_MAGIC); + //--- if they correspond to our values + if(symbol==Symbol() && magic==InpMagicNumber) + { + //--- position opening time + datetime open_time=(datetime)PositionGetInteger(POSITION_TIME); + //--- check position holding time in bars + if(BarsHold(open_time)>=(int)InpDuration) + { + Print("\r\nTime to close position #", ticket); + ExtTrade.PositionClose(ticket, InpSlippage); + ExtTrade.PrintResult(); + Print(" "); + } + } + } + } + } +//+------------------------------------------------------------------+ +//| Returns true if there are open positions | +//+------------------------------------------------------------------+ +bool PositionExist(int signal_direction) + { + bool check_type=(signal_direction!=SIGNAL_NOT); + +//--- what positions to search + ENUM_POSITION_TYPE search_type=WRONG_VALUE; + if(check_type) + switch(signal_direction) + { + case SIGNAL_BUY: + search_type=POSITION_TYPE_BUY; + break; + case SIGNAL_SELL: + search_type=POSITION_TYPE_SELL; + break; + case CLOSE_LONG: + search_type=POSITION_TYPE_BUY; + break; + case CLOSE_SHORT: + search_type=POSITION_TYPE_SELL; + break; + default: + //--- entry direction is not specified; nothing to search + return(false); + } + +//--- go through the list of all positions + int positions=PositionsTotal(); + for(int i=0; i=(int)InpDuration)) + return(true); + } + } + } + +//--- open position not found + return(false); + } + +//+------------------------------------------------------------------+ +//| Checks position closing time in bars | +//+------------------------------------------------------------------+ +int BarsHold(datetime open_time) + { +//--- first run a basic simple check + if(TimeCurrent()-open_timeCloseAvg(2)) && // up trend + (MathMin(Open(1), Close(1))> (High(1)-(High(1)-Low(1))/3.0)) && // body in upper 1/3 + (Close(1)>Close(2)) && (Open(1)>Open(2))) // body gap + { + ExtPatternDetected=true; + ExtSignalOpen=SIGNAL_SELL; + ExtPatternInfo="\r\nHanging Man detected"; + ExtDirection="Sell"; + return(true); + } + + +//--- check Hammer + if((MidPoint(1)(High(1)-(High(1)-Low(1))/3.0)) && // body in upper 1/3 + (Close(1)60)) + { + ExtConfirmed=true; + ExtPatternInfo+="\r\n Confirmed: MFI>60"; + } + +//--- successful completion of the check + return(true); + } +//+------------------------------------------------------------------+ +//| Check if there is a signal to close | +//+------------------------------------------------------------------+ +bool CheckCloseSignal() + { + ExtSignalClose=false; +//--- if there is a signal to enter the market, do not check the signal to close + if(ExtSignalOpen!=SIGNAL_NOT) + return(true); + +//--- check if there is a signal to close a long position + if(((MFI(1)<70) && (MFI(2)>70)) || ((MFI(1)<30) && (MFI(2)>30))) + { + //--- there is a signal to close a long position + ExtSignalClose=CLOSE_LONG; + ExtDirection="Long"; + } + +//--- check if there is a signal to close a short position + if(((MFI(1)>30) && (MFI(2)<30)) || ((MFI(1)>70) && (MFI(2)<70))) + { + //--- there is a signal to close a short position + ExtSignalClose=CLOSE_SHORT; + ExtDirection="Short"; + } + +//--- successful completion of the check + return(true); + } +//+------------------------------------------------------------------+ +//| MFI indicator value at the specified bar | +//+------------------------------------------------------------------+ +double MFI(int index) + { + double indicator_values[]; + if(CopyBuffer(ExtIndicatorHandle, 0, index, 1, indicator_values)<0) + { + //--- if the copying fails, report the error code + PrintFormat("Failed to copy data from the MFI indicator, error code %d", GetLastError()); + return(EMPTY_VALUE); + } + return(indicator_values[0]); + } +//+------------------------------------------------------------------+ +//| SMA value at the specified bar | +//+------------------------------------------------------------------+ +double CloseAvg(int index) + { + double indicator_values[]; + if(CopyBuffer(ExtTrendMAHandle, 0, index, 1, indicator_values)<0) + { + //--- if the copying fails, report the error code + PrintFormat("Failed to copy data from the Simple Moving Average indicator, error code %d", GetLastError()); + return(EMPTY_VALUE); + } + return(indicator_values[0]); + } +//+------------------------------------------------------------------+ diff --git a/BKPS/14031206/Experts/Free Robots/HangingMan Hammer RSI.ex5 b/BKPS/14031206/Experts/Free Robots/HangingMan Hammer RSI.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..28ed465d73cc1c28aaf5577ba263d43ea9b83ccf GIT binary patch literal 43486 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≤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 Ztu|YGs#;i4x#AEgs-5 +#include + +#define SIGNAL_BUY 1 // Buy signal +#define SIGNAL_NOT 0 // no trading signal +#define SIGNAL_SELL -1 // Sell signal + +#define CLOSE_LONG 2 // signal to close Long +#define CLOSE_SHORT -2 // signal to close Short + +//--- Input parameters +input int InpAverBodyPeriod=12; // period for calculating average candlestick size +input int InpMAPeriod =5; // Trend MA period +input int InpPeriodRSI =37; // RSI period +input ENUM_APPLIED_PRICE InpPrice=PRICE_CLOSE; // price type + +//--- trade parameters +input uint InpDuration=10; // position holding time in bars +input uint InpSL =200; // Stop Loss in points +input uint InpTP =200; // Take Profit in points +input uint InpSlippage=10; // slippage in points +//--- money management parameters +input double InpLot=0.1; // lot +//--- Expert ID +input long InpMagicNumber=123300; // Magic Number + +//--- global variables +int ExtAvgBodyPeriod; // average candlestick calculation period +int ExtSignalOpen =0; // Buy/Sell signal +int ExtSignalClose =0; // signal to close a position +string ExtPatternInfo =""; // current pattern information +string ExtDirection =""; // position opening direction +bool ExtPatternDetected=false; // pattern detected +bool ExtConfirmed =false; // pattern confirmed +bool ExtCloseByTime =true; // requires closing by time +bool ExtCheckPassed =true; // status checking error +//--- indicator handles +int ExtIndicatorHandle=INVALID_HANDLE; +int ExtTrendMAHandle=INVALID_HANDLE; + +//--- service objects +CTrade ExtTrade; +CSymbolInfo ExtSymbolInfo; +//+------------------------------------------------------------------+ +//| Expert initialization function | +//+------------------------------------------------------------------+ +int OnInit() + { + Print("InpSL=", InpSL); + Print("InpTP=", InpTP); +//--- set parameters for trading operations + ExtTrade.SetDeviationInPoints(InpSlippage); // slippage + ExtTrade.SetExpertMagicNumber(InpMagicNumber); // Expert Advisor ID + ExtTrade.LogLevel(LOG_LEVEL_ERRORS); // logging level + + ExtAvgBodyPeriod=InpAverBodyPeriod; +//--- indicator initialization + ExtIndicatorHandle=iRSI(_Symbol, _Period, InpPeriodRSI, InpPrice); + if(ExtIndicatorHandle==INVALID_HANDLE) + { + Print("Error creating CCI indicator"); + return(INIT_FAILED); + } + +//--- trend moving average + ExtTrendMAHandle=iMA(_Symbol, _Period, InpMAPeriod, 0, MODE_SMA, PRICE_CLOSE); + if(ExtIndicatorHandle==INVALID_HANDLE) + { + Print("Error creating Moving Average indicator"); + return(INIT_FAILED); + } + +//--- OK + return(INIT_SUCCEEDED); + } +//+------------------------------------------------------------------+ +//| Expert deinitialization function | +//+------------------------------------------------------------------+ +void OnDeinit(const int reason) + { +//--- release indicator handle + IndicatorRelease(ExtIndicatorHandle); + } +//+------------------------------------------------------------------+ +//| Expert tick function | +//+------------------------------------------------------------------+ +void OnTick() + { +//--- save the next bar start time; all checks at bar opening only + static datetime next_bar_open=0; + +//--- Phase 1 - check the emergence of a new bar and update the status + if(TimeCurrent()>=next_bar_open) + { + //--- get the current state of environment on the new bar + // namely, set the values of global variables: + // ExtPatternDetected - pattern detection + // ExtConfirmed - pattern confirmation + // ExtSignalOpen - signal to open + // ExtSignalClose - signal to close + // ExtPatternInfo - current pattern information + if(CheckState()) + { + //--- set the new bar opening time + next_bar_open=TimeCurrent(); + next_bar_open-=next_bar_open%PeriodSeconds(_Period); + next_bar_open+=PeriodSeconds(_Period); + + //--- report the emergence of a new bar only once within a bar + if(ExtPatternDetected && ExtConfirmed) + Print(ExtPatternInfo); + } + else + { + //--- error getting the status, retry on the next tick + return; + } + } + +//--- Phase 2 - if there is a signal and no position in this direction + if(ExtSignalOpen && !PositionExist(ExtSignalOpen)) + { + Print("\r\nSignal to open position ", ExtDirection); + PositionOpen(); + if(PositionExist(ExtSignalOpen)) + ExtSignalOpen=SIGNAL_NOT; + } + +//--- Phase 3 - close if there is a signal to close + if(ExtSignalClose && PositionExist(ExtSignalClose)) + { + Print("\r\nSignal to close position ", ExtDirection); + CloseBySignal(ExtSignalClose); + if(!PositionExist(ExtSignalClose)) + ExtSignalClose=SIGNAL_NOT; + } + +//--- Phase 4 - close upon expiration + if(ExtCloseByTime && PositionExpiredByTimeExist()) + { + CloseByTime(); + ExtCloseByTime=PositionExpiredByTimeExist(); + } + } +//+------------------------------------------------------------------+ +//| Get the current environment and check for a pattern | +//+------------------------------------------------------------------+ +bool CheckState() + { +//--- check if there is a pattern + if(!CheckPattern()) + { + Print("Error, failed to check pattern"); + return(false); + } + +//--- check for confirmation + if(!CheckConfirmation()) + { + Print("Error, failed to check pattern confirmation"); + return(false); + } +//--- if there is no confirmation, cancel the signal + if(!ExtConfirmed) + ExtSignalOpen=SIGNAL_NOT; + +//--- check if there is a signal to close a position + if(!CheckCloseSignal()) + { + Print("Error, failed to check the closing signal"); + return(false); + } + +//--- if positions are to be closed after certain holding time in bars + if(InpDuration) + ExtCloseByTime=true; // set flag to close upon expiration + +//--- all checks done + return(true); + } +//+------------------------------------------------------------------+ +//| Open a position in the direction of the signal | +//+------------------------------------------------------------------+ +bool PositionOpen() + { + ExtSymbolInfo.Refresh(); + ExtSymbolInfo.RefreshRates(); + + double price=0; +//--- Stop Loss and Take Profit are not set by default + double stoploss=0.0; + double takeprofit=0.0; + + int digits=ExtSymbolInfo.Digits(); + double point=ExtSymbolInfo.Point(); + double spread=ExtSymbolInfo.Ask()-ExtSymbolInfo.Bid(); + +//--- uptrend + if(ExtSignalOpen==SIGNAL_BUY) + { + price=NormalizeDouble(ExtSymbolInfo.Ask(), digits); + //--- if Stop Loss is set + if(InpSL>0) + { + if(spread>=InpSL*point) + { + PrintFormat("StopLoss (%d points) <= current spread = %.0f points. Spread value will be used", InpSL, spread/point); + stoploss = NormalizeDouble(price-spread, digits); + } + else + stoploss = NormalizeDouble(price-InpSL*point, digits); + } + //--- if Take Profit is set + if(InpTP>0) + { + if(spread>=InpTP*point) + { + PrintFormat("TakeProfit (%d points) < current spread = %.0f points. Spread value will be used", InpTP, spread/point); + takeprofit = NormalizeDouble(price+spread, digits); + } + else + takeprofit = NormalizeDouble(price+InpTP*point, digits); + } + + if(!ExtTrade.Buy(InpLot, Symbol(), price, stoploss, takeprofit)) + { + PrintFormat("Failed %s buy %G at %G (sl=%G tp=%G) failed. Ask=%G error=%d", + Symbol(), InpLot, price, stoploss, takeprofit, ExtSymbolInfo.Ask(), GetLastError()); + return(false); + } + } + +//--- downtrend + if(ExtSignalOpen==SIGNAL_SELL) + { + price=NormalizeDouble(ExtSymbolInfo.Bid(), digits); + //--- if Stop Loss is set + if(InpSL>0) + { + if(spread>=InpSL*point) + { + PrintFormat("StopLoss (%d points) <= current spread = %.0f points. Spread value will be used", InpSL, spread/point); + stoploss = NormalizeDouble(price+spread, digits); + } + else + stoploss = NormalizeDouble(price+InpSL*point, digits); + } + //--- if Take Profit is set + if(InpTP>0) + { + if(spread>=InpTP*point) + { + PrintFormat("TakeProfit (%d points) < current spread = %.0f points. Spread value will be used", InpTP, spread/point); + takeprofit = NormalizeDouble(price-spread, digits); + } + else + takeprofit = NormalizeDouble(price-InpTP*point, digits); + } + + if(!ExtTrade.Sell(InpLot, Symbol(), price, stoploss, takeprofit)) + { + PrintFormat("Failed %s sell at %G (sl=%G tp=%G) failed. Bid=%G error=%d", + Symbol(), price, stoploss, takeprofit, ExtSymbolInfo.Bid(), GetLastError()); + ExtTrade.PrintResult(); + Print(" "); + return(false); + } + } + + return(true); + } +//+------------------------------------------------------------------+ +//| Close a position based on the specified signal | +//+------------------------------------------------------------------+ +void CloseBySignal(int type_close) + { +//--- if there is no signal to close, return successful completion + if(type_close==SIGNAL_NOT) + return; +//--- if there are no positions opened by our EA + if(PositionExist(ExtSignalClose)==0) + return; + +//--- closing direction + long type; + switch(type_close) + { + case CLOSE_SHORT: + type=POSITION_TYPE_SELL; + break; + case CLOSE_LONG: + type=POSITION_TYPE_BUY; + break; + default: + Print("Error! Signal to close not detected"); + return; + } + +//--- check all positions and close ours based on the signal + int positions=PositionsTotal(); + for(int i=positions-1; i>=0; i--) + { + ulong ticket=PositionGetTicket(i); + if(ticket!=0) + { + //--- get the name of the symbol and the position id (magic) + string symbol=PositionGetString(POSITION_SYMBOL); + long magic =PositionGetInteger(POSITION_MAGIC); + //--- if they correspond to our values + if(symbol==Symbol() && magic==InpMagicNumber) + { + if(PositionGetInteger(POSITION_TYPE)==type) + { + ExtTrade.PositionClose(ticket, InpSlippage); + ExtTrade.PrintResult(); + Print(" "); + } + } + } + } + } +//+------------------------------------------------------------------+ +//| Close positions upon holding time expiration in bars | +//+------------------------------------------------------------------+ +void CloseByTime() + { +//--- if there are no positions opened by our EA + if(PositionExist(ExtSignalOpen)==0) + return; + +//--- check all positions and close ours based on the holding time in bars + int positions=PositionsTotal(); + for(int i=positions-1; i>=0; i--) + { + ulong ticket=PositionGetTicket(i); + if(ticket!=0) + { + //--- get the name of the symbol and the position id (magic) + string symbol=PositionGetString(POSITION_SYMBOL); + long magic =PositionGetInteger(POSITION_MAGIC); + //--- if they correspond to our values + if(symbol==Symbol() && magic==InpMagicNumber) + { + //--- position opening time + datetime open_time=(datetime)PositionGetInteger(POSITION_TIME); + //--- check position holding time in bars + if(BarsHold(open_time)>=(int)InpDuration) + { + Print("\r\nTime to close position #", ticket); + ExtTrade.PositionClose(ticket, InpSlippage); + ExtTrade.PrintResult(); + Print(" "); + } + } + } + } + } +//+------------------------------------------------------------------+ +//| Returns true if there are open positions | +//+------------------------------------------------------------------+ +bool PositionExist(int signal_direction) + { + bool check_type=(signal_direction!=SIGNAL_NOT); + +//--- what positions to search + ENUM_POSITION_TYPE search_type=WRONG_VALUE; + if(check_type) + switch(signal_direction) + { + case SIGNAL_BUY: + search_type=POSITION_TYPE_BUY; + break; + case SIGNAL_SELL: + search_type=POSITION_TYPE_SELL; + break; + case CLOSE_LONG: + search_type=POSITION_TYPE_BUY; + break; + case CLOSE_SHORT: + search_type=POSITION_TYPE_SELL; + break; + default: + //--- entry direction is not specified; nothing to search + return(false); + } + +//--- go through the list of all positions + int positions=PositionsTotal(); + for(int i=0; i=(int)InpDuration)) + return(true); + } + } + } + +//--- open position not found + return(false); + } +//+------------------------------------------------------------------+ +//| Checks position closing time in bars | +//+------------------------------------------------------------------+ +int BarsHold(datetime open_time) + { +//--- first run a basic simple check + if(TimeCurrent()-open_timeCloseAvg(2)) && // up trend + (MathMin(Open(1), Close(1))> (High(1)-(High(1)-Low(1))/3.0)) && // body in upper 1/3 + (Close(1)>Close(2)) && (Open(1)>Open(2))) // body gap + { + ExtPatternDetected=true; + ExtSignalOpen=SIGNAL_SELL; + ExtPatternInfo="\r\nHanging Man detected"; + ExtDirection="Sell"; + return(true); + } + +//--- check Hammer + if((MidPoint(1)(High(1)-(High(1)-Low(1))/3.0)) && // body in upper 1/3 + (Close(1)60)) + { + ExtConfirmed=true; + ExtPatternInfo+="\r\n Confirmed: RSI>60"; + } + +//--- successful completion of the check + return(true); + } +//+------------------------------------------------------------------+ +//| Check if there is a signal to close | +//+------------------------------------------------------------------+ +bool CheckCloseSignal() + { + ExtSignalClose=false; +//--- if there is a signal to enter the market, do not check the signal to close + if(ExtSignalOpen!=SIGNAL_NOT) + return(true); + +//--- check if there is a signal to close a long position + if(((RSI(1)<70) && (RSI(2)>70)) || ((RSI(1)<30) && (RSI(2)>30))) + { + //--- there is a signal to close a long position + ExtSignalClose=CLOSE_LONG; + ExtDirection="Long"; + } + +//--- check if there is a signal to close a short position + if(((RSI(1)>30) && (RSI(2)<30)) || ((RSI(1)>70) && (RSI(2)<70))) + { + //--- there is a signal to close a short position + ExtSignalClose=CLOSE_SHORT; + ExtDirection="Short"; + } + +//--- successful completion of the check + return(true); + } +//+------------------------------------------------------------------+ +//| RSI indicator value at the specified bar | +//+------------------------------------------------------------------+ +double RSI(int index) + { + double indicator_values[]; + if(CopyBuffer(ExtIndicatorHandle, 0, index, 1, indicator_values)<0) + { + //--- if the copying fails, report the error code + PrintFormat("Failed to copy data from the RSI indicator, error code %d", GetLastError()); + return(EMPTY_VALUE); + } + return(indicator_values[0]); + } +//+------------------------------------------------------------------+ +//| SMA value at the specified bar | +//+------------------------------------------------------------------+ +double CloseAvg(int index) + { + double indicator_values[]; + if(CopyBuffer(ExtTrendMAHandle, 0, index, 1, indicator_values)<0) + { + //--- if the copying fails, report the error code + PrintFormat("Failed to copy data from the Simple Moving Average indicator, error code %d", GetLastError()); + return(EMPTY_VALUE); + } + return(indicator_values[0]); + } +//+------------------------------------------------------------------+ diff --git a/BKPS/14031206/Experts/Free Robots/HangingMan Hammer Stoch.ex5 b/BKPS/14031206/Experts/Free Robots/HangingMan Hammer Stoch.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..f799ec8e2809d7399b5c92409c12cc6b3653d625 GIT binary patch literal 43566 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 +#include + +#define SIGNAL_BUY 1 // Buy signal +#define SIGNAL_NOT 0 // no trading signal +#define SIGNAL_SELL -1 // Sell signal + +#define CLOSE_LONG 2 // signal to close Long +#define CLOSE_SHORT -2 // signal to close Short + +//--- Input parameters +input int InpAverBodyPeriod=12; // period for calculating average candlestick size +input int InpMAPeriod =5; // Trend MA period +input int InpStochK =47; // period %K +input int InpStochD =9; // period %D +input int InpStochSlow =13; // smoothing period %K +input ENUM_STO_PRICE InpStochApplied=STO_LOWHIGH; // calculation type +input ENUM_MA_METHOD InpStochMA =MODE_SMA; // smoothing type + +//--- trade parameters +input uint InpDuration=10; // position holding time in bars +input uint InpSL =200; // Stop Loss in points +input uint InpTP =200; // Take Profit in points +input uint InpSlippage=10; // slippage in points +//--- money management parameters +input double InpLot=0.1; // lot +//--- Expert ID +input long InpMagicNumber=124400; // Magic Number + +//--- global variables +int ExtAvgBodyPeriod; // average candlestick calculation period +int ExtSignalOpen =0; // Buy/Sell signal +int ExtSignalClose =0; // signal to close a position +string ExtPatternInfo =""; // current pattern information +string ExtDirection =""; // position opening direction +bool ExtPatternDetected=false; // pattern detected +bool ExtConfirmed =false; // pattern confirmed +bool ExtCloseByTime =true; // requires closing by time +bool ExtCheckPassed =true; // status checking error +//--- indicator handles +int ExtIndicatorHandle=INVALID_HANDLE; +int ExtTrendMAHandle=INVALID_HANDLE; + +//--- service objects +CTrade ExtTrade; +CSymbolInfo ExtSymbolInfo; +//+------------------------------------------------------------------+ +//| Expert initialization function | +//+------------------------------------------------------------------+ +int OnInit() + { + Print("InpSL=", InpSL); + Print("InpTP=", InpTP); +//--- set parameters for trading operations + ExtTrade.SetDeviationInPoints(InpSlippage); // slippage + ExtTrade.SetExpertMagicNumber(InpMagicNumber); // Expert Advisor ID + ExtTrade.LogLevel(LOG_LEVEL_ERRORS); // logging level + + ExtAvgBodyPeriod=InpAverBodyPeriod; +//--- indicator initialization + ExtIndicatorHandle=iStochastic(_Symbol, _Period, InpStochK, InpStochD, InpStochSlow, InpStochMA, InpStochApplied); + if(ExtIndicatorHandle==INVALID_HANDLE) + { + Print("Error creating iStochastic indicator"); + return(INIT_FAILED); + } + +//--- trend moving average + ExtTrendMAHandle=iMA(_Symbol, _Period, InpMAPeriod,0, MODE_SMA,PRICE_CLOSE); + if(ExtIndicatorHandle==INVALID_HANDLE) + { + Print("Error creating Moving Average indicator"); + return(INIT_FAILED); + } + +//--- OK + return(INIT_SUCCEEDED); + } +//+------------------------------------------------------------------+ +//| Expert deinitialization function | +//+------------------------------------------------------------------+ +void OnDeinit(const int reason) + { +//--- release indicator handle + IndicatorRelease(ExtIndicatorHandle); + } +//+------------------------------------------------------------------+ +//| Expert tick function | +//+------------------------------------------------------------------+ +void OnTick() + { +//--- save the next bar start time; all checks at bar opening only + static datetime next_bar_open=0; + +//--- Phase 1 - check the emergence of a new bar and update the status + if(TimeCurrent()>=next_bar_open) + { + //--- get the current state of environment on the new bar + // namely, set the values of global variables: + // ExtPatternDetected - pattern detection + // ExtConfirmed - pattern confirmation + // ExtSignalOpen - signal to open + // ExtSignalClose - signal to close + // ExtPatternInfo - current pattern information + if(CheckState()) + { + //--- set the new bar opening time + next_bar_open=TimeCurrent(); + next_bar_open-=next_bar_open%PeriodSeconds(_Period); + next_bar_open+=PeriodSeconds(_Period); + + //--- report the emergence of a new bar only once within a bar + if(ExtPatternDetected && ExtConfirmed) + Print(ExtPatternInfo); + } + else + { + //--- error getting the status, retry on the next tick + return; + } + } + +//--- Phase 2 - if there is a signal and no position in this direction + if(ExtSignalOpen && !PositionExist(ExtSignalOpen)) + { + Print("\r\nSignal to open position ", ExtDirection); + PositionOpen(); + if(PositionExist(ExtSignalOpen)) + ExtSignalOpen=SIGNAL_NOT; + } + +//--- Phase 3 - close if there is a signal to close + if(ExtSignalClose && PositionExist(ExtSignalClose)) + { + Print("\r\nSignal to close position ", ExtDirection); + CloseBySignal(ExtSignalClose); + if(!PositionExist(ExtSignalClose)) + ExtSignalClose=SIGNAL_NOT; + } + +//--- Phase 4 - close upon expiration + if(ExtCloseByTime && PositionExpiredByTimeExist()) + { + CloseByTime(); + ExtCloseByTime=PositionExpiredByTimeExist(); + } + } +//+------------------------------------------------------------------+ +//| Get the current environment and check for a pattern | +//+------------------------------------------------------------------+ +bool CheckState() + { +//--- check if there is a pattern + if(!CheckPattern()) + { + Print("Error, failed to check pattern"); + return(false); + } + +//--- check for confirmation + if(!CheckConfirmation()) + { + Print("Error, failed to check pattern confirmation"); + return(false); + } +//--- if there is no confirmation, cancel the signal + if(!ExtConfirmed) + ExtSignalOpen=SIGNAL_NOT; + +//--- check if there is a signal to close a position + if(!CheckCloseSignal()) + { + Print("Error, failed to check the closing signal"); + return(false); + } + +//--- if positions are to be closed after certain holding time in bars + if(InpDuration) + ExtCloseByTime=true; // set flag to close upon expiration + +//--- all checks done + return(true); + } +//+------------------------------------------------------------------+ +//| Open a position in the direction of the signal | +//+------------------------------------------------------------------+ +bool PositionOpen() + { + ExtSymbolInfo.Refresh(); + ExtSymbolInfo.RefreshRates(); + + double price=0; +//--- Stop Loss and Take Profit are not set by default + double stoploss=0.0; + double takeprofit=0.0; + + int digits=ExtSymbolInfo.Digits(); + double point=ExtSymbolInfo.Point(); + double spread=ExtSymbolInfo.Ask()-ExtSymbolInfo.Bid(); + +//--- uptrend + if(ExtSignalOpen==SIGNAL_BUY) + { + price=NormalizeDouble(ExtSymbolInfo.Ask(), digits); + //--- if Stop Loss is set + if(InpSL>0) + { + if(spread>=InpSL*point) + { + PrintFormat("StopLoss (%d points) <= current spread = %.0f points. Spread value will be used", InpSL, spread/point); + stoploss = NormalizeDouble(price-spread, digits); + } + else + stoploss = NormalizeDouble(price-InpSL*point, digits); + } + //--- if Take Profit is set + if(InpTP>0) + { + if(spread>=InpTP*point) + { + PrintFormat("TakeProfit (%d points) < current spread = %.0f points. Spread value will be used", InpTP, spread/point); + takeprofit = NormalizeDouble(price+spread, digits); + } + else + takeprofit = NormalizeDouble(price+InpTP*point, digits); + } + + if(!ExtTrade.Buy(InpLot, Symbol(), price, stoploss, takeprofit)) + { + PrintFormat("Failed %s buy %G at %G (sl=%G tp=%G) failed. Ask=%G error=%d", + Symbol(), InpLot, price, stoploss, takeprofit, ExtSymbolInfo.Ask(), GetLastError()); + return(false); + } + } + +//--- downtrend + if(ExtSignalOpen==SIGNAL_SELL) + { + price=NormalizeDouble(ExtSymbolInfo.Bid(), digits); + //--- if Stop Loss is set + if(InpSL>0) + { + if(spread>=InpSL*point) + { + PrintFormat("StopLoss (%d points) <= current spread = %.0f points. Spread value will be used", InpSL, spread/point); + stoploss = NormalizeDouble(price+spread, digits); + } + else + stoploss = NormalizeDouble(price+InpSL*point, digits); + } + //--- if Take Profit is set + if(InpTP>0) + { + if(spread>=InpTP*point) + { + PrintFormat("TakeProfit (%d points) < current spread = %.0f points. Spread value will be used", InpTP, spread/point); + takeprofit = NormalizeDouble(price-spread, digits); + } + else + takeprofit = NormalizeDouble(price-InpTP*point, digits); + } + + if(!ExtTrade.Sell(InpLot, Symbol(), price, stoploss, takeprofit)) + { + PrintFormat("Failed %s sell at %G (sl=%G tp=%G) failed. Bid=%G error=%d", + Symbol(), price, stoploss, takeprofit, ExtSymbolInfo.Bid(), GetLastError()); + ExtTrade.PrintResult(); + Print(" "); + return(false); + } + } +//--- + return(true); + } +//+------------------------------------------------------------------+ +//| Close a position based on the specified signal | +//+------------------------------------------------------------------+ +void CloseBySignal(int type_close) + { +//--- if there is no signal to close, return successful completion + if(type_close==SIGNAL_NOT) + return; +//--- if there are no positions opened by our EA + if(PositionExist(ExtSignalClose)==0) + return; + +//--- closing direction + long type; + switch(type_close) + { + case CLOSE_SHORT: + type=POSITION_TYPE_SELL; + break; + case CLOSE_LONG: + type=POSITION_TYPE_BUY; + break; + default: + Print("Error! Signal to close not detected"); + return; + } + +//--- check all positions and close ours based on the signal + int positions=PositionsTotal(); + for(int i=positions-1; i>=0; i--) + { + ulong ticket=PositionGetTicket(i); + if(ticket!=0) + { + //--- get the name of the symbol and the position id (magic) + string symbol=PositionGetString(POSITION_SYMBOL); + long magic =PositionGetInteger(POSITION_MAGIC); + //--- if they correspond to our values + if(symbol==Symbol() && magic==InpMagicNumber) + { + if(PositionGetInteger(POSITION_TYPE)==type) + { + ExtTrade.PositionClose(ticket, InpSlippage); + ExtTrade.PrintResult(); + Print(" "); + } + } + } + } + } +//+------------------------------------------------------------------+ +//| Close positions upon holding time expiration in bars | +//+------------------------------------------------------------------+ +void CloseByTime() + { +//--- if there are no positions opened by our EA + if(PositionExist(ExtSignalOpen)==0) + return; + +//--- check all positions and close ours based on the holding time in bars + int positions=PositionsTotal(); + for(int i=positions-1; i>=0; i--) + { + ulong ticket=PositionGetTicket(i); + if(ticket!=0) + { + //--- get the name of the symbol and the position id (magic) + string symbol=PositionGetString(POSITION_SYMBOL); + long magic =PositionGetInteger(POSITION_MAGIC); + //--- if they correspond to our values + if(symbol==Symbol() && magic==InpMagicNumber) + { + //--- position opening time + datetime open_time=(datetime)PositionGetInteger(POSITION_TIME); + //--- check position holding time in bars + if(BarsHold(open_time)>=(int)InpDuration) + { + Print("\r\nTime to close position #", ticket); + ExtTrade.PositionClose(ticket, InpSlippage); + ExtTrade.PrintResult(); + Print(" "); + } + } + } + } + } +//+------------------------------------------------------------------+ +//| Returns true if there are open positions | +//+------------------------------------------------------------------+ +bool PositionExist(int signal_direction) + { + bool check_type=(signal_direction!=SIGNAL_NOT); + +//--- what positions to search + ENUM_POSITION_TYPE search_type=WRONG_VALUE; + if(check_type) + switch(signal_direction) + { + case SIGNAL_BUY: + search_type=POSITION_TYPE_BUY; + break; + case SIGNAL_SELL: + search_type=POSITION_TYPE_SELL; + break; + case CLOSE_LONG: + search_type=POSITION_TYPE_BUY; + break; + case CLOSE_SHORT: + search_type=POSITION_TYPE_SELL; + break; + default: + //--- entry direction is not specified; nothing to search + return(false); + } + +//--- go through the list of all positions + int positions=PositionsTotal(); + for(int i=0; i=(int)InpDuration)) + return(true); + } + } + } + +//--- open position not found + return(false); + } +//+------------------------------------------------------------------+ +//| Checks position closing time in bars | +//+------------------------------------------------------------------+ +int BarsHold(datetime open_time) + { +//--- first run a basic simple check + if(TimeCurrent()-open_timeCloseAvg(2)) && // up trend + (MathMin(Open(1), Close(1))> (High(1)-(High(1)-Low(1))/3.0)) && // body in upper 1/3 + (Close(1)>Close(2)) && (Open(1)>Open(2))) // body gap + { + ExtPatternDetected=true; + ExtSignalOpen=SIGNAL_SELL; + ExtPatternInfo="\r\nHanging Man detected"; + ExtDirection="Sell"; + return(true); + } + + +//--- check Hammer + if((MidPoint(1)(High(1)-(High(1)-Low(1))/3.0)) && // body in upper 1/3 + (Close(1)70)) + { + ExtConfirmed=true; + ExtPatternInfo+="\r\n Confirmed: StochSignal>70"; + } + +//--- successful completion of the check + return(true); + } +//+------------------------------------------------------------------+ +//| Check if there is a signal to close | +//+------------------------------------------------------------------+ +bool CheckCloseSignal() + { + ExtSignalClose=false; +//--- if there is a signal to enter the market, do not check the signal to close + if(ExtSignalOpen!=SIGNAL_NOT) + return(true); + +//--- check if there is a signal to close a long position + if(((StochSignal(1)<80) && (StochSignal(2)>80))|| // 80 crossed downwards + ((StochSignal(1)<20) && (StochSignal(2)>20))) // 20 crossed downwards + { + //--- there is a signal to close a long position + ExtSignalClose=CLOSE_LONG; + ExtDirection="Long"; + } + +//--- check if there is a signal to close a short position + if((((StochSignal(1)>20) && (StochSignal(2)<20)) || // 20 crossed upwards + ((StochSignal(1)>80) && (StochSignal(2)<80)))) // 80 crossed upwards + { + //--- there is a signal to close a short position + ExtSignalClose=CLOSE_SHORT; + ExtDirection="Short"; + } + +//--- successful completion of the check + return(true); + } +//+------------------------------------------------------------------+ +//| Stochastic indicator value at the specified bar | +//+------------------------------------------------------------------+ +double StochSignal(int index) + { + double indicator_values[]; + if(CopyBuffer(ExtIndicatorHandle, SIGNAL_LINE, index, 1, indicator_values)<0) + { + //--- if the copying fails, report the error code + PrintFormat("Failed to copy data from the iStochastic indicator, error code %d", GetLastError()); + return(EMPTY_VALUE); + } + return(indicator_values[0]); + } +//+------------------------------------------------------------------+ +//| SMA value at the specified bar | +//+------------------------------------------------------------------+ +double CloseAvg(int index) + { + double indicator_values[]; + if(CopyBuffer(ExtTrendMAHandle, 0, index, 1, indicator_values)<0) + { + //--- if the copying fails, report the error code + PrintFormat("Failed to copy data from the Simple Moving Average indicator, error code %d", GetLastError()); + return(EMPTY_VALUE); + } + return(indicator_values[0]); + } +//+------------------------------------------------------------------+ diff --git a/BKPS/14031206/Experts/Free Robots/MorningEvening StarDoji CCI.ex5 b/BKPS/14031206/Experts/Free Robots/MorningEvening StarDoji CCI.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..731066ff95039f29ce0418d0d8bce48c2eb9ef2e GIT binary patch literal 43190 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

4Dv@oW~LWCwwV^uV2nE8p|h%@TjmN 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 +#include + +#define SIGNAL_BUY 1 // Buy signal +#define SIGNAL_NOT 0 // no trading signal +#define SIGNAL_SELL -1 // Sell signal + +#define CLOSE_LONG 2 // signal to close Long +#define CLOSE_SHORT -2 // signal to close Short + +//--- Input parameters +input int InpAverBodyPeriod=12; // period for calculating average candlestick size +input int InpPeriodCCI =37; // CCI period +input ENUM_APPLIED_PRICE InpPrice=PRICE_CLOSE; // price type + +//--- trade parameters +input uint InpDuration =10; // position holding time in bars +input uint InpSL =200; // Stop Loss in points +input uint InpTP =200; // Take Profit in points +input uint InpSlippage =10; // slippage in points +//--- money management parameters +input double InpLot=0.1; // lot +//--- Expert ID +input long InpMagicNumber=130100; // Magic Number + +//--- global variables +int ExtAvgBodyPeriod; // average candlestick calculation period +int ExtSignalOpen =0; // Buy/Sell signal +int ExtSignalClose =0; // signal to close a position +string ExtPatternInfo =""; // current pattern information +string ExtDirection =""; // position opening direction +bool ExtPatternDetected=false; // pattern detected +bool ExtConfirmed =false; // pattern confirmed +bool ExtCloseByTime =true; // requires closing by time +bool ExtCheckPassed =true; // status checking error +//--- indicator handle +int ExtIndicatorHandle=INVALID_HANDLE; + +//--- service objects +CTrade ExtTrade; +CSymbolInfo ExtSymbolInfo; +//+------------------------------------------------------------------+ +//| Expert initialization function | +//+------------------------------------------------------------------+ +int OnInit() + { + Print("InpSL=", InpSL); + Print("InpTP=", InpTP); +//--- set parameters for trading operations + ExtTrade.SetDeviationInPoints(InpSlippage); // slippage + ExtTrade.SetExpertMagicNumber(InpMagicNumber); // Expert Advisor ID + ExtTrade.LogLevel(LOG_LEVEL_ERRORS); // logging level + + ExtAvgBodyPeriod=InpAverBodyPeriod; +//--- indicator initialization + ExtIndicatorHandle=iCCI(_Symbol, _Period, InpPeriodCCI, InpPrice); + if(ExtIndicatorHandle==INVALID_HANDLE) + { + Print("Error creating CCI indicator"); + return(INIT_FAILED); + } +//--- OK + return(INIT_SUCCEEDED); + } +//+------------------------------------------------------------------+ +//| Expert deinitialization function | +//+------------------------------------------------------------------+ +void OnDeinit(const int reason) + { +//--- release indicator handle + IndicatorRelease(ExtIndicatorHandle); + } +//+------------------------------------------------------------------+ +//| Expert tick function | +//+------------------------------------------------------------------+ +void OnTick() + { +//--- save the next bar start time; all checks at bar opening only + static datetime next_bar_open=0; + +//--- Phase 1 - check the emergence of a new bar and update the status + if(TimeCurrent()>=next_bar_open) + { + //--- get the current state of environment on the new bar + // namely, set the values of global variables: + // ExtPatternDetected - pattern detection + // ExtConfirmed - pattern confirmation + // ExtSignalOpen - signal to open + // ExtSignalClose - signal to close + // ExtPatternInfo - current pattern information + if(CheckState()) + { + //--- set the new bar opening time + next_bar_open=TimeCurrent(); + next_bar_open-=next_bar_open%PeriodSeconds(_Period); + next_bar_open+=PeriodSeconds(_Period); + + //--- report the emergence of a new bar only once within a bar + if(ExtPatternDetected && ExtConfirmed) + Print(ExtPatternInfo); + } + else + { + //--- error getting the status, retry on the next tick + return; + } + } + +//--- Phase 2 - if there is a signal and no position in this direction + if(ExtSignalOpen && !PositionExist(ExtSignalOpen)) + { + Print("\r\nSignal to open position ", ExtDirection); + PositionOpen(); + if(PositionExist(ExtSignalOpen)) + ExtSignalOpen=SIGNAL_NOT; + } + +//--- Phase 3 - close if there is a signal to close + if(ExtSignalClose && PositionExist(ExtSignalClose)) + { + Print("\r\nSignal to close position ", ExtDirection); + CloseBySignal(ExtSignalClose); + if(!PositionExist(ExtSignalClose)) + ExtSignalClose=SIGNAL_NOT; + } + +//--- Phase 4 - close upon expiration + if(ExtCloseByTime && PositionExpiredByTimeExist()) + { + CloseByTime(); + ExtCloseByTime=PositionExpiredByTimeExist(); + } + } +//+------------------------------------------------------------------+ +//| Get the current environment and check for a pattern | +//+------------------------------------------------------------------+ +bool CheckState() + { +//--- check if there is a pattern + if(!CheckPattern()) + { + Print("Error, failed to check pattern"); + return(false); + } + +//--- check for confirmation + if(!CheckConfirmation()) + { + Print("Error, failed to check pattern confirmation"); + return(false); + } +//--- if there is no confirmation, cancel the signal + if(!ExtConfirmed) + ExtSignalOpen=SIGNAL_NOT; + +//--- check if there is a signal to close a position + if(!CheckCloseSignal()) + { + Print("Error, failed to check the closing signal"); + return(false); + } + +//--- if positions are to be closed after certain holding time in bars + if(InpDuration) + ExtCloseByTime=true; // set flag to close upon expiration + +//--- all checks done + return(true); + } +//+------------------------------------------------------------------+ +//| Open a position in the direction of the signal | +//+------------------------------------------------------------------+ +bool PositionOpen() + { + ExtSymbolInfo.Refresh(); + ExtSymbolInfo.RefreshRates(); + + double price=0; +//--- Stop Loss and Take Profit are not set by default + double stoploss=0.0; + double takeprofit=0.0; + + int digits=ExtSymbolInfo.Digits(); + double point=ExtSymbolInfo.Point(); + double spread=ExtSymbolInfo.Ask()-ExtSymbolInfo.Bid(); + +//--- uptrend + if(ExtSignalOpen==SIGNAL_BUY) + { + price=NormalizeDouble(ExtSymbolInfo.Ask(), digits); + //--- if Stop Loss is set + if(InpSL>0) + { + if(spread>=InpSL*point) + { + PrintFormat("StopLoss (%d points) <= current spread = %.0f points. Spread value will be used", InpSL, spread/point); + stoploss = NormalizeDouble(price-spread, digits); + } + else + stoploss = NormalizeDouble(price-InpSL*point, digits); + } + //--- if Take Profit is set + if(InpTP>0) + { + if(spread>=InpTP*point) + { + PrintFormat("TakeProfit (%d points) < current spread = %.0f points. Spread value will be used", InpTP, spread/point); + takeprofit = NormalizeDouble(price+spread, digits); + } + else + takeprofit = NormalizeDouble(price+InpTP*point, digits); + } + + if(!ExtTrade.Buy(InpLot, Symbol(), price, stoploss, takeprofit)) + { + PrintFormat("Failed %s buy %G at %G (sl=%G tp=%G) failed. Ask=%G error=%d", + Symbol(), InpLot, price, stoploss, takeprofit, ExtSymbolInfo.Ask(), GetLastError()); + return(false); + } + } + +//--- downtrend + if(ExtSignalOpen==SIGNAL_SELL) + { + price=NormalizeDouble(ExtSymbolInfo.Bid(), digits); + //--- if Stop Loss is set + if(InpSL>0) + { + if(spread>=InpSL*point) + { + PrintFormat("StopLoss (%d points) <= current spread = %.0f points. Spread value will be used", InpSL, spread/point); + stoploss = NormalizeDouble(price+spread, digits); + } + else + stoploss = NormalizeDouble(price+InpSL*point, digits); + } + //--- if Take Profit is set + if(InpTP>0) + { + if(spread>=InpTP*point) + { + PrintFormat("TakeProfit (%d points) < current spread = %.0f points. Spread value will be used", InpTP, spread/point); + takeprofit = NormalizeDouble(price-spread, digits); + } + else + takeprofit = NormalizeDouble(price-InpTP*point, digits); + } + + if(!ExtTrade.Sell(InpLot, Symbol(), price, stoploss, takeprofit)) + { + PrintFormat("Failed %s sell at %G (sl=%G tp=%G) failed. Bid=%G error=%d", + Symbol(), price, stoploss, takeprofit, ExtSymbolInfo.Bid(), GetLastError()); + ExtTrade.PrintResult(); + Print(" "); + return(false); + } + } + + return(true); + } +//+------------------------------------------------------------------+ +//| Close a position based on the specified signal | +//+------------------------------------------------------------------+ +void CloseBySignal(int type_close) + { +//--- if there is no signal to close, return successful completion + if(type_close==SIGNAL_NOT) + return; +//--- if there are no positions opened by our EA + if(PositionExist(ExtSignalClose)==0) + return; + +//--- closing direction + long type; + switch(type_close) + { + case CLOSE_SHORT: + type=POSITION_TYPE_SELL; + break; + case CLOSE_LONG: + type=POSITION_TYPE_BUY; + break; + default: + Print("Error! Signal to close not detected"); + return; + } + +//--- check all positions and close ours based on the signal + int positions=PositionsTotal(); + for(int i=positions-1; i>=0; i--) + { + ulong ticket=PositionGetTicket(i); + if(ticket!=0) + { + //--- get the name of the symbol and the position id (magic) + string symbol=PositionGetString(POSITION_SYMBOL); + long magic =PositionGetInteger(POSITION_MAGIC); + //--- if they correspond to our values + if(symbol==Symbol() && magic==InpMagicNumber) + { + if(PositionGetInteger(POSITION_TYPE)==type) + { + ExtTrade.PositionClose(ticket, InpSlippage); + ExtTrade.PrintResult(); + Print(" "); + } + } + } + } + } +//+------------------------------------------------------------------+ +//| Close positions upon holding time expiration in bars | +//+------------------------------------------------------------------+ +void CloseByTime() + { +//--- if there are no positions opened by our EA + if(PositionExist(ExtSignalOpen)==0) + return; + +//--- check all positions and close ours based on the holding time in bars + int positions=PositionsTotal(); + for(int i=positions-1; i>=0; i--) + { + ulong ticket=PositionGetTicket(i); + if(ticket!=0) + { + //--- get the name of the symbol and the position id (magic) + string symbol=PositionGetString(POSITION_SYMBOL); + long magic =PositionGetInteger(POSITION_MAGIC); + //--- if they correspond to our values + if(symbol==Symbol() && magic==InpMagicNumber) + { + //--- position opening time + datetime open_time=(datetime)PositionGetInteger(POSITION_TIME); + //--- check position holding time in bars + if(BarsHold(open_time)>=(int)InpDuration) + { + Print("\r\nTime to close position #", ticket); + ExtTrade.PositionClose(ticket, InpSlippage); + ExtTrade.PrintResult(); + Print(" "); + } + } + } + } + } +//+------------------------------------------------------------------+ +//| Returns true if there are open positions | +//+------------------------------------------------------------------+ +bool PositionExist(int signal_direction) + { + bool check_type=(signal_direction!=SIGNAL_NOT); + +//--- what positions to search + ENUM_POSITION_TYPE search_type=WRONG_VALUE; + if(check_type) + switch(signal_direction) + { + case SIGNAL_BUY: + search_type=POSITION_TYPE_BUY; + break; + case SIGNAL_SELL: + search_type=POSITION_TYPE_SELL; + break; + case CLOSE_LONG: + search_type=POSITION_TYPE_BUY; + break; + case CLOSE_SHORT: + search_type=POSITION_TYPE_SELL; + break; + default: + //--- entry direction is not specified; nothing to search + return(false); + } + +//--- go through the list of all positions + int positions=PositionsTotal(); + for(int i=0; i=(int)InpDuration)) + return(true); + } + } + } +//--- open position not found + return(false); + } +//+------------------------------------------------------------------+ +//| Checks position closing time in bars | +//+------------------------------------------------------------------+ +int BarsHold(datetime open_time) + { +//--- first run a basic simple check + if(TimeCurrent()-open_timeAvgBody(1)) && // bullish candlestick, its body is larger than average + (MathAbs(Close(2)-Open(2))Close(3)) && // second candlestick close is higher than first candlestick close + (Open(2)>Open(3)) && // second candlestick open is higher than first candlestick open + (Open(1)AvgBody(1)) && // bullish candlestick, its body is larger than average + (MathAbs(Close(2)-Open(2))Close(3)) && // second candlestick close is higher than first candlestick close + (Open(2)>Open(3)) && // second candlestick open is higher than first candlestick open + (Close(1)AvgBody(1)) && // bearish candlestick, its body is larger than average + (MathAbs(Close(2)-Open(2))Close(2)) && // upward price gap on the last candlestick + (Close(1)>Close(2))) // last candlestick close higher than second candlestick close + { + ExtPatternDetected=true; + ExtSignalOpen=SIGNAL_BUY; + ExtPatternInfo="\r\nMorning Doji detected"; + ExtDirection="Buy"; + return(true); + } + +//--- check Morning Star + if((Open(3)-Close(3)>AvgBody(1)) && // bearish candlestick, its body is larger than average + (MathAbs(Close(2)-Open(2))MidOpenClose(3))) // last candlestick close is lower than the middle of the first (bearish) one + { + ExtPatternDetected=true; + ExtSignalOpen=SIGNAL_BUY; + ExtPatternInfo="\r\nMorning Star detected"; + ExtDirection="Buy"; + return(true); + } + +//--- result of checking + return(ExtCheckPassed); + } +//+------------------------------------------------------------------+ +//| Returns true in case of successful confirmation check | +//+------------------------------------------------------------------+ +bool CheckConfirmation() + { + ExtConfirmed=false; +//--- if there is no pattern, do not search for confirmation + if(!ExtPatternDetected) + return(true); + +//--- get the value of the stochastic indicator to confirm the signal + double signal=CCI(1); + if(signal==EMPTY_VALUE) + { + //--- failed to get indicator value, check failed + return(false); + } + +//--- check the Buy signal + if(ExtSignalOpen==SIGNAL_BUY && (signal<-50)) + { + ExtConfirmed=true; + ExtPatternInfo+="\r\n Confirmed: CCI<-50"; + } + +//--- check the Sell signal + if(ExtSignalOpen==SIGNAL_SELL && (signal>50)) + { + ExtConfirmed=true; + ExtPatternInfo+="\r\n Confirmed: CCI>50"; + } + +//--- successful completion of the check + return(true); + } +//+------------------------------------------------------------------+ +//| Check if there is a signal to close | +//+------------------------------------------------------------------+ +bool CheckCloseSignal() + { + ExtSignalClose=false; +//--- if there is a signal to enter the market, do not check the signal to close + if(ExtSignalOpen!=SIGNAL_NOT) + return(true); + +//--- check if there is a signal to close a long position + if(((CCI(1)<80) && (CCI(2)>80)) || ((CCI(1)<-80) && (CCI(2)>-80))) + { + //--- there is a signal to close a long position + ExtSignalClose=CLOSE_LONG; + ExtDirection="Long"; + } + +//--- check if there is a signal to close a short position + if(((CCI(1)>-80) && (CCI(2)<-80)) || ((CCI(1)>80) && (CCI(2)<80))) + { + //--- there is a signal to close a short position + ExtSignalClose=CLOSE_SHORT; + ExtDirection="Short"; + } + +//--- successful completion of the check + return(true); + } +//+------------------------------------------------------------------+ +//| CCI indicator value at the specified bar | +//+------------------------------------------------------------------+ +double CCI(int index) + { + double indicator_values[]; + if(CopyBuffer(ExtIndicatorHandle, 0, index, 1, indicator_values)<0) + { + //--- if the copying fails, report the error code + PrintFormat("Failed to copy data from the CCI indicator, error code %d", GetLastError()); + return(EMPTY_VALUE); + } + return(indicator_values[0]); + } +//+------------------------------------------------------------------+ diff --git a/BKPS/14031206/Experts/Free Robots/MorningEvening StarDoji MFI.ex5 b/BKPS/14031206/Experts/Free Robots/MorningEvening StarDoji MFI.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..899c4be38d351a41b4d726cf1ff2be02185d316b GIT binary patch literal 42512 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 +#include + +#define SIGNAL_BUY 1 // Buy signal +#define SIGNAL_NOT 0 // no trading signal +#define SIGNAL_SELL -1 // Sell signal + +#define CLOSE_LONG 2 // signal to close Long +#define CLOSE_SHORT -2 // signal to close Short + +//--- Input parameters +input int InpAverBodyPeriod=12; // period for calculating average candlestick size +input int InpPeriodMFI =37; // MFI period +input ENUM_APPLIED_VOLUME InpVolume=VOLUME_TICK; // volume type + +//--- trade parameters +input uint InpDuration=10; // position holding time in bars +input uint InpSL =200; // Stop Loss in points +input uint InpTP =200; // Take Profit in points +input uint InpSlippage=10; // slippage in points +//--- money management parameters +input double InpLot=0.1; // lot +//--- Expert ID +input long InpMagicNumber=130200; // Magic Number + +//--- global variables +int ExtAvgBodyPeriod; // average candlestick calculation period +int ExtSignalOpen =0; // Buy/Sell signal +int ExtSignalClose =0; // signal to close a position +string ExtPatternInfo =""; // current pattern information +string ExtDirection =""; // position opening direction +bool ExtPatternDetected=false; // pattern detected +bool ExtConfirmed =false; // pattern confirmed +bool ExtCloseByTime =true; // requires closing by time +bool ExtCheckPassed =true; // status checking error +//--- indicator handle +int ExtIndicatorHandle=INVALID_HANDLE; + +//--- service objects +CTrade ExtTrade; +CSymbolInfo ExtSymbolInfo; +//+------------------------------------------------------------------+ +//| Expert initialization function | +//+------------------------------------------------------------------+ +int OnInit() + { + Print("InpSL=", InpSL); + Print("InpTP=", InpTP); +//--- set parameters for trading operations + ExtTrade.SetDeviationInPoints(InpSlippage); // slippage + ExtTrade.SetExpertMagicNumber(InpMagicNumber); // Expert Advisor ID + ExtTrade.LogLevel(LOG_LEVEL_ERRORS); // logging level + + ExtAvgBodyPeriod=InpAverBodyPeriod; +//--- indicator initialization + ExtIndicatorHandle=iMFI(_Symbol, _Period, InpPeriodMFI, InpVolume); + if(ExtIndicatorHandle==INVALID_HANDLE) + { + Print("Error creating MFI indicator"); + return(INIT_FAILED); + } +//--- OK + return(INIT_SUCCEEDED); + } +//+------------------------------------------------------------------+ +//| Expert deinitialization function | +//+------------------------------------------------------------------+ +void OnDeinit(const int reason) + { +//--- release indicator handle + IndicatorRelease(ExtIndicatorHandle); + } +//+------------------------------------------------------------------+ +//| Expert tick function | +//+------------------------------------------------------------------+ +void OnTick() + { +//--- save the next bar start time; all checks at bar opening only + static datetime next_bar_open=0; + +//--- Phase 1 - check the emergence of a new bar and update the status + if(TimeCurrent()>=next_bar_open) + { + //--- get the current state of environment on the new bar + // namely, set the values of global variables: + // ExtPatternDetected - pattern detection + // ExtConfirmed - pattern confirmation + // ExtSignalOpen - signal to open + // ExtSignalClose - signal to close + // ExtPatternInfo - current pattern information + if(CheckState()) + { + //--- set the new bar opening time + next_bar_open=TimeCurrent(); + next_bar_open-=next_bar_open%PeriodSeconds(_Period); + next_bar_open+=PeriodSeconds(_Period); + + //--- report the emergence of a new bar only once within a bar + if(ExtPatternDetected && ExtConfirmed) + Print(ExtPatternInfo); + } + else + { + //--- error getting the status, retry on the next tick + return; + } + } + +//--- Phase 2 - if there is a signal and no position in this direction + if(ExtSignalOpen && !PositionExist(ExtSignalOpen)) + { + Print("\r\nSignal to open position ", ExtDirection); + PositionOpen(); + if(PositionExist(ExtSignalOpen)) + ExtSignalOpen=SIGNAL_NOT; + } + +//--- Phase 3 - close if there is a signal to close + if(ExtSignalClose && PositionExist(ExtSignalClose)) + { + Print("\r\nSignal to close position ", ExtDirection); + CloseBySignal(ExtSignalClose); + if(!PositionExist(ExtSignalClose)) + ExtSignalClose=SIGNAL_NOT; + } + +//--- Phase 4 - close upon expiration + if(ExtCloseByTime && PositionExpiredByTimeExist()) + { + CloseByTime(); + ExtCloseByTime=PositionExpiredByTimeExist(); + } + } +//+------------------------------------------------------------------+ +//| Get the current environment and check for a pattern | +//+------------------------------------------------------------------+ +bool CheckState() + { +//--- check if there is a pattern + if(!CheckPattern()) + { + Print("Error, failed to check pattern"); + return(false); + } + +//--- check for confirmation + if(!CheckConfirmation()) + { + Print("Error, failed to check pattern confirmation"); + return(false); + } +//--- if there is no confirmation, cancel the signal + if(!ExtConfirmed) + ExtSignalOpen=SIGNAL_NOT; + +//--- check if there is a signal to close a position + if(!CheckCloseSignal()) + { + Print("Error, failed to check the closing signal"); + return(false); + } + +//--- if positions are to be closed after certain holding time in bars + if(InpDuration) + ExtCloseByTime=true; // set flag to close upon expiration + +//--- all checks done + return(true); + } +//+------------------------------------------------------------------+ +//| Open a position in the direction of the signal | +//+------------------------------------------------------------------+ +bool PositionOpen() + { + ExtSymbolInfo.Refresh(); + ExtSymbolInfo.RefreshRates(); + + double price=0; +//--- Stop Loss and Take Profit are not set by default + double stoploss=0.0; + double takeprofit=0.0; + + int digits=ExtSymbolInfo.Digits(); + double point=ExtSymbolInfo.Point(); + double spread=ExtSymbolInfo.Ask()-ExtSymbolInfo.Bid(); + +//--- uptrend + if(ExtSignalOpen==SIGNAL_BUY) + { + price=NormalizeDouble(ExtSymbolInfo.Ask(), digits); + //--- if Stop Loss is set + if(InpSL>0) + { + if(spread>=InpSL*point) + { + PrintFormat("StopLoss (%d points) <= current spread = %.0f points. Spread value will be used", InpSL, spread/point); + stoploss = NormalizeDouble(price-spread, digits); + } + else + stoploss = NormalizeDouble(price-InpSL*point, digits); + } + //--- if Take Profit is set + if(InpTP>0) + { + if(spread>=InpTP*point) + { + PrintFormat("TakeProfit (%d points) < current spread = %.0f points. Spread value will be used", InpTP, spread/point); + takeprofit = NormalizeDouble(price+spread, digits); + } + else + takeprofit = NormalizeDouble(price+InpTP*point, digits); + } + + if(!ExtTrade.Buy(InpLot, Symbol(), price, stoploss, takeprofit)) + { + PrintFormat("Failed %s buy %G at %G (sl=%G tp=%G) failed. Ask=%G error=%d", + Symbol(), InpLot, price, stoploss, takeprofit, ExtSymbolInfo.Ask(), GetLastError()); + return(false); + } + } + +//--- downtrend + if(ExtSignalOpen==SIGNAL_SELL) + { + price=NormalizeDouble(ExtSymbolInfo.Bid(), digits); + //--- if Stop Loss is set + if(InpSL>0) + { + if(spread>=InpSL*point) + { + PrintFormat("StopLoss (%d points) <= current spread = %.0f points. Spread value will be used", InpSL, spread/point); + stoploss = NormalizeDouble(price+spread, digits); + } + else + stoploss = NormalizeDouble(price+InpSL*point, digits); + } + //--- if Take Profit is set + if(InpTP>0) + { + if(spread>=InpTP*point) + { + PrintFormat("TakeProfit (%d points) < current spread = %.0f points. Spread value will be used", InpTP, spread/point); + takeprofit = NormalizeDouble(price-spread, digits); + } + else + takeprofit = NormalizeDouble(price-InpTP*point, digits); + } + + if(!ExtTrade.Sell(InpLot, Symbol(), price, stoploss, takeprofit)) + { + PrintFormat("Failed %s sell at %G (sl=%G tp=%G) failed. Bid=%G error=%d", + Symbol(), price, stoploss, takeprofit, ExtSymbolInfo.Bid(), GetLastError()); + ExtTrade.PrintResult(); + Print(" "); + return(false); + } + } + + return(true); + } +//+------------------------------------------------------------------+ +//| Close a position based on the specified signal | +//+------------------------------------------------------------------+ +void CloseBySignal(int type_close) + { +//--- if there is no signal to close, return successful completion + if(type_close==SIGNAL_NOT) + return; +//--- if there are no positions opened by our EA + if(PositionExist(ExtSignalClose)==0) + return; + +//--- closing direction + long type; + switch(type_close) + { + case CLOSE_SHORT: + type=POSITION_TYPE_SELL; + break; + case CLOSE_LONG: + type=POSITION_TYPE_BUY; + break; + default: + Print("Error! Signal to close not detected"); + return; + } + +//--- check all positions and close ours based on the signal + int positions=PositionsTotal(); + for(int i=positions-1; i>=0; i--) + { + ulong ticket=PositionGetTicket(i); + if(ticket!=0) + { + //--- get the name of the symbol and the position id (magic) + string symbol=PositionGetString(POSITION_SYMBOL); + long magic =PositionGetInteger(POSITION_MAGIC); + //--- if they correspond to our values + if(symbol==Symbol() && magic==InpMagicNumber) + { + if(PositionGetInteger(POSITION_TYPE)==type) + { + ExtTrade.PositionClose(ticket, InpSlippage); + ExtTrade.PrintResult(); + Print(" "); + } + } + } + } + } +//+------------------------------------------------------------------+ +//| Close positions upon holding time expiration in bars | +//+------------------------------------------------------------------+ +void CloseByTime() + { +//--- if there are no positions opened by our EA + if(PositionExist(ExtSignalOpen)==0) + return; + +//--- check all positions and close ours based on the holding time in bars + int positions=PositionsTotal(); + for(int i=positions-1; i>=0; i--) + { + ulong ticket=PositionGetTicket(i); + if(ticket!=0) + { + //--- get the name of the symbol and the position id (magic) + string symbol=PositionGetString(POSITION_SYMBOL); + long magic =PositionGetInteger(POSITION_MAGIC); + //--- if they correspond to our values + if(symbol==Symbol() && magic==InpMagicNumber) + { + //--- position opening time + datetime open_time=(datetime)PositionGetInteger(POSITION_TIME); + //--- check position holding time in bars + if(BarsHold(open_time)>=(int)InpDuration) + { + Print("\r\nTime to close position #", ticket); + ExtTrade.PositionClose(ticket, InpSlippage); + ExtTrade.PrintResult(); + Print(" "); + } + } + } + } + } +//+------------------------------------------------------------------+ +//| Returns true if there are open positions | +//+------------------------------------------------------------------+ +bool PositionExist(int signal_direction) + { + bool check_type=(signal_direction!=SIGNAL_NOT); + +//--- what positions to search + ENUM_POSITION_TYPE search_type=WRONG_VALUE; + if(check_type) + switch(signal_direction) + { + case SIGNAL_BUY: + search_type=POSITION_TYPE_BUY; + break; + case SIGNAL_SELL: + search_type=POSITION_TYPE_SELL; + break; + case CLOSE_LONG: + search_type=POSITION_TYPE_BUY; + break; + case CLOSE_SHORT: + search_type=POSITION_TYPE_SELL; + break; + default: + //--- entry direction is not specified; nothing to search + return(false); + } + +//--- go through the list of all positions + int positions=PositionsTotal(); + for(int i=0; i=(int)InpDuration)) + return(true); + } + } + } + +//--- open position not found + return(false); + } +//+------------------------------------------------------------------+ +//| Checks position closing time in bars | +//+------------------------------------------------------------------+ +int BarsHold(datetime open_time) + { +//--- first run a basic simple check + if(TimeCurrent()-open_timeAvgBody(1)) && // bullish candlestick, its body is larger than average + (MathAbs(Close(2)-Open(2))Close(3)) && // second candlestick close is higher than first candlestick close + (Open(2)>Open(3)) && // second candlestick open is higher than first candlestick open + (Open(1)AvgBody(1)) && // bullish candlestick, its body is larger than average + (MathAbs(Close(2)-Open(2))Close(3)) && // second candlestick close is higher than first candlestick close + (Open(2)>Open(3)) && // second candlestick open is higher than first candlestick open + (Close(1)AvgBody(1)) && // bearish candlestick, its body is larger than average + (MathAbs(Close(2)-Open(2))Close(2)) && // upward price gap on the last candlestick + (Close(1)>Close(2))) // last candlestick close higher than second candlestick close + { + ExtPatternDetected=true; + ExtSignalOpen=SIGNAL_BUY; + ExtPatternInfo="\r\nMorning Doji detected"; + ExtDirection="Buy"; + return(true); + } + +//--- check Morning Star + if((Open(3)-Close(3)>AvgBody(1)) && // bearish candlestick, its body is larger than average + (MathAbs(Close(2)-Open(2))MidOpenClose(3))) // last candlestick close is lower than the middle of the first (bearish) one + { + ExtPatternDetected=true; + ExtSignalOpen=SIGNAL_BUY; + ExtPatternInfo="\r\nMorning Star detected"; + ExtDirection="Buy"; + return(true); + } + +//--- result of checking + return(ExtCheckPassed); + } +//+------------------------------------------------------------------+ +//| Returns true in case of successful confirmation check | +//+------------------------------------------------------------------+ +bool CheckConfirmation() + { + ExtConfirmed=false; +//--- if there is no pattern, do not search for confirmation + if(!ExtPatternDetected) + return(true); + +//--- get the value of the stochastic indicator to confirm the signal + double signal=MFI(1); + if(signal==EMPTY_VALUE) + { + //--- failed to get indicator value, check failed + return(false); + } + +//--- check the Buy signal + if(ExtSignalOpen==SIGNAL_BUY && (signal<40)) + { + ExtConfirmed=true; + ExtPatternInfo+="\r\n Confirmed: MFI<40"; + } + +//--- check the Sell signal + if(ExtSignalOpen==SIGNAL_SELL && (signal>60)) + { + ExtConfirmed=true; + ExtPatternInfo+="\r\n Confirmed: MFI>60"; + } + +//--- successful completion of the check + return(true); + } +//+------------------------------------------------------------------+ +//| Check if there is a signal to close | +//+------------------------------------------------------------------+ +bool CheckCloseSignal() + { + ExtSignalClose=false; +//--- if there is a signal to enter the market, do not check the signal to close + if(ExtSignalOpen!=SIGNAL_NOT) + return(true); + +//--- check if there is a signal to close a long position + if(((MFI(1)<70) && (MFI(2)>70)) || ((MFI(1)<30) && (MFI(2)>30))) + { + //--- there is a signal to close a long position + ExtSignalClose=CLOSE_LONG; + ExtDirection="Long"; + } + +//--- check if there is a signal to close a short position + if(((MFI(1)>30) && (MFI(2)<30)) || ((MFI(1)>70) && (MFI(2)<70))) + { + //--- there is a signal to close a short position + ExtSignalClose=CLOSE_SHORT; + ExtDirection="Short"; + } + +//--- successful completion of the check + return(true); + } +//+------------------------------------------------------------------+ +//| MFI indicator value at the specified bar | +//+------------------------------------------------------------------+ +double MFI(int index) + { + double indicator_values[]; + if(CopyBuffer(ExtIndicatorHandle, 0, index, 1, indicator_values)<0) + { + //--- if the copying fails, report the error code + PrintFormat("Failed to copy data from the MFI indicator, error code %d", GetLastError()); + return(EMPTY_VALUE); + } + return(indicator_values[0]); + } +//+------------------------------------------------------------------+ diff --git a/BKPS/14031206/Experts/Free Robots/MorningEvening StarDoji RSI.ex5 b/BKPS/14031206/Experts/Free Robots/MorningEvening StarDoji RSI.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..ce0264c56d2fdb87cb739e8bb01ea8c63ffac9b3 GIT binary patch literal 43170 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 +#include + +#define SIGNAL_BUY 1 // Buy signal +#define SIGNAL_NOT 0 // no trading signal +#define SIGNAL_SELL -1 // Sell signal + +#define CLOSE_LONG 2 // signal to close Long +#define CLOSE_SHORT -2 // signal to close Short + +//--- Input parameters +input int InpAverBodyPeriod=12; // period for calculating average candlestick size +input int InpPeriodRSI =37; // RSI period +input ENUM_APPLIED_PRICE InpPrice=PRICE_CLOSE; // price type + +//--- trade parameters +input uint InpDuration=10; // position holding time in bars +input uint InpSL =200; // Stop Loss in points +input uint InpTP =200; // Take Profit in points +input uint InpSlippage=10; // slippage in points +//--- money management parameters +input double InpLot=0.1; // lot +//--- Expert ID +input long InpMagicNumber=130300; // Magic Number + +//--- global variables +int ExtAvgBodyPeriod; // average candlestick calculation period +int ExtSignalOpen =0; // Buy/Sell signal +int ExtSignalClose =0; // signal to close a position +string ExtPatternInfo =""; // current pattern information +string ExtDirection =""; // position opening direction +bool ExtPatternDetected=false; // pattern detected +bool ExtConfirmed =false; // pattern confirmed +bool ExtCloseByTime =true; // requires closing by time +bool ExtCheckPassed =true; // status checking error +//--- indicator handle +int ExtIndicatorHandle=INVALID_HANDLE; + +//--- service objects +CTrade ExtTrade; +CSymbolInfo ExtSymbolInfo; +//+------------------------------------------------------------------+ +//| Expert initialization function | +//+------------------------------------------------------------------+ +int OnInit() + { + Print("InpSL=", InpSL); + Print("InpTP=", InpTP); +//--- set parameters for trading operations + ExtTrade.SetDeviationInPoints(InpSlippage); // slippage + ExtTrade.SetExpertMagicNumber(InpMagicNumber); // Expert Advisor ID + ExtTrade.LogLevel(LOG_LEVEL_ERRORS); // logging level + + ExtAvgBodyPeriod=InpAverBodyPeriod; +//--- indicator initialization + ExtIndicatorHandle=iRSI(_Symbol, _Period, InpPeriodRSI, InpPrice); + if(ExtIndicatorHandle==INVALID_HANDLE) + { + Print("Error creating CCI indicator"); + return(INIT_FAILED); + } +//--- OK + return(INIT_SUCCEEDED); + } +//+------------------------------------------------------------------+ +//| Expert deinitialization function | +//+------------------------------------------------------------------+ +void OnDeinit(const int reason) + { +//--- release indicator handle + IndicatorRelease(ExtIndicatorHandle); + } +//+------------------------------------------------------------------+ +//| Expert tick function | +//+------------------------------------------------------------------+ +void OnTick() + { +//--- save the next bar start time; all checks at bar opening only + static datetime next_bar_open=0; + +//--- Phase 1 - check the emergence of a new bar and update the status + if(TimeCurrent()>=next_bar_open) + { + //--- get the current state of environment on the new bar + // namely, set the values of global variables: + // ExtPatternDetected - pattern detection + // ExtConfirmed - pattern confirmation + // ExtSignalOpen - signal to open + // ExtSignalClose - signal to close + // ExtPatternInfo - current pattern information + if(CheckState()) + { + //--- set the new bar opening time + next_bar_open=TimeCurrent(); + next_bar_open-=next_bar_open%PeriodSeconds(_Period); + next_bar_open+=PeriodSeconds(_Period); + + //--- report the emergence of a new bar only once within a bar + if(ExtPatternDetected && ExtConfirmed) + Print(ExtPatternInfo); + } + else + { + //--- error getting the status, retry on the next tick + return; + } + } + +//--- Phase 2 - if there is a signal and no position in this direction + if(ExtSignalOpen && !PositionExist(ExtSignalOpen)) + { + Print("\r\nSignal to open position ", ExtDirection); + PositionOpen(); + if(PositionExist(ExtSignalOpen)) + ExtSignalOpen=SIGNAL_NOT; + } + +//--- Phase 3 - close if there is a signal to close + if(ExtSignalClose && PositionExist(ExtSignalClose)) + { + Print("\r\nSignal to close position ", ExtDirection); + CloseBySignal(ExtSignalClose); + if(!PositionExist(ExtSignalClose)) + ExtSignalClose=SIGNAL_NOT; + } + +//--- Phase 4 - close upon expiration + if(ExtCloseByTime && PositionExpiredByTimeExist()) + { + CloseByTime(); + ExtCloseByTime=PositionExpiredByTimeExist(); + } + } +//+------------------------------------------------------------------+ +//| Get the current environment and check for a pattern | +//+------------------------------------------------------------------+ +bool CheckState() + { +//--- check if there is a pattern + if(!CheckPattern()) + { + Print("Error, failed to check pattern"); + return(false); + } + +//--- check for confirmation + if(!CheckConfirmation()) + { + Print("Error, failed to check pattern confirmation"); + return(false); + } +//--- if there is no confirmation, cancel the signal + if(!ExtConfirmed) + ExtSignalOpen=SIGNAL_NOT; + +//--- check if there is a signal to close a position + if(!CheckCloseSignal()) + { + Print("Error, failed to check the closing signal"); + return(false); + } + +//--- if positions are to be closed after certain holding time in bars + if(InpDuration) + ExtCloseByTime=true; // set flag to close upon expiration + +//--- all checks done + return(true); + } +//+------------------------------------------------------------------+ +//| Open a position in the direction of the signal | +//+------------------------------------------------------------------+ +bool PositionOpen() + { + ExtSymbolInfo.Refresh(); + ExtSymbolInfo.RefreshRates(); + + double price=0; +//--- Stop Loss and Take Profit are not set by default + double stoploss=0.0; + double takeprofit=0.0; + + int digits=ExtSymbolInfo.Digits(); + double point=ExtSymbolInfo.Point(); + double spread=ExtSymbolInfo.Ask()-ExtSymbolInfo.Bid(); + +//--- uptrend + if(ExtSignalOpen==SIGNAL_BUY) + { + price=NormalizeDouble(ExtSymbolInfo.Ask(), digits); + //--- if Stop Loss is set + if(InpSL>0) + { + if(spread>=InpSL*point) + { + PrintFormat("StopLoss (%d points) <= current spread = %.0f points. Spread value will be used", InpSL, spread/point); + stoploss = NormalizeDouble(price-spread, digits); + } + else + stoploss = NormalizeDouble(price-InpSL*point, digits); + } + //--- if Take Profit is set + if(InpTP>0) + { + if(spread>=InpTP*point) + { + PrintFormat("TakeProfit (%d points) < current spread = %.0f points. Spread value will be used", InpTP, spread/point); + takeprofit = NormalizeDouble(price+spread, digits); + } + else + takeprofit = NormalizeDouble(price+InpTP*point, digits); + } + + if(!ExtTrade.Buy(InpLot, Symbol(), price, stoploss, takeprofit)) + { + PrintFormat("Failed %s buy %G at %G (sl=%G tp=%G) failed. Ask=%G error=%d", + Symbol(), InpLot, price, stoploss, takeprofit, ExtSymbolInfo.Ask(), GetLastError()); + return(false); + } + } + +//--- downtrend + if(ExtSignalOpen==SIGNAL_SELL) + { + price=NormalizeDouble(ExtSymbolInfo.Bid(), digits); + //--- if Stop Loss is set + if(InpSL>0) + { + if(spread>=InpSL*point) + { + PrintFormat("StopLoss (%d points) <= current spread = %.0f points. Spread value will be used", InpSL, spread/point); + stoploss = NormalizeDouble(price+spread, digits); + } + else + stoploss = NormalizeDouble(price+InpSL*point, digits); + } + //--- if Take Profit is set + if(InpTP>0) + { + if(spread>=InpTP*point) + { + PrintFormat("TakeProfit (%d points) < current spread = %.0f points. Spread value will be used", InpTP, spread/point); + takeprofit = NormalizeDouble(price-spread, digits); + } + else + takeprofit = NormalizeDouble(price-InpTP*point, digits); + } + + if(!ExtTrade.Sell(InpLot, Symbol(), price, stoploss, takeprofit)) + { + PrintFormat("Failed %s sell at %G (sl=%G tp=%G) failed. Bid=%G error=%d", + Symbol(), price, stoploss, takeprofit, ExtSymbolInfo.Bid(), GetLastError()); + ExtTrade.PrintResult(); + Print(" "); + return(false); + } + } + + return(true); + } +//+------------------------------------------------------------------+ +//| Close a position based on the specified signal | +//+------------------------------------------------------------------+ +void CloseBySignal(int type_close) + { +//--- if there is no signal to close, return successful completion + if(type_close==SIGNAL_NOT) + return; +//--- if there are no positions opened by our EA + if(PositionExist(ExtSignalClose)==0) + return; + +//--- closing direction + long type; + switch(type_close) + { + case CLOSE_SHORT: + type=POSITION_TYPE_SELL; + break; + case CLOSE_LONG: + type=POSITION_TYPE_BUY; + break; + default: + Print("Error! Signal to close not detected"); + return; + } + +//--- check all positions and close ours based on the signal + int positions=PositionsTotal(); + for(int i=positions-1; i>=0; i--) + { + ulong ticket=PositionGetTicket(i); + if(ticket!=0) + { + //--- get the name of the symbol and the position id (magic) + string symbol=PositionGetString(POSITION_SYMBOL); + long magic =PositionGetInteger(POSITION_MAGIC); + //--- if they correspond to our values + if(symbol==Symbol() && magic==InpMagicNumber) + { + if(PositionGetInteger(POSITION_TYPE)==type) + { + ExtTrade.PositionClose(ticket, InpSlippage); + ExtTrade.PrintResult(); + Print(" "); + } + } + } + } + } +//+------------------------------------------------------------------+ +//| Close positions upon holding time expiration in bars | +//+------------------------------------------------------------------+ +void CloseByTime() + { +//--- if there are no positions opened by our EA + if(PositionExist(ExtSignalOpen)==0) + return; + +//--- check all positions and close ours based on the holding time in bars + int positions=PositionsTotal(); + for(int i=positions-1; i>=0; i--) + { + ulong ticket=PositionGetTicket(i); + if(ticket!=0) + { + //--- get the name of the symbol and the position id (magic) + string symbol=PositionGetString(POSITION_SYMBOL); + long magic =PositionGetInteger(POSITION_MAGIC); + //--- if they correspond to our values + if(symbol==Symbol() && magic==InpMagicNumber) + { + //--- position opening time + datetime open_time=(datetime)PositionGetInteger(POSITION_TIME); + //--- check position holding time in bars + if(BarsHold(open_time)>=(int)InpDuration) + { + Print("\r\nTime to close position #", ticket); + ExtTrade.PositionClose(ticket, InpSlippage); + ExtTrade.PrintResult(); + Print(" "); + } + } + } + } + } +//+------------------------------------------------------------------+ +//| Returns true if there are open positions | +//+------------------------------------------------------------------+ +bool PositionExist(int signal_direction) + { + bool check_type=(signal_direction!=SIGNAL_NOT); + +//--- what positions to search + ENUM_POSITION_TYPE search_type=WRONG_VALUE; + if(check_type) + switch(signal_direction) + { + case SIGNAL_BUY: + search_type=POSITION_TYPE_BUY; + break; + case SIGNAL_SELL: + search_type=POSITION_TYPE_SELL; + break; + case CLOSE_LONG: + search_type=POSITION_TYPE_BUY; + break; + case CLOSE_SHORT: + search_type=POSITION_TYPE_SELL; + break; + default: + //--- entry direction is not specified; nothing to search + return(false); + } + +//--- go through the list of all positions + int positions=PositionsTotal(); + for(int i=0; i=(int)InpDuration)) + return(true); + } + } + } + +//--- open position not found + return(false); + } +//+------------------------------------------------------------------+ +//| Checks position closing time in bars | +//+------------------------------------------------------------------+ +int BarsHold(datetime open_time) + { +//--- first run a basic simple check + if(TimeCurrent()-open_timeAvgBody(1)) && // bullish candlestick, its body is larger than average + (MathAbs(Close(2)-Open(2))Close(3)) && // second candlestick close is higher than first candlestick close + (Open(2)>Open(3)) && // second candlestick open is higher than first candlestick open + (Open(1)AvgBody(1)) && // bullish candlestick, its body is larger than average + (MathAbs(Close(2)-Open(2))Close(3)) && // second candlestick close is higher than first candlestick close + (Open(2)>Open(3)) && // second candlestick open is higher than first candlestick open + (Close(1)AvgBody(1)) && // bearish candlestick, its body is larger than average + (MathAbs(Close(2)-Open(2))Close(2)) && // upward price gap on the last candlestick + (Close(1)>Close(2))) // last candlestick close higher than second candlestick close + { + ExtPatternDetected=true; + ExtSignalOpen=SIGNAL_BUY; + ExtPatternInfo="\r\nMorning Doji detected"; + ExtDirection="Buy"; + return(true); + } + +//--- check Morning Star + if((Open(3)-Close(3)>AvgBody(1)) && // bearish candlestick, its body is larger than average + (MathAbs(Close(2)-Open(2))MidOpenClose(3))) // last candlestick close is lower than the middle of the first (bearish) one + { + ExtPatternDetected=true; + ExtSignalOpen=SIGNAL_BUY; + ExtPatternInfo="\r\nMorning Star detected"; + ExtDirection="Buy"; + return(true); + } + +//--- result of checking + return(ExtCheckPassed); + } +//+------------------------------------------------------------------+ +//| Returns true in case of successful confirmation check | +//+------------------------------------------------------------------+ +bool CheckConfirmation() + { + ExtConfirmed=false; +//--- if there is no pattern, do not search for confirmation + if(!ExtPatternDetected) + return(true); + +//--- get the value of the stochastic indicator to confirm the signal + double signal=RSI(1); + if(signal==EMPTY_VALUE) + { + //--- failed to get indicator value, check failed + return(false); + } + +//--- check the Buy signal + if(ExtSignalOpen==SIGNAL_BUY && (signal<40)) + { + ExtConfirmed=true; + ExtPatternInfo+="\r\n Confirmed: RSI<40"; + } + +//--- check the Sell signal + if(ExtSignalOpen==SIGNAL_SELL && (signal>60)) + { + ExtConfirmed=true; + ExtPatternInfo+="\r\n Confirmed: RSI>60"; + } + +//--- successful completion of the check + return(true); + } +//+------------------------------------------------------------------+ +//| Check if there is a signal to close | +//+------------------------------------------------------------------+ +bool CheckCloseSignal() + { + ExtSignalClose=false; +//--- if there is a signal to enter the market, do not check the signal to close + if(ExtSignalOpen!=SIGNAL_NOT) + return(true); + +//--- check if there is a signal to close a long position + if(((RSI(1)<70) && (RSI(2)>70)) || ((RSI(1)<30) && (RSI(2)>30))) + { + //--- there is a signal to close a long position + ExtSignalClose=CLOSE_LONG; + ExtDirection="Long"; + } + +//--- check if there is a signal to close a short position + if(((RSI(1)>30) && (RSI(2)<30)) || ((RSI(1)>70) && (RSI(2)<70))) + { + //--- there is a signal to close a short position + ExtSignalClose=CLOSE_SHORT; + ExtDirection="Short"; + } + +//--- successful completion of the check + return(true); + } +//+------------------------------------------------------------------+ +//| RSI indicator value at the specified bar | +//+------------------------------------------------------------------+ +double RSI(int index) + { + double indicator_values[]; + if(CopyBuffer(ExtIndicatorHandle, 0, index, 1, indicator_values)<0) + { + //--- if the copying fails, report the error code + PrintFormat("Failed to copy data from the RSI indicator, error code %d", GetLastError()); + return(EMPTY_VALUE); + } + return(indicator_values[0]); + } +//+------------------------------------------------------------------+ diff --git a/BKPS/14031206/Experts/Free Robots/MorningEvening StarDoji Stoch.ex5 b/BKPS/14031206/Experts/Free Robots/MorningEvening StarDoji Stoch.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..9582f2ad71a0709c413fc17b61c250c19083dbd1 GIT binary patch literal 43912 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 literal 0 HcmV?d00001 diff --git a/BKPS/14031206/Experts/Free Robots/MorningEvening StarDoji Stoch.mq5 b/BKPS/14031206/Experts/Free Robots/MorningEvening StarDoji Stoch.mq5 new file mode 100644 index 0000000..8a58965 --- /dev/null +++ b/BKPS/14031206/Experts/Free Robots/MorningEvening StarDoji Stoch.mq5 @@ -0,0 +1,691 @@ +//+------------------------------------------------------------------+ +//| MorningEvening StarDoji Stoch.mq5 | +//| Copyright 2024, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2024, MetaQuotes Ltd." +#property link "https://www.mql5.com" +#property version "1.00" + +#include +#include + +#define SIGNAL_BUY 1 // Buy signal +#define SIGNAL_NOT 0 // no trading signal +#define SIGNAL_SELL -1 // Sell signal + +#define CLOSE_LONG 2 // signal to close Long +#define CLOSE_SHORT -2 // signal to close Short + +//--- Input parameters +input int InpAverBodyPeriod=12; // period for calculating average candlestick size +input int InpStochK =47; // period %K +input int InpStochD =9; // period %D +input int InpStochSlow =13; // smoothing period %K +input ENUM_STO_PRICE InpStochApplied =STO_LOWHIGH; // calculation type +input ENUM_MA_METHOD InpStochMA =MODE_SMA; // smoothing type + +//--- trade parameters +input uint InpDuration=10; // position holding time in bars +input uint InpSL =200; // Stop Loss in points +input uint InpTP =200; // Take Profit in points +input uint InpSlippage=10; // slippage in points +//--- money management parameters +input double InpLot=0.1; // lot +//--- Expert ID +input long InpMagicNumber=130400; // Magic Number + +//--- global variables +int ExtAvgBodyPeriod; // average candlestick calculation period +int ExtSignalOpen =0; // Buy/Sell signal +int ExtSignalClose =0; // signal to close a position +string ExtPatternInfo =""; // current pattern information +string ExtDirection =""; // position opening direction +bool ExtPatternDetected=false; // pattern detected +bool ExtConfirmed =false; // pattern confirmed +bool ExtCloseByTime =true; // requires closing by time +bool ExtCheckPassed =true; // status checking error +//--- indicator handle +int ExtIndicatorHandle=INVALID_HANDLE; + +//--- service objects +CTrade ExtTrade; +CSymbolInfo ExtSymbolInfo; +//+------------------------------------------------------------------+ +//| Expert initialization function | +//+------------------------------------------------------------------+ +int OnInit() + { + Print("InpSL=", InpSL); + Print("InpTP=", InpTP); +//--- set parameters for trading operations + ExtTrade.SetDeviationInPoints(InpSlippage); // slippage + ExtTrade.SetExpertMagicNumber(InpMagicNumber); // Expert Advisor ID + ExtTrade.LogLevel(LOG_LEVEL_ERRORS); // logging level + + ExtAvgBodyPeriod=InpAverBodyPeriod; +//--- indicator initialization + ExtIndicatorHandle=iStochastic(_Symbol, _Period, InpStochK, InpStochD, InpStochSlow, InpStochMA, InpStochApplied); + if(ExtIndicatorHandle==INVALID_HANDLE) + { + Print("Error creating iStochastic indicator"); + return(INIT_FAILED); + } +//--- OK + return(INIT_SUCCEEDED); + } +//+------------------------------------------------------------------+ +//| Expert deinitialization function | +//+------------------------------------------------------------------+ +void OnDeinit(const int reason) + { +//--- release indicator handle + IndicatorRelease(ExtIndicatorHandle); + } +//+------------------------------------------------------------------+ +//| Expert tick function | +//+------------------------------------------------------------------+ +void OnTick() + { +//--- save the next bar start time; all checks at bar opening only + static datetime next_bar_open=0; + +//--- Phase 1 - check the emergence of a new bar and update the status + if(TimeCurrent()>=next_bar_open) + { + //--- get the current state of environment on the new bar + // namely, set the values of global variables: + // ExtPatternDetected - pattern detection + // ExtConfirmed - pattern confirmation + // ExtSignalOpen - signal to open + // ExtSignalClose - signal to close + // ExtPatternInfo - current pattern information + if(CheckState()) + { + //--- set the new bar opening time + next_bar_open=TimeCurrent(); + next_bar_open-=next_bar_open%PeriodSeconds(_Period); + next_bar_open+=PeriodSeconds(_Period); + + //--- report the emergence of a new bar only once within a bar + if(ExtPatternDetected && ExtConfirmed) + Print(ExtPatternInfo); + } + else + { + //--- error getting the status, retry on the next tick + return; + } + } + +//--- Phase 2 - if there is a signal and no position in this direction + if(ExtSignalOpen && !PositionExist(ExtSignalOpen)) + { + Print("\r\nSignal to open position ", ExtDirection); + PositionOpen(); + if(PositionExist(ExtSignalOpen)) + ExtSignalOpen=SIGNAL_NOT; + } + +//--- Phase 3 - close if there is a signal to close + if(ExtSignalClose && PositionExist(ExtSignalClose)) + { + Print("\r\nSignal to close position ", ExtDirection); + CloseBySignal(ExtSignalClose); + if(!PositionExist(ExtSignalClose)) + ExtSignalClose=SIGNAL_NOT; + } + +//--- Phase 4 - close upon expiration + if(ExtCloseByTime && PositionExpiredByTimeExist()) + { + CloseByTime(); + ExtCloseByTime=PositionExpiredByTimeExist(); + } + } +//+------------------------------------------------------------------+ +//| Get the current environment and check for a pattern | +//+------------------------------------------------------------------+ +bool CheckState() + { +//--- check if there is a pattern + if(!CheckPattern()) + { + Print("Error, failed to check pattern"); + return(false); + } + +//--- check for confirmation + if(!CheckConfirmation()) + { + Print("Error, failed to check pattern confirmation"); + return(false); + } +//--- if there is no confirmation, cancel the signal + if(!ExtConfirmed) + ExtSignalOpen=SIGNAL_NOT; + +//--- check if there is a signal to close a position + if(!CheckCloseSignal()) + { + Print("Error, failed to check the closing signal"); + return(false); + } + +//--- if positions are to be closed after certain holding time in bars + if(InpDuration) + ExtCloseByTime=true; // set flag to close upon expiration + +//--- all checks done + return(true); + } +//+------------------------------------------------------------------+ +//| Open a position in the direction of the signal | +//+------------------------------------------------------------------+ +bool PositionOpen() + { + ExtSymbolInfo.Refresh(); + ExtSymbolInfo.RefreshRates(); + + double price=0; +//--- Stop Loss and Take Profit are not set by default + double stoploss=0.0; + double takeprofit=0.0; + + int digits=ExtSymbolInfo.Digits(); + double point=ExtSymbolInfo.Point(); + double spread=ExtSymbolInfo.Ask()-ExtSymbolInfo.Bid(); + +//--- uptrend + if(ExtSignalOpen==SIGNAL_BUY) + { + price=NormalizeDouble(ExtSymbolInfo.Ask(), digits); + //--- if Stop Loss is set + if(InpSL>0) + { + if(spread>=InpSL*point) + { + PrintFormat("StopLoss (%d points) <= current spread = %.0f points. Spread value will be used", InpSL, spread/point); + stoploss = NormalizeDouble(price-spread, digits); + } + else + stoploss = NormalizeDouble(price-InpSL*point, digits); + } + //--- if Take Profit is set + if(InpTP>0) + { + if(spread>=InpTP*point) + { + PrintFormat("TakeProfit (%d points) < current spread = %.0f points. Spread value will be used", InpTP, spread/point); + takeprofit = NormalizeDouble(price+spread, digits); + } + else + takeprofit = NormalizeDouble(price+InpTP*point, digits); + } + + if(!ExtTrade.Buy(InpLot, Symbol(), price, stoploss, takeprofit)) + { + PrintFormat("Failed %s buy %G at %G (sl=%G tp=%G) failed. Ask=%G error=%d", + Symbol(), InpLot, price, stoploss, takeprofit, ExtSymbolInfo.Ask(), GetLastError()); + return(false); + } + } + +//--- downtrend + if(ExtSignalOpen==SIGNAL_SELL) + { + price=NormalizeDouble(ExtSymbolInfo.Bid(), digits); + //--- if Stop Loss is set + if(InpSL>0) + { + if(spread>=InpSL*point) + { + PrintFormat("StopLoss (%d points) <= current spread = %.0f points. Spread value will be used", InpSL, spread/point); + stoploss = NormalizeDouble(price+spread, digits); + } + else + stoploss = NormalizeDouble(price+InpSL*point, digits); + } + //--- if Take Profit is set + if(InpTP>0) + { + if(spread>=InpTP*point) + { + PrintFormat("TakeProfit (%d points) < current spread = %.0f points. Spread value will be used", InpTP, spread/point); + takeprofit = NormalizeDouble(price-spread, digits); + } + else + takeprofit = NormalizeDouble(price-InpTP*point, digits); + } + + if(!ExtTrade.Sell(InpLot, Symbol(), price, stoploss, takeprofit)) + { + PrintFormat("Failed %s sell at %G (sl=%G tp=%G) failed. Bid=%G error=%d", + Symbol(), price, stoploss, takeprofit, ExtSymbolInfo.Bid(), GetLastError()); + ExtTrade.PrintResult(); + Print(" "); + return(false); + } + } + + return(true); + } +//+------------------------------------------------------------------+ +//| Close a position based on the specified signal | +//+------------------------------------------------------------------+ +void CloseBySignal(int type_close) + { +//--- if there is no signal to close, return successful completion + if(type_close==SIGNAL_NOT) + return; +//--- if there are no positions opened by our EA + if(PositionExist(ExtSignalClose)==0) + return; + +//--- closing direction + long type; + switch(type_close) + { + case CLOSE_SHORT: + type=POSITION_TYPE_SELL; + break; + case CLOSE_LONG: + type=POSITION_TYPE_BUY; + break; + default: + Print("Error! Signal to close not detected"); + return; + } + +//--- check all positions and close ours based on the signal + int positions=PositionsTotal(); + for(int i=positions-1; i>=0; i--) + { + ulong ticket=PositionGetTicket(i); + if(ticket!=0) + { + //--- get the name of the symbol and the position id (magic) + string symbol=PositionGetString(POSITION_SYMBOL); + long magic =PositionGetInteger(POSITION_MAGIC); + //--- if they correspond to our values + if(symbol==Symbol() && magic==InpMagicNumber) + { + if(PositionGetInteger(POSITION_TYPE)==type) + { + ExtTrade.PositionClose(ticket, InpSlippage); + ExtTrade.PrintResult(); + Print(" "); + } + } + } + } + } +//+------------------------------------------------------------------+ +//| Close positions upon holding time expiration in bars | +//+------------------------------------------------------------------+ +void CloseByTime() + { +//--- if there are no positions opened by our EA + if(PositionExist(ExtSignalOpen)==0) + return; + +//--- check all positions and close ours based on the holding time in bars + int positions=PositionsTotal(); + for(int i=positions-1; i>=0; i--) + { + ulong ticket=PositionGetTicket(i); + if(ticket!=0) + { + //--- get the name of the symbol and the position id (magic) + string symbol=PositionGetString(POSITION_SYMBOL); + long magic =PositionGetInteger(POSITION_MAGIC); + //--- if they correspond to our values + if(symbol==Symbol() && magic==InpMagicNumber) + { + //--- position opening time + datetime open_time=(datetime)PositionGetInteger(POSITION_TIME); + //--- check position holding time in bars + if(BarsHold(open_time)>=(int)InpDuration) + { + Print("\r\nTime to close position #", ticket); + ExtTrade.PositionClose(ticket, InpSlippage); + ExtTrade.PrintResult(); + Print(" "); + } + } + } + } + } +//+------------------------------------------------------------------+ +//| Returns true if there are open positions | +//+------------------------------------------------------------------+ +bool PositionExist(int signal_direction) + { + bool check_type=(signal_direction!=SIGNAL_NOT); + +//--- what positions to search + ENUM_POSITION_TYPE search_type=WRONG_VALUE; + if(check_type) + switch(signal_direction) + { + case SIGNAL_BUY: + search_type=POSITION_TYPE_BUY; + break; + case SIGNAL_SELL: + search_type=POSITION_TYPE_SELL; + break; + case CLOSE_LONG: + search_type=POSITION_TYPE_BUY; + break; + case CLOSE_SHORT: + search_type=POSITION_TYPE_SELL; + break; + default: + //--- entry direction is not specified; nothing to search + return(false); + } + +//--- go through the list of all positions + int positions=PositionsTotal(); + for(int i=0; i=(int)InpDuration)) + return(true); + } + } + } + +//--- open position not found + return(false); + } +//+------------------------------------------------------------------+ +//| Checks position closing time in bars | +//+------------------------------------------------------------------+ +int BarsHold(datetime open_time) + { +//--- first run a basic simple check + if(TimeCurrent()-open_timeAvgBody(1)) && // bullish candlestick, its body is larger than average + (MathAbs(Close(2)-Open(2))Close(3)) && // second candlestick close is higher than first candlestick close + (Open(2)>Open(3)) && // second candlestick open is higher than first candlestick open + (Open(1)AvgBody(1)) && // bullish candlestick, its body is larger than average + (MathAbs(Close(2)-Open(2))Close(3)) && // second candlestick close is higher than first candlestick close + (Open(2)>Open(3)) && // second candlestick open is higher than first candlestick open + (Close(1)AvgBody(1)) && // bearish candlestick, its body is larger than average + (MathAbs(Close(2)-Open(2))Close(2)) && // upward price gap on the last candlestick + (Close(1)>Close(2))) // last candlestick close higher than second candlestick close + { + ExtPatternDetected=true; + ExtSignalOpen=SIGNAL_BUY; + ExtPatternInfo="\r\nMorning Doji detected"; + ExtDirection="Buy"; + return(true); + } + +//--- check Morning Star + if((Open(3)-Close(3)>AvgBody(1)) && // bearish candlestick, its body is larger than average + (MathAbs(Close(2)-Open(2))MidOpenClose(3))) // last candlestick close is lower than the middle of the first (bearish) one + { + ExtPatternDetected=true; + ExtSignalOpen=SIGNAL_BUY; + ExtPatternInfo="\r\nMorning Star detected"; + ExtDirection="Buy"; + return(true); + } + +//--- result of checking + return(ExtCheckPassed); + } +//+------------------------------------------------------------------+ +//| Returns true in case of successful confirmation check | +//+------------------------------------------------------------------+ +bool CheckConfirmation() + { + ExtConfirmed=false; +//--- if there is no pattern, do not search for confirmation + if(!ExtPatternDetected) + return(true); + +//--- get the value of the stochastic indicator to confirm the signal + double signal=StochSignal(1); + if(signal==EMPTY_VALUE) + { + //--- failed to get indicator value, check failed + return(false); + } + +//--- check the Buy signal + if(ExtSignalOpen==SIGNAL_BUY && (signal<30)) + { + ExtConfirmed=true; + ExtPatternInfo+="\r\n Confirmed: StochSignal<30"; + } + +//--- check the Sell signal + if(ExtSignalOpen==SIGNAL_SELL && (signal>70)) + { + ExtConfirmed=true; + ExtPatternInfo+="\r\n Confirmed: StochSignal>70"; + } + +//--- successful completion of the check + return(true); + } +//+------------------------------------------------------------------+ +//| Check if there is a signal to close | +//+------------------------------------------------------------------+ +bool CheckCloseSignal() + { + ExtSignalClose=false; +//--- if there is a signal to enter the market, do not check the signal to close + if(ExtSignalOpen!=SIGNAL_NOT) + return(true); + +//--- check if there is a signal to close a long position + if(((StochSignal(1)<80) && (StochSignal(2)>80))|| // 80 crossed downwards + ((StochSignal(1)<20) && (StochSignal(2)>20))) // 20 crossed downwards + { + //--- there is a signal to close a long position + ExtSignalClose=CLOSE_LONG; + ExtDirection="Long"; + } + +//--- check if there is a signal to close a short position + if((((StochSignal(1)>20) && (StochSignal(2)<20)) || // 20 crossed upwards + ((StochSignal(1)>80) && (StochSignal(2)<80)))) // 80 crossed upwards + { + //--- there is a signal to close a short position + ExtSignalClose=CLOSE_SHORT; + ExtDirection="Short"; + } + +//--- successful completion of the check + return(true); + } +//+------------------------------------------------------------------+ +//| Stochastic indicator value at the specified bar | +//+------------------------------------------------------------------+ +double StochSignal(int index) + { + double indicator_values[]; + if(CopyBuffer(ExtIndicatorHandle, SIGNAL_LINE, index, 1, indicator_values)<0) + { + //--- if the copying fails, report the error code + PrintFormat("Failed to copy data from the iStochastic indicator, error code %d", GetLastError()); + return(EMPTY_VALUE); + } + return(indicator_values[0]); + } +//+------------------------------------------------------------------+ diff --git a/BKPS/14031206/Experts/x-saherelm.x-121.smc.ea.ex5 b/BKPS/14031206/Experts/x-saherelm.x-121.smc.ea.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..ec81bd5cfdcc2d09ed3498c4b9cb0c1ebfda38cd GIT binary patch literal 1521716 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%0DrF%x~WdfB^9OX%8<`<7Bv~>X!PHu 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

4j&DPF2!xrqblSbGXZLacoHmILJp(S}%w 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�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

!U&d#;XSK6sxf(tbwi~yEJ5}d$)9Xc3#@* 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
qzYTz>}ZIq&@DuX@ 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�beFFgfv52+$V4Xb;dwcb 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

D4=JnbTE*BT2s2m;P0;7t%i<)6% zWMR>xaN20Ld@&!AcuD?f85$;7I#RQ{EN9uFRIaFLS&_xG=A@X2qu5O7>5SBUoY-zd z`SRN%_W!t?5t=ovf)b_Kxm9^@7W2;9@hZA9exw0AMB|qe#E^~_Np@ki>3yxnoEM#6E(hPC%{>7vlICdaytv^zlyz&78?}FXX z8D;#E7P<{~cE`aDNN(U#zOCzZO|Q0V;{kP7iuot9okww?ljT<1-pg3sGIP zn6EEOwFz32VNq_}{H7%?PVTi;SdaP0;WIRpu?FCM?7iT=FLM>YkRO$t=Pu>_bl@7q z@>EGlHXNR@-#b+D6JD1V-M}qU+baTNp8hgdamZH4|DWZ}S*B+|! zmMt?kgdS?uwF#GSUX+YCGFCuaE*FyGB!ok?bp zA;(iAzX9|ey6^xkFKPp~@cVh;PpW_`K{#Og)Pv-zD;VyyqKH9NrrVbKu2T$xGnE)WA^%AWVwBULYwE?G*z0o{-?ZXC%g_mC)Cbzba4 zngY>&CcQW}Jo3SmnNO3!Ra8roaTjC_qRX;!Zp`qtvY(qZ8b)s>4Yk--0uU5|uXORu z5UxFnwWgWW#niZ?^y(AEYC?Kn-yp)6AYF3UKpJR;Q|`2m$d!%37+s1D2fypaGdom) zD+`4V;zgJmd)5=`KI%ac<7+DXT)uG6J%oPXRna)p+Y6)qJO$qeGf~lmkJ!>)O|_

S@!s~dIJ3#FiRWV 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𝔭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

Pq?W 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 z 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 z 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 z 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

+2x73U$g_1V9 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μs@WtQn;aSLVmRuqj9@v9FV(2a+dlu9)9x04 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

a~!sp|FLd-I2y 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 J}M5VCNE6vcSR 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

uMN6e-7b%>uL8}pe?ab(Tg-|-*z|G(*8|s; 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 0 && + eaMagicNumber > 0 + // + ); + if (!isCommonValid) + { + // + errMessage += "common configurations error;" + "\n"; + } + + // + result = + // + // Common ... + isCommonValid && + // + // Otere ... + true + // + ; + + // + if (!result) + { + // + // Since here Logger not Initiallized, we Use Raw Print Command ... + Print(ShortName + " Errors: \n", errMessage); + } + + // + return result; +} + +/** + * Initialize Timer ... + * + * @return ( bool ) + */ +bool InitTimer() +{ + // + bool result = false; + + // + // TODO: Initialize Timer if necessary ... + // result = EventSetTimer(1); + // result = EventSetMillisecondTimer(100); + result = true; + + // + return result; +} + +/** + * Destroy Timer ... + */ +void DestroyTimer() +{ + // + // TODO: Use This ... + // EventKillTimer(); +} + +// diff --git a/BKPS/14031206/Helpers/x-saherelm.x121.helper.ex5 b/BKPS/14031206/Helpers/x-saherelm.x121.helper.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..68eeb0333f834c740eb5859226b9cd17b1d23c4f GIT binary patch literal 7272 zcmdT{MO+--t{&Xool=~^io3($GPo29#ob+tySG?zcONKPw79!lp|};9p}hX@dv|vi zcl(lGPENj@v-py1BB#%X;0iz`03ZVXB?tfK|2F~v#^Ob)5|MY{C~Rt@P!`rA{*C{) z-UkH$_{aW}z{pkL0zDf9Y@8=mAg23b;`|$M6!u@;$2f$2;!&hgBsozy*Ippj|NNB! zI0IY&z5q9XEx;OJ1MmRQ0^R|*{u&Pe`1cM5eE5r6{>{q)8~~1g5k-LZ-&5u<=JfaV zKbil}@(*K=zZGx?2m?6(s`tN?<8Spv&|3)DoX ziEC1uQqD`k#7x1l9|hol;jWBPfiEg>g9`V4dD=auky&}UA~)V(R&qpMJTv^vqzUCm zB6;qfhLzRrZm_r#MM;a@FoDqS;kO@e?2$hmdIsf7{@@V!KIJO4R;H#&;x*-1eWPFp z#^2`&u-77#A|Em-b}rON_6XZZ;QKZ7V1H149IOeOGAO79%#UXKhhn zh0f^u^mcM%1m&~x)vGDctvLtFbUk|Usuk8|Oc^fGE;3QKnJMzpDy1J8CyH1~L{KXl z`CG>;)9SS_d}JR)sK#4Fw`123IVYq6kO=4*8xvB4rNuX8m>p1%-jUpp`M*y`L>6c9 z1Mp)DgV|L8MXuFkxTtDanI?k*na9_EeAP|uV0Z{_9Ctv+2B?H{{xzLm_BfP_mo(EC zhiOLkfw<3F`kF^9N`!8Z1iJ#G3WTx_=UDY>S4(R-tMak$LxaoL#&!qp_njl{SbVC1 zj4oQ70)jtL9Nj~a&YfDuCl2zGfyIr!4p2s9?KntN#;R>u!ppdr&q=lT){L8sCB@ZG zkq|HEV5#06RyownPSn>0fibt@_r0$PCO6{uG_mmH-I$+UqL(DA6O8DfCKDivDcrO6 z$8ggF-#-J83?M==F0|NVR~U2E``#JFGJg9D?8&>ihhtE|F|A13!>D%+0&$5NKr zoof&&P6B3q%9{m%hMtY(Y4HqOZD>&`$+zmdVto01%KqFplasN*)Sv4jvNQHn{EoQ3 zfg;(}qnhT#cFTEX&DuBJP|582c@0O%)+k%+#D!kAv!|6z0-WA$=&o_b80zy_p<>fy zEnf|_Gic>?1*TLQsfsLZ(gtyoA&F0|eDl?7EFYQH-WBb?y;rCS$G}{3dB&Q{B1sZNz`H|J8760?!nn>B zgfsEY*D0~~IY58FJF-T!4sv@smtQhJ5kQX6hl3_2zbo^cd2sC%zk%c0lNLSZuu=LJ z6Wgcn(`PS9J6XoRF^*kA^C8c>?Q_5Csha`z0#=W%aCmtmvKh%{%rxh8EbRMw>mdVW zochYU_+zlDp2a8<6=T$G)|{7RXcCj3a=yK}p~oVe|CUU2wQb10Ub|t`)B>0_)0%jl zcw7DzrleOP4pOn&g(=Y4RVXQi+q^w@5{RWRJ9)s_n!MXZD_hs?ue?;9 zZ{I4f4HBBX4C@#14_F(rgW%(OZ{<~OavE=dM^JdA%zF=3+6R{M0Vf4ZaWTt|fCu9X zb@fkfbzdDNdOqgJ{y27^ob8KQxl%b7g|UjsJa+$*2g}4bO(K35c4&=`dJ4GT_1MoQ z(6~}7XjF4I$&r<=`!kWS%hsH9M}vN4hV^2q#VZ$HzpTcscld|To#4KSYH1krDvb!8 z)29x`Sr?xM52mDVWr2CeBd6p84gA!v4%tR~zFoApOu0}jva-rHA`F*S)3?rz5+)Rkla}zc;TU??QJ@04zCHDpca={?Sq&J<8Da)d9w1ZUWEi#Js#ImP zhrNwiLe0><+v-b5ox?HRG@guLaX2u;Df1p~6YC(_ob2F=YPHa=iQ+wqT*y-z+aEwa zAc!16&i9esCI)U<6moEQmLyzy%-H@OmAvVr;#erTAL}QMyAgZpeGv2?Mi;j0vTb#X z7Lr?Oe$Yb*mU#gH%Yj@y(K`5O9wWk{hFiZ=qGy^$G~HEH9L;#&?R4&P2P5+mPCWrh zSZ&8la#~d{ykod_@*;=P{qjUuSjLs#9JH$$eG5=HRklXG*g|8up2sH>v-N~|+*lnC zz7C#uO0MXSdTSi}hv|y6q`eV-7Ey=)$ZOHuEkSj5own5oJ8_X|d9$u?srw7SrTJv`Np$-KQ|U9e zZFH#Vh`;Hb2SPY8jZjjPnNTQQTZaK-nr)d z9W~-^!rCjlO9<-Y&yTzaL%$6Zj9|WLC6uAE171(m`5ShBdKlx}loX?=v-H6> zwCrDlEiE`l55v|2r)}~X?m(Mnjb;df>LnX2NnFwMjv_#};|)+gPE5t=v)v%SEa#m9 zOK(la&AP|UHZ6KCu6xqSW4=w7M_B6iQ#X~d+AXg0q39Ys<5Q*!cqKqXT&Hx$UpM_j zBk7*%#fp#tZR;`?fglM}>2c;pY=c^Qf)xH^j}M2Kj%g9B8$U@WrNIJ4qRICNQ}>#L zn`J1$G0xrhp4dP;AZbl6kr6xIp_^Ynho^o9U3KKX>=5`krcj`F=c077VR))`tB#lc zoKR;Ogx>cg0BpvuC6q{IDenE49uFf$=^R>5kxLV;Qp)`??iOb3e89spdw7>5VuV-oZkZ9^RU1m7@^1AayvM9HUofGzk#7TO9# zRYl5YDpyzvlIjl)ozD=WH1K^JpRM`V*!;d0l&;80_|GbPxzF7SzBzxD?U)n+y)QCs zw{W{4xI*`lHRsT6OL>xib0?av9J)~*M5iLxEttuuRk3&`>MhP1n?Z6C52My?U$WlS z4(`@#i^f)J8g!bm)Cz8Aaq7$Wj`nGI#)E5jGu#1>4aponJmWT7T! zs|4#XW2C@;($qDb_}+NGsJ5_!_A)^&1?B3izY0a$#b%qrvxrYnzX^vGXjdGlm#?^{ z1Ezr+w6jY&+6BZzngm+U&%z{e?TL}xx{NN)w>b-}1R41i{+tvSKWSlbAq=8(bfa;w z36?FDn}$pbQ$*fhpGxEq=c?5M>`YUN1{2=#7Mwl>Dldt0%fBp|x_m+53`YaI=(vrl z63t9lAH{q;+!bfVB*OtuF)`?dboaS3#z`!ixuild`~S?ni@?x68NA?WK}iNqx@X6d zL|e(;jPqzLl{P#HK5<~CV@Vwqm=CB#yhWS-_V5y6M%3A6smux0!MW*4!ck8CW%A#idV^S&Ay+YR1qT8}ckAIl; zTE#eY_6prpph}=cz(&~>dra*TMuITjp-wZ`H8>6^u$5Fqi!j`qXt2>);gNJ)4Q!ZI zc*{n#*!%{P;w=S??Q}HPUy%?K4^Jw83TD<;RNTXlOTtm9ih3$7Q1yi@8dqu9Qb zD;MT~xpqS`zt?JfMeOtD>vr{7WAosT3aK7e|Kx7DNcwwX5rOn|#*7eXd@mLkjRoY0 zT~d$;DkU%H^Gmot85>R<@>2VSa;Ay;rPs_SZjr*X!l8*bfQM&PLuV|-UMd_T+FYcY zt6Zc?I#4skjrNfoSf4^va~8NwW1!3x0RHavFFG~@epN;j}PRQv<1uL zY+Fip-d#hq=idpkUs{-L;H$40hzk^>A(1O2gbJ~k(PV2qh7qOBh~=gA zb)d&qo|vFVd0n`CZ&!waCN6SUdhmg8Sc?Qek_haX^!O>q{H_sRVhzLw_J)!l?fLat z8yn^;z2=>`K2uj{dF<4zqMPM*GfcL#?bcqFdffgl!HR~M=?PnyW|=2N^RP4GEsaIq z`|3$9H&1;j4TVk{37X=@*&giXj0D<46Bh3hS7&;@EATCxrIa=3RK7>N^n1s&zgJQC z#^UjI#t9eovklLQ>`vMq`98fpj>iauG$Y&z2zkb^|H8h(nk zPI5>lUIe%QSAG{Ri#JCR&eEe074}|z#cyfsA7pkl%6a=zG<*>h~qX(4}Jt!?02Aa`zN^~mLIY@ z*yCQ5+uew)D5qOCr^4_Ko82em%|_LI77+O33#f;6-Iyl{7FuICoTX&WJh=Y#6X#uD z5Z29-hgWq|QGTU){uXG_EX%*T1bE2aLErT~!7+#*bi~O?;k5M2-U7_oA@IF%tTXJj z6DBe*gv+#X{UyQZVKF}F@BW0qNen-;ku!(-AQ--j_;+P}(&nT}By8=~sHDBhj^u|T zYEZetiPk#97p3!~uxz(f13WjFG{!3h#zr&gHzZcZWGsMT>g+SN#Y)I;iEdAy^bZi! ztuA!44Ir|IV+)k(LFcd(InhV3OY-@6J)(F!qmN`BS^rX)K4v=DdS~p*_2}3K4IgNj zp^9-(_wfV%(ocq|3BhPx68p3WFB#L5g8*}-D%@MWJ3MY2^gGmu-Zh<#W;};JWwSc+IGn@`THtII1CVZ2j zfr;o-(t;@oM?~{Fw<4cG=8v=8kYd~SX)lC#Zs5&hH(G|0{uUJ$4NGQbi%N#-=z(Wk zo6@W5ow|{R>vbmn*jKAYM;`l{OW~lpEv^rlZw8+)umZSyeVGcQr*6z6Sc5-rgT4kj z?i*Ut-HcPI!nx`{&?Jp=>4?D>Y9a>F_HH_|Xw51U9-|D9ww~|~JoRT6ijilLQCg9k ze3XK@PZQT8Wz`mXNw6}z5~(FK;RLf_&;AkcDD{0ugqyQn$?8zwgk&9TLtPj_Q6DJ= zCjNmgI`^PwPZVdr_~lQBy6`2sJ$EKQ0M4&~2R}k`}UNOh`bSKZfuLGF~p-|h)Wo<&H%7EADuOJ2$mMNEdz6NU#0 zezyIL`{h`Ssvkd!zbyNGw`bE9<{v!W;FgGSv;Ltxe<_5sOtl``upa$6^$Y%T%Eb|u za~QeY@-dKC&(hPF!>Ussp)4N~y2huLT+Q{A;g2Ez!;lLsWeZP}w}s^oe~BUhvitaa z=y~nU$eqT0y?pljtySUC&%J8n1A5t=7tgqrNd7CGxCe|u;hc3q@2foY^GwZk#t>Wg z9(lkUjPoq67GwK>`QmKS&%%^7swAW-_*DX>eIQU}&965^V+w#B)qO{0kwk8^% zpprYixyrk4fyPdD0!FpxEMrs~CYYv{%i>P4y zhSY=6Cz`9s6|DQ^SB~0eloWmH*Fm8?k#p&dpXGEpRIw&rw(f^WLw(}@j5V00>kd4BWhO?zyV zWj;F{{hG$Aut`D!ALel*BuJf}Kne0K z1zwZKQPcB`%=ri|>DV7YAlFPD@)c(F@c#UJ1)1l@*vN~gpUf8@8zeGUJFN7nlmd{) zO?U0rPGY?tx8PAW6t*5ttxA=LN}dj?QNO9oED2mX>4Z~!lrLfgciyan!mH_B<_?NK zocJyA@9Na|ZSZT}4)MCJQoH>fx;Uh97uU91Vo!8MPwE}{cKZXbRk-94=^luyxS81C zHPHjw_*x&=AD3#%Emu5*Qm-#+Z^`XjH526C+Yal;#}Nqb?tOF!@q(ni9?~`0T#qrSuXOqc6- z;0O6-h?{ym$?of^2vT$MH4I6fj&oq>77t@%Si*lOvFXaI8P-#bo7Xi+)j~=lvygL+$g#H9L9aJQ~VMb)xzYLB;_>@waxy(VKALN-2Zvc0Jk%G>uQG2#<>jd-l7Sgxbh*? zYTxeEmH*gZ3mgM`bfnMLGIj$fpVG`xGjwW^TMc`AEUvSfXvL9Kfrxk~hER;!gyzr_ zzeJp2e%kxRZ#3-L8ees|s*)-nYqRn?pELe4Ra`wwMZqGJ1KAn#G4+`!G>dB^-W}E9 z!Q=rrV+JopZI;WsO+aMml~wC1IF%%v9>D^eJd9BXJy zY@|P)=0^Ja)cBZVddj;;oNr7|1+4YEl!=HAyfT~Wdj)jLg|k~|zb$*uL%5TD&E!#j z6)wOCm{Dk@9C8ExK8x)lSJcRyV@@a>F%2hW*(#m^3b6#2f6H`83M>^jLQth<4z#!< znDM~^IoJd&SxL2cNi6Gc1X&@Vf^cdAxbw5@^p?DA(AQs@qk|U|8=&oht-pPW7co7{ ziw{0kc^h?c$45`HfakfktCX_e&ax5kgmevx RSI ..." + separator + + "-----------------------" + separator + + ToString("isRsiOverBought", isRsiOverBought, ignoreFalseConditions, separator) + + ToString("isRsiCrossedOverOverBought", isRsiCrossedOverOverBought, ignoreFalseConditions, separator) + + ToString("isRsiCrossedUnderOverBought", isRsiCrossedUnderOverBought, ignoreFalseConditions, separator) + + ToString("isRsiOverSold", isRsiOverSold, ignoreFalseConditions, separator) + + ToString("isRsiCrossedUnderOverSold", isRsiCrossedUnderOverSold, ignoreFalseConditions, separator) + + ToString("isRsiCrossedOverOverSold", isRsiCrossedOverOverSold, ignoreFalseConditions, separator) + + // + "-----------------------" + separator + + "ATR ..." + separator + + "-----------------------" + separator + + ToString("isClosedOverAtrUpper", isClosedOverAtrUpper, ignoreFalseConditions, separator) + + ToString("isClosedOverAtrLower", isClosedOverAtrLower, ignoreFalseConditions, separator) + + ToString("isClosedUnderAtrUpper", isClosedUnderAtrUpper, ignoreFalseConditions, separator) + + ToString("isClosedUnderAtrLower", isClosedUnderAtrLower, ignoreFalseConditions, separator) + + ToString("isRejectedUpAtrUpper", isRejectedUpAtrUpper, ignoreFalseConditions, separator) + + ToString("isRejectedDownAtrUpper", isRejectedDownAtrUpper, ignoreFalseConditions, separator) + + ToString("isRejectedUpAtrLower", isRejectedUpAtrLower, ignoreFalseConditions, separator) + + ToString("isRejectedDownAtrLower", isRejectedDownAtrLower, ignoreFalseConditions, separator) + + ToString("isBreakedUpAtrUpper", isBreakedUpAtrUpper, ignoreFalseConditions, separator) + + ToString("isBreakedDownAtrUpper", isBreakedDownAtrUpper, ignoreFalseConditions, separator) + + ToString("isBreakedUpAtrLower", isBreakedUpAtrLower, ignoreFalseConditions, separator) + + // + "-----------------------" + separator + + "DON ..." + separator + + "-----------------------" + separator + + ToString("isBreakedDownAtrLower", isBreakedDownAtrLower, ignoreFalseConditions, separator) + + ToString("isRejectedDonOpenUpper", isRejectedDonOpenUpper, ignoreFalseConditions, separator) + + ToString("isRejectedDonHighUpper", isRejectedDonHighUpper, ignoreFalseConditions, separator) + + ToString("isRejectedDonLowUpper", isRejectedDonLowUpper, ignoreFalseConditions, separator) + + ToString("isRejectedDonCloseUpper", isRejectedDonCloseUpper, ignoreFalseConditions, separator) + + ToString("isRejectedDonOpenLower", isRejectedDonOpenLower, ignoreFalseConditions, separator) + + ToString("isRejectedDonHighLower", isRejectedDonHighLower, ignoreFalseConditions, separator) + + ToString("isRejectedDonLowLower", isRejectedDonLowLower, ignoreFalseConditions, separator) + + ToString("isRejectedDonCloseLower", isRejectedDonCloseLower, ignoreFalseConditions, separator) + + ToString("isBreakedDonOpenUpper", isBreakedDonOpenUpper, ignoreFalseConditions, separator) + + ToString("isBreakedDonHighUpper", isBreakedDonHighUpper, ignoreFalseConditions, separator) + + ToString("isBreakedDonLowUpper", isBreakedDonLowUpper, ignoreFalseConditions, separator) + + ToString("isBreakedDonCloseUpper", isBreakedDonCloseUpper, ignoreFalseConditions, separator) + + ToString("isBreakedDonOpenLower", isBreakedDonOpenLower, ignoreFalseConditions, separator) + + ToString("isBreakedDonHighLower", isBreakedDonHighLower, ignoreFalseConditions, separator) + + ToString("isBreakedDonLowLower", isBreakedDonLowLower, ignoreFalseConditions, separator) + + ToString("isBreakedDonCloseLower", isBreakedDonCloseLower, ignoreFalseConditions, separator) + + // + "-----------------------" + separator + + "VWAP ..." + separator + + "-----------------------" + separator + + ToString("isVWapFastBullish", isVWapFastBullish, ignoreFalseConditions, separator) + + ToString("isVWapFastBearish", isVWapFastBearish, ignoreFalseConditions, separator) + + ToString("isVWapFastNeutural", isVWapFastNeutural, ignoreFalseConditions, separator) + + ToString("isVWapMidBullish", isVWapMidBullish, ignoreFalseConditions, separator) + + ToString("isVWapMidBearish", isVWapMidBearish, ignoreFalseConditions, separator) + + ToString("isVWapMidNeutural", isVWapMidNeutural, ignoreFalseConditions, separator) + + ToString("isVWapSlowBullish", isVWapSlowBullish, ignoreFalseConditions, separator) + + ToString("isVWapSlowBearish", isVWapSlowBearish, ignoreFalseConditions, separator) + + ToString("isVWapSlowNeutural", isVWapSlowNeutural, ignoreFalseConditions, separator) + + ToString("isVWapFastOverMid", isVWapFastOverMid, ignoreFalseConditions, separator) + + ToString("isVWapMidOverSlow", isVWapMidOverSlow, ignoreFalseConditions, separator) + + ToString("isVWapFastUnderMid", isVWapFastUnderMid, ignoreFalseConditions, separator) + + ToString("isVWapMidUnderSlow", isVWapMidUnderSlow, ignoreFalseConditions, separator) + + ToString("isVWapBullishState", isVWapBullishState, ignoreFalseConditions, separator) + + ToString("isVWapBearishState", isVWapBearishState, ignoreFalseConditions, separator) + + ToString("isVWapNeuturalState", isVWapNeuturalState, ignoreFalseConditions, separator) + + ToString("isVWapBullishOrdered", isVWapBullishOrdered, ignoreFalseConditions, separator) + + ToString("isVWapBearishOrdered", isVWapBearishOrdered, ignoreFalseConditions, separator) + + ToString("isVWapSwitchedToBullishOrdered", isVWapSwitchedToBullishOrdered, ignoreFalseConditions, separator) + + ToString("isVWapSwitchedToBearishOrdered", isVWapSwitchedToBearishOrdered, ignoreFalseConditions, separator) + + ToString("isVWapSwitchedToBullishState", isVWapSwitchedToBullishState, ignoreFalseConditions, separator) + + ToString("isVWapSwitchedToBearishState", isVWapSwitchedToBearishState, ignoreFalseConditions, separator) + + ToString("isVWapSwitchedToNeuturalState", isVWapSwitchedToNeuturalState, ignoreFalseConditions, separator) + + // + "-----------------------" + separator + + "CHE ..." + separator + + "-----------------------" + separator + + ToString("isChe1Bullish", isChe1Bullish, ignoreFalseConditions, separator) + + ToString("isChe1Bearish", isChe1Bearish, ignoreFalseConditions, separator) + + ToString("isChe1SwitchedToBullish", isChe1SwitchedToBullish, ignoreFalseConditions, separator) + + ToString("isChe1SwitchedToBearish", isChe1SwitchedToBearish, ignoreFalseConditions, separator) + + ToString("isChe2Bullish", isChe2Bullish, ignoreFalseConditions, separator) + + ToString("isChe2Bearish", isChe2Bearish, ignoreFalseConditions, separator) + + ToString("isChe2SwitchedToBullish", isChe2SwitchedToBullish, ignoreFalseConditions, separator) + + ToString("isChe2SwitchedToBearish", isChe2SwitchedToBearish, ignoreFalseConditions, separator) + + ToString("isCheBullish", isCheBullish, ignoreFalseConditions, separator) + + ToString("isCheBearish", isCheBearish, ignoreFalseConditions, separator) + + ToString("isCheSwitchedToBullish", isCheSwitchedToBullish, ignoreFalseConditions, separator) + + ToString("isCheSwitchedToBearish", isCheSwitchedToBearish, ignoreFalseConditions, separator) + + ToString("isClosedOverCheMin", isClosedOverCheMin, ignoreFalseConditions, separator) + + ToString("isClosedOverCheMax", isClosedOverCheMax, ignoreFalseConditions, separator) + + ToString("isClosedUnderCheMin", isClosedUnderCheMin, ignoreFalseConditions, separator) + + ToString("isClosedUnderCheMax", isClosedUnderCheMax, ignoreFalseConditions, separator) + + // + "-----------------------" + separator + + "HK ..." + separator + + "-----------------------" + separator + + ToString("isSMHKBullish", isSMHKBullish, ignoreFalseConditions, separator) + + ToString("isRawHKBullish", isRawHKBullish, ignoreFalseConditions, separator) + + ToString("isSMHKBearish", isSMHKBearish, ignoreFalseConditions, separator) + + ToString("isRawHKBearish", isRawHKBearish, ignoreFalseConditions, separator) + + ToString("isBreakedUpSMHK", isBreakedUpSMHK, ignoreFalseConditions, separator) + + ToString("isBreakedUpRawHK", isBreakedUpRawHK, ignoreFalseConditions, separator) + + ToString("isRejectedUpSMHK", isRejectedUpSMHK, ignoreFalseConditions, separator) + + ToString("isClosedOverSMHK", isClosedOverSMHK, ignoreFalseConditions, separator) + + ToString("isRejectedUpRawHK", isRejectedUpRawHK, ignoreFalseConditions, separator) + + ToString("isBreakedDownSMHK", isBreakedDownSMHK, ignoreFalseConditions, separator) + + ToString("isClosedUnderSMHK", isClosedUnderSMHK, ignoreFalseConditions, separator) + + ToString("isClosedOverRawHK", isClosedOverRawHK, ignoreFalseConditions, separator) + + ToString("isClosedUnderRawHK", isClosedUnderRawHK, ignoreFalseConditions, separator) + + ToString("isBreakedDownRawHK", isBreakedDownRawHK, ignoreFalseConditions, separator) + + ToString("isRejectedDownSMHK", isRejectedDownSMHK, ignoreFalseConditions, separator) + + ToString("isRejectedDownRawHK", isRejectedDownRawHK, ignoreFalseConditions, separator) + + ToString("isRawHKBreakedUpSMHK", isRawHKBreakedUpSMHK, ignoreFalseConditions, separator) + + ToString("isRawHKClosedOverSMHK", isRawHKClosedOverSMHK, ignoreFalseConditions, separator) + + ToString("isSMHKSwitchedToBearish", isSMHKSwitchedToBearish, ignoreFalseConditions, separator) + + ToString("isRawHKSwitchedToBearish", isRawHKSwitchedToBearish, ignoreFalseConditions, separator) + + ToString("isRawHKClosedUnderSMHK", isRawHKClosedUnderSMHK, ignoreFalseConditions, separator) + + ToString("isRawHKBreakedDownSMHK", isRawHKBreakedDownSMHK, ignoreFalseConditions, separator) + + ToString("isSMHKSwitchedToBullish", isSMHKSwitchedToBullish, ignoreFalseConditions, separator) + + ToString("isRawHKSwitchedToBullish", isRawHKSwitchedToBullish, ignoreFalseConditions, separator) + + // + "-----------------------" + separator + + "Slopes ..." + separator + + "-----------------------" + separator + + ToString("isRsiSlopeBullish", isRsiSlopeBullish, ignoreFalseConditions, separator) + + ToString("isStrSlopeBullish", isStrSlopeBullish, ignoreFalseConditions, separator) + + ToString("isAtrUpperSlopeBullish", isAtrUpperSlopeBullish, ignoreFalseConditions, separator) + + ToString("isAtrLowerSlopeBullish", isAtrLowerSlopeBullish, ignoreFalseConditions, separator) + + ToString("isVwapFastSlopeBullish", isVwapFastSlopeBullish, ignoreFalseConditions, separator) + + ToString("isVwapMidSlopeBullish", isVwapMidSlopeBullish, ignoreFalseConditions, separator) + + ToString("isVwapSlowSlopeBullish", isVwapSlowSlopeBullish, ignoreFalseConditions, separator) + + ToString("isRsiSlopeBearish", isRsiSlopeBearish, ignoreFalseConditions, separator) + + ToString("isStrSlopeBearish", isStrSlopeBearish, ignoreFalseConditions, separator) + + ToString("isAtrUpperSlopeBearish", isAtrUpperSlopeBearish, ignoreFalseConditions, separator) + + ToString("isAtrLowerSlopeBearish", isAtrLowerSlopeBearish, ignoreFalseConditions, separator) + + ToString("isVwapFastSlopeBearish", isVwapFastSlopeBearish, ignoreFalseConditions, separator) + + ToString("isVwapMidSlopeBearish", isVwapMidSlopeBearish, ignoreFalseConditions, separator) + + ToString("isVwapSlowSlopeBearish", isVwapSlowSlopeBearish, ignoreFalseConditions, separator) + + // + "-----------------------" + separator + + "Coplex ..." + separator + + "-----------------------" + separator + + ToString("isSarIncreased", isSarIncreased, ignoreFalseConditions, separator) + + ToString("isSarDecreased", isSarDecreased, ignoreFalseConditions, separator) + + ToString("isSarEqualsToPeak", isSarEqualsToPeak, ignoreFalseConditions, separator) + + + ToString("isStrEqualsToPeak", isStrEqualsToPeak, ignoreFalseConditions, separator) + + ToString("isStrEqualsToVale", isStrEqualsToVale, ignoreFalseConditions, separator) + + ToString("isPeakOverAtrUpper", isPeakOverAtrUpper, ignoreFalseConditions, separator) + + ToString("isBreakedUpPrevSar", isBreakedUpPrevSar, ignoreFalseConditions, separator) + + ToString("isBreakedUpPrevStr", isBreakedUpPrevStr, ignoreFalseConditions, separator) + + ToString("isVWapMinBreakedUp", isVWapMinBreakedUp, ignoreFalseConditions, separator) + + ToString("isVWapMaxBreakedUp", isVWapMaxBreakedUp, ignoreFalseConditions, separator) + + ToString("isStrUpperOverPeak", isStrUpperOverPeak, ignoreFalseConditions, separator) + + ToString("isStrLowerOverVale", isStrLowerOverVale, ignoreFalseConditions, separator) + + ToString("isAtrUpperOverPeak", isAtrUpperOverPeak, ignoreFalseConditions, separator) + + ToString("isAtrLowerUnderVale", isAtrLowerUnderVale, ignoreFalseConditions, separator) + + ToString("isClosedOverVWapMin", isClosedOverVWapMin, ignoreFalseConditions, separator) + + ToString("isClosedOverVWapMax", isClosedOverVWapMax, ignoreFalseConditions, separator) + + ToString("isStrUpperUnderPeak", isStrUpperUnderPeak, ignoreFalseConditions, separator) + + ToString("isValeUnderAtrLower", isValeUnderAtrLower, ignoreFalseConditions, separator) + + ToString("isStrLowerUnderVale", isStrLowerUnderVale, ignoreFalseConditions, separator) + + ToString("isVWapMinBreakedDown", isVWapMinBreakedDown, ignoreFalseConditions, separator) + + ToString("isVWapMaxBreakedDown", isVWapMaxBreakedDown, ignoreFalseConditions, separator) + + ToString("isClosedUnderVWapMin", isClosedUnderVWapMin, ignoreFalseConditions, separator) + + ToString("isClosedUnderVWapMax", isClosedUnderVWapMax, ignoreFalseConditions, separator) + + ToString("isBreakedDownPrevSar", isBreakedDownPrevSar, ignoreFalseConditions, separator) + + ToString("isBreakedDownPrevStr", isBreakedDownPrevStr, ignoreFalseConditions, separator) + + ToString("isSarCrossedOverVale", isSarCrossedOverVale, ignoreFalseConditions, separator) + + ToString("isStrCrossedOverVale", isStrCrossedOverVale, ignoreFalseConditions, separator) + + ToString("isBreakedUpPrevCheLE1", isBreakedUpPrevCheLE1, ignoreFalseConditions, separator) + + ToString("isBreakedUpPrevCheLE2", isBreakedUpPrevCheLE2, ignoreFalseConditions, separator) + + ToString("isBreakedUpPrevCheSE1", isBreakedUpPrevCheSE1, ignoreFalseConditions, separator) + + ToString("isBreakedUpPrevCheSE2", isBreakedUpPrevCheSE2, ignoreFalseConditions, separator) + + ToString("isSarCrossedUnderPeak", isSarCrossedUnderPeak, ignoreFalseConditions, separator) + + ToString("isStrCrossedUnderPeak", isStrCrossedUnderPeak, ignoreFalseConditions, separator) + + ToString("isNewPeakOverAtrUpper", isNewPeakOverAtrUpper, ignoreFalseConditions, separator) + + ToString("isBreakedUpPrevCheMin", isBreakedUpPrevCheMin, ignoreFalseConditions, separator) + + ToString("isBreakedUpPrevCheMax", isBreakedUpPrevCheMax, ignoreFalseConditions, separator) + + ToString("isNewValeUnderAtrLower", isNewValeUnderAtrLower, ignoreFalseConditions, separator) + + ToString("isStrUpperOverAtrUpper", isStrUpperOverAtrUpper, ignoreFalseConditions, separator) + + ToString("isStrLowerOverAtrLower", isStrLowerOverAtrLower, ignoreFalseConditions, separator) + + ToString("isAtrUpperEqualsToPeak", isAtrUpperEqualsToPeak, ignoreFalseConditions, separator) + + ToString("isAtrLowerEqualsToVale", isAtrLowerEqualsToVale, ignoreFalseConditions, separator) + + ToString("isBreakedDownPrevCheMin", isBreakedDownPrevCheMin, ignoreFalseConditions, separator) + + ToString("isBreakedDownPrevCheMax", isBreakedDownPrevCheMax, ignoreFalseConditions, separator) + + ToString("isBreakedDownPrevCheLE1", isBreakedDownPrevCheLE1, ignoreFalseConditions, separator) + + ToString("isBreakedDownPrevCheLE2", isBreakedDownPrevCheLE2, ignoreFalseConditions, separator) + + ToString("isBreakedDownPrevCheSE1", isBreakedDownPrevCheSE1, ignoreFalseConditions, separator) + + ToString("isBreakedDownPrevCheSE2", isBreakedDownPrevCheSE2, ignoreFalseConditions, separator) + + ToString("isAtrUpperCrossedUpPeak", isAtrUpperCrossedUpPeak, ignoreFalseConditions, separator) + + ToString("isAtrLowerCrossedUpVale", isAtrLowerCrossedUpVale, ignoreFalseConditions, separator) + + ToString("isStrUpperUnderAtrUpper", isStrUpperUnderAtrUpper, ignoreFalseConditions, separator) + + ToString("isStrLowerUnderAtrLower", isStrLowerUnderAtrLower, ignoreFalseConditions, separator) + + ToString("isBreakedUpPrevAtrUpper", isBreakedUpPrevAtrUpper, ignoreFalseConditions, separator) + + ToString("isBreakedUpPrevAtrLower", isBreakedUpPrevAtrLower, ignoreFalseConditions, separator) + + ToString("isVWapFastCrossedOverMid", isVWapFastCrossedOverMid, ignoreFalseConditions, separator) + + ToString("isRejectedUpPrevAtrUpper", isRejectedUpPrevAtrUpper, ignoreFalseConditions, separator) + + ToString("isRejectedUpPrevAtrLower", isRejectedUpPrevAtrLower, ignoreFalseConditions, separator) + + ToString("isAtrUpperCrossedDownPeak", isAtrUpperCrossedDownPeak, ignoreFalseConditions, separator) + + ToString("isAtrLowerCrossedDownVale", isAtrLowerCrossedDownVale, ignoreFalseConditions, separator) + + ToString("isBreakedDownPrevAtrUpper", isBreakedDownPrevAtrUpper, ignoreFalseConditions, separator) + + ToString("isBreakedDownPrevAtrLower", isBreakedDownPrevAtrLower, ignoreFalseConditions, separator) + + ToString("isVWapFastCrossedUnderMid", isVWapFastCrossedUnderMid, ignoreFalseConditions, separator) + + ToString("isVWapFastCrossedOverSlow", isVWapFastCrossedOverSlow, ignoreFalseConditions, separator) + + ToString("isStrUpperCrossedOverPeak", isStrUpperCrossedOverPeak, ignoreFalseConditions, separator) + + ToString("isStrLowerOverDonLowLower", isStrLowerOverDonLowLower, ignoreFalseConditions, separator) + + ToString("isStrLowerCrossedOverVale", isStrLowerCrossedOverVale, ignoreFalseConditions, separator) + + ToString("isDonLowLowerEqualsToVale", isDonLowLowerEqualsToVale, ignoreFalseConditions, separator) + + ToString("isRejectedDownPrevAtrUpper", isRejectedDownPrevAtrUpper, ignoreFalseConditions, separator) + + ToString("isRejectedDownPrevAtrLower", isRejectedDownPrevAtrLower, ignoreFalseConditions, separator) + + ToString("isVWapFastCrossedUnderSlow", isVWapFastCrossedUnderSlow, ignoreFalseConditions, separator) + + ToString("isStrUpperCrossedUnderPeak", isStrUpperCrossedUnderPeak, ignoreFalseConditions, separator) + + ToString("isStrLowerCrossedUnderVale", isStrLowerCrossedUnderVale, ignoreFalseConditions, separator) + + ToString("isDonHighUpperEqualsToPeak", isDonHighUpperEqualsToPeak, ignoreFalseConditions, separator) + + ToString("isStrUpperOverDonHighUpper", isStrUpperOverDonHighUpper, ignoreFalseConditions, separator) + + ToString("isStrLowerUnderDonLowLower", isStrLowerUnderDonLowLower, ignoreFalseConditions, separator) + + ToString("isStrUpperUnderDonHighUpper", isStrUpperUnderDonHighUpper, ignoreFalseConditions, separator) + + ToString("isStrUpperCrossedOverAtrUpper", isStrUpperCrossedOverAtrUpper, ignoreFalseConditions, separator) + + ToString("isStrLowerCrossedOverAtrLower", isStrLowerCrossedOverAtrLower, ignoreFalseConditions, separator) + + ToString("isStrUpperCrossedUnderAtrUpper", isStrUpperCrossedUnderAtrUpper, ignoreFalseConditions, separator) + + ToString("isStrLowerCrossedUnderAtrLower", isStrLowerCrossedUnderAtrLower, ignoreFalseConditions, separator) + + ToString("isStrLowerCrossedOverDonLowLower", isStrLowerCrossedOverDonLowLower, ignoreFalseConditions, separator) + + ToString("isStrUpperCrossedOverDonHighUpper", isStrUpperCrossedOverDonHighUpper, ignoreFalseConditions, separator) + + ToString("isStrLowerCrossedUnderDonLowLower", isStrLowerCrossedUnderDonLowLower, ignoreFalseConditions, separator) + + ToString("isStrUpperCrossedUnderDonHighUpper", isStrUpperCrossedUnderDonHighUpper, ignoreFalseConditions, separator) + + // + "" + // + ; + + // + result = + // + "[" + GetTag() + "]" + separator + + (onlyConditions + ? "" + : commonStr) + + (!includeScores + ? "" + : scoresStr) + + " " + separator + + (onlyCommons + ? "" + : conditionsStr) + + "" + // + ; + + // + return result; + } + + /** + * Retrieve nique Tag Identifier ... + * + * @return ( string ) + */ + string GetTag() + { + return GetTypeName(this); + } + + // +}; + +// +// Implementation ... +class XCX121Helper : public XCBase +{ + // + public: + // + + // + // Helpers ... + XCX121XPVHelper *xpvHelper; + XCX121XHKHelper *xhkHelper; + XCX121XATRHelper *xatrHelper; + XCX121XSTRHelper *xstrHelper; + XCX121XCHEHelper *xcheHelper; + XCX121XDONHelper *xdonHelper; + XCX121XVWAPHelper *xvwapHelper; + XCX121XTRENDHelper *xtrendHelper; + + // + // Constructors ... + XCX121Helper() + { + } + + // + // Deconstructor ... + ~XCX121Helper() + { + // + delete xpvHelper; + delete xhkHelper; + delete xatrHelper; + delete xstrHelper; + delete xcheHelper; + delete xdonHelper; + delete xvwapHelper; + delete xtrendHelper; + + // + ZeroMemory(xpvHelper); + ZeroMemory(xhkHelper); + ZeroMemory(xatrHelper); + ZeroMemory(xstrHelper); + ZeroMemory(xcheHelper); + ZeroMemory(xdonHelper); + ZeroMemory(xvwapHelper); + ZeroMemory(xtrendHelper); + } + + // + string GetSymbol() + { + return mSymbol; + } + + // + ENUM_TIMEFRAMES GetPeriod() + { + return mPeriod; + } + + // + // Tools ... + + /** + * Initialize Indicator Helper ... + * + * @param symbol: String, Symbol ... + * @param period: ENUM_TIMEFRAMES member, Period ... + * @param inputs: X121Inputs instance, Indicator Inputs ... + * + * @return ( bool ) + */ + bool Init( + string symbol, // Trading Symbol + ENUM_TIMEFRAMES period, // Trading Period + X121Inputs &inputs // Inputs + ) + { + // + bool result = false; + + // + result = + IsValid(symbol) && + IsValid(period) && + inputs.IsValid(); + if (!result) + { + return result; + } + + // + mSymbol = symbol; + mPeriod = period; + + // + // Setting Inputs ... + + // + mInputs = inputs; + xpvInputs = inputs.xpvInputs; + xhkInputs = inputs.xhkInputs; + xatrInputs = inputs.xatrInputs; + xstrInputs = inputs.xstrInputs; + xcheInputs = inputs.xcheInputs; + xdonInputs = inputs.xdonInputs; + xvwapInputs = inputs.xvwapInputs; + xtrendInputs = inputs.xtrendInputs; + + // + // Initial Helpers ... + + // + // XPV ... + xpvHelper = new XCX121XPVHelper(); + result = xpvHelper.Init( + symbol, + period, + xpvInputs // + ); + if (!result) + { + return result; + } + + // + // XHK ... + xhkHelper = new XCX121XHKHelper(); + result = xhkHelper.Init( + symbol, + period, + xhkInputs // + ); + if (!result) + { + return result; + } + + // + // XATR ... + xatrHelper = new XCX121XATRHelper(); + result = xatrHelper.Init( + symbol, + period, + xatrInputs // + ); + if (!result) + { + return result; + } + + // + // XSTR ... + xstrHelper = new XCX121XSTRHelper(); + result = xstrHelper.Init( + symbol, + period, + xstrInputs // + ); + if (!result) + { + return result; + } + + // + // XCHE ... + xcheHelper = new XCX121XCHEHelper(); + result = xcheHelper.Init( + symbol, + period, + xcheInputs // + ); + if (!result) + { + return result; + } + + // + // XDON ... + xdonHelper = new XCX121XDONHelper(); + result = xdonHelper.Init( + symbol, + period, + xdonInputs // + ); + if (!result) + { + return result; + } + + // + // XVWAP ... + xvwapHelper = new XCX121XVWAPHelper(); + result = xvwapHelper.Init( + symbol, + period, + xvwapInputs // + ); + if (!result) + { + return result; + } + + // + // XTREND ... + xtrendHelper = new XCX121XTRENDHelper(); + result = xtrendHelper.Init( + symbol, + period, + xtrendInputs // + ); + if (!result) + { + return result; + } + + // + if (inputs.showRSI) + { + // + mRSIHandler = iRSI( + symbol, + period, + xatrInputs.rsiLength, + xatrInputs.rsiAppliedTo // + ); + + // + result = mRSIHandler != INVALID_HANDLE; + if (!result) + { + return result; + } + } + + // + return result; + } + + // + // Conditions Readers ... + + // + // XPV ... + bool GetPVConditions( + X121XPVConditions &conditions, // + int barIndex = 0, // + int loopback = 5 // + ) + { + // + bool result = false; + + // + result = xpvHelper.GetConditions( + conditions, + barIndex, + loopback // + ); + + // + return result; + } + + // + // XHK ... + bool GetHKConditions( + X121XHKConditions &conditions, // + int barIndex = 0, // + int loopback = 5 // + ) + { + // + bool result = false; + + // + result = xhkHelper.GetConditions( + conditions, + barIndex, + loopback // + ); + + // + return result; + } + + // + // XATR ... + bool GetATRConditions( + X121XATRConditions &conditions, // + int barIndex = 0, // + int loopback = 5 // + ) + { + // + bool result = false; + + // + result = xatrHelper.GetConditions( + conditions, + barIndex, + loopback // + ); + + // + return result; + } + + // + // XSTR ... + bool GetSTRConditions( + X121XSTRConditions &conditions, // + int barIndex = 0, // + int loopback = 5 // + ) + { + // + bool result = false; + + // + result = xstrHelper.GetConditions( + conditions, + barIndex, + loopback // + ); + + // + return result; + } + + // + // XCHE ... + bool GetCHEConditions( + X121XCHEConditions &conditions, // + int barIndex = 0, // + int loopback = 5 // + ) + { + // + bool result = false; + + // + result = xcheHelper.GetConditions( + conditions, + barIndex, + loopback // + ); + + // + return result; + } + + // + // XDON ... + bool GetDONConditions( + X121XDONConditions &conditions, // + int barIndex = 0, // + int loopback = 5 // + ) + { + // + bool result = false; + + // + result = xdonHelper.GetConditions( + conditions, + barIndex, + loopback // + ); + + // + return result; + } + + // + // XVWAP ... + bool GetVWAPConditions( + X121XVWAPConditions &conditions, // + int barIndex = 0, // + int loopback = 5 // + ) + { + // + bool result = false; + + // + result = xvwapHelper.GetConditions( + conditions, + barIndex, + loopback // + ); + + // + return result; + } + + // + // XTREND ... + bool GetTrendConditions( + X121XTRENDConditions &conditions, // + int barIndex = 0, // + int loopback = 5 // + ) + { + // + bool result = false; + + // + result = xtrendHelper.GetConditions( + conditions, + barIndex, + loopback // + ); + + // + return result; + } + + // + void Free() + { + // + xpvHelper.Free(); + xhkHelper.Free(); + xatrHelper.Free(); + xstrHelper.Free(); + xcheHelper.Free(); + xdonHelper.Free(); + xvwapHelper.Free(); + xtrendHelper.Free(); + } + + // + bool GetConditions( + X121Conditions &conditions, // + int barIndex = 0, // + int loopback = 5 // + ) + { + // + bool result = true; + + // + if (loopback < 5) + { + loopback = 5; + } + + // + conditions.Clean(); + + // + conditions.symbol = mSymbol; + conditions.period = mPeriod; + conditions.time = TimeCurrent(); + + // + int zIndex = barIndex; + int cIndex = zIndex + 1; + int pIndex = cIndex + 1; + int ppIndex = pIndex + 1; + + // + XOHCL zBar; + result = zBar.Init( + mSymbol, + mPeriod, + zIndex // + ); + if (!result) + { + return result; + } + + // + XOHCL cBar; + result = cBar.Init( + mSymbol, + mPeriod, + cIndex // + ); + if (!result) + { + return result; + } + + // + XOHCL pBar; + result = pBar.Init( + mSymbol, + mPeriod, + pIndex // + ); + if (!result) + { + return result; + } + + // + // XPV ... + X121XPVConditions xpvConditions; + result = GetPVConditions( + xpvConditions, + barIndex, + loopback // + ); + if (!result) + { + return result; + } + + // + // XHK ... + X121XHKConditions xhkConditions; + result = GetHKConditions( + xhkConditions, + barIndex, + loopback // + ); + if (!result) + { + return result; + } + + // + // XATR ... + X121XATRConditions xatrConditions; + result = GetATRConditions( + xatrConditions, + barIndex, + loopback // + ); + if (!result) + { + return result; + } + + // + // XSTR ... + X121XSTRConditions xstrConditions; + result = GetSTRConditions( + xstrConditions, + barIndex, + loopback // + ); + if (!result) + { + return result; + } + + // + // XCHE ... + X121XCHEConditions xcheConditions; + result = GetCHEConditions( + xcheConditions, + barIndex, + loopback // + ); + if (!result) + { + return result; + } + + // + // XDON ... + X121XDONConditions xdonConditions; + result = GetDONConditions( + xdonConditions, + barIndex, + loopback // + ); + if (!result) + { + return result; + } + + // + // XVWAP ... + X121XVWAPConditions xvwapConditions; + result = GetVWAPConditions( + xvwapConditions, + barIndex, + loopback // + ); + if (!result) + { + return result; + } + + // + // XTREND ... + X121XTRENDConditions xtrendConditions; + result = GetTrendConditions( + xtrendConditions, + barIndex, + loopback // + ); + if (!result) + { + return result; + } + + // + // Fill Volume Buffer ... + for (int i = barIndex; i < barIndex + loopback; i++) + { + // + // Reading Bar Valuem ... + long iVol = iVolume( + mSymbol, + mPeriod, + i // + ); + + // + Add( + iVol, + conditions.volumeBuffer // + ); + } + + // + // Fill X121 Conditions Reference by Using + // Retrieved Conditions ... + + // + int cIDX = 1; + int pIDX = cIDX + 1; + + // + // XPV ... + + // + // Buffers ... + + // + Copy( + xpvConditions.peaksBuffer, + conditions.peaksBuffer // + ); + + // + Copy( + xpvConditions.valesBuffer, + conditions.valesBuffer // + ); + + // + Copy( + xpvConditions.sarBuffer, + conditions.sarBuffer // + ); + + // + Copy( + xpvConditions.cHHBuffer, + conditions.cHHBuffer // + ); + + // + Copy( + xpvConditions.cLLBuffer, + conditions.cLLBuffer // + ); + + // + Copy( + xpvConditions.sHHBuffer, + conditions.sHHBuffer // + ); + + // + Copy( + xpvConditions.sLLBuffer, + conditions.sLLBuffer // + ); + + // + Copy( + xpvConditions.mHHBuffer, + conditions.mHHBuffer // + ); + + // + Copy( + xpvConditions.mLLBuffer, + conditions.mLLBuffer // + ); + + // + Copy( + xpvConditions.lHHBuffer, + conditions.lHHBuffer // + ); + + // + Copy( + xpvConditions.lLLBuffer, + conditions.lLLBuffer // + ); + + // + Copy( + xpvConditions.hHHBuffer, + conditions.hHHBuffer // + ); + + // + Copy( + xpvConditions.hLLBuffer, + conditions.hLLBuffer // + ); + + // + // Conditions ... + + // + conditions.isNewPeak = xpvConditions.isNewPeak; + conditions.isNewVale = xpvConditions.isNewVale; + conditions.isSarBullish = xpvConditions.isSarBullish; + conditions.isSarBearish = xpvConditions.isSarBearish; + conditions.isNewPeakOverLast = xpvConditions.isNewPeakOverLast; + conditions.isNewValeOverLast = xpvConditions.isNewValeOverLast; + conditions.isNewPeakUnderLast = xpvConditions.isNewPeakUnderLast; + conditions.isNewValeUnderLast = xpvConditions.isNewValeUnderLast; + conditions.isRejectedPrevVale = xpvConditions.isRejectedPrevVale; + conditions.isRejectedPrevPeak = xpvConditions.isRejectedPrevPeak; + conditions.isBreakedUpPrevPeak = xpvConditions.isBreakedUpPrevPeak; + conditions.isBreakedDownPrevVale = xpvConditions.isBreakedDownPrevVale; + conditions.isSarSwitchedToBullish = xpvConditions.isSarSwitchedToBullish; + conditions.isSarSwitchedToBearish = xpvConditions.isSarSwitchedToBearish; + + // + // XHK ... + + // + // Buffers ... + + // + Copy( + xhkConditions.xhkRawOpenBuffer, + conditions.xhkRawOpenBuffer // + ); + + // + Copy( + xhkConditions.xhkRawHighBuffer, + conditions.xhkRawHighBuffer // + ); + + // + Copy( + xhkConditions.xhkRawLowBuffer, + conditions.xhkRawLowBuffer // + ); + + // + Copy( + xhkConditions.xhkRawCloseBuffer, + conditions.xhkRawCloseBuffer // + ); + + // + Copy( + xhkConditions.xhkSMOpenBuffer, + conditions.xhkSMOpenBuffer // + ); + + // + Copy( + xhkConditions.xhkSMHighBuffer, + conditions.xhkSMHighBuffer // + ); + + // + Copy( + xhkConditions.xhkSMLowBuffer, + conditions.xhkSMLowBuffer // + ); + + // + Copy( + xhkConditions.xhkSMCloseBuffer, + conditions.xhkSMCloseBuffer // + ); + + // + // Conditions ... + conditions.isSMHKBullish = xhkConditions.isSMHKBullish; + conditions.isRawHKBullish = xhkConditions.isRawHKBullish; + conditions.isSMHKBearish = xhkConditions.isSMHKBearish; + conditions.isRawHKBearish = xhkConditions.isRawHKBearish; + conditions.isBreakedUpSMHK = xhkConditions.isBreakedUpSMHK; + conditions.isBreakedUpRawHK = xhkConditions.isBreakedUpRawHK; + conditions.isRejectedUpSMHK = xhkConditions.isRejectedUpSMHK; + conditions.isClosedOverSMHK = xhkConditions.isClosedOverSMHK; + conditions.isRejectedUpRawHK = xhkConditions.isRejectedUpRawHK; + conditions.isBreakedDownSMHK = xhkConditions.isBreakedDownSMHK; + conditions.isClosedUnderSMHK = xhkConditions.isClosedUnderSMHK; + conditions.isClosedOverRawHK = xhkConditions.isClosedOverRawHK; + conditions.isClosedUnderRawHK = xhkConditions.isClosedUnderRawHK; + conditions.isBreakedDownRawHK = xhkConditions.isBreakedDownRawHK; + conditions.isRejectedDownSMHK = xhkConditions.isRejectedDownSMHK; + conditions.isRejectedDownRawHK = xhkConditions.isRejectedDownRawHK; + conditions.isRawHKBreakedUpSMHK = xhkConditions.isRawHKBreakedUpSMHK; + conditions.isRawHKClosedOverSMHK = xhkConditions.isRawHKClosedOverSMHK; + conditions.isSMHKSwitchedToBearish = xhkConditions.isSMHKSwitchedToBearish; + conditions.isRawHKSwitchedToBearish = xhkConditions.isRawHKSwitchedToBearish; + conditions.isRawHKClosedUnderSMHK = xhkConditions.isRawHKClosedUnderSMHK; + conditions.isRawHKBreakedDownSMHK = xhkConditions.isRawHKBreakedDownSMHK; + conditions.isSMHKSwitchedToBullish = xhkConditions.isSMHKSwitchedToBullish; + conditions.isRawHKSwitchedToBullish = xhkConditions.isRawHKSwitchedToBullish; + + // + // XTREND ... + + // + // Buffers ... + + // + Copy( + xtrendConditions.upTrendBuffer, + conditions.upTrendBuffer // + ); + + // + Copy( + xtrendConditions.downTrendBuffer, + conditions.downTrendBuffer // + ); + + // + Copy( + xtrendConditions.maBuffer, + conditions.maBuffer // + ); + + // + Copy( + xtrendConditions.adxBuffer, + conditions.adxBuffer // + ); + + // + Copy( + xtrendConditions.adxPBuffer, + conditions.adxPBuffer // + ); + + // + Copy( + xtrendConditions.adxMBuffer, + conditions.adxMBuffer // + ); + + // + Copy( + xtrendConditions.upTBuffer, + conditions.upTBuffer // + ); + + // + Copy( + xtrendConditions.downTBuffer, + conditions.downTBuffer // + ); + + // + conditions.isTrendBullish = xtrendConditions.isTrendBullish; + conditions.isTrendBearish = xtrendConditions.isTrendBearish; + conditions.isTrendSwitchedToBullish = xtrendConditions.isTrendSwitchedToBullish; + conditions.isTrendSwitchedToBearish = xtrendConditions.isTrendSwitchedToBearish; + + // + // XATR ... + + // + // Buffers ... + + // + Copy( + xatrConditions.atrUpperBuffer, + conditions.atrUpperBuffer // + ); + + // + Copy( + xatrConditions.atrLowerBuffer, + conditions.atrLowerBuffer // + ); + + // + Copy( + xatrConditions.atrUpperRawBuffer, + conditions.atrUpperRawBuffer // + ); + + // + Copy( + xatrConditions.atrLowerRawBuffer, + conditions.atrLowerRawBuffer // + ); + + // + Copy( + xatrConditions.atrBuffer, + conditions.atrBuffer // + ); + + // + Copy( + xatrConditions.rsiBuffer, + conditions.rsiBuffer // + ); + + // + // Conditions ... + + // + conditions.isRsiOverSold = xatrConditions.isRsiOverSold; + conditions.isRsiOverBought = xatrConditions.isRsiOverBought; + conditions.isBreakedUpAtrUpper = xatrConditions.isBreakedUpAtrUpper; + conditions.isBreakedUpAtrLower = xatrConditions.isBreakedUpAtrLower; + conditions.isClosedOverAtrUpper = xatrConditions.isClosedOverAtrUpper; + conditions.isRejectedUpAtrUpper = xatrConditions.isRejectedUpAtrUpper; + conditions.isRejectedUpAtrLower = xatrConditions.isRejectedUpAtrLower; + conditions.isClosedOverAtrLower = xatrConditions.isClosedOverAtrLower; + conditions.isBreakedDownAtrUpper = xatrConditions.isBreakedDownAtrUpper; + conditions.isBreakedDownAtrLower = xatrConditions.isBreakedDownAtrLower; + conditions.isClosedUnderAtrUpper = xatrConditions.isClosedUnderAtrUpper; + conditions.isClosedUnderAtrLower = xatrConditions.isClosedUnderAtrLower; + conditions.isRejectedDownAtrUpper = xatrConditions.isRejectedDownAtrUpper; + conditions.isRejectedDownAtrLower = xatrConditions.isRejectedDownAtrLower; + conditions.isRsiCrossedOverOverSold = xatrConditions.isRsiCrossedOverOverSold; + conditions.isRsiCrossedUnderOverSold = xatrConditions.isRsiCrossedUnderOverSold; + conditions.isRsiCrossedOverOverBought = xatrConditions.isRsiCrossedOverOverBought; + conditions.isRsiCrossedUnderOverBought = xatrConditions.isRsiCrossedUnderOverBought; + + // + // XSTR ... + + // + // Buffers ... + + // + Copy( + xstrConditions.strBuffer, + conditions.strBuffer // + ); + + // + Copy( + xstrConditions.strPriceBuffer, + conditions.strPriceBuffer // + ); + + // + Copy( + xstrConditions.strUpBuffer, + conditions.strUpBuffer // + ); + + // + Copy( + xstrConditions.strDownBuffer, + conditions.strDownBuffer // + ); + + // + Copy( + xstrConditions.strStateBuffer, + conditions.strStateBuffer // + ); + + // + // Conditions ... + + // + conditions.isStrBullish = xstrConditions.isStrBullish; + conditions.isStrBearish = xstrConditions.isStrBearish; + conditions.isStrSwitchedToBullish = xstrConditions.isStrSwitchedToBullish; + conditions.isStrSwitchedToBearish = xstrConditions.isStrSwitchedToBearish; + + // + // XCHE ... + + // + // Buffers ... + + // + Copy( + xcheConditions.le1Buffer, + conditions.le1Buffer // + ); + + // + Copy( + xcheConditions.se1Buffer, + conditions.se1Buffer // + ); + + // + Copy( + xcheConditions.le2Buffer, + conditions.le2Buffer // + ); + + // + Copy( + xcheConditions.se2Buffer, + conditions.se2Buffer // + ); + + // + Copy( + xcheConditions.le1StartBuffer, + conditions.le1StartBuffer // + ); + + // + Copy( + xcheConditions.se1StartBuffer, + conditions.se1StartBuffer // + ); + + // + Copy( + xcheConditions.le2StartBuffer, + conditions.le2StartBuffer // + ); + + // + Copy( + xcheConditions.se2StartBuffer, + conditions.se2StartBuffer // + ); + + // + // Conditions ... + + conditions.isCheBullish = xcheConditions.isCheBullish; + conditions.isCheBearish = xcheConditions.isCheBearish; + conditions.isChe1Bullish = xcheConditions.isChe1Bullish; + conditions.isChe1Bearish = xcheConditions.isChe1Bearish; + conditions.isChe2Bullish = xcheConditions.isChe2Bullish; + conditions.isChe2Bearish = xcheConditions.isChe2Bearish; + conditions.isClosedOverCheMin = xcheConditions.isClosedOverCheMin; + conditions.isClosedOverCheMax = xcheConditions.isClosedOverCheMax; + conditions.isClosedUnderCheMin = xcheConditions.isClosedUnderCheMin; + conditions.isClosedUnderCheMax = xcheConditions.isClosedUnderCheMax; + conditions.isCheSwitchedToBullish = xcheConditions.isCheSwitchedToBullish; + conditions.isCheSwitchedToBearish = xcheConditions.isCheSwitchedToBearish; + conditions.isChe1SwitchedToBullish = xcheConditions.isChe1SwitchedToBullish; + conditions.isChe1SwitchedToBearish = xcheConditions.isChe1SwitchedToBearish; + conditions.isChe2SwitchedToBullish = xcheConditions.isChe2SwitchedToBullish; + conditions.isChe2SwitchedToBearish = xcheConditions.isChe2SwitchedToBearish; + + // + // XDON ... + + // + // Buffers ... + + // + Copy( + xdonConditions.donOpenUpperBuffer, + conditions.donOpenUpperBuffer // + ); + + // + Copy( + xdonConditions.donOpenLowerBuffer, + conditions.donOpenLowerBuffer // + ); + + // + Copy( + xdonConditions.donHighUpperBuffer, + conditions.donHighUpperBuffer // + ); + + // + Copy( + xdonConditions.donHighLowerBuffer, + conditions.donHighLowerBuffer // + ); + + // + Copy( + xdonConditions.donLowUpperBuffer, + conditions.donLowUpperBuffer // + ); + + // + Copy( + xdonConditions.donLowLowerBuffer, + conditions.donLowLowerBuffer // + ); + + // + Copy( + xdonConditions.donCloseUpperBuffer, + conditions.donCloseUpperBuffer // + ); + + // + Copy( + xdonConditions.donCloseLowerBuffer, + conditions.donCloseLowerBuffer // + ); + + // + // Conditions ... + + // + conditions.isBreakedDonLowUpper = xdonConditions.isBreakedDonLowUpper; + conditions.isBreakedDonLowLower = xdonConditions.isBreakedDonLowLower; + conditions.isRejectedDonLowUpper = xdonConditions.isRejectedDonLowUpper; + conditions.isRejectedDonLowLower = xdonConditions.isRejectedDonLowLower; + conditions.isBreakedDonOpenUpper = xdonConditions.isBreakedDonOpenUpper; + conditions.isBreakedDonHighUpper = xdonConditions.isBreakedDonHighUpper; + conditions.isBreakedDonOpenLower = xdonConditions.isBreakedDonOpenLower; + conditions.isBreakedDonHighLower = xdonConditions.isBreakedDonHighLower; + conditions.isRejectedDonOpenUpper = xdonConditions.isRejectedDonOpenUpper; + conditions.isRejectedDonHighUpper = xdonConditions.isRejectedDonHighUpper; + conditions.isRejectedDonOpenLower = xdonConditions.isRejectedDonOpenLower; + conditions.isRejectedDonHighLower = xdonConditions.isRejectedDonHighLower; + conditions.isBreakedDonCloseUpper = xdonConditions.isBreakedDonCloseUpper; + conditions.isBreakedDonCloseLower = xdonConditions.isBreakedDonCloseLower; + conditions.isRejectedDonCloseUpper = xdonConditions.isRejectedDonCloseUpper; + conditions.isRejectedDonCloseLower = xdonConditions.isRejectedDonCloseLower; + + // + // XVWAP ... + + // + // Buffers ... + + // + Copy( + xvwapConditions.vwapFastBuffer, + conditions.vwapFastBuffer // + ); + + // + Copy( + xvwapConditions.vwapMidBuffer, + conditions.vwapMidBuffer // + ); + + // + Copy( + xvwapConditions.vwapSlowBuffer, + conditions.vwapSlowBuffer // + ); + + // + Copy( + xvwapConditions.vwapVolumeBuffer, + conditions.vwapVolumeBuffer // + ); + + // + Copy( + xvwapConditions.vwapPriceBuffer, + conditions.vwapPriceBuffer // + ); + + // + Copy( + xvwapConditions.vwapFastStateBuffer, + conditions.vwapFastStateBuffer // + ); + + // + Copy( + xvwapConditions.vwapMidStateBuffer, + conditions.vwapMidStateBuffer // + ); + + // + Copy( + xvwapConditions.vwapSlowStateBuffer, + conditions.vwapSlowStateBuffer // + ); + + // + // Conditions ... + + // + conditions.isVWapMidBullish = xvwapConditions.isVWapMidBullish; + conditions.isVWapMidBearish = xvwapConditions.isVWapMidBearish; + conditions.isVWapFastBullish = xvwapConditions.isVWapFastBullish; + conditions.isVWapFastBearish = xvwapConditions.isVWapFastBearish; + conditions.isVWapMidNeutural = xvwapConditions.isVWapMidNeutural; + conditions.isVWapSlowBullish = xvwapConditions.isVWapSlowBullish; + conditions.isVWapSlowBearish = xvwapConditions.isVWapSlowBearish; + conditions.isVWapFastOverMid = xvwapConditions.isVWapFastOverMid; + conditions.isVWapMidOverSlow = xvwapConditions.isVWapMidOverSlow; + conditions.isVWapFastNeutural = xvwapConditions.isVWapFastNeutural; + conditions.isVWapSlowNeutural = xvwapConditions.isVWapSlowNeutural; + conditions.isVWapFastUnderMid = xvwapConditions.isVWapFastUnderMid; + conditions.isVWapMidUnderSlow = xvwapConditions.isVWapMidUnderSlow; + conditions.isVWapBullishState = xvwapConditions.isVWapBullishState; + conditions.isVWapBearishState = xvwapConditions.isVWapBearishState; + conditions.isVWapNeuturalState = xvwapConditions.isVWapNeuturalState; + conditions.isVWapBullishOrdered = xvwapConditions.isVWapBullishOrdered; + conditions.isVWapBearishOrdered = xvwapConditions.isVWapBearishOrdered; + conditions.isVWapSwitchedToBullishState = xvwapConditions.isVWapSwitchedToBullishState; + conditions.isVWapSwitchedToBearishState = xvwapConditions.isVWapSwitchedToBearishState; + conditions.isVWapSwitchedToNeuturalState = xvwapConditions.isVWapSwitchedToNeuturalState; + conditions.isVWapSwitchedToBullishOrdered = xvwapConditions.isVWapSwitchedToBullishOrdered; + conditions.isVWapSwitchedToBearishOrdered = xvwapConditions.isVWapSwitchedToBearishOrdered; + + // + // Slopes ... + + // + double rsiSlope = GetSlope(conditions.rsiBuffer, pIDX, cIDX); + double strSlope = GetSlope(conditions.strBuffer, pIDX, cIDX); + double atrUpperSlope = GetSlope(conditions.atrUpperBuffer, pIDX, cIDX); + double atrLowerSlope = GetSlope(conditions.atrLowerBuffer, pIDX, cIDX); + double vwapFastSlope = GetSlope(conditions.vwapFastBuffer, pIDX, cIDX); + double vwapMidSlope = GetSlope(conditions.vwapMidBuffer, pIDX, cIDX); + double vwapSlowSlope = GetSlope(conditions.vwapSlowBuffer, pIDX, cIDX); + + // + bool isRsiSlopeBullish = rsiSlope > 0; + bool isStrSlopeBullish = strSlope > 0; + bool isAtrUpperSlopeBullish = atrUpperSlope > 0; + bool isAtrLowerSlopeBullish = atrLowerSlope > 0; + bool isVwapFastSlopeBullish = vwapFastSlope > 0; + bool isVwapMidSlopeBullish = vwapMidSlope > 0; + bool isVwapSlowSlopeBullish = vwapSlowSlope > 0; + + // + bool isRsiSlopeBearish = rsiSlope < 0; + bool isStrSlopeBearish = strSlope < 0; + bool isAtrUpperSlopeBearish = atrUpperSlope < 0; + bool isAtrLowerSlopeBearish = atrLowerSlope < 0; + bool isVwapFastSlopeBearish = vwapFastSlope < 0; + bool isVwapMidSlopeBearish = vwapMidSlope < 0; + bool isVwapSlowSlopeBearish = vwapSlowSlope < 0; + + // + conditions.rsiSlope = rsiSlope; + conditions.strSlope = strSlope; + conditions.vwapMidSlope = vwapMidSlope; + conditions.vwapSlowSlope = vwapSlowSlope; + conditions.atrUpperSlope = atrUpperSlope; + conditions.atrLowerSlope = atrLowerSlope; + conditions.vwapFastSlope = vwapFastSlope; + conditions.isRsiSlopeBearish = isRsiSlopeBearish; + conditions.isStrSlopeBearish = isStrSlopeBearish; + conditions.isRsiSlopeBullish = isRsiSlopeBullish; + conditions.isStrSlopeBullish = isStrSlopeBullish; + conditions.isVwapMidSlopeBearish = isVwapMidSlopeBearish; + conditions.isVwapMidSlopeBullish = isVwapMidSlopeBullish; + conditions.isAtrUpperSlopeBearish = isAtrUpperSlopeBearish; + conditions.isAtrLowerSlopeBearish = isAtrLowerSlopeBearish; + conditions.isVwapFastSlopeBearish = isVwapFastSlopeBearish; + conditions.isVwapSlowSlopeBearish = isVwapSlowSlopeBearish; + conditions.isAtrUpperSlopeBullish = isAtrUpperSlopeBullish; + conditions.isAtrLowerSlopeBullish = isAtrLowerSlopeBullish; + conditions.isVwapFastSlopeBullish = isVwapFastSlopeBullish; + conditions.isVwapSlowSlopeBullish = isVwapSlowSlopeBullish; + + // + // Complex Conditions ... + + // + double vwapFast = conditions.vwapFastBuffer[cIDX]; + double vwapMid = conditions.vwapMidBuffer[cIDX]; + double vwapSlow = conditions.vwapSlowBuffer[cIDX]; + + // + double vwaps[3] = { + vwapFast, + vwapMid, + vwapSlow // + }; + + // + double vwapMin = GetMin(vwaps); + double vwapMax = GetMax(vwaps); + + // + bool isVWapMinBreakedUp = IsBarBreak( + vwapMin, + X_DIRECTION_BULLISH, + cBar // + ); + bool isVWapMinBreakedDown = IsBarBreak( + vwapMin, + X_DIRECTION_BEARISH, + cBar // + ); + + // + bool isVWapMaxBreakedUp = IsBarBreak( + vwapMax, + X_DIRECTION_BULLISH, + cBar // + ); + bool isVWapMaxBreakedDown = IsBarBreak( + vwapMax, + X_DIRECTION_BEARISH, + cBar // + ); + + // + bool isVWapFatsOverMid = conditions.vwapFastBuffer[cIDX] > conditions.vwapMidBuffer[cIDX]; + bool isVWapFatsOverMidPrev = conditions.vwapFastBuffer[pIDX] > conditions.vwapMidBuffer[pIDX]; + + // + bool isVWapFatsUnderMid = conditions.vwapFastBuffer[cIDX] < conditions.vwapMidBuffer[cIDX]; + bool isVWapFatsUnderMidPrev = conditions.vwapFastBuffer[pIDX] < conditions.vwapMidBuffer[pIDX]; + + // + bool isVWapFatsOverSlow = conditions.vwapFastBuffer[cIDX] > conditions.vwapSlowBuffer[cIDX]; + bool isVWapFatsOverSlowPrev = conditions.vwapFastBuffer[pIDX] > conditions.vwapSlowBuffer[pIDX]; + + // + bool isVWapFatsUnderSlow = conditions.vwapFastBuffer[cIDX] < conditions.vwapSlowBuffer[cIDX]; + bool isVWapFatsUnderSlowPrev = conditions.vwapFastBuffer[pIDX] < conditions.vwapSlowBuffer[pIDX]; + + // + bool isVWapFastCrossedOverMid = isVWapFatsOverMid && + !isVWapFatsOverMidPrev; + bool isVWapFastCrossedUnderMid = isVWapFatsUnderMid && + !isVWapFatsUnderMidPrev; + + // + bool isVWapFastCrossedOverSlow = isVWapFatsOverSlow && + !isVWapFatsOverSlowPrev; + bool isVWapFastCrossedUnderSlow = isVWapFatsUnderSlow && + !isVWapFatsUnderSlowPrev; + + // + bool isClosedOverVWapMin = cBar.close > vwapMin; + bool isClosedUnderVWapMin = cBar.close < vwapMin; + + // + bool isClosedOverVWapMax = cBar.close > vwapMax; + bool isClosedUnderVWapMax = cBar.close < vwapMax; + + // + bool isSarEqualsToPeak = + conditions.sarBuffer[cIDX] == conditions.peaksBuffer[cIDX]; + bool isSarEqualsToVale = + conditions.sarBuffer[cIDX] == conditions.valesBuffer[cIDX]; + + // + bool isSarIncreased = conditions.sarBuffer[cIDX] > conditions.sarBuffer[pIDX]; + bool isSarDecreased = conditions.sarBuffer[cIDX] < conditions.sarBuffer[pIDX]; + + // + double prevSar = conditions.sarBuffer[pIDX]; + double prevStr = conditions.strBuffer[pIDX]; + double prevCheLE1 = conditions.le1Buffer[pIDX]; + double prevCheLE2 = conditions.le2Buffer[pIDX]; + double prevCheSE1 = conditions.se1Buffer[pIDX]; + double prevCheSE2 = conditions.se2Buffer[pIDX]; + double prevAtrUpper = conditions.atrUpperBuffer[pIDX]; + double prevAtrLower = conditions.atrLowerBuffer[pIDX]; + + // + double ches[]; + if (prevCheLE1 != EMPTY_VALUE) + { + // + Add( + prevCheLE1, + ches // + ); + } + if (prevCheLE2 != EMPTY_VALUE) + { + // + Add( + prevCheLE2, + ches // + ); + } + if (prevCheSE1 != EMPTY_VALUE) + { + // + Add( + prevCheSE1, + ches // + ); + } + if (prevCheSE2 != EMPTY_VALUE) + { + // + Add( + prevCheSE2, + ches // + ); + } + + // + double cheMin = GetMin(ches); + double cheMax = GetMax(ches); + + // + bool isBreakedUpPrevSar = IsBarBreak( + prevSar, + X_DIRECTION_BULLISH, + cBar // + ); + bool isBreakedDownPrevSar = IsBarBreak( + prevSar, + X_DIRECTION_BEARISH, + cBar // + ); + + // + bool isBreakedUpPrevStr = IsBarBreak( + prevStr, + X_DIRECTION_BULLISH, + cBar // + ); + bool isBreakedDownPrevStr = IsBarBreak( + prevStr, + X_DIRECTION_BEARISH, + cBar // + ); + + // + bool isRejectedUpPrevAtrUpper = IsBarReject( + prevAtrUpper, + X_DIRECTION_BULLISH, + cBar // + ); + + // + bool isRejectedDownPrevAtrUpper = IsBarReject( + prevAtrUpper, + X_DIRECTION_BEARISH, + cBar // + ); + + // + bool isRejectedUpPrevAtrLower = IsBarReject( + prevAtrLower, + X_DIRECTION_BULLISH, + cBar // + ); + + // + bool isRejectedDownPrevAtrLower = IsBarReject( + prevAtrLower, + X_DIRECTION_BEARISH, + cBar // + ); + + // + bool isBreakedUpPrevAtrUpper = IsBarBreak( + prevAtrUpper, + X_DIRECTION_BULLISH, + cBar // + ); + bool isBreakedDownPrevAtrUpper = IsBarBreak( + prevAtrUpper, + X_DIRECTION_BEARISH, + cBar // + ); + + // + bool isBreakedUpPrevAtrLower = IsBarBreak( + prevAtrLower, + X_DIRECTION_BULLISH, + cBar // + ); + bool isBreakedDownPrevAtrLower = IsBarBreak( + prevAtrLower, + X_DIRECTION_BEARISH, + cBar // + ); + + // + bool isBreakedUpPrevCheLE1 = IsBarBreak( + prevCheLE1, + X_DIRECTION_BULLISH, + cBar // + ); + bool isBreakedUpPrevCheLE2 = IsBarBreak( + prevCheLE2, + X_DIRECTION_BULLISH, + cBar // + ); + bool isBreakedUpPrevCheSE1 = IsBarBreak( + prevCheSE1, + X_DIRECTION_BULLISH, + cBar // + ); + bool isBreakedUpPrevCheSE2 = IsBarBreak( + prevCheSE2, + X_DIRECTION_BULLISH, + cBar // + ); + + // + bool isBreakedDownPrevCheLE1 = IsBarBreak( + prevCheLE1, + X_DIRECTION_BEARISH, + cBar // + ); + bool isBreakedDownPrevCheLE2 = IsBarBreak( + prevCheLE2, + X_DIRECTION_BEARISH, + cBar // + ); + bool isBreakedDownPrevCheSE1 = IsBarBreak( + prevCheSE1, + X_DIRECTION_BEARISH, + cBar // + ); + bool isBreakedDownPrevCheSE2 = IsBarBreak( + prevCheSE2, + X_DIRECTION_BEARISH, + cBar // + ); + + // + bool isBreakedUpPrevCheMin = IsBarBreak( + cheMin, + X_DIRECTION_BULLISH, + cBar // + ); + bool isBreakedDownPrevCheMin = IsBarBreak( + cheMin, + X_DIRECTION_BEARISH, + cBar // + ); + + // + bool isBreakedUpPrevCheMax = IsBarBreak( + cheMax, + X_DIRECTION_BULLISH, + cBar // + ); + bool isBreakedDownPrevCheMax = IsBarBreak( + cheMax, + X_DIRECTION_BEARISH, + cBar // + ); + + // + bool isSarCrossedUnderPeak = + conditions.sarBuffer[cIDX] < conditions.peaksBuffer[cIDX] && + !(conditions.sarBuffer[pIDX] < conditions.peaksBuffer[pIDX]); + bool isSarCrossedOverVale = + conditions.sarBuffer[cIDX] > conditions.valesBuffer[cIDX] && + !(conditions.sarBuffer[pIDX] > conditions.valesBuffer[pIDX]); + + // + bool isStrEqualsToPeak = + conditions.strBuffer[cIDX] == conditions.peaksBuffer[cIDX]; + bool isStrEqualsToVale = + conditions.strBuffer[cIDX] == conditions.valesBuffer[cIDX]; + + // + bool isStrCrossedUnderPeak = + conditions.strBuffer[cIDX] < conditions.peaksBuffer[cIDX] && + !(conditions.strBuffer[pIDX] < conditions.peaksBuffer[pIDX]); + bool isStrCrossedOverVale = + conditions.strBuffer[cIDX] > conditions.valesBuffer[cIDX] && + !(conditions.strBuffer[pIDX] > conditions.valesBuffer[pIDX]); + + // + bool isPeakOverAtrUpper = + conditions.peaksBuffer[cIDX] > conditions.atrUpperBuffer[cIDX]; + bool isValeUnderAtrLower = + conditions.valesBuffer[cIDX] > conditions.atrLowerBuffer[cIDX]; + + // + bool isNewPeakOverAtrUpper = + isPeakOverAtrUpper && + conditions.isNewPeak; + bool isNewValeUnderAtrLower = + isValeUnderAtrLower && + conditions.isNewVale; + + // + bool isStrUpperOverPeak = + conditions.strBuffer[cIDX] > conditions.peaksBuffer[cIDX]; + bool isStrUpperOverPeakPrev = + conditions.strBuffer[pIDX] > conditions.peaksBuffer[pIDX]; + + // + bool isStrUpperUnderPeak = + conditions.strBuffer[cIDX] < conditions.peaksBuffer[cIDX]; + bool isStrUpperUnderPeakPrev = + conditions.strBuffer[pIDX] < conditions.peaksBuffer[pIDX]; + + // + bool isStrUpperCrossedOverPeak = isStrUpperOverPeak && + !isStrUpperOverPeakPrev; + bool isStrUpperCrossedUnderPeak = isStrUpperUnderPeak && + !isStrUpperUnderPeakPrev; + + // + bool isStrLowerOverVale = + conditions.strBuffer[cIDX] > conditions.valesBuffer[cIDX]; + bool isStrLowerOverValePrev = + conditions.strBuffer[pIDX] > conditions.valesBuffer[pIDX]; + + // + bool isStrLowerUnderVale = + conditions.strBuffer[cIDX] < conditions.valesBuffer[cIDX]; + bool isStrLowerUnderValePrev = + conditions.strBuffer[pIDX] < conditions.valesBuffer[pIDX]; + + // + bool isStrLowerCrossedOverVale = isStrLowerOverVale && + !isStrLowerOverValePrev; + bool isStrLowerCrossedUnderVale = isStrLowerUnderVale && + !isStrLowerUnderValePrev; + + // + bool isDonHighUpperEqualsToPeak = + conditions.donHighUpperBuffer[cIDX] == conditions.peaksBuffer[cIDX]; + bool isDonLowLowerEqualsToVale = + conditions.donLowLowerBuffer[cIDX] == conditions.valesBuffer[cIDX]; + + // + bool isStrUpperOverAtrUpper = + conditions.strUpBuffer[cIDX] > conditions.atrUpperBuffer[cIDX]; + bool isStrUpperOverAtrUpperPrev = + conditions.strUpBuffer[pIDX] > conditions.atrUpperBuffer[pIDX]; + bool isStrUpperCrossedOverAtrUpper = isStrUpperOverAtrUpper && + !isStrUpperOverAtrUpperPrev; + + // + bool isStrUpperUnderAtrUpper = + conditions.strUpBuffer[cIDX] < conditions.atrUpperBuffer[cIDX]; + bool isStrUpperUnderAtrUpperPrev = + conditions.strUpBuffer[pIDX] < conditions.atrUpperBuffer[pIDX]; + bool isStrUpperCrossedUnderAtrUpper = isStrUpperUnderAtrUpper && + !isStrUpperUnderAtrUpperPrev; + + // + bool isStrLowerOverAtrLower = + conditions.strDownBuffer[cIDX] > conditions.atrLowerBuffer[cIDX]; + bool isStrLowerOverAtrLowerPrev = + conditions.strDownBuffer[pIDX] > conditions.atrLowerBuffer[pIDX]; + bool isStrLowerCrossedOverAtrLower = isStrLowerOverAtrLower && + !isStrLowerOverAtrLowerPrev; + + // + bool isStrLowerUnderAtrLower = + conditions.strDownBuffer[cIDX] < conditions.atrLowerBuffer[cIDX]; + bool isStrLowerUnderAtrLowerPrev = + conditions.strDownBuffer[pIDX] < conditions.atrLowerBuffer[pIDX]; + bool isStrLowerCrossedUnderAtrLower = isStrLowerUnderAtrLower && + !isStrLowerUnderAtrLowerPrev; + + // + bool isStrUpperOverDonHighUpper = + conditions.strUpBuffer[cIDX] > conditions.donHighUpperBuffer[cIDX]; + bool isStrUpperOverDonHighUpperPrev = + conditions.strUpBuffer[pIDX] > conditions.donHighUpperBuffer[pIDX]; + bool isStrUpperCrossedOverDonHighUpper = isStrUpperOverDonHighUpper && + !isStrUpperOverDonHighUpperPrev; + + // + bool isStrUpperUnderDonHighUpper = + conditions.strUpBuffer[cIDX] < conditions.donHighUpperBuffer[cIDX]; + bool isStrUpperUnderDonHighUpperPrev = + conditions.strUpBuffer[pIDX] < conditions.donHighUpperBuffer[pIDX]; + bool isStrUpperCrossedUnderDonHighUpper = isStrUpperUnderDonHighUpper && + !isStrUpperUnderDonHighUpperPrev; + + // + bool isStrLowerOverDonLowLower = + conditions.strDownBuffer[cIDX] > conditions.donLowLowerBuffer[cIDX]; + bool isStrLowerOverDonLowLowerPrev = + conditions.strDownBuffer[pIDX] > conditions.donLowLowerBuffer[pIDX]; + bool isStrLowerCrossedOverDonLowLower = isStrLowerOverDonLowLower && + !isStrLowerOverDonLowLowerPrev; + + // + bool isStrLowerUnderDonLowLower = + conditions.strDownBuffer[cIDX] < conditions.donLowLowerBuffer[cIDX]; + bool isStrLowerUnderDonLowLowerPrev = + conditions.strDownBuffer[pIDX] < conditions.donLowLowerBuffer[pIDX]; + bool isStrLowerCrossedUnderDonLowLower = isStrLowerUnderDonLowLower && + !isStrLowerUnderDonLowLowerPrev; + + // + bool isAtrUpperOverPeak = conditions.atrUpperBuffer[cIDX] > conditions.peaksBuffer[cIDX]; + bool isAtrUpperEqualsToPeak = conditions.atrUpperBuffer[cIDX] == conditions.peaksBuffer[cIDX]; + + // + bool isAtrUpperCrossedUpPeak = conditions.atrUpperBuffer[cIDX] > conditions.peaksBuffer[cIDX] && + !(conditions.atrUpperBuffer[cIDX] > conditions.peaksBuffer[cIDX]); + bool isAtrUpperCrossedDownPeak = conditions.atrUpperBuffer[cIDX] < conditions.peaksBuffer[cIDX] && + !(conditions.atrUpperBuffer[cIDX] < conditions.peaksBuffer[cIDX]); + + // + bool isAtrLowerUnderVale = conditions.atrUpperBuffer[cIDX] < conditions.valesBuffer[cIDX]; + bool isAtrLowerEqualsToVale = conditions.atrUpperBuffer[cIDX] == conditions.valesBuffer[cIDX]; + + // + bool isAtrLowerCrossedUpVale = conditions.atrUpperBuffer[cIDX] > conditions.valesBuffer[cIDX] && + !(conditions.atrUpperBuffer[cIDX] > conditions.valesBuffer[cIDX]); + bool isAtrLowerCrossedDownVale = conditions.atrUpperBuffer[cIDX] < conditions.valesBuffer[cIDX] && + !(conditions.atrUpperBuffer[cIDX] < conditions.valesBuffer[cIDX]); + + // + conditions.cheMin = cheMin; + conditions.cheMax = cheMax; + conditions.vwapMin = vwapMin; + conditions.vwapMax = vwapMax; + + // + conditions.isSarIncreased = isSarIncreased; + conditions.isSarDecreased = isSarDecreased; + conditions.isSarEqualsToPeak = isSarEqualsToPeak; + conditions.isSarEqualsToVale = isSarEqualsToVale; + conditions.isStrEqualsToPeak = isStrEqualsToPeak; + conditions.isStrEqualsToVale = isStrEqualsToVale; + conditions.isStrUpperOverPeak = isStrUpperOverPeak; + conditions.isPeakOverAtrUpper = isPeakOverAtrUpper; + conditions.isStrLowerOverVale = isStrLowerOverVale; + conditions.isVWapMinBreakedUp = isVWapMinBreakedUp; + conditions.isVWapMaxBreakedUp = isVWapMaxBreakedUp; + conditions.isBreakedUpPrevSar = isBreakedUpPrevSar; + conditions.isBreakedUpPrevStr = isBreakedUpPrevStr; + conditions.isAtrUpperOverPeak = isAtrUpperOverPeak; + conditions.isAtrLowerUnderVale = isAtrLowerUnderVale; + conditions.isStrLowerUnderVale = isStrLowerUnderVale; + conditions.isStrUpperUnderPeak = isStrUpperUnderPeak; + conditions.isValeUnderAtrLower = isValeUnderAtrLower; + conditions.isClosedOverVWapMin = isClosedOverVWapMin; + conditions.isClosedOverVWapMax = isClosedOverVWapMax; + conditions.isClosedUnderVWapMin = isClosedUnderVWapMin; + conditions.isClosedUnderVWapMax = isClosedUnderVWapMax; + conditions.isVWapMinBreakedDown = isVWapMinBreakedDown; + conditions.isVWapMaxBreakedDown = isVWapMaxBreakedDown; + conditions.isSarCrossedOverVale = isSarCrossedOverVale; + conditions.isStrCrossedOverVale = isStrCrossedOverVale; + conditions.isBreakedDownPrevStr = isBreakedDownPrevStr; + conditions.isBreakedDownPrevSar = isBreakedDownPrevSar; + conditions.isSarCrossedUnderPeak = isSarCrossedUnderPeak; + conditions.isStrCrossedUnderPeak = isStrCrossedUnderPeak; + conditions.isNewPeakOverAtrUpper = isNewPeakOverAtrUpper; + conditions.isBreakedUpPrevCheLE1 = isBreakedUpPrevCheLE1; + conditions.isBreakedUpPrevCheLE2 = isBreakedUpPrevCheLE2; + conditions.isBreakedUpPrevCheSE1 = isBreakedUpPrevCheSE1; + conditions.isBreakedUpPrevCheSE2 = isBreakedUpPrevCheSE2; + conditions.isBreakedUpPrevCheMin = isBreakedUpPrevCheMin; + conditions.isBreakedUpPrevCheMax = isBreakedUpPrevCheMax; + conditions.isAtrUpperEqualsToPeak = isAtrUpperEqualsToPeak; + conditions.isAtrLowerEqualsToVale = isAtrLowerEqualsToVale; + conditions.isNewValeUnderAtrLower = isNewValeUnderAtrLower; + conditions.isStrUpperOverAtrUpper = isStrUpperOverAtrUpper; + conditions.isStrLowerOverAtrLower = isStrLowerOverAtrLower; + conditions.isBreakedDownPrevCheMin = isBreakedDownPrevCheMin; + conditions.isBreakedDownPrevCheMax = isBreakedDownPrevCheMax; + conditions.isBreakedDownPrevCheLE1 = isBreakedDownPrevCheLE1; + conditions.isBreakedDownPrevCheLE2 = isBreakedDownPrevCheLE2; + conditions.isBreakedDownPrevCheSE1 = isBreakedDownPrevCheSE1; + conditions.isBreakedDownPrevCheSE2 = isBreakedDownPrevCheSE2; + conditions.isStrUpperUnderAtrUpper = isStrUpperUnderAtrUpper; + conditions.isStrLowerUnderAtrLower = isStrLowerUnderAtrLower; + conditions.isBreakedUpPrevAtrUpper = isBreakedUpPrevAtrUpper; + conditions.isBreakedUpPrevAtrLower = isBreakedUpPrevAtrLower; + conditions.isAtrUpperCrossedUpPeak = isAtrUpperCrossedUpPeak; + conditions.isAtrLowerCrossedUpVale = isAtrLowerCrossedUpVale; + conditions.isVWapFastCrossedOverMid = isVWapFastCrossedOverMid; + conditions.isRejectedUpPrevAtrUpper = isRejectedUpPrevAtrUpper; + conditions.isRejectedUpPrevAtrLower = isRejectedUpPrevAtrLower; + conditions.isAtrUpperCrossedDownPeak = isAtrUpperCrossedDownPeak; + conditions.isAtrLowerCrossedDownVale = isAtrLowerCrossedDownVale; + conditions.isBreakedDownPrevAtrUpper = isBreakedDownPrevAtrUpper; + conditions.isBreakedDownPrevAtrLower = isBreakedDownPrevAtrLower; + conditions.isVWapFastCrossedUnderMid = isVWapFastCrossedUnderMid; + conditions.isDonLowLowerEqualsToVale = isDonLowLowerEqualsToVale; + conditions.isStrUpperCrossedOverPeak = isStrUpperCrossedOverPeak; + conditions.isStrLowerCrossedOverVale = isStrLowerCrossedOverVale; + conditions.isStrLowerOverDonLowLower = isStrLowerOverDonLowLower; + conditions.isVWapFastCrossedOverSlow = isVWapFastCrossedOverSlow; + conditions.isRejectedDownPrevAtrUpper = isRejectedDownPrevAtrUpper; + conditions.isRejectedDownPrevAtrLower = isRejectedDownPrevAtrLower; + conditions.isVWapFastCrossedUnderSlow = isVWapFastCrossedUnderSlow; + conditions.isStrUpperOverDonHighUpper = isStrUpperOverDonHighUpper; + conditions.isStrLowerUnderDonLowLower = isStrLowerUnderDonLowLower; + conditions.isDonHighUpperEqualsToPeak = isDonHighUpperEqualsToPeak; + conditions.isStrUpperCrossedUnderPeak = isStrUpperCrossedUnderPeak; + conditions.isStrLowerCrossedUnderVale = isStrLowerCrossedUnderVale; + conditions.isStrUpperUnderDonHighUpper = isStrUpperUnderDonHighUpper; + conditions.isStrLowerCrossedOverAtrLower = isStrLowerCrossedOverAtrLower; + conditions.isStrUpperCrossedOverAtrUpper = isStrUpperCrossedOverAtrUpper; + conditions.isStrUpperCrossedUnderAtrUpper = isStrUpperCrossedUnderAtrUpper; + conditions.isStrLowerCrossedUnderAtrLower = isStrLowerCrossedUnderAtrLower; + conditions.isStrLowerCrossedOverDonLowLower = isStrLowerCrossedOverDonLowLower; + conditions.isStrUpperCrossedOverDonHighUpper = isStrUpperCrossedOverDonHighUpper; + conditions.isStrLowerCrossedUnderDonLowLower = isStrLowerCrossedUnderDonLowLower; + conditions.isStrUpperCrossedUnderDonHighUpper = isStrUpperCrossedUnderDonHighUpper; + + // + xpvConditions.Clean(); + xhkConditions.Clean(); + xatrConditions.Clean(); + xstrConditions.Clean(); + xcheConditions.Clean(); + xdonConditions.Clean(); + xvwapConditions.Clean(); + xtrendConditions.Clean(); + + // + Free(); + + // + return result; + } + + // + protected: + // + + // + private: + // + + // + string mSymbol; // Trading Symbol + ENUM_TIMEFRAMES mPeriod; // Trading Period + + // + // Inputs ... + X121Inputs mInputs; + X121XPVInputs xpvInputs; + X121XHKInputs xhkInputs; + X121XATRInputs xatrInputs; + X121XDONInputs xdonInputs; + X121XSTRInputs xstrInputs; + X121XCHEInputs xcheInputs; + X121XVWAPInputs xvwapInputs; + X121XTRENDInputs xtrendInputs; + + // + int mRSIHandler; +}; + +// \ No newline at end of file diff --git a/BKPS/14031206/Helpers/x-saherelm.x121.xatr.helper.ex5 b/BKPS/14031206/Helpers/x-saherelm.x121.xatr.helper.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..36124eb32a1aa985c78dab3d3b8a02bd3e283895 GIT binary patch literal 6350 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 0 && + rsiLength > 0 && + atrMultiplier > 0 && + rsiOverSoldLevel > 0 && + rsiOverBoughtLevel > 0 && + startCalculationForLastBars > 0 && + rsiOverSoldLevel < rsiOverBoughtLevel + // + ; + + // + return result; + } + + // + // Retrieve MAx Length ... + int Max() + { + // + int result = 0; + + // + result = MathMax(atrLength, rsiLength); + + // + return result; + } +}; + +// +// Conditions ... +struct X121XATRConditions +{ + // + // Common ... + string symbol; + ENUM_TIMEFRAMES period; + datetime time; + + // + // Buffers ... + double atrUpperBuffer[]; + double atrLowerBuffer[]; + double atrUpperRawBuffer[]; + double atrLowerRawBuffer[]; + double rsiBuffer[]; + double atrBuffer[]; + + // + // Conditions ... + + // + // RSI ... + + // + bool isRsiOverBought; + bool isRsiCrossedOverOverBought; + bool isRsiCrossedUnderOverBought; + + // + bool isRsiOverSold; + bool isRsiCrossedUnderOverSold; + bool isRsiCrossedOverOverSold; + + // + // ATR ... + + // + bool isClosedOverAtrUpper; + bool isClosedOverAtrLower; + + // + bool isClosedUnderAtrUpper; + bool isClosedUnderAtrLower; + + // + bool isRejectedUpAtrUpper; + bool isRejectedDownAtrUpper; + + // + bool isRejectedUpAtrLower; + bool isRejectedDownAtrLower; + + // + bool isBreakedUpAtrUpper; + bool isBreakedDownAtrUpper; + + // + bool isBreakedUpAtrLower; + bool isBreakedDownAtrLower; + + // + // bool isCloseLower + + // + // Constructor ... + X121XATRConditions() + { + Clean(); + } + + // + // Tools ... + + /** + * Cleaning Up ... + */ + void Clean() + { + // + // Commons ... + symbol = NULL; + period = NULL; + time = NULL; + + // + // Buffers ... + + // + Clean(rsiBuffer); + Clean(atrBuffer); + Clean(atrUpperBuffer); + Clean(atrLowerBuffer); + Clean(atrUpperRawBuffer); + Clean(atrLowerRawBuffer); + + // + ArraySetAsSeries(rsiBuffer, true); + ArraySetAsSeries(atrBuffer, true); + ArraySetAsSeries(atrUpperBuffer, true); + ArraySetAsSeries(atrLowerBuffer, true); + ArraySetAsSeries(atrUpperRawBuffer, true); + ArraySetAsSeries(atrLowerRawBuffer, true); + + // + // Conditions ... + + // + // RSI ... + + // + isRsiOverBought = false; + isRsiCrossedOverOverBought = false; + isRsiCrossedUnderOverBought = false; + + // + isRsiOverSold = false; + isRsiCrossedUnderOverSold = false; + isRsiCrossedOverOverSold = false; + + // + // ATR ... + + // + isClosedOverAtrUpper = false; + isClosedOverAtrLower = false; + + // + isClosedUnderAtrUpper = false; + isClosedUnderAtrLower = false; + + // + isRejectedUpAtrUpper = false; + isRejectedDownAtrUpper = false; + + // + isRejectedUpAtrLower = false; + isRejectedDownAtrLower = false; + + // + isBreakedUpAtrUpper = false; + isBreakedDownAtrUpper = false; + + // + isBreakedUpAtrLower = false; + isBreakedDownAtrLower = false; + + // + ZeroMemory(this); + } + + /** + * Generate Conditions Scores ... + * + * @param bullishScore: Double, Directional Scores Reference ... + * @param bearishScore: Double, Directional Scores Reference ... + */ + void GenerateScore( + double &bullishScore, + double &bearishScore // + ) + { + // + bullishScore = 0; + bearishScore = 0; + + // + // TODO: Implement if Required ... + } + + /** + * Generate Summary String for Represent Conditions State ... + * + * @param onlyCommons: Boolean, Just Generate Only Commons Conditions ... + * @param onlyConditions: Boolean, Just Generate Only Conditions ... + * @param includeScores: Boolean, Attach Scores Representations on Result ... + * @param ignoreFalseConditions: Boolean, Ignore False Conditions on Result ... + * @param separator: String, Separate Lines ... + * + * @return ( string ) + */ + string GenerateSummary( + bool onlyCommons = false, + bool onlyConditions = false, + bool includeScores = true, + bool ignoreFalseConditions = true, + string separator = "\n" // + ) + { + // + string result = NULL; + + // + double bullishScore = 0; + double bearishScore = 0; + GenerateScore( + bullishScore, + bearishScore // + ); + + // + string scoresStr = + // + "Scores: " + separator + + "---------------" + separator + + "Bullish: " + ToString(bullishScore) + separator + + "Bearish: " + ToString(bearishScore) + separator + + "" + // + ; + + // + string commonStr = GenerateSpecifiedCommonSummary( + this, + separator, + includeScores // + ); + + // + string conditionsStr = + // + // RSI ... + ToString("isRsiOverBought", isRsiOverBought, ignoreFalseConditions, separator) + + ToString("isRsiCrossedOverOverBought", isRsiCrossedOverOverBought, ignoreFalseConditions, separator) + + ToString("isRsiCrossedUnderOverBought", isRsiCrossedUnderOverBought, ignoreFalseConditions, separator) + + ToString("isRsiOverSold", isRsiOverSold, ignoreFalseConditions, separator) + + ToString("isRsiCrossedUnderOverSold", isRsiCrossedUnderOverSold, ignoreFalseConditions, separator) + + ToString("isRsiCrossedOverOverSold", isRsiCrossedOverOverSold, ignoreFalseConditions, separator) + + // + // ATR ... + ToString("isClosedOverAtrUpper", isClosedOverAtrUpper, ignoreFalseConditions, separator) + + ToString("isClosedOverAtrLower", isClosedOverAtrLower, ignoreFalseConditions, separator) + + ToString("isClosedUnderAtrUpper", isClosedUnderAtrUpper, ignoreFalseConditions, separator) + + ToString("isClosedUnderAtrLower", isClosedUnderAtrLower, ignoreFalseConditions, separator) + + ToString("isRejectedUpAtrUpper", isRejectedUpAtrUpper, ignoreFalseConditions, separator) + + ToString("isRejectedDownAtrUpper", isRejectedDownAtrUpper, ignoreFalseConditions, separator) + + ToString("isRejectedUpAtrLower", isRejectedUpAtrLower, ignoreFalseConditions, separator) + + ToString("isRejectedDownAtrLower", isRejectedDownAtrLower, ignoreFalseConditions, separator) + + ToString("isBreakedUpAtrUpper", isBreakedUpAtrUpper, ignoreFalseConditions, separator) + + ToString("isBreakedDownAtrUpper", isBreakedDownAtrUpper, ignoreFalseConditions, separator) + + ToString("isBreakedUpAtrLower", isBreakedUpAtrLower, ignoreFalseConditions, separator) + + ToString("isBreakedDownAtrLower", isBreakedDownAtrLower, ignoreFalseConditions, separator) + + // + "" + // + ; + + // + result = + // + "[" + GetTag() + "]" + separator + + (onlyConditions + ? "" + : commonStr) + + (!includeScores + ? "" + : scoresStr) + + " " + separator + + (onlyCommons + ? "" + : conditionsStr) + + "" + // + ; + + // + return result; + } + + /** + * Retrieve nique Tag Identifier ... + * + * @return ( string ) + */ + string GetTag() + { + return GetTypeName(this); + } + + // +}; + +// +// Class ... +class XCX121XATRHelper : public XCBaseHelper +{ + // + // Public ... + public: + // + // Props ... + + // + // Constructors ... + XCX121XATRHelper() + : XCBaseHelper(_Symbol, _Period) + { + } + + // + // Deconstructor ... + ~XCX121XATRHelper() + { + // + Clean(rsiBuffer); + Clean(atrUpperBuffer); + Clean(atrLowerBuffer); + Clean(atrBuffer); + Clean(atrUpperRawBuffer); + Clean(atrLowerRawBuffer); + + // + mInputs.Clean(); + } + + // + // Tools ... + bool Init( + string symbol, // Trading Symbol + ENUM_TIMEFRAMES period, // Trading Period + X121XATRInputs &inputs // Inputs + ) + { + // + bool result = false; + + // + mSymbol = symbol; + mPeriod = period; + + // + result = inputs.IsValid(); + if (!result) + { + return result; + } + + // + ArraySetAsSeries(rsiBuffer, true); + ArraySetAsSeries(atrUpperBuffer, true); + ArraySetAsSeries(atrLowerBuffer, true); + ArraySetAsSeries(atrBuffer, true); + ArraySetAsSeries(atrUpperRawBuffer, true); + ArraySetAsSeries(atrLowerRawBuffer, true); + + // + mInputs = inputs; + + // + mHandler = iCustom( + mSymbol, + mPeriod, + "x-saherelm.x121.xatr", + // + // Inputs ... + // + // Market ... + "", + // + // RSI Detection ... + "", + mInputs.rsiLength, + mInputs.rsiAppliedTo, + // + // ATR Detection ... + "", + mInputs.atrLength, + mInputs.atrMultiplier, + mInputs.atrUpperAppliedTo, + mInputs.atrLowerAppliedTo, + mInputs.atrSmoothingMode, + // + // Presentation ... + "", + mInputs.startCalculationForLastBars, + mInputs.showATRUpper, + mInputs.showATRLower + // + ); + result = mHandler != INVALID_HANDLE; + if (!result) + { + return result; + } + + // + return result; + } + + // + // Inputs ... + + // + X121XATRInputs GetInputs() + { + return mInputs; + } + + // + bool SetInputs( + X121XATRInputs &inputs // Configs + ) + { + // + return Init( + mSymbol, + mPeriod, + inputs + // + ); + } + + // + // Readers ... + + // + // RSI ... + + // + double GetRSI( + int barIndex // Bar Index + ) + { + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + Calculate(); + + // + int count = ArraySize(rsiBuffer); + if (barIndex >= count) + { + barIndex = count - 1; + } + + // + return rsiBuffer[barIndex]; + } + + // + int CopyRSI( + int start, // Start + int count, // Number of Items for read + double &buffer[], // Dest Buffer + bool forceClean = true // Force To Clean buffer + ) + { + // + // Update Calculations ... + Calculate(); + + // + // Copy Items ... + return Copy( + start, + count, + rsiBuffer, + buffer, + forceClean + // + ); + } + + // + // ATR ... + + // + double GetATR( + int barIndex // Bar Index + ) + { + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + Calculate(); + + // + int count = ArraySize(atrBuffer); + if (barIndex >= count) + { + barIndex = count - 1; + } + + // + return atrBuffer[barIndex]; + } + + // + int CopyATR( + int start, // Start + int count, // Number of Items for read + double &buffer[], // Dest Buffer + bool forceClean = true // Force To Clean buffer + ) + { + // + // Update Calculations ... + Calculate(); + + // + // Copy Items ... + return Copy( + start, + count, + atrBuffer, + buffer, + forceClean + // + ); + } + + // + double GetATRUpper( + int barIndex // Bar Index + ) + { + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + Calculate(); + + // + int count = ArraySize(atrUpperBuffer); + if (barIndex >= count) + { + barIndex = count - 1; + } + + // + return atrUpperBuffer[barIndex]; + } + + // + int CopyATRUpper( + int start, // Start + int count, // Number of Items for read + double &buffer[], // Dest Buffer + bool forceClean = true // Force To Clean buffer + ) + { + // + // Update Calculations ... + Calculate(); + + // + // Copy Items ... + return Copy( + start, + count, + atrUpperBuffer, + buffer, + forceClean + // + ); + } + + // + double GetATRUpperRaw( + int barIndex // Bar Index + ) + { + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + Calculate(); + + // + int count = ArraySize(atrUpperRawBuffer); + if (barIndex >= count) + { + barIndex = count - 1; + } + + // + return atrUpperRawBuffer[barIndex]; + } + + // + int CopyATRUpperRaw( + int start, // Start + int count, // Number of Items for read + double &buffer[], // Dest Buffer + bool forceClean = true // Force To Clean buffer + ) + { + // + // Update Calculations ... + Calculate(); + + // + // Copy Items ... + return Copy( + start, + count, + atrUpperRawBuffer, + buffer, + forceClean + // + ); + } + + // + double GetATRLower( + int barIndex // Bar Index + ) + { + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + Calculate(); + + // + int count = ArraySize(atrLowerBuffer); + if (barIndex >= count) + { + barIndex = count - 1; + } + + // + return atrLowerBuffer[barIndex]; + } + + // + int CopyATRLower( + int start, // Start + int count, // Number of Items for read + double &buffer[], // Dest Buffer + bool forceClean = true // Force To Clean buffer + ) + { + // + // Update Calculations ... + Calculate(); + + // + // Copy Items ... + return Copy( + start, + count, + atrLowerBuffer, + buffer, + forceClean + // + ); + } + + // + double GetATRLowerRaw( + int barIndex // Bar Index + ) + { + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + Calculate(); + + // + int count = ArraySize(atrLowerRawBuffer); + if (barIndex >= count) + { + barIndex = count - 1; + } + + // + return atrLowerRawBuffer[barIndex]; + } + + // + int CopyATRLowerRaw( + int start, // Start + int count, // Number of Items for read + double &buffer[], // Dest Buffer + bool forceClean = true // Force To Clean buffer + ) + { + // + // Update Calculations ... + Calculate(); + + // + // Copy Items ... + return Copy( + start, + count, + atrLowerRawBuffer, + buffer, + forceClean + // + ); + } + + // + void Free() override + { + Cleanup(10); + } + + // + bool GetConditions( + X121XATRConditions &conditions, // + int barIndex = 0, // + int loopback = 5 // + ) + { + // + bool result = true; + + // + if (loopback < 5) + { + loopback = 5; + } + + // + conditions.Clean(); + + // + conditions.symbol = mSymbol; + conditions.period = mPeriod; + conditions.time = TimeCurrent(); + + // + int zIndex = barIndex; + int cIndex = zIndex + 1; + int pIndex = cIndex + 1; + int ppIndex = pIndex + 1; + + // + XOHCL zBar; + result = zBar.Init( + mSymbol, + mPeriod, + zIndex // + ); + if (!result) + { + return result; + } + + // + XOHCL cBar; + result = cBar.Init( + mSymbol, + mPeriod, + cIndex // + ); + if (!result) + { + return result; + } + + // + XOHCL pBar; + result = pBar.Init( + mSymbol, + mPeriod, + pIndex // + ); + if (!result) + { + return result; + } + + // + // Buffers ... + + // + CopyRSI( + zIndex, + loopback, + conditions.rsiBuffer // + ); + + // + CopyATR( + zIndex, + loopback, + conditions.atrBuffer // + ); + + // + CopyATRUpper( + zIndex, + loopback, + conditions.atrUpperBuffer // + ); + + // + CopyATRUpperRaw( + zIndex, + loopback, + conditions.atrUpperRawBuffer // + ); + + // + CopyATRLower( + zIndex, + loopback, + conditions.atrLowerBuffer // + ); + + // + CopyATRLowerRaw( + zIndex, + loopback, + conditions.atrLowerRawBuffer // + ); + + // + // Conditions ... + + // + int cIDX = 1; + int pIDX = cIDX + 1; + + // + // RSI ... + + // + bool isRsiOverBought = conditions.rsiBuffer[cIDX] > mInputs.rsiOverBoughtLevel; + bool isRsiOverBoughtPrev = conditions.rsiBuffer[pIDX] > mInputs.rsiOverBoughtLevel; + + // + bool isRsiCrossedOverOverBought = isRsiOverBought && + !isRsiOverBoughtPrev; + bool isRsiCrossedUnderOverBought = !isRsiOverBought && + isRsiOverBoughtPrev; + + // + bool isRsiOverSold = conditions.rsiBuffer[cIDX] < mInputs.rsiOverSoldLevel; + bool isRsiOverSoldPrev = conditions.rsiBuffer[pIDX] < mInputs.rsiOverSoldLevel; + + // + bool isRsiCrossedUnderOverSold = isRsiOverSold && + !isRsiOverSoldPrev; + bool isRsiCrossedOverOverSold = !isRsiOverSold && + isRsiOverSoldPrev; + + // + // ATR ... + + // + bool isClosedOverAtrUpper = cBar.close > conditions.atrUpperBuffer[cIDX]; + bool isClosedOverAtrLower = cBar.close > conditions.atrLowerBuffer[cIDX]; + + // + bool isClosedUnderAtrUpper = cBar.close < conditions.atrUpperBuffer[cIDX]; + bool isClosedUnderAtrLower = cBar.close < conditions.atrLowerBuffer[cIDX]; + + // + bool isRejectedUpAtrUpper = IsBarReject( + atrUpperBuffer[cIDX], + X_DIRECTION_BULLISH, + cBar // + ); + bool isRejectedDownAtrUpper = IsBarReject( + atrUpperBuffer[cIDX], + X_DIRECTION_BEARISH, + cBar // + ); + + // + bool isRejectedUpAtrLower = IsBarReject( + atrLowerBuffer[cIDX], + X_DIRECTION_BULLISH, + cBar // + ); + ; + bool isRejectedDownAtrLower = IsBarReject( + atrLowerBuffer[cIDX], + X_DIRECTION_BEARISH, + cBar // + ); + ; + + // + bool isBreakedUpAtrUpper = IsBarBreak( + atrUpperBuffer[cIDX], + X_DIRECTION_BULLISH, + cBar // + ); + bool isBreakedDownAtrUpper = IsBarBreak( + atrUpperBuffer[cIDX], + X_DIRECTION_BEARISH, + cBar // + ); + + // + bool isBreakedUpAtrLower = IsBarBreak( + atrLowerBuffer[cIDX], + X_DIRECTION_BULLISH, + cBar // + ); + bool isBreakedDownAtrLower = IsBarBreak( + atrLowerBuffer[cIDX], + X_DIRECTION_BEARISH, + cBar // + ); + + // + conditions.isRsiOverSold = isRsiOverSold; + conditions.isRsiOverBought = isRsiOverBought; + conditions.isRejectedUpAtrUpper = isRejectedUpAtrUpper; + conditions.isRejectedUpAtrLower = isRejectedUpAtrLower; + conditions.isBreakedUpAtrUpper = isBreakedUpAtrUpper; + conditions.isBreakedUpAtrLower = isBreakedUpAtrLower; + conditions.isRejectedDownAtrUpper = isRejectedDownAtrUpper; + conditions.isRejectedDownAtrLower = isRejectedDownAtrLower; + conditions.isClosedOverAtrUpper = isClosedOverAtrUpper; + conditions.isClosedOverAtrLower = isClosedOverAtrLower; + conditions.isBreakedDownAtrUpper = isBreakedDownAtrUpper; + conditions.isBreakedDownAtrLower = isBreakedDownAtrLower; + conditions.isClosedUnderAtrUpper = isClosedUnderAtrUpper; + conditions.isClosedUnderAtrLower = isClosedUnderAtrLower; + conditions.isRsiCrossedOverOverSold = isRsiCrossedOverOverSold; + conditions.isRsiCrossedUnderOverSold = isRsiCrossedUnderOverSold; + conditions.isRsiCrossedOverOverBought = isRsiCrossedOverOverBought; + conditions.isRsiCrossedUnderOverBought = isRsiCrossedUnderOverBought; + + // + Cleanup(); + + // + zBar.Clean(); + cBar.Clean(); + pBar.Clean(); + + // + return result; + } + + // + // Protected ... + protected: + // + // Private ... + private: + // + // Props ... + X121XATRInputs mInputs; // Inputs ... + + // + // Buffers ... + double rsiBuffer[]; + double atrUpperBuffer[]; + double atrLowerBuffer[]; + double atrBuffer[]; + double atrUpperRawBuffer[]; + double atrLowerRawBuffer[]; + + // + void Calculate( + int maxRequiredBars = 100 // + ) + { + // + // Buffers ... + + // + // RSI ... + CopyBuffer( + mHandler, + X121_RSI_LINE, + 0, + maxRequiredBars, + rsiBuffer + // + ); + + // + // ATR ... + + // + CopyBuffer( + mHandler, + X121_ATR_UPPER_LINE, + 0, + maxRequiredBars, + atrUpperBuffer + // + ); + + // + CopyBuffer( + mHandler, + X121_ATR_LOWER_LINE, + 0, + maxRequiredBars, + atrLowerBuffer + // + ); + + // + CopyBuffer( + mHandler, + X121_ATR_LINE, + 0, + maxRequiredBars, + atrBuffer + // + ); + + // + CopyBuffer( + mHandler, + X121_ATR_UPPER_RAW_LINE, + 0, + maxRequiredBars, + atrUpperRawBuffer + // + ); + + // + CopyBuffer( + mHandler, + X121_ATR_LOWER_RAW_LINE, + 0, + maxRequiredBars, + atrLowerRawBuffer + // + ); + } + + // + void Cleanup( + int maxAllowed = 100 // + ) + { + // + CleanupArray( + rsiBuffer, + maxAllowed // + ); + + // + CleanupArray( + atrUpperBuffer, + maxAllowed // + ); + + // + CleanupArray( + atrLowerBuffer, + maxAllowed // + ); + + // + CleanupArray( + atrBuffer, + maxAllowed // + ); + + // + CleanupArray( + atrUpperRawBuffer, + maxAllowed // + ); + + // + CleanupArray( + atrLowerRawBuffer, + maxAllowed // + ); + + // + } + + // +}; + +// +// Tools ... \ No newline at end of file diff --git a/BKPS/14031206/Helpers/x-saherelm.x121.xcc.helper.ex5 b/BKPS/14031206/Helpers/x-saherelm.x121.xcc.helper.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..a25eb384b178815dbcf6d8480ae6678b8b6d025e GIT binary patch literal 6226 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 a=`ofwGAE2skHTJDiMu~1*|gNu3jRN&;?{Kl literal 0 HcmV?d00001 diff --git a/BKPS/14031206/Helpers/x-saherelm.x121.xcc.helper.mq5 b/BKPS/14031206/Helpers/x-saherelm.x121.xcc.helper.mq5 new file mode 100644 index 0000000..bcef12e --- /dev/null +++ b/BKPS/14031206/Helpers/x-saherelm.x121.xcc.helper.mq5 @@ -0,0 +1,252 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 Helper Class Library +// ---------------------------------------------- +// Name: XSCX121XCCHelper +// Description: provides all Indicator +// Helper requirements ... +// +// +// Maintainer: +// ------------ +// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) +// +////////////////////////////////////////////////////// +// +// Global Properties ... +#property library +#property copyright "Copyright 2023, SaherElm IT Center" +#property link "https://www.saherelm.ir" +#property version "1.00" +#property strict + +// +// Imports ... +#include "../Classes/x-saherelm.x-helper.class.mq5" + +// +// Definitions ... + +// +// Input Models ... +struct X121XCCInputs +{ + // + // Props ... + + // + // Chart Style ... + ENUM_CHART_MODE mode; // Mode + color upColor; // Up Color + color downColor; // Down Color + color lineColor; // Line mode and Doji candlestick Color + color bearishColor; // Bullish Color + color bullishColor; // Bearish Color + color volumesColor; // Volumes Color + + // + // Presentation ... + bool showCandles; // Show Candles + + // + // Constructor(s) ... + X121XCCInputs() + { + // + Clean(); + } + + // + // Tools ... + + // + // Clean ... + void Clean() + { + // + mode = CHART_CANDLES; + + // + upColor = CLR_NONE; + downColor = CLR_NONE; + lineColor = CLR_NONE; + bearishColor = CLR_NONE; + bullishColor = CLR_NONE; + volumesColor = CLR_NONE; + + // + showCandles = false; + + // + ZeroMemory(this); + } + + // + // Default ... + void Default() + { + // + mode = CHART_CANDLES; + + // + upColor = clrLime; + downColor = clrRed; + lineColor = clrLime; + bearishColor = clrRed; + bullishColor = clrLime; + volumesColor = clrGreen; + // + showCandles = true; + } + + // + // Validate ... + bool IsValid() + { + // + bool result = false; + + // + result = + // + true + // + ; + + // + return result; + } + + // + // Retrieve MAx Length ... + int Max() + { + // + int result = 0; + + // + result = MathMax(0, 0); + + // + return result; + } +}; + +// +// Class ... +class XCX121XCCHelper : public XCBaseHelper +{ + // + // Public ... + public: + // + // Props ... + + // + // Constructors ... + XCX121XCCHelper() + : XCBaseHelper(_Symbol, _Period) + { + } + + // + // Deconstructor ... + ~XCX121XCCHelper() + { + mInputs.Clean(); + } + + // + // Tools ... + bool Init( + string symbol, // Trading Symbol + ENUM_TIMEFRAMES period, // Trading Period + X121XCCInputs &inputs // Inputs + ) + { + // + bool result = false; + + // + mSymbol = symbol; + mPeriod = period; + + // + result = inputs.IsValid(); + if (!result) + { + return result; + } + + // + mInputs = inputs; + + // + mHandler = iCustom( + mSymbol, + mPeriod, + "x-saherelm.x121.xcc", + // + // Inputs ... + // + // Chart Style ... + "", + mInputs.mode, // Mode + mInputs.upColor, // Up Color + mInputs.downColor, // Down Color + mInputs.lineColor, // Line mode and Doji candlestick Color + mInputs.bearishColor, // Bullish Color + mInputs.bullishColor, // Bearish Color + mInputs.volumesColor, // Volumes Color + // + // Presentation ... + "", + mInputs.showCandles // Show Candles + // + ); + result = mHandler != INVALID_HANDLE; + if (!result) + { + return result; + } + + // + return result; + } + + // + // Inputs ... + + // + X121XCCInputs GetInputs() + { + return mInputs; + } + + // + bool SetInputs( + X121XCCInputs &inputs // Configs + ) + { + // + return Init( + mSymbol, + mPeriod, + inputs + // + ); + } + + // + // Protected ... + protected: + // + // Private ... + private: + // + // Props ... + X121XCCInputs mInputs; // Inputs ... +}; + +// +// Tools ... \ No newline at end of file diff --git a/BKPS/14031206/Helpers/x-saherelm.x121.xche.helper.ex5 b/BKPS/14031206/Helpers/x-saherelm.x121.xche.helper.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..bf918d01d8cc93c3a89d813950f98754df395e15 GIT binary patch literal 6010 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 TMzVSQL&+sC-FPnsl<= 9 && + cheLoopback >= 0; + + // + return result; + } + + // + // Retrieve MAx Length ... + int Max() + { + // + int result = 0; + + // + result = MathMax(cheLength, cheLoopback); + + // + return result; + } +}; + +// +// Conditions ... +struct X121XCHEConditions +{ + // + // Common ... + string symbol; + ENUM_TIMEFRAMES period; + datetime time; + + // + // Buffers ... + double le1Buffer[]; + double se1Buffer[]; + double le2Buffer[]; + double se2Buffer[]; + double le1StartBuffer[]; + double se1StartBuffer[]; + double le2StartBuffer[]; + double se2StartBuffer[]; + + // + // Conditions ... + + // + bool isChe1Bullish; + bool isChe1Bearish; + + // + bool isChe1SwitchedToBullish; + bool isChe1SwitchedToBearish; + + // + bool isChe2Bullish; + bool isChe2Bearish; + + // + bool isChe2SwitchedToBullish; + bool isChe2SwitchedToBearish; + + // + bool isCheBullish; + bool isCheBearish; + + // + bool isCheSwitchedToBullish; + bool isCheSwitchedToBearish; + + // + bool isClosedOverCheMin; + bool isClosedOverCheMax; + + // + bool isClosedUnderCheMin; + bool isClosedUnderCheMax; + + // + // Constructor ... + X121XCHEConditions() + { + Clean(); + } + + // + // Tools ... + + /** + * Cleaning Up ... + */ + void Clean() + { + // + // Commons ... + symbol = NULL; + period = NULL; + time = NULL; + + // + // Buffers ... + + // + Clean(le1Buffer); + Clean(se1Buffer); + Clean(le2Buffer); + Clean(se2Buffer); + Clean(le1StartBuffer); + Clean(se1StartBuffer); + Clean(le2StartBuffer); + Clean(se2StartBuffer); + + // + ArraySetAsSeries(le1Buffer, true); + ArraySetAsSeries(se1Buffer, true); + ArraySetAsSeries(le2Buffer, true); + ArraySetAsSeries(se2Buffer, true); + ArraySetAsSeries(le1StartBuffer, true); + ArraySetAsSeries(se1StartBuffer, true); + ArraySetAsSeries(le2StartBuffer, true); + ArraySetAsSeries(se2StartBuffer, true); + + // + // Conditions ... + + // + isChe1Bullish = false; + isChe1Bearish = false; + + // + isChe1SwitchedToBullish = false; + isChe1SwitchedToBearish = false; + + // + isChe2Bullish = false; + isChe2Bearish = false; + + // + isChe2SwitchedToBullish = false; + isChe2SwitchedToBearish = false; + + // + isCheBullish = false; + isCheBearish = false; + + // + isCheSwitchedToBullish = false; + isCheSwitchedToBearish = false; + + // + isClosedOverCheMin = false; + isClosedOverCheMax = false; + + // + isClosedUnderCheMin = false; + isClosedUnderCheMax = false; + + // + ZeroMemory(this); + } + + /** + * Generate Conditions Scores ... + * + * @param bullishScore: Double, Directional Scores Reference ... + * @param bearishScore: Double, Directional Scores Reference ... + */ + void GenerateScore( + double &bullishScore, + double &bearishScore // + ) + { + // + bullishScore = 0; + bearishScore = 0; + + // + // TODO: Implement if Required ... + } + + /** + * Generate Summary String for Represent Conditions State ... + * + * @param onlyCommons: Boolean, Just Generate Only Commons Conditions ... + * @param onlyConditions: Boolean, Just Generate Only Conditions ... + * @param includeScores: Boolean, Attach Scores Representations on Result ... + * @param ignoreFalseConditions: Boolean, Ignore False Conditions on Result ... + * @param separator: String, Separate Lines ... + * + * @return ( string ) + */ + string GenerateSummary( + bool onlyCommons = false, + bool onlyConditions = false, + bool includeScores = true, + bool ignoreFalseConditions = true, + string separator = "\n" // + ) + { + // + string result = NULL; + + // + double bullishScore = 0; + double bearishScore = 0; + GenerateScore( + bullishScore, + bearishScore // + ); + + // + string scoresStr = + // + "Scores: " + separator + + "---------------" + separator + + "Bullish: " + ToString(bullishScore) + separator + + "Bearish: " + ToString(bearishScore) + separator + + "" + // + ; + + // + string commonStr = GenerateSpecifiedCommonSummary( + this, + separator, + includeScores // + ); + + // + string conditionsStr = + // + ToString("isChe1Bullish", isChe1Bullish, ignoreFalseConditions, separator) + + ToString("isChe1Bearish", isChe1Bearish, ignoreFalseConditions, separator) + + ToString("isChe1SwitchedToBullish", isChe1SwitchedToBullish, ignoreFalseConditions, separator) + + ToString("isChe1SwitchedToBearish", isChe1SwitchedToBearish, ignoreFalseConditions, separator) + + ToString("isChe2Bullish", isChe2Bullish, ignoreFalseConditions, separator) + + ToString("isChe2Bearish", isChe2Bearish, ignoreFalseConditions, separator) + + ToString("isChe2SwitchedToBullish", isChe2SwitchedToBullish, ignoreFalseConditions, separator) + + ToString("isChe2SwitchedToBearish", isChe2SwitchedToBearish, ignoreFalseConditions, separator) + + ToString("isCheBullish", isCheBullish, ignoreFalseConditions, separator) + + ToString("isCheBearish", isCheBearish, ignoreFalseConditions, separator) + + ToString("isCheSwitchedToBullish", isCheSwitchedToBullish, ignoreFalseConditions, separator) + + ToString("isCheSwitchedToBearish", isCheSwitchedToBearish, ignoreFalseConditions, separator) + + ToString("isClosedOverCheMin", isClosedOverCheMin, ignoreFalseConditions, separator) + + ToString("isClosedOverCheMax", isClosedOverCheMax, ignoreFalseConditions, separator) + + ToString("isClosedUnderCheMin", isClosedUnderCheMin, ignoreFalseConditions, separator) + + ToString("isClosedUnderCheMax", isClosedUnderCheMax, ignoreFalseConditions, separator) + + // + "" + // + ; + + // + result = + // + "[" + GetTag() + "]" + separator + + (onlyConditions + ? "" + : commonStr) + + (!includeScores + ? "" + : scoresStr) + + " " + separator + + (onlyCommons + ? "" + : conditionsStr) + + "" + // + ; + + // + return result; + } + + /** + * Retrieve nique Tag Identifier ... + * + * @return ( string ) + */ + string GetTag() + { + return GetTypeName(this); + } + + // +}; + +// +// Class ... +class XCX121XCHEHelper : public XCBaseHelper +{ + // + // Public ... + public: + // + // Props ... + + // + // Constructors ... + XCX121XCHEHelper() + : XCBaseHelper(_Symbol, _Period) + { + } + + // + // Deconstructor ... + ~XCX121XCHEHelper() + { + // + mInputs.Clean(); + + // + Clean(le1Buffer); + Clean(se1Buffer); + Clean(le2Buffer); + Clean(se2Buffer); + Clean(le1StartBuffer); + Clean(se1StartBuffer); + Clean(le2StartBuffer); + Clean(se2StartBuffer); + } + + // + // Tools ... + bool Init( + string symbol, // Trading Symbol + ENUM_TIMEFRAMES period, // Trading Period + X121XCHEInputs &inputs // Inputs + ) + { + // + bool result = false; + + // + mSymbol = symbol; + mPeriod = period; + + // + result = inputs.IsValid(); + if (!result) + { + return result; + } + + // + ArraySetAsSeries(le1Buffer, true); + ArraySetAsSeries(se1Buffer, true); + ArraySetAsSeries(le2Buffer, true); + ArraySetAsSeries(se2Buffer, true); + ArraySetAsSeries(le1StartBuffer, true); + ArraySetAsSeries(se1StartBuffer, true); + ArraySetAsSeries(le2StartBuffer, true); + ArraySetAsSeries(se2StartBuffer, true); + + // + mInputs = inputs; + + // + mHandler = iCustom( + mSymbol, + mPeriod, + "x-saherelm.x121.xche", + // + // Inputs ... + // + // Market ... + "", + mInputs.cheLength, + mInputs.cheLoopback, + mInputs.cheMultiplier1, + mInputs.cheMultiplier2, + mInputs.cheUpperAppliedTo, + mInputs.cheLowerAppliedTo, + // + // Presentation ... + "", + mInputs.cheArrowCode, + mInputs.showLE1, + mInputs.showSE1, + mInputs.showLE2, + mInputs.showSE2 + // + ); + result = mHandler != INVALID_HANDLE; + if (!result) + { + return result; + } + + // + return result; + } + + // + // Inputs ... + + // + X121XCHEInputs GetInputs() + { + return mInputs; + } + + // + bool SetInputs( + X121XCHEInputs &inputs // Configs + ) + { + // + return Init( + mSymbol, + mPeriod, + inputs + // + ); + } + + // + // Readers ... + + // + double GetLE1( + int barIndex // Bar Index + ) + { + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + Calculate(); + + // + int count = ArraySize(le1Buffer); + if (barIndex >= count) + { + barIndex = count - 1; + } + + // + return le1Buffer[barIndex]; + } + + // + int CopyLE1( + int start, // Start + int count, // Number of Items for read + double &buffer[], // Dest Buffer + bool forceClean = true // Force To Clean buffer + ) + { + // + // Update Calculations ... + Calculate(); + + // + // Copy Items ... + return Copy( + start, + count, + le1Buffer, + buffer, + forceClean + // + ); + } + + // + double GetLE1Start( + int barIndex // Bar Index + ) + { + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + Calculate(); + + // + int count = ArraySize(le1StartBuffer); + if (barIndex >= count) + { + barIndex = count - 1; + } + + // + return le1StartBuffer[barIndex]; + } + + // + int CopyLE1Start( + int start, // Start + int count, // Number of Items for read + double &buffer[], // Dest Buffer + bool forceClean = true // Force To Clean buffer + ) + { + // + // Update Calculations ... + Calculate(); + + // + // Copy Items ... + return Copy( + start, + count, + le1StartBuffer, + buffer, + forceClean + // + ); + } + + // + double GetLE2( + int barIndex // Bar Index + ) + { + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + Calculate(); + + // + int count = ArraySize(le2Buffer); + if (barIndex >= count) + { + barIndex = count - 1; + } + + // + return le2Buffer[barIndex]; + } + + // + int CopyLE2( + int start, // Start + int count, // Number of Items for read + double &buffer[], // Dest Buffer + bool forceClean = true // Force To Clean buffer + ) + { + // + // Update Calculations ... + Calculate(); + + // + // Copy Items ... + return Copy( + start, + count, + le2Buffer, + buffer, + forceClean + // + ); + } + + // + double GetLE2Start( + int barIndex // Bar Index + ) + { + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + Calculate(); + + // + int count = ArraySize(le2StartBuffer); + if (barIndex >= count) + { + barIndex = count - 1; + } + + // + return le2StartBuffer[barIndex]; + } + + // + int CopyLE2Start( + int start, // Start + int count, // Number of Items for read + double &buffer[], // Dest Buffer + bool forceClean = true // Force To Clean buffer + ) + { + // + // Update Calculations ... + Calculate(); + + // + // Copy Items ... + return Copy( + start, + count, + le2StartBuffer, + buffer, + forceClean + // + ); + } + + // + double GetSE1( + int barIndex // Bar Index + ) + { + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + Calculate(); + + // + int count = ArraySize(se1Buffer); + if (barIndex >= count) + { + barIndex = count - 1; + } + + // + return se1Buffer[barIndex]; + } + + // + int CopySE1( + int start, // Start + int count, // Number of Items for read + double &buffer[], // Dest Buffer + bool forceCsean = true // Force To Csean buffer + ) + { + // + // Update Calculations ... + Calculate(); + + // + // Copy Items ... + return Copy( + start, + count, + se1Buffer, + buffer, + forceCsean + // + ); + } + + // + double GetSE1Start( + int barIndex // Bar Index + ) + { + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + Calculate(); + + // + int count = ArraySize(se1StartBuffer); + if (barIndex >= count) + { + barIndex = count - 1; + } + + // + return se1StartBuffer[barIndex]; + } + + // + int CopySE1Start( + int start, // Start + int count, // Number of Items for read + double &buffer[], // Dest Buffer + bool forceCsean = true // Force To Csean buffer + ) + { + // + // Update Calculations ... + Calculate(); + + // + // Copy Items ... + return Copy( + start, + count, + se1StartBuffer, + buffer, + forceCsean + // + ); + } + + // + double GetSE2( + int barIndex // Bar Index + ) + { + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + Calculate(); + + // + int count = ArraySize(se2Buffer); + if (barIndex >= count) + { + barIndex = count - 1; + } + + // + return se2Buffer[barIndex]; + } + + // + int CopySE2( + int start, // Start + int count, // Number of Items for read + double &buffer[], // Dest Buffer + bool forceCsean = true // Force To Csean buffer + ) + { + // + // Update Calculations ... + Calculate(); + + // + // Copy Items ... + return Copy( + start, + count, + se2Buffer, + buffer, + forceCsean + // + ); + } + + // + double GetSE2Start( + int barIndex // Bar Index + ) + { + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + Calculate(); + + // + int count = ArraySize(se2StartBuffer); + if (barIndex >= count) + { + barIndex = count - 1; + } + + // + return se2StartBuffer[barIndex]; + } + + // + int CopySE2Start( + int start, // Start + int count, // Number of Items for read + double &buffer[], // Dest Buffer + bool forceCsean = true // Force To Csean buffer + ) + { + // + // Update Calculations ... + Calculate(); + + // + // Copy Items ... + return Copy( + start, + count, + se2StartBuffer, + buffer, + forceCsean + // + ); + } + + // + void Free() override + { + Cleanup(10); + } + + // + bool GetConditions( + X121XCHEConditions &conditions, // + int barIndex = 0, // + int loopback = 5 // + ) + { + // + bool result = true; + + // + if (loopback < 5) + { + loopback = 5; + } + + // + conditions.Clean(); + + // + conditions.symbol = mSymbol; + conditions.period = mPeriod; + conditions.time = TimeCurrent(); + + // + int zIndex = barIndex; + int cIndex = zIndex + 1; + int pIndex = cIndex + 1; + int ppIndex = pIndex + 1; + + // + XOHCL zBar; + result = zBar.Init( + mSymbol, + mPeriod, + zIndex // + ); + if (!result) + { + return result; + } + + // + XOHCL cBar; + result = cBar.Init( + mSymbol, + mPeriod, + cIndex // + ); + if (!result) + { + return result; + } + + // + XOHCL pBar; + result = pBar.Init( + mSymbol, + mPeriod, + pIndex // + ); + if (!result) + { + return result; + } + + // + // Buffers ... + + // + CopyLE1( + zIndex, + loopback, + conditions.le1Buffer // + ); + + // + CopySE1( + zIndex, + loopback, + conditions.se1Buffer // + ); + + // + CopyLE2( + zIndex, + loopback, + conditions.le2Buffer // + ); + + // + CopySE2( + zIndex, + loopback, + conditions.se2Buffer // + ); + + // + CopyLE1Start( + zIndex, + loopback, + conditions.le1StartBuffer // + ); + + // + CopySE1Start( + zIndex, + loopback, + conditions.se1StartBuffer // + ); + + // + CopyLE2Start( + zIndex, + loopback, + conditions.le2StartBuffer // + ); + + // + CopySE2Start( + zIndex, + loopback, + conditions.se2StartBuffer // + ); + + // + // Conditions ... + + // + int cIDX = 1; + int pIDX = cIDX + 1; + + // + bool isChe1Bullish = le1Buffer[cIDX] != EMPTY_VALUE && + se1Buffer[cIDX] == EMPTY_VALUE; + bool isChe1BullishPrev = le1Buffer[cIDX] != EMPTY_VALUE && + se1Buffer[pIDX] == EMPTY_VALUE; + + // + bool isChe1Bearish = se1Buffer[cIDX] != EMPTY_VALUE && + le1Buffer[cIDX] == EMPTY_VALUE; + bool isChe1BearishPrev = se1Buffer[pIDX] != EMPTY_VALUE && + le1Buffer[pIDX] == EMPTY_VALUE; + + // + bool isChe1SwitchedToBullish = isChe1Bullish && + !isChe1BullishPrev; + bool isChe1SwitchedToBearish = isChe1Bearish && + !isChe1BearishPrev; + + // + bool isChe2Bullish = le2Buffer[cIDX] != EMPTY_VALUE && + se2Buffer[cIDX] == EMPTY_VALUE; + bool isChe2BullishPrev = le2Buffer[pIDX] != EMPTY_VALUE && + se2Buffer[pIDX] == EMPTY_VALUE; + + // + bool isChe2Bearish = se2Buffer[cIDX] != EMPTY_VALUE && + le2Buffer[cIDX] == EMPTY_VALUE; + bool isChe2BearishPrev = se2Buffer[pIDX] != EMPTY_VALUE && + le2Buffer[pIDX] == EMPTY_VALUE; + + // + bool isChe2SwitchedToBullish = isChe2Bullish && + !isChe2BullishPrev; + bool isChe2SwitchedToBearish = isChe2Bearish && + !isChe2BearishPrev; + + // + bool isCheBullish = isChe1Bullish && + isChe2Bullish; + bool isCheBullishPrev = isChe1BullishPrev && + isChe2BullishPrev; + + // + bool isCheBearish = isChe1Bearish && + isChe2Bearish; + bool isCheBearishPrev = isChe1BearishPrev && + isChe2BearishPrev; + + // + bool isCheSwitchedToBullish = isCheBullish && + !isCheBullishPrev; + bool isCheSwitchedToBearish = isCheBearish && + !isCheBearishPrev; + + // + double ches[]; + double prevCheLE1 = le1Buffer[pIDX]; + double prevCheLE2 = le2Buffer[pIDX]; + double prevCheSE1 = se1Buffer[pIDX]; + double prevCheSE2 = se2Buffer[pIDX]; + if (prevCheLE1 != EMPTY_VALUE) + { + // + Add( + prevCheLE1, + ches // + ); + } + if (prevCheLE2 != EMPTY_VALUE) + { + // + Add( + prevCheLE2, + ches // + ); + } + if (prevCheSE1 != EMPTY_VALUE) + { + // + Add( + prevCheSE1, + ches // + ); + } + if (prevCheSE2 != EMPTY_VALUE) + { + // + Add( + prevCheSE2, + ches // + ); + } + + // + double cheMin = GetMin(ches); + double cheMax = GetMax(ches); + + // + bool isClosedOverCheMin = cBar.close > cheMin; + bool isClosedOverCheMax = cBar.close > cheMax; + bool isClosedUnderCheMin = cBar.close < cheMin; + bool isClosedUnderCheMax = cBar.close < cheMax; + + // + conditions.isChe1Bullish = isChe1Bullish; + conditions.isChe1Bearish = isChe1Bearish; + conditions.isChe1SwitchedToBullish = isChe1SwitchedToBullish; + conditions.isChe1SwitchedToBearish = isChe1SwitchedToBearish; + conditions.isChe2Bullish = isChe2Bullish; + conditions.isChe2Bearish = isChe2Bearish; + conditions.isChe2SwitchedToBullish = isChe2SwitchedToBullish; + conditions.isChe2SwitchedToBearish = isChe2SwitchedToBearish; + conditions.isCheBullish = isCheBullish; + conditions.isCheBearish = isCheBearish; + conditions.isCheSwitchedToBullish = isCheSwitchedToBullish; + conditions.isCheSwitchedToBearish = isCheSwitchedToBearish; + conditions.isClosedOverCheMin = isClosedOverCheMin; + conditions.isClosedOverCheMax = isClosedOverCheMax; + conditions.isClosedUnderCheMin = isClosedUnderCheMin; + conditions.isClosedUnderCheMax = isClosedUnderCheMax; + + // + Cleanup(); + + // + zBar.Clean(); + cBar.Clean(); + pBar.Clean(); + + // + return result; + } + + // + // Protected ... + protected: + // + // Private ... + private: + // + // Props ... + X121XCHEInputs mInputs; // Inputs ... + + // + // Buffers ... + double le1Buffer[]; + double se1Buffer[]; + double le2Buffer[]; + double se2Buffer[]; + double le1StartBuffer[]; + double se1StartBuffer[]; + double le2StartBuffer[]; + double se2StartBuffer[]; + + // + void Calculate( + int maxRequiredBars = 100 // + ) + { + // + // Buffers ... + + // + // LE1 Start ... + CopyBuffer( + mHandler, + X121_XCHE_LE_1_S_LINE, + 0, + maxRequiredBars, + le1StartBuffer // + ); + + // + // LE1 ... + CopyBuffer( + mHandler, + X121_XCHE_LE_1_LINE, + 0, + maxRequiredBars, + le1Buffer // + ); + + // + // LE2 Start ... + CopyBuffer( + mHandler, + X121_XCHE_LE_2_S_LINE, + 0, + maxRequiredBars, + le2StartBuffer // + ); + + // + // LE2 ... + CopyBuffer( + mHandler, + X121_XCHE_LE_2_LINE, + 0, + maxRequiredBars, + le2Buffer // + ); + + // + // SE1 Start ... + CopyBuffer( + mHandler, + X121_XCHE_SE_1_S_LINE, + 0, + maxRequiredBars, + se1StartBuffer // + ); + + // + // SE1 ... + CopyBuffer( + mHandler, + X121_XCHE_SE_1_LINE, + 0, + maxRequiredBars, + se1Buffer // + ); + + // + // SE2 Start ... + CopyBuffer( + mHandler, + X121_XCHE_SE_2_S_LINE, + 0, + maxRequiredBars, + se2StartBuffer // + ); + + // + // SE2 ... + CopyBuffer( + mHandler, + X121_XCHE_SE_2_LINE, + 0, + maxRequiredBars, + se2Buffer // + ); + } + + // + void Cleanup( + int maxAllowed = 100 // + ) + { + // + CleanupArray( + le1Buffer, + maxAllowed // + ); + + // + CleanupArray( + se1Buffer, + maxAllowed // + ); + + // + CleanupArray( + le2Buffer, + maxAllowed // + ); + + // + CleanupArray( + se2Buffer, + maxAllowed // + ); + + // + CleanupArray( + le1StartBuffer, + maxAllowed // + ); + + // + CleanupArray( + se1StartBuffer, + maxAllowed // + ); + + // + CleanupArray( + le2StartBuffer, + maxAllowed // + ); + + // + CleanupArray( + se2StartBuffer, + maxAllowed // + ); + + // + } + + // +}; + +// +// Tools ... \ No newline at end of file diff --git a/BKPS/14031206/Helpers/x-saherelm.x121.xct.helper.ex5 b/BKPS/14031206/Helpers/x-saherelm.x121.xct.helper.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..b44eff3b2fa89ce639da9beb98ce3ef78d598d2b GIT binary patch literal 5660 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 literal 0 HcmV?d00001 diff --git a/BKPS/14031206/Helpers/x-saherelm.x121.xct.helper.mq5 b/BKPS/14031206/Helpers/x-saherelm.x121.xct.helper.mq5 new file mode 100644 index 0000000..c444481 --- /dev/null +++ b/BKPS/14031206/Helpers/x-saherelm.x121.xct.helper.mq5 @@ -0,0 +1,234 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 Helper Class Library +// ---------------------------------------------- +// Name: XSCX121XCTHelper +// Description: provides all Indicator +// Helper requirements ... +// +// +// Maintainer: +// ------------ +// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) +// +////////////////////////////////////////////////////// +// +// Global Properties ... +#property library +#property copyright "Copyright 2023, SaherElm IT Center" +#property link "https://www.saherelm.ir" +#property version "1.00" +#property strict + +// +// Imports ... +#include "../Classes/x-saherelm.x-helper.class.mq5" + +// +// Definitions ... + +// +// Input Models ... +struct X121XCTInputs +{ + // + // Props ... + + // + string font; // Font + int fontSize; // Font Size; + color clr; // Text Color + ENUM_BASE_CORNER corner; // Text Position + + // + // Presentation ... + bool showCandleTime; // Show Candle Time + + // + // Constructor(s) ... + X121XCTInputs() + { + Clean(); + } + + // + // Tools ... + + // + // Clean ... + void Clean() + { + // + font = NULL; + fontSize = 15; + clr = CLR_NONE; + corner = CORNER_RIGHT_LOWER; + + // + // Presentation ... + showCandleTime = false; + + // + ZeroMemory(this); + } + + // + // Default ... + void Default() + { + // + font = "Arial"; + fontSize = 15; + clr = clrYellow; + corner = CORNER_RIGHT_LOWER; + + // + // Presentation ... + showCandleTime = true; + } + + // + // Validate ... + bool IsValid() + { + // + bool result = false; + + // + result = + // + true + // + ; + + // + return result; + } + + // + // Retrieve MAx Length ... + int Max() + { + // + int result = 0; + + // + result = MathMax(0, 0); + + // + return result; + } +}; + +// +// Class ... +class XCX121XCTHelper : public XCBaseHelper +{ + // + // Public ... + public: + // + // Props ... + + // + // Constructors ... + XCX121XCTHelper() + : XCBaseHelper(_Symbol, _Period) + { + } + + // + // Deconstructor ... + ~XCX121XCTHelper() + { + mInputs.Clean(); + } + + // + // Tools ... + bool Init( + string symbol, // Trading Symbol + ENUM_TIMEFRAMES period, // Trading Period + X121XCTInputs &inputs // Inputs + ) + { + // + bool result = false; + + // + mSymbol = symbol; + mPeriod = period; + + // + result = inputs.IsValid(); + if (!result) + { + return result; + } + + // + mInputs = inputs; + + // + mHandler = iCustom( + mSymbol, + mPeriod, + "x-saherelm.x121.xct", + // + // Inputs ... + mInputs.fontSize, // Font Size ... + mInputs.font, // Font ... + mInputs.clr, // Text Color ... + mInputs.corner, // Text Position ... + // + // Presentation ... + "", + mInputs.showCandleTime // Show Candle Time + // + ); + result = mHandler != INVALID_HANDLE; + if (!result) + { + return result; + } + + // + return result; + } + + // + // Inputs ... + + // + X121XCTInputs GetInputs() + { + return mInputs; + } + + // + bool SetInputs( + X121XCTInputs &inputs // Configs + ) + { + // + return Init( + mSymbol, + mPeriod, + inputs + // + ); + } + + // + // Protected ... + protected: + // + // Private ... + private: + // + // Props ... + X121XCTInputs mInputs; // Inputs ... +}; + +// +// Tools ... \ No newline at end of file diff --git a/BKPS/14031206/Helpers/x-saherelm.x121.xdon.helper.ex5 b/BKPS/14031206/Helpers/x-saherelm.x121.xdon.helper.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..01b04d1c10601e34345abddaf87f43078c328379 GIT binary patch literal 6504 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 literal 0 HcmV?d00001 diff --git a/BKPS/14031206/Helpers/x-saherelm.x121.xdon.helper.mq5 b/BKPS/14031206/Helpers/x-saherelm.x121.xdon.helper.mq5 new file mode 100644 index 0000000..639df23 --- /dev/null +++ b/BKPS/14031206/Helpers/x-saherelm.x121.xdon.helper.mq5 @@ -0,0 +1,1408 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 Helper Class Library +// ---------------------------------------------- +// Name: XCX121XDONHelper +// Description: provides all Indicator +// Helper requirements ... +// +// +// Maintainer: +// ------------ +// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) +// +////////////////////////////////////////////////////// +// +// Global Properties ... +#property library +#property copyright "Copyright 2023, SaherElm IT Center" +#property link "https://www.saherelm.ir" +#property version "1.00" +#property strict + +// +// Imports ... +#include "../Classes/x-saherelm.x-helper.class.mq5" + +// +// Definitions ... + +// +// Definitions ... +enum ENUM_X121_XDON_BUFFERS +{ + // + X121_XDON_OPEN_UPPER_LINE = 0, + X121_XDON_OPEN_LOWER_LINE = 1, + X121_XDON_HIGH_UPPER_LINE = 2, + X121_XDON_HIGH_LOWER_LINE = 3, + X121_XDON_LOW_UPPER_LINE = 4, + X121_XDON_LOW_LOWER_LINE = 5, + X121_XDON_CLOSE_UPPER_LINE = 6, + X121_XDON_CLOSE_LOWER_LINE = 7, +}; + +// +// Input Models ... +struct X121XDONInputs +{ + // + // Props ... + + // + int donchainLength; // Donchain Length + + // + int startCalculationForLastBars; // Calculate Last n Bars + + // + bool showUpper; // Show Upper Band + bool showLower; // Show Lower Band + + // + bool showOpen; // Show Open + bool showHigh; // Show High + bool showClose; // Show Close + bool showLow; // Show Low + + // + // Constructor(s) ... + X121XDONInputs() + { + // + Clean(); + } + + // + // Tools ... + + // + // Clean ... + void Clean() + { + // + donchainLength = 0; + + // + startCalculationForLastBars = 0; + + // + showUpper = false; + showLower = false; + + // + showOpen = false; + showHigh = false; + showClose = false; + showLow = false; + + // + ZeroMemory(this); + } + + // + // Default ... + void Default() + { + // + donchainLength = 40; + + // + startCalculationForLastBars = 1000; + + // + showUpper = true; + showLower = true; + + // + showOpen = true; + showHigh = true; + showClose = true; + showLow = true; + } + + // + // Validate ... + bool IsValid() + { + // + bool result = false; + + // + result = + // + donchainLength > 0 + // + ; + + // + return result; + } + + // + // Retrieve MAx Length ... + int Max() + { + // + int result = 0; + + // + result = MathMax(1, donchainLength); + + // + return result; + } +}; + +// +// Conditions ... +struct X121XDONConditions +{ + // + // Common ... + string symbol; + ENUM_TIMEFRAMES period; + datetime time; + + // + // Buffers ... + double donOpenUpperBuffer[]; + double donOpenLowerBuffer[]; + double donHighUpperBuffer[]; + double donHighLowerBuffer[]; + double donLowUpperBuffer[]; + double donLowLowerBuffer[]; + double donCloseUpperBuffer[]; + double donCloseLowerBuffer[]; + + // + // Conditions ... + + // + bool isRejectedDonOpenUpper; + bool isRejectedDonHighUpper; + bool isRejectedDonLowUpper; + bool isRejectedDonCloseUpper; + + // + bool isRejectedDonOpenLower; + bool isRejectedDonHighLower; + bool isRejectedDonLowLower; + bool isRejectedDonCloseLower; + + // + bool isBreakedDonOpenUpper; + bool isBreakedDonHighUpper; + bool isBreakedDonLowUpper; + bool isBreakedDonCloseUpper; + + // + bool isBreakedDonOpenLower; + bool isBreakedDonHighLower; + bool isBreakedDonLowLower; + bool isBreakedDonCloseLower; + + // + // Constructor ... + X121XDONConditions() + { + Clean(); + } + + // + // Tools ... + + /** + * Cleaning Up ... + */ + void Clean() + { + // + // Commons ... + symbol = NULL; + period = NULL; + time = NULL; + + // + // Buffers ... + + // + Clean(donOpenUpperBuffer); + Clean(donOpenLowerBuffer); + Clean(donHighUpperBuffer); + Clean(donHighLowerBuffer); + Clean(donLowUpperBuffer); + Clean(donLowLowerBuffer); + Clean(donCloseUpperBuffer); + Clean(donCloseLowerBuffer); + + // + ArraySetAsSeries(donOpenUpperBuffer, true); + ArraySetAsSeries(donOpenLowerBuffer, true); + ArraySetAsSeries(donHighUpperBuffer, true); + ArraySetAsSeries(donHighLowerBuffer, true); + ArraySetAsSeries(donLowUpperBuffer, true); + ArraySetAsSeries(donLowLowerBuffer, true); + ArraySetAsSeries(donCloseUpperBuffer, true); + ArraySetAsSeries(donCloseLowerBuffer, true); + + // + // Conditions ... + + // + isRejectedDonOpenUpper = false; + isRejectedDonHighUpper = false; + isRejectedDonLowUpper = false; + isRejectedDonCloseUpper = false; + + // + isRejectedDonOpenLower = false; + isRejectedDonHighLower = false; + isRejectedDonLowLower = false; + isRejectedDonCloseLower = false; + + // + isBreakedDonOpenUpper = false; + isBreakedDonHighUpper = false; + isBreakedDonLowUpper = false; + isBreakedDonCloseUpper = false; + + // + isBreakedDonOpenLower = false; + isBreakedDonHighLower = false; + isBreakedDonLowLower = false; + isBreakedDonCloseLower = false; + + // + ZeroMemory(this); + } + + /** + * Generate Conditions Scores ... + * + * @param bullishScore: Double, Directional Scores Reference ... + * @param bearishScore: Double, Directional Scores Reference ... + */ + void GenerateScore( + double &bullishScore, + double &bearishScore // + ) + { + // + bullishScore = 0; + bearishScore = 0; + + // + // TODO: Implement if Required ... + } + + /** + * Generate Summary String for Represent Conditions State ... + * + * @param onlyCommons: Boolean, Just Generate Only Commons Conditions ... + * @param onlyConditions: Boolean, Just Generate Only Conditions ... + * @param includeScores: Boolean, Attach Scores Representations on Result ... + * @param ignoreFalseConditions: Boolean, Ignore False Conditions on Result ... + * @param separator: String, Separate Lines ... + * + * @return ( string ) + */ + string GenerateSummary( + bool onlyCommons = false, + bool onlyConditions = false, + bool includeScores = true, + bool ignoreFalseConditions = true, + string separator = "\n" // + ) + { + // + string result = NULL; + + // + double bullishScore = 0; + double bearishScore = 0; + GenerateScore( + bullishScore, + bearishScore // + ); + + // + string scoresStr = + // + "Scores: " + separator + + "---------------" + separator + + "Bullish: " + ToString(bullishScore) + separator + + "Bearish: " + ToString(bearishScore) + separator + + "" + // + ; + + // + string commonStr = GenerateSpecifiedCommonSummary( + this, + separator, + includeScores // + ); + + // + string conditionsStr = + // + ToString("isRejectedDonOpenUpper", isRejectedDonOpenUpper, ignoreFalseConditions, separator) + + ToString("isRejectedDonHighUpper", isRejectedDonHighUpper, ignoreFalseConditions, separator) + + ToString("isRejectedDonLowUpper", isRejectedDonLowUpper, ignoreFalseConditions, separator) + + ToString("isRejectedDonCloseUpper", isRejectedDonCloseUpper, ignoreFalseConditions, separator) + + // + ToString("isRejectedDonOpenLower", isRejectedDonOpenLower, ignoreFalseConditions, separator) + + ToString("isRejectedDonHighLower", isRejectedDonHighLower, ignoreFalseConditions, separator) + + ToString("isRejectedDonLowLower", isRejectedDonLowLower, ignoreFalseConditions, separator) + + ToString("isRejectedDonCloseLower", isRejectedDonCloseLower, ignoreFalseConditions, separator) + + // + ToString("isBreakedDonOpenUpper", isBreakedDonOpenUpper, ignoreFalseConditions, separator) + + ToString("isBreakedDonHighUpper", isBreakedDonHighUpper, ignoreFalseConditions, separator) + + ToString("isBreakedDonLowUpper", isBreakedDonLowUpper, ignoreFalseConditions, separator) + + ToString("isBreakedDonCloseUpper", isBreakedDonCloseUpper, ignoreFalseConditions, separator) + + // + ToString("isBreakedDonOpenLower", isBreakedDonOpenLower, ignoreFalseConditions, separator) + + ToString("isBreakedDonHighLower", isBreakedDonHighLower, ignoreFalseConditions, separator) + + ToString("isBreakedDonLowLower", isBreakedDonLowLower, ignoreFalseConditions, separator) + + ToString("isBreakedDonCloseLower", isBreakedDonCloseLower, ignoreFalseConditions, separator) + + // + "" + // + ; + + // + result = + // + "[" + GetTag() + "]" + separator + + (onlyConditions + ? "" + : commonStr) + + (!includeScores + ? "" + : scoresStr) + + " " + separator + + (onlyCommons + ? "" + : conditionsStr) + + "" + // + ; + + // + return result; + } + + /** + * Retrieve nique Tag Identifier ... + * + * @return ( string ) + */ + string GetTag() + { + return GetTypeName(this); + } + + // +}; + +// +// Class ... +class XCX121XDONHelper : public XCBaseHelper +{ + // + // Public ... + public: + // + // Props ... + + // + // Constructors ... + XCX121XDONHelper() + : XCBaseHelper(_Symbol, _Period) + { + } + + // + // Deconstructor ... + ~XCX121XDONHelper() + { + // + mInputs.Clean(); + + // + Clean(donOpenUpperBuffer); + Clean(donOpenLowerBuffer); + Clean(donHighUpperBuffer); + Clean(donHighLowerBuffer); + Clean(donLowUpperBuffer); + Clean(donLowLowerBuffer); + Clean(donCloseUpperBuffer); + Clean(donCloseLowerBuffer); + } + + // + // Tools ... + bool Init( + string symbol, // Trading Symbol + ENUM_TIMEFRAMES period, // Trading Period + X121XDONInputs &inputs // Inputs + ) + { + // + bool result = false; + + // + mSymbol = symbol; + mPeriod = period; + + // + result = inputs.IsValid(); + if (!result) + { + return result; + } + + // + ArraySetAsSeries(donOpenUpperBuffer, true); + ArraySetAsSeries(donOpenLowerBuffer, true); + ArraySetAsSeries(donHighUpperBuffer, true); + ArraySetAsSeries(donHighLowerBuffer, true); + ArraySetAsSeries(donLowUpperBuffer, true); + ArraySetAsSeries(donLowLowerBuffer, true); + ArraySetAsSeries(donCloseUpperBuffer, true); + ArraySetAsSeries(donCloseLowerBuffer, true); + + // + mInputs = inputs; + + // + mHandler = iCustom( + mSymbol, + mPeriod, + "x-saherelm.x121.xdon", + // + // Inputs ... + // + // Market ... + "", + mInputs.donchainLength, + // + // Presentation ... + "", + mInputs.startCalculationForLastBars, + // + mInputs.showUpper, + mInputs.showLower, + // + mInputs.showOpen, + mInputs.showHigh, + mInputs.showClose, + mInputs.showLow + // + ); + result = mHandler != INVALID_HANDLE; + if (!result) + { + return result; + } + + // + return result; + } + + // + // Inputs ... + + // + X121XDONInputs GetInputs() + { + return mInputs; + } + + // + bool SetInputs( + X121XDONInputs &inputs // Configs + ) + { + // + return Init( + mSymbol, + mPeriod, + inputs + // + ); + } + + // + // Readers ... + + // + // OPEN ... + + // + // UPPER ... + + // + double GetDonOpenUpper( + int barIndex // Bar Index + ) + { + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + Calculate(); + + // + int count = ArraySize(donOpenUpperBuffer); + if (barIndex >= count) + { + barIndex = count - 1; + } + + // + return donOpenUpperBuffer[barIndex]; + } + + // + int CopyDonOpenUpper( + int start, // Start + int count, // Number of Items for read + double &buffer[], // Dest Buffer + bool forceClean = true // Force To Clean buffer + ) + { + // + // Update Calculations ... + Calculate(); + + // + // Copy Items ... + return Copy( + start, + count, + donOpenUpperBuffer, + buffer, + forceClean + // + ); + } + + // + // LOWER ... + + // + double GetDonOpenLower( + int barIndex // Bar Index + ) + { + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + Calculate(); + + // + int count = ArraySize(donOpenLowerBuffer); + if (barIndex >= count) + { + barIndex = count - 1; + } + + // + return donOpenLowerBuffer[barIndex]; + } + + // + int CopyDonOpenLower( + int start, // Start + int count, // Number of Items for read + double &buffer[], // Dest Buffer + bool forceClean = true // Force To Clean buffer + ) + { + // + // Update Calculations ... + Calculate(); + + // + // Copy Items ... + return Copy( + start, + count, + donOpenLowerBuffer, + buffer, + forceClean + // + ); + } + + // + // CLOSE ... + + // + // UPPER ... + + // + double GetDonCloseUpper( + int barIndex // Bar Index + ) + { + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + Calculate(); + + // + int count = ArraySize(donCloseUpperBuffer); + if (barIndex >= count) + { + barIndex = count - 1; + } + + // + return donCloseUpperBuffer[barIndex]; + } + + // + int CopyDonCloseUpper( + int start, // Start + int count, // Number of Items for read + double &buffer[], // Dest Buffer + bool forceClean = true // Force To Clean buffer + ) + { + // + // Update Calculations ... + Calculate(); + + // + // Copy Items ... + return Copy( + start, + count, + donCloseUpperBuffer, + buffer, + forceClean + // + ); + } + + // + // LOWER ... + + // + double GetDonCloseLower( + int barIndex // Bar Index + ) + { + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + Calculate(); + + // + int count = ArraySize(donCloseLowerBuffer); + if (barIndex >= count) + { + barIndex = count - 1; + } + + // + return donCloseLowerBuffer[barIndex]; + } + + // + int CopyDonCloseLower( + int start, // Start + int count, // Number of Items for read + double &buffer[], // Dest Buffer + bool forceClean = true // Force To Clean buffer + ) + { + // + // Update Calculations ... + Calculate(); + + // + // Copy Items ... + return Copy( + start, + count, + donCloseLowerBuffer, + buffer, + forceClean + // + ); + } + + // + // HIGH ... + + // + // UPPER ... + + // + double GetDonHighUpper( + int barIndex // Bar Index + ) + { + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + Calculate(); + + // + int count = ArraySize(donHighUpperBuffer); + if (barIndex >= count) + { + barIndex = count - 1; + } + + // + return donHighUpperBuffer[barIndex]; + } + + // + int CopyDonHighUpper( + int start, // Start + int count, // Number of Items for read + double &buffer[], // Dest Buffer + bool forceClean = true // Force To Clean buffer + ) + { + // + // Update Calculations ... + Calculate(); + + // + // Copy Items ... + return Copy( + start, + count, + donHighUpperBuffer, + buffer, + forceClean + // + ); + } + + // + // LOWER ... + + // + double GetDonHighLower( + int barIndex // Bar Index + ) + { + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + Calculate(); + + // + int count = ArraySize(donHighLowerBuffer); + if (barIndex >= count) + { + barIndex = count - 1; + } + + // + return donHighLowerBuffer[barIndex]; + } + + // + int CopyDonHighLower( + int start, // Start + int count, // Number of Items for read + double &buffer[], // Dest Buffer + bool forceClean = true // Force To Clean buffer + ) + { + // + // Update Calculations ... + Calculate(); + + // + // Copy Items ... + return Copy( + start, + count, + donHighLowerBuffer, + buffer, + forceClean + // + ); + } + + // + // LOW ... + + // + // UPPER ... + + // + double GetDonLowUpper( + int barIndex // Bar Index + ) + { + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + Calculate(); + + // + int count = ArraySize(donLowUpperBuffer); + if (barIndex >= count) + { + barIndex = count - 1; + } + + // + return donLowUpperBuffer[barIndex]; + } + + // + int CopyDonLowUpper( + int start, // Start + int count, // Number of Items for read + double &buffer[], // Dest Buffer + bool forceClean = true // Force To Clean buffer + ) + { + // + // Update Calculations ... + Calculate(); + + // + // Copy Items ... + return Copy( + start, + count, + donLowUpperBuffer, + buffer, + forceClean + // + ); + } + + // + // LOWER ... + + // + double GetDonLoweLower( + int barIndex // Bar Index + ) + { + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + Calculate(); + + // + int count = ArraySize(donLowLowerBuffer); + if (barIndex >= count) + { + barIndex = count - 1; + } + + // + return donLowLowerBuffer[barIndex]; + } + + // + int CopyDonLoweLower( + int start, // Start + int count, // Number of Items for read + double &buffer[], // Dest Buffer + bool forceClean = true // Force To Clean buffer + ) + { + // + // Update Calculations ... + Calculate(); + + // + // Copy Items ... + return Copy( + start, + count, + donLowLowerBuffer, + buffer, + forceClean + // + ); + } + + // + void Free() override + { + Cleanup(10); + } + + // + bool GetConditions( + X121XDONConditions &conditions, // + int barIndex = 0, // + int loopback = 5 // + ) + { + // + bool result = true; + + // + if (loopback < 5) + { + loopback = 5; + } + + // + conditions.Clean(); + + // + conditions.symbol = mSymbol; + conditions.period = mPeriod; + conditions.time = TimeCurrent(); + + // + int zIndex = barIndex; + int cIndex = zIndex + 1; + int pIndex = cIndex + 1; + int ppIndex = pIndex + 1; + + // + XOHCL zBar; + result = zBar.Init( + mSymbol, + mPeriod, + zIndex // + ); + if (!result) + { + return result; + } + + // + XOHCL cBar; + result = cBar.Init( + mSymbol, + mPeriod, + cIndex // + ); + if (!result) + { + return result; + } + + // + XOHCL pBar; + result = pBar.Init( + mSymbol, + mPeriod, + pIndex // + ); + if (!result) + { + return result; + } + + // + // Buffers ... + + // + CopyDonOpenUpper( + zIndex, + loopback, + conditions.donOpenUpperBuffer // + ); + + // + CopyDonOpenLower( + zIndex, + loopback, + conditions.donOpenLowerBuffer // + ); + + // + CopyDonCloseUpper( + zIndex, + loopback, + conditions.donCloseUpperBuffer // + ); + + // + CopyDonCloseLower( + zIndex, + loopback, + conditions.donCloseLowerBuffer // + ); + + // + CopyDonHighUpper( + zIndex, + loopback, + conditions.donHighUpperBuffer // + ); + + // + CopyDonHighLower( + zIndex, + loopback, + conditions.donHighLowerBuffer // + ); + + // + CopyDonLowUpper( + zIndex, + loopback, + conditions.donLowUpperBuffer // + ); + + // + CopyDonLoweLower( + zIndex, + loopback, + conditions.donLowLowerBuffer // + ); + + // + // Conditions ... + + // + int cIDX = 1; + int pIDX = cIDX + 1; + + // + bool isRejectedDonOpenUpper = IsBarReject( + donOpenUpperBuffer[cIDX], + X_DIRECTION_BEARISH, + cBar // + ); + bool isRejectedDonHighUpper = IsBarReject( + donHighUpperBuffer[cIDX], + X_DIRECTION_BEARISH, + cBar // + ); + bool isRejectedDonLowUpper = IsBarReject( + donLowUpperBuffer[cIDX], + X_DIRECTION_BEARISH, + cBar // + ); + bool isRejectedDonCloseUpper = IsBarReject( + donCloseUpperBuffer[cIDX], + X_DIRECTION_BEARISH, + cBar // + ); + + // + bool isRejectedDonOpenLower = IsBarReject( + donOpenLowerBuffer[cIDX], + X_DIRECTION_BULLISH, + cBar // + ); + bool isRejectedDonHighLower = IsBarReject( + donHighLowerBuffer[cIDX], + X_DIRECTION_BULLISH, + cBar // + ); + bool isRejectedDonLowLower = IsBarReject( + donLowLowerBuffer[cIDX], + X_DIRECTION_BULLISH, + cBar // + ); + bool isRejectedDonCloseLower = IsBarReject( + donCloseLowerBuffer[cIDX], + X_DIRECTION_BULLISH, + cBar // + ); + + // + bool isBreakedDonOpenUpper = IsBarBreak( + donOpenUpperBuffer[cIDX], + X_DIRECTION_BEARISH, + cBar // + ); + bool isBreakedDonHighUpper = IsBarBreak( + donHighUpperBuffer[cIDX], + X_DIRECTION_BEARISH, + cBar // + ); + bool isBreakedDonLowUpper = IsBarBreak( + donLowUpperBuffer[cIDX], + X_DIRECTION_BEARISH, + cBar // + ); + bool isBreakedDonCloseUpper = IsBarBreak( + donCloseUpperBuffer[cIDX], + X_DIRECTION_BEARISH, + cBar // + ); + + // + bool isBreakedDonOpenLower = IsBarBreak( + donOpenLowerBuffer[cIDX], + X_DIRECTION_BULLISH, + cBar // + ); + bool isBreakedDonHighLower = IsBarBreak( + donHighLowerBuffer[cIDX], + X_DIRECTION_BULLISH, + cBar // + ); + bool isBreakedDonLowLower = IsBarBreak( + donLowLowerBuffer[cIDX], + X_DIRECTION_BULLISH, + cBar // + ); + bool isBreakedDonCloseLower = IsBarBreak( + donCloseLowerBuffer[cIDX], + X_DIRECTION_BULLISH, + cBar // + ); + + // + conditions.isBreakedDonLowUpper = isBreakedDonLowUpper; + conditions.isBreakedDonLowLower = isBreakedDonLowLower; + conditions.isRejectedDonLowUpper = isRejectedDonLowUpper; + conditions.isRejectedDonLowLower = isRejectedDonLowLower; + conditions.isBreakedDonOpenUpper = isBreakedDonOpenUpper; + conditions.isBreakedDonHighUpper = isBreakedDonHighUpper; + conditions.isBreakedDonOpenLower = isBreakedDonOpenLower; + conditions.isBreakedDonHighLower = isBreakedDonHighLower; + conditions.isRejectedDonOpenUpper = isRejectedDonOpenUpper; + conditions.isRejectedDonOpenLower = isRejectedDonOpenLower; + conditions.isRejectedDonHighUpper = isRejectedDonHighUpper; + conditions.isRejectedDonHighLower = isRejectedDonHighLower; + conditions.isBreakedDonCloseUpper = isBreakedDonCloseUpper; + conditions.isBreakedDonCloseLower = isBreakedDonCloseLower; + conditions.isRejectedDonCloseUpper = isRejectedDonCloseUpper; + conditions.isRejectedDonCloseLower = isRejectedDonCloseLower; + + // + Cleanup(); + + // + zBar.Clean(); + cBar.Clean(); + pBar.Clean(); + + // + return result; + } + + // + // Protected ... + protected: + // + // Private ... + private: + // + // Props ... + X121XDONInputs mInputs; // Inputs ... + + // + // Buffers ... + double donOpenUpperBuffer[]; + double donOpenLowerBuffer[]; + double donHighUpperBuffer[]; + double donHighLowerBuffer[]; + double donLowUpperBuffer[]; + double donLowLowerBuffer[]; + double donCloseUpperBuffer[]; + double donCloseLowerBuffer[]; + + // + void Calculate( + int maxRequiredBars = 100 // + ) + { + // + // Upper ... + CopyBuffer( + mHandler, + X121_XDON_OPEN_UPPER_LINE, + 0, + maxRequiredBars, + donOpenUpperBuffer + // + ); + + // + // Lower ... + CopyBuffer( + mHandler, + X121_XDON_OPEN_LOWER_LINE, + 0, + maxRequiredBars, + donOpenLowerBuffer + // + ); + + // + // CLOSE ... + + // + // Upper ... + CopyBuffer( + mHandler, + X121_XDON_CLOSE_UPPER_LINE, + 0, + maxRequiredBars, + donCloseUpperBuffer + // + ); + + // + // Lower ... + CopyBuffer( + mHandler, + X121_XDON_CLOSE_LOWER_LINE, + 0, + maxRequiredBars, + donCloseLowerBuffer + // + ); + + // + // HIGH ... + + // + // Upper ... + CopyBuffer( + mHandler, + X121_XDON_HIGH_UPPER_LINE, + 0, + maxRequiredBars, + donHighUpperBuffer + // + ); + + // + // Lower ... + CopyBuffer( + mHandler, + X121_XDON_HIGH_LOWER_LINE, + 0, + maxRequiredBars, + donHighLowerBuffer + // + ); + + // + // LOW ... + + // + // Upper ... + CopyBuffer( + mHandler, + X121_XDON_LOW_UPPER_LINE, + 0, + maxRequiredBars, + donLowUpperBuffer + // + ); + + // + // Lower ... + CopyBuffer( + mHandler, + X121_XDON_LOW_LOWER_LINE, + 0, + maxRequiredBars, + donLowLowerBuffer + // + ); + } + + // + void Cleanup( + int maxAllowed = 100 // + ) + { + // + CleanupArray( + donOpenUpperBuffer, + maxAllowed // + ); + + // + CleanupArray( + donOpenLowerBuffer, + maxAllowed // + ); + + // + CleanupArray( + donHighUpperBuffer, + maxAllowed // + ); + + // + CleanupArray( + donHighLowerBuffer, + maxAllowed // + ); + + // + CleanupArray( + donLowUpperBuffer, + maxAllowed // + ); + + // + CleanupArray( + donLowLowerBuffer, + maxAllowed // + ); + + // + CleanupArray( + donCloseUpperBuffer, + maxAllowed // + ); + + // + CleanupArray( + donCloseLowerBuffer, + maxAllowed // + ); + + // + } + + // +}; + +// +// Tools ... \ No newline at end of file diff --git a/BKPS/14031206/Helpers/x-saherelm.x121.xhk.helper.ex5 b/BKPS/14031206/Helpers/x-saherelm.x121.xhk.helper.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..7d763af0dbba339ff336e4219bfca32f0290bbc0 GIT binary patch literal 6334 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 count) + { + barIndex = count - 1; + } + + // + return xhkRawOpenBuffer[barIndex]; + } + + // + int CopyRawHKOpen( + int start, // Start + int count, // Number of Items for read + double &buffer[], // Dest Buffer + bool forceClean = true // Force To Clean buffer + ) + { + // + // Update Calculations ... + Calculate(); + + // + // Copy Items ... + return Copy( + start, + count, + xhkRawOpenBuffer, + buffer, + forceClean + // + ); + } + + // + double GetRawHKHigh( + int barIndex // Bar Index + ) + { + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + Calculate(); + + // + int count = ArraySize(xhkRawHighBuffer); + if (barIndex >= count) + { + barIndex = count - 1; + } + + // + return xhkRawHighBuffer[barIndex]; + } + + // + int CopyRawHKHigh( + int start, // Start + int count, // Number of Items for read + double &buffer[], // Dest Buffer + bool forceClean = true // Force To Clean buffer + ) + { + // + // Update Calculations ... + Calculate(); + + // + // Copy Items ... + return Copy( + start, + count, + xhkRawHighBuffer, + buffer, + forceClean + // + ); + } + + // + double GetRawHKLow( + int barIndex // Bar Index + ) + { + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + Calculate(); + + // + int count = ArraySize(xhkRawLowBuffer); + if (barIndex >= count) + { + barIndex = count - 1; + } + + // + return xhkRawLowBuffer[barIndex]; + } + + // + int CopyRawHKLow( + int start, // Start + int count, // Number of Items for read + double &buffer[], // Dest Buffer + bool forceClean = true // Force To Clean buffer + ) + { + // + // Update Calculations ... + Calculate(); + + // + // Copy Items ... + return Copy( + start, + count, + xhkRawLowBuffer, + buffer, + forceClean + // + ); + } + + // + double GetRawHKClose( + int barIndex // Bar Index + ) + { + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + Calculate(); + + // + int count = ArraySize(xhkRawCloseBuffer); + if (barIndex >= count) + { + barIndex = count - 1; + } + + // + return xhkRawCloseBuffer[barIndex]; + } + + // + int CopyRawHKClose( + int start, // Start + int count, // Number of Items for read + double &buffer[], // Dest Buffer + bool forceClean = true // Force To Clean buffer + ) + { + // + // Update Calculations ... + Calculate(); + + // + // Copy Items ... + return Copy( + start, + count, + xhkRawCloseBuffer, + buffer, + forceClean + // + ); + } + + // + double GetSMHKOpen( + int barIndex // Bar Index + ) + { + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + Calculate(); + + // + int count = ArraySize(xhkSMOpenBuffer); + if (barIndex >= count) + { + barIndex = count - 1; + } + + // + return xhkSMOpenBuffer[barIndex]; + } + + // + int CopySMHKOpen( + int start, // Start + int count, // Number of Items for read + double &buffer[], // Dest Buffer + bool forceClean = true // Force To Clean buffer + ) + { + // + // Update Calculations ... + Calculate(); + + // + // Copy Items ... + return Copy( + start, + count, + xhkSMOpenBuffer, + buffer, + forceClean + // + ); + } + + // + double GetSMHKHigh( + int barIndex // Bar Index + ) + { + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + Calculate(); + + // + int count = ArraySize(xhkSMHighBuffer); + if (barIndex >= count) + { + barIndex = count - 1; + } + + // + return xhkSMHighBuffer[barIndex]; + } + + // + int CopySMHKHigh( + int start, // Start + int count, // Number of Items for read + double &buffer[], // Dest Buffer + bool forceClean = true // Force To Clean buffer + ) + { + // + // Update Calculations ... + Calculate(); + + // + // Copy Items ... + return Copy( + start, + count, + xhkSMHighBuffer, + buffer, + forceClean + // + ); + } + + // + double GetSMHKLow( + int barIndex // Bar Index + ) + { + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + Calculate(); + + // + int count = ArraySize(xhkSMLowBuffer); + if (barIndex >= count) + { + barIndex = count - 1; + } + + // + return xhkSMLowBuffer[barIndex]; + } + + // + int CopySMHKLow( + int start, // Start + int count, // Number of Items for read + double &buffer[], // Dest Buffer + bool forceClean = true // Force To Clean buffer + ) + { + // + // Update Calculations ... + Calculate(); + + // + // Copy Items ... + return Copy( + start, + count, + xhkSMLowBuffer, + buffer, + forceClean + // + ); + } + + // + double GetSMHKClose( + int barIndex // Bar Index + ) + { + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + Calculate(); + + // + int count = ArraySize(xhkSMCloseBuffer); + if (barIndex >= count) + { + barIndex = count - 1; + } + + // + return xhkSMCloseBuffer[barIndex]; + } + + // + int CopySMHKClose( + int start, // Start + int count, // Number of Items for read + double &buffer[], // Dest Buffer + bool forceClean = true // Force To Clean buffer + ) + { + // + // Update Calculations ... + Calculate(); + + // + // Copy Items ... + return Copy( + start, + count, + xhkSMCloseBuffer, + buffer, + forceClean + // + ); + } + + // + bool GetRawHKAsXOHCL( + int barIndex, // Bar Index + XOHCL &bar // Bar Result + ) + { + // + bool result = false; + + // + bar.Clean(); + + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + result = bar.Init( + GetSymbol(), + GetPeriod(), + barIndex // + ); + if (!result) + { + return result; + } + + // + bar.open = xhkRawOpenBuffer[barIndex]; + bar.high = xhkRawHighBuffer[barIndex]; + bar.low = xhkRawLowBuffer[barIndex]; + bar.close = xhkRawCloseBuffer[barIndex]; + + // + return result; + } + + // + bool GetSMHKAsXOHCL( + int barIndex, // Bar Index + XOHCL &bar // Bar Result + ) + { + // + bool result = false; + + // + bar.Clean(); + + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + result = bar.Init( + GetSymbol(), + GetPeriod(), + barIndex // + ); + if (!result) + { + return result; + } + + // + bar.open = xhkSMOpenBuffer[barIndex]; + bar.high = xhkSMHighBuffer[barIndex]; + bar.low = xhkSMLowBuffer[barIndex]; + bar.close = xhkSMCloseBuffer[barIndex]; + + // + return result; + } + + // + void Free() override + { + Cleanup(10); + } + + // + bool GetConditions( + X121XHKConditions &conditions, // + int barIndex = 0, // + int loopback = 5 // + ) + { + // + bool result = true; + + // + if (loopback < 5) + { + loopback = 5; + } + + // + conditions.Clean(); + + // + conditions.symbol = mSymbol; + conditions.period = mPeriod; + conditions.time = TimeCurrent(); + + // + int zIndex = barIndex; + int cIndex = zIndex + 1; + int pIndex = cIndex + 1; + int ppIndex = pIndex + 1; + + // + XOHCL zBar; + result = zBar.Init( + mSymbol, + mPeriod, + zIndex // + ); + if (!result) + { + return result; + } + + // + XOHCL cBar; + result = cBar.Init( + mSymbol, + mPeriod, + cIndex // + ); + if (!result) + { + return result; + } + + // + XOHCL pBar; + result = pBar.Init( + mSymbol, + mPeriod, + pIndex // + ); + if (!result) + { + return result; + } + + // + // Buffers ... + + // + CopyRawHKOpen( + zIndex, + loopback, + conditions.xhkRawOpenBuffer // + ); + + // + CopyRawHKHigh( + zIndex, + loopback, + conditions.xhkRawHighBuffer // + ); + + // + CopyRawHKLow( + zIndex, + loopback, + conditions.xhkRawLowBuffer // + ); + + // + CopyRawHKClose( + zIndex, + loopback, + conditions.xhkRawCloseBuffer // + ); + + // + CopySMHKOpen( + zIndex, + loopback, + conditions.xhkSMOpenBuffer // + ); + + // + CopySMHKHigh( + zIndex, + loopback, + conditions.xhkSMHighBuffer // + ); + + // + CopySMHKLow( + zIndex, + loopback, + conditions.xhkSMLowBuffer // + ); + + // + CopySMHKClose( + zIndex, + loopback, + conditions.xhkSMCloseBuffer // + ); + + // + // Conditions ... + + // + int cIDX = 1; + int pIDX = cIDX + 1; + + // + double smHKLow = conditions.xhkSMLowBuffer[cIDX]; + double smHKHigh = conditions.xhkSMHighBuffer[cIDX]; + double smHKOpen = conditions.xhkSMOpenBuffer[cIDX]; + double smHKClose = conditions.xhkSMCloseBuffer[cIDX]; + + // + double smHKLowPrev = conditions.xhkSMLowBuffer[pIDX]; + double smHKHighPrev = conditions.xhkSMHighBuffer[pIDX]; + double smHKOpenPrev = conditions.xhkSMOpenBuffer[pIDX]; + double smHKClosePrev = conditions.xhkSMCloseBuffer[pIDX]; + + // + double rawHKLow = conditions.xhkRawLowBuffer[cIDX]; + double rawHKHigh = conditions.xhkRawHighBuffer[cIDX]; + double rawHKOpen = conditions.xhkRawOpenBuffer[cIDX]; + double rawHKClose = conditions.xhkRawCloseBuffer[cIDX]; + + // + double rawHKLowPrev = conditions.xhkRawLowBuffer[pIDX]; + double rawHKHighPrev = conditions.xhkRawHighBuffer[pIDX]; + double rawHKOpenPrev = conditions.xhkRawOpenBuffer[pIDX]; + double rawHKClosePrev = conditions.xhkRawCloseBuffer[pIDX]; + + // + double smHKUp = MathMax(smHKOpen, smHKClose); + double smHKUpPrev = MathMax(smHKOpenPrev, smHKClosePrev); + + // + double smHKDown = MathMin(smHKOpen, smHKClose); + double smHKDownPrev = MathMin(smHKOpenPrev, smHKClosePrev); + + // + double rawHKUp = MathMax(rawHKOpen, rawHKClose); + double rawHKUpPrev = MathMax(rawHKOpenPrev, rawHKClosePrev); + + // + double rawHKDown = MathMin(rawHKOpen, rawHKClose); + double rawHKDownPrev = MathMin(rawHKOpenPrev, rawHKClosePrev); + + // + XOHCL rawHKCBar; + bool hasRawHKBar = GetRawHKAsXOHCL( + cIndex, + rawHKCBar // + ); + + // + // + // + + // + bool isSMHKBullish = smHKOpen < smHKClose; + bool isSMHKBullishPrev = smHKOpenPrev < smHKClosePrev; + + // + bool isRawHKBullish = rawHKOpen < rawHKClose; + bool isRawHKBullishPrev = rawHKOpenPrev < rawHKClosePrev; + + // + bool isSMHKSwitchedToBullish = isSMHKBullish && + !isSMHKBullishPrev; + bool isRawHKSwitchedToBullish = isRawHKBullish && + !isRawHKBullishPrev; + + // + bool isSMHKBearish = smHKOpen > smHKClose; + bool isSMHKBearishPrev = smHKOpenPrev > smHKClosePrev; + + // + bool isRawHKBearish = rawHKOpen > rawHKClose; + bool isRawHKBearishPrev = rawHKOpenPrev > rawHKClosePrev; + + // + bool isSMHKSwitchedToBearish = isSMHKBearish && + !isSMHKBearishPrev; + bool isRawHKSwitchedToBearish = isRawHKBearish && + !isRawHKBearishPrev; + + // + bool isClosedOverSMHK = cBar.close > smHKUp; + bool isClosedUnderSMHK = cBar.close < smHKDown; + + // + bool isClosedOverRawHK = cBar.close > rawHKUp; + bool isClosedUnderRawHK = cBar.close < rawHKDown; + + // + bool isRawHKClosedOverSMHK = rawHKClose > smHKUp; + bool isRawHKClosedUnderSMHK = rawHKClose < smHKDown; + + // + bool isBreakedUpSMHK = IsBarBreak( + smHKUp, + X_DIRECTION_BULLISH, + cBar // + ); + bool isBreakedUpRawHK = IsBarBreak( + rawHKUp, + X_DIRECTION_BULLISH, + cBar // + ); + bool isRejectedUpSMHK = IsBarReject( + smHKUp, + X_DIRECTION_BULLISH, + cBar // + ); + bool isRejectedUpRawHK = IsBarReject( + rawHKUp, + X_DIRECTION_BULLISH, + cBar // + ); + + // + bool isRawHKBreakedUpSMHK = + hasRawHKBar && + IsBarBreak( + smHKUp, + X_DIRECTION_BULLISH, + rawHKCBar // + ); + + // + bool isBreakedDownSMHK = IsBarBreak( + smHKDown, + X_DIRECTION_BEARISH, + cBar // + ); + bool isBreakedDownRawHK = IsBarBreak( + rawHKDown, + X_DIRECTION_BEARISH, + cBar // + ); + bool isRejectedDownSMHK = IsBarReject( + smHKDown, + X_DIRECTION_BEARISH, + cBar // + ); + bool isRejectedDownRawHK = IsBarReject( + rawHKDown, + X_DIRECTION_BEARISH, + cBar // + ); + + // + bool isRawHKBreakedDownSMHK = + hasRawHKBar && + IsBarBreak( + smHKDown, + X_DIRECTION_BEARISH, + rawHKCBar // + ); + + // + conditions.isSMHKBullish = isSMHKBullish; + conditions.isRawHKBullish = isRawHKBullish; + conditions.isSMHKSwitchedToBullish = isSMHKSwitchedToBullish; + conditions.isRawHKSwitchedToBullish = isRawHKSwitchedToBullish; + conditions.isSMHKBearish = isSMHKBearish; + conditions.isRawHKBearish = isRawHKBearish; + conditions.isSMHKSwitchedToBearish = isSMHKSwitchedToBearish; + conditions.isRawHKSwitchedToBearish = isRawHKSwitchedToBearish; + conditions.isClosedOverSMHK = isClosedOverSMHK; + conditions.isClosedUnderSMHK = isClosedUnderSMHK; + conditions.isClosedOverRawHK = isClosedOverRawHK; + conditions.isClosedUnderRawHK = isClosedUnderRawHK; + conditions.isRawHKClosedOverSMHK = isRawHKClosedOverSMHK; + conditions.isRawHKClosedUnderSMHK = isRawHKClosedUnderSMHK; + conditions.isBreakedUpSMHK = isBreakedUpSMHK; + conditions.isBreakedUpRawHK = isBreakedUpRawHK; + conditions.isRejectedUpSMHK = isRejectedUpSMHK; + conditions.isRejectedUpRawHK = isRejectedUpRawHK; + conditions.isRawHKBreakedUpSMHK = isRawHKBreakedUpSMHK; + conditions.isBreakedDownSMHK = isBreakedDownSMHK; + conditions.isBreakedDownRawHK = isBreakedDownRawHK; + conditions.isRejectedDownSMHK = isRejectedDownSMHK; + conditions.isRejectedDownRawHK = isRejectedDownRawHK; + conditions.isRawHKBreakedDownSMHK = isRawHKBreakedDownSMHK; + + // + Cleanup(); + + // + zBar.Clean(); + cBar.Clean(); + pBar.Clean(); + + // + rawHKCBar.Clean(); + + // + return result; + } + + // + // Protected ... + protected: + // + // Private ... + private: + // + // Props ... + X121XHKInputs mInputs; // Inputs ... + + // + // Buffers ... + double xhkRawOpenBuffer[]; + double xhkRawHighBuffer[]; + double xhkRawLowBuffer[]; + double xhkRawCloseBuffer[]; + double xhkSMOpenBuffer[]; + double xhkSMHighBuffer[]; + double xhkSMLowBuffer[]; + double xhkSMCloseBuffer[]; + + // + void Calculate( + int maxRequiredBars = 100 // + ) + { + // + // Buffers ... + + // + // RAW Open ... + CopyBuffer( + mHandler, + X121_XHK_RAW_OPEN_LINE, + 0, + maxRequiredBars, + xhkRawOpenBuffer + // + ); + + // + // RAW High ... + CopyBuffer( + mHandler, + X121_XHK_RAW_HIGH_LINE, + 0, + maxRequiredBars, + xhkRawHighBuffer + // + ); + + // + // RAW Low ... + CopyBuffer( + mHandler, + X121_XHK_RAW_LOW_LINE, + 0, + maxRequiredBars, + xhkRawLowBuffer + // + ); + + // + // RAW Close ... + CopyBuffer( + mHandler, + X121_XHK_RAW_CLOSE_LINE, + 0, + maxRequiredBars, + xhkRawCloseBuffer + // + ); + + // + // SM Open ... + CopyBuffer( + mHandler, + X121_XHK_SM_OPEN_LINE, + 0, + maxRequiredBars, + xhkSMOpenBuffer + // + ); + + // + // SM High ... + CopyBuffer( + mHandler, + X121_XHK_SM_HIGH_LINE, + 0, + maxRequiredBars, + xhkSMHighBuffer + // + ); + + // + // SM Low ... + CopyBuffer( + mHandler, + X121_XHK_SM_LOW_LINE, + 0, + maxRequiredBars, + xhkSMLowBuffer + // + ); + + // + // SM Close ... + CopyBuffer( + mHandler, + X121_XHK_SM_CLOSE_LINE, + 0, + maxRequiredBars, + xhkSMCloseBuffer + // + ); + } + + // + void Cleanup( + int maxAllowed = 100 // + ) + { + // + CleanupArray( + xhkRawOpenBuffer, + maxAllowed // + ); + + // + CleanupArray( + xhkRawHighBuffer, + maxAllowed // + ); + + // + CleanupArray( + xhkRawLowBuffer, + maxAllowed // + ); + + // + CleanupArray( + xhkRawCloseBuffer, + maxAllowed // + ); + + // + CleanupArray( + xhkSMOpenBuffer, + maxAllowed // + ); + + // + CleanupArray( + xhkSMHighBuffer, + maxAllowed // + ); + + // + CleanupArray( + xhkSMLowBuffer, + maxAllowed // + ); + + // + CleanupArray( + xhkSMCloseBuffer, + maxAllowed // + ); + + // + } + + // +}; + +// +// Tools ... \ No newline at end of file diff --git a/BKPS/14031206/Helpers/x-saherelm.x121.xpv.helper.ex5 b/BKPS/14031206/Helpers/x-saherelm.x121.xpv.helper.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..aba4bb393d65136ca0e19dc63b72f0dc9760f3d0 GIT binary patch literal 6604 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 literal 0 HcmV?d00001 diff --git a/BKPS/14031206/Helpers/x-saherelm.x121.xpv.helper.mq5 b/BKPS/14031206/Helpers/x-saherelm.x121.xpv.helper.mq5 new file mode 100644 index 0000000..8f5addd --- /dev/null +++ b/BKPS/14031206/Helpers/x-saherelm.x121.xpv.helper.mq5 @@ -0,0 +1,2377 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 Helper Class Library +// ---------------------------------------------- +// Name: XCX121XPVHelper +// Description: provides all Indicator +// Helper requirements ... +// +// +// Maintainer: +// ------------ +// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) +// +////////////////////////////////////////////////////// +// +// Global Properties ... +#property library +#property copyright "Copyright 2023, SaherElm IT Center" +#property link "https://www.saherelm.ir" +#property version "1.00" +#property strict + +// +// Imports ... +#include "../Classes/x-saherelm.x-helper.class.mq5" + +// +// Definitions ... + +// +// Definitions ... +enum ENUM_X121_XPV_BUFFERS +{ + // + X121_XPV_PEAK_LINE = 0, + X121_XPV_VALE_LINE = 1, + X121_XPV_SAR_LINE = 2, + X121_XPV_C_HH_LINE = 3, + X121_XPV_C_LL_LINE = 4, + X121_XPV_S_HH_LINE = 5, + X121_XPV_S_LL_LINE = 6, + X121_XPV_M_HH_LINE = 7, + X121_XPV_M_LL_LINE = 8, + X121_XPV_L_HH_LINE = 9, + X121_XPV_L_LL_LINE = 10, + X121_XPV_H_HH_LINE = 11, + X121_XPV_H_LL_LINE = 12, +}; + +// +// Input Models ... +struct X121XPVInputs +{ + // + // Props ... + + // + // Short ... + ENUM_X_PERIOD_METHOD scMethod; // How to Find Period + ENUM_TIMEFRAMES scPeriod; // Time Period + + // + // Medium ... + ENUM_X_PERIOD_METHOD mcMethod; // How to Find Period + ENUM_TIMEFRAMES mcPeriod; // Time Period + + // + // Long ... + ENUM_X_PERIOD_METHOD lcMethod; // How to Find Period + ENUM_TIMEFRAMES lcPeriod; // Time Period + + // + // Hind ... + ENUM_X_PERIOD_METHOD hcMethod; // How to Find Period + ENUM_TIMEFRAMES hcPeriod; // Time Period + + // + // Boundary Detection ... + ENUM_SERIESMODE hhMode; // Highest High Calculation Method + ENUM_SERIESMODE llMode; // Lowest Low Calculation Method + + // + // Parabolic Sar Detection ... + double sarStep; // Step + double sarMax; // Maximum + + // + int startCalculationForLastBars; // Calculate Last n Bars + + // + int sarArrowCode; // Parabolic Sar Arrow Code + int peaksArrowCode; // Peaks Arrow Code + int valesArrowCode; // Vales Arrow Code + + // + bool showSar; // Show Parabolic Sar + bool showPeaks; // Show Peaks + bool showVales; // Show Vales + + // + // Constructor(s) ... + X121XPVInputs() + { + // + Clean(); + } + + // + // Tools ... + + // + // Clean ... + void Clean() + { + // + // Short ... + scMethod = X_PERIOD_NOTHING; + scPeriod = NULL; + + // + // Medium ... + mcMethod = X_PERIOD_NOTHING; + mcPeriod = NULL; + + // + // Long ... + lcMethod = X_PERIOD_NOTHING; + lcPeriod = NULL; + + // + // Hind ... + hcMethod = X_PERIOD_NOTHING; + hcPeriod = NULL; + + // + // Boundary Detection ... + hhMode = MODE_HIGH; + llMode = MODE_LOW; + + // + sarStep = 0; + sarMax = 0; + + // + startCalculationForLastBars = 0; + + // + sarArrowCode = 0; + peaksArrowCode = 0; + valesArrowCode = 0; + + // + showSar = false; + showPeaks = false; + showVales = false; + + // + ZeroMemory(this); + } + + // + // Default ... + void Default() + { + // + // Short ... + scMethod = X_PERIOD_AUTO; + scPeriod = NULL; + + // + // Medium ... + mcMethod = X_PERIOD_AUTO; + mcPeriod = NULL; + + // + // Long ... + lcMethod = X_PERIOD_AUTO; + lcPeriod = NULL; + + // + // Hind ... + hcMethod = X_PERIOD_AUTO; + hcPeriod = NULL; + + // + // Boundary Detection ... + hhMode = MODE_HIGH; + llMode = MODE_LOW; + + // + sarStep = 0.02; + sarMax = 0.2; + + // + startCalculationForLastBars = 1000; + + // + sarArrowCode = 159; + peaksArrowCode = 159; + valesArrowCode = 159; + + // + showSar = true; + showPeaks = true; + showVales = true; + } + + // + // Validate ... + bool IsValid() + { + // + bool result = false; + + // + result = + // + // SAR ... + sarMax > 0 && + sarStep > 0 && + sarMax > sarStep && + // + // XPV ... + (IsValid(scMethod, scPeriod) && + IsValid(mcMethod, mcPeriod) && + IsValid(lcMethod, lcPeriod) && + IsValid(hcMethod, hcPeriod)) + // + ; + + // + return result; + } + + // + // Retrieve MAx Length ... + int Max() + { + // + int result = 0; + + // + result = MathMax(1, 1); + + // + return result; + } +}; + +// +// Conditions ... +struct X121XPVConditions +{ + // + // Common ... + string symbol; + ENUM_TIMEFRAMES period; + datetime time; + + // + // Buffers ... + double peaksBuffer[]; + double valesBuffer[]; + double sarBuffer[]; + double cHHBuffer[]; + double cLLBuffer[]; + double sHHBuffer[]; + double sLLBuffer[]; + double mHHBuffer[]; + double mLLBuffer[]; + double lHHBuffer[]; + double lLLBuffer[]; + double hHHBuffer[]; + double hLLBuffer[]; + + // + // Conditions ... + + // + // SAR ... + + // + bool isSarBullish; + bool isSarBearish; + + // + bool isSarSwitchedToBullish; + bool isSarSwitchedToBearish; + + // + // XPV ... + + // + bool isNewPeak; + bool isNewPeakOverLast; + bool isNewPeakUnderLast; + bool isRejectedPrevPeak; + bool isBreakedUpPrevPeak; + + // + bool isNewVale; + bool isNewValeOverLast; + bool isNewValeUnderLast; + bool isRejectedPrevVale; + bool isBreakedDownPrevVale; + + // + // Constructor ... + X121XPVConditions() + { + Clean(); + } + + // + // Tools ... + + /** + * Cleaning Up ... + */ + void Clean() + { + // + // Commons ... + symbol = NULL; + period = NULL; + time = NULL; + + // + // Buffers ... + + // + Clean(peaksBuffer); + Clean(valesBuffer); + Clean(sarBuffer); + Clean(cHHBuffer); + Clean(cLLBuffer); + Clean(sHHBuffer); + Clean(sLLBuffer); + Clean(mHHBuffer); + Clean(mLLBuffer); + Clean(lHHBuffer); + Clean(lLLBuffer); + Clean(hHHBuffer); + Clean(hLLBuffer); + + // + // Clean(bullishTrendBuffer); + // Clean(bearishTrendBuffer); + + // + ArraySetAsSeries(peaksBuffer, true); + ArraySetAsSeries(valesBuffer, true); + ArraySetAsSeries(sarBuffer, true); + ArraySetAsSeries(cHHBuffer, true); + ArraySetAsSeries(cLLBuffer, true); + ArraySetAsSeries(sHHBuffer, true); + ArraySetAsSeries(sLLBuffer, true); + ArraySetAsSeries(mHHBuffer, true); + ArraySetAsSeries(mLLBuffer, true); + ArraySetAsSeries(lHHBuffer, true); + ArraySetAsSeries(lLLBuffer, true); + ArraySetAsSeries(hHHBuffer, true); + ArraySetAsSeries(hLLBuffer, true); + + // + // Conditions ... + + // + isSarBullish = false; + isSarBearish = false; + + // + isSarSwitchedToBullish = false; + isSarSwitchedToBearish = false; + + // + isNewPeak = false; + isNewPeakOverLast = false; + isNewPeakUnderLast = false; + isRejectedPrevPeak = false; + isBreakedUpPrevPeak = false; + // + isNewVale = false; + isNewValeOverLast = false; + isNewValeUnderLast = false; + isRejectedPrevVale = false; + isBreakedDownPrevVale = false; + + // + ZeroMemory(this); + } + + /** + * Generate Conditions Scores ... + * + * @param bullishScore: Double, Directional Scores Reference ... + * @param bearishScore: Double, Directional Scores Reference ... + */ + void GenerateScore( + double &bullishScore, + double &bearishScore // + ) + { + // + bullishScore = 0; + bearishScore = 0; + + // + // TODO: Implement if Required ... + } + + /** + * Generate Summary String for Represent Conditions State ... + * + * @param onlyCommons: Boolean, Just Generate Only Commons Conditions ... + * @param onlyConditions: Boolean, Just Generate Only Conditions ... + * @param includeScores: Boolean, Attach Scores Representations on Result ... + * @param ignoreFalseConditions: Boolean, Ignore False Conditions on Result ... + * @param separator: String, Separate Lines ... + * + * @return ( string ) + */ + string GenerateSummary( + bool onlyCommons = false, + bool onlyConditions = false, + bool includeScores = true, + bool ignoreFalseConditions = true, + string separator = "\n" // + ) + { + // + string result = NULL; + + // + double bullishScore = 0; + double bearishScore = 0; + GenerateScore( + bullishScore, + bearishScore // + ); + + // + string scoresStr = + // + "Scores: " + separator + + "---------------" + separator + + "Bullish: " + ToString(bullishScore) + separator + + "Bearish: " + ToString(bearishScore) + separator + + "" + // + ; + + // + string commonStr = GenerateSpecifiedCommonSummary( + this, + separator, + includeScores // + ); + + // + string conditionsStr = + // + ToString("isSarBullish", isSarBullish, ignoreFalseConditions, separator) + + ToString("isSarBearish", isSarBearish, ignoreFalseConditions, separator) + + ToString("isSarSwitchedToBullish", isSarSwitchedToBullish, ignoreFalseConditions, separator) + + ToString("isSarSwitchedToBearish", isSarSwitchedToBearish, ignoreFalseConditions, separator) + + ToString("isNewPeak", isNewPeak, ignoreFalseConditions, separator) + + ToString("isNewPeakOverLast", isNewPeakOverLast, ignoreFalseConditions, separator) + + ToString("isNewPeakUnderLast", isNewPeakUnderLast, ignoreFalseConditions, separator) + + ToString("isRejectedPrevPeak", isRejectedPrevPeak, ignoreFalseConditions, separator) + + ToString("isBreakedUpPrevPeak", isBreakedUpPrevPeak, ignoreFalseConditions, separator) + + ToString("isNewVale", isNewVale, ignoreFalseConditions, separator) + + ToString("isNewValeOverLast", isNewValeOverLast, ignoreFalseConditions, separator) + + ToString("isNewValeUnderLast", isNewValeUnderLast, ignoreFalseConditions, separator) + + ToString("isRejectedPrevVale", isRejectedPrevVale, ignoreFalseConditions, separator) + + ToString("isBreakedDownPrevVale", isBreakedDownPrevVale, ignoreFalseConditions, separator) + + // + "" + // + ; + + // + result = + // + "[" + GetTag() + "]" + separator + + (onlyConditions + ? "" + : commonStr) + + (!includeScores + ? "" + : scoresStr) + + " " + separator + + (onlyCommons + ? "" + : conditionsStr) + + "" + // + ; + + // + return result; + } + + /** + * Retrieve nique Tag Identifier ... + * + * @return ( string ) + */ + string GetTag() + { + return GetTypeName(this); + } + + // +}; + +// +// Class ... +class XCX121XPVHelper : public XCBaseHelper +{ + // + // Public ... + public: + // + // Props ... + + // + // Constructors ... + XCX121XPVHelper() + : XCBaseHelper(_Symbol, _Period) + { + } + + // + // Deconstructor ... + ~XCX121XPVHelper() + { + // + mInputs.Clean(); + + // + Clean(peaksBuffer); + Clean(valesBuffer); + Clean(sarBuffer); + Clean(cHHBuffer); + Clean(cLLBuffer); + Clean(sHHBuffer); + Clean(sLLBuffer); + Clean(mHHBuffer); + Clean(mLLBuffer); + Clean(lHHBuffer); + Clean(lLLBuffer); + Clean(hHHBuffer); + Clean(hLLBuffer); + } + + // + // Tools ... + bool Init( + string symbol, // Trading Symbol + ENUM_TIMEFRAMES period, // Trading Period + X121XPVInputs &inputs // Inputs + ) + { + // + bool result = false; + + // + mSymbol = symbol; + mPeriod = period; + + // + result = inputs.IsValid(); + if (!result) + { + return result; + } + + // + ArraySetAsSeries(peaksBuffer, true); + ArraySetAsSeries(valesBuffer, true); + ArraySetAsSeries(sarBuffer, true); + ArraySetAsSeries(cHHBuffer, true); + ArraySetAsSeries(cLLBuffer, true); + ArraySetAsSeries(sHHBuffer, true); + ArraySetAsSeries(sLLBuffer, true); + ArraySetAsSeries(mHHBuffer, true); + ArraySetAsSeries(mLLBuffer, true); + ArraySetAsSeries(lHHBuffer, true); + ArraySetAsSeries(lLLBuffer, true); + ArraySetAsSeries(hHHBuffer, true); + ArraySetAsSeries(hLLBuffer, true); + + // + mInputs = inputs; + + // + mHandler = iCustom( + mSymbol, + mPeriod, + "x-saherelm.x121.xpv", + // + // Inputs ... + // + // Market ... + "", + // + // Short ... + "", + mInputs.scMethod, + mInputs.scPeriod, + // + // Medium ... + "", + mInputs.mcMethod, + mInputs.mcPeriod, + // + // Long ... + "", + mInputs.lcMethod, + mInputs.lcPeriod, + // + // Hind ... + "", + mInputs.hcMethod, + mInputs.hcPeriod, + // + // Boundary Detection ... + "", + mInputs.hhMode, + mInputs.llMode, + // + // SAr Detection ... + "", + mInputs.sarStep, + mInputs.sarMax, + // + // Presentation ... + "", + // + mInputs.startCalculationForLastBars, + mInputs.sarArrowCode, + mInputs.peaksArrowCode, + mInputs.valesArrowCode, + // + mInputs.showSar, + mInputs.showPeaks, + mInputs.showVales + // + ); + result = mHandler != INVALID_HANDLE; + if (!result) + { + return result; + } + + // + return result; + } + + // + // Inputs ... + + // + X121XPVInputs GetInputs() + { + return mInputs; + } + + // + bool SetInputs( + X121XPVInputs &inputs // Configs + ) + { + // + return Init( + mSymbol, + mPeriod, + inputs + // + ); + } + + // + // Readers ... + + // + // SAR ... + + // + double GetSar( + int barIndex // Bar Index + ) + { + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + Calculate(); + + // + int count = ArraySize(sarBuffer); + if (barIndex >= count) + { + barIndex = count - 1; + } + + // + return sarBuffer[barIndex]; + } + + // + int CopySar( + int start, // Start + int count, // Number of Items for read + double &buffer[], // Dest Buffer + bool forceClean = true // Force To Clean buffer + ) + { + // + // Update Calculations ... + Calculate(); + + // + // Copy Items ... + return Copy( + start, + count, + sarBuffer, + buffer, + forceClean + // + ); + } + + // + // PV ... + + // + // PEAKS ... + + // + double GetPeak( + int barIndex // Bar Index + ) + { + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + Calculate(); + + // + int count = ArraySize(peaksBuffer); + if (barIndex >= count) + { + barIndex = count - 1; + } + + // + return peaksBuffer[barIndex]; + } + + // + int CopyPeak( + int start, // Start + int count, // Number of Items for read + double &buffer[], // Dest Buffer + bool forceClean = true // Force To Clean buffer + ) + { + // + // Update Calculations ... + Calculate(); + + // + // Copy Items ... + return Copy( + start, + count, + peaksBuffer, + buffer, + forceClean + // + ); + } + + // + // VALES ... + + // + double GetVale( + int barIndex // Bar Index + ) + { + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + Calculate(); + + // + int count = ArraySize(valesBuffer); + if (barIndex >= count) + { + barIndex = count - 1; + } + + // + return valesBuffer[barIndex]; + } + + // + int CopyVale( + int start, // Start + int count, // Number of Items for read + double &buffer[], // Dest Buffer + bool forceClean = true // Force To Clean buffer + ) + { + // + // Update Calculations ... + Calculate(); + + // + // Copy Items ... + return Copy( + start, + count, + valesBuffer, + buffer, + forceClean + // + ); + } + + // + // + // + + // + double GetHigherPeak( + int &index, // Bar Index + double peak, // Peak Source + int barIndex = 0, // Bar Index + int loopback = 576 // Max Allowed Loopback + ) + { + // + double result = 0; + + // + index = -1; + + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + if (loopback < 576) + { + loopback = 576; + } + + // + if (peak <= 0) + { + return result; + } + + // + double iValue = 0; + int sIndex = barIndex; + bool canContinue = true; + while (canContinue) + { + // + iValue = GetPeak(sIndex); + if (iValue > peak) + { + // + index = sIndex; + result = iValue; + break; + } + + // + canContinue = sIndex < barIndex + loopback; + sIndex++; + } + + // + return result; + } + + // + double GetLowerPeak( + int &index, // Bar Index + double peak, // Peak Source + int barIndex = 0, // Bar Index + int loopback = 576 // Max Allowed Loopback + ) + { + // + double result = 0; + + // + index = -1; + + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + if (loopback < 576) + { + loopback = 576; + } + + // + if (peak <= 0) + { + return result; + } + + // + double iValue = 0; + int sIndex = barIndex; + bool canContinue = true; + while (canContinue) + { + // + iValue = GetPeak(sIndex); + if (iValue < peak) + { + // + index = sIndex; + result = iValue; + break; + } + + // + canContinue = sIndex < barIndex + loopback; + sIndex++; + } + + // + return result; + } + + // + double GetHigherVale( + int &index, // Bar Index + double vale, // Vale Source + int barIndex = 0, // Bar Index + int loopback = 576 // Max Allowed Loopback + ) + { + // + double result = 0; + + // + index = -1; + + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + if (loopback < 576) + { + loopback = 576; + } + + // + if (vale <= 0) + { + return result; + } + + // + double iValue = 0; + int sIndex = barIndex; + bool canContinue = true; + while (canContinue) + { + // + iValue = GetVale(sIndex); + if (iValue > vale) + { + // + index = sIndex; + result = iValue; + break; + } + + // + canContinue = sIndex < barIndex + loopback; + sIndex++; + } + + // + return result; + } + + // + double GetLowerVale( + int &index, // Bar Index + double vale, // Vale Source + int barIndex = 0, // Bar Index + int loopback = 576 // Max Allowed Loopback + ) + { + // + double result = 0; + + // + index = -1; + + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + if (loopback < 576) + { + loopback = 576; + } + + // + if (vale <= 0) + { + return result; + } + + // + double iValue = 0; + int sIndex = barIndex; + bool canContinue = true; + while (canContinue) + { + // + iValue = GetVale(sIndex); + if (iValue < vale) + { + // + index = sIndex; + result = iValue; + break; + } + + // + canContinue = sIndex < barIndex + loopback; + sIndex++; + } + + // + return result; + } + + // + // CURRENT ... + + // + // HH ... + + // + double GetCHH( + int barIndex // Bar Index + ) + { + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + Calculate(); + + // + int count = ArraySize(cHHBuffer); + if (barIndex >= count) + { + barIndex = count - 1; + } + + // + return cHHBuffer[barIndex]; + } + + // + int CopyCHH( + int start, // Start + int count, // Number of Items for read + double &buffer[], // Dest Buffer + bool forceClean = true // Force To Clean buffer + ) + { + // + // Update Calculations ... + Calculate(); + + // + // Copy Items ... + return Copy( + start, + count, + cHHBuffer, + buffer, + forceClean + // + ); + } + + // + // LL ... + + // + double GetCLL( + int barIndex // Bar Index + ) + { + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + Calculate(); + + // + int count = ArraySize(cLLBuffer); + if (barIndex >= count) + { + barIndex = count - 1; + } + + // + return cLLBuffer[barIndex]; + } + + // + int CopyCLL( + int start, // Start + int count, // Number of Items for read + double &buffer[], // Dest Buffer + bool forceClean = true // Force To Clean buffer + ) + { + // + // Update Calculations ... + Calculate(); + + // + // Copy Items ... + return Copy( + start, + count, + cLLBuffer, + buffer, + forceClean + // + ); + } + + // + // SHORT ... + + // + // HH ... + + // + double GetSHH( + int barIndex // Bar Index + ) + { + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + Calculate(); + + // + int count = ArraySize(sHHBuffer); + if (barIndex >= count) + { + barIndex = count - 1; + } + + // + return sHHBuffer[barIndex]; + } + + // + int CopySHH( + int start, // Start + int count, // Number of Items for read + double &buffer[], // Dest Buffer + bool forceClean = true // Force To Clean buffer + ) + { + // + // Update Calculations ... + Calculate(); + + // + // Copy Items ... + return Copy( + start, + count, + sHHBuffer, + buffer, + forceClean + // + ); + } + + // + // LL ... + + // + double GetSLL( + int barIndex // Bar Index + ) + { + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + Calculate(); + + // + int count = ArraySize(sLLBuffer); + if (barIndex >= count) + { + barIndex = count - 1; + } + + // + return sLLBuffer[barIndex]; + } + + // + int CopySLL( + int start, // Start + int count, // Number of Items for read + double &buffer[], // Dest Buffer + bool forceClean = true // Force To Clean buffer + ) + { + // + // Update Calculations ... + Calculate(); + + // + // Copy Items ... + return Copy( + start, + count, + sLLBuffer, + buffer, + forceClean + // + ); + } + + // + // MEDIUM ... + + // + // HH ... + + // + double GetMHH( + int barIndex // Bar Index + ) + { + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + Calculate(); + + // + int count = ArraySize(mHHBuffer); + if (barIndex >= count) + { + barIndex = count - 1; + } + + // + return mHHBuffer[barIndex]; + } + + // + int CopyMHH( + int start, // Start + int count, // Number of Items for read + double &buffer[], // Dest Buffer + bool forceClean = true // Force To Clean buffer + ) + { + // + // Update Calculations ... + Calculate(); + + // + // Copy Items ... + return Copy( + start, + count, + mHHBuffer, + buffer, + forceClean + // + ); + } + + // + // LL ... + + // + double GetMLL( + int barIndex // Bar Index + ) + { + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + Calculate(); + + // + int count = ArraySize(mLLBuffer); + if (barIndex >= count) + { + barIndex = count - 1; + } + + // + return mLLBuffer[barIndex]; + } + + // + int CopyMLL( + int start, // Start + int count, // Number of Items for read + double &buffer[], // Dest Buffer + bool forceClean = true // Force To Clean buffer + ) + { + // + // Update Calculations ... + Calculate(); + + // + // Copy Items ... + return Copy( + start, + count, + mLLBuffer, + buffer, + forceClean + // + ); + } + + // + // LONG ... + + // + // HH ... + + // + double GetLHH( + int barIndex // Bar Index + ) + { + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + Calculate(); + + // + int count = ArraySize(lHHBuffer); + if (barIndex >= count) + { + barIndex = count - 1; + } + + // + return lHHBuffer[barIndex]; + } + + // + int CopyLHH( + int start, // Start + int count, // Number of Items for read + double &buffer[], // Dest Buffer + bool forceClean = true // Force To Clean buffer + ) + { + // + // Update Calculations ... + Calculate(); + + // + // Copy Items ... + return Copy( + start, + count, + lHHBuffer, + buffer, + forceClean + // + ); + } + + // + // LL ... + + // + double GetLLL( + int barIndex // Bar Index + ) + { + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + Calculate(); + + // + int count = ArraySize(lLLBuffer); + if (barIndex >= count) + { + barIndex = count - 1; + } + + // + return lLLBuffer[barIndex]; + } + + // + int CopyLLL( + int start, // Start + int count, // Number of Items for read + double &buffer[], // Dest Buffer + bool forceClean = true // Force To Clean buffer + ) + { + // + // Update Calculations ... + Calculate(); + + // + // Copy Items ... + return Copy( + start, + count, + lLLBuffer, + buffer, + forceClean + // + ); + } + + // + // HIND ... + + // + // HH ... + + // + double GetHHH( + int barIndex // Bar Index + ) + { + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + Calculate(); + + // + int count = ArraySize(hHHBuffer); + if (barIndex >= count) + { + barIndex = count - 1; + } + + // + return hHHBuffer[barIndex]; + } + + // + int CopyHHH( + int start, // Start + int count, // Number of Items for read + double &buffer[], // Dest Buffer + bool forceClean = true // Force To Clean buffer + ) + { + // + // Update Calculations ... + Calculate(); + + // + // Copy Items ... + return Copy( + start, + count, + hHHBuffer, + buffer, + forceClean + // + ); + } + + // + // LL ... + + // + double GetHLL( + int barIndex // Bar Index + ) + { + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + Calculate(); + + // + int count = ArraySize(hLLBuffer); + if (barIndex >= count) + { + barIndex = count - 1; + } + + // + return hLLBuffer[barIndex]; + } + + // + int CopyHLL( + int start, // Start + int count, // Number of Items for read + double &buffer[], // Dest Buffer + bool forceClean = true // Force To Clean buffer + ) + { + // + // Update Calculations ... + Calculate(); + + // + // Copy Items ... + return Copy( + start, + count, + hLLBuffer, + buffer, + forceClean + // + ); + } + + // + // Tools Function ... + + // + double GetLowestPeak( + int barIndex, + int &index, + double &vale, + int loopback = 576 // + ) + { + // + double result = 0; + + // + index = -1; + vale = 0; + + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + if (loopback < 576) + { + loopback = 576; + } + + // + Calculate(); + + // + for (int i = 0; i < barIndex + loopback; i++) + { + // + double iPeak = GetPeak(i); + if (iPeak == 0) + { + break; + } + + // + if (iPeak > 0 && (result == 0 || + result >= iPeak)) + { + // + index = i; + result = iPeak; + vale = GetVale(index); + } + } + + // + return result; + } + + // + double GetHighestPeak( + int barIndex, + int &index, + double &vale, + int loopback = 576 // + ) + { + // + double result = 0; + + // + index = -1; + vale = 0; + + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + if (loopback < 576) + { + loopback = 576; + } + + // + Calculate(); + + // + for (int i = 0; i < barIndex + loopback; i++) + { + // + double iPeak = GetPeak(i); + if (iPeak == 0) + { + break; + } + + // + if (iPeak > 0 && (result == 0 || + result <= iPeak)) + { + // + index = i; + result = iPeak; + vale = GetVale(index); + } + } + + // + return result; + } + + // + double GetLowestVale( + int barIndex, + int &index, + double &peak, + int loopback = 576 // + ) + { + // + double result = 0; + + // + index = -1; + peak = 0; + + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + if (loopback < 576) + { + loopback = 576; + } + + // + Calculate(); + + // + for (int i = 0; i < barIndex + loopback; i++) + { + // + double iPeak = GetVale(i); + if (iPeak == 0) + { + break; + } + + // + if (iPeak > 0 && (result == 0 || + result >= iPeak)) + { + // + index = i; + result = iPeak; + peak = GetPeak(index); + } + } + + // + return result; + } + + // + double GetHighestVale( + int barIndex, + int &index, + double &peak, + int loopback = 576 // + ) + { + // + double result = 0; + + // + index = -1; + peak = 0; + + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + if (loopback < 576) + { + loopback = 576; + } + + // + Calculate(); + + // + for (int i = 0; i < barIndex + loopback; i++) + { + // + double iPeak = GetVale(i); + if (iPeak == 0) + { + break; + } + + // + if (iPeak > 0 && (result == 0 || + result <= iPeak)) + { + // + index = i; + result = iPeak; + peak = GetPeak(index); + } + } + + // + return result; + } + + // + void Free() override + { + Cleanup(10); + } + + // + bool GetConditions( + X121XPVConditions &conditions, // + int barIndex = 0, // + int loopback = 5 // + ) + { + // + bool result = true; + + // + if (loopback < 5) + { + loopback = 5; + } + + // + conditions.Clean(); + + // + conditions.symbol = mSymbol; + conditions.period = mPeriod; + conditions.time = TimeCurrent(); + + // + int zIndex = barIndex; + int cIndex = zIndex + 1; + int pIndex = cIndex + 1; + int ppIndex = pIndex + 1; + + // + XOHCL zBar; + result = zBar.Init( + mSymbol, + mPeriod, + zIndex // + ); + if (!result) + { + return result; + } + + // + XOHCL cBar; + result = cBar.Init( + mSymbol, + mPeriod, + cIndex // + ); + if (!result) + { + return result; + } + + // + XOHCL pBar; + result = pBar.Init( + mSymbol, + mPeriod, + pIndex // + ); + if (!result) + { + return result; + } + + // + // Buffers ... + + // + CopySar( + zIndex, + loopback, + conditions.sarBuffer // + ); + + // + CopyPeak( + zIndex, + loopback, + conditions.peaksBuffer // + ); + + // + CopyVale( + zIndex, + loopback, + conditions.valesBuffer // + ); + + // + CopyCHH( + zIndex, + loopback, + conditions.cHHBuffer // + ); + + // + CopyCLL( + zIndex, + loopback, + conditions.cLLBuffer // + ); + + // + CopySHH( + zIndex, + loopback, + conditions.sHHBuffer // + ); + + // + CopySLL( + zIndex, + loopback, + conditions.sLLBuffer // + ); + + // + CopyMHH( + zIndex, + loopback, + conditions.mHHBuffer // + ); + + // + CopyMLL( + zIndex, + loopback, + conditions.mLLBuffer // + ); + + // + CopyLHH( + zIndex, + loopback, + conditions.lHHBuffer // + ); + + // + CopyLLL( + zIndex, + loopback, + conditions.lLLBuffer // + ); + + // + CopyHHH( + zIndex, + loopback, + conditions.hHHBuffer // + ); + + // + CopyHLL( + zIndex, + loopback, + conditions.hLLBuffer // + ); + + // + // Conditions ... + + // + int cIDX = 1; + int pIDX = cIDX + 1; + + // + // SAR ... + + // + bool isSarBullish = conditions.sarBuffer[cIDX] < cBar.low; + bool isSarBullishPrev = conditions.sarBuffer[pIDX] < pBar.low; + + // + bool isSarBearish = conditions.sarBuffer[cIDX] > cBar.high; + bool isSarBearishPrev = conditions.sarBuffer[pIDX] > pBar.high; + + // + bool isSarSwitchedToBullish = isSarBullish && + !isSarBullishPrev; + bool isSarSwitchedToBearish = isSarBearish && + !isSarBearishPrev; + + // + // XPV ... + + // + bool isNewPeak = conditions.peaksBuffer[cIDX] != conditions.peaksBuffer[pIDX]; + bool isNewPeakOverLast = isNewPeak && + conditions.peaksBuffer[cIDX] > conditions.peaksBuffer[pIDX]; + bool isNewPeakUnderLast = isNewPeak && + conditions.peaksBuffer[cIDX] < conditions.peaksBuffer[pIDX]; + bool isRejectedPrevPeak = IsBarReject( + conditions.peaksBuffer[pIDX], + X_DIRECTION_BEARISH, + cBar // + ); + bool isBreakedUpPrevPeak = IsBarBreak( + conditions.peaksBuffer[pIDX], + X_DIRECTION_BULLISH, + cBar // + ); + + // + bool isNewVale = conditions.valesBuffer[cIDX] != conditions.valesBuffer[pIDX]; + bool isNewValeOverLast = isNewVale && + conditions.valesBuffer[cIDX] > conditions.valesBuffer[pIDX]; + bool isNewValeUnderLast = isNewVale && + conditions.valesBuffer[cIDX] < conditions.valesBuffer[pIDX]; + bool isRejectedPrevVale = IsBarReject( + conditions.valesBuffer[pIDX], + X_DIRECTION_BULLISH, + cBar // + ); + bool isBreakedDownPrevVale = IsBarBreak( + conditions.valesBuffer[pIDX], + X_DIRECTION_BEARISH, + cBar // + ); + + // + conditions.isSarBullish = isSarBullish; + conditions.isSarBearish = isSarBearish; + conditions.isSarSwitchedToBullish = isSarSwitchedToBullish; + conditions.isSarSwitchedToBearish = isSarSwitchedToBearish; + conditions.isNewPeak = isNewPeak; + conditions.isNewPeakOverLast = isNewPeakOverLast; + conditions.isNewPeakUnderLast = isNewPeakUnderLast; + conditions.isRejectedPrevPeak = isRejectedPrevPeak; + conditions.isBreakedUpPrevPeak = isBreakedUpPrevPeak; + conditions.isNewVale = isNewVale; + conditions.isNewValeOverLast = isNewValeOverLast; + conditions.isNewValeUnderLast = isNewValeUnderLast; + conditions.isRejectedPrevVale = isRejectedPrevVale; + conditions.isBreakedDownPrevVale = isBreakedDownPrevVale; + + // + Cleanup(); + + // + zBar.Clean(); + cBar.Clean(); + pBar.Clean(); + + // + return result; + } + + // + // Protected ... + protected: + // + // Private ... + private: + // + // Props ... + X121XPVInputs mInputs; // Inputs ... + + // + // Buffers ... + double peaksBuffer[]; + double valesBuffer[]; + double sarBuffer[]; + double cHHBuffer[]; + double cLLBuffer[]; + double sHHBuffer[]; + double sLLBuffer[]; + double mHHBuffer[]; + double mLLBuffer[]; + double lHHBuffer[]; + double lLLBuffer[]; + double hHHBuffer[]; + double hLLBuffer[]; + + // + void Calculate( + int maxRequiredBars = 100 // + ) + { + // + // Buffers ... + + // + // SAR ... + CopyBuffer( + mHandler, + X121_XPV_SAR_LINE, + 0, + maxRequiredBars, + sarBuffer + // + ); + + // + // XPV ... + + // + // PEAKS ... + CopyBuffer( + mHandler, + X121_XPV_PEAK_LINE, + 0, + maxRequiredBars, + peaksBuffer + // + ); + + // + // VALES ... + CopyBuffer( + mHandler, + X121_XPV_VALE_LINE, + 0, + maxRequiredBars, + valesBuffer + // + ); + + // + // CURRENT ... + + // + // HH ... + CopyBuffer( + mHandler, + X121_XPV_C_HH_LINE, + 0, + maxRequiredBars, + cHHBuffer + // + ); + + // + // LL ... + CopyBuffer( + mHandler, + X121_XPV_C_LL_LINE, + 0, + maxRequiredBars, + cLLBuffer + // + ); + + // + // SHORT ... + + // + // HH ... + CopyBuffer( + mHandler, + X121_XPV_S_HH_LINE, + 0, + maxRequiredBars, + sHHBuffer + // + ); + + // + // LL ... + CopyBuffer( + mHandler, + X121_XPV_S_LL_LINE, + 0, + maxRequiredBars, + sLLBuffer + // + ); + + // + // MEDIUM ... + + // + // HH ... + CopyBuffer( + mHandler, + X121_XPV_M_HH_LINE, + 0, + maxRequiredBars, + mHHBuffer + // + ); + + // + // LL ... + CopyBuffer( + mHandler, + X121_XPV_M_LL_LINE, + 0, + maxRequiredBars, + mLLBuffer + // + ); + + // + // LONG ... + + // + // HH ... + CopyBuffer( + mHandler, + X121_XPV_L_HH_LINE, + 0, + maxRequiredBars, + lHHBuffer + // + ); + + // + // LL ... + CopyBuffer( + mHandler, + X121_XPV_L_LL_LINE, + 0, + maxRequiredBars, + lLLBuffer + // + ); + + // + // HIND ... + + // + // HH ... + CopyBuffer( + mHandler, + X121_XPV_H_HH_LINE, + 0, + maxRequiredBars, + hHHBuffer + // + ); + + // + // LL ... + CopyBuffer( + mHandler, + X121_XPV_H_LL_LINE, + 0, + maxRequiredBars, + hLLBuffer + // + ); + } + + // + void Cleanup( + int maxAllowed = 100 // + ) + { + // + CleanupArray( + peaksBuffer, + maxAllowed // + ); + + // + CleanupArray( + valesBuffer, + maxAllowed // + ); + + // + CleanupArray( + sarBuffer, + maxAllowed // + ); + + // + CleanupArray( + cHHBuffer, + maxAllowed // + ); + + // + CleanupArray( + cLLBuffer, + maxAllowed // + ); + + // + CleanupArray( + sHHBuffer, + maxAllowed // + ); + + // + CleanupArray( + sLLBuffer, + maxAllowed // + ); + + // + CleanupArray( + mHHBuffer, + maxAllowed // + ); + + // + CleanupArray( + mLLBuffer, + maxAllowed // + ); + + // + CleanupArray( + lHHBuffer, + maxAllowed // + ); + + // + CleanupArray( + lLLBuffer, + maxAllowed // + ); + + // + CleanupArray( + hHHBuffer, + maxAllowed // + ); + + // + CleanupArray( + hLLBuffer, + maxAllowed // + ); + + // + } + + // +}; + +// +// Tools ... \ No newline at end of file diff --git a/BKPS/14031206/Helpers/x-saherelm.x121.xstr.helper.ex5 b/BKPS/14031206/Helpers/x-saherelm.x121.xstr.helper.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..a6353d37f930a511d1c174b68622bb86fef46042 GIT binary patch literal 7118 zcmdT|MOYlnvYo&ngFC_91_&119TEsKxI=K4puybQTmNAb766L13X0a*UJ>%aWN-~QjaP5!0(!{7P*|5o~+x5Nhc@ORs+|C#(RP-M*v znE_cYy&AF~9@5MRIGnh)TKn=k>YVX?x6x?qa5ICkRh|Yg+d<4F4Wauje=H`t`$=Fd z?h>U;Q;zb04VgfGs(>|Xo03BXN+5oUGVy`CJ_x2lKz|9re#$y$1hGRuFPl*1P!BWq zSJ6+(MhqdBdatrbtp|h-JEe>TulQUuMQJXDWlnvwD+r(>_2tmLfJ#NzOFgeq{j9c6 z&6Zmx^OXR~_x+fDWt9TO$hfPaRM=^i@r?UEALPJ#+Ho&3A)C5+ykkg%qWN8jl=)p1 z3JTsn43ES-o48egRXer(dp0shehP3D{gD`%RwbJaL9aKPB{j+w;GMv`clJ2uX0@0~ zj;&NR7z=Lvz(V+SyMAOdGJM7Jgvabmf7!xBq&eS&{8bWzvU4(poN0tl-^(^Rj)2Mp z+bk*AXE#4bN~>u7wd?E4ohjlNJB`f>==NGeA1IkCa0%4?{ z64|s$eZ5&Z)O#}}#JuP46+ax}+)+^7$+>*z;2rA~tWg5M2lK*Kn#jR^l3^*dS<^|% zJ=1&-=M#>^nR_>NfW1nOJ*i0mx#XI@Zg{fWMx`c*)oUOdV7gF`0ejBXA-5|SjdeX# ztAa0svVkFFU(NMW13JHMf3v7h#fLL%;6U$VZx!(X&VubwDn@S3olw3ow8EYSbgydT z{92+pis@)NqhO8Zo#V8<#e**!yKI>=ktpJ!Y{f%PnRe+Y800`>AoGsc)Lxq=XI7Y! ztJeuRN+mMH#^nbmgg1aHDbKl{DgZXn786)!f9l6AG8gpndL}`<6nYFt-lz7> zHTa2`EX~&?sWvC3h8Cvt86s;3t9wpohIOVeN|!`|%FK1@ovPI?*+XqB1rOfgK4D@>N&~U|%9_fs3K`DX7mO zhnDd0M-#cZAgU`_>uIkRPx~3^x{=(O794ya3k$E@-Dk?0I0b&TDgUXn(La?b2M=9GIs~lE5G}vub8E%ARrnqkd|fNH4f4!)K0-cL!BU?XmH0(WHESO z>EHM&O{MtJRhcfw7Dk7sr~=0_)xq~u98431Q8;H$rVg!x7J_+ca@?&`2J^wS>)L#N zm;XSwXI<@8_t5Ei8NG9fOdi%(*fn`<1N)mH`as;rfHRL4pgDW2CZ#2_F^l zxO5<=x1$AmR=3}v3XlqHIeb5Ohpu^qsRA&UN)Tq~C_yb)?6_~-+)ipau>UPUlTanJ z$c6ZEyhZa5jbgv?Vd4WuL}IZi7Zlk;OC`-!b%rcaEF$&6*SJ`rCfMME-y;$s!Pd?L z*y}50ClIYLr!zHftIsIZ$F!N_J5d|QQb|X+;@0A-Cij60)s7`-gX!+iV1p;O8*-sO z!|1I@PwJP=nd>u>7KHL!tl&X7>OD;Dy~aA{$udchUPgY_$59sZhEG2o4O}Vn3;Wjx zzAO7%vZ$$$C2%l)0|5gt(zZ;I_KrwzGnFe>i+6p?#Tv?dN1A*{TPy_mXECWHQ-x`d z%j&W!=^rA19m{tNhYfXm|4_XHR-eJz(>IcK{Wk5KdgS8@|eJ) zo`W|~{<9o@*3?yK;tSXC`(s7x2iZ$a4f5^lt2%VH1uy1+%IWVlWVXq^JP)jF6Vcc! zaO2w!ekoo}fjj8^UW@q=^o`1`xV@}Bkp+sG$ojA#^G%Y-_%duFgKxp^VgTD@nJ8cg zC_8`WT&L#XFyY*YTiD5_bfLCQK3u89JRj?KlCUe^u#0IcaZ|U7WC^WvSrxw_y?_?A z)u>uFb&JkGm8Qee?{wkl#hcH-mCWVdj7tZ(2@*M+NQVijq+Lqe6m z2QPk!HZ$p^^<8Q-XZ-T{KK!toZyASEmQC|x0zBzSDXV8*aCuU&dD1m{`{O9Du11e1anMnUr2NzYC5HPWV&JS;uq zM83tJR9k1}{UzbFDl2~0H+wYdRoJm$(Gs6&tjavq&B_8lxnmmlNZy>HdRVhc2e-{&oDRPx}aPSiRZ z4oDnLn7UtfBmu@gP=WXe_qbaTum>6WySFcub92UUKBM-L-Jsle>siVK-2bs<#M|(S zzN5nhLCSvzh7~B~l)_;^1vC>BASFMz9Ef~r4zsG0WKfH%2PsXJRSQ5OE{GoHb+A8r z6d1&BvcB+nvVmLS{tO;zk|fCnGZxEaW{?7FL$?j*`|aEFTv`v-4s`kVQ?J0*e1K1O z`c3&Ogip`@jdKa#iwi+FDXk>e60Z8$(V3C&8uev2w|)!xt?B%Zd6!nblslwK%sW`W zlcwL(>WD#{cB9yg+eoEurqE@G;%9_0Nqgr$udaAAWWZdVQJ`-cp;j(f7+L&g!9ftQ z8KmzW&9G=xW)LY<(kth1A(xO;hpY1jfG>}mM(hAnxM8G$$8!OKsS}cjp9e|xqwKLM zrBs#-2lUrhk)btbKcF!mzJBO|u-S-}Y%|+}2-${ZN4rsM+SDJL+vXwYR{LJAyz?vH zR)F}q8HuzUSfAU;aCQNyN+FlT`L~CIURD*uHAr^mnu4#^V%~-6@8nSv*d#v8QcfZ~+#dxyq z`Yqxd@?#%Xv`~cPiHk-mbo*pqE(eBAv?spmtT=OS`%p9xb!8IP|8*+4qrJ%6dm;8x zV0iAsD|Sc%9sh$_Rk%OP9pz%Yz6xt|sTtc3LeFzVBTQBX=`L>|@oce%aB|lS&iQ%q z1a?{ntP~bAixRneujK(iWwsiS=tCOv^T<7N3}3E*QmhN-ZfUZFy^CO%@HbRKB%w= z1B)lh^Dell)O30Q18m$KZAHgWVIyXSDoAdv^*-*wM_R7FKa|`WEqIXy+@@znY^D!E?cLT+Zc8v&&K-VUK-?C-r0K8Rx>GC_I4hL zHNeGibAIq3UXyF|Vi;>EIMZHtEh}!MS+Y2pHLJyLMGEsEpXc^^s<-$Rp`S%|*-b=M z_rPGCd_J^|xIl2BZr1U6({`?SgF1An*otmHpk9nZ z*qWB@%SP+w99 zA81G&k2qliyP!m@2-s}`UU0V;BDNMj14Q?&2-@_Vh5RslF1SKI)Kaw9_?iKEB$M;l z+KD9NP=?>i;%8lJQ+SX`#xxpCHoi;$483mIAts?MM-JIQcv0!8qn-2+Z>Z8xY(9vc zKS$KG_vfBADVICfJF!;vB+Wu)^#TlwWL$bGUCQ+gG_c&^M}8&;oN5EI+_F?*x@1ZH zb4Hah4xA`Syi^}6F-fT{1EVjjf>)wj--|Nv_}aq>KmY0p-t}I@$E{ZH5c3U3=A?f~~Kt zI4iEuT?LD}VI{K(`<#b_8Y{C9&m_V%TCJGB<%RyB{XF*#Q%2_z@w89k;Jr^&d$buG z^-x(d!6+u64m8Q8N)l9Wm=mecr!5i(dugf}mqqS1IXvvEvD5Ehi_WoWYhuI|p!mfZ zHkP{jfSr)YRvD6^?e|hw0uD?O{V68J3V9%Z+@ce8?F7g}S^}F9=|b4HNTztVeHCpy z(~xQh=Ft@5)+m(xW`Mk&6>hnjak(Y}-ZogZ6bn*MBbS$9<|EA1#17L2{AbL)zv%BP zDEId1FqI>J=!itZ*o0xx!Y45)cZ)1Nzc~mRfr9x;R9^X-+iX1}VGdWkt`zDg)De*z zq6Z{$S>#G_^CMs0;eE1*b0<0}A>DRyeZ5~An7q&vcMSUMz}SHkmN3kqz~_7OqRy2M z81M1{!-lHS3c=i-wAN&~)6lrq0g3mMZ>JYs1f_=jz0I+r1Dy4I}WdWNTdABH_oG{U8a4u1jJGH|(O-K~+<=F!*D?%iESh_sft_MB#mvGGo#<#V4 z!!{9D>|D1)8W5)yP8BI!&j~hm&6JmHdC3iCF5c2R?^qigvu!rIwVKD8DQckN#Gq2LO8XA| z$M{#jfK1P`geC(ba-gbxK*SgjfYeBG;J2#&Uh4#xM)L+9jEpn z*)xY_dqqDWLDJyipiCmt$sSFwg%<8e%Ir-gb3qQ#U4rt1LjUb8V@}|r_|J-C1F~7w z37#u4yR=rq=q?8<%Q6#7hOcR0aid>V%$`~&M}ekexJG{-L25nVkVxtQI<0Af96vJ2 z(56EYgV^p{exLIuhgrvB3qKrfDhOq|t4qWEaUbE#sx^kS9R6j*g{En9LMWd$S6)@$ zZ*PPJsSk_V>xp#AuZlQtRVeZ6GYU-9>mN3R2<3)sU)Du&Sc8no23Nfve6a2$J>iGL zH>CKp+6{7?#_0$^y^jh^n33MAq`H=<8DnWMwHDzl_KA&< zVGP%4fN#8$n%l8nU2sb+Bf-$d^+4nc8<$`=1xoyo#h7Y2ciGd=R_PPby!lpz=NCKw zm|cy+`t{M&inQ*BWPG%1Ic8>RLd=F1yA}HQ6T+0T!p#Ch@>t8@w2N30h7*qBIWhYi z<5mUN<8Rp)A~sV^y}Rw@(S1iTQ;+1y_ohEHmJ=pd$p=Me&w@)o)C9^U@w=LGXf#Am zzdJ?lG!YdyO?o~SKlVmUow^HLiVb;jjAdYe@`FDSGqvr$Iyv$Np;8?I>h$UHx%FIJ zEn7!}z2kf0g?Bdm*(BVb_&mcxNNcEXv3;%&FTt^He`gu=#On0>1E=rzMS zV5L2{Np7@vxvF~u>KJVK;&h)8BOJnQEN%Bnta;AanIgv`aCe@cUbh3uhC*0 zgqi*C(1fDUU`2<~U5VJz>G)YOH9dP-_OACygbp|I<9PTcNvOTo&Uhks-G)qO|ca-~-=1A{gb zf@Xr!6Yz-1#mCOeSUV&qN$u~}u3c?EqrEJoC?;B?Y2(#!%Ns~m5@9;Eh`TentwOcz z$s;5Rg%H^mzBtOet?`yB%wRw1jj&iYVK{&Btk|~gUOuO=qwiqtIij=8rsV3Oyy5}D zCeWhrS!4saiR)LJx4Cr-39CCSOq}C6-V_;rno4hj@==E-lA$KhZbc(c-*Ld^tCf`(XG&De-urE!fCrlYokM46Es5sle+l^ z=cc-xw98Rc_)n9#9!pnf2rb|}uYp{GNt}=2021dQlviSQr>3=5{>0e@~75u97j~tSm^_nfXVeFO~64 zpy>=t5{3@5dFk|RaUyfVx|i*|4r!}2O>Z9}rlYRIGggSZP%N3mm~QC=Bdk!A_?bwH zoxXgjR;$Wo)pwBnDtmUlS(luTo@6!Oz7L!pWOe%#X@n3J2h8`PD zTj>R%C#(yD)Q<3a4|gGk)lCWqRmxhwG>{>zjium1bNkW0Gmt$ShnS8jX%{)vi2^D) zD~+&>fIP1=a~6nYjgiw&pa4u0@$?(zUEzrGbYc8u>)>$07fukx`eA;aX3`~lS=m}2*K+MH_KK;XL@fFD3)DR+eZ_hUx$&%FBjL8x znH?(jjS#sO2~^YlizR6WL!3IZ z^x7AW$mpWe1_r9ExqfoR=;-m=4yn4P7?BlU=|R`gR10Wsf=3r4#FSpEdT*zKE|0CYMW;gwp5){Uaza>S2PV!d*xr89_@ zKV*zpkz9+vdlbr~&FHw4%J50`aRheLz4AePEBYiy<2}>3FSBhTJ}i$Dooz;gpE6tT zE}8}*ov@7$vEJm8YC7X5Bq3tu*kYVb-4~5uDZDCwxZ>ue8hXaScl`drTnTdB^aT2< z2jao`{mLxA5Op?6E~F$wnOumF+TBWgPj4UXHanbfyU%sTXvKl~zVe88hVT;;GaEAQ zY}yi1lBR9@?>D{r 0 && + strMultiplier > 0 + // + ; + + // + return result; + } + + // + // Retrieve MAx Length ... + int Max() + { + // + int result = 0; + + // + result = MathMax(1, strLength); + + // + return result; + } +}; + +// +// Conditions ... +struct X121XSTRConditions +{ + // + // Common ... + string symbol; + ENUM_TIMEFRAMES period; + datetime time; + + // + // Buffers ... + double strBuffer[]; + double atrBuffer[]; + double strPriceBuffer[]; + double strUpBuffer[]; + double strDownBuffer[]; + double strStateBuffer[]; + + // + // Conditions ... + + // + bool isStrBullish; + bool isStrBearish; + + // + bool isStrSwitchedToBullish; + bool isStrSwitchedToBearish; + + // + // bool isCloseLower + + // + // Constructor ... + X121XSTRConditions() + { + Clean(); + } + + // + // Tools ... + + /** + * Cleaning Up ... + */ + void Clean() + { + // + // Commons ... + symbol = NULL; + period = NULL; + time = NULL; + + // + // Buffers ... + + // + Clean(strBuffer); + Clean(atrBuffer); + Clean(strPriceBuffer); + Clean(strUpBuffer); + Clean(strDownBuffer); + Clean(strStateBuffer); + + // + ArraySetAsSeries(strBuffer, true); + ArraySetAsSeries(atrBuffer, true); + ArraySetAsSeries(strPriceBuffer, true); + ArraySetAsSeries(strUpBuffer, true); + ArraySetAsSeries(strDownBuffer, true); + ArraySetAsSeries(strStateBuffer, true); + + // + // Conditions ... + + // + isStrBullish = false; + isStrBearish = false; + + // + isStrSwitchedToBullish = false; + isStrSwitchedToBearish = false; + + // + ZeroMemory(this); + } + + /** + * Generate Conditions Scores ... + * + * @param bullishScore: Double, Directional Scores Reference ... + * @param bearishScore: Double, Directional Scores Reference ... + */ + void GenerateScore( + double &bullishScore, + double &bearishScore // + ) + { + // + bullishScore = 0; + bearishScore = 0; + + // + // TODO: Implement if Required ... + } + + /** + * Generate Summary String for Represent Conditions State ... + * + * @param onlyCommons: Boolean, Just Generate Only Commons Conditions ... + * @param onlyConditions: Boolean, Just Generate Only Conditions ... + * @param includeScores: Boolean, Attach Scores Representations on Result ... + * @param ignoreFalseConditions: Boolean, Ignore False Conditions on Result ... + * @param separator: String, Separate Lines ... + * + * @return ( string ) + */ + string GenerateSummary( + bool onlyCommons = false, + bool onlyConditions = false, + bool includeScores = true, + bool ignoreFalseConditions = true, + string separator = "\n" // + ) + { + // + string result = NULL; + + // + double bullishScore = 0; + double bearishScore = 0; + GenerateScore( + bullishScore, + bearishScore // + ); + + // + string scoresStr = + // + "Scores: " + separator + + "---------------" + separator + + "Bullish: " + ToString(bullishScore) + separator + + "Bearish: " + ToString(bearishScore) + separator + + "" + // + ; + + // + string commonStr = GenerateSpecifiedCommonSummary( + this, + separator, + includeScores // + ); + + // + string conditionsStr = + // + ToString("isStrBullish", isStrBullish, ignoreFalseConditions, separator) + + ToString("isStrBearish", isStrBearish, ignoreFalseConditions, separator) + + ToString("isStrSwitchedToBullish", isStrSwitchedToBullish, ignoreFalseConditions, separator) + + ToString("isStrSwitchedToBearish", isStrSwitchedToBearish, ignoreFalseConditions, separator) + + // + "" + // + ; + + // + result = + // + "[" + GetTag() + "]" + separator + + (onlyConditions + ? "" + : commonStr) + + (!includeScores + ? "" + : scoresStr) + + " " + separator + + (onlyCommons + ? "" + : conditionsStr) + + "" + // + ; + + // + return result; + } + + /** + * Retrieve nique Tag Identifier ... + * + * @return ( string ) + */ + string GetTag() + { + return GetTypeName(this); + } + + // +}; + +// +// Class ... +class XCX121XSTRHelper : public XCBaseHelper +{ + // + // Public ... + public: + // + // Props ... + + // + // Constructors ... + XCX121XSTRHelper() + : XCBaseHelper(_Symbol, _Period) + { + } + + // + // Deconstructor ... + ~XCX121XSTRHelper() + { + // + mInputs.Clean(); + + // + Clean(strBuffer); + Clean(atrBuffer); + Clean(strPriceBuffer); + Clean(strUpBuffer); + Clean(strDownBuffer); + Clean(strStateBuffer); + } + + // + // Tools ... + bool Init( + string symbol, // Trading Symbol + ENUM_TIMEFRAMES period, // Trading Period + X121XSTRInputs &inputs // Inputs + ) + { + // + bool result = false; + + // + mSymbol = symbol; + mPeriod = period; + + // + result = inputs.IsValid(); + if (!result) + { + return result; + } + + // + ArraySetAsSeries(strBuffer, true); + ArraySetAsSeries(atrBuffer, true); + ArraySetAsSeries(strPriceBuffer, true); + ArraySetAsSeries(strUpBuffer, true); + ArraySetAsSeries(strDownBuffer, true); + ArraySetAsSeries(strStateBuffer, true); + + // + mInputs = inputs; + + // + mHandler = iCustom( + mSymbol, + mPeriod, + "x-saherelm.x121.xstr", + // + // Inputs ... + // + // Market ... + "", + mInputs.strLength, + mInputs.strMultiplier, + mInputs.strAppliedTo, + // + // Presentation ... + "", + mInputs.showStr, + mInputs.showStrUpper, + mInputs.showStrLower + // + ); + result = mHandler != INVALID_HANDLE; + if (!result) + { + return result; + } + + // + return result; + } + + // + // Inputs ... + + // + X121XSTRInputs GetInputs() + { + return mInputs; + } + + // + bool SetInputs( + X121XSTRInputs &inputs // Configs + ) + { + // + return Init( + mSymbol, + mPeriod, + inputs + // + ); + } + + // + // Readers ... + + // + // ATR ... + + // + double GetATR( + int barIndex // Bar Index + ) + { + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + Calculate(); + + // + int count = ArraySize(atrBuffer); + if (barIndex >= count) + { + barIndex = count - 1; + } + + // + return atrBuffer[barIndex]; + } + + // + int CopyATR( + int start, // Start + int count, // Number of Items for read + double &buffer[], // Dest Buffer + bool forceClean = true // Force To Clean buffer + ) + { + // + // Update Calculations ... + Calculate(); + + // + // Copy Items ... + return Copy( + start, + count, + atrBuffer, + buffer, + forceClean + // + ); + } + + // + double GetSTR( + int barIndex // Bar Index + ) + { + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + Calculate(); + + // + int count = ArraySize(strBuffer); + if (barIndex >= count) + { + barIndex = count - 1; + } + + // + return strBuffer[barIndex]; + } + + // + int CopySTR( + int start, // Start + int count, // Number of Items for read + double &buffer[], // Dest Buffer + bool forceClean = true // Force To Clean buffer + ) + { + // + // Update Calculations ... + Calculate(); + + // + // Copy Items ... + return Copy( + start, + count, + strBuffer, + buffer, + forceClean + // + ); + } + + // + double GetSTRState( + int barIndex // Bar Index + ) + { + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + Calculate(); + + // + int count = ArraySize(strStateBuffer); + if (barIndex >= count) + { + barIndex = count - 1; + } + + // + return strStateBuffer[barIndex]; + } + + // + int CopySTRState( + int start, // Start + int count, // Number of Items for read + double &buffer[], // Dest Buffer + bool forceClean = true // Force To Clean buffer + ) + { + // + // Update Calculations ... + Calculate(); + + // + // Copy Items ... + return Copy( + start, + count, + strStateBuffer, + buffer, + forceClean + // + ); + } + + // + double GetSTRPrice( + int barIndex // Bar Index + ) + { + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + Calculate(); + + // + int count = ArraySize(strPriceBuffer); + if (barIndex >= count) + { + barIndex = count - 1; + } + + // + return strPriceBuffer[barIndex]; + } + + // + int CopySTRPrice( + int start, // Start + int count, // Number of Items for read + double &buffer[], // Dest Buffer + bool forceClean = true // Force To Clean buffer + ) + { + // + // Update Calculations ... + Calculate(); + + // + // Copy Items ... + return Copy( + start, + count, + strPriceBuffer, + buffer, + forceClean + // + ); + } + + // + double GetSTRUp( + int barIndex // Bar Index + ) + { + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + Calculate(); + + // + int count = ArraySize(strUpBuffer); + if (barIndex >= count) + { + barIndex = count - 1; + } + + // + return strUpBuffer[barIndex]; + } + + // + int CopySTRUp( + int start, // Start + int count, // Number of Items for read + double &buffer[], // Dest Buffer + bool forceClean = true // Force To Clean buffer + ) + { + // + // Update Calculations ... + Calculate(); + + // + // Copy Items ... + return Copy( + start, + count, + strUpBuffer, + buffer, + forceClean + // + ); + } + + // + double GetSTRDown( + int barIndex // Bar Index + ) + { + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + Calculate(); + + // + int count = ArraySize(strDownBuffer); + if (barIndex >= count) + { + barIndex = count - 1; + } + + // + return strDownBuffer[barIndex]; + } + + // + int CopySTRDown( + int start, // Start + int count, // Number of Items for read + double &buffer[], // Dest Buffer + bool forceClean = true // Force To Clean buffer + ) + { + // + // Update Calculations ... + Calculate(); + + // + // Copy Items ... + return Copy( + start, + count, + strDownBuffer, + buffer, + forceClean + // + ); + } + + // + double GetLastSTR( + ENUM_X_DIRECTION dir, + int barIndex = 0 // + ) + { + // + double result = 0; + + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + if (!HasDirection(dir)) + { + return result; + } + + // + int index = barIndex; + bool isBullish = IsBullish(dir); + + // + bool canContinue = true; + while (canContinue) + { + // + double iStr = GetSTR(index); + double iState = GetSTRState(index); + + // + canContinue = + isBullish + ? iState < 0 + : iState > 0; + if (!canContinue) + { + // + result = iStr; + break; + } + + // + index++; + } + + // + return result; + } + + // + void Free() override + { + Cleanup(10); + } + + // + bool GetConditions( + X121XSTRConditions &conditions, // + int barIndex = 0, // + int loopback = 5 // + ) + { + // + bool result = true; + + // + if (loopback < 5) + { + loopback = 5; + } + + // + conditions.Clean(); + + // + conditions.symbol = mSymbol; + conditions.period = mPeriod; + conditions.time = TimeCurrent(); + + // + int zIndex = barIndex; + int cIndex = zIndex + 1; + int pIndex = cIndex + 1; + int ppIndex = pIndex + 1; + + // + XOHCL zBar; + result = zBar.Init( + mSymbol, + mPeriod, + zIndex // + ); + if (!result) + { + return result; + } + + // + XOHCL cBar; + result = cBar.Init( + mSymbol, + mPeriod, + cIndex // + ); + if (!result) + { + return result; + } + + // + XOHCL pBar; + result = pBar.Init( + mSymbol, + mPeriod, + pIndex // + ); + if (!result) + { + return result; + } + + // + // Buffers ... + + // + CopyATR( + zIndex, + loopback, + conditions.atrBuffer // + ); + + // + CopySTR( + zIndex, + loopback, + conditions.strBuffer // + ); + + // + CopySTRState( + zIndex, + loopback, + conditions.strStateBuffer // + ); + + // + CopySTRPrice( + zIndex, + loopback, + conditions.strPriceBuffer // + ); + + // + CopySTRUp( + zIndex, + loopback, + conditions.strUpBuffer // + ); + + // + CopySTRDown( + zIndex, + loopback, + conditions.strDownBuffer // + ); + + // + // Conditions ... + + // + int cIDX = 1; + int pIDX = cIDX + 1; + + // + bool isStrBullish = strStateBuffer[cIDX] > 0; + bool isStrBullishPrev = strStateBuffer[pIDX] > 0; + + // + bool isStrBearish = strStateBuffer[cIDX] < 0; + bool isStrBearishPrev = strStateBuffer[pIDX] < 0; + + // + bool isStrSwitchedToBullish = isStrBullish && + !isStrBullishPrev; + bool isStrSwitchedToBearish = isStrBearish && + !isStrBearishPrev; + + // + conditions.isStrBullish = isStrBullish; + conditions.isStrBearish = isStrBearish; + conditions.isStrSwitchedToBullish = isStrSwitchedToBullish; + conditions.isStrSwitchedToBearish = isStrSwitchedToBearish; + + // + Cleanup(); + + // + zBar.Clean(); + cBar.Clean(); + pBar.Clean(); + + // + return result; + } + + // + // Protected ... + protected: + // + // Private ... + private: + // + // Props ... + X121XSTRInputs mInputs; // Inputs ... + + // + // Buffers ... + double strBuffer[]; + double atrBuffer[]; + double strPriceBuffer[]; + double strUpBuffer[]; + double strDownBuffer[]; + double strStateBuffer[]; + + // + void Calculate( + int maxRequiredBars = 100 // + ) + { + // + // Buffers ... + + // + // STR ... + CopyBuffer( + mHandler, + X121_XSTR_LINE, + 0, + maxRequiredBars, + strBuffer + // + ); + + // + // State ... + CopyBuffer( + mHandler, + X121_XSTR_STATE_LINE, + 0, + maxRequiredBars, + strStateBuffer + // + ); + + // + // Price ... + CopyBuffer( + mHandler, + X121_XSTR_PRICE_LINE, + 0, + maxRequiredBars, + strPriceBuffer + // + ); + + // + // Up ... + CopyBuffer( + mHandler, + X121_XSTR_UP_LINE, + 0, + maxRequiredBars, + strUpBuffer + // + ); + + // + // STR ... + CopyBuffer( + mHandler, + X121_XSTR_DOWN_LINE, + 0, + maxRequiredBars, + strDownBuffer + // + ); + + // + // ATR ... + + // + CopyBuffer( + mHandler, + X121_XSTR_ATR_LINE, + 0, + maxRequiredBars, + atrBuffer + // + ); + } + + // + void Cleanup( + int maxAllowed = 100 // + ) + { + // + CleanupArray( + strBuffer, + maxAllowed // + ); + + // + CleanupArray( + atrBuffer, + maxAllowed // + ); + + // + CleanupArray( + strPriceBuffer, + maxAllowed // + ); + + // + CleanupArray( + strUpBuffer, + maxAllowed // + ); + + // + CleanupArray( + strDownBuffer, + maxAllowed // + ); + + // + CleanupArray( + strStateBuffer, + maxAllowed // + ); + + // + } + + // +}; + +// +// Tools ... \ No newline at end of file diff --git a/BKPS/14031206/Helpers/x-saherelm.x121.xtrend.helper.ex5 b/BKPS/14031206/Helpers/x-saherelm.x121.xtrend.helper.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..92f4630043611cd0e9d82268f1dc3b63678a9690 GIT binary patch literal 6604 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 osEjt(P()&Ah`}fcU$k%nEAHzg^ 0 && + // + // ADX ... + adxLength > 0 && + adxThreshold > 0 + // + ; + + // + return result; + } + + // + // Retrieve MAx Length ... + int Max() + { + // + int result = 0; + + // + result = MathMax(maLength, adxLength); + + // + return result; + } +}; + +// +// Conditions ... +struct X121XTRENDConditions +{ + // + // Common ... + string symbol; + ENUM_TIMEFRAMES period; + datetime time; + + // + // Buffers ... + double upTrendBuffer[]; + double downTrendBuffer[]; + double maBuffer[]; + double adxBuffer[]; + double adxPBuffer[]; + double adxMBuffer[]; + double upTBuffer[]; + double downTBuffer[]; + + // + // Conditions ... + + // + bool isTrendBullish; + bool isTrendBearish; + + // + bool isTrendSwitchedToBullish; + bool isTrendSwitchedToBearish; + + // + // bool isCloseLower + + // + // Constructor ... + X121XTRENDConditions() + { + Clean(); + } + + // + // Tools ... + + /** + * Cleaning Up ... + */ + void Clean() + { + // + // Commons ... + symbol = NULL; + period = NULL; + time = NULL; + + // + // Buffers ... + + // + Clean(upTrendBuffer); + Clean(downTrendBuffer); + Clean(maBuffer); + Clean(adxBuffer); + Clean(adxPBuffer); + Clean(adxMBuffer); + Clean(upTBuffer); + Clean(downTBuffer); + + // + ArraySetAsSeries(upTrendBuffer, true); + ArraySetAsSeries(downTrendBuffer, true); + ArraySetAsSeries(maBuffer, true); + ArraySetAsSeries(adxBuffer, true); + ArraySetAsSeries(adxPBuffer, true); + ArraySetAsSeries(adxMBuffer, true); + ArraySetAsSeries(upTBuffer, true); + ArraySetAsSeries(downTBuffer, true); + + // + // Conditions ... + + // + isTrendBullish = false; + isTrendBearish = false; + + // + isTrendSwitchedToBullish = false; + isTrendSwitchedToBearish = false; + + // + ZeroMemory(this); + } + + /** + * Generate Conditions Scores ... + * + * @param bullishScore: Double, Directional Scores Reference ... + * @param bearishScore: Double, Directional Scores Reference ... + */ + void GenerateScore( + double &bullishScore, + double &bearishScore // + ) + { + // + bullishScore = 0; + bearishScore = 0; + + // + // TODO: Implement if Required ... + } + + /** + * Generate Summary String for Represent Conditions State ... + * + * @param onlyCommons: Boolean, Just Generate Only Commons Conditions ... + * @param onlyConditions: Boolean, Just Generate Only Conditions ... + * @param includeScores: Boolean, Attach Scores Representations on Result ... + * @param ignoreFalseConditions: Boolean, Ignore False Conditions on Result ... + * @param separator: String, Separate Lines ... + * + * @return ( string ) + */ + string GenerateSummary( + bool onlyCommons = false, + bool onlyConditions = false, + bool includeScores = true, + bool ignoreFalseConditions = true, + string separator = "\n" // + ) + { + // + string result = NULL; + + // + double bullishScore = 0; + double bearishScore = 0; + GenerateScore( + bullishScore, + bearishScore // + ); + + // + string scoresStr = + // + "Scores: " + separator + + "---------------" + separator + + "Bullish: " + ToString(bullishScore) + separator + + "Bearish: " + ToString(bearishScore) + separator + + "" + // + ; + + // + string commonStr = GenerateSpecifiedCommonSummary( + this, + separator, + includeScores // + ); + + // + string conditionsStr = + // + ToString("isTrendBullish", isTrendBullish, ignoreFalseConditions, separator) + + ToString("isTrendBearish", isTrendBearish, ignoreFalseConditions, separator) + + ToString("isTrendSwitchedToBullish", isTrendSwitchedToBullish, ignoreFalseConditions, separator) + + ToString("isTrendSwitchedToBearish", isTrendSwitchedToBearish, ignoreFalseConditions, separator) + + // + "" + // + ; + + // + result = + // + "[" + GetTag() + "]" + separator + + (onlyConditions + ? "" + : commonStr) + + (!includeScores + ? "" + : scoresStr) + + " " + separator + + (onlyCommons + ? "" + : conditionsStr) + + "" + // + ; + + // + return result; + } + + /** + * Retrieve nique Tag Identifier ... + * + * @return ( string ) + */ + string GetTag() + { + return GetTypeName(this); + } + + // +}; + +// +// Class ... +class XCX121XTRENDHelper : public XCBaseHelper +{ + // + // Public ... + public: + // + // Props ... + + // + // Constructors ... + XCX121XTRENDHelper() + : XCBaseHelper(_Symbol, _Period) + { + } + + // + // Deconstructor ... + ~XCX121XTRENDHelper() + { + // + mInputs.Clean(); + + // + Clean(upTrendBuffer); + Clean(downTrendBuffer); + Clean(maBuffer); + Clean(adxBuffer); + Clean(adxPBuffer); + Clean(adxMBuffer); + Clean(upTBuffer); + Clean(downTBuffer); + } + + // + // Tools ... + bool Init( + string symbol, // Trading Symbol + ENUM_TIMEFRAMES period, // Trading Period + X121XTRENDInputs &inputs // Inputs + ) + { + // + bool result = false; + + // + mSymbol = symbol; + mPeriod = period; + + // + result = inputs.IsValid(); + if (!result) + { + return result; + } + + // + ArraySetAsSeries(upTrendBuffer, true); + ArraySetAsSeries(downTrendBuffer, true); + ArraySetAsSeries(maBuffer, true); + ArraySetAsSeries(adxBuffer, true); + ArraySetAsSeries(adxPBuffer, true); + ArraySetAsSeries(adxMBuffer, true); + ArraySetAsSeries(upTBuffer, true); + ArraySetAsSeries(downTBuffer, true); + + // + mInputs = inputs; + + // + mHandler = iCustom( + mSymbol, + mPeriod, + "x-saherelm.x121.xtrend", + // + // Inputs ... + // + // Market ... + "", + mInputs.trendPriceType, + // + // MA Detection ... + "", + mInputs.maLength, + mInputs.maMethod, + mInputs.maAppliedTo, + // + // ADX Detection ... + "", + mInputs.adxLength, + mInputs.adxThreshold, + // + // Presentation ... + "", + mInputs.startCalculationForLastBars, + mInputs.upTrendArrowCode, + mInputs.downTrendArrowCode, + mInputs.showOnlyTrendStart, + mInputs.showUpTrend, + mInputs.showDownTrend + // + ); + result = mHandler != INVALID_HANDLE; + if (!result) + { + return result; + } + + // + return result; + } + + // + // Inputs ... + + // + X121XTRENDInputs GetInputs() + { + return mInputs; + } + + // + bool SetInputs( + X121XTRENDInputs &inputs // Configs + ) + { + // + return Init( + mSymbol, + mPeriod, + inputs + // + ); + } + + // + // Readers ... + + // + // Up Trend ... + + // + double GetUpTrend( + int barIndex // Bar Index + ) + { + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + Calculate(); + + // + int count = ArraySize(upTrendBuffer); + if (barIndex >= count) + { + barIndex = count - 1; + } + + // + return upTrendBuffer[barIndex]; + } + + // + int CopyUpTrend( + int start, // Start + int count, // Number of Items for read + double &buffer[], // Dest Buffer + bool forceClean = true // Force To Clean buffer + ) + { + // + // Update Calculations ... + Calculate(); + + // + // Copy Items ... + return Copy( + start, + count, + upTrendBuffer, + buffer, + forceClean + // + ); + } + + // + // Down Trend ... + + // + double GetDownTrend( + int barIndex // Bar Index + ) + { + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + Calculate(); + + // + int count = ArraySize(downTrendBuffer); + if (barIndex >= count) + { + barIndex = count - 1; + } + + // + return downTrendBuffer[barIndex]; + } + + // + int CopyDownTrend( + int start, // Start + int count, // Number of Items for read + double &buffer[], // Dest Buffer + bool forceClean = true // Force To Clean buffer + ) + { + // + // Update Calculations ... + Calculate(); + + // + // Copy Items ... + return Copy( + start, + count, + downTrendBuffer, + buffer, + forceClean + // + ); + } + + // + // Ma ... + + // + double GetMA( + int barIndex // Bar Index + ) + { + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + Calculate(); + + // + int count = ArraySize(downTrendBuffer); + if (barIndex >= count) + { + barIndex = count - 1; + } + + // + return downTrendBuffer[barIndex]; + } + + // + int CopyMA( + int start, // Start + int count, // Number of Items for read + double &buffer[], // Dest Buffer + bool forceClean = true // Force To Clean buffer + ) + { + // + // Update Calculations ... + Calculate(); + + // + // Copy Items ... + return Copy( + start, + count, + downTrendBuffer, + buffer, + forceClean + // + ); + } + + // + // ADX ... + + // + double GetADX( + int barIndex // Bar Index + ) + { + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + Calculate(); + + // + int count = ArraySize(adxBuffer); + if (barIndex >= count) + { + barIndex = count - 1; + } + + // + return adxBuffer[barIndex]; + } + + // + int CopyADX( + int start, // Start + int count, // Number of Items for read + double &buffer[], // Dest Buffer + bool forceClean = true // Force To Clean buffer + ) + { + // + // Update Calculations ... + Calculate(); + + // + // Copy Items ... + return Copy( + start, + count, + adxBuffer, + buffer, + forceClean + // + ); + } + + // + // ADX P... + + // + double GetADXP( + int barIndex // Bar Index + ) + { + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + Calculate(); + + // + int count = ArraySize(adxPBuffer); + if (barIndex >= count) + { + barIndex = count - 1; + } + + // + return adxPBuffer[barIndex]; + } + + // + int CopyADXP( + int start, // Start + int count, // Number of Items for read + double &buffer[], // Dest Buffer + bool forceClean = true // Force To Clean buffer + ) + { + // + // Update Calculations ... + Calculate(); + + // + // Copy Items ... + return Copy( + start, + count, + adxPBuffer, + buffer, + forceClean + // + ); + } + + // + // ADX M ... + + // + double GetADXM( + int barIndex // Bar Index + ) + { + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + Calculate(); + + // + int count = ArraySize(adxMBuffer); + if (barIndex >= count) + { + barIndex = count - 1; + } + + // + return adxMBuffer[barIndex]; + } + + // + int CopyADXM( + int start, // Start + int count, // Number of Items for read + double &buffer[], // Dest Buffer + bool forceClean = true // Force To Clean buffer + ) + { + // + // Update Calculations ... + Calculate(); + + // + // Copy Items ... + return Copy( + start, + count, + adxMBuffer, + buffer, + forceClean + // + ); + } + + // + // Up Trend ... + + // + double GetUpT( + int barIndex // Bar Index + ) + { + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + Calculate(); + + // + int count = ArraySize(upTBuffer); + if (barIndex >= count) + { + barIndex = count - 1; + } + + // + return upTBuffer[barIndex]; + } + + // + int CopyUpT( + int start, // Start + int count, // Number of Items for read + double &buffer[], // Dest Buffer + bool forceClean = true // Force To Clean buffer + ) + { + // + // Update Calculations ... + Calculate(); + + // + // Copy Items ... + return Copy( + start, + count, + upTBuffer, + buffer, + forceClean + // + ); + } + + // + // Down Trend ... + + // + double GetDownT( + int barIndex // Bar Index + ) + { + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + Calculate(); + + // + int count = ArraySize(downTBuffer); + if (barIndex >= count) + { + barIndex = count - 1; + } + + // + return downTBuffer[barIndex]; + } + + // + int CopyDownT( + int start, // Start + int count, // Number of Items for read + double &buffer[], // Dest Buffer + bool forceClean = true // Force To Clean buffer + ) + { + // + // Update Calculations ... + Calculate(); + + // + // Copy Items ... + return Copy( + start, + count, + downTBuffer, + buffer, + forceClean + // + ); + } + + // + void Free() override + { + Cleanup(10); + } + + // + bool GetConditions( + X121XTRENDConditions &conditions, // + int barIndex = 0, // + int loopback = 5 // + ) + { + // + bool result = true; + + // + if (loopback < 5) + { + loopback = 5; + } + + // + conditions.Clean(); + + // + conditions.symbol = mSymbol; + conditions.period = mPeriod; + conditions.time = TimeCurrent(); + + // + int zIndex = barIndex; + int cIndex = zIndex + 1; + int pIndex = cIndex + 1; + int ppIndex = pIndex + 1; + + // + XOHCL zBar; + result = zBar.Init( + mSymbol, + mPeriod, + zIndex // + ); + if (!result) + { + return result; + } + + // + XOHCL cBar; + result = cBar.Init( + mSymbol, + mPeriod, + cIndex // + ); + if (!result) + { + return result; + } + + // + XOHCL pBar; + result = pBar.Init( + mSymbol, + mPeriod, + pIndex // + ); + if (!result) + { + return result; + } + + // + // Buffers ... + + // + CopyUpTrend( + zIndex, + loopback, + conditions.upTrendBuffer // + ); + + // + CopyDownTrend( + zIndex, + loopback, + conditions.downTrendBuffer // + ); + + // + CopyMA( + zIndex, + loopback, + conditions.maBuffer // + ); + + // + CopyADX( + zIndex, + loopback, + conditions.adxBuffer // + ); + + // + CopyADXP( + zIndex, + loopback, + conditions.adxPBuffer // + ); + + // + CopyADXM( + zIndex, + loopback, + conditions.adxMBuffer // + ); + + // + CopyUpT( + zIndex, + loopback, + conditions.upTBuffer // + ); + + // + CopyDownT( + zIndex, + loopback, + conditions.downTBuffer // + ); + + // + // Conditions ... + + // + int cIDX = 1; + int pIDX = cIDX + 1; + + // + bool isTrendBullish = upTBuffer[cIDX] != 0; + bool isTrendBullishPrev = upTBuffer[pIDX] != 0; + + // + bool isTrendBearish = downTBuffer[cIDX] != 0; + bool isTrendBearishPrev = downTBuffer[pIDX] != 0; + + // + bool isTrendSwitchedToBullish = isTrendBullish && + !isTrendBullishPrev; + bool isTrendSwitchedToBearish = isTrendBearish && + !isTrendBearishPrev; + + // + conditions.isTrendBullish = isTrendBullish; + conditions.isTrendBearish = isTrendBearish; + conditions.isTrendSwitchedToBullish = isTrendSwitchedToBullish; + conditions.isTrendSwitchedToBearish = isTrendSwitchedToBearish; + + // + Cleanup(); + + // + zBar.Clean(); + cBar.Clean(); + pBar.Clean(); + + // + return result; + } + + // + // Protected ... + protected: + // + // Private ... + private: + // + // Props ... + X121XTRENDInputs mInputs; // Inputs ... + + // + // Buffers ... + double upTrendBuffer[]; + double downTrendBuffer[]; + double maBuffer[]; + double adxBuffer[]; + double adxPBuffer[]; + double adxMBuffer[]; + double upTBuffer[]; + double downTBuffer[]; + + // + void Calculate( + int maxRequiredBars = 100 // + ) + { + // + // Buffers ... + + // + // Up Trend ... + CopyBuffer( + mHandler, + X121_XTREND_UP_LINE, + 0, + maxRequiredBars, + upTrendBuffer + // + ); + + // + // Down Trend ... + CopyBuffer( + mHandler, + X121_XTREND_DOWN_LINE, + 0, + maxRequiredBars, + downTrendBuffer + // + ); + + // + // MA ... + CopyBuffer( + mHandler, + X121_XTREND_MA_LINE, + 0, + maxRequiredBars, + maBuffer + // + ); + + // + // ADX ... + CopyBuffer( + mHandler, + X121_XTREND_ADX_LINE, + 0, + maxRequiredBars, + adxBuffer + // + ); + + // + // ADX P ... + CopyBuffer( + mHandler, + X121_XTREND_ADX_P_LINE, + 0, + maxRequiredBars, + adxPBuffer + // + ); + + // + // ADX M ... + CopyBuffer( + mHandler, + X121_XTREND_ADX_M_LINE, + 0, + maxRequiredBars, + adxMBuffer + // + ); + + // + // Up T ... + CopyBuffer( + mHandler, + X121_XTREND_UP_T_LINE, + 0, + maxRequiredBars, + upTBuffer + // + ); + + // + // Down T ... + CopyBuffer( + mHandler, + X121_XTREND_DOWN_T_LINE, + 0, + maxRequiredBars, + downTBuffer + // + ); + } + + // + void Cleanup( + int maxAllowed = 100 // + ) + { + // + CleanupArray( + upTrendBuffer, + maxAllowed // + ); + + // + CleanupArray( + downTrendBuffer, + maxAllowed // + ); + + // + CleanupArray( + maBuffer, + maxAllowed // + ); + + // + CleanupArray( + adxBuffer, + maxAllowed // + ); + + // + CleanupArray( + adxPBuffer, + maxAllowed // + ); + + // + CleanupArray( + adxMBuffer, + maxAllowed // + ); + + // + CleanupArray( + upTBuffer, + maxAllowed // + ); + + // + CleanupArray( + downTBuffer, + maxAllowed // + ); + + // + } + + // +}; + +// +// Tools ... \ No newline at end of file diff --git a/BKPS/14031206/Helpers/x-saherelm.x121.xvwap.helper.ex5 b/BKPS/14031206/Helpers/x-saherelm.x121.xvwap.helper.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..13e0556340ea09da651cefee388cfd85ef45ec17 GIT binary patch literal 6986 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 F{SUm0S!MtL literal 0 HcmV?d00001 diff --git a/BKPS/14031206/Helpers/x-saherelm.x121.xvwap.helper.mq5 b/BKPS/14031206/Helpers/x-saherelm.x121.xvwap.helper.mq5 new file mode 100644 index 0000000..769dfa9 --- /dev/null +++ b/BKPS/14031206/Helpers/x-saherelm.x121.xvwap.helper.mq5 @@ -0,0 +1,1508 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 Helper Class Library +// ---------------------------------------------- +// Name: XCX121XVWAPHelper +// Description: provides all Indicator +// Helper requirements ... +// +// +// Maintainer: +// ------------ +// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) +// +////////////////////////////////////////////////////// +// +// Global Properties ... +#property library +#property copyright "Copyright 2023, SaherElm IT Center" +#property link "https://www.saherelm.ir" +#property version "1.00" +#property strict + +// +// Imports ... +#include "../Classes/x-saherelm.x-helper.class.mq5" + +// +// Definitions ... + +// +// Definitions ... +enum ENUM_X121_XVWAP_BUFFERS +{ + // + X121_XVWAP_FAST_LINE = 0, + X121_XVWAP_FAST_STATE_LINE = 8, + X121_XVWAP_MID_LINE = 2, + X121_XVWAP_MID_STATE_LINE = 9, + X121_XVWAP_SLOW_LINE = 4, + X121_XVWAP_SLOW_STATE_LINE = 10, + X121_XVWAP_VOLUME_LINE = 6, + X121_XVWAP_PRICE_LINE = 7, +}; + +// +enum ENUM_XVWAP_STATES +{ + XVWAP_STATE_BULLISH = 1, + XVWAP_STATE_BEARISH = 2, + XVWAP_STATE_NEUTURAL = 3, +}; + +// +// Input Models ... +struct X121XVWAPInputs +{ + // + // Props ... + + int vwapFastLength; // Fast Length + int vwapMidLength; // Mid Length + int vwapSlowLength; // Slow Length + ENUM_APPLIED_PRICE vwapAppliedTo; // Applied To + + // + int startCalculationForLastBars; // Calculate Last n Bars + + // + bool showVWapFast; // Show VWap Fast + bool showVWapMedium; // Show VWap Medium + bool showVWapSlow; // Show VWap Slow + + // + // Constructor(s) ... + X121XVWAPInputs() + { + // + Clean(); + } + + // + // Tools ... + + // + // Clean ... + void Clean() + { + // + vwapFastLength = 0; + vwapMidLength = 0; + vwapSlowLength = 0; + vwapAppliedTo = PRICE_CLOSE; + + // + startCalculationForLastBars = 0; + + // + showVWapFast = false; + showVWapMedium = false; + showVWapSlow = false; + + // + ZeroMemory(this); + } + + // + // Default ... + void Default() + { + // + vwapFastLength = 20; + vwapMidLength = 40; + vwapSlowLength = 60; + vwapAppliedTo = PRICE_CLOSE; + + // + startCalculationForLastBars = 1000; + + // + showVWapFast = true; + showVWapMedium = true; + showVWapSlow = true; + } + + // + // Validate ... + bool IsValid() + { + // + bool result = false; + + // + result = + // + vwapFastLength > 2 && + vwapMidLength > vwapFastLength && + vwapSlowLength > vwapMidLength + // + ; + + // + return result; + } + + // + // Retrieve MAx Length ... + int Max() + { + // + int result = 0; + + // + result = MathMax(vwapFastLength, vwapMidLength); + result = MathMax(result, vwapSlowLength); + + // + return result; + } +}; + +// +// Conditions ... +struct X121XVWAPConditions +{ + // + // Common ... + string symbol; + ENUM_TIMEFRAMES period; + datetime time; + + // + // Buffers ... + double vwapFastBuffer[]; + double vwapMidBuffer[]; + double vwapSlowBuffer[]; + double vwapVolumeBuffer[]; + double vwapPriceBuffer[]; + double vwapFastStateBuffer[]; + double vwapMidStateBuffer[]; + double vwapSlowStateBuffer[]; + + // + // Conditions ... + + // + bool isVWapFastBullish; + bool isVWapFastBearish; + bool isVWapFastNeutural; + + // + bool isVWapMidBullish; + bool isVWapMidBearish; + bool isVWapMidNeutural; + + // + bool isVWapSlowBullish; + bool isVWapSlowBearish; + bool isVWapSlowNeutural; + + // + bool isVWapFastOverMid; + bool isVWapMidOverSlow; + + // + bool isVWapFastUnderMid; + bool isVWapMidUnderSlow; + + // + bool isVWapBullishState; + bool isVWapBearishState; + bool isVWapNeuturalState; + + // + bool isVWapBullishOrdered; + bool isVWapBearishOrdered; + + // + bool isVWapSwitchedToBullishOrdered; + bool isVWapSwitchedToBearishOrdered; + + // + bool isVWapSwitchedToBullishState; + bool isVWapSwitchedToBearishState; + bool isVWapSwitchedToNeuturalState; + + // + // Constructor ... + X121XVWAPConditions() + { + Clean(); + } + + // + // Tools ... + + /** + * Cleaning Up ... + */ + void Clean() + { + // + // Commons ... + symbol = NULL; + period = NULL; + time = NULL; + + // + // Buffers ... + + // + Clean(vwapFastBuffer); + Clean(vwapMidBuffer); + Clean(vwapSlowBuffer); + Clean(vwapVolumeBuffer); + Clean(vwapPriceBuffer); + Clean(vwapFastStateBuffer); + Clean(vwapMidStateBuffer); + Clean(vwapSlowStateBuffer); + + // + ArraySetAsSeries(vwapFastBuffer, true); + ArraySetAsSeries(vwapMidBuffer, true); + ArraySetAsSeries(vwapSlowBuffer, true); + ArraySetAsSeries(vwapVolumeBuffer, true); + ArraySetAsSeries(vwapPriceBuffer, true); + ArraySetAsSeries(vwapFastStateBuffer, true); + ArraySetAsSeries(vwapMidStateBuffer, true); + ArraySetAsSeries(vwapSlowStateBuffer, true); + + // + // Conditions ... + + // + isVWapFastBullish = false; + isVWapFastBearish = false; + isVWapFastNeutural = false; + + // + isVWapMidBullish = false; + isVWapMidBearish = false; + isVWapMidNeutural = false; + + // + isVWapSlowBullish = false; + isVWapSlowBearish = false; + isVWapSlowNeutural = false; + + // + isVWapFastOverMid = false; + isVWapMidOverSlow = false; + + // + isVWapFastUnderMid = false; + isVWapMidUnderSlow = false; + + // + isVWapBullishState = false; + isVWapBearishState = false; + isVWapNeuturalState = false; + + // + isVWapBullishOrdered = false; + isVWapBearishOrdered = false; + + // + isVWapSwitchedToBullishOrdered = false; + isVWapSwitchedToBearishOrdered = false; + + // + isVWapSwitchedToBullishState = false; + isVWapSwitchedToBearishState = false; + isVWapSwitchedToNeuturalState = false; + + // + ZeroMemory(this); + } + + /** + * Generate Conditions Scores ... + * + * @param bullishScore: Double, Directional Scores Reference ... + * @param bearishScore: Double, Directional Scores Reference ... + */ + void GenerateScore( + double &bullishScore, + double &bearishScore // + ) + { + // + bullishScore = 0; + bearishScore = 0; + + // + // TODO: Implement if Required ... + } + + /** + * Generate Summary String for Represent Conditions State ... + * + * @param onlyCommons: Boolean, Just Generate Only Commons Conditions ... + * @param onlyConditions: Boolean, Just Generate Only Conditions ... + * @param includeScores: Boolean, Attach Scores Representations on Result ... + * @param ignoreFalseConditions: Boolean, Ignore False Conditions on Result ... + * @param separator: String, Separate Lines ... + * + * @return ( string ) + */ + string GenerateSummary( + bool onlyCommons = false, + bool onlyConditions = false, + bool includeScores = true, + bool ignoreFalseConditions = true, + string separator = "\n" // + ) + { + // + string result = NULL; + + // + double bullishScore = 0; + double bearishScore = 0; + GenerateScore( + bullishScore, + bearishScore // + ); + + // + string scoresStr = + // + "Scores: " + separator + + "---------------" + separator + + "Bullish: " + ToString(bullishScore) + separator + + "Bearish: " + ToString(bearishScore) + separator + + "" + // + ; + + // + string commonStr = GenerateSpecifiedCommonSummary( + this, + separator, + includeScores // + ); + + // + string conditionsStr = + // + ToString("isVWapFastBullish", isVWapFastBullish, ignoreFalseConditions, separator) + + ToString("isVWapFastBearish", isVWapFastBearish, ignoreFalseConditions, separator) + + ToString("isVWapFastNeutural", isVWapFastNeutural, ignoreFalseConditions, separator) + + ToString("isVWapMidBullish", isVWapMidBullish, ignoreFalseConditions, separator) + + ToString("isVWapMidBearish", isVWapMidBearish, ignoreFalseConditions, separator) + + ToString("isVWapMidNeutural", isVWapMidNeutural, ignoreFalseConditions, separator) + + ToString("isVWapSlowBullish", isVWapSlowBullish, ignoreFalseConditions, separator) + + ToString("isVWapSlowBearish", isVWapSlowBearish, ignoreFalseConditions, separator) + + ToString("isVWapSlowNeutural", isVWapSlowNeutural, ignoreFalseConditions, separator) + + ToString("isVWapFastOverMid", isVWapFastOverMid, ignoreFalseConditions, separator) + + ToString("isVWapMidOverSlow", isVWapMidOverSlow, ignoreFalseConditions, separator) + + ToString("isVWapFastUnderMid", isVWapFastUnderMid, ignoreFalseConditions, separator) + + ToString("isVWapMidUnderSlow", isVWapMidUnderSlow, ignoreFalseConditions, separator) + + ToString("isVWapBullishState", isVWapBullishState, ignoreFalseConditions, separator) + + ToString("isVWapBearishState", isVWapBearishState, ignoreFalseConditions, separator) + + ToString("isVWapNeuturalState", isVWapNeuturalState, ignoreFalseConditions, separator) + + ToString("isVWapBullishOrdered", isVWapBullishOrdered, ignoreFalseConditions, separator) + + ToString("isVWapBearishOrdered", isVWapBearishOrdered, ignoreFalseConditions, separator) + + ToString("isVWapSwitchedToBullishOrdered", isVWapSwitchedToBullishOrdered, ignoreFalseConditions, separator) + + ToString("isVWapSwitchedToBearishOrdered", isVWapSwitchedToBearishOrdered, ignoreFalseConditions, separator) + + ToString("isVWapSwitchedToBullishState", isVWapSwitchedToBullishState, ignoreFalseConditions, separator) + + ToString("isVWapSwitchedToBearishState", isVWapSwitchedToBearishState, ignoreFalseConditions, separator) + + ToString("isVWapSwitchedToNeuturalState", isVWapSwitchedToNeuturalState, ignoreFalseConditions, separator) + + // + "" + // + ; + + // + result = + // + "[" + GetTag() + "]" + separator + + (onlyConditions + ? "" + : commonStr) + + (!includeScores + ? "" + : scoresStr) + + " " + separator + + (onlyCommons + ? "" + : conditionsStr) + + "" + // + ; + + // + return result; + } + + /** + * Retrieve nique Tag Identifier ... + * + * @return ( string ) + */ + string GetTag() + { + return GetTypeName(this); + } + + // +}; + +// +// Class ... +class XCX121XVWAPHelper : public XCBaseHelper +{ + // + // Public ... + public: + // + // Props ... + + // + // Constructors ... + XCX121XVWAPHelper() + : XCBaseHelper(_Symbol, _Period) + { + } + + // + // Deconstructor ... + ~XCX121XVWAPHelper() + { + // + mInputs.Clean(); + + // + Clean(vwapFastBuffer); + Clean(vwapMidBuffer); + Clean(vwapSlowBuffer); + Clean(vwapVolumeBuffer); + Clean(vwapPriceBuffer); + Clean(vwapFastStateBuffer); + Clean(vwapMidStateBuffer); + Clean(vwapSlowStateBuffer); + } + + // + // Tools ... + bool Init( + string symbol, // Trading Symbol + ENUM_TIMEFRAMES period, // Trading Period + X121XVWAPInputs &inputs // Inputs + ) + { + // + bool result = false; + + // + mSymbol = symbol; + mPeriod = period; + + // + result = inputs.IsValid(); + if (!result) + { + return result; + } + + // + ArraySetAsSeries(vwapFastBuffer, true); + ArraySetAsSeries(vwapMidBuffer, true); + ArraySetAsSeries(vwapSlowBuffer, true); + ArraySetAsSeries(vwapVolumeBuffer, true); + ArraySetAsSeries(vwapPriceBuffer, true); + ArraySetAsSeries(vwapFastStateBuffer, true); + ArraySetAsSeries(vwapMidStateBuffer, true); + ArraySetAsSeries(vwapSlowStateBuffer, true); + + // + mInputs = inputs; + + // + mHandler = iCustom( + mSymbol, + mPeriod, + "x-saherelm.x121.xvwap", + // + // Inputs ... + // + // Market ... + "", + mInputs.vwapFastLength, + mInputs.vwapMidLength, + mInputs.vwapSlowLength, + mInputs.vwapAppliedTo, + // + // Presentation ... + "", + // + mInputs.startCalculationForLastBars, + // + mInputs.showVWapFast, + mInputs.showVWapMedium, + mInputs.showVWapSlow + // + ); + result = mHandler != INVALID_HANDLE; + if (!result) + { + return result; + } + + // + return result; + } + + // + // Inputs ... + + // + X121XVWAPInputs GetInputs() + { + return mInputs; + } + + // + bool SetInputs( + X121XVWAPInputs &inputs // Configs + ) + { + // + return Init( + mSymbol, + mPeriod, + inputs + // + ); + } + + // + // Readers ... + + // + double GetVWapFast( + int barIndex // Bar Index + ) + { + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + Calculate(); + + // + int count = ArraySize(vwapFastBuffer); + if (barIndex >= count) + { + barIndex = count - 1; + } + + // + return vwapFastBuffer[barIndex]; + } + + // + int CopyVWapFast( + int start, // Start + int count, // Number of Items for read + double &buffer[], // Dest Buffer + bool forceClean = true // Force To Clean buffer + ) + { + // + // Update Calculations ... + Calculate(); + + // + // Copy Items ... + return Copy( + start, + count, + vwapFastBuffer, + buffer, + forceClean + // + ); + } + + // + // STATE FAST ... + + // + double GetVWapFastState( + int barIndex // Bar Index + ) + { + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + Calculate(); + + // + int count = ArraySize(vwapFastStateBuffer); + if (barIndex >= count) + { + barIndex = count - 1; + } + + // + return vwapFastStateBuffer[barIndex]; + } + + // + int CopyVWapFastState( + int start, // Start + int count, // Number of Items for read + double &buffer[], // Dest Buffer + bool forceClean = true // Force To Clean buffer + ) + { + // + // Update Calculations ... + Calculate(); + + // + // Copy Items ... + return Copy( + start, + count, + vwapFastStateBuffer, + buffer, + forceClean + // + ); + } + + // + // MID ... + + // + double GetVWapMid( + int barIndex // Bar Index + ) + { + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + Calculate(); + + // + int count = ArraySize(vwapMidBuffer); + if (barIndex >= count) + { + barIndex = count - 1; + } + + // + return vwapMidBuffer[barIndex]; + } + + // + int CopyVWapMid( + int start, // Start + int count, // Number of Items for read + double &buffer[], // Dest Buffer + bool forceClean = true // Force To Clean buffer + ) + { + // + // Update Calculations ... + Calculate(); + + // + // Copy Items ... + return Copy( + start, + count, + vwapMidBuffer, + buffer, + forceClean + // + ); + } + + // + // STATE MID ... + + // + double GetVWapMidState( + int barIndex // Bar Index + ) + { + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + Calculate(); + + // + int count = ArraySize(vwapMidStateBuffer); + if (barIndex >= count) + { + barIndex = count - 1; + } + + // + return vwapMidStateBuffer[barIndex]; + } + + // + int CopyVWapMidState( + int start, // Start + int count, // Number of Items for read + double &buffer[], // Dest Buffer + bool forceClean = true // Force To Clean buffer + ) + { + // + // Update Calculations ... + Calculate(); + + // + // Copy Items ... + return Copy( + start, + count, + vwapMidStateBuffer, + buffer, + forceClean + // + ); + } + + // + // SLOW ... + + // + double GetVWapSlowBuffer( + int barIndex // Bar Index + ) + { + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + Calculate(); + + // + int count = ArraySize(vwapSlowBuffer); + if (barIndex >= count) + { + barIndex = count - 1; + } + + // + return vwapSlowBuffer[barIndex]; + } + + // + int CopyVWapSlow( + int start, // Start + int count, // Number of Items for read + double &buffer[], // Dest Buffer + bool forceClean = true // Force To Clean buffer + ) + { + // + // Update Calculations ... + Calculate(); + + // + // Copy Items ... + return Copy( + start, + count, + vwapSlowBuffer, + buffer, + forceClean + // + ); + } + + // + // STATE SLOW ... + + // + double GetVWapSlowState( + int barIndex // Bar Index + ) + { + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + Calculate(); + + // + int count = ArraySize(vwapSlowStateBuffer); + if (barIndex >= count) + { + barIndex = count - 1; + } + + // + return vwapSlowStateBuffer[barIndex]; + } + + // + int CopyVWapSlowState( + int start, // Start + int count, // Number of Items for read + double &buffer[], // Dest Buffer + bool forceClean = true // Force To Clean buffer + ) + { + // + // Update Calculations ... + Calculate(); + + // + // Copy Items ... + return Copy( + start, + count, + vwapSlowStateBuffer, + buffer, + forceClean + // + ); + } + + // + // VOLUME ... + + // + double GetVWapVolume( + int barIndex // Bar Index + ) + { + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + Calculate(); + + // + int count = ArraySize(vwapVolumeBuffer); + if (barIndex >= count) + { + barIndex = count - 1; + } + + // + return vwapVolumeBuffer[barIndex]; + } + + // + int CopyVWapVolume( + int start, // Start + int count, // Number of Items for read + double &buffer[], // Dest Buffer + bool forceClean = true // Force To Clean buffer + ) + { + // + // Update Calculations ... + Calculate(); + + // + // Copy Items ... + return Copy( + start, + count, + vwapVolumeBuffer, + buffer, + forceClean + // + ); + } + + // + // PRICE ... + + // + double GetVWapPrice( + int barIndex // Bar Index + ) + { + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + Calculate(); + + // + int count = ArraySize(vwapPriceBuffer); + if (barIndex >= count) + { + barIndex = count - 1; + } + + // + return vwapPriceBuffer[barIndex]; + } + + // + int CopyVWapPrice( + int start, // Start + int count, // Number of Items for read + double &buffer[], // Dest Buffer + bool forceClean = true // Force To Clean buffer + ) + { + // + // Update Calculations ... + Calculate(); + + // + // Copy Items ... + return Copy( + start, + count, + vwapPriceBuffer, + buffer, + forceClean + // + ); + } + + // + // Converts to State ... + ENUM_XVWAP_STATES ToVWAPState(double value) + { + // + ENUM_XVWAP_STATES result = + value == 1 + ? XVWAP_STATE_BULLISH + : value == 2 + ? XVWAP_STATE_BEARISH + : XVWAP_STATE_NEUTURAL; + + // + return result; + } + + // + bool IsVWAPBullish(double value) + { + // + bool result = false; + + // + result = ToVWAPState(value) == XVWAP_STATE_BULLISH; + + // + return result; + } + + // + bool IsVWAPBearish(double value) + { + // + bool result = false; + + // + result = ToVWAPState(value) == XVWAP_STATE_BEARISH; + + // + return result; + } + + // + bool IsVWAPNeutural(double value) + { + // + bool result = false; + + // + result = ToVWAPState(value) == XVWAP_STATE_NEUTURAL; + + // + return result; + } + + // + void Free() override + { + Cleanup(10); + } + + // + bool GetConditions( + X121XVWAPConditions &conditions, // + int barIndex = 0, // + int loopback = 5 // + ) + { + // + bool result = true; + + // + if (loopback < 5) + { + loopback = 5; + } + + // + conditions.Clean(); + + // + conditions.symbol = mSymbol; + conditions.period = mPeriod; + conditions.time = TimeCurrent(); + + // + int zIndex = barIndex; + int cIndex = zIndex + 1; + int pIndex = cIndex + 1; + int ppIndex = pIndex + 1; + + // + XOHCL zBar; + result = zBar.Init( + mSymbol, + mPeriod, + zIndex // + ); + if (!result) + { + return result; + } + + // + XOHCL cBar; + result = cBar.Init( + mSymbol, + mPeriod, + cIndex // + ); + if (!result) + { + return result; + } + + // + XOHCL pBar; + result = pBar.Init( + mSymbol, + mPeriod, + pIndex // + ); + if (!result) + { + return result; + } + + // + // Buffers ... + + // + CopyVWapFast( + zIndex, + loopback, + conditions.vwapFastBuffer // + ); + + // + CopyVWapFastState( + zIndex, + loopback, + conditions.vwapFastStateBuffer // + ); + + // + CopyVWapMid( + zIndex, + loopback, + conditions.vwapMidBuffer // + ); + + // + CopyVWapMidState( + zIndex, + loopback, + conditions.vwapMidStateBuffer // + ); + + // + CopyVWapSlow( + zIndex, + loopback, + conditions.vwapSlowBuffer // + ); + + // + CopyVWapSlowState( + zIndex, + loopback, + conditions.vwapSlowStateBuffer // + ); + + // + CopyVWapVolume( + zIndex, + loopback, + conditions.vwapVolumeBuffer // + ); + + // + CopyVWapPrice( + zIndex, + loopback, + conditions.vwapPriceBuffer // + ); + + // + // Conditions ... + + // + int cIDX = 1; + int pIDX = cIDX + 1; + + // + // SAR ... + + // + bool isVWapFastBullish = IsVWAPBullish(conditions.vwapFastStateBuffer[cIDX]); + bool isVWapFastBullishPrev = IsVWAPBullish(conditions.vwapFastStateBuffer[pIDX]); + + // + bool isVWapFastBearish = IsVWAPBearish(conditions.vwapFastStateBuffer[cIDX]); + bool isVWapFastBearishPrev = IsVWAPBearish(conditions.vwapFastStateBuffer[pIDX]); + + // + bool isVWapFastNeutural = IsVWAPNeutural(conditions.vwapFastStateBuffer[cIDX]); + bool isVWapFastNeuturalPrev = IsVWAPNeutural(conditions.vwapFastStateBuffer[pIDX]); + + // + bool isVWapMidBullish = IsVWAPBullish(conditions.vwapMidStateBuffer[cIDX]); + bool isVWapMidBullishPrev = IsVWAPBullish(conditions.vwapMidStateBuffer[pIDX]); + + // + bool isVWapMidBearish = IsVWAPBearish(conditions.vwapMidStateBuffer[cIDX]); + bool isVWapMidBearishPrev = IsVWAPBearish(conditions.vwapMidStateBuffer[pIDX]); + + // + bool isVWapMidNeutural = IsVWAPNeutural(conditions.vwapMidStateBuffer[cIDX]); + bool isVWapMidNeuturalPrev = IsVWAPNeutural(conditions.vwapMidStateBuffer[pIDX]); + + // + bool isVWapSlowBullish = IsVWAPBullish(conditions.vwapSlowStateBuffer[cIDX]); + bool isVWapSlowBullishPrev = IsVWAPBullish(conditions.vwapSlowStateBuffer[pIDX]); + + // + bool isVWapSlowBearish = IsVWAPBearish(conditions.vwapSlowStateBuffer[cIDX]); + bool isVWapSlowBearishPrev = IsVWAPBearish(conditions.vwapSlowStateBuffer[pIDX]); + + // + bool isVWapSlowNeutural = IsVWAPNeutural(conditions.vwapSlowStateBuffer[cIDX]); + bool isVWapSlowNeuturalPrev = IsVWAPNeutural(conditions.vwapSlowStateBuffer[pIDX]); + + // + bool isVWapFastOverMid = conditions.vwapFastBuffer[cIDX] > conditions.vwapMidBuffer[cIDX]; + bool isVWapFastOverMidPrev = conditions.vwapFastBuffer[pIDX] > conditions.vwapMidBuffer[pIDX]; + + // + bool isVWapMidOverSlow = conditions.vwapMidBuffer[cIDX] > conditions.vwapSlowBuffer[cIDX]; + bool isVWapMidOverSlowPrev = conditions.vwapMidBuffer[pIDX] > conditions.vwapSlowBuffer[pIDX]; + + // + bool isVWapFastUnderMid = conditions.vwapFastBuffer[cIDX] < conditions.vwapMidBuffer[cIDX]; + bool isVWapFastUnderMidPrev = conditions.vwapFastBuffer[pIDX] < conditions.vwapMidBuffer[pIDX]; + + // + bool isVWapMidUnderSlow = conditions.vwapMidBuffer[cIDX] < conditions.vwapSlowBuffer[cIDX]; + bool isVWapMidUnderSlowPrev = conditions.vwapMidBuffer[pIDX] < conditions.vwapSlowBuffer[pIDX]; + + // + bool isVWapBullishState = isVWapFastBullish && + isVWapMidBullish && + isVWapSlowBullish; + bool isVWapBullishStatePrev = isVWapFastBullishPrev && + isVWapMidBullishPrev && + isVWapSlowBullishPrev; + + // + bool isVWapBearishState = isVWapFastBearish && + isVWapMidBearish && + isVWapSlowBearish; + bool isVWapBearishStatePrev = isVWapFastBearishPrev && + isVWapMidBearishPrev && + isVWapSlowBearishPrev; + + // + bool isVWapNeuturalState = isVWapFastNeutural && + isVWapMidNeutural && + isVWapSlowNeutural; + bool isVWapNeuturalStatePrev = isVWapFastNeuturalPrev && + isVWapMidNeuturalPrev && + isVWapSlowNeuturalPrev; + + // + bool isVWapBullishOrdered = isVWapFastOverMid && + isVWapMidOverSlow; + bool isVWapBullishOrderedPrev = isVWapFastOverMidPrev && + isVWapMidOverSlowPrev; + + // + bool isVWapBearishOrdered = isVWapFastUnderMid && + isVWapMidUnderSlow; + bool isVWapBearishOrderedPrev = isVWapFastUnderMidPrev && + isVWapMidUnderSlowPrev; + + // + bool isVWapSwitchedToBullishOrdered = isVWapBullishOrdered && + !isVWapBullishOrderedPrev; + bool isVWapSwitchedToBearishOrdered = isVWapBearishOrdered && + !isVWapBearishOrderedPrev; + + // + bool isVWapSwitchedToBullishState = isVWapBullishState && + !isVWapBullishStatePrev; + bool isVWapSwitchedToBearishState = isVWapBearishState && + !isVWapBearishStatePrev; + bool isVWapSwitchedToNeuturalState = isVWapNeuturalState && + !isVWapNeuturalStatePrev; + + // + conditions.isVWapFastBullish = isVWapFastBullish; + conditions.isVWapFastBearish = isVWapFastBearish; + conditions.isVWapFastNeutural = isVWapFastNeutural; + conditions.isVWapMidBullish = isVWapMidBullish; + conditions.isVWapMidBearish = isVWapMidBearish; + conditions.isVWapMidNeutural = isVWapMidNeutural; + conditions.isVWapSlowBullish = isVWapSlowBullish; + conditions.isVWapSlowBearish = isVWapSlowBearish; + conditions.isVWapSlowNeutural = isVWapSlowNeutural; + conditions.isVWapFastOverMid = isVWapFastOverMid; + conditions.isVWapMidOverSlow = isVWapMidOverSlow; + conditions.isVWapFastUnderMid = isVWapFastUnderMid; + conditions.isVWapMidUnderSlow = isVWapMidUnderSlow; + conditions.isVWapBullishState = isVWapBullishState; + conditions.isVWapBearishState = isVWapBearishState; + conditions.isVWapNeuturalState = isVWapNeuturalState; + conditions.isVWapBullishOrdered = isVWapBullishOrdered; + conditions.isVWapBearishOrdered = isVWapBearishOrdered; + conditions.isVWapSwitchedToBullishOrdered = isVWapSwitchedToBullishOrdered; + conditions.isVWapSwitchedToBearishOrdered = isVWapSwitchedToBearishOrdered; + conditions.isVWapSwitchedToBullishState = isVWapSwitchedToBullishState; + conditions.isVWapSwitchedToBearishState = isVWapSwitchedToBearishState; + conditions.isVWapSwitchedToNeuturalState = isVWapSwitchedToNeuturalState; + + // + Cleanup(); + + // + zBar.Clean(); + cBar.Clean(); + pBar.Clean(); + + // + return result; + } + + // + // Protected ... + protected: + // + // Private ... + private: + // + // Props ... + X121XVWAPInputs mInputs; // Inputs ... + + // + // Buffers ... + double vwapFastBuffer[]; + double vwapMidBuffer[]; + double vwapSlowBuffer[]; + double vwapVolumeBuffer[]; + double vwapPriceBuffer[]; + double vwapFastStateBuffer[]; + double vwapMidStateBuffer[]; + double vwapSlowStateBuffer[]; + + // + void Calculate( + int maxRequiredBars = 100 // + ) + { + // + // Buffers ... + + // + // FAST ... + CopyBuffer( + mHandler, + X121_XVWAP_FAST_LINE, + 0, + maxRequiredBars, + vwapFastBuffer + // + ); + + // + // FAST STATE ... + CopyBuffer( + mHandler, + X121_XVWAP_FAST_STATE_LINE, + 0, + maxRequiredBars, + vwapFastStateBuffer + // + ); + + // + // MID ... + CopyBuffer( + mHandler, + X121_XVWAP_MID_LINE, + 0, + maxRequiredBars, + vwapMidBuffer + // + ); + + // + // MID STATE ... + CopyBuffer( + mHandler, + X121_XVWAP_MID_STATE_LINE, + 0, + maxRequiredBars, + vwapMidStateBuffer + // + ); + + // + // SLOW ... + CopyBuffer( + mHandler, + X121_XVWAP_SLOW_LINE, + 0, + maxRequiredBars, + vwapSlowBuffer + // + ); + + // + // SLOW STATE ... + CopyBuffer( + mHandler, + X121_XVWAP_SLOW_STATE_LINE, + 0, + maxRequiredBars, + vwapSlowStateBuffer + // + ); + + // + // VOLUME ... + CopyBuffer( + mHandler, + X121_XVWAP_VOLUME_LINE, + 0, + maxRequiredBars, + vwapVolumeBuffer + // + ); + + // + // PRICE ... + CopyBuffer( + mHandler, + X121_XVWAP_PRICE_LINE, + 0, + maxRequiredBars, + vwapPriceBuffer + // + ); + } + + // + void Cleanup( + int maxAllowed = 100 // + ) + { + // + CleanupArray( + vwapFastBuffer, + maxAllowed // + ); + + // + CleanupArray( + vwapMidBuffer, + maxAllowed // + ); + + // + CleanupArray( + vwapSlowBuffer, + maxAllowed // + ); + + // + CleanupArray( + vwapVolumeBuffer, + maxAllowed // + ); + + // + CleanupArray( + vwapPriceBuffer, + maxAllowed // + ); + + // + CleanupArray( + vwapFastStateBuffer, + maxAllowed // + ); + + // + CleanupArray( + vwapMidStateBuffer, + maxAllowed // + ); + + // + CleanupArray( + vwapSlowStateBuffer, + maxAllowed // + ); + + // + } + + // +}; + +// +// Tools ... \ No newline at end of file diff --git a/BKPS/14031206/Indicators/Examples/AD.ex5 b/BKPS/14031206/Indicators/Examples/AD.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..7fb0d531884b69877b867f90208208afc6f775ec GIT binary patch literal 8436 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 G!hZp;jUaje literal 0 HcmV?d00001 diff --git a/BKPS/14031206/Indicators/Examples/AD.mq5 b/BKPS/14031206/Indicators/Examples/AD.mq5 new file mode 100644 index 0000000..fcacfeb --- /dev/null +++ b/BKPS/14031206/Indicators/Examples/AD.mq5 @@ -0,0 +1,90 @@ +//+------------------------------------------------------------------+ +//| AD.mq5 | +//| Copyright 2000-2025, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2000-2025, MetaQuotes Ltd." +#property link "https://www.mql5.com" +#property description "Accumulation/Distribution" + +#property indicator_separate_window +#property indicator_buffers 1 +#property indicator_plots 1 +#property indicator_type1 DRAW_LINE +#property indicator_color1 LightSeaGreen +#property indicator_label1 "A/D" +//--- input params +input ENUM_APPLIED_VOLUME InpVolumeType=VOLUME_TICK; // Volume type +//--- indicator buffer +double ExtADbuffer[]; +//+------------------------------------------------------------------+ +//| Custom indicator initialization function | +//+------------------------------------------------------------------+ +void OnInit() + { +//--- indicator digits + IndicatorSetInteger(INDICATOR_DIGITS,0); +//--- indicator short name + IndicatorSetString(INDICATOR_SHORTNAME,"A/D"); +//--- index buffer + SetIndexBuffer(0,ExtADbuffer); +//--- set index draw begin + PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,1); + } +//+------------------------------------------------------------------+ +//| Accumulation/Distribution | +//+------------------------------------------------------------------+ +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[]) + { +//--- check for bars count + if(rates_total<2) + return(0); //exit with zero result +//--- get current position + int pos=prev_calculated-1; + if(pos<0) + pos=0; +//--- calculate with appropriate volumes + if(InpVolumeType==VOLUME_TICK) + Calculate(rates_total,pos,high,low,close,tick_volume); + else + Calculate(rates_total,pos,high,low,close,volume); +//--- + return(rates_total); + } +//+------------------------------------------------------------------+ +//| Calculating with selected volume | +//+------------------------------------------------------------------+ +void Calculate(const int rates_total,const int pos, + const double &high[], + const double &low[], + const double &close[], + const long &volume[]) + { +//--- main cycle + for(int i=pos; i0) + sum+=ExtADbuffer[i-1]; + ExtADbuffer[i]=sum; + } + } +//+------------------------------------------------------------------+ diff --git a/BKPS/14031206/Indicators/Examples/ADX.ex5 b/BKPS/14031206/Indicators/Examples/ADX.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..db7e17c23cf1c868f67280dc23dde04f2874f883 GIT binary patch literal 12484 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 literal 0 HcmV?d00001 diff --git a/BKPS/14031206/Indicators/Examples/ADX.mq5 b/BKPS/14031206/Indicators/Examples/ADX.mq5 new file mode 100644 index 0000000..1019c55 --- /dev/null +++ b/BKPS/14031206/Indicators/Examples/ADX.mq5 @@ -0,0 +1,155 @@ +//+------------------------------------------------------------------+ +//| ADX.mq5 | +//| Copyright 2000-2025, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2000-2025, MetaQuotes Ltd." +#property link "https://www.mql5.com" +#property description "Average Directional Movement Index" +#include + +#property indicator_separate_window +#property indicator_buffers 6 +#property indicator_plots 3 +#property indicator_type1 DRAW_LINE +#property indicator_color1 LightSeaGreen +#property indicator_style1 STYLE_SOLID +#property indicator_width1 1 +#property indicator_type2 DRAW_LINE +#property indicator_color2 YellowGreen +#property indicator_style2 STYLE_DOT +#property indicator_width2 1 +#property indicator_type3 DRAW_LINE +#property indicator_color3 Wheat +#property indicator_style3 STYLE_DOT +#property indicator_width3 1 +#property indicator_label1 "ADX" +#property indicator_label2 "+DI" +#property indicator_label3 "-DI" +//--- input parameters +input int InpPeriodADX=14; // Period ADX +//--- indicator buffers +double ExtADXBuffer[]; +double ExtPDIBuffer[]; +double ExtNDIBuffer[]; +double ExtPDBuffer[]; +double ExtNDBuffer[]; +double ExtTmpBuffer[]; + +int ExtADXPeriod; +//+------------------------------------------------------------------+ +//| Custom indicator initialization function | +//+------------------------------------------------------------------+ +void OnInit() + { +//--- check for input parameters + if(InpPeriodADX>=100 || InpPeriodADX<=0) + { + ExtADXPeriod=14; + PrintFormat("Incorrect value for input variable Period_ADX=%d. Indicator will use value=%d for calculations.",InpPeriodADX,ExtADXPeriod); + } + else + ExtADXPeriod=InpPeriodADX; +//--- indicator buffers + SetIndexBuffer(0,ExtADXBuffer); + SetIndexBuffer(1,ExtPDIBuffer); + SetIndexBuffer(2,ExtNDIBuffer); + SetIndexBuffer(3,ExtPDBuffer,INDICATOR_CALCULATIONS); + SetIndexBuffer(4,ExtNDBuffer,INDICATOR_CALCULATIONS); + SetIndexBuffer(5,ExtTmpBuffer,INDICATOR_CALCULATIONS); +//--- indicator digits + IndicatorSetInteger(INDICATOR_DIGITS,2); +//--- set draw begin + PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,ExtADXPeriod<<1); + PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,ExtADXPeriod); + PlotIndexSetInteger(2,PLOT_DRAW_BEGIN,ExtADXPeriod); +//--- indicator short name + string short_name="ADX("+string(ExtADXPeriod)+")"; + IndicatorSetString(INDICATOR_SHORTNAME,short_name); + PlotIndexSetString(0,PLOT_LABEL,short_name); + } +//+------------------------------------------------------------------+ +//| Custom indicator iteration function | +//+------------------------------------------------------------------+ +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[]) + { +//--- checking for bars count + if(rates_total1) + start=prev_calculated-1; + else + { + start=1; + ExtPDIBuffer[0]=0.0; + ExtNDIBuffer[0]=0.0; + ExtADXBuffer[0]=0.0; + } +//--- main cycle + for(int i=start; itmp_neg) + tmp_neg=0.0; + else + { + if(tmp_posy2| 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 EKZmNfvj6}9 literal 0 HcmV?d00001 diff --git a/BKPS/14031206/Indicators/Examples/ADXW.mq5 b/BKPS/14031206/Indicators/Examples/ADXW.mq5 new file mode 100644 index 0000000..373147d --- /dev/null +++ b/BKPS/14031206/Indicators/Examples/ADXW.mq5 @@ -0,0 +1,189 @@ +//+------------------------------------------------------------------+ +//| ADXW.mq5 | +//| Copyright 2000-2025, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2000-2025, MetaQuotes Ltd." +#property link "https://www.mql5.com" +#property description "Average Directional Movement Index" +#property description "by Welles Wilder" +#include +//--- +#property indicator_separate_window +#property indicator_buffers 10 +#property indicator_plots 3 +#property indicator_type1 DRAW_LINE +#property indicator_style1 STYLE_SOLID +#property indicator_width1 1 +#property indicator_color1 LightSeaGreen +#property indicator_type2 DRAW_LINE +#property indicator_style2 STYLE_DOT +#property indicator_width2 1 +#property indicator_color2 YellowGreen +#property indicator_type3 DRAW_LINE +#property indicator_style3 STYLE_DOT +#property indicator_width3 1 +#property indicator_color3 Wheat +#property indicator_label1 "ADX Wilder" +#property indicator_label2 "+DI" +#property indicator_label3 "-DI" +//--- input parameters +input int InpPeriodADXW=14; // Period ADX +//--- indicator buffers +double ExtADXWBuffer[]; +double ExtPDIBuffer[]; +double ExtNDIBuffer[]; +double ExtPDSBuffer[]; +double ExtNDSBuffer[]; +double ExtPDBuffer[]; +double ExtNDBuffer[]; +double ExtTRBuffer[]; +double ExtATRBuffer[]; +double ExtDXBuffer[]; + +int ExtADXWPeriod; +//+------------------------------------------------------------------+ +//| Custom indicator initialization function | +//+------------------------------------------------------------------+ +void OnInit() + { +//--- check for input parameters + if(InpPeriodADXW>=100 || InpPeriodADXW<=0) + { + ExtADXWPeriod=14; + PrintFormat("Incorrect value for input variable InpPeriodADXW=%d. Indicator will use value=%d for calculations.",InpPeriodADXW,ExtADXWPeriod); + } + else + ExtADXWPeriod=InpPeriodADXW; +//--- indicator buffers + SetIndexBuffer(0,ExtADXWBuffer); + SetIndexBuffer(1,ExtPDIBuffer); + SetIndexBuffer(2,ExtNDIBuffer); +//--- calculation buffers + SetIndexBuffer(3,ExtPDBuffer,INDICATOR_CALCULATIONS); + SetIndexBuffer(4,ExtNDBuffer,INDICATOR_CALCULATIONS); + SetIndexBuffer(5,ExtDXBuffer,INDICATOR_CALCULATIONS); + SetIndexBuffer(6,ExtTRBuffer,INDICATOR_CALCULATIONS); + SetIndexBuffer(7,ExtATRBuffer,INDICATOR_CALCULATIONS); + SetIndexBuffer(8,ExtPDSBuffer,INDICATOR_CALCULATIONS); + SetIndexBuffer(9,ExtNDSBuffer,INDICATOR_CALCULATIONS); +//--- set draw begin + PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,ExtADXWPeriod<<1); + PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,ExtADXWPeriod+1); + PlotIndexSetInteger(2,PLOT_DRAW_BEGIN,ExtADXWPeriod+1); +//--- indicator short name + string short_name="ADX Wilder("+string(ExtADXWPeriod)+")"; + IndicatorSetString(INDICATOR_SHORTNAME,short_name); + PlotIndexSetString(0,PLOT_LABEL,short_name); +//--- indicator digits + IndicatorSetInteger(INDICATOR_DIGITS,2); + } +//+------------------------------------------------------------------+ +//| Custom indicator iteration function | +//+------------------------------------------------------------------+ +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[]) + { +//--- checking for bars count + if(rates_total1) + start=prev_calculated-1; + else + { + start=1; + for(int i=0; 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’X13`OX=Bi;1APy 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 Wm!wf3b|Qngc^b($j81e-7) + ExtT=InpT; + else + { + ExtT=300.0; + PrintFormat("Input parameter T has wrong value. Indicator will use T = %f.",ExtT); + } +//--- define buffers + SetIndexBuffer(0,ExtASIBuffer); + SetIndexBuffer(1,ExtSIBuffer,INDICATOR_CALCULATIONS); + SetIndexBuffer(2,ExtTRBuffer,INDICATOR_CALCULATIONS); +//--- draw begin settings + PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,1); +//--- number of digits of indicator value + IndicatorSetInteger(INDICATOR_DIGITS,2); +//--- calculate ExtTpoints value + if(_Point>1e-7) + ExtTpoints=ExtT*_Point; + else + ExtTpoints=ExtT*MathPow(10,-_Digits); + } +//+------------------------------------------------------------------+ +//| Custom indicator iteration function | +//+------------------------------------------------------------------+ +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[]) + { + if(rates_total<2) + return(0); +//--- start calculation + int pos=prev_calculated-1; +//--- correct position, when it's first iteration + if(pos<=0) + { + pos=1; + ExtASIBuffer[0]=0.0; + ExtSIBuffer[0]=0.0; + ExtTRBuffer[0]=high[0]-low[0]; + } +//--- main cycle + for(int i=pos; i=dLow && dPrevClose<=dHigh)) + { + if(dPrevClose>dHigh) + ER=MathAbs(dHigh-dPrevClose); + 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 || prev_calculated<0) + to_copy=rates_total; + else + { + to_copy=rates_total-prev_calculated; + if(prev_calculated>0) + to_copy++; + } +//--- get FastSMA buffer + if(IsStopped()) // checking for stop flag + return(0); + if(CopyBuffer(ExtFastSMAHandle,0,0,to_copy,ExtFastBuffer)<=0) + { + Print("Getting fast SMA is failed! Error ",GetLastError()); + return(0); + } +//--- get SlowSMA buffer + if(IsStopped()) // checking for stop flag + return(0); + if(CopyBuffer(ExtSlowSMAHandle,0,0,to_copy,ExtSlowBuffer)<=0) + { + Print("Getting slow SMA is failed! Error ",GetLastError()); + return(0); + } +//--- calculations + int i,start; +//--- first calculation or number of bars was changed + if(prev_calculated=ExtACBuffer[i-1]) + ExtColorBuffer[i]=0.0; // set color Green + else + ExtColorBuffer[i]=1.0; // set color Red + } +//--- return value of prev_calculated for next call + return(rates_total); + } + +//+------------------------------------------------------------------+ diff --git a/BKPS/14031206/Indicators/Examples/Alligator.ex5 b/BKPS/14031206/Indicators/Examples/Alligator.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..ba187b3eda421d478a903f4afba44e6822b2e7e6 GIT binary patch literal 15934 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 cmwi(lnjMsNx-Q?AHvj+t literal 0 HcmV?d00001 diff --git a/BKPS/14031206/Indicators/Examples/Alligator.mq5 b/BKPS/14031206/Indicators/Examples/Alligator.mq5 new file mode 100644 index 0000000..0fa617e --- /dev/null +++ b/BKPS/14031206/Indicators/Examples/Alligator.mq5 @@ -0,0 +1,148 @@ +//+------------------------------------------------------------------+ +//| Alligator.mq5 | +//| Copyright 2000-2025, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2000-2025, MetaQuotes Ltd." +#property link "https://www.mql5.com" + +//--- indicator settings +#property indicator_chart_window +#property indicator_buffers 3 +#property indicator_plots 3 +#property indicator_type1 DRAW_LINE +#property indicator_type2 DRAW_LINE +#property indicator_type3 DRAW_LINE +#property indicator_color1 Blue +#property indicator_color2 Red +#property indicator_color3 Lime +#property indicator_width1 1 +#property indicator_width2 1 +#property indicator_width3 1 +#property indicator_label1 "Jaws" +#property indicator_label2 "Teeth" +#property indicator_label3 "Lips" +//--- input parameters +input int InpJawsPeriod=13; // Jaws period +input int InpJawsShift=8; // Jaws shift +input int InpTeethPeriod=8; // Teeth period +input int InpTeethShift=5; // Teeth shift +input int InpLipsPeriod=5; // Lips period +input int InpLipsShift=3; // Lips shift +input ENUM_MA_METHOD InpMAMethod=MODE_SMMA; // Moving average method +input ENUM_APPLIED_PRICE InpAppliedPrice=PRICE_MEDIAN; // Applied price +//--- indicator buffers +double ExtJaws[]; +double ExtTeeth[]; +double ExtLips[]; +//--- handles for moving averages +int ExtJawsHandle; +int ExtTeethHandle; +int ExtLipsHandle; +//--- bars minimum for calculation +int ExtBarsMinimum; +//+------------------------------------------------------------------+ +//| Custom indicator initialization function | +//+------------------------------------------------------------------+ +void OnInit() + { +//--- indicator buffers mapping + SetIndexBuffer(0,ExtJaws,INDICATOR_DATA); + SetIndexBuffer(1,ExtTeeth,INDICATOR_DATA); + SetIndexBuffer(2,ExtLips,INDICATOR_DATA); +//--- set accuracy + IndicatorSetInteger(INDICATOR_DIGITS,_Digits); +//--- sets first bar from what index will be drawn + PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,InpJawsPeriod-1); + PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,InpTeethPeriod-1); + PlotIndexSetInteger(2,PLOT_DRAW_BEGIN,InpLipsPeriod-1); +//--- line shifts when drawing + PlotIndexSetInteger(0,PLOT_SHIFT,InpJawsShift); + PlotIndexSetInteger(1,PLOT_SHIFT,InpTeethShift); + PlotIndexSetInteger(2,PLOT_SHIFT,InpLipsShift); +//--- name for DataWindow + PlotIndexSetString(0,PLOT_LABEL,"Jaws("+string(InpJawsPeriod)+")"); + PlotIndexSetString(1,PLOT_LABEL,"Teeth("+string(InpTeethPeriod)+")"); + PlotIndexSetString(2,PLOT_LABEL,"Lips("+string(InpLipsPeriod)+")"); +//--- get MA's handles + ExtJawsHandle=iMA(NULL,0,InpJawsPeriod,0,InpMAMethod,InpAppliedPrice); + ExtTeethHandle=iMA(NULL,0,InpTeethPeriod,0,InpMAMethod,InpAppliedPrice); + ExtLipsHandle=iMA(NULL,0,InpLipsPeriod,0,InpMAMethod,InpAppliedPrice); +//--- bars minimum for calculation + ExtBarsMinimum=InpJawsPeriod+InpJawsShift; + if(ExtBarsMinimum<(InpTeethPeriod+InpTeethShift)) + ExtBarsMinimum=InpTeethPeriod+InpTeethShift; + if(ExtBarsMinimum<(InpLipsPeriod+InpLipsPeriod)) + ExtBarsMinimum=InpLipsPeriod+InpLipsPeriod; + } +//+------------------------------------------------------------------+ +//| Alligator OnCalculate function | +//+------------------------------------------------------------------+ +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[]) + { + if(rates_totalrates_total || prev_calculated<0) + to_copy=rates_total; + else + { + to_copy=rates_total-prev_calculated; + if(prev_calculated>0) + to_copy++; + } +//--- get ma buffers + if(IsStopped()) // checking for stop flag + return(0); + if(CopyBuffer(ExtJawsHandle,0,0,to_copy,ExtJaws)<=0) + { + Print("getting ExtJawsHandle is failed! Error ",GetLastError()); + return(0); + } + if(IsStopped()) // checking for stop flag + return(0); + if(CopyBuffer(ExtTeethHandle,0,0,to_copy,ExtTeeth)<=0) + { + Print("getting ExtTeethHandle is failed! Error ",GetLastError()); + return(0); + } + if(IsStopped()) // checking for stop flag + return(0); + if(CopyBuffer(ExtLipsHandle,0,0,to_copy,ExtLips)<=0) + { + Print("getting ExtLipsHandle is failed! Error ",GetLastError()); + return(0); + } +//--- return value of prev_calculated for next call + return(rates_total); + } +//+------------------------------------------------------------------+ diff --git a/BKPS/14031206/Indicators/Examples/Awesome_Oscillator.ex5 b/BKPS/14031206/Indicators/Examples/Awesome_Oscillator.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..2ac3aca406e8e1ceebd0a09d70c0d7fcdd1f0a75 GIT binary patch literal 7826 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 QX|TdX^E+cF3c&dP0aD`o_W%F@ literal 0 HcmV?d00001 diff --git a/BKPS/14031206/Indicators/Examples/Awesome_Oscillator.mq5 b/BKPS/14031206/Indicators/Examples/Awesome_Oscillator.mq5 new file mode 100644 index 0000000..7e4fd76 --- /dev/null +++ b/BKPS/14031206/Indicators/Examples/Awesome_Oscillator.mq5 @@ -0,0 +1,127 @@ +//+------------------------------------------------------------------+ +//| Awesome_Oscillator.mq5 | +//| Copyright 2000-2025, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2000-2025, MetaQuotes Ltd." +#property link "https://www.mql5.com" + +//--- indicator settings +#property indicator_separate_window +#property indicator_buffers 4 +#property indicator_plots 1 +#property indicator_type1 DRAW_COLOR_HISTOGRAM +#property indicator_color1 Green,Red +#property indicator_width1 1 +#property indicator_label1 "AO" +//--- indicator buffers +double ExtAOBuffer[]; +double ExtColorBuffer[]; +double ExtFastBuffer[]; +double ExtSlowBuffer[]; +//--- handles for MAs +int ExtFastSMAHandle; +int ExtSlowSMAHandle; + +#define DATA_LIMIT 33 +#define FAST_PERIOD 5 +#define SLOW_PERIOD 34 +//+------------------------------------------------------------------+ +//| Custom indicator initialization function | +//+------------------------------------------------------------------+ +void OnInit() + { +//--- indicator buffers mapping + SetIndexBuffer(0,ExtAOBuffer,INDICATOR_DATA); + SetIndexBuffer(1,ExtColorBuffer,INDICATOR_COLOR_INDEX); + SetIndexBuffer(2,ExtFastBuffer,INDICATOR_CALCULATIONS); + SetIndexBuffer(3,ExtSlowBuffer,INDICATOR_CALCULATIONS); +//--- set accuracy + IndicatorSetInteger(INDICATOR_DIGITS,_Digits+1); +//--- sets first bar from what index will be drawn + PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,33); +//--- name for DataWindow + IndicatorSetString(INDICATOR_SHORTNAME,"AO"); +//--- get handles + ExtFastSMAHandle=iMA(NULL,0,FAST_PERIOD,0,MODE_SMA,PRICE_MEDIAN); + ExtSlowSMAHandle=iMA(NULL,0,SLOW_PERIOD,0,MODE_SMA,PRICE_MEDIAN); + } +//+------------------------------------------------------------------+ +//| Awesome Oscillator | +//+------------------------------------------------------------------+ +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[]) + { + if(rates_total<=DATA_LIMIT) + return(0); +//--- not all data may be calculated + int calculated=BarsCalculated(ExtFastSMAHandle); + if(calculatedrates_total || prev_calculated<0) + to_copy=rates_total; + else + { + to_copy=rates_total-prev_calculated; + if(prev_calculated>0) + to_copy++; + } +//--- get FastSMA buffer + if(IsStopped()) // checking for stop flag + return(0); + if(CopyBuffer(ExtFastSMAHandle,0,0,to_copy,ExtFastBuffer)<=0) + { + Print("Getting fast SMA is failed! Error ",GetLastError()); + return(0); + } +//--- get SlowSMA buffer + if(IsStopped()) // checking for stop flag + return(0); + if(CopyBuffer(ExtSlowSMAHandle,0,0,to_copy,ExtSlowBuffer)<=0) + { + Print("Getting slow SMA is failed! Error ",GetLastError()); + return(0); + } +//--- first calculation or number of bars was changed + int i,start; + if(prev_calculated<=DATA_LIMIT) + { + for(i=0; iExtAOBuffer[i-1]) + ExtColorBuffer[i]=0.0; // set color Green + else + ExtColorBuffer[i]=1.0; // set color Red + } +//--- return value of prev_calculated for next call + return(rates_total); + } + +//+------------------------------------------------------------------+ diff --git a/BKPS/14031206/Indicators/Examples/BB.ex5 b/BKPS/14031206/Indicators/Examples/BB.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..ff363db1041d6dcc727d20d85ac012ba79631aad GIT binary patch literal 13362 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 +//--- +#property indicator_chart_window +#property indicator_buffers 4 +#property indicator_plots 3 +#property indicator_type1 DRAW_LINE +#property indicator_color1 LightSeaGreen +#property indicator_type2 DRAW_LINE +#property indicator_color2 LightSeaGreen +#property indicator_type3 DRAW_LINE +#property indicator_color3 LightSeaGreen +#property indicator_label1 "Bands middle" +#property indicator_label2 "Bands upper" +#property indicator_label3 "Bands lower" +//--- input parametrs +input int InpBandsPeriod=20; // Period +input int InpBandsShift=0; // Shift +input double InpBandsDeviations=2.0; // Deviation +//--- global variables +int ExtBandsPeriod,ExtBandsShift; +double ExtBandsDeviations; +int ExtPlotBegin=0; +//--- indicator buffer +double ExtMLBuffer[]; +double ExtTLBuffer[]; +double ExtBLBuffer[]; +double ExtStdDevBuffer[]; +//+------------------------------------------------------------------+ +//| Custom indicator initialization function | +//+------------------------------------------------------------------+ +void OnInit() + { +//--- check for input values + if(InpBandsPeriod<2) + { + ExtBandsPeriod=20; + PrintFormat("Incorrect value for input variable InpBandsPeriod=%d. Indicator will use value=%d for calculations.",InpBandsPeriod,ExtBandsPeriod); + } + else + ExtBandsPeriod=InpBandsPeriod; + if(InpBandsShift<0) + { + ExtBandsShift=0; + PrintFormat("Incorrect value for input variable InpBandsShift=%d. Indicator will use value=%d for calculations.",InpBandsShift,ExtBandsShift); + } + else + ExtBandsShift=InpBandsShift; + if(InpBandsDeviations==0.0) + { + ExtBandsDeviations=2.0; + PrintFormat("Incorrect value for input variable InpBandsDeviations=%f. Indicator will use value=%f for calculations.",InpBandsDeviations,ExtBandsDeviations); + } + else + ExtBandsDeviations=InpBandsDeviations; +//--- define buffers + SetIndexBuffer(0,ExtMLBuffer); + SetIndexBuffer(1,ExtTLBuffer); + SetIndexBuffer(2,ExtBLBuffer); + SetIndexBuffer(3,ExtStdDevBuffer,INDICATOR_CALCULATIONS); +//--- set index labels + PlotIndexSetString(0,PLOT_LABEL,"Bands("+string(ExtBandsPeriod)+") Middle"); + PlotIndexSetString(1,PLOT_LABEL,"Bands("+string(ExtBandsPeriod)+") Upper"); + PlotIndexSetString(2,PLOT_LABEL,"Bands("+string(ExtBandsPeriod)+") Lower"); +//--- indicator name + IndicatorSetString(INDICATOR_SHORTNAME,"Bollinger Bands"); +//--- indexes draw begin settings + ExtPlotBegin=ExtBandsPeriod-1; + PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,ExtBandsPeriod); + PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,ExtBandsPeriod); + PlotIndexSetInteger(2,PLOT_DRAW_BEGIN,ExtBandsPeriod); +//--- indexes shift settings + PlotIndexSetInteger(0,PLOT_SHIFT,ExtBandsShift); + PlotIndexSetInteger(1,PLOT_SHIFT,ExtBandsShift); + PlotIndexSetInteger(2,PLOT_SHIFT,ExtBandsShift); +//--- number of digits of indicator value + IndicatorSetInteger(INDICATOR_DIGITS,_Digits+1); + } +//+------------------------------------------------------------------+ +//| Bollinger Bands | +//+------------------------------------------------------------------+ +int OnCalculate(const int rates_total, + const int prev_calculated, + const int begin, + const double &price[]) + { + if(rates_total1) + pos=prev_calculated-1; + else + pos=0; +//--- main cycle + for(int i=pos; i=period) + { + for(int i=0; i4%TOv6V(ZXvKq7iBv^QJ2i?f0_RX#eWO` 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 literal 0 HcmV?d00001 diff --git a/BKPS/14031206/Indicators/Examples/BW-ZoneTrade.mq5 b/BKPS/14031206/Indicators/Examples/BW-ZoneTrade.mq5 new file mode 100644 index 0000000..dd62c1c --- /dev/null +++ b/BKPS/14031206/Indicators/Examples/BW-ZoneTrade.mq5 @@ -0,0 +1,134 @@ +//+------------------------------------------------------------------+ +//| BW-ZoneTrade.mq5 | +//| Copyright 2000-2025, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2000-2025, MetaQuotes Ltd." +#property link "https://www.mql5.com" +//--- indicator settings +#property indicator_chart_window +#property indicator_buffers 7 +#property indicator_plots 1 +#property indicator_type1 DRAW_COLOR_CANDLES +#property indicator_color1 Green,Red,Gray +#property indicator_width1 3 +#property indicator_label1 "Open;High;Low;Close" +//--- indicator buffers +double ExtOBuffer[]; +double ExtHBuffer[]; +double ExtLBuffer[]; +double ExtCBuffer[]; +double ExtColorBuffer[]; +double ExtAOBuffer[]; +double ExtACBuffer[]; +//--- handles of indicators +int ExtACHandle; +int ExtAOHandle; +//--- bars minimum for calculation +#define DATA_LIMIT 38 +//+------------------------------------------------------------------+ +//| Custom indicator initialization function | +//+------------------------------------------------------------------+ +void OnInit() + { +//--- indicator buffers mapping + SetIndexBuffer(0,ExtOBuffer,INDICATOR_DATA); + SetIndexBuffer(1,ExtHBuffer,INDICATOR_DATA); + SetIndexBuffer(2,ExtLBuffer,INDICATOR_DATA); + SetIndexBuffer(3,ExtCBuffer,INDICATOR_DATA); + SetIndexBuffer(4,ExtColorBuffer,INDICATOR_COLOR_INDEX); + SetIndexBuffer(5,ExtACBuffer,INDICATOR_CALCULATIONS); + SetIndexBuffer(6,ExtAOBuffer,INDICATOR_CALCULATIONS); +//--- + IndicatorSetInteger(INDICATOR_DIGITS,_Digits); +//--- sets first bar from what index will be drawn + IndicatorSetString(INDICATOR_SHORTNAME,"BW ZoneTrade"); +//--- don't show indicator data in DataWindow + PlotIndexSetInteger(0,PLOT_SHOW_DATA,false); +//--- sets first candle from what index will be drawn + PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,DATA_LIMIT); +//--- get handles + ExtACHandle=iAC(NULL,0); + ExtAOHandle=iAO(NULL,0); + } +//+------------------------------------------------------------------+ +//| Trade zone by Bill Williams | +//+------------------------------------------------------------------+ +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[]) + { + if(rates_totalrates_total || prev_calculated<0) + to_copy=rates_total; + else + { + to_copy=rates_total-prev_calculated; + if(prev_calculated>0) + to_copy++; + } +//--- get AC buffer + if(IsStopped()) // checking for stop flag + return(0); + if(CopyBuffer(ExtACHandle,0,0,to_copy,ExtACBuffer)<=0) + { + Print("Getting iAC is failed! Error ",GetLastError()); + return(0); + } +//--- get AO buffer + if(IsStopped()) // checking for stop flag + return(0); + if(CopyBuffer(ExtAOHandle,0,0,to_copy,ExtAOBuffer)<=0) + { + Print("Getting iAO is failed! Error ",GetLastError()); + return(0); + } +//--- set first bar from what calculation will start + int start; + if(prev_calculatedExtACBuffer[i-1] && ExtAOBuffer[i]>ExtAOBuffer[i-1]) + ExtColorBuffer[i]=0.0; + //--- check for Red Zone and set Color Red + if(ExtACBuffer[i]JOK^7xZi5F)0txQ!_HypGdw#&H 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 literal 0 HcmV?d00001 diff --git a/BKPS/14031206/Indicators/Examples/Bears.mq5 b/BKPS/14031206/Indicators/Examples/Bears.mq5 new file mode 100644 index 0000000..a8fb742 --- /dev/null +++ b/BKPS/14031206/Indicators/Examples/Bears.mq5 @@ -0,0 +1,94 @@ +//+------------------------------------------------------------------+ +//| Bears.mq5 | +//| Copyright 2000-2025, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2000-2025, MetaQuotes Ltd." +#property link "https://www.mql5.com" +#property description "Bears Power" +//--- indicator settings +#property indicator_separate_window +#property indicator_buffers 2 +#property indicator_plots 1 +#property indicator_type1 DRAW_HISTOGRAM +#property indicator_color1 Silver +#property indicator_width1 2 +//--- input parameters +input int InpBearsPeriod=13; // Period +//--- indicator buffers +double ExtBearsBuffer[]; +double ExtTempBuffer[]; +//--- handle of EMA +int ExtEmaHandle; +//+------------------------------------------------------------------+ +//| Custom indicator initialization function | +//+------------------------------------------------------------------+ +void OnInit() + { +//--- indicator buffers mapping + SetIndexBuffer(0,ExtBearsBuffer,INDICATOR_DATA); + SetIndexBuffer(1,ExtTempBuffer,INDICATOR_CALCULATIONS); +//--- + IndicatorSetInteger(INDICATOR_DIGITS,_Digits+1); +//--- sets first bar from what index will be drawn + PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,InpBearsPeriod-1); +//--- name for DataWindow and indicator subwindow label + string short_name=StringFormat("Bears(%d)",InpBearsPeriod); + IndicatorSetString(INDICATOR_SHORTNAME,short_name); +//--- get MA handle + ExtEmaHandle=iMA(_Symbol,_Period,InpBearsPeriod,0,MODE_EMA,PRICE_CLOSE); + } +//+------------------------------------------------------------------+ +//| Average True Range | +//+------------------------------------------------------------------+ +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[]) + { + if(rates_totalrates_total || prev_calculated<0) + to_copy=rates_total; + else + { + to_copy=rates_total-prev_calculated; + if(prev_calculated>0) + to_copy++; + } +//--- get ma buffers + if(IsStopped()) // checking for stop flag + return(0); + if(CopyBuffer(ExtEmaHandle,0,0,to_copy,ExtTempBuffer)<=0) + { + Print("getting ExtEmaHandle is failed! Error ",GetLastError()); + return(0); + } +//--- first calculation or number of bars was changed + int start; + if(prev_calculated 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 || prev_calculated<0) + to_copy=rates_total; + else + { + to_copy=rates_total-prev_calculated; + if(prev_calculated>0) + to_copy++; + } +//--- get ma buffers + if(IsStopped()) // checking for stop flag + return(0); + if(CopyBuffer(ExtEmaHandle,0,0,to_copy,ExtTempBuffer)<=0) + { + Print("getting ExtEmaHandle is failed! Error ",GetLastError()); + return(0); + } +//--- first calculation or number of bars was changed + int start; + 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 X6Z46rRc|02*&G032&$gM@iX~ +//--- +#property indicator_separate_window +#property indicator_buffers 4 +#property indicator_plots 1 +#property indicator_type1 DRAW_LINE +#property indicator_color1 LightSeaGreen +#property indicator_level1 -100.0 +#property indicator_level2 100.0 +#property indicator_applied_price PRICE_TYPICAL +//--- input parametrs +input int InpCCIPeriod=14; // Period +//--- indicator buffers +double ExtSPBuffer[]; +double ExtDBuffer[]; +double ExtMBuffer[]; +double ExtCCIBuffer[]; + +int ExtCCIPeriod; +double ExtMultiplyer; +//+------------------------------------------------------------------+ +//| Custom indicator initialization function | +//+------------------------------------------------------------------+ +void OnInit() + { +//--- check for input value of period + if(InpCCIPeriod<=0) + { + ExtCCIPeriod=14; + PrintFormat("Incorrect value for input variable InpCCIPeriod=%d. Indicator will use value=%d for calculations.",InpCCIPeriod,ExtCCIPeriod); + } + else + ExtCCIPeriod=InpCCIPeriod; + ExtMultiplyer=0.015/ExtCCIPeriod; +//--- define buffers + SetIndexBuffer(0,ExtCCIBuffer); + SetIndexBuffer(1,ExtDBuffer,INDICATOR_CALCULATIONS); + SetIndexBuffer(2,ExtMBuffer,INDICATOR_CALCULATIONS); + SetIndexBuffer(3,ExtSPBuffer,INDICATOR_CALCULATIONS); +//--- indicator name + string short_name=StringFormat("CCI(%d)",ExtCCIPeriod); + IndicatorSetString(INDICATOR_SHORTNAME,short_name); +//--- indexes draw begin settings + PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,ExtCCIPeriod-1); +//--- number of digits of indicator value + IndicatorSetInteger(INDICATOR_DIGITS,2); + } +//+------------------------------------------------------------------+ +//| Custom indicator iteration function | +//+------------------------------------------------------------------+ +int OnCalculate(const int rates_total, + const int prev_calculated, + const int begin, + const double &price[]) + { + int start=(ExtCCIPeriod-1)+begin; + if(rates_total0) + PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,start+(ExtCCIPeriod-1)); +//--- calculate position + int pos=prev_calculated-1; + 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 literal 0 HcmV?d00001 diff --git a/BKPS/14031206/Indicators/Examples/CHO.mq5 b/BKPS/14031206/Indicators/Examples/CHO.mq5 new file mode 100644 index 0000000..ad95ae7 --- /dev/null +++ b/BKPS/14031206/Indicators/Examples/CHO.mq5 @@ -0,0 +1,131 @@ +//+------------------------------------------------------------------+ +//| CHO.mq5 | +//| Copyright 2000-2025, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2000-2025, MetaQuotes Ltd." +#property link "https://www.mql5.com" +#property description "Chaikin Oscillator" +#include +//--- indicator settings +#property indicator_separate_window +#property indicator_buffers 4 +#property indicator_plots 1 +#property indicator_type1 DRAW_LINE +#property indicator_color1 LightSeaGreen +//--- input parameters +input int InpFastMA=3; // Fast MA period +input int InpSlowMA=10; // Slow MA period +input ENUM_MA_METHOD InpSmoothMethod=MODE_EMA; // MA method +input ENUM_APPLIED_VOLUME InpVolumeType=VOLUME_TICK; // Volumes +//--- indicator buffers +double ExtCHOBuffer[]; +double ExtFastEMABuffer[]; +double ExtSlowEMABuffer[]; +double ExtADBuffer[]; +//+------------------------------------------------------------------+ +//| Custom indicator initialization function | +//+------------------------------------------------------------------+ +void OnInit() + { +//--- indicator buffers mapping + SetIndexBuffer(0,ExtCHOBuffer,INDICATOR_DATA); + SetIndexBuffer(1,ExtFastEMABuffer,INDICATOR_CALCULATIONS); + SetIndexBuffer(2,ExtSlowEMABuffer,INDICATOR_CALCULATIONS); + SetIndexBuffer(3,ExtADBuffer,INDICATOR_CALCULATIONS); +//--- set accuracy + IndicatorSetInteger(INDICATOR_DIGITS,0); +//--- sets first bar from what index will be drawn + PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,InpSlowMA); +//--- name for DataWindow and indicator subwindow label + string short_name=StringFormat("CHO(%d,%d)",InpSlowMA,InpFastMA); + IndicatorSetString(INDICATOR_SHORTNAME,short_name); + } +//+------------------------------------------------------------------+ +//| Chaikin Oscillator | +//+------------------------------------------------------------------+ +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[]) + { + if(rates_total0) + ExtADBuffer[i]+=ExtADBuffer[i-1]; + } + } + else + { + for(i=start; i0) + ExtADBuffer[i]+=ExtADBuffer[i-1]; + } + } +//--- calculate EMA on array ExtADBuffer + AverageOnArray(InpSmoothMethod,rates_total,prev_calculated,0,InpFastMA,ExtADBuffer,ExtFastEMABuffer); + AverageOnArray(InpSmoothMethod,rates_total,prev_calculated,0,InpSlowMA,ExtADBuffer,ExtSlowEMABuffer); +//--- calculate chaikin oscillator + for(i=start; i^to{sA{RJ<>^ys#H>=(y4T} zh&n5%0{{{Q017|^0Du5Tpn(5t{d^&@2Xb&FPPNoiBK_Li{$IiW2=V`R{4eef0Ra5Z z1^^%-|5peg?ulZ3MEGGb<*E5cj=vWAlD-e2-@8C$3u_v$0dbhYQJC7{;I-ZCfAWL? zb^v>T2fz_v0WbrY1DpYb044y#{{ij)v6uj?0Gj{2G60kRq6Pp3fXjb5&i^r||Gd)w zS;hdm|6RiWGyH!PJO9@KCjb|K{y(_=AJ74801g1_|CG}KjQ&$=^Z$&V|Gx{(lw3m| zkuZW!M#{F5N8KY=Q)1&r)T2OqO+;bz!Y4kP$eHE5<~sFa@j{gZuGL`6-2~t#ew*Q| zi8biqHleBq>l(KphebRg=!&ZgHkIT!EVYJUoAQK+U_!N-Z@qaUEN`1Qjd!^Kd4Vw| z$d%U?!uU`9749ix+|jWQm{R-cF_BFdv}6 zuHD^#H2kx)UIlU)QCK1l31v>!TTNb!jzw=|X-WtvE+kMtI0AEGRG^bSvTm20B^oE3 zXW0;L)01TP2S+6)hBWoEhF`U~!V}a3*k+3PA=4=3!O-fzvqqYnl1L&&IU*3S18n8+ z)mZIpT~E;dvYzt1pwZ$r7H&LBx{1tz|70l=4(BjiRo`;?*6uJEq^?7A*`fIuK50Zw zlVmiCoh;fPZ$G?Hp5c_C;SGQbOm`P=U^0s9a-e6A5s^Q>u39dt4taPpf4Y;Z+h{2dhN&k|v^R=aJ}Z z^-Bb^IoEeq?psJ60~N?NmGSmGzF9`Uj7mZW_KMf(-pl77XZOmU9>zDV`B!QJ8Wm2o zdounIGvJv62ANN5P-+ekYxC|};flDLuMGOI>1|tRSrF&5v%X!bDp&y1!~AL6qZ4H~ z$W7YIz1VXFgBJ}p3RSpACH-|hDrsi%W(Wg54l~_?UJPUB%GHN&8U>=T^WA+^#lk+k zA<$bd<$b6hVLZ6nYQnD>o<91@Lj7=kFKY<&LZ~O|S6YZDq zAUEtVU_B{-T|MBrkDO~}hjh8ko|KpUE#B&vQUw46VJ0_E*-UE4Q>0g z;*3l5-X^qB(boiojN>2>o&}5a%h{*+t(1sWCpKX#$-kux9A`($yx}+< zVnAp8_0HyF9r?wkQk4(A(m}Yv?0YV*aODQ7KGT0q&XOYvnE#<8h9y;4+8hXm6WRWS zEhpe2*&o+81&Nlg4`T@Z?S=PFoKO9O^rP7FHRv~pevlFo^eiO5=&o^Fb%>cVrE>Ox zCeyX)3<&sZU4We2d73)1NTB(W`!->1%W(AIs$$sUHj^uQzH5dx73mDGsX*3cq8`lS z@&Q-XexkGH6Fg{UgKq&dsff=bY*zg~V*UhwV+ec#V%E=f#5`Y3Qb^&;bl=udI({V5 ztX@~IK^VjkO{-8&l||-LsFe8dnp_?0-&*m=84>%S(NQ^gMZbDtKVOc!74gB3L-mBl zWdII*GT9>Ql23D4c6a8;;-?Z2qsLPj@~+I18{WXTq|!l@wtU%YYrNuCKIM$vJE*tC za#hji_L3=(E78-e}sWu8r2rMzAdsEg9?O%szjiNDe0=wWe-Yfyj9YX2l78M#FXmCT;odJOC?4DE3B>JNUTSQMfX4{Gn<53Asq615 zyhu;&oNs>$Kq8|-caNi+q>s3@ruT*6nRBE@hhh7v@oJ85sN52FitHHc^#g@ok4Z=9 zd|W>>ATz+T()#Q{avwr1(zVUWd+UB9ty&9{fT^S_lHLd{fL>o=(ut=5em}st@*+2d z(E~Ng{3$JcCR3aP)XGBP<&wr{mbG0FBykoM0fA7D3c6%qQ^u1z1Z;>9uuC&*4g+qh zw<8G&FjWQHyO|CVaN%0nHz+Cc{u%wB#8y{d&}>2I39~>T(f7bi|CAwY9hxUlafuS~ zpOsz$%)o$%n`~@Tv}&JbYk%rDXdc9vzJD_up|7TQq{3p z9FkYmaSwBOwsrK_H(nUjVSV?gGXCs4`)kn>j`qq z3}3pu0o*LKywJ5SiVu6vn~wzZj8uK9KX*Ap3`QxcRR|0o1$rBNkz089MLC`Ik&UEK zP7|`DT_L}EZnn7%La4o1xBd;g=^5wbh`bo*{$PSHZ}Mz@mU2shHd3RM$MuBm;N7quitxKLIxlEB>xqLU2Hxr2nYe$n7Es;@Ijq ztOCDeZosCp(4ff~CpYQyMbN?;yEPnkZCOk9*mEy|h?Nz&70Wg)jq{i?%E~W^h~qVx zA8~iUP5%mM_6X>{E|5GXVc9-GBKG2{jvQyxVD*wwz|CrXlferbS~FiHEx!)V#6cM~ z>F;+55W*0|DI-+NssdH#Q@Z_X>!fV?+3G zEFJs=g~n@T*-3za(3&BKjBF}O`hq>7w?J(uYV^oLU2&lz;bqsDv+f*_D>%hEg-SMvLNRez3LdJo2GAGl*` z8B}|b!Jved&j!oPrHjHxma%aSjy0_@-oGMyG(NVQGC^4ZN~T*IntKHN3T|kBRQHLKnwG=g;C7< z9I3^CygnRd{ykhBfkhSLNMtQ3S-Bz}ECV(PlN)&_nUo|Zr7W~bTL>6lX%0V;bS7Qo z)Jld`dW$suCiaj z$p$MdLV@B3)e~{GNexRBG%)cLFExzckJ6U+;dKQZsKrIl(zV zGbHs@!#ZiOZ>N*}@qF*YDRlM~WA}OfmSm95OQ3WSNB$&fSZJR{C?haM&3hw8t-=uIbOWA z;I{I`vOFCdSUqIHx0nc~4z==yqtUmGkjNEM2o%f9$X6212z&~C*ZV5)Pd$9AS>}B& zD0gw1J@H^yjya28%4E)&pg3^T#V)T&PVNA_>*@mM8#Gi1<1QySZCn{cYYy)~9)@e) zS~wiwGkjOpjsx5_{C{c7W=JkovFgR-S|nHzxd?5EAD1JyF@4kgPF$Nq6N>$a4z zFB$+#ermgv)ZJOSm=aZV)7hIDCgY}T>!)?z##z3~Rt_9rKcTC)8qhetx8bd%3iZH- zRK!vt-2Y?mcF&n_eK^rbRl9SKC6caT^(N;eu|qGNxrT$oZ=eju>=`&U@ix1_8LaPSTRP?mXjRR_YfkRa}=T8XLB z$7P98Wg8-;VOOF~P~FGV$@SjsJqe$EDIL%!x9V!P%Q!$%<89-%j3?~cg<=x|Azx3~ z$$m=;6^Per%bIk3zJ&c4Q^(L|seYQs`@_j{4u-C8#mS61xs^r|rD)VF!Rq|Dmq28< zN`2G`H{%P2N+_Cod(ayVn@SUZOw^K%iH2q&DvrMY_v4UOEGKP&w|~W7aM%)>QRqV5 zJ&gq;laI0X-VaJ*ru|OH_hPIJ=!Y82U|zRN6D5HraP{)C90blGzm&R9JaqDec8us18Pj27b(JjOtb z=TV7#(M)FP?}}SN=$AE;|J@;3sHkDHK!NgPN^2s#8E7}&vXSWRO-#ZOCT4r|K>Ewd zh06W{SBb{g!8tru)1QJ24KHQ9PaI600tPW;e!7s24?>;boSHpRhcxy>Ho+YxHAzq# ztaXOV^Uo=oBGBOopjWO16C78=-z4E9v+Z~u9)1||-?``9a2K@xy5|h6Q%0c2ht4Mx zZPvpVQqU}>w=EQsSCY^gr^zBT{c>eeY`41l*jP`Ad*pcNNGr6w*G zJ#o+@+UJzf38Y;M%Cz$X{u0ThQ}rhz0Y6{n**@yy80{%OQ3oFKyde-2B3KcL4|E!> z{1fQn=(DahF)#p}4x_7#Lo_247L1rDzXR``+mT^AfD~1W{immmL!3D_rv&QP4o@eV zmf;oWCxno83M)s%q$jY4ob_d(c6 za{f&I^t{cp=~doBFg;iwM=)$AiPm{&C-dM__(b<%y=S`^jZbfe!6LB!(<#ABUMK#N z6mIz_Qrc4=Z`!}r288M%F%v9z_XNIVyZYmb+Jltq3ShUrkmfTT`~B~3u-?MW$|%*< zu6Ose*Y);6RAl-u@1fqe9PRu0eHA_;)yo`WRBr}za(4q@=@O#qjHnp$>50&I#`%1e zVcrgk_@zvlWv2QBl)i*$DBw$&tYAn zYeP&c-6H8ChB%OrZX???lSI{3D3G;QyA;&uKjpu_BIv4qixmrrT>kD%s^^=8UW&>M z6)Nqxf*4oBejQ^t!;J-hp%$22(qY@G4M-0)zPwne?!rf)v4a!cJY{r_1QT`9Q4`jY zfNhnU0cY`kvGy+@)v8Fw_Y#f*Q#fMvf>pJ7av>DT& zebb~S8z)fzM7%Ywd3g&B3QG$tK4uA@v=FWH`@*yx(Zpv2cQ;y;=qv`%__Aj?5c zl3fCA{51)^Hw^7((EU^>K`oAi9DFl}zy;rn5#9MYRaX`LQnC(Z9hJrH60=S)&aD@DOB}_Gg2QKqm!-q){+{2DT%} zc*Wz+cKW?v8`8;`HO?AmId6a}{|I9iYd1_!wHWaA0qK!}bTa7fOMWJ_kPBvEYWP#c ziQr2peUeC#0hSi6j`DSZZYzBpQ>?xqK@JNgJ@nc+sLC1bckKA*D1XeRFM5`9TxOZ3 zQR)VmT0$-+j{cFo3Uy;BuFdjnyk7i6c#Epa!yd+msC&%@ho0mSf?i~0{U#j}t+{#Kg9BS+$8fVNn zQOQ0X)Bji+hVnkxl#S`{KDurD;uHTT$ItE?R+H0BQ?1osQN9Qelu9(Jh3J>6g-O)5 z?r)(UGpAbOo>0pg^D8=~_IqeXw_f%5inue&)3tlE!hb|=5a@HB+raN+`gt zbtXjNt*3mOoVv`DCMzZdO{@t22Y*S-tE2#{?5e}6<~gH97vYgnO$QCz8cpUy1w`Sp z=;S0gU2K`=iu!4C4xt!mA;%Gzd%`xI*-6!4ezt266T@?%x^A;Q&!F*-&K>`QSBQYj z^vQNP9}~v;E06WvvD|w()~*fakJhR%K~(H$$u^xhx0p_s_M@eUv#OVspXJTh@N-E} zL7Iea9mCzK@8~ps$!v>IGRSIf!`0Hy8nDL*MJVtzhmpJOxR1>A9C2nLiKJuBU{Y+QW2ATNInlq)JY0=%19w0hkg(g$(E>0-~$|ric znrIn#D%8Y_qwYl@(i5!^&DU`g68kz6M_U4DB*Ej&F*Llv9GpayVpiGdg>nMX z09%?*8Dnlup|0Q8dN%ij%Y-j+gJFij`KPI7I32+;=6XC- zpPp6UNA{_prqN+4+HRfz_p|gnqruwf8xKmeH}xp`&MhtE*P3Kv_JdZw ziXqoh_WAhYl5dfFPUN|laH73uO)byS!SNuSAYxDxmG{%hMhv|vL4{|g52%Lejg+Yi z^9qCjf)lTYVE}(l_HFg$>4C5oSl1d(BmNxd7myxG_dNM~bvZF6v9yW9B@&Y)!L;3B zaUa-N5mSu2&Dapdj8!!MpA|nJQ8jO}t*2wzSdGqAo7(T~t_ zITluhpK>{71yu&0h$1tq_t)4~F4oAEyC~8L^G*UVTP$mm_{z^IY?{|W$+0h?n}}0E zdqK%)riLq2N^_$LnS4MMV-~QOX>u z3_D$CTet#{YdtiUo|abr{eKSJsINl#JW8M9^nrY*+u%3kQ)VJ=VMA|?c>VTdRAD;d zTDR83$1gAfPhGF(iSIa@y--V0LDpv!Li)RjqM~Y4!7tf}!bgV3!rfTmSKl?`1}zJV z1&9bN!ehafvCpz|_yM0WAVnZ1@W4TZcy~gN4K{;JjR=PT~1(SxJU4n(4cboQRnwFBIJO6uXCz*6u zPUF9D$c-8+c|ND?aIT6{5NCpg*eIlPAz!i;&9rk;IyJmfnir~xLgVU29;bip9odTU zYmR4BbM9~G>U2onE4ZMe_KoU66_F$g3u2N@%m0wzQDAR}uJo^saGW1#A=X0z{V`?OHK_=%B#n^`@zu)Q}rFy`>dj{r*I?RJdLMPq2@xQb1F$olnj zdSV4cIFmmro5 z#+g;H7Nsrc6co}2#;fTv>qj7AzVyXH&*p3rAhx;!)uY%o8Pw*(_nXBYgX!we8ars*((St#*X#H2W-*m&$k1q3Bd}$}BkGmX-|_vJ=%V@T2%|@GSEyEO z95_y3W?aV~<@5_gis!G+-_>b}Zl};pdtXA=DeRh;^yMl1$hgpr{-H|7KJ3nQ%CXS~&#x$2 zAk3gl?Zx++O7pIp|4aJa7Vu3+4yIxvcV}zuVV*p1>x=GOBeaeX4}7R5m(^bm3J%=l^r!1@XNmdn9CvSdL$`?A3_Mkbd>5bEj z%Hj0vF0g|#6{byl#|p(}JUrtpcc1?{^G5<$;^7(d_=}ue*c}V;EuFL{KZ1FfCFvA*)q~7tLiT z61ynL;6h==W9gy`XvfJ8=BkA57`I-rSH@SSGzkR9TVvbAFV*&+ul~cp?#nmqTlykW zv)sNE0F1LbB%#&FzyM<%nJYxgwXgbIj-O?Cdu98*z$VBZRqMga#$7lflN)HK7%c!Y zS64lOa$3weU)z=hKgMf#I_Sc#%2E>nj7#DH^@XqK_Js_yBZs#f%fHw?jZ1L6Inhb2 z`n?3-W-QgLhz8F;__pjOxOGXhFzGUclBxNcLP=ZVFQQ=AgFCKvBZ^H9Z@FV0YG7yA zPy*>WZOUXfKId9)$o%p-C4n9GzaK0Ac<NwvMG0{lRIxlh2_TGO%n4Y|P6iv1F;w`7lTxs^h(D2_~LhsR0kvQS%W2cIZm zSHl{?-G-4-v(7qk#7T95UYg2F!h=s0+x?$?a>%8gu9FLWuX7(rV2?DpV-zjD(+imEv6&GfLz|+`236mUWm=aNOfH$?yw3d&60}1ysFs9pPe( z?qSy`>T_E;ns8g8HgHv>m~kGx{9r8)!g_5d(mA>#PJt`>1%ja}N%k}pk9rRkZXZ~3 z2Giuh77?R=k7|nW7Iw0Z)G$7pMg>Dby~87pVI1DpI?&1TbcI$NywU{jVwE51d-`4&b1+9Fz0Y$KTD6PHhZ&4r*fjdU@;u98_0bT}6QAdjb*|fc4(;wZm z9?_CjxDhV>`YQz|qa@-1i_DcvWi;Reor-tela8z4w;awqXqK%l&icsSrSJv$4lJz? zD#Cux!rB}b9JM5}Fnni}RbJa@1rdTwmD1(OJ>{yu`_`oRILA^eRwE2NQpr>KUUi8ex3|?KlUiTmo9pjWWUO zRo3mNRM^^U*pYPPcttT-ufzJmB+UvPt`kj+LNHx9X^BN?6kqXvs|yac7i5L(VMiUE zWDk-iGTqk;*7^s>8Y@^u5{g^nE(FRcCG0UEZ8v5-H*lpRy7KvUJ3_x$mja25L4qeX z3hm+NjUqeCydp)&>N5*dAKb!rxh!Ae(+h_y1D(_ISvv#z>5l!og%uf_H_Z6!s=<@o2A*ov+#NKR;~-Yk+(Bo6}0cS7@!92wFa#VRg6 zLpkUX$<;rh^a`Kni2JiKP&j}9ew#0wjEse&+yJ=4i@uSlpSTgj8WE4!qEM8TDVjzH z<2Lb^q|DhORDK6^3;$!jw4F=;Tr-RUpt@+NBzNf6y`>G|%s2(X$Gdm002Fj~OB=^4 z<%t=LwNFAMye<>g0eRyE;(Fp@%N5X8OHO2O%GCd^7b=@6(c80!fv>GiU*GZiz;BG} zf2D=Nuhgz=whF#o8se>}>08Oc(fDbBFlM(kL&IPtCM`aZh0GO&EO2JOT>k~#+`F|A z8rx>_m-HW@W#Jfj7Mp6m+(+@Jma+3%jfbQYi(rN@w3%z9prsR02avy-xd;~yFAve7 z)eIuk5(y3~K}28H(<`*qXQcbBxbOEuT)M}TIFUjClyqq_Mbq6cJ_dPxg?lUUZ-bC= zo`7Ct_M5ZA(*-r5V?<;lx~uq8#OD6`gS{D`ukq>zm3mydTySnxE>d*M=c?egtiQ6` z@1O8jf}Om<*~3}NZQNo#-T@IFq)M}(yt;Q4RE*JU?5(G8O`D3uYs+%xXrw|e^ag9d zS%B6?%Sd}BMu%!_=B3d>r4#={YGcvSHGrrS__@*=f@MDpcL>~=UxBD&9ZL{HMrC-2 zw(}wH&958+HPKS%kDkEHhm@4SA@IkHQb~q>k&^IvHj(FCd_2BSYN5^tbwLIG8&SpzNuBlFh=+SNIl4TgBL0y;zQ|Eop5)tbEbtwy2b%b$kc9yi zxFk8nFWqT(m=>((&~ep8P<;xcucehxxYXfl@yYMbe>8A(Tq3;#;|D9oXEKa^fApoc zueIL6rY!aVgt#u@LES||@V^=M zi!L&%EnnL>A?&C69->e_Kt$kIeR2$+uNSh1(6tOY#52tdsy54S`}?H?-a=KUh=x!s zX|B0MC{d0cpGN!B;vYniW69{Lc&!4&2|V0$pN{<uLI|u$w!(ov01%=O?RZ>S@lf$8F)mxInA;izIP(=IZpD8j0aHR#=IYmX zu~l8it&xmYJ2hvVnSxa9J>dAJlC*H%TTcN8>BuO;4MJzvyXo!f?+9K#M|pt=g)VPp z^4sVK5|j~z!Ncz+TTg0`8*mP+vJ6gDQc_!(3K_q=VeWDLFq;q_Qd)e@EMbx7Px{9R z%{?;_Us*~FY6K78UOHCEM$R~wJH~>woo;s*DEI^g@4a~*LH#(h< z?IJ-;;7-31)h~TI4bm2HI2Do^#&0dG3YX66*BTxJVLr zLK>@#zW>j_>D&2haU{;MXw6vL2%0>CTxVoGW6P<5q|1dl-Yx72>7V7cHZ3-TF!8A7 zn1)_V)rZoGx~33Y^=eXR=f#MWe1F<`326Yp;T9>J@1e|it4i&4veg*!G0a&7q#owJ z>ENwWOEY(b&Lnq{AO*>_QJh}iur(@tt>COI)~Sn@{%T~mC^~7VblSa4F>Y&5LMo-3 zikpu8O3dNN{7=F-k-NUHQ?(pb$)*7=rDmYPjR|4Z4X1${(1xL==jF~WJ@GPynd)jo zEkv)-199?nkX)4P*?W1(7!!Eh0~*ZmarxzfapJ+AX$;7`CPwR#jUgBzY^qGuzRs96|4A!lnY)QsoDEV5a&hI_3rC(2jg4^RTfIIR4@LFk+xo~OWY82FGKbMD zn5k+xmAY_NYe31qQvIS(kB;1RnB?zl+~ zz`&c5l?HlfRq;571asCeNO>ye|>kzlS=ZhHgco8a4ibAfRa#DOi zVq}9IbD0pjGhN#dNO`7I1`rXEcR}fHH(7A63m?ynE_S zW~0b6Fwa-606T%`L1;JNWKBm7)PGZgIy9y~n`=cX6D9l%d=TqO#h)3Fd7 zFsCaJLUts|Rdt33IO`Xjl{$YLVf2i75SHCk_>B*6Gd~mh*f*jGZ^*qH5*X|5c;{*@ z>H8v|P%)(8b61T(iQ42@i2Q#OamKL} zIbtnTUogC>=cVLY&*;4GJf3|jbjDa+`(~VRz)(eu`Tp1-iakhL%C9~ z$uM`HFaoP%`YJ=dFGLqYuw+`hc8wFAU2U~y`Zt61-~0+Yuv+WHX1gtUC=j^1rlCcM zuOJ%)#tEO;16KBq?xck+lA zH?baRg#MEgM_rO_yTE-QQa|W|7o&+a1U$d?kx5>)m7-E<(R*=uC#{v85A{n1Nw^HB zydudHK=sT7ssrp|*{NPl&L`)n1mkJGJX8Rcgb7CozHfAuICPuFDSIE#Cy}pn2((t0 zGbGlyf=I)~&p?kZ4V@42L1>JK*E3mIo1dZqkl6abBrJWfywd~KTZE)%ZBR{uTBuc8 z6E8O}MNbHS2;!Ycf1@(SsJsZm_Lt`@n=hi)7l6n@Z5=&wm zep_ClVuNmaxwrY7$B?E@n9oqdE6cV&*T#M(wb%UezjD2!p)qUS^MvSTWM?tfHd0$t zt|5-LS^Z%@3`+QW$v!2eVH@79xd=rQc1;%_TXCT}f&2ja-w`Ag66f)!$h02z=>$KR zjnZvG6}6kXQ~CA*T(0q5$1iCmAqP~n!xssTWTo{@w;f65$z6`5vTGTT=Al`CvjYcd zt)!e3l9T4Ar3s@XbG9xKLT3HYo(vCXH?kwpLxgQ#oTl#T0W7t(yEJ~c<#H;VG9o$& zh64suX}JL^AQF{Zo23}$szS3ac!Tbmgl4R-%1&QK{+Y)bVXzd+jwxF`Er^!$gecTb zI+K_gv_O_g_G zNv&x9YqFX^HO{Q#apd*@A(p5{B~U`mX?qX6lk*lHp}W|7Rt$nvPYl7qwR%lqckq^+ z2y&W*ir_|YS_)I4%^gh=Hm8V(1U6CB?lBx!_4VMvje77u2{#BwPF^RJ)qtsdX_G_W7lK5SYw3bTw@O0fGHV-cYtK_1X14RNY^;D1ISC}c}&4s1v|4i(wzZkxH!E(-B} zN8v-~uM7=Awg~y9xQ}OBD9_$jz9y9)rqQX7gek(Nob^T!aZl}S1kGk@K?9hmx58;f zl48r&pcKyoa(mYNfG6G|CyG%9qQ>Vk1)lYV}DJ7_C@+wzG z#9f#1s6W?%sWI}LR1TT%B z_fu~cZ6?WG31flK!4DYYD^G2|!`%HX{gk82k0o!92~Y|QU$Xe&8WMPWtpOhw&y^jf z#d(!-9L-e9No?KXAV2F=8Z5=7%P- zr*vh6M=j;2QIKe9zM7ouQn}r}Doa^m{Et?gTQVX7nfm*u5FxlDVX`mFmV^#+72>N! zM7e2BDYU%EFYYSb7sF$qmU=_S{X@YkpVt%yenMLUVEu$E#~R{%A!J)aYGEexK^WQa z7C}lT_0=W5Wdm3AXoeCPMSHX*7r173b#{UwH%kruUtt}jcotUlKB|DY34M&j`jVl9 z-ZkF4R57cCPAtC@=u;#rdUJlQB`4t%!c&u#@2`@c&Q;G7Su0VbM|I>Hsl4Ao@y9Xt zb%~M# z)^r@|JbD1Tfjt@-s+R_ZQ{F7&5Q&gbtumgA4wLcf8sv2CTb0{m45}W@KJx(L6Dm9B ziP-2q8kbKQ20)8dFzWYamHPw}5dzp^b;+OaZOU>8L^TuMDAmF-P6KL0MgCx7*(k|w z0J~~;5w!K(({e4_08rP%2xtiLH&KT5{QN6H*RzjF+e?)g(44qOqaJqQz4i5#FKW`` zA}KeRKW8Pwb}rCU$Hw@hT2AQ(N@{M|gql=~vKw6VvcrkuoCN)3`OmX@U9n9Bl;@0M zuSv1$k~i>$8<&Fnw%wfc>o?VYNgL|KZ!LstdP^%aML z|K9?X(h*?!q#Y|ZxVBRx1Vwi9ASl={42%ZY(8o&1%KS4Q?~lL3Bu zi{dYe)UVniSwxTyu*x!N!#o;>{s6z0zQz`S3dL5OQG1{V$(cZ*A|&kaZf-sUegf&}g8%-}8J$3Px+cC0B4jcyGskN=j$c1YpwX zj$01j+nXnjyk%K_8kmAZRJ?*1(CNu>A(| zM)vwVjJ6K3GttUQPi({E8m>3=rzU~|)79!5GkbYR2EKp$U&_~DXJPBfcs3@rl1LnL z-ANd;t#Zs5^$Q!~+FUNXK+93wnKBcNecRHjhWTkPAuUXMrpQ_^b`S=hLR?@{QdtP; z&~U!#T8+1?`~b@O{CfYu$4hU@&5e7W`cS*~VvuK;s2J*B^b&;l-%F8k}QZ_&bX2Gnfv%`++}JZE(xPv#Y4Jd^boj(c^ni~lRKFM7tc zN^RZPa$4e1LuADgO7X3aeB~c%yj2S8XejR`YpU1A@h-HhyA=%m5cQB&apbuw=U^VG qZWnb`)cxc^3ToL3G0%8TUYsQINK`a7c@vo=!4v7*i@c(w{Qm%$!o5uZ literal 0 HcmV?d00001 diff --git a/BKPS/14031206/Indicators/Examples/CHV.mq5 b/BKPS/14031206/Indicators/Examples/CHV.mq5 new file mode 100644 index 0000000..9677d38 --- /dev/null +++ b/BKPS/14031206/Indicators/Examples/CHV.mq5 @@ -0,0 +1,118 @@ +//+------------------------------------------------------------------+ +//| CHV.mq5 | +//| Copyright 2000-2025, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2000-2025, MetaQuotes Ltd." +#property link "https://www.mql5.com" +#property description "Chaikin Volatility" +#include +//--- indicator settings +#property indicator_separate_window +#property indicator_buffers 3 +#property indicator_plots 1 +#property indicator_type1 DRAW_LINE +#property indicator_color1 DodgerBlue +//--- enum +enum SmoothMethod + { + SMA=0,// Simple MA + EMA=1 // Exponential MA + }; +//--- input parameters +input int InpSmoothPeriod=10; // Smoothing period +input int InpCHVPeriod=10; // CHV period +input SmoothMethod InpSmoothType=EMA; // Smoothing method +//--- indicator buffers +double ExtCHVBuffer[]; +double ExtHLBuffer[]; +double ExtSHLBuffer[]; + +int ExtSmoothPeriod,ExtCHVPeriod; +//+------------------------------------------------------------------+ +//| Custom indicator initialization function | +//+------------------------------------------------------------------+ +void OnInit() + { + string ma_name=EnumToString(InpSmoothType); +//--- check inputs + if(InpSmoothPeriod<=0) + { + ExtSmoothPeriod=10; + PrintFormat("Incorrect value for input variable InpSmoothPeriod=%d. Indicator will use value=%d for calculations.",InpSmoothPeriod,ExtSmoothPeriod); + } + else + ExtSmoothPeriod=InpSmoothPeriod; + if(InpCHVPeriod<=0) + { + ExtCHVPeriod=10; + PrintFormat("Incorrect value for input variable InpCHVPeriod=%d. Indicator will use value=%d for calculations.",InpCHVPeriod,ExtCHVPeriod); + } + else + ExtCHVPeriod=InpCHVPeriod; +//--- define buffers + SetIndexBuffer(0,ExtCHVBuffer); + SetIndexBuffer(1,ExtHLBuffer,INDICATOR_CALCULATIONS); + SetIndexBuffer(2,ExtSHLBuffer,INDICATOR_CALCULATIONS); +//--- set draw begin + PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,ExtSmoothPeriod+ExtCHVPeriod-1); +//--- set name and index label + string params=StringFormat("(%d,%s)",ExtSmoothPeriod,ma_name); + IndicatorSetString(INDICATOR_SHORTNAME,"Chaikin Volatility"+params); + PlotIndexSetString(0,PLOT_LABEL,"CHV"+params); +//--- round settings + IndicatorSetInteger(INDICATOR_DIGITS,1); + } +//+------------------------------------------------------------------+ +//| Custom indicator iteration function | +//+------------------------------------------------------------------+ +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[]) + { + int i,pos,pos_chv; +//--- check for rates total + pos_chv=ExtCHVPeriod+ExtSmoothPeriod-2; + if(rates_totalMIqH=K~lzfB8AoI#a*I0v8@M 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 +//+------------------------------------------------------------------+ +//| Indicator properties | +//+------------------------------------------------------------------+ +#property indicator_chart_window +#property indicator_buffers 0 +#property indicator_plots 0 +//+------------------------------------------------------------------+ +//| Input parameters | +//+------------------------------------------------------------------+ +input int InpFuturefBars =50; +//+------------------------------------------------------------------+ +//| global variables | +//+------------------------------------------------------------------+ +CFlameCanvas ExtCanvas; +//+------------------------------------------------------------------+ +//| Custom indicator initialization function | +//+------------------------------------------------------------------+ +int OnInit() + { + if(!ExtCanvas.FlameCreate("FlameChart",TimeCurrent(),InpFuturefBars,0)) + return(INIT_FAILED); +//--- succeed + return(INIT_SUCCEEDED); + } +//+------------------------------------------------------------------+ +//| Custom indicator deinitialization function | +//+------------------------------------------------------------------+ +void OnDeinit(const int reason) + { + } +//+------------------------------------------------------------------+ +//| Custom indicator iteration function | +//+------------------------------------------------------------------+ +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[]) + { + datetime xb1=time[rates_total-1]; + double yb1=high[rates_total-1]; + datetime xe1=xb1+InpFuturefBars*PeriodSeconds(); + double ye1=ChartGetDouble(0,CHART_PRICE_MAX); + datetime xb2=xb1; + double yb2=low[rates_total-1]; + datetime xe2=xe1; + double ye2=ChartGetDouble(0,CHART_PRICE_MIN); +//--- "nozzle" is defined using two lines: ((xb1,yb1),(xe1,ye1)) and ((xb2,yb2),(xe2,ye2)) + ExtCanvas.FlameSet(xb1,yb1,xe1,ye1,xb2,yb2,xe2,ye2); +//--- result + return(rates_total); + } +//+------------------------------------------------------------------+ +//| Custom indicator chart's event handler | +//+------------------------------------------------------------------+ +void OnChartEvent(const int id,const long& lparam,const double& dparam,const string& sparam) + { + ExtCanvas.ChartEventHandler(id,lparam,dparam,sparam); + } +//+------------------------------------------------------------------+ diff --git a/BKPS/14031206/Indicators/Examples/ColorBars.ex5 b/BKPS/14031206/Indicators/Examples/ColorBars.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..36b37aba226ba0057cb6d64b1504c5b285c23d14 GIT binary patch literal 6918 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 + { + if(tick_volume[i]>tick_volume[i-1]) + vol_up=true; + if(tick_volume[i]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 ZFAzuVxqwigXZ*T4NT_%@q6jcl{(o|wGJya9 literal 0 HcmV?d00001 diff --git a/BKPS/14031206/Indicators/Examples/ColorCandlesDaily.mq5 b/BKPS/14031206/Indicators/Examples/ColorCandlesDaily.mq5 new file mode 100644 index 0000000..bbe5826 --- /dev/null +++ b/BKPS/14031206/Indicators/Examples/ColorCandlesDaily.mq5 @@ -0,0 +1,78 @@ +//+------------------------------------------------------------------+ +//| ColorCandlesDaily.mq5 | +//| Copyright 2000-2025, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2000-2025, MetaQuotes Ltd." +#property link "https://www.mql5.com" + +#property indicator_separate_window +#property indicator_buffers 5 +#property indicator_plots 1 +//--- plot ColorCandles +#property indicator_type1 DRAW_COLOR_CANDLES +#property indicator_label1 "Open;High;Low;Close" +//--- indicator buffers +double ExtOpenBuffer[]; +double ExtHighBuffer[]; +double ExtLowBuffer[]; +double ExtCloseBuffer[]; +double ExtColorsBuffer[]; +//--- +color ExtColorOfDay[6]= {CLR_NONE,MediumSlateBlue,DarkGoldenrod,ForestGreen,BlueViolet,Red}; +//+------------------------------------------------------------------+ +//| Custom indicator initialization function | +//+------------------------------------------------------------------+ +void OnInit() + { +//--- indicator buffers mapping + SetIndexBuffer(0,ExtOpenBuffer,INDICATOR_DATA); + SetIndexBuffer(1,ExtHighBuffer,INDICATOR_DATA); + SetIndexBuffer(2,ExtLowBuffer,INDICATOR_DATA); + SetIndexBuffer(3,ExtCloseBuffer,INDICATOR_DATA); + SetIndexBuffer(4,ExtColorsBuffer,INDICATOR_COLOR_INDEX); +//--- set number of colors in color buffer + PlotIndexSetInteger(0,PLOT_COLOR_INDEXES,6); +//--- set colors for color buffer + for(int i=1; i<6; i++) + PlotIndexSetInteger(0,PLOT_LINE_COLOR,i,ExtColorOfDay[i]); +//--- set accuracy + IndicatorSetInteger(INDICATOR_DIGITS,_Digits); + PrintFormat("We have %i colors of days",PlotIndexGetInteger(0,PLOT_COLOR_INDEXES)); + } +//+------------------------------------------------------------------+ +//| Custom indicator iteration function | +//+------------------------------------------------------------------+ +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[]) + { + int pos; + MqlDateTime tstruct; +//--- + if(prev_calculated<1) + pos=0; + else + pos=prev_calculated-1; +//--- main cycle + for(int i=pos; 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 || prev_calculated<0) + to_copy=rates_total; + else + { + to_copy=rates_total-prev_calculated; + if(prev_calculated>0) + to_copy++; + } + //--- copy values of MA into indicator buffer ExtColorLineBuffer + int copied=CopyBuffer(ExtMAHandle,0,0,rates_total,ExtColorLineBuffer); + if(copied<=0) + return(0); + + ticks++; // ticks counting + if(ticks>=5) //it's time to change color scheme + { + ticks=0; // reset counter + modified++; // counter of color changes + if(modified>=3) + modified=0;// reset counter + ResetLastError(); + switch(modified) + { + case 0: // first color scheme + PlotIndexSetInteger(0,PLOT_LINE_COLOR,0,Red); + PlotIndexSetInteger(0,PLOT_LINE_COLOR,1,Blue); + PlotIndexSetInteger(0,PLOT_LINE_COLOR,2,Green); + break; + case 1: // second color scheme + PlotIndexSetInteger(0,PLOT_LINE_COLOR,0,Yellow); + PlotIndexSetInteger(0,PLOT_LINE_COLOR,1,Pink); + PlotIndexSetInteger(0,PLOT_LINE_COLOR,2,LightSlateGray); + break; + default: // third color scheme + PlotIndexSetInteger(0,PLOT_LINE_COLOR,0,LightGoldenrod); + PlotIndexSetInteger(0,PLOT_LINE_COLOR,1,Orchid); + PlotIndexSetInteger(0,PLOT_LINE_COLOR,2,LimeGreen); + } + } + else + { + //--- set start position + int start=prev_calculated-1; + //--- now we set line color for every bar + for(int i=start; iAq<#I`x{`~B~ycklcDs&4PwhEv3()>g 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 DB+7Fy literal 0 HcmV?d00001 diff --git a/BKPS/14031206/Indicators/Examples/Custom Moving Average.mq5 b/BKPS/14031206/Indicators/Examples/Custom Moving Average.mq5 new file mode 100644 index 0000000..da46371 --- /dev/null +++ b/BKPS/14031206/Indicators/Examples/Custom Moving Average.mq5 @@ -0,0 +1,199 @@ +//+------------------------------------------------------------------+ +//| Custom Moving Average.mq5 | +//| Copyright 2000-2025, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2000-2025, MetaQuotes Ltd." +#property link "https://www.mql5.com" + +//--- indicator settings +#property indicator_chart_window +#property indicator_buffers 1 +#property indicator_plots 1 +#property indicator_type1 DRAW_LINE +#property indicator_color1 Red +//--- input parameters +input int InpMAPeriod=13; // Period +input int InpMAShift=0; // Shift +input ENUM_MA_METHOD InpMAMethod=MODE_SMMA; // Method +//--- indicator buffer +double ExtLineBuffer[]; +//+------------------------------------------------------------------+ +//| Custom indicator initialization function | +//+------------------------------------------------------------------+ +void OnInit() + { +//--- indicator buffers mapping + SetIndexBuffer(0,ExtLineBuffer,INDICATOR_DATA); +//--- set accuracy + IndicatorSetInteger(INDICATOR_DIGITS,_Digits+1); +//--- set first bar from what index will be drawn + PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,InpMAPeriod); +//--- line shifts when drawing + PlotIndexSetInteger(0,PLOT_SHIFT,InpMAShift); +//--- name for DataWindow + string short_name; + switch(InpMAMethod) + { + case MODE_EMA : + short_name="EMA"; + break; + case MODE_LWMA : + short_name="LWMA"; + break; + case MODE_SMA : + short_name="SMA"; + break; + case MODE_SMMA : + short_name="SMMA"; + break; + default : + short_name="unknown ma"; + } + IndicatorSetString(INDICATOR_SHORTNAME,short_name+"("+string(InpMAPeriod)+")"); +//--- set drawing line empty value + PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0.0); + } +//+------------------------------------------------------------------+ +//| Moving Average | +//+------------------------------------------------------------------+ +int OnCalculate(const int rates_total, + const int prev_calculated, + const int begin, + const double &price[]) + { + if(rates_totalJL1Kl%IjOMFlR}-Ac z#Uqo^R~VKl9gJA*)GC^jSj(768c`G3wzZ`C2DM1L>KtzY!XL4EW-41zJH zuh7ZbI;I-Wjyc>z=w0sG!WDF+CCCGV99|k|S58oAYd}!SE~R?NGOVC~-7c2!Ux(c! zw}zC0_(8%y66RUYn5m7GU!U*z8>b=uOpk$)R<^Lp%;NXKxRaB+AaKCSV5kv|U@0eCA{*&L^c554*ToO$eq`;e+`H z&)KN*l_t}0ePdlTKN-%&auYQMOj+Z1`$)3U^vH5PkPY&Pc76q6)Hc&GNG+@#fD&30 zzx&&0!9)uM&kx&lI{Ln=4aqFAm9{gpAcrv#$ELJ~X;3D>layArA3Z>YE+i{N`!t|T z9Pj@f0RUl+Plt_&=clXCW87%Bm=~44sb*_z&5>gTyTx9Qvqku5rS}U>>#y=O?Y1)b ziB81r&0(LIns4YXo(Usx~H}T2EN{taY&MDHD-OsN@);FLczag50W>1zF1dq;h$33aUfbLA{5#?W?+N% z7@Z?y%}gKqgiJAgr<%~H-m2-w>&4sRj?;}PoQ!E>27yt`O~6zeS7B$T(yoNO`n-Ua zmOeft*+jdHU7k$*p7r)puS=m;mh)FG{&>li4HB};`P%xZjKJVqf)rs)3m9^~=Jdu!n-v4IR$%4d`*>ZeOjSbdAU>M8v8ADwPE*>`zTlx0;y7prXTtx0 zMR0s+k+Xe};S?YvhY`R@Qmf!hXyHk$a~uDtJUW+&>-JmSe*0}}i_1v-Y*8v5iqPJO z=xu<6Z@E9$YyiHQDPNOw0pxuT5KAhIBe zj&qqd7A<~-8SH`~br{>ij`Ug~e*UnS3w|WH<+8}#g!+VKS~%xVhszkA94IvW=U1p?{aD-(eeEO!MT^E zGc)AVAGPSuk0zX~$%F4rVOi>lz$GRQ68&c)_-Hk^$goF|z+OA06ANZORfyKG%NZhxO0i-jsXsvhw$GATi- zM}9$yEOc1cd1$Ophwapo1%0@w-Hj>#Z`kFJ{%=}<`QhJ^=5N(T6stJw=k^*RJ#c4b zBI$L(t1g&q-yX;Alz-PYjxkMtPO$#A?6zWMWBvhx?o2<}&py6c0f_y6O?4K%I?|{n z8D|{^>-Td8Ka!5rR`|}Ks)Jo}8ktuV7H`9^mY#(rd6Q5h=qXCZDy)jZH zoa^C^hATP%Ol59lWsKD}*9iYYVx4uQ!pP8b@RGr7F?+aP`vsriAvhRVs zX-p4f>S{z*Sf2%ZF|dLdPA+7JByIXKwjDSfCtisxa%1yqjRO6*kwTiKFJqQ^xDwPx z+R=1N65)DqWc6^s+VX}j>nVblEV-^O%)TzO9F)o*LZt#yNDY?&bJCV?bUOIfT%&+} z!N%nab`_VbtqxcZ*Ixz$KL>nN{+hVOWABHjAQFINbW=s{&Pn}Sk8s?OmS$5$Zreqa zz6iB>usK>kZEl~9)K)QB`05)i)3c@kSVL%pb{sYg9*GIR0r9oeEuoheO=rnJhmX3@ z4_pq1^kZc`DIKxq_3feB3a+H0;_AOT5DBhJe(6#m1KYkgt43W&ob>!%Eh+9R2)j>+ z1tvMm%fhi%l1kb&v{XtTT6bepqOg9DSemO27#7-LKdq}s<-%av(f+V^t`nrz;3HsAiH2Z+r2elFJw}P!Gt&PWl2IrXp|+A zSEErm5%$!cE-0Q5dvUx^OR$brEdQRvF}$Vt%OgC85+nCVxAGzDPAD0g`nTlVV<=Lo>e z_U30^dD9KL+UE{=mOy)qBgFoTbB=T~Os@Fnm3<|XY#*!V{=9*>;C>1rbJog(IRKQp z7R1FsnbY3i63clrxopJcSFx|<$ZxjE{Ue_gKE|O1+!8`!7BgY#aHZ`YZsAr8oe1HC zw6OMap832{Ts?zuBKP*spge8~k7Z9j=_ViNPH!Vrc*+e z&5@2XC||{Ut$uTP&*}q>1A&y{pq&*qE*?>GWzRHBA1E@-x6sr*P@!@OX0}_~M1pu= zawjcP+q}=40Dy_O60Z=)ALLa~@%JzDP7_jhp*863I%*N*QL5$N8b=b}lw!8$B-A}! zx(+jnY#gDVGdWUJ8pp4#E|5F8eQDNnt{o_tg59L(LJE3Ujx#+yxY>b@K8uPGN_Iwa zXawbQ$j4Pz-{a2JiE7mP!LNz1!MQ!~Mos5%=xKfJbw%Z_SnWIu$kAFVo+z(Zb2vfm zRc&cSq!1`2d_)pP150kU?J*L|KhB(Lp4##sq2ybNB*c^tYUsY+$q<;Lk+uO5S3VbH zjwk*$OMBvZvNh1-R0jB|?rzO$m-QIs%UE;=InZf$r~9c z3^Eq-?!tBE?1CqCeM|TDtC5Z-)8%FKiV~-a#2iX!u=;DR+Gm;5$kWN8V5&64Y$i`1 z!^8h)jV0F=6I^(v@XNLab=6F)PhKX{67$-t(%-je(O1FyyCi&0kqJ zUa2Q0-;x--@q$I-5@dV6%s>hql-^r-Uy;I|%&f>Nq35bqHnvvA-BRa(^|9}UIaIrU zMa2eSb_vHjk3v-P`GT_R7T1`UXEUfqnN21)iJ;|+{f374UV>My#Uw*6mU81d7cQk& zl^0t8aOl#E3SFmpzl=Xu8QBQw9`e{E9~JP(f74{gG-(%}dg$(wzcYt6-RuyF#m*YS zVs^$pZX72L!MIUb;98Ic7FI7vZfz*Htx(Xqd-X z;0l7ulx!m$$T{m@%Y=PyAeuqZnS|4CMi^tK=~}lV>*Xa#3@oa_ZQM1I#7lzU$vW`$ zV$D}vtdYq!?yP+D)0>m-f5(}i1M0@0-<~a%{birx7g8|s@xG-)e=?Wfz9*XPEHQt2 z%xnuM9)T|CF&57`j)4i!MoETJq>UB6ubJuvm@CS^EC*WVNCU2H?~kW8{m^-sxlq58 z<*mtYM(CJl6%m3=R`bp5vFHNqSi~@iK}QdgU+cvkqVPCFc`B_gGAHwqyo-Fib{BS) z=KE5N18B;6X2(=IHaQx1Y!_WXi;b{3ju{efP;UggPZC9F3DIf6=fvNHuubh$NvQR_ zN&Aa_P078dzk#2;Y21ypUh)f%4`bz0Wew-{L%^+&>P0{EKa9-4Lc%B$@|S^oo@fz1 zC5KY3GlZ{j&Ziwb67{~MmYYc@OM{>hMS7b<64m5qE{;cB$UxLx``q*j9-MQ6=xAwr z6pMq?4FxleC3Ci4UnhnvC>QsXCEs1vQX@zl2=tHBV?~V5w!rlW2V_aP9**I+RF*f$ zW`K?adsP~AH^Ji6T3`i?7pLgmFQSXzgrA@sleRpGOn4X(!CLJLPVmMY_{}knTx3N> z+(@@dNT<){hM(g)^}1u^iRldm_(!cOP3psy!o?(FLutJ91x&}U+w-wK9&#;OOB0lu zfid0#b>Xl)Mjhj&1*X*}q_iIjmxmw@h6ySv1cRB6j+#s(@9JPKl-2r}XPZ3?t?IAS z`a!2==YB8p!Net1QGRtI6nc~>|7D1rGbk0PL-Isl7ADu3v1*yvLm6pk$8A5YLD+qG z+I!d3Q^$D0O_8ed3a-&mxPGZn8|$27dXJPr2@R`YwerlVCx=-V#rZLQGKu?q3y&)?31a4_m0@1&%tzTcT?D; z*ei{ORtFq}WMnZz&vHNDhr6FcFgPm`6!(w7Q7q!~jykU-f-td*+~@IX-ZH3eMCgAC za0R%Vk6I;NWAjf-=|KS&QcpW7hh0rAOPCD_96%c(4pAP#KF90X)*|`WV zkEYtEBK)l%>NSX^K82-?Ywwyu|KNLvG_{Y~S>M@uOu`X1nJJS}kQ z@WQGoah!QGO|Nah5o1tjx`|K!&U0gAj}esN!s?atb$R!9Z}L1hpQh=dzhgz!JBPH1 zJpl)wqXRxYINKaF34iC%-Y=rFaC)_4%y><~m-5I9*Q=yL=(HV}xIV30;ptdJZDr*# zw@WlX{CQMDM@@#o+tjlJ!n*2@VC$c(JTB3whT)XAvUhMOy z33ohVfYJ(fkMYGCXg(4!Ed8f6cfXyqi2Y#DD(S~hg_^e2i@FXi&{l)=3(2ndQB|$2 z2-&PuBlgI;8kdMfPtdNEwjg{wemp2S9=dnb8YH1w1br&n{x1JpK5kVbk(I1=QdjIU z>lKXmVM2IF#g}KqdG?^SagXBjods>&jO*)qQh>3fstnRJ#F+1NvQ?u3QC!UVI_V7Cr}0CyFNpp@Ak59*k;q9b zk-BY17k6x6p{7+5dt1sdT!}3Ue+4$oaM5X<2BvToGgz+d@a@kn?prrWEZi4CzEsVe zeI(EoOFR?)`%Kb+7Dj7TmTWE{pmoJVI#qdS1|cz@9Nhfo%Y*8A^@MTqqR z|5;-?%Y|~BDomksPi14UUv@X}WX$7}+KuBy<&^ggp~t?v-14iX0ReJki8dgF?7AYK z=DK`L%l?m7zSBkE)stq{dF|swzx?Fz`!};WV>4BG8IOwkIwT>5(7J>2DwFN!4Rsep z#oFby(KXUIaZ^Z{JFO=auwWX!8oEsZpW`tmU^i;oW@%}_XzPF`KPnNA(f2?_2&p!| z2O_mYWxzeFBN$L}COB6m1Q$69x_{r63R`aB!A7Bv+3NRSbCxz_#mDM?9eur^pPWM_ zo7;!$T^h710MX%RjR#zhW}az!^~a!lC-U#sR;0+yzhuBsnQ}N-A|SGc&#}~QTlvQ` zaF|tx0`8|X`ism*dFo4tWN);*aM*<_3o_qG@w%3oW*!n(f`bZ|>p@N%=>P_%JpMfmz@Np5xRAtg9o2PwpY}lQ&MK*zsXSwA0+$Pe7umGtw8s z{%6fyjxx{rHp@}kBjA&V_`?|;)A4V&=*Q>=B{Sye%5gGl!dc_-FsR%bbuyV0jtzWkn&bc{& z(6-l>q7Tgc2^33SSMK+sU~kFZ(9&NI$ZIdXL1Aj z84)w;yfKFBe}21de^swG@ksSSw0i8+npICX+1*~+>rb3hE;_4BKH+LTVHc* zlO64C+~Y0@8$98Frp&Sh(*;>W%FMb5kHulyW``me!kCnbP!NNfMc+|f0YDOvC;zVt z7&ShINha=@P$8`rD5<@%^{tO_eNJ*luvqSqHKg=(CJWc{Rpalr4&g?y@~P62uVY~E zNSw-@D5+-MuA56+>;i0>GCpI*lj(AEdW*qqj!T!eGru-xA%#TH=|5Q4988R=fr}w!gLX3mVc=PT!rlkW4?V_f;AE|qOf%Q%|bqq{GP)t1T8AF(bLxXnJ z9=YkApTVC9_Ov(0%a&s7?0U3?ZBpIlNU|b!%6~B{(8Zo9X@$$W&q$n;Me}W~cKJe` znZDs1_UtVu4yRnr?T!rd{>d>0n>)iVR>zaIQN>7Xg3T*X+q$gfyz|ni=j_u*lq}nH zRugXPum6S3mdP~OM^KF?g=|oT`P2U=wZvIM%QOUw(2%206^+u7|9h*4A)~yjq02Ez zA7liHmtcqVzS}Eu1m8{&IQJBRJYz>wja2V6*L6?#wj?|}qbOZ2io*xb>CY1l?Y6VX zn6H!18iEh{!^P@yJ?n53l!F@3n@xk$DTLY6tx1*EM|~=1m~hqC@mwT4*cK=n(^* zFhJk4FJG~}-*9&qN&41A=#OD9`UQf*d}uo zdwJrakZaHuRmUB&3A8%Ism7rgHMd4KuCLI~5#MwaKTdFLo|aJQD{LBmFCQwLMjN!& zgA(VAfQ9lnn8DTgo8H;dZ3NHb7*us|l5<7A_7xT#w3!L;NlPrCr6!lQg7K*JLK)2g zYdCs&Vr$f9@9JIihaeB*8T&KSfRbFKt=Q!p4687CH_?$lpaRWcXC19tdpBwI$A(%~Z#-Lqy5NV6DhU>_Ypkz6eB zb6tG2LMgqDFpljbQ24hsovaVQ=Z(SV%FI$@){6Dg*_ZVkfc@$AdjNH8y%ZlTW7rYG z>ki)cl!~_e036Dq)Ce_qO6*dG4w*!G8u7B3JW|^uN8kDS9miD$8D*rdWj9XF#5Q_R zuzAEYj-ep)PKa+2ylIt$nGLqh*|;+C@HUeEwgdf9%4juj0UNst z?)dR0=4LRp?+j2;1s}KGzWg5QTfTHI(K=#SzO-q{-!#_>LS+3F#%(e4{-*BD=ehS= zE06g?le`ju?aGq2S_yL8%%Ug8GO4fm8ogOSCmw7!1l}}9y7&F9o0oNbij?!*zS!R& z%W@#>>J8hn?kl9=2SJ;R=*uJYg;JOZ2Uja!k_%-%u&X1o_O{4lb%MO;cZ=F5is4wY zuwm_Q;`6NlTxX>XjBDL=+F$8bEwnAujgT*x2kN}R5Z3`j`d#176arNC{vsXtin#9#DCwn@1{uhKKcvIay>G?MW59hBo*UzCp( zFILNOyQ(SMI_D~QUxPA=Eo5!R&OXM~_%q(Z`KXcp*<^oMKsN~3!TWf2c8lS+RC?|U`e=7ACZ)~1FK9%+vY#DY))7QPM#VekL|B}6wUl)54Crp{nL(3L z9u_YM+#=_jz}770$5s|2zNrWea;ahN4=y%@0!Z2kFwj)M&V8exl}X#NK=TnKlI(nN z0quppZrms@PRwzfqjEcN@MY9yc<8-=A@2m%hw%(jaU{));~jm~120UM9_KK;oG29f zIXjtIw~<00`XDPFc3{DD6(~d(MmJr5tAM~=7vQ20)X}zd;}dz^O8(2lK{xjOz4ASr zs}C+k-?zW`DT@X$env!2coiG3|5d~2o>bD7Vxo%Ue~vA6&q=fz197;(;wHiqF8vmO8EzX*Z5*ZphuyF zK5mb|161#qyhd-x5s#0BI~U$?o>#<*j`ErERaEsfJ&Nh5*MD_v^A?exFWMQ7Kp ziO=d=-G!jj1jH&?#9MG@tS7Bu{QRzh=%V_ueARJ{W0 zfe>qbi*yeR&-?M6q+Z7~u#9dCfw?SQerxvadSwD{X7H=R!=z{MQy%Xgtk)sAKj<+(NNzZ>dkpbZZE@p<;3-Kr6 zI`qRf62B1bK}KA&ze^Ry7fc{+xODw*FgC$-X{tIfw4@4zohA>D`&fGFa9@1U03_O; z6WXK-cA;(dRVnG-cpSsb^&*|W9P+6Al^G!oL;`{i&P?-TsytRr)8GljxvZ1M0fi`O zW>$;)Ch7CN)7$Y5Hj5GqxB_Q!^Jzvs8k2(B=T5tWxERz4F=We%vxpWc?iC~ICzp91 z7F7G1ZoU*JmW1{aU>7a|D?O1aiMjShpV>~c%=_5ef8~HIc`h;7^;%W}Lw=-?Vyt(a z4XrPcaR{nHKj(qK>u<=8aFlB>(`p11EB@F!=GIp6M8Z3kE0OO0i zn7##d0#bx>08eEukq)X@U4T*E($MkIFeOifQPN2M-szxiDe)WtmL2>j%FbI(IEv26 z61VrF$$sz@rZaxS?AyuR;18Vk?D8~?Vu*kH-_@0i6$4*1NQA-?Vlj;!e#?=)2#gX{ zoQ4#j<&kz&QD~-WdL2o8PN2+{{Rmr)OfW2 z;r@38kB{E23lQ!p$YNI9h@8Dn4U#|R4ccgP%#NU;b zyKS?G4=c__!>^Z<(Z(k+a^Vb&Juv^^L&)W<%!#H^SPHTlC@5?Aq`(1wu4dvNmZ@&qBX$&SpS8SZeZ%0NsurT*l%9*%mh0DYO@$xE&OjTKM!QcE>Z z|6JGwK+e_TdaVJ2xyb=fze<`tOQWmXLW7XBeVL~a86*|U8$bT1I>?=1v5d6HF3@&I zWMICt5qimMYfE=^H20K{?-$l+r3k-b+hZg`Ae2Z62!&65-_?r==5OQALny?0*QW|g zcQqK~b*%?$V8}y$?Ub4Aft9fsJ-Aat?Bp%&=*>`bDpp)smXGr)+~@0!<6`4dEtc@ zhpc72C|G`;VMexSQ_lMhWo6A;=L|*92*e($ae%oT@C)JN=KC{*VYEnRuukpzOGEg* z&-brNPniS`YziR3(e4p-Yd5dIO|(|4xZ5fF8W$uaIYS2?xwSQM^;|dqy5&pk{+vNq My{-9xrpwTO0c;|}WB>pF literal 0 HcmV?d00001 diff --git a/BKPS/14031206/Indicators/Examples/DEMA.mq5 b/BKPS/14031206/Indicators/Examples/DEMA.mq5 new file mode 100644 index 0000000..7bb8e8b --- /dev/null +++ b/BKPS/14031206/Indicators/Examples/DEMA.mq5 @@ -0,0 +1,70 @@ +//+------------------------------------------------------------------+ +//| DEMA.mq5 | +//| Copyright 2000-2025, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2000-2025, MetaQuotes Ltd." +#property link "https://www.mql5.com" +#property description "Double Exponential Moving Average" +#include +//--- indicator settings +#property indicator_chart_window +#property indicator_buffers 3 +#property indicator_plots 1 +#property indicator_type1 DRAW_LINE +#property indicator_color1 DarkBlue +#property indicator_width1 1 +#property indicator_label1 "DEMA" +#property indicator_applied_price PRICE_CLOSE +//--- input parameters +input int InpPeriodEMA=14; // EMA period +input int InpShift=0; // Indicator's shift +//--- indicator buffers +double DemaBuffer[]; +double Ema[]; +double EmaOfEma[]; +//+------------------------------------------------------------------+ +//| Custom indicator initialization function | +//+------------------------------------------------------------------+ +void OnInit() + { +//--- indicator buffers mapping + SetIndexBuffer(0,DemaBuffer,INDICATOR_DATA); + SetIndexBuffer(1,Ema,INDICATOR_CALCULATIONS); + SetIndexBuffer(2,EmaOfEma,INDICATOR_CALCULATIONS); +//--- sets first bar from what index will be drawn + PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,2*InpPeriodEMA-2); +//--- sets indicator shift + PlotIndexSetInteger(0,PLOT_SHIFT,InpShift); +//--- name of label + string short_name=StringFormat("DEMA(%d)",InpPeriodEMA); + IndicatorSetString(INDICATOR_SHORTNAME,short_name); + PlotIndexSetString(0,PLOT_LABEL,short_name); + } +//+------------------------------------------------------------------+ +//| Double Exponential Moving Average | +//+------------------------------------------------------------------+ +int OnCalculate(const int rates_total, + const int prev_calculated, + const int begin, + const double &price[]) + { + if(rates_total<2*InpPeriodEMA-2) + return(0); +//--- + int start; + if(prev_calculated==0) + start=0; + else + start=prev_calculated-1; +//--- calculate EMA + ExponentialMAOnBuffer(rates_total,prev_calculated,0,InpPeriodEMA,price,Ema); +//--- calculate EMA on EMA array + ExponentialMAOnBuffer(rates_total,prev_calculated,InpPeriodEMA-1,InpPeriodEMA,Ema,EmaOfEma); +//--- calculate DEMA + for(int i=start; io>m?36nj+q(8%*@Qpj4_WPX2=b5hmM*a&h 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 literal 0 HcmV?d00001 diff --git a/BKPS/14031206/Indicators/Examples/DPO.mq5 b/BKPS/14031206/Indicators/Examples/DPO.mq5 new file mode 100644 index 0000000..8eb462c --- /dev/null +++ b/BKPS/14031206/Indicators/Examples/DPO.mq5 @@ -0,0 +1,69 @@ +//+------------------------------------------------------------------+ +//| DPO.mq5 | +//| Copyright 2000-2025, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2000-2025, MetaQuotes Ltd." +#property link "https://www.mql5.com" +#property description "Detrended Price Oscillator" +#include +//--- indicator settings +#property indicator_separate_window +#property indicator_buffers 2 +#property indicator_plots 1 +#property indicator_type1 DRAW_LINE +#property indicator_color1 DodgerBlue +//--- input parameters +input int InpDetrendPeriod=12; // Period +//--- indicator buffers +double ExtDPOBuffer[]; +double ExtMABuffer[]; + +int ExtMAPeriod; +//+------------------------------------------------------------------+ +//| Custom indicator initialization function | +//+------------------------------------------------------------------+ +void OnInit() + { +//--- get length of cycle for smoothing + ExtMAPeriod=InpDetrendPeriod/2+1; +//--- indicator buffers mapping + SetIndexBuffer(0,ExtDPOBuffer,INDICATOR_DATA); + SetIndexBuffer(1,ExtMABuffer,INDICATOR_CALCULATIONS); +//--- set accuracy + IndicatorSetInteger(INDICATOR_DIGITS,_Digits+1); +//--- set first bar from what index will be drawn + PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,ExtMAPeriod-1); +//--- name for DataWindow and indicator subwindow label + string short_name=StringFormat("DPO(%d)",InpDetrendPeriod); + IndicatorSetString(INDICATOR_SHORTNAME,short_name); + } +//+------------------------------------------------------------------+ +//| Detrended Price Oscillator | +//+------------------------------------------------------------------+ +int OnCalculate(const int rates_total, + const int prev_calculated, + const int begin, + const double &price[]) + { + int start; + int first_index=begin+ExtMAPeriod-1; +//--- preliminary filling + if(prev_calculated0) + PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,first_index); + } + else + start=prev_calculated-1; +//--- calculate simple moving average + SimpleMAOnBuffer(rates_total,prev_calculated,begin,ExtMAPeriod,price,ExtMABuffer); +//--- the main loop of calculations + for(int i=start; i6k>O5Uf)#~nA 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 literal 0 HcmV?d00001 diff --git a/BKPS/14031206/Indicators/Examples/DeMarker.mq5 b/BKPS/14031206/Indicators/Examples/DeMarker.mq5 new file mode 100644 index 0000000..8ec7074 --- /dev/null +++ b/BKPS/14031206/Indicators/Examples/DeMarker.mq5 @@ -0,0 +1,111 @@ +//+------------------------------------------------------------------+ +//| DeMarker.mq5 | +//| Copyright 2000-2025, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2000-2025, MetaQuotes Ltd." +#property link "https://www.mql5.com" +#include +//--- indicator settings +#property indicator_separate_window +#property indicator_buffers 5 +#property indicator_plots 1 +#property indicator_type1 DRAW_LINE +#property indicator_color1 DodgerBlue +#property indicator_level1 0.3 +#property indicator_level2 0.7 +//--- input parameters +input int InpDeMarkerPeriod=14; // Period +//--- indicator buffers +double ExtDeMarkerBuffer[]; +double ExtDeMaxBuffer[]; +double ExtDeMinBuffer[]; +double ExtAvgDeMaxBuffer[]; +double ExtAvgDeMinBuffer[]; +//+------------------------------------------------------------------+ +//| Custom indicator initialization function | +//+------------------------------------------------------------------+ +void OnInit() + { +//--- indicator buffers mapping + SetIndexBuffer(0,ExtDeMarkerBuffer,INDICATOR_DATA); + SetIndexBuffer(1,ExtDeMaxBuffer,INDICATOR_CALCULATIONS); + SetIndexBuffer(2,ExtDeMinBuffer,INDICATOR_CALCULATIONS); + SetIndexBuffer(3,ExtAvgDeMaxBuffer,INDICATOR_CALCULATIONS); + SetIndexBuffer(4,ExtAvgDeMinBuffer,INDICATOR_CALCULATIONS); +//--- set accuracy + IndicatorSetInteger(INDICATOR_DIGITS,3); +//--- sets first bar from what index will be drawn + PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,InpDeMarkerPeriod); +//--- name for DataWindow and indicator subwindow label + string short_name=StringFormat("DeM(%d)",InpDeMarkerPeriod); + IndicatorSetString(INDICATOR_SHORTNAME,short_name); + } +//+------------------------------------------------------------------+ +//| DeMarker | +//+------------------------------------------------------------------+ +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[]) + { + if(rates_totalhigh[i-1]) + ExtDeMaxBuffer[i]=high[i]-high[i-1]; + else + ExtDeMaxBuffer[i]=0.0; + + if(low[i-1]>low[i]) + ExtDeMinBuffer[i]=low[i-1]-low[i]; + else + ExtDeMinBuffer[i]=0.0; + } + for(i=0; ihigh[i-1]) + ExtDeMaxBuffer[i]=high[i]-high[i-1]; + else + ExtDeMaxBuffer[i]=0.0; + + if(low[i-1]>low[i]) + ExtDeMinBuffer[i]=low[i-1]-low[i]; + else + ExtDeMinBuffer[i]=0.0; + + ExtAvgDeMaxBuffer[i]=SimpleMA(i,InpDeMarkerPeriod,ExtDeMaxBuffer); + ExtAvgDeMinBuffer[i]=SimpleMA(i,InpDeMarkerPeriod,ExtDeMinBuffer); + + double dnum=ExtAvgDeMaxBuffer[i]+ExtAvgDeMinBuffer[i]; + if(dnum!=0) + ExtDeMarkerBuffer[i]=ExtAvgDeMaxBuffer[i]/dnum; + else + ExtDeMarkerBuffer[i]=0.0; + } +//--- OnCalculate done. Return new prev_calculated. + return(rates_total); + } +//+------------------------------------------------------------------+ diff --git a/BKPS/14031206/Indicators/Examples/Envelopes.ex5 b/BKPS/14031206/Indicators/Examples/Envelopes.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..29714f9e68b594e5e55eacd8907666e9da9a833a GIT binary patch literal 13348 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 z3rates_total || prev_calculated<0) + to_copy=rates_total; + else + { + to_copy=rates_total-prev_calculated; + if(prev_calculated>0) + to_copy++; + } +//--- get ma buffer + if(IsStopped()) // checking for stop flag + return(0); + if(CopyBuffer(ExtMAHandle,0,0,to_copy,ExtMABuffer)<=0) + { + Print("Getting MA data is failed! Error ",GetLastError()); + return(0); + } +//--- preliminary calculations + int start=prev_calculated-1; + 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 A;{X5v literal 0 HcmV?d00001 diff --git a/BKPS/14031206/Indicators/Examples/Force_Index.mq5 b/BKPS/14031206/Indicators/Examples/Force_Index.mq5 new file mode 100644 index 0000000..1d295f1 --- /dev/null +++ b/BKPS/14031206/Indicators/Examples/Force_Index.mq5 @@ -0,0 +1,101 @@ +//+------------------------------------------------------------------+ +//| Force_Index.mq5 | +//| Copyright 2000-2025, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2000-2025, MetaQuotes Ltd." +#property link "https://www.mql5.com" +//--- indicator settings +#property indicator_separate_window +#property indicator_buffers 2 +#property indicator_plots 1 +#property indicator_type1 DRAW_LINE +#property indicator_color1 DodgerBlue +//--- input parameters +input int InpForcePeriod=13; // Period +input ENUM_MA_METHOD InpMAMethod=MODE_SMA; // MA method +input ENUM_APPLIED_PRICE InpAppliedPrice=PRICE_CLOSE; // Applied price +input ENUM_APPLIED_VOLUME InpAppliedVolume=VOLUME_TICK; // Volumes +//--- indicator buffers +double ExtForceBuffer[]; +double ExtMABuffer[]; + +int ExtMAHandle; +//+------------------------------------------------------------------+ +//| Custom indicator initialization function | +//+------------------------------------------------------------------+ +void OnInit() + { +//--- indicator buffers mapping + SetIndexBuffer(0,ExtForceBuffer,INDICATOR_DATA); + SetIndexBuffer(1,ExtMABuffer,INDICATOR_CALCULATIONS); +//--- sets first bar from what index will be drawn + PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,InpForcePeriod); +//--- name for DataWindow and indicator subwindow label + string short_name=StringFormat("Force(%d)",InpForcePeriod); + IndicatorSetString(INDICATOR_SHORTNAME,short_name); +//--- get MA handle + ExtMAHandle=iMA(NULL,0,InpForcePeriod,0,InpMAMethod,InpAppliedPrice); + } +//+------------------------------------------------------------------+ +//| Force Index | +//+------------------------------------------------------------------+ +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[]) + { + if(rates_totalrates_total || prev_calculated<0) + to_copy=rates_total; + else + { + to_copy=rates_total-prev_calculated; + if(prev_calculated>0) + to_copy++; + } +//--- get ma buffer + if(IsStopped()) // checking for stop flag + return(0); + if(CopyBuffer(ExtMAHandle,0,0,to_copy,ExtMABuffer)<=0) + { + Print("Getting MA data is failed! Error ",GetLastError()); + return(0); + } +//--- preliminary calculations + int i,start; + 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

    #16<$)|q6%-y}`1Lq}}X{ke(R8CUK^EEj%(DG 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 R%4)=9+D+2ZbY&(#{trZ4>}3D| literal 0 HcmV?d00001 diff --git a/BKPS/14031206/Indicators/Examples/FrAMA.mq5 b/BKPS/14031206/Indicators/Examples/FrAMA.mq5 new file mode 100644 index 0000000..47fbe48 --- /dev/null +++ b/BKPS/14031206/Indicators/Examples/FrAMA.mq5 @@ -0,0 +1,81 @@ +//+------------------------------------------------------------------+ +//| FrAMA.mq5 | +//| Copyright 2000-2025, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2000-2025, MetaQuotes Ltd." +#property link "https://www.mql5.com" +#property description "Fractal Adaptive Moving Average" +//--- indicator settings +#property indicator_chart_window +#property indicator_buffers 1 +#property indicator_plots 1 +#property indicator_type1 DRAW_LINE +#property indicator_color1 DarkBlue +#property indicator_width1 1 +#property indicator_label1 "FrAMA" +#property indicator_applied_price PRICE_CLOSE +//--- input parameters +input int InpPeriodFrAMA=14; // FrAMA period +input int InpShift=0; // Indicator's shift +//--- indicator buffer +double FrAmaBuffer[]; +//+------------------------------------------------------------------+ +//| Custom indicator initialization function | +//+------------------------------------------------------------------+ +void OnInit() + { +//--- indicator buffers mapping + SetIndexBuffer(0,FrAmaBuffer,INDICATOR_DATA); +//--- sets first bar from what index will be drawn + PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,2*InpPeriodFrAMA-1); +//--- sets indicator shift + PlotIndexSetInteger(0,PLOT_SHIFT,InpShift); +//--- name for labels + string short_name=StringFormat("FrAMA(%d)",InpPeriodFrAMA); + IndicatorSetString(INDICATOR_SHORTNAME,short_name); + PlotIndexSetString(0,PLOT_LABEL,short_name); + } +//+------------------------------------------------------------------+ +//| Fractal Adaptive Moving Average | +//+------------------------------------------------------------------+ +int OnCalculate(const int rates_total, + const int prev_calculated, + const int begin, + const double &price[]) + { + if(rates_total<2*InpPeriodFrAMA) + return(0); + + int start; +//--- start calculations + if(prev_calculated==0) + { + start=2*InpPeriodFrAMA-1; + for(int i=0; i<=start; i++) + FrAmaBuffer[i]=price[i]; + } + else + start=prev_calculated-1; +//--- main cycle + double math_log_2=MathLog(2.0); + for(int i=start; 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 S1!XnuaBTur?X(Cy#Qy?l%~uov literal 0 HcmV?d00001 diff --git a/BKPS/14031206/Indicators/Examples/Fractals.mq5 b/BKPS/14031206/Indicators/Examples/Fractals.mq5 new file mode 100644 index 0000000..7de1cb1 --- /dev/null +++ b/BKPS/14031206/Indicators/Examples/Fractals.mq5 @@ -0,0 +1,88 @@ +//+------------------------------------------------------------------+ +//| Fractals.mq5 | +//| Copyright 2000-2025, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2000-2025, MetaQuotes Ltd." +#property link "https://www.mql5.com" +//--- indicator settings +#property indicator_chart_window +#property indicator_buffers 2 +#property indicator_plots 2 +#property indicator_type1 DRAW_ARROW +#property indicator_type2 DRAW_ARROW +#property indicator_color1 Gray +#property indicator_color2 Gray +#property indicator_label1 "Fractal Up" +#property indicator_label2 "Fractal Down" +//--- indicator buffers +double ExtUpperBuffer[]; +double ExtLowerBuffer[]; +//--- 10 pixels upper from high price +int ExtArrowShift=-10; +//+------------------------------------------------------------------+ +//| Custom indicator initialization function | +//+------------------------------------------------------------------+ +void OnInit() + { +//--- indicator buffers mapping + SetIndexBuffer(0,ExtUpperBuffer,INDICATOR_DATA); + SetIndexBuffer(1,ExtLowerBuffer,INDICATOR_DATA); + IndicatorSetInteger(INDICATOR_DIGITS,_Digits); +//--- sets first bar from what index will be drawn + PlotIndexSetInteger(0,PLOT_ARROW,217); + PlotIndexSetInteger(1,PLOT_ARROW,218); +//--- arrow shifts when drawing + PlotIndexSetInteger(0,PLOT_ARROW_SHIFT,ExtArrowShift); + PlotIndexSetInteger(1,PLOT_ARROW_SHIFT,-ExtArrowShift); +//--- sets drawing line empty value-- + PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,EMPTY_VALUE); + PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,EMPTY_VALUE); + } +//+------------------------------------------------------------------+ +//| Fractals on 5 bars | +//+------------------------------------------------------------------+ +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[]) + { + if(rates_total<5) + return(0); + + int start; +//--- clean up arrays + if(prev_calculated<7) + { + start=2; + ArrayInitialize(ExtUpperBuffer,EMPTY_VALUE); + ArrayInitialize(ExtLowerBuffer,EMPTY_VALUE); + } + else + start=rates_total-5; +//--- main cycle of calculations + for(int i=start; ihigh[i+1] && high[i]>high[i+2] && high[i]>=high[i-1] && high[i]>=high[i-2]) + ExtUpperBuffer[i]=high[i]; + else + ExtUpperBuffer[i]=EMPTY_VALUE; + + //--- Lower Fractal + if(low[i]m;2P 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 literal 0 HcmV?d00001 diff --git a/BKPS/14031206/Indicators/Examples/Gator.mq5 b/BKPS/14031206/Indicators/Examples/Gator.mq5 new file mode 100644 index 0000000..5b2edf3 --- /dev/null +++ b/BKPS/14031206/Indicators/Examples/Gator.mq5 @@ -0,0 +1,264 @@ +//+------------------------------------------------------------------+ +//| Gator.mq5 | +//| Copyright 2000-2025, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2000-2025, MetaQuotes Ltd." +#property link "https://www.mql5.com" +#property description "Gator Oscillator" +#property description "based on 3 non-shifted moving averages" +//******************************************************************** +// Attention! Following correlations must be obeyed: +// 1.InpJawsPeriod>InpTeethPeriod>InpLipsPeriod; +// 2.InpJawsShift>InpTeethShift>InpLipsShift; +// 3.InpJawsPeriod>InpJawsShift; +// 4.InpTeethPeriod>InpTeethShift; +// 5.InpLipsPeriod>InpLipsShift. +//******************************************************************** +//--- indicator settings +#property indicator_separate_window +#property indicator_buffers 7 +#property indicator_plots 2 +#property indicator_type1 DRAW_COLOR_HISTOGRAM +#property indicator_type2 DRAW_COLOR_HISTOGRAM +#property indicator_color1 Green,Red +#property indicator_color2 Green,Red +#property indicator_width1 2 +#property indicator_width2 2 +#property indicator_label1 "Gator Upper" +#property indicator_label2 "Gator Lower" +//--- input parameters +input int InpJawsPeriod=13; // Jaws period +input int InpJawsShift=8; // Jaws shift +input int InpTeethPeriod=8; // Teeth period +input int InpTeethShift=5; // Teeth shift +input int InpLipsPeriod=5; // Lips period +input int InpLipsShift=3; // Lips shift +input ENUM_MA_METHOD InpMAMethod=MODE_SMMA; // Moving average method +input ENUM_APPLIED_PRICE InpAppliedPrice=PRICE_MEDIAN; // Applied price +//--- indicator buffers +double ExtUpperBuffer[]; +double ExtUpColorsBuffer[]; +double ExtLowerBuffer[]; +double ExtLoColorsBuffer[]; +double ExtJawsBuffer[]; +double ExtTeethBuffer[]; +double ExtLipsBuffer[]; + +int ExtJawsHandle; +int ExtTeethHandle; +int ExtLipsHandle; +int ExtUpperShift; +int ExtLowerShift; +bool ExtFlag; +//+------------------------------------------------------------------+ +//| Custom indicator initialization function | +//+------------------------------------------------------------------+ +int OnInit() + { +//--- indicator buffers mapping + SetIndexBuffer(0,ExtUpperBuffer,INDICATOR_DATA); + SetIndexBuffer(1,ExtUpColorsBuffer,INDICATOR_COLOR_INDEX); + SetIndexBuffer(2,ExtLowerBuffer,INDICATOR_DATA); + SetIndexBuffer(3,ExtLoColorsBuffer,INDICATOR_COLOR_INDEX); +//--- MAs + SetIndexBuffer(4,ExtJawsBuffer,INDICATOR_CALCULATIONS); + SetIndexBuffer(5,ExtTeethBuffer,INDICATOR_CALCULATIONS); + SetIndexBuffer(6,ExtLipsBuffer,INDICATOR_CALCULATIONS); +//--- get handles + ExtJawsHandle=iMA(NULL,0,InpJawsPeriod,0,InpMAMethod,InpAppliedPrice); + ExtTeethHandle=iMA(NULL,0,InpTeethPeriod,0,InpMAMethod,InpAppliedPrice); + ExtLipsHandle=iMA(NULL,0,InpLipsPeriod,0,InpMAMethod,InpAppliedPrice); +//--- set indicator digits + IndicatorSetInteger(INDICATOR_DIGITS,_Digits+1); +//--- sets first bar from what index will be drawn + PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,InpTeethShift+InpTeethPeriod); + PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,InpLipsShift+InpLipsPeriod); +//--- line shifts when drawing + PlotIndexSetInteger(0,PLOT_SHIFT,InpTeethShift); + PlotIndexSetInteger(1,PLOT_SHIFT,InpLipsShift); +//--- name for indicator subwindow label + string short_name=StringFormat("Gator(%d,%d,%d)",InpJawsPeriod,InpTeethPeriod,InpLipsPeriod); + IndicatorSetString(INDICATOR_SHORTNAME,short_name); +//--- sets drawing line empty value + PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0.0); + PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,0.0); +//--- calculate global variables values + ExtUpperShift=InpJawsShift-InpTeethShift; + ExtLowerShift=InpTeethShift-InpLipsShift; +//--- check for input parameters + ExtFlag=CheckForInput(); + if(!ExtFlag) + Print("Wrong input parameters. Indicator won't work."); +//--- initialization done. 0 returned if ExtFlag is true + return(!ExtFlag); + } +//+------------------------------------------------------------------+ +//| Gator Oscillator | +//+------------------------------------------------------------------+ +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[]) + { + int shift; +//--- check for rules and bars count + if(ExtUpperShift>ExtLowerShift) + shift=ExtUpperShift; + else + shift=ExtLowerShift; + if(!ExtFlag || shift>rates_total) + return(0); +//--- not all data may be calculated + int calculated=BarsCalculated(ExtJawsHandle); + if(calculatedrates_total || prev_calculated<0) + to_copy=rates_total; + else + { + to_copy=rates_total-prev_calculated; + if(prev_calculated>0) + to_copy++; + } +//--- get ma buffers + if(IsStopped()) // checking for stop flag + return(0); + if(CopyBuffer(ExtJawsHandle,0,0,to_copy,ExtJawsBuffer)<=0) + { + Print("getting ExtJawsHandle is failed! Error",GetLastError()); + return(0); + } + if(IsStopped()) // checking for stop flag + return(0); + if(CopyBuffer(ExtTeethHandle,0,0,to_copy,ExtTeethBuffer)<=0) + { + Print("getting ExtTeethHandle is failed! Error",GetLastError()); + return(0); + } + if(IsStopped()) // checking for stop flag + return(0); + if(CopyBuffer(ExtLipsHandle,0,0,to_copy,ExtLipsBuffer)<=0) + { + Print("getting ExtLipsHandle is failed! Error",GetLastError()); + return(0); + } +//--- last 2 counted bars will be recounted + int pos=prev_calculated-2; + if(pos=lower_limit) + { + //--- calculate down buffer value + cur_value=-MathAbs(ExtTeethBuffer[i-ExtLowerShift]-ExtLipsBuffer[i]); + prev_value=ExtLowerBuffer[i-1]; + ExtLowerBuffer[i]=cur_value; + //--- set down buffer color + if(prev_value==cur_value) + ExtLoColorsBuffer[i]=ExtLoColorsBuffer[i-1]; + else + { + if(prev_value=upper_limit) + { + //--- calculate up buffer value + cur_value=MathAbs(ExtJawsBuffer[i-ExtUpperShift]-ExtTeethBuffer[i]); + ExtUpperBuffer[i]=cur_value; + prev_value=ExtUpperBuffer[i-1]; + //--- set up buffer color + if(prev_value==cur_value) + ExtUpColorsBuffer[i]=ExtUpColorsBuffer[i-1]; + else + { + if(prev_valueInpTeethPeriod>InpLipsPeriod; | +//| 2.InpJawsShift>InpTeethShift>InpLipsShift; | +//| 3.InpJawsPeriod>InpJawsShift; | +//| 4.InpTeethPeriod>InpTeethShift; | +//| 5.InpLipsPeriod>InpLipsShift. | +//+------------------------------------------------------------------+ +bool CheckForInput() + { +//--- 1 + if(InpJawsPeriod<=InpTeethPeriod || InpTeethPeriod<=InpLipsPeriod) + return(false); +//--- 2 + if(InpJawsShift<=InpTeethShift || InpTeethShift<=InpLipsShift) + return(false); +//--- 3 + if(InpJawsPeriod<=InpJawsShift) + return(false); +//--- 4 + if(InpTeethPeriod<=InpTeethShift) + return(false); +//--- 5 + if(InpLipsPeriod<=InpLipsShift) + return(false); +//--- all right + return(true); + } +//+------------------------------------------------------------------+ diff --git a/BKPS/14031206/Indicators/Examples/Gator_2.ex5 b/BKPS/14031206/Indicators/Examples/Gator_2.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..4c4abbe3ca5190d54a5b00a05295e00fc84a60f3 GIT binary patch literal 16030 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 literal 0 HcmV?d00001 diff --git a/BKPS/14031206/Indicators/Examples/Gator_2.mq5 b/BKPS/14031206/Indicators/Examples/Gator_2.mq5 new file mode 100644 index 0000000..6224db5 --- /dev/null +++ b/BKPS/14031206/Indicators/Examples/Gator_2.mq5 @@ -0,0 +1,252 @@ +//+------------------------------------------------------------------+ +//| Gator.mq5 | +//| Copyright 2000-2025, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2000-2025, MetaQuotes Ltd." +#property link "https://www.mql5.com" +#property description "Gator Oscillator" +#property description "based on shifted Alligator buffers" +//******************************************************************** +// Attention! Following correlations must be obeyed: +// 1.InpJawsPeriod>InpTeethPeriod>InpLipsPeriod; +// 2.InpJawsShift>InpTeethShift>InpLipsShift; +// 3.InpJawsPeriod>InpJawsShift; +// 4.InpTeethPeriod>InpTeethShift; +// 5.InpLipsPeriod>InpLipsShift. +//******************************************************************** +//--- indicator settings +#property indicator_separate_window +#property indicator_buffers 7 +#property indicator_plots 2 +#property indicator_type1 DRAW_COLOR_HISTOGRAM +#property indicator_type2 DRAW_COLOR_HISTOGRAM +#property indicator_color1 Green,Red +#property indicator_color2 Green,Red +#property indicator_width1 2 +#property indicator_width2 2 +#property indicator_label1 "Gator Upper" +#property indicator_label2 "Gator Lower" +//--- input parameters +input int InpJawsPeriod=13; // Jaws period +input int InpJawsShift=8; // Jaws shift +input int InpTeethPeriod=8; // Teeth period +input int InpTeethShift=5; // Teeth shift +input int InpLipsPeriod=5; // Lips period +input int InpLipsShift=3; // Lips shift +input ENUM_MA_METHOD InpMAMethod=MODE_SMMA; // Moving average method +input ENUM_APPLIED_PRICE InpAppliedPrice=PRICE_MEDIAN; // Applied price +//--- indicator buffers +double ExtUpperBuffer[]; +double ExtUpColorsBuffer[]; +double ExtLowerBuffer[]; +double ExtLoColorsBuffer[]; +double ExtJawsBuffer[]; +double ExtTeethBuffer[]; +double ExtLipsBuffer[]; + +int ExtAlligatorHandle; +int ExtUpperShift; +int ExtLowerShift; +bool ExtFlag; +//+------------------------------------------------------------------+ +//| Custom indicator initialization function | +//+------------------------------------------------------------------+ +int OnInit() + { +//--- indicator buffers mapping + SetIndexBuffer(0,ExtUpperBuffer,INDICATOR_DATA); + SetIndexBuffer(1,ExtUpColorsBuffer,INDICATOR_COLOR_INDEX); + SetIndexBuffer(2,ExtLowerBuffer,INDICATOR_DATA); + SetIndexBuffer(3,ExtLoColorsBuffer,INDICATOR_COLOR_INDEX); +//--- MAs + SetIndexBuffer(4,ExtJawsBuffer,INDICATOR_CALCULATIONS); + SetIndexBuffer(5,ExtTeethBuffer,INDICATOR_CALCULATIONS); + SetIndexBuffer(6,ExtLipsBuffer,INDICATOR_CALCULATIONS); +//--- get handles + ExtAlligatorHandle=iAlligator(NULL,0, + InpJawsPeriod,0, + InpTeethPeriod,0, + InpLipsPeriod,0, + InpMAMethod,InpAppliedPrice); +//--- set indicator digits + IndicatorSetInteger(INDICATOR_DIGITS,_Digits+1); +//--- sets first bar from what index will be drawn + PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,InpTeethShift+InpTeethPeriod); + PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,InpLipsShift+InpLipsPeriod); +//--- line shifts when drawing + PlotIndexSetInteger(0,PLOT_SHIFT,InpTeethShift); + PlotIndexSetInteger(1,PLOT_SHIFT,InpLipsShift); +//--- name for indicator subwindow label + string short_name=StringFormat("Gator(%d,%d,%d)",InpJawsPeriod,InpTeethPeriod,InpLipsPeriod); + IndicatorSetString(INDICATOR_SHORTNAME,short_name); +//--- sets drawing line empty value + PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0.0); + PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,0.0); +//--- calculate global variables values + ExtUpperShift=InpJawsShift-InpTeethShift; + ExtLowerShift=InpTeethShift-InpLipsShift; +//--- check for input parameters + ExtFlag=CheckForInput(); + if(!ExtFlag) + Print("Wrong input parameters. Indicator won't work."); +//--- initialization done. 0 returned if ExtFlag is true + return(ExtFlag?0:1); + } +//+------------------------------------------------------------------+ +//| Gator Oscillator | +//+------------------------------------------------------------------+ +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[]) + { + int shift; +//--- check for rules and bars count + if(ExtUpperShift>ExtLowerShift) + shift=ExtUpperShift; + else + shift=ExtLowerShift; + if(!ExtFlag || shift>rates_total) + return(0); +//--- not all data may be calculated + int calculated=BarsCalculated(ExtAlligatorHandle); + if(calculatedrates_total || prev_calculated<0) + to_copy=rates_total; + else + { + to_copy=rates_total-prev_calculated; + if(prev_calculated>0) + to_copy++; + } +//--- get alligator buffers + if(IsStopped()) // checking for stop flag + return(0); + if(CopyBuffer(ExtAlligatorHandle,0,0,to_copy,ExtJawsBuffer)<=0) + { + Print("getting ExtAlligatorHandle buffer 0 is failed! Error ",GetLastError()); + return(0); + } + if(IsStopped()) // checking for stop flag + return(0); + if(CopyBuffer(ExtAlligatorHandle,1,0,to_copy,ExtTeethBuffer)<=0) + { + Print("getting ExtAlligatorHandle buffer 1 is failed! Error ",GetLastError()); + return(0); + } + if(IsStopped()) // checking for stop flag + return(0); + if(CopyBuffer(ExtAlligatorHandle,2,0,to_copy,ExtLipsBuffer)<=0) + { + Print("getting ExtAlligatorHandle buffer 2 is failed! Error ",GetLastError()); + return(0); + } +//--- last counted bar will be recounted + int pos=prev_calculated-1; + if(pos=lower_limit) + { + //--- calculate down buffer value + cur_value=-fabs(ExtTeethBuffer[i-ExtLowerShift]-ExtLipsBuffer[i]); + prev_value=ExtLowerBuffer[i-1]; + ExtLowerBuffer[i]=cur_value; + //--- set down buffer color + if(prev_value==cur_value) + ExtLoColorsBuffer[i]=ExtLoColorsBuffer[i-1]; + else + { + if(prev_value=upper_limit) + { + //--- calculate up buffer value + cur_value=fabs(ExtJawsBuffer[i-ExtUpperShift]-ExtTeethBuffer[i]); + ExtUpperBuffer[i]=cur_value; + prev_value=ExtUpperBuffer[i-1]; + //--- set up buffer color + if(prev_value==cur_value) + ExtUpColorsBuffer[i]=ExtUpColorsBuffer[i-1]; + else + { + if(prev_valueInpTeethPeriod>InpLipsPeriod; | +//| 2.InpJawsShift>InpTeethShift>InpLipsShift; | +//| 3.InpJawsPeriod>InpJawsShift; | +//| 4.InpTeethPeriod>InpTeethShift; | +//| 5.InpLipsPeriod>InpLipsShift. | +//+------------------------------------------------------------------+ +bool CheckForInput() + { +//--- 1 + if(InpJawsPeriod<=InpTeethPeriod || InpTeethPeriod<=InpLipsPeriod) + return(false); +//--- 2 + if(InpJawsShift<=InpTeethShift || InpTeethShift<=InpLipsShift) + return(false); +//--- 3 + if(InpJawsPeriod<=InpJawsShift) + return(false); +//--- 4 + if(InpTeethPeriod<=InpTeethShift) + return(false); +//--- 5 + if(InpLipsPeriod<=InpLipsShift) + return(false); +//--- all right + return(true); + } +//+------------------------------------------------------------------+ diff --git a/BKPS/14031206/Indicators/Examples/Heiken_Ashi.ex5 b/BKPS/14031206/Indicators/Examples/Heiken_Ashi.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..ccbcdd0832332425cd7d6c31868c452499e3e023 GIT binary patch literal 8006 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 i{?}QJtNnx3QmnQCR-<+9ht-;P|2e!i{% literal 0 HcmV?d00001 diff --git a/BKPS/14031206/Indicators/Examples/ZigzagColor.ex5 b/BKPS/14031206/Indicators/Examples/ZigzagColor.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..db81b19e7b4dec283cd6eec30ba300e5e329fb2a GIT binary patch literal 12770 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 U3HSR%Chw@gl-fk literal 0 HcmV?d00001 diff --git a/BKPS/14031206/Indicators/Examples/ZigzagColor.mq5 b/BKPS/14031206/Indicators/Examples/ZigzagColor.mq5 new file mode 100644 index 0000000..ae0589e --- /dev/null +++ b/BKPS/14031206/Indicators/Examples/ZigzagColor.mq5 @@ -0,0 +1,287 @@ +//+------------------------------------------------------------------+ +//| ZigzagColor.mq5 | +//| Copyright 2000-2025, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2000-2025, MetaQuotes Ltd." +#property link "https://www.mql5.com" +//--- indicator settings +#property indicator_chart_window +#property indicator_buffers 5 +#property indicator_plots 1 +#property indicator_type1 DRAW_COLOR_ZIGZAG +#property indicator_color1 clrDodgerBlue, clrRed +//--- input parameters +input int InpDepth =12; // Depth +input int InpDeviation=5; // Deviation +input int InpBackstep =3; // Back Step +//--- indicator buffers +double ZigzagPeakBuffer[]; +double ZigzagBottomBuffer[]; +double HighMapBuffer[]; +double LowMapBuffer[]; +double ColorBuffer[]; + +int ExtRecalc=3; // recounting's depth + +enum EnSearchMode + { + Extremum=0, // searching for the first extremum + Peak=1, // searching for the next ZigZag peak + Bottom=-1 // searching for the next ZigZag bottom + }; +//+------------------------------------------------------------------+ +//| Custom indicator initialization function | +//+------------------------------------------------------------------+ +void OnInit() + { +//--- indicator buffers mapping + SetIndexBuffer(0,ZigzagPeakBuffer,INDICATOR_DATA); + SetIndexBuffer(1,ZigzagBottomBuffer,INDICATOR_DATA); + SetIndexBuffer(2,ColorBuffer,INDICATOR_COLOR_INDEX); + SetIndexBuffer(3,HighMapBuffer,INDICATOR_CALCULATIONS); + SetIndexBuffer(4,LowMapBuffer,INDICATOR_CALCULATIONS); +//--- set accuracy + IndicatorSetInteger(INDICATOR_DIGITS,_Digits); +//--- name for DataWindow and indicator subwindow label + string short_name=StringFormat("ZigZagColor(%d,%d,%d)",InpDepth,InpDeviation,InpBackstep); + IndicatorSetString(INDICATOR_SHORTNAME,short_name); + PlotIndexSetString(0,PLOT_LABEL,short_name); +//--- set an empty value + PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0.0); + } +//+------------------------------------------------------------------+ +//| ZigZag calculation | +//+------------------------------------------------------------------+ +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[]) + { + if(rates_total<100) + return(0); +//--- + int i,start=0; + int extreme_counter=0,extreme_search=Extremum; + int shift,back=0,last_high_pos=0,last_low_pos=0; + double val=0,res=0; + double cur_low=0,cur_high=0,last_high=0,last_low=0; +//--- initializing + if(prev_calculated==0) + { + ArrayInitialize(ZigzagPeakBuffer,0.0); + ArrayInitialize(ZigzagBottomBuffer,0.0); + ArrayInitialize(HighMapBuffer,0.0); + ArrayInitialize(LowMapBuffer,0.0); + //--- start calculation from bar number InpDepth + start=InpDepth-1; + } +//--- ZigZag was already calculated before + if(prev_calculated>0) + { + i=rates_total-1; + //--- searching for the third extremum from the last uncompleted bar + while(extreme_counterrates_total -100) + { + res=(ZigzagPeakBuffer[i]+ZigzagBottomBuffer[i]); + //--- + if(res!=0) + extreme_counter++; + i--; + } + i++; + start=i; + //--- what type of exremum we search for + if(LowMapBuffer[i]!=0) + { + cur_low=LowMapBuffer[i]; + extreme_search=Peak; + } + else + { + cur_high=HighMapBuffer[i]; + extreme_search=Bottom; + } + //--- clear indicator values + for(i=start+1; i(InpDeviation*_Point)) + val=0.0; + else + { + for(back=InpBackstep; back>=1; back--) + { + res=LowMapBuffer[shift-back]; + //--- + if((res!=0) && (res>val)) + LowMapBuffer[shift-back]=0.0; + } + } + } + if(low[shift]==val) + LowMapBuffer[shift]=val; + else + LowMapBuffer[shift]=0.0; + //--- high + val=Highest(high,InpDepth,shift); + if(val==last_high) + val=0.0; + else + { + last_high=val; + if((val-high[shift])>(InpDeviation*_Point)) + val=0.0; + else + { + for(back=InpBackstep; back>=1; back--) + { + res=HighMapBuffer[shift-back]; + //--- + if((res!=0) && (reslast_high && + LowMapBuffer[shift]==0.0) + { + ZigzagPeakBuffer[last_high_pos]=0.0; + last_high_pos=shift; + last_high=HighMapBuffer[shift]; + ZigzagPeakBuffer[shift]=last_high; + ColorBuffer[shift]=0; + } + if(LowMapBuffer[shift]!=0.0 && HighMapBuffer[shift]==0.0) + { + last_low=LowMapBuffer[shift]; + last_low_pos=shift; + ZigzagBottomBuffer[shift]=last_low; + ColorBuffer[shift]=1; + extreme_search=Peak; + } + break; + default: + return(rates_total); + } + } + +//--- return value of prev_calculated for next call + return(rates_total); + } +//+------------------------------------------------------------------+ +//| Get highest value for range | +//+------------------------------------------------------------------+ +double Highest(const double&array[],int count,int start) + { + double res=array[start]; +//--- + for(int i=start-1; i>start-count && i>=0; i--) + if(resstart-count && i>=0; i--) + if(res>array[i]) + res=array[i]; +//--- + return(res); + } +//+------------------------------------------------------------------+ diff --git a/BKPS/14031206/Indicators/Free Indicators/Camarilla Channel.ex5 b/BKPS/14031206/Indicators/Free Indicators/Camarilla Channel.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..4e7f0a596dc069041279d436b39aec00b51b3945 GIT binary patch literal 18278 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 + { + Alert("Timeframe of chart must be D1 or lower. Exit"); + return(INIT_FAILED); + } + +//--- define buffers + SetIndexBuffer(0, ExtH5Buffer); + SetIndexBuffer(1, ExtH4Buffer); + SetIndexBuffer(2, ExtH3Buffer); + SetIndexBuffer(3, ExtH2Buffer); + SetIndexBuffer(4, ExtH1Buffer); + SetIndexBuffer(5, ExtL1Buffer); + SetIndexBuffer(6, ExtL2Buffer); + SetIndexBuffer(7, ExtL3Buffer); + SetIndexBuffer(8, ExtL4Buffer); + SetIndexBuffer(9, ExtL5Buffer); + +//--- indicator name + IndicatorSetString(INDICATOR_SHORTNAME, "Camarilla Channels"); +//--- number of digits of indicator value + IndicatorSetInteger(INDICATOR_DIGITS, _Digits); + +//--- prepare prefix for objects + string number=StringFormat("%I64d", GetTickCount64()); + ExtPrefixUniq=StringSubstr(number, StringLen(number)-4); + ExtPrefixUniq=ExtPrefixUniq+"_CH"; + Print("Indicator \"Camarilla Channels\" started, prefix=", ExtPrefixUniq); + + return(INIT_SUCCEEDED); + } +//+------------------------------------------------------------------+ +//| Custom indicator iteration function | +//+------------------------------------------------------------------+ +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[]) + { + static MqlRates LAST_DAY[]; // previous day + static datetime last_time=0; // reference time + static datetime error_time=0; // error output time + +//--- if the indicator has previously been calculated, start from the bar preceding the last one + int start=prev_calculated-1; + +//--- if this is the first calculation of the indicator, start from the first bar on the chart + if(prev_calculated==0) + start=0; + +//--- calculate levels for all bars in a loop + for(int i=start; i=error_time) + { + error_time=TimeCurrent()+60; + Print("Failed to get previous day by CopyRates(Symbol(), PERIOD_D1, error ", GetLastError()); + } + return(prev_calculated); + } + } + + //--- calculate levels + double range=LAST_DAY[0].high - LAST_DAY[0].low; + double h5=(LAST_DAY[0].high/LAST_DAY[0].low) * LAST_DAY[0].close; + double h4=LAST_DAY[0].close + range*1.1/2.0; + double h3=LAST_DAY[0].close + range*1.1/4.0; + double h2=LAST_DAY[0].close + range*1.1/6.0; + double h1=LAST_DAY[0].close + range*1.1/12.0; + double l1=LAST_DAY[0].close - range*1.1/12.0; + double l2=LAST_DAY[0].close - range*1.1/6.0; + double l3=LAST_DAY[0].close - range*1.1/4.0; + double l4=LAST_DAY[0].close - range*1.1/2.0; + double l5=LAST_DAY[0].close - (h5 -LAST_DAY[0].close); + + //--- write values into buffers + ExtH5Buffer[i]=h5; + ExtH4Buffer[i]=h4; + ExtH3Buffer[i]=h3; + ExtH2Buffer[i]=h2; + ExtH1Buffer[i]=h1; + ExtL1Buffer[i]=l1; + ExtL2Buffer[i]=l2; + ExtL3Buffer[i]=l3; + ExtL4Buffer[i]=l4; + ExtL5Buffer[i]=l5; + } + +//--- draw labels on levels + if(InpShowLabel) + { + ShowPriceLevels(time[rates_total-1], rates_total-1); + ChartRedraw(); + } + +//--- succesfully calculated + return(rates_total); + } +//+------------------------------------------------------------------+ +//| Custom indicator deinitialization function | +//+------------------------------------------------------------------+ +void OnDeinit(const int reason) + { +//--- delete all our graphical objects after use + Print("Indicator \"Camarilla Channels\" stopped, delete all objects with prefix=", ExtPrefixUniq); + ObjectsDeleteAll(0, ExtPrefixUniq, 0, OBJ_ARROW_RIGHT_PRICE); + ChartRedraw(0); + } +//+------------------------------------------------------------------+ +//| Show prices' levels | +//+------------------------------------------------------------------+ +void ShowPriceLevels(datetime time, int last_index) + { + ShowRightPrice(ExtPrefixUniq+"_H5", time, ExtH5Buffer[last_index], clrGreen); + ShowRightPrice(ExtPrefixUniq+"_H4", time, ExtH4Buffer[last_index], clrGreen); + ShowRightPrice(ExtPrefixUniq+"_H3", time, ExtH3Buffer[last_index], clrGreen); + ShowRightPrice(ExtPrefixUniq+"_H2", time, ExtH2Buffer[last_index], clrGreen); + ShowRightPrice(ExtPrefixUniq+"_H1", time, ExtH1Buffer[last_index], clrGreen); + ShowRightPrice(ExtPrefixUniq+"_L1", time, ExtL1Buffer[last_index], clrRed); + ShowRightPrice(ExtPrefixUniq+"_L2", time, ExtL2Buffer[last_index], clrRed); + ShowRightPrice(ExtPrefixUniq+"_L3", time, ExtL3Buffer[last_index], clrRed); + ShowRightPrice(ExtPrefixUniq+"_L4", time, ExtL4Buffer[last_index], clrRed); + ShowRightPrice(ExtPrefixUniq+"_L5", time, ExtL5Buffer[last_index], clrRed); + } +//+------------------------------------------------------------------+ +//| Create or Update "Right Price Label" object | +//+------------------------------------------------------------------+ +bool ShowRightPrice(const string name, datetime time, double price, color clr) + { + if(!ObjectCreate(0, name, OBJ_ARROW_RIGHT_PRICE, 0, time, price)) + { + ObjectMove(0, name, 0, time, price); + return(false); + } + +//--- make the label size adaptive + long scale=2; + if(!ChartGetInteger(0, CHART_SCALE, 0, scale)) + { + //--- output an error message to the Experts journal + Print(__FUNCTION__+", ChartGetInteger(CHART_SCALE) failed, error = ", GetLastError()); + } + int width=scale>1 ? 2:1; // if chart scale > 1, then label size = 2 + + ObjectSetInteger(0, name, OBJPROP_COLOR, clr); + ObjectSetInteger(0, name, OBJPROP_STYLE, STYLE_SOLID); + ObjectSetInteger(0, name, OBJPROP_WIDTH, width); + ObjectSetInteger(0, name, OBJPROP_BACK, false); + ObjectSetInteger(0, name, OBJPROP_SELECTABLE, false); + ObjectSetInteger(0, name, OBJPROP_SELECTED, false); + ObjectSetInteger(0, name, OBJPROP_HIDDEN, true); + ObjectSetInteger(0, name, OBJPROP_ZORDER, 0); + + return(true); + } +//+------------------------------------------------------------------+ diff --git a/BKPS/14031206/Indicators/Free Indicators/DeMark Channel.ex5 b/BKPS/14031206/Indicators/Free Indicators/DeMark Channel.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..47d1450a1ed14588654b3f540bb82e55f7696ecc GIT binary patch literal 13660 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 LRjZQv;->!veeNM{ literal 0 HcmV?d00001 diff --git a/BKPS/14031206/Indicators/Free Indicators/DeMark Channel.mq5 b/BKPS/14031206/Indicators/Free Indicators/DeMark Channel.mq5 new file mode 100644 index 0000000..2c9a3f8 --- /dev/null +++ b/BKPS/14031206/Indicators/Free Indicators/DeMark Channel.mq5 @@ -0,0 +1,204 @@ +//+------------------------------------------------------------------+ +//| DeMark Channel.mq5 | +//| Copyright 2009-2025, MetaQuotes Ltd | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "2009-2025, MetaQuotes Ltd" +#property link "http://www.mql5.com" +#property description "DeMark Channel" + +#property indicator_chart_window +#property indicator_buffers 3 +#property indicator_plots 3 +#property indicator_type1 DRAW_LINE +#property indicator_color1 clrGreen +#property indicator_type2 DRAW_LINE +#property indicator_color2 clrBlue +#property indicator_type3 DRAW_LINE +#property indicator_color3 clrRed +//--- labels +#property indicator_label1 "PP" +#property indicator_label2 "R1" +#property indicator_label3 "S1" + +//--- input parameter +input bool InpShowLabel=true; // show price of level + +//--- indicator buffers +double ExtPPBuffer[]; +double ExtR1Buffer[]; +double ExtS1Buffer[]; + +//--- unique prefix to identify indicator objects +string ExtPrefixUniq; + +//+------------------------------------------------------------------+ +//| Custom indicator initialization function | +//+------------------------------------------------------------------+ +int OnInit() + { +//--- check current timeframe + if(PeriodSeconds()>PeriodSeconds(PERIOD_D1)) + { + Alert("Timeframe of chart must be D1 or lower. Exit"); + return(INIT_FAILED); + } + +//--- define buffers + SetIndexBuffer(0, ExtPPBuffer); + SetIndexBuffer(1, ExtR1Buffer); + SetIndexBuffer(2, ExtS1Buffer); + +//--- indicator name + IndicatorSetString(INDICATOR_SHORTNAME, "DeMark Channel"); +//--- number of digits of indicator value + IndicatorSetInteger(INDICATOR_DIGITS, _Digits); + +//--- prepare prefix for objects + string number=StringFormat("%I64d", GetTickCount64()); + ExtPrefixUniq=StringSubstr(number, StringLen(number)-4); + ExtPrefixUniq=ExtPrefixUniq+"_DM"; + Print("Indicator \"DeMark Channels\" started, prefix=", ExtPrefixUniq); + + return(INIT_SUCCEEDED); + } +//+------------------------------------------------------------------+ +//| Custom indicator iteration function | +//+------------------------------------------------------------------+ +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[]) + { + static MqlRates LAST_DAY[]; // previous day + static datetime last_time=0; // reference time + static datetime error_time=0; // error output time + +//--- if the indicator has previously been calculated, start from the bar preceding the last one + int start=prev_calculated-1; + +//--- if this is the first calculation of the indicator, start from the first bar on the chart + if(prev_calculated==0) + start=0; + +//--- calculate levels for all bars in a loop + for(int i=start; i=error_time) + { + error_time=TimeCurrent()+60; + Print("Failed to get previous day by CopyRates(Symbol(), PERIOD_D1, error ", GetLastError()); + } + return(prev_calculated); + } + } + + //--- preparations + double day_close=LAST_DAY[0].close; + double day_open=LAST_DAY[0].open; + double day_high=LAST_DAY[0].high; + double day_low=LAST_DAY[0].low; + + //--- initial calculation + double x=day_high+day_low+2*day_close; + if(day_closeday_open) + x=2*day_high+day_low+day_close; + + //--- calculate levels + double pivot_point=x/4; + double s1=x/2-day_high; + double r1=x/2-day_low; + + //--- write values into buffers + ExtPPBuffer[i]=pivot_point; + ExtR1Buffer[i]=r1; + ExtS1Buffer[i]=s1; + } + +//--- draw labels on levels + if(InpShowLabel) + { + ShowPriceLevels(time[rates_total-1], rates_total-1); + ChartRedraw(); + } + +//--- succesfully calculated + return(rates_total); + } +//+------------------------------------------------------------------+ +//| Custom indicator deinitialization function | +//+------------------------------------------------------------------+ +void OnDeinit(const int reason) + { +//--- delete all our graphical objects after use + Print("Indicator \"DeMark Channels\" stopped, delete all objects with prefix=", ExtPrefixUniq); + ObjectsDeleteAll(0, ExtPrefixUniq, 0, OBJ_ARROW_RIGHT_PRICE); + ChartRedraw(0); + } +//+------------------------------------------------------------------+ +//| Show prices' levels | +//+------------------------------------------------------------------+ +void ShowPriceLevels(datetime time, int last_index) + { + ShowRightPrice(ExtPrefixUniq+"_PP", time, ExtPPBuffer[last_index], clrGreen); + ShowRightPrice(ExtPrefixUniq+"_R1", time, ExtR1Buffer[last_index], clrBlue); + ShowRightPrice(ExtPrefixUniq+"_S1", time, ExtS1Buffer[last_index], clrRed); + } +//+------------------------------------------------------------------+ +//| Create or Update "Right Price Label" object | +//+------------------------------------------------------------------+ +bool ShowRightPrice(const string name, datetime time, double price, color clr) + { + if(!ObjectCreate(0, name, OBJ_ARROW_RIGHT_PRICE, 0, time, price)) + { + ObjectMove(0, name, 0, time, price); + return(false); + } + +//--- make the label size adaptive + long scale=2; + if(!ChartGetInteger(0, CHART_SCALE, 0, scale)) + { + //--- output an error message to the Experts journal + Print(__FUNCTION__+", ChartGetInteger(CHART_SCALE) failed, error = ", GetLastError()); + } + int width=scale>1 ? 2:1; // if chart scale > 1, then label size = 2 + + ObjectSetInteger(0, name, OBJPROP_COLOR, clr); + ObjectSetInteger(0, name, OBJPROP_STYLE, STYLE_SOLID); + ObjectSetInteger(0, name, OBJPROP_WIDTH, width); + ObjectSetInteger(0, name, OBJPROP_BACK, false); + ObjectSetInteger(0, name, OBJPROP_SELECTABLE, false); + ObjectSetInteger(0, name, OBJPROP_SELECTED, false); + ObjectSetInteger(0, name, OBJPROP_HIDDEN, true); + ObjectSetInteger(0, name, OBJPROP_ZORDER, 0); + + return(true); + } +//+------------------------------------------------------------------+ diff --git a/BKPS/14031206/Indicators/Free Indicators/Donchian Channel.ex5 b/BKPS/14031206/Indicators/Free Indicators/Donchian Channel.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..52ee7557a03de193e409f4261a458f0a74edacb3 GIT binary patch literal 12862 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 literal 0 HcmV?d00001 diff --git a/BKPS/14031206/Indicators/Free Indicators/Donchian Channel.mq5 b/BKPS/14031206/Indicators/Free Indicators/Donchian Channel.mq5 new file mode 100644 index 0000000..89d76e2 --- /dev/null +++ b/BKPS/14031206/Indicators/Free Indicators/Donchian Channel.mq5 @@ -0,0 +1,160 @@ +//+------------------------------------------------------------------+ +//| Donchian Channel.mq5 | +//| Copyright 2009-2025, MetaQuotes Ltd | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "2009-2025, MetaQuotes Ltd" +#property link "http://www.mql5.com" +#property description "Donchian Channel" +//--- +#property indicator_chart_window +#property indicator_buffers 3 +#property indicator_plots 3 +#property indicator_type1 DRAW_LINE +#property indicator_color1 clrBlue +#property indicator_type2 DRAW_LINE +#property indicator_color2 clrGray +#property indicator_type3 DRAW_LINE +#property indicator_color3 clrRed +//--- labels +#property indicator_label1 "Upper Donchian" +#property indicator_label2 "Middle Donchian" +#property indicator_label3 "Lower Donchian" + +//--- input parameter +input int InpDonchianPeriod=20; // period of the channel +input bool InpShowLabel =true; // show price of the level + +//--- indicator buffers +double ExtUpBuffer[]; +double ExtMdBuffer[]; +double ExtDnBuffer[]; + +//--- unique prefix to identify indicator objects +string ExtPrefixUniq; + +//+------------------------------------------------------------------+ +//| Custom indicator initialization function | +//+------------------------------------------------------------------+ +int OnInit() + { +//--- define buffers + SetIndexBuffer(0, ExtUpBuffer); + SetIndexBuffer(1, ExtMdBuffer); + SetIndexBuffer(2, ExtDnBuffer); + +//--- set a 1-bar offset for each line + PlotIndexSetInteger(0, PLOT_SHIFT, 1); + PlotIndexSetInteger(1, PLOT_SHIFT, 1); + PlotIndexSetInteger(2, PLOT_SHIFT, 1); + +//--- indicator name + IndicatorSetString(INDICATOR_SHORTNAME, "Donchian Channel"); +//--- number of digits of indicator value + IndicatorSetInteger(INDICATOR_DIGITS, _Digits); + +//--- prepare prefix for objects + string number=StringFormat("%I64d", GetTickCount64()); + ExtPrefixUniq=StringSubstr(number, StringLen(number)-4); + ExtPrefixUniq=ExtPrefixUniq+"_DN"; + Print("Indicator \"Donchian Channels\" started, prefix=", ExtPrefixUniq); + + return(INIT_SUCCEEDED); + } +//+------------------------------------------------------------------+ +//| Custom indicator iteration function | +//+------------------------------------------------------------------+ +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[]) + { +//--- if the indicator has previously been calculated, start from the bar preceding the last one + int start=prev_calculated-1; + +//--- if this is the first calculation of the indicator, then move by InpDonchianPeriod bars form the beginning + if(prev_calculated==0) + start=InpDonchianPeriod+1; + +//--- calculate levels for all bars in a loop + for(int i=start; iPeriodSeconds(PERIOD_D1)) + { + Alert("Timeframe of chart must be D1 or lower. Exit"); + return(INIT_FAILED); + } + +//--- define buffers + SetIndexBuffer(0, ExtPPBuffer); + SetIndexBuffer(1, ExtR1Buffer); + SetIndexBuffer(2, ExtR2Buffer); + SetIndexBuffer(3, ExtS1Buffer); + SetIndexBuffer(4, ExtS2Buffer); + if(InpShowAllLevels) + { + SetIndexBuffer(5, ExtR3Buffer, INDICATOR_DATA); + SetIndexBuffer(6, ExtR4Buffer, INDICATOR_DATA); + SetIndexBuffer(7, ExtS3Buffer, INDICATOR_DATA); + SetIndexBuffer(8, ExtS4Buffer, INDICATOR_DATA); + //--- set plot type + PlotIndexSetInteger(5, PLOT_DRAW_TYPE, DRAW_LINE); + PlotIndexSetInteger(6, PLOT_DRAW_TYPE, DRAW_LINE); + PlotIndexSetInteger(7, PLOT_DRAW_TYPE, DRAW_LINE); + PlotIndexSetInteger(8, PLOT_DRAW_TYPE, DRAW_LINE); + //--- set line style + PlotIndexSetInteger(5, PLOT_LINE_STYLE, STYLE_DASH); + PlotIndexSetInteger(6, PLOT_LINE_STYLE, STYLE_SOLID); + PlotIndexSetInteger(7, PLOT_LINE_STYLE, STYLE_DASH); + PlotIndexSetInteger(8, PLOT_LINE_STYLE, STYLE_SOLID); + //--- set line color + PlotIndexSetInteger(5, PLOT_LINE_COLOR, clrGold); + PlotIndexSetInteger(6, PLOT_LINE_COLOR, clrGold); + PlotIndexSetInteger(7, PLOT_LINE_COLOR, clrGold); + PlotIndexSetInteger(8, PLOT_LINE_COLOR, clrGold); + } + else + { + SetIndexBuffer(5, ExtR3Buffer, INDICATOR_CALCULATIONS); + SetIndexBuffer(6, ExtR4Buffer, INDICATOR_CALCULATIONS); + SetIndexBuffer(7, ExtS3Buffer, INDICATOR_CALCULATIONS); + SetIndexBuffer(8, ExtS4Buffer, INDICATOR_CALCULATIONS); + } + +//--- indicator name + IndicatorSetString(INDICATOR_SHORTNAME, "Fibonacci Daily Channels"); +//--- number of digits of indicator value + IndicatorSetInteger(INDICATOR_DIGITS, _Digits); + +//--- prepare prefix for objects + string number=StringFormat("%I64d", GetTickCount64()); + ExtPrefixUniq=StringSubstr(number, StringLen(number)-4); + ExtPrefixUniq=ExtPrefixUniq+"_FB"; + Print("Indicator \"Fibonacci Channels\" started, prefix=", ExtPrefixUniq); + + return(INIT_SUCCEEDED); + } +//+------------------------------------------------------------------+ +//| Custom indicator iteration function | +//+------------------------------------------------------------------+ +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[]) + { + static MqlRates LAST_DAY[]; // previous day + static datetime last_time=0; // reference time + static datetime error_time=0; // error output time + +//--- if the indicator has previously been calculated, start from the bar preceding the last one + int start=prev_calculated-1; + +//--- if this is the first calculation of the indicator, start from the first bar on the chart + if(prev_calculated==0) + start=0; + +//--- calculate levels for all bars in a loop + for(int i=start; i=error_time) + { + error_time=TimeCurrent()+60; + Print("Failed to get previous day by CopyRates(Symbol(), PERIOD_D1, error ", GetLastError()); + } + return(prev_calculated); + } + } + + //--- calculate Pivot levels + double range=LAST_DAY[0].high-LAST_DAY[0].low; + double pivot_point=(LAST_DAY[0].high+LAST_DAY[0].low+LAST_DAY[0].close)/3; + double r1=pivot_point+0.382*range; + double r2=pivot_point+0.618*range; + double s1=pivot_point-0.382*range; + double s2=pivot_point-0.618*range; + + //--- write values into buffers + ExtPPBuffer[i]=pivot_point; + ExtR1Buffer[i]=r1; + ExtR2Buffer[i]=r2; + ExtS1Buffer[i]=s1; + ExtS2Buffer[i]=s2; + + //--- additional levels + double r3=pivot_point+range; + double r4=pivot_point+1.618*range; + double s3=pivot_point-range; + double s4=pivot_point-1.618*range; + ExtR3Buffer[i]=r3; + ExtR4Buffer[i]=r4; + ExtS3Buffer[i]=s3; + ExtS4Buffer[i]=s4; + } + +//--- draw labels on levels + if(InpShowLabel) + { + ShowPriceLevels(time[rates_total-1], rates_total-1); + ChartRedraw(); + } + +//--- succesfully calculated + return(rates_total); + } +//+------------------------------------------------------------------+ +//| Custom indicator deinitialization function | +//+------------------------------------------------------------------+ +void OnDeinit(const int reason) + { +//--- delete all our graphical objects after use + Print("Indicator \"Fibonacci Channels\" stopped, delete all objects with prefix=", ExtPrefixUniq); + ObjectsDeleteAll(0, ExtPrefixUniq, 0, OBJ_ARROW_RIGHT_PRICE); + ChartRedraw(0); + } +//+------------------------------------------------------------------+ +//| Show prices' levels | +//+------------------------------------------------------------------+ +void ShowPriceLevels(datetime time, int last_index) + { + ShowRightPrice(ExtPrefixUniq+"_PP", time, ExtPPBuffer[last_index], clrBlue); + ShowRightPrice(ExtPrefixUniq+"_R1", time, ExtR1Buffer[last_index], clrOrange); + ShowRightPrice(ExtPrefixUniq+"_R2", time, ExtR2Buffer[last_index], clrRed); + ShowRightPrice(ExtPrefixUniq+"_S1", time, ExtS1Buffer[last_index], clrTeal); + ShowRightPrice(ExtPrefixUniq+"_S2", time, ExtS2Buffer[last_index], clrGreen); + + if(InpShowAllLevels) + { + ShowRightPrice(ExtPrefixUniq+"_R3", time, ExtR3Buffer[last_index], clrGold); + ShowRightPrice(ExtPrefixUniq+"_R4", time, ExtR4Buffer[last_index], clrGold); + ShowRightPrice(ExtPrefixUniq+"_S3", time, ExtS3Buffer[last_index], clrGold); + ShowRightPrice(ExtPrefixUniq+"_S4", time, ExtS4Buffer[last_index], clrGold); + } + } +//+------------------------------------------------------------------+ +//| Create or Update "Right Price Label" object | +//+------------------------------------------------------------------+ +bool ShowRightPrice(const string name, datetime time, double price, color clr) + { + if(!ObjectCreate(0, name, OBJ_ARROW_RIGHT_PRICE, 0, time, price)) + { + ObjectMove(0, name, 0, time, price); + return(false); + } + +//--- make the label size adaptive + long scale=2; + if(!ChartGetInteger(0, CHART_SCALE, 0, scale)) + { + //--- output an error message to the Experts journal + Print(__FUNCTION__+", ChartGetInteger(CHART_SCALE) failed, error = ", GetLastError()); + } + int width=scale>1 ? 2:1; // if chart scale > 1, then label size = 2 + + ObjectSetInteger(0, name, OBJPROP_COLOR, clr); + ObjectSetInteger(0, name, OBJPROP_STYLE, STYLE_SOLID); + ObjectSetInteger(0, name, OBJPROP_WIDTH, width); + ObjectSetInteger(0, name, OBJPROP_BACK, false); + ObjectSetInteger(0, name, OBJPROP_SELECTABLE, false); + ObjectSetInteger(0, name, OBJPROP_SELECTED, false); + ObjectSetInteger(0, name, OBJPROP_HIDDEN, true); + ObjectSetInteger(0, name, OBJPROP_ZORDER, 0); + + return(true); + } +//+------------------------------------------------------------------+ diff --git a/BKPS/14031206/Indicators/Free Indicators/Keltner Channel.ex5 b/BKPS/14031206/Indicators/Free Indicators/Keltner Channel.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..846952df8dfdbb9d8509beb8880de727989aab09 GIT binary patch literal 15366 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 literal 0 HcmV?d00001 diff --git a/BKPS/14031206/Indicators/Free Indicators/Keltner Channel.mq5 b/BKPS/14031206/Indicators/Free Indicators/Keltner Channel.mq5 new file mode 100644 index 0000000..a0d43b4 --- /dev/null +++ b/BKPS/14031206/Indicators/Free Indicators/Keltner Channel.mq5 @@ -0,0 +1,246 @@ +//+------------------------------------------------------------------+ +//| Keltner Channel.mq5 | +//| Copyright 2009-2025, MetaQuotes Ltd | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "2009-2025, MetaQuotes Ltd" +#property link "http://www.mql5.com" +#property description "Keltner Channel" + +#property indicator_chart_window +#property indicator_buffers 3 +#property indicator_plots 3 +#property indicator_type1 DRAW_LINE +#property indicator_color1 clrBlue +#property indicator_type2 DRAW_LINE +#property indicator_color2 clrGray +#property indicator_type3 DRAW_LINE +#property indicator_color3 clrRed +//--- labels +#property indicator_label1 "Upper Keltner" +#property indicator_label2 "Middle Keltner" +#property indicator_label3 "Lower Keltner" + +//--- input parameters +input int InpEMAPeriod=20; // Period of EMA +input int InpATRPeriod=10; // Period of ATR +input double InpATRFactor=2.0; // ATR multiplier +input bool InpShowLabel=true; // Show price of level + + +//--- global variables for parameters +int ExtEMAPeriod; +int ExtATRPeriod; +double ExtATRFactor; + +//--- indicator buffers +double ExtUppBuffer[]; +double ExtEMABuffer[]; +double ExtDwnBuffer[]; + +//--- indicator handles +int ExtEMAHandle; +int ExtATRHandle; + +//--- unique prefix to identify indicator objects +string ExtPrefixUniq; +int ExtPeriod; +//+------------------------------------------------------------------+ +//| Custom indicator initialization function | +//+------------------------------------------------------------------+ +int OnInit() + { +//--- check for input values + if(InpEMAPeriod<10) + { + ExtEMAPeriod=20; + PrintFormat("Incorrect value for input variable InpEMAPeriod=%d. Indicator will use value=%d for calculations.", + InpEMAPeriod, ExtEMAPeriod); + } + else + ExtEMAPeriod=InpEMAPeriod; + + if(InpATRPeriod<3) + { + ExtATRPeriod=10; + PrintFormat("Incorrect value for input variable InpATRPeriod=%d. Indicator will use value=%d for calculations.", + InpATRPeriod, ExtATRPeriod); + } + else + ExtATRPeriod=InpATRPeriod; + + if(InpATRFactor<1.0) + { + ExtATRFactor=2.0; + PrintFormat("Incorrect value for input variable InpBandsDeviations=%f. Indicator will use value=%f for calculations.", + InpATRFactor, ExtATRFactor); + } + else + ExtATRFactor=InpATRFactor; + +//--- define buffers + SetIndexBuffer(0, ExtUppBuffer); + SetIndexBuffer(1, ExtEMABuffer); + SetIndexBuffer(2, ExtDwnBuffer); + +//--- indexes draw begin settings + PlotIndexSetInteger(0, PLOT_DRAW_BEGIN, InpEMAPeriod+1); + PlotIndexSetInteger(1, PLOT_DRAW_BEGIN, InpEMAPeriod+1); + PlotIndexSetInteger(2, PLOT_DRAW_BEGIN, InpEMAPeriod+1); + +//--- set a 1-bar offset for each line + PlotIndexSetInteger(0, PLOT_SHIFT, 1); + PlotIndexSetInteger(1, PLOT_SHIFT, 1); + PlotIndexSetInteger(2, PLOT_SHIFT, 1); + +//--- set drawing line empty value + PlotIndexSetDouble(0, PLOT_EMPTY_VALUE, 0.0); + PlotIndexSetDouble(1, PLOT_EMPTY_VALUE, 0.0); + PlotIndexSetDouble(2, PLOT_EMPTY_VALUE, 0.0); + +//--- indicator name + IndicatorSetString(INDICATOR_SHORTNAME, "Keltner Channel"); +//--- number of digits of indicator value + IndicatorSetInteger(INDICATOR_DIGITS, _Digits); + +//--- create indicators + ExtEMAHandle=iMA(NULL, 0, InpEMAPeriod, 0, MODE_EMA, PRICE_CLOSE); + ExtATRHandle=iATR(NULL, 0, InpATRPeriod); + + ExtPeriod=PeriodSeconds(_Period); + +//--- prepare prefix for objects + string number=StringFormat("%I64d", GetTickCount64()); + ExtPrefixUniq=StringSubstr(number, StringLen(number)-4); + ExtPrefixUniq=ExtPrefixUniq+"_KLT"; + Print("Indicator \"Keltner Channels\" started, prefix=", ExtPrefixUniq); + + return(INIT_SUCCEEDED); + } +//+------------------------------------------------------------------+ +//| Custom indicator iteration function | +//+------------------------------------------------------------------+ +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[]) + { +//--- if this is the first calculation of the indicator + if(prev_calculated==0) + { + //--- populate the beginning values, for which the indicator cannot be calculated, with empty values + ArrayFill(ExtUppBuffer, 0, rates_total, 0); + ArrayFill(ExtEMABuffer, 0, rates_total, 0); + ArrayFill(ExtDwnBuffer, 0, rates_total, 0); + + //--- get EMA values into the indicator buffer + if(CopyBuffer(ExtEMAHandle, 0, 0, rates_total, ExtEMABuffer)<0) + return(0); + + //--- get ATR indicator values into a dynamic array + double atr[]; + if(CopyBuffer(ExtATRHandle, 0, 0, rates_total, atr)<0) + return(0); + + //--- shift from the beginning by the required number of bars + int start=MathMax(InpEMAPeriod, InpATRPeriod)+1; + + //--- fill in the values of the upper and lower channel borders + for(int i=start; i +#include + +//--- input parameters +input uint InpStartDate =0; // day number to start calculation +input uint InpShowDays =7; // number of days to show +input int InpMultiplier =1; // histogram length multiplier +input color InpAsiaSession =clrGold; // Asian session +input color InpEuropeSession =clrBlue; // European session +input color InpAmericaSession =clrViolet; // American session +input uchar InpTransparency =150; // transparency, 0 = invisible +input uint InpEuropeStartHour =8; // European session opening hour +input uint InpAmericaStartHour=14; // American session opening hour + +//--- unique prefix to identify indicator objects +string ExtPrefixUniq; + +//--- forward class declaration +class CMarketProfile; +//--- collection of pointers of CMarketProfile type +CArrayList mp_list; +//+------------------------------------------------------------------+ +//| Custom indicator initialization function | +//+------------------------------------------------------------------+ +int OnInit() + { +//--- prepare prefix for objects + string number=StringFormat("%I64d", GetTickCount64()); + ExtPrefixUniq=StringSubstr(number, StringLen(number)-4); + Print("Indicator \"Market Profile Canvas\" started, prefix=", ExtPrefixUniq); + + return(INIT_SUCCEEDED); + } +//+------------------------------------------------------------------+ +//| Custom indicator iteration function | +//+------------------------------------------------------------------+ +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[]) + { +//--- opening time of the current daily bar + datetime static open_time=0; + +//--- number of the last day for calculations + uint lastday=InpStartDate+InpShowDays; + +//--- if the calculation has already been done + if(prev_calculated!=0) + { + datetime current_open=iTime(Symbol(), PERIOD_D1, 0); + //--- and we don't need to calculate Market Profile for the first day + if(InpStartDate!=0) + { + //--- if the opening time has not been updated + if(open_time==current_open) + return(rates_total); // no calculation needed, exit + } + //--- otherwise, updated the opening time + open_time=current_open; + //--- further in the code, we will calculate Market Profile for only one day + lastday=InpStartDate+1; + } + +//--- make calculations for the specified days range + for(uint day=InpStartDate; day0) // then update the profile of the current day having the index of 0 + { + //--- search for the required CMarketProfile profile in the mp_list collection: it must be there + market_profile=GetMarketProfileByDate(ExtPrefixUniq, start_time); + //--- check + if(market_profile==NULL) + { + PrintFormat("Market Profile not found for %s. Indicator will be recalculated for all specified days", + TimeToString(start_time, TIME_DATE)); + return(0); // exit with zero value to ensure all calculations are done again + } + //--- the CMarketProfile object not found; pass valid High/Low values and a set of current-timeframe bars to it + market_profile.SetHiLoBars(day_rate[0].high, day_rate[0].low, bars_in_day); + } + else + { + //--- create a new object to store the profile + market_profile = new CMarketProfile(ExtPrefixUniq, start_time, stop_time, day_rate[0].high, day_rate[0].low, bars_in_day); + //--- add the created CMarketProfile to the collection + mp_list.Add(market_profile); + } + //--- set drawing parameters + market_profile.UpdateSizes(); + //--- calculate profiles for each session + market_profile.CalculateSessions(); + //--- draw the profile + market_profile.Draw(InpMultiplier); + } +//--- redraw all objects + ChartRedraw(0); + +//--- return value of prev_calculated for the next call + return(rates_total); + } +//+------------------------------------------------------------------+ +//| Custom indicator deinitialization function | +//+------------------------------------------------------------------+ +void OnDeinit(const int reason) + { +//--- delete all our Market Profile graphical objects after use + Print("Indicator \"Market Profile Canvas\" stopped, delete all objects CMarketProfile with prefix=", ExtPrefixUniq); + int size=mp_list.Count(); + for(int i=0; i=CHARTEVENT_CUSTOM) + return; + +//--- there have been changes on the chart + if(CHARTEVENT_CHART_CHANGE==id) + { + int size=mp_list.Count(); + for(int i=0; i y + double m_hor_scale; // factor conversion count -> x + }; +//+------------------------------------------------------------------+ +//| Constructor | +//+------------------------------------------------------------------+ +void CMarketProfile::CMarketProfile(string prefix, datetime time1, datetime time2, double high, double low, MqlRates &bars[]): + m_prefix(prefix), + m_time1(time1), + m_time2(time2), + m_high(high), + m_low(low), + m_vert_scale(NULL), + m_hor_scale(NULL) + { + ArrayCopy(m_bars, bars); + m_name=ExtPrefixUniq+"_MP_"+TimeToString(time1, TIME_DATE); + m_day_size_pt=(int)((m_high-m_low)/SymbolInfoDouble(Symbol(), SYMBOL_POINT)); +//--- set the sizes of vectors for trading sessions + m_asia=vector::Zeros(m_day_size_pt); + m_europe=vector::Zeros(m_day_size_pt); + m_america=vector::Zeros(m_day_size_pt); +//--- create an object + UpdateSizes(); +//--- if it is the first tick at the day opening, the canvas sizes will be equal to zero - set 1 px for both coordinates + m_height=m_height?m_height:1; + m_width=m_width?m_width:1; + if(m_canvas.CreateBitmap(m_name, m_time1, m_high, m_width, m_height, COLOR_FORMAT_ARGB_NORMALIZE)) + ObjectSetInteger(0, m_name, OBJPROP_BACK, true); + else + { + Print("Error creating canvas: ", GetLastError()); + Print("time1=", m_time1, " high=", m_high, " width=", m_width, " height=", m_height); + } + } +//+------------------------------------------------------------------+ +//| Checks if CMarketProfile object is for the specified 'time' date | +//+------------------------------------------------------------------+ +bool CMarketProfile::Check(string prefix, datetime time) + { + string calculated= prefix+"_MP_"+TimeToString(time, TIME_DATE); + return (m_name==(calculated)); + }; +//+------------------------------------------------------------------+ +//| Sets High/Low and a set of current-timeframe bars | +//+------------------------------------------------------------------+ +void CMarketProfile::SetHiLoBars(double high, double low, MqlRates &bars[]) + { +//--- if the day's High changed, move the OBJ_BITMAP object linked by m_name + if(high>m_high) + { + m_high=high; + if(!ObjectSetDouble(0, m_name, OBJPROP_PRICE, m_high)) + PrintFormat("Failed to update canvas for %s, error %d", TimeToString(m_time1, TIME_DATE), GetLastError()); + } + ArrayCopy(m_bars, bars); + m_high=high; + m_low=low; +//--- day range in points + m_day_size_pt=(int)((m_high-m_low)/SymbolInfoDouble(Symbol(), SYMBOL_POINT)); +//--- re-set the sizes of vectors for trading sessions + m_asia=vector::Zeros(m_day_size_pt); + m_europe=vector::Zeros(m_day_size_pt); + m_america=vector::Zeros(m_day_size_pt); + } +//+------------------------------------------------------------------+ +//| Sets drawing parameters | +//+------------------------------------------------------------------+ +void CMarketProfile::UpdateSizes(void) + { +//--- convert time/price to x/y coordinates + int x1, y1, x2, y2; + ChartTimePriceToXY(0, 0, m_time1, m_high, x1, y1); + ChartTimePriceToXY(0, 0, m_time2, m_low, x2, y2); +//--- calculate window size + m_height=y2-y1; + m_width =x2-x1; +//--- calculate coefficients for converting boxes and counters into chart pixels + m_vert_scale=double(m_height)/(m_day_size_pt); + m_hor_scale =double(m_width*PeriodSeconds(PERIOD_CURRENT))/PeriodSeconds(PERIOD_D1); + + m_canvas.Resize(m_width, m_height); + } +//+------------------------------------------------------------------+ +//| Destructor | +//+------------------------------------------------------------------+ +void CMarketProfile::~CMarketProfile(void) + { +//--- delete all our graphical objects after use + ObjectsDeleteAll(0, m_prefix, 0, OBJ_BITMAP); + ChartRedraw(); + } +//+------------------------------------------------------------------+ +//| Checks that the profile is in the visible part of the chart | +//+------------------------------------------------------------------+ +bool CMarketProfile::isVisibleOnChart(void) + { + long last_bar=ChartGetInteger(0, CHART_FIRST_VISIBLE_BAR); + long first_bar=last_bar+-ChartGetInteger(0, CHART_VISIBLE_BARS); + first_bar=first_bar>0?first_bar:0; + datetime left =iTime(Symbol(), Period(), (int)last_bar); + datetime right=iTime(Symbol(), Period(), (int)first_bar); +//--- return check result + return((m_time1>= left && m_time1 <=right) || (m_time2>= left && m_time2 <=right)); + } +//+------------------------------------------------------------------+ +//| Prepares profile arrays by sessions | +//+------------------------------------------------------------------+ +bool CMarketProfile::CalculateSessions(void) + { + double point=SymbolInfoDouble(Symbol(), SYMBOL_POINT); + if(ArraySize(m_bars)==0) + return(false); +//---- iterate through all bars of the current day and mark the boxes they fall into + int size=ArraySize(m_bars); + for(int i=0; i=InpAmericaStartHour) + { + for(int ind=start_box; ind=InpEuropeStartHour && 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 literal 0 HcmV?d00001 diff --git a/BKPS/14031206/Indicators/Free Indicators/MarketProfile.mq5 b/BKPS/14031206/Indicators/Free Indicators/MarketProfile.mq5 new file mode 100644 index 0000000..96412af --- /dev/null +++ b/BKPS/14031206/Indicators/Free Indicators/MarketProfile.mq5 @@ -0,0 +1,210 @@ +//+------------------------------------------------------------------+ +//| MarketProfile.mq5 | +//| Copyright 2009-2025, MetaQuotes Ltd | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2022, MetaQuotes Ltd." +#property link "https://www.mql5.com" +#property version "1.00" +#property indicator_chart_window +#property indicator_plots 0 + +//--- input parameters +input uint InpStartDate =0; // day number to start calculation +input uint InpShowDays =3; // number of days to display +input int InpMultiplier =1; // histogram length multiplier +input color InpAsiaSession =clrGold; // Asian session +input color InpEuropeSession =clrBlue; // European session +input color InpAmericaSession =clrViolet; // American session +input uint InpEuropeStartHour =8; // European session opening hour +input uint InpAmericaStartHour=14; // American session opening hour + +//--- unique prefix to identify indicator objects +string ExtPrefixUniq; +//+------------------------------------------------------------------+ +//| Custom indicator initialization function | +//+------------------------------------------------------------------+ +int OnInit() + { +//--- prepare prefix for objects + string number=StringFormat("%I64d", GetTickCount64()); + ExtPrefixUniq=StringSubstr(number, StringLen(number)-4); + Print("Indicator \"Market Profile\" started, prefix=", ExtPrefixUniq); + + return(INIT_SUCCEEDED); + } +//+------------------------------------------------------------------+ +//| Custom indicator iteration function | +//+------------------------------------------------------------------+ +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[]) + { +//--- opening time of the current daily bar + datetime static open_time=0; + +//--- number of the last day for calculations + uint lastday=InpStartDate+InpShowDays; + +//--- if the calculation has already been done + if(prev_calculated!=0) + { + datetime current_open=iTime(Symbol(), PERIOD_D1, 0); + //--- no calculation needed for the first day + if(InpStartDate!=0) + { + //--- if the opening time has not been updated + if(current_open==open_time) + return(rates_total); // no calculation needed, exit + } + //--- update the opening time + open_time=current_open; + //--- further in the code calculate only one day + lastday=InpStartDate+1; + } + +//--- calculate for the specified number of days + for(uint day=InpStartDate; day=InpAmericaStartHour) + { + for(int ind=start_box; ind=InpEuropeStartHour && hour0) + { + double price=low_day+ind*point; + datetime time1=day_rate[0].time; + datetime time2=time1+boxes_asia[ind]*box_length*InpMultiplier; + string prefix=ExtPrefixUniq+"_"+day_prefix+"_Asia_"+StringFormat("%.5f", price); + + DrawBox(prefix, price, time1, time2, InpAsiaSession); + } + } + + //--- Europe + for(int ind=0; ind0) + { + double price=low_day+ind*point; + datetime time1=day_rate[0].time+boxes_asia[ind]*box_length*InpMultiplier; + datetime time2=time1+boxes_europe[ind]*box_length*InpMultiplier; + string prefix=ExtPrefixUniq+"_"+day_prefix+"_Europe_"+StringFormat("%.5f", price); + + DrawBox(prefix, price, time1, time2, InpEuropeSession); + } + } + + //--- America + for(int ind=0; ind0) + { + double price=low_day+ind*point; + datetime time1=day_rate[0].time+(boxes_asia[ind]+boxes_europe[ind])*box_length*InpMultiplier; + datetime time2=time1+boxes_america[ind]*box_length*InpMultiplier; + string prefix=ExtPrefixUniq+"_"+day_prefix+"_America_"+StringFormat("%.5f", price); + + DrawBox(prefix, price, time1, time2, InpAmericaSession); + } + } + } + +//--- redraw all objects + ChartRedraw(0); + +//--- return value of prev_calculated for the next call + return(rates_total); + } +//+------------------------------------------------------------------+ +//| Custom indicator deinitialization function | +//+------------------------------------------------------------------+ +void OnDeinit(const int reason) + { +//--- delete all our graphical objects after use + Print("Indicator \"Market Profile\" stopped, delete all objects with prefix=", ExtPrefixUniq); + ObjectsDeleteAll(0, ExtPrefixUniq, 0, OBJ_RECTANGLE); + ChartRedraw(0); + } +//+------------------------------------------------------------------+ +//| Draw color box | +//+------------------------------------------------------------------+ +void DrawBox(string bar_prefix, double price, datetime time1, datetime time2, color clr) + { + ObjectCreate(0, bar_prefix, OBJ_RECTANGLE, 0, time1, price, time2, price); + ObjectSetInteger(0, bar_prefix, OBJPROP_COLOR, clr); + ObjectSetInteger(0, bar_prefix, OBJPROP_STYLE, STYLE_SOLID); + ObjectSetInteger(0, bar_prefix, OBJPROP_WIDTH, 1); + ObjectSetString(0, bar_prefix, OBJPROP_TOOLTIP, "\n"); + ObjectSetInteger(0, bar_prefix, OBJPROP_BACK, true); + } +//+------------------------------------------------------------------+ diff --git a/BKPS/14031206/Indicators/Free Indicators/MurreyMath Channel.ex5 b/BKPS/14031206/Indicators/Free Indicators/MurreyMath Channel.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..218c33143b7df1c0fa7821619d88b6afc9d75d33 GIT binary patch literal 24406 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

    tW!i|7R33!o`J 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 literal 0 HcmV?d00001 diff --git a/BKPS/14031206/Indicators/Free Indicators/MurreyMath Channel.mq5 b/BKPS/14031206/Indicators/Free Indicators/MurreyMath Channel.mq5 new file mode 100644 index 0000000..f4a81d2 --- /dev/null +++ b/BKPS/14031206/Indicators/Free Indicators/MurreyMath Channel.mq5 @@ -0,0 +1,410 @@ +//+------------------------------------------------------------------+ +//| MurreyMath Channel.mq5 | +//| Copyright 2009-2025, MetaQuotes Ltd | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "2009-2025, MetaQuotes Ltd" +#property link "http://www.mql5.com" +#property description "Murrey Math Channels based on https://www.mql5.com/ru/code/8157" +#property description "Author of calculations is Vladyslav Goshkov (https://www.mql5.com/en/users/vladislavvg)" + +//--- input parameters +input int InpCalculationPeriod=64; // calculation period +input bool InpShowExtraLevels =false; // show all levels +input bool InpShowLabel =true; // show price of level + +//--- properties +#property indicator_chart_window +#property indicator_buffers 13 +#property indicator_plots 13 +#property indicator_type1 DRAW_LINE +#property indicator_color1 clrDarkBlue + +#property indicator_type2 DRAW_LINE +#property indicator_color2 clrDarkViolet + +#property indicator_type3 DRAW_LINE +#property indicator_color3 clrMediumSlateBlue +#property indicator_width3 2 + +#property indicator_type4 DRAW_LINE +#property indicator_color4 clrFireBrick + +#property indicator_type5 DRAW_LINE +#property indicator_color5 clrRed +#property indicator_width5 2 + +#property indicator_type6 DRAW_LINE +#property indicator_color6 clrGreen + +#property indicator_type7 DRAW_LINE +#property indicator_color7 clrDarkGray +#property indicator_width7 2 + +#property indicator_type8 DRAW_LINE +#property indicator_color8 clrGreen + +#property indicator_type9 DRAW_LINE +#property indicator_color9 clrRed +#property indicator_width9 2 + +#property indicator_type10 DRAW_LINE +#property indicator_color10 clrFireBrick + +#property indicator_type11 DRAW_LINE +#property indicator_color11 clrMediumSlateBlue +#property indicator_width11 2 + +#property indicator_type12 DRAW_LINE +#property indicator_color12 clrDarkViolet + +#property indicator_type13 DRAW_LINE +#property indicator_color13 clrDarkBlue + +//---labels +#property indicator_label1 "[+2/8]" +#property indicator_label2 "[+1/8]" +#property indicator_label3 "[8/8]" +#property indicator_label4 "[7/8]" +#property indicator_label5 "[6/8]" +#property indicator_label6 "[5/8]" +#property indicator_label7 "[4/8]" +#property indicator_label8 "[3/8]" +#property indicator_label9 "[2/8]" +#property indicator_label10 "[1/8]" +#property indicator_label11 "[0/8]" +#property indicator_label12 "[-1/8]" +#property indicator_label13 "[-2/8]" + +//--- indicator buffers +double Ext1Buffer[]; +double Ext2Buffer[]; +double Ext3Buffer[]; +double Ext4Buffer[]; +double Ext5Buffer[]; +double Ext6Buffer[]; +double Ext7Buffer[]; +double Ext8Buffer[]; +double Ext9Buffer[]; +double Ext10Buffer[]; +double Ext11Buffer[]; +double Ext12Buffer[]; +double Ext13Buffer[]; + +//--- unique prefix to identify indicator objects +string ExtPrefixUniq; + +//+------------------------------------------------------------------+ +//| Custom indicator initialization function | +//+------------------------------------------------------------------+ +int OnInit() + { +//--- check current timeframe + if(PeriodSeconds()>PeriodSeconds(PERIOD_D1)) + { + Alert("Timeframe of chart must be D1 or lower. Exit"); + return(INIT_FAILED); + } + +//--- define buffers + if(InpShowExtraLevels) + { + SetIndexBuffer(0, Ext1Buffer); + SetIndexBuffer(1, Ext2Buffer); + SetIndexBuffer(2, Ext3Buffer); + SetIndexBuffer(3, Ext4Buffer); + SetIndexBuffer(4, Ext5Buffer); + SetIndexBuffer(5, Ext6Buffer); + SetIndexBuffer(6, Ext7Buffer); + SetIndexBuffer(7, Ext8Buffer); + SetIndexBuffer(8, Ext9Buffer); + SetIndexBuffer(9, Ext10Buffer); + SetIndexBuffer(10, Ext11Buffer); + SetIndexBuffer(11, Ext12Buffer); + SetIndexBuffer(12, Ext13Buffer); + } + else + { + SetIndexBuffer(0, Ext1Buffer, INDICATOR_CALCULATIONS); + SetIndexBuffer(1, Ext2Buffer, INDICATOR_CALCULATIONS); + SetIndexBuffer(2, Ext3Buffer); + SetIndexBuffer(3, Ext4Buffer); + SetIndexBuffer(4, Ext5Buffer); + SetIndexBuffer(5, Ext6Buffer); + SetIndexBuffer(6, Ext7Buffer); + SetIndexBuffer(7, Ext8Buffer); + SetIndexBuffer(8, Ext9Buffer); + SetIndexBuffer(9, Ext10Buffer); + SetIndexBuffer(10, Ext11Buffer); + SetIndexBuffer(11, Ext12Buffer, INDICATOR_CALCULATIONS); + SetIndexBuffer(12, Ext13Buffer, INDICATOR_CALCULATIONS); + } + +//--- indicator name + IndicatorSetString(INDICATOR_SHORTNAME, "Murrey Math Channels"); +//--- number of digits of indicator value + IndicatorSetInteger(INDICATOR_DIGITS, _Digits); + +//--- prepare prefix for objects + string number=StringFormat("%I64d", GetTickCount64()); + ExtPrefixUniq=StringSubstr(number, StringLen(number)-4); + ExtPrefixUniq=ExtPrefixUniq+"_MM"; + Print("Indicator \"Murrey Math Channels\" started, prefix=", ExtPrefixUniq); + + return(INIT_SUCCEEDED); + } +//+------------------------------------------------------------------+ +//| Custom indicator iteration function | +//+------------------------------------------------------------------+ +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[]) + { + int start; +//--- if this is the first calculation of the indicator, fill buffers with empty initial values + if(prev_calculated==0) + { + FillBuffers(EMPTY_VALUE); + //--- shift from the beginning by the required number of bars + start=InpCalculationPeriod+1; + } + else + { + //--- if the indicator has previously been calculated, calculate values for the last 2 bars + start=prev_calculated-2; + } + +//--- calculate levels for all bars in a loop + int i=start; + for(; i=max) + mx=mn+octave; + + //--- calculation of Resistance level + double x1=0, x2=0, x3=0, x4=0, x5=0, x6=0; + if((min>=(3*(mx-mn)/16+mn)) && (max<=(9*(mx-mn)/16+mn))) + x2=mn+(mx-mn)/2; + if((min>=(mn-(mx-mn)/8)) && (max<=(5*(mx-mn)/8+mn)) && (x2==0)) + x1=mn+(mx-mn)/2; + if((min>=(mn+7*(mx-mn)/16)) && (max<=(13*(mx-mn)/16+mn))) + x4=mn+3*(mx-mn)/4; + if((min>=(mn+3*(mx-mn)/8)) && (max<=(9*(mx-mn)/8+mn)) && (x4==0)) + x5=mx; + if((min>=(mn+(mx-mn)/8)) && (max<=(7*(mx-mn)/8+mn)) && (x1==0) && (x2==0) && (x4==0) && (x5==0)) + x3=mn+3*(mx-mn)/4; + if((x1+x2+x3+x4+x5)==0) + x6=mx; + double resistance_level=x1+x2+x3+x4+x5+x6; + + //--- calculation of Support level + double y1=0, y2=0, y3=0, y4=0, y5=0, y6=0; + if(x1>0) + y1=mn; + if(x2>0) + y2=mn+(mx-mn)/4; + if(x3>0) + y3=mn+(mx-mn)/4; + if(x4>0) + y4=mn+(mx-mn)/2; + if(x5>0) + y5=mn+(mx-mn)/2; + if((resistance_level>0) && ((y1+y2+y3+y4+y5)==0)) + y6=mn; + double support_level=y1+y2+y3+y4+y5+y6; + + //--- divider of MM levels + double divide_mml=(resistance_level-support_level)/8; + + //--- write values into buffers + Ext13Buffer[i]=support_level-2*divide_mml; + Ext12Buffer[i]=Ext13Buffer[i]+divide_mml; + Ext11Buffer[i]=Ext12Buffer[i]+divide_mml; + Ext10Buffer[i]=Ext11Buffer[i]+divide_mml; + Ext9Buffer[i]=Ext10Buffer[i]+divide_mml; + Ext8Buffer[i]=Ext9Buffer[i]+divide_mml; + Ext7Buffer[i]=Ext8Buffer[i]+divide_mml; + Ext6Buffer[i]=Ext7Buffer[i]+divide_mml; + Ext5Buffer[i]=Ext6Buffer[i]+divide_mml; + Ext4Buffer[i]=Ext5Buffer[i]+divide_mml; + Ext3Buffer[i]=Ext4Buffer[i]+divide_mml; + Ext2Buffer[i]=Ext3Buffer[i]+divide_mml; + Ext1Buffer[i]=Ext2Buffer[i]+divide_mml; + + //--- remove line clutter + if(Ext1Buffer[i]!=Ext1Buffer[i-1]) + Ext1Buffer[i-1]=EMPTY_VALUE; + if(Ext2Buffer[i]!=Ext2Buffer[i-1]) + Ext2Buffer[i-1]=EMPTY_VALUE; + if(Ext3Buffer[i]!=Ext3Buffer[i-1]) + Ext3Buffer[i-1]=EMPTY_VALUE; + if(Ext4Buffer[i]!=Ext4Buffer[i-1]) + Ext4Buffer[i-1]=EMPTY_VALUE; + if(Ext5Buffer[i]!=Ext5Buffer[i-1]) + Ext5Buffer[i-1]=EMPTY_VALUE; + if(Ext6Buffer[i]!=Ext6Buffer[i-1]) + Ext6Buffer[i-1]=EMPTY_VALUE; + if(Ext7Buffer[i]!=Ext7Buffer[i-1]) + Ext7Buffer[i-1]=EMPTY_VALUE; + if(Ext8Buffer[i]!=Ext8Buffer[i-1]) + Ext8Buffer[i-1]=EMPTY_VALUE; + if(Ext9Buffer[i]!=Ext9Buffer[i-1]) + Ext9Buffer[i-1]=EMPTY_VALUE; + if(Ext10Buffer[i]!=Ext10Buffer[i-1]) + Ext10Buffer[i-1]=EMPTY_VALUE; + if(Ext11Buffer[i]!=Ext11Buffer[i-1]) + Ext11Buffer[i-1]=EMPTY_VALUE; + if(Ext12Buffer[i]!=Ext12Buffer[i-1]) + Ext12Buffer[i-1]=EMPTY_VALUE; + if(Ext13Buffer[i]!=Ext13Buffer[i-1]) + Ext13Buffer[i-1]=EMPTY_VALUE; + } + +//--- draw labels on levels + if(InpShowLabel) + { + ShowPriceLevels(time[rates_total-1], rates_total-1); + ChartRedraw(); + } + +//--- succesfully calculated + return(rates_total); + } +//+------------------------------------------------------------------+ +//| Initialize buffers with initial values | +//+------------------------------------------------------------------+ +void FillBuffers(double value=0) + { + int count=ArraySize(Ext1Buffer); + ArrayFill(Ext1Buffer, 0, count, value); + ArrayFill(Ext2Buffer, 0, count, value); + ArrayFill(Ext3Buffer, 0, count, value); + ArrayFill(Ext4Buffer, 0, count, value); + ArrayFill(Ext5Buffer, 0, count, value); + ArrayFill(Ext6Buffer, 0, count, value); + ArrayFill(Ext7Buffer, 0, count, value); + ArrayFill(Ext8Buffer, 0, count, value); + ArrayFill(Ext9Buffer, 0, count, value); + ArrayFill(Ext10Buffer, 0, count, value); + ArrayFill(Ext11Buffer, 0, count, value); + ArrayFill(Ext12Buffer, 0, count, value); + ArrayFill(Ext13Buffer, 0, count, value); + } +//+------------------------------------------------------------------+ +//| Determine the fractal | +//+------------------------------------------------------------------+ +double DetermineFractal(double value) + { + if(value<=250000 && value>25000) + return(100000); + + if(value<=25000 && value>2500) + return(10000); + + if(value<=2500 && value>250) + return(1000); + + if(value<=250 && value>25) + return(100); + + if(value<=25 && value>12.5) + return(12.5); + + if(value<=12.5 && value>6.25) + return(12.5); + + if(value<=6.25 && value>3.125) + return(6.25); + + if(value<=3.125 && value>1.5625) + return(3.125); + + if(value<=1.5625 && value>0.390625) + return(1.5625); + + if(value<=0.390625 && value>0) + return(0.1953125); + + return(0); + } +//+------------------------------------------------------------------+ +//| Custom indicator deinitialization function | +//+------------------------------------------------------------------+ +void OnDeinit(const int reason) + { +//--- delete all our graphical objects after use + Print("Indicator \"Murrey Math Channels\" stopped, delete all objects with prefix=", ExtPrefixUniq); + ObjectsDeleteAll(0, ExtPrefixUniq, 0, OBJ_ARROW_RIGHT_PRICE); + ChartRedraw(0); + } +//+------------------------------------------------------------------+ +//| Show prices' levels | +//+------------------------------------------------------------------+ +void ShowPriceLevels(datetime time, int last_index) + { + ShowRightPrice(ExtPrefixUniq+" [8/8]", time, Ext3Buffer[last_index], clrMediumSlateBlue); + ShowRightPrice(ExtPrefixUniq+" [7/8]", time, Ext4Buffer[last_index], clrFireBrick); + ShowRightPrice(ExtPrefixUniq+" [6/8]", time, Ext5Buffer[last_index], clrRed); + ShowRightPrice(ExtPrefixUniq+" [5/8]", time, Ext6Buffer[last_index], clrGreen); + ShowRightPrice(ExtPrefixUniq+" [4/8]", time, Ext7Buffer[last_index], clrDarkGray); + ShowRightPrice(ExtPrefixUniq+" [3/8]", time, Ext8Buffer[last_index], clrGreen); + ShowRightPrice(ExtPrefixUniq+" [2/8]", time, Ext9Buffer[last_index], clrRed); + ShowRightPrice(ExtPrefixUniq+" [1/8]", time, Ext10Buffer[last_index], clrFireBrick); + ShowRightPrice(ExtPrefixUniq+" [0/8]", time, Ext11Buffer[last_index], clrMediumSlateBlue); + + if(InpShowLabel) + { + ShowRightPrice(ExtPrefixUniq+" [+2/8]", time, Ext1Buffer[last_index], clrDarkBlue); + ShowRightPrice(ExtPrefixUniq+" [+1/8]", time, Ext2Buffer[last_index], clrDarkViolet); + ShowRightPrice(ExtPrefixUniq+" [-1/8]", time, Ext12Buffer[last_index], clrDarkViolet); + ShowRightPrice(ExtPrefixUniq+" [-2/8]", time, Ext13Buffer[last_index], clrDarkBlue); + } + } +//+------------------------------------------------------------------+ +//| Create or Update "Right Price Label" object | +//+------------------------------------------------------------------+ +bool ShowRightPrice(const string name, datetime time, double price, color clr) + { + if(!ObjectCreate(0, name, OBJ_ARROW_RIGHT_PRICE, 0, time, price)) + { + ObjectMove(0, name, 0, time, price); + return(false); + } + +//--- make the label size adaptive + long scale=2; + if(!ChartGetInteger(0, CHART_SCALE, 0, scale)) + { + //--- output an error message to the Experts journal + Print(__FUNCTION__+", ChartGetInteger(CHART_SCALE) failed, error = ", GetLastError()); + } + int width=scale>1 ? 2:1; // if chart scale > 1, then label size = 2 + + ObjectSetInteger(0, name, OBJPROP_COLOR, clr); + ObjectSetInteger(0, name, OBJPROP_STYLE, STYLE_SOLID); + ObjectSetInteger(0, name, OBJPROP_WIDTH, width); + ObjectSetInteger(0, name, OBJPROP_BACK, false); + ObjectSetInteger(0, name, OBJPROP_SELECTABLE, false); + ObjectSetInteger(0, name, OBJPROP_SELECTED, false); + ObjectSetInteger(0, name, OBJPROP_HIDDEN, true); + ObjectSetInteger(0, name, OBJPROP_ZORDER, 0); + + return(true); + } +//+------------------------------------------------------------------+ diff --git a/BKPS/14031206/Indicators/Free Indicators/NRTR Channel.ex5 b/BKPS/14031206/Indicators/Free Indicators/NRTR Channel.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..4bb8de6d3c1581a93d7fb4e28df0508798afa29f GIT binary patch literal 16024 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 literal 0 HcmV?d00001 diff --git a/BKPS/14031206/Indicators/Free Indicators/NRTR Channel.mq5 b/BKPS/14031206/Indicators/Free Indicators/NRTR Channel.mq5 new file mode 100644 index 0000000..2ec8730 --- /dev/null +++ b/BKPS/14031206/Indicators/Free Indicators/NRTR Channel.mq5 @@ -0,0 +1,281 @@ +//+------------------------------------------------------------------+ +//| NRTR Channel.mq5 | +//| Copyright 2009-2025, MetaQuotes Ltd | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "2009-2025, MetaQuotes Ltd" +#property link "http://www.mql5.com" +#property description "NRTR Channel" +//--- +#property indicator_chart_window +#property indicator_buffers 6 +#property indicator_plots 4 +#property indicator_type1 DRAW_ARROW +#property indicator_color1 clrDeepSkyBlue +#property indicator_type2 DRAW_ARROW +#property indicator_color2 clrDeepSkyBlue +#property indicator_type3 DRAW_ARROW +#property indicator_color3 clrLightSalmon +#property indicator_type4 DRAW_ARROW +#property indicator_color4 clrLightSalmon +//--- labels +#property indicator_label1 "Long Resistance" +#property indicator_label2 "Long Support" +#property indicator_label3 "Short Support" +#property indicator_label4 "Short Resistance" + +//--- inputs +input int InpATRPeriod=40; // ATR period +input double InpkATR =2.0; // ATR multiplier +input bool InpShowLabel=true; // show price of level + +//--- uptrend buffers +double ExtCeilingBuffer[]; +double ExtBuyBuffer[]; +//--- downtrend buffers +double ExtSellBuffer[]; +double ExtFloorBuffer[]; +//--- auxiliary buffers +double ExtTrendBuffer[]; +double ExtATRBuffer[]; + +//--- indicator handle +int ExtATRHandle; + +#define UP_TREND 1 +#define DOWN_TREND -1 + +//--- unique prefix to identify indicator objects +string ExtPrefixUniq; + +//+------------------------------------------------------------------+ +//| Custom indicator initialization function | +//+------------------------------------------------------------------+ +int OnInit() + { +//--- define buffers and plots + SetIndexBuffer(0, ExtCeilingBuffer); + PlotIndexSetInteger(0, PLOT_ARROW, 159); + + SetIndexBuffer(1, ExtBuyBuffer); + PlotIndexSetInteger(1, PLOT_ARROW, 251); + + SetIndexBuffer(2, ExtSellBuffer); + PlotIndexSetInteger(2, PLOT_ARROW, 251); + + SetIndexBuffer(3, ExtFloorBuffer); + PlotIndexSetInteger(3, PLOT_ARROW, 159); + + SetIndexBuffer(4, ExtTrendBuffer, INDICATOR_CALCULATIONS); + SetIndexBuffer(5, ExtATRBuffer, INDICATOR_CALCULATIONS); + +//--- indicator name + IndicatorSetString(INDICATOR_SHORTNAME, "NRTR Channel"); +//--- number of digits of indicator value + IndicatorSetInteger(INDICATOR_DIGITS, _Digits); + +//---- Get the indicator handle + ExtATRHandle=iATR(NULL, 0, InpATRPeriod); + +//--- prepare prefix for objects + string number=StringFormat("%I64d", GetTickCount64()); + ExtPrefixUniq=StringSubstr(number, StringLen(number)-4); + ExtPrefixUniq=ExtPrefixUniq+"_NRTR"; + Print("Indicator \"_NRTR Channel\" started, prefix=", ExtPrefixUniq); + + return(INIT_SUCCEEDED); + } +//+------------------------------------------------------------------+ +//| Custom indicator iteration function | +//+------------------------------------------------------------------+ +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[]) + { +//--- if the indicator has previously been calculated, start from the bar preceding the last one + int start=prev_calculated-2; + +//--- if this is the first calculation of the indicator, set the calculation start and the trend direction + if(prev_calculated==0) + { + start=InpATRPeriod; + ArrayFill(ExtSellBuffer, 0, rates_total, EMPTY_VALUE); + ArrayFill(ExtBuyBuffer, 0, rates_total, EMPTY_VALUE); + ArrayFill(ExtCeilingBuffer, 0, rates_total, EMPTY_VALUE); + ArrayFill(ExtFloorBuffer, 0, rates_total, EMPTY_VALUE); + ArrayFill(ExtTrendBuffer, 0, rates_total, EMPTY_VALUE); + + //--- trend direction + if(close[start-1]>low[start-1]) + { + ExtTrendBuffer[start-1]=UP_TREND; + ExtCeilingBuffer[start-1]=close[start-1]; + ExtBuyBuffer [start-1]=close[start-1]-InpkATR*ExtATRBuffer[start-1]; + } + else + { + ExtTrendBuffer[start-1]=DOWN_TREND; + ExtFloorBuffer[start-1]=close[start-1]; + ExtSellBuffer[start-1]=close[start-1]+InpkATR*ExtATRBuffer[start-1]; + } + } + +//--- indicator values in the buffer + if(CopyBuffer(ExtATRHandle, 0, 0, rates_total, ExtATRBuffer)<0) + return(0); + +//--- calculate levels for all bars in a loop + for(int i=start; i0) + { + //--- if Low of the current bar is higher than the resistance level on the previous bar + if(low[i]>ExtCeilingBuffer[i-1]) + { + //--- update resistance levels + ExtCeilingBuffer[i]=close[i]; // uptrend resistance level + ExtFloorBuffer[i]=EMPTY_VALUE; // empty downtrend resistance level + //--- update support levels + ExtBuyBuffer[i]=close[i]-InpkATR*ExtATRBuffer[i]; + ExtSellBuffer[i]=EMPTY_VALUE; + //--- set the sign of an uptrend on the current bar + ExtTrendBuffer[i]=UP_TREND; + continue; + } + + //--- if closed lower than the previous-bar support level + if(close[i]ExtSellBuffer[i-1]) + { + ExtTrendBuffer[i]=UP_TREND; // uptrend + //--- set levels for the uptrend + ExtCeilingBuffer[i]=close[i]; // resistance level + ExtBuyBuffer[i]=close[i]-InpkATR*ExtATRBuffer[i]; // support + //--- delete downtrend levels + ExtFloorBuffer[i]=EMPTY_VALUE; + ExtSellBuffer[i]=EMPTY_VALUE; + continue; + } + } + + //--- if we reached this code line, the trend has not changed + //--- so, copy the previous buffer values + ExtSellBuffer[i] = ExtSellBuffer[i-1]; + ExtBuyBuffer[i] = ExtBuyBuffer[i-1]; + ExtCeilingBuffer[i]= ExtCeilingBuffer[i-1]; + ExtFloorBuffer[i] = ExtFloorBuffer[i-1]; + ExtTrendBuffer[i] = ExtTrendBuffer[i-1]; + } + +//--- draw labels on levels + if(InpShowLabel) + { + ShowPriceLevels(time[rates_total-1], rates_total-1); + ChartRedraw(); + } + +//--- succesfully calculated + return(rates_total); + } +//+------------------------------------------------------------------+ +//| Custom indicator deinitialization function | +//+------------------------------------------------------------------+ +void OnDeinit(const int reason) + { +//--- delete all our graphical objects after use + Print("Indicator \"NRTR Channel\" stopped, delete all objects with prefix=", ExtPrefixUniq); + ObjectsDeleteAll(0, ExtPrefixUniq, 0, OBJ_ARROW_RIGHT_PRICE); + ChartRedraw(0); + } +//+------------------------------------------------------------------+ +//| Show prices' levels | +//+------------------------------------------------------------------+ +void ShowPriceLevels(datetime time, int last_index) + { + color clr; + double up, dn; +//--- define color and levels + if(ExtTrendBuffer[last_index]==UP_TREND) + { + clr=clrDeepSkyBlue; + up=ExtCeilingBuffer[last_index]; + dn=ExtBuyBuffer[last_index]; + } + else + { + clr=clrLightSalmon; + up=ExtSellBuffer[last_index]; + dn=ExtFloorBuffer[last_index]; + } + + ShowRightPrice(ExtPrefixUniq+"_Res", time, up, clr); + ShowRightPrice(ExtPrefixUniq+"_Sup", time, dn, clr); + } +//+------------------------------------------------------------------+ +//| Create or Update "Right Price Label" object | +//+------------------------------------------------------------------+ +bool ShowRightPrice(const string name, datetime time, double price, color clr) + { + if(!ObjectCreate(0, name, OBJ_ARROW_RIGHT_PRICE, 0, time, price)) + { + ObjectMove(0, name, 0, time, price); + return(false); + } + +//--- make the label size adaptive + long scale=2; + if(!ChartGetInteger(0, CHART_SCALE, 0, scale)) + { + //--- output an error message to the Experts journal + Print(__FUNCTION__+", ChartGetInteger(CHART_SCALE) failed, error = ", GetLastError()); + } + int width=scale>2 ? 2:1; // if chart scale > 1, then label size = 2 + + ObjectSetInteger(0, name, OBJPROP_COLOR, clr); + ObjectSetInteger(0, name, OBJPROP_STYLE, STYLE_SOLID); + ObjectSetInteger(0, name, OBJPROP_WIDTH, width); + ObjectSetInteger(0, name, OBJPROP_BACK, false); + ObjectSetInteger(0, name, OBJPROP_SELECTABLE, false); + ObjectSetInteger(0, name, OBJPROP_SELECTED, false); + ObjectSetInteger(0, name, OBJPROP_HIDDEN, true); + ObjectSetInteger(0, name, OBJPROP_ZORDER, 0); + + return(true); + } +//+------------------------------------------------------------------+ diff --git a/BKPS/14031206/Indicators/Free Indicators/Parabolic Channel.ex5 b/BKPS/14031206/Indicators/Free Indicators/Parabolic Channel.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..9912657772cd019aff4fdaaa699c09a6e4b91ce8 GIT binary patch literal 13734 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 ZorQVOXDGGBgc6Wy^Jj7cwoQoW|1T+;U!MQ~ literal 0 HcmV?d00001 diff --git a/BKPS/14031206/Indicators/Free Indicators/Parabolic Channel.mq5 b/BKPS/14031206/Indicators/Free Indicators/Parabolic Channel.mq5 new file mode 100644 index 0000000..2f21d8d --- /dev/null +++ b/BKPS/14031206/Indicators/Free Indicators/Parabolic Channel.mq5 @@ -0,0 +1,176 @@ +//+------------------------------------------------------------------+ +//| Parabolic Channel.mq5 | +//| Copyright 2009-2025, MetaQuotes Ltd | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "2009-2025, MetaQuotes Ltd" +#property link "http://www.mql5.com" +#property description "Parabolic Channel" + +#property indicator_chart_window +#property indicator_buffers 3 +#property indicator_plots 3 +#property indicator_type1 DRAW_LINE +#property indicator_color1 clrRoyalBlue +#property indicator_style1 STYLE_SOLID +#property indicator_width1 1 +#property indicator_type2 DRAW_ARROW +#property indicator_width2 2 +#property indicator_color2 clrDeepSkyBlue +#property indicator_type3 DRAW_LINE +#property indicator_color3 clrDarkOrange +#property indicator_style3 STYLE_SOLID +#property indicator_width3 1 +//--- labels +#property indicator_label1 "Upper" +#property indicator_label2 "Parabolic" +#property indicator_label3 "Lower " + +//--- input parameters +input double InpSARStep =0.02; // Step +input double InpSARMaximum=0.2; // Maximum +input bool InpShowLabel =true; // Show price of level + +//--- indicator buffers +double ExtUpperBuffer[]; +double ExtParabolicBuffer[]; +double ExtLowerBuffer[]; + +//--- indicator handle +int ExtParabolicHandle; +//--- unique prefix to identify indicator objects +string ExtPrefixUniq; + +//+------------------------------------------------------------------+ +//| Custom indicator initialization function | +//+------------------------------------------------------------------+ +int OnInit() + { +//--- define buffers + SetIndexBuffer(0, ExtUpperBuffer); + SetIndexBuffer(1, ExtParabolicBuffer); + SetIndexBuffer(2, ExtLowerBuffer); + PlotIndexSetInteger(1,PLOT_ARROW,159); + +//--- indicator name + IndicatorSetString(INDICATOR_SHORTNAME, "Parabolic Channel"); +//--- number of digits of indicator value + IndicatorSetInteger(INDICATOR_DIGITS, _Digits); + +//--- create indicators + ExtParabolicHandle=iSAR(NULL,0,InpSARStep,InpSARMaximum); + +//--- prepare prefix for objects + string number=StringFormat("%I64d", GetTickCount64()); + ExtPrefixUniq=StringSubstr(number, StringLen(number)-4); + ExtPrefixUniq=ExtPrefixUniq+"_PS"; + Print("Indicator \"Parabolic Channels\" started, prefix=", ExtPrefixUniq); + + return(INIT_SUCCEEDED); + } +//+------------------------------------------------------------------+ +//| Custom indicator iteration function | +//+------------------------------------------------------------------+ +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[]) + { +//--- write Parabolic SAR indicator values to the buffer + if(CopyBuffer(ExtParabolicHandle, 0, 0, rates_total, ExtParabolicBuffer)<0) + return(0); + +//--- start calculations from the bar preceding the last one + int start=prev_calculated-2; + +//--- if this is the first calculation of the indicator + if(prev_calculated==0) + { + start=1; + ArrayFill(ExtUpperBuffer,0,rates_total,0); + ArrayFill(ExtLowerBuffer,0,rates_total,0); + ExtUpperBuffer[start-1]=close[start-1]; + ExtLowerBuffer[start-1]=open[start-1]; + } + + for(int i=start; iExtParabolicBuffer[i] && close[i-1]ExtParabolicBuffer[i-1]) + ExtUpperBuffer[i]=ExtParabolicBuffer[i]; + } + +//--- draw labels on levels + if(InpShowLabel) + { + ShowPriceLevels(time[rates_total-1], rates_total-1); + ChartRedraw(); + } + +//--- succesfully calculated + return(rates_total); + } +//+------------------------------------------------------------------+ +//| Custom indicator deinitialization function | +//+------------------------------------------------------------------+ +void OnDeinit(const int reason) + { +//--- delete all our graphical objects after use + Print("Indicator \"Parabolic Channel\" stopped, delete all objects with prefix=", ExtPrefixUniq); + ObjectsDeleteAll(0, ExtPrefixUniq, 0, OBJ_ARROW_RIGHT_PRICE); + ChartRedraw(0); + } +//+------------------------------------------------------------------+ +//| Show prices' levels | +//+------------------------------------------------------------------+ +void ShowPriceLevels(datetime time, int last_index) + { + ShowRightPrice(ExtPrefixUniq+"_Upper", time, ExtUpperBuffer[last_index], clrRoyalBlue); + ShowRightPrice(ExtPrefixUniq+"_Parabolic", time, ExtParabolicBuffer[last_index], clrDeepSkyBlue); + ShowRightPrice(ExtPrefixUniq+"_Lower", time, ExtLowerBuffer[last_index], clrDarkOrange); + } +//+------------------------------------------------------------------+ +//| Create or Update "Right Price Label" object | +//+------------------------------------------------------------------+ +bool ShowRightPrice(const string name, datetime time, double price, color clr) + { + if(!ObjectCreate(0, name, OBJ_ARROW_RIGHT_PRICE, 0, time, price)) + { + ObjectMove(0, name, 0, time, price); + return(false); + } + +//--- make the label size adaptive + long scale=2; + if(!ChartGetInteger(0, CHART_SCALE, 0, scale)) + { + //--- output an error message to the Experts journal + Print(__FUNCTION__+", ChartGetInteger(CHART_SCALE) failed, error = ", GetLastError()); + } + int width=scale>1 ? 2:1; // if chart scale > 1, then label size = 2 + + ObjectSetInteger(0, name, OBJPROP_COLOR, clr); + ObjectSetInteger(0, name, OBJPROP_STYLE, STYLE_SOLID); + ObjectSetInteger(0, name, OBJPROP_WIDTH, width); + ObjectSetInteger(0, name, OBJPROP_BACK, false); + ObjectSetInteger(0, name, OBJPROP_SELECTABLE, false); + ObjectSetInteger(0, name, OBJPROP_SELECTED, false); + ObjectSetInteger(0, name, OBJPROP_HIDDEN, true); + ObjectSetInteger(0, name, OBJPROP_ZORDER, 0); + + return(true); + } +//+------------------------------------------------------------------+ diff --git a/BKPS/14031206/Indicators/Free Indicators/Pivot Channel.ex5 b/BKPS/14031206/Indicators/Free Indicators/Pivot Channel.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..7cd49bca0d22980ee03dbd73d9556dd0b1e83f69 GIT binary patch literal 17628 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

    ~tl{sM6%6}-w*4-j>j*rKsjd7@tF(AcKhJCnhA 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 TVX;U0NLRLXsc`8(-J= maxLength && + // + // ADX ... + adxCalculatedBars >= maxLength + // + ; + if (!isPassedRequiredCalculatedBars) + { + return prev_calculated; + } + + // + limit = (prev_calculated > rates_total || prev_calculated <= 0) + ? rates_total + : (rates_total - prev_calculated) + 1; + + // + // Buffers Copy ... + + // + // MA ... + int copiedMas = CopyBuffer(maHandler, 0, 0, limit, maBuffer); + + // + // ADX ... + int copiedAdxs = CopyBuffer(adxHandler, MAIN_LINE, 0, limit, adxBuffer); + int copiedAdxPs = CopyBuffer(adxHandler, PLUSDI_LINE, 0, limit, adxPBuffer); + int copiedAdxMs = CopyBuffer(adxHandler, MINUSDI_LINE, 0, limit, adxMBuffer); + + // + // Validate Copied Items ... + bool isPassedRequiredCopiedItems = + // + // MA ... + copiedMas > 0 && + // + // ADX ... + copiedAdxs > 0 && + copiedAdxPs > 0 && + copiedAdxMs > 0 + // + ; + if (!isPassedRequiredCopiedItems) + { + return prev_calculated; + } + + // + // Main Loop ... + for (int i = limit - 1; i >= 0 && !IsStopped(); i--) + { + // + CalculateBuffers( + i, + prev_calculated, + rates_total, + // + open, + high, + close, + low, + tick_volume // + ); + } + + // + return rates_total; +} + +// +// Functions ... + +/** + * Validate Input Args for Initialization ... + * + * @return ( bool ) + */ +bool ValidateInputs() +{ + // + bool result = false; + + // + result = + // + // MA ... + maLength > 0 && + // + // ADX ... + adxLength > 0 && + adxThreshold > 0 + // + ; + + // + return result; +} + +/** + * Extract Max Length of Inputs ... + * + * @return ( int ) + */ +int ExtractMaxLengthOfInputs() +{ + // + int result = 0; + + // + result = MathMax(maLength, adxLength); + + // + return result; +} + +/** + * Set Indicator Short Name and also we can define Buffers Labels ... + */ +void SetIndicatorName() +{ + IndicatorSetString(INDICATOR_SHORTNAME, ShortName); +} + +/** + * Define Required Buffers ... + */ +void DefineBuffers() +{ + // + // Plot Buffers ... + + // + // UP Trend ... + + // + ENUM_DRAW_TYPE upTrendDrawType = showUpTrend ? DRAW_ARROW : DRAW_NONE; + + // + ArraySetAsSeries(upTrendBuffer, true); + SetIndexBuffer(upTrendBufferIndex, upTrendBuffer, INDICATOR_DATA); + + // + PlotIndexSetInteger(upTrendBufferIndex, PLOT_SHOW_DATA, showUpTrend); + PlotIndexSetInteger(upTrendBufferIndex, PLOT_DRAW_TYPE, upTrendDrawType); + + // + PlotIndexSetDouble(upTrendBufferIndex, PLOT_EMPTY_VALUE, 0); + PlotIndexSetInteger(upTrendBufferIndex, PLOT_ARROW, upTrendArrowCode); + + // + // DOWN Trend ... + + // + ENUM_DRAW_TYPE downTrendDrawType = showDownTrend ? DRAW_ARROW : DRAW_NONE; + + // + ArraySetAsSeries(downTrendBuffer, true); + SetIndexBuffer(downTrendBufferIndex, downTrendBuffer, INDICATOR_DATA); + + // + PlotIndexSetInteger(downTrendBufferIndex, PLOT_SHOW_DATA, showDownTrend); + PlotIndexSetInteger(downTrendBufferIndex, PLOT_DRAW_TYPE, downTrendDrawType); + + // + PlotIndexSetDouble(downTrendBufferIndex, PLOT_EMPTY_VALUE, 0); + PlotIndexSetInteger(downTrendBufferIndex, PLOT_ARROW, downTrendArrowCode); + + // + // Data Buffers ... + + // + ArraySetAsSeries(maBuffer, true); + SetIndexBuffer(maBufferIndex, maBuffer, INDICATOR_CALCULATIONS); + + // + ArraySetAsSeries(adxBuffer, true); + SetIndexBuffer(adxBufferIndex, adxBuffer, INDICATOR_CALCULATIONS); + + // + ArraySetAsSeries(adxPBuffer, true); + SetIndexBuffer(adxPBufferIndex, adxPBuffer, INDICATOR_CALCULATIONS); + + // + ArraySetAsSeries(adxMBuffer, true); + SetIndexBuffer(adxMBufferIndex, adxMBuffer, INDICATOR_CALCULATIONS); + + // + ArraySetAsSeries(upTBuffer, true); + SetIndexBuffer(upTBufferIndex, upTBuffer, INDICATOR_CALCULATIONS); + + // + ArraySetAsSeries(downTBuffer, true); + SetIndexBuffer(downTBufferIndex, downTBuffer, INDICATOR_CALCULATIONS); +} + +/** + * Calculate Custom Buffers ... + * + * @param bar_index: Integer, Represent Current Bar ... + * @param prevCalculated: Integer, Represent Previous Calculated Bars ... + * @param ratesTotal: Integer, Represents All Available Bars ... + * @param open: Double Array, History of Open Prices ... + * @param high: Double Array, History of High Prices ... + * @param close: Double Array, History of Close Prices ... + * @param low: Double Array, History of Low Prices ... + * @param tickVolume: Long, History of Tick Volumes on Bar ... + */ +void CalculateBuffers( + int bar_index, // Selected Bar Index + const int prevCalculated, + const int ratesTotal, + const double &open[], + const double &high[], + const double &close[], + const double &low[], + const long &tickVolume[] // +) +{ + // + int barsLimit = startCalculationForLastBars > 0 + ? startCalculationForLastBars + : 0; + // + // bool canCalculate = true; + bool canCalculate = + barsLimit == 0 || + bar_index <= barsLimit; + if (canCalculate) + { + // + CalculateTrend( + bar_index, + prevCalculated, + ratesTotal, + open, + high, + close, + low, + tickVolume // + ); + } + else + { + FillBuffersZero(bar_index); + } +} + +/** + * Fill All Bufers to Zero Vlue for Specified Bar Index ... + * + * @param barIndex: Integer ... + */ +void FillBuffersZero(int barIndex) +{ + // + upTrendBuffer[barIndex] = 0; + downTrendBuffer[barIndex] = 0; + + // + maBuffer[barIndex] = 0; + adxBuffer[barIndex] = 0; + adxPBuffer[barIndex] = 0; + adxMBuffer[barIndex] = 0; +} + +/** + * Calculate Trends ... + * + * @param bar_index: Integer, Represent Current Bar ... + * @param prevCalculated: Integer, Represent Previous Calculated Bars ... + * @param ratesTotal: Integer, Represents All Available Bars ... + * @param open: Double Array, History of Open Prices ... + * @param high: Double Array, History of High Prices ... + * @param close: Double Array, History of Close Prices ... + * @param low: Double Array, History of Low Prices ... + * @param tickVolume: Long, History of Tick Volumes on Bar ... + */ +void CalculateTrend( + int bar_index, // Selected Bar Index + const int prevCalculated, + const int ratesTotal, + const double &open[], + const double &high[], + const double &close[], + const double &low[], + const long &tickVolume[] // +) +{ + // + double iPrice = GetAppliedPrice( + trendPriceType, + open, + high, + low, + close, + bar_index // + ); + + // + double iMa = maBuffer[bar_index]; + double iAdx = adxBuffer[bar_index]; + double points = GetPoints(_Symbol); + double points10 = 10 * points; + + // + bool isUpTrend = + iPrice > iMa && + iAdx > adxThreshold; + bool isDownTrend = + iPrice < iMa && + iAdx > adxThreshold; + + // + if (isUpTrend) + { + // + // double iLastValue = + // prevCalculated <= 0 + // ? 0 + // : upTrendBuffer[bar_index + 1]; + // if (iLastValue > 0 && + // iValue > iLastValue) + // { + // iValue = iLastValue; + // } + + // + double selectedValue = low[bar_index] - points10; + + // + double iValue = + !IsBullish(lastTrendDir) ? selectedValue + : !showOnlyTrendStart + ? lastValue + : 0; + + // + upTrendBuffer[bar_index] = iValue; + upTBuffer[bar_index] = selectedValue; + + // + downTrendBuffer[bar_index] = 0; + + // + lastValue = iValue; + lastTrendDir = X_DIRECTION_BULLISH; + } + else if (isDownTrend) + { + // + // double iLastValue = + // prevCalculated <= 0 + // ? 0 + // : downTrendBuffer[bar_index + 1]; + // if (iLastValue > 0 && + // iValue < iLastValue) + // { + // iValue = iLastValue; + // } + + // + double selectedValue = high[bar_index] + points10; + + // + double iValue = + !IsBearish(lastTrendDir) ? selectedValue + : !showOnlyTrendStart + ? lastValue + : 0; + + // + upTrendBuffer[bar_index] = 0; + downTrendBuffer[bar_index] = iValue; + downTBuffer[bar_index] = selectedValue; + + // + lastValue = iValue; + lastTrendDir = X_DIRECTION_BEARISH; + } + else + { + // + double iValue = + IsBullish(lastTrendDir) + ? showOnlyTrendStart + ? 0 + : lastValue + : IsBearish(lastTrendDir) + ? showOnlyTrendStart + ? 0 + : lastValue + : 0; + + // + upTrendBuffer[bar_index] = 0; + downTrendBuffer[bar_index] = 0; + + // + upTBuffer[bar_index] = 0; + downTBuffer[bar_index] = 0; + + // + lastValue = 0; + lastTrendDir = X_DIRECTION_NONE; + } +} \ No newline at end of file diff --git a/BKPS/14031206/Indicators/x-saherelm.x121.xvwap.ex5 b/BKPS/14031206/Indicators/x-saherelm.x121.xvwap.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..4ba8159331c958c82f61eb58653a76cfdfdd3654 GIT binary patch literal 17252 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 literal 0 HcmV?d00001 diff --git a/BKPS/14031206/Indicators/x-saherelm.x121.xvwap.mq5 b/BKPS/14031206/Indicators/x-saherelm.x121.xvwap.mq5 new file mode 100644 index 0000000..6b63600 --- /dev/null +++ b/BKPS/14031206/Indicators/x-saherelm.x121.xvwap.mq5 @@ -0,0 +1,711 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 Indicator +// ------------------------------------------------- +// Name: X121 XVWAP +// Description: XVWAP ... +// +// +// Maintainer: +// ------------ +// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) +// +////////////////////////////////////////////////////// +// +// Global Properties ... +#property copyright "Copyright 2023, SaherElm IT Center" +#property link "https://saherelm.ir" +#property version "1.00" +#property description "SaherElm X121 XVWAP Indicator" +#property strict + +// +// Definitions ... + +// +#define ShortName "X121 XVWAP" + +// +// Includes Common Library ... +#include "../Libraries/x-saherelm.common.lib.mq5" + +// +// Inputs ... + +// +// Market ... +input group "Market"; +input int vwapFastLength = 20; // Fast Length +input int vwapMidLength = 40; // Mid Length +input int vwapSlowLength = 60; // Slow Length +input ENUM_APPLIED_PRICE vwapAppliedTo = PRICE_CLOSE; // Applied To + +// +// Presentation ... +input group "Presentation"; + +// +input int startCalculationForLastBars = 1000; // Calculate Last n Bars + +// +input bool showVWapFast = true; // Show VWap Fast +input bool showVWapMedium = true; // Show VWap Medium +input bool showVWapSlow = true; // Show VWap Slow + +// +// Buffers ... + +// +#define hideColorIDX 0 +#define bullishColorIDX 1 +#define bearishColorIDX 2 +#define neuturalColorIDX 3 + +// +#property indicator_chart_window + +// +#property indicator_buffers 11 +#property indicator_plots 3 + +// +// Plot Buffers ... + +// +// FAST ... +#define vwapFastBufferIndex 0 +double vwapFastBuffer[]; + +#define vwapFastColorBufferIndex 1 +double vwapFastColorBuffer[]; + +// +#define vwapFastPlotBufferIndex 0 +#property indicator_label1 "X121 VWF" +#property indicator_type1 DRAW_COLOR_LINE +#property indicator_color1 CLR_NONE, clrAqua, clrMagenta, clrGray +#property indicator_style1 STYLE_SOLID +#property indicator_width1 2 + +// +// MID ... +#define vwapMidBufferIndex 2 +double vwapMidBuffer[]; + +#define vwapMidColorBufferIndex 3 +double vwapMidColorBuffer[]; + +// +#define vwapMidPlotBufferIndex 1 +#property indicator_label2 "X121 VWM" +#property indicator_type2 DRAW_COLOR_LINE +#property indicator_color2 CLR_NONE, clrGreen, clrRed, clrGray +#property indicator_style2 STYLE_SOLID +#property indicator_width2 2 + +// +// SLOW ... +#define vwapSlowBufferIndex 4 +double vwapSlowBuffer[]; + +#define vwapSlowColorBufferIndex 5 +double vwapSlowColorBuffer[]; + +// +#define vwapSlowPlotBufferIndex 2 +#property indicator_label3 "X121 VWS" +#property indicator_type3 DRAW_COLOR_LINE +#property indicator_color3 CLR_NONE, clrSteelBlue, clrDarkRed, clrGray +#property indicator_style3 STYLE_SOLID +#property indicator_width3 2 + +// +// Data Buffers ... + +// +int mLastBufferIndex = 5; + +// +// Volume ... +#define vwapVolumeBufferIndex mLastBufferIndex + 1 +double vwapVolumeBuffer[]; + +// +// Price ... +#define vwapPriceBufferIndex mLastBufferIndex + 2 +double vwapPriceBuffer[]; + +// +// Fast State ... +#define vwapFastStateBufferIndex mLastBufferIndex + 3 +double vwapFastStateBuffer[]; + +// +// Mid State ... +#define vwapMidStateBufferIndex mLastBufferIndex + 4 +double vwapMidStateBuffer[]; + +// +// Slow State ... +#define vwapSlowStateBufferIndex mLastBufferIndex + 5 +double vwapSlowStateBuffer[]; + +// +// Variables, Properties and etc ... + +// +// this counts Available Bars ... +int limit; + +// +int maxLength; + +// +// Event Handlers ... + +/** + * Initialize Indicator ... + * + * @return ( int ) + */ +int OnInit() +{ + // + // Validate Inputs ... + if (!ValidateInputs()) + { + return INIT_PARAMETERS_INCORRECT; + } + + // + // Initialize Indicator Handlers ... + + // + // because in some cases we may have more than one input for + // calculation and we must prevent any calculation + // untill we pass the biggest input length, here we get max Input length + // and then wait until pass it ... + maxLength = ExtractMaxLengthOfInputs(); + + // + // Define Index Buffers ... + DefineBuffers(); + + // + // Set Indicator ShortName ... + SetIndicatorName(); + + // + // Init Succeed ... + return INIT_SUCCEEDED; +} + +/** + * De Initialize Indicator ... + * + * @param reason: Integer, De Initialization Reason ... + */ +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 +} + +/** + * Calculate Bars ... + * + * @param rates_total: Integer, Total Bars on Chart ... + * @param prev_calculated: Integer, Total Calculated Bars on Charts ... + * @param time: DateTime Array, History of Open Time ... + * @param open: Double Array, History of Open Prices ... + * @param high: Double Array, History of High Prices ... + * @param low: Double Array, History of Low Prices ... + * @param close: Double Array, History of Close Prices ... + * @param tick_volume: Long, History of Tick Volumes on Bar ... + * @param volume: Long, History of Trade Volumes ... + * @param spread: Double, History of Spread Price ... + * + * @return ( int ) + */ +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[] // +) +{ + // + // 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); + + // + // Validate Calculated Bars ... + + // + limit = (prev_calculated > rates_total || prev_calculated <= 0) + ? rates_total + : (rates_total - prev_calculated) + 1; + + // + // Buffers Copy ... + + // + // Main Loop ... + for (int i = limit - 1; i >= 0 && !IsStopped(); i--) + { + // + CalculateBuffers( + i, + prev_calculated, + rates_total, + // + open, + high, + close, + low, + tick_volume // + ); + } + + // + return rates_total; +} + +// +// Functions ... + +/** + * Validate Input Args for Initialization ... + * + * @return ( bool ) + */ +bool ValidateInputs() +{ + // + bool result = false; + + // + result = + // + vwapFastLength > 2 && + vwapMidLength > vwapFastLength && + vwapSlowLength > vwapMidLength + // + ; + + // + return result; +} + +/** + * Extract Max Length of Inputs ... + * + * @return ( int ) + */ +int ExtractMaxLengthOfInputs() +{ + // + int result = 0; + + // + // XVWAP ... + result = MathMax(result, vwapFastLength); + result = MathMax(result, vwapMidLength); + result = MathMax(result, vwapSlowLength); + + // + return result; +} + +/** + * Define Required Buffers ... + */ +void DefineBuffers() +{ + // + // Plot Buffers ... + + // + // Fast ... + ArraySetAsSeries(vwapFastBuffer, true); + ArraySetAsSeries(vwapFastColorBuffer, true); + SetIndexBuffer(vwapFastBufferIndex, vwapFastBuffer, INDICATOR_DATA); + SetIndexBuffer(vwapFastColorBufferIndex, vwapFastColorBuffer, INDICATOR_COLOR_INDEX); + + // + // Mid ... + ArraySetAsSeries(vwapMidBuffer, true); + ArraySetAsSeries(vwapMidColorBuffer, true); + SetIndexBuffer(vwapMidBufferIndex, vwapMidBuffer, INDICATOR_DATA); + SetIndexBuffer(vwapMidColorBufferIndex, vwapMidColorBuffer, INDICATOR_COLOR_INDEX); + + // + // Slow ... + ArraySetAsSeries(vwapSlowBuffer, true); + ArraySetAsSeries(vwapSlowColorBuffer, true); + SetIndexBuffer(vwapSlowBufferIndex, vwapSlowBuffer, INDICATOR_DATA); + SetIndexBuffer(vwapSlowColorBufferIndex, vwapSlowColorBuffer, INDICATOR_COLOR_INDEX); + + // + // Data Buffers ... + + // + // Volumes ... + ArraySetAsSeries(vwapVolumeBuffer, true); + SetIndexBuffer(vwapVolumeBufferIndex, vwapVolumeBuffer, INDICATOR_CALCULATIONS); + + // + // Price ... + ArraySetAsSeries(vwapPriceBuffer, true); + SetIndexBuffer(vwapPriceBufferIndex, vwapPriceBuffer, INDICATOR_CALCULATIONS); + + // + // Fast State ... + ArraySetAsSeries(vwapFastStateBuffer, true); + SetIndexBuffer(vwapFastStateBufferIndex, vwapFastStateBuffer, INDICATOR_CALCULATIONS); + + // + // Mid State ... + ArraySetAsSeries(vwapMidStateBuffer, true); + SetIndexBuffer(vwapMidStateBufferIndex, vwapMidStateBuffer, INDICATOR_CALCULATIONS); + + // + // Slow State ... + ArraySetAsSeries(vwapSlowStateBuffer, true); + SetIndexBuffer(vwapSlowStateBufferIndex, vwapSlowStateBuffer, INDICATOR_CALCULATIONS); +} + +/** + * Set Indicator Short Name and also we can define Buffers Labels ... + */ +void SetIndicatorName() +{ + IndicatorSetString(INDICATOR_SHORTNAME, ShortName); +} + +/** + * Calculate Custom Buffers ... + * + * @param bar_index: Integer, Represent Current Bar ... + * @param prevCalculated: Integer, Represent Previous Calculated Bars ... + * @param ratesTotal: Integer, Represents All Available Bars ... + * @param open: Double Array, History of Open Prices ... + * @param high: Double Array, History of High Prices ... + * @param close: Double Array, History of Close Prices ... + * @param low: Double Array, History of Low Prices ... + * @param tickVolume: Long, History of Tick Volumes on Bar ... + */ +void CalculateBuffers( + int bar_index, // Selected Bar Index + const int prevCalculated, + const int ratesTotal, + const double &open[], + const double &high[], + const double &close[], + const double &low[], + const long &tickVolume[] // +) +{ + // + int barsLimit = startCalculationForLastBars > 0 + ? startCalculationForLastBars + : 0; + // + // bool canCalculate = true; + bool canCalculate = + barsLimit == 0 || + bar_index <= barsLimit; + if (canCalculate) + { + // + // Calculate Required VWAP Data Buffers ... + if (ratesTotal - bar_index <= maxLength) + { + // + CalculateVWAPDataBuffers( + bar_index, + prevCalculated, + ratesTotal, + open, + high, + close, + low, + tickVolume // + ); + + // + // Prevent Moving Forward ... + } + else + { + // + CalculateVWAPDataBuffers( + bar_index, + prevCalculated, + ratesTotal, + open, + high, + close, + low, + tickVolume // + ); + + // + CalculateVWAPS( + bar_index, + prevCalculated, + ratesTotal, + open, + high, + close, + low, + tickVolume // + ); + } + } + else + { + FillBuffersZero(bar_index); + } +} + +// +// Custom ... + +/** + * Fill All Bufers to Zero Vlue for Specified Bar Index ... + * + * @param barIndex: Integer ... + */ +void FillBuffersZero(int barIndex) +{ + // + vwapFastBuffer[barIndex] = EMPTY_VALUE; + vwapMidBuffer[barIndex] = EMPTY_VALUE; + vwapSlowBuffer[barIndex] = EMPTY_VALUE; + vwapVolumeBuffer[barIndex] = EMPTY_VALUE; + vwapPriceBuffer[barIndex] = EMPTY_VALUE; + + // + vwapFastColorBuffer[barIndex] = hideColorIDX; + vwapMidColorBuffer[barIndex] = hideColorIDX; + vwapSlowColorBuffer[barIndex] = hideColorIDX; + vwapFastStateBuffer[barIndex] = hideColorIDX; + vwapMidStateBuffer[barIndex] = hideColorIDX; + vwapSlowStateBuffer[barIndex] = hideColorIDX; +} + +/** + * Calculate VWAP Value for Specified Bar ... + * + * @param bar_index: Integer, Represent Current Bar ... + * @param prevCalculated: Integer, Represent Previous Calculated Bars ... + * @param ratesTotal: Integer, Represents All Available Bars ... + * @param open: Double Array, History of Open Prices ... + * @param high: Double Array, History of High Prices ... + * @param close: Double Array, History of Close Prices ... + * @param low: Double Array, History of Low Prices ... + * @param tickVolume: Long, History of Tick Volumes on Bar ... + * @param _length: Integer, Specified VWAP Length ... + * @param _show: Boolean, Specified Show Buffer or not ... + * @param _buffer: Double Array Reference, Points to Buffer ... + * @param _colorBuffer: Double Array Reference, Points to Color Buffer ... + * @param _stateBuffer: Double Array Reference, Points to State Buffer ... + */ +void CalculateVWAP( + int bar_index, // Selected Bar Index + const int prevCalculated, + const int ratesTotal, + const double &open[], + const double &high[], + const double &close[], + const double &low[], + const long &tickVolume[], + // + int _length, // Calculation Length + bool _show, + double &_buffer[], + double &_colorBuffer[], + double &_stateBuffer[] // +) +{ + // + double vSum = 0; + double pSum = 0; + double mSum = 0; + for (int x = 0; x < _length; x++) + { + // + pSum += vwapPriceBuffer[x + bar_index]; + vSum += vwapVolumeBuffer[x + bar_index]; + mSum += vwapPriceBuffer[x + bar_index] * vwapVolumeBuffer[x + bar_index]; + } + + // + double iValue = mSum / vSum; + iValue = NormalizeDouble(iValue, _Digits); + + // + _buffer[bar_index] = iValue; + + // + bool isBullish = low[bar_index] > iValue; + bool isBearish = high[bar_index] < iValue; + + // + double iColor = + isBullish + ? bullishColorIDX + : isBearish + ? bearishColorIDX + : neuturalColorIDX; + + // + _colorBuffer[bar_index] = hideColorIDX; + _stateBuffer[bar_index] = iColor; + if (_show) + { + _colorBuffer[bar_index] = iColor; + } +} + +/** + * Calculate VWAP Required Data Buffers ... + * + * @param bar_index: Integer, Represent Current Bar ... + * @param prevCalculated: Integer, Represent Previous Calculated Bars ... + * @param ratesTotal: Integer, Represents All Available Bars ... + * @param open: Double Array, History of Open Prices ... + * @param high: Double Array, History of High Prices ... + * @param close: Double Array, History of Close Prices ... + * @param low: Double Array, History of Low Prices ... + * @param tickVolume: Long, History of Tick Volumes on Bar ... + */ +void CalculateVWAPDataBuffers( + int bar_index, // Selected Bar Index + const int prevCalculated, + const int ratesTotal, + const double &open[], + const double &high[], + const double &close[], + const double &low[], + const long &tickVolume[] // +) +{ + // + double price = GetAppliedPrice( + vwapAppliedTo, + open, + high, + low, + close, + bar_index // + ); + vwapPriceBuffer[bar_index] = price; + vwapVolumeBuffer[bar_index] = (double)tickVolume[bar_index]; +} + +/** + * Calculate Different VWaps ... + * + * @param bar_index: Integer, Represent Current Bar ... + * @param prevCalculated: Integer, Represent Previous Calculated Bars ... + * @param ratesTotal: Integer, Represents All Available Bars ... + * @param open: Double Array, History of Open Prices ... + * @param high: Double Array, History of High Prices ... + * @param close: Double Array, History of Close Prices ... + * @param low: Double Array, History of Low Prices ... + * @param tickVolume: Long, History of Tick Volumes on Bar ... + */ +void CalculateVWAPS( + int bar_index, // Selected Bar Index + const int prevCalculated, + const int ratesTotal, + const double &open[], + const double &high[], + const double &close[], + const double &low[], + const long &tickVolume[] // +) +{ + // + // Fast ... + CalculateVWAP( + bar_index, + prevCalculated, + ratesTotal, + open, + high, + close, + low, + tickVolume, + // + vwapFastLength, + showVWapFast, + vwapFastBuffer, + vwapFastColorBuffer, + vwapFastStateBuffer // + ); + + // + // Mid ... + CalculateVWAP( + bar_index, + prevCalculated, + ratesTotal, + open, + high, + close, + low, + tickVolume, + // + vwapMidLength, + showVWapMedium, + vwapMidBuffer, + vwapMidColorBuffer, + vwapMidStateBuffer // + ); + + // + // Fast ... + CalculateVWAP( + bar_index, + prevCalculated, + ratesTotal, + open, + high, + close, + low, + tickVolume, + // + vwapSlowLength, + showVWapSlow, + vwapSlowBuffer, + vwapSlowColorBuffer, + vwapSlowStateBuffer // + ); +} + +// \ No newline at end of file diff --git a/BKPS/14031206/Indicators/x-saherelm.x121.xwz.ex5 b/BKPS/14031206/Indicators/x-saherelm.x121.xwz.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..b774006eac7ce7afc8be777c319a9e3314dd3785 GIT binary patch literal 101456 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

    g+0Jf!dKo1TE)Pz4 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 maxLength && + // + // ATR ... + atrCalculatedBars >= maxLength && + // + // ADX ... + adxCalculatedBars >= maxLength + // + ; + if (!isPassedRequiredCalculatedBars) + { + return prev_calculated; + } + + // + limit = (prev_calculated > rates_total || prev_calculated <= 0) + ? rates_total + : (rates_total - prev_calculated) + 1; + + // + // Buffers Copy ... + + // + // MA ... + int copiedMas = CopyBuffer(maHandler, 0, 0, limit, maBuffer); + + // + // ATR ... + int copiedAtr = CopyBuffer(atrHandler, MAIN_LINE, 0, limit, atrBuffer); + + // + // ADX ... + int copiedAdxs = CopyBuffer(adxHandler, MAIN_LINE, 0, limit, adxBuffer); + + // + // Validate Copied Items ... + bool isPassedRequiredCopiedItems = + // + // MA ... + copiedMas > 0 && + // + // ATR ... + copiedAtr > 0 && + // + // ADX ... + copiedAdxs > 0 + // + ; + if (!isPassedRequiredCopiedItems) + { + return prev_calculated; + } + + // + // Main Loop ... + for (int i = limit - 1; i >= 0 && !IsStopped(); i--) + { + // + CalculateBuffers( + // + i, + prev_calculated, + rates_total, + // + open, + high, + close, + low, + tick_volume // + ); + } + + // + return rates_total; +} + +// +// Functions ... + +/** + * Validate Input Args for Initialization ... + * + * @return ( bool ) + */ +bool ValidateInputs() +{ + // + bool result = false; + + // + result = + // + // MA ... + maLength > 0 && + // + // ATR ... + atrLength > 0 && + atrMultiplier > 0 && + // + // ADX ... + adxLength > 0 && + adxThreshold > 0 + // + ; + + // + return result; +} + +/** + * Extract Max Length of Inputs ... + * + * @return ( int ) + */ +int ExtractMaxLengthOfInputs() +{ + // + int result = 0; + + // + result = MathMax(maLength, atrLength); + result = MathMax(result, adxLength); + + // + return result; +} + +/** + * Set Indicator Short Name and also we can define Buffers Labels ... + */ +void SetIndicatorName() +{ + IndicatorSetString(INDICATOR_SHORTNAME, ShortName); +} + +/** + * Define Required Buffers ... + */ +void DefineBuffers() +{ + // + // Plot Buffers ... + + // + // MA Buffer ... + + // + ENUM_DRAW_TYPE maDrawType = showMA ? DRAW_LINE : DRAW_NONE; + + // + ArraySetAsSeries(maBuffer, true); + SetIndexBuffer(maBufferIndex, maBuffer, INDICATOR_DATA); + + // + PlotIndexSetInteger(maBufferIndex, PLOT_SHOW_DATA, showMA); + PlotIndexSetInteger(maBufferIndex, PLOT_DRAW_TYPE, maDrawType); + + // + PlotIndexSetDouble(maBufferIndex, PLOT_EMPTY_VALUE, 0); + + // + // LONG SL Buffer ... + + // + ENUM_DRAW_TYPE longSLDrawType = showLongSL ? DRAW_LINE : DRAW_NONE; + + // + ArraySetAsSeries(longSLBuffer, true); + SetIndexBuffer(longSLBufferIndex, longSLBuffer, INDICATOR_DATA); + + // + PlotIndexSetInteger(longSLBufferIndex, PLOT_SHOW_DATA, showLongSL); + PlotIndexSetInteger(longSLBufferIndex, PLOT_DRAW_TYPE, longSLDrawType); + + // + PlotIndexSetDouble(longSLBufferIndex, PLOT_EMPTY_VALUE, 0); + + // + // SHORT SL Buffer ... + + // + ENUM_DRAW_TYPE shortSLDrawType = showShortSL ? DRAW_LINE : DRAW_NONE; + + // + ArraySetAsSeries(shortSLBuffer, true); + SetIndexBuffer(shortSLBufferIndex, shortSLBuffer, INDICATOR_DATA); + + // + PlotIndexSetInteger(shortSLBufferIndex, PLOT_SHOW_DATA, showShortSL); + PlotIndexSetInteger(shortSLBufferIndex, PLOT_DRAW_TYPE, shortSLDrawType); + + // + PlotIndexSetDouble(shortSLBufferIndex, PLOT_EMPTY_VALUE, 0); + + // + // UP Trend ... + + // + ENUM_DRAW_TYPE upTrendDrawType = showTrend ? DRAW_ARROW : DRAW_NONE; + + // + ArraySetAsSeries(upTrendBuffer, true); + SetIndexBuffer(upTrendBufferIndex, upTrendBuffer, INDICATOR_DATA); + + // + PlotIndexSetInteger(upTrendBufferIndex, PLOT_SHOW_DATA, showTrend); + PlotIndexSetInteger(upTrendBufferIndex, PLOT_DRAW_TYPE, upTrendDrawType); + + // + PlotIndexSetDouble(upTrendBufferIndex, PLOT_EMPTY_VALUE, 0); + PlotIndexSetInteger(upTrendBufferIndex, PLOT_ARROW, upTrendArrowCode); + + // + // DOWN Trend ... + + // + ENUM_DRAW_TYPE downTrendDrawType = showTrend ? DRAW_ARROW : DRAW_NONE; + + // + ArraySetAsSeries(downTrendBuffer, true); + SetIndexBuffer(downTrendBufferIndex, downTrendBuffer, INDICATOR_DATA); + + // + PlotIndexSetInteger(downTrendBufferIndex, PLOT_SHOW_DATA, showTrend); + PlotIndexSetInteger(downTrendBufferIndex, PLOT_DRAW_TYPE, downTrendDrawType); + + // + PlotIndexSetDouble(downTrendBufferIndex, PLOT_EMPTY_VALUE, 0); + PlotIndexSetInteger(downTrendBufferIndex, PLOT_ARROW, downTrendArrowCode); + + // + // Bullish Momentum ... + + // + ENUM_DRAW_TYPE bullishMomentumDrawType = showMomentum ? DRAW_ARROW : DRAW_NONE; + + // + ArraySetAsSeries(bullishMomentumBuffer, true); + SetIndexBuffer(bullishMomentumBufferIndex, bullishMomentumBuffer, INDICATOR_DATA); + + // + PlotIndexSetInteger(bullishMomentumBufferIndex, PLOT_SHOW_DATA, showMomentum); + PlotIndexSetInteger(bullishMomentumBufferIndex, PLOT_DRAW_TYPE, bullishMomentumDrawType); + + // + PlotIndexSetDouble(bullishMomentumBufferIndex, PLOT_EMPTY_VALUE, 0); + PlotIndexSetInteger(bullishMomentumBufferIndex, PLOT_ARROW, bullishMomentumArrowCode); + + // + // Bearish Momentum ... + + // + ENUM_DRAW_TYPE bearishMomentumDrawType = showMomentum ? DRAW_ARROW : DRAW_NONE; + + // + ArraySetAsSeries(bearishMomentumBuffer, true); + SetIndexBuffer(bearishMomentumBufferIndex, bearishMomentumBuffer, INDICATOR_DATA); + + // + PlotIndexSetInteger(bearishMomentumBufferIndex, PLOT_SHOW_DATA, showMomentum); + PlotIndexSetInteger(bearishMomentumBufferIndex, PLOT_DRAW_TYPE, bearishMomentumDrawType); + + // + PlotIndexSetDouble(bearishMomentumBufferIndex, PLOT_EMPTY_VALUE, 0); + PlotIndexSetInteger(bearishMomentumBufferIndex, PLOT_ARROW, bearishMomentumArrowCode); + + // + // Bullish Rejection ... + + // + ENUM_DRAW_TYPE bullishRejectionDrawType = showRejection ? DRAW_ARROW : DRAW_NONE; + + // + ArraySetAsSeries(bullishRejectionBuffer, true); + SetIndexBuffer(bullishRejectionBufferIndex, bullishRejectionBuffer, INDICATOR_DATA); + + // + PlotIndexSetInteger(bullishRejectionBufferIndex, PLOT_SHOW_DATA, showRejection); + PlotIndexSetInteger(bullishRejectionBufferIndex, PLOT_DRAW_TYPE, bullishRejectionDrawType); + + // + PlotIndexSetDouble(bullishRejectionBufferIndex, PLOT_EMPTY_VALUE, 0); + PlotIndexSetInteger(bullishRejectionBufferIndex, PLOT_ARROW, bullishRejectionArrowCode); + + // + // Bearish Rejection ... + + // + ENUM_DRAW_TYPE bearishRejectionDrawType = showRejection ? DRAW_ARROW : DRAW_NONE; + + // + ArraySetAsSeries(bearishRejectionBuffer, true); + SetIndexBuffer(bearishRejectionBufferIndex, bearishRejectionBuffer, INDICATOR_DATA); + + // + PlotIndexSetInteger(bearishRejectionBufferIndex, PLOT_SHOW_DATA, showRejection); + PlotIndexSetInteger(bearishRejectionBufferIndex, PLOT_DRAW_TYPE, bearishRejectionDrawType); + + // + PlotIndexSetDouble(bearishRejectionBufferIndex, PLOT_EMPTY_VALUE, 0); + PlotIndexSetInteger(bearishRejectionBufferIndex, PLOT_ARROW, bearishRejectionArrowCode); + + // + // Bullish Pin ... + + // + ENUM_DRAW_TYPE bullishPinDrawType = showPin ? DRAW_ARROW : DRAW_NONE; + + // + ArraySetAsSeries(bullishPinBuffer, true); + SetIndexBuffer(bullishPinBufferIndex, bullishPinBuffer, INDICATOR_DATA); + + // + PlotIndexSetInteger(bullishPinBufferIndex, PLOT_SHOW_DATA, showPin); + PlotIndexSetInteger(bullishPinBufferIndex, PLOT_DRAW_TYPE, bullishPinDrawType); + + // + PlotIndexSetDouble(bullishPinBufferIndex, PLOT_EMPTY_VALUE, 0); + PlotIndexSetInteger(bullishPinBufferIndex, PLOT_ARROW, bullishPinArrowCode); + + // + // Bearish Pin ... + + // + ENUM_DRAW_TYPE bearishPinDrawType = showPin ? DRAW_ARROW : DRAW_NONE; + + // + ArraySetAsSeries(bearishPinBuffer, true); + SetIndexBuffer(bearishPinBufferIndex, bearishPinBuffer, INDICATOR_DATA); + + // + PlotIndexSetInteger(bearishPinBufferIndex, PLOT_SHOW_DATA, showPin); + PlotIndexSetInteger(bearishPinBufferIndex, PLOT_DRAW_TYPE, bearishPinDrawType); + + // + PlotIndexSetDouble(bearishPinBufferIndex, PLOT_EMPTY_VALUE, 0); + PlotIndexSetInteger(bearishPinBufferIndex, PLOT_ARROW, bearishPinArrowCode); + + // + // Bullish Engulf ... + + // + ENUM_DRAW_TYPE bullishEngulfDrawType = showEngulf ? DRAW_ARROW : DRAW_NONE; + + // + ArraySetAsSeries(bullishEngulfBuffer, true); + SetIndexBuffer(bullishEngulfBufferIndex, bullishEngulfBuffer, INDICATOR_DATA); + + // + PlotIndexSetInteger(bullishEngulfBufferIndex, PLOT_SHOW_DATA, showEngulf); + PlotIndexSetInteger(bullishEngulfBufferIndex, PLOT_DRAW_TYPE, bullishEngulfDrawType); + + // + PlotIndexSetDouble(bullishEngulfBufferIndex, PLOT_EMPTY_VALUE, 0); + PlotIndexSetInteger(bullishEngulfBufferIndex, PLOT_ARROW, bullishEngulfArrowCode); + + // + // Bearish Engulf ... + + // + ENUM_DRAW_TYPE bearishEngulfDrawType = showEngulf ? DRAW_ARROW : DRAW_NONE; + + // + ArraySetAsSeries(bearishEngulfBuffer, true); + SetIndexBuffer(bearishEngulfBufferIndex, bearishEngulfBuffer, INDICATOR_DATA); + + // + PlotIndexSetInteger(bearishEngulfBufferIndex, PLOT_SHOW_DATA, showEngulf); + PlotIndexSetInteger(bearishEngulfBufferIndex, PLOT_DRAW_TYPE, bearishEngulfDrawType); + + // + PlotIndexSetDouble(bearishEngulfBufferIndex, PLOT_EMPTY_VALUE, 0); + PlotIndexSetInteger(bearishEngulfBufferIndex, PLOT_ARROW, bearishEngulfArrowCode); + + // + // Swing Low ... + + // + ENUM_DRAW_TYPE swingLowDrawType = showSwing ? DRAW_ARROW : DRAW_NONE; + + // + ArraySetAsSeries(swingLowBuffer, true); + SetIndexBuffer(swingLowBufferIndex, swingLowBuffer, INDICATOR_DATA); + + // + PlotIndexSetInteger(swingLowBufferIndex, PLOT_SHOW_DATA, showSwing); + PlotIndexSetInteger(swingLowBufferIndex, PLOT_DRAW_TYPE, swingLowDrawType); + + // + PlotIndexSetDouble(swingLowBufferIndex, PLOT_EMPTY_VALUE, 0); + PlotIndexSetInteger(swingLowBufferIndex, PLOT_ARROW, swingLowArrowCode); + + // + // Swing High ... + + // + ENUM_DRAW_TYPE swingHighDrawType = showSwing ? DRAW_ARROW : DRAW_NONE; + + // + ArraySetAsSeries(swingHighBuffer, true); + SetIndexBuffer(swingHighBufferIndex, swingHighBuffer, INDICATOR_DATA); + + // + PlotIndexSetInteger(swingHighBufferIndex, PLOT_SHOW_DATA, showSwing); + PlotIndexSetInteger(swingHighBufferIndex, PLOT_DRAW_TYPE, swingHighDrawType); + + // + PlotIndexSetDouble(swingHighBufferIndex, PLOT_EMPTY_VALUE, 0); + PlotIndexSetInteger(swingHighBufferIndex, PLOT_ARROW, swingHighArrowCode); + + // + // DATA Buffers ... + + // + ArraySetAsSeries(atrBuffer, true); + SetIndexBuffer(atrBufferIndex, atrBuffer, INDICATOR_CALCULATIONS); + + // + ArraySetAsSeries(adxBuffer, true); + SetIndexBuffer(adxBufferIndex, adxBuffer, INDICATOR_CALCULATIONS); +} + +/** + * Calculate Custom Buffers ... + * + * @param bar_index: Integer, Represent Current Bar ... + * @param prevCalculated: Integer, Represent Previous Calculated Bars ... + * @param ratesTotal: Integer, Represents All Available Bars ... + * @param open: Double Array, History of Open Prices ... + * @param high: Double Array, History of High Prices ... + * @param close: Double Array, History of Close Prices ... + * @param low: Double Array, History of Low Prices ... + * @param tickVolume: Long, History of Tick Volumes on Bar ... + */ +void CalculateBuffers( + int bar_index, // Selected Bar Index + const int prevCalculated, + const int ratesTotal, + const double &open[], + const double &high[], + const double &close[], + const double &low[], + const long &tickVolume[] // +) +{ + // + int barsLimit = startCalculationForLastBars > 0 + ? startCalculationForLastBars + : 0; + // + // bool canCalculate = true; + bool canCalculate = + barsLimit == 0 || + bar_index <= barsLimit; + if (canCalculate) + { + // + CalculatedPOIs( + // + bar_index, + prevCalculated, + ratesTotal, + // + open, + high, + close, + low, + tickVolume // + ); + + // + CalculateValues( + bar_index, + prevCalculated, + ratesTotal, + open, + high, + close, + low, + tickVolume // + ); + } + else + { + FillBuffersZero(bar_index); + } +} + +/** + * Fill All Bufers to Zero Vlue for Specified Bar Index ... + * + * @param barIndex: Integer ... + */ +void FillBuffersZero(int barIndex) +{ + // + maBuffer[barIndex] = 0; + atrBuffer[barIndex] = 0; + adxBuffer[barIndex] = 0; + longSLBuffer[barIndex] = 0; + shortSLBuffer[barIndex] = 0; + upTrendBuffer[barIndex] = 0; + swingLowBuffer[barIndex] = 0; + swingHighBuffer[barIndex] = 0; + downTrendBuffer[barIndex] = 0; + bullishPinBuffer[barIndex] = 0; + bearishPinBuffer[barIndex] = 0; + bullishEngulfBuffer[barIndex] = 0; + bearishEngulfBuffer[barIndex] = 0; + bullishMomentumBuffer[barIndex] = 0; + bearishMomentumBuffer[barIndex] = 0; + bullishRejectionBuffer[barIndex] = 0; + bearishRejectionBuffer[barIndex] = 0; +} + +/** + * Calculate Vales ... + * + * @param bar_index: Integer, Represent Current Bar ... + * @param prevCalculated: Integer, Represent Previous Calculated Bars ... + * @param ratesTotal: Integer, Represents All Available Bars ... + * @param open: Double Array, History of Open Prices ... + * @param high: Double Array, History of High Prices ... + * @param close: Double Array, History of Close Prices ... + * @param low: Double Array, History of Low Prices ... + * @param tickVolume: Long, History of Tick Volumes on Bar ... + */ +void CalculateValues( + int bar_index, // Selected Bar Index + const int prevCalculated, + const int ratesTotal, + const double &open[], + const double &high[], + const double &close[], + const double &low[], + const long &tickVolume[] // +) +{ + // + // Prepare Requirements ... + + // + XOHCL iBar; + bool isInited = iBar.Init( + _Symbol, + _Period, + bar_index // + ); + if (!isInited) + { + // + iBar.Clean(); + return; + } + + // + XOHCL pBar; + isInited = iBar.GetPreviousBar(pBar); + if (!isInited) + { + // + iBar.Clean(); + pBar.Clean(); + return; + } + int pIndex = pBar.Index(); + + // + // Calculate Applied Price ... + double iPrice = GetAppliedPrice( + appliedTo, + open, + high, + low, + close, + bar_index // + ); + + // + double iMa = maBuffer[bar_index]; + double iMaPrev = maBuffer[pIndex]; + double iAtr = atrBuffer[bar_index]; + double iAdx = adxBuffer[bar_index]; + double iAppliedAtr = iAtr * atrMultiplier; + + // + double points = GetPoints(_Symbol); + double points10 = 10 * points; + + // + ENUM_X_DIRECTION iDir = X_DIRECTION_NONE; + + // + bool hasLastBullOB = lastBullOB != NULL && + lastBullOB.IsValid(); + bool hasLastBearOB = lastBearOB != NULL && + lastBearOB.IsValid(); + + // + bool hasLastBullFVG = lastBullFVG != NULL && + lastBullFVG.IsValid(); + bool hasLastBearFVG = lastBearFVG != NULL && + lastBearFVG.IsValid(); + + // + bool hasLastSupport = lastSupport != NULL && + lastSupport.IsValid(); + + // + bool hasLastResistance = lastResistance != NULL && + lastResistance.IsValid(); + + // + // Calculate Crossing Over / Under Ma ... + bool isCrossedOverMA = + // + iBar.low > iMa && + (pBar.low <= iMaPrev && + (pBar.GetUp() <= iMaPrev || + pBar.GetDown() <= iMaPrev)) + // + ; + bool isCrossedUnderMA = + // + iBar.high < iMa && + (pBar.high >= iMaPrev && + (pBar.GetUp() >= iMaPrev || + pBar.GetDown() >= iMaPrev)) + // + ; + lastCrossedOverMA = + isCrossedOverMA + ? iBar.time + : lastCrossedOverMA; + lastCrossedUnderMA = + isCrossedUnderMA + ? iBar.time + : lastCrossedUnderMA; + + // + // SL Buffers ... + + // + double iLongSL = iPrice - iAppliedAtr; + double iShortSL = iPrice + iAppliedAtr; + + // + longSLBuffer[bar_index] = iLongSL; + shortSLBuffer[bar_index] = iShortSL; + + // + // Trend Buffers ... + + // + bool isUpTrend = + // + iPrice > iMa && + iBar.low < iMa && + iAdx > adxThreshold + // + ; + + // + bool isDownTrend = + // + iPrice < iMa && + iBar.high > iMa && + iAdx > adxThreshold + // + ; + + // + double upTrendValue = 0; + double downTrendValue = 0; + if (isUpTrend) + { + // + lastBullishTrend = iBar.time; + upTrendValue = iBar.low; + } + if (isDownTrend) + { + // + lastBearishTrend = iBar.time; + downTrendValue = iBar.high; + } + + // + upTrendBuffer[bar_index] = upTrendValue; + downTrendBuffer[bar_index] = downTrendValue; + + // + // Momentum Buffers ... + + // + bool isMomentum = mXWZBarAnalyser + .IsMomentumBar( + iBar, + iDir, + 1, // Extends ... + 70 // Body Percent ... + ); + bool isBullishMomentum = + isMomentum && + IsBullish(iDir); + bool isBearishMomentum = + isMomentum && + IsBearish(iDir); + if (isMomentum) + { + // + double iBullMomentumValue = 0; + double iBearMomentumValue = 0; + + // + if (isBullishMomentum) + { + // + double selectedValue = iBar.low; + + // + iBullMomentumValue = + !filterPOIsUsingZones + ? selectedValue + : !hasLastBullOB + ? 0 + : IsInside( + selectedValue, + lastBullOB // + ) + ? selectedValue + : 0; + + // + iBullMomentumValue = + !filterPOIsUsingMa + ? iBullMomentumValue + : iBullMomentumValue < iMa + ? iBullMomentumValue + : 0; + } + + // + if (isBearishMomentum) + { + // + double selectedValue = iBar.high; + + // + iBearMomentumValue = + !filterPOIsUsingZones + ? selectedValue + : !hasLastBearOB + ? 0 + : IsInside( + selectedValue, + lastBearOB // + ) + ? selectedValue + : 0; + + // + iBearMomentumValue = + !filterPOIsUsingMa + ? iBearMomentumValue + : iBearMomentumValue > iMa + ? iBearMomentumValue + : 0; + } + + // + bullishMomentumBuffer[bar_index] = iBullMomentumValue; + bearishMomentumBuffer[bar_index] = iBearMomentumValue; + } + + // + // Rejection Buffers ... + + // + bool isRejection = mXWZBarAnalyser + .IsRejectionBar( + iBar, + iDir, + 1, // Extends ... + 70 // Body Percent ... + ); + bool isBullishRejection = + isRejection && + IsBullish(iDir); + bool isBearishRejection = + isRejection && + IsBearish(iDir); + if (isRejection) + { + // + double iBullRejectionValue = 0; + double iBearRejectionValue = 0; + + // + if (isBullishRejection) + { + // + double selectedValue = iBar.low; + + // + iBullRejectionValue = + !filterPOIsUsingZones + ? selectedValue + : !hasLastBullOB + ? 0 + : IsInside( + selectedValue, + lastBullOB // + ) + ? selectedValue + : 0; + + // + iBullRejectionValue = + !filterPOIsUsingMa + ? iBullRejectionValue + : iBullRejectionValue < iMa + ? iBullRejectionValue + : 0; + } + + // + if (isBearishRejection) + { + // + double selectedValue = iBar.high; + + // + iBearRejectionValue = + !filterPOIsUsingZones + ? selectedValue + : !hasLastBearOB + ? 0 + : IsInside( + selectedValue, + lastBearOB // + ) + ? selectedValue + : 0; + + // + iBearRejectionValue = + !filterPOIsUsingMa + ? iBearRejectionValue + : iBearRejectionValue > iMa + ? iBearRejectionValue + : 0; + } + + // + bullishRejectionBuffer[bar_index] = iBullRejectionValue; + bearishRejectionBuffer[bar_index] = iBearRejectionValue; + } + + // + // Pin Buffers ... + + // + bool isPin = mXWZBarAnalyser + .IsPinBar( + iBar, + iDir, + 0, // Extends ... + 50, // Shadow Percent ... + 25 // Body Percent ... + ); + bool isBullishPin = + isPin && + IsBullish(iDir); + bool isBearishPin = + isPin && + IsBearish(iDir); + if (isPin) + { + // + double iBullPinValue = 0; + double iBearPinValue = 0; + + // + if (isBullishPin) + { + // + double selectedValue = iBar.low; + + // + iBullPinValue = + !filterPOIsUsingZones + ? selectedValue + : !hasLastBullOB + ? 0 + : IsInside( + selectedValue, + lastBullOB // + ) + ? selectedValue + : 0; + + // + iBullPinValue = + !filterPOIsUsingMa + ? iBullPinValue + : iBullPinValue < iMa + ? iBullPinValue + : 0; + } + + // + if (isBearishPin) + { + // + double selectedValue = iBar.high; + + // + iBearPinValue = + !filterPOIsUsingZones + ? selectedValue + : !hasLastBearOB + ? 0 + : IsInside( + selectedValue, + lastBearOB // + ) + ? selectedValue + : 0; + + // + iBearPinValue = + !filterPOIsUsingMa + ? iBearPinValue + : iBearPinValue > iMa + ? iBearPinValue + : 0; + } + + // + bullishPinBuffer[bar_index] = iBullPinValue; + bearishPinBuffer[bar_index] = iBearPinValue; + } + + // + // Engulf Buffers ... + + // + bool isEngulf = mXWZBarAnalyser + .IsEngulfBar( + iBar, + iDir, + 1, // Extends ... + 70 // Body Percent ... + ); + bool isBullishEngulf = + isEngulf && + IsBullish(iDir); + bool isBearishEngulf = + isEngulf && + IsBearish(iDir); + if (isEngulf) + { + // + double iBullEngulfValue = 0; + double iBearEngulfValue = 0; + + // + if (isBullishEngulf) + { + // + double selectedValue = iBar.low; + + // + iBullEngulfValue = + !filterPOIsUsingZones + ? selectedValue + : !hasLastBullOB + ? 0 + : IsInside( + selectedValue, + lastBullOB // + ) + ? selectedValue + : 0; + + // + iBullEngulfValue = + !filterPOIsUsingMa + ? iBullEngulfValue + : iBullEngulfValue < iMa + ? iBullEngulfValue + : 0; + } + + // + if (isBearishEngulf) + { + // + double selectedValue = iBar.high; + + // + iBearEngulfValue = + !filterPOIsUsingZones + ? selectedValue + : !hasLastBearOB + ? 0 + : IsInside( + selectedValue, + lastBearOB // + ) + ? selectedValue + : 0; + + // + iBearEngulfValue = + !filterPOIsUsingMa + ? iBearEngulfValue + : iBearEngulfValue > iMa + ? iBearEngulfValue + : 0; + } + + // + bullishEngulfBuffer[bar_index] = iBullEngulfValue; + bearishEngulfBuffer[bar_index] = iBearEngulfValue; + } + + // + // Swing Buffers ... + + // + bool isSwing = mXWZBarAnalyser + .IsSwing( + iBar, + iDir, + 2 // Range ... + ); + bool isSwingLow = + isSwing && + IsBullish(iDir); + bool isSwingHigh = + isSwing && + IsBearish(iDir); + if (isSwing) + { + // + double iSwingLowValue = 0; + double iSwingHighValue = 0; + + // + if (isSwingLow) + { + // + double selectedValue = iBar.low; + + // + iSwingLowValue = + !filterPOIsUsingZones + ? selectedValue + : !hasLastBullOB + ? 0 + : IsBelow( + selectedValue, + lastBullOB // + ) + ? selectedValue + : 0; + + // + iSwingLowValue = + !filterPOIsUsingMa + ? iSwingLowValue + : iSwingLowValue < iMa + ? iSwingLowValue + : 0; + } + + // + if (isSwingHigh) + { + // + double selectedValue = iBar.high; + + // + iSwingHighValue = + !filterPOIsUsingZones + ? selectedValue + : !hasLastBearOB + ? 0 + : IsAbove( + selectedValue, + lastBearOB // + ) + ? selectedValue + : 0; + + // + iSwingHighValue = + !filterPOIsUsingMa + ? iSwingHighValue + : iSwingHighValue > iMa + ? iSwingHighValue + : 0; + } + + // + swingLowBuffer[bar_index] = iSwingLowValue; + swingHighBuffer[bar_index] = iSwingHighValue; + } + + // + // + // + + // + DetectSignals( + bar_index, + prevCalculated, + ratesTotal, + open, + high, + close, + low, + tickVolume // + ); + + // + // Cleanup Resources ... + + // + iBar.Clean(); + pBar.Clean(); +} + +// +void ConfigureAlert() +{ + // + mXWZAlert.SetPrefix(ShortName); + + // + mXWZAlert.SetPushAlerts(mXWZPushAlerts); + mXWZAlert.SetMailAlerts(mXWZMailAlerts); + mXWZAlert.SetEnableAlerts(mXWZEnableAlerts); + mXWZAlert.SetTerminalAlerts(mXWZTerminalAlerts); +} + +// +void DetectSignals( + int barIndex, + const int prevCalculated, + const int ratesTotal, + const double &open[], + const double &high[], + const double &close[], + const double &low[], + const long &tickVolume[] // +) +{ + // + // Calculate Signals ... + + // + XOHCL bar; + XOHCL pBar; + XOHCL ppBar; + bool isInited = bar.Init( + _Symbol, + _Period, + barIndex // + ); + if (!isInited) + { + return; + } + + // + isInited = bar.GetPreviousBar(pBar); + if (!isInited) + { + return; + } + + // + isInited = pBar.GetPreviousBar(ppBar); + if (!isInited) + { + return; + } + + // + int pIDX = pBar.Index(); + int ppIDX = ppBar.Index(); + + // + // Reading Buffers ... + + // + double ma = maBuffer[barIndex]; + double maPrev = maBuffer[pIDX]; + double maPPrev = maBuffer[ppIDX]; + + // + // Pin Bar ... + bool isBullisPinned = bullishPinBuffer[pIDX] > 0; + bool isBearisPinned = bearishPinBuffer[pIDX] > 0; + + // + // Engulf Bar ... + bool isBullisEngulfed = bullishEngulfBuffer[pIDX] > 0; + bool isBearisEngulfed = bearishEngulfBuffer[pIDX] > 0; + + // + // Rejection Bar ... + bool isBullishRejected = bullishRejectionBuffer[pIDX] > 0; + bool isBearishRejected = bearishRejectionBuffer[pIDX] > 0; + + // + // Momentum Bar ... + bool isBullishMomentum = bullishMomentumBuffer[pIDX] > 0; + bool isBearishMomentum = bearishMomentumBuffer[pIDX] > 0; + + // + // Checking Pullback ... + ENUM_X_DIRECTION pullbackDir; + bool hasPullback = mXWZBarAnalyser.HasPullBack( + pullbackDir, + bar // + ); + bool hasBullishPullback = + hasPullback && + IsBullish(pullbackDir); + bool hasBearishPullback = + hasPullback && + IsBearish(pullbackDir); + + // + // Order Block Parsing ... + + // // + // bool isMACrossedOverBullishOB = + // // + // lastBullOB != NULL && + // lastBullOB.IsValid() && + // // + // IsInside( + // maPPrev, + // lastBullOB // + // ) && + // // + // IsAbove( + // maPrev, + // lastBullOB // + // ) + // // + // ; + + // // + // bool isMACrossedUnderBearishOB = + // // + // lastBearOB != NULL && + // lastBearOB.IsValid() && + // // + // IsInside( + // maPPrev, + // lastBearOB // + // ) && + // // + // IsBelow( + // maPrev, + // lastBearOB // + // ) + // // + // ; + + // + // Bullish ... + // -------------- + // -[] a Bullish Wave Which Crossed Over MA ... + // -[] Trend is Bullish ... + // -[] PullBack to MA ... + // -[] Has a Bllish Rejection ... + bool hasBullishSignal = + // + pBar.IsBullish() && + pBar.low < maPrev && + pBar.GetDown() >= maPrev && + // + bar.open >= ma && + // + hasBearishPullback && + // + false + // + ; + + // + // Bearish ... + // -------------- + // -[] a Bearish Wave Which Crossed Under MA ... + // -[] Trend is Bearish ... + // -[] PullBack to MA ... + // -[] Has a Bearish Rejection ... + bool hasBearishSignal = + // + false + // pBar.IsBearish() && + // pBar.high > maPrev && + // pBar.GetUp() <= maPrev && + // // + // bar.open <= ma && + // // + // true + // + ; + + // + // Draw ... + // + + // + long chartID = mXWZPOIDrawer.ChartIdentification(); + int window = mXWZPOIDrawer.SubWindowIdentification(); + + // // + // if (isMACrossedOverBullishOB) + // { + // // + // string name = + // "Bullish_" + + // ToMD5(ToFormatString(pBar.time)); + + // // + // CChartObjectVLine *iLine; + // iLine = new CChartObjectVLine(); + // bool isCreated = iLine.Create( + // chartID, + // name, + // window, + // pBar.time // + // ); + // if (isCreated) + // { + // // + // iLine.Color(clrAqua); + + // // + // mXWZDrawnObjects.Add(iLine); + // } + // } + + // // + // if (isMACrossedUnderBearishOB) + // { + // // + // string name = + // "Bearish_" + + // ToMD5(ToFormatString(pBar.time)); + + // // + // CChartObjectVLine *iLine; + // iLine = new CChartObjectVLine(); + // bool isCreated = iLine.Create( + // chartID, + // name, + // window, + // pBar.time // + // ); + // if (isCreated) + // { + // // + // iLine.Color(clrMagenta); + + // // + // mXWZDrawnObjects.Add(iLine); + // } + // } + + // + bool hasSignal = + (hasBullishSignal || + hasBearishSignal); + if (hasSignal) + { + // + long chartID = mXWZPOIDrawer.ChartIdentification(); + int window = mXWZPOIDrawer.SubWindowIdentification(); + string name = + (hasBullishSignal + ? "Bullish_" + : "Bearish_") + + "Signal_" + ToMD5(ToFormatString(bar.time)); + color signalColor = + hasBullishSignal + ? clrYellow + : clrOrange; + + // + CChartObjectVLine *iSignal; + iSignal = new CChartObjectVLine(); + bool isCreated = iSignal.Create( + chartID, + name, + window, + bar.time // + ); + if (isCreated) + { + // + iSignal.Color(signalColor); + + // + mXWZDrawnObjects.Add(iSignal); + } + + // + bool drawRR = false; + if (drawRR) + { + // + XRR iSigRR; + ENUM_X_POSITION_TYPES type = + hasBullishSignal + ? X_POSITION_TYPE_LONG + : X_POSITION_TYPE_SHORT; + double sl = hasBullishSignal + ? longSLBuffer[barIndex] + : shortSLBuffer[barIndex]; + + // + isCreated = iSigRR.Init( + _Symbol, + _Period, + sl, + bar.open, + type, + ShortName // + ); + if (!isCreated) + { + return; + } + + // + iSigRR.time = pBar.NextAt(); + + // + XCRRObject *iObj; + isCreated = mXWZPOIDrawer.CreateRR( + iSigRR, + iObj // + ); + if (isCreated) + { + mXWZDrawnObjects.Add(iObj); + } + + // + iSigRR.Clean(); + } + } + + // + bar.Clean(); + pBar.Clean(); +} + +// +// POIS Functions ... + +// +void ConfigurePOIDrawer() +{ + // + if (mXWZPOIDrawer == NULL) + { + return; + } + + // + mXWZPOIDrawer.Prefix(ShortName); + mXWZPOIDrawer.ChartIdentification(ChartID()); + mXWZPOIDrawer.SubWindowIdentification(0); + + // + mXWZPOIDrawer.BullishFVGWidth(1); + mXWZPOIDrawer.BullishFVGStyle(STYLE_DOT); + mXWZPOIDrawer.BullishFVGColor(clrAqua); + + // + mXWZPOIDrawer.BearishFVGWidth(1); + mXWZPOIDrawer.BearishFVGStyle(STYLE_DOT); + mXWZPOIDrawer.BearishFVGColor(clrMagenta); + + // + mXWZPOIDrawer.SupportZoneWidth(1); + mXWZPOIDrawer.SupportZoneStyle(STYLE_DASHDOTDOT); + mXWZPOIDrawer.SupportZoneColor(clrLime); + + // + mXWZPOIDrawer.ResistanceZoneWidth(1); + mXWZPOIDrawer.ResistanceZoneStyle(STYLE_DASHDOTDOT); + mXWZPOIDrawer.ResistanceZoneColor(clrRed); + + // + mXWZPOIDrawer.BullishOrderBlockWidth(4); + mXWZPOIDrawer.BullishOrderBlockStyle(STYLE_DASH); + mXWZPOIDrawer.BullishOrderBlockColor(clrAqua); + + // + mXWZPOIDrawer.BearishOrderBlockWidth(4); + mXWZPOIDrawer.BearishOrderBlockStyle(STYLE_DASH); + mXWZPOIDrawer.BearishOrderBlockColor(clrMagenta); +} + +// +void CalculatedPOIs( + int bar_index, // Selected Bar Index + const int prevCalculated, + const int ratesTotal, + const double &open[], + const double &high[], + const double &close[], + const double &low[], + const long &tickVolume[] // +) +{ + // + XOHCL iBar; + bool isInited = iBar.Init( + _Symbol, + _Period, + bar_index // + ); + if (!isInited) + { + // + iBar.Clean(); + return; + } + + // + XOHCL pBar; + isInited = iBar.GetPreviousBar(pBar); + if (!isInited) + { + // + iBar.Clean(); + pBar.Clean(); + return; + } + + // + // POI ... + DetectPOIs(iBar); + UpdatePOIs(iBar); + DrawPOIs(); + + // + iBar.Clean(); + pBar.Clean(); +} + +// +bool CanDetectPOIs() +{ + // + bool result = false; + + // + result = + // + mXWZDetectOrderBlocks || + mXWZDetectFairValueGaps || + mXWZDetectSupportZones || + mXWZDetectResistanceZones + // + ; + + // + return result; +} + +// +void DetectPOIs( + XOHCL &bar // +) +{ + // + if (!CanDetectPOIs()) + { + return; + } + + // + int idx = -1; + int range = 21; + + // + // Detect Order Block ... + + // + if (mXWZDetectOrderBlocks) + { + // + XOHCL obBar; + XCOrderBlock *ob; + ENUM_X_DIRECTION obDir; + bool hasOB = mXWZBarAnalyser.HasOrderBlock( + bar, + obBar, + obDir // + ); + bool hasBullishOB = + hasOB && + IsBullish(obDir); + bool hasBearishOB = + hasOB && + IsBearish(obDir); + if (hasOB) + { + // + ob = new XCOrderBlock(); + bool isInited = ob.Init(obBar, obDir); + if (isInited) + { + // + ENUM_X_DIRECTION iForDir = ob.GetDirection(); + bool isBullish = IsBullish(iForDir); + + // + // Check OB Not Activated ... + XOHCL activationBar; + bool isActivationBarBodyIn = false; + bool isActivated = ob.IsActivated( + iForDir, + activationBar, + isActivationBarBodyIn, + false, + _Period // + ); + + // + if (!isActivated) + { + // + idx = FindIndex( + ob, + mXWZUnActivatedOBs // + ); + if (!IsValidIndex(idx)) + { + // + if (isBullish) + { + lastBullOB = ob; + } + else + { + lastBearOB = ob; + } + + // + Add( + ob, + mXWZUnActivatedOBs // + ); + } + } + else + { + // + idx = FindIndex( + ob, + mXWZActivatedOBs // + ); + if (!IsValidIndex(idx)) + { + // + ob.To(activationBar.time); + + // + Add( + ob, + mXWZActivatedOBs // + ); + } + } + + // + activationBar.Clean(); + } + } + + // + obBar.Clean(); + } + + // + // Detect Fair Value Gap ... + + // + if (mXWZDetectFairValueGaps) + { + // + XOHCL fvgStartBar; + XOHCL fvgEndBar; + XCFVG *fvg; + ENUM_X_DIRECTION fvgDir; + bool hasFVG = mXWZBarAnalyser.HasFairValueGap( + bar, + fvgStartBar, + fvgEndBar, + fvgDir // + ); + bool hasBullishFVG = + hasFVG && + IsBullish(fvgDir); + bool hasBearishFVG = + hasFVG && + IsBearish(fvgDir); + if (hasFVG) + { + // + fvg = new XCFVG(); + bool isInited = fvg.Init( + fvgStartBar, + fvgEndBar, + fvgDir // + ); + if (isInited) + { + // + ENUM_X_DIRECTION iForDir = fvg.GetDirection(); + bool isBullish = IsBullish(iForDir); + + // + // Check OB Not Activated ... + XOHCL activationBar; + bool isActivationBarBodyIn = false; + bool isActivated = fvg.IsActivated( + iForDir, + activationBar, + isActivationBarBodyIn, + false, + _Period // + ); + + // + if (!isActivated) + { + // + idx = FindIndex( + fvg, + mXWZUnActivatedFVGs // + ); + if (!IsValidIndex(idx)) + { + // + if (isBullish) + { + lastBullFVG = fvg; + } + else + { + lastBearFVG = fvg; + } + + // + Add( + fvg, + mXWZUnActivatedFVGs // + ); + } + } + else + { + // + idx = FindIndex( + fvg, + mXWZActivatedFVGs // + ); + if (!IsValidIndex(idx)) + { + // + fvg.To(activationBar.time); + + // + Add( + fvg, + mXWZActivatedFVGs // + ); + } + } + + // + activationBar.Clean(); + } + } + + // + fvgEndBar.Clean(); + fvgStartBar.Clean(); + } + + // + // Detect Support Zone ... + + // + if (mXWZDetectSupportZones) + { + // + XOHCL supportBar; + XCSupportZone *supportZone; + bool hasSupport = mXWZBarAnalyser + .HasSupport( + bar, + supportBar, + range // + ); + if (hasSupport) + { + // + supportZone = new XCSupportZone(); + hasSupport = supportZone.Init( + supportBar, + range, + true // Use Range As Start ... + ); + + // + if (hasSupport) + { + // + // Check OB Not Activated ... + XOHCL activationBar; + bool isActivationBarBodyIn = false; + bool isActivated = supportZone.IsActivated( + X_DIRECTION_BULLISH, + activationBar, + isActivationBarBodyIn, + false, + _Period // + ); + + // + if (!isActivated) + { + // + idx = FindIndex( + supportZone, + mXWZUnActivatedSupportZones // + ); + hasSupport = !IsValidIndex(idx); + if (hasSupport) + { + // + lastSupport = supportZone; + + // + Add( + supportZone, + mXWZUnActivatedSupportZones // + ); + } + } + else + { + // + idx = FindIndex( + supportZone, + mXWZActivatedSupportZones // + ); + hasSupport = !IsValidIndex(idx); + if (hasSupport) + { + // + supportZone.To(activationBar.time); + + // + Add( + supportZone, + mXWZActivatedSupportZones // + ); + } + } + + // + activationBar.Clean(); + } + } + + // + supportBar.Clean(); + } + + // + // Detect Resistance Zone ... + + // + if (mXWZDetectResistanceZones) + { + // + XOHCL resistaneBar; + XCResistanceZone *resistanceZone; + bool hasResistance = mXWZBarAnalyser + .HasResistance( + bar, + resistaneBar, + range // + ); + if (hasResistance) + { + // + resistanceZone = new XCResistanceZone(); + hasResistance = resistanceZone.Init( + resistaneBar, + range, + true // Use Range As Start ... + ); + + // + if (hasResistance) + { + // + // Check OB Not Activated ... + XOHCL activationBar; + bool isActivationBarBodyIn = false; + bool isActivated = resistanceZone.IsActivated( + X_DIRECTION_BULLISH, + activationBar, + isActivationBarBodyIn, + false, + _Period // + ); + + // + if (!isActivated) + { + // + idx = FindIndex( + resistanceZone, + mXWZUnActivatedResistanceZones // + ); + hasResistance = !IsValidIndex(idx); + if (hasResistance) + { + // + lastResistance = resistanceZone; + + // + Add( + resistanceZone, + mXWZUnActivatedResistanceZones // + ); + } + } + else + { + // + idx = FindIndex( + resistanceZone, + mXWZActivatedResistanceZones // + ); + hasResistance = !IsValidIndex(idx); + if (hasResistance) + { + // + resistanceZone.To(activationBar.time); + + // + Add( + resistanceZone, + mXWZActivatedResistanceZones // + ); + } + } + + // + activationBar.Clean(); + } + } + + // + resistaneBar.Clean(); + } + + // +} + +// +void UpdatePOIs( + XOHCL &bar // +) +{ + // + int count = -1; + bool has = false; + bool resetDraws = false; + + // + if (!bar.IsValid()) + { + return; + } + + // + datetime to = bar.time; + + // + // Order Blocks ... + + // + count = ArraySize(mXWZUnActivatedOBs); + has = IsValidSize(count); + if (has) + { + // + XCOrderBlock *tmps[]; + for (int i = 0; i < count; i++) + { + // + // Update To ... + mXWZUnActivatedOBs[i].To(to); + + // + // Check Activation ... + + // + // Check OB Not Activated ... + XOHCL activationBar; + bool isActivationBarBodyIn = false; + bool isActivated = mXWZUnActivatedOBs[i] + .IsActivated( + mXWZUnActivatedOBs[i].GetDirection(), + activationBar, + isActivationBarBodyIn, + false, + _Period // + ); + + // + activationBar.Clean(); + + // + if (!isActivated) + { + // + Add( + mXWZUnActivatedOBs[i], + tmps // + ); + } + else + { + // + Add( + mXWZUnActivatedOBs[i], + mXWZActivatedOBs // + ); + } + } + + // + Copy( + tmps, + mXWZUnActivatedOBs // + ); + } + + // + count = ArraySize(mXWZActivatedOBs); + has = IsValidSize(count); + if (has) + { + // + // Remove UnWorks / Breaked Zones ... + int removeIDX[]; + for (int i = 0; i < count; i++) + { + // + XCOrderBlock *iZone = mXWZActivatedOBs[i]; + + // + XOHCL passedBar; + bool isBodyOut = false; + ENUM_X_DIRECTION iForDir = iZone.GetDirection(); + + // + // Check Works ... + bool isWorked = iZone.IsWorked( + iForDir, + passedBar, + isBodyOut, + true, + false, + false, + _Period // + ); + if (!isWorked) + { + // + Add( + i, + removeIDX // + ); + + // + passedBar.Clean(); + break; + } + + // + passedBar.Clean(); + } + + // + if (HasChild(removeIDX)) + { + // + resetDraws = true; + + // + count = ArraySize(removeIDX); + for (int i = 0; i < count; i++) + { + // + ArrayRemove( + mXWZActivatedOBs, + removeIDX[i], + 1 // + ); + } + } + + // + Clean(removeIDX); + } + + // + // Fair Value Gaps ... + + // + count = ArraySize(mXWZUnActivatedFVGs); + has = IsValidSize(count); + if (has) + { + // + XCFVG *tmps[]; + for (int i = 0; i < count; i++) + { + // + // Update To ... + mXWZUnActivatedFVGs[i].To(to); + + // + // Check Activation ... + + // + // Check OB Not Activated ... + XOHCL activationBar; + bool isActivationBarBodyIn = false; + bool isActivated = mXWZUnActivatedFVGs[i] + .IsActivated( + mXWZUnActivatedFVGs[i].GetDirection(), + activationBar, + isActivationBarBodyIn, + false, + _Period // + ); + + // + activationBar.Clean(); + + // + if (!isActivated) + { + // + Add( + mXWZUnActivatedFVGs[i], + tmps // + ); + } + else + { + // + Add( + mXWZUnActivatedFVGs[i], + mXWZActivatedFVGs // + ); + } + } + + // + Copy( + tmps, + mXWZUnActivatedFVGs // + ); + } + + // + count = ArraySize(mXWZActivatedFVGs); + has = IsValidSize(count); + if (has) + { + // + // Remove UnWorks / Breaked Zones ... + int removeIDX[]; + for (int i = 0; i < count; i++) + { + // + XCFVG *iZone = mXWZActivatedFVGs[i]; + + // + XOHCL passedBar; + bool isBodyOut = false; + ENUM_X_DIRECTION iForDir = iZone.GetDirection(); + + // + // Check Works ... + bool isWorked = iZone.IsWorked( + iForDir, + passedBar, + isBodyOut, + true, + false, + false, + _Period // + ); + if (!isWorked) + { + // + Add( + i, + removeIDX // + ); + + // + passedBar.Clean(); + break; + } + + // + passedBar.Clean(); + } + + // + if (HasChild(removeIDX)) + { + // + resetDraws = true; + + // + count = ArraySize(removeIDX); + for (int i = 0; i < count; i++) + { + // + ArrayRemove( + mXWZActivatedFVGs, + removeIDX[i], + 1 // + ); + } + } + + // + Clean(removeIDX); + } + + // + // Support Zones ... + + // + count = ArraySize(mXWZUnActivatedSupportZones); + has = IsValidSize(count); + if (has) + { + // + XCSupportZone *tmps[]; + for (int i = 0; i < count; i++) + { + // + // Update To ... + mXWZUnActivatedSupportZones[i].To(to); + + // + // Check Activation ... + + // + // Check OB Not Activated ... + XOHCL activationBar; + bool isActivationBarBodyIn = false; + bool isActivated = mXWZUnActivatedSupportZones[i] + .IsActivated( + X_DIRECTION_BULLISH, + activationBar, + isActivationBarBodyIn, + false, + _Period // + ); + + // + if (!isActivated) + { + // + Add( + mXWZUnActivatedSupportZones[i], + tmps // + ); + } + else + { + // + mXWZUnActivatedSupportZones[i].To(activationBar.time); + + // + Add( + mXWZUnActivatedSupportZones[i], + mXWZActivatedSupportZones // + ); + } + + // + activationBar.Clean(); + } + + // + Copy( + tmps, + mXWZUnActivatedSupportZones // + ); + } + + // + count = ArraySize(mXWZActivatedSupportZones); + has = IsValidSize(count); + if (has) + { + // + // Remove UnWorks / Breaked Zones ... + int removeIDX[]; + ENUM_X_DIRECTION iForDir = X_DIRECTION_BULLISH; + for (int i = 0; i < count; i++) + { + // + XCSupportZone *iZone = mXWZActivatedSupportZones[i]; + + // + XOHCL passedBar; + bool isBodyOut = false; + + // + // Check Works ... + bool isWorked = iZone.IsWorked( + iForDir, + passedBar, + isBodyOut, + true, + false, + false, + _Period // + ); + if (!isWorked) + { + // + Add( + i, + removeIDX // + ); + + // + passedBar.Clean(); + break; + } + + // + passedBar.Clean(); + } + + // + if (HasChild(removeIDX)) + { + // + resetDraws = true; + + // + count = ArraySize(removeIDX); + for (int i = 0; i < count; i++) + { + // + ArrayRemove( + mXWZActivatedSupportZones, + removeIDX[i], + 1 // + ); + } + } + + // + Clean(removeIDX); + } + + // + // Resistance Zones ... + + // + count = ArraySize(mXWZUnActivatedResistanceZones); + has = IsValidSize(count); + if (has) + { + // + XCResistanceZone *tmps[]; + for (int i = 0; i < count; i++) + { + // + // Update To ... + mXWZUnActivatedResistanceZones[i].To(to); + + // + // Check Activation ... + + // + // Check OB Not Activated ... + XOHCL activationBar; + bool isActivationBarBodyIn = false; + bool isActivated = mXWZUnActivatedResistanceZones[i] + .IsActivated( + X_DIRECTION_BULLISH, + activationBar, + isActivationBarBodyIn, + false, + _Period // + ); + + // + if (!isActivated) + { + // + Add( + mXWZUnActivatedResistanceZones[i], + tmps // + ); + } + else + { + // + mXWZUnActivatedResistanceZones[i].To(activationBar.time); + + // + Add( + mXWZUnActivatedResistanceZones[i], + mXWZActivatedResistanceZones // + ); + } + + // + activationBar.Clean(); + } + + // + Copy( + tmps, + mXWZUnActivatedResistanceZones // + ); + } + + // + count = ArraySize(mXWZActivatedResistanceZones); + has = IsValidSize(count); + if (has) + { + // + // Remove UnWorks / Breaked Zones ... + int removeIDX[]; + ENUM_X_DIRECTION iForDir = X_DIRECTION_BEARISH; + for (int i = 0; i < count; i++) + { + // + XCResistanceZone *iZone = mXWZActivatedResistanceZones[i]; + + // + XOHCL passedBar; + bool isBodyOut = false; + + // + // Check Breake ... + bool isBreaked = iZone.IsBreaked( + iForDir, + passedBar, + isBodyOut, + true, + false, + _Period // + ); + if (isBreaked) + { + // + Add( + i, + removeIDX // + ); + + // + passedBar.Clean(); + break; + } + + // + // Check Works ... + bool isWorked = iZone.IsWorked( + iForDir, + passedBar, + isBodyOut, + true, + false, + false, + _Period // + ); + if (!isWorked) + { + // + Add( + i, + removeIDX // + ); + + // + passedBar.Clean(); + break; + } + + // + passedBar.Clean(); + } + + // + if (HasChild(removeIDX)) + { + // + resetDraws = true; + + // + count = ArraySize(removeIDX); + for (int i = 0; i < count; i++) + { + // + ArrayRemove( + mXWZActivatedResistanceZones, + removeIDX[i], + 1 // + ); + } + } + + // + Clean(removeIDX); + } + + // + // + // + + // + // Clean Draws if has to ... + if (resetDraws) + { + mXWZDrawnObjects.Clear(); + } + + // +} + +// +void DrawPOIs() +{ + // + int count = 0; + bool has = false; + bool isCreated = false; + + // + if (!showPOIs) + { + return; + } + + // + // Order Blocks ... + if (showOrderBlocks) + { + // + bool showBullishOrderBlocks = true; + bool showBearishOrderBlocks = true; + + // + // UnActivated ... + count = ArraySize(mXWZUnActivatedOBs); + has = IsValidSize(count); + if (has) + { + // + for (int i = 0; i < count; i++) + { + // + bool isBullish = mXWZUnActivatedOBs[i].IsBullish(); + + // + if ((isBullish && + showBullishOrderBlocks) || + (!isBullish && + showBearishOrderBlocks)) + { + // + XCBaseObject *iObj; + isCreated = mXWZPOIDrawer + .CreateOrderBlock( + mXWZUnActivatedOBs[i], + iObj // + ); + if (isCreated) + { + mXWZDrawnObjects.Add(iObj); + } + } + } + } + + // + // Activated ... + count = ArraySize(mXWZActivatedOBs); + has = IsValidSize(count); + if (has) + { + // + for (int i = 0; i < count; i++) + { + // + XCOrderBlock *iOB = mXWZActivatedOBs[i]; + + // + bool isBullish = iOB.IsBullish(); + + // + if (showActivatedPOIs && + ((isBullish && + showBullishOrderBlocks) || + (!isBullish && + showBearishOrderBlocks))) + { + // + XCBaseObject *iObj; + isCreated = mXWZPOIDrawer + .CreateOrderBlock( + iOB, + iObj // + ); + if (isCreated) + { + // + // if (isBullish) + // { + // ((XCBullishOrderBlockObject *)iObj).ZoneFill(true); + // } + // else + // { + // ((XCBearishOrderBlockObject *)iObj).ZoneFill(true); + // } + + // + mXWZDrawnObjects.Add(iObj); + } + } + } + } + } + + // + // Fair Value Gaps ... + if (showFairValueGaps) + { + // + bool showBullishFairValueGaps = true; + bool showBearishFairValueGaps = true; + + // + // UnActivated ... + count = ArraySize(mXWZUnActivatedFVGs); + has = IsValidSize(count); + if (has) + { + // + for (int i = 0; i < count; i++) + { + // + bool isBullish = mXWZUnActivatedFVGs[i].IsBullish(); + + // + if ((isBullish && + showBullishFairValueGaps) || + (!isBullish && + showBearishFairValueGaps)) + { + // + XCBaseObject *iObj; + isCreated = mXWZPOIDrawer + .CreateFairValueGap( + mXWZUnActivatedFVGs[i], + iObj // + ); + if (isCreated) + { + mXWZDrawnObjects.Add(iObj); + } + } + } + } + + // + // Activated ... + count = ArraySize(mXWZActivatedFVGs); + has = IsValidSize(count); + if (has) + { + // + for (int i = 0; i < count; i++) + { + // + XCFVG *iFVG = mXWZActivatedFVGs[i]; + + // + bool isBullish = iFVG.IsBullish(); + + // + if (showActivatedPOIs && + ((isBullish && + showBullishFairValueGaps) || + (!isBullish && + showBearishFairValueGaps))) + { + XCBaseObject *iObj; + isCreated = mXWZPOIDrawer + .CreateFairValueGap( + iFVG, + iObj // + ); + if (isCreated) + { + // + // if (isBullish) + // { + // ((XCBullishOrderBlockObject *)iObj).ZoneFill(true); + // } + // else + // { + // ((XCBearishOrderBlockObject *)iObj).ZoneFill(true); + // } + + // + mXWZDrawnObjects.Add(iObj); + } + } + } + } + } + + // + // Support Zones ... + if (showSupportZones) + { + // + // UnActivated ... + count = ArraySize(mXWZUnActivatedSupportZones); + has = IsValidSize(count); + if (has) + { + // + for (int i = 0; i < count; i++) + { + // + XCSupportZoneObject *iObj; + isCreated = mXWZPOIDrawer + .CreateSupportZone( + mXWZUnActivatedSupportZones[i], + iObj // + ); + if (isCreated) + { + mXWZDrawnObjects.Add(iObj); + } + } + } + + // + // Activated ... + if (showActivatedPOIs) + { + // + count = ArraySize(mXWZActivatedSupportZones); + has = IsValidSize(count); + if (has) + { + // + for (int i = 0; i < count; i++) + { + // + XCSupportZoneObject *iObj; + isCreated = mXWZPOIDrawer + .CreateSupportZone( + mXWZActivatedSupportZones[i], + iObj // + ); + if (isCreated) + { + mXWZDrawnObjects.Add(iObj); + } + } + } + } + } + + // + // Resistance Zones ... + if (showResistanceZones) + { + // + // UnActivated ... + count = ArraySize(mXWZUnActivatedResistanceZones); + has = IsValidSize(count); + if (has) + { + // + for (int i = 0; i < count; i++) + { + // + XCResistanceZoneObject *iObj; + isCreated = mXWZPOIDrawer + .CreateResistanceZone( + mXWZUnActivatedResistanceZones[i], + iObj // + ); + if (isCreated) + { + mXWZDrawnObjects.Add(iObj); + } + } + } + + // + // Activated ... + if (showActivatedPOIs) + { + // + count = ArraySize(mXWZActivatedResistanceZones); + has = IsValidSize(count); + if (has) + { + // + for (int i = 0; i < count; i++) + { + // + XCResistanceZoneObject *iObj; + isCreated = mXWZPOIDrawer + .CreateResistanceZone( + mXWZActivatedResistanceZones[i], + iObj // + ); + if (isCreated) + { + mXWZDrawnObjects.Add(iObj); + } + } + } + } + } + + // +} + +// \ No newline at end of file diff --git a/BKPS/14031206/Libraries/x-saherelm.common.lib.ex5 b/BKPS/14031206/Libraries/x-saherelm.common.lib.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..2d7b732ccfa437b7adb89df485d072c9b75869b7 GIT binary patch literal 5792 zcmdT?Ra_L_wjLb1JBDr$7)H9JB}5wO?yjLrx}-rV32Bh7p~C?|q*Fp^kQj#Uxc<+* z=j}Y4*Spqlt+m(p?fvkrwO{EA0zCkjBmh*vzijLO>i>2Cz(|64RTBCd3blPr494tI z)W7lnw)$ZJ0RO~)vRb`j6*%5E$`|Ck_`l>Zx%ZT|AF0L}oHzlbtG=Wmw# zi@E;2{SWj1+5S=N^>+eLfEa-HulxSX!GHUI>$drqZt&mv{Qp+^pSSb^0RFpe$bTmP z3)D$35Acj{9`%O9#(|uoi3loXZ!0bXaFcEsQ#HYB;V~F=D^zGmHRX`%*&!k|QHI_9 zLgF<@)vlSlF^d&OywaW#w*V2-I>7=yfP@^#p7!Kyq3li2-;C}Z_j!JCV#a5`^=q*+h#GEown8KNv ze~+n&NkQc&O`F|2j6DHD^jf6@Z%E16^beUd+K?daJlP-aE2M9;Hre%J7O|zmn>Hz9 ziVsa9{aF!V#~^pF*@>Zbs(|RykNb(Xr3kRfRlsGFoxEby-5PU}b?5 zXeA1ZbS}K)Q8D4KE*dassK<`^#+$s|;NhO-dCRA=N4EwjGlOQ8eSV!TNEmHs?qXuo z%X1iuhyH{sO{nRc?_1I(0U5x6i$$OQIbIbDcmWQ3!wkgz-H!rma#$B~~1-*6QnR_R#qpp6~x9(s|U~ufFO4Z!`_1H*!lFzB# z!af52kbIr2Yq_OV^Mv&_~CK4%-%dY$|}=JF)1%p`1)N#H{r>{`_NnbqJ)0iwhGHFCRH~ zIdQh>k!2(LT65*SC9iYj67tR&R;TRx z+kL-woxN^OGE$pF$d~9W>vAPpQ{tZ@xT}b=IOt(O;(KnD_>vlpYMj9d*dvUuTEI~& zWQ+HcmiunKfJS?3gCo|6cv7bo&u7VJ?3;8H5sMg&09Q{hR{Y2>j4EYthC$16!?6w|tJ# zZsgue%!QHBb9yhp{6Q>!tA3wnHCA7ALY5U1nUXlp*+-7ffg>RZC-`-)N=w!Nul!_Q z6=5v%k}w(<3wB|9Ek7_F6xwB9$Cf0IV6qa8zUh~HW{N(#f?+CbXgq*-MOmd!URA|* z|2Yst7&*c;kZKcqu**L@6JjA;qTlNC)z2$;W7?q4Q z$Jdc@vi|k;RZqx=C+X2a$+7dt7MdP+g_JbCgiHmpGfL>Q?2lQ&v8dwnh4v*W$C)>{A@X`>A z?=!pD#pqo>E9q5T=4M)9vxeDR_tE+86|A{gecl{;fr>Bv~ilnFL33>iH%)PKbc(vXa)uw{y6HwtV zx)hqQ{W3ZK6nJ=&C7UpIkahG2)~mo3(Y>f}{XQ@5p8dWAu1T=(Vtr_pQjW>CxK>o~td+2LS{QbuPYP zMnVGT6Hngw(kX?ftMN)hV8O1IDB9C73i z*+^zL42Buyzw;M!XVZ`Rpea!!1vN`N8Pgv-6>NG#6t8VSQN!=2$#?;%7Wg?!h}*$BdL>IC_4|bN#ZE# zGkx6HU`9+p_!0YKtT#szHT!1?Sj3_ZewpAD50$`TB8&F{UiVm88DGkTXgkHqph3tV zA8Vju+B~{YZ2Qp*%d{a}4QaG&E0au#sp*AJnaN!_ERcMC(Md zuXggWozC5Jn=23X9A=QmiZrs_erJUW?RL{ViCpWv8<%59$Y`djU`|}fM;6{2CAw)g zG|#kbeU4eE(C0}y*{s5Z^25eD;q{{S7{+wZAKF}+jQBp{D#&jGK*NF899OAxCNzZ~ zQz?kuMzJW8ANRVOk#Jko4ZmJ4b|E_ynarbRWIk0Z>oL7JJUs2EG;o}*fqoT#_C@e9 z5ztpm#+j3QcuiD&Mq@o_rhKDC?bsk3Wn0A?Ymfl7dhTVvBxjjU_3N~Wxm29+lbx?Nx#YnYrCpoQbXB!(+}vs&n9&0m zGD`MZ^CTHf4oyBTlQKP7Q|CPz$yOxDR;^$Ck{_HbPoGvenY{A(VT|;uW81Fqx#$-@ zFp;DTzR%M3D;Gtj;#CbK=)q?2-+Qq&8LV^qw8esKi8HPepevN*N?v&*JACzt#%VJa z_;96QXu0cV{k{6l><(hAV$b7xpfzMy}t|DzO zqK1w&KQmgM?xY<~5Ut~p&7M$}A%$LZze7T2gPF-H6W$gb$0R2ZBV;U75a47f7aZpX z!!fU%YNe(D&WE)%h)6&uhlQ$)y zH-f#jsj06$ro*m2eT;Ajg1WS^%SWapA6ek_CrFQ;syEyG9EzrPeOVQ+Y@SLbGVj*n zngVt^!hGz)fE3EsX!(pD^9Hmm6s#+8G~+_tAup3;P$&?ZOW>J#=!~VG{-yM{3o>n+ zu-idhfe?c&FcCV8pyvM9cusn<;cp(_MiRxQ!yOQuq&jP$$O=uG;mV&LnYe13m>G4-_JVd zqOpD(kK&T}Qux+B#Jfa-f|kLXpO@rn^~^Wt6a1 z-w(Wg7rYy-?|7AAv?6y+xB^=T{SihMn&h&c)Z$OzA);C$^}P#QDQQ*^13?EnD)F)S z(Sgi!vTD|j{uTTnH5MC8&=tWT<2f^?9Ly}LCNmc^ygWc)m384#1H=$DUI@dgIsMJa z>xkylb|2fr=)Ry?=MTrQNk2pr(rfT!k#!GbDp1yzt{Ga+#oPTs5@NoKk*Xns zN>7i#@QhfcpmSN8baQm9ns^|h8<*@lBdSym^-Ubp8P8BnP6MtsWmoQ)InrXEx)fEBk_k{AQZZ5pG$E^L|J?SS~}QRgfm=1?e_>`3YUl77-ap;fZYq zfRz?2vT)&cdcl|I_Fg_J$>P-bL9Q1h>RL%(88&EVl87>F8Hq&`8_r z`u)95s>(dXHlpzbV0Wcg#uVIVI}MQhv9DK42eHjcj=Qyh?wB!H z1{+6^VA5_ntF_7uEr(~|dNn$))Vo1tZziG8h_U>7JCSHag*5P>7j8FNCG-T0C zKecgJg=|ojLNW^)3QIs2RD2|#hB)YIJ6)$noR~;B9fvEu%Gik;x48D~OI4M*bnJO# zCF$4vTpLb)*ty_LwUi6NjVV?)RP{ujABQ)j zz!zp=#sK5+jo^aDJiW{@O#Ih(C^q0;Xz!@edE$Z|t&Gr4dUNwfTz%_ogN%=55c;oV zb*@SBAd5O|%7a_3&qJ4_R?=u#OcctRw@yWyuvoTvj(}`Hx|PP;?!x=5@lkp?<;y0O z{o=A~76XI+K+8X8$V&T>EVs?G@&{FRTRDO_Onft69rD9my=J$0TJoI+@rVwcK1QRL zVIUf&@`zm~ty{F*M->+0f>c|XF?J~b8+F!&DT29Yhpv>|C8+NN260eYWbR+w2W5JM^T*yLYo}CryWb&f$hLhJ>%a{#-`&Gq6e{LI^hdXda!&p z_$8_IBio1j6R(?=2pRh^)Adaa3MDL$kjGjqlieG?IbyDZ2%;2QVw=+HR;G)m9=BUj zsJ!}Ru)V`Kmx6iTL{i7qJ%QQz$9LuwrFoAXT%g=B{e&-V42gk2tF54DS;3k^o4vE@ zDzQOXs;Ld+lvSa0f6czs_--lF#P4%~JniGl^CQa@4VD(ehtx^9`}`NOe00J!gFnxE IgtF}Z2WR~7`~Uy| literal 0 HcmV?d00001 diff --git a/BKPS/14031206/Libraries/x-saherelm.common.lib.mq5 b/BKPS/14031206/Libraries/x-saherelm.common.lib.mq5 new file mode 100644 index 0000000..343da30 --- /dev/null +++ b/BKPS/14031206/Libraries/x-saherelm.common.lib.mq5 @@ -0,0 +1,10682 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 Common Library +// -------------------------------------- +// Name: XCommonLib +// 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 + +// +// Imports ... +#include "../Classes/x-saherelm.x-md5.class.mq5" + +// +#include + +// +// Models ... + +// +// Specified Price Type ... +enum ENUM_X_PRICE +{ + X_PRICE_HIGH, + X_PRICE_OPEN, + X_PRICE_CLOSE, + X_PRICE_LOW, + X_PRICE_UP, + X_PRICE_DOWN +}; + +// +enum ENUM_X_DIRECTION +{ + X_DIRECTION_ALL, // All + X_DIRECTION_NONE, // None + X_DIRECTION_BULLISH, // Bullish + X_DIRECTION_BEARISH, // Bearish +}; + +// +enum ENUM_X_FIBO_LEVELS +{ + X_FIBO_LEVEL_236, + X_FIBO_LEVEL_382, + X_FIBO_LEVEL_500, + X_FIBO_LEVEL_618, + X_FIBO_LEVEL_764, +}; + +// +double GetFiboLevelValue(ENUM_X_FIBO_LEVELS value) +{ + // + double result = 0; + + // + switch (value) + { + // + case X_FIBO_LEVEL_236: + result = 0.236; + break; + + // + case X_FIBO_LEVEL_382: + result = 0.382; + break; + + // + case X_FIBO_LEVEL_500: + result = 0.500; + break; + + // + case X_FIBO_LEVEL_618: + result = 0.618; + break; + + // + case X_FIBO_LEVEL_764: + result = 0.764; + break; + } + + // + return result; +} + +// +string ToString(ENUM_X_DIRECTION value) +{ + // + string result = NULL; + + // + switch (value) + { + case X_DIRECTION_ALL: + result = "ALL"; + break; + case X_DIRECTION_NONE: + result = "NONE"; + break; + case X_DIRECTION_BULLISH: + result = "BULLISH"; + break; + case X_DIRECTION_BEARISH: + result = "BEARISH"; + break; + } + + // + return result; +} + +// +// Swing Types Enum ... +enum ENUM_X_SWING_TYPE +{ + X_NO_SWING = 0, + X_SWING_HIGH = 1, + X_SWING_LOW = -1, +}; + +// +string ToString(ENUM_X_SWING_TYPE value) +{ + // + string result = NULL; + + // + switch (value) + { + // + case X_NO_SWING: + result = "NO_SWING"; + break; + + // + case X_SWING_LOW: + result = "SWING_LOW"; + break; + + // + case X_SWING_HIGH: + result = "SWING_HIGH"; + break; + } + + // + return result; +} + +// +ENUM_SERIESMODE ToSeriesMode(ENUM_X_SWING_TYPE value) +{ + // + ENUM_SERIESMODE result = MODE_HIGH; + + // + switch (value) + { + // + case X_SWING_HIGH: + result = MODE_HIGH; + break; + + // + case X_SWING_LOW: + result = MODE_LOW; + break; + } + + // + return result; +} + +// +// Find Swing Points ... +int FindSwing( + string mSymbol, // Trading Symbol ... + ENUM_TIMEFRAMES mPeriod, // Trading Period ... + ENUM_X_SWING_TYPE mMode, // Swing Based On Price mode ... + int mLength, // Loopback ... + int bar_index // BarIndex ... +) +{ + // + int result = -1; + + // + if (StringLen(mSymbol) == 0 || (mMode != X_SWING_HIGH && mMode != X_SWING_LOW)) + { + return result; + } + + // + int current = bar_index; + int founded = FindNextSwing( + mSymbol, + mPeriod, + mMode, + (mLength * 2) + 1, + current - mLength); + + // + while (founded != current) + { + // + current = FindNextSwing( + mSymbol, + mPeriod, + mMode, + mLength, + current + 1); + + // + founded = FindNextSwing( + mSymbol, + mPeriod, + mMode, + (mLength * 2) + 1, + current - mLength); + } + + // + result = current; + + // + return result; +} + +// +// Find Next Swing ... +int FindNextSwing( + string mSymbol, // Trading Symbol ... + ENUM_TIMEFRAMES mPeriod, // Trading Period ... + ENUM_X_SWING_TYPE mMode, // Swing Based On Price mode ... + int mLength, // Loopback ... + int bar_index // BarIndex ... +) +{ + // + int result = -1; + + // + if (bar_index < 0) + { + mLength += bar_index; + bar_index = 0; + } + + // + ENUM_SERIESMODE mSeriesMode = ToSeriesMode(mMode); + + // + result = mMode == X_SWING_HIGH + ? iHighest( + mSymbol, + mPeriod, + mSeriesMode, + mLength, + bar_index) + : iLowest( + mSymbol, + mPeriod, + mSeriesMode, + mLength, + bar_index); + + // + return result; +} + +// +// XPERIOD Calculation Method ... +enum ENUM_X_PERIOD_METHOD +{ + // + X_PERIOD_NOTHING, // Nothing + X_PERIOD_AUTO, // Auto Select + X_PERIOD_MANUALLY // Manually +}; + +// +// Available Market Cycles ... +enum ENUM_X_MARKET_CYCLES +{ + // + X_MARKET_CYCLE_UNKNOWN, // Unknown Cycle + X_MARKET_CYCLE_SHORT, // Short Cycle + X_MARKET_CYCLE_MEDIUM, // Medium Cycle + X_MARKET_CYCLE_LONG, // Long Cycle + X_MARKET_CYCLE_HIND, // Hind Cycle +}; + +// +// Structs ... + +// +// Model Specified Ticks Info ... +struct XTick +{ + // + string symbol; // Symbol ... + datetime time; // Time ... + double bid; // Bid ... + double ask; // Ask ... + double spread; // Spread ... + long volume; // Volume ... + + // + // Constructor ... + void XTick() + { + Clean(); + } + + // + // Tools Functions ... + + /** + * Initial ... + * + * @param _symbol: Symbol ... + * @param _time: Time ... + * @param _bid: Bid Price ... + * @param _ask: Ask Price ... + * @param _volume: Tick Volume ... + */ + bool Init( + string _symbol, + datetime _time, + double _bid, + double _ask, + double _spread, + long _volume // + ) + { + // + bool result = false; + + // + result = IsValid(_symbol) && + IsValid(_time) && + _bid > 0 && + _ask > 0; + if (!result) + { + return result; + } + + // + bid = _bid; + ask = _ask; + time = _time; + symbol = _symbol; + spread = _spread; + + // + result = IsValid(); + + // + return result; + } + + /** + * Init Tick by Symbol ... + * + * @param _symbol: String ... + * + * @return ( bool ) + */ + bool Init( + string _symbol, + ENUM_TIMEFRAMES _volumePeriod = NULL // + ) + { + // + bool result = false; + + // + result = IsValid(_symbol); + if (!result) + { + return result; + } + + // + datetime _time = TimeCurrent(); + double _bid = GetBid(_symbol); + double _ask = GetAsk(_symbol); + double _spread = GetSpread(_symbol); + + // + long _volume = 0; + if (IsValid(_volumePeriod)) + { + _volume = iTickVolume(_symbol, _volumePeriod, 0); + } + + // + result = Init( + _symbol, + _time, + _bid, + _ask, + _spread, + _volume // + ); + + // + return result; + } + + /** + * Cleanup ... + */ + void Clean() + { + // + bid = 0; + ask = 0; + volume = 0; + time = NULL; + symbol = NULL; + + // + ZeroMemory(this); + } + + /** + * Validate ... + * + * @return ( bool ) + */ + bool IsValid() + { + // + bool result = false; + + // + result = IsValid(symbol) && + IsValid(time) && + bid > 0 && + ask > 0 && + volume >= 0; + + // + return result; + } + + // +}; + +// +// Model a Bar Remains Time ... +struct XBarRemainsTime +{ + // + int days; + int hours; + int minutes; + int seconds; + + // + // Constructor ... + XBarRemainsTime() + { + Clean(); + } + + // + // Always Calculate Current 0 Bar Timing ... + bool Init( + string mSymbol = NULL, // Trading Symbol + ENUM_TIMEFRAMES mPeriod = NULL // Trading Period + ) + { + // + bool result = false; + + // + mSymbol = NormalizeSymbol(mSymbol); + mPeriod = NormalizePeriod(mPeriod); + + // + int minuteSecoonds = 60; + int hourSeconds = minuteSecoonds * 60; + int daySeconds = 24 * hourSeconds; + + // + int periodSeconds = PeriodSeconds( + mPeriod); + datetime startTime = GetBarTime( + mSymbol, + mPeriod, + 0 + // + ); + + // + int secondsDiff = (int)startTime + periodSeconds - (int)TimeCurrent(); + + // + int mWorkingSecondsDiff = secondsDiff; + if (mWorkingSecondsDiff > daySeconds) + { + // + days = mWorkingSecondsDiff / daySeconds; + mWorkingSecondsDiff -= days * daySeconds; + } + if (mWorkingSecondsDiff > hourSeconds) + { + // + hours = mWorkingSecondsDiff / hourSeconds; + mWorkingSecondsDiff -= hours * hourSeconds; + } + if (mWorkingSecondsDiff > minuteSecoonds) + { + // + minutes = mWorkingSecondsDiff / minuteSecoonds; + mWorkingSecondsDiff -= minutes * minuteSecoonds; + } + seconds = mWorkingSecondsDiff; + + // + result = true; + + // + return result; + } + + // + // Tools ... + + // + // Cleanup ... + void Clean() + { + days = 0; + hours = 0; + minutes = 0; + seconds = 0; + + // + ZeroMemory(this); + } + + // + // To String Representation ... + string ToString( + string dayId = "d", + string hourId = "h", + string minuteId = "m", + string secondId = "s", + string idSeparator = ": ", + string separator = ", ", + bool ignoreZeroValues = true + // + ) + { + // + string result = ""; + + // + // Days ... + if (!ignoreZeroValues || days > 0) + { + result += dayId + idSeparator + (string)days + separator; + } + + // + // Hours ... + if (!ignoreZeroValues || hours > 0) + { + // + string strHour = ToString(hours); + if (StringLen(strHour) == 1) + { + strHour = "0" + strHour; + } + + // + result += hourId + idSeparator + strHour + separator; + } + + // + // Minutes ... + if (!ignoreZeroValues || minutes > 0) + { + // + string strMinute = ToString(minutes); + if (StringLen(strMinute) == 1) + { + strMinute = "0" + strMinute; + } + + // + result += minuteId + idSeparator + strMinute + separator; + } + + // + // Seconds ... + if (!ignoreZeroValues || seconds > 0) + { + // + string strSec = ToString(seconds); + if (StringLen(strSec) == 1) + { + strSec = "0" + strSec; + } + + // + result += secondId + idSeparator + strSec; + } + + // + return result; + } +}; + +// +// Describe an Specific Candle ... +struct XOHCL +{ + // + // Props ... + + // + double high; + double open; + double close; + double low; + + // + string symbol; + datetime time; + ENUM_TIMEFRAMES period; + + // + // Constructor ... + XOHCL() + { + Clean(); + } + + // + // Init a Bar ... + // Using Bar Index ... + bool Init( + string mSymbol = NULL, // Trading Symbol + ENUM_TIMEFRAMES mPeriod = NULL, // Trading Period + int barIndex = 0 // Bar Index + ) + { + // + mSymbol = NormalizeSymbol(mSymbol); + mPeriod = NormalizePeriod(mPeriod); + + // + symbol = mSymbol; + period = mPeriod; + + // + time = iTime( + mSymbol, + mPeriod, + barIndex // + ); + + // + open = iOpen( + mSymbol, + mPeriod, + barIndex // + ); + open = NormalizePrice(open, mSymbol); + + // + close = iClose( + mSymbol, + mPeriod, + barIndex // + ); + close = NormalizePrice(close, mSymbol); + + // + high = iHigh( + mSymbol, + mPeriod, + barIndex // + ); + high = NormalizePrice(high, mSymbol); + + // + low = iLow( + mSymbol, + mPeriod, + barIndex // + ); + low = NormalizePrice(low, mSymbol); + + // + bool result = IsValid(); + + // + return result; + } + + // + // Init a Bar ... + // Using Bar Time ... + bool Init( + string mSymbol = NULL, // Trading Symbol + ENUM_TIMEFRAMES mPeriod = NULL, // Trading Period + datetime mTime = NULL // Bar Time + ) + { + // + mTime = NormalizeTime(mTime); + + // + int barIndex = iBarShift( + mSymbol, + mPeriod, + mTime, + false // + ); + + // + bool result = Init( + mSymbol, + mPeriod, + barIndex + // + ); + + // + return result; + } + + // + bool Init( + string mSymbol = NULL, // Trading Symbol + ENUM_TIMEFRAMES mPeriod = NULL, // Trading Period + double mOpen = 0, // Open + double mHigh = 0, // High + double mClose = 0, // Close + double mLow = 0, // Low + int barIndex = 0 // Bar Index + ) + { + // + mSymbol = NormalizeSymbol(mSymbol); + mPeriod = NormalizePeriod(mPeriod); + + // + symbol = mSymbol; + period = mPeriod; + + // + time = iTime( + mSymbol, + mPeriod, + barIndex + // + ); + + // + open = mOpen; + high = mHigh; + close = mClose; + low = mLow; + + // + return IsValid(); + } + + // + bool Init( + string mSymbol = NULL, // Trading Symbol + ENUM_TIMEFRAMES mPeriod = NULL, // Trading Period + double mOpen = 0, // Open + double mHigh = 0, // High + double mClose = 0, // Close + double mLow = 0, // Low + datetime mTime = NULL // Bar Time + ) + { + // + mSymbol = NormalizeSymbol(mSymbol); + mPeriod = NormalizePeriod(mPeriod); + + // + symbol = mSymbol; + period = mPeriod; + + // + int barIndex = iBarShift( + symbol, + period, + mTime); + + // + time = iTime( + mSymbol, + mPeriod, + barIndex + // + ); + + // + open = mOpen; + high = mHigh; + close = mClose; + low = mLow; + + // + return IsValid(); + } + + // + // Tools ... + + // + void Clean() + { + // + high = 0; + open = 0; + close = 0; + low = 0; + + // + time = NULL; + symbol = NULL; + period = NULL; + + // + ZeroMemory(this); + } + + // + // Validate Bar ... + bool IsValid() + { + // + bool result = false; + + // + result = + // + high > 0 && + open > 0 && + close > 0 && + low > 0 + // + ; + + // + return result; + } + + // + int TotalBars() + { + // + int result = 0; + + // + result = iBars( + symbol, + period // + ); + + // + return result; + } + + // + // Calculate X_PRICE Specified Type ... + double GetPrice(ENUM_X_PRICE mPType) + { + // + double result = 0; + + // + if (!IsValid()) + { + return result; + } + + // + switch (mPType) + { + // + case X_PRICE_OPEN: + result = open; + break; + // + case X_PRICE_HIGH: + result = high; + break; + // + case X_PRICE_CLOSE: + result = close; + break; + // + case X_PRICE_LOW: + result = low; + break; + // + case X_PRICE_UP: + result = GetUp(); + break; + // + case X_PRICE_DOWN: + result = GetDown(); + break; + } + + // + return result; + } + + // + // Retrieve Price base On Series Mode ... + double GetPrice(ENUM_SERIESMODE mMode) + { + // + ENUM_X_PRICE mXMode = ToPrice(mMode); + + // + return GetPrice(mXMode); + } + + // + // Calculate Applied Price ... + double GetPrice( + ENUM_APPLIED_PRICE mAppliedTo // Select Application Method + ) + { + // + double result = 0; + + // + // Calculate Applied Price ... + switch (mAppliedTo) + { + // + case PRICE_CLOSE: + result = close; + break; + + // + case PRICE_OPEN: + result = open; + break; + + // + case PRICE_HIGH: + result = high; + break; + + // + case PRICE_LOW: + result = low; + break; + + // + case PRICE_MEDIAN: + result = (high + low) / 2; + break; + + // + case PRICE_TYPICAL: + result = (high + low + close) / 3; + break; + + // + case PRICE_WEIGHTED: + result = (high + low + close + close) / 4; + break; + } + + // + return result; + } + + // + // Find Specific Price ... + bool FindHigherPriceBar( + XOHCL &bar, + double price, + ENUM_X_PRICE _type = X_PRICE_HIGH // + ) + { + // + bool result = false; + + // + result = IsValid(); + if (!result) + { + return result; + } + + // + int totalBars = TotalBars(); + result = IsValidSize(totalBars); + if (!result) + { + return result; + } + + // + int start = Index(); + int maxAllowedLoopback = totalBars / 5; + for (int i = start; i < maxAllowedLoopback; i++) + { + // + result = bar.Init( + symbol, + period, + i // + ); + + // + if (!result) + { + break; + } + + // + double iPrice = bar.GetPrice(_type); + + // + result = + // + iPrice > 0 && + iPrice > price + // + ; + if (result) + { + break; + } + } + + // + if (!result) + { + bar.Clean(); + } + + // + return result; + } + + // + // Find Specific Price ... + bool FindLowerPriceBar( + XOHCL &bar, + double price, + ENUM_X_PRICE _type = X_PRICE_HIGH // + ) + { + // + bool result = false; + + // + result = IsValid(); + if (!result) + { + return result; + } + + // + int totalBars = TotalBars(); + result = IsValidSize(totalBars); + if (!result) + { + return result; + } + + // + int start = Index(); + int maxAllowedLoopback = totalBars / 5; + for (int i = start; i < maxAllowedLoopback; i++) + { + // + result = bar.Init( + symbol, + period, + i // + ); + + // + if (!result) + { + break; + } + + // + double iPrice = bar.GetPrice(_type); + + // + result = + // + iPrice > 0 && + iPrice < price + // + ; + if (result) + { + break; + } + } + + // + if (!result) + { + bar.Clean(); + } + + // + return result; + } + + // + // Calculate Bar Mid Line ... + double GetMid() + { + // + double result = 0; + + // + if (!IsValid()) + { + return result; + } + + // + result = (high + low) / 2; + + // + return result; + } + + // + // Calculate up Price ... + double GetUp() + { + // + double result = 0; + + // + if (!IsValid()) + { + return result; + } + + // + result = MathMax(open, close); + + // + return result; + } + + // + // Calculate Down Price ... + double GetDown() + { + // + double result = 0; + + // + if (!IsValid()) + { + return result; + } + + // + result = MathMin(open, close); + + // + return result; + } + + // + // Retrieve Required Price for Zone Checking ... + // For Bullish Zones => low; + // For Bearish Zones => high; + double GetZoneCheckValue(ENUM_X_DIRECTION forDir) + { + // + double result = 0; + + // + if (!IsValid() || + !HasDirection(forDir)) + { + return result; + } + + // + bool isBullish = IsBullish(forDir); + + // + result = + isBullish + ? low + : high; + + return result; + } + + // + // Calculate Bar Body ... + double GetBody() + { + // + double result = 0; + + // + if (!IsValid()) + { + return result; + } + + // + result = GetUp() - GetDown(); + + // + return result; + } + + // + // Calculate Bar Range ... + double GetRange() + { + // + double result = 0; + + // + if (!IsValid()) + { + return result; + } + + // + result = high - low; + + // + return result; + } + + // + // Calculate Bar Shadows ... + double GetShadows() + { + // + double result = 0; + + // + if (!IsValid()) + { + return result; + } + + // + result = GetRange() - GetBody(); + + // + return result; + } + + // + // Calculate Bar High Shadow ... + double GetHighShadow() + { + // + double result = 0; + + // + if (!IsValid()) + { + return result; + } + + // + result = + // + high - GetUp() + // + ; + + // + return result; + } + + // + // Calculate Bar Low Shadow ... + double GetLowShadow() + { + // + double result = 0; + + // + if (!IsValid()) + { + return result; + } + + // + result = + // + GetDown() - low; + // + ; + + // + return result; + } + + // + // Check Bar is Bullish ... + bool IsBullish() + { + // + bool result = false; + + // + if (!IsValid()) + { + return result; + } + + // + result = open < close; + + // + return result; + } + + // + // Check Bar is Bearish ... + bool IsBearish() + { + // + bool result = false; + + // + if (!IsValid()) + { + return result; + } + + // + result = open > close; + + // + return result; + } + + // + // Get Direction of Bar ... + ENUM_X_DIRECTION GetDirection() + { + // + ENUM_X_DIRECTION result = X_DIRECTION_NONE; + + // + bool isBullish = IsBullish(); + bool isBearish = IsBearish(); + + // + result = + isBullish && isBearish + ? X_DIRECTION_ALL + : !isBullish && !isBearish + ? X_DIRECTION_NONE + : isBullish + ? X_DIRECTION_BULLISH + : X_DIRECTION_BEARISH; + + // + return result; + } + + // + // Find Next Bar Time ... + datetime NextAt() + { + // + datetime result = NULL; + + // + if (!IsValid()) + { + return result; + } + + // + int prSeconds = PeriodSeconds(period); + + // + result = time + prSeconds; + + // + return result; + } + + // + // Find Prev Bar Time ... + datetime BeforeOn() + { + // + datetime result = NULL; + + // + if (!IsValid()) + { + return result; + } + + // + int prSeconds = PeriodSeconds(period); + + // + result = time - prSeconds; + + // + return result; + } + + // + // Calculate Last Bar Open Time in Smaller Period ... + datetime GetLastBarTimeOfPeriod( + ENUM_TIMEFRAMES smallerPeriod // + ) + { + // + datetime result = NULL; + + // + if (!IsValid()) + { + return result; + } + + // + int sourceSeconds = PeriodSeconds(period); + int destSeconds = PeriodSeconds(smallerPeriod); + if (destSeconds >= sourceSeconds) + { + // + result = time; + return result; + } + + // + result = (datetime)((((int)time) + sourceSeconds) - destSeconds); + + // + return result; + } + + // + // Calculate Close Time ... + datetime GetCloseTime() + { + // + datetime result = NULL; + + // + if (!IsValid()) + { + return result; + } + + // + int seconds = PeriodSeconds(period); + + // + result = (datetime)(((int)time) + seconds); + + // + return result; + } + + // + bool BarAt( + int index, + XOHCL &bar // + ) + { + // + bool result = false; + + // + bar.Clean(); + + // + result = IsValid(); + if (!result) + { + return result; + } + + // + if (index < 0) + { + index = 0; + } + + // + result = bar.Init( + symbol, + period, + index // + ); + + // + return result; + } + + // + bool BarIn( + ENUM_TIMEFRAMES _period, + XOHCL &bar // + ) + { + // + bool result = false; + + // + bar.Clean(); + + // + result = IsValid() && + IsSpecifiedValid(_period); + if (!result) + { + return result; + } + + // + int index = Index(_period); + result = bar.Init( + symbol, + _period, + index // + ); + + // + return result; + } + + // + // Find Current Bar Index on Chart ... + int Index() + { + // + int result = -1; + + // + if (!IsValid()) + { + return result; + } + + // + result = iBarShift( + symbol, + period, + time + // + ); + + // + return result; + } + + // + int Index(datetime value) + { + // + int result = -1; + + // + value = NormalizeTime(value); + + // + result = IsValid(); + if (!result) + { + return result; + } + + // + result = iBarShift( + symbol, + period, + value // + ); + + // + return result; + } + + // + int Index(ENUM_TIMEFRAMES value) + { + // + int result = -1; + + // + result = IsValid() && + IsSpecifiedValid(value); + if (!result) + { + return result; + } + + // + result = iBarShift( + symbol, + value, + time // + ); + + // + return result; + } + + // + bool GetNextBar(XOHCL &bar) + { + // + bool result = false; + + // + result = IsValid(); + if (!result) + { + return result; + } + + // + int idx = Index(); + result = idx > 0; + if (!result) + { + return result; + } + + // + result = bar.Init( + this.symbol, + this.period, + idx - 1 // + ); + + // + if (!result) + { + bar.Clean(); + } + + // + return result; + } + + // + bool GetPreviousBar(XOHCL &bar) + { + // + bool result = false; + + // + result = IsValid(); + if (!result) + { + return result; + } + + // + int idx = Index(); + + // + result = bar.Init( + this.symbol, + this.period, + idx + 1 // + ); + + // + if (!result) + { + bar.Clean(); + } + + // + return result; + } + + // + // Find Highest Bar Index ... + int FindHighestIndex( + int mLength, // Loopback ... + ENUM_SERIESMODE mMode // Calculation mode + ) + { + // + int result = -1; + + // + if (!IsValid()) + { + return result; + } + + // + if (mLength < 2) + { + mLength = 2; + } + + // + result = iHighest( + symbol, + period, + mMode, + mLength, + Index()); + + // + return result; + } + + // + // Find Highest ... + double FindHighest( + int mLength, // Loopback ... + ENUM_SERIESMODE mMode // Calculation mode + ) + { + // + double result = 0; + + // + if (!IsValid()) + { + return result; + } + + // + int idx = FindHighestIndex( + mLength, + mMode); + if (idx <= -1) + { + return result; + } + + // + XOHCL iH; + result = iH.Init( + symbol, + period, + idx + // + ); + if (!result) + { + return result; + } + + // + result = iH.GetPrice(mMode); + + // + return result; + } + + // + // Find Highest ... + double FindHighestUp( + int mLength // Loopback ... + ) + { + // + double result = 0; + + // + if (!IsValid()) + { + return result; + } + + // + result = FindHighest(mLength, MODE_OPEN); + result = MathMax(mLength, FindHighest(mLength, MODE_CLOSE)); + + // + return result; + } + + // + // Find Lowest Bar Index ... + int FindLowestIndex( + int mLength, // Loopback ... + ENUM_SERIESMODE mMode // Calculation mode + ) + { + // + int result = -1; + + // + if (!IsValid()) + { + return result; + } + + // + if (mLength < 2) + { + mLength = 2; + } + + // + result = iLowest( + symbol, + period, + mMode, + mLength, + Index()); + + // + return result; + } + + // + // Find Lowest ... + double FindLowest( + int mLength, // Loopback ... + ENUM_SERIESMODE mMode // Calculation mode + ) + { + // + double result = 0; + + // + if (!IsValid()) + { + return result; + } + + // + int idx = FindLowestIndex( + mLength, + mMode); + if (idx <= -1) + { + return result; + } + + // + XOHCL iL; + result = iL.Init( + symbol, + period, + idx + // + ); + if (!result) + { + return result; + } + + // + result = iL.GetPrice(mMode); + + // + return result; + } + + // + // Find Lowest ... + double FindLowesttDown( + int mLength // Loopback ... + ) + { + // + double result = 0; + + // + if (!IsValid()) + { + return result; + } + + // + result = FindLowest(mLength, MODE_OPEN); + result = MathMax(mLength, FindLowest(mLength, MODE_CLOSE)); + + // + return result; + } + + // + // Other ... + string GetTag(string prefix = "") + { + // + string result = NULL; + + // + result = + (IsValid(prefix) + ? prefix + "_" + : "") + + "XOHCL_" + symbol + "_" + ToString(period) + "_" + ToFormatString(time); + + // + return result; + } + + // + // Convert to String Representation ... + string ToString() + { + // + string result = ""; + + // + result = GetTypeName(this) + + "(O(" + ToString(open) + "),H(" + ToString(high) + "),C(" + ToString(close) + "),L(" + ToString(low) + "))"; + + // + return result; + } +}; + +// +// Tracking Times ... +struct XTimeTracker +{ + // + // Props ... + int xMonth; + int xDayOfWeek; + int xForWeekDay; + int xDay; + int xHour; + int xMinute; + + // + // Constructor ... + XTimeTracker() + { + Clean(); + } + + // + // Tools ... + + // + void Clean() + { + // + xDay = -1; + xHour = -1; + xMonth = -1; + xMinute = -1; + xDayOfWeek = -1; + xForWeekDay = -1; + + // + ZeroMemory(this); + } + + // + // Detecting New Minute ... + bool IsNewMinute() + { + // + bool result = false; + + // + // Retrieve Current Time as Struct ... + MqlDateTime timeStruct = GetCurrentTime(); + + // + // Check Houre ... + result = timeStruct.min != xMinute; + if (result) + { + xMinute = timeStruct.min; + } + + // + return result; + } + + // + // 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; + } +}; + +// +// Tracking Bars on Specified Environment ... +struct XBarTracker +{ + // + string symbol; // Tracking Symbol + ENUM_TIMEFRAMES period; // Tracking Time Frame + + // + int lastTrackedBar; // Last Tracked Bar ... + + // + bool waitsUntilNext; // Waits Until Next Bar ... + + // + // Constructor ... + XBarTracker() + { + Clean(); + } + + // + // Initializer ... + bool Init( + string mSymbol = NULL, // Trading Symbol + ENUM_TIMEFRAMES mPeriod = NULL // Trading Period + ) + { + // + bool result = false; + + // + mSymbol = NormalizeSymbol(mSymbol); + mPeriod = NormalizePeriod(mPeriod); + + // + this.symbol = mSymbol; + this.period = mPeriod; + + // + this.lastTrackedBar = 0; + + // + result = true; + + // + return result; + } + + // + // Retrieve all Bars ... + int CountBars() + { + // + return iBars( + symbol, + period + // + ); + } + + // + // Check if it's New Bar ... + bool IsNewBar() + { + // + bool result = false; + + // + int currentBars = CountBars(); + + // + result = currentBars > lastTrackedBar; + if (result) + { + lastTrackedBar = currentBars; + } + + // + return result; + } + + // + bool CanProcessBar() + { + // + bool _isInTestMode = IsRunningOnTestMode(); + + // + bool isNewBar = IsNewBar(); + + // + bool result = + _isInTestMode + ? isNewBar + : !waitsUntilNext + ? true + : isNewBar; + if (result && waitsUntilNext) + { + waitsUntilNext = false; + } + + // + return result; + } + + // + void Waits() + { + this.waitsUntilNext = true; + } + + // + // Tools ... + void Clean() + { + // + symbol = NormalizeSymbol(NULL); + period = NormalizePeriod(NULL); + + // + ZeroMemory(this); + } + + // + bool GetBar( + XOHCL &bar, + int index = 0 // + ) + { + // + bool result = false; + + // + result = bar.Init( + symbol, + period, + index // + ); + + // + return result; + } + + // + bool GetBar( + XOHCL &bar, + datetime time = NULL // + ) + { + // + bool result = false; + + // + NormalizeTime(time); + + // + int barIndex = iBarShift( + symbol, + period, + time, + false // + ); + + // + result = barIndex >= 0; + if (!result) + { + return result; + } + + // + result = bar.Init( + symbol, + period, + barIndex // + ); + + // + return result; + } + + // + int Index(datetime time = NULL) + { + // + int result = 0; + + // + NormalizeTime(time); + + // + result = iBarShift( + symbol, + period, + time, + false // + ); + + // + return result; + } +}; + +// +// Model a Market Cycle ... +struct XMarketCycle +{ + // + // Props ... + + // + string prefix; // Prefix Trag ... + + // + string symbol; // Market Symbol ... + + // + ENUM_TIMEFRAMES period; // Period of Cycle ... + ENUM_X_PERIOD_METHOD method; // Period Selection Method ... + ENUM_X_MARKET_CYCLES cycle; // Cycles of MArket ... + + // + int length; // Number Of Candles per Current Time Frame ... + ENUM_TIMEFRAMES hostPeriod; // Current Time Frame ... + + // + datetime lastStart; // Last Candle Bar Time ... + + // + XBarTracker barTracker; // Bar Tracker ... + XBarRemainsTime remains; // Current Bar Remains Model ... + + // + // Constructor ... + XMarketCycle() + { + Clean(); + } + + // + // Init Cycle ... + bool Init( + string mSymbol, // Trading Symbol + ENUM_TIMEFRAMES mHostPeriod, // Host Period + ENUM_X_MARKET_CYCLES mCycle, // Init Cycle + string mPrefix = "" // Prefix + ) + { + // + bool result = false; + + // + mSymbol = NormalizeSymbol(mSymbol); + mHostPeriod = NormalizePeriod(mHostPeriod); + + // + result = IsValid(mCycle); + if (!result) + { + return result; + } + + // + this.cycle = mCycle; + + // + // Set Automatically Prefix ... + if (StringLen(mPrefix) == 0) + { + this.prefix = ToString(cycle); + } + + // + result = IsValid( + method, + period // + ); + if (!result) + { + return result; + } + + // + this.symbol = mSymbol; + this.hostPeriod = mHostPeriod; + + // + // Find Cycle Period ... + if (method == X_PERIOD_AUTO) + { + // + // Select Period ... + this.period = GetCyclePeriod( + this.cycle, + this.hostPeriod); + } + + // + // Set Prefix if Provided ... + if (StringLen(mPrefix) > 0) + { + this.prefix = mPrefix; + } + + // + // Calculate Required Info ... + + // + // Length ... + this.length = PeriodSeconds(this.period) / PeriodSeconds(this.hostPeriod); + + // + // Update Additional Data ... + result = this.Update(0); + + // + return result; + } + + // + bool Init( + string mSymbol, // Trading Symbol + ENUM_TIMEFRAMES mHostPeriod, // Host Period + ENUM_X_MARKET_CYCLES mCycle, // Init Cycle + ENUM_X_PERIOD_METHOD mMethod, // Period Selection Method + ENUM_TIMEFRAMES mPeriod, // Provided Period + string mPrefix = "" // Prefix + ) + { + // + this.period = mPeriod; + this.method = mMethod; + + // + return Init( + mSymbol, + mHostPeriod, + mCycle, + mPrefix + // + ); + } + + // + // Tools ... + + // + // Cleanup ... + void Clean() + { + // + length = 0; + lastStart = 0; + + // + cycle = NULL; + prefix = NULL; + symbol = NULL; + period = NULL; + method = NULL; + hostPeriod = NULL; + + // + remains.Clean(); + barTracker.Clean(); + + // + ZeroMemory(this); + } + + // + // Check Structure Valid ... + bool IsValid() + { + // + bool result = false; + + // + result = IsValid( + method, + period); + if (!result) + { + return result; + } + + // + result = + // + length > 0 && + symbol != NULL && + period != NULL && + method != NULL && + hostPeriod != NULL && + method != X_PERIOD_NOTHING + // + ; + + // + return result; + } + + // + // Update Market Cycle Additional Info ... + bool Update(int hostBarIndex) + { + // + bool result = false; + + // + result = this.IsValid(); + if (!result) + { + return result; + } + + // + // Init Remains ... + result = remains.Init( + this.symbol, + this.period); + if (!result) + { + return result; + } + + // + // Init Bar Tracker ... + result = barTracker.Init( + this.symbol, + this.period); + if (!result) + { + return result; + } + + // + return result; + } + + // + // Count Bars ... + int CountBars() + { + // + int result = 0; + + // + if (!IsValid()) + { + return result; + } + + // + result = barTracker.CountBars(); + + // + return result; + } + + // + // Check New Bar ... + bool IsNewBar() + { + // + bool result = false; + + // + if (!IsValid()) + { + return result; + } + + // + result = barTracker.IsNewBar(); + + // + return result; + } + + // + // Retrieve Current Bar Index based on Host Period bar Index ... + int GetBarIndex(int barIndex) + { + // + int result = 0; + + // + if (!IsValid()) + { + return result; + } + + // + if (barIndex < 0) + { + return result; + } + + // + int totalBars = CountBars(); + if (barIndex >= totalBars) + { + // + result = totalBars - 1; + return result; + } + + // + datetime hostBarTime = iTime( + this.symbol, + this.hostPeriod, + barIndex + // + ); + + // + result = iBarShift( + this.symbol, + this.period, + hostBarTime + // + ); + + // + return result; + } + + // + // Retrieve Current Cycles Specific Bar ... + XOHCL GetBar(int barIndex) + { + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + int totalBars = CountBars(); + if (barIndex >= totalBars) + { + barIndex = totalBars - 1; + } + + // + XOHCL result; + result.Init( + this.symbol, + this.period, + barIndex + // + ); + + // + return result; + } + + // + // Extract Specific Range of Bars ... + // using Start Bar Index ... + int GetBars( + XOHCL &result[], // Hold Result + int from = 0, // Start Bar Index + int count = 1, // Number of Bars + bool forceClean = true // Clean Result Array + ) + { + // + int mResult = 0; + + // + if (from < 0) + { + from = 0; + } + + // + int total = Bars( + symbol, + period); + if (from > total - 2) + { + from = total - 2; + } + + // + if (count < 0) + { + count = 1; + } + + // + int start = from; + int end = start + count; + if (end > total - 1) + { + end = total - 1; + } + + // + if (forceClean) + { + Clean(result); + } + + // + int beforeSize = ArraySize(result); + + // + for (int i = start; i < end; i++) + { + // + XOHCL iBar; + bool isValid = iBar.Init( + symbol, + period, + i + // + ); + + // + if (isValid) + { + // + AddRef( + iBar, + result + // + ); + } + } + + // + int afterSize = ArraySize(result); + + // + mResult = afterSize - beforeSize; + + // + return mResult; + } + + // + // Extract Specific Range of Bars ... + // using Start Bar Time ... + int GetBars( + XOHCL &result[], // Hold Result + datetime from = NULL, // Start Bar Time + int count = 1, // Number of Bars + bool forceClean = true // Clean Result Array + ) + { + // + from = NormalizeTime(from); + + // + int barIndex = iBarShift( + symbol, + period, + from, + false + // + ); + + // + return GetBars( + result, + symbol, + period, + barIndex, + count, + forceClean + // + ); + } + + // + // Retrieve Bar Time ... + datetime GetBarTime(int barIndex) + { + // + datetime result = NULL; + + // + if (!IsValid()) + { + return result; + } + + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + int totalBars = CountBars(); + if (barIndex >= totalBars) + { + barIndex = totalBars - 1; + } + + // + result = iTime( + this.symbol, + this.period, + barIndex + // + ); + + // + return result; + } + + // + // Find Chart ID ... + ulong GetChartID() + { + // + ulong result = 0; + + // + long firstChart = ChartFirst(); + result = firstChart; + + // + while (result >= 0) + { + // + string chSymbol = ChartSymbol(result); + ENUM_TIMEFRAMES chPeriod = ChartPeriod(result); + + // + bool isOwnChart = + // + symbol == chSymbol && + period == chPeriod + // + ; + if (isOwnChart) + { + break; + } + + // + result = ChartNext(result); + if (result < 0) + { + break; + } + } + + // + return result; + } + + // + // Create and String Representation for Unique Taging ... + string ToString() + { + // + string result = ""; + + // + if (!IsValid()) + { + return result; + } + + // + result = + GetTypeName(this) + "(" + + "PRFX(" + this.prefix + ")" + + "SMBL(" + this.symbol + ")" + + "CYC(" + ToString(this.cycle) + ")" + + "PRD(" + ToString(this.period) + ")" + + "PRDHST(" + ToString(this.hostPeriod) + ")" + + "MTH(" + EnumToString(this.method) + ")" + + ")"; + + // + return result; + } + + // + // Here we Produce a Summary brief of + // state of Cycle ... + string GenerateSummary() + { + // + string result = ""; + + // + bool hasPrefix = + StringLen(this.prefix) > 0 && + this.prefix != ToString(this.cycle); + result += (hasPrefix ? this.prefix + "[" : "") + + ToString(this.cycle) + + (hasPrefix ? "]" : "") + "\n"; + + // + result += " - PR: " + ToString(this.period) + "\n"; + + // + XOHCL cBar = GetBar(0); + + // + result += " - State: " + (cBar.IsBullish() ? "Bullish" : cBar.IsBearish() ? "Bearish" + : "Neutural"); + + // + return result; + } +}; + +// +// Linear Regression ... + +// +struct XLinearRegressionWorkStruct +{ + // + struct sDataStruct + { + // + double value; + double sumY; + double sumXY; + }; + + // + sDataStruct data[]; + + // + int dataSize; + int period; + double sumX; + double sumXX; + double divisor; + + // + // Constructor ... + XLinearRegressionWorkStruct() + : dataSize(-1), period(-1) + { + } +}; + +// +struct XLinearRegression +{ + // + XLinearRegressionWorkStruct m_work; + + // + // Calculate Linear Regression ... + double Calculate( + double value, + int period, + double &_slope, + double &_intercept, + int r, + int bars // + ) + { + // + if (m_work.dataSize <= bars) + { + m_work.dataSize = ArrayResize(m_work.data, bars + 500, 2000); + } + + // + if (period < 1) + { + period = 1; + } + + // + if (m_work.period != (int)period) + { + // + m_work.period = (int)period; + m_work.sumX = m_work.period * (m_work.period - 1.0) / 2.0; + m_work.sumXX = m_work.period * (m_work.period - 1.0) * (2.0 * m_work.period - 1.0) / 6.0; + m_work.divisor = m_work.sumX * m_work.sumX - m_work.period * m_work.sumXX; + + // + if (m_work.divisor) + { + m_work.divisor = 1.0 / m_work.divisor; + } + } + + // + m_work.data[r].value = value; + + // + if (r >= m_work.period) + { + // + m_work.data[r].sumY = m_work.data[r - 1].sumY + value - m_work.data[r - m_work.period].value; + m_work.data[r].sumXY = m_work.data[r - 1].sumXY + m_work.data[r].sumY - m_work.data[r - m_work.period].value * (m_work.period - 1.0) - value; + } + else + { + // + m_work.data[r].sumY = value; + m_work.data[r].sumXY = 0; + + // + for (int _k = 1; _k < m_work.period && r >= _k; _k++) + { + // + m_work.data[r].sumY += m_work.data[r - _k].value; + m_work.data[r].sumXY += _k * m_work.data[r - _k].value; + } + } + + // + _slope = (m_work.period * m_work.data[r].sumXY - m_work.sumX * m_work.data[r].sumY) * m_work.divisor; + _intercept = (m_work.data[r].sumY - _slope * m_work.sumX) / (double)m_work.period; + + // + double result = (_intercept + _slope * (m_work.period - 1.0)); + + // + return result; + } + + // +}; + +// +// Use To Parse Symbols for +// Ignore Brokers Additional Suffixes ... +struct XSymbolParser +{ + // + string version; // Temp ... + + // + // Symbol Parsing ... + + // + // Forext ... + + // + bool IsEURUSD(string symbol) + { + // + string symbolIdentifiers[] = { + "EUR", + "USD" // + }; + + // + bool result = Contains( + symbolIdentifiers, + symbol // + ); + + // + return result; + } + + // + bool IsUSDJPY(string symbol) + { + // + string symbolIdentifiers[] = { + "USD", + "JPY" // + }; + + // + bool result = Contains( + symbolIdentifiers, + symbol // + ); + + // + return result; + } + + // + bool IsEURJPY(string symbol) + { + // + string symbolIdentifiers[] = { + "EUR", + "JPY" // + }; + + // + bool result = Contains( + symbolIdentifiers, + symbol // + ); + + // + return result; + } + + // + bool IsUSDCHF(string symbol) + { + // + string symbolIdentifiers[] = { + "USD", + "CHF" // + }; + + // + bool result = Contains( + symbolIdentifiers, + symbol // + ); + + // + return result; + } + + // + bool IsEURCHF(string symbol) + { + // + string symbolIdentifiers[] = { + "EUR", + "CHF" // + }; + + // + bool result = Contains( + symbolIdentifiers, + symbol // + ); + + // + return result; + } + + // + bool IsGBPUSD(string symbol) + { + // + string symbolIdentifiers[] = { + "GBP", + "USD" // + }; + + // + bool result = Contains( + symbolIdentifiers, + symbol // + ); + + // + return result; + } + + // + bool IsEURGBP(string symbol) + { + // + string symbolIdentifiers[] = { + "EUR", + "GBP" // + }; + + // + bool result = Contains( + symbolIdentifiers, + symbol // + ); + + // + return result; + } + + // + bool IsAUDUSD(string symbol) + { + // + string symbolIdentifiers[] = { + "AUD", + "USD" // + }; + + // + bool result = Contains( + symbolIdentifiers, + symbol // + ); + + // + return result; + } + + // + bool IsEURAUD(string symbol) + { + // + string symbolIdentifiers[] = { + "EUR", + "AUD" // + }; + + // + bool result = Contains( + symbolIdentifiers, + symbol // + ); + + // + return result; + } + + // + bool IsUSDCAD(string symbol) + { + // + string symbolIdentifiers[] = { + "USD", + "CAD" // + }; + + // + bool result = Contains( + symbolIdentifiers, + symbol // + ); + + // + return result; + } + + // + bool IsEURCAD(string symbol) + { + // + string symbolIdentifiers[] = { + "EUR", + "CAD" // + }; + + // + bool result = Contains( + symbolIdentifiers, + symbol // + ); + + // + return result; + } + + // + bool IsNZDUSD(string symbol) + { + // + string symbolIdentifiers[] = { + "NZD", + "USD" // + }; + + // + bool result = Contains( + symbolIdentifiers, + symbol // + ); + + // + return result; + } + + // + bool IsEURNZD(string symbol) + { + // + string symbolIdentifiers[] = { + "EUR", + "NZD" // + }; + + // + bool result = Contains( + symbolIdentifiers, + symbol // + ); + + // + return result; + } + + // + // Metals ... + + // + bool IsXAUUSD(string symbol) + { + // + string symbolIdentifiers[] = { + "XAU", + "USD" // + }; + + // + bool result = Contains( + symbolIdentifiers, + symbol // + ); + + // + return result; + } + + // + bool IsXAGUSD(string symbol) + { + // + string symbolIdentifiers[] = { + "XAG", + "USD" // + }; + + // + bool result = Contains( + symbolIdentifiers, + symbol // + ); + + // + return result; + } + + // + // Indexes ... + + // + bool IsDowJones(string symbol) + { + // + bool result = Contains( + "DowJones30", + symbol // + ); + + // + return result; + } + + // + // Oil ... + + // + bool IsBrent(string symbol) + { + // + bool result = Contains( + "BRENT", + symbol // + ); + + // + return result; + } + + // + // Symbol Finder ... + string GetEURUSDSymbol() + { + // + string result = NULL; + + // + string symbols[]; + int symbolsCount = GetAllSymbols( + symbols // + ); + if (!IsValidSize(symbolsCount)) + { + return result; + } + + // + for (int i = 0; i < symbolsCount; i++) + { + // + string iSymbol = symbols[i]; + if (IsEURUSD(iSymbol)) + { + // + result = iSymbol; + break; + } + } + + // + return result; + } +}; + +// +struct XSymbolSessionParser +{ + // + string version; // Temp ... + + // + // Check Market Is Open for Specific Symbol + // in Current Time ... + bool CanTrade( + string symbol // Trading Symbol + ) + { + // + bool result = false; + + // + result = IsValid(symbol); + if (!result) + { + return result; + } + + // + MqlDateTime timeStruct; + result = TimeCurrent(timeStruct); + if (!result) + { + return result; + } + + // + ENUM_DAY_OF_WEEK dayOfWeek = (ENUM_DAY_OF_WEEK)timeStruct.day_of_week; + + // + datetime cTime = TimeCurrent(); + + // + datetime from; + datetime to; + result = SymbolInfoSessionTrade( + symbol, + dayOfWeek, + 0, // Session Index ... + from, + to // + ); + if (!result) + { + return result; + } + + // + result = cTime > from && cTime < to; + + // + return result; + } +}; + +// +// Parsing Market Names ... +struct XMarketParser +{ + // + string _version; // Temp ... + + // + bool IsIngot(string market) + { + // + bool result = false; + + // + // result = IsValid(market) && + // market == ""; + + // + return result; + } + + // + bool IsErrante(string market) + { + // + bool result = false; + + // + // result = IsValid(market) && + // market == ""; + + // + return result; + } + + // + bool IsAMarkets(string market) + { + // + bool result = false; + + // + result = IsValid(market) && + market == "AMarkets LLC"; + + // + return result; + } + + // + bool IsIFCMarkets(string market) + { + // + bool result = false; + + // + // result = IsValid(market) && + // market == ""; + + // + return result; + } + + // + bool IsOtetMarkets(string market) + { + // + bool result = false; + + // + // result = IsValid(market) && + // market == ""; + + // + return result; + } + + // +}; + +// +struct XPoint +{ + // + // Props ... + double value; + datetime at; + + // + XPoint() + { + Clean(); + } + + // + // Tools ... + + // + void Clean() + { + // + value = 0; + at = NULL; + + // + ZeroMemory(this); + } + + // + bool IsValid() + { + // + return value > 0 && + IsValid(at); + } + + // +}; + +// +// Specified Swing Point ... +struct XSwingPoint +{ + // + // Props ... + string symbol; + ENUM_TIMEFRAMES period; + + // + double swing; + datetime time; + ENUM_X_SWING_TYPE type; + + // + // Constructor ... + XSwingPoint() + { + Clean(); + } + + // + // Tools ... + + /** + * Cleanup Model ... + */ + void Clean() + { + // + swing = 0; + time = NULL; + + // + symbol = NULL; + period = NULL; + + // + type = X_NO_SWING; + } + + /** + * Validate Model ... + * + * @return ( bool ) + */ + bool IsValid() + { + // + bool result = false; + + // + result = + swing > 0 && + IsValid(time) && + IsValid(symbol) && + IsValid(period) && + type != X_NO_SWING; + + // + return result; + } + + /** + * Check Swing is Low or not ... + * + * @return ( bool ) + */ + bool IsSwingLow() + { + return type == X_SWING_LOW; + } + + /** + * Check Swing is High or not ... + * + * @return ( bool ) + */ + bool IsSwingHigh() + { + return type == X_SWING_HIGH; + } +}; + +/** + * Extract values of swings from specified Collection ... + * + * @param swings: XSwingPoint instance Collection ... + * @param values: double Collection ... + * + * @return ( int ) + */ +int ExtractSwings( + XSwingPoint &swings[], + double &values[] // +) +{ + // + int result = 0; + + // + Clean(values); + + // + int count = ArraySize(swings); + if (!IsValidSize(count)) + { + return result; + } + + // + for (int i = 0; i < count; i++) + { + // + Add( + swings[i].swing, + values // + ); + } + + // + result = ArraySize(values); + + // + return result; +} + +// +// Functions ... + +// +// Validators ... + +// +// Validate an String has length and not NULL ... +bool IsValid(string value) +{ + // + bool result = false; + + // + result = + // + value != NULL && + StringLen(value) > 0 + // + ; + + // + return result; +} +bool IsSpecifiedValid(string value) +{ + return IsValid(value); +} + +// +// Validate a Date ... +bool IsValid(datetime value) +{ + // + bool result = false; + + // + result = NotEmpty(value) && value != NULL; + + // + return result; +} +bool IsSpecifiedValid(datetime value) +{ + return IsValid(value); +} + +// +// Validate a Period Param ... +bool IsValid(ENUM_TIMEFRAMES value) +{ + // + bool result = false; + + // + result = + // + value != NULL + // + ; + + // + return result; +} +bool IsSpecifiedValid(ENUM_TIMEFRAMES value) +{ + // + return IsValid(value); +} + +// +// Validate Specified Cycle ... +bool IsValid(ENUM_X_MARKET_CYCLES value) +{ + // + bool result = false; + + // + result = + // + value != NULL && + value != X_MARKET_CYCLE_UNKNOWN + // + ; + + // + return result; +} + +// +// Validate Specific Period Mode ... +bool IsValid( + ENUM_X_PERIOD_METHOD mMethod, // Period Select Method + ENUM_TIMEFRAMES mPeriod // Selected Period +) +{ + // + bool result = false; + + // + result = + // + mMethod == X_PERIOD_NOTHING + ? false + : mMethod == X_PERIOD_MANUALLY + ? mPeriod != NULL + : mMethod == X_PERIOD_AUTO + ? true + : false + // + ; + + // + return result; +} + +// +bool IsSpecifiedValid( + ENUM_X_PERIOD_METHOD mMethod, // Period Select Method + ENUM_TIMEFRAMES mPeriod // Selected Period +) +{ + return IsValid(mMethod, + mPeriod // + ); +} + +// +// Validate Swing Mode ... +bool IsValid(ENUM_X_SWING_TYPE value) +{ + // + bool result = false; + + // + result = + // + value == X_SWING_HIGH || + value == X_SWING_LOW + // + ; + + // + return result; +} + +// +// As IS ... + +// +// Determine a Position type is Long or not ... +bool IsLong(ENUM_POSITION_TYPE type) +{ + // + bool result = type == POSITION_TYPE_BUY; + + // + return result; +} +bool IsLong(ENUM_ORDER_TYPE type) +{ + // + bool result = type == ORDER_TYPE_BUY; + + // + return result; +} + +// +// Determine a Position type is Short or not ... +bool IsShort(ENUM_POSITION_TYPE type) +{ + // + bool result = type == POSITION_TYPE_SELL; + + // + return result; +} +bool IsShort(ENUM_ORDER_TYPE type) +{ + // + bool result = type == ORDER_TYPE_SELL; + + // + return result; +} + +// +// Retrieve Opposit Direction Type ... +ENUM_POSITION_TYPE GetOpposit(ENUM_POSITION_TYPE type) +{ + // + ENUM_POSITION_TYPE result = NULL; + + // + bool isLong = IsLong(type); + result = isLong + ? POSITION_TYPE_SELL + : POSITION_TYPE_BUY; + + // + return result; +} +ENUM_ORDER_TYPE GetOpposit(ENUM_ORDER_TYPE type) +{ + // + ENUM_ORDER_TYPE result = NULL; + + // + bool isLong = IsLong(type); + result = isLong + ? ORDER_TYPE_SELL + : ORDER_TYPE_BUY; + + // + return result; +} + +// +string ToString(ENUM_POSITION_TYPE value) +{ + // + string result = NULL; + + // + result = + // + IsLong(value) + ? "Long" + : "Short" + // + ; + + // + return result; +} +string ToString(ENUM_ORDER_TYPE value) +{ + // + string result = NULL; + + // + result = + // + IsLong(value) + ? "Long" + : "Short" + // + ; + + // + return result; +} + +// +// Check Expert Running in Testing Mode or not ... +bool IsRunningOnTestMode() +{ + // + bool result = false; + + // + // check programm mode ... + result = MQL5InfoInteger(MQL5_TESTING); + + // + return result; +} + +// +// Find Chart ID ... +long FindChartID( + string mSymbol = NULL, // Trading Symbol + ENUM_TIMEFRAMES mPeriod = NULL // Trading Period +) +{ + // + long result = ChartFirst(); + long first = result; + + // + while (result > 0) + { + // + string chSymbol = ChartSymbol(result); + ENUM_TIMEFRAMES chPeriod = ChartPeriod(result); + + // + bool isOwn = + // + chSymbol == mSymbol && + chPeriod == mPeriod + // + ; + if (isOwn) + { + break; + } + + // + result = ChartNext(result); + } + + // + return result; +} + +// +// Normalizers ... + +// +// Check a Symbol provided or not ... +// if not use Default ... +string NormalizeSymbol(string value) +{ + // + string result = value; + + // + if (!IsValid(result)) + { + result = _Symbol; + } + + // + return result; +} + +// +// Check a Datetime provided or not ... +// if not use Current ... +datetime NormalizeTime(datetime value) +{ + // + datetime result = value; + + // + if (!IsValid(result)) + { + result = TimeCurrent(); + } + + // + return result; +} + +// +// Check a Period provided or not ... +// if not use Default ... +ENUM_TIMEFRAMES NormalizePeriod(ENUM_TIMEFRAMES value) +{ + // + ENUM_TIMEFRAMES result = value; + + // + if (!IsValid(value)) + { + result = _Period; + } + + // + return result; +} + +// +// Normalize Cycle ... +ENUM_X_MARKET_CYCLES NormalizeCycle(ENUM_X_MARKET_CYCLES value) +{ + // + ENUM_X_MARKET_CYCLES result = value; + + // + if (!IsValid(result)) + { + result = X_MARKET_CYCLE_SHORT; + } + + // + return value; +} + +// +// Validate a Buffer Size for Looping or etc ... +bool IsValidSize(int size) +{ + // + bool result = size > 0; + + // + return result; +} + +template +bool IsValidSize(T &buffer[]) +{ + // + bool result = false; + + // + result = + // + IsValidSize(ArraySize(buffer)) + // + ; + + // + return result; +} + +// +// Check a Given Index is Valid or not ... +bool IsValidIndex(int index) +{ + return index >= 0; +} + +// +// Normalize Index Based On Specified Buffer ... +template +void NormalizeIndex( + int &index, + T &buffer[] // +) +{ + // + int bufferSize = ArraySize(buffer); + + // + if (bufferSize <= 0) + { + index = 0; + } + + // + if (index <= 0) + { + index = 0; + } + + // + if (index > bufferSize - 1) + { + index = bufferSize - 1; + } +} + +// +// Normalize Start and Count based on Specified Buffer ... +template +void NormalizeCount( + int &start, + int &count, + T &buffer[] // +) +{ + // + // Validate Buffer Size ... + int bufferSize = ArraySize(buffer); + if (!IsValidSize(bufferSize)) + { + return; + } + + // + // Normalization Start ... + NormalizeIndex( + start, + buffer // + ); + + // + if (count < start) + { + count = (start - count); + } + + // + // Normalization Count ... + + // + if (count < 0) + { + count = start; + } + + // + if (count > bufferSize) + { + count = bufferSize; + } +} + +// +// Normalize a give Volume ... +double NormalizeVolume( + double mVolume, // desired volume to normalize + string mSymbol = NULL, // Trading Symbol + int mLength = 2 // Length of Digits +) +{ + // + double result = mVolume; + + // + mSymbol = NormalizeSymbol(mSymbol); + + // + // Normalize Digits ... + int digits = GetDigits(mSymbol); + + // + mLength = + mLength == 0 || mLength > digits + ? digits + : MathMin(mLength, digits); + + // + // Normalize Volume ... + result = NormalizeDouble(result, mLength); + + // + double maxAvailableVolume = SymbolInfoDouble(mSymbol, SYMBOL_VOLUME_MAX); + double minAvailableVolume = SymbolInfoDouble(mSymbol, SYMBOL_VOLUME_MIN); + + // + // Validate Result ... + if (result > maxAvailableVolume) + { + result = maxAvailableVolume; + } + else if (result < minAvailableVolume) + { + result = minAvailableVolume; + } + + // + return result; +} + +// +// Normallize Price ... +double NormalizePrice( + double mPrice, // desired Price for normalization + string mSymbol = NULL // Trading Symbol +) +{ + // + double result = 0; + + // + mSymbol = NormalizeSymbol(mSymbol); + + // + double tickSize = 0; + result = SymbolInfoDouble(mSymbol, SYMBOL_TRADE_TICK_SIZE, tickSize); + + // + int digits = GetDigits(mSymbol); + result = NormalizeDouble(MathRound(mPrice / tickSize) * tickSize, digits); + + // + return result; +} + +// +// Prices ... + +// +// Retrieve Ask Price ... +double GetAsk( + string mSymbol = NULL // Trading Symbol +) +{ + // + mSymbol = NormalizeSymbol(mSymbol); + + // + double result = SymbolInfoDouble(mSymbol, SYMBOL_ASK); + + // + return result; +} + +// +// Retrieve Bid Price ... +double GetBid( + string mSymbol = NULL // Trading Symbol +) +{ + // + mSymbol = NormalizeSymbol(mSymbol); + + // + double result = SymbolInfoDouble(mSymbol, SYMBOL_BID); + + // + return result; +} + +// +// Retrieve Spread Price ... +double GetSpread( + string mSymbol = NULL // Trading Symbol +) +{ + // + mSymbol = NormalizeSymbol(mSymbol); + + // + double ask = GetAsk(mSymbol); + double bid = GetBid(mSymbol); + + // + double result = MathAbs(ask - bid); + + // + return result; +} + +// +// Retrieve Point Value ... +double GetPoints( + string mSymbol = NULL // Trading Symbol +) +{ + // + mSymbol = NormalizeSymbol(mSymbol); + + // + double result = SymbolInfoDouble(mSymbol, SYMBOL_POINT); + + // + return result; +} + +// +// Retrieve Point Digits ... +int GetDigits( + string mSymbol = NULL // Trading Symbol +) +{ + // + mSymbol = NormalizeSymbol(mSymbol); + + // + int result = (int)SymbolInfoInteger(mSymbol, SYMBOL_DIGITS); + + // + return result; +} + +// +// Retrieve Entry Price ... +double GetEntry( + string mSymbol = NULL, // Trading Symbol + ENUM_POSITION_TYPE type = POSITION_TYPE_BUY // Get entry price for Which direction trade ... +) +{ + // + double result = 0; + + // + mSymbol = NormalizeSymbol(mSymbol); + + // + result = + IsLong(type) + ? GetAsk(mSymbol) + : GetBid(mSymbol); + result = NormalizePrice(result, mSymbol); + + // + return result; +} +double GetEntry( + string mSymbol = NULL, // Trading Symbol + ENUM_X_DIRECTION type = X_DIRECTION_BULLISH // Get entry price for Which direction trade ... +) +{ + // + double result = 0; + + // + mSymbol = NormalizeSymbol(mSymbol); + + // + result = + IsBullish(type) + ? GetAsk(mSymbol) + : GetBid(mSymbol); + result = NormalizePrice(result, mSymbol); + + // + return result; +} + +// +// Retrieve Exit Price ... +double GetExit( + string mSymbol = NULL, // Trading Symbol + ENUM_POSITION_TYPE type = POSITION_TYPE_BUY // Get entry price for Which direction trade ... +) +{ + // + double result = 0; + + // + mSymbol = NormalizeSymbol(mSymbol); + + // + result = + IsLong(type) + ? GetBid(mSymbol) + : GetAsk(mSymbol); + result = NormalizePrice(result, mSymbol); + + // + return result; +} +double GetExit( + string mSymbol = NULL, // Trading Symbol + ENUM_X_DIRECTION type = X_DIRECTION_BULLISH // Get entry price for Which direction trade ... +) +{ + // + double result = 0; + + // + mSymbol = NormalizeSymbol(mSymbol); + + // + result = + IsBullish(type) + ? GetBid(mSymbol) + : GetAsk(mSymbol); + result = NormalizePrice(result, mSymbol); + + // + return result; +} + +// +// Get 1 Pip in Price Value ... +double GetPipPrice( + string mSymbol = NULL // Trading Symbol +) +{ + // + mSymbol = NormalizeSymbol(mSymbol); + + // + double symbolPoint = GetPoints(mSymbol); + int symbolDigits = GetDigits(mSymbol); + + // + double result = symbolPoint; + if (symbolDigits == 3 || symbolDigits == 5) + { + result *= 10; + } + + // + return result; +} + +// +// Converts Pips To Price ... +double PipsToPrice( + double mPips, // pips amount + string mSymbol = NULL // Trading Symbol +) +{ + // + mSymbol = NormalizeSymbol(mSymbol); + + // + int digits = GetDigits(mSymbol); + double pipValue = GetPipPrice(mSymbol); + double result = mPips * pipValue; + + // + result = NormalizePrice(result, mSymbol); + + // + return result; +} + +// +// Converts Price to Pips ... +double PriceToPips( + double mPrice, // the price amount which required to calculate + string mSymbol = NULL // Trading Symbol +) +{ + // + mSymbol = NormalizeSymbol(mSymbol); + mPrice = NormalizePrice(mPrice, mSymbol); + + // + int digits = GetDigits(mSymbol); + double pipPrice = GetPipPrice(mSymbol); + + // + double result = mPrice / pipPrice; + + // + result = NormalizeDouble(result, digits); + + // + return result; +} + +// +// Convert Price to Point ... +double PriceToPoint( + double price, // the price amount which required to calculate + string mSymbol = NULL // Trading Symbol +) +{ + // + double result = 0; + + // + mSymbol = NormalizeSymbol(mSymbol); + price = NormalizePrice(price, mSymbol); + + // + double point = GetPoints(mSymbol); + result = price / point; + + // + return result; +} + +// +// Converts Point to Price ... +double PointToPrice( + double points, // Points Amount + string mSymbol = NULL // Trading Symbol +) +{ + // + double result = 0; + + // + mSymbol = NormalizeSymbol(mSymbol); + + // + double point = GetPoints(mSymbol); + result = points * point; + + // + result = NormalizePrice(result, mSymbol); + + // + return result; +} + +// +// Converts Series Mode to XPRICE ... +ENUM_X_PRICE ToPrice( + ENUM_SERIESMODE mMode // Specified Series Mode ... +) +{ + // + ENUM_X_PRICE result = X_PRICE_CLOSE; + + // + switch (mMode) + { + // + // High ... + case MODE_HIGH: + result = X_PRICE_HIGH; + break; + + // + // Open ... + case MODE_OPEN: + result = X_PRICE_OPEN; + break; + + // + // Low ... + case MODE_LOW: + result = X_PRICE_LOW; + break; + + // + // Close ... + // Default ... + case MODE_CLOSE: + default: + result = X_PRICE_CLOSE; + break; + } + + // + return result; +} + +// +// Retrieve Applied Price ... +template +double GetAppliedPrice( + ENUM_APPLIED_PRICE tprice, // Type of Price Selection + T &open[], // Open Prices + T &high[], // High Preices + T &low[], // Low Prices + T &close[], // Close Prices + int i // Bar Index +) +{ + switch (tprice) + { + case PRICE_CLOSE: + return (close[i]); + case PRICE_OPEN: + return (open[i]); + case PRICE_HIGH: + return (high[i]); + case PRICE_LOW: + return (low[i]); + case PRICE_MEDIAN: + return ((high[i] + low[i]) / 2.0); + case PRICE_TYPICAL: + return ((high[i] + low[i] + close[i]) / 3.0); + case PRICE_WEIGHTED: + return ((high[i] + low[i] + close[i] + close[i]) / 4.0); + } + return (0); +} + +// +double iGetPrice( + int tprice, + double open, + double high, + const double low, + const double close // +) +{ + // + switch (tprice) + { + case PRICE_CLOSE: + return (close); + case PRICE_OPEN: + return (open); + case PRICE_HIGH: + return (high); + case PRICE_LOW: + return (low); + case PRICE_MEDIAN: + return ((high + low) / 2.0); + case PRICE_TYPICAL: + return ((high + low + close) / 3.0); + case PRICE_WEIGHTED: + return ((high + low + close + close) / 4.0); + } + + // + return (0); +} + +/** + * Calculates Price Change Percentage based on + * Several Params ... + * + * @param _symbol: Symbol ... + * @param _period: Time Frame ... + * @param _from: start Bar Index ... + * @param _length: Length of Bars ... + * + * @return ( double ) + */ +double GetPriceChanged( + string _symbol = NULL, + ENUM_TIMEFRAMES _period = NULL, + int _from = 0, + int _length = 3 // +) +{ + // + double result = 0; + + // + NormalizeSymbol(_symbol); + NormalizePeriod(_period); + + // + if (_from < 0) + { + _from = 0; + } + + // + if (_length < 2) + { + _length = 2; + } + + // + double closes[]; + int copiedCloses = CopyClose( + _symbol, + _period, + _from, + _length, + closes // + ); + if (copiedCloses < _length) + { + return result; + } + ArrayReverse(closes); + + // + double change = (closes[0] - closes[_length - 1]) / closes[_length - 1] * 100; + result = change; + + // + return result; +} + +// +// Calculate TP/SL for Specified Type of Positions ... +void CalculateTPSL( + double &mSL, // Hold SL + double &mTP, // Hold TP + ENUM_POSITION_TYPE mType, // Position Type Long (Buy) / Short (Sell) + double mEntry, // Entry Price + double mR2R = 1, // Provided Risk To Reward Ratio + double slPrice = 0, // Provided SL Price + double tpPrice = 0, // Provided TP Price + double priceToRisk = 0, // If Entry equal to Provided SL Price Risk Point + double priceToReward = 0 // If Entry equal to Provided TP Price Reward Point +) +{ + // + // if Both TP and SL Provided, ignore R2R and Calculate direct ... + // if SL provided, Calculate TP based on Provided R2R ... + // if TP provided, Calculate SL based on Provided R2R ... + // default R2R is set to 1 ... + + // + mSL = 0; + mTP = 0; + + // + bool isLong = IsLong(mType); + + // + // Set Default R2R ... + if (mR2R < 1) + { + mR2R = 1; + } + + // + if (mEntry <= 0 || + (tpPrice <= 0 && slPrice <= 0)) + { + return; + } + + // + double risk = 0; + double reward = 0; + + // + bool canCalculateBasedOnSL = slPrice > 0 && + (isLong + ? slPrice <= mEntry + : slPrice >= mEntry); + + // + bool canCalculateBasedOnTP = tpPrice > 0 && + (isLong + ? tpPrice >= mEntry + : tpPrice <= mEntry); + + // + if (canCalculateBasedOnSL && !canCalculateBasedOnTP) + { + // + risk = MathAbs(mEntry - slPrice); + if (risk == 0) + { + risk = priceToRisk; + } + reward = risk * mR2R; + } + else if (!canCalculateBasedOnSL && canCalculateBasedOnTP) + { + // + reward = MathAbs(mEntry - tpPrice); + if (reward == 0) + { + reward = priceToReward; + } + risk = reward / mR2R; + } + else if (!canCalculateBasedOnSL && !canCalculateBasedOnTP) + { + // + bool canSetTPPrice = isLong + ? tpPrice > mEntry + : tpPrice < mEntry; + if (canSetTPPrice) + { + mTP = tpPrice; + } + + // + bool canSetSLPrice = isLong + ? slPrice < mEntry + : slPrice > mEntry; + if (canSetSLPrice) + { + mSL = slPrice; + } + + // + return; + } + else if (canCalculateBasedOnSL && canCalculateBasedOnTP) + { + // + bool canSetTPPrice = isLong + ? tpPrice > mEntry + : tpPrice < mEntry; + if (canSetTPPrice) + { + mTP = tpPrice; + } + + // + bool canSetSLPrice = isLong + ? slPrice < mEntry + : slPrice > mEntry; + if (canSetSLPrice) + { + mSL = slPrice; + } + + // + return; + } + + // + mTP = isLong + ? mEntry + reward + : mEntry - reward; + + // + mSL = isLong + ? mEntry - risk + : mEntry + risk; +} + +// +bool CalculateTPSLByPoint( + double &mSL, // Hold SL + double &mTP, // Hold TP + ENUM_POSITION_TYPE mType, // Position Type Long (Buy) / Short (Sell) + double mEntry, // Entry Price + double mPointValue, // Point Value + double mR2R = 1, // Provided Risk To Reward Ratio + double slPoint = 0, // Provided SL Point + double tpPoint = 0 // Provided TP Point +) +{ + // + bool result = false; + + // + mSL = 0; + mTP = 0; + + // + bool isLong = IsLong(mType); + + // + // Set Default R2R ... + if (mR2R < 1) + { + mR2R = 1; + } + + // + if (mEntry <= 0 || + mPointValue <= 0 || + (slPoint <= 0 && tpPoint <= 0)) + { + return result; + } + + // + double risk = 0; + double reward = 0; + + // + bool canCalculateBasedOnSL = slPoint > 0; + + // + bool canCalculateBasedOnTP = tpPoint > 0; + + // + if (!canCalculateBasedOnSL && !canCalculateBasedOnTP) + { + return result; + } + + // + if (canCalculateBasedOnSL && canCalculateBasedOnTP) + { + // + reward = tpPoint * mPointValue; + risk = slPoint * mPointValue; + } + else if (!canCalculateBasedOnSL && canCalculateBasedOnTP) + { + // + reward = tpPoint * mPointValue; + risk = reward / mR2R; + } + else if (canCalculateBasedOnSL && !canCalculateBasedOnTP) + { + // + risk = slPoint * mPointValue; + reward = risk * mR2R; + } + + // + result = risk > 0 && reward > 0; + if (!result) + { + return result; + } + + // + mTP = isLong + ? mEntry + reward + : mEntry - reward; + + // + mSL = isLong + ? mEntry - risk + : mEntry + risk; + + // + return result; +} + +// +bool CalculateTPSLByPrice( + double &mSL, // Hold SL + double &mTP, // Hold TP + ENUM_POSITION_TYPE mType, // Position Type Long (Buy) / Short (Sell) + double mEntry, // Entry Price + double mR2R = 1 // Provided Risk To Reward Ratio +) +{ + // + bool result = false; + + // + bool isLong = IsLong(mType); + + // + // Set Default R2R ... + if (mR2R < 1) + { + mR2R = 1; + } + + // + if (mEntry <= 0 || + (mSL <= 0 && mTP <= 0)) + { + return result; + } + + // + double risk = 0; + double reward = 0; + + // + bool canCalculateBasedOnSL = mSL > 0; + bool canCalculateBasedOnTP = mTP > 0; + + // + if ( + !canCalculateBasedOnSL && + !canCalculateBasedOnTP) + { + return result; + } + + // + if (!canCalculateBasedOnSL && canCalculateBasedOnTP) + { + // + reward = MathAbs(mTP - mEntry); + risk = reward / mR2R; + } + else if (canCalculateBasedOnSL && !canCalculateBasedOnTP) + { + // + risk = MathAbs(mEntry - mSL); + reward = risk * mR2R; + } + + // + result = risk > 0 && reward > 0; + if (!result) + { + return result; + } + + // + mTP = isLong + ? mEntry + reward + : mEntry - reward; + + // + mSL = isLong + ? mEntry - risk + : mEntry + risk; + + // + return result; +} + +/** + * Retrieve Current Tick ... + */ +bool GetTick( + string mSymbol, + MqlTick &tick // +) +{ + return SymbolInfoTick(mSymbol, tick); +} + +/** + * Retrieve Tick Entry ... + */ +double GetTickEntry( + MqlTick &mTick, + ENUM_POSITION_TYPE type, + string mSymbol = NULL // +) +{ + // + double result = 0; + + // + mSymbol = NormalizeSymbol(mSymbol); + + // + result = + IsLong(type) + ? mTick.ask + : mTick.bid; + result = NormalizePrice(result, mSymbol); + + // + return result; +} + +/** + * Retrieve Tick Exit ... + */ +double GetTickExit( + MqlTick &mTick, + ENUM_POSITION_TYPE type, + string mSymbol = NULL // +) +{ + // + double result = 0; + + // + mSymbol = NormalizeSymbol(mSymbol); + + // + result = + IsLong(type) + ? mTick.bid + : mTick.ask; + result = NormalizePrice(result, mSymbol); + + // + return result; +} + +/** + * Calculate Momentum Changes based on Given Price + */ +double CalculateMomentum( + double currentPrice, + double previousPrice // +) +{ + // + double result = 0; + + // + return result; +} + +/** + * Detect Possible Momentum Changes + * Using MqlTick ... + */ +bool DetectMomentumChange( + ENUM_POSITION_TYPE type, + string mSymbol = NULL, + int mLength = 14 // +) +{ + // + bool result = false; + + // + mSymbol = NormalizeSymbol(mSymbol); + + // + MqlTick ticks[]; + int copied = CopyTicks( + mSymbol, + ticks, + COPY_TICKS_ALL, + 0, + mLength + 1 // + ); + + // + result = copied > mLength; + if (!result) + { + return result; + } + + // + double previousPrice = GetTickExit( + ticks[mLength], + type, + mSymbol // + ); + for (int i = mLength - 1; i >= 0; i--) + { + // + double currentPrice = GetTickExit( + ticks[i], + type, + mSymbol // + ); + + // + double momentum = CalculateMomentum( + currentPrice, + previousPrice // + ); + + // + if (fabs(momentum) > 1.0) + { + // + result = true; + break; + } + } + + // + return result; +} + +// +// Fill Specified Applied Prices ... +int FillPrice( + double &buffer[], + ENUM_APPLIED_PRICE _mAppliedTo = PRICE_CLOSE, + string _mSymbol = NULL, + ENUM_TIMEFRAMES _mPeriod = NULL, + int _mStart = 0, + int _mLoopback = 10 // +) +{ + // + int result = 0; + + // + if (_mStart < 0) + { + _mStart = 0; + } + + // + if (_mLoopback < 7) + { + _mLoopback = 7; + } + + // + _mSymbol = NormalizeSymbol(_mSymbol); + _mPeriod = NormalizePeriod(_mPeriod); + + // + Clean(buffer); + ArraySetAsSeries(buffer, true); + + // + double open[]; + result = CopyOpen( + _mSymbol, + _mPeriod, + _mStart, + _mLoopback, + open // + ); + if (!IsValidSize(result)) + { + return result; + } + + // + double high[]; + result = CopyHigh( + _mSymbol, + _mPeriod, + _mStart, + _mLoopback, + high // + ); + if (!IsValidSize(result)) + { + return result; + } + + // + double low[]; + result = CopyLow( + _mSymbol, + _mPeriod, + _mStart, + _mLoopback, + low // + ); + if (!IsValidSize(result)) + { + return result; + } + + // + double close[]; + result = CopyClose( + _mSymbol, + _mPeriod, + _mStart, + _mLoopback, + close // + ); + if (!IsValidSize(result)) + { + return result; + } + + // + for (int i = 0; i < result; i++) + { + // + double iPrice = GetAppliedPrice( + _mAppliedTo, + open, + high, + low, + close, + i // + ); + + // + Add( + iPrice, + buffer // + ); + } + + // + result = ArraySize(buffer); + + // + return result; +} + +// +// Symbols ... + +// +// Retrieve Available Symbols ... +int GetAllSymbols( + string &symbols[], // Hold Result + bool onlyInWatchList = false, // Specified Retrieve only Symbols which in Watch List + bool forceClean = true // Force To Clean Result Array +) +{ + // + int result = 0; + + // + if (forceClean) + { + Clean(symbols); + } + + // + int beforeSize = ArraySize(symbols); + + // + int symbolsCount = SymbolsTotal(onlyInWatchList); + if (symbolsCount <= 0) + { + return result; + } + + // + for (int i = 0; i < symbolsCount; i++) + { + // + string iSymbol = SymbolName( + i, + onlyInWatchList + // + ); + if (!IsValid(iSymbol)) + { + continue; + } + + // + Add( + iSymbol, + symbols + // + ); + } + + // + int afterSize = ArraySize(symbols); + + // + result = afterSize - beforeSize; + + // + return result; +} + +// +// This is a Global Way to Filter Symbols +// you can pass Specific string as Query or a List String for Filtering ... +int FilterSymbols( + string query, // Which Query to Search Symbol + string &symbols[], // Hold Result + bool onlyInWatchList = false, // Specified Retrieve only Symbols which in Watch List + bool forceClean = true, // Force To Clean Result Array + bool ignoreCase = true, // Ignore Case + string querySeparator = "," // If Provided means query is a COllection of Queries and need to be Splitted +) +{ + // + int result = 0; + + // + if (forceClean) + { + Clean(symbols); + } + + // + if (!IsValid(query)) + { + return result; + } + + // + // Check Query is an String array or not ... + string mQueries[]; + int queriesCount = 0; + if (IsValid(querySeparator) && Contains(querySeparator, query, true)) + { + // + queriesCount = SplitContent( + mQueries, + query, + querySeparator + // + ); + } + + // + int beforeSize = ArraySize(symbols); + + // + string allSymbols[]; + int allSymbolsCount = GetAllSymbols( + allSymbols, + onlyInWatchList, + forceClean); + if (allSymbolsCount <= 0) + { + return result; + } + + // + // Loop Through all Symbols ... + for (int i = 0; i < allSymbolsCount; i++) + { + // + string iSymbol = allSymbols[i]; + + // + bool isFilterPassed = false; + if (queriesCount == 0) + { + // + isFilterPassed = Contains( + query, + iSymbol, + ignoreCase + // + ); + } + else if (queriesCount > 0) + { + // + isFilterPassed = Contains( + mQueries, + iSymbol, + ignoreCase + // + ); + } + + // + if (isFilterPassed) + { + // + Add( + iSymbol, + symbols + // + ); + } + } + + // + int afterSize = ArraySize(symbols); + + // + result = afterSize - beforeSize; + + // + return result; +} + +// +int FilterUSDSymbols( + string &symbols[], // Hold Result + bool onlyInWatchList = false, // Specified Retrieve only Symbols which in Watch List + bool forceClean = true, // Force To Clean Result Array + bool ignoreCase = true, // Ignore Case + string querySeparator = "," // If Provided means query is a COllection of Queries and need to be Splitted +) +{ + // + return FilterSymbols( + "USD", + symbols, + onlyInWatchList, + forceClean, + ignoreCase, + querySeparator + // + ); +} + +// +// Time / Date ... + +// +// 0 => Sunday +// 1 => Monday +// 2 => Tuesday +// 3 => Wednesday +// 4 => Thursday +// 5 => Friday +// 6 => Saturday +enum ENUM_X_WEEK_DAYS +{ + X_WEEK_DAY_NONE = -1, + X_WEEK_DAY_SUNDAY = 0, + X_WEEK_DAY_MONDAY = 1, + X_WEEK_DAY_TUESDAY = 2, + X_WEEK_DAY_WEDNESDAY = 3, + X_WEEK_DAY_THURSDAY = 4, + X_WEEK_DAY_FRIDAY = 5, + X_WEEK_DAY_SATURDAY = 6, +}; + +// +// Retrieve Day of Week ... +ENUM_X_WEEK_DAYS GetDayOfWeek( + datetime time = NULL // +) +{ + // + ENUM_X_WEEK_DAYS result = X_WEEK_DAY_NONE; + + // + time = NormalizeTime(time); + MqlDateTime timeStruct; + bool hasDate = TimeToStruct( + time, + timeStruct // + ); + if (!hasDate) + { + return result; + } + + // + result = (ENUM_X_WEEK_DAYS)timeStruct.day_of_week; + + // + return result; +} + +// +// 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; +} + +// +// Converts Hours to Seconds ... +int HoursToSeconds(int value) +{ + // + int result = 0; + + // + if (value < 0) + { + value = 0; + } + + // + if (value == 0) + { + return result; + } + + // + result = value * 60 * 60; + + // + return result; +} + +// +// Retrieve DateTime Structure ... +MqlDateTime GetCurrentTime() +{ + // + MqlDateTime result = {}; + + // + datetime cTime = TimeCurrent(); + TimeToStruct(cTime, 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; +} + +// +int GetLocalOffset() +{ + // + MqlDateTime cTimeStruct; + datetime cTime = TimeCurrent(cTimeStruct); + + // + MqlDateTime cLTimeStruct; + datetime cLTime = TimeLocal(cLTimeStruct); + + // + cTimeStruct.sec = 0; + cTime = StructToTime(cTimeStruct); + + // + cLTimeStruct.sec = 0; + cLTime = StructToTime(cLTimeStruct); + + // + int result = ((int)cLTime - (int)cTime); + + // + return result; +} + +// +int GetUTCRequiredTimeOffset() +{ + // + int utcOffset = TimeGMTOffset(); + int localOffset = GetLocalOffset(); + + // + int result = utcOffset + localOffset; + + // + return result; +} + +// +datetime GetUTCTime( + datetime time = NULL, + bool applyTradeServerTime = false // +) +{ + // + datetime result = NULL; + + // + NormalizeTime(time); + + // + datetime cTime = TimeCurrent(); + datetime cTimeLocal = TimeLocal(); + + // + int cLocalOffset = ((int)cTimeLocal - (int)cTime); + int gmtOffset = TimeGMTOffset(); + int offsetDelte = gmtOffset + cLocalOffset; + int requiredUTCOffset = GetUTCRequiredTimeOffset(); + if (requiredUTCOffset > 0) + { + requiredUTCOffset = -1 * requiredUTCOffset; + } + + // + int timeSeconds = (int)time; + int resultSeconds = timeSeconds + requiredUTCOffset; + + // + result = (datetime)(resultSeconds); + + // + return result; +} + +// +// Retrieve only Hour and Minute as String ... +string GetTimeString( + datetime time = NULL // +) +{ + // + NormalizeTime(time); + + // + string result = NULL; + + // + MqlDateTime tStruct; + bool isStructed = TimeToStruct(time, tStruct); + if (!isStructed) + { + return result; + } + + // + string hour = ToString(tStruct.hour); + hour = + StringLen(hour) == 1 + ? "0" + hour + : hour; + + // + string minute = ToString(tStruct.min); + minute = + StringLen(minute) == 1 + ? "0" + minute + : minute; + + // + result = hour + ":" + minute; + + // + return result; +} + +// +// Converts a Date time to File Format ... +string ToFormatString( + datetime mTime, + string separator = "_" // +) +{ + // + string result = NULL; + + // + if (!IsValid(mTime)) + { + return result; + } + + // + MqlDateTime timeStruct; + bool isConverts = TimeToStruct( + mTime, + timeStruct // + ); + if (!isConverts) + { + return result; + } + + // + string year = ToString(timeStruct.year); + string month = ToString(timeStruct.mon); + string day = ToString(timeStruct.day); + string hour = ToString(timeStruct.hour); + string minute = ToString(timeStruct.min); + string second = ToString(timeStruct.sec); + + // + result = + // + // Year ... + year + separator + + // + // Month ... + (StringLen(month) == 1 + ? "0" + month + : month) + + separator + + // + // Day ... + (StringLen(day) == 1 + ? "0" + day + : day) + + separator + + // + // Hour ... + (StringLen(hour) == 1 + ? "0" + hour + : hour) + + separator + + // + // Minute ... + (StringLen(minute) == 1 + ? "0" + minute + : minute) + + separator + + // + // Seconds ... + (StringLen(second) == 1 + ? "0" + second + : second) + + separator + + // + "" + // + ; + + // + return result; +} + +/** + * Converts an String Represetation of Time (00:00) to Date Time .. + * + * @param value: String ... + * + * @return ( datetime ) + */ +datetime ParseDateTimeFromTimeString(string value) +{ + // + datetime result = NULL; + + // + if (!IsValid(value)) + { + return result; + } + + // + // Check Signalling Time ... + MqlDateTime cTime; + bool isTimeRecieved = TimeCurrent(cTime); + if (!isTimeRecieved) + { + return result; + } + + // + // Split ... + string parts[]; + int partsCount = SplitContent( + parts, + value, + ":" + // + ); + if (!IsValidSize(partsCount)) + { + return result; + } + + // + int hour = 0; + int minute = 0; + if (partsCount >= 1) + { + hour = (int)(parts[0]); + } + if (partsCount >= 2) + { + minute = (int)(parts[1]); + } + + // + cTime.day_of_week = 0; + cTime.day_of_year = 0; + + // + cTime.hour = hour; + cTime.min = minute; + + // + result = StructToTime(cTime); + + // + return result; +} + +// +// Check Specific Time in Range of another Time ... +bool IsTimeInRange( + datetime currentTime = NULL, + datetime startTime = NULL, + datetime stopTime = NULL // +) +{ + // + bool result = false; + + // + // Normallize Current Time ... + currentTime = NormalizeTime(currentTime); + + // + result = !IsValid(startTime) && + !IsValid(stopTime); + if (result) + { + return result; + } + + // + result = IsValid(startTime) && + IsValid(stopTime); + if (!result) + { + // + result = IsValid(startTime) && + currentTime >= startTime; + + // + return result; + } + + // + result = currentTime >= startTime && + currentTime < stopTime; + + // + return result; +} +bool IsTimeInRange( + datetime currentTime, + string startTime, + string endTime // +) +{ + // + bool result = false; + + // + result = IsValid(startTime) && + IsValid(endTime); + if (!result) + { + // + // Here Since there isnot provide any + // data source we pass result as true ... + result = true; + return result; + } + + // + // Converts String Representation to Time ... + datetime st = ParseDateTimeFromTimeString(startTime); + datetime et = ParseDateTimeFromTimeString(endTime); + + // + result = IsTimeInRange( + currentTime, + st, + et // + ); + + // + return result; +} + +// +// Bar Times ... + +// +// Retrieve Specified Bar Time ... +datetime GetBarTime( + string mSymbol = "", // Specify Symbol + ENUM_TIMEFRAMES mPeriod = NULL, // Specify TimeFrame + int barIndex = 0 // Specify Bar Index +) +{ + // + // Validate and Normalize Args ... + + // + mSymbol = NormalizeSymbol(mSymbol); + mPeriod = NormalizePeriod(mPeriod); + + // + // Retrieve Bar Time ... + datetime result = iTime( + mSymbol, + mPeriod, + barIndex); + + // + return result; +} + +// +// Retrieve Specified Bar Time ... +ulong GetBarTimeAsSeconds( + string mSymbol = "", // Specify Symbol + ENUM_TIMEFRAMES mPeriod = NULL, // Specify TimeFrame + int barIndex = 0 // Specify Bar Index +) +{ + // + // Retrieve Bar Time ... + datetime time = GetBarTime( + mSymbol, + mPeriod, + barIndex); + + // + ulong result = TimeToSeconds(time); + + // + return result; +} + +// +// Retrieve Specified Bar Time ... +ulong GetBarTimeAsMilliSeconds( + string mSymbol = "", // Specify Symbol + ENUM_TIMEFRAMES mPeriod = NULL, // Specify TimeFrame + int barIndex = 0 // Specify Bar Index +) +{ + // + // Retrieve Bar Time ... + datetime time = GetBarTime( + mSymbol, + mPeriod, + barIndex); + + // + ulong result = TimeToMilliSeconds(time); + + // + return result; +} + +// +// Retrieve a Bar Time Structure ... +MqlDateTime GetBarTimeStruct( + string mSymbol = "", // Specify Symbol + ENUM_TIMEFRAMES mPeriod = NULL, // Specify TimeFrame + int barIndex = 0 // Specify Bar Index +) +{ + // + MqlDateTime result = {}; + + // + // Retrieve Bar Time ... + datetime barTime = GetBarTime( + mSymbol, + mPeriod, + barIndex); + + // + // Convert to Structure ... + TimeToStruct(barTime, result); + + // + return result; +} + +// +// Retrieve Last Available Bar Time of +// Dest Period inside Source Period ... +datetime GetLastBarTime( + ENUM_TIMEFRAMES sourcePeriod, + ENUM_TIMEFRAMES destPeriod // +) +{ + // + datetime result = NULL; + + // + if (!IsValid(sourcePeriod) || + !IsValid(destPeriod)) + { + return result; + } + + // + int sourceSeconds = PeriodSeconds(sourcePeriod); + int destSeconds = PeriodSeconds(destPeriod); + if (sourceSeconds < destSeconds) + { + return result; + } + + // + XOHCL sourceBar; + bool isInited = sourceBar.Init( + _Symbol, + sourcePeriod, + 0 // + ); + if (!isInited) + { + return result; + } + + // + result = (datetime)((((int)sourceBar.time) + sourceSeconds) - destSeconds); + + // + return result; +} + +// +// Other Tools ... + +// +template +bool IsSame( + T &buffer[], // Search Buffer + int count = 5, // Number of Searchs + int start = 0 // Start ... +) +{ + // + bool result = false; + + // + int bufferSize = ArraySize(buffer); + result = bufferSize > 0; + if (!result) + { + return result; + } + + // + // Validate Count ... + result = start + count < bufferSize; + if (!result) + { + return result; + } + + // + T iTem = buffer[start]; + for (int i = start; i < start + count; i++) + { + // + if (iTem != buffer[i]) + { + result = false; + break; + } + + // + if (!result) + { + result = true; + } + } + + // + return result; +} + +// +// Check first Cross Over second at index ... +bool IsCrossedOver( + const double &first[], // the buffer which check crossing over second buffer + const double &second[], // first buffer checks based on this buffer + const int index = 0 // check crosses in specific index +) +{ + // + bool result = false; + + // + // Validate Args ... + if (ArraySize(first) < index + 1 || ArraySize(second) < index + 1) + { + return result; + } + + // + result = first[index] > second[index] && + !(first[index + 1] > second[index + 1]); + + // + return result; +} + +// +// Check first is Over second at 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 index = 0 // check crosses in specific index +) +{ + // + bool result = false; + + // + // Validate Args ... + if (ArraySize(first) < index + 1 || ArraySize(second) < index + 1) + { + return result; + } + + // + result = first[index] > second[index] && + first[index + 1] > second[index + 1]; + + // + return result; +} + +// +// Check first Cross Under second at index ... +bool IsCrossedUnder( + const double &first[], // the buffer which check crossing under second buffer + const double &second[], // first buffer checks based on this buffer + const int index = 0 // check crosses in specific index +) +{ + // + bool result = false; + + // + // Validate Args ... + if (ArraySize(first) < index + 1 || ArraySize(second) < index + 1) + { + return result; + } + + // + result = first[index] < second[index] && + !(first[index + 1] < second[index + 1]); + + // + return result; +} + +// +// Check first is Under second at 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 index = 0 // check crosses in specific index +) +{ + // + bool result = false; + + // + // Validate Args ... + if (ArraySize(first) < index + 1 || ArraySize(second) < index + 1) + { + return result; + } + + // + result = first[index] < second[index] && + first[index + 1] < second[index + 1]; + + // + return result; +} + +// +// Check if a Value Increasing in Loopback ... +bool IsIncreasing( + const double &buffer[], // the Buffer which required to search + int from = -1, // Last Time Index + int to = -1 // Fisrs Tima Index +) +{ + // + bool result = false; + + // + if (from == -1) + { + from = ArraySize(buffer) - 1; + } + + // + if (to == -1) + { + to = 0; + } + + // + // 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( + buffer, + from, + i // + ); + + // + // Check Result ... + result = result && isPassed && isIIncreasing; + if (!result) + { + break; + } + } + + // + return result; +} + +// +// Check if a Value Decreasing in Loopback ... +bool IsDecreasing( + const double &buffer[], // the Buffer which required to search + int from = -1, // Last Time Index + int to = -1 // Fisrs Tima Index +) +{ + // + bool result = false; + + // + if (from == -1) + { + from = ArraySize(buffer) - 1; + } + + // + if (to == -1) + { + to = 0; + } + + // + // 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( + buffer, + from, + i // + ); + + // + // Check Result ... + result = result && isPassed && isIDecreasing; + if (!result) + { + break; + } + } + + // + return result; +} + +// +bool IsTrendingUp( + const double &buffer1[], // First Buffer + const double &buffer2[] // Seccend Buffer +) +{ + // + bool result = false; + + // + int buffer1Count = ArraySize(buffer1); + int buffer2Count = ArraySize(buffer2); + if (buffer1Count <= 0 || buffer2Count <= 0) + { + return result; + } + + // + int count = MathMin(buffer1Count, buffer2Count); + if (count <= 1) + { + return result; + } + + // + int upCounts = 0; + int downCounts = 0; + double value = MathAbs(buffer1[0] - buffer2[0]); + for (int i = 1; i < count; i++) + { + // + double iValue = MathAbs(buffer1[i] - buffer2[i]); + + // + if (value > iValue) + { + upCounts++; + } + + // + if (value < iValue) + { + downCounts++; + } + } + + // + result = upCounts > 1 && upCounts > downCounts; + + // + return result; +} + +// +bool IsTrendingDown( + const double &buffer1[], // First Buffer + const double &buffer2[] // Seccend Buffer +) +{ + // + bool result = false; + + // + int buffer1Count = ArraySize(buffer1); + int buffer2Count = ArraySize(buffer2); + if (buffer1Count <= 0 || buffer2Count <= 0) + { + return result; + } + + // + int count = MathMin(buffer1Count, buffer2Count); + if (count <= 1) + { + return result; + } + + // + int upCounts = 0; + int downCounts = 0; + double value = MathAbs(buffer1[0] - buffer2[0]); + for (int i = 1; i < count; i++) + { + // + double iValue = MathAbs(buffer1[i] - buffer2[i]); + + // + if (value > iValue) + { + upCounts++; + } + + // + if (value < iValue) + { + downCounts++; + } + } + + // + result = downCounts > 1 && downCounts > upCounts; + + // + return result; +} + +// +// Calculate Slope of Specified Buffer at Specified Index ... +double GetSlope( + const double &buffer[], // Buffer + int from, // In Past Index ... + int to // In Past Index ... +) +{ + // + double result = 0; + + // + if (from > ArraySize(buffer) || to > ArraySize(buffer)) + { + return result; + } + + // + double toValue = buffer[to]; + double fromValue = buffer[from]; + double deltaValue = toValue - fromValue; + double deltaTime = from - to; + + // + result = deltaValue / deltaTime; + + // + return result; +} + +// +// Check Bar Reject Specified Value ... +bool IsBarReject( + double value, + ENUM_X_DIRECTION dir, + XOHCL &bar // +) +{ + // + bool result = false; + + // + result = value > 0 && + bar.IsValid() && + HasDirection(dir); + if (!result) + { + return result; + } + + // + bool isUp = IsBullish(dir); + bool isDown = IsBearish(dir); + + // + result = + // + isUp + ? bar.IsBullish() && + bar.low < value && + bar.GetDown() > value + : isDown + ? bar.IsBearish() && + bar.high > value && + bar.GetUp() < value + : false + // + ; + + // + return result; +} + +// +// Check Bar Break Specified Value ... +bool IsBarBreak( + double value, + ENUM_X_DIRECTION dir, + XOHCL &bar // +) +{ + // + bool result = false; + + // + result = value > 0 && + bar.IsValid() && + HasDirection(dir); + if (!result) + { + return result; + } + + // + XOHCL pBar; + result = bar.GetPreviousBar(pBar); + if (!result) + { + return result; + } + + // + bool isUp = IsBullish(dir); + bool isDown = IsBearish(dir); + + // + result = + isUp + ? bar.IsBullish() && + ((bar.GetDown() < value && + bar.GetUp() > value) || + (bar.close > value && + pBar.close < value)) + : isDown + ? bar.IsBearish() && + ((bar.GetUp() > value && + bar.GetDown() < value) || + (bar.close < value && + pBar.close > value)) + : false; + + // + return result; +} + +// +// Calculate Fib Level ... +double GetFibonacciLevel( + double upPrice, // Upper Bound + double downPrice, // Downer Bound + double level, // Level Multiplier Factor + int direction // From Down to Up < 0, other wise Vice Versa + // +) +{ + // + double ling = upPrice - downPrice; + double pLevel = (ling / 100) * (level * 100); + + // + double result = direction > 0 ? upPrice - pLevel : downPrice + pLevel; + + // + return result; +} + +// +double GetFibonacciLevel( + double mUp, + double mDown, + ENUM_X_FIBO_LEVELS mLevel, + ENUM_X_DIRECTION mForDir // +) +{ + // + double result = 0; + + // + double levelValue = GetFiboLevelValue(mLevel); + + // + bool isValid = + // + mUp > 0 && + mDown > 0 && + levelValue > 0 && + mUp > mDown && + HasDirection(mForDir) + // + ; + if (!isValid) + { + return result; + } + + // + bool isBullish = IsBullish(mForDir); + + // + double ling = mUp - mDown; + double pLevel = (ling / 100) * (levelValue * 100); + + // + result = + isBullish + ? mUp - pLevel + : mDown + pLevel; + + // + return result; +} + +// +// Method 1 +// Normalize between 1 and 0 ... +template +double GetNormalizedValueMethod1( + T &buffer[], // Array which required to Normalize + int mLength, // Length of Normalization + int mStart = 0, // start index + int digits = 5 // Normalization Digits +) +{ + // + double result = 0; + + // + if (digits <= 5) + { + digits = 5; + } + + // + int bufferSize = ArraySize(buffer); + if (!IsValidSize(bufferSize)) + { + return result; + } + + // + // Normalize Count ... + NormalizeCount( + mStart, + mLength, + buffer // + ); + + // + T max = 0; + T min = 0; + + // + if (bufferSize != mLength) + { + // + T tmp[]; + Copy( + mStart, + mLength, + buffer, + tmp // + ); + + // + max = GetMax(tmp); + min = GetMin(tmp); + } + + // + if (bufferSize == mLength) + { + // + max = GetMax(buffer); + min = GetMin(buffer); + } + + // + T iValue = buffer[mStart]; + + // + double minMaxDiff = (max - min); + if (minMaxDiff <= 0) + { + return result; + } + + // + result = (iValue - min) / minMaxDiff; + + // + result = NormalizeDouble(result, digits); + + // + return result; +} + +// +// Method 2 +// Normalize Between Specified Upper and Lower ... +template +double GetNormalizedValueMethod2( + T &buffer[], // Array which required to Normalize + int mLength, // Length of Normalization + int mUpper, // Specified Upper Value + int mLower, // Specified Lower Value + int mStart = 0, // start index + int digits = 5 // Normalization Digits +) +{ + // + double result = 0; + + // + if (digits <= 5) + { + digits = 5; + } + + // + int bufferSize = ArraySize(buffer); + if (!IsValidSize(bufferSize)) + { + return result; + } + + // + // Normalize Count ... + NormalizeCount( + mStart, + mLength, + buffer // + ); + + // + T max = 0; + T min = 0; + + // + if (bufferSize != mLength) + { + // + T tmp[]; + Copy( + mStart, + mLength, + buffer, + tmp // + ); + + // + max = GetMax(tmp); + min = GetMin(tmp); + } + + // + if (bufferSize == mLength) + { + // + max = GetMax(buffer); + min = GetMin(buffer); + } + + // + T iValue = buffer[mStart]; + + // + double minMaxDiff = (max - min); + double boundaryDiff = (mUpper - mLower); + if (minMaxDiff <= 0 || boundaryDiff <= 0) + { + return result; + } + + // + result = boundaryDiff / (minMaxDiff * (iValue - max) + max); + + // + result = NormalizeDouble(result, digits); + + // + return result; +} + +// +void NormalizeBuffer( + double &source[], // Source Buffer + double &dest[], // Result Buffer + double upper = 100, // Upper Value to Normalize + double lower = -100, // Lower Value to Normalize + int size = -1, // Size Of Normalization + int digits = 5 // Digits for Result +) +{ + // + if (size <= 0) + { + size = ArraySize(source); + } + + // + bool asSeriesFlag = ArrayGetAsSeries(source); + + // + ArraySetAsSeries(source, false); + ArraySetAsSeries(dest, false); + + // + double min = ArrayMinimum(source, 0, size); + double max = ArrayMaximum(source, 0, size); + + // + for (int i = 0; i < size; i++) + { + // + double iNormal = lower + ((source[i] - min) / (max - min)) * (upper - lower); + + // + if (digits > 0) + { + iNormal = NormalizeDouble(iNormal, digits); + } + + // + dest[i] = iNormal; + } + + // + ArraySetAsSeries(source, asSeriesFlag); + ArraySetAsSeries(dest, asSeriesFlag); +} + +// +// Templates ... + +// +// Retrieve Specific Object Types Name ... +template +string GetTypeName(const T &t) +{ + return typename(T); +} + +// +template +string GetToken(T &item) +{ + // + string mType = GetTypeName(item); + + // + string result = mType; + + // + string parts[]; + int partsCount = SplitContent( + parts, + result, + " " + // + ); + if (partsCount <= 0) + { + // + result = mType; + return result; + } + + // + bool hasLastPart = GetLastItem( + result, + parts + // + ); + if (!hasLastPart) + { + // + result = mType; + return result; + } + + // + return result; +} + +// +// Same as Get Token for Use in Classes ... +template +string GetSpecificToken(T &item) +{ + // + string mType = GetTypeName(item); + + // + string result = mType; + + // + string parts[]; + int partsCount = SplitContent( + parts, + result, + " " + // + ); + if (partsCount <= 0) + { + // + result = mType; + return result; + } + + // + bool hasLastPart = GetLastItem( + result, + parts + // + ); + if (!hasLastPart) + { + // + result = mType; + return result; + } + + // + return result; +} + +// +// Generate Unique Tags ... +template +string GenerateTag(T &model) +{ + // + string result = ""; + + // + string tag = model.ToString(); + if (StringLen(tag) == 0) + { + return result; + } + + // + static XSCMD5 md5; + + // + result = md5.Hash(tag); + + // + return result; +} + +// +// Hash Specified Content ... +template +string ToMD5(T content) +{ + // + string result = ""; + + // + string strContent = ToString(content); + if (StringLen(strContent) == 0) + { + return result; + } + + // + static XCMD5 md5; + + // + result = md5.Hash(strContent); + + // + return result; +} + +// +// Check a Value Not Empty ... +template +bool NotEmpty(T value) +{ + return value != EMPTY_VALUE; +} + +// +// Check a Value Not Empty and Zero ... +template +bool NotEmptyZero(T value) +{ + return value != EMPTY_VALUE && value != 0; +} + +// +// Add Specified Item to Array ... +template +int Add( + T item, // item want to add + T &buffer[] // Destination buffer +) +{ + // + int result = 0; + + // + ArrayResize( + buffer, + ArraySize(buffer) + 1); + + // + buffer[ArraySize(buffer) - 1] = item; + + // + result = ArraySize(buffer); + + // + return result; +} +template +int AddSpecific( + T item, // item want to add + T &buffer[] // Destination buffer +) +{ + // + return Add( + item, + buffer // + ); +} +template +int AddRef( + T &item, // item want to add + T &buffer[] // Destination buffer +) +{ + // + int result = 0; + + // + ArrayResize( + buffer, + ArraySize(buffer) + 1); + + // + buffer[ArraySize(buffer) - 1] = item; + + // + result = ArraySize(buffer); + + // + return result; +} + +// +// Check Specified Array Has Childs or not ... +template +bool HasChild(T &buffer[]) +{ + return IsValidSize(ArraySize(buffer)); +} +template +bool SpecificHasChild(T &buffer[]) +{ + return HasChild(buffer); +} + +// +// Remove Specified Item from an Array ... +template +bool Remove( + T item, + T &buffer[]) +{ + // + bool result = false; + + // + int itemIndex = FindIndex( + item, + buffer); + if (itemIndex < 0) + { + return result; + } + + // + result = ArrayRemove( + buffer, + itemIndex, + 1); + + // + return result; +} + +// +// Clean Specified Array ... +template +void Clean(T &buffer[]) +{ + // + ArrayResize(buffer, 0); + ArrayFree(buffer); + ZeroMemory(buffer); +} +template +void SpecificClean(T &buffer[]) +{ + Clean(buffer); +} + +// +// Copy Whole Content of Source to Dest array ... +template +void Copy( + T &source[], // Source Buffer ... + T &dest[], // Dest Buffer ... + bool cleanDest = true // Force Clen Dest Buffer ... +) +{ + // + if (cleanDest) + { + Clean(dest); + } + + // + int sourceCount = ArraySize(source); + if (sourceCount <= 0) + { + return; + } + + // + for (int i = 0; i < sourceCount; i++) + { + // + T iSource = source[i]; + + // + AddRef( + iSource, + dest); + } +} + +// +// Copy Items from a Buffer ... +template +int Copy( + int start, // Start + int count, // Number of Items for read + T &source[], // Source Buffer + T &dest[], // Dest Buffer + bool forceClean = true, // Force To Clean buffer + bool forceStart = true // Force To Clean buffer +) +{ + // + int result = 0; + + // + if (forceClean) + { + Clean(dest); + } + + // + if (start < 0 && forceStart) + { + start = 0; + } + + // + if (start >= ArraySize(source)) + { + start = ArraySize(source) - 1; + } + + // + if (count == 0) + { + count = ArraySize(source) - 1 - start; + } + + // + if (start + count > ArraySize(source)) + { + return result; + } + + // + int beforeSize = ArraySize(dest); + + // + bool asSeriesDest = ArrayGetAsSeries(dest); + bool asSeriesSource = ArrayGetAsSeries(source); + + // + ArraySetAsSeries(dest, true); + ArraySetAsSeries(source, true); + + // + ArrayCopy( + dest, + source, + 0, + start, + count + // + ); + + // + int afterSize = ArraySize(dest); + + // + result = afterSize - beforeSize; + + // + ArraySetAsSeries(dest, asSeriesDest); + ArraySetAsSeries(source, asSeriesSource); + + // + return result; +} + +// +// Copy Items from a Buffer ... +template +int CopyRef( + int start, // Start + int count, // Number of Items for read + T &source[], // Source Buffer + T &dest[], // Dest Buffer + bool forceClean = true // Force To Clean buffer +) +{ + // + int result = 0; + + // + if (forceClean) + { + Clean(dest); + } + + // + if (start < 0) + { + start = 0; + } + + // + if (start >= ArraySize(source)) + { + start = ArraySize(source) - 1; + } + + // + int beforeSize = ArraySize(dest); + + // + bool asSeriesDest = ArrayGetAsSeries(dest); + bool asSeriesSource = ArrayGetAsSeries(source); + + // + ArraySetAsSeries(dest, true); + ArraySetAsSeries(source, true); + + // + for (int i = start; i < start + count; i++) + { + // + AddRef( + source[i], + dest + // + ); + } + + // + int afterSize = ArraySize(dest); + + // + result = afterSize - beforeSize; + + // + ArraySetAsSeries(dest, asSeriesDest); + ArraySetAsSeries(source, asSeriesSource); + + // + return result; +} + +// +// Retrive Last Item of Specified Buffer ... +template +bool GetLastItem( + T &item, // Holds Result + T &buffer[] // Specified Buffer +) +{ + // + bool result = false; + + // + int bufferSize = ArraySize(buffer); + if (bufferSize <= 0) + { + return result; + } + + // + item = buffer[bufferSize - 1]; + + // + result = true; + return result; +} + +// +// Remove Last Item of Specified Buffer ... +template +bool RemoveLastItem( + T &buffer[] // Specified Buffer +) +{ + // + bool result = false; + + // + int count = ArraySize(buffer); + result = IsValidSize(count); + if (!result) + { + return result; + } + + // + ArrayRemove( + buffer, + count - 1, + 1 // + ); + + // + return result; +} + +template +void CleanupArray( + T &buffer[], // Buffer to Cleanup ... + int maxAllowed = 0 // Max Allowed Number of items ... +) +{ + // + if (maxAllowed <= 0) + { + return; + } + + // + int count = ArraySize(buffer); + if (!IsValidSize(count) || + count <= maxAllowed) + { + return; + } + + // + int mustRemove = count - maxAllowed; + if (!IsValidSize(mustRemove)) + { + return; + } + + // + ArrayRemove( + buffer, + 0, + mustRemove // + ); +} + +// +// Search Array For Specific Item ... +template +int FindIndex( + T item, // What is Search ... + T &buffer[] // Search in ... +) +{ + // + int result = -1; + + // + int count = ArraySize(buffer); + if (count <= 0) + { + return result; + } + + // + for (int i = 0; i < count; i++) + { + // + T iT = buffer[i]; + + // + if (iT == item) + { + // + result = i; + break; + } + } + + // + return result; +} + +// +// Check an Array Contains Specified Value ... +template +bool Contains( + T item, // What is Search ... + T &buffer[] // Search in ... +) +{ + // + bool result = false; + + // + int idx = FindIndex( + item, + buffer); + result = idx > -1; + + // + return result; +} + +// +// Calculate a Buffer's Sum ... +template +double GetSum( + T &buffer[], // the Buffer which required to search + int start = 0, // Start Index + int count = 0 // Count for Search +) +{ + // + double result = 0; + + // + T tmp[]; + int tmpCount = Copy( + start, + count, + buffer, + tmp + // + ); + if (tmpCount <= 0) + { + return result; + } + + // + // Calculate Summary ... + for (int i = 0; i < tmpCount; i++) + { + result += buffer[i]; + } + + // + return result; +} + +// +// Calculate a Buffer's Average ... +template +double GetAverage( + T &buffer[], // the Buffer which required to search + int start = 0, // Start Index + int count = 0 // Count for Search +) +{ + // + double result = 0; + + // + T tmp[]; + int tmpCount = Copy( + start, + count, + buffer, + tmp + // + ); + if (tmpCount <= 0) + { + return result; + } + + // + // Calculate Summary ... + for (int i = 0; i < tmpCount; i++) + { + result += buffer[i]; + } + + // + // Calculate Average ... + result = result / tmpCount; + + // + return result; +} + +// +// Get Max of Specific Loopback of a Buffer ... +template +T GetMax( + T &buffer[], // the Buffer which required to search + int start = 0, // Start Index + int count = 0 // Count for Search +) +{ + // + T result = 0; + + // + if (count <= 0) + { + count = ArraySize(buffer); + } + + // + T tmp[]; + int tmpCount = Copy( + start, + count, + buffer, + tmp + // + ); + if (tmpCount <= 0) + { + return result; + } + + // + // Loop Through LoopBack ... + for (int i = 0; i < tmpCount; i++) + { + // + T iValue = tmp[i]; + + // + result = + // + result == 0 || result < iValue + // + ? iValue + // + : result + // + ; + } + + // + return result; +} +template +T GetMax( + T &buffer[], // the Buffer which required to search + int &index, // Item Index ... + int start = 0, // Start Index + int count = 0 // Count for Search +) +{ + // + T result = 0; + index = -1; + + // + if (count <= 0) + { + count = ArraySize(buffer); + } + + // + T tmp[]; + int tmpCount = Copy( + start, + count, + buffer, + tmp + // + ); + if (tmpCount <= 0) + { + return result; + } + + // + // Loop Through LoopBack ... + for (int i = 0; i < tmpCount; i++) + { + // + T iValue = tmp[i]; + + // + bool isNew = result == 0; + bool canSet = isNew || + (!isNew && + result < iValue); + if (canSet) + { + // + index = i; + result = iValue; + } + } + + // + return result; +} +template +T GetSpecifiedMax( + T &buffer[], // the Buffer which required to search + int start = 0, // Start Index + int count = 0 // Count for Search +) +{ + return GetMax( + buffer, + start, + count // + ); +} +template +T GetSpecifiedMax( + T &buffer[], // the Buffer which required to search + int &index, // Item Index ... + int start = 0, // Start Index + int count = 0 // Count for Search +) +{ + return GetMax( + buffer, + index, + start, + count // + ); +} + +// +// Get Min of Specific Loopback of a Buffer ... +template +T GetMin( + T &buffer[], // the Buffer which required to search + int start = 0, // Start Index + int count = 0 // Count for Search +) +{ + // + T result = 0; + + // + if (count <= 0) + { + count = ArraySize(buffer); + } + + // + T tmp[]; + int tmpCount = Copy( + start, + count, + buffer, + tmp + // + ); + if (tmpCount <= 0) + { + return result; + } + + // + // Loop Through LoopBack ... + for (int i = 0; i < tmpCount; i++) + { + // + T iValue = tmp[i]; + + // + result = + // + result == 0 || result > iValue + // + ? iValue + // + : result + // + ; + } + + // + return result; +} +template +T GetMin( + T &buffer[], // the Buffer which required to search + int &index, // Item Index ... + int start = 0, // Start Index + int count = 0 // Count for Search +) +{ + // + T result = 0; + index = -1; + + // + if (count <= 0) + { + count = ArraySize(buffer); + } + + // + T tmp[]; + int tmpCount = Copy( + start, + count, + buffer, + tmp + // + ); + if (tmpCount <= 0) + { + return result; + } + + // + // Loop Through LoopBack ... + for (int i = 0; i < tmpCount; i++) + { + // + T iValue = tmp[i]; + + // + bool isNew = result == 0; + bool canSet = isNew || + (!isNew && + result > iValue); + if (canSet) + { + // + index = i; + result = iValue; + } + } + + // + return result; +} +template +T GetSpecifiedMin( + T &buffer[], // the Buffer which required to search + int start = 0, // Start Index + int count = 0 // Count for Search +) +{ + return GetMin( + buffer, + start, + count // + ); +} +template +T GetSpecifiedMin( + T &buffer[], // the Buffer which required to search + int &index, // Item Index ... + int start = 0, // Start Index + int count = 0 // Count for Search +) +{ + return GetMin( + buffer, + index, + start, + count // + ); +} + +// +// Find a Value less than Specified ... +template +T FindLesserThan( + T value, // Specified Value ... + const T &source[], // Source ... + bool isDescend = false // Find Biggest Lesser Value ... +) +{ + // + T result = -1; + + // + int itemsCount = ArraySize(source); + if (itemsCount <= 0) + { + return result; + } + + // + // Make a Copy of source ... + T tmp[]; + + // + ArrayResize( + tmp, + ArraySize(source) // + ); + + // + ArrayCopy( + tmp, + source // + ); + + // + // Sort Temp Buffer ... + ArraySort(tmp); + if (isDescend) + { + ArrayReverse(tmp); + } + + // + int tmpCount = ArraySize(tmp); + for (int i = 0; i < tmpCount; i++) + { + // + T iValue = tmp[i]; + + // + if (iValue < value) + { + // + result = iValue; + break; + } + } + + // + return result; +} +template +T FindLesserThan( + T value, // Specified Value ... + int &index, // Item Index ... + const T &source[], // Source ... + bool isDescend = false // Find Biggest Lesser Value ... +) +{ + // + T result = -1; + index = -1; + + // + int itemsCount = ArraySize(source); + if (itemsCount <= 0) + { + return result; + } + + // + // Make a Copy of source ... + T tmp[]; + + // + ArrayResize( + tmp, + ArraySize(source) // + ); + + // + ArrayCopy( + tmp, + source // + ); + + // + // Sort Temp Buffer ... + ArraySort(tmp); + if (isDescend) + { + ArrayReverse(tmp); + } + + // + int tmpCount = ArraySize(tmp); + for (int i = 0; i < tmpCount; i++) + { + // + T iValue = tmp[i]; + + // + if (iValue < value) + { + // + index = i; + result = iValue; + break; + } + } + + // + return result; +} + +// +// Find a Value less than Specified ... +template +T FindBiggerThan( + T value, // Specified Value ... + const T &source[], // Source ... + bool isDescend = false // Find Smallest Bigger Value ... +) +{ + // + T result = -1; + + // + int itemsCount = ArraySize(source); + if (itemsCount <= 0) + { + return result; + } + + // + // Make a Copy of source ... + T tmp[]; + + // + ArrayResize( + tmp, + ArraySize(source) // + ); + + // + ArrayCopy( + tmp, + source // + ); + + // + // Sort Temp Buffer ... + ArraySort(tmp); + if (!isDescend) + { + ArrayReverse(tmp); + } + + // + int tmpCount = ArraySize(tmp); + for (int i = 0; i < tmpCount; i++) + { + // + T iValue = tmp[i]; + + // + if (iValue > value) + { + // + result = iValue; + break; + } + } + + // + return result; +} +template +T FindBiggerThan( + T value, // Specified Value ... + int &index, // Item Index ... + const T &source[], // Source ... + bool isDescend = false // Find Smallest Bigger Value ... +) +{ + // + T result = -1; + index = -1; + + // + int itemsCount = ArraySize(source); + if (itemsCount <= 0) + { + return result; + } + + // + // Make a Copy of source ... + T tmp[]; + + // + ArrayResize( + tmp, + ArraySize(source) // + ); + + // + ArrayCopy( + tmp, + source // + ); + + // + // Sort Temp Buffer ... + ArraySort(tmp); + if (!isDescend) + { + ArrayReverse(tmp); + } + + // + int tmpCount = ArraySize(tmp); + for (int i = 0; i < tmpCount; i++) + { + // + T iValue = tmp[i]; + + // + if (iValue > value) + { + // + index = i; + result = iValue; + break; + } + } + + // + return result; +} + +// +// Find Same Values in Array ... +template +void FindSames( + T &result[], // Holds Result ... + T &source[], // Source ... + int verifications = 3 // Number of Consequence Repeat ... +) +{ + // + Clean(result); + + // + // TenkanSen Flats ... + int sourceCount = ArraySize(source); + if (sourceCount > verifications) + { + // + T mLast = 0; + int mVerified = 0; + for (int i = 0; i < sourceCount; i++) + { + // + T iVal = source[i]; + if (mLast == 0) + { + mLast = iVal; + } + else if (mLast == iVal) + { + mVerified++; + } + else + { + mLast = iVal; + mVerified = 0; + } + + // + if (iVal == mLast && mVerified >= verifications) + { + // + Add( + iVal, + result); + + // + mLast = 0; + mVerified = 0; + } + } + } +} + +// +// Add an Item to a Buffer if not Exists ... +void AddIfNotExists( + double value, + double &values[], + double smoothingPoint = 3 // +) +{ + // + double smoothingValue = smoothingPoint * GetPoints(_Symbol); + + // + int valuesCount = ArraySize(values); + if (valuesCount <= 0) + { + // + Add(value, + values); + } + else + { + // + bool isExists = false; + for (int i = 0; i < valuesCount; i++) + { + // + double iVal = values[i]; + + // + double diff = MathAbs(iVal - value); + + // + if (iVal == value || diff < smoothingValue) + { + // + isExists = true; + break; + } + } + + // + if (!isExists) + { + // + Add(value, + values); + } + } +} + +// +// Add a Buffers Child to another Buffer +// if it's not Contains them ... +void AddsIfNotExists( + double &source[], + double &dest[], + double smoothingPoint = 3) +{ + // + double smoothingValue = smoothingPoint * GetPoints(_Symbol); + + // + int sourceCount = ArraySize(source); + if (sourceCount <= 0) + { + return; + } + + // + for (int i = 0; i < sourceCount; i++) + { + // + double iSource = source[i]; + + // + AddIfNotExists( + iSource, + dest, + smoothingPoint); + } +} + +// +// Bar XOHCL ... + +// +// Extract Specific Range of Bars ... +// using Start Bar Index ... +int GetBars( + XOHCL &result[], // Hold Result + string mSymbol = NULL, // Trading Symbol + ENUM_TIMEFRAMES mPeriod = NULL, // Trading Time Frame + int from = 0, // Start Bar Index + int count = 1, // Number of Bars + bool forceClean = true // Clean Result Array +) +{ + // + int mResult = 0; + + // + if (from < 0) + { + from = 0; + } + + // + mSymbol = NormalizeSymbol(mSymbol); + mPeriod = NormalizePeriod(mPeriod); + + // + int total = Bars( + mSymbol, + mPeriod); + if (from > total - 2) + { + from = total - 2; + } + + // + if (count < 0) + { + count = 1; + } + + // + int start = from; + int end = start + count; + if (end > total - 1) + { + end = total - 1; + } + + // + if (forceClean) + { + Clean(result); + } + + // + int beforeSize = ArraySize(result); + + // + for (int i = start; i < end; i++) + { + // + XOHCL iBar; + bool isValid = iBar.Init( + mSymbol, + mPeriod, + i + // + ); + + // + if (isValid) + { + // + AddRef( + iBar, + result + // + ); + } + } + + // + int afterSize = ArraySize(result); + + // + mResult = afterSize - beforeSize; + + // + return mResult; +} + +// +// Extract Specific Range of Bars ... +// using Start Bar Time ... +int GetBars( + XOHCL &result[], // Hold Result + string mSymbol = NULL, // Trading Symbol + ENUM_TIMEFRAMES mPeriod = NULL, // Trading Time Frame + datetime from = NULL, // Start Bar Time + int count = 1, // Number of Bars + bool forceClean = true // Clean Result Array +) +{ + // + mSymbol = NormalizeSymbol(mSymbol); + mPeriod = NormalizePeriod(mPeriod); + + // + from = NormalizeTime(from); + + // + int barIndex = iBarShift( + mSymbol, + mPeriod, + from, + false + // + ); + + // + return GetBars( + result, + mSymbol, + mPeriod, + barIndex, + count, + forceClean + // + ); +} + +// +// String ... + +// +// Search a Content Contains Specific String or not ... +bool Contains( + string mQuery, // Search String + string mContent, // Search Content + bool ignoreCase = true // Ignore Case +) +{ + // + bool result = false; + + // + // Validate Query ... + result = IsValid(mQuery); + if (!result) + { + return result; + } + + // + // Validate Content ... + result = IsValid(mContent); + if (!result) + { + return result; + } + + // + // Normalize Inputs ... + string query = mQuery; + string content = mContent; + if (ignoreCase) + { + // + StringToLower(query); + StringToLower(content); + } + + // + int queryIdx = StringFind( + content, + query); + + // + result = queryIdx >= 0; + + // + return result; +} + +// +bool Contains( + string &mQueries[], // Search Strings + string mContent, // Search Content + bool ignoreCase = true // Ignore Case +) +{ + // + bool result = false; + + // + // Validate Queries ... + int queriesCount = ArraySize(mQueries); + result = queriesCount > 0; + if (!result) + { + return result; + } + + // + // Validate Content ... + result = IsValid(mContent); + if (!result) + { + return result; + } + + // + int containsCount = 0; + for (int i = 0; i < queriesCount; i++) + { + // + bool isContains = Contains( + mQueries[i], + mContent, + ignoreCase); + + // + if (!isContains) + { + // + result = false; + break; + } + + // + containsCount++; + } + + // + result = containsCount == queriesCount; + + // + return result; +} + +// +int FindIndexes( + string mQuery, // Search String + string mContent, // Search Content + int &result[], // Holding Results + bool ignoreCase = false // Ignore Case +) +{ + // + int mResult = 0; + + // + Clean(result); + + // + // Validate Inputs ... + if (!IsValid(mQuery) || + !IsValid(mContent)) + { + return mResult; + } + + // + // Apply Ignore Case if Provided ... + if (ignoreCase) + { + // + bool isConverted = StringToLower(mQuery); + if (!isConverted) + { + return mResult; + } + + // + isConverted = StringToLower(mContent); + if (!isConverted) + { + return mResult; + } + } + + // + // Search First Index ... + int lastPos = 0; + int idx = StringFind( + mContent, + mQuery, + lastPos // + ); + while (idx >= 0) + { + // + // Add Position to Result ... + Add( + idx, + result // + ); + + // + lastPos = idx + StringLen(mQuery); + idx = StringFind( + mContent, + mQuery, + lastPos // + ); + } + + // + mResult = ArraySize(result); + + // + return mResult; +} + +// +// Convert From String ... +template +T FromString(string value) +{ + // + T result = NULL; + + // + if (!IsValid(value)) + { + return result; + } + + // + result = (T)value; + + // + return result; +} + +// +// Converts an item to String ... +template +string ToString(T value) +{ + return (string)value; +} + +// +// Used In Report or Summary Generators ... +string ToString( + string prefix, // Title + bool value, // Value + bool ignoreFalseConditions = true, // Ignore False Conditions + string lineSeparator = "\n", // Line Separator + string prefixSeparator = ":" // Title Separator +) +{ + // + string result = NULL; + + // + result = (value || !ignoreFalseConditions) + ? prefix + + prefixSeparator + " " + + ToString(value) + + lineSeparator + : ""; + + // + return result; +} + +// +template +string ToString( + string prefix, // Title + T value, // Value + string lineSeparator = "\n", // Line Separator + string prefixSeparator = ":" // Title Separator +) +{ + // + string result = NULL; + + // + result = prefix + + prefixSeparator + " " + + ToString(value) + + lineSeparator; + + // + return result; +} + +// +string SetLabel( + string mLabel, // Provided Label ... + string value, // Source Value ... + string separator = "\n", // Line Separator + bool addTopEmptyLine = true // Add Empty Line On top +) +{ + // + string result = value; + + // + if (StringLen(mLabel) <= 0) + { + return result; + } + + // + result = (StringLen(value) > 0) + ? (addTopEmptyLine ? separator : "") + + mLabel + + separator + + "-----------------------------" + + separator + + value + : value; + + // + return result; +} + +// +// Converts a Buffer to String Representation ... +template +string ToString( + const T &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; +} + +// +// Converts String to boolean ... +bool ToBoolean(string value) +{ + // + bool result = false; + + // + if (StringLen(value) <= 0) + { + return result; + } + + // + StringToLower(value); + result = value == "true"; + + // + return result; +} + +// +// Split an String Representation of an Array ... +int SplitContent( + string &result[], // Hold Result ... + string content, // Source ... + string separator = ",", // Separator ... + bool forceCleanResult = true // Clean Result ... +) +{ + // + int mResult = 0; + + // + if (forceCleanResult) + { + Clean(result); + } + + // + int before = ArraySize(result); + + // + if (separator == NULL || StringLen(separator) == 0) + { + separator = ","; + } + + // + if (StringLen(content) == 0) + { + return mResult; + } + + // + StringSplit( + content, + StringGetCharacter( + separator, + 0), + result); + + // + int after = ArraySize(result); + + // + mResult = after - before; + + // + return mResult; +} + +// +// 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; +} + +// +// Extract an Array of Contents ... +int ExtractStrings( + string &result[], // Hold Result + 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 +) +{ + // + int mResult = 0; + + // + Clean(result); + + // + // Validate Args ... + int sourceLength = StringLen(source); + int startLength = StringLen(startString); + int endLength = StringLen(endString); + + // + int minRequiredLength = startLength + endLength; + + // + if ( + endLength <= 0 || + startLength <= 0 || + sourceLength <= 0 || + sourceLength < minRequiredLength) + { + return mResult; + } + + // + // Make a Copy of Source for Manipulating ... + string workStr = source; + + // + // Define a Loop ... + while (StringLen(workStr) > minRequiredLength) + { + // + // Find Item ... + string item = ExtractString( + workStr, + startString, + endString); + + // + // Breakout when couldn't find anymore item ... + int itemLength = StringLen(item); + if (itemLength <= 0) + { + break; + } + + // + // Prepare Item Source String for Replacing in Work String ... + string itemSource = startString + item + endString; + + // + // Add Item to Result Array ... + Add( + item, + result); + + // + // Replace Item Soure in Work String ... + StringReplace( + workStr, + itemSource, + ""); + } + + // + // Calculate Size of Array ... + mResult = ArraySize(result); + + // + return mResult; +} + +// +string ExtractSurrounded( + const string surrounded, // Surrounded Content + const string mToken, // Specified Token + const string startString = "(", // Expression Start String must be Unique + const string endString = ")" // Where to End Extraction, usually a Sign +) +{ + // + return ExtractString( + surrounded, + mToken + startString, + endString + // + ); +} + +// +int ParseIntSurrounded( + const string surrounded, // Surrounded Content + const string mToken, // Specified Token + const string startString = "(", // Expression Start String must be Unique + const string endString = ")" // Where to End Extraction, usually a Sign +) +{ + // + int result = NULL; + + // + string strContent = ExtractSurrounded( + surrounded, + mToken, + startString, + endString + // + ); + if (!IsValid(strContent)) + { + return result; + } + + // + result = (int)strContent; + + // + return result; +} +long ParseLongSurrounded( + const string surrounded, // Surrounded Content + const string mToken, // Specified Token + const string startString = "(", // Expression Start String must be Unique + const string endString = ")" // Where to End Extraction, usually a Sign +) +{ + // + long result = NULL; + + // + string strContent = ExtractSurrounded( + surrounded, + mToken, + startString, + endString + // + ); + if (!IsValid(strContent)) + { + return result; + } + + // + result = (long)strContent; + + // + return result; +} +string ParseStringSurrounded( + const string surrounded, // Surrounded Content + const string mToken, // Specified Token + const string startString = "(", // Expression Start String must be Unique + const string endString = ")" // Where to End Extraction, usually a Sign +) +{ + // + string result = NULL; + + // + string strContent = ExtractSurrounded( + surrounded, + mToken, + startString, + endString + // + ); + if (!IsValid(strContent)) + { + return result; + } + + // + result = (string)strContent; + + // + return result; +} +double ParseDoubleSurrounded( + const string surrounded, // Surrounded Content + const string mToken, // Specified Token + const string startString = "(", // Expression Start String must be Unique + const string endString = ")" // Where to End Extraction, usually a Sign +) +{ + // + double result = NULL; + + // + string strContent = ExtractSurrounded( + surrounded, + mToken, + startString, + endString + // + ); + if (!IsValid(strContent)) + { + return result; + } + + // + result = (double)strContent; + + // + return result; +} +datetime ParseTimeSurrounded( + const string surrounded, // Surrounded Content + const string mToken, // Specified Token + const string startString = "(", // Expression Start String must be Unique + const string endString = ")" // Where to End Extraction, usually a Sign +) +{ + // + datetime result = NULL; + + // + string strContent = ExtractSurrounded( + surrounded, + mToken, + startString, + endString + // + ); + if (!IsValid(strContent)) + { + return result; + } + + // + result = (datetime)strContent; + + // + return result; +} + +// +int ParseIntArraySurrounded( + int &result[], // Holds Result + const string surrounded, // Surrounded Content + const string mToken, // Specified Token + string separator = ",", // Separator ... + const string startString = "(", // Expression Start String must be Unique + const string endString = ")", // Where to End Extraction, usually a Sign + bool forceClean = true // Clean Result ... +) +{ + // + int count = 0; + + // + if (forceClean) + { + Clean(result); + } + + // + int before = ArraySize(result); + + // + string contentStr = ParseStringSurrounded(surrounded, mToken); + if (!IsValid(contentStr)) + { + return count; + } + + // + string tmps[]; + int tmpsCount = SplitContent( + tmps, + contentStr + // + ); + if (tmpsCount <= 0) + { + return count; + } + + // + for (int i = 0; i < tmpsCount; i++) + { + // + string iTMP = tmps[i]; + if (!IsValid(iTMP)) + { + continue; + } + + // + int iValue = (int)iTMP; + + // + Add( + iValue, + result + // + ); + } + + // + int after = ArraySize(result); + + // + count = after - before; + + // + return count; +} +int ParseLongArraySurrounded( + long &result[], // Holds Result + const string surrounded, // Surrounded Content + const string mToken, // Specified Token + string separator = ",", // Separator ... + const string startString = "(", // Expression Start String must be Unique + const string endString = ")", // Where to End Extraction, usually a Sign + bool forceClean = true // Clean Result ... +) +{ + // + int count = 0; + + // + if (forceClean) + { + Clean(result); + } + + // + int before = ArraySize(result); + + // + string contentStr = ParseStringSurrounded(surrounded, mToken); + if (!IsValid(contentStr)) + { + return count; + } + + // + string tmps[]; + int tmpsCount = SplitContent( + tmps, + contentStr + // + ); + if (tmpsCount <= 0) + { + return count; + } + + // + for (int i = 0; i < tmpsCount; i++) + { + // + string iTMP = tmps[i]; + if (!IsValid(iTMP)) + { + continue; + } + + // + long iValue = (long)iTMP; + + // + Add( + iValue, + result + // + ); + } + + // + int after = ArraySize(result); + + // + count = after - before; + + // + return count; +} +int ParseDoubleArraySurrounded( + double &result[], // Holds Result + const string surrounded, // Surrounded Content + const string mToken, // Specified Token + string separator = ",", // Separator ... + const string startString = "(", // Expression Start String must be Unique + const string endString = ")", // Where to End Extraction, usually a Sign + bool forceClean = true // Clean Result ... +) +{ + // + int count = 0; + + // + if (forceClean) + { + Clean(result); + } + + // + int before = ArraySize(result); + + // + string contentStr = ParseStringSurrounded(surrounded, mToken); + if (!IsValid(contentStr)) + { + return count; + } + + // + string tmps[]; + int tmpsCount = SplitContent( + tmps, + contentStr + // + ); + if (tmpsCount <= 0) + { + return count; + } + + // + for (int i = 0; i < tmpsCount; i++) + { + // + string iTMP = tmps[i]; + if (!IsValid(iTMP)) + { + continue; + } + + // + double iValue = (double)iTMP; + + // + Add( + iValue, + result + // + ); + } + + // + int after = ArraySize(result); + + // + count = after - before; + + // + return count; +} +int ParseTimeArraySurrounded( + datetime &result[], // Holds Result + const string surrounded, // Surrounded Content + const string mToken, // Specified Token + string separator = ",", // Separator ... + const string startString = "(", // Expression Start String must be Unique + const string endString = ")", // Where to End Extraction, usually a Sign + bool forceClean = true // Clean Result ... +) +{ + // + int count = 0; + + // + if (forceClean) + { + Clean(result); + } + + // + int before = ArraySize(result); + + // + string contentStr = ParseStringSurrounded(surrounded, mToken); + if (!IsValid(contentStr)) + { + return count; + } + + // + string tmps[]; + int tmpsCount = SplitContent( + tmps, + contentStr + // + ); + if (tmpsCount <= 0) + { + return count; + } + + // + for (int i = 0; i < tmpsCount; i++) + { + // + string iTMP = tmps[i]; + if (!IsValid(iTMP)) + { + continue; + } + + // + datetime iValue = (datetime)iTMP; + + // + Add( + iValue, + result + // + ); + } + + // + int after = ArraySize(result); + + // + count = after - before; + + // + return count; +} + +// +// Surround an String by Specific Token ... +template +string Surround( + string mToken, // an String which used to Tokenize + T &value, // a Value for Tokenize it + string startString = "(", // Token Start Content + string endString = ")" // Token End Content +) +{ + // + string result = NULL; + + // + string strValue = ToString(value); + if (!IsValid(strValue)) + { + return result; + } + + // + result = + // + (IsValid(mToken) + ? mToken + : "") + + // + startString + + strValue + + endString + // + ; + + // + return result; +} + +// +template +string SurroundArray( + string mToken, + T &value[], + string startString = "(", // Token Start Content + string endString = ")" // Token End Content +) +{ + // + string result = NULL; + + // + string valueStr = ToString(value); + if (!IsValid(valueStr)) + { + return result; + } + + // + result = Surround( + mToken, + valueStr, + startString, + endString + // + ); + + // + return result; +} + +// +// Periods / Cycles ... + +// +// Converts an String to TimeFrame ... +ENUM_TIMEFRAMES ToPeriod(string value) +{ + // + if (StringLen(value) == 0) + { + return _Period; + } + + // + StringTrimLeft(value); + StringTrimRight(value); + + // + ENUM_TIMEFRAMES result = _Period; + + // + if (value == "M1") + { + result = PERIOD_M1; + } + else if (value == "M2") + { + result = PERIOD_M2; + } + else if (value == "M3") + { + result = PERIOD_M3; + } + else if (value == "M4") + { + result = PERIOD_M4; + } + else if (value == "M5") + { + result = PERIOD_M5; + } + else if (value == "M6") + { + result = PERIOD_M6; + } + else if (value == "M10") + { + result = PERIOD_M10; + } + else if (value == "M12") + { + result = PERIOD_M12; + } + else if (value == "M15") + { + result = PERIOD_M15; + } + else if (value == "M20") + { + result = PERIOD_M20; + } + else if (value == "M30") + { + result = PERIOD_M30; + } + else if (value == "H1") + { + result = PERIOD_H1; + } + else if (value == "H2") + { + result = PERIOD_H2; + } + else if (value == "H3") + { + result = PERIOD_H3; + } + else if (value == "H4") + { + result = PERIOD_H4; + } + else if (value == "H6") + { + result = PERIOD_H6; + } + else if (value == "H8") + { + result = PERIOD_H8; + } + else if (value == "H12") + { + result = PERIOD_H12; + } + else if (value == "D1") + { + result = PERIOD_D1; + } + else if (value == "W1") + { + result = PERIOD_W1; + } + else if (value == "MN1") + { + result = PERIOD_MN1; + } + + // + return result; +} + +// +// Converts Period to String ... +string ToString(ENUM_TIMEFRAMES mPeriod) +{ + // + string result = ""; + + // + string mPStr = EnumToString(mPeriod); + + string mPStrParts[]; + int partsCount = StringSplit( + mPStr, + StringGetCharacter("_", 0), + mPStrParts); + if (partsCount <= 0) + { + return result; + } + + // + result = mPStrParts[1]; + + // + return result; +} + +// +// Retrieve All Available Period as an Array ...s +int GetAllAvailablePeriods( + ENUM_TIMEFRAMES &result[] // Holds Result ... +) +{ + // + Clean(result); + + // + Add( + PERIOD_M1, + result + // + ); + + // + Add( + PERIOD_M2, + result + // + ); + + // + Add( + PERIOD_M3, + result + // + ); + + // + Add( + PERIOD_M4, + result + // + ); + + // + Add( + PERIOD_M5, + result + // + ); + + // + Add( + PERIOD_M6, + result + // + ); + + // + Add( + PERIOD_M10, + result + // + ); + + // + Add( + PERIOD_M12, + result + // + ); + + // + Add( + PERIOD_M15, + result + // + ); + + // + Add( + PERIOD_M20, + result + // + ); + + // + Add( + PERIOD_M30, + result + // + ); + + // + Add( + PERIOD_H1, + result + // + ); + + // + Add( + PERIOD_H2, + result + // + ); + + // + Add( + PERIOD_H3, + result + // + ); + + // + Add( + PERIOD_H4, + result + // + ); + + // + Add( + PERIOD_H6, + result + // + ); + + // + Add( + PERIOD_H8, + result + // + ); + + // + Add( + PERIOD_H12, + result + // + ); + + // + Add( + PERIOD_D1, + result + // + ); + + // + Add( + PERIOD_W1, + result + // + ); + + // + Add( + PERIOD_MN1, + result + // + ); + + // + int mResult = ArraySize(result); + + // + return mResult; +} + +// +// 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 of Host Period ... +) +{ + // + // Normalize Arg ... + mTime = NormalizeTime(mTime); + mSymbol = NormalizeSymbol(mSymbol); + mPeriod = NormalizePeriod(mPeriod); + + // + int barIndex = iBarShift( + mSymbol, + mPeriod, + mTime, + false + // + ); + + // + datetime result = GetBarTime( + mSymbol, + mPeriod, + barIndex + // + ); + + // + return result; +} + +// +// Converts an String to it's related Market Cycle ... +ENUM_X_MARKET_CYCLES ToCycle(string value) +{ + // + ENUM_X_MARKET_CYCLES result = X_MARKET_CYCLE_UNKNOWN; + + // + ENUM_X_MARKET_CYCLES cycles[]; + int count = GetAllMarketCycles(cycles); + for (int i = 0; i < count; i++) + { + // + ENUM_X_MARKET_CYCLES iCycle = cycles[i]; + string iStr = ToString(iCycle); + + // + if (value == iStr) + { + // + result = iCycle; + break; + } + } + + // + return result; +} + +// +// Converts a Cycle to it's String Representation ... +string ToString(ENUM_X_MARKET_CYCLES cycle) +{ + // + string result = ""; + + // + string mPStr = EnumToString(cycle); + + string mPStrParts[]; + int partsCount = StringSplit( + mPStr, + StringGetCharacter("_", 0), + mPStrParts); + if (partsCount <= 0) + { + return result; + } + + // + result = mPStrParts[3]; + + // + return result; +} + +// +// Retrieve all Available Cycles ... +int GetAllMarketCycles(ENUM_X_MARKET_CYCLES &result[]) +{ + // + int mResult = 0; + + // + Clean(result); + + // + ENUM_X_MARKET_CYCLES tmp[] = { + X_MARKET_CYCLE_UNKNOWN, + X_MARKET_CYCLE_SHORT, + X_MARKET_CYCLE_MEDIUM, + X_MARKET_CYCLE_LONG, + X_MARKET_CYCLE_HIND}; + + // + Copy( + tmp, + result // + ); + + // + Clean(tmp); + + // + mResult = ArraySize(result); + + // + return mResult; +} + +// +// Retrieve Nearest Period base on Given Period ... +ENUM_TIMEFRAMES GetNearestPeriod(ENUM_TIMEFRAMES mPeriod) +{ + // + ENUM_TIMEFRAMES result = _Period; + + // + mPeriod = NormalizePeriod(mPeriod); + + // + switch (mPeriod) + { + // + case PERIOD_M1: + case PERIOD_M2: + case PERIOD_M3: + result = PERIOD_M5; + break; + + // + case PERIOD_M4: + case PERIOD_M5: + case PERIOD_M6: + result = PERIOD_M10; + break; + + // + case PERIOD_M10: + case PERIOD_M12: + case PERIOD_M15: + result = PERIOD_M20; + break; + + // + case PERIOD_M20: + case PERIOD_M30: + result = PERIOD_H1; + break; + + // + case PERIOD_H1: + case PERIOD_H2: + result = PERIOD_H3; + break; + + // + case PERIOD_H3: + result = PERIOD_H4; + break; + + // + case PERIOD_H4: + result = PERIOD_H6; + break; + + // + case PERIOD_H6: + result = PERIOD_H8; + break; + + // + case PERIOD_H8: + result = PERIOD_H12; + break; + + // + default: + result = mPeriod; + break; + } + + // + return result; +} + +// +// Retrieve Mediest Period base on Given Period ... +ENUM_TIMEFRAMES GetMediestPeriod(ENUM_TIMEFRAMES mPeriod) +{ + // + ENUM_TIMEFRAMES result = _Period; + + // + mPeriod = NormalizePeriod(mPeriod); + + // + switch (mPeriod) + { + // + case PERIOD_M1: + case PERIOD_M2: + case PERIOD_M3: + result = PERIOD_M10; + break; + + // + case PERIOD_M4: + case PERIOD_M5: + case PERIOD_M6: + result = PERIOD_M15; + break; + + // + case PERIOD_M10: + case PERIOD_M12: + case PERIOD_M15: + result = PERIOD_M30; + break; + + // + case PERIOD_M20: + case PERIOD_M30: + result = PERIOD_H2; + break; + + // + case PERIOD_H1: + case PERIOD_H2: + result = PERIOD_H4; + break; + + // + case PERIOD_H3: + result = PERIOD_H6; + break; + + // + case PERIOD_H4: + result = PERIOD_H8; + break; + + // + case PERIOD_H6: + result = PERIOD_H12; + break; + + // + case PERIOD_H8: + result = PERIOD_D1; + break; + + // + default: + result = mPeriod; + break; + } + + // + return result; +} + +// +// Retrieve Longest Period base on Given Period ... +ENUM_TIMEFRAMES GetLongestPeriod(ENUM_TIMEFRAMES mPeriod) +{ + // + ENUM_TIMEFRAMES result = _Period; + + // + mPeriod = NormalizePeriod(mPeriod); + + // + switch (mPeriod) + { + // + case PERIOD_M1: + case PERIOD_M2: + case PERIOD_M3: + result = PERIOD_M30; + break; + + // + case PERIOD_M4: + case PERIOD_M5: + case PERIOD_M6: + result = PERIOD_H1; + break; + + // + case PERIOD_M10: + case PERIOD_M12: + case PERIOD_M15: + result = PERIOD_H2; + break; + + // + case PERIOD_M20: + case PERIOD_M30: + result = PERIOD_H4; + break; + + // + case PERIOD_H1: + case PERIOD_H2: + result = PERIOD_H6; + break; + + // + case PERIOD_H3: + result = PERIOD_H8; + break; + + // + case PERIOD_H4: + result = PERIOD_H12; + break; + + // + case PERIOD_H6: + result = PERIOD_D1; + break; + + // + case PERIOD_H8: + result = PERIOD_W1; + break; + + // + default: + result = mPeriod; + break; + } + + // + return result; +} + +// +// Retrieve Hindmost Period base on Given Period ... +ENUM_TIMEFRAMES GetHindMostPeriod(ENUM_TIMEFRAMES mPeriod) +{ + // + ENUM_TIMEFRAMES result = _Period; + + // + mPeriod = NormalizePeriod(mPeriod); + + // + switch (mPeriod) + { + // + case PERIOD_M1: + case PERIOD_M2: + case PERIOD_M3: + result = PERIOD_H1; + break; + + // + case PERIOD_M4: + case PERIOD_M5: + case PERIOD_M6: + result = PERIOD_H2; + break; + + // + case PERIOD_M10: + case PERIOD_M12: + case PERIOD_M15: + result = PERIOD_H4; + break; + + // + case PERIOD_M20: + case PERIOD_M30: + result = PERIOD_H6; + break; + + // + case PERIOD_H1: + case PERIOD_H2: + result = PERIOD_H8; + break; + + // + case PERIOD_H3: + result = PERIOD_H12; + break; + + // + case PERIOD_H4: + result = PERIOD_D1; + break; + + // + case PERIOD_H6: + result = PERIOD_W1; + break; + + // + case PERIOD_H8: + result = PERIOD_MN1; + break; + + // + default: + result = mPeriod; + break; + } + + // + return result; +} + +// +// Retrieve Specified Cycles Period related to Host Period ... +ENUM_TIMEFRAMES GetCyclePeriod( + ENUM_X_MARKET_CYCLES mCycle = NULL, // Specified Cycle + ENUM_TIMEFRAMES mPeriod = NULL // Host Period +) +{ + // + ENUM_TIMEFRAMES result = NULL; + + // + mPeriod = NormalizePeriod(mPeriod); + mCycle = NormalizeCycle(mCycle); + + // + switch (mCycle) + { + // + // Short ... + case X_MARKET_CYCLE_SHORT: + result = GetNearestPeriod(mPeriod); + break; + + // + // Medium ... + case X_MARKET_CYCLE_MEDIUM: + result = GetMediestPeriod(mPeriod); + break; + + // + // Long ... + case X_MARKET_CYCLE_LONG: + result = GetLongestPeriod(mPeriod); + break; + + // + // Hind ... + case X_MARKET_CYCLE_HIND: + result = GetHindMostPeriod(mPeriod); + break; + } + + // + return result; +} + +// +// Calculate a Cycle Length based on Host Period ... +int GetCycleLengthOn( + ENUM_TIMEFRAMES _hostPeriod, + ENUM_X_MARKET_CYCLES _cycle, + ENUM_X_PERIOD_METHOD _method, + ENUM_TIMEFRAMES _period // +) +{ + // + int result = 0; + + // + // Validate ... + bool isValid = + // + IsValid(_hostPeriod) && + IsValid(_method, _Period) + // + ; + if (!isValid) + { + return result; + } + + // + // Calculate Period ... + isValid = + _method != X_PERIOD_NOTHING && + _cycle != X_MARKET_CYCLE_UNKNOWN; + if (!isValid) + { + return result; + } + + // + if (_method == X_PERIOD_AUTO) + { + // + _period = GetCyclePeriod( + _cycle, + _hostPeriod // + ); + } + isValid = IsValid(_period); + if (!isValid) + { + return result; + } + + // + int _hostPeriodSeconds = PeriodSeconds(_hostPeriod); + int _periodSeconds = PeriodSeconds(_period); + + // + isValid = _periodSeconds >= _hostPeriodSeconds; + if (!isValid) + { + return result; + } + + // + result = _periodSeconds / _hostPeriodSeconds; + + // + return result; +} + +// +// Direction ... + +// +bool HasDirection(ENUM_X_DIRECTION value) +{ + // + bool result = false; + + // + result = value != X_DIRECTION_NONE && + value != X_DIRECTION_ALL; + + // + return result; +} + +// +bool IsBullish(ENUM_X_DIRECTION value) +{ + // + bool result = false; + + // + result = value == X_DIRECTION_BULLISH; + + // + return result; +} +bool IsSpecifiedBullish(ENUM_X_DIRECTION value) +{ + // + bool result = false; + + // + result = value == X_DIRECTION_BULLISH; + + // + return result; +} + +// +bool IsBearish(ENUM_X_DIRECTION value) +{ + // + bool result = false; + + // + result = value == X_DIRECTION_BEARISH; + + // + return result; +} +bool IsSpecifiedBearish(ENUM_X_DIRECTION value) +{ + // + bool result = false; + + // + result = value == X_DIRECTION_BEARISH; + + // + return result; +} + +// +ENUM_X_DIRECTION Opposit(ENUM_X_DIRECTION value) +{ + // + ENUM_X_DIRECTION result = X_DIRECTION_NONE; + + // + if (!HasDirection(value)) + { + return result; + } + + // + result = + IsBullish(value) + ? X_DIRECTION_BEARISH + : X_DIRECTION_BULLISH; + + // + return result; +} + +// +// Moving Average ... + +enum ENUM_X_MA_METHOD +{ + X_MA_MODE_NONE, // None + X_MA_MODE_SMA, // SMA + X_MA_MODE_EMA, // EMA + X_MA_MODE_LWMA, // LWMA + X_MA_MODE_SMMA, // SMMA +}; + +/** + * Calculate Sspecified Buffer's Moving Averages ... + * + * @param rates_total: Integer, number of items ... + * @param prev_calculated: Integer, Previous Calculate Items ... + * @param begin: Integer, Bar Index ... + * @param period: Integer, Moving Average Length ... + * @param source: Double Array, Specified Array for Calculating Moving Averages ... + * @param buffer: Double Array, Specified Array to Apply Calculated Moving Average on it ... + * @param method: ENUM_MA_METHOD member Specified Moving Average Calculation Method ... + * + * @return ( int ) + */ +int iMAOnBuffer( + const int _rates_total, + const int _prev_calculated, + const int _begin, + const int _period, + const double &_source[], + double &_buffer[], + ENUM_X_MA_METHOD _method = X_MA_MODE_SMA // +) +{ + // + int result = 0; + + // + if ( + _period < 0 || + _rates_total <= 0 || + _prev_calculated < 0 || + _method == X_MA_MODE_NONE || + _prev_calculated > _rates_total) + { + return result; + } + + // + switch (_method) + { + // + case X_MA_MODE_SMA: + result = SimpleMAOnBuffer( + _rates_total, + _prev_calculated, + _begin, + _period, + _source, + _buffer // + ); + break; + + // + case X_MA_MODE_EMA: + result = ExponentialMAOnBuffer( + _rates_total, + _prev_calculated, + _begin, + _period, + _source, + _buffer // + ); + break; + + // + case X_MA_MODE_LWMA: + result = LinearWeightedMAOnBuffer( + _rates_total, + _prev_calculated, + _begin, + _period, + _source, + _buffer // + ); + break; + + // + case X_MA_MODE_SMMA: + result = SmoothedMAOnBuffer( + _rates_total, + _prev_calculated, + _begin, + _period, + _source, + _buffer // + ); + break; + } + + // + return result; +} + +// \ No newline at end of file diff --git a/BKPS/14031206/Libraries/x-saherelm.draw.lib.ex5 b/BKPS/14031206/Libraries/x-saherelm.draw.lib.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..a3ed7b158b0275a9bfa87f779c76439781dbe3e9 GIT binary patch literal 7062 zcmdT{MOYkMvTdBuxI2vpcbX8~9RdV*ZwO9+;O-XOUDJ(2f@|YW&;Y?9KyU~SFaNx6 zcC(o6occ=cse2cvYISAx1dv<-=mY>{z+WH$cK((BssA5?q%6hVX?-+9&DOmGUr&zy z&HuOA8w~*X$Nv+&J=M6=xt?eU(R(P?b&?#iR4HtB(F6Qxy;tqW1AD-9gccMVPc63p zyp;wx16%-~0B!&Xz!qQ!@Bn}Sya4XM&Ie%sTWbN#|FYJ9`?7!!0LQW;( z{k{E9=YJXhDE9a}0e65ffa|Y${mVH2p8u`e`d_*^|IX)sTj_t^5)Xj$@3y)BbMwDo z^`z{O94H9EYzjQ)yJ~9Qw|of%2R5Hvb`(zpEZ+spXGZuNV;v3*Y2Ae|%Wpk`)!y{u z39SK%WO7vukslST=VcdXE_9&^WX3sc-`Zzw##;6EsCh9zGR8@-_%4#+3NR$=16YN! zzX<@~IizOMf_aGnrdfkptm3#eu>u}F)c9I@o}*;H{rgRy5^uXHP0is{k&?U_&NBoR z39m3x(XL$ z$!~@Do&nD&p2qZiGKLk#92hhF&sIUCYTQJwS;%Rot0-6M+Eg%9awjwunDi)Xkt;1D zDe)aytsgJb4VI!^pRNPqkP(p%1xgbwyTWUeH#FlkdhrwCozIeS(*W*}#$RkkalQ3m zqo}o)+{!|P!m4$o!P(U=XF^J&#|b6M#pwjt%6=*s`N8PcMA)e(6ixpZvi;9&>H{E% zBELMcS#I0Pw2NGD5OZ9@H~SU|J$lOS9w)ny{wJTC{oIw+$m|xcS&soIbfm+~HJT_% zsjOH5U(|rAc%y85we|Y?M=8$0ToL*`NIK^EzVZ#?Otq9NzA{2#EY3&G5}SRxUKSbk zZC}a^yyP7jq%8%MR?;tGhnzews4Zy0SnbCVG_NC^e(!h)Mn89c;yM@NCfU|>F50`) z$?Bzm)JrIqw6_Pjd6&Jv60J^=;rX+mWdXD|zNAM$68{!Dt~$s37%@Pe%p-aTo%*1b zHIaYeT<8Y@Hj4CqaTVOuYtS=39FK@3+=Ija>IDH%ub^b6Is|e zkWFU2NB%bnngY#3NiKP|9DQ)20-dB_44~33Rx`5TwPL9T$C&z^uK{ zfJyoJEy_cWP${S%DhKp6uixpJJ7UGxtGo5Lz;kRUvy)|v+B!rSZ2eqp)9(bo=0!*P zO`w#H@l$15j(q9F-kBdyNG%?d*Ta^MB*8YU$`mOzoUWTn@?qYz7M4J=gPy)_dPHNN zS0M9xHG#j>atvlygmY>AjCq|!L)HNI3P!OJ1Jd$Ty;G>g&J708iQRi#)xsi)B-m$Y z9LEP_JA(*7RtRVOWG)ISt1$Vl)78l^I+R*%Ny;NKrDZW&`(@TtnL+mMLiC73AMqk_ z_dTNoYaZo2xldK&!XZW^cq+O#)L$NBOd|_mg2= zM^=>y6;>7J`!x1jY&gu>%kyBEf3lM%Y3NxIDvqdVkBF&dKA~E}tx$;)Q{Rck*~fR` zk009&2my0nA*AoHWFuDyq#P{w7s%6aPXK9}?JALjRN0OEB#h@jeB~Nr)jooUe)A@f zZKPap)jV}lHcD#0(NNb$rd2kHuFk+54z03IPu%*!N@q3lrjUCys28{tR11K*NZtfn zW`4#<^#Kw{XO&Ohix7Q0;L1vrK8`t#_iDgDj$ey$`F&{pVKK(w{V^DG>4=}MTb6CU zLV<;BdC?++MC;|5u-JiY5w5@~Jz_hsmb6c>b&|4xT2s+z`c`VEVgA?L1fGd(q~YuV zL9o8bW<`3o68j!vRi_Q4lmO@ym_9;1Z98D|QD2;{vt@;38=23 z8TS-HCV?Y1ae)d^)~h_!5Q?zKdI-4*HJmXAZ=P+Dr#lZxVqB~`^!uq2J5lXaWe|1^6xvM{$5L+8&*C&rOw)Y{foPK&`miY>?7}M>7UB1zz}1$j z(lI;qE6+Fg))K_HUtyDZVd~BU9#ts9?UYCn8nR~nD#z4ow28ozE6rpMVay9}H%8?J zmye(|^VrS|atf|5a)k_5f*QCFuagcPOdedN%VKRu2A%b z>}~$kHM8dnZu(d=Eu>{M3lMU!VZ=r$JOScs7-UsYKH9rulZil4RL(!OW$g6!PtUOw zQmb7g+rLcWQZ04rnLe0*Cu+vy`@f+!i0U5<6M5-%5qE823!cGQpaD z%;#!5d^mJJoig|H(MC;3zv~kI@KZJ=fn||MKt#Snsy>6+$i7;EJ!CSWoHHb6wRj!| z#p6ng9}afk_4 zv8J|%FAMJ6y~v$!{X}HF{d4tI+tJ}(O0)b`LP#aOkGEb1y%S$_f)RL4TORIHyu zxu!3;QP=qgclTiosVmStZEb6@LMqI>1EnF zYeZ#;8T;gGblMAlxYW2=T)|HBPZIGjq*PE)Vb78=+dC8jpI;uFvY9r>Zd=UsWBT9trILA;x` zy`2a9O3h78fkb7qyXV`rLu~{_zU5z>*<2!@Z->VeGj5)`r51)J6~7(J2-(3uJi#x- z=Z2ooxPyXa3#Cqs-BlK)SmuAHeaoNz35oB$KuiQi_|`6nn1>*>Vy}5 zayflkQp(scPDo%U2V06=JK`;!#A%){3Ls*{5oX~+OtnKmS1{!1!uMHrMzlHhA(Os% zXO66-DTxVFx=w~(tEQoU1CT!w_I2ZI3Tn1dY0`h5{<;Ll;p$#%5Knn9I1Al(ddP;m&uYcE zmfjQPz5JHSgcoLg9hhdAwa$sQ2ztj96(A1sXi>7UrhE2C@ukC%$genfKz)dX*(3R_ zL|AhfBpplFqotYP`2CvH-d+pB0wqNm$(wUv;mNP7D6H7Y`7_aGGD#6JD5m7L!)auN zpSeXkl*O$^ZCF`W5cRLMJR#lD_L__!%W7oacygTk{?J^zl~NAjipZpA1KUw7fy6b& zrcM$ruHZA#r@|lxdM_teLt<;(9{sotmk&%pYq?m;yOKge${Rs8fm!rxmedketNGjd z?_UO*zVUS-3^{nT9r-J(^3FbOoOF+r7CRi#bs|VVkvoD^lgTqeqj#+b`DeCt1Qcc~ zset}DV)*0(;WjK*kNkd^L7}>$f}#7(?)Y?^hfFvn6+rSsC@OVv;gknAF4R5aiTz>R zP7Fo4)dr(*+*!-5_~3R=tj5xiHT#v^#+w@0A=?)OUaWrjbRN@(e!j>MVw{MV&+h9F zWu^g87XMwDAC5D6yJ0oP9ikqrH5>E;Cj7Qw#z#EP_BE9EZfd~lxXFkoLW0il)R?># zzNZW<$q9C06Q15Cjf07$Tp`zK>sq9@e%%;q0W|;~o2nle;$g$5C3TopMDcUzD4p?` zc3a?J9@);G2pBv6!qS*?xnb^>4Z*{{@BP7+;c-PGVcuhvDk-A2Hv~InBNfF`R)LAm zhN7ngr5b4A!!{S=4|tiBG2y=A5l)4{o*mnK>fo2L+F;`SQDR}R_egS27K^KHUBGq~ zqHyxgL-?IB-J~Nu(J&>F=%kk38Fu95)cpw0Xrx5Pxg`QwteF6+eMMP0?~j`f%C zJvU=ySmDRMM#L$CogF4}AzyG$t`YI#T7-svTkZnPk;XzO-79ozet8qGdAf_3IwXUb zCZx2Ag4b1Tv{2jGiel|wx@mezoYsG+2&%+ib`%7tZx-o|n29F4)kBK5f+pI2cc4$r z2JAj{%N6T4px()ADUl)wi8*bK{)EUL$qsD~wu;^N2u#WKA!FzSZ^>OJSCckv&{xnE zK~t7Tz>m=0ouLtvVs4e7aWf(b^Jex&P23tg`G}q25}zYR*$RqcKAJpU5|?fNd$~3Y zI~d0O+`cwmULP7Up&0%{eFRZ?N*y*wY51iFX5Px)?-pbhqw@VYCW>%!$O&Y&D4>Jl zosY>_lQxqGvP-xX!OHxwPCgn|I7MdamUIDpG%02E4+`8rDKIgOgC8M_JOIjUJUh5t zMxEPnj%gGTkp=?fA~K7c2Um`qiPDe456d*z&-qg#iqArl3Y%f&y&rH}6G}^ z*%V8)k$)&DCq-45X=bf(FlQ=Vbdt(RCgEMeG#i63j&rZ4OHmU%iCfeEnTT*4WlnFn zphcFOyW5cwB#4aGRoC-(HK0s0^$JGz4n93@RW~yoju`T!_C9}qa&3DA{Yj#Ir=^iD ztE?;2Mb~o<6o?*Kl|u5|bYb&&#;EPoNI(Zx#dNKaI*Tshj7x_#Iq0ESK%S5zs~^um z`JXha=0=4dQ+d7jo->%-s~k4>=|L4zWM}gwxO|U|4sW))fe5vi3fpQ%yZIK8Vm}{_ zYDM+>8D%X9z?HlGGT_s~D(J)Uwl`iVbUwm_BqyUC(gYrwXz15AIAHJfQ_U%KBwww9a0#sCW*9K$V*U=($<(=EZ}+iNc)Pbtq1>|c!n-8 zoXd0`WRSud4fx)5no%NtQq6oc`O08d+|A|Ri0$7KF zBV<{2<@!k-7{(VEbqDPwfP!6_6(t9b?pwzt5Il8ihNd(piq`d?frS4$y&&fxm7XXH+sDuZL6W5~z!3*sZ1u!$A z#C2;9RV@31joICpv(g9$DnvZ>)}Bbyz( zO9N^1(b$GXfvjE_ws5?Zi*=3t>O`YJ(019F{^`@mn}k2m6La~gnN%e}+AT#fYC_n`vAWkY;)oR7xmAY>$r9eYC6a zcEzVRe?+h%E64U!e*BA=V2$)P(m~n!a@g zkd~)FoMM5}v7vn=;0)dd^8>6XIeg4zIKx;fDuvb!=O<%M$-4PNQD$kr`LR-^8L}@g z#-yUPPA)X^GW{tg`fvz1?_>gX6o^A{XrY^eo1HDUyhL#H_er+(7FG&Gu2UT$;A9<7 zDeU+eV!LQ|Pum$n`;{z~w?wqH%ZV)L^giV9J+5~p{y7$Sl8|$-c;iST!db6f*rjX6x`G^Lh6Hj zQjpL3F^7)_QcE@T*1C%}qHukuzF^&4Q+RXED^2twHR@99m_Y4NQC4IIkq4LEq%pTF zWH&7S{u0(#z2fpx*a<_Cei*#rz-2-_KNopRVV6ULr*fm}_6tvYd1PH9IcGB*fLrR! zzP^T|Z4O7{ie99t`G&{B;(N#}gq88LN>J!1e|&Vsc=x-IF3tiqu2k-sbN(5vPS)r> zmq*Kntxt)HC`s3c9uLr)KT$Io)Hmql0ZKRB0vMANXhL(2*vm>56SFMHRd zY!%2b6fB$xAPHW-;6z?18Qv1wj6XjKX@+G13QCTsbh}LHnqb=j%q{&I>8_6{3zRcV z*cL|t#NT*f9D(b|olm%X?n7LiINDb=I!d$$gtFWe7q98^b!+@3B**L00xdQfekfnH z{K~X$wqsT%=weg#oVJRha+6|>qBDLO@lmbB{k z&$y_htMaY#CN}AdRdkNgZKu4JDZ^OrJ^=_sb{`#+4$izFPY(*a^W9+D5}sB@^u9ew zKnPzsYh)O;wY{7I24~b08o?ZoJSEZnpz$Czp?MJ?a1S!j`<)nkPafDwlEo~lau;@u|)%qd9Boqm=# zhgve()hU1dJ`UY+t4LRjJSfiEzw0iRI7oXKsMH$Vc+rUdu+#{lfv_-GMSq_4>M}05FwQUH5PsY5--zW#h*(qaVFtWex2@%~3>^DL zehG=;ce_+9u)N1_y7lUdnnqJbL1W&O5?=`t&k`o6$A_0o+B9-J!dskOC32$smPLHh z=VM>L#im8y>(!7^^;g0c#s1LXLUmuriI8Fs=WD3AdyXY@F>5D=ydwS$4s$9~cB6Ie z*ru*L@5^gwE8N4WP6LKm#eved@8xfDIj08H&)g`}>j}Mz)v<5L4*NX6{Vcy{u@W~h zL7s`3$?W~m+bl9li(tFvF&-npV)v~$Vse$~8{n?WEX>~`k~E-es%|e`j{S}PoN8Oh z#MgXNb zLRQLSc%yic+^%G@NC2%XYgpm#4A=a;h1`L!l)dhV9(4M{m}t`SuEl;XH}#bieTdNq z>yJ*>CK8|Vkr<;@GCieu%xc61wEF~!_r zmUFeCiDkWkUQ2-y*Eko9QF*WIO}Isj_yRzh3{X!_{F``;DyPWiu~&#-_-)hh`>f5X zU|;g_kBAgZbOo^1BgcLnizPJ45Q|(Zh|g|IqoIVp`1fnTOjF{eWcP+&StQS8dMzDY zh`n2X91iN%jSD?Vyg=e*GvY;gDx%S#VKuvzON4ts_LQgpZ`1?Iz*K

    ~Zlf}fzU+>;$czW7v&?&m zEmyN|`Lx^xMLzWCd`9EgK}bmvTo|wHlmAI4m~lIyq>-g}v=xm?ffhDe-p^D7lqqWJ zSG%?gNsT}i)nRt@O=oqlnMGEk?YFH+he~Bt%JkDv05E5;WH 0 && + IsValid(at); + + // + return result; + } +}; + +// +struct XOBFVG +{ + // + // Props ... + XCFVG *fvg; + XCOrderBlock *ob; + + // + XCSupplyZone *supplyZones[]; + XCDemandZone *demandZones[]; + + // + XCSupportZone *supportZones[]; + XCResistanceZone *resistanceZones[]; + + // + // Constructor ... + XOBFVG() + { + Clean(); + } + + // + // Tools ... + + // + void Clean() + { + // + ZeroMemory(ob); + ZeroMemory(fvg); + + // + Clean(supplyZones); + Clean(demandZones); + Clean(supportZones); + Clean(resistanceZones); + + // + ZeroMemory(this); + } + + // + bool IsValid() + { + return HasOB() && + HasFVG(); + } + + // + bool HasOB() + { + return ob != NULL && + ob.IsValid(); + } + + // + bool HasFVG() + { + return fvg != NULL && + fvg.IsValid(); + } + + // + bool HasSupplyZones() + { + return HasChild(supplyZones); + } + + // + int CountSupplyZones() + { + return ArraySize(supplyZones); + } + + // + bool HasDemandZones() + { + return HasChild(demandZones); + } + + // + int CountDemandZones() + { + return ArraySize(demandZones); + } + + // + bool HasSupportZones() + { + return HasChild(supportZones); + } + + // + int CountSupportZones() + { + return ArraySize(supportZones); + } + + // + bool HasResistanceZones() + { + return HasChild(resistanceZones); + } + + // + int CountResistanceZones() + { + return ArraySize(resistanceZones); + } + + // + ENUM_X_DIRECTION GetDirection() + { + // + ENUM_X_DIRECTION result = X_DIRECTION_NONE; + + // + bool isValid = IsValid(); + if (!isValid) + { + return result; + } + + // + result = ob.GetDirection(); + + // + return result; + } + + // + bool IsBullish() + { + return IsBullish(GetDirection()); + } + + // + bool IsBearish() + { + return IsBearish(GetDirection()); + } + + // + int GetSwings( + XOBFVGPivot &pivots[] // + ) + { + // + int result = 0; + + // + Clean(pivots); + + // + if (!IsValid()) + { + return result; + } + + // + ENUM_X_DIRECTION forDir = GetDirection(); + bool isBullish = IsBullish(forDir); + + // + XOHCL passedBar; + XOBFVGPivot iPivot; + bool isPassed = false; + double appliedPrice = 0; + bool isBodyState = false; + + // + // Start ... + isPassed = ob.IsStarted( + forDir, + passedBar, + isBodyState // + ); + if (isPassed) + { + // + appliedPrice = + isBullish + ? passedBar.low + : passedBar.high; + + // + iPivot.Clean(); + iPivot.value = appliedPrice; + iPivot.at = passedBar.time; + + // + AddRef( + iPivot, + pivots // + ); + + // + iPivot.Clean(); + } + + // + // Activation ... + isPassed = ob.IsActivated( + forDir, + passedBar, + isBodyState // + ); + if (isPassed) + { + // + appliedPrice = + isBullish + ? passedBar.low + : passedBar.high; + + // + iPivot.Clean(); + iPivot.value = appliedPrice; + iPivot.at = passedBar.time; + + // + AddRef( + iPivot, + pivots // + ); + + // + iPivot.Clean(); + } + + // + // Worked ... + isPassed = ob.IsWorked( + forDir, + passedBar, + isBodyState // + ); + if (isPassed) + { + // + appliedPrice = + isBullish + ? passedBar.low + : passedBar.high; + + // + iPivot.Clean(); + iPivot.value = appliedPrice; + iPivot.at = passedBar.time; + + // + AddRef( + iPivot, + pivots // + ); + + // + iPivot.Clean(); + } + + // + passedBar.Clean(); + + // + result = ArraySize(pivots); + + // + return result; + } + + // + void UpdateZones( + XPOIState &state // + ) + { + // + Clean(supplyZones); + Clean(demandZones); + Clean(supportZones); + Clean(resistanceZones); + + // + bool isValid = + IsValid() && + state.HasChild(); + if (!isValid) + { + return; + } + + // + int count = 0; + bool has = false; + bool isPassed = false; + + // + // Supply Zones ... + has = state.HasSupplyZones(); + if (has) + { + // + count = state.CountSupplyZones(); + for (int i = 0; i < count; i++) + { + // + XCSupplyZone *iZone = state.supplyZones[i]; + + // + isPassed = iZone.From() > ob.From(); + if (!isPassed) + { + // + ZeroMemory(iZone); + continue; + } + + // + isPassed = IsInsideDiff( + iZone, + ob // + ); + if (!isPassed) + { + // + ZeroMemory(iZone); + continue; + } + + // + Add( + iZone, + supplyZones // + ); + } + } + + // + // Demand Zones ... + has = state.HasDemandZones(); + if (has) + { + // + count = state.CountDemandZones(); + for (int i = 0; i < count; i++) + { + // + XCDemandZone *iZone = state.demandZones[i]; + + // + isPassed = iZone.From() > ob.From(); + if (!isPassed) + { + // + ZeroMemory(iZone); + continue; + } + + // + isPassed = IsInsideDiff( + iZone, + ob // + ); + if (!isPassed) + { + // + ZeroMemory(iZone); + continue; + } + + // + Add( + iZone, + demandZones // + ); + } + } + + // + // Support Zones ... + has = state.HasSupportZones(); + if (has) + { + // + count = state.CountSupportZones(); + for (int i = 0; i < count; i++) + { + // + XCSupportZone *iZone = state.supportZones[i]; + + // + isPassed = iZone.From() > ob.From(); + if (!isPassed) + { + // + ZeroMemory(iZone); + continue; + } + + // + isPassed = IsInsideDiff( + iZone, + ob // + ); + if (!isPassed) + { + // + ZeroMemory(iZone); + continue; + } + + // + Add( + iZone, + supportZones // + ); + } + } + + // + // Resistance Zones ... + has = state.HasResistanceZones(); + if (has) + { + // + count = state.CountResistanceZones(); + for (int i = 0; i < count; i++) + { + // + XCResistanceZone *iZone = state.resistanceZones[i]; + + // + isPassed = iZone.From() > ob.From(); + if (!isPassed) + { + // + ZeroMemory(iZone); + continue; + } + + // + isPassed = IsInsideDiff( + iZone, + ob // + ); + if (!isPassed) + { + // + ZeroMemory(iZone); + continue; + } + + // + Add( + iZone, + resistanceZones // + ); + } + } + } + + // + void UpdateTo(datetime value = NULL) + { + // + value = NormalizeTime(value); + + // + int count = 0; + bool has = false; + + // + has = HasOB(); + if (has) + { + ob.To(value); + } + + // + has = HasFVG(); + if (has) + { + fvg.To(value); + } + + // + // Supply Zones ... + has = HasSupplyZones(); + if (has) + { + // + count = CountSupplyZones(); + for (int i = 0; i < count; i++) + { + supplyZones[i].To(value); + } + } + + // + // Demand Zones ... + has = HasDemandZones(); + if (has) + { + // + count = CountDemandZones(); + for (int i = 0; i < count; i++) + { + demandZones[i].To(value); + } + } + + // + // Support Zones ... + has = HasSupportZones(); + if (has) + { + // + count = CountSupportZones(); + for (int i = 0; i < count; i++) + { + supportZones[i].To(value); + } + } + + // + // Resistance Zones ... + has = HasResistanceZones(); + if (has) + { + // + count = CountResistanceZones(); + for (int i = 0; i < count; i++) + { + resistanceZones[i].To(value); + } + } + } +}; + +// +// +// + +/** + * Extract XOBFVG Collection of Market ... + * + * @param htfState: Higher Time Frame POI State (Used For Detecting Order Blocks) ... + * @param mtfState: Medium Time Frame POI State (Used For Detecting Fair Value Gaps) ... + * @param stfState: Short Time Frame POI State (Used For Detecting Other POI(s)) ... + * @param dest: Result Collection ... + * @param forDir: Market Direction for Detecting POI(s) ... + * @param forPeriod: Time Frame which Used for Zones actions (NULL for Default) ... + * @param startState: Zones Start State ... + * @param forceStartedBodyOut: Zones Started Bar's Body State ... + * @param activeState: Zones Activation State ... + * @param forceActivatedBodyIn: Zones Activated Bar's Body State ... + * @param breakState: Zones Breaked State ... + * @param forceBreakedBodyOut: Zone Breaker Bar's Body State ... + * @param workState: Zones Worked State ... + * @param forceWorkedBodyOut: Zones Worked Bar's Body State ... + * @param applySort: Specify Applying Sorting on Collections ... + * @param applyFromFilter: Filter Sorted Zones based on Occured Date ... + * @param applyPlaceFilter: Filter Sorted Zones based on Occured Place ... + * @param ignoreInside: Ignore Inside Sides of POI(s) Zones in Related to Order Block ... + * @param applyFromFilterForPOIs: Apply From Filter for Other POI(s) ... + * + * @return ( int ) + */ +int ExtractOBFVGZones( + XPOIState &htfState, + XPOIState &mtfState, + XPOIState &stfState, + XOBFVG &dest[], + // + ENUM_X_DIRECTION forDir, + ENUM_TIMEFRAMES forPeriod = NULL, + // + // Start ... + ENUM_XZONE_STATE startState = XZONE_STATE_PASSED, + bool forceStartedBodyOut = false, + // + // Activation ... + ENUM_XZONE_STATE activeState = XZONE_STATE_FAILED, + bool forceActivatedBodyIn = false, + // + // Breaktion ... + ENUM_XZONE_STATE breakState = XZONE_STATE_FAILED, + bool forceBreakedBodyOut = false, + // + // Works ... + ENUM_XZONE_STATE workState = XZONE_STATE_FAILED, + bool forceWorkedBodyOut = false, + // + bool applySort = true, + bool applyFromFilter = true, + bool applyPlaceFilter = true, + // + bool ignoreInside = true, + // + bool detectInsideOBPOIs = true, + bool detectInsideFVGPOIs = true, + bool applyFromFilterForPOIs = true + // +) +{ + // + int result = 0; + + // + Clean(dest); + + // + bool isValid = + // + htfState.HasChild() && + mtfState.HasChild() && + stfState.HasChild() && + HasDirection(forDir) + // + ; + if (!isValid) + { + return result; + } + + // + // Implement Logic ... + + // + int idx = -1; + int count = 0; + bool has = false; + XCFVG *tmpFVGs[]; + XOBFVG tmpOBFVGs[]; + XCOrderBlock *tmpOBs[]; + XCOrderBlock *tmpWorkingOBs[]; + datetime cTime = TimeCurrent(); + bool isBullish = IsBullish(forDir); + + // + if (isBullish) + { + // + has = htfState.HasBullishOrderBlocks(); + if (has) + { + // + Copy( + htfState.bullishOrderBlocks, + tmpOBs // + ); + + // + has = mtfState.HasBullishFairValueGaps(); + if (has) + { + // + Copy( + mtfState.bullishFairValueGaps, + tmpFVGs // + ); + } + } + } + else + { + // + has = htfState.HasBearishOrderBlocks(); + if (has) + { + // + Copy( + htfState.bearishOrderBlocks, + tmpOBs // + ); + + // + has = mtfState.HasBearishFairValueGaps(); + if (has) + { + // + Copy( + mtfState.bearishFairValueGaps, + tmpFVGs // + ); + } + } + } + + // + count = ArraySize(tmpOBs); + has = IsValidSize(count); + if (has) + { + // + for (int i = 0; i < count; i++) + { + // + XCOrderBlock *iOB = tmpOBs[i]; + + // + // Check Started State ... + if (startState == XZONE_STATE_PASSED || + startState == XZONE_STATE_FAILED) + { + // + XOHCL passedBar; + bool isBodyOut = false; + bool isStarted = iOB.IsStarted( + forDir, + passedBar, + isBodyOut, + forPeriod // + ); + + // + bool isPassed = + startState == XZONE_STATE_FAILED + ? !isStarted + : !forceStartedBodyOut + ? isStarted + : isStarted && + isBodyOut; + + // + passedBar.Clean(); + if (!isPassed) + { + continue; + } + } + + // + // Check Activation State ... + if (activeState == XZONE_STATE_PASSED || + activeState == XZONE_STATE_FAILED) + { + // + XOHCL passedBar; + bool isBodyIn = false; + bool isActivated = iOB.IsActivated( + forDir, + passedBar, + isBodyIn, + forceStartedBodyOut, + forPeriod // + ); + + // + bool isPassed = + activeState == XZONE_STATE_FAILED + ? !isActivated + : !forceActivatedBodyIn + ? isActivated + : isActivated && + isBodyIn; + + // + passedBar.Clean(); + if (!isPassed) + { + continue; + } + } + + // + // Check Break State ... + if (breakState == XZONE_STATE_PASSED || + breakState == XZONE_STATE_FAILED) + { + // + XOHCL passedBar; + bool isBodyOut = false; + bool isBreaked = iOB.IsBreaked( + forDir, + passedBar, + isBodyOut, + forceStartedBodyOut, + forPeriod // + ); + + // + bool isPassed = + breakState == XZONE_STATE_FAILED + ? !isBreaked + : !forceBreakedBodyOut + ? isBreaked + : isBreaked && + isBodyOut; + + // + passedBar.Clean(); + if (!isPassed) + { + continue; + } + } + + // + // Check Work State ... + if (workState == XZONE_STATE_PASSED || + workState == XZONE_STATE_FAILED) + { + // + bool ignoreActivation = activeState != XZONE_STATE_PASSED; + + // + XOHCL passedBar; + bool isBodyOut = false; + bool isWorked = iOB.IsWorked( + forDir, + passedBar, + isBodyOut, + ignoreActivation, + forceStartedBodyOut, + forceActivatedBodyIn, + forPeriod // + ); + + // + bool isPassed = + workState == XZONE_STATE_FAILED + ? !isWorked + : !forceWorkedBodyOut + ? isWorked + : isWorked && + isBodyOut; + + // + passedBar.Clean(); + if (!isPassed) + { + continue; + } + } + + // + has = FindIndex( + idx, + iOB, + tmpWorkingOBs // + ); + if (has) + { + // + ZeroMemory(iOB); + continue; + } + + // + Add( + iOB, + tmpWorkingOBs // + ); + } + } + + // + // Clean ... + Clean(tmpOBs); + has = HasChild(tmpWorkingOBs); + if (has) + { + // + Clean(tmpOBs); + Copy( + tmpWorkingOBs, + tmpOBs // + ); + + // + Clean(tmpWorkingOBs); + } + + // + // Sorting ... + if (applySort) + { + // + Clean(tmpWorkingOBs); + has = HasChild(tmpOBs); + count = ArraySize(tmpOBs); + + // + // Sorting Applied Only when there is more than one item ... + if (has && count > 1) + { + // + bool hasLast = false; + XCOrderBlock *last = NULL; + while (HasChild(tmpOBs)) + { + // + // Extract First Last Item ... + if (!hasLast) + { + // + idx = + isBullish + ? GetLowest(tmpOBs) + : GetHighest(tmpOBs); + hasLast = IsValidIndex(idx); + if (hasLast) + { + // + last = tmpOBs[idx]; + ArrayRemove( + tmpOBs, + idx, + 1 // + ); + + // + Add( + last, + tmpWorkingOBs // + ); + } + } + + // + has = false; + XCOrderBlock *iOB = NULL; + idx = + isBullish + ? GetLowest(tmpOBs) + : GetHighest(tmpOBs); + has = IsValidIndex(idx); + if (has) + { + // + iOB = tmpOBs[idx]; + ArrayRemove( + tmpOBs, + idx, + 1 // + ); + } + + // + if (!has) + { + break; + } + + // + // Apply From Filter ... + if (applyFromFilter) + { + // + bool isFromPassed = + hasLast && + last.From() < iOB.From(); + if (!isFromPassed) + { + continue; + } + } + + // + // Apply Place Filter ... + if (applyPlaceFilter) + { + // + bool isAbove = + hasLast && + IsAbove( + iOB, + last, + ignoreInside // + ); + + // + bool isBelow = + hasLast && + IsBelow( + iOB, + last, + ignoreInside // + ); + + // + bool isPlacePassed = + isBullish + ? isAbove + : isBelow; + if (!isPlacePassed) + { + continue; + } + } + + // + last = iOB; + Add( + iOB, + tmpWorkingOBs // + ); + } + + // + if (hasLast && + !HasChild(tmpWorkingOBs)) + { + // + Add( + last, + tmpWorkingOBs // + ); + } + } + else + { + // + Copy( + tmpOBs, + tmpWorkingOBs // + ); + } + + // + if (HasChild(tmpWorkingOBs)) + { + // + Copy( + tmpWorkingOBs, + tmpOBs // + ); + } + // + } + + // + count = ArraySize(tmpOBs); + has = IsValidSize(count); + + // + // Converts to XOBFVG ... + if (has) + { + // + for (int i = 0; i < count; i++) + { + // + XOBFVG iOBFVG; + + // + iOBFVG.ob = tmpOBs[i]; + + // + AddRef( + iOBFVG, + tmpOBFVGs // + ); + + // + iOBFVG.Clean(); + } + } + + // + Clean(dest); + Clean(tmpOBs); + Clean(tmpWorkingOBs); + + // + // Here we Going to Complete XOBFVGs ... + has = HasChild(tmpOBFVGs); + if (has && HasChild(tmpFVGs)) + { + // + count = ArraySize(tmpOBFVGs); + for (int i = 0; i < count; i++) + { + // + XOBFVG iOBFVG = tmpOBFVGs[i]; + + // + // Detecting FVG ... + XCFVG *tmpWorkingFVGs[]; + for (int j = 0; j < ArraySize(tmpFVGs); j++) + { + // + XCFVG *jFVG = tmpFVGs[j]; + + // + // Check Start Date ... + bool isFromPassed = jFVG.From() > iOBFVG.ob.From(); + if (!isFromPassed) + { + // + ZeroMemory(jFVG); + continue; + } + + // + // Check Place ... + + // + bool isAbove = IsAboveDiff( + jFVG, + iOBFVG.ob, + ignoreInside // + ); + + // + bool isBelow = IsBelowDiff( + jFVG, + iOBFVG.ob, + ignoreInside // + ); + + // + bool isInside = IsInsideDiff( + jFVG, + iOBFVG.ob, + false // + ); + + // + bool isPlacePassed = + isInside || + (isBullish + ? isAbove + : isBelow); + if (!isPlacePassed) + { + // + ZeroMemory(jFVG); + continue; + } + + // + Add( + jFVG, + tmpWorkingFVGs // + ); + } + + // + int fvgsCount = ArraySize(tmpWorkingFVGs); + has = IsValidSize(fvgsCount); + if (has) + { + // + idx = + isBullish + ? GetLowest(tmpWorkingFVGs) + : GetHighest(tmpWorkingFVGs); + + // + if (IsValidIndex(idx)) + { + // + XCFVG *selectedFVG = tmpWorkingFVGs[idx]; + + // + iOBFVG.fvg = selectedFVG; + + // + bool isExists = FindIndex( + idx, + selectedFVG, + tmpFVGs // + ); + if (isExists) + { + // + ArrayRemove( + tmpFVGs, + idx, + 1 // + ); + } + } + } + Clean(tmpWorkingFVGs); + + // + bool isFVGPassed = iOBFVG.HasFVG(); + if (!isFVGPassed) + { + // + iOBFVG.Clean(); + continue; + } + + // + // Validate Model ... + bool isValid = iOBFVG.IsValid(); + if (!isValid) + { + // + iOBFVG.Clean(); + continue; + } + + // + iOBFVG.UpdateTo(cTime); + + // + AddRef( + iOBFVG, + dest // + ); + + // + iOBFVG.Clean(); + } + + // + Clean(tmpOBFVGs); + } + + // + // Detecting Other POI(s) ... + has = HasChild(dest); + bool canDetectPOIs = + detectInsideOBPOIs || + detectInsideFVGPOIs; + if (has && + canDetectPOIs) + { + // + count = ArraySize(dest); + for (int i = 0; i < count; i++) + { + // + // Supply Zones ... + has = stfState.HasSupplyZones(); + if (has) + { + // + for (int j = 0; j < stfState.CountSupplyZones(); j++) + { + // + bool isInsideOB = IsInsideDiff( + stfState.supplyZones[j], + dest[i].ob // + ); + + // + bool isInsideFVG = IsInsideDiff( + stfState.supplyZones[j], + dest[i].fvg // + ); + + // + bool isInside = isInsideOB || + isInsideFVG; + if (isInside) + { + // + bool isPassed = + detectInsideOBPOIs + ? isInsideOB + : detectInsideFVGPOIs + ? isInsideFVG + : false; + if (isPassed) + { + // + isPassed = + !applyFromFilterForPOIs + ? isPassed + : isInsideOB + ? stfState.supplyZones[j].From() > dest[i].ob.From() + : isInsideFVG + ? stfState.supplyZones[j].From() > dest[i].fvg.From() + : false; + } + + // + if (isPassed) + { + // + Add( + stfState.supplyZones[j], + dest[i].supplyZones // + ); + } + } + } + } + + // + // Demand Zones ... + has = stfState.HasDemandZones(); + if (has) + { + // + for (int j = 0; j < stfState.CountDemandZones(); j++) + { + // + bool isInsideOB = IsInsideDiff( + stfState.demandZones[j], + dest[i].ob // + ); + + // + bool isInsideFVG = IsInsideDiff( + stfState.demandZones[j], + dest[i].fvg // + ); + + // + bool isInside = isInsideOB || + isInsideFVG; + if (isInside) + { + // + bool isPassed = + detectInsideOBPOIs + ? isInsideOB + : detectInsideFVGPOIs + ? isInsideFVG + : false; + if (isPassed) + { + // + isPassed = + !applyFromFilterForPOIs + ? isPassed + : isInsideOB + ? stfState.demandZones[j].From() > dest[i].ob.From() + : isInsideFVG + ? stfState.demandZones[j].From() > dest[i].fvg.From() + : false; + } + + // + if (isPassed) + { + // + Add( + stfState.demandZones[j], + dest[i].demandZones // + ); + } + } + } + } + + // + // Support Zones ... + has = stfState.HasSupportZones(); + if (has) + { + // + for (int j = 0; j < stfState.CountSupportZones(); j++) + { + // + bool isInsideOB = IsInsideDiff( + stfState.supportZones[j], + dest[i].ob // + ); + + // + bool isInsideFVG = IsInsideDiff( + stfState.supportZones[j], + dest[i].fvg // + ); + + // + bool isInside = isInsideOB || + isInsideFVG; + if (isInside) + { + // + bool isPassed = + detectInsideOBPOIs + ? isInsideOB + : detectInsideFVGPOIs + ? isInsideFVG + : false; + if (isPassed) + { + // + isPassed = + !applyFromFilterForPOIs + ? isPassed + : isInsideOB + ? stfState.supportZones[j].From() > dest[i].ob.From() + : isInsideFVG + ? stfState.supportZones[j].From() > dest[i].fvg.From() + : false; + } + + // + if (isPassed) + { + // + Add( + stfState.supportZones[j], + dest[i].supportZones // + ); + } + } + } + } + + // + // Resistance Zones ... + has = stfState.HasResistanceZones(); + if (has) + { + // + for (int j = 0; j < stfState.CountResistanceZones(); j++) + { + // + bool isInsideOB = IsInsideDiff( + stfState.resistanceZones[j], + dest[i].ob // + ); + + // + bool isInsideFVG = IsInsideDiff( + stfState.resistanceZones[j], + dest[i].fvg // + ); + + // + bool isInside = isInsideOB || + isInsideFVG; + if (isInside) + { + // + bool isPassed = + detectInsideOBPOIs + ? isInsideOB + : detectInsideFVGPOIs + ? isInsideFVG + : false; + if (isPassed) + { + // + isPassed = + !applyFromFilterForPOIs + ? isPassed + : isInsideOB + ? stfState.resistanceZones[j].From() > dest[i].ob.From() + : isInsideFVG + ? stfState.resistanceZones[j].From() > dest[i].fvg.From() + : false; + } + + // + if (isPassed) + { + // + Add( + stfState.resistanceZones[j], + dest[i].resistanceZones // + ); + } + } + } + } + } + } + + // + Clean(tmpOBs); + Clean(tmpFVGs); + Clean(tmpOBFVGs); + + // + result = ArraySize(dest); + + // + return result; +} + +/** + * Find Highest Order Block of XOBFVG Collection ... + * + * @param source: XOBFVG Collection ... + * + * @return ( int ) + */ +int GetHighest( + XOBFVG &source[] // +) +{ + // + int result = -1; + + // + int count = ArraySize(source); + bool has = IsValidSize(count); + if (!has) + { + return result; + } + + // + XOBFVG item; + for (int i = 0; i < count; i++) + { + // + XOBFVG iOBFVG = source[i]; + + // + bool canSet = + !item.IsValid() + ? true + : item.ob.Upper() < iOBFVG.ob.Upper(); + if (canSet) + { + // + item = iOBFVG; + result = i; + } + + // + iOBFVG.Clean(); + } + + // + item.Clean(); + + // + return result; +} + +/** + * Find Lowest Order Block of XOBFVG Collection ... + * + * @param source: XOBFVG Collection ... + * + * @return ( int ) + */ +int GetLowest( + XOBFVG &source[] // +) +{ + // + int result = -1; + + // + int count = ArraySize(source); + bool has = IsValidSize(count); + if (!has) + { + return result; + } + + // + XOBFVG item; + for (int i = 0; i < count; i++) + { + // + XOBFVG iOBFVG = source[i]; + + // + bool canSet = + !item.IsValid() + ? true + : item.ob.Lower() > iOBFVG.ob.Lower(); + if (canSet) + { + // + item = iOBFVG; + result = i; + } + + // + iOBFVG.Clean(); + } + + // + item.Clean(); + + // + return result; +} + +/** + * Find Youngest Order Block of XOBFVG Collection ... + * + * @param source: XOBFVG Collection ... + * + * @return ( int ) + */ +int GetYoungest( + XOBFVG &source[] // +) +{ + // + int result = -1; + + // + int count = ArraySize(source); + bool has = IsValidSize(count); + if (!has) + { + return result; + } + + // + XOBFVG item; + for (int i = 0; i < count; i++) + { + // + XOBFVG iOBFVG = source[i]; + + // + bool canSet = + !item.IsValid() + ? true + : item.ob.From() < iOBFVG.ob.From(); + if (canSet) + { + // + item = iOBFVG; + result = i; + } + + // + iOBFVG.Clean(); + } + + // + item.Clean(); + + // + return result; +} + +/** + * Find Oldest Order Block of XOBFVG Collection ... + * + * @param source: XOBFVG Collection ... + * + * @return ( int ) + */ +int GetOldest( + XOBFVG &source[] // +) +{ + // + int result = -1; + + // + int count = ArraySize(source); + bool has = IsValidSize(count); + if (!has) + { + return result; + } + + // + XOBFVG item; + for (int i = 0; i < count; i++) + { + // + XOBFVG iOBFVG = source[i]; + + // + bool canSet = + !item.IsValid() + ? true + : item.ob.From() > iOBFVG.ob.From(); + if (canSet) + { + // + item = iOBFVG; + result = i; + } + + // + iOBFVG.Clean(); + } + + // + item.Clean(); + + // + return result; +} + +/** + * Sort XOBFVG Collection based on OB Place ... + * + * @param source: XOBFVG instance Collection ... + * @param forDir: ENUM_X_DIRECTION member ... + * @param ignoreInside: Specified Ignoring price inside in Sorting ... + */ +void Sort( + XOBFVG &source[], + ENUM_X_DIRECTION forDir, + bool ignoreInside = true // +) +{ + // + int idx = -1; + int count = 0; + bool has = false; + + // + has = HasDirection(forDir); + if (!has) + { + return; + } + + // + bool isBullish = IsBullish(forDir); + + // + count = ArraySize(source); + has = IsValidSize(count); + if (!has) + { + return; + } + + // + XOBFVG last; + XOBFVG tmpItems[]; + bool hasLast = false; + while (HasChild(source)) + { + // + if (!hasLast) + { + // + idx = GetOldest(source); + hasLast = IsValidIndex(idx); + if (hasLast) + { + // + last = source[idx]; + ArrayRemove( + source, + idx, + 1 // + ); + + // + AddRef( + last, + tmpItems // + ); + } + + // + count = ArraySize(source); + has = IsValidSize(count); + if (!has) + { + // + last.Clean(); + break; + } + } + if (!hasLast) + { + // + last.Clean(); + break; + } + + // + XOBFVG item; + idx = GetOldest(source); + has = IsValidIndex(idx); + if (!has) + { + // + item.Clean(); + last.Clean(); + break; + } + item = source[idx]; + ArrayRemove( + source, + idx, + 1 // + ); + + // + bool isAbove = IsAbove( + item.ob, + last.ob, + ignoreInside // + ); + + // + bool isBelow = IsBelow( + item.ob, + last.ob, + ignoreInside // + ); + + // + has = + isBullish + ? isAbove + : isBelow; + if (has) + { + // + AddRef( + item, + tmpItems // + ); + + // + last = item; + hasLast = item.IsValid(); + } + } + + // + Clean(source); + Copy( + tmpItems, + source // + ); + + // + Clean(tmpItems); +} + +// diff --git a/BKPS/14031206/X121SMCEA/Classes/x-121.smc.base.strategy.class.ex5 b/BKPS/14031206/X121SMCEA/Classes/x-121.smc.base.strategy.class.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..e7f24e9650c83cc173de27e84e97fb6627941bf2 GIT binary patch literal 16676 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 YSEOlyMGP^FMU1BrK3jlypE%k71IXa?$N&HU literal 0 HcmV?d00001 diff --git a/BKPS/14031206/X121SMCEA/Classes/x-121.smc.base.strategy.class.mq5 b/BKPS/14031206/X121SMCEA/Classes/x-121.smc.base.strategy.class.mq5 new file mode 100644 index 0000000..fc5e824 --- /dev/null +++ b/BKPS/14031206/X121SMCEA/Classes/x-121.smc.base.strategy.class.mq5 @@ -0,0 +1,650 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 Class Library +// -------------------------------------- +// Name: XSCX121SMCBaseStrategy +// Description: provides all based classes for use ... +// +// +// Maintainer: +// ------------ +// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) +// +////////////////////////////////////////////////////// +// +// Global Properties ... +#property library +#property copyright "Copyright 2023, SaherElm IT Center" +#property link "https://www.saherelm.ir" +#property version "1.00" +#property strict + +// +// Imports ... + +// +#include "../../Classes/x-saherelm.x-alert.class.mq5" +#include "../../Classes/x-saherelm.x-bar.analyser.class.mq5" +#include "../../Classes/x-saherelm.x-poi.class.mq5" +#include "../../Classes/x-saherelm.x-trade.class.mq5" +#include "../Classes/x-121.smc.cobjects.class.mq5" +#include "../Libraries/x-121.smc.lib.mq5" + +// +// Helper(s) ... + +// +// XStrategy Class Implementation(s) ... +class XCX121SMCBaseStrategy : public XCBaseAlert +{ + // + // Public ... + public: + // + XCAccount mAccount; + + // + // Constructor(s) ... + XCX121SMCBaseStrategy( + // + // Base ... + string _symbol, // Trading Symbol + ENUM_TIMEFRAMES _period // Trading TimeFrame + ) + { + // + mSymbol = _symbol; + mPeriod = _period; + + // + Init(); + } + + // + // Deconstructor ... + ~XCX121SMCBaseStrategy() + { + DeInit(); + } + + // + // Getter / Setter (s) ... + + /** + * Retrieve Symbol ... + * + * @return ( string ) + */ + string GetSymbol() + { + return mSymbol; + } + + /** + * Retrieve TimeFrame ... + * + * @return ( ENUM_TIMEFRAMES ) + */ + ENUM_TIMEFRAMES GetPeriod() + { + return mPeriod; + } + + /** + * Check Strategy is Disabled or not ... + * + * @return ( bool ) + */ + bool IsDisabled() + { + return mForceDisabled; + } + + /** + * Get Signal Volume ... + * + * @return ( double ) + */ + double Volume() + { + return mVolume; + } + + /** + * Set Signal Volume ... + * + * @param value: Double ... + */ + void Volume(double value) + { + // + if (value < 0.01) + { + value = 0.01; + } + + // + mVolume = value; + } + + /** + * Get Risk/Reward Ratio ... + * + * @return ( double ) + */ + double R2R() + { + return mR2R; + } + + /** + * Set Risk/Reward Ratio ... + * + * @param value: Double ... + */ + void R2R(double value) + { + // + if (value < 0) + { + value = 1.5; + } + + // + mR2R = value; + } + + /** + * Get Max Allowed Spread ... + * + * @return ( double ) + */ + double MaxAllowedSpread() + { + return mMaxAllowedSpread; + } + + /** + * Set Max Allowed Spread ... + * + * @param value: Double ... + */ + void MaxAllowedSpread(double value) + { + mMaxAllowedSpread = value; + } + + /** + * Get Long Signalling State ... + * + * @return ( bool ) + */ + bool AllowLong() + { + return mAllowLong; + } + + /** + * Set Long Signalling State ... + * + * @param value: Boolean ... + */ + void AllowLong(bool value) + { + mAllowLong = value; + } + + /** + * Get Short Signalling State ... + * + * @return ( bool ) + */ + bool AllowShort() + { + return mAllowShort; + } + + /** + * Set Short Signalling State ... + * + * @param value: Argument 1 + */ + void AllowShort(bool value) + { + mAllowShort = value; + } + + // + // Actions ... + + /** + * Disable Strategy ... + */ + void Disable() + { + mForceDisabled = true; + } + + /** + * Enable Strategy ... + */ + void Enable() + { + mForceDisabled = false; + } + + /** + * Register Signal Event Handler ... + * + * @param handler: an Instance of TOnXSignal ... + */ + void AddXSignalEventHandler(TOnX121SMCSignal handler) + { + // + Add( + handler, + mSignalEventHandlers // + ); + } + + // + // Virtual Actions ... + + /** + * Destroy All Class Implementations ... + */ + virtual void Destroy() + { + } + + /** + * Handle Tick Processing ... + * + * @param positions: XPosition instance Collection ... + */ + virtual void HandleTick() + { + // + DoUnwaitedTicksWork(); + + // + // Check State ... + if (IsDisabled()) + { + return; + } + + // + // Check Signalling State ... + if (!AllowLong() && !AllowShort()) + { + return; + } + + // + // Check Bar Tracker State ... + if (!mBarTracker.CanProcessBar()) + { + return; + } + + // + // Retrieve Current Tick and Check it's Time + // by Last Issued Tick ... + MqlTick cTick; + bool hasTick = GetTick( + mSymbol, + cTick // + ); + bool isSameAsLast = cTick.time == mLastTick.time; + if (isSameAsLast) + { + return; + } + + // + // Update Last Issued Tick ... + mLastTick = cTick; + + // + // Check Current Processing Tick has Signal or not ... + XSignal signal; + X121SMCStrategyConditions conditions; + bool hasSignal = HasSignal( + signal, + conditions // + ); + if (!hasSignal) + { + return; + } + + // + // Waits Until Next Candle if Current Tick has Signal ... + mBarTracker.Waits(); + + // + // Notify Signal Event Handlers ... + NotifyOnSignalEventHandlers( + signal, + conditions // + ); + } + + /** + * Check for any Guards ... + * + * @param guards: X121SMCGuard instance Collection ... + * @param positions: XPosition instance Collection ... + * + * @return ( virtual bool ) + */ + virtual bool HandleGuard( + X121SMCGuard &guards[], + XPosition &positions[] // + ) + { + // + bool result = false; + + // + // Check State ... + if (IsDisabled()) + { + return result; + } + + // + // Check Signalling State ... + if (!AllowLong() && !AllowShort()) + { + return result; + } + + // + // Check Bar Tracker State ... + if (!mGuardBarTracker.CanProcessBar()) + { + return result; + } + + // + // Check For Guards ... + result = CheckGuard( + guards, + positions // + ); + + // + // Waits Until Next Candle if Current Tick has Guard ... + mGuardBarTracker.Waits(); + + // + Clean(positions); + + // + return result; + } + + /** + * Check For Signal ... + * + * @param signal: XSignal instance ... + * @param conditions: X121SMCStrategyConditions instance ... + * + * @return ( virtual bool ) + */ + virtual bool HasSignal( + XSignal &signal, + X121SMCStrategyConditions &conditions // + ) + { + // + bool result = false; + + // + signal.Clean(); + conditions.Clean(); + + // + return result; + } + + /** + * Check for any Guard Actions ... + * + * @param guards: X121SMCGuard instance Collection ... + * + * @return ( virtual bool ) + */ + virtual bool CheckGuard( + X121SMCGuard &guards[], + const XPosition &positions[] // Positions ... + ) + { + // + bool result = false; + + // + return result; + } + + /** + * Update all Requirements without waiting ... + */ + virtual void DoUnwaitedTicksWork() + { + } + + /** + * Detect SL Candidates based on Strategy and Conditions ... + * + * @param result: Double array reference ... + * @param entry: Double, Position Entry Price ... + * @param conditions: X121SMCStrategyConditions instance, Provides Configurations ... + * @param type: ENUM_X_POSITION_TYPES member, Specified Position Type ... + */ + virtual void DetectSLCandidates( + double &result[], + double entry, + X121SMCStrategyConditions &conditions, + ENUM_X_POSITION_TYPES type // + ) + { + } + + /** + * Customize Strategy Identifier ... + * + * @return ( virtual string ) + */ + virtual string GetTag() + { + return X121SMCStrategyToken; + } + + // + // Protected ... + protected: + // + + // + // Props ... + + // + MqlTick mLastTick; // Last Issued Tick ... + + // + XBarTracker mBarTracker; // Strategy Bar Tracker ... + XBarTracker mGuardBarTracker; // Strategy Guard Bar Tracker ... + XCBarAnalyser *mBarAnalyser; // Bar Analyser Instance + + // + // Actions ... + + /** + * Prepare and Normalize Signal for Execution in Strategy ... + * + * @param signal: XSignal instance ... + * + * @return ( bool ) + */ + bool PrepareSignal(XSignal &signal) + { + // + bool result = false; + + // + // Check Strategy Is Enables ... + result = !IsDisabled(); + if (!result) + { + return result; + } + + // + // Validate Signal ... + result = signal.IsValid(); + if (!result) + { + return result; + } + + // + bool isLong = IsLong(signal.type); + + // + // TODO: Implement Signal Preparation Mechanism here ... + + // + return result; + } + + // + + /** + * Notified Signal Event Handler(s) ... + * + * @param signal: XSignal instance ... + * @param conditions: XStrategyConditions instance ... + */ + void NotifyOnSignalEventHandlers( + XSignal &signal, + X121SMCStrategyConditions &conditions // + ) + { + // + if (!signal.IsValid() || !conditions.IsValid()) + { + return; + } + + // + int count = ArraySize(mSignalEventHandlers); + if (!IsValidSize(count)) + { + return; + } + + // + for (int i = 0; i < count; i++) + { + // + mSignalEventHandlers[i]( + signal, + conditions // + ); + } + } + + // + // Private ... + private: + // + // Props ... + + // + string mSymbol; // Trading Symbol ... + ENUM_TIMEFRAMES mPeriod; // Trading TimeFrame ... + bool mForceDisabled; // Force Disabled ... + bool mAllowLong; // Allow Long Signals + bool mAllowShort; // Allow Short Signals + double mR2R; // Risk/Rewar Ratio ... + double mVolume; // Static Volume Per Trades ... + + // + double mMaxAllowedSpread; // Max Allowed Spread ... + + // + // On X121 Signal Recieved Event Handler(s) ... + TOnX121SMCSignal mSignalEventHandlers[]; + + // + // Actions ... + + /** + * Install all Helpers and Prepare all Configurations for required Indicators ... + */ + void Init() + { + // + mForceDisabled = false; + + // + R2R(1); + Volume(0.01); + + // + string symbol = Symbol(); + ENUM_TIMEFRAMES period = Period(); + + // + // Initialize Bar Tracker ... + mBarTracker.Init( + symbol, + period // + ); + + // + // Initialize Guard Bar Tracker ... + mGuardBarTracker.Init( + symbol, + period // + ); + + // + mBarAnalyser = new XCBarAnalyser(); + + // + } + + /** + * De Initialize all Tools ... + */ + void DeInit() + { + // + ZeroMemory(mBarAnalyser); + + // + delete mBarAnalyser; + + // + Clean(mSignalEventHandlers); + + // + Destroy(); + } + + /** + * Reste Bar Tracker ... + */ + void ResetBarTracker() + { + mBarTracker.Clean(); + } + + // +}; + +// \ No newline at end of file diff --git a/BKPS/14031206/X121SMCEA/Classes/x-121.smc.cobjects.class.ex5 b/BKPS/14031206/X121SMCEA/Classes/x-121.smc.cobjects.class.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..4d1adbb3696b3cd7bf0ebbc82220f7383a1d26fa GIT binary patch literal 16454 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 literal 0 HcmV?d00001 diff --git a/BKPS/14031206/X121SMCEA/Classes/x-121.smc.ea.panel.class.mq5 b/BKPS/14031206/X121SMCEA/Classes/x-121.smc.ea.panel.class.mq5 new file mode 100644 index 0000000..47d16e0 --- /dev/null +++ b/BKPS/14031206/X121SMCEA/Classes/x-121.smc.ea.panel.class.mq5 @@ -0,0 +1,63 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 Class Library +// -------------------------------------- +// Name: XC121Panel +// Description: provides all based classes for use ... +// +// +// Maintainer: +// ------------ +// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) +// +////////////////////////////////////////////////////// +// +// Global Properties ... +#property library +#property copyright "Copyright 2023, SaherElm IT Center" +#property link "https://www.saherelm.ir" +#property version "1.00" +#property strict + +// +// Imports ... +#include "../../Classes/x-saherelm.x-app-dialog.class.mq5" + +// +// Implementation ... + +// +class X121CAppDialog : public XCAppDialog +{ + // + public: + // + // Constructor(s) ... + void X121CAppDialog() + { + } + + // + // Deconstructor ... + void ~X121CAppDialog() + { + } + + // + void Configure() + { + // + // Configure Dialog ... + BackgroundColor(clrBlack); + } + + // + protected: + // + + // + private: + // +}; + +// \ No newline at end of file diff --git a/BKPS/14031206/X121SMCEA/Classes/x-121.smc.market.cycle.helper.class.ex5 b/BKPS/14031206/X121SMCEA/Classes/x-121.smc.market.cycle.helper.class.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..434375aa05cdecf759d3f52445f723617b33f39f GIT binary patch literal 16804 zcmdVAL$EMB&?S6r+qP}nwr$(CZQHhO+xBy9-~avQui4FFwsTUQPEIF_?o_3^k`~oq z1$G30Kn4H-_z!>pC;v$Vp_#bQfpIsEd2Eg_|MiM~fzh3x1&hEd}|6}=o8UN$4 z%YPAY2H*mq|F60KuSWOZ{D1px`oH|9`!7EKZ+rTGJ|#u~y8lj_;s0#>zhE(aS_y=K z$ux8=mCf8(h2TBe4P^+NbOb>He&|v4Jf^Q{vji{z{nh*sDO&b>aK`Cz<+?{ifWJyq z^#z@t@B8kx94yV=ZvUA0oqt+l*9p|7C$L3 z{y`Nt+GWf;!#G+dKo|2>UZuKk%_DVHBvBUJIf#sHHvgm4q~Qa4gVSGzE%4M+(u_iC z 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 0 && + idx < count; + if (!result) + { + return result; + } + + // + zone = mConsolidationZones[idx]; + result = zone.IsValid(); + + // + return result; + } + + // + bool GetLastDirectionalConsolidationZone( + ENUM_X_DIRECTION forDir, + XConsolidationZone &zone // + ) + { + // + bool result = false; + + // + zone.Clean(); + + // + result = HasDirection(forDir); + if (!result) + { + return result; + } + + // + bool hasZones = HasConsolidationZones(); + int zonesCount = CountConsolidationZones(); + result = hasZones; + if (!result) + { + return result; + } + + // + for (int i = zonesCount - 1; i >= 0; i--) + { + // + XConsolidationZone iZone = mConsolidationZones[i]; + + // + if (!iZone.IsBreaked()) + { + continue; + } + + // + if (!HasDirection(iZone.breakDir)) + { + continue; + } + + // + if (iZone.breakDir != forDir) + { + continue; + } + + // + zone = iZone; + break; + } + + // + result = zone.IsValid(); + + // + return result; + } + + // + bool GetActiveConsolidationZone( + XConsolidationZone &zone // + ) + { + // + bool result = false; + + // + zone = mActiveConsolidationZone; + result = zone.IsValid(); + + // + return result; + } + + // + int FillConsolidationZones( + ENUM_X_DIRECTION forDir, + XConsolidationZone &zones[] // + ) + { + // + int result = 0; + + // + Clean(zones); + + // + bool hasZones = HasConsolidationZones(); + if (!hasZones) + { + return result; + } + + // + int count = CountConsolidationZones(); + for (int i = 0; i < count; i++) + { + // + XConsolidationZone iZone = mConsolidationZones[i]; + + // + bool isDirPassed = + (forDir == X_DIRECTION_ALL || + forDir == X_DIRECTION_NONE) + ? true + : forDir == iZone.breakDir; + if (isDirPassed) + { + // + AddRef( + iZone, + zones // + ); + } + } + + // + result = ArraySize(zones); + + // + return result; + } + + // + // Actions ... + + /** + * Initialize ... + * + * @param symbol: String ... + * @param period: ENUM_TIMEFRAMES member ... + * @param x121Inputs: X121Inputs instance ... + * + * @return ( bool ) + */ + bool Init( + string symbol, + ENUM_TIMEFRAMES period, + X121Inputs &x121Inputs, + int requiredPOIS = 50 // + ) + { + // + bool result = false; + + // + if (requiredPOIS < 10) + { + requiredPOIS = 10; + } + + // + result = IsValid(symbol) && + IsValid(period); + if (!result) + { + return result; + } + + // + mSymbol = symbol; + mPeriod = period; + + // + // X121 ... + mX121Helper = new XCX121Helper(); + result = mX121Helper.Init( + symbol, + period, + x121Inputs // + ); + if (!result) + { + return result; + } + + // + mPOIDetector = new XCPOIDetector( + symbol, + period // + ); + mPOIDetector.MaxNumberOfPOIs(requiredPOIS); + mPOIDetector.MaxNumberOfRequiredPOIs(requiredPOIS); + mPOIDetector.Init(); + + // + // Initialize Bar Analyser Class Instance ... + mBarAnalyser = new XCBarAnalyser(); + + // + // Initial and Configure POI Drawer if Required ... + mPOIDrawer = new XCPOIDrawer(); + mPOIDrawer.ChartIdentification(0); + mPOIDrawer.SubWindowIdentification(0); + + // + mPOIDrawer.DemandZoneFill(false); + mPOIDrawer.SupplyZoneFill(false); + mPOIDrawer.BullishFVGFill(false); + mPOIDrawer.BearishFVGFill(false); + mPOIDrawer.SupportZoneFill(false); + mPOIDrawer.ResistanceZoneFill(false); + mPOIDrawer.BullishOrderBlockFill(false); + mPOIDrawer.BearishOrderBlockFill(false); + + // + // Set Chart Style ... + ApplyChartStyle(); + + // + return result; + } + + /** + * Retrieve Symbol ... + * + * @return ( string ) + */ + string GetSymbol() + { + return mSymbol; + } + + /** + * Retrieve TimeFrame (Period) ... + * + * @return ( ENUM_TIMEFRAMES ) + */ + ENUM_TIMEFRAMES GetPeriod() + { + return mPeriod; + } + + /** + * Get Specified Bar ... + * + * @param source: XOHCL instance, Source Bar ... + * @param bar: XOHCL instance, Dest Bar ... + * + * @return ( bool ) + */ + bool GetBar( + XOHCL &source, + XOHCL &bar // + ) + { + // + bool result = false; + + // + bar.Clean(); + + // + string symbol = GetSymbol(); + ENUM_TIMEFRAMES period = GetPeriod(); + + // + result = + IsValid(symbol) && + IsValid(period) && + source.IsValid(); + if (!result) + { + return result; + } + + // + int index = iBarShift( + symbol, + period, + source.time // + ); + result = bar.Init( + symbol, + period, + index // + ); + if (!result) + { + // + bar.Clean(); + return result; + } + + // + return result; + } + + /** + * Retrieve Specified Bar ... + * + * @param bar: XOHCL instance ... + * @param index: Integer ... + * + * @return ( bool ) + */ + bool GetBar( + XOHCL &bar, + int index = 0 // + ) + { + // + bool result = false; + + // + bar.Clean(); + + // + if (index < 0) + { + index = 0; + } + + // + string symbol = GetSymbol(); + ENUM_TIMEFRAMES period = GetPeriod(); + + // + result = bar.Init( + symbol, + period, + index // + ); + + // + return result; + } + + /** + * Retrieve Specified Bar ... + * + * @param bar: XOHCL instance ... + * @param time: Datetime ... + * + * @return ( bool ) + */ + bool GetBar( + XOHCL &bar, + datetime time = NULL // + ) + { + // + bool result = false; + + // + int index = GetBarIndex(time); + result = GetBar(bar, + index // + ); + + // + return result; + } + + /** + * Retrieve Specified Time Bar Index ... + * + * @param time: DateTime ... + * + * @return ( int ) + */ + int GetBarIndex(datetime time = NULL) + { + // + int result = -1; + + // + time = NormalizeTime(time); + + // + string symbol = GetSymbol(); + ENUM_TIMEFRAMES period = GetPeriod(); + + // + result = iBarShift( + symbol, + period, + time // + ); + + // + return result; + } + + /** + * Retrieve Cycle Conditions ... + * + * @param events: ENUM_X_CYCLE_EVENTS member, Array ... + * @param conditions: X121SMCCycleConditions instance ... + * @param barIndex: Integer ... + * @param loopback: Integer ... + * + * @return ( bool ) + */ + bool GetConditions( + ENUM_X_CYCLE_EVENTS &events[], + ENUM_XPOI_EVENTS &poiEvents[], + X121SMCCycleConditions &conditions, + int barIndex = 0, + int loopback = 7 // + ) + { + // + bool result = false; + + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + if (loopback < 5) + { + loopback = 5; + } + + // + Clean(events); + Clean(poiEvents); + conditions.Clean(); + + // + result = mX121Helper.GetConditions( + conditions.x121Conditions, + barIndex, + loopback // + ); + if (!result) + { + // + conditions.Clean(); + return result; + } + + // + mPOIDetector.Update(poiEvents); + mPOIDetector.GetState(conditions.state); + + // + conditions.symbol = GetSymbol(); + conditions.period = GetPeriod(); + conditions.time = TimeCurrent(); + + // + Update(); + + // + result = conditions.IsValid(); + + // + return result; + } + + // + // Tools ... + void Update() + { + // + int czRange = 50; // Consolidation min Range Points ... + int czLoopback = 5; + int maxAllowed = 20; + bool isActiveConsolidationZoneBreaked = false; + bool hasActiveConsolidationZone = mActiveConsolidationZone.IsValid(); + + // + if (hasActiveConsolidationZone) + { + // + isActiveConsolidationZoneBreaked = mActiveConsolidationZone.IsBreaked(); + + // + if (isActiveConsolidationZoneBreaked) + { + // + AddRef( + mActiveConsolidationZone, + mConsolidationZones // + ); + + // + CleanupArray( + mConsolidationZones, + maxAllowed // + ); + + // + mActiveConsolidationZone.Clean(); + } + else + { + mActiveConsolidationZone.Update(); + } + } + else + { + // + XOHCL mBar; + bool hasBar = GetBar( + mBar, + 0 // + ); + if (hasBar) + { + // + double upper = 0; + double lower = 0; + bool hasConsolidationZone = + mBarAnalyser.IsConsolidate( + mBar, + upper, + lower, + czLoopback, + czRange // + ); + + // + if (hasConsolidationZone) + { + // + mActiveConsolidationZone.Init( + GetSymbol(), + GetPeriod(), + upper, + lower, + czLoopback // + ); + } + } + + // + mBar.Clean(); + } + } + + // + // Virtuals ... + + /** + * Set Default Properties Values ... + */ + virtual void Default() + { + } + + // + protected: + // + + // + private: + // + // Props ... + string mSymbol; + ENUM_TIMEFRAMES mPeriod; + + // + // CArrayObj mConsolidationObjects; + XConsolidationZone mActiveConsolidationZone; + XConsolidationZone mConsolidationZones[]; + + // + // Actions ... + + /** + * Release All Resources ... + */ + void DeInit() + { + // + ZeroMemory(mX121Helper); + ZeroMemory(mPOIDetector); + ZeroMemory(mBarAnalyser); + + // + delete mX121Helper; + delete mPOIDetector; + delete mBarAnalyser; + + // + Clean(mConsolidationZones); + mActiveConsolidationZone.Clean(); + } + + /** + * Apply Chart Style ... + */ + void ApplyChartStyle() + { + // + // Retrieve Current Chart ID ... + long chartId = ChartID(); + + // + ENUM_CHART_MODE mMode = CHART_CANDLES; // chart's mMode + bool mShowBidLine = true; // show bid line + bool mShowAskLine = true; // show ask line + bool mShowGrid = false; // show grids on chart + bool mShowVolumes = false; // show volumes + bool mShowTradeLevels = true; // Displaying trade levels in the chart (levels of open positions, Stop Loss, Take Profit and pending orders) + bool mAutoScroll = true; // chart autoscroll + bool mQuickNavigation = true; // chart quick navigation state + color mForeGroundColor = clrWhite; // chart's foreground color + color mBackGroundColor = clrBlack; // chart's background color + color mUpColor = clrGreen; // Up Color + color mDownColor = clrRed; // Down Color + color mBullishColor = clrGreen; // Bullish color + color mBearishColor = clrRed; // Bearish color + color mGridColor = clrGray; // grid color + color mBidLineColor = clrGray; // bid line color + color mAskLineColor = clrRed; // ask line color + color mLineColor = clrLime; // line mMode and doji candlestick color + color mStopColor = clrGold; // Color of stop order levels (Stop Loss and Take Profit) + color mVolumesColor = clrGreen; // volumes color + + // + ChartSetInteger(chartId, CHART_MODE, mMode); + ChartSetInteger(chartId, CHART_SHOW_BID_LINE, mShowBidLine); + ChartSetInteger(chartId, CHART_SHOW_ASK_LINE, mShowAskLine); + ChartSetInteger(chartId, CHART_SHOW_GRID, mShowGrid); + ChartSetInteger(chartId, CHART_SHOW_VOLUMES, mShowVolumes); + ChartSetInteger(chartId, CHART_SHOW_TRADE_LEVELS, mShowTradeLevels); + ChartSetInteger(chartId, CHART_AUTOSCROLL, mAutoScroll); + ChartSetInteger(chartId, CHART_QUICK_NAVIGATION, mQuickNavigation); + ChartSetInteger(chartId, CHART_COLOR_FOREGROUND, mForeGroundColor); + ChartSetInteger(chartId, CHART_COLOR_BACKGROUND, mBackGroundColor); + ChartSetInteger(chartId, CHART_COLOR_CHART_UP, mUpColor); + ChartSetInteger(chartId, CHART_COLOR_CHART_DOWN, mDownColor); + ChartSetInteger(chartId, CHART_COLOR_CANDLE_BULL, mBullishColor); + ChartSetInteger(chartId, CHART_COLOR_CANDLE_BEAR, mBearishColor); + ChartSetInteger(chartId, CHART_COLOR_GRID, mGridColor); + ChartSetInteger(chartId, CHART_COLOR_BID, mBidLineColor); + ChartSetInteger(chartId, CHART_COLOR_ASK, mAskLineColor); + ChartSetInteger(chartId, CHART_COLOR_STOP_LEVEL, mStopColor); + ChartSetInteger(chartId, CHART_COLOR_CHART_LINE, mLineColor); + ChartSetInteger(chartId, CHART_COLOR_VOLUME, mVolumesColor); + } + + // +}; diff --git a/BKPS/14031206/X121SMCEA/Classes/x-121.smc.x-tradehandler.class.ex5 b/BKPS/14031206/X121SMCEA/Classes/x-121.smc.x-tradehandler.class.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..ac48d7e050debf1ff5090beb00f48f9fb01d7d5d GIT binary patch literal 16154 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 XHc5T6BCpnU51TUiK{;bLTkijVx*8ve literal 0 HcmV?d00001 diff --git a/BKPS/14031206/X121SMCEA/Classes/x-121.smc.x-tradehandler.class.mq5 b/BKPS/14031206/X121SMCEA/Classes/x-121.smc.x-tradehandler.class.mq5 new file mode 100644 index 0000000..346a7a0 --- /dev/null +++ b/BKPS/14031206/X121SMCEA/Classes/x-121.smc.x-tradehandler.class.mq5 @@ -0,0 +1,4365 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 Class Library +// -------------------------------------- +// Name: XCX121SMCTradeHandler +// Description: provides all based classes for use ... +// +// +// Maintainer: +// ------------ +// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) +// +////////////////////////////////////////////////////// +// +// Global Properties ... +#property library +#property copyright "Copyright 2023, SaherElm IT Center" +#property link "https://www.saherelm.ir" +#property version "1.00" +#property strict + +// +// Imports ... + +// +#include "../../Classes/x-saherelm.x-alert.class.mq5" +#include "../../Classes/x-saherelm.x-bar.analyser.class.mq5" +#include "../../Classes/x-saherelm.x-trade.class.mq5" +#include "../Libraries/x-121.smc.lib.mq5" + +// +// Definitions ... + +// +// Model a Trade Data ... +struct X121SMCTradeData +{ + // + double ask; // Ask Price on Start Time + double bid; // bid Price on Start Time + ulong ticket; // Position Ticket + double swap; // Swap + double profit; // Profit on Close + XSignal signal; // Signal Object + string message; // Message + datetime endTime; // End Time + datetime startTime; // Start Time + double commission; // Commission + string conditions; // Signal Conditions + double maxDrawdown; // Max Position Drawdown + bool isTargeted; // Check Targetted Before Or Not + double lastTrailedTPLevel; // Hold Last Trailed TP Level + + // + // Constructor ... + X121SMCTradeData() + { + Clean(); + } + + /** + * Initialize Item ... + * + * @param _signal: XSignal instance Reference, Provides Source For Initializaion ... + * + * @return ( bool ) + */ + bool Init(XSignal &_signal) + { + // + bool result = false; + + // + Clean(); + + // + result = _signal.IsValid(); + if (!result) + { + return result; + } + + // + signal = _signal; + + // + result = IsValid(); + + // + return result; + } + + // + // Tools ... + + /** + * Cleaning Up Model ... + */ + void Clean() + { + // + ask = 0; + bid = 0; + swap = 0; + profit = 0; + ticket = 0; + commission = 0; + maxDrawdown = 0; + lastTrailedTPLevel = 0; + + // + endTime = NULL; + message = NULL; + startTime = NULL; + conditions = NULL; + + // + isTargeted = false; + + // + signal.Clean(); + + // + ZeroMemory(this); + } + + /** + * Validate Model ... + * + * @return ( bool ) + */ + bool IsValid() + { + // + bool result = false; + + // + result = + // + signal.IsValid() + // + ; + + // + return result; + } + + /** + * Calculate Model Age ... + * + * @return ( int ) + */ + int GetAge() + { + // + int result = -1; + + // + if (!IsValid()) + { + return result; + } + + // + int startIndex = iBarShift( + GetSymbol(), + GetPeriod(), + startTime, + false // + ); + + // + datetime mEndTime = IsValid(endTime) + ? endTime + : TimeCurrent(); + int endIndex = iBarShift( + GetSymbol(), + GetPeriod(), + mEndTime, + false // + ); + + // + result = MathAbs(startIndex - endIndex); + + // + return result; + } + + // + // Owner Functions ... + + /** + * Check a Ticket is Own to Model or not ... + * + * @param _ticket: ULONG, Position Ticket ... + * + * @return ( bool ) + */ + bool IsOwn( + ulong _ticket // + ) + { + // + bool result = false; + + // + result = IsValid() && + _ticket == ticket; + + // + return result; + } + + /** + * Check Specified Conditions is Own to Model or not ... + * + * @param _symbol: String, Specified Symbol ... + * @param _provider: String, Specified Provider ... + * @param _period: ENUM_TIMEFRAMES member, Specified Signal Period ... + * @param _type: ENUM_X_POSITION_TYPES member, Specified Signal Type ... + * + * @return ( bool ) + */ + bool IsOwnSignalTime( + string _symbol, + string _provider, + ENUM_TIMEFRAMES _period, + ENUM_X_POSITION_TYPES _type, + datetime _time // + ) + { + // + bool result = false; + + // + result = + // + IsValid(_time) && + Time() == _time && + IsValid(_symbol) && + IsValid(_period) && + XType() == _type && + IsValid(_provider) && + GetPeriod() == _period && + GetSymbol() == _symbol && + Provider() == _provider && + XType() != X_POSITION_TYPE_ALL && + XType() != X_POSITION_TYPE_NONE + // + ; + + // + return result; + } + + /** + * Check Specified Conditions is Own to Model or not ... + * + * @param _symbol: String, Specified Symbol ... + * @param _provider: String, Specified Provider ... + * @param _period: ENUM_TIMEFRAMES member, Specified Signal Period ... + * @param _type: ENUM_X_POSITION_TYPES member, Specified Signal Type ... + * + * @return ( bool ) + */ + bool IsOwnStartTime( + string _symbol, + string _provider, + ENUM_TIMEFRAMES _period, + ENUM_X_POSITION_TYPES _type, + datetime _time // + ) + { + // + bool result = false; + + // + result = + // + IsValid(_time) && + IsValid(_symbol) && + IsValid(_period) && + XType() == _type && + IsValid(startTime) && + startTime == _time && + IsValid(_provider) && + GetPeriod() == _period && + GetSymbol() == _symbol && + Provider() == _provider && + XType() != X_POSITION_TYPE_ALL && + XType() != X_POSITION_TYPE_NONE + // + ; + + // + return result; + } + + /** + * Check Specified Signal is Own to Model or not ... + * + * @param _signal: XSignal instance Reference ... + * + * @return ( bool ) + */ + bool IsOwn(XSignal &_signal) + { + // + bool result = false; + + // + result = + // + IsValid() && + _signal.IsValid() && + IsOwnSignalTime( + _signal.symbol, + _signal.provider, + _signal.period, + ToPositionType(_signal.type), + _signal.time) + // + ; + + // + return result; + } + + /** + * Check Specified Position is Own to Model or not ... + * + * @param _position: XPosition instance Reference ... + * + * @return ( bool ) + */ + bool IsOwn(XPosition &_position) + { + // + bool result = false; + + // + result = + // + IsValid() && + _position.IsValid() && + IsOwnStartTime( + _position.symbol, + _position.provider, + _position.period, + ToPositionType(_position.type), + _position.openAt) + // + ; + + // + return result; + } + + /** + * Check Specified Position is Own to Model or not ... + * + * @param _position: XPosition instance Reference ... + * + * @return ( bool ) + */ + bool IsOwnPosition(XPosition &_position) + { + // + bool result = false; + + // + double tp = TP(); + double sl = SL(); + double entry = Entry(); + double volume = Volume(); + string symbol = GetSymbol(); + string provider = Provider(); + ENUM_POSITION_TYPE type = Type(); + ENUM_TIMEFRAMES period = GetPeriod(); + + // + double pVolume = _position.volume; + double pSL = NormalizePrice(_position.sl, _position.symbol); + double pTP = NormalizePrice(_position.tp, _position.symbol); + double pEntry = NormalizePrice(_position.entry, _position.symbol); + + // + result = + // + IsValid() && + (sl == pSL || + tp == pTP) && + entry == pEntry && + pVolume == volume && + _position.IsValid() && + type == _position.type && + symbol == _position.symbol && + period == _position.period && + provider == _position.provider + // + ; + + // + if (!result) + { + // + result = + // + IsValid() && + _position.IsValid() && + _position.ticket == signal.positionId; + } + + // + return result; + } + + /** + * Update Model Data by Providing Specified Signal ... + * + * @param _signal: XSignal instance Reference ... + * + * @return ( bool ) + */ + bool Update(XSignal &_signal) + { + // + bool result = false; + + // + result = + // + IsValid() && + _signal.IsValid() && + IsOwn(_signal) + // + ; + if (!result) + { + return result; + } + + // + signal = _signal; + + // + return result; + } + + /** + * Update Model Data by Providing Specified Position ... + * + * @param _position: XPosition instance Reference ... + * + * @return ( bool ) + */ + bool Update(XPosition &_position) + { + // + bool result = false; + + // + result = + // + IsValid() && + _position.IsValid() && + IsOwn(_position) + // + ; + if (!result) + { + return result; + } + + // + swap = _position.swap; + ticket = _position.ticket; + profit = _position.profit; + message = _position.comment; + startTime = _position.openAt; + + // + // Set Once ... + if (commission == 0 && + _position.commission != 0) + { + commission = _position.commission; + } + + // + // Set Once ... + if (ask == 0) + { + ask = GetAsk(_position.symbol); + } + + // + // Set Once ... + if (bid == 0) + { + bid = GetBid(_position.symbol); + } + + // + if (profit < 0 && profit < maxDrawdown) + { + maxDrawdown = profit; + } + + // + return result; + } + + /** + * Update Model Data by Providing Specified Position ... + * + * @param _position: XPosition instance Reference ... + * + * @return ( bool ) + */ + bool UpdatePosition(XPosition &_position) + { + // + bool result = false; + + // + result = + // + IsValid() && + _position.IsValid() && + IsOwnPosition(_position) + // + ; + if (!result) + { + return result; + } + + // + swap = _position.swap; + ticket = _position.ticket; + profit = _position.profit; + message = _position.comment; + startTime = _position.openAt; + + // + // Set Once ... + if (commission == 0 && + _position.commission != 0) + { + commission = _position.commission; + } + + // + // Set Once ... + if (ask == 0) + { + ask = GetAsk(_position.symbol); + } + + // + // Set Once ... + if (bid == 0) + { + bid = GetBid(_position.symbol); + } + + // + if (profit < 0 && profit < maxDrawdown) + { + maxDrawdown = profit; + } + + // + return result; + } + + // + // Tools Extensions ... + + /** + * Get Model Symbol ... + * + * @return ( string ) + */ + string GetSymbol() + { + return signal.symbol; + } + + /** + * Get Model Period ... + * + * @return ( ENUM_TIMEFRAMES ) + */ + ENUM_TIMEFRAMES GetPeriod() + { + return signal.period; + } + + /** + * Get Model Provider ... + * + * @return ( string ) + */ + string Provider() + { + return signal.provider; + } + + /** + * Get Model Entry ... + * + * @return ( double ) + */ + double Entry() + { + return signal.entry; + } + + /** + * Get Model Stop Loss ... + * + * @return ( double ) + */ + double SL() + { + return signal.sl; + } + + /** + * Get Model Take Profit ... + * + * @return ( double ) + */ + double TP() + { + return signal.tp; + } + + /** + * Get Model Target ... + * + * @return ( double ) + */ + double Target() + { + return signal.target; + } + + /** + * Get Position Spread on Open Time ... + * + * @return ( double ) + */ + double Spread() + { + return MathAbs(ask - bid); + } + + /** + * Get Model Volume ... + * + * @return ( double ) + */ + double Volume() + { + return signal.volume; + } + + /** + * Get Model Point Value ... + * + * @return ( double ) + */ + double Points() + { + return GetPoints(GetSymbol()); + } + + /** + * Get Model Type ... + * + * @return ( ENUM_POSITION_TYPE ) + */ + ENUM_POSITION_TYPE Type() + { + return signal.type; + } + + /** + * Get Model Type ... + * + * @return ( ENUM_X_POSITION_TYPES ) + */ + ENUM_X_POSITION_TYPES XType() + { + // + ENUM_X_POSITION_TYPES result = X_POSITION_TYPE_NONE; + + // + if (!IsValid()) + { + return result; + } + + // + result = + IsLong(Type()) + ? X_POSITION_TYPE_LONG + : X_POSITION_TYPE_SHORT; + + // + return result; + } + + /** + * Get Model Signal Mode ... + * + * @return ( ENUM_X_ORDER_MODES ) + */ + ENUM_X_ORDER_MODES Mode() + { + return signal.mode; + } + + /** + * Get Model Signal Time ... + * + * @return ( datetime ) + */ + datetime Time() + { + return signal.time; + } + + // + // Additional Helpers Extensions ... + + /** + * Get Signal Full TP Level ... + * + * @return ( double ) + */ + double FullTPLevel() + { + return signal.fullTPLevel; + } + + /** + * Check Can Partial Close Position or not ... + * + * @return ( bool ) + */ + bool CanPartialClose() + { + return signal.CanPartialClose(); + } + + /** + * Retrieve Partial Close Volume Multiplier ... + * + * @return ( double ) + */ + double PartialCloseMultiplier() + { + return signal.partialCloseMultiplier; + } + + /** + * Get Partial Close On TP Level ... + * + * @return ( double ) + */ + double PartialCloseOnTPLevel() + { + return signal.partialCloseOnTPLevel; + } + + /** + * Check Can Risk Free Position on Break Even Point or not ... + * + * @return ( bool ) + */ + bool CanRiskFreeOnBreakEvenPoint() + { + return signal.CanRiskFreeOnBreakEvenPoint(); + } + + /** + * Get Minimum Required Profit after Break Even Point for Risk Free ... + * + * @return ( double ) + */ + double TPLevelForBreakEven() + { + return signal.tpLevelForBreakEven; + } + + /** + * Calculate Break Even Point ... + * + * @return ( double ) + */ + double CalculateBreakEvenPoint() + { + // + double result = 0; + + // + bool isValid = + // + ask > 0 && + bid > 0 && + IsValid() && + ticket > 0 && + signal.IsValid() + // + ; + if (!isValid) + { + return result; + } + + // + // Calculate Spread ... + double spread = Spread(); + if (spread <= 0) + { + return result; + } + + // + // Calculate BEP ... + result = + // + spread + (-1 * swap) + MathAbs(commission) + // + ; + + // + return result; + } + + /** + * Check Can Trail Position Stop Loss or not ... + * + * @return ( bool ) + */ + bool CanTrailSL() + { + return signal.CanTrailSL(); + } + + /** + * Get Start Position SL Trailling on TP Level ... + * + * @return ( double ) + */ + double TrailSLStartOnReachTPLevel() + { + return signal.trailSLStartOnReachTPLevel; + } + + // + // Data Collector Extensions ... + + /** + * Get Data Collection File Name ... + * + * @return ( string ) + */ + string GetFileName() + { + // + string result = NULL; + + // + if (!IsValid()) + { + return result; + } + + // + result = + // + GetSymbol() + "\\" + + ToString(XType()) + "\\" + + (profit >= 0 ? "Profit" : "Loss") + "\\" + + ToString(ticket) + "_" + + ToString(GetPeriod()) + "_" + + ToFormatString(startTime) + // + ; + + // + return result; + } + + /** + * Get Signal Collectiong File Name ... + * + * @return ( string ) + */ + string GetSignalFileName() + { + // + string result = NULL; + + // + result = + // + GetSymbol() + "\\" + + ToString(XType()) + "\\" + + Provider() + "_" + + ToFormatString(startTime) + // + ; + + // + return result; + } + + /** + * Converts Model to String Representation ... + * + * @param onlySignals: Boolean, Specified Represent Only Signal or not ... + * + * @return ( string ) + */ + string ToString( + bool onlySignals = false // + ) + { + // + string result = NULL; + + // + int age = GetAge(); + + // + result = + // + (onlySignals ? "" : ToString("Ticket", ticket)) + + ToString("Symbol", GetSymbol()) + + ToString("Period", GetPeriod()) + + ToString("Entry", Entry()) + + ToString("Provider", Provider()) + + ToString("Type", ToString(XType())) + + ToString("Time", startTime) + + // + // Attach Trade Info ... + (onlySignals ? "" : + // + "-------------" + "\n" + + ToString("Volume", Volume()) + + ToString("Profit", profit) + + ToString("Commission", commission) + + ToString("Swap", swap) + + ToString("Max Drawdown", maxDrawdown) + + ToString("End Time", endTime) + + ToString("Age", age) + + ToString("Message", message) + + "" + // + ) + + // + // Attach Conditions to Signals ... + (!onlySignals ? "" : + // + "-------------" + "\n" + + ToString("Pushers", signal.pushers) + + "Conditions:" + "\n" + + "-------------" + "\n" + + conditions + + "" + // + ) + + // + "" + // + ; + + // + return result; + } + + // + // End Of X121SMCTradeData Model ... +}; + +// +// Model Specified Symbol's Positions States ... +struct X121SMCSymbolPositionInfo +{ + // + string symbol; + + // + datetime enableAt; + + // + int longSLs; + int longTPs; + + // + int shortSLs; + int shortTPs; + + // + int countedSLs; + + // + // Constructor ... + X121SMCSymbolPositionInfo() + { + Clean(); + } + + // + // Tools ... + + /** + * Cleanup ... + */ + void Clean() + { + // + longSLs = 0; + longTPs = 0; + + // + shortSLs = 0; + shortTPs = 0; + + // + countedSLs = 0; + + // + enableAt = NULL; + + // + ZeroMemory(this); + } + + /** + * Check is own Symbol Info ... + * + * @param _symbol: String ... + * + * @return ( bool ) + */ + bool IsOwn(string _symbol) + { + // + bool result = false; + + // + result = + // + IsValid(symbol) && + _symbol == symbol + // + ; + + // + return result; + } + + /** + * Check Symbol Trading is Enable or not ... + * + * @param time: DateTime ... + * + * @return ( bool ) + */ + bool IsEnable(datetime time = NULL) + { + // + bool result = false; + + // + time = NormalizeTime(time); + + // + bool isEnableAtValid = IsValid(enableAt); + + // + result = + !isEnableAtValid + ? true + : time > enableAt; + if (result && + isEnableAtValid) + { + Reset(); + } + + // + return result; + } + + /** + * Pause Symbol Trading ... + * + * @param seconds: Integer ... + */ + void Pause(int seconds) + { + // + if (seconds <= 0) + { + return; + } + + // + datetime _enableAt = ((datetime)((int)TimeCurrent() + seconds)); + enableAt = _enableAt; + } + + /** + * Handle Stop Loss ... + * + * @param _type: ENUM_POSITION_TYPE member ... + */ + void HandleSL(ENUM_POSITION_TYPE _type) + { + // + bool isLong = IsLong(_type); + if (isLong) + { + longSLs++; + } + else + { + shortSLs++; + } + + // + countedSLs++; + } + + /** + * Handle Take Profit ... + * + * @param _type: ENUM_POSITION_TYPE member ... + */ + void HandleTP(ENUM_POSITION_TYPE _type) + { + // + bool isLong = IsLong(_type); + if (isLong) + { + longTPs++; + } + else + { + shortTPs++; + } + + // + countedSLs--; + if (countedSLs < 0) + { + countedSLs = 0; + } + } + + /** + * Reset Counter ... + */ + void Reset() + { + // + countedSLs = 0; + enableAt = NULL; + } + + // + // End of X121SMCSymbolPositionInfo Model ... +}; + +// +// Implementations ... + +// +// a Class For Read and Write Trade Info Data in Files ... +class X121SMCTradeCollector +{ + // + // Public ... + public: + // + // Props ... + + // + // Constructor(s) ... + X121SMCTradeCollector( + string _path = NULL // Base Path + ) + { + // + mAccount = new XCAccount(); + + // + if (IsValid(_path)) + { + mPath = _path; + } + else + { + mPath = "X121SMCTradeData" + "\\" + mAccount.GetCompany(); + } + } + + // + // Deconstructor ... + ~X121SMCTradeCollector() + { + } + + /** + * Check Specified Model is Exists or not ... + * + * @param item: X121SMCTradeData instance Reference, Provides Source Model ... + * + * @return ( bool ) + */ + bool IsExists(X121SMCTradeData &item) + { + // + bool result = false; + + // + int mHandler = GetFileHandlerForRead(item); + result = mHandler != INVALID_HANDLE; + FileClose(mHandler); + + // + return result; + } + + /** + * Save Specified Model as Data ... + * + * @param item: X121SMCTradeData instance Reference, Provides Source Model ... + * + * @return ( bool ) + */ + bool Save(X121SMCTradeData &item) + { + // + bool result = false; + + // + // Check info is Valid ... + result = item.IsValid(); + if (!result) + { + return result; + } + + // + string content = item.ToString(); + content += "\n" + "-----------" + "\n" + "Signal: " + "\n" + "-----------" + "\n" + item.ToString(true); + + // + result = IsValid(content); + if (!result) + { + return result; + } + + // + int mHandler = GetFileHandlerForWrite(item); + result = mHandler != INVALID_HANDLE; + if (!result) + { + return result; + } + + // + FileWrite(mHandler, content); + FileFlush(mHandler); + FileClose(mHandler); + + // + return result; + } + + /** + * Save Specified Model as Signal ... + * + * @param item: X121SMCTradeData instance Reference, Provides Source Model ... + * + * @return ( bool ) + */ + bool SaveSignal(X121SMCTradeData &item) + { + // + bool result = false; + + // + string content = item.ToString(true); + result = IsValid(content); + if (!result) + { + return result; + } + + // + int mHandler = GetSignalFileHandlerForWrite(item); + result = mHandler != INVALID_HANDLE; + if (!result) + { + return result; + } + + // + FileWrite(mHandler, content); + FileFlush(mHandler); + FileClose(mHandler); + + // + return result; + } + + /** + * Save Specified Model Conditions ... + * Conditions only save for Loss Signals ... + * this means the profit must be Lower than Zero ... + * ans also message Contains SL ... + * + * @param item: X121SMCTradeData instance Reference, Provides Source Model ... + * + * @return ( bool ) + */ + bool SaveConditions(X121SMCTradeData &item) + { + // + bool result = false; + + // + // Validate Item ... + result = + // + item.profit < 0 && + Contains("SL", item.message) + // + ; + if (!result) + { + return result; + } + + // + string content = item.signal.conditions; + result = IsValid(content); + if (!result) + { + return result; + } + + // + int mHandler = GetConditionsFileHandlerForWrite(item); + result = mHandler != INVALID_HANDLE; + if (!result) + { + return result; + } + + // + FileSeek(mHandler, 0, SEEK_END); + FileWrite(mHandler, content); + FileFlush(mHandler); + FileClose(mHandler); + + // + return result; + } + + // + // Protected ... + protected: + // + // Private ... + private: + // + // Props ... + + // + string mPath; // Base Path ... + + // + XCAccount *mAccount; + + // + string GetFilePath(X121SMCTradeData &item) + { + // + string fileName = item.GetFileName(); + + // + return GetFilePath(fileName); + } + string GetFilePath(string fileName) + { + // + string result = ""; + + // + result = + // + mPath + "\\" + "Trades" + "\\" + fileName + ".x121.log" + // + ; + + // + return result; + } + + // + string GetSignalFilePath(X121SMCTradeData &item) + { + // + string fileName = item.GetSignalFileName(); + + // + return GetSignalFilePath(fileName); + } + string GetSignalFilePath(string fileName) + { + // + string result = ""; + + // + result = + // + mPath + "\\" + "Signals" + "\\" + fileName + ".x121.log" + // + ; + + // + return result; + } + + // + string GetConditionsFilePath(X121SMCTradeData &item) + { + // + bool isLong = IsLong(item.Type()); + + // + string fileName = + item.GetSymbol() + "\\" + + (isLong ? "Longs" : "Shorts"); + + // + return GetConditionsFilePath(fileName); + } + string GetConditionsFilePath(string fileName) + { + // + string result = ""; + + // + result = + // + mPath + "\\" + "Conditions" + "\\" + fileName + ".x121.log" + // + ; + + // + return result; + } + + // + int GetFileHandlerForRead(X121SMCTradeData &item) + { + // + int result = INVALID_HANDLE; + + // + string filePath = GetFilePath(item); + if (!IsValid(filePath)) + { + return result; + } + + // + result = FileOpen( + filePath, + FILE_READ | FILE_TXT // + ); + + // + return result; + } + int GetFileHandlerForWrite(X121SMCTradeData &item) + { + // + int result = INVALID_HANDLE; + + // + string filePath = GetFilePath(item); + if (!IsValid(filePath)) + { + return result; + } + + // + result = FileOpen( + filePath, + FILE_READ | FILE_WRITE | FILE_TXT // + ); + + // + return result; + } + + // + int GetSignalFileHandlerForRead(X121SMCTradeData &item) + { + // + int result = INVALID_HANDLE; + + // + string filePath = GetSignalFilePath(item); + if (!IsValid(filePath)) + { + return result; + } + + // + result = FileOpen( + filePath, + FILE_READ | FILE_TXT // + ); + + // + return result; + } + int GetSignalFileHandlerForWrite(X121SMCTradeData &item) + { + // + int result = INVALID_HANDLE; + + // + string filePath = GetSignalFilePath(item); + if (!IsValid(filePath)) + { + return result; + } + + // + result = FileOpen( + filePath, + FILE_READ | FILE_WRITE | FILE_TXT // + ); + + // + return result; + } + + // + int GetConditionsFileHandlerForRead(X121SMCTradeData &item) + { + // + int result = INVALID_HANDLE; + + // + string filePath = GetConditionsFilePath(item); + if (!IsValid(filePath)) + { + return result; + } + + // + result = FileOpen( + filePath, + FILE_READ | FILE_TXT // + ); + + // + return result; + } + int GetConditionsFileHandlerForWrite(X121SMCTradeData &item) + { + // + int result = INVALID_HANDLE; + + // + string filePath = GetConditionsFilePath(item); + if (!IsValid(filePath)) + { + return result; + } + + // + result = FileOpen( + filePath, + FILE_READ | FILE_WRITE | FILE_TXT // + ); + + // + return result; + } + + // + // End of X121SMCTradeCollector Class ... +}; + +// +// Trade Handler Class ... +// a Class For Handling All Trade Requirements ... +class XC121SMCTradeHandler : public XCBaseAlert +{ + // + // Public ... + public: + // + + // + // Constructor(s) ... + XC121SMCTradeHandler(XCTrade *trader) + { + // + mTrader = trader; + mAdditionalVolume = 0; + mCollector = new X121SMCTradeCollector(); + } + + // + // Deconstructor ... + ~XC121SMCTradeHandler() + { + // + Clean(mData); + Clean(mSymbolInfos); + Clean(mLastExecutedSignals); + + // + delete mTrader; + delete mCollector; + } + + // + // ReadOnly Props ... + + /** + * Get Max Same Time Trades ... + * + * @return ( double ) + */ + double GetMaxSameTimeTrades() + { + return maxSameTimeTrades; + } + + /** + * Get Max Drawdown Happens ... + * + * @return ( double ) + */ + double GetMaxDrawdown() + { + return maxDrawdown; + } + + /** + * Get Currently Drawdown of Account ... + * + * @return ( double ) + */ + double GetCurrentDrawdown() + { + return currentDrawdown; + } + + /** + * Get Account Current Drawdown Percent ... + * + * @return ( double ) + */ + double GetDrawdownPercent() + { + return drawdownPercent; + } + + // + // Properties Getter(s) / Setter(s) ... + + // + // Saving Properties ... + + /** + * Get Save Signals State ... + * + * @return ( bool ) + */ + bool SaveSignals() + { + return mSaveSignals; + } + + /** + * Set Save Signals State ... + * + * @param value: Boolean ... + */ + void SaveSignals(bool value) + { + mSaveSignals = value; + } + + /** + * Get Save Trades State ... + * + * @return ( bool ) + */ + bool SaveTrades() + { + return mSaveTrades; + } + + /** + * Set Save Trades State ... + * + * @param value: Boolean ... + */ + void SaveTrades(bool value) + { + mSaveTrades = value; + } + + /** + * Get Save Conditions State ... + * + * @return ( bool ) + */ + bool SaveConditions() + { + return mSaveConditions; + } + + /** + * Set Save Conditions State ... + * + * @param value: Boolean ... + */ + void SaveConditions(bool value) + { + mSaveConditions = value; + } + + // + // Signalling Props ... + + /** + * Get Allow Long Signals State ... + * + * @return ( bool ) + */ + bool AllowLong() + { + return mAllowLong; + } + + /** + * Set Allow Long Signals State ... + * + * @param value: Boolean ... + */ + void AllowLong(bool value) + { + mAllowLong = value; + } + + /** + * Get Allow Short Signals State ... + * + * @return ( bool ) + */ + bool AllowShort() + { + return mAllowShort; + } + + /** + * Set Allow Short Signals State ... + * + * @param value: Boolean ... + */ + void AllowShort(bool value) + { + mAllowShort = value; + } + + /** + * Get Max Allowed Long Signals ... + * 0 => Unlimited ... + * + * @return ( int ) + */ + int MaxAllowedLongs() + { + return mMaxAllowedLongs; + } + + /** + * Set Max Allowed Long Signals ... + * + * @param value: Integer ... + * 0 => Unlimited ... + */ + void MaxAllowedLongs(int value) + { + // + if (value < 0) + { + value = 0; + } + + // + mMaxAllowedLongs = value; + } + + /** + * Get Max Allowed Short Signals ... + * 0 => Unlimited ... + * + * @return ( int ) + */ + int MaxAllowedShorts() + { + return mMaxAllowedShorts; + } + + /** + * Set Max Allowed Short Signals ... + * + * @param value: Integer ... + * 0 => Unlimited ... + */ + void MaxAllowedShorts(int value) + { + // + if (value < 0) + { + value = 0; + } + + // + mMaxAllowedShorts = value; + } + + /** + * Get Use Max Allowed Signal Types Per Symbol State ... + * + * @return ( bool ) + */ + bool UseMaxAllowedSignalsPerSymbol() + { + return mUseMaxAllowedSignalsPerSymbol; + } + + /** + * Set Use Max Allowed Signal Types Per Symbol State ... + * + * @param value: Boolean ... + */ + void UseMaxAllowedSignalsPerSymbol(bool value) + { + mUseMaxAllowedSignalsPerSymbol = false; + } + + /** + * Get Last Position Profit In Points for Accept new Signal ... + * 0 => Accept All ... + * + * @return ( double ) + */ + double LastPositionProfitForAcceptNextInPoint() + { + return mLastPositionProfitForAcceptNextInPoint; + } + + /** + * Set Last Position Profit In Points for Accept new Signal ... + * + * @param value: Double ... + * 0 => Accept All ... + */ + void LastPositionProfitForAcceptNextInPoint(double value) + { + // + if (value < 0) + { + value = 0; + } + + // + mLastPositionProfitForAcceptNextInPoint = value; + } + + /** + * Get Delay between two Signals in Bars ... + * 0 => Accept All ... + * + * @return ( int ) + */ + int DelaysBetweenTwoSignalsInBar() + { + return mDelaysBetweenTwoSignalsInBar; + } + + /** + * Set Delay between two Signals in Bars ... + * + * @param value: Integer ... + * 0 => Accept All ... + */ + void DelaysBetweenTwoSignalsInBar(int value) + { + // + if (value < 0) + { + value = 0; + } + + // + mDelaysBetweenTwoSignalsInBar = value; + } + + /** + * Get Max Allowed Spread for Signalling ... + * 0 => Accept All ... + * + * @return ( double ) + */ + double MaxAllowedSpread() + { + return mMaxAllowedSpread; + } + + /** + * Set Max Allowed Spread for Signalling ... + * + * @param value: Double ... + * 0 => Accept All ... + */ + void MaxAllowedSpread(double value) + { + // + if (value < 0) + { + value = 0; + } + + // + mMaxAllowedSpread = value; + } + + /** + * Get Additional Signal Volume ... + * + * @return ( double ) + */ + double AdditionalVolume() + { + return mAdditionalVolume; + } + + /** + * Set Additional Signal Volume ... + * + * @param value: Double ... + * min = 0.01 + */ + void AdditionalVolume(double value) + { + // + if (value < 0) + { + value = 0; + } + + // + if (value > 0 && value < 0.01) + { + value = 0.01; + } + + // + mAdditionalVolume = value; + } + + // + // Risk Management Props ... + + /** + * Get Max Allowed Drawdown Percent for Open Trades ... + * 0 => Ignore ... + * min => 0 ... + * max => 100 ... + * + * @return ( double ) + */ + double MaxAllowedDrawdownToOpenTrades() + { + return mMaxAllowedDrawdownToOpenTrades; + } + + /** + * Set Max Allowed Drawdown Percent for Open Trades ... + * + * @param value: Double ... + * 0 => Ignore ... + * min => 0 ... + * max => 100 ... + */ + void MaxAllowedDrawdownToOpenTrades(double value) + { + // + if (value < 0) + { + value = 0; + } + + // + if (value > 50) + { + value = 50; + } + + // + mMaxAllowedDrawdownToOpenTrades = value; + } + + /** + * Get Max Allowed SL for Pause Signalling Per Symbol ... + * 0 => Unlimited ... + * + * @return ( int ) + */ + int MaxAllowedSLToPauseSignallingPerSymbol() + { + return mMaxAllowedSLToPauseSignallingPerSymbol; + } + + /** + * Set Max Allowed SL for Pause Signalling Per Symbol ... + * + * @param value: Integer ... + * 0 => Unlimited ... + */ + void MaxAllowedSLToPauseSignallingPerSymbol(int value) + { + // + if (value < 0) + { + value = 0; + } + + // + mMaxAllowedSLToPauseSignallingPerSymbol = value; + } + + /** + * Get Pause Signalling Per Symbol afte Max Allowed SL Reached In Seconds ... + * 0 => Ignore ... + * + * @return ( int ) + */ + int PauseSignallingAfterReachesMaxAllowedSLInSecconds() + { + return mPauseSignallingAfterReachesMaxAllowedSLInSecconds; + } + + /** + * Set Pause Signalling Per Symbol afte Max Allowed SL Reached In Seconds ... + * + * @param value: Integer ... + * 0 => Ignore ... + */ + void PauseSignallingAfterReachesMaxAllowedSLInSecconds(int value) + { + // + if (value < 0) + { + value = 0; + } + + // + mPauseSignallingAfterReachesMaxAllowedSLInSecconds = value; + } + + // + // Protection Props ... + + /** + * Get Allow Hedge Positions State ... + * + * @return ( bool ) + */ + bool AllowHedging() + { + return mAllowHedging; + } + + /** + * Set Allow Hedge Positions State ... + * + * @param value: Boolean ... + */ + void AllowHedging(bool value) + { + mAllowHedging = value; + } + + /** + * Get Minimum Open Positions for Hedging ... + * 0 => Ignore ... + * + * @return ( int ) + */ + int MinOpenTradesFroHedging() + { + return mMinOpenTradesFroHedging; + } + + /** + * Set Minimum Open Positions for Hedging ... + * + * @param value: Integer ... + * 0 => Ignore ... + */ + void MinOpenTradesFroHedging(int value) + { + // + if (value < 0) + { + value = 0; + } + + // + mMinOpenTradesFroHedging = value; + } + + /** + * Get Minimum Volume Step for Hedging ... + * 0 => Ignore ... + * + * @return ( double ) + */ + double HedgingMinVolumeStep() + { + return mHedgingMinVolumeStep; + } + + /** + * Set Minimum Volume Step for Hedging ... + * + * @param value: Double ... + * 0 => Ignore ... + */ + void HedgingMinVolumeStep(double value) + { + // + if (value < 0) + { + value = 0; + } + + // + if (value > 0 && value < 0.01) + { + value = 0.01; + } + + // + if (value > 0 && value > 0.1) + { + value = 0.1; + } + + // + mHedgingMinVolumeStep = value; + } + + /** + * Get Minimum Required Profit Per Volume Step for Hedging ... + * 0 => Ignore ... + * + * @return ( double ) + */ + double HedgeingMinRequiredProfitPerVolumeStep() + { + return mHedgeingMinRequiredProfitPerVolumeStep; + } + + /** + * Set Minimum Required Profit Per Volume Step for Hedging ... + * + * @param value: Double ... + * 0 => Ignore ... + */ + void HedgeingMinRequiredProfitPerVolumeStep(double value) + { + // + if (value < 0) + { + value = 0; + } + + // + mHedgeingMinRequiredProfitPerVolumeStep = value; + } + + // + // Actions ... + + // + // Data Collection Actions ... + + /** + * Add Executed Signal Data Model to Trade Datas ... + * + * @param signal: XSignal instance Reference, Issued Signal ... + */ + void Add(XSignal &signal) + { + // + // Check Signal is Valid and also not Exists + // in Datas ... + int idx = -1; + bool hasItem = HasItem( + signal, + idx // + ); + if (hasItem) + { + return; + } + + // + // Initialize Data Item and Add it to Collection of Datas + // if Everythings OK ... + X121SMCTradeData data; + bool isInited = data.Init(signal); + if (isInited) + { + // + Add(data); + SaveSignal(data); + } + } + + /** + * Update a Registered Data Model by Providing Specified Signal ... + * usually used When a signal Modified after Executed for Conditionally Signals ... + * + * @param signal: XSignal instance Reference, Issued Signal ... + */ + void Update(XSignal &signal) + { + // + // Validate Signal ... + if (!signal.IsValid()) + { + return; + } + + // + // Check Signal Registered Before ... + int idx = -1; + bool hasItem = HasItem( + signal, + idx // + ); + bool isUpdated = false; + if (!hasItem) + { + // + // Add New Item if not Exists ... + Add(signal); + isUpdated = true; + } + else + { + // + // Update Data Model in Datas Collection ... + isUpdated = mData[idx].Update(signal); + } + + // + if (isUpdated) + { + SaveSignal(mData[idx]); + } + } + + /** + * Update a Registered Data Model by Providing Specified Position ... + * used for Updating Positions Data or When a Conditional Order Executed as Position ... + * + * @param position: XPosition instance Referece ... + */ + void Update(XPosition &position) + { + // + // Validate Position ... + if (!position.IsValid()) + { + return; + } + + // + // Check Position Registered Before ... + int idx = -1; + bool hasItem = HasItem( + position, + idx // + ); + if (!hasItem) + { + return; + } + + // + // Update Data Model in Datas Collection ... + mData[idx].Update(position); + } + + /** + * Remove Specified Registered Signal from Data Collection ... + * + * @param signal: XSignal instance Reference ... + */ + void Remove(XSignal &signal) + { + // + // Validate Signal ... + if (!signal.IsValid()) + { + return; + } + + // + // Check Signal is Registered or not ... + int idx = -1; + bool hasItem = HasItem( + signal, + idx // + ); + if (!hasItem) + { + return; + } + + // + // Remove Data From Collection ... + ArrayRemove( + mData, + idx, + 1 // + ); + } + + /** + * Handle Position Execution Finished by Providing a Deal ... + * usually used when a Position TP/SL Triggered ... + * + * @param deal: XDeal instance Reference ... + */ + void Finish(const XDeal &deal) + { + // + // Validate Deal ... + // Check Specified Data Registered or not ... + int idx = -1; + bool hasItem = HasItem( + deal.positionId, + idx // + ); + if (!hasItem) + { + return; + } + + // + // Update Data Info ... + mData[idx].swap = deal.swap; + mData[idx].endTime = deal.time; + mData[idx].profit = deal.profit; + + // + // Check Deal Reason ... + bool isTP = deal.reason == DEAL_REASON_TP || + (deal.reason == DEAL_REASON_SL && deal.profit > 0); + bool isSL = deal.reason == DEAL_REASON_SL && deal.profit < 0; + + // + // Prepare Specified Message Based on Deal Reason ... + mData[idx].message = + isTP + ? "TP" + : isSL + ? "SL" + : ""; + + // + // Handle Symbol Positions TP or SL Actions ... + if (isTP || isSL) + { + // + // Check Symbol Position Info Model Exists ... + int symbolIDX = -1; + bool hasInfo = HasSymbol( + mData[idx].GetSymbol(), + symbolIDX // + ); + + // + // Try to Update or Add Symbol Position Info ... + X121SMCSymbolPositionInfo info; + if (!hasInfo) + { + // + // Add New One ... + info.symbol = mData[idx].GetSymbol(); + } + else + { + // + // Update Exists ... + info = mSymbolInfos[symbolIDX]; + + // + // Remove Exists ... + ArrayRemove( + mSymbolInfos, + symbolIDX, + 1 // + ); + } + + // + ENUM_POSITION_TYPE xType = IsLong(mData[idx].Type()) + ? POSITION_TYPE_BUY + : POSITION_TYPE_SELL; + + // + // Call Propper TP / SL Handlers on Symbol Position Info Model ... + if (isTP) + { + info.HandleTP(xType); + } + else if (isSL) + { + info.HandleSL(xType); + } + + // + // Add Model to Symbol Positions Collection ... + AddRef( + info, + mSymbolInfos // + ); + + // + // Try to Check Symbol Positions Info Collection for Pause Specified Symbol ... + HandlePauseSymbol(mData[idx].GetSymbol()); + } + + // + // Save Collector Calss Data Model ... + Save(idx); + } + + /** + * Handle Position Execution Finished by Providing some Data ... + * usually used when a Position Force Closed Triggered ... + * + * @param ticket: ULong, Position ticket ... + * @param position: XPosition instance Reference ... + * @param comment: String, Force Closing Comment ... + */ + void Finish( + const ulong ticket, + const XPosition &position, + const string comment // + ) + { + // + // Validate and Check Data Registered or not ... + int idx = -1; + bool hasItem = HasItem( + ticket, + idx // + ); + if (!hasItem) + { + return; + } + + // + // Update Data Info ... + mData[idx].swap = position.swap; + mData[idx].endTime = TimeCurrent(); + mData[idx].profit = position.profit; + + // + mData[idx].message = comment; + + // + // Handle Force Closes as TP/SL for Updating + // Symbol Info Positions ... + bool handleForceClose = true; + if (handleForceClose) + { + // + // Simulate TP/SL based on Closing Profit ... + bool isTP = position.profit > 0; + bool isSL = position.profit <= 0; + + // + if (isTP || isSL) + { + // + // Check Symbol Position Info Model Exists ... + int symbolIDX = -1; + bool hasInfo = HasSymbol( + mData[idx].GetSymbol(), + symbolIDX // + ); + + // + // Try to Update or Add Symbol Position Info ... + X121SMCSymbolPositionInfo info; + if (!hasInfo) + { + // + // Add New One ... + info.symbol = mData[idx].GetSymbol(); + } + else + { + // + // Update Exists ... + info = mSymbolInfos[symbolIDX]; + + // + // Remove Exists ... + ArrayRemove( + mSymbolInfos, + symbolIDX, + 1 // + ); + } + + // + ENUM_POSITION_TYPE xType = IsLong(mData[idx].Type()) + ? POSITION_TYPE_BUY + : POSITION_TYPE_SELL; + + // + // Call Propper TP / SL Handlers on Symbol Position Info Model ... + if (isTP) + { + info.HandleTP(xType); + } + else if (isSL) + { + info.HandleSL(xType); + } + + // + // Add Model to Symbol Positions Collection ... + AddRef( + info, + mSymbolInfos // + ); + + // + // Try to Check Symbol Positions Info Collection for Pause Specified Symbol ... + HandlePauseSymbol(mData[idx].GetSymbol()); + } + + // + // Save Collector Calss Data Model ... + Save(idx); + } + } + + /** + * Update New Open Positions Data on Collection ... + */ + void HandleNewPosition() + { + // + // Retrieve Last Open Position ... + ulong lastOpenPositionTicket = mTrader.GetLastOpenPositionTicket(); + if (lastOpenPositionTicket == 0) + { + return; + } + + // + XPosition position; + bool hasPosition = mTrader.GetPosition( + lastOpenPositionTicket, + position // + ); + if (!hasPosition) + { + return; + } + + // + // Calculate Position Commission ... + double commission = mTrader.GetPositionCommission(position.ticket); + position.commission = commission; + + // + // Apply Updates on Data Collection ... + int idx = -1; + bool hasItem = HasItemByPosition( + position, + idx // + ); + if (!hasItem) + { + return; + } + + // + mData[idx].UpdatePosition(position); + } + + // + // Symbol Position Info Actions ... + + /** + * Retrieve Specified Symbols Info ... + * + * @param symbol: String ... + * @param info: X121SMCSymbolPositionInfo instance ... + * + * @return ( bool ) + */ + bool GetSymbolInfo( + string symbol, + X121SMCSymbolPositionInfo &info // + ) + { + // + bool result = false; + + // + info.Clean(); + + // + int symbolIDX = -1; + result = HasSymbol( + symbol, + symbolIDX // + ); + if (!result) + { + return result; + } + + // + info = mSymbolInfos[symbolIDX]; + + // + return result; + } + + /** + * Pause Specified Symbol Trading ... + * + * @param symbol: String ... + */ + void HandlePauseSymbol(string symbol) + { + // + if (!IsValid(symbol)) + { + return; + } + + // + int idx = -1; + bool hasItem = HasSymbol( + symbol, + idx // + ); + if (!hasItem) + { + return; + } + + // + int maxAllowedSLToPause = MaxAllowedSLToPauseSignallingPerSymbol(); + int pauseDelay = PauseSignallingAfterReachesMaxAllowedSLInSecconds(); + if (maxAllowedSLToPause <= 0 || pauseDelay <= 0) + { + return; + } + + // + bool canPauseSymbol = + mSymbolInfos[idx].IsEnable() && + mSymbolInfos[idx].countedSLs >= maxAllowedSLToPause; + if (!canPauseSymbol) + { + return; + } + + // + mSymbolInfos[idx].Pause(pauseDelay); + + // + string message = "Pause (" + symbol + ") until: (" + ToString(mSymbolInfos[idx].enableAt) + ") ..."; + Alert(message); + + // + } + + /** + * Reset Specified Symbol Info ... + * + * @param symbol: String ... + */ + void ResetSymbolInfo(string symbol) + { + // + if (!IsValid(symbol)) + { + return; + } + + // + int symbolIDX = -1; + bool hasSymbol = HasSymbol( + symbol, + symbolIDX // + ); + if (!hasSymbol) + { + return; + } + + // + mSymbolInfos[symbolIDX].Reset(); + + // + string message = "Reset " + symbol + ", Pause State ..."; + Alert(message); + } + + /** + * Reset All Paused Symbols ... + */ + void ResumePausedSymbols() + { + // + int count = ArraySize(mSymbolInfos); + if (!IsValidSize(count)) + { + return; + } + + // + for (int i = 0; i < count; i++) + { + // + mSymbolInfos[i].Reset(); + } + + // + string message = "Force Resume Paused Symbols ..."; + Alert(message); + } + + // + // Signal Execution Actions ... + + /** + * Validate Signal For Execution ... + * + * @param signal: XSignal instance Reference ... + * @param state: ENUM_X_SIGNAL_EXECUTION_RESULT Reference for olding Signal Execution Result Reason ... + * + * @return ( bool ) + */ + bool CanExecute( + XSignal &signal, + ENUM_X_SIGNAL_EXECUTION_RESULT &state // Execution State + ) + { + // + bool result = false; + + // + state = X_SIGNAL_EXECUTION_UNKNOWN; + + // + // Validate Signal ... + result = signal.IsValid(); + if (!result) + { + // + state = X_SIGNAL_EXECUTION_FAILED_INVALID_PARAMS; + return result; + } + + // + int symbolIDX = -1; + bool hasSymbolInfo = HasSymbol( + signal.symbol, + symbolIDX // + ); + + // + // Check rading Not Paused ... + result = + !hasSymbolInfo || + mSymbolInfos[symbolIDX].IsEnable(); + if (!result) + { + // + state = X_SIGNAL_EXECUTION_FAILED_NOT_ALLOWED; + return result; + } + + // + bool isLong = IsLong(signal.type); + + // + // Chekc Signalling Enable or not ... + result = + isLong + ? mAllowLong + : mAllowShort; + if (!result) + { + // + state = X_SIGNAL_EXECUTION_FAILED_NOT_ALLOWED; + return result; + } + + // + // Check Signal is Support or not ... + bool isSupport = IsSupport(signal.comment); + result = !isSupport; + if (!result) + { + // + state = X_SIGNAL_EXECUTION_FAILED_NOT_ALLOWED; + return result; + } + + // + ENUM_X_POSITION_TYPES pType = ToPositionType(signal.type); + double requiredProfitForAcceptNext = LastPositionProfitForAcceptNextInPoint(); + + // + // Implement Same Signal Conditions ... + XPosition smaeSymbolPositions[]; + int sameSymbolPositionsCount = mTrader.GetPositions( + smaeSymbolPositions, + signal.symbol, + signal.provider, + signal.period, + pType, + true, // Filter By Magic ... + true // Force Clean ... + ); + XPosition youngestSame; + int youngestSameAge = GetYoungest( + youngestSame, + smaeSymbolPositions // + ); + + // + double youngestSameProfitInPoint = youngestSame.GetProfitInPoint(); + + // + result = + sameSymbolPositionsCount == 0 || + (sameSymbolPositionsCount <= 0 + ? true + : requiredProfitForAcceptNext <= 0 + ? true + : youngestSameAge >= 0 && + youngestSameProfitInPoint >= requiredProfitForAcceptNext); + if (!result) + { + // + state = X_SIGNAL_EXECUTION_FAILED_PREV_PROFIT_ERROR; + return result; + } + + // + // Retrieve Longs and Shorts ... + XPosition longs[]; + XPosition shorts[]; + bool useMaxAllowedPositionsPerSymbol = UseMaxAllowedSignalsPerSymbol(); + + // + // Retrieve Positions ... + if (useMaxAllowedPositionsPerSymbol) + { + // + mTrader.GetPositions( + longs, + shorts, + signal.symbol, + signal.provider // + ); + } + else + { + // + mTrader.GetPositions( + longs, + shorts, + NULL, // All Symbols ... + signal.provider // + ); + } + + // + // Counting ... + int longsCount = ArraySize(longs); + int shortsCount = ArraySize(shorts); + + // + int maxAllowedLongs = MaxAllowedLongs(); + int maxAllowedShorts = MaxAllowedShorts(); + + // + // Check Max Allowed Positions ... + if (maxAllowedLongs > 0 || + maxAllowedShorts > 0) + { + // + if (isLong && maxAllowedLongs > 0 && longsCount > 0) + { + result = longsCount < maxAllowedLongs; + } + else if (!isLong && maxAllowedShorts > 0 && shortsCount > 0) + { + result = shortsCount < maxAllowedShorts; + } + if (!result) + { + // + state = X_SIGNAL_EXECUTION_FAILED_MAX_REACHED; + return result; + } + } + + // + // Check Delays Bar if Provided ... + int delaysBarBetweenTwoSignal = DelaysBetweenTwoSignalsInBar(); + if (delaysBarBetweenTwoSignal > 0) + { + // + // Try To Detect Youngest Position ... + int youngestAge = 0; + XPosition youngestPosition; + + // + // Long Positions when there are Longs ... + if (isLong && longsCount > 0) + { + // + youngestAge = GetYoungest( + youngestPosition, + longs // + ); + } + // + // Short Positions when there are Shorts ... + else if (!isLong && shortsCount > 0) + { + // + youngestAge = GetYoungest( + youngestPosition, + shorts // + ); + } + + // + // Check Delays When Youngest Position Exists ... + if (youngestAge > 0 && youngestPosition.IsValid()) + { + // + result = youngestAge >= delaysBarBetweenTwoSignal; + if (!result) + { + // + state = X_SIGNAL_EXECUTION_FAILED_DELAY_NOT_PASSED; + return result; + } + } + + // + // Check Delays When Youngest Position is not Exists ... + if (!youngestPosition.IsValid()) + { + // + // Try to Detect Last Issued Signal in Model Collections ... + int symbolIDX = FindLastExecutedSignalItem(signal); + if (IsValidIndex(symbolIDX)) + { + // + // Calculate Requirements ... + datetime cTime = TimeCurrent(); + int signalPeriodSeconds = PeriodSeconds(signal.period); + datetime lastExecutedTime = mLastExecutedSignals[symbolIDX].time; + datetime passedTime = ((datetime)lastExecutedTime + + ((delaysBarBetweenTwoSignal * signalPeriodSeconds))); + + // + // Check Conditions ... + result = cTime >= passedTime; + if (!result) + { + // + state = X_SIGNAL_EXECUTION_FAILED_DELAY_NOT_PASSED; + return result; + } + } + } + } + + // + // Check Max Drawdown Percent for Open Trades ... + double maxAllowedDrawdownPercent = MaxAllowedDrawdownToOpenTrades(); + if (maxAllowedDrawdownPercent > 0) + { + // + // Calculate and Update Drawdown Percent ... + double cdPercent = CalculateMaxDrawdownPercent(); + + // + result = cdPercent < maxAllowedDrawdownPercent; + if (!result) + { + // + state = X_SIGNAL_EXECUTION_FAILED_NO_EQUITY; + return result; + } + } + + // + // Check Spread ... + double spread = GetSpread(signal.symbol); + double maxAllowedSpread = MaxAllowedSpread(); + if (maxAllowedSpread > 0) + { + // + result = spread <= maxAllowedSpread; + if (!result) + { + // + state = X_SIGNAL_EXECUTION_FAILED_SPREAD; + return result; + } + } + + // + return result; + } + + /** + * Execute Specific Signal using Trade Handler ... + * + * @param signal: XSignal instance Reference ... + * @param state: ENUM_X_SIGNAL_EXECUTION_RESULT Reference for olding Signal Execution Result Reason ... + * @param ignorePolicies: Boolean ... + * + * @return ( bool ) + */ + bool ExecuteSignal( + XSignal &signal, // Signal for Execution + ENUM_X_SIGNAL_EXECUTION_RESULT &state, // Execution State + bool ignorePolicies = false // Ignore Execution Policies + ) + { + // + bool result = false; + + // + // Check Signal Validation ... + result = signal.IsValid(); + if (!result) + { + return result; + } + + // + // Check Policies ... + if (!ignorePolicies) + { + // + // Filter Signals if Necessary ... + result = CanExecute( + signal, + state // + ); + if (!result) + { + // + AlertSignalExecutionFailed( + signal, + state // + ); + + // + return result; + } + } + + // + // Apply Additional Volume to Signal if Provided ... + double additionalVolume = AdditionalVolume(); + if (additionalVolume > 0) + { + signal.volume += mAdditionalVolume; + } + + // + // Execute Signal ... + result = mTrader.ExecuteSignal( + signal, + state // + ); + if (result) + { + // + // Add XTradeHandler Data ... + Add(signal); + + // + // Handle Last Executed Signal ... + HandleSignalExecuted(signal); + + // + // Alert Executed Signal ... + string msg = (signal.type == POSITION_TYPE_BUY ? "Long" : "Short") + + " Signal Provided by: " + signal.provider + + (signal.pushers > 1 ? " Pushers: " + ToString(signal.pushers) : "") + + " on: " + signal.symbol + + " in: " + ToString(signal.period) + + " Executed Successfully ..."; + Alert(msg); + } + + // + if (!result) + { + // + AlertSignalExecutionFailed( + signal, + state // + ); + } + + // + return result; + } + + /** + * Execute Specific Signal using Trade Handler ... + * + * @param signal: XSignal instance Reference ... + * @param state: ENUM_X_SIGNAL_EXECUTION_RESULT Reference for olding Signal Execution Result Reason ... + * @param ignorePolicies: Boolean ... + * + * @return ( bool ) + */ + bool ExecuteSignal( + XSignal &signal, // Signal for Execution + X121SMCStrategyConditions &conditions, // Signal Conditions + ENUM_X_SIGNAL_EXECUTION_RESULT &state, // Execution State + bool ignorePolicies = false // Ignore Execution Policies + ) + { + // + bool result = false; + + // + // Check Signal Validation ... + result = signal.IsValid() && + conditions.IsValid(); + if (!result) + { + return result; + } + + // + // Check Policies ... + if (!ignorePolicies) + { + // + // Filter Signals if Necessary ... + result = CanExecute( + signal, + state // + ); + if (!result) + { + // + AlertSignalExecutionFailed( + signal, + state // + ); + + // + return result; + } + } + + // + // Apply Additional Volume to Signal if Provided ... + double additionalVolume = AdditionalVolume(); + if (additionalVolume > 0) + { + signal.volume += mAdditionalVolume; + } + + // + // Execute Signal ... + result = mTrader.ExecuteSignal( + signal, + state // + ); + if (result) + { + // + // Add XTradeHandler Data ... + Add(signal); + + // + // Handle Last Executed Signal ... + HandleSignalExecuted(signal); + + // + // Alert Executed Signal ... + string msg = (signal.type == POSITION_TYPE_BUY ? "Long" : "Short") + + " Signal Provided by: " + signal.provider + + (signal.pushers > 1 ? " Pushers: " + ToString(signal.pushers) : "") + + " on: " + signal.symbol + + " in: " + ToString(signal.period) + + " Executed Successfully ..."; + Alert(msg); + } + + // + if (!result) + { + // + AlertSignalExecutionFailed( + signal, + state // + ); + } + + // + return result; + } + + /** + * Force Close Specified Positions ... + * + * @param symbol: String ... + * @param provider: String ... + * @param period: ENUM_TIMEFRAMES member ... + * @param type: ENUM_X_POSITION_TYPES member ... + * + * @return ( bool ) + */ + bool ForceClose( + string symbol = NULL, + string provider = NULL, + ENUM_TIMEFRAMES period = NULL, + ENUM_X_POSITION_TYPES type = NULL // + ) + { + // + bool result = false; + + // + XPosition positions[]; + int count = mTrader.GetPositions( + positions, + symbol, + provider, + period, + type // + ); + result = IsValidSize(count); + if (!result) + { + return result; + } + + // + datetime cTime = TimeCurrent(); + + // + string comment = "Force Close (" + ToString(count) + ") Positions At: " + ToFormatString(cTime) + "..."; + int closedPositionsCount = mTrader.Close( + positions, + comment // + ); + result = IsValidSize(closedPositionsCount); + if (result) + { + // + // Finish Positions and Clear Data ... + for (int i = 0; i < ArraySize(positions); i++) + { + // + XPosition iPosition = positions[i]; + Finish( + iPosition.ticket, + iPosition, + comment // + ); + } + + // + ResetProtections(); + + // + string message = "Force Close (" + ToString(count) + ") Positions At: " + + ToFormatString(cTime) + " Successfully ..."; + Alert(message); + } + + // + return result; + } + + /** + * Force Close Positions ... + * + * @return ( bool ) + */ + bool ForceClose( + XPosition &positions[], + string comment, + string notificationMessage // + ) + { + // + bool result = false; + + // + int count = ArraySize(positions); + result = IsValidSize(count); + if (!result) + { + return result; + } + + // + int closedPositionsCount = mTrader.Close( + positions, + comment // + ); + result = IsValidSize(closedPositionsCount); + if (result) + { + // + // Finish Positions and Clear Data ... + for (int i = 0; i < ArraySize(positions); i++) + { + // + XPosition iPosition = positions[i]; + Finish( + iPosition.ticket, + iPosition, + comment // + ); + } + + // + ResetProtections(); + + // + if (IsValid(notificationMessage)) + { + Alert(notificationMessage); + } + } + + // + return result; + + // + return result; + } + + // + // Timing Actions ... + + /** + * Update Currently Open Positions Info on Data Collection ... + */ + void UpdateData() + { + // + // Retrieve Positions ... + XPosition positions[]; + int count = mTrader.GetPositions(positions); + if (!IsValidSize(count)) + { + return; + } + + // + // Loop Through Positions ... + for (int i = 0; i < count; i++) + { + // + XPosition iPosition = positions[i]; + + // + // Check Position Registered as Data or not ... + int idx = -1; + bool isExists = HasItem( + iPosition.ticket, + idx // + ); + if (isExists) + { + // + // Update Position Data ... + mData[idx].Update(iPosition); + } + } + } + + /** + * Handle Positiona Protections + */ + void HandleProtection() + { + // + string prefix = "Protector: "; + + // + // Implement Protection Senario Here ... + int count = Count(); + if (!IsValidSize(count)) + { + // + currentDrawdown = 0; + return; + } + + // + // Calculate Max Same Time Trades ... + maxSameTimeTrades = + maxSameTimeTrades == 0 || + maxSameTimeTrades < count + ? count + : maxSameTimeTrades; + + // + double bepSummary = 0; + double volumeSummary = 0; + double profitSummary = 0; + XPosition positions[]; + bool isProtected = false; + + // + // Loop through Open Positions ... + for (int i = 0; i < count; i++) + { + // + X121SMCTradeData iData = mData[i]; + + // + XPosition iPosition; + bool hasPosition = mTrader.GetPosition( + iData.ticket, + iPosition // + ); + if (!hasPosition) + { + continue; + } + AddRef( + iPosition, + positions // + ); + + // + // Calculate Break Even Point ... + double entry = iPosition.entry; + double points = iData.Points(); + double volume = iPosition.volume; + bool isLong = IsLong(iData.Type()); + double spread = GetSpread(iData.GetSymbol()); + double bep = iData.CalculateBreakEvenPoint(); + double exitPrice = GetExit( + iPosition.symbol, + iPosition.type // + ); + + // + double tps[]; + int reachedTPIndex = -1; + double reachedTPPrice = 0; + double reachedTPLevel = -1; + int tpLevelsCount = iPosition.CalculateTPLevels(tps); + iPosition.CalculateReahedTP( + reachedTPLevel, + reachedTPPrice // + ); + if (reachedTPLevel > 0) + { + // + reachedTPIndex = FindIndex( + reachedTPPrice, + tps // + ); + } + + // + bepSummary += bep; + volumeSummary += volume; + profitSummary += iPosition.profit; + + // + // All Protections Done for InProfit Positions ... + if (iData.profit > 0) + { + // + // Check Break Even ... + bool canRFOnBEP = iData.CanRiskFreeOnBreakEvenPoint(); + if (canRFOnBEP && reachedTPLevel > 0) + { + // + double tpLevel = iData.TPLevelForBreakEven(); + int tpIDX = (int)tpLevel - 1; + double rfTPPrice = tps[tpIDX]; + bool isSLReady = isLong + ? iPosition.sl < rfTPPrice + : iPosition.sl > rfTPPrice; + if (isSLReady && tpLevel == reachedTPLevel - 1) + { + // + double sl = rfTPPrice; + double tp = iPosition.tp; + string comment = "RF on BEP ..."; + bool isModified = mTrader.Modify( + iData.ticket, + sl, + tp, + comment // + ); + if (isModified) + { + // + isProtected = true; + + // + string message = prefix + + ToString(iData.Type()) + + " Position: " + + ToString(iData.ticket) + + " RF On BEP Successfully ..."; + Alert(message); + } + } + } + + // + // Check Partial Close ... + bool canPartialClose = iData.CanPartialClose(); + if (canPartialClose && reachedTPLevel > 0) + { + // + double mainVolume = iData.Volume(); + double currentVolume = iPosition.volume; + double partialCloseOnTP = iData.PartialCloseOnTPLevel(); + double partialCloseVolumeMultiplier = iData.PartialCloseMultiplier(); + double closeVolume = currentVolume * partialCloseVolumeMultiplier; + closeVolume = NormalizeVolume(closeVolume, iPosition.symbol); + canPartialClose = + currentVolume == mainVolume && + reachedTPLevel == partialCloseOnTP; + if (canPartialClose) + { + // + string comment = "PC On TP Level: " + ToString(partialCloseOnTP) + " ..."; + bool isModified = mTrader.ClosePartial( + iData.ticket, + closeVolume, + comment // + ); + if (isModified) + { + // + isProtected = true; + + // + string message = prefix + + ToString(iData.Type()) + + " Position: " + + ToString(iData.ticket) + + " PC (" + ToString(closeVolume) + ") On TP Level: " + + ToString(partialCloseOnTP) + " Successfully ..."; + Alert(message); + + // + // Finish Position ... + if (closeVolume == mainVolume) + { + // + Finish( + iPosition.ticket, + iPosition, + comment // + ); + + // + break; + } + } + } + } + + // + // Check for SL Trail ... + bool canTrailSL = iData.CanTrailSL(); + if (canTrailSL && reachedTPLevel > 0) + { + // + double tSLTPPrice = 0; + + // + double startTrailTPLevel = iData.TrailSLStartOnReachTPLevel(); + if (iData.lastTrailedTPLevel > 0) + { + startTrailTPLevel = iData.lastTrailedTPLevel + 1; + } + + // + canTrailSL = IsValidIndex(reachedTPIndex) && + reachedTPLevel >= startTrailTPLevel; + if (canTrailSL) + { + // + tSLTPPrice = + reachedTPIndex == 0 + ? tps[reachedTPIndex] + : tps[reachedTPIndex - 1]; + + // + canTrailSL = + tSLTPPrice > 0 && + iPosition.sl == 0 + ? (isLong + ? tSLTPPrice > iPosition.entry && + tSLTPPrice < iPosition.price + : tSLTPPrice < iPosition.entry && + tSLTPPrice > iPosition.price) + : (isLong + ? tSLTPPrice > iPosition.sl && + tSLTPPrice > iPosition.entry && + tSLTPPrice < iPosition.price + : tSLTPPrice < iPosition.sl && + tSLTPPrice < iPosition.entry && + tSLTPPrice > iPosition.price); + } + + // + if (canTrailSL) + { + // + string comment = "Trail SL on Reached TP: " + ToString(reachedTPLevel) + " ..."; + double sl = tSLTPPrice; + double tp = iPosition.tp; + bool isModified = mTrader.Modify( + iData.ticket, + sl, + tp, + comment // + ); + if (isModified) + { + // + isProtected = true; + + // + // Update Last Trailed TP Level ... + mData[i].lastTrailedTPLevel = reachedTPLevel; + + // + string message = prefix + + ToString(iData.Type()) + + " Position: " + + ToString(iData.ticket) + + " Trailed SL On Reached TP: " + ToString(reachedTPLevel) + + " Successfully ..."; + Alert(message); + } + } + } + + // + // Handle RF On Target ... + double target = iData.Target(); + double targetDelta = isLong + ? target + (15 * points) + : target - (15 * points); + bool canRF = + target > 0 && + !iData.isTargeted && + (isLong ? target > entry + : target < entry) && + (isLong + ? iPosition.sl < target + : iPosition.sl > target) && + (isLong + ? iPosition.price > targetDelta + : iPosition.price < targetDelta); + if (canRF) + { + // + double sl = target; + double tp = iPosition.tp; + string comment = "RF On Target ..."; + bool isModified = mTrader.Modify( + iData.ticket, + sl, + tp, + comment // + ); + if (isModified) + { + // + isProtected = true; + + // + // Update mData ... + mData[i].isTargeted = true; + + // + string message = prefix + + ToString(iData.Type()) + + " Position: " + + ToString(iData.ticket) + + " RF On Traget: " + ToString(target) + + " Successfully ..."; + Alert(message); + } + } + } + } + + // + // Calculate Max Draw Down ... + maxDrawdown = + profitSummary < 0 && + (maxDrawdown == 0 || + maxDrawdown < profitSummary) + ? profitSummary + : maxDrawdown; + + // + // Calculate Current Drawdown ... + currentDrawdown = + profitSummary < 0 + ? profitSummary + : 0; + + // + // Checking Hedge ... + bool allowHedge = AllowHedging() && + !isProtected; + if (allowHedge) + { + // + double minHedgeVolumeStep = HedgingMinVolumeStep(); + int minRequiredPositionsForHedge = MinOpenTradesFroHedging(); + double minRequiredProfitPerVolumeStepForHedge = HedgeingMinRequiredProfitPerVolumeStep(); + + // + double minRequiredAdditionalProfit = + bepSummary + + ((volumeSummary / minHedgeVolumeStep) * minRequiredProfitPerVolumeStepForHedge); + + // + bool canHedge = AllowHedging() && + profitSummary > 0 && + minHedgeVolumeStep > 0 && + minRequiredProfitPerVolumeStepForHedge > 0 && + profitSummary >= minRequiredAdditionalProfit && + (minRequiredPositionsForHedge <= 0 + ? true + : count >= minRequiredPositionsForHedge); + if (canHedge) + { + // + string comment = "Hedge (" + ToString(ArraySize(positions)) + ") Positions By: " + ToString(profitSummary) + "..."; + int closedPositionsCount = mTrader.Close( + positions, + comment // + ); + if (IsValidSize(closedPositionsCount)) + { + // + // Finish Positions and Clear Data ... + for (int i = 0; i < ArraySize(positions); i++) + { + // + XPosition iPosition = positions[i]; + Finish( + iPosition.ticket, + iPosition, + comment // + ); + } + + // + ResetProtections(); + + // + string message = "Hedge (" + ToString(ArraySize(positions)) + ") Positions By: " + + ToString(profitSummary) + " Successfully ..."; + Alert(message); + } + } + } + } + + // + // Protected ... + protected: + // + XCTrade *mTrader; // Instance of Trader Class + X121SMCTradeCollector *mCollector; // Instance of Trade Collector Class + + // + X121SMCTradeData mData[]; // Hold Trade Data + X121SMCSymbolPositionInfo mSymbolInfos[]; // Symbol Positions Info + XSymbolLastPosition mLastExecutedSignals[]; // Last Executed Signals + + // + void AlertSignalExecutionFailed( + XSignal &signal, + ENUM_X_SIGNAL_EXECUTION_RESULT state // + ) + { + // + // Alert Signal Execution Failed ... + string msg = "Failed To Execute " + + (signal.type == POSITION_TYPE_BUY ? "Long" : "Short") + + " Signal Provided by: " + signal.provider + + (signal.pushers > 1 ? " Pushers: " + ToString(signal.pushers) : "") + + " on: " + signal.symbol + + " in: " + ToString(signal.period) + + " due Reason: " + ToString(state) + " ..."; + Alert(msg); + } + + // + // Private ... + private: + // + // Props ... + + // + // Read Only ... + int maxSameTimeTrades; // Holds Max Same Time Trades + double maxDrawdown; // Max Drawdown + double currentDrawdown; // Current Drawdown + double drawdownPercent; // Drawdown Percent + double staticBalanceForCalculateDrawdown; // Static Balance for Max Drawdown Calculation + + // + bool mSaveSignals; // Save Signals + bool mSaveTrades; // Save Trades + bool mSaveConditions; // Save SL Conditions + + // + // Signalling Props ... + bool mAllowLong; // Allow Long Signals ... + bool mAllowShort; // Allow Short Signals ... + int mMaxAllowedLongs; // Max Allowed Long Signals ... + int mMaxAllowedShorts; // Max Allowed Short Signals ... + bool mUseMaxAllowedSignalsPerSymbol; // Use Max Allowed Signal Types Per Symbol ... + double mLastPositionProfitForAcceptNextInPoint; // Last Position Profit In Points for Accept new Signal ... + int mDelaysBetweenTwoSignalsInBar; // Delay between two Signals in Bars ... + double mMaxAllowedSpread; // Max Allowed Spread for Signalling ... + double mAdditionalVolume; // Volume Additional ... + + // + // Risk Management Props ... + double mMaxAllowedDrawdownToOpenTrades; // Max Allowed Drawdown for Open Trades ... + int mMaxAllowedSLToPauseSignallingPerSymbol; // Max Allowed SL for Pause Signalling Per Symbol ... + int mPauseSignallingAfterReachesMaxAllowedSLInSecconds; // Pause Signalling Per Symbol afte Max Allowed SL Reached In Seconds ... + + // + // Protection Props ... + bool mAllowHedging; // Allow Hedge Positions ... + int mMinOpenTradesFroHedging; // Minimum Open Positions for Hedging ... + double mHedgingMinVolumeStep; // Minimum Volume Step for Hedging ... + double mHedgeingMinRequiredProfitPerVolumeStep; // Minimum Required Profit Per Volume Step for Hedging ... + + // + // Common Functions ... + + // + // Count Data ... + int Count() + { + return ArraySize(mData); + } + + // + // Add Item ... + bool Add(X121SMCTradeData &item) + { + // + bool result = false; + + // + result = item.IsValid(); + if (!result) + { + return result; + } + + // + int index = -1; + if (item.ticket > 0) + { + // + result = !HasItem( + item.ticket, + index // + ); + } + else + { + // + result = !HasItem( + item.signal, + index // + ); + } + if (!result || IsValidIndex(index)) + { + // + result = false; + return result; + } + + // + AddRef( + item, + mData // + ); + + // + return result; + } + + // + // Find Item Index ... + bool HasItem( + ulong ticket, + int &index // + ) + { + // + bool result = false; + + // + index = -1; + + // + int count = Count(); + result = IsValidSize(count); + if (!result) + { + return result; + } + + // + for (int i = 0; i < count; i++) + { + // + result = mData[i].IsOwn(ticket); + if (result) + { + // + index = i; + break; + } + } + + // + return result; + } + + // + bool HasItem( + XSignal &signal, + int &index // + ) + { + // + bool result = false; + + // + index = -1; + + // + int count = Count(); + result = signal.IsValid() && + IsValidSize(count); + if (!result) + { + return result; + } + + // + for (int i = 0; i < count; i++) + { + // + bool isOwn = mData[i].IsOwn(signal); + if (isOwn) + { + // + index = i; + break; + } + } + + // + result = IsValidIndex(index); + + // + return result; + } + + // + bool HasItem( + XPosition &position, + int &index // + ) + { + // + bool result = false; + + // + index = -1; + + // + int count = Count(); + result = position.IsValid() && + IsValidSize(count); + if (!result) + { + return result; + } + + // + for (int i = 0; i < count; i++) + { + // + bool isOwn = mData[i].IsOwn(position); + if (isOwn) + { + // + index = i; + break; + } + } + + // + result = IsValidIndex(index); + + // + return result; + } + + // + bool HasItemByPosition( + XPosition &position, + int &index // + ) + { + // + bool result = false; + + // + index = -1; + + // + int count = Count(); + result = position.IsValid() && + IsValidSize(count); + if (!result) + { + return result; + } + + // + for (int i = 0; i < count; i++) + { + // + bool isOwn = mData[i].IsOwnPosition(position); + if (isOwn) + { + // + index = i; + break; + } + } + + // + result = IsValidIndex(index); + + // + return result; + } + + /** + * Find Specific Symbo Indo Item index ... + * + * @param symbol: String ... + * @param index: Integer ... + * + * @return ( bool ) + */ + bool HasSymbol( + string symbol, + int &index // + ) + { + // + bool result = false; + + // + index = -1; + + // + result = IsValid(symbol); + if (!result) + { + return result; + } + + // + int count = ArraySize(mSymbolInfos); + result = IsValidSize(count); + if (!result) + { + return result; + } + + // + for (int i = 0; i < count; i++) + { + // + bool isOwn = mSymbolInfos[i] + .IsOwn(symbol); + if (isOwn) + { + // + index = i; + break; + } + } + + // + result = IsValidIndex(index); + + // + return result; + } + + // + void Save(int index) + { + // + int count = Count(); + if (!IsValidIndex(index) || index > count - 1) + { + return; + } + + // + // Save Trade ... + if (mSaveTrades) + { + mCollector.Save(mData[index]); + } + + // + if (mSaveConditions) + { + mCollector.SaveConditions(mData[index]); + } + + // + // Remove Item From List ... + ArrayRemove( + mData, + index, + 1 // + ); + } + + // + void SaveSignal(X121SMCTradeData &item) + { + // + if (!mSaveSignals) + { + return; + } + + // + // Save Signal ... + mCollector.SaveSignal(item); + } + + // + // Find Last Signal Execution ... + int FindLastExecutedSignalItem(XSignal &signal) + { + // + int result = -1; + + // + if (!signal.IsValid()) + { + return result; + } + + // + int count = ArraySize(mLastExecutedSignals); + if (!IsValidSize(count)) + { + return result; + } + + // + for (int i = 0; i < count; i++) + { + // + XSymbolLastPosition iLast = mLastExecutedSignals[i]; + if (iLast.symbol == signal.symbol && + iLast.provider == signal.provider) + { + // + result = i; + break; + } + } + + // + return result; + } + + // + // Handle Last Signal Execution ... + void HandleSignalExecuted(XSignal &signal) + { + // + if (!signal.IsValid()) + { + return; + } + + // + datetime cTime = TimeCurrent(); + int symbolIDX = FindLastExecutedSignalItem(signal); + bool hasItem = IsValidIndex(symbolIDX); + if (hasItem) + { + mLastExecutedSignals[symbolIDX].time = cTime; + } + else + { + // + XSymbolLastPosition item; + + // + item.time = cTime; + item.symbol = signal.symbol; + item.provider = signal.provider; + + // + AddRef( + item, + mLastExecutedSignals // + ); + } + } + + // + double CalculateMaxDrawdownPercent() + { + // + double result = 0; + + // + double mEquity = mTrader.mAccount.GetEquity(); + if (mEquity > currentDrawdown) + { + currentDrawdown = mEquity; + } + + // + if (currentDrawdown >= 0) + { + // + drawdownPercent = 0; + return result; + } + + // + drawdownPercent = (currentDrawdown - mEquity) / + (staticBalanceForCalculateDrawdown > 0 + ? staticBalanceForCalculateDrawdown + : currentDrawdown) * + 100; + drawdownPercent = NormalizeDouble(drawdownPercent, 3); + result = drawdownPercent; + + // + return result; + } + + // + void ResetProtections() + { + // + ResumePausedSymbols(); + Clean(mLastExecutedSignals); + } + + // + // End of XC121SMCTradeHandler Class ... +}; + +// \ No newline at end of file diff --git a/BKPS/14031206/X121SMCEA/Experts/x-121.smc.expert.class.ex5 b/BKPS/14031206/X121SMCEA/Experts/x-121.smc.expert.class.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..09bbee483f4157f824ff8741f9d4c2c3ba85d5db GIT binary patch literal 19824 zcmdS9Ly#^^&?efpt<$z`+qO=3pSEqhZQHhO+qP}nzTZDLW;cu3PG(eP){|9>Co?Ll z7AdC52I>F=g$e`)^q&9&9sMu+KmPwOIN`t0ozr{3NxTqr=uC^e{~Q0mweFBWK>suT zPeQ{7=SidrD={c%=QpG#tj&%0K(#85VLuBep-RTG%g+gyhkx|lX7)d4MS$#p?14Oh z9Dyu=%z(^+oPh{|n1LAo8!SMy|M@CFhX0`^|HZ|CtbuI)L!^LI|C>er!)*WC{Xdca zm*syLJO7sfCm?PhhX2&;KK$_XJ_Rk69D|ONw#cK*rHK}>K60?>!$3^6`kaRBlVcD#22b_C>*%%Z z7gbBj0xi{jYZ60|fN*E(pu@z7RLBU_ad8L*l6af(Vj&F3i#E;KYpBsqcRxpt$EBI&-Cw$6(guokk(jKL2#7HustBp5&>530$>!(~>e-@T5c z9Wx(sou$E@86QJsM%f$$2W;qu^jiGb7&W@3ROKiHfI)0!o6&pxxD|T z6%WWvO4#&9V+G za2r+rFv?6&v6s1mM;No*HpUx;d%2FBaE@&Zym8qq=|yNVuA@rBq9lwOF1~kr71kat zUJ>UzT*Fp9ZOoX-wlTW79&^>855q;8+W3yK>ahBTIm|RqJRAfjh!jT;OuGk zPw`$+8Fl+86rXgjjLoFZ1ACh%o_7QDS*GJ zisM!=^cR$6##fa%!^y2{EWT2xNB5dVw~@xHy%sV-Y&%_y?Yi2^N=8}=D4xl znciH0-6exXO%mY>6LI0}-p6|XgE1n(`OV9f(ersrCUNzqn%k&-y((LiA`}yuoM8On zCevjCrcywVhtpR*ZCvt(JOr+B$qA9@NJF4e)YG&R^Yywgi*@<5y5!F(G08m;#Xc7q zePY}Z7iTyPS~;V9OOr6&Dn5~^5Vh!*iL*aWOBmin!HF&~Kf0jox2DwGu1-nw!lUnE z%>df^z3q=*k%tvVB>)P`2yxD*_){mC;+&`?8t#B2x*Spo5R%Obu|#j`|p-=ne4U^JJ5 z!PGa#@RUZ`+8F8V0uM-^Xnm8JM&nLN!`x+|BZA^{2(_T&FHnFv=XqBT7iYB zkMZWPCn|0w#zAL~Z$NPvoJa$$N?wcYiAx*fdqDhL(mt|PGrC0=)zR*PPRP1;UEgtR z6T;MtRVRVP(NVg%8e)f!sbMTwKLCQZkHsjdXd^zfJ zm*?JpS2%0I3#I0}__hn6%)yW-LaMaX%?n^FAT8FggPd`EFS82z`|YSmt}0}+#3qUQ zYKs(6u~Vfv*imU~1yChW=tPR-2+FCPahhW5Epn$|?rbZQj@2Cj1>xqKN6tr3%o+p1 zl)rrJjpx*jj1BWcmOOoUJpy^?2|R-5`g-vFV8`oEe_M2 z!acf8x>I(rGv%;9xK4f;aND`*%SV{!Ai)$yw<^Ar z?FR9om4zD5KZGa;b~{tv7LQ27gG(I)-}egL{>k{+R=c29|1Q2nXE8B;O9k_@a2`hJ z0)kO&W#gOzkutqdSd9cyABn@1s&bAF-&9tAH;GI>K;5ydaPPtKmDB*dL;ItJ;34jH z9AHQaCv&u=bT3Z%BI^aq3-IYiRE3I)rv-bancG@sZE%S_%ZNKstQ{QHWQq&(9Qd$N zv>wciIIX3xYsPQuPjJU|m+Q0T$kMT4BQ)5>+YdoFcs9$c74sb^&d&P<5n0tm*@# zKPqm~&;ONjB@FjKk3+())Vx5e0kxD5vWc*M(_4c>*JNa&hy|Zpg)&T^YMXTadZriW z1HvVpNhq@V52QjQs$qu=kZApDF|SrWx2NF6u9bZcUB11M_+gXW=_5K`xqM(=Ps+0v z2znF9uP5T8FX+;sf)AT!D=4@`Gw)Mjy=YK6?`K+-`>f%rG zyXFIqpUuvBN68N; zqs^7dinw-ud^(?xuc|=0V+c5PTn@jdz;jXp^8gz_0DZ)vJMpcn-zVyw2{}OYe7gbV zt!IgrizW**1jB!a03lux)y3ezy-;G!w=gcF0^_~AzYFD?dv=LPKApCg(*q4UM$=)z ztpa&rTEL#BSF56Ti=T9}Qh^(ptgeOy4P>|5Dn`IDZwb2H8M7u}DSsptu1dh2M{}3B zf1YZinUwXY&soddf(Jq;6r7$u3`f<-hkQ*OXn@PA_#OQ-gq%%i@!K4*g;5{|BmI+t zYG$avw$}NDMSj=7T-6|;k?>v%E4iO0*BfMbE|}k?{G9&*1mDVd*C4kMgsGX(3nE(} zQV8s(YXG!-uhjjcZS?HsdmDr)4_@J9$6sgF(JQHj`^qRU5^vWx7^i^G&a0s+A_M`a zY2^bb_XG@o4=uiPA9>E^5PnJ^k(g?MX-(|D_dkFT0;h1kCGWl=HmRc0w@z5IY&%o6 zTN3#h!`Q-1`fA)f#7D-~%(){8<)^kRK``2MX^YG~u~JkAyc0nb5J(`)q}Lk3PhM-a z%_lz-iE=kNT{4B&X;*TB{)LM}<$898S>IF%66QvhsX({?;Wmy?HI6)fM&HP_9U@`5)>z&7#TLNd`ow~^V>3d2=(Mn56%8Z-Qb^f=0yXZ8>N}A0Gbv& zFGRn5EwWXCEk3&+8;>w=l??v}y zfK`D5LB{Kh0(uNI;{&tF0edRz4d(z1deSuW5u8mN%k9XJhenX^=S?b1MR?O4=}oSw zt+5H5w!6-IShbpLkk3}a=RF{}wbz(S$3w*&x$l79^i!1KKP01=8S;ycdU4IxY_GGe z6WzJ&HVbHK{_{CW_U8gsJurmGjdK$|<#Dqclf>$XGkDzuhWq7`aAgrx!jVhoKu;;3 zf9cBQ%d|z{1*R(bRRk^8J^gLG3|JZQVp~YT#SWS#aj7f>?K!%wc*wEEY#g882%Lq- zFg(FMZJXpnfb^>r=casBV7`fs|TQQJ;SAS|u6 zZG-^=?JfM64{iYW8sVMzWIx47AOPF4lg_uD8GOidYq!821t)88an2NBm&AD)mx{kj zq1DFCRj16_E2!%mS1M;;swpUX*`!2^f}|PK^PP|J4!`kks{LC4QahD~GRT@kTpa)4 z(Z2+Ri}hB4X)Mn5tU&sKc?Fij!qrXEwkI&tti0a9PLuS*S6^nXz?fw5B89v@-?(-s z(-|zC9j9m@cfvxKM9)&n@m+E;8b#Z9Lo_q7Xw4JFc3S$lO|CgPPvY9r``@b3<lWn~cbrqd;` zk^St^oskR^A>#=dD)h#TBj5YqMq4^XUFnq}^FzfeX-;6D*vVYZpu&5lV0be8OJpJZ zBnfF56QlK$?`cOAeyA~$=O^^^P&6M5c3~FZJWd6H*hB8BPBxu#nRap)?i0T>@>7{3 z7Naf^+ax2-Ci*X{u^7XdvS6txS21v&IsJ`it^(owW;!ybW9~y0%+R@x;v`kWEtz(0 z62i#1?+;6nK~%9rHtDYkVj+dmI0)wTsz%!)bE#hWSz%oB@edPnJ^GQL3^vXJG!~GY zTQFx|-1(Vtsm$d;be_OqW8B&KZ(uMo;#TY||FcU@v4Aw7EiVc|%a0fBw2x!+n+0sJ z!_0)?8v}!Q@G<7%6*sOkwmWdyGbEPwDPyw%)U_R|c_y`2XG?Pw=y@SP=oQTNG7 zm_y>JssL?gp;5OV)%65?7u6kAGbazxqDk_G0Gh4$JQ5G+lj(L~6KBeeLE*;lf2CyZ zUV|m#*P0hNZ&A1wS@$kQIXfU23X}D0mgjxMg=7SqDxout4Tib6he-!}MuO^EWSpt0 zECMUIDD(qk1)(kUFIjC0wx%yTziVh9_^gxFs25c*|nNONuk2K!|Rb;A{6 zfbWwlGp!ifcTie=Op--JT5ee65?f#a*m(>Sp9r-4RMN@k3aJ80>wZD&mYq$fxA9An#Pv>N=GhcEkI1?`yMVYV*(uyh2&b8k z3s!r4ltsTdM^ay(R9Xr3lqOTY!AS^ z+>b7tb->{01CBJrM%<{IifuM{1d2NF51p{nNElXKqOoJAk{H*qsHLHLqJ^Ji+me2w z+%BK1$4#9WScWyqtxIsMgJ*p>sZ0E$10O@3%9PE4SyPSoGccZrUXRL6PMt(eHUhnL z-U80O^yx{VR(OR3zu3(aQ1 zbgcBh2qTbl2a0Y_gqoe zL|*r+U4xZ?8SVWY@+>aR)wL18Bp}-sJnT!Rw1>jE?gT=h!`(*t3O)9z;^!vVRQiV1 z%mwnKoW)ST`3W({{&C*KUJ3&DqPUr!YlkD;%vbgE7y_caYR5}I)k-q3{@Iitdq!{q za4O}DB_1+Sz$A}bC*G18NHJhii2LTWpY# zF$iU|oo*fia(4QIp27A@zvQkHIEwrL0rG0XEdx+B3^U!ySI6asn7E~M>gks_?FCJt zs|!DNnAHILmKgy4^B_?7aN@?%b)nLC;orD-0O9}_0N3(>C^qSEuG~U7k`_$1Mo1{; zoa~azNiIk>H)ijQZ~DhDvcMC6mD&|aT*ph`5%|HL;VLr83xW5;{b$W89CrDp7-pp5 zkaHrcRm(&HL){x%o$klWh29uK`bF&N$Mya>0!>?a`SoDe>#YElBAmymexB$`yCpaX z?Mpr%IkH9(!(t*&MBdId9;h=holszd)y&T@dY#v?3(WtGv~bEP{b?s@Dc5{(WN48EQbkjTa?S@S^Ks+1 zaRWio)88C2Zc}r3E=MqJ5m->j{Rt)bUYtpXv3YUu3jU2J?ohPw%qR@jK^0%F+;J}E zt~Q`jURvfX%nzPu!bF4m2N(pWUT}?tB0q8mj?HEMp^~{A^@MEwCrm39Au5(kbho@)hv7lp~JgP3St3!Ae6s^X!0+USeO&f7z{s({P&DSOM9Q6l{kNNwdW$V{jqNwG|!wNAQ%97?aW=z0R!(`#gCsm#(Iqs<0A{xgC{@H%pm!^o3d zVlqEqI2)t1N|Wcb@0Cf6hi5k7V|a`sPZKaRbTJ3ijF_T_JaZmbvH&7l06Ax|qr=N( z>bz=_pF=&;B(|^aYN!d*%_wUqLK%?7H4->48IuZW(Y+@VDsTcQG}pZ3pSU1 zFy?ukd=*4_33lkza_MQ79NQv>QZ`j3PUkiXUbJMRHJ4JN%Vuf!8Y(59g$-IggkL^5?73#{A68MyU=s3d$Ufht zMx4NC&T}xB5*c94*@C~mSNNoj4}H!30H!FZEYlBWzYz&~u@+o8W#06zg1Q<^a_|64 z8`wYj{r6uWI*-&+aBqmJv%qmbBI|DTsWQtch-bik9B~yc3Q#JGUT*DN(vEc-1@n>q-RRFX-yfdz=YvrFy8bbQXN{ zyKkdKs-Lr|7b}~&&3&w?$}(54RA1D_o=mx_ST7E#<1W52>G)vckqIVFX2tUhR0__5 zlB|4(F%o=oymze{P0I??$Mt)`zvj7kNm|&yESY$#QMh{%L&|h`OsRpf(++Nbk;*=V5qPN;o?2wC1{tc^Mim6@Z-Sooubzo2Lk+k7@?}>%fs~#=%ib2!$wvV z+tX%FS5(_-<+v>^Kb53?B(>WWjp*S}9(>TvOTR*O>TNWZ|I|GsT_ws2u9P?yp`Z;S zO-2yh2*mz|KsJ|)~Mg%LZx7P$?L=lk2-8f=^YENpeA zr+^_ejGsE)FUie6uk#rvoB3RV&Tp@EtKcmU&;Tj`DOxR#D*)2vJGAX7dTVmY8%1?p zFDt`{>cI6>n(2}Eg=pAfM~4)XGMy^-i%k%QqEt6(X2+E9vA4L%1B)f#C zp!1{vZc|s3;XHdisDWA{%N zBeelYR)14gm^2cf(D!^R*qBfsH$!cFZ`n=+msKW6iM0I z=c}8W=b|=kB;W%)#zS%8xVJ?w`rMG=Qrms8_8RVU12l%LK{|?yEh&qwz zuz%Rey(?!uY#E9!RnIg&Z|#;0Sl1SUiC5GZhr+D8u6c7OTmrdvqb|Af$Fl3!#s6 z(#e!>DWRt~-{UOcQc*#$tELm#3|!bRFogZSGh>{-o>%j9?+c1s+$4yaePvP2i*aV| zB)S->A6n}%%<@(!v?nf7c{N_e{m7?ZY-j~9&9r$fb-9Ske4$>Bbt9t`e9!6CA77Zp`;1G3;Mps4aw_HoXOaRXAMJx(*3CBXt?l&ZEMTU8 zk4X&xc|vb7lzRF({hWluVK1`~H9+)jH=4a@*|0zd7Rk(fu7(LZLq_ct2&HB= z#nR8chJ2VV1Qf1A%Mh3QD!({yb}&{CI#?wh68S>?bC^AkThsFgC@IUhZWp(0Wi~=h z&Dig;l5g|(v4Q6eFd6d>ufIJU?p7Q!%P3TLF*4vaXl%~pH64a z;T&@Hph`@MjLW8{PzA=Fl+1%lO3@}(p0oYALB`Aw)q~u=9f|0Cpt3RJ}6^LBK2VXy=Y#$EL)VWa*Mw00iermhQEzI5l&tNZK}Y zl0?3rh(MMkX8F>EE0Eu(o&QGibrQuHo0A=37aoj*^TNd>3)pa3!HVfNNjQF_xWrA_ zk3w#pz5!241JEwVRv!q%j56GbWd(Cd@NlNbuvzcOmZ73JAmdJw%eHX5AG2^eIqBA0s*bR;kg zgI?w(h73zQuauy6)+)KL}>b<)f7$(%exCW#S;!?R^sf12?T3NI>P<;qjuQK9|Z*UF}b>t$kN-*d_ z3nTwM!qhf;rwTs*xM=C0Ww5nLc})ZuA8kwaf&72Ge9Gf0J>cqRME`^*QfrF$|5gyW z-Ab|D04V&Fku5x!6N%v6Z+RniFHg=%sMna~VC>Q$!6eKEW`@6I>L7D)>`6UwN-xl| zn3;@he$2BhN@W)8&#Ft|;m&RR9CmRhV{9Yxun+`RBD%#`(NG{)pl%wE65yw93$p0l3$qFEGV=^iP9C?Y z?O+xgCYlXw)azZAP`kjwRM;?HBC;Jib9B9J?kn;LgQ`oo zhNu2<>`Uw zfi95tDT9QxImk8F#W{yO8I`X2x5X_{S~_At=$epf*b9pZSY^+gvgaw+r2UAxH#h+% z%g&zcY@%J_<2Wwc&Z4DnV&CoM9A(1Vpo@JyYEiI#1TD@{1Kgyyu>+U`^CCv<{l9VCkki zjxukK>F)Qm4Wl7ZGp)V1(S&7y%8ikY*_WNe@P;OA*MD+Y^`-0R@q5IE?ry!{z1NM=*7yDt4bGzje_^e$j}>erAcF7#^# zCgr%Oih!*}APRKo+?}5EZh9buJAXQoW&VLnWf{XSr{%9mS^=WRa=9Bmsz=Q0LPGMoPF0seDcbNA=shR59GLYKh z#mtSbfjWy~cEUVN_S=~@g|~wn6V$jp zqSM2AEyk1DuIMHaFGaO`>7-1sX_v1yu77a-P=D_FKF@S=czL`dK$5K?yNiJHo zdo9H1)*$19e&Y-4H<8ykCuc=LRHf1S`Ea7Al&7=KAbTx8wA92+i=b-om7X0+T;J$J z9tgv(lg?X1);_*8f*#SD_eNlX`TbrSeWv*IoraV;O z6+ESnY$tVWd3QT2FnEsfeTU2!T0U=@V*L$SQ4;kc^kZo70~xN$KgmR8K;|)r5Q9Rn zX_-d~&X<{IR?&|z%(n+%%zHVQqLS*Pb@*8jB=7@vJURrK<2rP@e=NWiot>!*_KgI? z)2<%6QVxd$sRp+x9+A>E&G;2nA@8U+^!My-oX|~BVBE|57v9{qImH~I?110@482{$ z3i{72rB{~bPxBKXqb&gCJ#|@5p0r6l z|3pPu?8ZJP#Qf1PK76!HTXD_}&Au~F8vWG=^_RHvjU}*s>sT31FYcmvmy4A3axOOd zt0=)kEj&u2zB&x7Hhuoq$qPxiiXp<%yWbn-%DP^;4YJG2uFxfZ(N_0YCf6D;6RDqd z7s*{!uuOsUGW|ZD{?=%iK}j%#^Mm9(b0f(Zt>ZP6LwrtRgC3^9&y>T%)g2oY^aSTg z61HkCNCbJMfv0;%Wumjky+PK>TEos1AwLX7uxwk59tWFsjG}@cG?n;Rg!R!{_Sh0$ zj43!(x)&h0UUJ9Y(g&t9VdB5S4XZ)0ydDrw581+jddi22^_$z_Y!=r z-u$-@FU+_Iz?@(tH2V}X?UKuw7<1?O1Kz>GLNwozG+0eDpLPKGxZ$}=&418Q{T`q` zM-dH@lNVG@?=biv-?`&+QECkf?6CNRq{bK7($4}fq(8F~4~W4$*{?lxVQz$Pq*X)> zs>Vb^n{zi;x%DmEwN@C_1K5G5ewDNER$!F+kWQN%VX1Xrx>5PEaGJy}|9I%6cgMT9 z98fQfmL9I0OB}m!0N|Z95(lc@Wnw%LKgK=_M>Lwk{mbTKF_K7G2(dh3ctq{*0TwzQ ze|39~1w=Yx91nf#du1Hs8X!10sy;V95B6AHIt4!LGQ1klHX@fY9a@&s$zD?m#>-G? zNX?yIq9-Qg^bEW>2aw+kdu@Ccyk2uioZ&1KoAH28=BlDHQh6PeA2#9Kw02?viicr> zb)`%T1bV~5&)g*MH((4;3K+W*`r1O42%Mc)i~Si@GhHRQ168j?_5~{8*H7>Nd~W&g-;1kCnX_wLDOL{| zT}wk{b?T%bUgog5_La01LfdYtSw8|V7OB&`%DVeYXH_5=c6DPZ8}4#Rc8uVNFfioB zP~~bE92|W@enC&?g|gM_lV@-AbV}S+!hzGw;w2&RVS+z&LG#+0@nSl5U^Xs=Zn^9$ zM?yx)85lRud=w9UdLGg*ZQH0ZKdT1EMQF$SjS++A}1<_d0|L2Rkv} zfSCLR=F7xMueD~JP4QV=0hQu8B3Hw4np&Yy9XQ9nr|2>u=BjS}&clBPF_A|h&AQwU zW`p!x=vpfbp{vNUg^KSn9eM0MH@ssM(G02*X0rYkfWz%W21y%zro?J!-;dWpgwnrN zg^Q8r0+K(TXmcIIF$0g1P|j9u^Uk9k15t@n`1>P-O{R6X9kYWHpZk^}DQ7}t0F-ut z!?n96jU2~33vO^K7DOem;EB!eHjO{@&j83ren{sd&_JXSm_L#mdTM?OcW?bwa= z3)v=O*jatEzxyr(_O7WypKYtkMscpG+5_yKDuWwqYNU*rjfpeH*8ePD7TWy`Pnm^d(W{R~m5fct-rkJcaj zRmc=n7dtb?Y|gm%!Q}jnv=N<9-uo0jgJd_F{(}eaqR^ij26-3rZjWf*6I(<67FuF1 z^Xl5cEH}80QPGJZGyb8JUu#-1vXLfeV`THY|nsv2ms;L|+y;!S8eTi@P2#O$&Dj9EXDe6=+ka*~Fs|QiR|x<=0g^#s zj5nRv&9n<(j5@d^IW-NWFbzFESLco11GnS{4JPkdub89to6|U@ zOb=i{oAFe53?EBnkS%nYJig=bd^WvzWajDPKdm!o1}wb%aYXP+hS}heeN7H3 zR{+9TtvpMl2}0~cTrC;8umz`NBSZt*jD=Hcye}e(`jx%QI6mP{H^wcO^(iGThUmHw z%HINBp+9St-ij!(%;!)@=ND;QTKPf%fmFK5^zPiWnIsDVk@RB-iXs94c& z1FZEPFF&+YHn56>YuvkQTteOCpiT!1LxypMA8t_N_z%IM2lSL;v_U|`txdh(jRB8T zfm-6Dp0oCzS`9At7jsYch?OZ#ibqFvr^XIW_fubAy|4W&;#WrB>q(u>Mg$~eByVb? z9LLcPSpO9=<_!i~K)~-NHM`rShP8{G`XeV>3QiR&p1eXYsO5YbqUO54!qpq8t+Vgtg;<9|d_KO|yg8>>#OwyJL zoUe3u`Y=*c3E`2+Ta94@+83mUR0VRdzJzyQR0=op!@`krFwgM5q@emjq$2qXmn`t# zLxQ)lczgG!-RD9iQK5`+y=yRL9d{su0*(Hyw{Bztm!mE!hw^oI9-cMH%(p>zZ?6Nb zxNEBAD#rO21~<7A88-`pha)z06~{H5Uy%jIp`c?5>cQB|;{aup;=5SyGZyx~){xY& z^6gu<`ZbaOe>OIm_H8d1-_}and-8lnXnLeat(Mg-HRH7=W+^&8 zH}moP#lb~Z6?5*4FdYH_gDQbZGp2Qxi!5F;f~9|G7VxhG^2a!#4*4o-M!+6IT7I9! zb$HsVAvc`gc!WK*(XnF7a3r}%E~2{)q1N1>VFixy!U?LLbeUzfz^)6%ZAf$G*11(e zqdpV?kz7%%rYOsW0W;Spf07BOfq(3|MW2&n?oxhc%f;{&UCpgg_UuyZW@Lo=EZMb` zidyj~={8+l8Ylim7ZaH5?BW0jNH?OD|81(X)@|m3z4wXnMTY5~>Rh`G_4;F%Yl#u+ z``dJ+dQr5!#%$W!DjAVwzUn=vH8u*rnc_d3vK=KTN;r`3F2!d#BQ4GfK;|_~%T98V zuBpIi%Kzc1I=t)K7rm~H2ZPSKOya|Xf8aJPH0M<7$0Ixi6PZt0kf!5ZJHMC~`wJCh zh`TP3lYyR($w}M^S7g#Te+zUm68C2cdGW$*94CR*HB(0>*RBbK^;{!`j?OZeNz?^N_85&AYqP zAQJ(3#on2}8#)}$uvKn*Wa}CDW)=W0*4)>6Pov%IT3o(i(ABw=a6On0n%M4@!AkH` z*$y#x(Pp_F-?M<1l)GIJM_965h&TC6mHp(;z`d;_C_Fcrp5K4)PXC<7tToCpkCh=gXoJ->#hGvfFEw!t=SjUb&kDYiW7S~f&M7;3nkL5Oi;f(knTIx^A&rnY`dz}BFzTLS zs94WR(#U7wm1|-@J4V*LJ5r{$7<>+ie`QIXiz)<;_{~IouH@)4s%Fb$yfWQKoyis^dgg7__cKjj4F>5uDFuV&QH9+ zw}Sg=4D((u2VJS)at^PebG`X_$%~LABDlxC8^LO0v?EQC&byEOxTl$OTMcvGX~(`U z_)m@uFkZwCOSOZ#yh^pmPc$4-J;&)q>gQq{$37vzE239`ZiOvAVL_JA@O~Zi`6oak z*vSTV-=EZ=s#iTLvR~$h30NWP1I`agY@y`>4{{phE08sU!)m2LwpZPp1 zmyh7(R}qAmHVf)BW92!QN2Y775saFBS5~KJ%zsThbu=uQ0jKR7-@VhVL!X`zQ?-iS zpur+ByB2J{64KuKqZ}#AZ)1h)dg8xvU7A zq=PnRFSO3>Yh0)w;ayC1&@gumEG0RZVt9xD)COChz8q~w;ZzE@3ZCW=j~rV--ct6a zjnyVu*uF*vVwa4mEud@H4;DdlB2Z8Y_Y~;}G~R+ls{L(}ILSREEzi#BQFYGJK}O0r zc>k}naq^-FpY6!M{tdm$48^j2t-cu8eRHD1>9SWE`0W)!#4Te{YCCdr2E?eB0Ey{C_rd_8^~I@2^rVqmr*d#P3h zt(xj&8(Zk-<`G^>CQ3veks(If&ClqOq$lk|jiWbk@Sl=C@SuUxB5jK5F^sW9-gHKX z@Y}7|!Ifz6zS_}raQ0+BX!1;Y(3{H0_*u)3`4Ftep#eJn3TsLw?u>;fk~ z>B-$OvnZ2d4>h3#d>T>_e;gTTL4& zSvou)kJ$D3cjUz>0Zy?Z*Ynyr;qQ8BR<{>*TsV0KZqVk3Y7`33gRG6q8nUgq|GyE9 z8b6inR2j=61#V;(r4~V{4Op@b2je^nP^pwkyb)wLH3Fyk2b4Q6ct~9L{}I2hUzZRV8Lv#@A_P zp)KI?ca3}~wTr%cBrv$LDIzzG-90qEX589#uaJDU`xmplEjI-^6}0M-i3=|CFy2wx z`$z~&TbVKz-J-6ptypNCGd>rxnnd3p(_R8dPu@|ZU2o*^&MdeJgb2645)?x@V^1jz z#=}2dq#b=BW4w$DO_2-z^rV@fQpC&!iJ>e2|wlE`H zKr|&(>$W^7>&lOer$*2H<&dqTpJ9i=H=~ShF7d!AE(B>@O#w>A(vO+ms`kd;$Y%8= z{aQ-D_Lnd1r1M-BSzw()$*Y9}b%+(uY|_E~gH04ckaGSMhYPjI6oOPDOylikJrIOO znTP!#Z8W!6@pL$EE>ON&`fW|4qs<%9h|;@#`4JQWuVSpdQe>^KDPkBO&UShJ?dN{N`+$6|^M$79`SM8y9k^7a2NkK{s=>Z2UQOO{xLXxe ziS4%P2C=lO`dZ*8OGcGa2M>7)({athCFuqip@`07B{moI0iJn>@ZjnxSQC0S;dzH% z)k02%=WFtTSfMJ^e!4*4T4yOn_20X`NrG31vyWx`g(erHhM;T}Eh?j(7wR|v&Upsu zW9U~{-KhYQhiMx{ckI;0y#NKt>7MRg%?TsbYJ_$p5#Tm>J5EH?G^ne|9%x1)sox4TVc%h>^F%g*#fUeuWlI# zjzqSALh;@xfb0FO3_>tJqZ2AXTC7{$T8aE%Z<8v8q9A!V3+~UCsm#ihTl32(6}`8n zv$Z?vn6myh*nDzc<&fDBKK4)UJrvYa17U#Q#%%eJZZvmDAe{1>3d#^{5=Jt(6V|E} zFt-cG*7$UcA`)W}6&FG_4W`Qz#PSwMR?_Oee&|#^2s?^86h>A<0gB0bx^uFaF%e5{ zKk6`X&<@5);iX}_EW3FP=z;t--xR}Np%P<BwVW`nhQuje}=uaf1IQ?G)y4dUN@R*!S z{$KaVMUZ=uL7k76C~`XesHYFLb&2h05X(%I*O)|bXnn!sTVmnR(?seeFqB(SMXO|C z)5ms)bQ12am%1QUAN++cS(Ub%Xg?E@K9dKr0!8zhAzNui85pCv@1T?Up^F_2)2Etn zTh=z#py(I$Rq@&t0Y*s`NC>%cf~Wq@2inwUmhJK-*)97#sKJ(bOKA7j`u^u6|0Awd z5gj1Vc{q5#)9o^ctapc4%55Kl}PlELIhvk!~7%y@rsbtC>lLoloC8UMAP?*kr>h9W&CG*~IL7zYB zh!bl%V+=vs<;nV+t%@#G)VlY5R#>&ArQ zmC{&-M+T@nF0gF)9)bl$dJbHYOBvmhUI|LZU?pz~ z_w;ccEhP!sm=bB{t1kQf>goCn0*R?GH_g;W9bw;j1j-ae@JVzIC_glpFEf;-XtH5MEv!U z9>|tZ#ZKuIRrMp`a6sAS&w@3iY8kRgD85~TxO@~6{;I8h#%6E~CPZ`~+bsNGA~~|& zXnmf*>&yZV8NvJW7-H8b*>?7JW(wBax`Z&ac5kFqg1MC2%9_@NOkWSd*~Q4O2PKJn32Eqf_tz;xRq5 zibavjh*BrY%`o)JsKCXmm;ILJ1LOEY5DKT`s2y6f(q=Akl>pj9SkvQ>-ED?vKQ@1Z zT#*xSa=w$oU_E;VKX4Co0(N+*XeFX}I$Aco7+AGMOzfI@1=s%qoAE|q8|cXQ-B zjSl9pJb0kjQngRFD_@m>ZlD>_6$Tw&ojD^FonD+dGyLHy9zk?kKwSl)!H%EqfYp&h zu~l%?K6F3DRz=XBS(|<6VKpn9bs9h|S_M|a_Qq z*67$U{L0JtcO(^OFl|iM2l9I;I_J^`O#od{E-TWB2znpNieK&Jdk)+4hGvU(W=orz7P?%w1 z^=XP1slnRLk{`>?&*0PFjLK#xNGtTHjo_fr$lni7te8J$4=R>LU zvCrEs6rD$`sj8EFDLm`^#!rPJ=f9K~%lAY3s#(c}0uspSpy{eRZv}F}#B`oitT`DJ z^g3KF`%&OPo#dUw=uYiw^vA&P3@Gi0QQcw3`HguY&Rcb6apd^FYRny+94FCDF5Mu( ze{sltz`VPh7uMZhwKGc2n`6J`F3xMjSh~wfoHZmeoMEq@4y;I|^*zmI+9~IoGS$*5 zb)J0A)u*Rc^o^g=J!3AN^e1Q?)!u_QI0r%9x91?USQ7|YzDX*6G2`#CJvHDwzR=rt z!2tqPOxF^)`wmNyGY&1q$ZxIg7``~o$ifNSu4NF*~q08-vY4@O!PIV*D26?;NpRL_^x*nV?r{7|^ zyvm*E;5Wwd>{Qjj)C$MNrR{12@blaiV(g>w&mGu zz-e{M>RqjTk^lA4Fb_3+*&@y3K{Q`l>^N`iMVYMjP^(tR43Q!6uvR6(Bu4s)mh29M z90gEivNg^L`1XyxEQKR+iaGaf>G&|;&G?Ax#e(hKK14ol;_?faHmqD4C%7|n%3b6x zY+)_c$n8}u#p8JDd)#I(X5!Etq^$9g!f~x#5@mja~G$eNOI> zVStdQ{`8&%A7fU>-#s|Z+ETXe?4Am48_gL5Gs=VIbza0(kYGi*quNW|H(&(6YE6lj zvohmq$=P6BcD05+rQO|infH281OSyLE5hJQ3lwm8(ZcZ-RE%*hJA#Nho_ITxu%?6` z6~Z7_^3lfXBZLr1zTu-ihk7WX&-pocQv(%zC5S&gNQ7c+6J954%IR5KRPMm){U2yP z%-`}W#QfuUXES^%-g98A90{<<9=C<-R%4~i4B;o**1VYs$E%oARVhB=lUQ{t)M)1U zk~<1Hr1p`6BDyT^h&^B=55tSa(yxni!DJ88hQVvISi*hTDevZZ$1Md;30$E z*}*nSsU3d?>0Jye;UQPqt_{OBKwX)b04qR1Kl=aMP}jr;KlKbUH_a;l$qFDIGxyB+Z47Z3%Zi0}jO z1f`kX5{S?Jm z(2Q>jc-i}HRFt`DVf89$C27O1k%U%-d2qT^;ncS`p}oNaxTzcTh5%F*lIm?{L?p2e zw~Tz&vPfS=>5MxwEH`I2^Nk3^fwi{F`^2c8=qDPCSTl{OT2g;`Ci@A{(9FBoQKsr) z#D08yNqQ$z^R%ho1c=SPFM;$}0T~RQh=;k;CbBscov3|wDE#zyELMHAaTtE`%Br&)Fj+z%~7R*EcInJ$;6$?4U*>@_w;0V`a5%J9EwZ;x(y@F zxq_fzL^>f6zuW{^Ui@8A^93gGvc+uou=ne08K_s$3>E{*OCtF9T#YVkQ}SUbNW}-~ zJZ)QnHdHI|%)-&x$J2dPq>Z*!eq8$eal(2@ofjeIp5VEKedDLp@5~9#*{SgFugM2Y z8CEg;tV=^2Exu6y%@p1z*)e@be3S43-mC--z0lj&!5W723}fXNvn!8?9+p2jIHAYP zz4V`+Y#sJp?5qxn@-0P?cJ~;g|0$yP6E7!tvuPe|}t_zjd#L`fmlG zK}bYwMFjRueEi-lMp@wzFVr4bJ9%M-rVnft?{etXs;AfvVoJoga)HMt5uiGJl?)Dz zdgkm*ds+lXOYrbtXcqFC3OE%tWac)hP&wOnmds%g+w#hdPb_g!fjy{)Vdi~~wSTtx z<#eyNp$;9k@y-OPydIfi0J4S9|&0uNsxLHukQVwn=w<1S>vsZpk zF(a(?Mp{SrN^PDwwhAyOFk6Ad9J%GN=5MY^(!VNhIL(J~eDwYCXzF;&Na@b!0$-T2 zCA^@f9wpJ25l>^ryyaHJmTwy1h>w!WcN@T{IoE2)b&#A&5%JzimsXlVYwGXWgb(=@DC~7$<+V$rT`Z#`%8&kE@W?#oD?vv8A9GO8J?95SCTGVsu)u=J~{j? zb*E3W%d_b&Sn8xV0sR=H+ue6p{gR7&3 Unlimited ... + * + * @return ( int ) + */ + int MaxAllowedLongs() + { + return mMaxAllowedLongs; + } + + /** + * Set Max Allowed Long Signals ... + * + * @param value: Integer ... + * 0 => Unlimited ... + */ + void MaxAllowedLongs(int value) + { + // + if (value < 0) + { + value = 0; + } + + // + mMaxAllowedLongs = value; + ReConfigure(); + } + + /** + * Get Max Allowed Short Signals ... + * 0 => Unlimited ... + * + * @return ( int ) + */ + int MaxAllowedShorts() + { + return mMaxAllowedShorts; + } + + /** + * Set Max Allowed Short Signals ... + * + * @param value: Integer ... + * 0 => Unlimited ... + */ + void MaxAllowedShorts(int value) + { + // + if (value < 0) + { + value = 0; + } + + // + mMaxAllowedShorts = value; + ReConfigure(); + } + + /** + * Get Use Max Allowed Signal Types Per Symbol State ... + * + * @return ( bool ) + */ + bool UseMaxAllowedSignalsPerSymbol() + { + return mUseMaxAllowedSignalsPerSymbol; + } + + /** + * Set Use Max Allowed Signal Types Per Symbol State ... + * + * @param value: Boolean ... + */ + void UseMaxAllowedSignalsPerSymbol(bool value) + { + // + mUseMaxAllowedSignalsPerSymbol = false; + ReConfigure(); + } + + /** + * Get Last Position Profit In Points for Accept new Signal ... + * 0 => Accept All ... + * + * @return ( double ) + */ + double LastPositionProfitForAcceptNextInPoint() + { + return mLastPositionProfitForAcceptNextInPoint; + } + + /** + * Set Last Position Profit In Points for Accept new Signal ... + * + * @param value: Double ... + * 0 => Accept All ... + */ + void LastPositionProfitForAcceptNextInPoint(double value) + { + // + if (value < 0) + { + value = 0; + } + + // + mLastPositionProfitForAcceptNextInPoint = value; + ReConfigure(); + } + + /** + * Get Delay between two Signals in Bars ... + * 0 => Accept All ... + * + * @return ( int ) + */ + int DelaysBetweenTwoSignalsInBar() + { + return mDelaysBetweenTwoSignalsInBar; + } + + /** + * Set Delay between two Signals in Bars ... + * + * @param value: Integer ... + * 0 => Accept All ... + */ + void DelaysBetweenTwoSignalsInBar(int value) + { + // + if (value < 0) + { + value = 0; + } + + // + mDelaysBetweenTwoSignalsInBar = value; + ReConfigure(); + } + + /** + * Get Max Allowed Spread for Signalling ... + * 0 => Accept All ... + * + * @return ( double ) + */ + double MaxAllowedSpread() + { + return mMaxAllowedSpread; + } + + /** + * Set Max Allowed Spread for Signalling ... + * + * @param value: Double ... + * 0 => Accept All ... + */ + void MaxAllowedSpread(double value) + { + // + if (value < 0) + { + value = 0; + } + + // + mMaxAllowedSpread = value; + ReConfigure(); + } + + /** + * Get Minimum Spread Verification for Signalling ... + * 0 => Ignore ... + * + * @return ( int ) + */ + int MinRequiredVerificationForSpreadPass() + { + return mMinRequiredVerificationForSpreadPass; + } + + /** + * Set Minimum Spread Verification for Signalling ... + * + * @param value: Integer ... + * 0 => Ignore ... + */ + void MinRequiredVerificationForSpreadPass(int value) + { + // + if (value < 0) + { + value = 0; + } + + // + mMinRequiredVerificationForSpreadPass = value; + ReConfigure(); + } + + // + // Trade ... + + /** + * Get Allow Open Trade On Signals State ... + * + * @return ( bool ) + */ + bool AllowTrade() + { + return mAllowTrade; + } + + /** + * Set Allow Open Trade On Signals State ... + * + * @param value: Boolean ... + */ + void AllowTrade(bool value) + { + mAllowTrade = value; + } + + /** + * Get Enable Trade on Signals on Time ... + * + * @return ( string ) + */ + string StartTradeAt() + { + return mStartTradeAt; + } + + /** + * Set Enable Trade on Signals on Time ... + * + * @param value: String ... + */ + void StartTradeAt(string value) + { + mStartTradeAt = value; + } + + /** + * Get Enable Trade on Signals on Time ... + * + * @return ( string ) + */ + string StopTradeAt() + { + return mStopTradeAt; + } + + /** + * Set Enable Trade on Signals on Time ... + * + * @param value: String ... + */ + void StopTradeAt(string value) + { + mStopTradeAt = value; + } + + /** + * Get Enable Close All Trades on Signals on Time ... + * + * @return ( string ) + */ + string CloseAllTradesAt() + { + return mCloseAllTradesAt; + } + + /** + * Set Enable Close All Trades on Signals on Time ... + * + * @param value: String ... + */ + void CloseAllTradesAt(string value) + { + mCloseAllTradesAt = value; + } + + // + // Risk Management Props ... + + /** + * Get Risk to Reward Ratio ... + * + * @return ( double ) + */ + double R2R() + { + return mR2R; + } + + /** + * Set Risk to Reward Ratio ... + * + * @param value: Double ... + */ + void R2R(double value) + { + // + if (value < 1) + { + value = 1; + } + + // + mR2R = value; + ReConfigure(); + } + + /** + * Get Static Volume ... + * + * @return ( double ) + */ + double Volume() + { + return mVolume; + } + + /** + * Set Static Volume ... + * + * @param value: Double ... + */ + void Volume(double value) + { + // + if (value < 0.01) + { + value = 0.01; + } + + // + mVolume = value; + ReConfigure(); + } + + /** + * Get Static Balance for Calculate Trade Volume ... + * + * @return ( double ) + */ + double StaticBalance() + { + return mStaticBalance; + } + + /** + * Set Static Balance for Calculate Trade Volume ... + * + * @param value: Argument 1 + */ + void StaticBalance(double value) + { + // + if (value < 0) + { + value = 0; + } + + // + mStaticBalance = value; + } + + /** + * Get Balance Used In Each Trade ... + * + * @return ( double ) + */ + double BalancePerTrade() + { + return mBalancePerTrade; + } + + /** + * Set Balance Used In Each Trade ... + * + * @param value: Argument 1 + */ + void BalancePerTrade(double value) + { + // + if (value < 0) + { + value = 0; + } + + // + mBalancePerTrade = value; + } + + /** + * Get Risk Percent Per Balance in Each Trade ... + * + * @return ( double ) + */ + double RiskPercentPerBalance() + { + return mRiskPercentPerBalance; + } + + /** + * Set Risk Percent Per Balance in Each Trade ... + * + * @param value: Double + */ + void RiskPercentPerBalance(double value) + { + // + if (value < 0) + { + value = 0; + } + + // + mRiskPercentPerBalance = value; + ReConfigure(); + } + + /** + * Get Dynamic Risk Management State ... + * + * @return ( bool ) + */ + bool DynamicRiskManagement() + { + return mDynamicRiskManagement; + } + + /** + * Set Dynamic Risk Management State ... + * + * @param value: Boolean ... + */ + void DynamicRiskManagement(bool value) + { + // + mDynamicRiskManagement = value; + ReConfigure(); + } + + /** + * Get Use Dynamic Volume State ... + * + * @return ( bool ) + */ + bool UseDynamicVolume() + { + return mUseDynamicVolume; + } + + /** + * Set Use Dynamic Volume State ... + * + * @param value: Boolean ... + */ + void UseDynamicVolume(bool value) + { + // + mUseDynamicVolume = value; + ReConfigure(); + } + + /** + * Get Increase Volume Step ... + * + * @return ( double ) + */ + double DynamicVolumeStep() + { + return mDynamicVolumeStep; + } + + /** + * Set Increase Volume Step ... + * + * @param value: Double ... + */ + void DynamicVolumeStep(double value) + { + // + if (value < 0.01) + { + value = 0.01; + } + + // + mDynamicVolumeStep = value; + ReConfigure(); + } + + /** + * Get Balance Factor for Generate Dynamic Volume ... + * + * @return ( double ) + */ + double DynamicVolumeBalanceFactor() + { + return mDynamicVolumeBalanceFactor; + } + + /** + * Set Balance Factor for Generate Dynamic Volume ... + * + * @param value: Double ... + */ + void DynamicVolumeBalanceFactor(double value) + { + // + if (value < 0) + { + value = 0; + } + + // + mDynamicVolumeBalanceFactor = value; + ReConfigure(); + } + + /** + * Get Max Allowed Drawdown Percent for Open Trades ... + * 0 => Ignore ... + * min => 0 ... + * max => 100 ... + * + * @return ( double ) + */ + double MaxAllowedDrawdownToOpenTrades() + { + return mMaxAllowedDrawdownToOpenTrades; + } + + /** + * Set Max Allowed Drawdown Percent for Open Trades ... + * + * @param value: Double ... + * 0 => Ignore ... + * min => 0 ... + * max => 100 ... + */ + void MaxAllowedDrawdownToOpenTrades(double value) + { + // + if (value < 0) + { + value = 0; + } + + // + if (value > 50) + { + value = 50; + } + + // + mMaxAllowedDrawdownToOpenTrades = value; + ReConfigure(); + } + + /** + * Get Max Allowed SL for Pause Signalling Per Symbol ... + * 0 => Unlimited ... + * + * @return ( int ) + */ + int MaxAllowedSLToPauseSignallingPerSymbol() + { + return mMaxAllowedSLToPauseSignallingPerSymbol; + } + + /** + * Set Max Allowed SL for Pause Signalling Per Symbol ... + * + * @param value: Integer ... + * 0 => Unlimited ... + */ + void MaxAllowedSLToPauseSignallingPerSymbol(int value) + { + // + if (value < 0) + { + value = 0; + } + + // + mMaxAllowedSLToPauseSignallingPerSymbol = value; + ReConfigure(); + } + + /** + * Get Pause Signalling Per Symbol afte Max Allowed SL Reached In Seconds ... + * 0 => Ignore ... + * + * @return ( int ) + */ + int PauseSignallingAfterReachesMaxAllowedSLInSecconds() + { + return mPauseSignallingAfterReachesMaxAllowedSLInSecconds; + } + + /** + * Set Pause Signalling Per Symbol afte Max Allowed SL Reached In Seconds ... + * + * @param value: Integer ... + * 0 => Ignore ... + */ + void PauseSignallingAfterReachesMaxAllowedSLInSecconds(int value) + { + // + if (value < 0) + { + value = 0; + } + + // + mPauseSignallingAfterReachesMaxAllowedSLInSecconds = value; + ReConfigure(); + } + + // + // Protection Props ... + + /** + * Get Allow Hedge Positions State ... + * + * @return ( bool ) + */ + bool AllowHedging() + { + return mAllowHedging; + } + + /** + * Set Allow Hedge Positions State ... + * + * @param value: Boolean ... + */ + void AllowHedging(bool value) + { + // + mAllowHedging = value; + ReConfigure(); + } + + /** + * Get Minimum Open Positions for Hedging ... + * 0 => Ignore ... + * + * @return ( int ) + */ + int MinOpenTradesFroHedging() + { + return mMinOpenTradesFroHedging; + } + + /** + * Set Minimum Open Positions for Hedging ... + * + * @param value: Integer ... + * 0 => Ignore ... + */ + void MinOpenTradesFroHedging(int value) + { + // + if (value < 0) + { + value = 0; + } + + // + mMinOpenTradesFroHedging = value; + ReConfigure(); + } + + /** + * Get Minimum Volume Step for Hedging ... + * 0 => Ignore ... + * + * @return ( double ) + */ + double HedgingMinVolumeStep() + { + return mHedgingMinVolumeStep; + } + + /** + * Set Minimum Volume Step for Hedging ... + * + * @param value: Double ... + * 0 => Ignore ... + */ + void HedgingMinVolumeStep(double value) + { + // + if (value < 0) + { + value = 0; + } + + // + if (value > 0 && value < 0.01) + { + value = 0.01; + } + + // + if (value > 0 && value > 0.1) + { + value = 0.1; + } + + // + mHedgingMinVolumeStep = value; + ReConfigure(); + } + + /** + * Get Minimum Required Profit Per Volume Step for Hedging ... + * 0 => Ignore ... + * + * @return ( double ) + */ + double HedgeingMinRequiredProfitPerVolumeStep() + { + return mHedgeingMinRequiredProfitPerVolumeStep; + } + + /** + * Set Minimum Required Profit Per Volume Step for Hedging ... + * + * @param value: Double ... + * 0 => Ignore ... + */ + void HedgeingMinRequiredProfitPerVolumeStep(double value) + { + // + if (value < 0) + { + value = 0; + } + + // + mHedgeingMinRequiredProfitPerVolumeStep = value; + ReConfigure(); + } + + // + // Actions ... + + /** + * Handle OnSignalRecieved Event ... + * + * @param signal: XSignal instance ... + * @param conditions: X121SMCStrategyConditions instance ... + */ + void HandleOnSignalRecieved( + XSignal &signal, + X121SMCStrategyConditions &conditions // + ) + { + // + // Check Signal and Conditions Validations ... + + // + if (!signal.IsValid()) + { + return; + } + + // + if (!conditions.IsValid()) + { + return; + } + + // + bool isLong = IsLong(signal.type); + + // + // Notify When a Raw (Unfiltered) Signal Recieved + // if it's Provided ... + bool mAlertRawSignals = false; + if (mAlertRawSignals) + { + // + string msg = "Raw " + (IsLong(signal.type) ? "Long" : "Short") + + " Signal Recieved: (" + signal.provider + "," + + signal.symbol + "," + + ToString(signal.period) + + ") ..."; + + // + Alert(msg); + } + + // + // Apply Volume On Signal ... + ApplyVolumeOnSignal(signal); + + // + // Chekc Signalling Enable or not ... + bool canContinue = + isLong + ? AllowLong() + : AllowShort(); + if (!canContinue) + { + return; + } + + // + // TODO: Apply Filtering On Signal ... + bool isFiltered = false; + if (isFiltered) + { + // + mTradeHandler.Remove(signal); + return; + } + + // + // Attach Conditions Summary to Signal ... + string conditionsSummary = conditions.GenerateSummary( + false, + false, + true, + false // + ); + + // + // TODO: Retrieve Conditions Summary based on Filter ... + signal.conditions = conditionsSummary; + + // + datetime currentTime = TimeCurrent(); + + // + // Chack Allow Trades ... + bool allowTrade = AllowTrade(); + if (allowTrade) + { + // + string startTime = StartTradeAt(); + string endTime = StopTradeAt(); + bool isTimePassed = IsTimeInRange( + TimeCurrent(), + startTime, + endTime // + ); + + // + if (isTimePassed) + { + // + // Execute Signal Using Trade Handler ... + ENUM_X_SIGNAL_EXECUTION_RESULT state; + bool isExecuted = mTradeHandler.ExecuteSignal( + signal, + conditions, + state, + false // ignore Policies ... + ); + } + else + { + // + string msg = "Failed To Execute " + + (IsLong(signal.type) + ? "Long" + : "Short") + + " Signal Recieved: (" + + signal.provider + "," + + signal.symbol + "," + + ToString(signal.period) + + ") due Trading offTime ..."; + + // + Alert(msg); + } + } + else + { + // + // Only Alert Signals ... + string msg = (IsLong(signal.type) + ? "Long" + : "Short") + + " Signal Recieved: (" + + signal.provider + "," + + signal.symbol + "," + + ToString(signal.period) + + ") ..."; + + // + Alert(msg); + } + + // + signal.Clean(); + conditions.Clean(); + } + + // + // Override Actions ... + + /** + * Apply Default Configurations ... + */ + void DefaultConfigure() override + { + // + // Commons ... + Slippage(10); + TagPrefix(""); + MagicNumber(1694056); + + // + // Symbol ... + SetSymbol(_Symbol); + SetPeriod(_Period); + MultiSymbol(false); + Symbols("EURUSDb,GBPUSDb,USDJPYb,USDCHFb,DowJones30,XAUUSDb"); + + // + // Signalling ... + Disabled(false); + AllowLong(true); + AllowShort(true); + + // + string tag = GetTag(); + + // + // Alert ... + SetAlertPrefix(tag); + SetAlertLogAlerts(true); + SetAlertPushAlerts(true); + SetAlertMailAlerts(false); + SetAlertEnableAlerts(true); + SetAlertTerminalAlerts(false); + + // + // Reports ... + ReportNewDays(true); + ReportNewWeeks(false); + ReportNewHours(false); + ReportNewMonths(false); + + // + R2R(1); + + // + // Volume Default Configurations ... + Volume(0.01); + UseDynamicVolume(false); + DynamicVolumeStep(0.01); + DynamicVolumeBalanceFactor(200); + + // + RiskPercentPerBalance(0); + DynamicRiskManagement(false); + } + + /** + * Vaslidate Inputs ... + * + * @return ( bool ) + */ + bool ValidateInputs() override + { + // + bool result = false; + + // + string errMessage = ""; + + // + bool isCommonValid = ( + // + Slippage() > 0 && + MagicNumber() > 0 + // + ); + if (!isCommonValid) + { + // + errMessage += "common configurations error;" + "\n"; + } + + // + // Checking Volume ... + bool isVolumeValid = true; + if (UseDynamicVolume()) + { + // + isVolumeValid = + DynamicVolumeStep() > 0 && + DynamicVolumeBalanceFactor() > 0; + if (!isVolumeValid) + { + errMessage += "Dynamic Volume configurations error;" + "\n"; + } + } + isVolumeValid = isVolumeValid && + Volume() > 0; + if (!isVolumeValid) + { + errMessage += "Static Volume configurations error;" + "\n"; + } + + // + result = + // + // Common ... + isCommonValid && + // + // Volume Coniguration ... + isVolumeValid && + // + // Otere ... + true + // + ; + + // + if (!result) + { + // + // Since here Logger not Initiallized, we Use Raw Print Command ... + errMessage = " Errors: \n" + errMessage; + Alert(errMessage); + } + + // + return result; + } + + // + // Initializers and DeInitializers ... + + /** + * Initial EA Requirements ... + * + * @return ( bool ) + */ + bool InitEA() override + { + // + bool result = true; + + // + // Initialize Indicator Helpers ... + + // + X121XCCInputs xccInputs; + xccInputs.Default(); + xccHelper = new XCX121XCCHelper(); + result = xccHelper.Init( + _Symbol, + _Period, + xccInputs // + ); + if (!result) + { + return result; + } + + // + X121XCTInputs xctInputs; + xctInputs.Default(); + xctHelper = new XCX121XCTHelper(); + result = xctHelper.Init( + _Symbol, + _Period, + xctInputs // + ); + if (!result) + { + return result; + } + + // + // Configure Alerts ... + SetAlertPrefix(GetTag()); + SetAlertEnableAlerts(GetAlertEnableAlerts()); + SetAlertLogAlerts(GetAlertLogAlerts()); + SetAlertMailAlerts(GetAlertMailAlerts()); + SetAlertPushAlerts(GetAlertPushAlerts()); + SetAlertTerminalAlerts(GetAlertTerminalAlerts()); + + // + // Create Trader Instance and Configure it ... + mTrader = new XCTrade( + Slippage(), + MagicNumber() // + ); + mTrader.AddOnStopLossEventHandler(OnPositionSLEventListener); + mTrader.AddOnTakeProfitEventHandler(OnPositionTPEventListener); + mTrader.AddOnDealsChangedEventHandler(OnDealsChangedEventListener); + mTrader.AddOnOrdersChangedEventHandler(OnOrdersChangedEventListener); + mTrader.AddOnModifyPositionEventHandler(OnPositionModifiedEventListener); + mTrader.AddOnPositionsChangedEventHandler(OnPositionsChangedEventListener); + mTrader.AddOnForceClosePositionEventHandler(OnPositionForceCloseEventListener); + mTrader.AddOnPartialClosePositionEventHandler(OnPositionPartialCloseEventListener); + + // + // Initialize Trade Handler ... + mTradeHandler = new XC121SMCTradeHandler(mTrader); + mTradeHandler.SaveTrades(false); + mTradeHandler.SaveSignals(false); + mTradeHandler.SaveConditions(false); + + // + ReConfigureTradeHandler(); + + // + // Parsers ... + XSymbolParser _symbolParser; + + // + // Single Symbol ... + if (!MultiSymbol()) + { + // + // Register Strategy ... + + // + // Create Class Instance ... + XCX121SMCBaseStrategy *iX121SMCStrategy; + iX121SMCStrategy = new XCX121SMCStrategy( + _Symbol, + _Period // + ); + + // + iX121SMCStrategy.AddXSignalEventHandler(OnSignalEventListener); + + // + ConfigureStrategy(iX121SMCStrategy); + RegisterStrategy(iX121SMCStrategy); + } + // + // Multi Symbol ... + else + { + // + // Parse Symbols ... + string symbols[]; + int symbolsCount = SplitContent( + symbols, + Symbols() // + ); + result = IsValidSize(symbolsCount); + if (!result) + { + return result; + } + + // + for (int i = 0; i < symbolsCount; i++) + { + // + // Select Symbol ... + string iSymbol = symbols[i]; + + // + // Register Strategy Based On Symbol ... + + // + // Parse Symbol ... + bool isEURUSD = _symbolParser.IsEURUSD(_Symbol); + bool isGBPUSD = _symbolParser.IsGBPUSD(_Symbol); + bool isEURGBP = _symbolParser.IsEURGBP(_Symbol); + bool isUSDCHF = _symbolParser.IsUSDCHF(_Symbol); + bool isEURCHF = _symbolParser.IsEURCHF(_Symbol); + bool isUSDJPY = _symbolParser.IsUSDJPY(_Symbol); + bool isEURJPY = _symbolParser.IsEURJPY(_Symbol); + bool isUSDCAD = _symbolParser.IsUSDCAD(_Symbol); + bool isEURCAD = _symbolParser.IsEURCAD(_Symbol); + bool isAUDUSD = _symbolParser.IsAUDUSD(_Symbol); + bool isEURAUD = _symbolParser.IsEURAUD(_Symbol); + bool isNZDUSD = _symbolParser.IsNZDUSD(_Symbol); + bool isEURNZD = _symbolParser.IsEURNZD(_Symbol); + + // + // Check Symbol Can Register or not ... + bool canRegisterStrategy = true; + + // + if (canRegisterStrategy) + { + // + // Create Class Instance ... + XCX121SMCBaseStrategy *iX121SMCStrategy; + iX121SMCStrategy = new XCX121SMCStrategy( + iSymbol, + _Period // + ); + + // + iX121SMCStrategy.AddXSignalEventHandler(OnSignalEventListener); + + // + // Register Strategy ... + ConfigureStrategy(iX121SMCStrategy); + RegisterStrategy(iX121SMCStrategy); + } + } + + // + Clean(symbols); + } + + // + return result; + } + + /** + * Destroy all Initialized EA Requirements ... + */ + void DestroyEA() override + { + // + ZeroMemory(xccHelper); + ZeroMemory(xctHelper); + ZeroMemory(mTradeHandler); + + // + delete xccHelper; + delete xctHelper; + delete mTradeHandler; + + // + Clean(mStrategies); + } + + /** + * Call all Registered Strategies On Tick ... + */ + void HandleStrategiesOnTick() override + { + // + // Check Force Close ... + string forceCloseTimeStr = CloseAllTradesAt(); + if (IsValid(forceCloseTimeStr)) + { + // + datetime forceCloseTime = ParseDateTimeFromTimeString(forceCloseTimeStr); + bool canForceClose = IsTimeInRange( + TimeCurrent(), + forceCloseTime // + ) && + !mIsForceCloseAtTime; + if (canForceClose) + { + mIsForceCloseAtTime = mTradeHandler.ForceClose(); + } + } + + // + // Update Positions Data ... + mTradeHandler.UpdateData(); + + // + // Protect Positions ... + mTradeHandler.HandleProtection(); + + // + int count = ArraySize(mStrategies); + if (!IsValidSize(count)) + { + return; + } + + // + for (int i = 0; i < count; i++) + { + // + // Call Tick Handler Function ... + mStrategies[i].HandleTick(); + } + } + + /** + * Handle Strategies Guards ... + */ + void HandleStrategiesGuard() override + { + // + int count = ArraySize(mStrategies); + if (!IsValidSize(count)) + { + return; + } + + // + XPosition positions[]; + int positionsCount = mTrader.GetPositions( + positions, // Result ... + NULL, // Symbol ... + NULL, // Provider ... + NULL, // Period ... + X_POSITION_TYPE_ALL // All Types ... + ); + if (!IsValidSize(positionsCount)) + { + return; + } + + // + for (int i = 0; i < count; i++) + { + // + // Call Tick Handler Function ... + X121SMCGuard iGuards[]; + bool hasGuards = mStrategies[i].HandleGuard( + iGuards, + positions // + ); + if (hasGuards) + { + HandleGuards(iGuards); + } + } + + // + Clean(positions); + } + + // + // Event Handlers ... + + /** + * Calls When a Deals Changed Triggered ... + * + * @param count: Integer, Number of Changes ... + */ + void HandleOnDealsChanged(int count) override + { + } + + /** + * Calls When a Order Changed Triggered ... + * + * @param count: Integer, Number of Changes ... + */ + void HandleOnOrdersChanged(int count) override + { + } + + /** + * Calls When a Positions Changed Triggered ... + * + * @param count: Integer, Number of Changes ... + */ + void HandleOnPositionsChanged(int count) override + { + // + if (IsValidSize(count)) + { + mTradeHandler.HandleNewPosition(); + } + } + + /** + * Calls When a Position's SL Triggered ... + * + * @param deal: XDeal instance ... + */ + void HandleOnStopLossTriggered(const XDeal &deal) override + { + // + // Finish ... + mTradeHandler.Finish(deal); + + // + HandleReportBalance(); + } + + /** + * Calls When a Position's TP Triggered ... + * + * @param deal: XDeal instance ... + */ + void HandleOnTakeProfitTriggered(const XDeal &deal) override + { + // + // Finish ... + mTradeHandler.Finish(deal); + + // + bool useDynamicRiskManagement = DynamicRiskManagement(); + if (useDynamicRiskManagement) + { + mTradeHandler.ResetSymbolInfo(deal.symbol); + } + + // + HandleReportBalance(); + } + + /** + * Handle Force Close a Position ... + * + * @param ticket: Position Ticket ... + * @param position: XPosition ... + * @param comment: Closing Comment ... + */ + void HandleOnPositionForceClosed( + const ulong ticket, + const XPosition &position, + const string comment // + ) override + { + // + // Finish ... + mTradeHandler.Finish( + ticket, + position, + comment // + ); + + // + HandleReportBalance(); + } + + /** + * Reset All Paused Symbols on Each New Days ... + */ + void HandleOnNewDay() override + { + // + mIsForceCloseAtTime = false; + mTradeHandler.ResumePausedSymbols(); + } + + /** + * Re Configure Materials on Properties Changed ... + */ + void ReConfigure() override + { + // + ReConfigureTradeHandler(); + ReConfigureAllStrategies(); + } + + /** + * Generate Identifier Tag ... + * + * @return ( string ) + */ + string GetTag() override + { + // + string result = NULL; + + // + string tagPrefix = TagPrefix(); + if (IsValid(tagPrefix)) + { + result = tagPrefix; + } + else + { + result = ""; + } + + // + result = + XC121SMCExpertToken + result; + + // + return result; + } + + // + protected: + // + + // + // Props ... + + // + XC121SMCTradeHandler *mTradeHandler; // Trade Handler ... + XCX121SMCBaseStrategy *mStrategies[]; // Registere Strategies in EA ... + + // + // Actions ... + + /** + * Apply Volume Based On Configurations on Signal ... + * + * @param signal: XSignal instance + */ + void ApplyVolumeOnSignal(XSignal &signal) + { + // + if (signal.ignoreEAVolume) + { + return; + } + + // + double staticVolume = Volume(); + double fVolume = staticVolume > 0 + ? staticVolume + : 0.01; + + // + double staticBalance = StaticBalance(); + double accountBalance = mTrader.mAccount.GetBalance(); + double balance = staticBalance > 0 + ? staticBalance + : accountBalance; + + // + bool useDynamicVolume = UseDynamicVolume(); + double balancePerTrade = BalancePerTrade(); + double dynamicVolumeStep = DynamicVolumeStep(); + double riskPercentPerBalance = RiskPercentPerBalance(); + bool allowDynamicRiskManagement = DynamicRiskManagement(); + double dynamicVolumeBalanceFactor = DynamicVolumeBalanceFactor(); + + // + // Apply Static Volume ... + bool allowStaticVolume = staticVolume > 0; + + // + // Apply Dynamic Volume ... + bool aloowApplyDynamicVolume = useDynamicVolume && + dynamicVolumeStep && + dynamicVolumeBalanceFactor; + + // + // Apply Risk Per Trade Volume ... + bool allowApplyRiskPerTradeVolume = + !aloowApplyDynamicVolume && + riskPercentPerBalance > 0; + + // + // Apply Balance Per Trade Volume ... + bool allowApplyBalacePerTradeVolume = + !aloowApplyDynamicVolume && + !allowApplyRiskPerTradeVolume && + balancePerTrade > 0; + + // + // First Check Dynamic Volume ... + if (aloowApplyDynamicVolume) + { + // + // Dynamic Volume ... + double dVolume = mTrader.GetDynamicVolume( + signal.symbol, + dynamicVolumeBalanceFactor, + dynamicVolumeStep // + ); + if (dVolume < fVolume) + { + dVolume = fVolume; + } + + // + signal.volume = dVolume; + } + else if (allowApplyRiskPerTradeVolume) + { + // + double riskAmountPerBalance = (riskPercentPerBalance * balance) / 100; + + // + double risk = signal.GetRisk(); + double points = GetPoints(signal.symbol); + double riskInPoints = risk / points; + + // + double volume = mTrader.mAccount.CalculateVolume( + signal.symbol, + riskAmountPerBalance, + riskInPoints // + ); + if (volume <= 0) + { + volume = fVolume; + } + + // + // Check Dynamic Risk Management ... + bool allowDynamicRiskManagement = DynamicRiskManagement(); + if (allowDynamicRiskManagement) + { + // + // Calculate Dynamic Additional Risk Management Volume Multiplier ... + double mAdditionalRiskMultiplier = CalculateAdditionalVolumeMultiplier(signal); + if (mAdditionalRiskMultiplier < 1) + { + mAdditionalRiskMultiplier = 1; + } + + // + volume *= mAdditionalRiskMultiplier; + } + + // + signal.volume = volume; + } + else if (allowApplyBalacePerTradeVolume) + { + // + double risk = signal.GetRisk(); + double points = GetPoints(signal.symbol); + double riskInPoints = risk / points; + + // + double volume = mTrader.mAccount.CalculateVolume( + signal.symbol, + balancePerTrade, + riskInPoints // + ); + if (volume <= 0) + { + volume = fVolume; + } + + // + signal.volume = volume; + } + else if (allowStaticVolume) + { + signal.volume = staticVolume; + } + else + { + signal.volume = fVolume; + } + + // + // Normalize Signal Volume ... + signal.volume = NormalizeVolume( + signal.volume, + signal.symbol // + ); + } + + /** + * Configure Startegy ... + */ + void ConfigureStrategy(XCX121SMCBaseStrategy *&strategy) + { + // + if (strategy == NULL) + { + return; + } + + // + // Configure Alerts ... + strategy.SetAlertPrefix(GetTag()); + strategy.SetAlertLogAlerts(GetAlertLogAlerts()); + strategy.SetAlertMailAlerts(GetAlertMailAlerts()); + strategy.SetAlertPushAlerts(GetAlertPushAlerts()); + strategy.SetAlertEnableAlerts(GetAlertEnableAlerts()); + strategy.SetAlertTerminalAlerts(GetAlertTerminalAlerts()); + + // + // Confiugre Signalling ... + + // + strategy.R2R(R2R()); + strategy.AllowLong(AllowLong()); + strategy.AllowShort(AllowShort()); + strategy.MaxAllowedSpread(20); + // strategy.MaxAllowedSaveTicks(150); + // strategy.MinRequiredTicksForSpreadPass(100); + + // + if (Disabled()) + { + strategy.Disable(); + } + else + { + strategy.Enable(); + } + + // + } + + /** + * Register an Strategy in EA ... + * + * @param strategy: XCX121SMCBaseStrategy instance ... + */ + void RegisterStrategy(XCX121SMCBaseStrategy *strategy) + { + // + if (strategy == NULL) + { + return; + } + + // + ArrayResize( + mStrategies, + ArraySize(mStrategies) + 1 // + ); + + // + mStrategies[ArraySize(mStrategies) - 1] = strategy; + } + + /** + * Re Configure All Registered Strategies ... + */ + void ReConfigureAllStrategies() + { + // + int count = ArraySize(mStrategies); + if (!IsValidSize(count)) + { + return; + } + + // + for (int i = 0; i < count; i++) + { + // + ConfigureStrategy(mStrategies[i]); + } + } + + /** + * Re Configure Trade Handler ... + */ + void ReConfigureTradeHandler() + { + // + if (mTradeHandler == NULL) + { + return; + } + + // + // Configure Alerts ... + mTradeHandler.SetAlertPrefix(GetTag()); + mTradeHandler.SetAlertEnableAlerts(GetAlertEnableAlerts()); + mTradeHandler.SetAlertLogAlerts(GetAlertLogAlerts()); + mTradeHandler.SetAlertMailAlerts(GetAlertMailAlerts()); + mTradeHandler.SetAlertPushAlerts(GetAlertPushAlerts()); + mTradeHandler.SetAlertTerminalAlerts(GetAlertTerminalAlerts()); + + // + mTradeHandler.AllowLong(AllowLong()); + mTradeHandler.AllowShort(AllowShort()); + mTradeHandler.MaxAllowedLongs(MaxAllowedLongs()); + mTradeHandler.MaxAllowedShorts(MaxAllowedShorts()); + mTradeHandler.UseMaxAllowedSignalsPerSymbol(UseMaxAllowedSignalsPerSymbol()); + mTradeHandler.LastPositionProfitForAcceptNextInPoint(LastPositionProfitForAcceptNextInPoint()); + mTradeHandler.DelaysBetweenTwoSignalsInBar(DelaysBetweenTwoSignalsInBar()); + mTradeHandler.MaxAllowedSpread(MaxAllowedSpread()); + mTradeHandler.MaxAllowedDrawdownToOpenTrades(MaxAllowedDrawdownToOpenTrades()); + mTradeHandler.MaxAllowedSLToPauseSignallingPerSymbol(MaxAllowedSLToPauseSignallingPerSymbol()); + mTradeHandler.PauseSignallingAfterReachesMaxAllowedSLInSecconds(PauseSignallingAfterReachesMaxAllowedSLInSecconds()); + mTradeHandler.AllowHedging(AllowHedging()); + mTradeHandler.MinOpenTradesFroHedging(MinOpenTradesFroHedging()); + mTradeHandler.HedgingMinVolumeStep(HedgingMinVolumeStep()); + mTradeHandler.HedgeingMinRequiredProfitPerVolumeStep(HedgeingMinRequiredProfitPerVolumeStep()); + } + + // + private: + // + + // + // Props ... + + // + // Signalling Props ... + bool mAllowLong; // Allow Long Signals ... + bool mAllowShort; // Allow Short Signals ... + int mMaxAllowedLongs; // Max Allowed Long Signals ... + int mMaxAllowedShorts; // Max Allowed Short Signals ... + bool mUseMaxAllowedSignalsPerSymbol; // Use Max Allowed Signal Types Per Symbol ... + double mLastPositionProfitForAcceptNextInPoint; // Last Position Profit In Points for Accept new Signal ... + int mDelaysBetweenTwoSignalsInBar; // Delay between two Signals in Bars ... + double mMaxAllowedSpread; // Max Allowed Spread for Signalling ... + int mMinRequiredVerificationForSpreadPass; // Minimum Spread Verification for Signalling ... + + // + // Trade ... + bool mAllowTrade; // Allow Open Trade On Signals ... + string mStartTradeAt; // Enable Trade on Signals on Time ... + string mStopTradeAt; // Enable Trade on Signals on Time ... + string mCloseAllTradesAt; // Enable Close All Trades on Signals on Time ... + + // + bool mIsForceCloseAtTime; + + // + // Risk Management Props ... + double mR2R; // Signallers Risk to Reward Ratio ... + double mVolume; // Static Volume ... + double mStaticBalance; // Static Balance for Calculate Trade Volume ... + double mBalancePerTrade; // Balance Used in Each Trade ... + double mRiskPercentPerBalance; // Risk Percent Per Balance in Each Trade ... + bool mDynamicRiskManagement; // Dynamic Risk Management ... + bool mUseDynamicVolume; // Use Dynamic Volume ... + double mDynamicVolumeStep; // Increase Volume Step ... + double mDynamicVolumeBalanceFactor; // Balance Factor for Generate Dynamic Volume ... + double mMaxAllowedDrawdownToOpenTrades; // Max Allowed Drawdown for Open Trades ... + int mMaxAllowedSLToPauseSignallingPerSymbol; // Max Allowed SL for Pause Signalling Per Symbol ... + int mPauseSignallingAfterReachesMaxAllowedSLInSecconds; // Pause Signalling Per Symbol afte Max Allowed SL Reached In Seconds ... + + // + // Protection Props ... + bool mAllowHedging; // Allow Hedge Positions ... + int mMinOpenTradesFroHedging; // Minimum Open Positions for Hedging ... + double mHedgingMinVolumeStep; // Minimum Volume Step for Hedging ... + double mHedgeingMinRequiredProfitPerVolumeStep; // Minimum Required Profit Per Volume Step for Hedging ... + + // + double CalculateAdditionalVolumeMultiplier(XSignal &signal) + { + // + double result = 0; + + // + if (!signal.IsValid()) + { + return result; + } + + // + X121SMCSymbolPositionInfo info; + bool hasInfo = mTradeHandler.GetSymbolInfo( + signal.symbol, + info // + ); + if (!hasInfo) + { + return result; + } + + // + if (info.countedSLs >= 2) + { + result = (info.countedSLs / 2) + 1; + } + + // + return result; + } + + /** + * Handle Guard Actions ... + * + * @param guards: X121SMCGuard instance Collection ... + */ + void HandleGuards(X121SMCGuard &guards[]) + { + // + int count = ArraySize(guards); + if (!IsValidSize(guards)) + { + return; + } + + // + for (int i = 0; i < count; i++) + { + // + X121SMCGuard iGuard = guards[i]; + + // + if (!iGuard.IsValid()) + { + continue; + } + + // + // Here we Have to Handle Guard Actions ... + + // + // Close ... + bool canClose = + NotEmpty(iGuard.ticket) && + iGuard.action == X_121_SMC_GUARD_ACTION_CLOSE; + + // + // Close All ... + bool canCloseAll = iGuard.action == X_121_SMC_GUARD_ACTION_CLOSE_ALL; + + // + // Close Longs ... + bool canCloseLongs = iGuard.action == X_121_SMC_GUARD_ACTION_CLOSE_LONGS; + + // + // Close Shorts ... + bool canCloseShorts = iGuard.action == X_121_SMC_GUARD_ACTION_CLOSE_SHORTS; + + // + // Partial Close ... + bool canPartialClose = + NotEmpty(iGuard.ticket) && + iGuard.volumeMultiplier > 0 && + iGuard.action == X_121_SMC_GUARD_ACTION_PARTIAL_CLOSE; + + // + // Trail Stop ... + bool canTrailStop = + iGuard.sl > 0 && + NotEmpty(iGuard.ticket) && + iGuard.action == X_121_SMC_GUARD_ACTION_TRAIL_STOP; + + // + // Trail Target ... + bool canTrailTarget = + iGuard.tp > 0 && + NotEmpty(iGuard.ticket) && + iGuard.action == X_121_SMC_GUARD_ACTION_TRAIL_TARGET; + + // + // Hedge ... + bool canHedge = iGuard.action == X_121_SMC_GUARD_ACTION_HEDGE; + + // + // Check is Guard Valid ... + bool isValidGuardAction = + canHedge || + canClose || + canCloseAll || + canTrailStop || + canCloseLongs || + canTrailTarget || + canCloseShorts || + canPartialClose; + if (!isValidGuardAction) + { + continue; + } + + // + // Now we Sure to Have a Valid Guard ... + // Start to o Guard Actions ... + + // + // Close All ... + if (canCloseAll) + { + // + XPosition positions[]; + int positionsCount = + mTrader + .GetPositions( + positions, // Result ... + iGuard.symbol, + iGuard.provider, + NULL, // Period ... + X_POSITION_TYPE_ALL, // All Types ... + true // Filter by Magic ... + ); + if (IsValidSize(positionsCount)) + { + // + string comment = "Guard Close All ..."; + string message = "Guard Close All (" + ToString(positionsCount) + ") Positions Successfully ..."; + int forceClosed = mTradeHandler.ForceClose( + positions, + comment, + message // + ); + + // + if (forceClosed) + { + RestEA(120 * 60); + } + } + } + + // + // Close Longs ... + if (canCloseLongs) + { + // + XPosition longPositions[]; + XPosition shortPositions[]; + mTrader + .GetPositions( + longPositions, // Result ... + shortPositions, // Result ... + iGuard.symbol, + iGuard.provider, + NULL, // Period ... + true // Filter by Magic ... + ); + + // + int longPositionsCount = ArraySize(longPositions); + bool hasLongPositions = IsValidSize(longPositionsCount); + + // + int shortPositionsCount = ArraySize(shortPositions); + bool hasShortPositions = IsValidSize(shortPositionsCount); + + // + if (hasLongPositions) + { + // + string comment = "Guard Close Longs ..."; + string message = "Guard Close (" + ToString(longPositionsCount) + ") Long Positions Successfully ..."; + bool isClosed = mTradeHandler.ForceClose( + longPositions, + comment, + message // + ); + + // + if (isClosed) + { + RestEA(120 * 60); + } + } + } + + // + // Close Shorts ... + if (canCloseShorts) + { + // + XPosition longPositions[]; + XPosition shortPositions[]; + mTrader + .GetPositions( + longPositions, // Result ... + shortPositions, // Result ... + iGuard.symbol, + iGuard.provider, + NULL, // Period ... + true // Filter by Magic ... + ); + + // + int longPositionsCount = ArraySize(longPositions); + bool hasLongPositions = IsValidSize(longPositionsCount); + + // + int shortPositionsCount = ArraySize(shortPositions); + bool hasShortPositions = IsValidSize(shortPositionsCount); + + // + if (hasShortPositions) + { + // + string comment = "Guard Close Shorts ..."; + string message = "Guard Close (" + ToString(shortPositionsCount) + ") Short Positions Successfully ..."; + bool isClosed = mTradeHandler.ForceClose( + shortPositions, + comment, + message // + ); + + // + if (isClosed) + { + RestEA(120 * 60); + } + } + } + + // + // Close ... + if (canClose) + { + // + XPosition iPosition; + bool hasPosition = mTrader.GetPosition( + iGuard.ticket, + iPosition // + ); + + // + bool isLong = IsLong(iPosition.type); + + // + if (hasPosition) + { + // + XPosition positions[]; + AddRef( + iPosition, + positions // + ); + + // + string comment = "Guard Close ..."; + string message = "Guard Close " + (isLong ? "Long" : "Short") + " Position: (" + ToString(iGuard.ticket) + ") Successfully ..."; + bool isClosed = mTradeHandler.ForceClose( + positions, + comment, + message // + ); + + // + if (isClosed) + { + RestEA(120 * 60); + } + } + } + + // + // Partial Close ... + if (canPartialClose) + { + // + XPosition iPosition; + bool hasPosition = mTrader.GetPosition( + iGuard.ticket, + iPosition // + ); + + // + bool isLong = IsLong(iPosition.type); + + // + if (hasPosition) + { + // + // Normalize Volume Multiplier ... + double vMult = iGuard.volumeMultiplier; + if (vMult > 0.5) + { + vMult = 0.5; + } + if (vMult < 0) + { + vMult = 0.5; + } + + // + // Calculate and Normalize Volume ... + double volume = iPosition.volume * iGuard.volumeMultiplier; + volume = NormalizeVolume( + volume, + iPosition.symbol // + ); + + // + string comment = "Guard Partially Closed: " + ToString(volume) + " ..."; + string message = "Guard Partially Closed " + (isLong ? "Long" : "Short") + ": " + ToString(volume) + " Successfully ..."; + bool isModified = mTrader.ClosePartial( + iPosition.ticket, + volume, + comment // + ); + if (isModified) + { + // + mTradeHandler.Alert(message); + + // + if (volume == iPosition.volume) + { + // + mTradeHandler.Finish( + iPosition.ticket, + iPosition, + comment // + ); + + // + RestEA(120 * 60); + } + } + } + } + + // + // Hedge ... + if (canHedge) + { + // + XPosition positions[]; + int positionsCount = + mTrader + .GetPositions( + positions, // Result ... + iGuard.symbol, + iGuard.provider, + NULL, // Period ... + X_POSITION_TYPE_ALL, // All Types ... + true // Filter by Magic ... + ); + if (IsValidSize(positionsCount)) + { + // + int longs = 0; + double longProfits = 0; + double longVolumes = 0; + + // + int shorts = 0; + double shortProfits = 0; + double shortVolumes = 0; + CountPositions( + positions, + longs, + longProfits, + longVolumes, + shorts, + shortProfits, + shortVolumes // + ); + + // + int count = longs + shorts; + double profits = longProfits + shortProfits; + double volumes = longVolumes + shortVolumes; + + // + bool canDoHedge = + count > 0 && + profits > 0 && + volumes > 0; + if (canDoHedge) + { + // + string comment = "Guard Hedge ..."; + string message = "Guard Hedge (" + ToString(count) + ") Positions by: (" + ToString(profits) + ") Successfully ..."; + bool isClosed = mTradeHandler.ForceClose( + positions, + comment, + message // + ); + + // + if (isClosed) + { + RestEA(120 * 60); + } + } + } + } + + // + // Trail Stop ... + if (canTrailStop) + { + // + XPosition iPosition; + bool hasPosition = mTrader.GetPosition( + iGuard.ticket, + iPosition // + ); + + // + bool isLong = IsLong(iPosition.type); + + // + bool canDoTrail = + hasPosition && + iPosition.profit > 0 && + isLong + ? iPosition.price > iGuard.sl && + (iPosition.sl == 0 || + iPosition.sl < iGuard.sl) + : iPosition.price < iGuard.sl && + (iPosition.sl == 0 || + iPosition.sl > iGuard.sl); + if (canDoTrail) + { + // + string comment = "Guard Trail Stop ..."; + string message = "Guard Trail " + (isLong ? "Long" : "Short") + " Position: (" + ToString(iGuard.ticket) + ") Stop Successfully ..."; + bool isModified = mTrader.Modify( + iPosition.ticket, + iGuard.sl, + iPosition.tp, + comment // + ); + if (isModified) + { + mTradeHandler.Alert(message); + } + } + } + + // + // Trail Target ... + if (canTrailTarget) + { + // + XPosition iPosition; + bool hasPosition = mTrader.GetPosition( + iGuard.ticket, + iPosition // + ); + + // + bool isLong = IsLong(iPosition.type); + + // + bool canDoTrail = + hasPosition && + iGuard.tp != iPosition.tp && + isLong + ? iGuard.tp > iPosition.price + : iGuard.tp < iPosition.price; + if (canDoTrail) + { + // + string comment = "Guard Trail Target ..."; + string message = "Guard Trail " + (isLong ? "Long" : "Short") + " Position: (" + ToString(iGuard.ticket) + ") Target Successfully ..."; + bool isModified = mTrader.Modify( + iPosition.ticket, + iPosition.sl, + iGuard.tp, + comment // + ); + if (isModified) + { + mTradeHandler.Alert(message); + } + } + } + } + + // + Clean(guards); + Clean(guards); + } + + // + void RestEA(int seconds) + { + // + } + + // +}; + +// \ No newline at end of file diff --git a/BKPS/14031206/X121SMCEA/Libraries/x-121.smc.guard.lib.ex5 b/BKPS/14031206/X121SMCEA/Libraries/x-121.smc.guard.lib.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..06f0fd8882523dc735936097313fe396a8b8e970 GIT binary patch literal 17194 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

      so8Jytcjyjs89fHcf5DaERxZd zf?e23IclJPZE3gcUC^E7g;hGRLG{}J#mT+)2x)a7wBg!#<_&)zNq%s9`pG6Rel?mo zY;JyCLRvTU?O0fJsX(~jt0~QT_$*zxBiuk_1PHIZZnf-bO`hihH=rT=TykXF-SWm? z`KdyW)aPLsrJ4N^L1-$UwI@qBGLDSFClRg-V92SDK8@u>C5fW%N{*nuiCEzFBUZ)> zaavl;v$UxQRrw89*!qcKnDb8~sX1c}-+YMOB4B+@g3>xJj)79(| z_HFe~oE&_@MpD}TAggMQi|rRjec@@}`c2`yF6ZvlC{WiEadmkx0+3Zn(wX)_)GnFo zwR&a~pdWUQO2^f(4cZ*81Aq4Qi$x6h%y+JaX#72k#+mR4Sf4Q1ah9TM7jn13x%KPO zaiH(UmR#g9-93%3jPlb7__jsXm~2mX1_t7iZrWqBRh7=QRsaII}DI|FDXpn`i9jR{~W{5d~rHMC)wIo~yLycY(`H{u|`tsb&ofN-72 zLp`guuE?nfKq(cq5~D_Ij1+SZXwY0$K(k3)PmP`$pG5|vWk;7)&`;k+5`D#sUSHyy ztKuG2^ruP#Q0w+#mH~RaGjq7JzX`v()}JRDd}&V<6Zeb-ct+9F7t4Dd($_pA6u@q* zjCt4=_3Wy7XHFtF=%y=L#_BI773P(7kyCkuO(YIj&+&!=*xEC(IlD<%loawnVCq%0 z-dd6t8xI85o!4s>z4&e=V7>$-5%m3>Y0=(B@lOf2Z0jXi-1(@It)BE0CfJ%Wz6#T9JkTo zp`(lKX~3IwpaMB*Ks)7fl+aCfwc#x9YTPdY-87kH4P;DRzv*U?@B*w7l-9jz_5;7} z2yII66>^624)5o9Qd{-btj4+su!&d4zBc7rxoYj)xv<28o2Emx;*xiM&Gu2f+DG-d z%jM-2br2X5sFrZsUwu}8n8F7f30F175LCY(EbnXRhT%GI`i_f7QYlY$LDnY%u2{Qm zje5(bJ8SC9J}nD>LU3cjgZ=n#wR%uF@P%B5Ig1UZMiENK>)XI4Od)wGXmwOq-K0o# zoL;gHd`s<&eva&-`3uyfD~R&q#?NVm3A*+W&0{K}v&0%Mz6gCJ5FE?%oMOFE4@&n@ zno=+e@WUQ5YQ$By`f)X9o%JWqr#dD{bXu1P8%jK6yb<9a^vn**gDGrPq~w_iKKr=N zC@Mc<>HYxMm@ituo~*e|lI6E(8z2wz2dzuYOh>=5Wrvs9MRb^5NvmLZ#fHLQcE4*8 z279y>PRn{?WnJ7F{QDe^T&&s~yJu|4{pGDo{jV+laQH^mEbS79WuX4iva4lg-7nfB zh)Y8AFZOoJ+6UC9{vgI~Xg|epsLb>mLr8eNTu|~gn3WndAW=}yLy=+hA*5JnDOCRh z_f&1hNino&@W_+NAlnL6jqGuh`GY-XElzsuCvL4O+vy=DlF}mjVaQr#){$lrlpegf znUay{X>G939QO0&IoO%?jD&z5ou*xsxA--rY4{KSpGYoM;`4a7|0yBGN7Vajw#Dbx zQSA(^EU{wq8Cj?#qbi@hXwRO-0@m&>ja8Vj5U`n_-3i>Fw-s)-MV-n_as>H#q#TYx zF9Q4n&R|nA^DRQqfrweRv#s$TEEh8Nh8H=*q4icB62oDC8uf@Q$9Hgy6L-L|9?-Rf#{aqSZ3XO9A81W^Bh?F`q*)dqujKxkGm<(C@15$ zG5{oy@T#!f2lKHve{@!bf1eAG=z8GSa{QN_);sd^= zWe%WUHIcY$P@q59V$DaY0*1jv&CDN6d^E#TWsm8m3WIJy&d!=qaJTNw&@vQVV-iLCkclRkJTH`RG?#2g05N~423ER0j|wy>*zcsg}Qf;b%y%t}J$rAkiB2$*E@ zIs`{#*FCdI^2E-Cv+yE@q^X4NEf|Sdp*`Nk;JERwMeYT=fb8t@6o*TZ6Am#S8@? z-uwo*bvy7Y{xoB%m7PV-B&ZeE-ir0FUSpTl0Q9Gc72$ bLAO1;WCUZfrJo39--Mks$n7n9r3D?>7hEj@ literal 0 HcmV?d00001 diff --git a/BKPS/14031206/X121SMCEA/Libraries/x-121.smc.guard.lib.mq5 b/BKPS/14031206/X121SMCEA/Libraries/x-121.smc.guard.lib.mq5 new file mode 100644 index 0000000..6a10ca4 --- /dev/null +++ b/BKPS/14031206/X121SMCEA/Libraries/x-121.smc.guard.lib.mq5 @@ -0,0 +1,974 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 X121 SMC Signal Class +// ------------------------------------------------- +// Name: +// Description: provide all Global Guarding 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 + +// +// Imports ... +#include "../Classes/x-121.smc.market.cycle.helper.class.mq5" +#include "../Libraries/x-121.smc.lib.mq5" + +// +XConsolidationZone x121SMCConsolidationZone; +bool DetectX121SMCGuards( + // + string provider, // Provider ... + X121SMCGuard &guards[], + const XPosition &positions[], + XC121SMCCycleHelper *decisionCycleHelper, + XC121SMCCycleHelper *analyseCycleHelper, + XC121SMCCycleHelper *consolidationCycleHelper, + XC121SMCCycleHelper *visionCycleHelper, + // + // Guard Types ... + ENUM_X_121_SMC_GUARD_ACTIONS &ignoreGuards[], + // + // Required Configurations ... + double breakEvenTPLevel = 2.0 + // +) +{ + // + bool result = false; + + // + bool isCycleHelpersValid = + // + visionCycleHelper != NULL && + analyseCycleHelper != NULL && + decisionCycleHelper != NULL && + consolidationCycleHelper != NULL + // + ; + + // + // Ignore Guards ... + bool hasIgnoreGuards = HasChild(ignoreGuards); + bool isColseIgnored = + hasIgnoreGuards && + Contains( + X_121_SMC_GUARD_ACTION_CLOSE, + ignoreGuards // + ); + bool isColseAllIgnored = + hasIgnoreGuards && + Contains( + X_121_SMC_GUARD_ACTION_CLOSE_ALL, + ignoreGuards // + ); + bool isColseLongsIgnored = + hasIgnoreGuards && + Contains( + X_121_SMC_GUARD_ACTION_CLOSE_LONGS, + ignoreGuards // + ); + bool isColseShortsIgnored = + hasIgnoreGuards && + Contains( + X_121_SMC_GUARD_ACTION_CLOSE_SHORTS, + ignoreGuards // + ); + bool isPartialColseIgnored = + hasIgnoreGuards && + Contains( + X_121_SMC_GUARD_ACTION_PARTIAL_CLOSE, + ignoreGuards // + ); + bool isTrailStopIgnored = + hasIgnoreGuards && + Contains( + X_121_SMC_GUARD_ACTION_TRAIL_STOP, + ignoreGuards // + ); + bool isTrailTargetIgnored = + hasIgnoreGuards && + Contains( + X_121_SMC_GUARD_ACTION_TRAIL_TARGET, + ignoreGuards // + ); + bool isHedgeIgnored = + hasIgnoreGuards && + Contains( + X_121_SMC_GUARD_ACTION_HEDGE, + ignoreGuards // + ); + + // + bool isAllIgnores = + // + isColseIgnored && + isHedgeIgnored && + isColseAllIgnored && + isTrailStopIgnored && + isColseLongsIgnored && + isColseShortsIgnored && + isTrailTargetIgnored && + isPartialColseIgnored + // + ; + result = !isAllIgnores && + isCycleHelpersValid; + if (!result) + { + return result; + } + + // + int count = ArraySize(positions); + result = IsValidSize(count); + if (!result) + { + return result; + } + + // + string symbol = decisionCycleHelper.GetSymbol(); + ENUM_TIMEFRAMES period = decisionCycleHelper.GetPeriod(); + + // + XPosition ownPositions[]; + XPosition ownLongPositions[]; + XPosition ownShortPositions[]; + for (int i = 0; i < count; i++) + { + // + XPosition iPosition = positions[i]; + bool isOwn = iPosition + .IsFiltersPassed( + symbol, + provider, + NULL, + X_POSITION_TYPE_ALL, + iPosition.magic // + ); + if (isOwn) + { + // + AddRef( + iPosition, + ownPositions // + ); + + // + bool isLong = IsLong(positions[i].type); + if (isLong) + { + // + AddRef( + iPosition, + ownLongPositions // + ); + } + else + { + // + AddRef( + iPosition, + ownShortPositions // + ); + } + } + } + + // + count = ArraySize(ownPositions); + + // + int longsCount = ArraySize(ownLongPositions); + bool hasLongs = IsValidSize(longsCount); + + // + int shortsCount = ArraySize(ownShortPositions); + bool hasShorts = IsValidSize(shortsCount); + + // + result = IsValidSize(count); + if (!result) + { + // + Clean(ownPositions); + Clean(ownLongPositions); + Clean(ownShortPositions); + + // + return result; + } + + // + // Here we Are Sure there is Positions to Guard ... + // based on Current Provider ... + + // + // Detect Required Data for Analyse Market to Guard Positions ... + + // + int zIndex = 0; + int cIndex = zIndex + 1; + int pIndex = cIndex + 1; + int ppIndex = pIndex + 1; + + // + int loopback = 10; + + // + XOHCL zBar; + result = zBar.Init( + symbol, + period, + zIndex // + ); + if (!result) + { + // + zBar.Clean(); + result = HasChild(guards); + return result; + } + + // + XOHCL cBar; + result = cBar.Init( + symbol, + period, + cIndex // + ); + if (!result) + { + // + zBar.Clean(); + cBar.Clean(); + result = HasChild(guards); + return result; + } + + // + XOHCL pBar; + result = pBar.Init( + symbol, + period, + pIndex // + ); + if (!result) + { + // + zBar.Clean(); + cBar.Clean(); + pBar.Clean(); + result = HasChild(guards); + return result; + } + + // + XOHCL ppBar; + result = ppBar.Init( + symbol, + period, + ppIndex // + ); + if (!result) + { + // + zBar.Clean(); + cBar.Clean(); + pBar.Clean(); + ppBar.Clean(); + result = HasChild(guards); + return result; + } + + // + double ask = GetAsk(symbol); + double bid = GetBid(symbol); + datetime cTime = TimeCurrent(); + double points = GetPoints(symbol); + + // + + // + // Cycles Conditions ... + + // + // Decision ... + ENUM_XPOI_EVENTS decisionPoiEvents[]; + ENUM_X_CYCLE_EVENTS decisionCycleEvents[]; + X121SMCCycleConditions decisionConditions; + result = decisionCycleHelper.GetConditions( + decisionCycleEvents, + decisionPoiEvents, + decisionConditions, + zIndex, + loopback // + ); + if (!result) + { + // + zBar.Clean(); + cBar.Clean(); + pBar.Clean(); + ppBar.Clean(); + result = HasChild(guards); + + // + Clean(decisionPoiEvents); + Clean(decisionCycleEvents); + + // + decisionConditions.Clean(); + return result; + } + + // + // Analyse ... + ENUM_XPOI_EVENTS analysePoiEvents[]; + ENUM_X_CYCLE_EVENTS analyseCycleEvents[]; + X121SMCCycleConditions analyseConditions; + result = analyseCycleHelper.GetConditions( + analyseCycleEvents, + analysePoiEvents, + analyseConditions, + zIndex, + loopback // + ); + if (!result) + { + // + zBar.Clean(); + cBar.Clean(); + pBar.Clean(); + ppBar.Clean(); + + // + Clean(decisionPoiEvents); + Clean(decisionCycleEvents); + + // + decisionConditions.Clean(); + + // + Clean(analysePoiEvents); + Clean(analyseCycleEvents); + + // + analyseConditions.Clean(); + + // + result = HasChild(guards); + return result; + } + + // + // Consolidation ... + ENUM_XPOI_EVENTS consolidationPoiEvents[]; + ENUM_X_CYCLE_EVENTS consolidationCycleEvents[]; + X121SMCCycleConditions consolidationConditions; + result = consolidationCycleHelper.GetConditions( + consolidationCycleEvents, + consolidationPoiEvents, + consolidationConditions, + zIndex, + loopback // + ); + if (!result) + { + // + zBar.Clean(); + cBar.Clean(); + pBar.Clean(); + ppBar.Clean(); + + // + Clean(decisionPoiEvents); + Clean(decisionCycleEvents); + + // + decisionConditions.Clean(); + + // + Clean(analysePoiEvents); + Clean(analyseCycleEvents); + + // + analyseConditions.Clean(); + + // + Clean(consolidationPoiEvents); + Clean(consolidationCycleEvents); + + // + consolidationConditions.Clean(); + + // + result = HasChild(guards); + return result; + } + + // + // Vision ... + ENUM_XPOI_EVENTS visionPoiEvents[]; + ENUM_X_CYCLE_EVENTS visionCycleEvents[]; + X121SMCCycleConditions visionConditions; + result = visionCycleHelper.GetConditions( + visionCycleEvents, + visionPoiEvents, + visionConditions, + zIndex, + loopback // + ); + if (!result) + { + // + zBar.Clean(); + cBar.Clean(); + pBar.Clean(); + ppBar.Clean(); + + // + Clean(decisionPoiEvents); + Clean(decisionCycleEvents); + + // + decisionConditions.Clean(); + + // + Clean(analysePoiEvents); + Clean(analyseCycleEvents); + + // + analyseConditions.Clean(); + + // + Clean(consolidationPoiEvents); + Clean(consolidationCycleEvents); + + // + consolidationConditions.Clean(); + + // + Clean(visionPoiEvents); + Clean(visionCycleEvents); + + // + visionConditions.Clean(); + + // + result = HasChild(guards); + return result; + } + + // + // Cycles POI States ... + XPOIState decisionState = decisionConditions.state; + XPOIState analyseState = analyseConditions.state; + XPOIState consolidationState = consolidationConditions.state; + XPOIState visionState = visionConditions.state; + + // + // Cycle X121Conditions ... + X121Conditions decisionXConditions = decisionConditions.x121Conditions; + X121Conditions analyseXConditions = analyseConditions.x121Conditions; + X121Conditions consolidationXConditions = consolidationConditions.x121Conditions; + X121Conditions visionXConditions = visionConditions.x121Conditions; + + // + // + // + + // + // Detect Consolidation Zone ... + + // + // Detect Consolidation Zones ... + + // + XBoxZone lastBullishBox; + XBoxZone prevLastBullishBox; + bool hasLastBullishBox = false; + bool hasPrevLastBullishBox = false; + XConsolidationZone lastBullishZone; + bool isLastBullishAbovePrev = false; + bool isLastBullishBelowPrev = false; + XConsolidationZone prevLastBullishZone; + + // + XBoxZone lastBearishBox; + XBoxZone prevLastBearishBox; + bool hasLastBearishBox = false; + bool hasPrevLastBearishBox = false; + XConsolidationZone lastBearishZone; + bool isLastBearishAbovePrev = false; + bool isLastBearishBelowPrev = false; + XConsolidationZone prevLastBearishZone; + + // + int bullishConsolidationZonesCount = 0; + int bearishConsolidationZonesCount = 0; + bool hasBullishConsolidationZones = false; + bool hasBearishConsolidationZones = false; + XConsolidationZone bullishConsolidationZones[]; + XConsolidationZone bearishConsolidationZones[]; + bool hasConsolidationZones = decisionCycleHelper.HasConsolidationZones(); + int consolidationZonesCount = decisionCycleHelper.CountConsolidationZones(); + if (hasConsolidationZones) + { + // + bullishConsolidationZonesCount = decisionCycleHelper + .FillConsolidationZones( + X_DIRECTION_BULLISH, + bullishConsolidationZones // + ); + hasBullishConsolidationZones = IsValidSize(bullishConsolidationZonesCount); + + // + bearishConsolidationZonesCount = decisionCycleHelper + .FillConsolidationZones( + X_DIRECTION_BEARISH, + bearishConsolidationZones // + ); + hasBearishConsolidationZones = IsValidSize(bearishConsolidationZonesCount); + + // + // + // + + // + if (hasBullishConsolidationZones && + bullishConsolidationZonesCount >= 2) + { + // + lastBullishZone = bullishConsolidationZones[bullishConsolidationZonesCount - 1]; + prevLastBullishZone = bullishConsolidationZones[bullishConsolidationZonesCount - 2]; + + // + hasLastBullishBox = ToBox( + lastBullishBox, + lastBullishZone // + ); + hasPrevLastBullishBox = ToBox( + prevLastBullishBox, + prevLastBullishZone // + ); + + // + isLastBullishAbovePrev = hasLastBullishBox && + hasPrevLastBullishBox && + IsBoxAbove( + lastBullishBox, + prevLastBullishBox // + ); + + // + isLastBullishBelowPrev = hasLastBullishBox && + hasPrevLastBullishBox && + IsBoxBelow( + lastBullishBox, + prevLastBullishBox // + ); + } + + // + if (hasBearishConsolidationZones && + bearishConsolidationZonesCount >= 2) + { + // + lastBearishZone = bearishConsolidationZones[bearishConsolidationZonesCount - 1]; + prevLastBearishZone = bearishConsolidationZones[bearishConsolidationZonesCount - 2]; + + // + hasLastBearishBox = ToBox( + lastBearishBox, + lastBearishZone // + ); + hasPrevLastBearishBox = ToBox( + prevLastBearishBox, + prevLastBearishZone // + ); + + // + isLastBearishAbovePrev = hasLastBearishBox && + hasPrevLastBearishBox && + IsBoxAbove( + lastBearishBox, + prevLastBearishBox // + ); + + // + isLastBearishBelowPrev = hasLastBearishBox && + hasPrevLastBearishBox && + IsBoxBelow( + lastBearishBox, + prevLastBearishBox // + ); + } + + // + } + + // + // Detect High Probability Swings ... + bool isSwingLow = + // + cBar.low > pBar.low && + ppBar.low > pBar.low && + // + zBar.low > pBar.low + // + ; + bool isSwingHigh = + // + cBar.high < pBar.high && + ppBar.high < pBar.high && + // + zBar.high < pBar.high + // + ; + bool isStrongSwingLow = + pBar.IsBullish() && + pBar.GetLowShadow() >= pBar.GetBody() * 2; + bool isStrongSwingHigh = + pBar.IsBearish() && + pBar.GetHighShadow() >= pBar.GetBody() * 2; + + // + bool isStrongSwingLowAboveLastBullishBox = + isStrongSwingLow && + hasLastBullishBox && + pBar.low > lastBullishBox.upper; + + // + bool isStrongSwingHighBelowLastBearishBox = + isStrongSwingHigh && + hasLastBearishBox && + pBar.high < lastBearishBox.lower; + + // + // Here We Have all Requirements for Guarding Positions ... + + // + // Available Guards: + // X_121_SMC_GUARD_ACTION_NONE + // X_121_SMC_GUARD_ACTION_CLOSE + // X_121_SMC_GUARD_ACTION_CLOSE_ALL + // X_121_SMC_GUARD_ACTION_CLOSE_LONGS + // X_121_SMC_GUARD_ACTION_CLOSE_SHORTS + // X_121_SMC_GUARD_ACTION_PARTIAL_CLOSE + // X_121_SMC_GUARD_ACTION_TRAIL_STOP + // X_121_SMC_GUARD_ACTION_TRAIL_TARGET + // X_121_SMC_GUARD_ACTION_HEDGE + + // + // X_121_SMC_GUARD_ACTION_CLOSE: + // Close Specified Position on Specified Conditions ... + if (!isColseIgnored) + { + // + // TODO: + // - [] Implement Close on Nearest on TP ... + } + + // + // X_121_SMC_GUARD_ACTION_CLOSE_ALL: + // Close All Positions on Specified Conditions ... + if (!isColseAllIgnored) + { + // + // TODO: + // - [] Implement Close All Positions on Weekend ... + } + + // + // X_121_SMC_GUARD_ACTION_CLOSE_LONGS: + // Close All Long Positions on Specified Conditions ... + if (!isColseLongsIgnored) + { + // + } + + // + // X_121_SMC_GUARD_ACTION_CLOSE_SHORTS: + // Close All Short Positions on Specified Conditions ... + if (!isColseShortsIgnored) + { + // + } + + // + // X_121_SMC_GUARD_ACTION_PARTIAL_CLOSE: + // Partial Close Specified Position on Specified Conditions ... + if (!isPartialColseIgnored) + { + // + // Breake Even ... + // Usually Break Even Works on TP2 Reached ... + // when tp reached to required Level, we Close 50% of Entered Volume ... + bool canBreakEven = breakEvenTPLevel >= 0; + + // + for (int i = 0; i < count; i++) + { + // + XPosition iPosition = ownPositions[i]; + + // + bool isInProfit = iPosition.profit > 0; + + // + double reachedTPLevel = 0; + double reachedTPPrice = 0; + if (isInProfit) + { + // + iPosition.CalculateReahedTP( + reachedTPLevel, + reachedTPPrice // + ); + } + + // + // Break Event ... + if (canBreakEven) + { + // + // Position Must be In Profit ... + if (!isInProfit) + { + continue; + } + + // + bool canDoBreakEven = reachedTPLevel == breakEvenTPLevel && + reachedTPPrice > 0; + if (canDoBreakEven) + { + // + X121SMCGuard iGuard; + + // + iGuard.time = cTime; + iGuard.symbol = symbol; + iGuard.provider = provider; + iGuard.action = X_121_SMC_GUARD_ACTION_PARTIAL_CLOSE; + + // + iGuard.ticket = iPosition.ticket; + + // + iGuard.volumeMultiplier = 0.5; + + // + AddGuard( + iGuard, + guards // + ); + } + } + } + } + + // + // X_121_SMC_GUARD_ACTION_TRAIL_STOP: + // Trail Stop Specified Position on Specified Conditions ... + if (!isTrailStopIgnored) + { + // + for (int i = 0; i < count; i++) + { + // + XPosition iPosition = ownPositions[i]; + + // + bool isLong = IsLong(iPosition.type); + bool isInProfit = iPosition.profit > 0; + + // + double reachedTPLevel = 0; + double reachedTPPrice = 0; + if (isInProfit) + { + // + iPosition.CalculateReahedTP( + reachedTPLevel, + reachedTPPrice // + ); + } + + // + // Trai Stop ... + if (!isInProfit) + { + continue; + } + + // + double trailedStop = 0; + + // + // Trail Stop Senarios ... + // - occures two same type consolidation zones in order of positions type; + // - occures a swing in order of consolidation zones ... + + // + bool canTrailBasedOnTwoZone = + isLong + ? isLastBullishAbovePrev + : isLastBearishBelowPrev; + if (canTrailBasedOnTwoZone) + { + // + trailedStop = + isLong + ? prevLastBullishBox.lower + : prevLastBearishBox.upper; + } + + // + bool canTrailBasedOnZoneSwing = + trailedStop <= 0 && + (isLong + ? isStrongSwingLowAboveLastBullishBox + : isStrongSwingHighBelowLastBearishBox); + if (canTrailBasedOnZoneSwing) + { + // + trailedStop = + isLong + ? pBar.low + : pBar.high; + } + + // + bool canDoTrailStop = + trailedStop > 0 && + ( + // + iPosition.sl == 0 + ? (isLong + ? trailedStop > iPosition.entry && + trailedStop < iPosition.price + : trailedStop < iPosition.entry && + trailedStop > iPosition.price) + : (isLong + ? trailedStop > iPosition.sl && + trailedStop > iPosition.entry && + trailedStop < iPosition.price + : trailedStop < iPosition.sl && + trailedStop < iPosition.entry && + trailedStop > iPosition.price) + // + ) + // + ; + + // + if (canDoTrailStop) + { + // + X121SMCGuard iGuard; + + // + iGuard.time = cTime; + iGuard.symbol = symbol; + iGuard.provider = provider; + iGuard.action = X_121_SMC_GUARD_ACTION_TRAIL_STOP; + + // + iGuard.ticket = iPosition.ticket; + + // + iGuard.sl = trailedStop; + + // + AddGuard( + iGuard, + guards // + ); + } + } + } + + // + // X_121_SMC_GUARD_ACTION_TRAIL_TARGET: + // Trail Target Specified Position on Specified Conditions ... + if (!isTrailTargetIgnored) + { + // + } + + // + // X_121_SMC_GUARD_ACTION_HEDGE: + // Hedge all Positions on Specified Conditions ... + if (!isHedgeIgnored) + { + // + } + + // + // Cleanup Collections ... + + // + Clean(ownPositions); + Clean(ownLongPositions); + Clean(ownShortPositions); + + // + zBar.Clean(); + cBar.Clean(); + pBar.Clean(); + ppBar.Clean(); + + // + Clean(visionPoiEvents); + Clean(analysePoiEvents); + Clean(visionCycleEvents); + Clean(decisionPoiEvents); + Clean(analyseCycleEvents); + Clean(decisionCycleEvents); + Clean(consolidationPoiEvents); + Clean(consolidationCycleEvents); + + // + visionState.Clean(); + analyseState.Clean(); + decisionState.Clean(); + visionConditions.Clean(); + analyseConditions.Clean(); + visionXConditions.Clean(); + decisionConditions.Clean(); + consolidationState.Clean(); + analyseXConditions.Clean(); + decisionXConditions.Clean(); + consolidationConditions.Clean(); + consolidationXConditions.Clean(); + + // + lastBullishBox.Clean(); + lastBearishBox.Clean(); + lastBullishZone.Clean(); + lastBearishZone.Clean(); + prevLastBullishBox.Clean(); + prevLastBearishBox.Clean(); + prevLastBullishZone.Clean(); + prevLastBearishZone.Clean(); + + // + count = ArraySize(guards); + result = IsValidSize(count); + + // + return result; +} diff --git a/BKPS/14031206/X121SMCEA/Libraries/x-121.smc.lib.ex5 b/BKPS/14031206/X121SMCEA/Libraries/x-121.smc.lib.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..60e8346055d044ed1b804b71b2aff1a66486d3af GIT binary patch literal 15864 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 literal 0 HcmV?d00001 diff --git a/BKPS/14031206/X121SMCEA/Libraries/x-121.smc.lib.mq5 b/BKPS/14031206/X121SMCEA/Libraries/x-121.smc.lib.mq5 new file mode 100644 index 0000000..80c31a8 --- /dev/null +++ b/BKPS/14031206/X121SMCEA/Libraries/x-121.smc.lib.mq5 @@ -0,0 +1,734 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 Common Library +// -------------------------------------- +// Name: X121SMCLib +// 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 + +// +// Imports ... +#include "../../Classes/x-saherelm.base.class.mq5" +#include "../../Classes/x-saherelm.x-poi.drawer.class.mq5" +#include "../../Helpers/x-saherelm.x121.helper.mq5" +#include "../../Libraries/x-saherelm.common.lib.mq5" +#include "../../Libraries/x-saherelm.x-poi.extensions.lib.mq5" +#include "../../Libraries/x-saherelm.x-poi.lib.mq5" +#include "../../Libraries/x-saherelm.x-trade.lib.mq5" + +// +// Definitions ... + +// +const string X121SMCStrategyToken = "X121SMC"; + +// +const string X121SMCXWZToken = "X121XWZ"; + +// +// X121 SMC Providers ... +enum ENUM_X_121_SMC_PROVIDERS +{ + // + X_121_SMC_PROVIDER_NONE, + X_121_SMC_PROVIDER_XWZ, +}; + +// +// Guard Actions ... +enum ENUM_X_121_SMC_GUARD_ACTIONS +{ + X_121_SMC_GUARD_ACTION_NONE, // Nothing to Do + X_121_SMC_GUARD_ACTION_CLOSE, // Close Specified Position + X_121_SMC_GUARD_ACTION_CLOSE_ALL, // Close All Positions + X_121_SMC_GUARD_ACTION_CLOSE_LONGS, // Close All Long Positions + X_121_SMC_GUARD_ACTION_CLOSE_SHORTS, // Close All Short Position + X_121_SMC_GUARD_ACTION_PARTIAL_CLOSE, // Partial Close Specified Position + X_121_SMC_GUARD_ACTION_TRAIL_STOP, // Trail Stop of Specified Position + X_121_SMC_GUARD_ACTION_TRAIL_TARGET, // Trail Target of Specified Position + X_121_SMC_GUARD_ACTION_HEDGE, // Hedge Specified Positions +}; + +// +// Each Market Cycle (Time Frame) Conditions +// Model as this Structure ... +struct X121SMCCycleConditions +{ + // + string symbol; + ENUM_TIMEFRAMES period; + datetime time; + + // + XPOIState state; + X121Conditions x121Conditions; + + // + void X121SMCStrategyConditions() + { + Clean(); + } + + // + // Tools ... + + /** + * Cleanup ... + */ + void Clean() + { + // + symbol = NULL; + period = NULL; + time = NULL; + + // + state.Clean(); + x121Conditions.Clean(); + + // + ZeroMemory(this); + } + + /** + * Validate ... + * + * @return ( bool ) + */ + bool IsValid() + { + // + bool result = false; + + // + result = IsSpecifiedValid(symbol) && + IsSpecifiedValid(period) && + IsSpecifiedValid(time); + // + ; + + // + return result; + } + + // + // Reporter Functions ... + + /** + * Generate Provided Scores ... + * + * @param bullishScore: Integer, reference ... + * @param bearishScore: Integer, referenceF ... + */ + void GenerateScore( + double &bullishScore, + double &bearishScore // + ) + { + // + bullishScore = 0; + bearishScore = 0; + + // + if (!IsValid()) + { + return; + } + + // + double bullScore = 0; + double bearScore = 0; + } + + /** + * Generate Summary ... + * + * @param onlyCommons: Boolean ... + * @param onlyConditions: Boolean ... + * @param includeScores: Boolean ... + * @param ignoreFalseConditions: Boolean ... + * @param separator: String ... + * + * @return ( string ) + */ + string GenerateSummary( + bool onlyCommons = false, + bool onlyConditions = false, + bool includeScores = true, + bool ignoreFalseConditions = true, + string separator = "\n" // + ) + { + // + string result = NULL; + + // + double bullishScore = 0; + double bearishScore = 0; + GenerateScore( + bullishScore, + bearishScore // + ); + + // + string commonStr = GenerateSpecifiedCommonSummary( + this, + separator, + includeScores, + true // + ); + + // + string conditionsStr = + // + "" + // + ; + + // + result = + // + "[" + GetTag() + "]" + separator + + "----------" + separator + + (onlyConditions + ? "" + : commonStr) + + " " + separator + + (onlyCommons + ? "" + : conditionsStr) + + "" + // + ; + + // + return result; + } + + /** + * Get Unique Identifier ... + * + * @param forObject: Boolean ... + * + * @return ( string ) + */ + string GetTag( + bool forObject = false // + ) + { + // + string result = NULL; + + // + string typeName = GetTypeName(this); + + // + if (!forObject) + { + result = typeName; + } + else + { + // + result = typeName + "_" + + symbol + "_" + ToString(period) + "_" + + ToMD5(time); + } + + // + return result; + } + + // +}; + +// +// Model Signalling Conditions ... +struct X121SMCStrategyConditions +{ + // + string symbol; + ENUM_TIMEFRAMES period; + datetime time; + + // + double sl; + double tp; + double target; + string provider; + ENUM_X_DIRECTION signalDir; + + // + void X121SMCStrategyConditions() + { + Clean(); + } + + // + // Tools ... + + /** + * Cleanup ... + */ + void Clean() + { + // + symbol = NULL; + period = NULL; + time = NULL; + + // + sl = 0; + tp = 0; + provider = NULL; + signalDir = X_DIRECTION_NONE; + + // + ZeroMemory(this); + } + + /** + * Validate ... + * + * @return ( bool ) + */ + bool IsValid() + { + // + bool result = false; + + // + result = IsSpecifiedValid(symbol) && + IsSpecifiedValid(period) && + IsSpecifiedValid(time); + + // + return result; + } + + /** + * Check Conditions Has Valid Bullish Signal ... + * + * @return ( bool ) + */ + bool HasBullishSignal() + { + // + bool result = false; + + // + result = + (sl > 0 || + tp > 0) && + IsValid() && + HasDirection(signalDir); + if (!result) + { + return result; + } + + // + result = + IsBullish(signalDir); + + // + return result; + } + + /** + * Check Conditions Has Valid Bearish Signal ... + * + * @return ( bool ) + */ + bool HasBearishSignal() + { + // + bool result = false; + + // + result = + (sl > 0 || + tp > 0) && + IsValid() && + HasDirection(signalDir); + if (!result) + { + return result; + } + + // + result = + IsBearish(signalDir); + + // + return result; + } + + // + // Reporter Functions ... + + /** + * Generate Provided Scores ... + * + * @param bullishScore: Integer, reference ... + * @param bearishScore: Integer, referenceF ... + */ + void GenerateScore( + double &bullishScore, + double &bearishScore // + ) + { + // + bullishScore = 0; + bearishScore = 0; + + // + if (!IsValid()) + { + return; + } + + // + double bullScore = 0; + double bearScore = 0; + } + + /** + * Generate Summary ... + * + * @param onlyCommons: Boolean ... + * @param onlyConditions: Boolean ... + * @param includeScores: Boolean ... + * @param ignoreFalseConditions: Boolean ... + * @param separator: String ... + * + * @return ( string ) + */ + string GenerateSummary( + bool onlyCommons = false, + bool onlyConditions = false, + bool includeScores = true, + bool ignoreFalseConditions = true, + string separator = "\n" // + ) + { + // + string result = NULL; + + // + double bullishScore = 0; + double bearishScore = 0; + GenerateScore( + bullishScore, + bearishScore // + ); + + // + string commonStr = GenerateSpecifiedCommonSummary( + this, + separator, + includeScores, + true // + ); + + // + string conditionsStr = + // + "" + // + ; + + // + result = + // + "[" + GetTag() + "]" + separator + + "----------" + separator + + (onlyConditions + ? "" + : commonStr) + + " " + separator + + (onlyCommons + ? "" + : conditionsStr) + + "" + // + ; + + // + return result; + } + + /** + * Get Unique Identifier ... + * + * @param forObject: Boolean ... + * + * @return ( string ) + */ + string GetTag( + bool forObject = false // + ) + { + // + string result = NULL; + + // + string typeName = GetTypeName(this); + + // + if (!forObject) + { + result = typeName; + } + else + { + // + result = typeName + "_" + + symbol + "_" + ToString(period) + "_" + + ToMD5(time); + } + + // + return result; + } + + // +}; + +// +// Model a Guard Action ... +struct X121SMCGuard +{ + // + // Props ... + ENUM_X_121_SMC_GUARD_ACTIONS action; + datetime time; + + // + string symbol; + string provider; + + // + // Specified Position ... + ulong ticket; + + // + // Partial Close ... + double volumeMultiplier; + + // + // SL Trial ... + double sl; + + // + // TP Trial ... + double tp; + + // + // Constructor ... + X121SMCGuard() + { + Clean(); + } + + // + // Tools ... + + /** + * Cleanup ... + */ + void Clean() + { + // + time = NULL; + action = X_121_SMC_GUARD_ACTION_NONE; + + // + symbol = NULL; + provider = NULL; + + // + ticket = 0; + + // + volumeMultiplier = 0; + + // + sl = 0; + tp = 0; + + // + ZeroMemory(this); + } + + /** + * Validate ... + * + * @return ( bool ) + */ + bool IsValid() + { + // + bool result = false; + + // + result = + // + IsValid(time) && + IsValid(symbol) && + IsValid(provider) && + action != X_121_SMC_GUARD_ACTION_NONE + // + ; + if (!result) + { + return result; + } + + // + // Validate Model Based On Specified Guard Actions ... + + // + return result; + } +}; + +/** + * Add Guard to Collection ... + * + * @param guard: X121SMCGuard instance ... + * @param guards: X121SMCGuard instance Collection ... + * + * @return ( int ) + */ +int AddGuard( + X121SMCGuard &guard, + X121SMCGuard &guards[] // +) +{ + // + int result = 0; + + // + if (!guard.IsValid()) + { + return result; + } + + // + AddRef( + guard, + guards // + ); + + // + result = ArraySize(guards); + + // + return result; +} + +// +// +// + +typedef void (*TOnX121SMCSignal)( + XSignal &signal, + X121SMCStrategyConditions &conditions // +); + +// +// Extentions ... + +/** + * Validate a Signal Provider ... + * + * @param value: ENUM_X_121_SMC_PROVIDERS member ... + * + * @return ( bool ) + */ +bool IsValid(ENUM_X_121_SMC_PROVIDERS value) +{ + // + bool result = false; + + // + result = value != X_121_SMC_PROVIDER_NONE; + + // + return result; +} + +/** + * Converts a Signal Provider to String ... + * + * @param value: ENUM_X_121_SMC_PROVIDERS member ... + * + * @return ( string ) + */ +string ToString(ENUM_X_121_SMC_PROVIDERS value) +{ + // + string result = NULL; + + // + if (!IsValid(value)) + { + return result; + } + + // + switch (value) + { + // + case X_121_SMC_PROVIDER_XWZ: + result = X121SMCXWZToken; + break; + } + + // + return result; +} + +/** + * Parse Specified String as a Signal Provider ... + * + * @param value: String ... + * + * @return ( ENUM_X_121_SMC_PROVIDERS ) + */ +ENUM_X_121_SMC_PROVIDERS ParseProvider(string value) +{ + // + ENUM_X_121_SMC_PROVIDERS result = X_121_SMC_PROVIDER_NONE; + + // + if (!IsValid(value)) + { + return result; + } + + // + if (Contains(X121SMCXWZToken, value)) + { + result = X_121_SMC_PROVIDER_XWZ; + } + + // + return result; +} + +// diff --git a/BKPS/14031206/X121SMCEA/Signals/x-121.smc.xwz.signal.class.ex5 b/BKPS/14031206/X121SMCEA/Signals/x-121.smc.xwz.signal.class.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..09ce97bb0060878db2198528c80e279b298530f0 GIT binary patch literal 18216 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 literal 0 HcmV?d00001 diff --git a/BKPS/14031206/X121SMCEA/Signals/x-121.smc.xwz.signal.class.mq5 b/BKPS/14031206/X121SMCEA/Signals/x-121.smc.xwz.signal.class.mq5 new file mode 100644 index 0000000..beea66d --- /dev/null +++ b/BKPS/14031206/X121SMCEA/Signals/x-121.smc.xwz.signal.class.mq5 @@ -0,0 +1,3642 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 X121 SMC Signal Class +// ------------------------------------------------- +// Name: XWZ +// Description: provide all Signalling 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 + +// +// Imports ... +#include "../Classes/x-121.smc.market.cycle.helper.class.mq5" +#include "../Libraries/x-121.smc.guard.lib.mq5" +#include "../Libraries/x-121.smc.lib.mq5" +#include "./x-121.smc.xwz.signal.lib.mq5" + +// +// Definition ... +class XCX121SMCXWZSignalDetector : public XCBase +{ + // + public: + // + // Props ... + XOBFVG chochZone; + XOBFVG targetZone; + XOBFVG signalZone; + XOBFVG waitingZone; + X121SMCStrategyXWZWorkingZone workingZone; + X121SMCStrategyXWZSignalConditions mConditions; + X121SMCStrategyXWZSignalConditions mConditionsCollection[]; + + // + // Constructor(s) ... + XCX121SMCXWZSignalDetector( + string _symbol, + ENUM_TIMEFRAMES _period // + ) + { + // + symbol = _symbol; + period = _period; + Init(); + } + + // + // Deconstructor ... + ~XCX121SMCXWZSignalDetector() + { + DeInit(); + } + + // + // + // + + // + // Detect Setup Conditions ... + bool DetectSignalSetup( + // + XC121SMCCycleHelper *decisionCycleHelper, + XC121SMCCycleHelper *analyseCycleHelper, + XC121SMCCycleHelper *consolidationCycleHelper, + XC121SMCCycleHelper *visionCycleHelper + // + ) + { + // + bool result = false; + + // + // Validate Cycle Helpers ... + result = + // + visionCycleHelper != NULL && + analyseCycleHelper != NULL && + decisionCycleHelper != NULL && + consolidationCycleHelper != NULL + // + ; + if (!result) + { + // + mConditions.Clean(); + + // + return result; + } + + // + bool isBullish = false; + bool isBearish = false; + + // + int zIndex = 0; + int cIndex = zIndex + 1; + int pIndex = cIndex + 1; + int ppIndex = pIndex + 1; + + // + int loopback = 10; + + // + mConditions.symbol = symbol; + mConditions.period = period; + + // + double ask = GetAsk(symbol); + double bid = GetBid(symbol); + datetime cTime = TimeCurrent(); + double points = GetPoints(symbol); + + // + double pivot = 0; + double point = 0; + double target = 0; + double reward = 0; + double amountPercent = 0; + ENUM_X121SMC_XWZ_PRIORITY priority = X121SMC_XWZ_PRIORITY_NONE; + + // + // Cycles Conditions ... + + // + XOHCL consolidationZBar; + result = consolidationCycleHelper.GetBar( + consolidationZBar, + zIndex // + ); + if (!result) + { + // + consolidationZBar.Clean(); + return result; + } + + // + bool drawBar = true; + if (drawBar) + { + // + DrawBar( + consolidationZBar, + decisionCycleHelper.mPOIDrawer // + ); + } + + // + // Decision ... + ENUM_XPOI_EVENTS decisionPoiEvents[]; + ENUM_X_CYCLE_EVENTS decisionCycleEvents[]; + X121SMCCycleConditions decisionConditions; + result = decisionCycleHelper.GetConditions( + decisionCycleEvents, + decisionPoiEvents, + decisionConditions, + zIndex, + loopback // + ); + if (!result) + { + // + Clean(decisionPoiEvents); + Clean(decisionCycleEvents); + + // + decisionConditions.Clean(); + + // + mConditions.Clean(); + consolidationZBar.Clean(); + + // + return result; + } + + // + // Analyse ... + ENUM_XPOI_EVENTS analysePoiEvents[]; + ENUM_X_CYCLE_EVENTS analyseCycleEvents[]; + X121SMCCycleConditions analyseConditions; + result = analyseCycleHelper.GetConditions( + analyseCycleEvents, + analysePoiEvents, + analyseConditions, + zIndex, + loopback // + ); + if (!result) + { + // + Clean(analysePoiEvents); + Clean(decisionPoiEvents); + + // + Clean(analyseCycleEvents); + Clean(decisionCycleEvents); + + // + analyseConditions.Clean(); + decisionConditions.Clean(); + + // + mConditions.Clean(); + consolidationZBar.Clean(); + + // + return result; + } + + // + // Consolidation ... + ENUM_XPOI_EVENTS consolidationPoiEvents[]; + ENUM_X_CYCLE_EVENTS consolidationCycleEvents[]; + X121SMCCycleConditions consolidationConditions; + result = consolidationCycleHelper.GetConditions( + consolidationCycleEvents, + consolidationPoiEvents, + consolidationConditions, + zIndex, + loopback // + ); + if (!result) + { + // + Clean(analysePoiEvents); + Clean(decisionPoiEvents); + Clean(consolidationPoiEvents); + + // + Clean(analyseCycleEvents); + Clean(decisionCycleEvents); + Clean(consolidationCycleEvents); + + // + analyseConditions.Clean(); + decisionConditions.Clean(); + consolidationConditions.Clean(); + + // + mConditions.Clean(); + consolidationZBar.Clean(); + + // + return result; + } + + // + // Vision ... + ENUM_XPOI_EVENTS visionPoiEvents[]; + ENUM_X_CYCLE_EVENTS visionCycleEvents[]; + X121SMCCycleConditions visionConditions; + result = visionCycleHelper.GetConditions( + visionCycleEvents, + visionPoiEvents, + visionConditions, + zIndex, + loopback // + ); + if (!result) + { + // + Clean(visionPoiEvents); + Clean(analysePoiEvents); + Clean(decisionPoiEvents); + Clean(consolidationPoiEvents); + + // + Clean(visionCycleEvents); + Clean(analyseCycleEvents); + Clean(decisionCycleEvents); + Clean(consolidationCycleEvents); + + // + visionConditions.Clean(); + analyseConditions.Clean(); + decisionConditions.Clean(); + consolidationConditions.Clean(); + + // + mConditions.Clean(); + consolidationZBar.Clean(); + + // + return result; + } + + // + // Cycles POI States ... + XPOIState decisionState = decisionConditions.state; + XPOIState analyseState = analyseConditions.state; + XPOIState consolidationState = consolidationConditions.state; + XPOIState visionState = visionConditions.state; + + // + // Cycle X121Conditions ... + X121Conditions decisionXConditions = decisionConditions.x121Conditions; + X121Conditions analyseXConditions = analyseConditions.x121Conditions; + X121Conditions consolidationXConditions = consolidationConditions.x121Conditions; + X121Conditions visionXConditions = visionConditions.x121Conditions; + + // + // Setup Conditions ... + + // + // Choch Trading Senario ... + bool hasChochBullishConditions = false; + bool hasChochBearishConditions = false; + + // + // Order Flow Side Trading Senario ... + bool hasOrderFlowhBullishConditions = false; + bool hasOrderFlowhBearishConditions = false; + + // + // Trend Line Trading Senario ... + bool hasTrendLineBullishConditions = false; + bool hasTrendLineBearishConditions = false; + + // + // Quarter Line Trading Senario ... + bool hasBQuarterLineBullishConditions = false; + bool hasBQuarterLineBearishConditions = false; + + // + // Supply and Demand Trading Senario ... + bool hasSupDemBullishConditions = false; + bool hasSupDemBearishConditions = false; + + // + // Support and Resistance Trading Senario ... + bool hasSupResBullishConditions = false; + bool hasSupResBearishConditions = false; + + // + ENUM_X121SMC_XWZ_PROVIDERS provider = X121SMC_XWZ_PROVIDER_NONE; + + // + // Detect Working Zone ... + bool hasWorkingZone = workingZone.IsValid(); + if (!hasWorkingZone) + { + hasWorkingZone = DetectWorkingZone(visionState); + } + result = hasWorkingZone; + if (!result) + { + // + Clean(visionPoiEvents); + Clean(analysePoiEvents); + Clean(decisionPoiEvents); + Clean(consolidationPoiEvents); + + // + Clean(visionCycleEvents); + Clean(analyseCycleEvents); + Clean(decisionCycleEvents); + Clean(consolidationCycleEvents); + + // + visionState.Clean(); + analyseState.Clean(); + decisionState.Clean(); + consolidationState.Clean(); + + // + visionConditions.Clean(); + analyseConditions.Clean(); + decisionConditions.Clean(); + consolidationConditions.Clean(); + + // + visionXConditions.Clean(); + analyseXConditions.Clean(); + decisionXConditions.Clean(); + consolidationXConditions.Clean(); + + // + mConditions.Clean(); + consolidationZBar.Clean(); + + // + return result; + } + + // + // TODO: Remove this ... + UpdateTo(cTime); + DrawWorkingZone( + visionCycleHelper.mPOIDrawer // + ); + + // + // Detect Working Zone Destroy ... + bool isWorkingZoneDetroyed = workingZone.IsDestroyed(); + result = !isWorkingZoneDetroyed; + if (!result) + { + // + workingZone.Clean(); + mWorkingZoneObjects.Clear(); + + // + Clean(visionPoiEvents); + Clean(analysePoiEvents); + Clean(decisionPoiEvents); + Clean(consolidationPoiEvents); + + // + Clean(visionCycleEvents); + Clean(analyseCycleEvents); + Clean(decisionCycleEvents); + Clean(consolidationCycleEvents); + + // + visionState.Clean(); + analyseState.Clean(); + decisionState.Clean(); + consolidationState.Clean(); + + // + visionConditions.Clean(); + analyseConditions.Clean(); + decisionConditions.Clean(); + consolidationConditions.Clean(); + + // + visionXConditions.Clean(); + analyseXConditions.Clean(); + decisionXConditions.Clean(); + consolidationXConditions.Clean(); + + // + mConditions.Clean(); + consolidationZBar.Clean(); + + // + return result; + } + + // + // Checking Target Zone Breaked ... + bool hasTargetZone = targetZone.IsValid(); + if (hasTargetZone) + { + // + XOHCL bar; + bool isInited = bar.Init( + symbol, + period, + zIndex // + ); + + XOHCL cBar; + isInited = + isInited && + bar.GetPreviousBar(cBar); + + // + bool isBullish = targetZone.IsBullish(); + + // + bool isLowerBreaked = + // + bar.high < targetZone.ob.Lower() && + cBar.high < targetZone.ob.Lower() + // + ; + + // + bool isUpperBreaked = + // + bar.low > targetZone.ob.Upper() && + cBar.low > targetZone.ob.Upper() + // + ; + + // + bool isBreaked = isBullish + ? isLowerBreaked + : isUpperBreaked; + if (isBreaked) + { + // + mWorkingZoneObjects.Clear(); + targetZone.Clean(); + + // + // TODO: Remove this ... + DrawWorkingZone( + visionCycleHelper.mPOIDrawer // + ); + } + } + + // + // Detect Order Flow ... + ENUM_X_DIRECTION trend = X_DIRECTION_NONE; + bool hasOrderFlow = workingZone.HasOrderFlow(trend); + if (!hasOrderFlow) + { + // + int orderFlowCount = workingZone.DetectOrderFlow( + symbol, + period, + trend, + visionState, + consolidationState, + analyseState, + decisionState // + ); + hasOrderFlow = IsValidSize(orderFlowCount); + } + + // + bool hasTrend = HasDirection(trend); + bool hasBllishTrend = + hasTrend && + IsBullish(trend); + bool hasBearishTrend = + hasTrend && + IsBearish(trend); + + // result = hasOrderFlow; + // if (!result) + // { + + // // + // Clean(visionPoiEvents); + // Clean(analysePoiEvents); + // Clean(decisionPoiEvents); + // Clean(consolidationPoiEvents); + + // // + // Clean(visionCycleEvents); + // Clean(analyseCycleEvents); + // Clean(decisionCycleEvents); + // Clean(consolidationCycleEvents); + + // // + // visionState.Clean(); + // analyseState.Clean(); + // decisionState.Clean(); + // consolidationState.Clean(); + + // // + // visionConditions.Clean(); + // analyseConditions.Clean(); + // decisionConditions.Clean(); + // consolidationConditions.Clean(); + + // // + // visionXConditions.Clean(); + // analyseXConditions.Clean(); + // decisionXConditions.Clean(); + // consolidationXConditions.Clean(); + + // // + // mConditions.Clean(); + // consolidationZBar.Clean(); + + // // + // return result; + // } + + // + // TODO: Remove this ... + UpdateTo(cTime); + DrawWorkingZone( + visionCycleHelper.mPOIDrawer // + ); + + // + isBullish = IsBullish(trend); + isBearish = IsBearish(trend); + + // + bool hasPriority = workingZone + .DetectPriority( + priority, + trend, + zIndex, + period // + ); + + // + bool hasRewardAmount = CalculateRiskReward( + priority, + reward, + amountPercent // + ); + + // + // Checking Order Flow Break ... + int breakedIDX = -1; + bool isOrderFlowBreaked = + hasOrderFlow && + workingZone.IsOrderFlowBreaked( + breakedIDX, + true, // Force OB Breaked + false, // Force FVG Breaked + zIndex, + period // + ); + + // + // Order Flow Breaked Senario ... + if (isOrderFlowBreaked) + { + // + AddRef( + workingZone.orderFlow[breakedIDX], + workingZone.brokenOrderFlow // + ); + + // + signalZone = workingZone.orderFlow[breakedIDX]; + provider = X121SMC_XWZ_PROVIDER_ACTIVATED_CHOCH; + + // + ArrayRemove( + workingZone.orderFlow, + breakedIDX, + 1 // + ); + + // + CleanupArray( + workingZone.brokenOrderFlow, + 10 // + ); + } + + // + // First Check Last Order Flow FVG ... + XOBFVG youngestOrderFlow; + int youngestOBFVGIDX = GetYoungest(workingZone.orderFlow); + bool hasYoungestOBFVG = IsValidIndex(youngestOBFVGIDX); + if (hasYoungestOBFVG) + { + // + youngestOrderFlow = workingZone.orderFlow[youngestOBFVGIDX]; + + // + XOHCL obWorkerBar; + XOHCL obActivationBar; + + // + XOHCL fvgWorkerBar; + XOHCL fvgActivationBar; + + // + bool isOBBodyOut = false; + bool isOBWorked = youngestOrderFlow + .ob + .IsWorked( + trend, + obWorkerBar, + isOBBodyOut, + false // + ); + + // + bool isOBBodyIn = false; + bool isOBActivated = youngestOrderFlow + .ob + .IsActivated( + trend, + obActivationBar, + isOBBodyIn, + false // + ); + + // + bool isFVGBodyOut = false; + bool isFVGWorked = youngestOrderFlow + .fvg + .IsWorked( + trend, + fvgWorkerBar, + isFVGBodyOut, + false // + ); + + // + bool isFVGBodyIn = false; + bool isFVGActivated = youngestOrderFlow + .fvg + .IsActivated( + trend, + fvgActivationBar, + isFVGBodyIn, + false // + ); + + // + if (!isFVGWorked && + isFVGActivated) + { + // + youngestOrderFlow + .UpdateZones(decisionState); + + // + signalZone = youngestOrderFlow; + youngestOrderFlow.Clean(); + ArrayRemove( + workingZone.orderFlow, + youngestOBFVGIDX, + 1 // + ); + + // + provider = X121SMC_XWZ_PROVIDER_ACTIVATED_ZONE; + } + else + { + // + bool isPriceInsideFVG = + // + IsInside( + consolidationZBar.high, + youngestOrderFlow.fvg // + ) + // + && + // + IsInside( + consolidationZBar.low, + youngestOrderFlow.fvg // + ) + // + ; + + // + if (isPriceInsideFVG) + { + // + youngestOrderFlow + .UpdateZones(decisionState); + + // + signalZone = youngestOrderFlow; + youngestOrderFlow.Clean(); + ArrayRemove( + workingZone.orderFlow, + youngestOBFVGIDX, + 1 // + ); + + // + provider = X121SMC_XWZ_PROVIDER_PRICE_INSIDE_ZONE; + } + } + + // + fvgWorkerBar.Clean(); + fvgActivationBar.Clean(); + } + + // + // Check New Order Blocks ... + bool hasNewConsolidationBullishOB = Contains( + X_BULLISH_ORDERBLOCK_DETECTED, + consolidationPoiEvents // + ); + bool hasNewConsolidationBearishOB = Contains( + X_BEARISH_ORDERBLOCK_DETECTED, + consolidationPoiEvents // + ); + bool hasNewOB = hasNewConsolidationBullishOB || + hasNewConsolidationBearishOB; + + // + // Check New Fair Value Gaps ... + bool hasNewConsolidationBullishFVG = Contains( + X_BULLISH_FVG_DETECTED, + consolidationPoiEvents // + ); + bool hasNewConsolidationBearishFVG = Contains( + X_BEARISH_FVG_DETECTED, + consolidationPoiEvents // + ); + bool hasNewFVG = hasNewConsolidationBullishFVG || + hasNewConsolidationBearishFVG; + + // + // Check New Order Blocks ... + bool hasNewAnalyseBullishOrderBlock = Contains( + X_BULLISH_ORDERBLOCK_DETECTED, + analysePoiEvents // + ); + bool hasNewAnalyseBearishOrderBlock = Contains( + X_BEARISH_ORDERBLOCK_DETECTED, + analysePoiEvents // + ); + bool hasNewAnalyseOB = hasNewAnalyseBullishOrderBlock || + hasNewAnalyseBearishOrderBlock; + + // + // Check New Fair Value Gaps ... + bool hasNewAnalyseBullishFVG = Contains( + X_BULLISH_FVG_DETECTED, + analysePoiEvents // + ); + bool hasNewAnalyseBearishFVG = Contains( + X_BEARISH_FVG_DETECTED, + analysePoiEvents // + ); + bool hasNewAnalyseFVG = hasNewAnalyseBullishFVG || + hasNewAnalyseBearishFVG; + + // + // Do Order Flow Actions when new Order Blocks + // or FVGs Formed ... + if (hasNewOB || + hasNewFVG || + hasNewAnalyseOB || + hasNewAnalyseFVG) + { + // + XCFVG *newFVG = NULL; + XCOrderBlock *newOB = NULL; + XCFVG *newAnalyseFVG = NULL; + XCOrderBlock *newAnalyseOB = NULL; + + // + bool isValid = false; + bool hasWaitingZone = waitingZone.IsValid(); + + // + int idx = -1; + if (hasNewOB) + { + // + if (hasNewConsolidationBullishOB) + { + // + idx = consolidationState.CountBullishOrderBlocks() - 1; + newOB = consolidationState.bullishOrderBlocks[idx]; + } + else + { + // + idx = consolidationState.CountBearishOrderBlocks() - 1; + newOB = consolidationState.bearishOrderBlocks[idx]; + } + + // + if (hasWaitingZone) + { + } + else + { + // + isValid = + !waitingZone.HasOB() + ? true + : !IsSame( + newOB, + waitingZone.ob // + ); + if (isValid) + { + // + bool isAbove = IsAbove( + newOB, + youngestOrderFlow.ob, + true // Ignore Inside ... + ); + bool isBelow = IsBelow( + newOB, + youngestOrderFlow.ob, + true // Ignore Inside ... + ); + + // + isValid = + isBullish + ? isAbove + : isBelow; + + // + if (isValid) + { + waitingZone.ob = newOB; + } + } + } + } + + // + if (hasNewFVG) + { + // + if (hasNewConsolidationBullishFVG) + { + // + idx = consolidationState.CountBullishFairValueGaps() - 1; + newFVG = consolidationState.bullishFairValueGaps[idx]; + } + else + { + // + idx = consolidationState.CountBearishFairValueGaps() - 1; + newFVG = consolidationState.bearishFairValueGaps[idx]; + } + } + + // + if (hasNewAnalyseOB) + { + // + if (hasNewAnalyseBullishOrderBlock) + { + // + idx = analyseState.CountBullishOrderBlocks() - 1; + newAnalyseOB = analyseState.bullishOrderBlocks[idx]; + } + else + { + // + idx = analyseState.CountBearishOrderBlocks() - 1; + newAnalyseOB = analyseState.bearishOrderBlocks[idx]; + } + } + + // + if (hasNewAnalyseFVG) + { + // + if (hasNewAnalyseBullishFVG) + { + // + idx = analyseState.CountBullishFairValueGaps() - 1; + newAnalyseFVG = analyseState.bullishFairValueGaps[idx]; + } + else + { + // + idx = analyseState.CountBearishFairValueGaps() - 1; + newAnalyseFVG = analyseState.bearishFairValueGaps[idx]; + } + + // + if (hasWaitingZone) + { + } + else + { + // + if (waitingZone.HasOB()) + { + // + XCFVG *tmpFVGs[]; + XCFVG *tmpWorkingFVGs[]; + bool isOBBullish = waitingZone.ob.IsBullish(); + if (isOBBullish) + { + Copy( + analyseState.bullishFairValueGaps, + tmpFVGs // + ); + } + else + { + Copy( + analyseState.bearishFairValueGaps, + tmpFVGs // + ); + } + + // + for (int j = 0; j < ArraySize(tmpFVGs); j++) + { + // + XCFVG *jFVG = tmpFVGs[j]; + + // + // Check Start Date ... + bool isFromPassed = jFVG.From() > waitingZone.ob.From(); + if (!isFromPassed) + { + // + ZeroMemory(jFVG); + continue; + } + + // + // Check Place ... + + // + bool isAbove = IsAboveDiff( + jFVG, + waitingZone.ob, + true // + ); + + // + bool isBelow = IsBelowDiff( + jFVG, + waitingZone.ob, + true // + ); + + // + bool isInside = IsInsideDiff( + jFVG, + waitingZone.ob, + false // + ); + + // + bool isPlacePassed = + isInside || + (isBullish + ? isAbove + : isBelow); + if (!isPlacePassed) + { + // + ZeroMemory(jFVG); + continue; + } + + // + Add( + jFVG, + tmpWorkingFVGs // + ); + } + + // + int fvgsCount = ArraySize(tmpWorkingFVGs); + isValid = IsValidSize(fvgsCount); + if (isValid) + { + // + idx = + isBullish + ? GetLowest(tmpWorkingFVGs) + : GetHighest(tmpWorkingFVGs); + + // + if (IsValidIndex(idx)) + { + // + XCFVG *selectedFVG = tmpWorkingFVGs[idx]; + + // + waitingZone.fvg = selectedFVG; + + // + bool isExists = FindIndex( + idx, + selectedFVG, + tmpFVGs // + ); + if (isExists) + { + // + ArrayRemove( + tmpFVGs, + idx, + 1 // + ); + } + } + } + + // + Clean(tmpFVGs); + Clean(tmpWorkingFVGs); + } + } + } + + // + hasWaitingZone = waitingZone.IsValid(); + if (hasWaitingZone) + { + // + bool isSameDir = waitingZone.GetDirection() == trend; + if (!isSameDir) + { + targetZone = waitingZone; + } + else + { + // + workingZone.AddOrderFlowItem(waitingZone); + + // + // TODO: Remove this ... + mWorkingZoneObjects.Clear(); + DrawWorkingZone( + visionCycleHelper.mPOIDrawer // + ); + } + + // + waitingZone.Clean(); + } + + // + if (signalZone.IsValid() && + provider == X121SMC_XWZ_PROVIDER_ACTIVATED_CHOCH) + { + // + ENUM_X_DIRECTION iForDir = Opposit(signalZone.GetDirection()); + if (hasNewAnalyseOB && + hasNewAnalyseFVG) + { + // + bool isSameDir = + newAnalyseOB.GetDirection() == iForDir && + newAnalyseFVG.GetDirection() == iForDir; + bool isOneInsideAnoter = + // + (newAnalyseFVG.Upper() < newAnalyseOB.Upper() && + newAnalyseFVG.Upper() > newAnalyseOB.Lower()) + // + || + // + (newAnalyseOB.Upper() < newAnalyseFVG.Upper() && + newAnalyseOB.Upper() > newAnalyseFVG.Lower()) + // + ; + + // + bool isZoneDetected = + isSameDir && + isOneInsideAnoter; + if (isZoneDetected) + { + // + XOBFVG iSignalZone; + iSignalZone.ob = newAnalyseOB; + iSignalZone.fvg = newAnalyseFVG; + + // + chochZone = iSignalZone; + } + } + } + + // + ZeroMemory(newOB); + ZeroMemory(newFVG); + ZeroMemory(newAnalyseOB); + ZeroMemory(newAnalyseFVG); + } + + // + bool isPriceInsideCHOCHZone = false; + bool hasCHOCHZone = chochZone.IsValid(); + if (hasCHOCHZone) + { + // + XCBaseObject *objects[]; + bool isCreated = visionCycleHelper + .mPOIDrawer + .DrawOBFVG( + chochZone, + objects // + ); + if (isCreated) + { + AddDrawnObjects(objects); + } + + // + XOHCL cBar; + bool isInited = cBar.Init( + symbol, + period, + cIndex // + ); + + // + isPriceInsideCHOCHZone = + isInited && + cBar.low >= chochZone.fvg.Lower() && + cBar.high <= chochZone.fvg.Upper(); + if (isPriceInsideCHOCHZone) + { + // + // Reverse Trend and ReCalculate Requirements + // For CHOCH Tradng ... + + // + trend = chochZone.GetDirection(); + + // + isBullish = IsBullish(trend); + isBearish = IsBearish(trend); + + // + bool hasPriority = workingZone + .DetectPriority( + priority, + trend, + zIndex, + period // + ); + + // + bool hasRewardAmount = CalculateRiskReward( + priority, + reward, + amountPercent // + ); + + // + provider = X121SMC_XWZ_PROVIDER_ACTIVATED_CHOCH; + } + + // + cBar.Clean(); + } + + // + // Reading Trand Line Value ... + double zValue = workingZone.GetOrderFlowTrendLinePrice( + zIndex, + period // + ); + double cValue = workingZone.GetOrderFlowTrendLinePrice( + cIndex, + period // + ); + double pValue = workingZone.GetOrderFlowTrendLinePrice( + pIndex, + period // + ); + double ppValue = workingZone.GetOrderFlowTrendLinePrice( + ppIndex, + period // + ); + + // + // Implementing Signals ... + // + + // + // TODO: Implement Order Flow Side Trading Senario ... + bool hasOrderFlowConditions = + hasTrend && + hasPriority && + hasRewardAmount && + signalZone.IsValid() && + provider == X121SMC_XWZ_PROVIDER_ACTIVATED_ZONE; + + // + hasOrderFlowhBullishConditions = + isBullish && + hasOrderFlowConditions && + signalZone.IsBullish(); + + // + hasOrderFlowhBearishConditions = + isBearish && + hasOrderFlowConditions && + signalZone.IsBearish(); + + // + if (hasOrderFlowConditions) + { + // + mConditions.signalZone = signalZone; + mConditions.targetZone = targetZone; + + // + point = hasOrderFlowhBullishConditions + ? signalZone.ob.Upper() + : signalZone.ob.Lower(); + + // + pivot = hasOrderFlowhBullishConditions + ? signalZone.ob.Lower() + : signalZone.ob.Upper(); + + // + signalZone.Clean(); + } + + // + // TODO: Implement Inside Zone Trading Senario ... + bool hasInsideZoneConditions = + hasTrend && + hasPriority && + hasRewardAmount && + signalZone.IsValid() && + provider == X121SMC_XWZ_PROVIDER_PRICE_INSIDE_ZONE; + + // + bool hasInsideZoneBullishConditions = + isBullish && + signalZone.IsBullish() && + hasInsideZoneConditions; + + // + bool hasInsideZoneBearishConditions = + isBearish && + signalZone.IsBearish() && + hasInsideZoneConditions; + + // + if (hasInsideZoneConditions) + { + // + mConditions.signalZone = signalZone; + mConditions.targetZone = targetZone; + + // + point = hasOrderFlowhBullishConditions + ? signalZone.ob.Upper() + : signalZone.ob.Lower(); + + // + pivot = hasOrderFlowhBullishConditions + ? signalZone.ob.Lower() + : signalZone.ob.Upper(); + + // + signalZone.Clean(); + } + + // + // TODO: Implement CHOCH Trading Senario ... + bool hasCHOCHConditions = + hasCHOCHZone && + chochZone.IsValid() && + isPriceInsideCHOCHZone && + provider == X121SMC_XWZ_PROVIDER_ACTIVATED_CHOCH; + + // + hasChochBullishConditions = + hasCHOCHConditions && + chochZone.IsBullish(); + hasChochBearishConditions = + hasCHOCHConditions && + chochZone.IsBearish(); + + // + if (hasCHOCHConditions) + { + // + mConditions.signalZone = chochZone; + mConditions.targetZone = targetZone; + + // + point = hasChochBullishConditions + ? chochZone.ob.Upper() + : chochZone.ob.Lower(); + + // + pivot = hasChochBearishConditions + ? chochZone.ob.Lower() + : chochZone.ob.Upper(); + + // + chochZone.Clean(); + signalZone.Clean(); + } + + // + // TODO: Implement Trend Line Trading Senario ... + + // + // TODO: Implement Quarter Line Trading Senario ... + + // + // TODO: Implement Supply and Demand Trading Senario ... + + // + // TODO: Implement Support and Resistance Trading Senario ... + + // + // TODO: Implement Mitigation Blocks Trading Senario ... + + // + // Summarize ... + + // + bool hasBullishConditions = + // + hasChochBullishConditions || + hasSupDemBullishConditions || + hasSupResBullishConditions || + hasTrendLineBullishConditions || + hasOrderFlowhBullishConditions || + hasInsideZoneBullishConditions || + hasBQuarterLineBullishConditions + // + ; + + // + bool hasBearishConditions = + // + hasChochBearishConditions || + hasSupDemBearishConditions || + hasSupResBearishConditions || + hasTrendLineBearishConditions || + hasOrderFlowhBearishConditions || + hasInsideZoneBearishConditions || + hasBQuarterLineBearishConditions + // + ; + + // + result = + hasBullishConditions || + hasBearishConditions; + + // + if (result) + { + // + mConditions.dir = trend; + mConditions.pivot = pivot; + mConditions.point = point; + mConditions.reward = reward; + mConditions.target = target; + mConditions.setupTime = cTime; + mConditions.priority = priority; + mConditions.provider = provider; + mConditions.amountPercent = amountPercent; + } + + // + // Cleanups ... + + // + Clean(visionPoiEvents); + Clean(analysePoiEvents); + Clean(decisionPoiEvents); + Clean(consolidationPoiEvents); + + // + Clean(visionCycleEvents); + Clean(analyseCycleEvents); + Clean(decisionCycleEvents); + Clean(consolidationCycleEvents); + + // + visionState.Clean(); + analyseState.Clean(); + decisionState.Clean(); + consolidationState.Clean(); + + // + visionConditions.Clean(); + analyseConditions.Clean(); + decisionConditions.Clean(); + consolidationConditions.Clean(); + + // + visionXConditions.Clean(); + analyseXConditions.Clean(); + decisionXConditions.Clean(); + consolidationXConditions.Clean(); + + // + // mConditions.Clean(); + consolidationZBar.Clean(); + + // + return result; + } + + // + // Detect Trigger Conditions ... + bool DetectSignalTrigger( + // + X121SMCStrategyXWZSignalConditions &conditions, + // + string _symbol, + ENUM_TIMEFRAMES _period, + // + XC121SMCCycleHelper *decisionCycleHelper, + XC121SMCCycleHelper *analyseCycleHelper, + XC121SMCCycleHelper *consolidationCycleHelper, + XC121SMCCycleHelper *visionCycleHelper, + // + int maxAllowedSetupAge = 60 + // + ) + { + // + bool result = false; + + // + result = + // + visionCycleHelper != NULL && + analyseCycleHelper != NULL && + decisionCycleHelper != NULL && + consolidationCycleHelper != NULL + // + ; + if (!result) + { + return result; + } + + // + result = conditions.IsSetuped(); + if (!result) + { + return result; + } + + // + datetime setupTime = conditions.setupTime; + ENUM_X_DIRECTION setupDir = conditions.dir; + + // + bool isBullish = IsBullish(setupDir); + bool isBearish = IsBearish(setupDir); + + // + int zIndex = 0; + int cIndex = zIndex + 1; + int pIndex = cIndex + 1; + int ppIndex = pIndex + 1; + + // + int loopback = 10; + + // + double ask = GetAsk(symbol); + double bid = GetBid(symbol); + datetime cTime = TimeCurrent(); + double points = GetPoints(symbol); + + // + double sls[]; + + // + // Cycles Conditions ... + + // + // Decision ... + ENUM_XPOI_EVENTS decisionPoiEvents[]; + ENUM_X_CYCLE_EVENTS decisionCycleEvents[]; + X121SMCCycleConditions decisionConditions; + result = decisionCycleHelper.GetConditions( + decisionCycleEvents, + decisionPoiEvents, + decisionConditions, + zIndex, + loopback // + ); + if (!result) + { + // + // Cleanup ... + + // + Clean(decisionPoiEvents); + Clean(decisionCycleEvents); + + // + decisionConditions.Clean(); + + // + return result; + } + + // + // Cycles POI States ... + XPOIState decisionState = decisionConditions.state; + + // + // Cycle X121Conditions ... + X121Conditions decisionXConditions = decisionConditions.x121Conditions; + + // + // Check Signal Validation ... + + // + XOHCL cBar; + bool isInited = cBar.Init( + conditions.symbol, + conditions.period, + cIndex // + ); + XOHCL pBar; + isInited = + isInited && + cBar.GetPreviousBar(pBar); + bool isLowerBreaked = + // + isInited && + cBar.high < conditions.point && + pBar.high >= conditions.point + // + ; + bool isUpperBreaked = + // + isInited && + cBar.low > conditions.point && + pBar.low <= conditions.point + // + ; + bool isZoneBreaked = + (isBullish && + isLowerBreaked) || + (isBearish && + isUpperBreaked); + result = !isZoneBreaked; + if (!result) + { + // + cBar.Clean(); + pBar.Clean(); + conditions.Clean(); + + // + Clean(decisionPoiEvents); + Clean(decisionCycleEvents); + + // + decisionState.Clean(); + decisionConditions.Clean(); + decisionXConditions.Clean(); + } + + // + cBar.Clean(); + pBar.Clean(); + + // + double bullishScore = 0; + double bearishScore = 0; + decisionXConditions.GenerateScore( + bullishScore, + bearishScore // + ); + bool isBullishScorePassed = + isBullish && + bullishScore > (bearishScore * 1.5); + bool isBearishScorePassed = + isBearish && + bearishScore > (bullishScore * 1.5); + bool isScorePassed = isBullishScorePassed || + isBearishScorePassed; + + // + // Base SL Used Pivot of Conditions ... + // Add( + // conditions.pivot, + // sls // + // ); + + // + int lowestSupportIDX = -1; + int highestResistanceIDX = -1; + bool isSupportRejected = false; + bool isResistanceRejected = false; + bool hasSignalZone = conditions.signalZone.IsValid(); + if (hasSignalZone) + { + // + conditions + .signalZone + .UpdateZones(decisionState); + conditions + .signalZone + .UpdateTo(cTime); + + // + XOHCL cBar; + bool isBarInited = cBar.Init( + conditions.symbol, + conditions.period, + cIndex // + ); + + // + lowestSupportIDX = GetLowest(conditions.signalZone.supportZones); + if (IsValidIndex(lowestSupportIDX)) + { + // + isSupportRejected = + // + isBarInited && + ( + // + (cBar.low < conditions.signalZone.supportZones[lowestSupportIDX].Upper() && + cBar.GetDown() > conditions.signalZone.supportZones[lowestSupportIDX].Upper()) + // + || + // + (cBar.low < conditions.signalZone.supportZones[lowestSupportIDX].Lower() && + cBar.GetDown() > conditions.signalZone.supportZones[lowestSupportIDX].Lower()) + // + ) + // + ; + + // + isSupportRejected = + isBullish && + isSupportRejected; + if (isSupportRejected) + { + // + double vPivot = conditions.signalZone.supportZones[lowestSupportIDX].Lower(); + bool canSetPivot = vPivot > conditions.pivot && + vPivot < conditions.point; + if (canSetPivot) + { + // + Add( + vPivot, + sls // + ); + } + } + } + + // + highestResistanceIDX = GetHighest(conditions.signalZone.resistanceZones); + if (IsValidIndex(highestResistanceIDX)) + { + // + isResistanceRejected = + // + isBarInited && + ( + // + (cBar.high > conditions.signalZone.resistanceZones[highestResistanceIDX].Upper() && + cBar.GetUp() < conditions.signalZone.resistanceZones[highestResistanceIDX].Upper()) + // + || + // + (cBar.high > conditions.signalZone.resistanceZones[highestResistanceIDX].Lower() && + cBar.GetUp() < conditions.signalZone.resistanceZones[highestResistanceIDX].Lower()) + // + ) + // + ; + + // + isResistanceRejected = + isBearish && + isResistanceRejected; + if (isResistanceRejected) + { + // + double vPivot = conditions.signalZone.resistanceZones[highestResistanceIDX].Upper(); + bool canSetPivot = vPivot < conditions.pivot && + vPivot > conditions.point; + if (canSetPivot) + { + // + Add( + vPivot, + sls // + ); + } + } + } + + // + cBar.Clean(); + } + + // + // Consolidation Zone Detection ... + + // + // Detect Consolidation Zones ... + + // + // Bullish Consolidation Zone ... + XConsolidationZone bullishCZones[]; + bool hasBullishConsolidationZone = false; + XConsolidationZone bullishConsolidationZone; + int bullishCZonesCount = decisionCycleHelper.FillConsolidationZones( + X_DIRECTION_BULLISH, + bullishCZones // + ); + bool hasBullishConsolidationZones = IsValidSize(bullishCZonesCount); + if (hasBullishConsolidationZones) + { + // + int idx = -1; + while (HasChild(bullishCZones)) + { + // + idx = GetYoungest(bullishCZones); + hasBullishConsolidationZone = IsValidIndex(idx); + if (hasBullishConsolidationZone) + { + // + bullishConsolidationZone = bullishCZones[idx]; + + // + ArrayRemove( + bullishCZones, + idx, + 1 // + ); + + // + // Check Zone Based On pivot, since this is the SL ... + hasBullishConsolidationZone = + isBullish && + hasBullishConsolidationZone && + bullishConsolidationZone.lower > conditions.pivot && + bullishConsolidationZone.upper <= conditions.point; + if (hasBullishConsolidationZone) + { + // + XCConsolidationZoneObject *iObj; + bool isCreated = decisionCycleHelper.mPOIDrawer.CreateConsolidationZone( + bullishConsolidationZone, + iObj // + ); + if (isCreated) + { + mObjects.Add(iObj); + } + + // + Add( + bullishConsolidationZone.lower, + sls // + ); + } + } + } + } + Clean(bullishCZones); + bullishConsolidationZone.Clean(); + + // + // Bearish Consolidation Zone ... + XConsolidationZone bearishCZones[]; + bool hasBearishConsolidationZone = false; + XConsolidationZone bearishConsolidationZone; + int bearishCZonesCount = decisionCycleHelper.FillConsolidationZones( + X_DIRECTION_BEARISH, + bearishCZones // + ); + bool hasBearishConsolidationZones = IsValidSize(bearishCZones); + if (hasBearishConsolidationZones) + { + // + int idx = -1; + while (HasChild(bearishCZones)) + { + // + idx = GetYoungest(bearishCZones); + hasBearishConsolidationZone = IsValidIndex(idx); + if (hasBearishConsolidationZone) + { + // + bearishConsolidationZone = bearishCZones[idx]; + + // + ArrayRemove( + bearishCZones, + idx, + 1 // + ); + + // + hasBearishConsolidationZone = + isBearish && + hasBearishConsolidationZone && + bearishConsolidationZone.upper < conditions.pivot && + bearishConsolidationZone.lower >= conditions.point; + if (hasBearishConsolidationZone) + { + // + Add( + bearishConsolidationZone.upper, + sls // + ); + } + } + } + } + Clean(bearishCZones); + bearishConsolidationZone.Clean(); + + // + // Check VWap Crossing ... + + // + bool isVWapSwitchedToBullish = + // + (decisionXConditions.isVWapBullishOrdered && + decisionXConditions.isVWapSwitchedToBullishState) + // + || + // + (decisionXConditions.isVWapBullishState && + decisionXConditions.isVWapSwitchedToBullishOrdered) + // + ; + + // + isVWapSwitchedToBullish = + isBullish && + isVWapSwitchedToBullish; + if (isVWapSwitchedToBullish) + { + // + double vPivot = decisionXConditions.vwapMin; + bool canSetPivot = vPivot > conditions.pivot && + vPivot < conditions.point; + if (canSetPivot) + { + // + Add( + vPivot, + sls // + ); + } + } + + // + bool isVWapSwitchedToBearish = + // + (decisionXConditions.isVWapBearishOrdered && + decisionXConditions.isVWapSwitchedToBearishState) + // + || + // + (decisionXConditions.isVWapBearishState && + decisionXConditions.isVWapSwitchedToBearishOrdered) + // + ; + + // + isVWapSwitchedToBearish = + isBearish && + isVWapSwitchedToBearish; + if (isVWapSwitchedToBearish) + { + // + double vPivot = decisionXConditions.vwapMax; + bool canSetPivot = vPivot < conditions.pivot && + vPivot > conditions.point; + if (canSetPivot) + { + // + Add( + vPivot, + sls // + ); + } + } + + // + // Point Break ... + isInited = cBar.Init( + conditions.symbol, + conditions.period, + cIndex // + ); + double point = conditions.point; + bool isPointBreaked = + isInited && + IsBarBreak( + point, + setupDir, + cBar // + ); + cBar.Clean(); + + // + bool isCommonsPassed = + // + (isSupportRejected || + isResistanceRejected || + isVWapSwitchedToBullish || + isVWapSwitchedToBearish || + hasBullishConsolidationZone || + hasBearishConsolidationZone) + // + ; + + // + // Trigger Conditions ... + + // + bool canTriggerCHOCHZone = + // + isScorePassed && + isCommonsPassed && + conditions.provider == X121SMC_XWZ_PROVIDER_ACTIVATED_CHOCH + // + ; + + // + bool canTriggerActivatedZone = + // + // isPointBreaked && + isScorePassed && + isCommonsPassed && + conditions.provider == X121SMC_XWZ_PROVIDER_ACTIVATED_ZONE + // + ; + + // + bool canTriggerPriceInsideZone = + // + isScorePassed && + isCommonsPassed && + conditions.provider == X121SMC_XWZ_PROVIDER_PRICE_INSIDE_ZONE + // + ; + + // + bool canTrigger = (canTriggerCHOCHZone || + canTriggerActivatedZone || + canTriggerPriceInsideZone); + + // + // Summary ... + + // + isBullish = + // + isBullish && + canTrigger + // + ; + + // + isBearish = + // + isBearish && + canTrigger + // + ; + + // + result = isBullish || + isBearish; + if (!result) + { + // + // Cleanup Setup Conditions ... + int setupAge = conditions.GetSetupAge(); + if (IsValidSize(setupAge) && + IsValidSize(maxAllowedSetupAge) && + setupAge >= maxAllowedSetupAge) + { + conditions.Clean(); + } + + // + // Cleanup ... + + // + Clean(decisionPoiEvents); + Clean(decisionCycleEvents); + + // + decisionState.Clean(); + decisionConditions.Clean(); + decisionXConditions.Clean(); + + // + return result; + } + + // + double entry = GetEntry( + conditions.symbol, + setupDir // + ); + + // + // Manipulate SL Based on Consolidation Zones ... + + // + // TODO: Add Consolidation Zone for SLs ... + + // + double iAtr = decisionXConditions.atrBuffer[1]; + iAtr *= 1.5; + + // + // Since Pivot Value almost used + // as Default SL, if there isn't any Refind SL + // we use Default ... + if (!HasChild(sls)) + { + // + Add( + conditions.pivot, + sls // + ); + } + + // + double slsMin = GetMin(sls); + double slsMax = GetMax(sls); + + // + double sl = isBullish + ? slsMin - iAtr + : slsMax + iAtr; + double risk = MathAbs(entry - sl); + + // + // Filling Conditions Props ... + conditions.sl = sl; + conditions.triggerTime = cTime; + conditions.type = isBullish + ? X_POSITION_TYPE_LONG + : X_POSITION_TYPE_SHORT; + + // + // Cleanup ... + + // + Clean(decisionPoiEvents); + Clean(decisionCycleEvents); + + // + decisionState.Clean(); + decisionConditions.Clean(); + decisionXConditions.Clean(); + + // + return result; + } + + // + // Detect Guards ... + bool DetectGuards( + // + X121SMCGuard &guards[], + const XPosition &positions[], + // + XC121SMCCycleHelper *decisionCycleHelper, + XC121SMCCycleHelper *analyseCycleHelper, + XC121SMCCycleHelper *consolidationCycleHelper, + XC121SMCCycleHelper *visionCycleHelper + // + ) + { + // + bool result = false; + + // + Clean(guards); + + // + bool isCycleHelpersValid = + // + visionCycleHelper != NULL && + analyseCycleHelper != NULL && + decisionCycleHelper != NULL && + consolidationCycleHelper != NULL + // + ; + + // + return false; + + // + result = isCycleHelpersValid; + if (!result) + { + return result; + } + + // + int count = ArraySize(positions); + result = IsValidSize(count); + if (!result) + { + return result; + } + + // + string provider = ToString(X_121_SMC_PROVIDER_XWZ); + + // + XPosition ownPositions[]; + XPosition ownLongPositions[]; + XPosition ownShortPositions[]; + for (int i = 0; i < count; i++) + { + // + XPosition iPosition = positions[i]; + bool isOwn = iPosition + .IsFiltersPassed( + symbol, + provider, + NULL, + X_POSITION_TYPE_ALL, + iPosition.magic // + ); + if (isOwn) + { + // + AddRef( + iPosition, + ownPositions // + ); + + // + bool isLong = IsLong(positions[i].type); + if (isLong) + { + // + AddRef( + iPosition, + ownLongPositions // + ); + } + else + { + // + AddRef( + iPosition, + ownShortPositions // + ); + } + } + } + + // + count = ArraySize(ownPositions); + + // + int longsCount = ArraySize(ownLongPositions); + bool hasLongs = IsValidSize(longsCount); + + // + int shortsCount = ArraySize(ownShortPositions); + bool hasShorts = IsValidSize(shortsCount); + + // + result = IsValidSize(count); + if (!result) + { + // + Clean(ownPositions); + Clean(ownLongPositions); + Clean(ownShortPositions); + + // + return result; + } + + // + // + // + + // + // Get Global and Common Guards ... + + // + ENUM_X_121_SMC_GUARD_ACTIONS ignoreGuards[1] = { + X_121_SMC_GUARD_ACTION_TRAIL_STOP // + }; + result = DetectX121SMCGuards( + provider, + guards, + positions, + decisionCycleHelper, + analyseCycleHelper, + consolidationCycleHelper, + visionCycleHelper, + // + ignoreGuards + // + ); + + // + // + // + + // + // Get Custom Implemented Guards ... + + // + // Here we Are Sure there is Positions to Guard ... + // based on Current Provider ... + + // + // Detect Required Data for Analyse Market to Guard Positions ... + + // + int zIndex = 0; + int cIndex = zIndex + 1; + int pIndex = cIndex + 1; + int ppIndex = pIndex + 1; + + // + int loopback = 10; + + // + XOHCL zBar; + result = zBar.Init( + symbol, + period, + zIndex // + ); + if (!result) + { + // + result = HasChild(guards); + return result; + } + + // + XOHCL cBar; + result = cBar.Init( + symbol, + period, + cIndex // + ); + if (!result) + { + // + zBar.Clean(); + result = HasChild(guards); + return result; + } + + // + XOHCL pBar; + result = pBar.Init( + symbol, + period, + pIndex // + ); + if (!result) + { + // + zBar.Clean(); + cBar.Clean(); + result = HasChild(guards); + return result; + } + + // + XOHCL ppBar; + result = ppBar.Init( + symbol, + period, + ppIndex // + ); + if (!result) + { + // + zBar.Clean(); + cBar.Clean(); + pBar.Clean(); + result = HasChild(guards); + return result; + } + + // + double ask = GetAsk(symbol); + double bid = GetBid(symbol); + datetime cTime = TimeCurrent(); + double points = GetPoints(symbol); + + // + + // + // Cycles Conditions ... + + // + // Decision ... + ENUM_XPOI_EVENTS decisionPoiEvents[]; + ENUM_X_CYCLE_EVENTS decisionCycleEvents[]; + X121SMCCycleConditions decisionConditions; + result = decisionCycleHelper.GetConditions( + decisionCycleEvents, + decisionPoiEvents, + decisionConditions, + zIndex, + loopback // + ); + if (!result) + { + // + zBar.Clean(); + cBar.Clean(); + pBar.Clean(); + ppBar.Clean(); + result = HasChild(guards); + return result; + } + + // + // Analyse ... + ENUM_XPOI_EVENTS analysePoiEvents[]; + ENUM_X_CYCLE_EVENTS analyseCycleEvents[]; + X121SMCCycleConditions analyseConditions; + result = analyseCycleHelper.GetConditions( + analyseCycleEvents, + analysePoiEvents, + analyseConditions, + zIndex, + loopback // + ); + if (!result) + { + // + zBar.Clean(); + cBar.Clean(); + pBar.Clean(); + ppBar.Clean(); + + // + Clean(decisionPoiEvents); + Clean(decisionCycleEvents); + + // + decisionConditions.Clean(); + + // + result = HasChild(guards); + return result; + } + + // + // Consolidation ... + ENUM_XPOI_EVENTS consolidationPoiEvents[]; + ENUM_X_CYCLE_EVENTS consolidationCycleEvents[]; + X121SMCCycleConditions consolidationConditions; + result = consolidationCycleHelper.GetConditions( + consolidationCycleEvents, + consolidationPoiEvents, + consolidationConditions, + zIndex, + loopback // + ); + if (!result) + { + // + zBar.Clean(); + cBar.Clean(); + pBar.Clean(); + ppBar.Clean(); + + // + Clean(decisionPoiEvents); + Clean(decisionCycleEvents); + + // + decisionConditions.Clean(); + + // + Clean(analysePoiEvents); + Clean(analyseCycleEvents); + + // + analyseConditions.Clean(); + + // + result = HasChild(guards); + return result; + } + + // + // Vision ... + ENUM_XPOI_EVENTS visionPoiEvents[]; + ENUM_X_CYCLE_EVENTS visionCycleEvents[]; + X121SMCCycleConditions visionConditions; + result = visionCycleHelper.GetConditions( + visionCycleEvents, + visionPoiEvents, + visionConditions, + zIndex, + loopback // + ); + if (!result) + { + // + zBar.Clean(); + cBar.Clean(); + pBar.Clean(); + ppBar.Clean(); + + // + Clean(decisionPoiEvents); + Clean(decisionCycleEvents); + + // + decisionConditions.Clean(); + + // + Clean(analysePoiEvents); + Clean(analyseCycleEvents); + + // + analyseConditions.Clean(); + + // + Clean(consolidationPoiEvents); + Clean(consolidationCycleEvents); + + // + consolidationConditions.Clean(); + + // + result = HasChild(guards); + return result; + } + + // + // Cycles POI States ... + XPOIState decisionState = decisionConditions.state; + XPOIState analyseState = analyseConditions.state; + XPOIState consolidationState = consolidationConditions.state; + XPOIState visionState = visionConditions.state; + + // + // Cycle X121Conditions ... + X121Conditions decisionXConditions = decisionConditions.x121Conditions; + X121Conditions analyseXConditions = analyseConditions.x121Conditions; + X121Conditions consolidationXConditions = consolidationConditions.x121Conditions; + X121Conditions visionXConditions = visionConditions.x121Conditions; + + // + // + // + + // + // Detect Consolidation Zone ... + + // + // Bullish ... + XConsolidationZone bullishConsolidationZone; + bool hasBullishConsolidationZone = decisionCycleHelper + .GetLastDirectionalConsolidationZone( + X_DIRECTION_BULLISH, + bullishConsolidationZone // + ); + + // + // Bearish ... + XConsolidationZone bearishConsolidationZone; + bool hasBearishConsolidationZone = decisionCycleHelper + .GetLastDirectionalConsolidationZone( + X_DIRECTION_BEARISH, + bearishConsolidationZone // + ); + + // + // Detect High Probability Swings ... + bool isSwingLow = + // + cBar.low > pBar.low && + ppBar.low > pBar.low && + // + zBar.low > pBar.low + // + ; + bool isSwingHigh = + // + cBar.high < pBar.high && + ppBar.high < pBar.high && + // + zBar.high < pBar.high + // + ; + bool isStrongSwingLow = + pBar.IsBullish() && + pBar.GetLowShadow() >= pBar.GetBody() * 2; + bool isStrongSwingHigh = + pBar.IsBearish() && + pBar.GetHighShadow() >= pBar.GetBody() * 2; + + // + // Here We Have all Requirements for Guarding Positions ... + + // + // Available Guards: + // X_121_SMC_GUARD_ACTION_NONE + // X_121_SMC_GUARD_ACTION_CLOSE + // X_121_SMC_GUARD_ACTION_CLOSE_ALL + // X_121_SMC_GUARD_ACTION_CLOSE_LONGS + // X_121_SMC_GUARD_ACTION_CLOSE_SHORTS + // X_121_SMC_GUARD_ACTION_PARTIAL_CLOSE + // X_121_SMC_GUARD_ACTION_TRAIL_STOP + // X_121_SMC_GUARD_ACTION_TRAIL_TARGET + // X_121_SMC_GUARD_ACTION_HEDGE + + // + // X_121_SMC_GUARD_ACTION_CLOSE: + // Close Specified Position on Specified Conditions ... + + // + // X_121_SMC_GUARD_ACTION_CLOSE_ALL: + // Close All Positions on Specified Conditions ... + + // + // X_121_SMC_GUARD_ACTION_CLOSE_LONGS: + // Close All Long Positions on Specified Conditions ... + + // + // X_121_SMC_GUARD_ACTION_CLOSE_SHORTS: + // Close All Short Positions on Specified Conditions ... + + // + // X_121_SMC_GUARD_ACTION_PARTIAL_CLOSE: + // Partial Close Specified Position on Specified Conditions ... + + // + // X_121_SMC_GUARD_ACTION_TRAIL_STOP: + // Trail Stop Specified Position on Specified Conditions ... + for (int i = 0; i < count; i++) + { + // + XPosition iPosition = ownPositions[i]; + + // + bool isLong = IsLong(iPosition.type); + bool isInProfit = iPosition.profit > 0; + + // + double sl = iPosition.sl; + double tp = iPosition.tp; + + // + // Trail Stops Using Consolidation Zones ... + bool canTraiLonglUsingCZone = + // + (isLong && + isInProfit && + hasBullishConsolidationZone && + bullishConsolidationZone.lower > iPosition.sl && + bullishConsolidationZone.lower > iPosition.entry) + // + ; + if (canTraiLonglUsingCZone) + { + sl = bullishConsolidationZone.lower; + } + + // + bool canTraiShortlUsingCZone = + // + (!isLong && + isInProfit && + hasBearishConsolidationZone && + bearishConsolidationZone.upper < iPosition.sl && + bearishConsolidationZone.upper < iPosition.entry) + // + ; + if (canTraiShortlUsingCZone) + { + sl = bearishConsolidationZone.upper; + } + + // + bool canTrailUsingCZone = + canTraiLonglUsingCZone || + canTraiShortlUsingCZone; + + // + // Trail Stops Using Swings ... + + // + bool canTrailLongUsingSwings = + // + isLong && + isInProfit && + (isSwingLow || + isStrongSwingLow) && + pBar.low > iPosition.sl && + pBar.low > iPosition.entry + // + ; + if (canTrailLongUsingSwings) + { + sl = pBar.low; + } + + // + bool canTraiShortlUsingSwings = + // + !isLong && + isInProfit && + (isSwingHigh || + isStrongSwingHigh) && + pBar.high < iPosition.sl && + pBar.high < iPosition.entry + // + ; + if (canTraiShortlUsingSwings) + { + sl = pBar.high; + } + + // + bool canTrailUsingSwings = + canTrailLongUsingSwings || + canTraiShortlUsingSwings; + + // + // + // + + // + bool canTrail = + sl != iPosition.sl && + (canTrailUsingCZone || + canTrailUsingSwings); + if (canTrail) + { + // + X121SMCGuard iGuard; + + // + iGuard.time = cTime; + iGuard.symbol = symbol; + iGuard.provider = provider; + iGuard.action = X_121_SMC_GUARD_ACTION_TRAIL_STOP; + + // + iGuard.ticket = iPosition.ticket; + + // + iGuard.sl = sl; + + // + AddGuard( + iGuard, + guards // + ); + } + } + + // + // X_121_SMC_GUARD_ACTION_TRAIL_TARGET: + // Trail Target Specified Position on Specified Conditions ... + + // + // X_121_SMC_GUARD_ACTION_HEDGE: + // Hedge all Positions on Specified Conditions ... + + // + // Cleanup Collections ... + + // + Clean(ownPositions); + Clean(ownLongPositions); + Clean(ownShortPositions); + + // + zBar.Clean(); + cBar.Clean(); + pBar.Clean(); + ppBar.Clean(); + + // + Clean(visionPoiEvents); + Clean(analysePoiEvents); + Clean(visionCycleEvents); + Clean(decisionPoiEvents); + Clean(analyseCycleEvents); + Clean(decisionCycleEvents); + Clean(consolidationPoiEvents); + Clean(consolidationCycleEvents); + + // + visionState.Clean(); + analyseState.Clean(); + decisionState.Clean(); + visionConditions.Clean(); + analyseConditions.Clean(); + visionXConditions.Clean(); + decisionConditions.Clean(); + consolidationState.Clean(); + analyseXConditions.Clean(); + decisionXConditions.Clean(); + consolidationConditions.Clean(); + consolidationXConditions.Clean(); + + // + count = ArraySize(guards); + result = IsValidSize(count); + + // + return result; + } + + // + // Add Conditions to Conditions Collection ... + int AddConditionsIfNotExists( + int maxAllowed = 10 // + ) + { + // + int result = 0; + + // + bool isSetuped = IsValid(mConditions.setupTime) && + HasDirection(mConditions.dir); + if (!isSetuped) + { + return result; + } + + // + int count = ArraySize(mConditionsCollection); + if (IsValidSize(count)) + { + // + // Copy Original Items ... + X121SMCStrategyXWZSignalConditions tmpItems[]; + Copy( + mConditionsCollection, + tmpItems // + ); + + // + // Prese Item Data ... + bool isBullish = IsBullish(mConditions.dir); + + // + for (int i = 0; i < count; i++) + { + // + X121SMCStrategyXWZSignalConditions iItem = tmpItems[i]; + + // + bool canRemove = mConditions.dir == iItem.dir && + mConditions.pivot == iItem.pivot; + if (canRemove) + { + // + ArrayRemove( + mConditionsCollection, + i, + 1 // + ); + } + } + + // + Clean(tmpItems); + } + + // + AddRef( + mConditions, + mConditionsCollection // + ); + + // + // Remove Olds ... + CleanupArray( + mConditionsCollection, + maxAllowed // + ); + + // + result = ArraySize(mConditionsCollection); + + // + return result; + } + + // + bool DetectWorkingZone( + XPOIState <fState // + ) + { + // + bool result = false; + + // + result = IsValid(symbol) && + IsValid(period); + if (!result) + { + return result; + } + + // + result = !workingZone.IsValid(); + if (!result) + { + return result; + } + + // + workingZone.symbol = symbol; + workingZone.period = period; + + // + int idx = -1; + bool has = false; + + // + has = ltfState.HasSupplyZones(); + if (has) + { + // + idx = GetHighest(ltfState.supplyZones); + if (IsValidIndex(idx)) + { + workingZone.supplyZone = ltfState.supplyZones[idx]; + } + } + + // + has = ltfState.HasDemandZones(); + if (has) + { + // + idx = GetLowest(ltfState.demandZones); + if (IsValidIndex(idx)) + { + workingZone.demandZone = ltfState.demandZones[idx]; + } + } + + // + bool hasWorkingZone = workingZone.HasSupplyZone() && + workingZone.HasDemandZone(); + if (hasWorkingZone) + { + // + double upper = workingZone.supplyZone.Lower(); + double lower = workingZone.demandZone.Upper(); + + // + double delta = ((upper - lower) / 100) * 25; + + // + workingZone.quarter1 = upper - (1 * delta); + workingZone.quarter2 = upper - (2 * delta); + workingZone.quarter3 = upper - (3 * delta); + + // + hasWorkingZone = workingZone.IsValid(); + } + + // + result = hasWorkingZone; + + // + return result; + } + + // + // Draw Functions ... + // + + // + void RemoveDraws() + { + mObjects.Clear(); + } + + // + void DrawBar( + XOHCL &bar, + XCPOIDrawer *drawer, + bool forceClean = true // + ) + { + // + if (forceClean) + { + mBarObjects.Clear(); + } + + // + if (drawer == NULL || + !bar.IsValid()) + { + return; + } + + // + bool isBullish = bar.IsBullish(); + + // + int widthBar = 2; + bool fillShadowsBar = true; + ENUM_LINE_STYLE styleBar = STYLE_SOLID; + color clrBar = + isBullish + ? clrAqua + : clrMagenta; + + // + datetime to = bar.NextAt(); + + // + XCOHCLObject *iObj; + bool isCreated = drawer + .CreateBar( + bar, + iObj, + to // + ); + if (isCreated) + { + // + iObj.BarSpes( + widthBar, + clrBar, + styleBar // + ); + + // + iObj.LowShadowFill(fillShadowsBar); + iObj.HighShadowFill(fillShadowsBar); + + // + mBarObjects.Add(iObj); + } + } + + // + void DrawWorkingZone( + XCPOIDrawer *drawer, + bool drawTrendLine = true, + bool forceClean = false // + ) + { + // + if (drawer == NULL) + { + return; + } + + // + if (forceClean) + { + mWorkingZoneObjects.Clear(); + } + + // + int count = 0; + bool has = false; + bool isCreated = false; + + // + ulong chartID = drawer.ChartIdentification(); + int subWindow = drawer.SubWindowIdentification(); + color bullishColor = drawer.BarBullishColor(); + color bearishColor = drawer.BarBearishColor(); + + // + // Supply Zone ... + has = workingZone.HasSupplyZone(); + if (has) + { + // + XCSupplyZoneObject *iObj; + isCreated = drawer.CreateSupplyZone( + workingZone.supplyZone, + iObj // + ); + + // + if (isCreated) + { + mWorkingZoneObjects.Add(iObj); + } + } + + // + // Demand Zone ... + has = workingZone.HasDemandZone(); + if (has) + { + // + XCDemandZoneObject *iObj; + isCreated = drawer.CreateDemandZone( + workingZone.demandZone, + iObj // + ); + + // + if (isCreated) + { + mWorkingZoneObjects.Add(iObj); + } + } + + // + // Quarters ... + has = workingZone.IsValid(); + if (has) + { + // + double zoneUpper = workingZone.supplyZone.Upper(); + double upper = workingZone.supplyZone.Lower(); + + // + double lower = workingZone.demandZone.Upper(); + double zoneLower = workingZone.demandZone.Lower(); + + // + string prefix = "X121WZone_" + workingZone.symbol + "_" + ToString(workingZone.period); + + // + // Zone Upper ... + CChartObjectHLine *zoneUpperLine; + zoneUpperLine = new CChartObjectHLine(); + isCreated = zoneUpperLine.Create( + chartID, + prefix + "_ZoneTop", + subWindow, + zoneUpper // + ); + if (isCreated) + { + // + zoneUpperLine.Color(clrRed); + + // + mWorkingZoneObjects.Add(zoneUpperLine); + } + + // + // Zone Lower ... + CChartObjectHLine *zoneLowerLine; + zoneLowerLine = new CChartObjectHLine(); + isCreated = zoneLowerLine.Create( + chartID, + prefix + "_ZoneDown", + subWindow, + zoneLower // + ); + if (isCreated) + { + // + zoneLowerLine.Color(clrRed); + + // + mWorkingZoneObjects.Add(zoneLowerLine); + } + + // + // Upper ... + CChartObjectHLine *upperLine; + upperLine = new CChartObjectHLine(); + isCreated = upperLine.Create( + chartID, + prefix + "_Upper", + subWindow, + upper // + ); + if (isCreated) + { + // + upperLine.Color(clrLime); + + // + mWorkingZoneObjects.Add(upperLine); + } + + // + // Lower ... + CChartObjectHLine *lowerLine; + lowerLine = new CChartObjectHLine(); + isCreated = lowerLine.Create( + chartID, + prefix + "_Lower", + subWindow, + lower // + ); + if (isCreated) + { + // + lowerLine.Color(clrLime); + + // + mWorkingZoneObjects.Add(lowerLine); + } + + // + // Quarters ... + + // + // Quarter 1 ... + CChartObjectHLine *q1Line; + q1Line = new CChartObjectHLine(); + isCreated = q1Line.Create( + chartID, + prefix + "_Q1", + subWindow, + workingZone.quarter1 // + ); + if (isCreated) + { + // + q1Line.Color(clrYellow); + + // + mWorkingZoneObjects.Add(q1Line); + } + + // + // Quarter 2 ... + CChartObjectHLine *q2Line; + q2Line = new CChartObjectHLine(); + isCreated = q2Line.Create( + chartID, + prefix + "_Q2", + subWindow, + workingZone.quarter2 // + ); + if (isCreated) + { + // + q2Line.Color(clrYellow); + + // + mWorkingZoneObjects.Add(q2Line); + } + + // + // Quarter 3 ... + CChartObjectHLine *q3Line; + q3Line = new CChartObjectHLine(); + isCreated = q3Line.Create( + chartID, + prefix + "_Q3", + subWindow, + workingZone.quarter3 // + ); + if (isCreated) + { + // + q3Line.Color(clrYellow); + + // + mWorkingZoneObjects.Add(q3Line); + } + } + + // + // Draw Order Flow ... + ENUM_X_DIRECTION trend; + has = workingZone.HasOrderFlow(trend); + if (has) + { + // + bool isBullish = IsBullish(trend); + + // + count = workingZone.CountOrderFlow(); + for (int i = 0; i < count; i++) + { + // + XOBFVG iOBFVG = workingZone.orderFlow[i]; + + // + XCBaseObject *drawnObjects[]; + int drawnObjectsCount = drawer + .DrawOBFVG( + // + iOBFVG, + drawnObjects, + // + true, // Draw Order Block ... + true, // Draw Fair Value Gap ... + false, // Draw Supply Zones ... + false, // Draw Demand Zones ... + false, // Draw Support Zones ... + false // Draw Resistance Zones ... + ); + if (IsValidSize(drawnObjectsCount)) + { + AddDrawnWorkingZoneObjects(drawnObjects); + } + } + + // + // Draw Trend Line ... + if (drawTrendLine) + { + // + XOBFVGPivot pivots[]; + count = workingZone.GetSwings(pivots); + has = count >= 2; + if (has) + { + // + // Get Max / Min ... + double max = 0; + double min = 0; + datetime maxAt = NULL; + datetime minAt = NULL; + for (int i = 0; i < count; i++) + { + // + XOBFVGPivot iPivot = pivots[i]; + + // + if (!iPivot.IsValid()) + { + // + iPivot.Clean(); + continue; + } + + // + // Min ... + bool canSetMin = + min == 0 + ? true + : min > iPivot.value; + if (canSetMin) + { + // + minAt = iPivot.at; + min = iPivot.value; + } + + // + // Max ... + bool canSetMax = + max == 0 + ? true + : max < iPivot.value; + if (canSetMax) + { + // + maxAt = iPivot.at; + max = iPivot.value; + } + + // + iPivot.Clean(); + } + + // + double price1 = + isBullish + ? min + : max; + double price2 = + isBullish + ? max + : min; + datetime time1 = + isBullish + ? minAt + : maxAt; + datetime time2 = + isBullish + ? maxAt + : minAt; + + // + color clrTrend = + isBullish + ? bullishColor + : bearishColor; + + // + string trendName = + ToString(trend) + "_" + "XTRNDL_" + + ToString(period) + "_" + + ToString(price1) + "_" + + ToString(price2) + "_"; + // + ToMD5(ToString(time1)); + + // + CChartObjectTrend *mTrend; + mTrend = new CChartObjectTrend(); + isCreated = mTrend.Create( + chartID, + trendName, + subWindow, + time1, + price1, + time2, + price2 // + ); + + // + if (isCreated) + { + // + mTrend.Width(2); + mTrend.Color(clrTrend); + mTrend.RayRight(true); + + // + mWorkingZoneObjects.Add(mTrend); + } + } + } + + // + // Draw Target Zone ... + has = targetZone.IsValid(); + if (has) + { + // + XCBaseObject *drawnObjects[]; + int drawnObjectsCount = drawer + .DrawOBFVG( + // + targetZone, + drawnObjects, + // + true, // Draw Order Block ... + true, // Draw Fair Value Gap ... + false, // Draw Supply Zones ... + false, // Draw Demand Zones ... + false, // Draw Support Zones ... + false // Draw Resistance Zones ... + ); + if (IsValidSize(drawnObjectsCount)) + { + AddDrawnWorkingZoneObjects(drawnObjects); + } + } + } + + // + } + + // + void DrawConditions( + X121SMCStrategyXWZSignalConditions &conditions, + XCPOIDrawer *drawer, + bool drawTrendLine = true, + bool forceClean = false // + ) + { + // + if (drawer == NULL) + { + return; + } + + // + if (forceClean) + { + mObjects.Clear(); + } + } + + // + protected: + // + + // + private: + // + // Props ... + string symbol; + ENUM_TIMEFRAMES period; + CArrayObj mObjects; + CArrayObj mBarObjects; + CArrayObj mWorkingZoneObjects; + + /** + * Initialize ... + */ + void Init() + { + } + + /** + * DeInitialize ... + */ + void DeInit() + { + // + chochZone.Clean(); + signalZone.Clean(); + targetZone.Clean(); + mConditions.Clean(); + workingZone.Clean(); + Clean(mConditionsCollection); + + // + mObjects.Clear(); + mBarObjects.Clear(); + mWorkingZoneObjects.Clear(); + } + + /** + * Update To Time of Exists Components ... + * + * @param value: updated time ... + */ + void UpdateTo( + datetime value = NULL // + ) + { + // + value = NormalizeTime(value); + + // + chochZone.UpdateTo(value); + targetZone.UpdateTo(value); + signalZone.UpdateTo(value); + workingZone.UpdateTo(value); + mConditions.UpdateTo(value); + waitingZone.UpdateTo(value); + } + + // + // Helpers ... + + // + bool CalculateRiskReward( + ENUM_X121SMC_XWZ_PRIORITY priority, + double &reward, + double &amountPercent // + ) + { + // + bool result = false; + + // + reward = 0; + amountPercent = 0; + + // + result = priority != X121SMC_XWZ_PRIORITY_NONE; + if (!result) + { + return result; + } + + // + switch (priority) + { + // + case X121SMC_XWZ_PRIORITY_STRONG_HIGH: + // + reward = 6; + amountPercent = 2; + break; + + // + case X121SMC_XWZ_PRIORITY_HIGH: + // + reward = 4; + amountPercent = 2; + break; + + // + case X121SMC_XWZ_PRIORITY_REGULAR: + // + reward = 3; + amountPercent = 1.5; + break; + + // + case X121SMC_XWZ_PRIORITY_LOW: + // + reward = 2; + amountPercent = 1; + break; + + // + case X121SMC_XWZ_PRIORITY_WEAK: + // + reward = 1; + amountPercent = 0.5; + break; + } + + // + result = + // + reward > 0 && + amountPercent > 0 + // + ; + + // + return result; + } + + // + void AddDrawnObjects(XCBaseObject *&objects[]) + { + // + int count = ArraySize(objects); + bool has = IsValidSize(count); + if (!has) + { + return; + } + + // + for (int i = 0; i < count; i++) + { + mObjects.Add(objects[i]); + } + } + + // + void AddDrawnWorkingZoneObjects(XCBaseObject *&objects[]) + { + // + int count = ArraySize(objects); + bool has = IsValidSize(count); + if (!has) + { + return; + } + + // + for (int i = 0; i < count; i++) + { + mWorkingZoneObjects.Add(objects[i]); + } + } + + // +}; + +// \ No newline at end of file diff --git a/BKPS/14031206/X121SMCEA/Signals/x-121.smc.xwz.signal.lib.ex5 b/BKPS/14031206/X121SMCEA/Signals/x-121.smc.xwz.signal.lib.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..d2177ebe30744d4f66e46ef78aac4e36a49cc1df GIT binary patch literal 17836 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 literal 0 HcmV?d00001 diff --git a/BKPS/14031206/X121SMCEA/Signals/x-121.smc.xwz.signal.lib.mq5 b/BKPS/14031206/X121SMCEA/Signals/x-121.smc.xwz.signal.lib.mq5 new file mode 100644 index 0000000..d29b8d7 --- /dev/null +++ b/BKPS/14031206/X121SMCEA/Signals/x-121.smc.xwz.signal.lib.mq5 @@ -0,0 +1,1315 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 X121 SMC Signal Class +// ------------------------------------------------- +// Name: XWZ +// Description: provide all Signalling 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 + +// +// Imports ... +// #include "../../Libraries/x-trade.lib" +#include "../Classes/x-121.smc.market.cycle.helper.class.mq5" +#include "../Libraries/x-121.smc.guard.lib.mq5" +#include "../Libraries/x-121.smc.lib.mq5" + +// +enum ENUM_X121SMC_XWZ_PROVIDERS +{ + X121SMC_XWZ_PROVIDER_NONE, + X121SMC_XWZ_PROVIDER_ACTIVATED_ZONE, + X121SMC_XWZ_PROVIDER_ACTIVATED_CHOCH, + X121SMC_XWZ_PROVIDER_PRICE_INSIDE_ZONE, +}; + +// +enum ENUM_X121SMC_XWZ_PRIORITY +{ + X121SMC_XWZ_PRIORITY_NONE, + X121SMC_XWZ_PRIORITY_WEAK, + X121SMC_XWZ_PRIORITY_LOW, + X121SMC_XWZ_PRIORITY_REGULAR, + X121SMC_XWZ_PRIORITY_HIGH, + X121SMC_XWZ_PRIORITY_STRONG_HIGH, +}; + +// +struct X121SMCStrategyXWZWorkingZone +{ + // + // Props ... + + // + string symbol; + ENUM_TIMEFRAMES period; + + // + XCSupplyZone *supplyZone; + XCDemandZone *demandZone; + + // + double quarter1; + double quarter2; + double quarter3; + + // + XOBFVG orderFlow[]; + XOBFVGPivot swings[]; + XOBFVG brokenOrderFlow[]; + CChartObjectTrend *orderFlowTrend; + + // + // Constructor ... + X121SMCStrategyXWZWorkingZone() + { + Clean(); + } + + // + // Tools ... + + // + void Clean() + { + // + quarter1 = 0; + quarter2 = 0; + quarter3 = 0; + + // + symbol = NULL; + period = NULL; + + // + Clean(orderFlow); + Clean(brokenOrderFlow); + + // + Clean(swings); + ZeroMemory(supplyZone); + ZeroMemory(demandZone); + + // + if (orderFlowTrend != NULL) + { + orderFlowTrend.Delete(); + } + ZeroMemory(orderFlowTrend); + + // + ZeroMemory(this); + } + + // + bool IsValid() + { + // + bool result = false; + + // + result = + // + quarter1 > 0 && + quarter2 > 0 && + quarter3 > 0 && + HasSupplyZone() && + HasDemandZone() && + quarter1 > quarter2 && + quarter2 > quarter3 + // + ; + + // + return result; + } + + // + bool HasSupplyZone() + { + return supplyZone != NULL && + supplyZone.IsValid(); + } + + // + bool HasDemandZone() + { + return demandZone != NULL && + demandZone.IsValid(); + } + + // + // + // + + // + bool HasOrderFlow() + { + // + bool result = false; + + // + result = IsValid() && + HasChild(orderFlow); + + // + return result; + } + + // + bool HasOrderFlow( + ENUM_X_DIRECTION &orderFlowDir // + ) + { + // + bool result = false; + + // + result = IsValid() && + HasChild(orderFlow); + if (result) + { + orderFlowDir = orderFlow[0].GetDirection(); + } + + // + return result; + } + + // + int CountOrderFlow() + { + return ArraySize(orderFlow); + } + + // + int GetSwings( + XOBFVGPivot &pivots[] // + ) + { + // + int result = 0; + + // + Clean(pivots); + + // + int count = 0; + bool has = false; + + // + has = HasOrderFlow(); + if (!has) + { + return result; + } + + // + count = CountOrderFlow(); + for (int i = 0; i < count; i++) + { + // + XOBFVGPivot iPivots[]; + int iPivotsCount = orderFlow[i] + .GetSwings(iPivots); + bool hasPivots = IsValidSize(iPivotsCount); + if (hasPivots) + { + // + Copy( + iPivots, + pivots, + false // + ); + } + + // + Clean(iPivots); + } + + // + result = ArraySize(pivots); + + // + return result; + } + + // + double GetOrderFlowTrendLinePrice( + int barIndex = 0, + ENUM_TIMEFRAMES forPeriod = NULL // + ) + { + // + double result = 0; + + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + if (!IsValid(forPeriod)) + { + forPeriod = period; + } + + // + if (!IsValid() || + !HasOrderFlow() || + orderFlowTrend == NULL) + { + return result; + } + + // + datetime time = iTime( + symbol, + forPeriod, + barIndex // + ); + + // + result = ObjectGetValueByTime( + orderFlowTrend.ChartId(), + orderFlowTrend.Name(), + time // + ); + + // + return result; + } + + // + int DetectOrderFlow( + string forSymbol, + ENUM_TIMEFRAMES forPeriod, + ENUM_X_DIRECTION &orderFlowDir, + XPOIState <fState, + XPOIState &htfState, + XPOIState &mtfState, + XPOIState &stfState // + ) + { + // + int result = 0; + + // + Clean(orderFlow); + orderFlowDir = X_DIRECTION_NONE; + + // + bool isValid = + // + IsValid(forSymbol) && + IsValid(forPeriod) && + ltfState.HasChild() && + htfState.HasChild() && + mtfState.HasChild() && + stfState.HasChild() + // + ; + if (!isValid) + { + return result; + } + + // + // Find Working Zone ... + bool hasWorkingZone = IsValid(); + if (!hasWorkingZone) + { + // + symbol = forSymbol; + period = forPeriod; + + // + int idx = -1; + bool has = false; + + // + has = ltfState.HasSupplyZones(); + if (has) + { + // + idx = GetHighest(ltfState.supplyZones); + if (IsValidIndex(idx)) + { + supplyZone = ltfState.supplyZones[idx]; + } + } + + // + has = ltfState.HasDemandZones(); + if (has) + { + // + idx = GetLowest(ltfState.demandZones); + if (IsValidIndex(idx)) + { + demandZone = ltfState.demandZones[idx]; + } + } + + // + hasWorkingZone = HasSupplyZone() && + HasDemandZone(); + if (hasWorkingZone) + { + // + double upper = supplyZone.Lower(); + double lower = demandZone.Upper(); + + // + double delta = ((upper - lower) / 100) * 25; + + // + quarter1 = upper - (1 * delta); + quarter2 = upper - (2 * delta); + quarter3 = upper - (3 * delta); + + // + hasWorkingZone = IsValid(); + } + } + + // + if (!hasWorkingZone) + { + return result; + } + + // + // Bullish OBFVGs ... + XOBFVG bullOBFVGs[]; + int bullOBFVGsCount = ExtractOBFVGZones( + htfState, + mtfState, + stfState, + bullOBFVGs, + X_DIRECTION_BULLISH, + NULL, // For Period ... + // + // Start ... + XZONE_STATE_PASSED, + true, // Force Body Out ... + // + // Activation ... + XZONE_STATE_PASSED, + true, // Force Body In ... + // + // Breaktion ... + XZONE_STATE_FAILED, + false, // Force Body In ... + // + // Works ... + XZONE_STATE_PASSED, + true, // Force Body Out ... + // + true, // Apply Sort ... + true, // From Filter ... + true, // Place Filter ... + // + true, // Ignore Inside in Place Filter ... + // + true, // Detect Inside OB POI(s) ... + true, // Detect Inside FVG POI(s) ... + true // Apply From Filter to Selected POI(s) ... + ); + bool hasBullOBFVGs = IsValidSize(bullOBFVGsCount); + + // + // Bearish OBFVGs ... + XOBFVG bearOBFVGs[]; + int bearOBFVGsCount = ExtractOBFVGZones( + htfState, + mtfState, + stfState, + bearOBFVGs, + X_DIRECTION_BEARISH, + NULL, // For Period ... + // + // Start ... + XZONE_STATE_PASSED, + true, // Force Body Out ... + // + // Activation ... + XZONE_STATE_PASSED, + true, // Force Body In ... + // + // Breaktion ... + XZONE_STATE_FAILED, + false, // Force Body In ... + // + // Works ... + XZONE_STATE_PASSED, + true, // Force Body Out ... + // + true, // Apply Sort ... + true, // From Filter ... + true, // Place Filter ... + // + true, // Ignore Inside in Place Filter ... + // + true, // Detect Inside OB POI(s) ... + true, // Detect Inside FVG POI(s) ... + true // Apply From Filter to Selected POI(s) ... + ); + bool hasBearOBFVGs = IsValidSize(bearOBFVGsCount); + + // + XOBFVG lastBroken; + bool hasBroken = false; + int idx = GetYoungest(brokenOrderFlow); + if (IsValidIndex(idx)) + { + // + lastBroken = brokenOrderFlow[idx]; + hasBroken = lastBroken.IsValid(); + } + + // + bool hasOrderFlow = hasBearOBFVGs || + hasBullOBFVGs; + if (hasOrderFlow) + { + // + // Vlidate ... + isValid = + // + (hasBullOBFVGs && + !hasBearOBFVGs && + bullOBFVGsCount >= 1) + // + || + // + (hasBearOBFVGs && + !hasBullOBFVGs && + bearOBFVGsCount >= 1) + // + ; + + // + if (isValid) + { + // + if (hasBullOBFVGs) + { + // + Copy( + bullOBFVGs, + orderFlow // + ); + } + else if (hasBearOBFVGs) + { + // + Copy( + bearOBFVGs, + orderFlow // + ); + } + + // + orderFlowDir = + hasBullOBFVGs + ? X_DIRECTION_BULLISH + : X_DIRECTION_BEARISH; + + // + bool isPlacePassed = true; + if (hasBroken) + { + // + bool isBullish = IsBullish(orderFlowDir); + + // + idx = GetYoungest(orderFlow); + bool hasYounget = IsValidIndex(idx); + + // + isPlacePassed = + ArraySize(orderFlow) > 1 + ? true + : isBullish + ? (IsAbove( + orderFlow[idx].ob, + lastBroken.ob, + true // Ignore Inside ... + )) + : (IsBelow( + orderFlow[idx].ob, + lastBroken.ob, + true // Ignore Inside + )); + + // + Clean(brokenOrderFlow); + AddRef( + orderFlow[idx], + brokenOrderFlow // + ); + } + + // + if (!isPlacePassed) + { + // + Clean(orderFlow); + orderFlowDir = X_DIRECTION_NONE; + } + + // + result = ArraySize(orderFlow); + } + } + + // + Clean(bullOBFVGs); + Clean(bearOBFVGs); + + // + lastBroken.Clean(); + + // + if (IsValidSize(result)) + { + // + int count = GetSwings(swings); + bool has = count >= 2; + bool isBullish = IsBullish(orderFlowDir); + if (has) + { + // + // Get Max / Min ... + double max = 0; + double min = 0; + datetime maxAt = NULL; + datetime minAt = NULL; + for (int i = 0; i < count; i++) + { + // + XOBFVGPivot iPivot = swings[i]; + + // + if (!iPivot.IsValid()) + { + // + iPivot.Clean(); + continue; + } + + // + // Min ... + bool canSetMin = + min == 0 + ? true + : min > iPivot.value; + if (canSetMin) + { + // + minAt = iPivot.at; + min = iPivot.value; + } + + // + // Max ... + bool canSetMax = + max == 0 + ? true + : max < iPivot.value; + if (canSetMax) + { + // + maxAt = iPivot.at; + max = iPivot.value; + } + + // + iPivot.Clean(); + } + + // + double price1 = + isBullish + ? min + : max; + double price2 = + isBullish + ? max + : min; + datetime time1 = + isBullish + ? minAt + : maxAt; + datetime time2 = + isBullish + ? maxAt + : minAt; + + // + color clrTrend = clrNONE; + + // + string trendName = + "XORDFLW" + ToString(orderFlowDir) + "_" + "XTRNDL_" + + ToString(period) + "_" + + ToString(price1) + "_" + + ToString(price2) + "_"; + + // + orderFlowTrend = new CChartObjectTrend(); + has = orderFlowTrend.Create( + 0, + trendName, + 0, + time1, + price1, + time2, + price2 // + ); + + // + if (has) + { + // + orderFlowTrend.Width(1); + orderFlowTrend.Color(clrTrend); + orderFlowTrend.RayRight(true); + } + } + } + + // + return result; + } + + // + void AddOrderFlowItem( + XOBFVG &orderItem // + ) + { + // + ENUM_X_DIRECTION trend; + if (!HasOrderFlow(trend)) + { + return; + } + + // + bool isSameDir = orderItem + .GetDirection() == trend; + if (!isSameDir) + { + return; + } + + // + bool isBullish = IsBullish(trend); + + // + AddRef( + orderItem, + orderFlow // + ); + + // + Sort( + orderFlow, + trend, + true // Ignore Inside ... + ); + } + + // + bool IsDestroyed( + int barIndex = 0, + ENUM_TIMEFRAMES forPeriod = NULL // + ) + { + // + bool result = false; + + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + if (!IsValid(forPeriod)) + { + forPeriod = period; + } + + // + result = IsValid(); + if (!result) + { + return result; + } + + // + XOHCL bar; + result = bar.Init( + symbol, + period, + barIndex // + ); + if (!result) + { + // + bar.Clean(); + return result; + } + + // + XOHCL cBar; + result = bar.GetPreviousBar(cBar); + if (!result) + { + // + bar.Clean(); + cBar.Clean(); + + // + return result; + } + + // + bool isSupplyZoneBreaked = + // + bar.low > supplyZone.Upper() && + cBar.low > supplyZone.Upper() + // + ; + + // + bool isDemandZoneBreaked = + // + bar.high < demandZone.Lower() && + cBar.high < demandZone.Lower() + // + ; + + // + bar.Clean(); + cBar.Clean(); + + // + result = isSupplyZoneBreaked || + isDemandZoneBreaked; + + // + return result; + } + + // + bool IsOrderFlowBreaked( + int &breakedIndex, + bool forceOBBreake = false, + bool forceFVGBreake = false, + int barIndex = 0, + ENUM_TIMEFRAMES forPeriod = NULL // + ) + { + // + bool result = false; + + // + breakedIndex = -1; + + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + if (!IsValid(forPeriod)) + { + forPeriod = period; + } + + // + ENUM_X_DIRECTION orderFlowDir; + result = HasOrderFlow(orderFlowDir); + if (!result) + { + return result; + } + + // + XOHCL bar; + result = bar.Init( + symbol, + forPeriod, + barIndex // + ); + if (!result) + { + // + bar.Clean(); + return result; + } + + // + bool isBullish = IsBullish(orderFlowDir); + + // + int idx = + isBullish + ? GetHighest(orderFlow) + : GetLowest(orderFlow); + result = IsValidIndex(idx); + if (!result) + { + // + bar.Clean(); + return result; + } + + // + XOHCL obBreakerBar; + bool isOBBodyOut = false; + bool isOBBreaked = orderFlow[idx].ob.IsBreaked( + orderFlowDir, + obBreakerBar, + isOBBodyOut, + false, // Ignore Start ... + false, // Started Bar Body Out ... + forPeriod // + ); + + // + if (!isOBBreaked) + { + obBreakerBar.Clean(); + } + + // + XOHCL fvgBreakerBar; + bool isFVGBodyOut = false; + bool isFVGBreaked = orderFlow[idx].fvg.IsBreaked( + orderFlowDir, + fvgBreakerBar, + isFVGBodyOut, + false, // Ignore Start ... + true, // Started Bar Body Out ... + forPeriod // + ); + + // + if (!isFVGBreaked) + { + fvgBreakerBar.Clean(); + } + + // + isOBBreaked = + obBreakerBar.IsValid(); + + // + isFVGBreaked = + fvgBreakerBar.IsValid(); + + // + if ((forceOBBreake && forceFVGBreake) || + (!forceOBBreake && !forceFVGBreake)) + { + // + result = isOBBreaked || + isFVGBreaked; + } + else if (forceOBBreake) + { + result = isOBBreaked; + } + else if (forceFVGBreake) + { + result = isFVGBreaked; + } + + // + if (result) + { + breakedIndex = idx; + } + + // + bar.Clean(); + obBreakerBar.Clean(); + fvgBreakerBar.Clean(); + + // + return result; + } + + // + bool DetectPriority( + ENUM_X121SMC_XWZ_PRIORITY &priority, + ENUM_X_DIRECTION forDir, + int barIndex = 0, + ENUM_TIMEFRAMES forPeriod = NULL // + ) + { + // + bool result = false; + + // + priority = X121SMC_XWZ_PRIORITY_NONE; + + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + if (!IsValid(forPeriod)) + { + forPeriod = period; + } + + // + result = IsValid() && + HasDirection(forDir); + if (!result) + { + return result; + } + + // + bool isBullish = IsBullish(forDir); + + // + XOHCL bar; + result = bar.Init( + symbol, + forPeriod, + barIndex // + ); + if (!result) + { + // + bar.Clean(); + return result; + } + + // + if (bar.high < supplyZone.Upper() && + bar.low > supplyZone.Lower()) + { + // + priority = + isBullish + ? X121SMC_XWZ_PRIORITY_NONE + : X121SMC_XWZ_PRIORITY_STRONG_HIGH; + } + else if (bar.high < supplyZone.Lower() && + bar.low > quarter1) + { + // + priority = + isBullish + ? X121SMC_XWZ_PRIORITY_WEAK + : X121SMC_XWZ_PRIORITY_HIGH; + } + else if (bar.high < quarter1 && + bar.low > quarter2) + { + // + priority = + isBullish + ? X121SMC_XWZ_PRIORITY_LOW + : X121SMC_XWZ_PRIORITY_REGULAR; + } + else if (bar.high < quarter2 && + bar.low > quarter3) + { + // + priority = + isBullish + ? X121SMC_XWZ_PRIORITY_REGULAR + : X121SMC_XWZ_PRIORITY_LOW; + } + else if (bar.high < quarter3 && + bar.low > demandZone.Upper()) + { + // + priority = + isBullish + ? X121SMC_XWZ_PRIORITY_HIGH + : X121SMC_XWZ_PRIORITY_WEAK; + } + else if (bar.high < demandZone.Upper() && + bar.low > demandZone.Lower()) + { + // + priority = + isBullish + ? X121SMC_XWZ_PRIORITY_STRONG_HIGH + : X121SMC_XWZ_PRIORITY_NONE; + } + + // + result = priority != X121SMC_XWZ_PRIORITY_NONE && + priority != X121SMC_XWZ_PRIORITY_WEAK; + + // + bar.Clean(); + + // + return result; + } + + // + // + // + + // + void UpdateTo(datetime value = NULL) + { + // + value = NormalizeTime(value); + + // + int count = 0; + bool has = false; + + // + has = HasSupplyZone(); + if (has) + { + supplyZone.To(value); + } + + // + has = HasDemandZone(); + if (has) + { + demandZone.To(value); + } + + // + // Order Flow ... + ENUM_X_DIRECTION orderFlowDir; + has = HasOrderFlow(orderFlowDir); + if (has) + { + // + count = CountOrderFlow(); + for (int i = 0; i < count; i++) + { + orderFlow[i].UpdateTo(value); + } + } + + // + } +}; + +// +// Definitions ... +struct X121SMCStrategyXWZSignalConditions +{ + // + // Props ... + + // + string symbol; + ENUM_TIMEFRAMES period; + + // + double sl; + double target; + double reward; + double amountPercent; + ENUM_X_DIRECTION dir; + ENUM_X_POSITION_TYPES type; + + // + // Setup Props ... + + // + datetime setupTime; + datetime triggerTime; + + // + double pivot; + double point; + + // + XOBFVG targetZone; + XOBFVG signalZone; + + // + ENUM_X121SMC_XWZ_PRIORITY priority; + ENUM_X121SMC_XWZ_PROVIDERS provider; + + // + // Constructor ... + X121SMCStrategyXWZSignalConditions() + { + Clean(); + } + + // + // Tools ... + + /** + * Cleaning Up ... + */ + void Clean() + { + // + sl = 0; + target = 0; + + // + dir = X_DIRECTION_NONE; + type = X_POSITION_TYPE_NONE; + + // + symbol = NULL; + period = NULL; + setupTime = NULL; + triggerTime = NULL; + + // + ExtensionClean(); + + // + ZeroMemory(this); + } + + /** + * Check Condition is Setting Up ... + * + * @param dir: ENUM_X_DIRECTION member, Setting Up Direction ... + * + * @return ( bool ) + */ + bool IsSetuped() + { + // + bool result = false; + + // + result = IsValid(setupTime) && + HasDirection(dir); + if (!result) + { + return result; + } + + // + return result; + } + + /** + * Calculate Setup Age ... + * + * @return ( int ) + */ + int GetSetupAge() + { + // + int result = 0; + + // + if (!IsSetuped()) + { + return result; + } + + // + result = (int)(TimeCurrent() - setupTime) / PeriodSeconds(period); + + // + return result; + } + + /** + * Detect How we Can Trigger Signal ... + * + * @return ( bool ) + */ + bool CanTrigger() + { + // + bool result = false; + + // + result = + // + sl > 0 && + IsValid(symbol) && + IsValid(period) && + IsValid(triggerTime) && + type != X_POSITION_TYPE_ALL && + type != X_POSITION_TYPE_NONE + // + ; + + // + return result; + } + + // + // Extensions ... + + /** + * Clean Additional Properties ... + */ + void ExtensionClean() + { + // + pivot = 0; + point = 0; + + // + target = 0; + reward = 0; + amountPercent = 0; + + // + targetZone.Clean(); + signalZone.Clean(); + + // + provider = X121SMC_XWZ_PROVIDER_NONE; + } + + // + // + // + + // + void UpdateTo(datetime value = NULL) + { + // + value = NormalizeTime(value); + + // + int count = 0; + bool has = false; + } + + // +}; + +// \ No newline at end of file diff --git a/BKPS/14031206/X121SMCEA/Strategy/x-121.smc.strategy.class.ex5 b/BKPS/14031206/X121SMCEA/Strategy/x-121.smc.strategy.class.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..ae336585c9a01e98ef686b80f68d8f3e99c85670 GIT binary patch literal 19358 zcmdS9LzFN~%qH5lZQHhO+qP}nwr$(C-Tk(0oA>+Yp4rV}wv(JxQctQDNmi+ps0J&r zBLD<400_W;1PE~azx4mu|3Aqv8JIUvJLM-vzOM}VAvFDO{Qp*afCB*hkNlr#)+&l6 zjs-y)P3uWd8195--`Rtb9dy`<+>_bl1ak~@)kqBM{HMeGf9?tc*aJ8Kcmg;9SOS;> zSOB;H5CAX%F#IRX05t#E$^eG{p{D=&MFDI8Z2v`+4+Bgf^p$$T2Rlh z`|5h@=`wyJvKq=-yjcZ{)flRx@X^#{U%gy+2CiX&*G^l>TLat6TXH_dyxY1G!?e74 zX$EFdm$8Yl`dPa~JP2Rt{E&fz2lG}Z7+QihT`N}etLH+<=4lHU4BgQIfzh7T#k-Y% zdG)->680rVJL}~_K-KsRdwM){`m;=--!dfV>y-D4G=UTZe5hMpxouDP#usQm)E34{ z%khI2MDIo)g>+^Vfi_#Nq*8V$=%!kV1uNG%hfVQrhI)Tg{3Hm*fCZ%tnt=#K4w1@NDr<&8846h?XUnUha2w%+IJz0apqh)t zzj4pT;ByY*te1EgsgGuQD~3OUSxnb$DR&z3Wife}jV#E?GV5Ma+VhSh*}zfDSGX@R z)ZWu8;WUzwCV0`bZWgp^86fL_ZCVJDTxz=E|7n~xO&G=5pSl~|=G8(q1%xUSPs6nd zL3=}LwT6q$c~`*QmCb_j^3mvDBs|TZkDI};K>F=`qn0s*jqg4QddX6e!u#@#4$WPH ziYJ1sT*+&KlSs1tSnZ-|03xuzE6S(G=4eTP?ye%+=Z!f=`L{!;>;fjAEhow~)-)|# z+aZGJGP{0*4H1vBuTF2SR#Hr{QWj7D;*=jx@LR6V!mTcpu|k!k1-qTGYFW?3=XbW7 ztgckwYo<82(gx%`y2Wy_lxD#L=!F{l%&$dkM~vaFm71>pbgJ)F4uPHZPd;n+;q~ON z@a!oy-F*sqW&(%Vx4)wEUChOC$|3;pBir8umksaa6KtUgc+nh?Gr0nCLd>4cf7&Ry z@+`MC6p@m^|8o(4-iAzY^KGARz&cz;-5A*%zHD@Np(bzdh`AxP({*K zS?g??`rSw|kV-r!{vbV*ZFAEasm4(Trj%kfCc?ma@G1w=ng*P+agEJ7uuGfHt9)^& z6f3fn5g3XSh`(Fd)R%Orv2>NQPFOuEeXRleFfp^QnmpElWZ-K8Tuv)PsK0R26LSJP z%!?VXE<_D{&OUv{Vh2P!h)Syb>C+c@CWOM0PauCOh=GXvM4bfbO0>DmjCY%mNfjSF zeRmpU6^otyp!z(L--ZH7)i>5_Eg6BPOk@gOw6maY%3y*jQlk+YZaTVf zEao89-|>^{M$k1bZa2t8IS^O4P)p8sC}j8`O^E7!jh(mqjHhHh4Xn0c9+Hl__+@;T5f*+za5D;cJ21&$R$GkVi=|lo}7W z{TtH%S^>4#4lkJ-WO;uwb$%ye51k?S%K84~1nPrSehN^;AOvrE*?;Y-_YZxlX)4xvj7; zbYG)n0NZ6Bv{QtI@`a?i+>4DNE3b5ZB;CZ6h~mTZyX3g0LRqKy2WSn8HL0Oh79o(@ z1E%s^x+0arDmbnb#cLx^HV?TFA(d>C1xcsP#!m=VP>F^&-qA!RzR8cMrfmu-UUwfo zZlOUHw?e_Vo10s+uI3SMk$9-OPXW%_U8bwM$jt3h`?8caj2E*KuB-;podM@sR);NO zZub${+<#bBfs->EeHyhdT|1IZ6v(mh9Vd_jm4CIguyH+4MLf6qF9SpTu3&?*;P%u9 z=_eXV!=J{cf>8uzdg=a4*!R**J8Qhcfj#u630Y|U;iux?7Om0n-eY);C*xr!3f$H0 zp}{#AsDX@+*aTm`3yK}SW7Br%DK*L7iI4Hu0aS1T>k3k;F~PW1=_K$^-26mQ?J14~ ztG_7($+`e7A9coRp>G38BEV0adQb9SgwH90nuUtO{mrz~O?3e--Y2^mU(V(Rt83Jgqpn zEtk8IcEsDzQBFOMk;6riLyqNEb|r%Xh$r!53|@ngB!*%1Dm*dWUk{UO7a6IbA1dCtL2lx*$n)^KSF_@`WxH_5^QT*VE! zD^o`S;eY4C7994vSh8Ja2@+!K7nJC+xnPZ>X^fugkZ$tfR#qfaoc7WpnaytH99F1x zE#%7h85dNF6WglC2ns}5E|y^dX<$d1*CM!gteSV$Z%#a#5(tU@y*XT*kd0gk$eql_ zPUugf+9nxis=k!QhL7Y57pGS;$ZHJVvSfSX)4nQYp6G+F)TC3+MHcR`Z{O=YYK!b& z73wOx-92~|x<(E1U8ZyGoIf&(&A(A|gO7K6 zS~aZEkIBhOBSpD#W1Vy`++#1wc#HbM&%b9={0J;ymah@GAv*w0dY8VKBkJFpkBKec zaKqUg{v2sMKFPIDflNJfGD<=sld=pWe=jefAGYd6D9pzkx(*8ZWFNomw=%D?9aGW! z=>qCK{;ay(1KNI9Cj?B;HvVLDQG5vrW`NvNz<5(NM*<(P7LV*5L$RwuJpvk=25d(a zWq-rsa-c+Lbh2%XyWO$XiCbprH<1ejXv$2B_bPQPIbn9fT9}5LxoiPYm=&TZEQwWI zO2?L5vc7?N8HFUe?e|vvm>;5vdyAwmqu5sie)PMhl@UgYods8(`FM7DhcifNR?m26 zAh0EH;8?^0fqZIefEw?f9m(9-A8F0BQ~k&v-bMaIDABEsn;(b1z*jvtzos+4v?B5P zx^c=NFOL$fhx-P9p!uTbKbLcp3O+e!Are{0sNFJh)K(~)35#8ZcSFkZrOGJPil%`oshAyc=0=Z7UPi5>@OeGi8!R<|Hk0zFpH$9#17o#DpIa+ z;)!lfs=fJJ^;t1oN$H4aYL`xmw9gt8OUuud6L-#7`5acMnrf&>FMUr(V4Hf4Q?v|` z?vayKru#1Co1qF+Htp*Mg#s9tf8c686>7wKd)nko=Ho$=;}OMp4Rj=DkliVWmtGum zkoe^j*yt-R!RijAaO!tN zQC6I(mAD;}arDP8dqwFVF5HJw?%hc>!^kU!$oe2mkm~`#wX?rFl)_a(5pql(F{6IC zvEL$vM1Od^^2QyRi5+|E|Lqf9NHn_mteKI=B7%TRBi!m_>!jmJ z(3Lrlk-N|IQP}iqJ=DDbKgzx)x*V?qHPXVMrOlqpV|!)HiJh`3KfNU``(1PSLyb(p=q9Xj#ryH%z|ffhg7hneGg`hn)`*EaQG7I+~>m8 z8$YDtYbJvp(JZZ+95&t=7WGIPA7Dm}&dXEvXW|xfMMo~wY9E7*8qq^&Zj1v^tX05! z3Q$;)E5+*-{XUHVdp}#O;^IdzbnT=u=Y10wWI$rf7<9tu$C|}EO^*ThJEDDNgJIXA z3GwcT$t|ES33$-7y>}{1xP)1j8@S{Un;VNK@6U^#jjDG7nwZ9n$AK~!IhgYLr=gM} zM7+lHXx}K+MoWX$^2UA|g6nRSX96D=1x;dorX~T}2zzO1d9OLMoS`M*TJnO^k40A@ zCP36MB0CPjk6+0ZEyylsBY63t@qB9n4l!QNU+p9k&Os;sV{#-Hr63C&xjkDU)UaiR zz3i4rlYYL1pTcPyW+tTv8qrb__!*!PIAiE|rUl8_R{8T!nGP?J;6n%c$t4<7g~(9lZgL3715)JY@omF%Vi%cS*fil;U=05k1s0Qk z2BgM{p=d@tz-|_>zYN=tR!n0UIerjpHk78w`e^KnwmEZms>$Z@iHrXujZuo=kJT*y z1aji6?p#@;bKV_V7;^magLfW>ZblrcL0Xm)gT%YL4Z;ja*vl<3|_eO*B! z3MR&_I}?()mo=oy+u=T})zq7Sk^~--(tk-1$eCcwUuVA&s1y{58F z7kqmqhgbjB2Le$TQrYIMYut298$mc;^El-$&-fLRx{^6}H}Dn5H;^>?3$~Sq|m4(rDX#VAWYUQ;HtO+lXqN7F3!*h z?1ouTEQ6qP2HnEa+QO7_sE{}F&@vy|&jn1S_w8X1-yUa$8QyEQw?C|qy`wAZ%OvHn zlPyTa+c`_mSS(|suNtLp|3z>HwSYs_D*$lz)X$RCA&&w`<Z05Fg zP)7P~<)%?0P}%=XA#s330dCvb40K3uPJUcoNw%~>nF~VkVeZ{UE1NTjSQ!_F$4>jH z3e=ALp8kL+BxBzYR9PQbYj2lp^@uj#XN)W!bUE=MA7px^vNB+hJg8p_13Z{z&fwS7 z$Zt^@2v;f}DSP*)wT_HcI?QmN>#?t6R}|X0PMO$|%I^OK34=v!c(q7Y@()l~bRY{f zv9j3{y-@@Gv81b)31eODk(vgP_$&z**dg^qnV<=3!TjI|DkGJ%M`b-?N!jV%e_0}& z5cAF!8o4gG{fm(lXe2KiSMO+@kdT>)>qDE%U3nTQy2XN)!q6!aHKSWK`WbheCeE3C zfOM@af!Lpi%TB~@;utf_-jY|^xkse~)@>?J_>vleSjW0UWYfSH{jKLzkD59o@Nxn(NxoOvSg1zK^Fm7EBb|voJE>AI zIR$`i?*Vx_zK%Ukn7!IdGV4S~*mW3GjWZ^ScGOyX+=^-;2r*7>5(XRmG87D~w_DN@ zWVjuGS{s1M@!Ve3Uu9VFAbPYlVy-A4V3`n&lL{y3ipdej)5noo*#_*hqX!FMg?9L*y3FY9DxA08zkds}xIm#jVU`M9t1=WZ!Y&>uLy6T-Bns~hN$9UksB)LGFDj7f44;P4mqY~Oq- zkz9oDt1@poRaLoV*)44KOk1jKZ=LDI!^=x(##F|%{QJ~RH^)|M<&AS6P>y=sha>J} zgihnRUJ|)-vk8bJ`wU@yY=^)Y)C0EveCyr7vQOJ&3vG=ii4PlZQ5`An%-S?V-zN3 z-kRx0ALQViZ(r{C#uQvs$o&(1m6}&3p}0!=LXn8>rpvF51Vp%3*jrB#W(wtj80y{Y zR@TV&6D%5z8e$=aty|EI_TvzXc&7yx9C3}8nq?W6wlRzp2pzr{N%LCv{1-6g6*5)k zYWWCaPeFb(Evk&CzfZ3wY1lBF(5eJEY1~^DF^w7v)373F+z z2H{A+In>pSauBng#6v>)l8-SkD7fzh_g#7y2P2d4B=xl~p7#%re>#sHl-Io&1eqG# z{2}59U=t%$^9hAD)C|}-EdnTGOur>z(bf<@XHFJx3>Ov;H{|G)DJq`zn10GPR~N8} zo{yBI;>G(JZ8#B*eLFntVsSiG^Rnjv?CdXgS!+@dx%RC6Is6@Umo7tRZ%S7U#6h!& zMVhSnr@r|X)fH>x_9#_+BHOz0_^|8F>;%yp+_+=o+iv+r{tPLNDN)BI&8Vz0vk64` z-%tliGo!h!>yb3#8#8%E@4Xq3X+#l33Iobj9kWs?*km9Fip66+;Rd?VjeD+3<%M=^@yfXZ9N&t8l{>$haY ze^ap|2qS1qJbEIg6Ut+R?pSueK~dsI%P^EyNZEHLBa1a}j3gFJ(b!}@qG0GDPzWR> zrwOR)F%1YlWrrI%z|mogVEZYVzGBxf#kRJH$NhSiagMbh``4qLxEYfW9S5^VCUdB9(4Gk2t%8 z@DSAyQ$}V~9UR7_mtBDOSp*vPw-L@5Og`oa3E{7(6v<+Sb~S>W?=eXyv>buUZL%djK#z3rzFdKMt)^ zh%4h756kn%9{-@}%2XeG0zY34Ni7SWQ;mp+-ooq5_btr894whJZch{OF+rfIQ5{Rj z_(`deHMdQ)CaRIS6p{-HBkfIM(^Mf)p%w7$eJc_$lqL~oMfxJI^y32C9YBky6j^6a zID}2NRCL4UUGxR-BCj?~{$(b3GsC)q3;tlF^3hO7)*k$1ZW0oK zI7>#X9NbXZYHy^Z5F^Z5++D7&I_te>Z*^zJ%*D7Oy8s2CHIVnoD7u<#$DhzP_!~e- zO9&V@hDNd}XiiEIM>(|iezFeHdrl4vhp8}A#4xr~rIR=;TLnAhmgDZ_sDC8%C=mT{vZ2 zotk>e5ae^5Sp-TSA6E{}$|GlXWtX0L z18P9G@l{yxz=I17kf_$Tym!v}%!KKogZoi`mf{(DLtd+K#zuZdG6y88kenXzcGr!n z_L~Xy-(;MWv-(pVf6QWDe#$8A=@9&|TK_$JmGk?Pb>KiH&-(Z$R}U+6;Mr9of^O@# zkz!q=c1}X&+UsszYM+t)T>k4UZWBrJs^iPG5go?vT6f1Juf)%(g})9Q?kou)NuT=P zmeJq|4$>K^v1!sad8z_w$V=62{4r`0i>jLbFH~EnH-0(O;aEc-nKE{6Gi?QBMAxLc zAdbWsFg_a@L%%DaJu+ zRD+xg-bniE<{sblp*#A597`p=v}pLV6;Hh#A9T~e{ih51I*`*iO9+e9u*TvN-|2nK-?3LqjrvsViH<1?pGDOf zR}Xifm@>6_*=H9`*e&V-W&%%L7|*FS3^N@~Ouz0INAi@iy;nND<3Vl*iB6uRqS%(X z&JCzzy;i2d@aS*&QEkykO;mRwAJEmwHO2h7`wL>l2srYG-{Uhpgcy-a!{Jor>kre) zbA-m(#*@P&+JxV(zqWN&MgZwGGqi{nL?gDtZX6Zkf|*tpfTM$;3l1=JF6p(yRWXBC?8fI_2s3m9m=C-G$i zRg(2|=Ve5ocUyQ)KY$BBoLX^SmpQiPiP+0Ra56hDi2E{u6awIQ_Xe&RSxKnB$_;}I z^lS6>I!4qhQe`GPAg10M+o%gLo~veutKtmZd^pRhEw8o8wJRU~lS8}Y;jW6LomE^! z(T>OJE%YMv{cJoy1Ox+dZ9PO)3f~%0f2ZPT^Fib46;3^&{nFM?=Y=JG)XrhWh=HQe zClG%8lahn`MuiKXb{y)|nHkbQ82qU0E~^{&1F9N2)eDzL=rAOeD5{pp(M~h65AtjL zR26T1*xhfJ5uZeykH#j^NIIx^J}TCg%>`GCFw5k&Ej3VXB8j_hr+YWYg}lrY3X=$A z60d*xBQ6ZzJEzX@RWD}%IKE`btMKj1KQ^<%h*TJIRxWoycPtR;KEJp|krP2Y(Z1)+ zmNJRvKf8Us=y{{OXOlVl+?Z9-ZIQ~TeZL7^8g0GMYYo;>#S8_W%dE8e^;22f_>`_v z*kgf<))Ju3q#hx>qb#>HcBMLO|W7p6(Oi zf1qnbefqZr(wy&~ukpWS3hk^RL*pw=<*#BIz4j@jV%SP_qJt3VLiG^h65V|rLA@KD|w%?%`y@f zunJ(L-fe0Gv7hWDkRALwvB#Y(&)p%RA-wkYoKd>#Tc;8m4y=rQ?k^P55Z1)pr=7{g z4+j>u3+3({us*6PsJSE{wN?PGV|H|!^fgD31(AnWhAi&n6`}Ka7tqV7SEvy`4Wy!` z<__H2sZ#KO61d&JHD5Ii#dwzY3u(lf&sK~0h|+30^)>Z*_P3EA(CIU4B8F-q2G;18 z&?t|n&vvt7SzWU0$>)2e6ujHR+N<^j+P@$}Xs5NCn9HLWtW$%LFhe6C$rLCtIBTqM z!r<6c;Bn)>3~%N1A_hQFo*|-34fiBu-0=_6-_Ih*L4TPfkOWzSe9mXE^`-u+W!S4O z;TTOAg{o}s0AOl}6hGBIpMmMd&p~AE9msalTlZ(XKoYugVWXRw4XP1zZ?VP|s)W+Z zPx#GI$ttnH0kgC;RwpDSDk~!&mE}Zn+{brm9tis4YH0PKB%@ z70kf@_b3%EMKVmiek>cGX$KQFV(P-u@VQCT$;Ajo(>bf!c}F;9I)YDjP)CS`$HK3M z1OcA!z!?p}Q$06iw!Kvn6vaSJ=&?U0$!T&k*|Cr3*V8z5Y3OoGh6if<0s zE+d7LT@iBSK|cYF5HN$`EL$xy$eHF;4rIYfZ;MU?XZa=MmJu#qUMvH3=XZcUnc+PR z_VRM9YJBb9%g%|OkDivtV9n3XXA`OEQ*l+a2L3LkeNO3NiDOMZC0PZ%BEumFS=zcgu#goYES==zK3J5kgK^>wO9(P5~aJxG`tR;>c7|u2dTY zy{uU3B;-&m5jg^vz~WZE4x^aLOe&-2g)* zl!a4ct_g4T^aJj^UZiAg#OH5xfJ%f9YPZNty?DWuMj9(k7^iVQ=q345VNk`PB#>tGD{mY*A8P~vj>}@-( z#&YvH6zn7g~+t zVCLlsb53LOBnmoOxQy@&8#oMVi6)0i!^s$wh6`>uT2TwOABe#*!xSuP8v=%`59y~q z8tK)(RjrsJBlA0dCe-j&C`qjwoqBq)Zg-mSeIW+S3u<#-;NsHEXR?`!T7`T+F~v*p z7k31xva8mGj*uXFR55&?0qAZfsU(c7*iZ%w_Wc*%T>l56=sB>%j)z)TYdpeTJq%su zZZYLSQZ9zSe*dm?r!D>@(Q(KsUNWZby&3#30i7<&&xbj58${{xC9Fz^L;odk&jBR` zncsHqXow>FjnZuxx8em-CEOQ`kP-VzYiws)kn>=p2lx0$3Q65!XLMY-?iZLMp$1M=`2|_X5Q2xKGoywb{M<&TT0*l_N}W)A zl_xrJPWIdPj_`KBbR(qoT85p75Y3NHvNkCEdt>UbuKH@tAe|#08cN;q9cR+J62^>= z;J+5#x&7R!F!lXeFhkbN8D^?xCo(IosALUCK6P*pVj!1Vv!#czBy^6vRe8dS4+$|d z4Tb*$id$ba*0!RF&mw}|r>VOf@-Z_O_ugMRSvBmYzQ7=!r(XO$?1{|SLcH_g8HE5D zNXD1GhL}41^v|PL)A|Kl=@N{m5AP81SS3V0EgdrZPtDwBOrso$x`BEP`QwGeXEQ1VtP{})~Y6TT{ zb8i04HArt%39{(qj-K~JMK6@~)Q^%A_1xv0JruHnp)~*5j3l9>_vyEE9M_#QXaAcq zYT2sydRM-Ed+G{qJt+PiRE{5kgPo6-{#W)8bo1B+7wOcbECjd$Wsu{r%nO}|y9IKB zx7h?r|5{Ew#@mwI{=I{^ns?z=&d^9!CFbUGxBXf%G8J4I+PY!y9Yh(>MKW6pComY)!1;xnQpIitiCe-n{62|RBBJ~mfp!$hEJb#X}pC`=yEL zzQ@U&n#KPdD3sy3Qfu0-B?v~nQQ0BorU%_MSY&}8f8=>=rLe`+*hopUWOgnG>kHxcBTh_|o@evsF3vTpftD1JWMLG#w&PHce8tl$M@vBP3yXIa~nFvzK4;*pvA?fM2axgcqw zF;1A{r|SeGJ2@{hSqo{joq#ish>a$6kp9HzYD-WBjNon~G7oa5#A+|EV0w}8)Uk={ zO9~C@8cg$)F+ey6fV{^5212f1Z~H1jOjBve&F3U6Kwm)8>xWbMU0b}k2!$$dbyW=3 zDykC*eHg=`82ad8({F-;K6we`%rz2A(~^#X_&p)<&W!(#GTzG!5GuwXh(SzXFA8_U zf}*&qOm~(z(cQk30yh|$N8&QEl`YPEMg)^50GXrf=1T^A!}@io19cR0inE<^p{ay) zpL&+IGuIjZ{y{Hz8N$DXELkN-PK%YHtx+eXkmjjX{zxMx3|%*C>j&{M%&m?!gwt!N z-{H2bP@33P`#6)wvK#BP%9a|!VcVUR-LnVemHEsPHstAmD357(&XBbd%|Wz0fMvbg z4SFQ|t64_j30;!fRM?}w*k*|JZ%~FPxVChEUs)XsG;NwqTaY#n5*TMGLozKh#}$U> ze5;taIz7f#RIY%tx2z#THq%2pMW#Js(ZnMDS(h!Zk#XWg%XXPSz#GuKKR%kl<7)gV zIl*AgrvZh2=@)~}iEF3Mk?AylcByzc08yXY*%?FhIz?4-_Rz)-b`73_LPe9aj6uop zBH%*DAE&QfL}kR}K)j^Me~hHtA=(Ix$l4|eI-TqOn)+^dblbT3tBOacTDP3i_hvM7 z57KOTu{>F~TG^H|YsOWKq|gstUmUH%!yX#*bafclPxKr>PM&k^Ps+e$x1G!>`eTu2 zIPF>oH&K|$e9_i1@H(J5s>kcgRt!LbHSnRZ? z_XZ*>YoKcaisn8{TMa%XGq@_M+|}CC&_cwugBxUc8&U%MMoV(s(arepJUV1b_K3h; zAOS#YAK=K~d|Ir)Uc(yfE(L#qkQeHQI-adCauBub4Az!`<2PeI-$wo&_gA^R15zlC z0LwYUg=?^@*Qfs!OJo>B#`=7R&KmpYG40WJn|#F6L+d}GjF;->{ENBSR`qak->(WZ zdETrNnlOi ziEh2-$Y2+!d6jUk@IZ9?GBDr5{j{`tB6Ms9pPm6h>W9wE^rJDC=-Hv3r?v5(O1yNL zsx`i+`2Ks5{66!0BS3g=^j!2xL-fZpQ=*Y51o#Af*(QMXnbRGgmmoE8X#7T!$WYBa zofWD}i2@h?rJl`dHz}|G=Uq7{&I4;lh+6T<1GhcNggbKYG zQrmO`em$~vFcS#1Z&?)H%K{;5p3Fz#&yA4e7EjPXEGpjK8vX&a-Ee{5{6yBKYgsTnd%?a@QvP-Y!Q*j8#R;+|!0q>+Tr8roMu> zm8e*SCKnHlvrZRZeG4oLluc(NovLr)**_tPiUxvWgA1O{-&%JN{BLB2kN@PX>3g~L_Nv!cj&x|Febkeig; z%_&9{i8gCiS%-&lqd%lSuj~P=mIK zSG6%&Xg_n6slC?EM~X=|C*^^GIalH*5Gs_GDr`T7%llFIMrL4m|CQ`Pp&HC$-iGte z=j^3xvMDOlQ z|7`D8-%nR)mJ=J-4;$V`7sN5X;!d;qjDgZ?qb?B7#1RMU22<=cF{2HOZ zFi?7<&}<$A?>m~4$#uBWi3XZAG5|*m26(l$u3uEc%r6=lNxU_{yn+`-NDurJz~m8& zx7ru=9dLKiA2S0~U`EZkFxcT1d5PkC7R{I1!=zQR&3YR?aL_CbzJpnF`%Hhpp{}r% zw>&|dt&6l1v03>Ydr9DlNUPPq^3%V)k|c{7#xT8Ei@bpo?+Pe)qC_qHK`hWw)NPM! zdWeYmv_LzXwaCJX##Wd9`k9 z)GBO22k-rPB>S@iEi~SYk*?$D01e0Od9ryYF>5-kdQj9|u*yQ=Kf92x$lg(9Y8Gm{qX$JJCFjf%2{1Co!7AIA{C)CaQr;L? zx$xc51rllEla5!pE3bZKLNrISMRICKTkNcC;vZ*&WguU)v|k5KyI<8Z9FQ(X(VewF zvd9a!D*<0%;o(?F16qAx95dRw3%Z$gVz&;5oG|-5zU=s{I@Mi&mvUK}jJyjFmOH1$ z7GyBoaZjo|%s-#+w$xb?`2f>1!{CqrlPlcQhIo^&ZF zN!VMD)V-*E-|KL%2c6-6PZ3LA<-nyCrWVnzZN&k-{Pv%cGUDtn@OZfNO2kMF&(@_= z$$g3rcV0c(tG;hRD{fRf*J=BPl@sU6U9dL97&7r8(&!q+hjhN9Uf#7?TIoayS_-q1 zl5(_O=DGvMXDAXjHahH>nPy@Ogx-)r%ps&!O!gq&U(lhmgn+Q~QXd~obj){QJNB@? z_iRe4vf0We!rtIlXe^Kt&f^F$5V`#>k!dEpE_zN2rpF$<^fBS*RDW}gI-8@p1Hi2D zI$I*{#PbdvTQqDk_)$POw96K}L`f6bet7{IMUh4oXdtb82Lny2g5{;^DD`YHk66Sk zZ9op_#Xe1;d5P#GOROGYf@980ZY!e;!Yb4I|D1V%J!&U~Xcr=BVbRMN;`xftq&# zxyHmDMlW$Zc-T{JZgbiH@0r^!CwgmYJQp%QWIc^$9%+64Mkv~3*vFf_meftCVkGKf ztO0dG-M8<_uyHpSPR zx)GV!y7`l4lU62?&O7`@A2N;$Qai>|;Clzg@X}2oB~|9yQgWfURER6RS&_FB1LyCC zBNF522HmJoS-x%{TN~3|o~ctQz1j!KF#+@R^x){jqC+eeJTyl#ddHIzYpyE1K0{Nvh*7gV&Y};0agJr4)Bkev+m96sBeXAZ2H3tRrD-#~Nz()W(AmPCe; znpS>K881hJr!?Tw%yS1W%9_yjemwpsu?53jd7Jx80M!^Qozf{ebP3uU2fA)>m15S~ zz-Nf{2oB*2sN4$V1zTaH|G^+^9dyfte$kQb{oYyODXLX*`MtmmR{`}k9StUmngPbw zniL8OACl(OCjucd8he7>Mg)DE<5d?R{SpebgTjqa^>ZyxC!{;5u2*a{N?@ zq=`ZqOm1MzFJ2RRS*(}gZY4L}xbI=VlXl?s>?L;DogBlPbs?LvH$6Hs#ho4Y8)CHT?8#pGlFvGnmM-G@kVY-nEToUcWk6#LY!&noF&O zM-@_l10Wih{%?d=SmU`;NFqka>n3LpL_Z49^~~fqpeIgBiH3}I2OkFcU~@aaCONHbUmp-QY&a>RbrKS-~0QL5pTPGiLKaW(pug_Q7pc3X0^_a@QxZR_C~D+MLWqYc}8z z3Rl9zoClYbZSa1hlU=^PX|W2~tK%xb8Z&eag*61S{>Mko?lP1qI9JgT>!S$t08#G- zhUM-SKDCGdYKhRG8qI1d2h#l0(B4Y`VYjqx0_;*_tP&A}=-qdO$ieB90L=g7{hjof-6@>MywGMx+7q zfbl8BcovTXeQBpg&wpet*C1yzdnDJ@1?Io4xJgXI}Yr;I}^O5~}d#+%3kTx!lpf|5$H1*XVu1G_;M zH%Z}zaL@mCHNww5u?H|-YZ8-#pkNHgB@XFn0Z(i@?wwVDI`0SRu*u#BZ)%m;lTb3N z1;*PWm=%;a9bSZ%VJV{ixPWCcc75j0u8G6TLo{UkfL66t#RHQc&2aqdCWPbHn)gA+ z?u8;mO!>9y46LGvh_C?;_W%x|B2DZl3XyaYb9*HrHb-Xnm`jMM4=c)?o?XNy6m1J6 z4jfGPXgPwC_|43exL_StTbYC-GSY^G*kuUaO`1f{=c7dZTbJHsiDk674+idbHAsX< zKx*Eo`58It%}}1)ijb4pindZC)U{+LU5rd^lXU~wz{d#kB1WVf9``%M!49XJkDPex z-zKtI+TAu@oatf)`)59S1Iz5WR6!f6SWdT;ZGK#if#H4x(xqLfoZ6&_5HWkJ`}JDz z6@H{QL~-V!pJ#|gK_`Xl^@-`_&qSQ2+LPYXOI#0PsOq}8EisS$9 zk;+Wt%QO6nuTu%IxJ-X#$3TfNulY8NQA?;)i#d`x=Bx#87w?( zJiQ{YvC}x|mG)=@M7*eZif7aW6?A&c0zGAM$YA5w@-#z=$Y5srJUP_*SEDYg;iq#x z|Mej;d@~~1h*StVqI^M{Q#|=?ERfgGg#n2H;isY6xY^k5p;z%Z7h0Gg79HhOTsk+hHn`jccg@Ga3ytHc2L% z!BtrgMBzxcmSn82yJG@f(#{ICfv3&N2f0Frb}z)qqcSQhzaz5>UU-`}BTACvB-4w~ z`Jd#ya;f?~9SPq!@wCZfOUQh4?VpK&MOp zHg?2PaxEO7RINLA#LJ|QE|=W9WK2Iv(YfVL44Lohvu+Nl4Vli$A86_1D5dK9JEOet z^u-7E8$aN9#@cu*OFO)V*S+lg0pc%q;3xSlo6~4hR`6s(BW-_Wg7_?wi^WaHGqpsr zTs0ZaIq+~thL^B!GFZkn)BIX=RzN8Cj4Wg)YUH1qZ_kNx3rfe^+t7?c4h-%nl!O2S z3bl|l)DiR(9EJd~c^kC~{+;fgwzx(UQtfa9akzCc9s+-MK<-@bpu9W&7%AmbS?2;D z%x|;p4>|)~h*~|{?}a3>)K8*k(1qp$_JgDgfCkH1+gav!-_LcC4TZDQMzUP(|t+ zf@Rz^Bm|=4*%~sTNu9Dpcd8>DR*2TEM*3Z;Q|nS0x|jeb5p+DWRWrPlXl6xkcyu-~)-W>L=StHBoKM;mYr@PKD`CV?hJ#yh;70Rr=+A z>?_PXdu#HYU(0M=G=LG+{Dz4Vs=PMUFg4IA_Xq+i_80C!nQrZ7Uvu}jIM22wZr zHrkZxF6&c<10ECjDN*)}3{%0Z%l%5=2REisnM z)f!hI0GVK@TdT9Sb~^#Gmsw{4cCtWyK|2=#NI77SJ=}>VQk34YczA z$Kd)O&~JRMm+Uz&{)01vNbwxNazqfTgrB%*85lzS>a&4>;ZOv~_H0FH33hB~6|9oJ>Go0^H0fc@Hkb@YP@xi7;5&Yislx~7hDyljf4nrIkLGuXy zwqXdANR+H@nup^!t~JfeN3LuW+l@M;1;uX2o{2@60z)N$W4hqm4m53?j6(IRwZ}a* zWJ}T0_1Akl?Z90cwAPkdFw?Vi?EwQwW?_T3)ElLb947U}g(D6{J$;y#A^;-$R_LG-ks(m5W&!~j}3CmZw^M2<=U#7gs$to{c$`m1NA{28F6tU(4l z`stRFvA1(I-0tx6t2LHl&V-3tElS6l?+gZl%wz^vj-_S>b?+&wqNRe_#N9zeyoxPD zP7n4EcGH!)yV@Q9Iu!CN!HF%>sar*o1A?X)60i7{w6%h_tf}}(rZUO?J5dt3AX|ki zfcxemZv;rgZ^`P3oH~14G$4G)7o}7SjH9?Lwp{;Fe!)mJ{A}Kf)`Qd{Ujxjyc+mif z+l$a)xXGI-$9!xT9;c;~U&}1;&{f>!JW1bqZ}D8MKK(s3nD0x@wtq<`*CuF zEx6%2CHbHENJfr&Zts#g*8&#-CM9i@w;j3AG|e@1yyxL_fglAWDS{5^_1KlF5f!0s z_ZDX&=Lne3LkHs4Qz@MhZbmN#Em)EEEjAOoNyZ5b%KRdWQaH1VXc3TO0r}=)Ibi$H z4`qxrRJe4{nao_BqRMvYiu(06&7Q6m{Rkl62)7$sXcLKgQ{<7oN1-65;l*sxtQ9&A zAokG)=wcvwdKd0FZsigz^9XyYQBGKmci&<{GI*qIy@V7YtAHe=65_G_vf`#8wX$y@0ww{MdjF|kA!C1!KKn?$(tmj zdI9ooxSvGd9y__+>e}V`v7DZHnbO7i;1zyxgEIGoKVUPIavADg0cZkFk@%1an0S&c zES;(AzvAYqZRUC6ymm%akg?+br&GE`KjmV=Nb$Eguyo1!%N4!~7fU_(=y!4{3qCc{ zr;8N?h4pXvJKoR+zPgsaBq-T^PQ}-hW{DfRTs1~-5HU|w8j7Bf%3#juhm`W#yv3Bv zizXMpB+}BOXkyG1u1=bIWom~|Sm9>9p4B^sB&BQsy#lXQ8ReDH1E6 zJn!%T^$k+r78o-{Wma{~cU7iGhHIiW6}rE}+Hs4$6?F5_q7yo-jB{(!wF~%0!U2Xa zd!IEUy)fCwNH$HcvC;;2YnSgJHz%YPS)6s$=`BogsVJ6WWP0tzbG`g>3YNWYf*iIcA z#G}7hU<5R_>&{D$RVe%#d4vOuJFEOTQkj39r?EIRp`SnNE;cT~@;JsXN_=ZMWU&nL*tO9t}hIm|FzzW0{CP z;sP@6M=ZN|vFuY7UUE#@J^+X+CrEzQHUz9Uq#7YfmVeXA7t~h!ROY`LT3)hm(mSa| zn3$vD!EHxXrq8JC(4*4nqv1!+yACt=%bwhYQ*fxYIdtKjqvT~IBhDj`=GM5d{;@ug zcAq^_UikpX)@lm21`1-sw%2+N@-B37TeUKkJ6Aj21~DP(o>2MxC`-Dfc#rpzQ4 zY88mhyLIi7{+AJ-8i0%M24}M;>!fzPq!N@#4W#jP7Gr)Hc zQ&`9pV7rw{(>({D*5clmanT~q416P@68*+z0Xt-11872^RL1RkXlF_fK2XFd1B;zX zyT#Yu#e%4l#l_vO`dp*Xq{%+`>y{tRwaG-a!T)Xq<5J$h0mUsq;^v+dISZTbxR%EgZTEB&tmV16D8iJ&D{9d60s~p3X z2PFE}=Jsk!xXtRJOQp(P$Fp}zz9p7n(==1IpUDJ9$v~a_2gVYI0Gcv+ z_t1aNw-eQ`-3~yqbse=e2rd34k6k`5cS)l^%#9!x|4U(YvhU5K%evkxWJ4(lcU?7N zy(!`bZ&lwCGQsVkOe$H3RwU8q29Ey7{`9oKwaLZk`WxKo;v7ww5rhLZwbi^}Io3v3 GS0;XR3rO_< literal 0 HcmV?d00001 diff --git a/BKPS/14031206/X121SMCEA/Strategy/x-121.smc.strategy.class.mq5 b/BKPS/14031206/X121SMCEA/Strategy/x-121.smc.strategy.class.mq5 new file mode 100644 index 0000000..2de5367 --- /dev/null +++ b/BKPS/14031206/X121SMCEA/Strategy/x-121.smc.strategy.class.mq5 @@ -0,0 +1,1135 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 Class Library +// -------------------------------------- +// Name: XCX121SMCStrategy +// Description: provides all based classes for use ... +// +// +// Maintainer: +// ------------ +// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) +// +////////////////////////////////////////////////////// +// +// Global Properties ... +#property library +#property copyright "Copyright 2023, SaherElm IT Center" +#property link "https://www.saherelm.ir" +#property version "1.00" +#property strict + +// +// Imports ... + +// +#include "../Classes/x-121.smc.base.strategy.class.mq5" +#include "../Classes/x-121.smc.market.cycle.helper.class.mq5" + +// +#include "../Signals/x-121.smc.xwz.signal.class.mq5" + +// +// Definitions ... + +// +// XStrategy Class Implementation(s) ... +class XCX121SMCStrategy : public XCX121SMCBaseStrategy +{ + // + // Public ... + public: + // + // Props ... + bool useXWZSignal; + XCX121SMCXWZSignalDetector *mXWZSignalDetector; + + // + // Constructor(s) ... + void XCX121SMCStrategy( + // + // Base ... + string _symbol, // Trading Symbol + ENUM_TIMEFRAMES _period // Trading TimeFrame + ) + : XCX121SMCBaseStrategy(_symbol, _period) + { + // + InitialHelpers(); + + // + mXWZSignalDetector = new XCX121SMCXWZSignalDetector( + _symbol, + _period // + ); + } + + // + // Deconstructur ... + void ~XCX121SMCStrategy() + { + Destroy(); + } + + // + // Getter(s) / Setter(s) ... + + /** + * Get Max Allowed Required POI(s) to Find ... + * + * @return ( int ) + */ + int MaxAllowedRequiredPOIs() + { + return mMaxAllowedRequiredPOIs; + } + + /** + * Set Max Allowed Required POI(s) to Find ... + * + * @param value: number of Required POIs + */ + void MaxAllowedRequiredPOIs(int value) + { + // + if (value < 10) + { + value = 10; + } + + // + mMaxAllowedRequiredPOIs = value; + } + + // + // Overrides Actions ... + + /** + * Destroy All Class Implementations ... + */ + void Destroy() override + { + // + ZeroMemory(mDecisionCycleHelper); + ZeroMemory(mAnalyseCycleHelper); + ZeroMemory(mConsolidationCycleHelper); + ZeroMemory(mVisionCycleHelper); + + // + ZeroMemory(mXWZSignalDetector); + } + + /** + * Check Conditions For Signal ... + */ + bool HasSignal( + XSignal &signal, + X121SMCStrategyConditions &conditions // + ) override + { + // + bool result = false; + + // + signal.Clean(); + conditions.Clean(); + + // + int pushers = 0; + + // + double sl = 0; + double tp = 0; + double risk = 0; + double entry = 0; + double reward = 0; + double r2r = R2R(); + string provider = ""; + double volume = Volume(); + ENUM_POSITION_TYPE type = POSITION_TYPE_BUY; + ENUM_X_ORDER_MODES mode = X_ORDER_MODE_MARKET; + + // + bool hasLong = false; + bool hasShort = false; + + // + double selectedSL = 0; + + // + // Start Calculations ... + + // + // Retrieve Common Data ... + string symbol = GetSymbol(); + ENUM_TIMEFRAMES period = GetPeriod(); + + // + datetime cTime = TimeCurrent(); + + // + // Required Value For SL/TP Calculations ... + double points = GetPoints(symbol); + double pip = GetPipPrice(symbol); + double pip2 = 2 * pip; + + // + conditions.time = cTime; + conditions.symbol = symbol; + conditions.period = period; + + // + // Check Spread for Signalling Conditions ... + // TODO: Uncomment this ... + // bool isSpreadPassed = IsSpreadPass(); + // result = isSpreadPassed; + // if (!result) + // { + // // + // conditions.Clean(); + // return result; + // } + + // + // Detect Signal Conditions ... + bool hasSignal = false; + + // + bool hasXWZSignal = false; + + // + // XSupDemOBS Signal ... + X121SMCStrategyXWZSignalConditions mXWZConditions; + if (useXWZSignal && !hasSignal) + { + // + hasXWZSignal = DetectXWZSignal( + conditions, + mXWZConditions // + ); + hasSignal = hasXWZSignal; + } + + // + result = hasSignal; + if (!result) + { + // + conditions.Clean(); + return result; + } + + // + // Combine all Signals Conditions ... + selectedSL = conditions.sl; + provider = conditions.provider; + + // + hasLong = + // + IsBullish(conditions.signalDir) + // + ; + + // + hasShort = + // + IsBearish(conditions.signalDir) + // + ; + + // + result = hasLong || + hasShort; + + // + // Rmove Signal Condition ... + if (result) + { + // + // TYPE ... + type = + hasLong + ? POSITION_TYPE_BUY + : POSITION_TYPE_SELL; + ENUM_X_POSITION_TYPES xType = + hasLong + ? X_POSITION_TYPE_LONG + : X_POSITION_TYPE_SHORT; + + // + entry = GetEntry( + conditions.symbol, + type // + ); + + // + double slAddition = 0; + sl = + hasLong + ? selectedSL - slAddition + : selectedSL + slAddition; + + // + // RISK Reward ... + risk = + hasLong + ? entry - sl + : sl - entry; + reward = risk * r2r; + tp = + hasLong + ? entry + reward + : entry - reward; + + // + signal.sl = sl; + signal.tp = tp; + signal.type = type; + signal.mode = mode; + signal.entry = entry; + signal.volume = volume; + signal.symbol = symbol; + signal.period = period; + signal.pushers = pushers; + signal.provider = provider; + signal.time = TimeCurrent(); + signal.target = conditions.target; + + // + bool canReplaceTarget = + signal.target > 0 && + (hasLong + ? signal.target > signal.tp + : signal.target < signal.tp); + if (canReplaceTarget) + { + // + signal.tp = conditions.target; + signal.target = tp; + } + + // + result = PrepareSignal(signal); + + // + if (result) + { + // + if (useXWZSignal && + hasXWZSignal) + { + // + // Configuring Amount Percent and ETC ... + bool ignoreEAVolume = mXWZConditions.reward > 0 && + mXWZConditions.amountPercent > 0; + if (ignoreEAVolume) + { + // + double cReward = mXWZConditions.reward; + double cAmountPercent = mXWZConditions.amountPercent; + + // + double cRiskReward = risk * cReward; + double cTP = hasLong + ? entry + cRiskReward + : entry - cRiskReward; + + // + double balance = mAccount.GetBalance(); + double cRiskAmount = balance * cAmountPercent / 100; + double cRiskInPoints = risk / points; + double cVolume = mAccount.CalculateVolume( + signal.symbol, + cRiskAmount, + cRiskInPoints // + ); + cVolume = NormalizeVolume(cVolume, signal.symbol); + + // + if (cVolume > 0) + { + // + signal.ignoreEAVolume = ignoreEAVolume; + signal.volume = cVolume; + } + } + + // + // Fix Signal TP Based On Working Zone ... + // double maxAllowedTP = + // hasLong + // ? mXWZConditions.workingZone.upper + // : mXWZConditions.workingZone.lower; + // bool canApplyMaxAlowedTP = (hasLong && + // signal.tp > maxAllowedTP) || + // (!hasLong && signal.tp < maxAllowedTP); + // if (canApplyMaxAlowedTP) + // { + // signal.tp = maxAllowedTP; + // } + + // + // Configuring Global Protector ... + // signal.trailSL = true; + // signal.trailSLStartOnReachTPLevel = 3; + // signal.fullTPLevel = signal.GetRiskRewardRatio(); + + // // + // mXSupDemOBSSignalDetector.RemoveDraws(); + // mXSupDemOBSSignalDetector.DrawConditions( + // mXSupDemOBSConditions, + // mVisionCycleHelper.mPOIDrawer // + // ); + + // // + // mXSupDemOBSSignalDetector.RemoveWorkingZoneDraws(); + // mXSupDemOBSSignalDetector.DrawWorkingZone( + // mXSupDemOBSConditions, + // mVisionCycleHelper.mPOIDrawer // + // ); + } + + // + // Draw Signal Oject ... + XCSignalObject *iSignalObj; + bool isCreated = mVisionCycleHelper + .mPOIDrawer + .DrawSignal(signal, iSignalObj); + if (isCreated) + { + // + mSignalDrawnObjects.Add(iSignalObj); + + // + int maxAllowedDrawnSignals = 15; + int count = mSignalDrawnObjects.Total(); + if (count > maxAllowedDrawnSignals) + { + // + int to = count - maxAllowedDrawnSignals; + mSignalDrawnObjects.DeleteRange( + 0, + to // + ); + } + } + } + + // + hasLong = false; + hasShort = false; + } + + // + mXWZConditions.Clean(); + + // + return result; + } + + /** + * Check for any Guard Actions ... + */ + bool CheckGuard( + X121SMCGuard &guards[], + const XPosition &positions[] // + ) override + { + // + bool result = false; + + // + Clean(guards); + + // + int count = ArraySize(positions); + result = IsValidSize(count); + if (!result) + { + return result; + } + + // + // XWZ Guard Detection ... + if (useXWZSignal) + { + // + X121SMCGuard xwzGuards[]; + bool hasGuard = mXWZSignalDetector.DetectGuards( + xwzGuards, + positions, + mDecisionCycleHelper, + mAnalyseCycleHelper, + mConsolidationCycleHelper, + mVisionCycleHelper // + ); + + // + if (hasGuard) + { + // + Copy( + xwzGuards, + guards, + false // + ); + } + + // + Clean(xwzGuards); + } + + // + count = ArraySize(guards); + result = IsValidSize(count); + + // + return result; + } + + /** + * Update all Requirements without waiting ... + */ + void DoUnwaitedTicksWork() override + { + // + // Decision ... + mDecisionCycleHelper.Update(); + } + + /** + * Customize Strategy Identifier ... + */ + string GetTag() override + { + return X121SMCStrategyToken; + } + + // + // Protected ... + protected: + // + + // + // Props ... + CArrayObj mSignalDrawnObjects; + + // + // XC121SMCCycleHelper *mTriggerCycleHelper; + XC121SMCCycleHelper *mDecisionCycleHelper; + XC121SMCCycleHelper *mAnalyseCycleHelper; + XC121SMCCycleHelper *mVerificationCycleHelper; + XC121SMCCycleHelper *mConsolidationCycleHelper; + XC121SMCCycleHelper *mVisionCycleHelper; + + // + // Actions ... + + // + // Signalling Functions ... + + // + // XWZ Signal ... + bool DetectXWZSignal( + X121SMCStrategyConditions &conditions, + X121SMCStrategyXWZSignalConditions &xWZConditions // + ) + { + // + bool result = false; + + // + // Validate Cycle Helpers ... + result = + // + mVisionCycleHelper != NULL && + mAnalyseCycleHelper != NULL && + mDecisionCycleHelper != NULL && + mConsolidationCycleHelper != NULL + // + ; + if (!result) + { + return result; + } + + // + bool isBullish = false; + bool isBearish = false; + + // + int zIndex = 0; + int cIndex = zIndex + 1; + int pIndex = cIndex + 1; + int ppIndex = pIndex + 1; + + // + string symbol = GetSymbol(); + ENUM_TIMEFRAMES period = GetPeriod(); + + // + datetime cTime = TimeCurrent(); + + // + ENUM_X_121_SMC_PROVIDERS provider = X_121_SMC_PROVIDER_XWZ; + string providerStr = ToString(provider); + + // + // Detect Setup Conditions ... + datetime setupTime = mXWZSignalDetector.mConditions.setupTime; + bool isSetuped = mXWZSignalDetector.mConditions.IsSetuped(); + ENUM_X_DIRECTION setupDir = mXWZSignalDetector.mConditions.dir; + if (!isSetuped) + { + // + // Detect Signal Setup ... + isSetuped = mXWZSignalDetector.DetectSignalSetup( + mDecisionCycleHelper, + mAnalyseCycleHelper, + mConsolidationCycleHelper, + mVisionCycleHelper // + ); + + // + setupDir = mXWZSignalDetector.mConditions.dir; + setupTime = mXWZSignalDetector.mConditions.setupTime; + + // + if (!isSetuped) + { + // + mXWZSignalDetector.RemoveDraws(); + // mXWZSignalDetector.RemoveWorkingZoneDraws(); + + // + // mXWZSignalDetector.DrawWorkingZone( + // mXWZSignalDetector.mConditions, + // mVisionCycleHelper.mPOIDrawer // + // ); + + // + mXWZSignalDetector.DrawConditions( + mXWZSignalDetector.mConditions, + mVisionCycleHelper.mPOIDrawer // + ); + } + + // + if (isSetuped) + { + // + mXWZSignalDetector.RemoveDraws(); + // mXWZSignalDetector.RemoveWorkingZoneDraws(); + + // + int items = mXWZSignalDetector + .AddConditionsIfNotExists(); + + // + mXWZSignalDetector.mConditions.Clean(); + } + } + + // + int conditionsCount = ArraySize(mXWZSignalDetector.mConditionsCollection); + result = IsValidSize(conditionsCount); + if (!result) + { + return result; + } + + // + // Looking For Conditions ... + int selectedIndex = 0; + X121SMCStrategyXWZSignalConditions mTmpConditions[]; + Copy( + mXWZSignalDetector.mConditionsCollection, + mTmpConditions // + ); + X121SMCStrategyXWZSignalConditions mConditions; + for (int i = 0; i < conditionsCount; i++) + { + // + // Check Triggers ... + bool canTrigger = mTmpConditions[i].CanTrigger(); + datetime triggerTime = mTmpConditions[i].triggerTime; + if (!canTrigger) + { + // + // Detect Signal Trigger ... + canTrigger = mXWZSignalDetector + .DetectSignalTrigger( + mTmpConditions[i], + symbol, + period, + mDecisionCycleHelper, + mAnalyseCycleHelper, + mConsolidationCycleHelper, + mVisionCycleHelper // + ); + + // + result = canTrigger; + if (!result) + { + // + bool isISetuped = mTmpConditions[i].IsSetuped(); + if (!isISetuped) + { + // + ArrayRemove( + mXWZSignalDetector.mConditionsCollection, + i, + 1 // + ); + } + continue; + } + + // + triggerTime = mTmpConditions[i].triggerTime; + } + + // + if (canTrigger) + { + // + mXWZSignalDetector.RemoveDraws(); + // mXWZSignalDetector.RemoveWorkingZoneDraws(); + + // + // mXWZSignalDetector.DrawWorkingZone( + // mTmpConditions[i], + // mVisionCycleHelper.mPOIDrawer // + // ); + + // + mXWZSignalDetector.DrawConditions( + mTmpConditions[i], + mVisionCycleHelper.mPOIDrawer // + ); + + // + selectedIndex = i; + mConditions = mTmpConditions[i]; + break; + } + } + + // + result = IsValid(mConditions.setupTime) && + HasDirection(mConditions.dir); + if (!result) + { + return result; + } + + // + // Remove Selected Index from Main Collection ... + ArrayRemove( + mXWZSignalDetector.mConditionsCollection, + selectedIndex, + 1 // + ); + + // + // Check Signal Direction ... + isBullish = IsBullish(mConditions.dir); + isBearish = IsBearish(mConditions.dir); + result = isBullish || + isBearish; + if (!result) + { + return result; + } + + // + // Issues Signal on Conditions ... + conditions.sl = mConditions.sl; + conditions.provider = providerStr; + conditions.signalDir = mConditions.dir; + conditions.target = mConditions.target; + + // + xWZConditions = mConditions; + + // + mConditions.Clean(); + + // + return result; + } + + // + // Private ... + private: + // + // Props ... + + // + int mMaxAllowedRequiredPOIs; // Max Allowed Required POI(s) to Find ... + + /** + * Initial Required Indicators Helper ... + */ + void InitialHelpers() + { + // + useXWZSignal = true; + + // + string symbol = GetSymbol(); + ENUM_TIMEFRAMES period = GetPeriod(); + + // + if (mMaxAllowedRequiredPOIs <= 0) + { + mMaxAllowedRequiredPOIs = 50; + } + + // + // Short ... + ENUM_X_PERIOD_METHOD scMethod = X_PERIOD_AUTO; // How to Find Period + ENUM_TIMEFRAMES scPeriod = NULL; // Time Period + + // + // Medium ... + ENUM_X_PERIOD_METHOD mcMethod = X_PERIOD_AUTO; // How to Find Period + ENUM_TIMEFRAMES mcPeriod = NULL; // Time Period + + // + // Long ... + ENUM_X_PERIOD_METHOD lcMethod = X_PERIOD_AUTO; // How to Find Period + ENUM_TIMEFRAMES lcPeriod = NULL; // Time Period + + // + // Hind ... + ENUM_X_PERIOD_METHOD hcMethod = X_PERIOD_AUTO; // How to Find Period + ENUM_TIMEFRAMES hcPeriod = NULL; // Time Period + + // + // XPV ... + X121Inputs x121Inputs; + + // + x121Inputs.Default(); + + // + bool showAll = false; + + // + x121Inputs.showRSI = false; + + // + // XPV ... + + // + x121Inputs.xpvInputs.scMethod = scMethod; + x121Inputs.xpvInputs.scPeriod = scPeriod; + x121Inputs.xpvInputs.mcMethod = mcMethod; + x121Inputs.xpvInputs.mcPeriod = mcPeriod; + x121Inputs.xpvInputs.lcMethod = lcMethod; + x121Inputs.xpvInputs.lcPeriod = lcPeriod; + x121Inputs.xpvInputs.hcMethod = hcMethod; + x121Inputs.xpvInputs.hcPeriod = hcPeriod; + + // + x121Inputs.xhkInputs.xhkIgnoreSmoothingShadows = true; + + // + x121Inputs.xatrInputs.atrMultiplier = 1.5; + x121Inputs.xatrInputs.atrSmoothingMode = X_MA_MODE_EMA; + + // + // XTREND ... + x121Inputs.xtrendInputs.showUpTrend = showAll || false; + x121Inputs.xtrendInputs.showDownTrend = showAll || false; + x121Inputs.xtrendInputs.showOnlyTrendStart = showAll || false; + + // + // XPV ... + x121Inputs.xpvInputs.showSar = showAll || false; + x121Inputs.xpvInputs.showPeaks = showAll || false; + x121Inputs.xpvInputs.showVales = showAll || false; + + // + // XHK ... + + // + x121Inputs.xhkInputs.drawRawXHKCandles = showAll || false; + x121Inputs.xhkInputs.drawSmoothedXHKCandles = showAll || false; + + // + // XATR ... + x121Inputs.xatrInputs.showATRUpper = showAll || false; + x121Inputs.xatrInputs.showATRLower = showAll || false; + + // + // XSTR ... + x121Inputs.xstrInputs.showStr = showAll || false; + x121Inputs.xstrInputs.showStrUpper = showAll || false; + x121Inputs.xstrInputs.showStrLower = showAll || false; + + // + // XCHE ... + x121Inputs.xcheInputs.showLE1 = showAll || false; + x121Inputs.xcheInputs.showLE2 = showAll || false; + x121Inputs.xcheInputs.showSE1 = showAll || false; + x121Inputs.xcheInputs.showSE2 = showAll || false; + + // + // XDON ... + x121Inputs.xdonInputs.showOpen = showAll || false; + x121Inputs.xdonInputs.showClose = showAll || false; + x121Inputs.xdonInputs.showLow = showAll || false; + x121Inputs.xdonInputs.showHigh = showAll || false; + + // + // XVWAP ... + x121Inputs.xvwapInputs.showVWapFast = showAll || true; + x121Inputs.xvwapInputs.showVWapMedium = showAll || true; + x121Inputs.xvwapInputs.showVWapSlow = showAll || true; + + // + // Initialize Cycle Helpers ... + + // + bool isInited = false; + + // + int requiredPOIS = MaxAllowedRequiredPOIs(); + + // + // Decision Cycle ... + mDecisionCycleHelper = new XC121SMCCycleHelper(); + isInited = mDecisionCycleHelper.Init( + symbol, + PERIOD_M5, + x121Inputs, + requiredPOIS // + ); + if (isInited) + { + // + // Configure POI Drawer ... + color bullishColor = clrDodgerBlue; + color bearishColor = clrSienna; + + // + // Bars ... + mDecisionCycleHelper.mPOIDrawer.BarBullishColor(bullishColor); + mDecisionCycleHelper.mPOIDrawer.BarBearishColor(bearishColor); + + // + // Swings ... + mDecisionCycleHelper.mPOIDrawer.SwingLowColor(bullishColor); + mDecisionCycleHelper.mPOIDrawer.SwingHighColor(bearishColor); + + // + // Momentum ... + mDecisionCycleHelper.mPOIDrawer.BullishMomentumBarColor(bullishColor); + mDecisionCycleHelper.mPOIDrawer.BearishMomentumBarColor(bearishColor); + + // + // Rejection ... + mDecisionCycleHelper.mPOIDrawer.BullishRejectionBarColor(bullishColor); + mDecisionCycleHelper.mPOIDrawer.BearishRejectionBarColor(bearishColor); + + // + // Support and Resistance ... + mDecisionCycleHelper.mPOIDrawer.SupportZoneColor(bullishColor); + mDecisionCycleHelper.mPOIDrawer.ResistanceZoneColor(bearishColor); + + // + // Demand and Supply ... + mDecisionCycleHelper.mPOIDrawer.DemandZoneColor(bullishColor); + mDecisionCycleHelper.mPOIDrawer.SupplyZoneColor(bearishColor); + + // + // Order Blocks ... + mDecisionCycleHelper.mPOIDrawer.BullishOrderBlockColor(bullishColor); + mDecisionCycleHelper.mPOIDrawer.BearishOrderBlockColor(bearishColor); + + // + // Fair Value Gaps ... + mDecisionCycleHelper.mPOIDrawer.BullishFVGColor(bullishColor); + mDecisionCycleHelper.mPOIDrawer.BearishFVGColor(bearishColor); + } + + // + // Analyse Cycle ... + mAnalyseCycleHelper = new XC121SMCCycleHelper(); + isInited = mAnalyseCycleHelper.Init( + symbol, + PERIOD_M15, + x121Inputs, + requiredPOIS // + ); + if (isInited) + { + // + // Configure POI Drawer ... + color bullishColor = clrMediumSeaGreen; + color bearishColor = clrBlueViolet; + + // + // Bars ... + mAnalyseCycleHelper.mPOIDrawer.BarBullishColor(bullishColor); + mAnalyseCycleHelper.mPOIDrawer.BarBearishColor(bearishColor); + + // + // Swings ... + mAnalyseCycleHelper.mPOIDrawer.SwingLowColor(bullishColor); + mAnalyseCycleHelper.mPOIDrawer.SwingHighColor(bearishColor); + + // + // Momentum ... + mAnalyseCycleHelper.mPOIDrawer.BullishMomentumBarColor(bullishColor); + mAnalyseCycleHelper.mPOIDrawer.BearishMomentumBarColor(bearishColor); + + // + // Rejection ... + mAnalyseCycleHelper.mPOIDrawer.BullishRejectionBarColor(bullishColor); + mAnalyseCycleHelper.mPOIDrawer.BearishRejectionBarColor(bearishColor); + + // + // Support and Resistance ... + mAnalyseCycleHelper.mPOIDrawer.SupportZoneColor(bullishColor); + mAnalyseCycleHelper.mPOIDrawer.ResistanceZoneColor(bearishColor); + + // + // Demand and Supply ... + mAnalyseCycleHelper.mPOIDrawer.DemandZoneColor(bullishColor); + mAnalyseCycleHelper.mPOIDrawer.SupplyZoneColor(bearishColor); + + // + // Order Blocks ... + mAnalyseCycleHelper.mPOIDrawer.BullishOrderBlockColor(bullishColor); + mAnalyseCycleHelper.mPOIDrawer.BearishOrderBlockColor(bearishColor); + + // + // Fair Value Gaps ... + mAnalyseCycleHelper.mPOIDrawer.BullishFVGColor(bullishColor); + mAnalyseCycleHelper.mPOIDrawer.BearishFVGColor(bearishColor); + } + + // + // Consolidation Cycle ... + mConsolidationCycleHelper = new XC121SMCCycleHelper(); + isInited = mConsolidationCycleHelper.Init( + symbol, + PERIOD_H1, + x121Inputs, + requiredPOIS // + ); + if (isInited) + { + // + // Configure POI Drawer ... + color bullishColor = clrLime; + color bearishColor = clrRed; + + // + // Bars ... + mConsolidationCycleHelper.mPOIDrawer.BarBullishColor(bullishColor); + mConsolidationCycleHelper.mPOIDrawer.BarBearishColor(bearishColor); + + // + // Swings ... + mConsolidationCycleHelper.mPOIDrawer.SwingLowColor(bullishColor); + mConsolidationCycleHelper.mPOIDrawer.SwingHighColor(bearishColor); + + // + // Momentum ... + mConsolidationCycleHelper.mPOIDrawer.BullishMomentumBarColor(bullishColor); + mConsolidationCycleHelper.mPOIDrawer.BearishMomentumBarColor(bearishColor); + + // + // Rejection ... + mConsolidationCycleHelper.mPOIDrawer.BullishRejectionBarColor(bullishColor); + mConsolidationCycleHelper.mPOIDrawer.BearishRejectionBarColor(bearishColor); + + // + // Support and Resistance ... + mConsolidationCycleHelper.mPOIDrawer.SupportZoneColor(bullishColor); + mConsolidationCycleHelper.mPOIDrawer.ResistanceZoneColor(bearishColor); + + // + // Demand and Supply ... + mConsolidationCycleHelper.mPOIDrawer.DemandZoneColor(bullishColor); + mConsolidationCycleHelper.mPOIDrawer.SupplyZoneColor(bearishColor); + + // + // Order Blocks ... + mConsolidationCycleHelper.mPOIDrawer.BullishOrderBlockColor(bullishColor); + mConsolidationCycleHelper.mPOIDrawer.BearishOrderBlockColor(bearishColor); + + // + // Fair Value Gaps ... + mConsolidationCycleHelper.mPOIDrawer.BullishFVGColor(bullishColor); + mConsolidationCycleHelper.mPOIDrawer.BearishFVGColor(bearishColor); + } + + // + // Vision Cycle ... + mVisionCycleHelper = new XC121SMCCycleHelper(); + isInited = mVisionCycleHelper.Init( + symbol, + PERIOD_H4, + x121Inputs, + requiredPOIS // + ); + if (isInited) + { + // + // Configure POI Drawer ... + color bullishColor = clrAqua; + color bearishColor = clrMagenta; + + // + // Bars ... + mVisionCycleHelper.mPOIDrawer.BarBullishColor(bullishColor); + mVisionCycleHelper.mPOIDrawer.BarBearishColor(bearishColor); + + // + // Swings ... + mVisionCycleHelper.mPOIDrawer.SwingLowColor(bullishColor); + mVisionCycleHelper.mPOIDrawer.SwingHighColor(bearishColor); + + // + // Momentum ... + mVisionCycleHelper.mPOIDrawer.BullishMomentumBarColor(bullishColor); + mVisionCycleHelper.mPOIDrawer.BearishMomentumBarColor(bearishColor); + + // + // Rejection ... + mVisionCycleHelper.mPOIDrawer.BullishRejectionBarColor(bullishColor); + mVisionCycleHelper.mPOIDrawer.BearishRejectionBarColor(bearishColor); + + // + // Support and Resistance ... + mVisionCycleHelper.mPOIDrawer.SupportZoneColor(bullishColor); + mVisionCycleHelper.mPOIDrawer.ResistanceZoneColor(bearishColor); + + // + // Demand and Supply ... + mVisionCycleHelper.mPOIDrawer.DemandZoneColor(bullishColor); + mVisionCycleHelper.mPOIDrawer.SupplyZoneColor(bearishColor); + + // + // Order Blocks ... + mVisionCycleHelper.mPOIDrawer.BullishOrderBlockColor(bullishColor); + mVisionCycleHelper.mPOIDrawer.BearishOrderBlockColor(bearishColor); + + // + // Fair Value Gaps ... + mVisionCycleHelper.mPOIDrawer.BullishFVGColor(bullishColor); + mVisionCycleHelper.mPOIDrawer.BearishFVGColor(bearishColor); + } + } + + // +}; + +// \ No newline at end of file

    L7@pxM6C$Xski0HBH5OMZ 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 literal 0 HcmV?d00001 diff --git a/BKPS/14031206/Indicators/Free Indicators/Pivot Channel.mq5 b/BKPS/14031206/Indicators/Free Indicators/Pivot Channel.mq5 new file mode 100644 index 0000000..98d6f66 --- /dev/null +++ b/BKPS/14031206/Indicators/Free Indicators/Pivot Channel.mq5 @@ -0,0 +1,264 @@ +//+------------------------------------------------------------------+ +//| Pivot Channel.mq5 | +//| Copyright 2009-2025, MetaQuotes Ltd | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "2009-2025, MetaQuotes Ltd" +#property link "http://www.mql5.com" +#property description "Pivot Daily Channels" + +#property indicator_chart_window +#property indicator_buffers 9 +#property indicator_plots 9 +#property indicator_type1 DRAW_LINE +#property indicator_color1 clrBlue +#property indicator_type2 DRAW_LINE +#property indicator_color2 clrOrange +#property indicator_type3 DRAW_LINE +#property indicator_color3 clrRed +#property indicator_type4 DRAW_LINE +#property indicator_color4 clrTeal +#property indicator_type5 DRAW_LINE +#property indicator_color5 clrGreen +//--- labels +#property indicator_label1 "PP" +#property indicator_label2 "R1" +#property indicator_label3 "R2" +#property indicator_label4 "S1" +#property indicator_label5 "S2" +#property indicator_label6 "M1" +#property indicator_label7 "M2" +#property indicator_label8 "M3" +#property indicator_label9 "M4" + +//--- input parameters +input bool InpShowLevelsM=false; // show M levels +input bool InpShowLabel =true; // show price of level + +//--- indicator buffers +double ExtPPBuffer[]; +double ExtR1Buffer[]; +double ExtR2Buffer[]; +double ExtS1Buffer[]; +double ExtS2Buffer[]; +//--- additional indicator buffers +double ExtM1Buffer[]; +double ExtM2Buffer[]; +double ExtM3Buffer[]; +double ExtM4Buffer[]; + +//--- unique prefix to identify indicator objects +string ExtPrefixUniq; + +//+------------------------------------------------------------------+ +//| Custom indicator initialization function | +//+------------------------------------------------------------------+ +int OnInit() + { +//--- check current timeframe + if(PeriodSeconds()>PeriodSeconds(PERIOD_D1)) + { + Alert("Timeframe of chart must be D1 or lower. Exit"); + return(INIT_FAILED); + } + +//--- define buffers + SetIndexBuffer(0, ExtPPBuffer); + SetIndexBuffer(1, ExtR1Buffer); + SetIndexBuffer(2, ExtR2Buffer); + SetIndexBuffer(3, ExtS1Buffer); + SetIndexBuffer(4, ExtS2Buffer); + if(InpShowLevelsM) + { + SetIndexBuffer(5, ExtM1Buffer, INDICATOR_DATA); + SetIndexBuffer(6, ExtM2Buffer, INDICATOR_DATA); + SetIndexBuffer(7, ExtM3Buffer, INDICATOR_DATA); + SetIndexBuffer(8, ExtM4Buffer, INDICATOR_DATA); + //--- set plot type + PlotIndexSetInteger(5, PLOT_DRAW_TYPE, DRAW_LINE); + PlotIndexSetInteger(6, PLOT_DRAW_TYPE, DRAW_LINE); + PlotIndexSetInteger(7, PLOT_DRAW_TYPE, DRAW_LINE); + PlotIndexSetInteger(8, PLOT_DRAW_TYPE, DRAW_LINE); + //--- set line style + PlotIndexSetInteger(5, PLOT_LINE_STYLE, STYLE_DASH); + PlotIndexSetInteger(6, PLOT_LINE_STYLE, STYLE_DASH); + PlotIndexSetInteger(7, PLOT_LINE_STYLE, STYLE_DASH); + PlotIndexSetInteger(8, PLOT_LINE_STYLE, STYLE_DASH); + //--- set line color + PlotIndexSetInteger(5, PLOT_LINE_COLOR, clrGold); + PlotIndexSetInteger(6, PLOT_LINE_COLOR, clrGold); + PlotIndexSetInteger(7, PLOT_LINE_COLOR, clrGold); + PlotIndexSetInteger(8, PLOT_LINE_COLOR, clrGold); + } + else + { + SetIndexBuffer(5, ExtM1Buffer, INDICATOR_CALCULATIONS); + SetIndexBuffer(6, ExtM2Buffer, INDICATOR_CALCULATIONS); + SetIndexBuffer(7, ExtM3Buffer, INDICATOR_CALCULATIONS); + SetIndexBuffer(8, ExtM4Buffer, INDICATOR_CALCULATIONS); + + } + +//--- indicator name + IndicatorSetString(INDICATOR_SHORTNAME, "Pivot Daily Channels"); +//--- number of digits of indicator value + IndicatorSetInteger(INDICATOR_DIGITS, _Digits); + +//--- prepare prefix for objects + string number=StringFormat("%I64d", GetTickCount64()); + ExtPrefixUniq=StringSubstr(number, StringLen(number)-4); + ExtPrefixUniq=ExtPrefixUniq+"_PP"; + Print("Indicator \"Pivot Channels\" started, prefix=", ExtPrefixUniq); + + return(INIT_SUCCEEDED); + } +//+------------------------------------------------------------------+ +//| Custom indicator iteration function | +//+------------------------------------------------------------------+ +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[]) + { + static MqlRates LAST_DAY[]; // previous day + static datetime last_time=0; // reference time + static datetime error_time=0; // error output time + +//--- if the indicator has previously been calculated, start from the bar preceding the last one + int start=prev_calculated-1; + +//--- if this is the first calculation of the indicator, start from the first bar on the chart + if(prev_calculated==0) + start=0; + +//--- calculate levels for all bars in a loop + for(int i=start; i=error_time) + { + error_time=TimeCurrent()+60; + Print("Failed to get previous day by CopyRates(Symbol(), PERIOD_D1, error ", GetLastError()); + } + return(prev_calculated); + } + } + + //--- calculate Pivot levels + double pivot_point=(LAST_DAY[0].high+LAST_DAY[0].low+LAST_DAY[0].close)/3; + double r1=2*pivot_point-LAST_DAY[0].low; + double r2=pivot_point+(LAST_DAY[0].high-LAST_DAY[0].low); + double s1=2*pivot_point-LAST_DAY[0].high; + double s2=pivot_point-(LAST_DAY[0].high-LAST_DAY[0].low); + + //--- write values into buffers + ExtPPBuffer[i]=pivot_point; + ExtR1Buffer[i]=r1; + ExtR2Buffer[i]=r2; + ExtS1Buffer[i]=s1; + ExtS2Buffer[i]=s2; + + //--- additional levels + double m1=(s1+s2)/2; + double m2=(s1+pivot_point)/2; + double m3=(r1+pivot_point)/2; + double m4=(r1+r2)/2; + ExtM1Buffer[i]=m1; + ExtM2Buffer[i]=m2; + ExtM3Buffer[i]=m3; + ExtM4Buffer[i]=m4; + } + +//--- draw labels on levels + if(InpShowLabel) + { + ShowPriceLevels(time[rates_total-1], rates_total-1); + ChartRedraw(); + } + +//--- succesfully calculated + return(rates_total); + } +//+------------------------------------------------------------------+ +//| Custom indicator deinitialization function | +//+------------------------------------------------------------------+ +void OnDeinit(const int reason) + { +//--- delete all our graphical objects after use + Print("Indicator \"Pivot Channel\" stopped, delete all objects with prefix=", ExtPrefixUniq); + ObjectsDeleteAll(0, ExtPrefixUniq, 0, OBJ_ARROW_RIGHT_PRICE); + ChartRedraw(0); + } +//+------------------------------------------------------------------+ +//| Show prices' levels | +//+------------------------------------------------------------------+ +void ShowPriceLevels(datetime time, int last_index) + { + ShowRightPrice(ExtPrefixUniq+"_PP", time, ExtPPBuffer[last_index], clrBlue); + ShowRightPrice(ExtPrefixUniq+"_R1", time, ExtR1Buffer[last_index], clrOrange); + ShowRightPrice(ExtPrefixUniq+"_R2", time, ExtR2Buffer[last_index], clrRed); + ShowRightPrice(ExtPrefixUniq+"_S1", time, ExtS1Buffer[last_index], clrTeal); + ShowRightPrice(ExtPrefixUniq+"_S2", time, ExtS2Buffer[last_index], clrGreen); + if(InpShowLevelsM) + { + ShowRightPrice(ExtPrefixUniq+"_M1", time, ExtM1Buffer[last_index], clrGold); + ShowRightPrice(ExtPrefixUniq+"_M2", time, ExtM2Buffer[last_index], clrGold); + ShowRightPrice(ExtPrefixUniq+"_M3", time, ExtM3Buffer[last_index], clrGold); + ShowRightPrice(ExtPrefixUniq+"_M4", time, ExtM4Buffer[last_index], clrGold); + } + } +//+------------------------------------------------------------------+ +//| Create or Update "Right Price Label" object | +//+------------------------------------------------------------------+ +bool ShowRightPrice(const string name, datetime time, double price, color clr) + { + if(!ObjectCreate(0, name, OBJ_ARROW_RIGHT_PRICE, 0, time, price)) + { + ObjectMove(0, name, 0, time, price); + return(false); + } + +//--- make the label size adaptive + long scale=2; + if(!ChartGetInteger(0, CHART_SCALE, 0, scale)) + { + //--- output an error message to the Experts journal + Print(__FUNCTION__+", ChartGetInteger(CHART_SCALE) failed, error = ", GetLastError()); + } + int width=scale>1 ? 2:1; // if chart scale > 1, then label size = 2 + + ObjectSetInteger(0, name, OBJPROP_COLOR, clr); + ObjectSetInteger(0, name, OBJPROP_STYLE, STYLE_SOLID); + ObjectSetInteger(0, name, OBJPROP_WIDTH, width); + ObjectSetInteger(0, name, OBJPROP_BACK, false); + ObjectSetInteger(0, name, OBJPROP_SELECTABLE, false); + ObjectSetInteger(0, name, OBJPROP_SELECTED, false); + ObjectSetInteger(0, name, OBJPROP_HIDDEN, true); + ObjectSetInteger(0, name, OBJPROP_ZORDER, 0); + + return(true); + } +//+------------------------------------------------------------------+ diff --git a/BKPS/14031206/Indicators/Free Indicators/Woodie Channel.ex5 b/BKPS/14031206/Indicators/Free Indicators/Woodie Channel.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..f066ffd31a04163e8486c9499e1b84dcabc551fd GIT binary patch literal 17758 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 literal 0 HcmV?d00001 diff --git a/BKPS/14031206/Indicators/Free Indicators/Woodie Channel.mq5 b/BKPS/14031206/Indicators/Free Indicators/Woodie Channel.mq5 new file mode 100644 index 0000000..84c1d16 --- /dev/null +++ b/BKPS/14031206/Indicators/Free Indicators/Woodie Channel.mq5 @@ -0,0 +1,240 @@ +//+------------------------------------------------------------------+ +//| Woodie Channel.mq5.mq5 | +//| Copyright 2009-2025, MetaQuotes Ltd | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "2009-2025, MetaQuotes Ltd" +#property link "http://www.mql5.com" +#property description "Woodie Channels" + +#property indicator_chart_window +#property indicator_buffers 9 +#property indicator_plots 9 +#property indicator_type1 DRAW_LINE +#property indicator_color1 clrGreen +#property indicator_type2 DRAW_LINE +#property indicator_color2 clrGreen +#property indicator_type3 DRAW_LINE +#property indicator_color3 clrGreen +#property indicator_type4 DRAW_LINE +#property indicator_color4 clrGreen +#property indicator_type5 DRAW_LINE +#property indicator_color5 clrBlue +#property indicator_type6 DRAW_LINE +#property indicator_color6 clrRed +#property indicator_type7 DRAW_LINE +#property indicator_color7 clrRed +#property indicator_type8 DRAW_LINE +#property indicator_color8 clrRed +#property indicator_type9 DRAW_LINE +#property indicator_color9 clrRed + +//--- labels +#property indicator_label1 "R4" +#property indicator_label2 "R3" +#property indicator_label3 "R2" +#property indicator_label4 "R1" +#property indicator_label5 "PP" +#property indicator_label6 "S1" +#property indicator_label7 "S2" +#property indicator_label8 "S3" +#property indicator_label9 "S4" + +//--- input parameter +input bool InpShowLabel=true; // show price of level + +//--- indicator buffers +double ExtR4Buffer[]; +double ExtR3Buffer[]; +double ExtR2Buffer[]; +double ExtR1Buffer[]; +double ExtPPBuffer[]; +double ExtS1Buffer[]; +double ExtS2Buffer[]; +double ExtS3Buffer[]; +double ExtS4Buffer[]; + +//--- unique prefix to identify indicator objects +string ExtPrefixUniq; + +//+------------------------------------------------------------------+ +//| Custom indicator initialization function | +//+------------------------------------------------------------------+ +int OnInit() + { +//--- check current timeframe + if(PeriodSeconds()>PeriodSeconds(PERIOD_D1)) + { + Alert("Timeframe of chart must be D1 or lower. Exit"); + return(INIT_FAILED); + } + +//--- define buffers + SetIndexBuffer(0, ExtR4Buffer); + SetIndexBuffer(1, ExtR3Buffer); + SetIndexBuffer(2, ExtR2Buffer); + SetIndexBuffer(3, ExtR1Buffer); + SetIndexBuffer(4, ExtPPBuffer); + SetIndexBuffer(5, ExtS1Buffer); + SetIndexBuffer(6, ExtS2Buffer); + SetIndexBuffer(7, ExtS3Buffer); + SetIndexBuffer(8, ExtS4Buffer); + +//--- indicator name + IndicatorSetString(INDICATOR_SHORTNAME, "Woodie Channels"); +//--- number of digits of indicator value + IndicatorSetInteger(INDICATOR_DIGITS, _Digits); + +//--- prepare prefix for objects + string number=StringFormat("%I64d", GetTickCount64()); + ExtPrefixUniq=StringSubstr(number, StringLen(number)-4); + ExtPrefixUniq=ExtPrefixUniq+"_WD"; + Print("Indicator \"Woodie Channels\" started, prefix=", ExtPrefixUniq); + + return(INIT_SUCCEEDED); + } +//+------------------------------------------------------------------+ +//| Custom indicator iteration function | +//+------------------------------------------------------------------+ +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[]) + { + static MqlRates LAST_DAY[]; // previous day + static datetime last_time=0; // reference time + static datetime error_time=0; // error output time + +//--- if the indicator has previously been calculated, start from the bar preceding the last one + int start=prev_calculated-1; + +//--- if this is the first calculation of the indicator, start from the first bar on the chart + if(prev_calculated==0) + start=0; + +//--- calculate levels for all bars in a loop + for(int i=start; i=error_time) + { + error_time=TimeCurrent()+60; + Print("Failed to get previous day by CopyRates(Symbol(), PERIOD_D1, error ", GetLastError()); + } + return(prev_calculated); + } + } + + //--- calculate levels + double pp=(LAST_DAY[0].high+LAST_DAY[0].low+2* LAST_DAY[0].close)/4; + double r1=2*pp-LAST_DAY[0].low; + double r2=pp+(LAST_DAY[0].high-LAST_DAY[0].low); + double r3=r2+(r1-pp); + double r4=r3+(r2-pp); + double s1=2*pp -LAST_DAY[0].high; + double s2=pp-(LAST_DAY[0].high-LAST_DAY[0].low); + double s3=s2-(pp-s1); + double s4=s3-(pp-s2); + + //--- write values into buffers + ExtR4Buffer[i]=r4; + ExtR3Buffer[i]=r3; + ExtR2Buffer[i]=r2; + ExtR1Buffer[i]=r1; + ExtPPBuffer[i]=pp; + ExtS1Buffer[i]=s1; + ExtS2Buffer[i]=s2; + ExtS3Buffer[i]=s3; + ExtS4Buffer[i]=s4; + } + +//--- draw labels on levels + if(InpShowLabel) + { + ShowPriceLevels(time[rates_total-1], rates_total-1); + ChartRedraw(); + } + +//--- succesfully calculated + return(rates_total); + } +//+------------------------------------------------------------------+ +//| Custom indicator deinitialization function | +//+------------------------------------------------------------------+ +void OnDeinit(const int reason) + { +//--- delete all our graphical objects after use + Print("Indicator \"Woodie Channel\" stopped, delete all objects with prefix=", ExtPrefixUniq); + ObjectsDeleteAll(0, ExtPrefixUniq, 0, OBJ_ARROW_RIGHT_PRICE); + ChartRedraw(0); + } +//+------------------------------------------------------------------+ +//| Show prices' levels | +//+------------------------------------------------------------------+ +void ShowPriceLevels(datetime time, int last_index) + { + ShowRightPrice(ExtPrefixUniq+"_R4", time, ExtR4Buffer[last_index], clrGreen); + ShowRightPrice(ExtPrefixUniq+"_R3", time, ExtR3Buffer[last_index], clrGreen); + ShowRightPrice(ExtPrefixUniq+"_R2", time, ExtR2Buffer[last_index], clrGreen); + ShowRightPrice(ExtPrefixUniq+"_R1", time, ExtR1Buffer[last_index], clrGreen); + ShowRightPrice(ExtPrefixUniq+"_PP", time, ExtPPBuffer[last_index], clrBlue); + ShowRightPrice(ExtPrefixUniq+"_S1", time, ExtS1Buffer[last_index], clrRed); + ShowRightPrice(ExtPrefixUniq+"_S2", time, ExtS2Buffer[last_index], clrRed); + ShowRightPrice(ExtPrefixUniq+"_S3", time, ExtS3Buffer[last_index], clrRed); + ShowRightPrice(ExtPrefixUniq+"_S4", time, ExtS4Buffer[last_index], clrRed); + } +//+------------------------------------------------------------------+ +//| Create or Update "Right Price Label" object | +//+------------------------------------------------------------------+ +bool ShowRightPrice(const string name, datetime time, double price, color clr) + { + if(!ObjectCreate(0, name, OBJ_ARROW_RIGHT_PRICE, 0, time, price)) + { + ObjectMove(0, name, 0, time, price); + return(false); + } + +//--- make the label size adaptive + long scale=2; + if(!ChartGetInteger(0, CHART_SCALE, 0, scale)) + { + //--- output an error message to the Experts journal + Print(__FUNCTION__+", ChartGetInteger(CHART_SCALE) failed, error = ", GetLastError()); + } + int width=scale>1 ? 2:1; // if chart scale > 1, then label size = 2 + + ObjectSetInteger(0, name, OBJPROP_COLOR, clr); + ObjectSetInteger(0, name, OBJPROP_STYLE, STYLE_SOLID); + ObjectSetInteger(0, name, OBJPROP_WIDTH, width); + ObjectSetInteger(0, name, OBJPROP_BACK, false); + ObjectSetInteger(0, name, OBJPROP_SELECTABLE, false); + ObjectSetInteger(0, name, OBJPROP_SELECTED, false); + ObjectSetInteger(0, name, OBJPROP_HIDDEN, true); + ObjectSetInteger(0, name, OBJPROP_ZORDER, 0); + + return(true); + } +//+------------------------------------------------------------------+ diff --git a/BKPS/14031206/Indicators/x-saherelm.x121.xatr.ex5 b/BKPS/14031206/Indicators/x-saherelm.x121.xatr.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..143f212ff379e9ad1f3a0cdcc2a5cd5a221d5ca4 GIT binary patch literal 24864 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 literal 0 HcmV?d00001 diff --git a/BKPS/14031206/Indicators/x-saherelm.x121.xatr.mq5 b/BKPS/14031206/Indicators/x-saherelm.x121.xatr.mq5 new file mode 100644 index 0000000..d44a578 --- /dev/null +++ b/BKPS/14031206/Indicators/x-saherelm.x121.xatr.mq5 @@ -0,0 +1,648 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 Indicator +// ------------------------------------------------- +// Name: X121 XATR +// Description: XATR ... +// +// +// Maintainer: +// ------------ +// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) +// +////////////////////////////////////////////////////// +// +// Global Properties ... +#property copyright "Copyright 2023, SaherElm IT Center" +#property link "https://saherelm.ir" +#property version "1.00" +#property description "SaherElm X121 XATR Indicator" +#property strict + +// +// Definitions ... + +// +#define ShortName "X121 XATR" + +// +// Includes Common Library ... +#include "../Libraries/x-saherelm.common.lib.mq5" + +// +// Inputs ... + +// +// Market ... +input group "Market"; + +// +input group "RSI Detection"; +input int rsiLength = 14; // Length +input ENUM_APPLIED_PRICE rsiAppliedTo = PRICE_CLOSE; // Applied To + +// +input group "ATR Detection"; +input int atrLength = 14; // Length +input double atrMultiplier = 1; // Multiplier +input ENUM_APPLIED_PRICE atrUpperAppliedTo = PRICE_HIGH; // Upper Zone Applied To +input ENUM_APPLIED_PRICE atrLowerAppliedTo = PRICE_LOW; // Lower Zone Applied To +input ENUM_X_MA_METHOD atrSmoothingMode = X_MA_MODE_EMA; // Smoothing Method + +// +input group "Presentation"; + +// +input int startCalculationForLastBars = 1000; // Calculate Last n Bars + +// +input bool showAtrUpper = true; // Show Upper Zone +input bool showAtrLower = true; // Show Lower Zone + +// +// Buffers ... + +// +#define hideColorIDX 0 +#define bullishColorIDX 1 +#define bearishColorIDX 2 +#define neuturalColorIDX 3 + +// +#property indicator_chart_window + +// +#property indicator_buffers 6 +#property indicator_plots 2 + +// +// ATR ... + +// +// Upper ... + +// +#define atrUpperBufferIndex 0 +double atrUpperBuffer[]; + +#property indicator_label1 "X121 ATRU" +#property indicator_type1 DRAW_LINE +#property indicator_color1 clrYellow +#property indicator_style1 STYLE_SOLID +#property indicator_width1 2 + +// +// Lower ... + +// +#define atrLowerBufferIndex 1 +double atrLowerBuffer[]; + +#property indicator_label2 "X121 ATRL" +#property indicator_type2 DRAW_LINE +#property indicator_color2 clrYellow +#property indicator_style2 STYLE_SOLID +#property indicator_width2 2 + +// +// Data Buffers ... + +// +int mLastBufferIndex = 1; + +// +// ATR ... + +#define atrBufferIndex mLastBufferIndex + 1 +double atrBuffer[]; + +#define atrUpperRawBufferIndex mLastBufferIndex + 2 +double atrUpperRawBuffer[]; + +#define atrLowerRawBufferIndex mLastBufferIndex + 3 +double atrLowerRawBuffer[]; + +// +// RSI ... +#define rsiBufferIndex mLastBufferIndex + 4 +double rsiBuffer[]; + +// +// Variables, Properties and etc ... + +// +// this counts Available Bars ... +int limit; + +// +int maxLength; + +// +// RSI Handler ... +int rsiHandler = INVALID_HANDLE; + +// +// ATR Handler ... +int atrHandler = INVALID_HANDLE; + +// +bool isStrTrendChanged; +bool isStrStartBearishTrend; +bool isStrStartBullishTrend; + +// +// Event Handlers ... + +/** + * Initialize Indicator ... + * + * @return ( int ) + */ +int OnInit() +{ + // + // Validate Inputs ... + if (!ValidateInputs()) + { + return INIT_PARAMETERS_INCORRECT; + } + + // + // Initialize Indicator Handlers ... + + // + // RSI ... + rsiHandler = iRSI( + _Symbol, + _Period, + rsiLength, + rsiAppliedTo // + ); + bool isInited = rsiHandler != INVALID_HANDLE; + if (!isInited) + { + return INIT_FAILED; + } + + // + // ATR ... + atrHandler = iATR( + _Symbol, + _Period, + atrLength // + ); + isInited = atrHandler != INVALID_HANDLE; + if (!isInited) + { + return INIT_FAILED; + } + + // + // because in some cases we may have more than one input for + // calculation and we must prevent any calculation + // untill we pass the biggest input length, here we get max Input length + // and then wait until pass it ... + maxLength = ExtractMaxLengthOfInputs(); + + // + // Define Index Buffers ... + DefineBuffers(); + + // + // Set Indicator ShortName ... + SetIndicatorName(); + + // + // Init Succeed ... + return INIT_SUCCEEDED; +} + +/** + * De Initialize Indicator ... + * + * @param reason: Integer, De Initialization Reason ... + */ +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 + + // + IndicatorRelease(rsiHandler); + IndicatorRelease(atrHandler); +} + +/** + * Calculate Bars ... + * + * @param rates_total: Integer, Total Bars on Chart ... + * @param prev_calculated: Integer, Total Calculated Bars on Charts ... + * @param time: DateTime Array, History of Open Time ... + * @param open: Double Array, History of Open Prices ... + * @param high: Double Array, History of High Prices ... + * @param low: Double Array, History of Low Prices ... + * @param close: Double Array, History of Close Prices ... + * @param tick_volume: Long, History of Tick Volumes on Bar ... + * @param volume: Long, History of Trade Volumes ... + * @param spread: Double, History of Spread Price ... + * + * @return ( int ) + */ +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[] // +) +{ + // + // 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); + + // + // Fill All Buffers by Zero ... + if (prev_calculated == 0) + { + } + + // + // Validate Calculated Bars ... + + // + // RSI ... + int rsiCalculatedBars = BarsCalculated(rsiHandler); + + // + // ATR ... + int atrCalculatedBars = BarsCalculated(atrHandler); + + // + bool isPassedRequiredCalculatedBars = + // + // RSI ... + rsiCalculatedBars >= maxLength && + // + // ATR ... + atrCalculatedBars >= maxLength + // + ; + if (!isPassedRequiredCalculatedBars) + { + return prev_calculated; + } + + // + limit = (prev_calculated > rates_total || prev_calculated <= 0) + ? rates_total + : (rates_total - prev_calculated) + 1; + + // + // Buffers Copy ... + + // + // RSI ... + int copiedRsis = CopyBuffer(rsiHandler, 0, 0, limit, rsiBuffer); + + // + // ATR ... + int copiedAtrs = CopyBuffer(atrHandler, 0, 0, limit, atrBuffer); + + // + // Validate Copied Items ... + bool isPassedRequiredCopiedItems = + // + // + // RSI ... + copiedRsis > 0 && + // + // ATR ... + copiedAtrs > 0 + // + ; + if (!isPassedRequiredCopiedItems) + { + return prev_calculated; + } + + // + // Main Loop ... + for (int i = limit - 1; i >= 0 && !IsStopped(); i--) + { + // + CalculateBuffers( + i, + prev_calculated, + rates_total, + // + open, + high, + close, + low, + tick_volume // + ); + } + + // + return rates_total; +} + +// +// Functions ... + +/** + * Validate Input Args for Initialization ... + * + * @return ( bool ) + */ +bool ValidateInputs() +{ + // + bool result = + // + // RSI ... + rsiLength > 0 && + // + // ATR ... + atrLength > 0 && + atrMultiplier > 0 + // + ; + + // + return result; +} + +/** + * Extract Max Length of Inputs ... + * + * @return ( int ) + */ +int ExtractMaxLengthOfInputs() +{ + // + int result = 0; + + // + result = MathMax(rsiLength, atrLength); + + // + return result; +} + +/** + * Define Required Buffers ... + */ +void DefineBuffers() +{ + // + // ATR ... + + // + // UPPER ... + bool canShowAtrUpper = showAtrUpper; + ENUM_DRAW_TYPE atrUpperDrawType = canShowAtrUpper ? DRAW_LINE : DRAW_NONE; + ArraySetAsSeries(atrUpperBuffer, true); + SetIndexBuffer(atrUpperBufferIndex, atrUpperBuffer, INDICATOR_DATA); + PlotIndexSetDouble(atrUpperBufferIndex, PLOT_EMPTY_VALUE, EMPTY_VALUE); + PlotIndexSetInteger(atrUpperBufferIndex, PLOT_SHOW_DATA, canShowAtrUpper); + PlotIndexSetInteger(atrUpperBufferIndex, PLOT_DRAW_TYPE, atrUpperDrawType); + + // + // LOWER ... + bool canShowAtrLower = showAtrLower; + ENUM_DRAW_TYPE atrLowerDrawType = canShowAtrLower ? DRAW_LINE : DRAW_NONE; + ArraySetAsSeries(atrLowerBuffer, true); + SetIndexBuffer(atrLowerBufferIndex, atrLowerBuffer, INDICATOR_DATA); + PlotIndexSetDouble(atrLowerBufferIndex, PLOT_EMPTY_VALUE, EMPTY_VALUE); + PlotIndexSetInteger(atrLowerBufferIndex, PLOT_SHOW_DATA, canShowAtrLower); + PlotIndexSetInteger(atrLowerBufferIndex, PLOT_DRAW_TYPE, atrLowerDrawType); + + // + // Data Buffers ... + + // + // ATR ... + + // + ArraySetAsSeries(atrBuffer, true); + SetIndexBuffer(atrBufferIndex, atrBuffer, INDICATOR_CALCULATIONS); + + // + ArraySetAsSeries(atrUpperRawBuffer, true); + SetIndexBuffer(atrUpperRawBufferIndex, atrUpperRawBuffer, INDICATOR_CALCULATIONS); + + // + ArraySetAsSeries(atrLowerRawBuffer, true); + SetIndexBuffer(atrLowerRawBufferIndex, atrLowerRawBuffer, INDICATOR_CALCULATIONS); + + // + // RSI ... + + // + ArraySetAsSeries(rsiBuffer, true); + SetIndexBuffer(rsiBufferIndex, rsiBuffer, INDICATOR_CALCULATIONS); +} + +/** + * Set Indicator Short Name and also we can define Buffers Labels ... + */ +void SetIndicatorName() +{ + IndicatorSetString(INDICATOR_SHORTNAME, ShortName); +} + +/** + * Calculate Custom Buffers ... + * + * @param bar_index: Integer, Represent Current Bar ... + * @param prevCalculated: Integer, Represent Previous Calculated Bars ... + * @param ratesTotal: Integer, Represents All Available Bars ... + * @param open: Double Array, History of Open Prices ... + * @param high: Double Array, History of High Prices ... + * @param close: Double Array, History of Close Prices ... + * @param low: Double Array, History of Low Prices ... + * @param tickVolume: Long, History of Tick Volumes on Bar ... + */ +void CalculateBuffers( + int bar_index, // Selected Bar Index + const int prevCalculated, + const int ratesTotal, + const double &open[], + const double &high[], + const double &close[], + const double &low[], + const long &tickVolume[] // +) +{ + // + int barsLimit = startCalculationForLastBars > 0 + ? startCalculationForLastBars + : 0; + // + // bool canCalculate = true; + bool canCalculate = + barsLimit == 0 || + bar_index <= barsLimit; + if (canCalculate) + { + // + CalculateAtrZones( + bar_index, + prevCalculated, + ratesTotal, + open, + high, + close, + low // + ); + } + else + { + FillBuffersZero(bar_index); + } +} + +// +// Custom ... + +/** + * Fill All Bufers to Zero Vlue for Specified Bar Index ... + * + * @param barIndex: Integer ... + */ +void FillBuffersZero(int barIndex) +{ + // + // RSIS ... + rsiBuffer[barIndex] = 0; + + // + // ATRS ... + atrBuffer[barIndex] = 0; + atrUpperBuffer[barIndex] = 0; + atrUpperRawBuffer[barIndex] = 0; + atrUpperBuffer[barIndex] = 0; + atrLowerRawBuffer[barIndex] = 0; +} + +/** + * Calculate ATR Zones ... + * + * @param bar_index: Integer, Represent Current Bar ... + * @param prevCalculated: Integer, Represent Previous Calculated Bars ... + * @param ratesTotal: Integer, Represents All Available Bars ... + * @param open: Double Array, History of Open Prices ... + * @param high: Double Array, History of High Prices ... + * @param close: Double Array, History of Close Prices ... + * @param low: Double Array, History of Low Prices ... + */ +void CalculateAtrZones( + int bar_index, // Selected Bar Index + const int prevCalculated, + const int ratesTotal, + const double &open[], + const double &high[], + const double &close[], + const double &low[] // +) +{ + // + // Select ATr Value ... + double atrValue = atrBuffer[bar_index]; + double appliedAtrMultiplierValue = atrValue * atrMultiplier; + + // + // Select Upper Price ... + double upperPrice = GetAppliedPrice( + atrUpperAppliedTo, + open, + high, + low, + close, + bar_index // + ); + + // + // Select Lower Price ... + double lowerPrice = GetAppliedPrice( + atrLowerAppliedTo, + open, + high, + low, + close, + bar_index // + ); + + // + // Calculate Raw Atrs ... + + // + // Upper ... + double atrUpperRawValue = upperPrice + appliedAtrMultiplierValue; + atrUpperRawBuffer[bar_index] = atrUpperRawValue; + + // + // Lower ... + double atrLowerRawValue = lowerPrice - appliedAtrMultiplierValue; + atrLowerRawBuffer[bar_index] = atrLowerRawValue; + + // + bool canSmooth = atrSmoothingMode != X_MA_MODE_NONE; + if (canSmooth) + { + // + // Upper ... + iMAOnBuffer( + ratesTotal, + prevCalculated, + bar_index, + atrLength, + atrUpperRawBuffer, + atrUpperBuffer, + atrSmoothingMode // + ); + + // + // Lower ... + iMAOnBuffer( + ratesTotal, + prevCalculated, + bar_index, + atrLength, + atrLowerRawBuffer, + atrLowerBuffer, + atrSmoothingMode // + ); + } + else + { + // + // Use Raw Values ... + atrUpperBuffer[bar_index] = atrUpperRawValue; + atrLowerBuffer[bar_index] = atrLowerRawValue; + } +} + +// \ No newline at end of file diff --git a/BKPS/14031206/Indicators/x-saherelm.x121.xcc.ex5 b/BKPS/14031206/Indicators/x-saherelm.x121.xcc.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..1fff508e03d761a2e591d692548b4d66aad1b039 GIT binary patch literal 14548 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 Vmb*W?)RmH1$98#TB5_W1{U2Du7eN33 literal 0 HcmV?d00001 diff --git a/BKPS/14031206/Indicators/x-saherelm.x121.xcc.mq5 b/BKPS/14031206/Indicators/x-saherelm.x121.xcc.mq5 new file mode 100644 index 0000000..2f45b84 --- /dev/null +++ b/BKPS/14031206/Indicators/x-saherelm.x121.xcc.mq5 @@ -0,0 +1,437 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 Candle Styles +// --------------------------------------------------- +// Name: X121 XCC +// Description: Candle Styles ... +// +// +// Maintainer: +// ------------ +// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) +// +////////////////////////////////////////////////////// +// +// Global Properties ... +#property copyright "Copyright 2023, SaherElm IT Center" +#property link "https://saherelm.ir" +#property version "1.00" +#property description "SaherElm X121 XCC Indicator" +#property strict + +// +// START Constants ... +// + +// +// Indicator Short Name ... +#define ShortName "X121 XCC" + +// +// Holds an SnapShot of Charts Configuration ... +struct XChartStyle +{ + // + // chart's ID ... + long chartId; + // + // chart's mode ... + ENUM_CHART_MODE mode; + // + // show bid line ... + bool showBidLine; + // + // show ask line ... + bool showAskLine; + // + // show grids on chart ... + bool showGrid; + // + // show volumes ... + bool showVolumes; + // + // Displaying trade levels in the chart (levels of open positions, Stop Loss, Take Profit and pending orders) ... + bool showTradeLevels; + // + // chart autoscroll ... + bool autoScroll; + // + // chart quick navigation state ... + bool quickNavigation; + // + // chart's foreground color ... + color foreGroundColor; + // + // chart's background color ... + color backGroundColor; + // + // Up Color ... + color upColor; + // + // Down Color ... + color downColor; + // + // Bullish color ... + color bullishColor; + // + // Bearish color ... + color bearishColor; + // + // grid color ... + color gridColor; + // + // bid line color ... + color bidLineColor; + // + // ask line color ... + color askLineColor; + // + // line mode and doji candlestick color ... + color lineColor; + // + // Color of stop order levels (Stop Loss and Take Profit) ... + color stopColor; + // + // volumes color ... + color volumesColor; +}; + +// +// END Constants ... +// + +// +// START Inputs ... +// + +// +input group "Chart Style"; +input ENUM_CHART_MODE mode = CHART_CANDLES; // Mode +input color upColor = clrGreen; // Up Color +input color downColor = clrRed; // Down Color +input color lineColor = clrGreen; // Line mode and Doji candlestick Color +input color bullishColor = clrGreen; // Bullish Color +input color bearishColor = clrRed; // Bearish Color +input color volumesColor = clrGreen; // Volumes Color + +// +input group "Presentation"; +input bool showCandles = true; // Show Candles + +// +// END Inputs ... +// + +// +// START Includes and Imports ... +// + +// +// Includes Draw Library ... +#include "../Libraries/x-saherelm.draw.lib.mq5" + +// +// Includes Common Library ... +#include "../Libraries/x-saherelm.common.lib.mq5" + +// +// END Includes and Imports ... +// + +// +// START Buffers ... +// + +// +#property indicator_chart_window + +// +#property indicator_buffers 0 +#property indicator_plots 0 + +// +// END Buffers ... +// + +// +// START Global Definitions: Variables, Properties and etc ... +// + +// +int maxLength; + +// +XChartStyle chartStyle; +XChartStyle clearStyle; + +// +// END Global Definitions: Variables, Properties and etc ... +// + +// +// START Event Handlers ... +// + +// +// Initialization ... +int OnInit() +{ + // + // Validate Inputs ... + if (!ValidateInputs()) + { + return INIT_PARAMETERS_INCORRECT; + } + + // + drawPrefix = ShortName; + + // + // because in some cases we may have more than one input for + // calculation and we must prevent any calculation + // untill we pass the biggest input length, here we get max Input length + // and then wait until pass it ... + maxLength = ExtractMaxLengthOfInputs(); + + // + // Define Index Buffers ... + DefineBuffers(); + + // + // Set Indicator ShortName ... + SetIndicatorName(); + + // + // Apply Chart Style ... + ApplyCustomChartStyle(); + + // + // Init Succeed ... + return INIT_SUCCEEDED; +} + +// +// DeInitialization ... +void OnDeinit(const int reason) +{ + // + // REASON_PROGRAM 0 The EA has stopped working calling the ExpertRemove() function + // REASON_REMOVE 1 Program removed from a chart + // REASON_RECOMPILE 2 Program recompiled + // REASON_CHARTCHANGE 3 A symbol or a chart period is changed + // REASON_CHARTCLOSE 4 Chart closed + // REASON_PARAMETERS 5 Inputs changed by a user + // REASON_ACCOUNT 6 Another account has been activated or reconnection to the trade server has occurred due to changes in the account settings + // REASON_TEMPLATE 7 Another chart template applied + // REASON_INITFAILED 8 The OnInit() handler returned a non-zero value + // REASON_CLOSE 9 Terminal closed +} + +// +// Calculating what we want ... +int OnCalculate( + const int rates_total, // Total Bars on Chart ... + const int prev_calculated, // Total Calculated Bars on Charts ... + const datetime &time[], // History of Open Time ... + const double &open[], // History of Open Price ... + const double &high[], // History of High Price ... + const double &low[], // History of Low Price ... + const double &close[], // History of Close Price ... + const long &tick_volume[], // History of Tick Volumes on Bar ... + const long &volume[], // History of Trade Volumes ... + const int &spread[] // History of Spread Price ... +) +{ + // + // Prepare Buffers ... + ArraySetAsSeries(time, true); + ArraySetAsSeries(open, true); + ArraySetAsSeries(high, true); + ArraySetAsSeries(low, true); + ArraySetAsSeries(close, true); + ArraySetAsSeries(tick_volume, true); + ArraySetAsSeries(volume, true); + ArraySetAsSeries(spread, true); + + // + // this counts Available Bars ... + int limit; + + // + limit = (prev_calculated > rates_total || prev_calculated <= 0) ? rates_total : (rates_total - prev_calculated) + 1; + + // + // Main Loop ... + for (int i = limit - 1; i >= 0 && !IsStopped(); i--) + { + CalculateBuffers(i); + } + + // + return rates_total; +} + +// +// END Event Handlers ... +// + +// +// START Functions ... +// + +// +// Validate Input Args for Initialization ... +bool ValidateInputs() +{ + // + bool result = true; + + // + return result; +} + +// +// Retrieve all Exists Input Max Length ... +// use for Start Of Drawing ... +int ExtractMaxLengthOfInputs() +{ + // + int result = 0; + + // + return result; +} + +// +// Define Indexes and Styles ... +void DefineBuffers() +{ +} + +// +// Set Indicator Short Name and also we can define Buffers Labels ... +void SetIndicatorName() +{ + IndicatorSetString(INDICATOR_SHORTNAME, ShortName); +} + +// +// Calculate Buffers ... +void CalculateBuffers( + int bar_index // Selected Bar Index +) +{ +} + +// +// Apply Custom Chart Style ... +void ApplyCustomChartStyle() +{ + // + // Read Current Chart Config and Store it ... + ReadChartStyle(); + + // + // After Reading Current Chart Style ... + // we have to Save Configs and Change Styles ... + clearStyle = chartStyle; + + // + clearStyle.upColor = CLR_NONE; + clearStyle.downColor = CLR_NONE; + clearStyle.lineColor = CLR_NONE; + clearStyle.bullishColor = CLR_NONE; + clearStyle.bearishColor = CLR_NONE; + + // + // Decide to Show or not Candles based on User Input ... + if (showCandles) + { + SetChartStyle(chartStyle); + } + else + { + SetChartStyle(clearStyle); + } +} + +// +// Read Previous Chart Style ... +void ReadChartStyle() +{ + // + // Retrieve Current Chart ID ... + long chartId = ChartID(); + chartStyle.chartId = chartId; + + // + // Retrieve Chart Mode ... + chartStyle.mode = (ENUM_CHART_MODE)ChartGetInteger(chartId, CHART_MODE); + + // + chartStyle.showBidLine = (bool)ChartGetInteger(chartId, CHART_SHOW_BID_LINE); + chartStyle.showAskLine = (bool)ChartGetInteger(chartId, CHART_SHOW_ASK_LINE); + chartStyle.showGrid = (bool)ChartGetInteger(chartId, CHART_SHOW_GRID); + chartStyle.showVolumes = (bool)ChartGetInteger(chartId, CHART_SHOW_VOLUMES); + chartStyle.showTradeLevels = (bool)ChartGetInteger(chartId, CHART_SHOW_TRADE_LEVELS); + chartStyle.autoScroll = (bool)ChartGetInteger(chartId, CHART_AUTOSCROLL); + chartStyle.quickNavigation = (bool)ChartGetInteger(chartId, CHART_QUICK_NAVIGATION); + + // + chartStyle.foreGroundColor = (color)ChartGetInteger(chartId, CHART_COLOR_FOREGROUND); + chartStyle.backGroundColor = (color)ChartGetInteger(chartId, CHART_COLOR_BACKGROUND); + chartStyle.upColor = (color)ChartGetInteger(chartId, CHART_COLOR_CHART_UP); + chartStyle.downColor = (color)ChartGetInteger(chartId, CHART_COLOR_CHART_DOWN); + chartStyle.bullishColor = (color)ChartGetInteger(chartId, CHART_COLOR_CANDLE_BULL); + chartStyle.bearishColor = (color)ChartGetInteger(chartId, CHART_COLOR_CANDLE_BEAR); + chartStyle.gridColor = (color)ChartGetInteger(chartId, CHART_COLOR_GRID); + chartStyle.bidLineColor = (color)ChartGetInteger(chartId, CHART_COLOR_BID); + chartStyle.askLineColor = (color)ChartGetInteger(chartId, CHART_COLOR_ASK); + chartStyle.stopColor = (color)ChartGetInteger(chartId, CHART_COLOR_STOP_LEVEL); + chartStyle.lineColor = (color)ChartGetInteger(chartId, CHART_COLOR_CHART_LINE); + chartStyle.volumesColor = (color)ChartGetInteger(chartId, CHART_COLOR_VOLUME); + + // + chartStyle.mode = mode; + chartStyle.upColor = upColor; + chartStyle.downColor = downColor; + chartStyle.lineColor = lineColor; + chartStyle.bearishColor = bearishColor; + chartStyle.bullishColor = bullishColor; + chartStyle.volumesColor = volumesColor; +} + +// +// Set Chart Style ... +void SetChartStyle( + XChartStyle &mChartStyle // Chart Style to Apply +) +{ + // + ApplyChartStyle( + mChartStyle.chartId, + mChartStyle.mode, + mChartStyle.showBidLine, + mChartStyle.showAskLine, + mChartStyle.showGrid, + mChartStyle.showVolumes, + mChartStyle.showTradeLevels, + mChartStyle.autoScroll, + mChartStyle.quickNavigation, + mChartStyle.foreGroundColor, + mChartStyle.backGroundColor, + mChartStyle.upColor, + mChartStyle.downColor, + mChartStyle.bullishColor, + mChartStyle.bearishColor, + mChartStyle.gridColor, + mChartStyle.bidLineColor, + mChartStyle.askLineColor, + mChartStyle.lineColor, + mChartStyle.stopColor, + mChartStyle.volumesColor); +} + +// +// END Functions ... +// diff --git a/BKPS/14031206/Indicators/x-saherelm.x121.xche.ex5 b/BKPS/14031206/Indicators/x-saherelm.x121.xche.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..7489e2fe30e9543a90f2c5ac566243114da2cbcf GIT binary patch literal 20316 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 e9515W5jBE4%lScAa9-@R)mB= 9 && + cheLoopback >= 0; + + // + return result; +} + +/** + * Extract Max Length of Inputs ... + * + * @return ( int ) + */ +int ExtractMaxLengthOfInputs() +{ + // + int result = 0; + + // + result = MathMax(cheLength, cheLoopback); + + // + return result; +} + +/** + * Define Required Buffers ... + */ +void DefineBuffers() +{ + // + // LEVEL 1 ... + + // + // Long Exit 1 ... + + // + // Draw Type ... + ENUM_DRAW_TYPE le1DrawType = showLE1 ? DRAW_LINE : DRAW_NONE; + ENUM_DRAW_TYPE le1StartDrawType = showLE1 ? DRAW_ARROW : DRAW_NONE; + + // + // Buffer ... + SetIndexBuffer(le1BufferIndex, le1Buffer, INDICATOR_DATA); + PlotIndexSetInteger(le1BufferIndex, PLOT_SHOW_DATA, showLE1); + PlotIndexSetInteger(le1BufferIndex, PLOT_DRAW_TYPE, le1DrawType); + + // + // Start Buffer ... + SetIndexBuffer(le1StartBufferIndex, le1StartBuffer, INDICATOR_DATA); + PlotIndexSetInteger(le1StartBufferIndex, PLOT_SHOW_DATA, false); + PlotIndexSetInteger(le1StartBufferIndex, PLOT_DRAW_TYPE, le1StartDrawType); + PlotIndexSetInteger(le1StartBufferIndex, PLOT_ARROW, cheArrowCode); + + // + // Short Exit 1 ... + + // + // Draw Type ... + ENUM_DRAW_TYPE se1DrawType = showSE1 ? DRAW_LINE : DRAW_NONE; + ENUM_DRAW_TYPE se1StartDrawType = showSE1 ? DRAW_ARROW : DRAW_NONE; + + // + // Buffer ... + SetIndexBuffer(se1BufferIndex, se1Buffer, INDICATOR_DATA); + PlotIndexSetInteger(se1BufferIndex, PLOT_SHOW_DATA, showSE1); + PlotIndexSetInteger(se1BufferIndex, PLOT_DRAW_TYPE, se1DrawType); + + // + // Start Buffer ... + SetIndexBuffer(se1StartBufferIndex, se1StartBuffer, INDICATOR_DATA); + PlotIndexSetInteger(se1StartBufferIndex, PLOT_SHOW_DATA, false); + PlotIndexSetInteger(se1StartBufferIndex, PLOT_DRAW_TYPE, se1StartDrawType); + PlotIndexSetInteger(se1StartBufferIndex, PLOT_ARROW, cheArrowCode); + + // + // LEVEL 2 ... + + // + // Long Exit 2 ... + + // + // Draw Type ... + ENUM_DRAW_TYPE le2DrawType = showLE2 ? DRAW_LINE : DRAW_NONE; + ENUM_DRAW_TYPE le2StartDrawType = showLE2 ? DRAW_ARROW : DRAW_NONE; + + // + // Buffer ... + SetIndexBuffer(le2BufferIndex, le2Buffer, INDICATOR_DATA); + PlotIndexSetInteger(le2BufferIndex, PLOT_SHOW_DATA, showLE2); + PlotIndexSetInteger(le2BufferIndex, PLOT_DRAW_TYPE, le2DrawType); + + // + // Start Buffer ... + SetIndexBuffer(le2StartBufferIndex, le2StartBuffer, INDICATOR_DATA); + PlotIndexSetInteger(le2StartBufferIndex, PLOT_SHOW_DATA, false); + PlotIndexSetInteger(le2StartBufferIndex, PLOT_DRAW_TYPE, le2StartDrawType); + PlotIndexSetInteger(le2StartBufferIndex, PLOT_ARROW, cheArrowCode); + + // + // Short Exit 2 ... + + // + // Draw Type ... + ENUM_DRAW_TYPE se2DrawType = showSE2 ? DRAW_LINE : DRAW_NONE; + ENUM_DRAW_TYPE se2StartDrawType = showSE2 ? DRAW_ARROW : DRAW_NONE; + + // + // Buffer ... + SetIndexBuffer(se2BufferIndex, se2Buffer, INDICATOR_DATA); + PlotIndexSetInteger(se2BufferIndex, PLOT_SHOW_DATA, showSE2); + PlotIndexSetInteger(se2BufferIndex, PLOT_DRAW_TYPE, se2DrawType); + + // + // Start Buffer ... + SetIndexBuffer(se2StartBufferIndex, se2StartBuffer, INDICATOR_DATA); + PlotIndexSetInteger(se2StartBufferIndex, PLOT_SHOW_DATA, false); + PlotIndexSetInteger(se2StartBufferIndex, PLOT_DRAW_TYPE, se2StartDrawType); + PlotIndexSetInteger(se2StartBufferIndex, PLOT_ARROW, cheArrowCode); +} + +/** + * Set Indicator Short Name and also we can define Buffers Labels ... + */ +void SetIndicatorName() +{ + IndicatorSetString(INDICATOR_SHORTNAME, ShortName); +} + +/** + * Calculate Buffers ... + */ +void CalculateBuffers( + int bar_index, // Selected Bar Index + int prevCalculated, // Previous Calculated + int ratesTotal, // Total Rates + const double &open[], // Rates Open ... + const double &high[], // Rates High ... + const double &low[], // Rates Low ... + const double &close[] // Rates Close ... +) +{ + // + // Cleanup Buffers ... + le1Buffer[bar_index] = le1StartBuffer[bar_index] = se1Buffer[bar_index] = se1StartBuffer[bar_index] = EMPTY_VALUE; + le2Buffer[bar_index] = le2StartBuffer[bar_index] = se2Buffer[bar_index] = se2StartBuffer[bar_index] = EMPTY_VALUE; + + // + int start = MathMax(bar_index - cheLoopback, 0); + + // + // Calculate ATR Value ... + double atrValue = 0; + for (int k = 1; k <= cheLength && (bar_index - k - 1) >= 0; k++) + { + // + atrValue += MathMax(high[bar_index - k], close[MathMax(bar_index - k - 1, 0)]) - + MathMin(low[bar_index - k], close[MathMax(bar_index - k - 1, 0)]); + } + atrValue /= (double)cheLength; + + // + // Retrieve Highest High and Lowest Lows ... + double cheLoopbackMax = high[ArrayMaximum(high, start, cheLoopback)]; + double cheLoopbackMin = low[ArrayMinimum(low, start, cheLoopback)]; + + // + // Fill Multi Dimesional Working Array ... + work[bar_index][hi1Idx] = cheLoopbackMax - cheMultiplier1 * atrValue; + work[bar_index][lo1Idx] = cheLoopbackMin + cheMultiplier1 * atrValue; + work[bar_index][hi2Idx] = cheLoopbackMax - cheMultiplier2 * atrValue; + work[bar_index][lo2Idx] = cheLoopbackMin + cheMultiplier2 * atrValue; + work[bar_index][trend1Idx] = (bar_index > 0) ? work[bar_index - 1][trend1Idx] : 0; + work[bar_index][trend2Idx] = (bar_index > 0) ? work[bar_index - 1][trend2Idx] : 0; + + // + if (bar_index > 0) + { + // + // Calculate Trends ... + if (close[bar_index] > work[bar_index - 1][lo1Idx]) + { + work[bar_index][trend1Idx] = 1; + } + + // + if (close[bar_index] < work[bar_index - 1][hi1Idx]) + { + work[bar_index][trend1Idx] = -1; + } + + // + if (close[bar_index] > work[bar_index - 1][lo2Idx]) + { + work[bar_index][trend2Idx] = 1; + } + + // + if (close[bar_index] < work[bar_index - 1][hi2Idx]) + { + work[bar_index][trend2Idx] = -1; + } + + // + // Calculate Exit Values ... + + // + // Exit 1 ... + + // + // Long ... + if (cheMultiplier1 > 0 && work[bar_index][trend1Idx] == 1) + { + // + if (work[bar_index][hi1Idx] < work[bar_index - 1][hi1Idx]) + { + work[bar_index][hi1Idx] = work[bar_index - 1][hi1Idx]; + } + + // + le1Buffer[bar_index] = work[bar_index][hi1Idx]; + + // + if (le1Buffer[bar_index - 1] == EMPTY_VALUE) + { + le1StartBuffer[bar_index] = le1Buffer[bar_index]; + } + } + + // + // Short ... + if (cheMultiplier1 > 0 && work[bar_index][trend1Idx] == -1) + { + // + if (work[bar_index][lo1Idx] > work[bar_index - 1][lo1Idx]) + { + work[bar_index][lo1Idx] = work[bar_index - 1][lo1Idx]; + } + + // + se1Buffer[bar_index] = work[bar_index][lo1Idx]; + + // + if (se1Buffer[bar_index - 1] == EMPTY_VALUE) + { + se1StartBuffer[bar_index] = se1Buffer[bar_index]; + } + } + + // + // Exit 2 ... + + // + // Long ... + if (cheMultiplier2 > 0 && work[bar_index][trend2Idx] == 1) + { + if (work[bar_index][hi2Idx] < work[bar_index - 1][hi2Idx]) + { + work[bar_index][hi2Idx] = work[bar_index - 1][hi2Idx]; + } + + // + le2Buffer[bar_index] = work[bar_index][hi2Idx]; + + // + if (le2Buffer[bar_index - 1] == EMPTY_VALUE) + { + le2StartBuffer[bar_index] = le2Buffer[bar_index]; + } + } + + // + // Short ... + if (cheMultiplier2 > 0 && work[bar_index][trend2Idx] == -1) + { + // + if (work[bar_index][lo2Idx] > work[bar_index - 1][lo2Idx]) + { + work[bar_index][lo2Idx] = work[bar_index - 1][lo2Idx]; + } + + // + se2Buffer[bar_index] = work[bar_index][lo2Idx]; + + // + if (se2Buffer[bar_index - 1] == EMPTY_VALUE) + { + se2StartBuffer[bar_index] = se2Buffer[bar_index]; + } + } + } +} + +// \ No newline at end of file diff --git a/BKPS/14031206/Indicators/x-saherelm.x121.xct.ex5 b/BKPS/14031206/Indicators/x-saherelm.x121.xct.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..70f5a5f6569af2b00002a2fc24d6ebc919b17832 GIT binary patch literal 24998 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 0 + ? fontSize + : 10; + + // + string mFont = IsValid(font) + ? font + : "Arial"; + + // + ObjectSetString(0, tag, OBJPROP_FONT, mFont); + ObjectSetInteger(0, tag, OBJPROP_COLOR, clr); + ObjectSetInteger(0, tag, OBJPROP_ANCHOR, Anchor); + ObjectSetInteger(0, tag, OBJPROP_FONTSIZE, mFontSize); +} + +// +// END Functions ... +// diff --git a/BKPS/14031206/Indicators/x-saherelm.x121.xdon.ex5 b/BKPS/14031206/Indicators/x-saherelm.x121.xdon.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..4af643fa53fd17126e61efe318c5640ba5e13a31 GIT binary patch literal 17786 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 literal 0 HcmV?d00001 diff --git a/BKPS/14031206/Indicators/x-saherelm.x121.xdon.mq5 b/BKPS/14031206/Indicators/x-saherelm.x121.xdon.mq5 new file mode 100644 index 0000000..49785d4 --- /dev/null +++ b/BKPS/14031206/Indicators/x-saherelm.x121.xdon.mq5 @@ -0,0 +1,692 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 Indicator +// ------------------------------------------------- +// Name: X121 XDON +// Description: XDON ... +// +// +// Maintainer: +// ------------ +// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) +// +////////////////////////////////////////////////////// +// +// Global Properties ... +#property copyright "Copyright 2023, SaherElm IT Center" +#property link "https://saherelm.ir" +#property version "1.00" +#property description "SaherElm X121 XDON Indicator" +#property strict + +// +// Definitions ... + +// +#define ShortName "X121 XDON" + +// +// Includes Common Library ... +#include "../Libraries/x-saherelm.common.lib.mq5" + +// +// Inputs ... + +// +// Market ... +input group "Market"; +input int donchainLength = 40; // Donchain Length + +// +// Presentation ... +input group "Presentation"; + +// +input int startCalculationForLastBars = 1000; // Calculate Last n Bars + +// +input bool showUpper = true; // Show Upper Band +input bool showLower = true; // Show Lower Band + +// +input bool showOpen = true; // Show Open +input bool showHigh = true; // Show High +input bool showClose = true; // Show Close +input bool showLow = true; // Show Low + +// +// Buffers ... + +// +#define hideColorIDX 0 +#define bullishColorIDX 1 +#define bearishColorIDX 2 +#define neuturalColorIDX 3 + +// +#property indicator_chart_window + +// +#property indicator_buffers 8 +#property indicator_plots 8 + +// +// Plot Buffers ... + +// +// Open ... + +// +#define donOpenUpperBufferIndex 0 +double donOpenUpperBuffer[]; + +// +#define donOpenUpperPlotBufferIndex 0 +#property indicator_label1 "X121 O U" +#property indicator_type1 DRAW_LINE +#property indicator_color1 clrCornflowerBlue +#property indicator_width1 1 + +// +#define donOpenLowerBufferIndex 1 +double donOpenLowerBuffer[]; + +// +#define donOpenLowerPlotBufferIndex 1 +#property indicator_label2 "X121 O L" +#property indicator_type2 DRAW_LINE +#property indicator_color2 clrCornflowerBlue +#property indicator_width2 1 + +// +// High ... + +// +#define donHighUpperBufferIndex 2 +double donHighUpperBuffer[]; + +// +#define donHighUpperPlotBufferIndex 2 +#property indicator_label3 "X121 H U" +#property indicator_type3 DRAW_LINE +#property indicator_color3 clrAquamarine +#property indicator_width3 1 + +// +#define donHighLowerBufferIndex 3 +double donHighLowerBuffer[]; + +// +#define donHighLowerPlotBufferIndex 3 +#property indicator_label4 "X121 H L" +#property indicator_type4 DRAW_LINE +#property indicator_color4 clrAquamarine +#property indicator_width4 1 + +// +// Low ... + +// +#define donLowUpperBufferIndex 4 +double donLowUpperBuffer[]; + +// +#define donLowUpperPlotBufferIndex 4 +#property indicator_label5 "X121 L U" +#property indicator_type5 DRAW_LINE +#property indicator_color5 clrDarkOrchid +#property indicator_width5 1 + +// +#define donLowLowerBufferIndex 5 +double donLowLowerBuffer[]; + +// +#define donLowLowerPlotBufferIndex 5 +#property indicator_label6 "X121 L L" +#property indicator_type6 DRAW_LINE +#property indicator_color6 clrDarkOrchid +#property indicator_width6 1 + +// +// Close ... + +// +#define donCloseUpperBufferIndex 6 +double donCloseUpperBuffer[]; + +// +#define donCloseUpperPlotBufferIndex 6 +#property indicator_label7 "X121 C U" +#property indicator_type7 DRAW_LINE +#property indicator_color7 clrCoral +#property indicator_width7 1 + +// +#define donCloseLowerBufferIndex 7 +double donCloseLowerBuffer[]; + +// +#define donCloseLowerPlotBufferIndex 7 +#property indicator_label8 "X121 C L" +#property indicator_type8 DRAW_LINE +#property indicator_color8 clrCoral +#property indicator_width8 1 + +// +// Data Buffers ... + +// +int mLastBufferIndex = 7; + +// +// Variables, Properties and etc ... + +// +// this counts Available Bars ... +int limit; + +// +int maxLength; + +// +// Event Handlers ... + +/** + * Initialize Indicator ... + * + * @return ( int ) + */ +int OnInit() +{ + // + // Validate Inputs ... + if (!ValidateInputs()) + { + return INIT_PARAMETERS_INCORRECT; + } + + // + // Initialize Indicator Handlers ... + + // + // because in some cases we may have more than one input for + // calculation and we must prevent any calculation + // untill we pass the biggest input length, here we get max Input length + // and then wait until pass it ... + maxLength = ExtractMaxLengthOfInputs(); + + // + // Define Index Buffers ... + DefineBuffers(); + + // + // Set Indicator ShortName ... + SetIndicatorName(); + + // + // Init Succeed ... + return INIT_SUCCEEDED; +} + +/** + * De Initialize Indicator ... + * + * @param reason: Integer, De Initialization Reason ... + */ +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 +} + +/** + * Calculate Bars ... + * + * @param rates_total: Integer, Total Bars on Chart ... + * @param prev_calculated: Integer, Total Calculated Bars on Charts ... + * @param time: DateTime Array, History of Open Time ... + * @param open: Double Array, History of Open Prices ... + * @param high: Double Array, History of High Prices ... + * @param low: Double Array, History of Low Prices ... + * @param close: Double Array, History of Close Prices ... + * @param tick_volume: Long, History of Tick Volumes on Bar ... + * @param volume: Long, History of Trade Volumes ... + * @param spread: Double, History of Spread Price ... + * + * @return ( int ) + */ +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[] // +) +{ + // + // 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); + + // + // Validate Calculated Bars ... + + // + limit = (prev_calculated > rates_total || prev_calculated <= 0) + ? rates_total + : (rates_total - prev_calculated) + 1; + + // + // Buffers Copy ... + + // + // Main Loop ... + for (int i = limit - 1; i >= 0 && !IsStopped(); i--) + { + // + CalculateBuffers( + i, + prev_calculated, + rates_total, + // + open, + high, + close, + low, + tick_volume // + ); + } + + // + return rates_total; +} + +// +// Functions ... + +/** + * Validate Input Args for Initialization ... + * + * @return ( bool ) + */ +bool ValidateInputs() +{ + // + bool result = false; + + // + result = + // + donchainLength > 0 + // + ; + + // + return result; +} + +/** + * Extract Max Length of Inputs ... + * + * @return ( int ) + */ +int ExtractMaxLengthOfInputs() +{ + // + int result = 0; + + // + return result; +} + +/** + * Define Required Buffers ... + */ +void DefineBuffers() +{ + // + // Plot Buffers ... + // + // Open ... + + // + // UPPER ... + bool canShowCOpenUpper = showUpper && showOpen; + ENUM_DRAW_TYPE donOpenUpperDrawType = canShowCOpenUpper ? DRAW_LINE : DRAW_NONE; + ArraySetAsSeries(donOpenUpperBuffer, true); + SetIndexBuffer(donOpenUpperBufferIndex, donOpenUpperBuffer, INDICATOR_DATA); + PlotIndexSetDouble(donOpenUpperPlotBufferIndex, PLOT_EMPTY_VALUE, EMPTY_VALUE); + PlotIndexSetInteger(donOpenUpperPlotBufferIndex, PLOT_SHOW_DATA, canShowCOpenUpper); + PlotIndexSetInteger(donOpenUpperPlotBufferIndex, PLOT_DRAW_TYPE, donOpenUpperDrawType); + + // + // LOWER ... + bool canShowCOpenLower = showLower && showOpen; + ENUM_DRAW_TYPE donOpenLowerDrawType = canShowCOpenLower ? DRAW_LINE : DRAW_NONE; + ArraySetAsSeries(donOpenLowerBuffer, true); + SetIndexBuffer(donOpenLowerBufferIndex, donOpenLowerBuffer, INDICATOR_DATA); + PlotIndexSetDouble(donOpenLowerPlotBufferIndex, PLOT_EMPTY_VALUE, EMPTY_VALUE); + PlotIndexSetInteger(donOpenLowerPlotBufferIndex, PLOT_SHOW_DATA, canShowCOpenLower); + PlotIndexSetInteger(donOpenLowerPlotBufferIndex, PLOT_DRAW_TYPE, donOpenLowerDrawType); + + // + // Close ... + + // + // UPPER ... + bool canShowCCloseUpper = showUpper && showClose; + ENUM_DRAW_TYPE donCloseUpperDrawType = canShowCCloseUpper ? DRAW_LINE : DRAW_NONE; + ArraySetAsSeries(donCloseUpperBuffer, true); + SetIndexBuffer(donCloseUpperBufferIndex, donCloseUpperBuffer, INDICATOR_DATA); + PlotIndexSetDouble(donCloseUpperPlotBufferIndex, PLOT_EMPTY_VALUE, EMPTY_VALUE); + PlotIndexSetInteger(donCloseUpperPlotBufferIndex, PLOT_SHOW_DATA, canShowCCloseUpper); + PlotIndexSetInteger(donCloseUpperPlotBufferIndex, PLOT_DRAW_TYPE, donCloseUpperDrawType); + + // + // LOWER ... + bool canShowCCloseLower = showLower && showClose; + ENUM_DRAW_TYPE donCloseLowerDrawType = canShowCCloseLower ? DRAW_LINE : DRAW_NONE; + ArraySetAsSeries(donCloseLowerBuffer, true); + SetIndexBuffer(donCloseLowerBufferIndex, donCloseLowerBuffer, INDICATOR_DATA); + PlotIndexSetDouble(donCloseLowerPlotBufferIndex, PLOT_EMPTY_VALUE, EMPTY_VALUE); + PlotIndexSetInteger(donCloseLowerPlotBufferIndex, PLOT_SHOW_DATA, canShowCCloseLower); + PlotIndexSetInteger(donCloseLowerPlotBufferIndex, PLOT_DRAW_TYPE, donCloseLowerDrawType); + + // + // High ... + + // + // UPPER ... + bool canShowCHighUpper = showUpper && showHigh; + ENUM_DRAW_TYPE donHighUpperDrawType = canShowCHighUpper ? DRAW_LINE : DRAW_NONE; + ArraySetAsSeries(donHighUpperBuffer, true); + SetIndexBuffer(donHighUpperBufferIndex, donHighUpperBuffer, INDICATOR_DATA); + PlotIndexSetDouble(donHighUpperPlotBufferIndex, PLOT_EMPTY_VALUE, EMPTY_VALUE); + PlotIndexSetInteger(donHighUpperPlotBufferIndex, PLOT_SHOW_DATA, canShowCHighUpper); + PlotIndexSetInteger(donHighUpperPlotBufferIndex, PLOT_DRAW_TYPE, donHighUpperDrawType); + + // + // LOWER ... + bool canShowCHighLower = showLower && showHigh; + ENUM_DRAW_TYPE donHighLowerDrawType = canShowCHighLower ? DRAW_LINE : DRAW_NONE; + ArraySetAsSeries(donHighLowerBuffer, true); + SetIndexBuffer(donHighLowerBufferIndex, donHighLowerBuffer, INDICATOR_DATA); + PlotIndexSetDouble(donHighLowerPlotBufferIndex, PLOT_EMPTY_VALUE, EMPTY_VALUE); + PlotIndexSetInteger(donHighLowerPlotBufferIndex, PLOT_SHOW_DATA, canShowCHighLower); + PlotIndexSetInteger(donHighLowerPlotBufferIndex, PLOT_DRAW_TYPE, donHighLowerDrawType); + + // + // Low ... + + // + // UPPER ... + bool canShowCLowUpper = showUpper && showLow; + ENUM_DRAW_TYPE donLowUpperDrawType = canShowCLowUpper ? DRAW_LINE : DRAW_NONE; + ArraySetAsSeries(donLowUpperBuffer, true); + SetIndexBuffer(donLowUpperBufferIndex, donLowUpperBuffer, INDICATOR_DATA); + PlotIndexSetDouble(donLowUpperPlotBufferIndex, PLOT_EMPTY_VALUE, EMPTY_VALUE); + PlotIndexSetInteger(donLowUpperPlotBufferIndex, PLOT_SHOW_DATA, canShowCLowUpper); + PlotIndexSetInteger(donLowUpperPlotBufferIndex, PLOT_DRAW_TYPE, donLowUpperDrawType); + + // + // LOWER ... + bool canShowCLowLower = showLower && showLow; + ENUM_DRAW_TYPE donLowLowerDrawType = canShowCLowLower ? DRAW_LINE : DRAW_NONE; + ArraySetAsSeries(donLowLowerBuffer, true); + SetIndexBuffer(donLowLowerBufferIndex, donLowLowerBuffer, INDICATOR_DATA); + PlotIndexSetDouble(donLowLowerPlotBufferIndex, PLOT_EMPTY_VALUE, EMPTY_VALUE); + PlotIndexSetInteger(donLowLowerPlotBufferIndex, PLOT_SHOW_DATA, canShowCLowLower); + PlotIndexSetInteger(donLowLowerPlotBufferIndex, PLOT_DRAW_TYPE, donLowLowerDrawType); + + // + // Data Buffers ... +} + +/** + * Set Indicator Short Name and also we can define Buffers Labels ... + */ +void SetIndicatorName() +{ + IndicatorSetString(INDICATOR_SHORTNAME, ShortName); +} + +/** + * Calculate Custom Buffers ... + * + * @param bar_index: Integer, Represent Current Bar ... + * @param prevCalculated: Integer, Represent Previous Calculated Bars ... + * @param ratesTotal: Integer, Represents All Available Bars ... + * @param open: Double Array, History of Open Prices ... + * @param high: Double Array, History of High Prices ... + * @param close: Double Array, History of Close Prices ... + * @param low: Double Array, History of Low Prices ... + * @param tickVolume: Long, History of Tick Volumes on Bar ... + */ +void CalculateBuffers( + int bar_index, // Selected Bar Index + const int prevCalculated, + const int ratesTotal, + const double &open[], + const double &high[], + const double &close[], + const double &low[], + const long &tickVolume[] // +) +{ + // + int barsLimit = startCalculationForLastBars > 0 + ? startCalculationForLastBars + : 0; + // + // bool canCalculate = true; + bool canCalculate = + barsLimit == 0 || + bar_index <= barsLimit; + if (canCalculate) + { + // + CalculateDonchains( + bar_index, + prevCalculated, + ratesTotal, + open, + high, + close, + low, + tickVolume // + ); + } + else + { + FillBuffersZero(bar_index); + } +} + +// +// Custom ... + +/** + * Fill All Bufers to Zero Vlue for Specified Bar Index ... + * + * @param barIndex: Integer ... + */ +void FillBuffersZero(int barIndex) +{ + // + donOpenUpperBuffer[barIndex] = EMPTY_VALUE; + donOpenLowerBuffer[barIndex] = EMPTY_VALUE; + donCloseUpperBuffer[barIndex] = EMPTY_VALUE; + donCloseLowerBuffer[barIndex] = EMPTY_VALUE; + donHighUpperBuffer[barIndex] = EMPTY_VALUE; + donHighLowerBuffer[barIndex] = EMPTY_VALUE; + donLowUpperBuffer[barIndex] = EMPTY_VALUE; + donLowLowerBuffer[barIndex] = EMPTY_VALUE; +} + +/** + * Calculate Donchain ... + * + * @param bar_index: Integer, Bar Index ... + * @param prevCalculated: Integer, Represent Previous Calculated Bars ... + * @param ratesTotal: Integer, Represents All Available Bars ... + * @param open: Double Array, History of Open Prices ... + * @param high: Double Array, History of High Prices ... + * @param close: Double Array, History of Close Prices ... + * @param low: Double Array, History of Low Prices ... + * @param tickVolume: Long, History of Tick Volumes on Bar ... + * @param _length: Integer, Donchain Length ... + * @param _ouBuffer: Double Array Reference ... + * @param _olBuffer: Double Array Reference ... + * @param _huBuffer: Double Array Reference ... + * @param _hlBuffer: Double Array Reference ... + * @param _luBuffer: Double Array Reference ... + * @param _llBuffer: Double Array Reference ... + * @param _cuBuffer: Double Array Reference ... + * @param _clBuffer: Double Array Reference ... + */ +void CalculateDonchain( + int bar_index, // Selected Bar Index + const int prevCalculated, + const int ratesTotal, + // + const double &open[], + const double &high[], + const double &close[], + const double &low[], + const long &tickVolume[], + // + int _length, + // + double &_ouBuffer[], + double &_olBuffer[], + double &_huBuffer[], + double &_hlBuffer[], + double &_luBuffer[], + double &_llBuffer[], + double &_cuBuffer[], + double &_clBuffer[] // +) +{ + // + double iUpper = 0; + double iLower = 0; + + // + // OPEN ... + + // + int from = bar_index; + + // + iUpper = open[ArrayMaximum(open, from, _length)]; + iLower = open[ArrayMinimum(open, from, _length)]; + + // + _ouBuffer[bar_index] = iUpper; + _olBuffer[bar_index] = iLower; + + // + // HIGH ... + + // + iUpper = high[ArrayMaximum(high, from, _length)]; + iLower = high[ArrayMinimum(high, from, _length)]; + + // + _huBuffer[bar_index] = iUpper; + _hlBuffer[bar_index] = iLower; + + // + // LOW ... + + // + iUpper = low[ArrayMaximum(low, from, _length)]; + iLower = low[ArrayMinimum(low, from, _length)]; + + // + _luBuffer[bar_index] = iUpper; + _llBuffer[bar_index] = iLower; + + // + // CLOSE ... + + // + iUpper = close[ArrayMaximum(close, from, _length)]; + iLower = close[ArrayMinimum(close, from, _length)]; + + // + _cuBuffer[bar_index] = iUpper; + _clBuffer[bar_index] = iLower; +} + +/** + * Calculate Different VWaps ... + * + * @param bar_index: Integer, Represent Current Bar ... + * @param prevCalculated: Integer, Represent Previous Calculated Bars ... + * @param ratesTotal: Integer, Represents All Available Bars ... + * @param open: Double Array, History of Open Prices ... + * @param high: Double Array, History of High Prices ... + * @param close: Double Array, History of Close Prices ... + * @param low: Double Array, History of Low Prices ... + * @param tickVolume: Long, History of Tick Volumes on Bar ... + */ +void CalculateDonchains( + int bar_index, // Selected Bar Index + const int prevCalculated, + const int ratesTotal, + const double &open[], + const double &high[], + const double &close[], + const double &low[], + const long &tickVolume[] // +) +{ + // + CalculateDonchain( + // + bar_index, + prevCalculated, + ratesTotal, + // + open, + high, + close, + low, + tickVolume, + // + donchainLength, + // + donOpenUpperBuffer, + donOpenLowerBuffer, + donHighUpperBuffer, + donHighLowerBuffer, + donLowUpperBuffer, + donLowLowerBuffer, + donCloseUpperBuffer, + donCloseLowerBuffer // + ); +} + +// \ No newline at end of file diff --git a/BKPS/14031206/Indicators/x-saherelm.x121.xhk.ex5 b/BKPS/14031206/Indicators/x-saherelm.x121.xhk.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..0d33987523df532f11e1a0435135a77c7aea7881 GIT binary patch literal 20594 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 literal 0 HcmV?d00001 diff --git a/BKPS/14031206/Indicators/x-saherelm.x121.xhk.mq5 b/BKPS/14031206/Indicators/x-saherelm.x121.xhk.mq5 new file mode 100644 index 0000000..c6a7cfe --- /dev/null +++ b/BKPS/14031206/Indicators/x-saherelm.x121.xhk.mq5 @@ -0,0 +1,616 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 Indicator +// ------------------------------------------------- +// Name: X121 XHK +// Description: XHK ... +// +// +// Maintainer: +// ------------ +// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) +// +////////////////////////////////////////////////////// +// +// Global Properties ... +#property copyright "Copyright 2023, SaherElm IT Center" +#property link "https://saherelm.ir" +#property version "1.00" +#property description "SaherElm X121 XHK Indicator" +#property strict + +// +// Definitions ... + +// +#define ShortName "X121 XHK" + +// +// Includes Common Library ... +#include "../Libraries/x-saherelm.common.lib.mq5" + +// +// Inputs ... + +// +// Market ... +input group "Market"; +input int xhkSmoothingLength = 14; // Length +input ENUM_X_MA_METHOD xhkSmoothingMode = X_MA_MODE_EMA; // Smoothing Method +input bool xhkIgnoreSmoothingShadows = false; // Ignore Smoothed Bar Shadows + +// +input group "Presentation"; + +// +input int startCalculationForLastBars = 1000; // Calculate Last n Bars + +// +input bool drawRawXHKCandles = true; // Draw Raw Candle +input bool drawSmoothedXHKCandles = true; // Draw Smoothed Candle + +// +// Buffers ... + +// +#property indicator_chart_window + +// +#property indicator_buffers 10 +#property indicator_plots 2 + +// +#define hideColorIDX 0 +#define bullishColorIDX 1 +#define bearishColorIDX 2 +#define neuturalColorIDX 3 + +// +// PLOTTED Buffers ... + +// +#define openHKBufferIndex 0 +double openHKBuffer[]; + +// +#define highHKBufferIndex 1 +double highHKBuffer[]; + +// +#define lowHKBufferIndex 2 +double lowHKBuffer[]; + +// +#define closeHKBufferIndex 3 +double closeHKBuffer[]; + +// +#define rawHKColorBufferIndex 4 +double rawHKColorBuffer[]; + +// +#define rawHKBufferIndex 0 +#property indicator_label1 "X121 XHK Open;X121 XHK High;X121 XHK Low;X121 XHK Close" +#property indicator_type1 DRAW_COLOR_CANDLES +#property indicator_color1 CLR_NONE, clrDodgerBlue, clrDarkGoldenrod + +// +// Open ... +#define openBufferIndex 5 +double openBuffer[]; + +// +// High ... +#define highBufferIndex 6 +double highBuffer[]; + +// +// Low ... +#define lowBufferIndex 7 +double lowBuffer[]; + +// +// Close ... +#define closeBufferIndex 8 +double closeBuffer[]; + +// +// Candle Color ... +#define candleColorBufferIndex 9 +double candleColorBuffer[]; + +// +#define candlesBufferIndex 1 +#property indicator_label2 "X121 XHKSM Open;X121 XHKSM High;X121 XHKSM Low;X121 XHKSM Close" +#property indicator_type2 DRAW_COLOR_CANDLES +#property indicator_color2 CLR_NONE, clrAqua, clrMagenta + +// +// Variables, Properties and etc ... + +// +// this counts Available Bars ... +int limit; + +// +int maxLength; + +// + +// +// Event Handlers ... + +/** + * Initialize Indicator ... + * + * @return ( int ) + */ +int OnInit() +{ + // + // Validate Inputs ... + if (!ValidateInputs()) + { + return INIT_PARAMETERS_INCORRECT; + } + + // + // Initialize Indicator Handlers ... + + // + // because in some cases we may have more than one input for + // calculation and we must prevent any calculation + // untill we pass the biggest input length, here we get max Input length + // and then wait until pass it ... + maxLength = ExtractMaxLengthOfInputs(); + + // + // Define Index Buffers ... + DefineBuffers(); + + // + // Set Indicator ShortName ... + SetIndicatorName(); + + // + // Init Succeed ... + return INIT_SUCCEEDED; +} + +/** + * De Initialize Indicator ... + * + * @param reason: Integer, De Initialization Reason ... + */ +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 + + // +} + +/** + * Calculate Bars ... + * + * @param rates_total: Integer, Total Bars on Chart ... + * @param prev_calculated: Integer, Total Calculated Bars on Charts ... + * @param time: DateTime Array, History of Open Time ... + * @param open: Double Array, History of Open Prices ... + * @param high: Double Array, History of High Prices ... + * @param low: Double Array, History of Low Prices ... + * @param close: Double Array, History of Close Prices ... + * @param tick_volume: Long, History of Tick Volumes on Bar ... + * @param volume: Long, History of Trade Volumes ... + * @param spread: Double, History of Spread Price ... + * + * @return ( int ) + */ +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[] // +) +{ + // + // 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); + + // + // Fill All Buffers by Zero ... + if (prev_calculated == 0) + { + } + + // + 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, + prev_calculated, + rates_total, + // + open, + high, + close, + low, + tick_volume // + ); + } + + // + return rates_total; +} + +// +// Functions ... + +/** + * Validate Input Args for Initialization ... + * + * @return ( bool ) + */ +bool ValidateInputs() +{ + // + bool result = + // + true + // + ; + + // + return result; +} + +/** + * Extract Max Length of Inputs ... + * + * @return ( int ) + */ +int ExtractMaxLengthOfInputs() +{ + // + int result = 0; + + // + result = MathMax(0, xhkSmoothingLength); + + // + return result; +} + +/** + * Define Required Buffers ... + */ +void DefineBuffers() +{ + + // + // RAW ... + + // + // Raw Candles Color ... + ArraySetAsSeries(rawHKColorBuffer, true); + SetIndexBuffer(rawHKColorBufferIndex, rawHKColorBuffer, INDICATOR_COLOR_INDEX); + + // + // Set EMPTY_VALUE on Candles Buffer ... + PlotIndexSetDouble(rawHKBufferIndex, PLOT_EMPTY_VALUE, 0.0); + PlotIndexSetInteger(rawHKBufferIndex, PLOT_SHOW_DATA, false); + + // + // Open ... + ArraySetAsSeries(openHKBuffer, true); + SetIndexBuffer(openHKBufferIndex, openHKBuffer, INDICATOR_DATA); + + // + // High ... + ArraySetAsSeries(highHKBuffer, true); + SetIndexBuffer(highHKBufferIndex, highHKBuffer, INDICATOR_DATA); + + // + // Close ... + ArraySetAsSeries(closeHKBuffer, true); + SetIndexBuffer(closeHKBufferIndex, closeHKBuffer, INDICATOR_DATA); + + // + // Low ... + ArraySetAsSeries(lowHKBuffer, true); + SetIndexBuffer(lowHKBufferIndex, lowHKBuffer, INDICATOR_DATA); + + // + // SMOOTHED ... + + // + // Candles Color ... + ArraySetAsSeries(candleColorBuffer, true); + SetIndexBuffer(candleColorBufferIndex, candleColorBuffer, INDICATOR_COLOR_INDEX); + + // + // Set EMPTY_VALUE on Candles Buffer ... + PlotIndexSetDouble(candlesBufferIndex, PLOT_EMPTY_VALUE, 0.0); + PlotIndexSetInteger(candlesBufferIndex, PLOT_SHOW_DATA, false); + + // + // Open ... + ArraySetAsSeries(openBuffer, true); + SetIndexBuffer(openBufferIndex, openBuffer, INDICATOR_DATA); + + // + // High ... + ArraySetAsSeries(highBuffer, true); + SetIndexBuffer(highBufferIndex, highBuffer, INDICATOR_DATA); + + // + // Close ... + ArraySetAsSeries(closeBuffer, true); + SetIndexBuffer(closeBufferIndex, closeBuffer, INDICATOR_DATA); + + // + // Low ... + ArraySetAsSeries(lowBuffer, true); + SetIndexBuffer(lowBufferIndex, lowBuffer, INDICATOR_DATA); +} + +/** + * Set Indicator Short Name and also we can define Buffers Labels ... + */ +void SetIndicatorName() +{ + IndicatorSetString(INDICATOR_SHORTNAME, ShortName); +} + +/** + * Calculate Custom Buffers ... + * + * @param bar_index: Integer, Represent Current Bar ... + * @param prevCalculated: Integer, Represent Previous Calculated Bars ... + * @param ratesTotal: Integer, Represents All Available Bars ... + * @param open: Double Array, History of Open Prices ... + * @param high: Double Array, History of High Prices ... + * @param close: Double Array, History of Close Prices ... + * @param low: Double Array, History of Low Prices ... + * @param tickVolume: Long, History of Tick Volumes on Bar ... + */ +void CalculateBuffers( + int bar_index, // Selected Bar Index + const int prevCalculated, + const int ratesTotal, + const double &open[], + const double &high[], + const double &close[], + const double &low[], + const long &tickVolume[] // +) +{ + // + int barsLimit = startCalculationForLastBars > 0 + ? startCalculationForLastBars + : 0; + // + bool canCalculate = + barsLimit == 0 || + bar_index <= barsLimit; + if (canCalculate) + { + // + CalculateXHK( + bar_index, + prevCalculated, + ratesTotal, + open, + high, + close, + low // + ); + } + else + { + FillBuffersZero(bar_index); + } +} + +// +// Custom ... + +/** + * Fill All Bufers to Zero Vlue for Specified Bar Index ... + * + * @param barIndex: Integer ... + */ +void FillBuffersZero(int barIndex) +{ + // + lowHKBuffer[barIndex] = 0.0; + openHKBuffer[barIndex] = 0.0; + highHKBuffer[barIndex] = 0.0; + closeHKBuffer[barIndex] = 0.0; + rawHKColorBuffer[barIndex] = hideColorIDX; + + // + lowBuffer[barIndex] = 0.0; + openBuffer[barIndex] = 0.0; + highBuffer[barIndex] = 0.0; + closeBuffer[barIndex] = 0.0; + candleColorBuffer[barIndex] = hideColorIDX; +} + +/** + * Calculate ATR Zones ... + * + * @param bar_index: Integer, Represent Current Bar ... + * @param prevCalculated: Integer, Represent Previous Calculated Bars ... + * @param ratesTotal: Integer, Represents All Available Bars ... + * @param open: Double Array, History of Open Prices ... + * @param high: Double Array, History of High Prices ... + * @param close: Double Array, History of Close Prices ... + * @param low: Double Array, History of Low Prices ... + */ +void CalculateXHK( + int bar_index, // Selected Bar Index + const int prevCalculated, + const int ratesTotal, + const double &open[], + const double &high[], + const double &close[], + const double &low[] // +) +{ + // + double mPrevHKOpenValue; + double mPrevHKCloseValue; + + // + if (ArraySize(open) <= bar_index + 1) + { + // + mPrevHKOpenValue = 0; + mPrevHKCloseValue = 0; + } + else + { + // + mPrevHKOpenValue = openHKBuffer[bar_index + 1]; + mPrevHKCloseValue = closeHKBuffer[bar_index + 1]; + } + + // + double mHKOpenValue = (mPrevHKOpenValue + mPrevHKCloseValue) / 2; + double mHKCloseValue = (open[bar_index] + high[bar_index] + close[bar_index] + low[bar_index]) / 4; + double mHKHighValue = MathMax(high[bar_index], MathMax(mHKOpenValue, mHKCloseValue)); + double mHKLowValue = MathMin(low[bar_index], MathMin(mHKOpenValue, mHKCloseValue)); + + // + double candleColorValue = + mHKOpenValue < mHKCloseValue ? bullishColorIDX : bearishColorIDX; + + // + // Raw HK Buffers ... + openHKBuffer[bar_index] = mHKOpenValue; + highHKBuffer[bar_index] = mHKHighValue; + lowHKBuffer[bar_index] = mHKLowValue; + closeHKBuffer[bar_index] = mHKCloseValue; + rawHKColorBuffer[bar_index] = drawRawXHKCandles ? candleColorValue : hideColorIDX; + + // + // Apply Smoothing ... + bool canSmooth = xhkSmoothingLength > 0 && + xhkSmoothingMode != X_MA_MODE_NONE; + if (!canSmooth) + { + // + double min = MathMin(mHKOpenValue, mHKCloseValue); + double max = MathMax(mHKOpenValue, mHKCloseValue); + + // + openBuffer[bar_index] = mHKOpenValue; + highBuffer[bar_index] = xhkIgnoreSmoothingShadows ? max : mHKHighValue; + lowBuffer[bar_index] = xhkIgnoreSmoothingShadows ? min : mHKLowValue; + closeBuffer[bar_index] = mHKCloseValue; + candleColorBuffer[bar_index] = drawSmoothedXHKCandles ? candleColorValue : hideColorIDX; + } + else + { + // + // Open ... + iMAOnBuffer( + ratesTotal, + prevCalculated, + bar_index, + xhkSmoothingLength, + openHKBuffer, + openBuffer, + xhkSmoothingMode // + ); + + // + // Close ... + iMAOnBuffer( + ratesTotal, + prevCalculated, + bar_index, + xhkSmoothingLength, + closeHKBuffer, + closeBuffer, + xhkSmoothingMode // + ); + + // + // Ignoring Shadows ... + if (!xhkIgnoreSmoothingShadows) + { + // + // High ... + iMAOnBuffer( + ratesTotal, + prevCalculated, + bar_index, + xhkSmoothingLength, + highHKBuffer, + highBuffer, + xhkSmoothingMode // + ); + + // + // Low ... + iMAOnBuffer( + ratesTotal, + prevCalculated, + bar_index, + xhkSmoothingLength, + lowHKBuffer, + lowBuffer, + xhkSmoothingMode // + ); + } + else + { + // + double min = MathMin(closeBuffer[bar_index], openBuffer[bar_index]); + double max = MathMin(closeBuffer[bar_index], openBuffer[bar_index]); + + // + lowBuffer[bar_index] = min; + highBuffer[bar_index] = max; + } + + // + // Calculate Smoothed Color ... + candleColorValue = + openBuffer[bar_index] < closeBuffer[bar_index] ? bullishColorIDX : bearishColorIDX; + candleColorBuffer[bar_index] = drawSmoothedXHKCandles ? candleColorValue : hideColorIDX; + } +} + +// \ No newline at end of file diff --git a/BKPS/14031206/Indicators/x-saherelm.x121.xpv.ex5 b/BKPS/14031206/Indicators/x-saherelm.x121.xpv.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..51dd9a89b964f06c81944b7988a4e205d5a9f710 GIT binary patch literal 45116 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 ifl=>yZQ7S>$J1bkq`aG7wta-%= maxLength + // + ; + if (!isPassedRequiredCalculatedBars) + { + return prev_calculated; + } + + // + limit = (prev_calculated > rates_total || prev_calculated <= 0) + ? rates_total + : (rates_total - prev_calculated) + 1; + + // + // Buffers Copy ... + + // + // SAR ... + int copiedSars = CopyBuffer(sarHandler, 0, 0, limit, sarBuffer); + + // + // Validate Copied Items ... + bool isPassedRequiredCopiedItems = + // + // SAR ... + copiedSars > 0 + // + ; + if (!isPassedRequiredCopiedItems) + { + return prev_calculated; + } + + // + // Main Loop ... + for (int i = limit - 1; i >= 0 && !IsStopped(); i--) + { + // + CalculateBuffers( + i, + prev_calculated, + rates_total, + // + open, + high, + close, + low, + tick_volume // + ); + } + + // + return rates_total; +} + +// +// Functions ... + +/** + * Validate Input Args for Initialization ... + * + * @return ( bool ) + */ +bool ValidateInputs() +{ + // + bool result = false; + + // + result = + // + // SAR ... + sarMax > 0 && + sarStep > 0 && + sarMax > sarStep && + // + // XPV ... + (IsValid(scMethod, scPeriod) && + IsValid(mcMethod, mcPeriod) && + IsValid(lcMethod, lcPeriod) && + IsValid(hcMethod, hcPeriod)) + // + ; + + // + return result; +} + +/** + * Extract Max Length of Inputs ... + * + * @return ( int ) + */ +int ExtractMaxLengthOfInputs() +{ + // + int result = 0; + + // + return result; +} + +/** + * Define Required Buffers ... + */ +void DefineBuffers() +{ + // + // Plot Buffers ... + + // + // PEAKS ... + + // + ENUM_DRAW_TYPE peaksDrawType = showPeaks ? DRAW_ARROW : DRAW_NONE; + + // + ArraySetAsSeries(peaksBuffer, true); + SetIndexBuffer(peaksBufferIndex, peaksBuffer, INDICATOR_DATA); + + // + PlotIndexSetInteger(peaksBufferIndex, PLOT_SHOW_DATA, showPeaks); + PlotIndexSetInteger(peaksBufferIndex, PLOT_DRAW_TYPE, peaksDrawType); + + // + PlotIndexSetDouble(peaksBufferIndex, PLOT_EMPTY_VALUE, 0); + PlotIndexSetInteger(peaksBufferIndex, PLOT_ARROW, peaksArrowCode); + + // + // VALES ... + + // + ENUM_DRAW_TYPE valesDrawType = showVales ? DRAW_ARROW : DRAW_NONE; + + // + ArraySetAsSeries(valesBuffer, true); + SetIndexBuffer(valesBufferIndex, valesBuffer, INDICATOR_DATA); + + // + PlotIndexSetInteger(valesBufferIndex, PLOT_SHOW_DATA, showVales); + PlotIndexSetInteger(valesBufferIndex, PLOT_DRAW_TYPE, valesDrawType); + + // + PlotIndexSetDouble(valesBufferIndex, PLOT_EMPTY_VALUE, 0); + PlotIndexSetInteger(valesBufferIndex, PLOT_ARROW, valesArrowCode); + + // + // SAR ... + + // + ENUM_DRAW_TYPE sarDrawType = showSar ? DRAW_ARROW : DRAW_NONE; + + // + ArraySetAsSeries(sarBuffer, true); + SetIndexBuffer(sarBufferIndex, sarBuffer, INDICATOR_DATA); + + // + PlotIndexSetInteger(sarBufferIndex, PLOT_SHOW_DATA, showSar); + PlotIndexSetInteger(sarBufferIndex, PLOT_DRAW_TYPE, sarDrawType); + + // + PlotIndexSetDouble(sarBufferIndex, PLOT_EMPTY_VALUE, 0); + PlotIndexSetInteger(sarBufferIndex, PLOT_ARROW, sarArrowCode); + + // + // Data Buffers ... + + // + // CURRENT ... + + // + ArraySetAsSeries(cHHBuffer, true); + SetIndexBuffer(cHHBufferIndex, cHHBuffer, INDICATOR_CALCULATIONS); + + // + ArraySetAsSeries(cLLBuffer, true); + SetIndexBuffer(cLLBufferIndex, cLLBuffer, INDICATOR_CALCULATIONS); + + // + // SHORT ... + + // + ArraySetAsSeries(sHHBuffer, true); + SetIndexBuffer(sHHBufferIndex, sHHBuffer, INDICATOR_CALCULATIONS); + + // + ArraySetAsSeries(sLLBuffer, true); + SetIndexBuffer(sLLBufferIndex, sLLBuffer, INDICATOR_CALCULATIONS); + + // + // MEDIUM ... + + // + ArraySetAsSeries(mHHBuffer, true); + SetIndexBuffer(mHHBufferIndex, mHHBuffer, INDICATOR_CALCULATIONS); + + // + ArraySetAsSeries(mLLBuffer, true); + SetIndexBuffer(mLLBufferIndex, mLLBuffer, INDICATOR_CALCULATIONS); + + // + // LONG ... + + // + ArraySetAsSeries(lHHBuffer, true); + SetIndexBuffer(lHHBufferIndex, lHHBuffer, INDICATOR_CALCULATIONS); + + // + ArraySetAsSeries(lLLBuffer, true); + SetIndexBuffer(lLLBufferIndex, lLLBuffer, INDICATOR_CALCULATIONS); + + // + // HIND ... + + // + ArraySetAsSeries(hHHBuffer, true); + SetIndexBuffer(hHHBufferIndex, hHHBuffer, INDICATOR_CALCULATIONS); + + // + ArraySetAsSeries(hLLBuffer, true); + SetIndexBuffer(hLLBufferIndex, hLLBuffer, INDICATOR_CALCULATIONS); +} + +/** + * Set Indicator Short Name and also we can define Buffers Labels ... + */ +void SetIndicatorName() +{ + IndicatorSetString(INDICATOR_SHORTNAME, ShortName); +} + +/** + * Calculate Custom Buffers ... + * + * @param bar_index: Integer, Represent Current Bar ... + * @param prevCalculated: Integer, Represent Previous Calculated Bars ... + * @param ratesTotal: Integer, Represents All Available Bars ... + * @param open: Double Array, History of Open Prices ... + * @param high: Double Array, History of High Prices ... + * @param close: Double Array, History of Close Prices ... + * @param low: Double Array, History of Low Prices ... + * @param tickVolume: Long, History of Tick Volumes on Bar ... + */ +void CalculateBuffers( + int bar_index, // Selected Bar Index + const int prevCalculated, + const int ratesTotal, + const double &open[], + const double &high[], + const double &close[], + const double &low[], + const long &tickVolume[] // +) +{ + // + int barsLimit = startCalculationForLastBars > 0 + ? startCalculationForLastBars + : 0; + // + // bool canCalculate = true; + bool canCalculate = + barsLimit == 0 || + bar_index <= barsLimit; + if (canCalculate) + { + // + // Calculate Cycles ... + CalculateCycles(bar_index); + + // + // Calculate Peaks and Vales ... + CalculatePeaksAndVales(bar_index); + } + else + { + FillBuffersZero(bar_index); + } +} + +// +// Custom ... + +/** + * Initial Market Cycles ... + * + * @return ( bool ) + */ +bool InitMarketCycles() +{ + // + bool result = false; + + // + int cPeriodSeconds = PeriodSeconds(_Period); + + // + // Find Cycle Period ... + if (scMethod == X_PERIOD_AUTO) + { + // + // Select Period ... + mSCPeriod = GetCyclePeriod( + X_MARKET_CYCLE_SHORT, + _Period // + ); + } + else + { + mSCPeriod = scPeriod; + } + + // + if (IsValid(mSCPeriod)) + { + mSCLength = PeriodSeconds(mSCPeriod) / cPeriodSeconds; + } + + // + // Find Cycle Period ... + if (mcMethod == X_PERIOD_AUTO) + { + // + // Select Period ... + mMCPeriod = GetCyclePeriod( + X_MARKET_CYCLE_MEDIUM, + _Period // + ); + } + else + { + mMCPeriod = mcPeriod; + } + + // + if (IsValid(mMCPeriod)) + { + mMCLength = PeriodSeconds(mMCPeriod) / cPeriodSeconds; + } + + // + // Find Cycle Period ... + if (lcMethod == X_PERIOD_AUTO) + { + // + // Select Period ... + mLCPeriod = GetCyclePeriod( + X_MARKET_CYCLE_LONG, + _Period // + ); + } + else + { + mLCPeriod = lcPeriod; + } + + // + if (IsValid(mLCPeriod)) + { + mLCLength = PeriodSeconds(mLCPeriod) / cPeriodSeconds; + } + + // + // Find Cycle Period ... + if (hcMethod == X_PERIOD_AUTO) + { + // + // Select Period ... + mHCPeriod = GetCyclePeriod( + X_MARKET_CYCLE_HIND, + _Period // + ); + } + else + { + mHCPeriod = hcPeriod; + } + + // + if (IsValid(mHCPeriod)) + { + mHCLength = PeriodSeconds(mHCPeriod) / cPeriodSeconds; + } + + // + result = mSCLength > 0 && + mMCLength > mSCLength && + mLCLength > mMCLength && + mHCLength > mLCLength; + + // + return result; +} + +/** + * Fill All Bufers to Zero Vlue for Specified Bar Index ... + * + * @param barIndex: Integer ... + */ +void FillBuffersZero(int barIndex) +{ + // + // CURRENT ... + cHHBuffer[barIndex] = EMPTY_VALUE; + cLLBuffer[barIndex] = EMPTY_VALUE; + + // + // SHORT ... + sHHBuffer[barIndex] = EMPTY_VALUE; + sLLBuffer[barIndex] = EMPTY_VALUE; + + // + // MEDIUM ... + mHHBuffer[barIndex] = EMPTY_VALUE; + mLLBuffer[barIndex] = EMPTY_VALUE; + + // + // LONG ... + lHHBuffer[barIndex] = EMPTY_VALUE; + lLLBuffer[barIndex] = EMPTY_VALUE; + + // + // HIND ... + hHHBuffer[barIndex] = EMPTY_VALUE; + hLLBuffer[barIndex] = EMPTY_VALUE; + + // + // PEAKS ... + peaksBuffer[barIndex] = EMPTY_VALUE; + + // + // VALES ... + valesBuffer[barIndex] = EMPTY_VALUE; + + // + // SARS ... + sarBuffer[barIndex] = EMPTY_VALUE; +} + +/** + * Calculate Specified Market Cycle Info ... + * + * @param barIndex: Integer, Bar Index ... + * @param cycle: ENUM_X_MARKET_CYCLES member, Specified Cycle ... + * @param hhBuffer: Highest High Buffer Reference ... + * @param llBuffer: Lowest Low Buffer Reference ... + */ +void CalculateCycle( + int barIndex, + ENUM_X_MARKET_CYCLES cycle, + double &hhBuffer[], + double &llBuffer[] // +) +{ + // + XOHCL bar; + bool isBarInited = bar.Init( + _Symbol, + _Period, + barIndex + // + ); + if (!isBarInited) + { + return; + } + + // + int mLength = 0; + switch (cycle) + { + // + case X_MARKET_CYCLE_SHORT: + mLength = mSCLength; + break; + + // + case X_MARKET_CYCLE_MEDIUM: + mLength = mMCLength; + break; + + // + case X_MARKET_CYCLE_LONG: + mLength = mLCLength; + break; + + // + case X_MARKET_CYCLE_HIND: + mLength = mHCLength; + break; + } + + // + if (mLength == 0) + { + return; + } + + // + // Find Highest High ... + double hhValue = bar.FindHighest( + mLength, + hhMode + // + ); + hhBuffer[barIndex] = hhValue; + + // + // Find Lowest Low ... + double llValue = bar.FindLowest( + mLength, + llMode + // + ); + llBuffer[barIndex] = llValue; +} + +/** + * Claculate Cycles ... + * + * @param barIndex: Integer, Bar Index ... + */ +void CalculateCycles(int barIndex) +{ + // + // SHORT ... + CalculateCycle( + barIndex, + X_MARKET_CYCLE_SHORT, + sHHBuffer, + sLLBuffer // + ); + + // + // MEDIUM ... + CalculateCycle( + barIndex, + X_MARKET_CYCLE_MEDIUM, + mHHBuffer, + mLLBuffer // + ); + + // + // LONG ... + CalculateCycle( + barIndex, + X_MARKET_CYCLE_LONG, + lHHBuffer, + lLLBuffer // + ); + + // + // HIND ... + CalculateCycle( + barIndex, + X_MARKET_CYCLE_HIND, + hHHBuffer, + hLLBuffer // + ); +} + +/** + * Calculate Peaks and Vales ... + * + * @param barIndex: Integer, Bar Index ... + */ +void CalculatePeaksAndVales(int barIndex) +{ + // + int lastIndex = barIndex + 1; + int barsCount = iBars(_Symbol, _Period); + + // + // PEAKS ... + double lastPeak = + lastIndex < barsCount + ? peaksBuffer[lastIndex] + : 0; + + // + double isHH = sHHBuffer[barIndex]; + double imHH = mHHBuffer[barIndex]; + double ilHH = lHHBuffer[barIndex]; + double ihHH = hHHBuffer[barIndex]; + + // + double iHHs[4] = { + isHH, + imHH, + ilHH, + ihHH // + }; + double rValue = GetAverage(iHHs); + bool isPeak = rValue == isHH && + isHH == imHH && + imHH == ilHH && + ilHH == ihHH; + double iPeak = + isPeak + ? rValue + : lastPeak; + peaksBuffer[barIndex] = iPeak; + + // + // VALES ... + double lastVale = + lastIndex < barsCount + ? valesBuffer[lastIndex] + : 0; + + // + double isLL = sLLBuffer[barIndex]; + double imLL = mLLBuffer[barIndex]; + double ilLL = lLLBuffer[barIndex]; + double ihLL = hLLBuffer[barIndex]; + + // + double iLLs[4] = { + isLL, + imLL, + ilLL, + ihLL // + }; + double sValue = GetAverage(iLLs); + bool isVale = sValue == isLL && + isLL == imLL && + imLL == ilLL && + ilLL == ihLL; + double iVale = + isVale + ? sValue + : lastVale; + valesBuffer[barIndex] = iVale; +} + +// \ No newline at end of file diff --git a/BKPS/14031206/Indicators/x-saherelm.x121.xstr.ex5 b/BKPS/14031206/Indicators/x-saherelm.x121.xstr.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..5f32409173f96dbdcad0e82236f64b4b11635a85 GIT binary patch literal 16628 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 literal 0 HcmV?d00001 diff --git a/BKPS/14031206/Indicators/x-saherelm.x121.xstr.mq5 b/BKPS/14031206/Indicators/x-saherelm.x121.xstr.mq5 new file mode 100644 index 0000000..cccce4f --- /dev/null +++ b/BKPS/14031206/Indicators/x-saherelm.x121.xstr.mq5 @@ -0,0 +1,636 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 Indicator +// ------------------------------------------------- +// Name: X121 XSTR +// Description: XSTR ... +// +// +// Maintainer: +// ------------ +// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) +// +////////////////////////////////////////////////////// +// +// Global Properties ... +#property copyright "Copyright 2023, SaherElm IT Center" +#property link "https://saherelm.ir" +#property version "1.00" +#property description "SaherElm X121 XSTR Indicator" +#property strict + +// +// Definitions ... + +// +#define ShortName "X121 XSTR" + +// +// Includes Common Library ... +#include "../Libraries/x-saherelm.common.lib.mq5" + +// +// Inputs ... + +// +// Market ... +input group "Market"; +input int strLength = 14; // Length +input double strMultiplier = 3; // Multiplier +input ENUM_APPLIED_PRICE strAppliedTo = PRICE_MEDIAN; // Applied To + +// +input group "Presentation"; + +// +input bool showStr = true; // Show Str +input bool showStrUpper = true; // Show Str Upper +input bool showStrLower = true; // Show Str Lower + +// +// Buffers ... + +// +#define hideColorIDX 0 +#define bullishColorIDX 1 +#define bearishColorIDX 2 +#define neuturalColorIDX 3 + +// +#property indicator_chart_window + +// +#property indicator_buffers 7 +#property indicator_plots 3 + +// +// STR ... +#define strBufferIndex 0 +double strBuffer[]; + +#define strColorBufferIndex 1 +double strColorBuffer[]; + +// +#define strPlotBufferIndex 0 +#property indicator_label1 "X121 STR" +#property indicator_type1 DRAW_COLOR_LINE +#property indicator_color1 CLR_NONE, clrLime, clrRed, clrGray +#property indicator_style1 STYLE_SOLID +#property indicator_width1 2 + +// +// Up ... +#define strUpBufferIndex 2 +double strUpBuffer[]; + +// +#define strUpPlotBufferIndex 1 +#property indicator_label2 "X121 STR U" +#property indicator_type2 DRAW_LINE +#property indicator_color2 C'255,106,0' +#property indicator_style2 STYLE_SOLID +#property indicator_width2 1 + +// +// Down ... +#define strDownBufferIndex 3 +double strDownBuffer[]; + +// +#define strDownPlotBufferIndex 2 +#property indicator_label3 "X121 STR D" +#property indicator_type3 DRAW_LINE +#property indicator_color3 C'255,106,0' +#property indicator_style3 STYLE_SOLID +#property indicator_width3 1 + +// +// Data Buffers ... + +// +int mLastBufferIndex = 3; + +// +// STR ... + +// +// Atr ... +#define atrBufferIndex mLastBufferIndex + 1 +double atrBuffer[]; + +// +// Price ... +#define strPriceBufferIndex mLastBufferIndex + 2 +double strPriceBuffer[]; + +// +// Trend ... +#define strStateBufferIndex mLastBufferIndex + 3 +double strStateBuffer[]; + +// +// Variables, Properties and etc ... + +// +// this counts Available Bars ... +int limit; + +// +int maxLength; + +// +// ATR Handler ... +int atrHandler = INVALID_HANDLE; + +// +bool isStrTrendChanged; +bool isStrStartBearishTrend; +bool isStrStartBullishTrend; + +// +int changeOfTrend; +int startBearishTrend; +int startBullishTrend; + +// +// Event Handlers ... + +/** + * Initialize Indicator ... + * + * @return ( int ) + */ +int OnInit() +{ + // + // Validate Inputs ... + if (!ValidateInputs()) + { + return INIT_PARAMETERS_INCORRECT; + } + + // + // Initialize Indicator Handlers ... + + // + // ATR ... + atrHandler = iATR( + _Symbol, + _Period, + strLength // + ); + bool isInited = atrHandler != INVALID_HANDLE; + if (!isInited) + { + return INIT_FAILED; + } + + // + // because in some cases we may have more than one input for + // calculation and we must prevent any calculation + // untill we pass the biggest input length, here we get max Input length + // and then wait until pass it ... + maxLength = ExtractMaxLengthOfInputs(); + + // + // Define Index Buffers ... + DefineBuffers(); + + // + // Set Indicator ShortName ... + SetIndicatorName(); + + // + // Init Succeed ... + return INIT_SUCCEEDED; +} + +/** + * De Initialize Indicator ... + * + * @param reason: Integer, De Initialization Reason ... + */ +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 + + // + IndicatorRelease(atrHandler); +} + +/** + * Calculate Bars ... + * + * @param rates_total: Integer, Total Bars on Chart ... + * @param prev_calculated: Integer, Total Calculated Bars on Charts ... + * @param time: DateTime Array, History of Open Time ... + * @param open: Double Array, History of Open Prices ... + * @param high: Double Array, History of High Prices ... + * @param low: Double Array, History of Low Prices ... + * @param close: Double Array, History of Close Prices ... + * @param tick_volume: Long, History of Tick Volumes on Bar ... + * @param volume: Long, History of Trade Volumes ... + * @param spread: Double, History of Spread Price ... + * + * @return ( int ) + */ +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[] // +) +{ + // + // Prepare Buffers ... + + // + // Validate Calculated Bars ... + + // + // ATR ... + int atrCalculatedBars = BarsCalculated(atrHandler); + + // + bool isPassedRequiredCalculatedBars = + // + // ATR ... + atrCalculatedBars >= 0 + // + ; + if (!isPassedRequiredCalculatedBars) + { + return prev_calculated; + } + + // + // + // checking for the limit start of calculation of an indicator ... + limit = + (prev_calculated > rates_total || prev_calculated <= 0) + ? maxLength + : prev_calculated - 1; + + // + // Buffers Copy ... + + // + // ATR ... + int copiedAtrs = CopyBuffer(atrHandler, 0, 0, rates_total, atrBuffer); + + // + // Validate Copied Items ... + bool isPassedRequiredCopiedItems = + // + // ATR ... + copiedAtrs >= 0 + // + ; + if (!isPassedRequiredCopiedItems) + { + return prev_calculated; + } + + // + // Main Loop ... + for (int i = limit; i < rates_total && !IsStopped(); i++) + { + // + CalculateBuffers( + i, + prev_calculated, + rates_total, + // + open, + high, + close, + low, + tick_volume // + ); + } + + // + return rates_total; +} + +// +// Functions ... + +/** + * Validate Input Args for Initialization ... + * + * @return ( bool ) + */ +bool ValidateInputs() +{ + // + bool result = + // + // STR ... + strLength > 0 && + strMultiplier > 0 + // + ; + + // + return result; +} + +/** + * Extract Max Length of Inputs ... + * + * @return ( int ) + */ +int ExtractMaxLengthOfInputs() +{ + // + int result = 0; + + // + result = MathMax(1, strLength); + + // + return result; +} + +/** + * Define Required Buffers ... + */ +void DefineBuffers() +{ + // + // STR ... + SetIndexBuffer(strBufferIndex, strBuffer, INDICATOR_DATA); + SetIndexBuffer(strColorBufferIndex, strColorBuffer, INDICATOR_COLOR_INDEX); + + // + ENUM_DRAW_TYPE strUpDrawType = showStrUpper ? DRAW_LINE : DRAW_NONE; + SetIndexBuffer(strUpBufferIndex, strUpBuffer, INDICATOR_DATA); + PlotIndexSetDouble(strUpPlotBufferIndex, PLOT_EMPTY_VALUE, EMPTY_VALUE); + PlotIndexSetInteger(strUpPlotBufferIndex, PLOT_SHOW_DATA, showStrUpper); + PlotIndexSetInteger(strUpPlotBufferIndex, PLOT_DRAW_TYPE, strUpDrawType); + + // + ENUM_DRAW_TYPE strDownDrawType = showStrLower ? DRAW_LINE : DRAW_NONE; + SetIndexBuffer(strDownBufferIndex, strDownBuffer, INDICATOR_DATA); + PlotIndexSetDouble(strDownPlotBufferIndex, PLOT_EMPTY_VALUE, EMPTY_VALUE); + PlotIndexSetInteger(strDownPlotBufferIndex, PLOT_SHOW_DATA, showStrLower); + PlotIndexSetInteger(strDownPlotBufferIndex, PLOT_DRAW_TYPE, strDownDrawType); + + // + // Data Buffers ... + + // + // STR ... + + // + SetIndexBuffer(strPriceBufferIndex, strPriceBuffer, INDICATOR_CALCULATIONS); + SetIndexBuffer(strStateBufferIndex, strStateBuffer, INDICATOR_CALCULATIONS); +} + +/** + * Set Indicator Short Name and also we can define Buffers Labels ... + */ +void SetIndicatorName() +{ + IndicatorSetString(INDICATOR_SHORTNAME, ShortName); +} + +/** + * Calculate Custom Buffers ... + * + * @param bar_index: Integer, Represent Current Bar ... + * @param prevCalculated: Integer, Represent Previous Calculated Bars ... + * @param ratesTotal: Integer, Represents All Available Bars ... + * @param open: Double Array, History of Open Prices ... + * @param high: Double Array, History of High Prices ... + * @param close: Double Array, History of Close Prices ... + * @param low: Double Array, History of Low Prices ... + * @param tickVolume: Long, History of Tick Volumes on Bar ... + */ +void CalculateBuffers( + int bar_index, // Selected Bar Index + const int prevCalculated, + const int ratesTotal, + const double &open[], + const double &high[], + const double &close[], + const double &low[], + const long &tickVolume[] // +) +{ + // + CalculateStr( + bar_index, + prevCalculated, + ratesTotal, + open, + high, + close, + low // + ); +} + +// +// Custom ... + +/** + * Fill All Bufers to Zero Vlue for Specified Bar Index ... + * + * @param barIndex: Integer ... + */ +void FillBuffersZero(int barIndex) +{ + // + // STR ... + strBuffer[barIndex] = 0; + strUpBuffer[barIndex] = 0; + strDownBuffer[barIndex] = 0; + strPriceBuffer[barIndex] = 0; + strColorBuffer[barIndex] = hideColorIDX; + strStateBuffer[barIndex] = hideColorIDX; +} + +/** + * Calculate STR ... + * + * @param bar_index: Integer, Represent Current Bar ... + * @param prevCalculated: Integer, Represent Previous Calculated Bars ... + * @param ratesTotal: Integer, Represents All Available Bars ... + * @param open: Double Array, History of Open Prices ... + * @param high: Double Array, History of High Prices ... + * @param close: Double Array, History of Close Prices ... + * @param low: Double Array, History of Low Prices ... + */ +void CalculateStr( + int bar_index, // Selected Bar Index + const int prevCalculated, + const int ratesTotal, + const double &open[], + const double &high[], + const double &close[], + const double &low[] // +) +{ + // + // Calculated Price ... + double price = GetAppliedPrice( + strAppliedTo, + open, + high, + low, + close, + bar_index // + ); + strPriceBuffer[bar_index] = price; + + // + double atr = atrBuffer[bar_index]; + + // + // Up ... + strUpBuffer[bar_index] = price + (strMultiplier * atr); + + // + // Down ... + strDownBuffer[bar_index] = price - (strMultiplier * atr); + + // + if (close[bar_index] > strUpBuffer[bar_index - 1]) + { + // + strStateBuffer[bar_index] = 1; + if (strStateBuffer[bar_index - 1] == -1) + { + changeOfTrend = 1; + } + } + else if (close[bar_index] < strDownBuffer[bar_index - 1]) + { + // + strStateBuffer[bar_index] = -1; + if (strStateBuffer[bar_index - 1] == 1) + { + changeOfTrend = 1; + } + } + else if (strStateBuffer[bar_index - 1] == 1) + { + // + strStateBuffer[bar_index] = 1; + changeOfTrend = 0; + } + else if (strStateBuffer[bar_index - 1] == -1) + { + // + strStateBuffer[bar_index] = -1; + changeOfTrend = 0; + } + + // + // Down Trend Starting ... + if (strStateBuffer[bar_index] < 0 && strStateBuffer[bar_index - 1] > 0) + { + startBearishTrend = 1; + } + else + { + startBearishTrend = 0; + } + + // + // Up Trend Starting ... + if (strStateBuffer[bar_index] > 0 && strStateBuffer[bar_index - 1] < 0) + { + startBullishTrend = 1; + } + else + { + startBullishTrend = 0; + } + + // + if (strStateBuffer[bar_index] > 0 && strDownBuffer[bar_index] < strDownBuffer[bar_index - 1]) + { + strDownBuffer[bar_index] = strDownBuffer[bar_index - 1]; + } + + // + if (strStateBuffer[bar_index] < 0 && strUpBuffer[bar_index] > strUpBuffer[bar_index - 1]) + { + strUpBuffer[bar_index] = strUpBuffer[bar_index - 1]; + } + + // + if (startBearishTrend == 1) + { + strUpBuffer[bar_index] = strPriceBuffer[bar_index] + (strMultiplier * atr); + } + + // + if (startBullishTrend == 1) + { + strDownBuffer[bar_index] = strPriceBuffer[bar_index] - (strMultiplier * atr); + } + + // + // Draw the indicator ... + + // + double colorIDX = hideColorIDX; + strColorBuffer[bar_index] = colorIDX; + + // + if (strStateBuffer[bar_index] == 1) + { + // + strBuffer[bar_index] = strDownBuffer[bar_index]; + if (changeOfTrend == 1) + { + strBuffer[bar_index - 1] = strBuffer[bar_index - 2]; + changeOfTrend = 0; + } + + // + colorIDX = bullishColorIDX; + } + else if (strStateBuffer[bar_index] == -1) + { + // + strBuffer[bar_index] = strUpBuffer[bar_index]; + if (changeOfTrend == 1) + { + // + strBuffer[bar_index - 1] = strBuffer[bar_index - 2]; + changeOfTrend = 0; + } + + // + colorIDX = bearishColorIDX; + } + + // + if (showStr) + { + strColorBuffer[bar_index] = colorIDX; + } +} + +// \ No newline at end of file diff --git a/BKPS/14031206/Indicators/x-saherelm.x121.xtrend.ex5 b/BKPS/14031206/Indicators/x-saherelm.x121.xtrend.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..444fd4e75b099b88868915cf4e811df0a3c22896 GIT binary patch literal 22082 zcmdSAV~j37_$~U5ZQJ(D9^1BU+qOM>Y}+$?Y}>YN8~67=H@V3H@LHC}ZeY#gPGoYy&pq=u+f&XR5|4+mJk@tcG z0RATc0I-Dr2LwO`va*;)2WN*fh=Gl22GzyhHCFRctP{LgCoA1(^80oeX$kp!sx7YqMq zv-_{~{~-T=cK^fJ<-ZDR% zPQM?ZDleNy_c@Q_kv*3c>vuHRB$6963Ifm@rh)YcTq6C_2<=y(+9X?r+il>qYl;o@ z2yAx&VH#l3$vh-_4CQc>_s3b_q(6Llg`6vy@INv9BM0Cz5Iu{e_KDhhf~d*i$Yh

    PP&zgIItMneJppGwnLzcWpVlr_> zdN|TEq8co@q0&eAmHu`j;&u$Q&3QDH?l$A7eii(hD7KhS4O|f1S=(Fys+HNN7G2j`*yj$U3A(o4%&FT7V;EVm4hTs@{5Tu1SWTPY+zi||In^jm#J6Hf=A zn21S+93nxL`GXUmL{okcB=Ho*HJSPLAAtkarg*HGmkv?l#c(3{K}9;&=2S-1!l4$3 zEGfb?TShO|s4-)HV75*j(g9K>O4uoAkkqeCClnQ1Y+Wo5GP^2+P!RwI*x)$e#fmI1 zmxs%%){zB_QlYpIWze%Gu$519*P(%*@~%9Q=HuyDR*e64xPT~l-8pBa8lR42x3x$FV@70`uN4DQdM3z84voUyOk!xMmXL5e`lWb z9HxvVxIM)Tm5qI1-S7G%rnbCS*UNCuPoS0CN8`evh;~@x#uX?lx15LTqxc$JHPOz9 z%|vGlgZcG(j(T; zF!hy%mc8gf2R19e41~{6w(jT`Q&8KPNJcvb+ePT{oLur1Efw0*07&_3qM`WZke*fC zEOs!yq3=^}XdawjZ?qO63XJX2*)dK)L&$4>+f&m`MOf5H{GeR^)!DTpa`So0hvU|@ z0_BJa8}BpnbT4~H7hU{&0y6)xIhOUC4Ap@o#!O6-c(Er-BFDEe#Ooa|ch#{}7{hTQ z&or9krQViwmnzGssXCN1<}o<5>5&5M#bWA`>}BKQniHm$Ecd}&`nDT+@S|L*3uz?S zHnfM`J!KU+H;COjC(UX&;N)V(QRpa*)2$peCj$Lbi#DWk5;u>Q5iPEDm*jlA0x}mO z5JiQO$AO^b2{xxxonv;V`*_6wQiEa6=*~$wSQS|7pRED$H!;coH+*|HjBZoN; zByFwTvcpwVcrTI4UiTtCf4Sy8keATwMr@iqEbQc_#tEWb9pT*+zX}`+1U*NHe{5AP z+fb?TLvYx#J`mK#$U&N5lN3bpsma9D+ys07a(;i{n9ufV@Xm2*Q;(ATRA^I|GL~>0 zHMB&Ou`=XJ6Cvij^-M!2o6;CqFfTo-ckKPNbTj1kcg~=jPwnkUrt6M}DCCl(=VT>p zvkoGXN@#m^`uN=8Z631pWu(Y3B`>s#7C(ci&=G`M&@J(l|u` literal 0 HcmV?d00001 diff --git a/BKPS/14031206/Indicators/Examples/Heiken_Ashi.mq5 b/BKPS/14031206/Indicators/Examples/Heiken_Ashi.mq5 new file mode 100644 index 0000000..6edd14b --- /dev/null +++ b/BKPS/14031206/Indicators/Examples/Heiken_Ashi.mq5 @@ -0,0 +1,94 @@ +//+------------------------------------------------------------------+ +//| ProjectName | +//| Copyright 2020, CompanyName | +//| http://www.companyname.net | +//+------------------------------------------------------------------+ + +//+------------------------------------------------------------------+ +//| Heiken_Ashi.mq5 | +//| Copyright 2000-2025, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2000-2025, MetaQuotes Ltd." +#property link "https://www.mql5.com" +//--- indicator settings +#property indicator_chart_window +#property indicator_buffers 5 +#property indicator_plots 1 +#property indicator_type1 DRAW_COLOR_CANDLES +#property indicator_color1 DodgerBlue, Red +#property indicator_label1 "Heiken Ashi Open;Heiken Ashi High;Heiken Ashi Low;Heiken Ashi Close" +//--- indicator buffers +double ExtOBuffer[]; +double ExtHBuffer[]; +double ExtLBuffer[]; +double ExtCBuffer[]; +double ExtColorBuffer[]; +//+------------------------------------------------------------------+ +//| Custom indicator initialization function | +//+------------------------------------------------------------------+ +void OnInit() + { +//--- indicator buffers mapping + SetIndexBuffer(0,ExtOBuffer,INDICATOR_DATA); + SetIndexBuffer(1,ExtHBuffer,INDICATOR_DATA); + SetIndexBuffer(2,ExtLBuffer,INDICATOR_DATA); + SetIndexBuffer(3,ExtCBuffer,INDICATOR_DATA); + SetIndexBuffer(4,ExtColorBuffer,INDICATOR_COLOR_INDEX); +//--- + IndicatorSetInteger(INDICATOR_DIGITS,_Digits); +//--- sets first bar from what index will be drawn + IndicatorSetString(INDICATOR_SHORTNAME,"Heiken Ashi"); +//--- sets drawing line empty value + PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0.0); + } +//+------------------------------------------------------------------+ +//| Heiken Ashi | +//+------------------------------------------------------------------+ +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[]) + { + int start; +//--- preliminary calculations + if(prev_calculated==0) + { + ExtLBuffer[0]=low[0]; + ExtHBuffer[0]=high[0]; + ExtOBuffer[0]=open[0]; + ExtCBuffer[0]=close[0]; + start=1; + } + else + start=prev_calculated-1; + +//--- the main loop of calculations + for(int i=start; i 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 sF&ty?94fJNkCAifrom_index-range && i>=0; i--) + if(resfrom_index-range && i>=0; i--) + if(res>array[i]) + res=array[i]; +//--- + return(res); + } +//+------------------------------------------------------------------+ diff --git a/BKPS/14031206/Indicators/Examples/MACD.ex5 b/BKPS/14031206/Indicators/Examples/MACD.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..140c8fb14eb6726d989c85554761a1c9cb359271 GIT binary patch literal 13336 zcmdUVbBr%Qkmhg9H?}=*Y}>YN+twS~wr$(?ys>TDb8q)@$?e|%muy!$sjn)PuCJ@o zNhK|!&I0NHfJ6p>0uTTIAiyCg;J>UT1YGs$@gF60HB?fuC2*Sm;`|4Q{=4D7VRr}s z;6FA1015fuTmVtf1m$tlB9L+ISf)jWQ*10caw-bO3pzbfMIC0oUofFS*lNcwZD#)w zCj_tq*aJKOjsOdQ8NeLi3?Kk70_gu!X#P`U1h4?8|5;@KCjYz!00n@{zZmC#$myR| z`k!VDp#ASD{Exx^!PxoV4LAWf0d)Vw?LUPUU;}UfSpQ>A3o!b}*5-ccjeuKrUR`f+=cg0@$vYnZAm{h;GnUmuS6sN(xFX)W(9%3lwL3;(D; z*_e(=!iW{LDV`y{e0g;33UF_*>M^smjX5HUFxZzp?RgQeMM*_`{L&lw$<;TBA z7uDv)C=x^cJjcvfN#i}Xw=X@C#q`A}1Rdzv8mwT{`E)&h|`whB|`^LdU5xY z_)BFmhl<)D9!Ll3Cc3ghb5Yt#y_3^0@1mzkKocUVG`O1iwK-zJnJdWQ!~<@aNQEB} z9);h`q=93Q{75%dQ*0A#@K)yz#Cb~t$j&G}6#P{q2SLRWmcd!W+OHW56GorBI_|;X z$k`!P5H3Q`o;sFSHJ%TNsgGnk4Wmi`#6r@P^0wWgksPWJ4M>f4=HG9s}h=5aX2G*myB2ykNUEx zlPUvRuIU`RN0bfGf-xLMA@k86{86KKwZ7wm%fQ$+3`rX=@og+85H@hY!=+{3`g$v4 zi_%1MUm6GSodhVdSEe-bf*?nBTL`xa)Kr~*hW!C%FtUK#@0Z&7L% z9{8!nI$t|+Q%N^N$*;!IiLlAde=X%d3h^3}&a~I_;a4q0(I-pDGgldk?w4YnzlNn# z=KBh~otzc>1zvP`?Ucpht_QO4+{-r~i&qYTwqsW}zt&rW-l5k7mt(bpxG0CJh*5#; zx&^NTdK#f4pqg8h64y<42$`TIWIwI0JBwxhi3LStMh|g^6Sm^9*@M`I31)>n7*XWf zA!#@@;bFnGwUY|dema82In{L{gz1YzgKV~E{ez$s)O1Gc_zC~+THL}_nvC^8@; z-wI4i`S|J7Mnh%7&02LNt)1R+02{wXvZ)O4yLTF(U0@QYFZl3tzM>6fAnshU8Hjqs z#^4d9xvXT=rTMwZThE#8dvU!l=6x`GIDuU&_i8~ayM%njv_oUhgFtyJ#7EdMt_5Ui z`4Y{t8~{9~mMLySY7cEq?eL$6n>BI+k0)Q%-5;-e)d+jtjUdt6K3>Sm&0 z68yjxsvigI*2d>makMV(XVqS%HWezMmR}YWo+E?1pi%+;liYxrT@)v`n9Hrd@N*0u zH(s$Pj$_hlN2{1*5-7=P+?DGbJ|m&7#9RN^bKe_>XU0vk(S?b8VA<7sr(KJ=7e6X3 zUf6RQmP+{h&ZmwmyNLC3U4fxpVVb!h&6cZ7MK;L8Z)|I{BOP%u#H1i)2s)d>#s7Ro z?BbVtT!fx4oZCcMn?b;Wz*5Sxw5NwUwfIRYoY!u}>j-0?B!&QDv~!AO z^C&|m@y?O~$z}pE#O}zH)1Q&dE#G_cT#=zL1txMQJ45~F1(;yekFIFfSQ8(qmH_e) z@@YS_EVVMGL*WY(73VGfSTdtFZ~r~Js+X`?-?{=BkLxFHulAp$_@wl|>xso?Ya34E zTbUw)%2Owa(>dz*&MJ1@P0!~lBeZ8!B|6-D#FX=$ATRuJNq0&-w%;MM3S|ZIUA6If z${hwo!KrB_aPeAO8Dhm3a1ii=RLh?8mP5m!@=Ix)&>AP5??Xaj&dKezGiaskK+-?n zF!K4R5IyYUjm(CAX3B6OPWh4<#u`Abu$dTsiX-Pr(vr62_^RT^o)H5&lYeD-zSQO> z3}&Wa8E)9cHtQ}%QGz>-rS`vAEUla{ZB>if8YP0t2aE90Kio4DUWJ9s8?%7cq;~W@ zW9vKWyy0FBeB*pMBJVjVp}Pj|iP!4rKCv`6ZmQy@CuZOj=B*gn_Lx(U8WLv@SkPNg zfCEVSF3zyFTbkXZ_WOR7e|N!-b*MU@P;o$#-g?e-qmfl@g0&3;%z$?qVZXrZooP1@ zw7oAny+5*KZ5vGDH;|{S2lel8!q1Q+Up#%bozP$t1kE%r;vC_oPLJq+7juff01RqT zbA9p5mA=(oyDb^SA(dbr+;M7We# zDSXBdI8eBLh4Zt0kl$_4$Ppb1vat^aA2p!xLt;VT5(kZn+CauPonJWMf55N#y{DZr_hy+`-idHo4IOf6fHrIq)ua;!Z*eg;tk$Lw z0e&~G=}m*7Li{F57S`7}Bl$a0&{?AF)8h)4C>ArJCwfYqueOdC2@)=QujN}PEl8Z!5bW049f%q-#it+C29B=LuR{XIeB zoyZb}(3CN%K=5MC9srd%IIQnO*)LX8L;>gFD)PTFb+DZs^ozjq7eH~bpd!KemH1nt0=dX6e1!lZYjc2zE zR(O0b7Px_cnBV0sPVu9`q}VfJ%1Qk6laoiDyT*|9_413p5xkR5zBpFUl8Mhfl;rqA zx|F$7O+K8So^akm$3AMsbb@!YLsc5RmeXRgV_mESBH^pVU|{f?);f|xd6wU5AJcg$ zji>cB&>N1_Yg-PK#S%Z96F7>6i}(u%cDtLTm6tj07K8$Te!_V$Qn(;Bbi-@oFeJ=y zw7pzSKmgYa+$K#EMx_|flj`!u_|J~7NL$*i1S`l;h%AJDT}P$uG!Vq)OvN&znJOi` zNv}!xm}>-2qKrHVNKXk=63!G|O+j*Mq5?m?hE~=y+@K{pCgOIu%DZHBml+^VWBuWs z)8EPwE)5y^%)qf`EPkHbno|(?;ttPmkh{Kx9I<|pRZZe9Cq7+tZ@g)mr?c&AQDbOd z4CZtvvv+x1Ax?y>3ZZs02-cRl0+%lLjB9`wkZBWF{$636kGG%4R`kav=2Ljc!-`DS z*v8S?LRYFm1t`NgNVpw;ed3(c0L09|3J4Y#-JcU-XKQi~EbXIDi@jz)PGlRG$qvy2 z?NI8V;8)s7n+v4GD`VeywVZ&M(%Tz@Om5PWP;CCB<%+egK;Vf_)cOU;v&aL~U>oP} z5Vmw3-P&F6<)wRM*6_1&R_WVPwD&hwwRjwb-;}f-ExC|GKiHZl#m5K3K8mG}fv=4} z1xWWw6&nNFT+8A;N3Wwppkm-0+kLzEUvJ;eOnW+~K93Jmx- z@jtPKz(pxy%9cmL9t|h49Sxs;XP$-mVAV>JlpPw+SKSmB)Zf}V0~e1`W!7xHrDsyc z6MXcHtP)Dik44`MK#CO4= zK2jb8FR#I_?=%_y(sx|;Ld|$k3S|Gh?N;;#9QfMFixypPmolACUP5_?NG$~g|k}K&;1M24E)@Xm8D>? zUvfDhX+IiLt~yJbNG%5`CwP0vUB70r9@ae z$iM@;&7V^qdL07?H5bW(m@p%UC-2ZjIV|w#o3z7+wuX4t>pIX0k40?zbZbg4&xnI< zhm9tvZ%JU35{P^&Eg56V10S{hwA=V=$=zXo>_QSDh33mjOq!yGudDi#I6SPD0?9$0 zZA0O8(f56AV15#`Gzy6t=X zPVtP#nj~cMZdnxI;_iTd0i~uFRw+YrMK|9CE(ArQoN|20qt2Q67>&HBh}G!<+GIYk z%2{w-CuZ+?w(yw?CSX3$*KIj>oEAMz7W&#TKvtrj(nP?rM|5uc_Di~=W4KF=9r%oB zfyl{W*PB)ZjrkKKB}yaUBGSY*bzXt(gQ7(-0B&0|y`a^PY?%aPL6getmeNGI^m}Je z(8CU_Jri&0&|Ec#>z=-iZ^9y`3S6H>KnVFn*Wx~lKR}T&V0;i@Pw6xEp!i*1SaU)@9B+#(5;61Df-?A1(r@$)BHx@*GK9AYaeM4BtJ^i9L7tYZ~!hW;B-&5MyZjhhP8Wz`Z#Wem}F ze>Jq$Pl8Kqa)nQ!yKK)PHJd%#sE@F{;xdg~1(DFKk!D}cDoB~)`84@9c$baNw4x=N zds#NPy27eJMIF?^v8Tyau4@fRolN!(iOnT4ubV6|Hl&{RI$NJAo3JjwgOjpelR12d zytXVst?X7!vBz;lZ2m^@-@^OSMD=LWgS}^vb$Vi*?GuWH1ScT22b7@;4m3gn@)n%B zj7&c|g4atpWTa?C&cu3B4oqPmV6mVRyk#}q-MnHRo_84qS+m(X z@gh$yh8IYq5;<0%m#=ah4?i)vw=2w0c2D}_e1Z+5k)>HTZh1%q-SiBG-}*vV-o z^D)iD7W~kEv>NGH1`tP65zB-Z8QaXRURz?H>eK{DQv$svj0iru;Xjw?bW77O zQ9qA9Howfq6$PhLoRH>pb1g0UIm9`}(tg9saDDd#qsuBY>CEZy($u6f%|0ybzAS5X zL@d`!reGEw;lPPu&l6f`)yDkEn5`6iIT86Z4i2uvjKH0?*>Eo^NXNW0HqoU$HwCu} zaaamVezjv}-CrSSbRNXQs}zh_Fz*)EF|Z}VZaJig6mcY zRgT&Qr<%KFg{(lNmHS4=4h@7~UBx?LPb0u--v(rfe*leISw}&UT>8~v=uSBsIk$Xc zLlmnus`5m42yp?(J+gMh*~3?`-k1)q5_X&dKQ3;U0@m-QzR>A1d}jz{IiFGN+xzfr z5Px{)htMKqG&gYPeWDs1?t$K7zolD$2Ai-o;`qCn_=a=Q_E6*r2_?w0Rj&ej##fVIB!+jmUtP11o7Gb^!{YdYY?&Fy_%(~Y4uFaH4|C`VRDHq%*f$P3qN zkfjecY<}=b+SBxNSvCx8_p&z=9rl zKKQ-GQh(-e&=M2{C-Ck@HR&%YBAI;JLfyBeBkUz!;eiyKcH1AAF<)l9Ehrf)A2&Y| zyO%q=j8(y!)>lC>sLDG@GNhnz8!$W60@Tdm0ZS-`xm^k#AMriJ59OTiz#EuksMkNB zU8h;*Zj7X6xP=eR=2AHhlTW<^<0~eo+YJWS%fi`!@znwBAceMHqoJ-uMcAL5_9y#< z$59V(hrDbUuZbF@Phh)JElsi!IGRB+?F)yv(Endul!*O$bP0v~Bxc zEF3X4DrZOxN$Kg&la20f2CK*Zwu(OKno-M*$b;ZEzSsVjJ-J}VDSk9X&~*h&^pn|Z zc4Da)h96b{1OXatw7q;>rl8f*0ikNzLJAbnk!S0T4IX<*r?v_{F00D3_o5g~T-Bclj!A zP}c0I-DzMl)fw)xVc;-RNot#WC-kqME5=ghyK5xrpL5M`8j={)eX0tR;j;ynQDx>_ zWtIipZpCvBQXSUplIR*J!3}pGTL-L*o|PviW^FJU|KlEeMRBuSv_j%IEv zNgvMwyL?8%C(Qn6Wh7P%u0Aiq8S-c32M#cV3|s3(mHvS|<0r;?-5H~2c?g~obYG5& zTT21411bCcbpqwxpelA>>Sz@K4BpnwaI?vbaB60d(p>ethkKGnxFh7{>k(R`>3i*! zqR!54o9Z8L>4lX!V4>UCVsXLRTUhan3Pm0&tGj%DBKit9JtYJF?YQGKZ4l5-$?4{tkW=IKR!zeV?fE_=_B6RDA>}LyMP4_ioc&aRmSRpKHTTFiai*4pDRr}^VUhQgLcjgo>^?+D*IE13oUp>ocr}YN{Fv^|cVzr+%%1eU zrjscoy`vr2>vif3M05p13p zHrkeMRYg>s$O18n-=8*U@kKEuh8Fsz8=$vT9EIw6 zGQY?a)T@bT3HJ%Tk*y6mR8KSIf=<8f1~ts0B5)W>^qL(QwKXap+Z|Q;fe0yEEijlM z^*%y?`{{>sJ?=;@7?xl{GGd*t;xnmsMqk5!mFCKC<{e^&Je54~+p$TwSJPbCt-TyW z3;#Ntc{6EJZHI!E495||KpDU3!{B4xIe2kTv+i@YC(xLO_G4`*<;cSuc|1Etx5$`9 z5^^fLVrZ@I0D`Pv?-13ylt;Opn3lKpYW3YwQXg>yuJ58%(r5YkOl}J4104_b^_#G6 z0pacbBQV>nRHbXYJdg1w#sA)_y4$3NuM?agzL~<$edn2v)P%Q>0mXh9LU60PM&&0J z4ckcVo(94ATJDdV#atpn_Pbk60=$@r z%zR1tn&f&ZvJ66`LX7gUTmz<5IKA@fSCm|aWKOL&@2H_ntODHX zb@U2pir~`-M+&fyHUseTxcVPqMrbd8G9=Dv50Wgyxi%uN7Re#4--!8Z{kX%EUg9xPywUV`9@1`zBM(A_puNwA&TnqMsM-3ozTK={x zgbz?e&m6`roqk&<)1iJ|Kha0X`282-Aq|RaED0S^huAH@uQLf{Ecnp`24-`vFo71j zp4IU!YjWo%6RZ-&i@;p_2_STp4wbM!ch(A@6u#LanI=v3Bcj9-nJ*<|AhdI@I~)w_ z$281awy~&Mz{*!5jV|vN1)2hiAv>l1J4UgPtugfcuItE#V`dVi*MGag6+FoA<|-NX zZ-o8g8l90P@S1#dv{42WYmzKENjX=D`81k5ecc7$H=z1&#VNTNef{)n5dQL?qL^u9po+U2inH;@kTR>c# zC}j@Az>sg0wfm^5bQD<)qRPyOzc{nEQWJgG{4Bf?LlQ8VDNnhuCy|GU70GDthHwN+ zW%7e2nUS+f@a@^L1yd~yNmeMhLNP0818MQVkCo%g;9UxlU+5^ru5;5c`o_$Yd1fXE zh~VL?@r0qVn{fIL7A+I)e0lb%w$_rDfAEe0QfVqyNq2(T->fBD%`x7XK&6=MuKx#po&49oE(scKV!Zt)oJ(zYG0a2=^eY+}MZU8nN zxkNEMsE91{`8jE!6gL#rClk_m1vk1fSh?LtQJ>I~<>JnqGILcYt{{`46U7XwJ0}~b z$D$F-|7;)Yf6f&hYT-BXT)~m(KR791rpQgPF+ul1_~o}}X53%0Z^r82#KxxzD};iU zfL?Pq^dL^&sHAWgMhho$>=B%1XqEYBEr9e`}=~2jV(Z0Axid|wyVA4 zaS%K-j>JK5#2xCwgxdXZN`^#mR#|N&r-|AvI2Ato5ZO1R38UTssLOQ6OR;pixzeo zj#(?RC?9IQO8!QnJJ+{3LpDO-0v!7$*HRdl`^wys;IAbTE)H&eK#Ihh8%UUF=A3nj zC~49KZ5+cKD{KXunCFE*I5HOkG!q79$A9rB>=R-toGc}=Blx5~qi0K=!E;sl$F_EA zCOOWt1s`MJ>W#ufwY21JmSVBmx{4s|Y%+Yl-6wm&w~~?dAex<=J1DYD;DgG+hZhbleCI1% zG<@aBMcZT-*>%t;Nhe<|B}*53QtK|WyQ&CXF9X*@O!WhnEDk`*gV3pRz$-Lxp@peF z_sAJ)bnneEEl-8hkKVrNWM3Bx0L;~N1{oZ@>XJrQfdVAQY({mLQ^Kxkq#pKB1`U&K z#jE|~cuMlFxMRELwG7*hU3 z<>~0Qik13kfR$8{m8+L``Y{5Jy^O>->xcp^O>~J&Wd&s^VNZ|Pc0O1v{mSta zD8e?~ca359hZ|G$+s+OykjZ%tti-(bJ{sWC=n4-*5m%DE5OHaRcI2aZ7qm5}n*FUlvAQw)ejfy2mVDNtv!ke-lGY#)xKtOnYMnEe5ot z-daSrUeZ6e8CE%1>6k^3JJMQ~HR*Gs&*8=D4`*#xATYz%)dn$iWP9I599wEzrS`^K zq`%W8Pck|9&pa~;&EWLk6nX=|T^bM~Usl`!Ml0vQlKOOzg@S7i2LjGdE4CM8`!Sk3 z7Q|%{8{xVJvQ|FL+1^Pgi>iIw(|1&llO@8FydRSqf7)9R&^PQS@|K{)6+ggbRj-qo zPpNbb&t(Y5n-&h@RD)&+*!`qxf0SYux1RhXI-Kyqio zyHDCV9HS}+kfs8uO629F+TY;c?ANnIiS+TV4{IINcl+@K>C2SS6IO1FW+1LK=3B9G ze$~OGrKu&;_a|aMwn;5%yrCBaUza|@mff9UZpK(V)eq0caF1?t-I)HJn+kLfGsC8> zQ$TV%Z2=nAOIOIEd!Z#;f_-9nF&dH6^q?+AI+NdMTU|Urb9-BiInWfryk; zP&)mE!RP>@`7lI2R<}V0i}Et>p|K__A12*FgNwWDV$>>kI7l(Lt;9@%u<}&i8ZMwD zsU;*U+-ja8f)jKr$@ew#au+IoTE@%=OAF8WnD@cR^TaaE;x} zvJd~5s+24n^%fJNjr=2aVa^5@^jV?wi>6E-oQmVyFJNTdnk;z4FRxtvNWVeSSESLJ z@Z7dSnLUQ`o*S<-dt2I#eMqju3`RLv2`JOC_knDD*TCr4teXdlgXd-qv}~^8vLnKq z3YkMW9m2Db?4wGDZEQ1?5Y%Z%^_wY8=!X1(G^Oo$5YFHD*%cO} zKz0ndHbpKazpW}{7ZhX7NI(fB+4U_{oWE|Dx?S>yYGq+?BxYV+W;|<$NdnoRDCtCk z=c3*q^Txj)66Dz!k~eDij;L3dy6pF@+qIUS=@4QrKifXHiB7)rAm}KQQ`Q<6&_~j?KsMne z8=dBLnZT;^xV~~(c6jje4D*_ud|&fSt|omb5Y$il5b_4c=Vk{= zFzV(&Ez@Q>ToGGzlDJPHf?^Ahp|Qc^C+a$fA1Zmj4V zkFVuO$EG`RQ@;X)>ooKDiK*8tWC8d`k5G#tc?u1LfbbP)nS*JXPMG;CnZT=F0 zKACs8i9JYl@8PqOA8K-$KI{MzXQp{M?Ww=tc*5V+SWPpR3fV8>panh(Xvg9e&ZvlF z$uEdd-hrt|-Z07}w6s*?4%wbspPlo`HxEHqgS-oY)z>gH3Lm7yrFA-&^B_d0FR&}& zh04t&AW`eTwC{z#g>wF0-;>uT9BVz%L#K&o9J~`c#IL`%BJi;5&Qrf%*b+d6B!W;1 zBl7THYdtZ_Hv?%@n1cGr*~?&fi5&00n2znQ%P7+aKihJ{YG^#fN4BCqlOH#_Ev=2x zw=!00S6=E9_gmE~u<^fyTI2D6Ad%k}_1Mkv;gvr9cKh|B<};mG+jy!-LK^4R7>zx) zY3ft-h@#`enb>D#ha1{su$86qHx+_bgWFI6Kt0m8&E(hht5ZXVA>E=Dal<>TZH)Z+ z#?T^oQex7CSx>J?F{Z;swaMwRXl;%)$9P8_%A^EqOXh`Vt9Q%=>^!S8Aga1By=>n=#zZcL8 zo~QDro+$RP=FS1k*crMViyLZAFV=y%UOx@r-eR>q5^VM0Y;^gjXUn$wygCs1_A))2 zBB(yE?#1ANG{aI4krgOIwE12YP+>?tN2#{N?wo>3_>N^2d&PLfxMpU{V?vq3*PR~d!U~+z1qiNq1l^!^%LH)k|LP`>a>y_`FR-Fd??inGY z@u8E#QFtB;dss(1aw1^v`uibe*S3~&gM-df2jhTZOx({W-8Fa($9$a)UDUHF5Pib_ zm|!CSzRaFs3j)xo1Xlu@>WbtIiGns6&>!*n;58`XY#VN87-AWn0s=-7dsG@8TFVG~~nl z)*76rrH5r@RqXj7zNP9T5J*d8b56)l-`z5dhalstS8bL-EJ+{-*4?*!OFekPNti4u z5t%l)VbG$07%9EXhB|;y)Og4aY~6}vF^F5dj`ZZJI6N(vRRVvtn1SCReZ)p8i@lo! z@&M^g97@Ei+DI=Whf0s;syTkANO+sJcW?K2$FTT2m1X;q*gcnSp=Ec9N+bcrok53zWi?e<|cU2F6?*(|dQ^U(_KZYewS6y?y#xIkOx0w^tST%7-}{{LHCf>?K1%M+b1q?vzb zP|@a6x>&V9;I$XDn8;AuMa`t^TXdEVp4YL;6Mn#a8&<}8!~rVo!4l%bF}`YNk_y`bS>yl)w;d7$iur8gz&fStFCX++Z?U(3 z;m_R6y)FFb2=vR_UAxbt8btFA!BkKh=y|G}c78~AVm^{m z=?|(fM)t>ori|TS3lrXV=~yeON80r9i22gnzMSb5=o}x8w%8+H6XE*@dZEl$CBa5j9O1>(HHg6 z5;~u{pJcxsFcoYzF8lSWYK$K))IxdVYcOi>tRvuF3=wpmCHkL&WaSJDh5qW*tO0Ep z$by+m_MmRKTAAOUboU3saJ7+dwp;uhRgE`F^~BlMsj2;XnWI4_gMW<3`Guc!Npktm zkaSHb(uK})o*vOkqj-&|IOQ-V4wHFxGb#G+1y=eA#Zq-Vd>U}BZ!`sb)Q%EL=*4V% zw#mgnbt2+hmzmPJQTfoYf2ZY6oFhzl9Q$Xq;aUu$%-Krd9=Bk4ik=+2nvEZ9)QfG- z^o`bkFH=xA!wvi71NgUf!W}m|{J;XHmro1RpY=4sFt(jP@M#-DEdm-dq(CyCsH99y zCGnrj>HRt=7GAUCY{~BDm2p{GdMRoFJ1dZ!)}}dJ3QD4A>7^Z`RK`jCxtuT}G8oe+ zAvEr+zm(^+cI0K`k31su>22I&zdnBdf%WofAliDh(DWErk$$8^Tq65zJJ~)Rz~O#b zi$4xu8=oPz(qkX1V(KOOdS$?)#MA}NBTY0#T@B1uCFg~Od{J(vJfGLV!CgfisI3{? zeRhW3GqXIHjz-BQS$2Xrh|?W5Hjycr3R3sf9bP5Jl45!BojA87XfD3>TyF|7_Z}(_P4`ZA6JPM~V_2VD9Y-H8m z-M5xN{Y*O3Q8t}UNL=Obt1x|cwlcVR2bOFzN2~~V8N=S zo8`##gtAby(3(1>)VCsmkrBqb_N4~VvkR2|JmR{9C{(Hk@f@AI;-uS@wu`@QK`@eb zw>0D7$IO_cj=t7o!TQ&AyZo$P3VP5mNy;VGVNv~5U*8t;QD#pCEduI(vj`;|P)2c) z^&6~NeD-tkx4_X>7OqD7wj=^YJUXg!dWSxxK`kC69$f_n;SecuZHpv7l?O%28*kvV z2@C~!zQnjdoKq~Mu9)0D`&^x=tAa2~#!^aR<<8iR_- z)?BD6$Kg~kiWanot|V+ED~>%SchZL6Cl3b^<$*2;83mRbAuZX3m%^$yfb{CH!_Mb} mn8=BZVzMeci`ql%S;^+uS@VVWG@fd-O#I08-&!rWMgK3dPUHvx literal 0 HcmV?d00001 diff --git a/BKPS/14031206/Indicators/Examples/MACD.mq5 b/BKPS/14031206/Indicators/Examples/MACD.mq5 new file mode 100644 index 0000000..ebd06fc --- /dev/null +++ b/BKPS/14031206/Indicators/Examples/MACD.mq5 @@ -0,0 +1,123 @@ +//+------------------------------------------------------------------+ +//| MACD.mq5 | +//| Copyright 2000-2025, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2000-2025, MetaQuotes Ltd." +#property link "https://www.mql5.com" +#property description "Moving Average Convergence/Divergence" +#include +//--- indicator settings +#property indicator_separate_window +#property indicator_buffers 4 +#property indicator_plots 2 +#property indicator_type1 DRAW_HISTOGRAM +#property indicator_type2 DRAW_LINE +#property indicator_color1 Silver +#property indicator_color2 Red +#property indicator_width1 2 +#property indicator_width2 1 +#property indicator_label1 "MACD" +#property indicator_label2 "Signal" +//--- input parameters +input int InpFastEMA=12; // Fast EMA period +input int InpSlowEMA=26; // Slow EMA period +input int InpSignalSMA=9; // Signal SMA period +input ENUM_APPLIED_PRICE InpAppliedPrice=PRICE_CLOSE; // Applied price +//--- indicator buffers +double ExtMacdBuffer[]; +double ExtSignalBuffer[]; +double ExtFastMaBuffer[]; +double ExtSlowMaBuffer[]; + +int ExtFastMaHandle; +int ExtSlowMaHandle; +//+------------------------------------------------------------------+ +//| Custom indicator initialization function | +//+------------------------------------------------------------------+ +void OnInit() + { +//--- indicator buffers mapping + SetIndexBuffer(0,ExtMacdBuffer,INDICATOR_DATA); + SetIndexBuffer(1,ExtSignalBuffer,INDICATOR_DATA); + SetIndexBuffer(2,ExtFastMaBuffer,INDICATOR_CALCULATIONS); + SetIndexBuffer(3,ExtSlowMaBuffer,INDICATOR_CALCULATIONS); +//--- sets first bar from what index will be drawn + PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,InpSignalSMA-1); +//--- name for indicator subwindow label + string short_name=StringFormat("MACD(%d,%d,%d)",InpFastEMA,InpSlowEMA,InpSignalSMA); + IndicatorSetString(INDICATOR_SHORTNAME,short_name); +//--- get MA handles + ExtFastMaHandle=iMA(NULL,0,InpFastEMA,0,MODE_EMA,InpAppliedPrice); + ExtSlowMaHandle=iMA(NULL,0,InpSlowEMA,0,MODE_EMA,InpAppliedPrice); + } +//+------------------------------------------------------------------+ +//| Moving Averages Convergence/Divergence | +//+------------------------------------------------------------------+ +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[]) + { + if(rates_totalrates_total || prev_calculated<0) + to_copy=rates_total; + else + { + to_copy=rates_total-prev_calculated; + if(prev_calculated>0) + to_copy++; + } +//--- get Fast EMA buffer + if(IsStopped()) // checking for stop flag + return(0); + if(CopyBuffer(ExtFastMaHandle,0,0,to_copy,ExtFastMaBuffer)<=0) + { + Print("Getting fast EMA is failed! Error ",GetLastError()); + return(0); + } +//--- get SlowSMA buffer + if(IsStopped()) // checking for stop flag + return(0); + if(CopyBuffer(ExtSlowMaHandle,0,0,to_copy,ExtSlowMaBuffer)<=0) + { + Print("Getting slow SMA is failed! Error ",GetLastError()); + return(0); + } +//--- + int start; + if(prev_calculated==0) + start=0; + else + start=prev_calculated-1; +//--- calculate MACD + for(int i=start; iJ1v{GZYD|GQ8L$TA6j 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 literal 0 HcmV?d00001 diff --git a/BKPS/14031206/Indicators/Examples/MFI.mq5 b/BKPS/14031206/Indicators/Examples/MFI.mq5 new file mode 100644 index 0000000..e70f1e0 --- /dev/null +++ b/BKPS/14031206/Indicators/Examples/MFI.mq5 @@ -0,0 +1,120 @@ +//+------------------------------------------------------------------+ +//| MFI.mq5 | +//| Copyright 2000-2025, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2000-2025, MetaQuotes Ltd." +#property link "https://www.mql5.com" +#property description "Money Flow Index" +//--- indicator settings +#property indicator_separate_window +#property indicator_buffers 1 +#property indicator_plots 1 +#property indicator_type1 DRAW_LINE +#property indicator_color1 DodgerBlue +#property indicator_maximum 100.0 +#property indicator_minimum 0.0 +#property indicator_level1 20.0 +#property indicator_level2 80.0 +#property indicator_levelcolor Silver +#property indicator_levelstyle 2 +#property indicator_levelwidth 1 +//--- input parameters +input int InpMFIPeriod=14; // Period +input ENUM_APPLIED_VOLUME InpVolumeType=VOLUME_TICK; // Volumes +//--- indicator buffer +double ExtMFIBuffer[]; + +int ExtMFIPeriod; +//+------------------------------------------------------------------+ +//| Money Flow Index initialization function | +//+------------------------------------------------------------------+ +void OnInit() + { +//--- check for input value + if(InpMFIPeriod<=0) + { + ExtMFIPeriod=14; + Print("Parameter InpMFIPeriod has wrong value. Indicator will use value ",ExtMFIPeriod); + } + else + ExtMFIPeriod=InpMFIPeriod; +//--- indicator buffer + SetIndexBuffer(0,ExtMFIBuffer); +//--- name for DataWindow and indicator subwindow label + IndicatorSetString(INDICATOR_SHORTNAME,"MFI("+string(ExtMFIPeriod)+")"); +//--- set draw begin + PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,ExtMFIPeriod); +//--- set indicator digits + IndicatorSetInteger(INDICATOR_DIGITS,_Digits); + } +//+------------------------------------------------------------------+ +//| Money Flow Index | +//+------------------------------------------------------------------+ +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[]) + { + if(rates_totalprevious_tp) + positive+=volume[index+1]*current_tp; + if(current_tp1H}K6_#fB<0s#2m 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⋘tvfkrYZy8%}1L-z}OV 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 literal 0 HcmV?d00001 diff --git a/BKPS/14031206/Indicators/Examples/MI.mq5 b/BKPS/14031206/Indicators/Examples/MI.mq5 new file mode 100644 index 0000000..e762a07 --- /dev/null +++ b/BKPS/14031206/Indicators/Examples/MI.mq5 @@ -0,0 +1,122 @@ +//+------------------------------------------------------------------+ +//| MI.mq5 | +//| Copyright 2000-2025, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2000-2025, MetaQuotes Ltd." +#property link "https://www.mql5.com" +#property description "Mass Index" +#include +//--- indicator settings +#property indicator_separate_window +#property indicator_buffers 4 +#property indicator_plots 1 +#property indicator_type1 DRAW_LINE +#property indicator_color1 DodgerBlue +#property indicator_level1 27 +#property indicator_level2 26.5 +#property indicator_levelcolor DarkGray +//--- input parametrs +input int InpPeriodEMA=9; // First EMA period +input int InpSecondPeriodEMA=9; // Second EMA period +input int InpSumPeriod=25; // Mass period +//--- indicator buffers +double ExtHLBuffer[]; +double ExtEHLBuffer[]; +double ExtEEHLBuffer[]; +double ExtMIBuffer[]; + +int ExtPeriodEMA; +int ExtSecondPeriodEMA; +int ExtSumPeriod; +//+------------------------------------------------------------------+ +//| MI initialization function | +//+------------------------------------------------------------------+ +void OnInit() + { +//--- check input variables + if(InpPeriodEMA<=0) + { + ExtPeriodEMA=9; + PrintFormat("Incorrect value for input variable InpPeriodEMA=%d. Indicator will use value=%d for calculations.", + InpPeriodEMA,ExtPeriodEMA); + } + else + ExtPeriodEMA=InpPeriodEMA; + if(InpSecondPeriodEMA<=0) + { + ExtSecondPeriodEMA=9; + PrintFormat("Incorrect value for input variable InpSecondPeriodEMA=%d. Indicator will use value=%d for calculations.", + InpSecondPeriodEMA,ExtSecondPeriodEMA); + } + else + ExtSecondPeriodEMA=InpSecondPeriodEMA; + if(InpSumPeriod<=0) + { + ExtSumPeriod=25; + PrintFormat("Incorrect value for input variable PeriodSum=%d. Indicator will use value=%d for calculations.", + InpSumPeriod,ExtSumPeriod); + } + else + ExtSumPeriod=InpSumPeriod; +//--- define buffers + SetIndexBuffer(0,ExtMIBuffer); + SetIndexBuffer(1,ExtEHLBuffer,INDICATOR_CALCULATIONS); + SetIndexBuffer(2,ExtEEHLBuffer,INDICATOR_CALCULATIONS); + SetIndexBuffer(3,ExtHLBuffer,INDICATOR_CALCULATIONS); +//--- number of digits of indicator value + IndicatorSetInteger(INDICATOR_DIGITS,2); +//--- name for DataWindow and indicator subwindow label + IndicatorSetString(INDICATOR_SHORTNAME,"Mass Index("+string(ExtPeriodEMA)+","+string(ExtSecondPeriodEMA)+","+string(ExtSumPeriod)+")"); + PlotIndexSetString(0,PLOT_LABEL,"MI("+string(ExtPeriodEMA)+","+string(ExtSecondPeriodEMA)+","+string(ExtSumPeriod)+")"); +//--- indexes draw begin settings + PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,ExtPeriodEMA+ExtSecondPeriodEMA+ExtSumPeriod-3); + } +//+------------------------------------------------------------------+ +//| Mass Index | +//+------------------------------------------------------------------+ +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[]) + { + int pos_mi=ExtSumPeriod+ExtPeriodEMA+ExtSecondPeriodEMA-3; + if(rates_total=pos_mi) + { + for(int j=0; jLog{<~raZ~++qsqz4`f36Wg3E=jx$Mqj` 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 literal 0 HcmV?d00001 diff --git a/BKPS/14031206/Indicators/Examples/MarketFacilitationIndex.mq5 b/BKPS/14031206/Indicators/Examples/MarketFacilitationIndex.mq5 new file mode 100644 index 0000000..155568d --- /dev/null +++ b/BKPS/14031206/Indicators/Examples/MarketFacilitationIndex.mq5 @@ -0,0 +1,151 @@ +//+------------------------------------------------------------------+ +//| MarketFacilitationIndex.mq5 | +//| Copyright 2000-2025, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2000-2025, MetaQuotes Ltd." +#property link "https://www.mql5.com" +//--- indicator settings +#property indicator_separate_window +#property indicator_buffers 2 +#property indicator_plots 1 +#property indicator_type1 DRAW_COLOR_HISTOGRAM +#property indicator_color1 Lime,SaddleBrown,Blue,Pink +#property indicator_width1 2 +//--- input parameter +input ENUM_APPLIED_VOLUME InpVolumeType=VOLUME_TICK; // Volumes +//--- indicator buffers +double ExtMFIBuffer[]; +double ExtColorBuffer[]; +//+------------------------------------------------------------------+ +//| Custom indicator initialization function | +//+------------------------------------------------------------------+ +void OnInit() + { +//--- indicator buffers mapping + SetIndexBuffer(0,ExtMFIBuffer,INDICATOR_DATA); + SetIndexBuffer(1,ExtColorBuffer,INDICATOR_COLOR_INDEX); +//--- name for DataWindow + IndicatorSetString(INDICATOR_SHORTNAME,"BWMFI"); +//--- set accuracy + IndicatorSetInteger(INDICATOR_DIGITS,_Digits); + } +//+------------------------------------------------------------------+ +//| Custom indicator iteration function | +//+------------------------------------------------------------------+ +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[]) + { + int start=0; +//--- + if(start1) + { + datetime ctm=TimeTradeServer(),lasttm=time[rates_total-1],nexttm=lasttm+datetime(PeriodSeconds()); + if(ctm=lasttm && nexttm!=lasttm) + { + double correction_koef=double(1+ctm-lasttm)/double(nexttm-lasttm); + ExtMFIBuffer[rates_total-1]*=correction_koef; + } + } +//--- + return(rates_total); + } +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void CalculateMFI(const int start,const int rates_total, + const double &high[], + const double &low[], + const long &volume[]) + { + int i=start; + bool mfi_up=true,vol_up=true; +//--- calculate first values of mfi_up and vol_up + if(i>0) + { + int n=i; + while(n>0) + { + if(ExtMFIBuffer[n]>ExtMFIBuffer[n-1]) + { + mfi_up=true; + break; + } + if(ExtMFIBuffer[n]0) + { + if(volume[n]>volume[n-1]) + { + vol_up=true; + break; + } + if(volume[n]0) + ExtMFIBuffer[i]=ExtMFIBuffer[i-1]; + else + ExtMFIBuffer[i]=0; + } + else + ExtMFIBuffer[i]=(high[i]-low[i])/_Point/volume[i]; + //--- calculate changes + if(i>0) + { + if(ExtMFIBuffer[i]>ExtMFIBuffer[i-1]) + mfi_up=true; + if(ExtMFIBuffer[i]volume[i-1]) + vol_up=true; + if(volume[i]^0yU!1JtM2aFRja#e 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 PrA*C0>Xz6FrDFU)7}*TZ literal 0 HcmV?d00001 diff --git a/BKPS/14031206/Indicators/Examples/Momentum.mq5 b/BKPS/14031206/Indicators/Examples/Momentum.mq5 new file mode 100644 index 0000000..7423907 --- /dev/null +++ b/BKPS/14031206/Indicators/Examples/Momentum.mq5 @@ -0,0 +1,68 @@ +//+------------------------------------------------------------------+ +//| Momentum.mq5 | +//| Copyright 2000-2025, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2000-2025, MetaQuotes Ltd." +#property link "https://www.mql5.com" +//--- indicator settings +#property indicator_separate_window +#property indicator_buffers 1 +#property indicator_plots 1 +#property indicator_type1 DRAW_LINE +#property indicator_color1 DodgerBlue +//--- input parameters +input int InpMomentumPeriod=14; // Period +//--- indicator buffer +double ExtMomentumBuffer[]; + +int ExtMomentumPeriod; +//+------------------------------------------------------------------+ +//| Custom indicator initialization function | +//+------------------------------------------------------------------+ +void OnInit() + { +//--- check for input value + if(InpMomentumPeriod<0) + { + ExtMomentumPeriod=14; + Print("Input parameter InpMomentumPeriod has wrong value. Indicator will use value ",ExtMomentumPeriod); + } + else + ExtMomentumPeriod=InpMomentumPeriod; +//--- buffers + SetIndexBuffer(0,ExtMomentumBuffer,INDICATOR_DATA); +//--- name for DataWindow and indicator subwindow label + IndicatorSetString(INDICATOR_SHORTNAME,"Momentum("+string(ExtMomentumPeriod)+")"); +//--- sets first bar from what index will be drawn + PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,ExtMomentumPeriod-1); +//--- sets drawing line empty value + PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0.0); +//--- digits + IndicatorSetInteger(INDICATOR_DIGITS,2); + } +//+------------------------------------------------------------------+ +//| Momentum | +//+------------------------------------------------------------------+ +int OnCalculate(const int rates_total, + const int prev_calculated, + const int begin, + const double &price[]) + { + int start_position=(ExtMomentumPeriod-1)+begin; + if(rates_total0) + PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,start_position+(ExtMomentumPeriod-1)); +//--- start working, detect position + int pos=prev_calculated-1; + if(posX!HMP+BB`d=i@u2AcW&R_y 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 Nyo^K%J>kaozW_7z2>Sp4 literal 0 HcmV?d00001 diff --git a/BKPS/14031206/Indicators/Examples/OBV.mq5 b/BKPS/14031206/Indicators/Examples/OBV.mq5 new file mode 100644 index 0000000..1f7c661 --- /dev/null +++ b/BKPS/14031206/Indicators/Examples/OBV.mq5 @@ -0,0 +1,90 @@ +//+------------------------------------------------------------------+ +//| OBV.mq5 | +//| Copyright 2000-2025, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2000-2025, MetaQuotes Ltd." +#property link "https://www.mql5.com" +#property description "On Balance vol" +//--- indicator settings +#property indicator_separate_window +#property indicator_buffers 1 +#property indicator_plots 1 +#property indicator_type1 DRAW_LINE +#property indicator_color1 DodgerBlue +#property indicator_label1 "OBV" +//--- input parametrs +input ENUM_APPLIED_VOLUME InpVolumeType=VOLUME_TICK; // Volumes +//--- indicator buffer +double ExtOBVBuffer[]; +//+------------------------------------------------------------------+ +//| On Balance vol initialization function | +//+------------------------------------------------------------------+ +void OnInit() + { +//--- define indicator buffer + SetIndexBuffer(0,ExtOBVBuffer); +//--- set indicator digits + IndicatorSetInteger(INDICATOR_DIGITS,0); + } +//+------------------------------------------------------------------+ +//| On Balance vol | +//+------------------------------------------------------------------+ +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[]) + { + if(rates_total<2) + return(0); +//--- starting calculation + int pos=prev_calculated-1; +//--- correct position, when it's first iteration + if(pos<1) + { + pos=1; + if(InpVolumeType==VOLUME_TICK) + ExtOBVBuffer[0]=(double)tick_volume[0]; + else + ExtOBVBuffer[0]=(double)volume[0]; + } +//--- main cycle + if(InpVolumeType==VOLUME_TICK) + CalculateOBV(pos,rates_total,close,tick_volume); + else + CalculateOBV(pos,rates_total,close,volume); +//--- OnCalculate done. Return new prev_calculated. + return(rates_total); + } +//+------------------------------------------------------------------+ +//| Calculate OBV by volume argument | +//+------------------------------------------------------------------+ +void CalculateOBV(int start_pos, + int rates_total, + const double& close[], + const long& volume[]) + { + for(int i=start_pos; iprev_close) + ExtOBVBuffer[i]=ExtOBVBuffer[i-1]+vol; + else + ExtOBVBuffer[i]=ExtOBVBuffer[i-1]; + } + } + } +//+------------------------------------------------------------------+ diff --git a/BKPS/14031206/Indicators/Examples/OsMA.ex5 b/BKPS/14031206/Indicators/Examples/OsMA.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..9d295459a2330fad23eb17440e1c7d7e40155891 GIT binary patch literal 13924 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 literal 0 HcmV?d00001 diff --git a/BKPS/14031206/Indicators/Examples/OsMA.mq5 b/BKPS/14031206/Indicators/Examples/OsMA.mq5 new file mode 100644 index 0000000..3e871cc --- /dev/null +++ b/BKPS/14031206/Indicators/Examples/OsMA.mq5 @@ -0,0 +1,126 @@ +//+------------------------------------------------------------------+ +//| OsMA.mq5 | +//| Copyright 2000-2025, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2000-2025, MetaQuotes Ltd." +#property link "https://www.mql5.com" +#property description "Moving Average of Oscillator" +#property description "aka MACD histogram" +#include +//--- indicator settings +#property indicator_separate_window +#property indicator_buffers 5 +#property indicator_plots 1 +#property indicator_type1 DRAW_HISTOGRAM +#property indicator_color1 Silver +#property indicator_width1 2 +//--- input parameters +input int InpFastEMAPeriod=12; // Fast EMA period +input int InpSlowEMAPeriod=26; // Slow EMA period +input int InpSignalSMAPeriod=9; // Signal SMA period +input ENUM_APPLIED_PRICE InpAppliedPrice=PRICE_CLOSE; // Applied price +//--- indicator buffers +double ExtOsMABuffer[]; +double ExtMacdBuffer[]; +double ExtSignalBuffer[]; +double ExtFastMaBuffer[]; +double ExtSlowMaBuffer[]; +//--- MA handles +int ExtFastMaHandle; +int ExtSlowMaHandle; +//+------------------------------------------------------------------+ +//| Custom indicator initialization function | +//+------------------------------------------------------------------+ +void OnInit() + { +//--- indicator buffers mapping + SetIndexBuffer(0,ExtOsMABuffer,INDICATOR_DATA); + SetIndexBuffer(1,ExtMacdBuffer,INDICATOR_CALCULATIONS); + SetIndexBuffer(2,ExtSignalBuffer,INDICATOR_CALCULATIONS); + SetIndexBuffer(3,ExtFastMaBuffer,INDICATOR_CALCULATIONS); + SetIndexBuffer(4,ExtSlowMaBuffer,INDICATOR_CALCULATIONS); + IndicatorSetInteger(INDICATOR_DIGITS,_Digits+2); +//--- sets first bar from what index will be drawn + PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,InpSlowEMAPeriod+InpSignalSMAPeriod-2); +//--- name for DataWindow and indicator subwindow label + string short_name=StringFormat("OsMA(%d,%d,%d)",InpFastEMAPeriod,InpSlowEMAPeriod,InpSignalSMAPeriod); + IndicatorSetString(INDICATOR_SHORTNAME,short_name); + PlotIndexSetString(0,PLOT_LABEL,"OsMA"); +//--- get MAs handles + ExtFastMaHandle=iMA(NULL,0,InpFastEMAPeriod,0,MODE_EMA,InpAppliedPrice); + ExtSlowMaHandle=iMA(NULL,0,InpSlowEMAPeriod,0,MODE_EMA,InpAppliedPrice); + } +//+------------------------------------------------------------------+ +//| Moving Average of Oscillator | +//+------------------------------------------------------------------+ +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[]) + { + if(rates_totalrates_total || prev_calculated<0) + to_copy=rates_total; + else + { + to_copy=rates_total-prev_calculated; + if(prev_calculated>0) + to_copy++; + } +//--- get Fast EMA buffer + if(IsStopped()) // checking for stop flag + return(0); + if(CopyBuffer(ExtFastMaHandle,0,0,to_copy,ExtFastMaBuffer)<=0) + { + Print("Getting fast EMA is failed! Error ",GetLastError()); + return(0); + } +//--- get SlowSMA buffer + if(IsStopped()) // checking for stop flag + return(0); + if(CopyBuffer(ExtSlowMaHandle,0,0,to_copy,ExtSlowMaBuffer)<=0) + { + Print("Getting slow SMA is failed! Error ",GetLastError()); + return(0); + } +//--- + int i,start; + if(prev_calculated==0) + start=0; + else + start=prev_calculated-1; +//--- calculate MACD + for(i=start; iEVysJecS!t|Ej&G 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 SYJ(Ms?}HwO7BZ)o`TqlaR^2`T literal 0 HcmV?d00001 diff --git a/BKPS/14031206/Indicators/Examples/Panels/ChartPanel/ChartPanel.mq5 b/BKPS/14031206/Indicators/Examples/Panels/ChartPanel/ChartPanel.mq5 new file mode 100644 index 0000000..d67a491 --- /dev/null +++ b/BKPS/14031206/Indicators/Examples/Panels/ChartPanel/ChartPanel.mq5 @@ -0,0 +1,64 @@ +//+------------------------------------------------------------------+ +//| PanelChart.mq5 | +//| Copyright 2000-2025, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2000-2025, MetaQuotes Ltd." +#property link "https://www.mql5.com" +#property version "1.00" +#property indicator_separate_window +#property indicator_plots 0 +#property indicator_buffers 0 +#property indicator_minimum 0.0 +#property indicator_maximum 0.0 +#include "PanelDialog.mqh" +//+------------------------------------------------------------------+ +//| Global Variables | +//+------------------------------------------------------------------+ +CPanelDialog ExtDialog; +//+------------------------------------------------------------------+ +//| Custom indicator initialization function | +//+------------------------------------------------------------------+ +int OnInit(void) + { +//--- create application dialog + if(!ExtDialog.Create(0,"Chart Panel ",0,50,50,390,300)) + return(INIT_FAILED); +//--- run application + if(!ExtDialog.Run()) + return(INIT_FAILED); +//--- succeed + return(INIT_SUCCEEDED); + } +//+------------------------------------------------------------------+ +//| Custom indicator deinitialization function | +//+------------------------------------------------------------------+ +void OnDeinit(const int reason) + { +//--- destroy application dialog + ExtDialog.Destroy(reason); + } +//+------------------------------------------------------------------+ +//| Custom indicator iteration function | +//+------------------------------------------------------------------+ +int OnCalculate(const int rates_total, + const int prev_calculated, + const int begin, + const double &price[]) + { +//--- + +//--- return value of prev_calculated for next call + return(rates_total); + } +//+------------------------------------------------------------------+ +//| ChartEvent function | +//+------------------------------------------------------------------+ +void OnChartEvent(const int id, + const long &lparam, + const double &dparam, + const string &sparam) + { + ExtDialog.ChartEvent(id,lparam,dparam,sparam); + } +//+------------------------------------------------------------------+ diff --git a/BKPS/14031206/Indicators/Examples/Panels/ChartPanel/PanelDialog.mqh b/BKPS/14031206/Indicators/Examples/Panels/ChartPanel/PanelDialog.mqh new file mode 100644 index 0000000..f6cf491 --- /dev/null +++ b/BKPS/14031206/Indicators/Examples/Panels/ChartPanel/PanelDialog.mqh @@ -0,0 +1,375 @@ +//+------------------------------------------------------------------+ +//| PanelDialog.mqh | +//| Copyright 2000-2025, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#include +#include +#include +#include +#include +#include +//+------------------------------------------------------------------+ +//| defines | +//+------------------------------------------------------------------+ +//--- indents and gaps +#define INDENT_LEFT (11) // indent from left (with allowance for border width) +#define INDENT_TOP (11) // indent from top (with allowance for border width) +#define INDENT_RIGHT (11) // indent from right (with allowance for border width) +#define INDENT_BOTTOM (11) // indent from bottom (with allowance for border width) +#define CONTROLS_GAP_X (10) // gap by X coordinate +#define CONTROLS_GAP_Y (10) // gap by Y coordinate +//--- for combo boxes +#define COMBOBOX_WIDTH (100) // size by X coordinate +#define COMBOBOX_HEIGHT (20) // size by Y coordinate +//--- for spin edit +#define SPINEDIT_WIDTH (50) // size by X coordinate +//+------------------------------------------------------------------+ +//| Class CPanelDialog | +//| Usage: main dialog of the Controls application | +//+------------------------------------------------------------------+ +class CPanelDialog : public CAppDialog + { +private: + CChartObjectSubChart m_subchart; // the sub-chart object + CComboBox m_symbols; // the symbols combo box object + CComboBox m_periods; // the timeframes combo box object + CCheckBox m_time; // the time scale management object + CCheckBox m_price; // the price scale management object + CLabel m_label; // the label object + CSpinEdit m_scale; // the scale management object + +public: + CPanelDialog(void); + ~CPanelDialog(void); + //--- create + virtual bool Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2); + //--- chart event handler + virtual bool OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam); + +protected: + //--- create dependent controls + bool CreateSubchart(void); + bool CreateSymbols(void); + bool CreatePeriods(void); + bool CreateTime(void); + bool CreatePrice(void); + bool CreateLabel(void); + bool CreateScale(void); + //--- fill dependent controls + bool FillSymbols(void); + bool FillPeriods(void); + //--- internal event handlers + virtual bool OnResize(void); + //--- handlers of the dependent controls events + void OnChangeSymbols(void); + void OnChangePeriods(void); + void OnChangeTime(void); + void OnChangePrice(void); + void OnChangeScale(void); + //--- change dialog title + void SetCaption(void); + }; +//+------------------------------------------------------------------+ +//| Event Handling | +//+------------------------------------------------------------------+ +EVENT_MAP_BEGIN(CPanelDialog) +ON_EVENT(ON_CHANGE,m_symbols,OnChangeSymbols) +ON_EVENT(ON_CHANGE,m_periods,OnChangePeriods) +ON_EVENT(ON_CHANGE,m_time,OnChangeTime) +ON_EVENT(ON_CHANGE,m_price,OnChangePrice) +ON_EVENT(ON_CHANGE,m_scale,OnChangeScale) +EVENT_MAP_END(CAppDialog) +//+------------------------------------------------------------------+ +//| Constructor | +//+------------------------------------------------------------------+ +CPanelDialog::CPanelDialog(void) + { + } +//+------------------------------------------------------------------+ +//| Destructor | +//+------------------------------------------------------------------+ +CPanelDialog::~CPanelDialog(void) + { + } +//+------------------------------------------------------------------+ +//| Create | +//+------------------------------------------------------------------+ +bool CPanelDialog::Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2) + { + if(!CAppDialog::Create(chart,name,subwin,x1,y1,x2,y2)) + return(false); +//--- create dependent controls + if(!CreateSubchart()) + return(false); + if(!CreateTime()) + return(false); + if(!CreatePrice()) + return(false); + if(!CreateLabel()) + return(false); + if(!CreateScale()) + return(false); + if(!CreatePeriods()) + return(false); + if(!CreateSymbols()) + return(false); +//--- change dialog title + SetCaption(); +//--- succeed + return(true); + } +//+------------------------------------------------------------------+ +//| Create the "Chart of Chart" object | +//+------------------------------------------------------------------+ +bool CPanelDialog::CreateSubchart(void) + { +//--- coordinates + int x=ClientAreaLeft()+INDENT_LEFT; + int y=ClientAreaTop()+INDENT_TOP; + int w=ClientAreaWidth()-(INDENT_RIGHT+COMBOBOX_WIDTH+CONTROLS_GAP_X+INDENT_LEFT); + int h=ClientAreaHeight()-(INDENT_BOTTOM+INDENT_TOP); +//--- create + if(!m_subchart.Create(m_chart_id,m_name,m_subwin,x,y,w,h)) + return(false); +//--- succeed + return(true); + } +//+------------------------------------------------------------------+ +//| Create the "Symbols" combo box | +//+------------------------------------------------------------------+ +bool CPanelDialog::CreateSymbols(void) + { +//--- coordinates + int x1=ClientAreaWidth()-(INDENT_RIGHT+COMBOBOX_WIDTH); + int y1=INDENT_TOP; + int x2=x1+COMBOBOX_WIDTH; + int y2=y1+COMBOBOX_HEIGHT; +//--- create + if(!m_symbols.Create(m_chart_id,m_name+"Symbols",m_subwin,x1,y1,x2,y2)) + return(false); + if(!Add(m_symbols)) + return(false); + m_symbols.Alignment(WND_ALIGN_RIGHT,0,0,INDENT_RIGHT,0); +//--- fill + if(!FillSymbols()) + return(false); +//--- select + m_symbols.SelectByText(Symbol()); +//--- succeed + return(true); + } +//+------------------------------------------------------------------+ +//| Create the "Timeframes" combo box | +//+------------------------------------------------------------------+ +bool CPanelDialog::CreatePeriods(void) + { +//--- coordinates + int x1=ClientAreaWidth()-(INDENT_RIGHT+COMBOBOX_WIDTH); + int y1=INDENT_TOP+COMBOBOX_HEIGHT+CONTROLS_GAP_Y; + int x2=x1+COMBOBOX_WIDTH; + int y2=y1+COMBOBOX_HEIGHT; +//--- create + if(!m_periods.Create(m_chart_id,m_name+"Periods",m_subwin,x1,y1,x2,y2)) + return(false); + if(!Add(m_periods)) + return(false); + m_periods.Alignment(WND_ALIGN_RIGHT,0,0,INDENT_RIGHT,0); +//--- fill + if(!FillPeriods()) + return(false); +//--- select + m_periods.SelectByValue(Period()); +//--- succeed + return(true); + } +//+------------------------------------------------------------------+ +//| Create the "Time scale" check box | +//+------------------------------------------------------------------+ +bool CPanelDialog::CreateTime(void) + { +//--- coordinates + int x1=ClientAreaWidth()-(INDENT_RIGHT+COMBOBOX_WIDTH); + int y1=INDENT_TOP+2*(COMBOBOX_HEIGHT+CONTROLS_GAP_Y); + int x2=x1+COMBOBOX_WIDTH; + int y2=y1+COMBOBOX_HEIGHT; +//--- create + if(!m_time.Create(m_chart_id,m_name+"Time",m_subwin,x1,y1,x2,y2)) + return(false); + if(!m_time.Text(" dates scale")) + return(false); + if(!Add(m_time)) + return(false); + m_time.Alignment(WND_ALIGN_RIGHT,0,0,INDENT_RIGHT,0); +//--- state + m_time.Checked(m_subchart.DateScale()); +//--- succeed + return(true); + } +//+------------------------------------------------------------------+ +//| Create the "Price scale" check box | +//+------------------------------------------------------------------+ +bool CPanelDialog::CreatePrice(void) + { +//--- coordinates + int x1=ClientAreaWidth()-(INDENT_RIGHT+COMBOBOX_WIDTH); + int y1=INDENT_TOP+3*(COMBOBOX_HEIGHT+CONTROLS_GAP_Y); + int x2=x1+COMBOBOX_WIDTH; + int y2=y1+COMBOBOX_HEIGHT; +//--- create + if(!m_price.Create(m_chart_id,m_name+"Price",m_subwin,x1,y1,x2,y2)) + return(false); + if(!m_price.Text(" prices scale")) + return(false); + if(!Add(m_price)) + return(false); + m_price.Alignment(WND_ALIGN_RIGHT,0,0,INDENT_RIGHT,0); +//--- state + m_price.Checked(m_subchart.PriceScale()); +//--- succeed + return(true); + } +//+------------------------------------------------------------------+ +//| Create label for the "Scale" spin edit | +//+------------------------------------------------------------------+ +bool CPanelDialog::CreateLabel(void) + { +//--- coordinates + int x1=ClientAreaWidth()-(INDENT_RIGHT+COMBOBOX_WIDTH); + int y1=INDENT_TOP+4*(COMBOBOX_HEIGHT+CONTROLS_GAP_Y); + int x2=x1+COMBOBOX_WIDTH-SPINEDIT_WIDTH; + int y2=y1+COMBOBOX_HEIGHT; +//--- create + if(!m_label.Create(m_chart_id,m_name+"Label",m_subwin,x1,y1,x2,y2)) + return(false); + if(!m_label.Text("Scale")) + return(false); + if(!Add(m_label)) + return(false); + m_label.Alignment(WND_ALIGN_RIGHT,0,0,INDENT_RIGHT+SPINEDIT_WIDTH,0); +//--- succeed + return(true); + } +//+------------------------------------------------------------------+ +//| Create the "Scale" spin edit | +//+------------------------------------------------------------------+ +bool CPanelDialog::CreateScale(void) + { +//--- coordinates + int x1=ClientAreaWidth()-(INDENT_RIGHT+SPINEDIT_WIDTH); + int y1=INDENT_TOP+4*(COMBOBOX_HEIGHT+CONTROLS_GAP_Y); + int x2=x1+SPINEDIT_WIDTH; + int y2=y1+COMBOBOX_HEIGHT; +//--- create + if(!m_scale.Create(m_chart_id,m_name+"Scale",m_subwin,x1,y1,x2,y2)) + return(false); + if(!Add(m_scale)) + return(false); + m_scale.Alignment(WND_ALIGN_RIGHT,0,0,INDENT_RIGHT,0); +//--- set up + m_scale.MinValue(0); + m_scale.MaxValue(5); + m_scale.Value(m_subchart.Scale()); +//--- succeed + return(true); + } +//+------------------------------------------------------------------+ +//| Fill the "Symbols" combo box | +//+------------------------------------------------------------------+ +bool CPanelDialog::FillSymbols(void) + { + int total=SymbolsTotal(true); + for(int i=0;iArraySize(value)) + total=ArraySize(value); +//--- + for(int i=0;i +#include +#include +#include +#include +#include +#include +#include +//+------------------------------------------------------------------+ +//| defines | +//+------------------------------------------------------------------+ +//--- indents and gaps +#define INDENT_LEFT (11) // indent from left (with allowance for border width) +#define INDENT_TOP (11) // indent from top (with allowance for border width) +#define INDENT_RIGHT (11) // indent from right (with allowance for border width) +#define INDENT_BOTTOM (11) // indent from bottom (with allowance for border width) +#define CONTROLS_GAP_X (10) // gap by X coordinate +#define CONTROLS_GAP_Y (10) // gap by Y coordinate +//--- for buttons +#define BUTTON_WIDTH (100) // size by X coordinate +#define BUTTON_HEIGHT (20) // size by Y coordinate +//--- for the indication area +#define EDIT_HEIGHT (20) // size by Y coordinate +//+------------------------------------------------------------------+ +//| Class CPanelDialog | +//| Usage: main dialog of the SimplePanel application | +//+------------------------------------------------------------------+ +class CPanelDialog : public CAppDialog + { +private: + CEdit m_edit; // the display field object + CButton m_button1; // the button object + CButton m_button2; // the button object + CButton m_button3; // the fixed button object + CListView m_list_view; // the list object + CRadioGroup m_radio_group; // the radio buttons group object + CCheckGroup m_check_group; // the check box group object + +public: + CPanelDialog(void); + ~CPanelDialog(void); + //--- create + virtual bool Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2); + //--- chart event handler + virtual bool OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam); + +protected: + //--- create dependent controls + bool CreateEdit(void); + bool CreateButton1(void); + bool CreateButton2(void); + bool CreateButton3(void); + bool CreateRadioGroup(void); + bool CreateCheckGroup(void); + bool CreateListView(void); + //--- internal event handlers + virtual bool OnResize(void); + //--- handlers of the dependent controls events + void OnClickButton1(void); + void OnClickButton2(void); + void OnClickButton3(void); + void OnChangeRadioGroup(void); + void OnChangeCheckGroup(void); + void OnChangeListView(void); + }; +//+------------------------------------------------------------------+ +//| Event Handling | +//+------------------------------------------------------------------+ +EVENT_MAP_BEGIN(CPanelDialog) + ON_EVENT(ON_CLICK,m_button1,OnClickButton1) + ON_EVENT(ON_CLICK,m_button2,OnClickButton2) + ON_EVENT(ON_CLICK,m_button3,OnClickButton3) + ON_EVENT(ON_CHANGE,m_radio_group,OnChangeRadioGroup) + ON_EVENT(ON_CHANGE,m_check_group,OnChangeCheckGroup) + ON_EVENT(ON_CHANGE,m_list_view,OnChangeListView) +EVENT_MAP_END(CAppDialog) +//+------------------------------------------------------------------+ +//| Constructor | +//+------------------------------------------------------------------+ +CPanelDialog::CPanelDialog(void) + { + } +//+------------------------------------------------------------------+ +//| Destructor | +//+------------------------------------------------------------------+ +CPanelDialog::~CPanelDialog(void) + { + } +//+------------------------------------------------------------------+ +//| Create | +//+------------------------------------------------------------------+ +bool CPanelDialog::Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2) + { + if(!CAppDialog::Create(chart,name,subwin,x1,y1,x2,y2)) + return(false); +//--- create dependent controls + if(!CreateEdit()) + return(false); + if(!CreateButton1()) + return(false); + if(!CreateButton2()) + return(false); + if(!CreateButton3()) + return(false); + if(!CreateRadioGroup()) + return(false); + if(!CreateCheckGroup()) + return(false); + if(!CreateListView()) + return(false); +//--- succeed + return(true); + } +//+------------------------------------------------------------------+ +//| Create the display field | +//+------------------------------------------------------------------+ +bool CPanelDialog::CreateEdit(void) + { +//--- coordinates + int x1=INDENT_LEFT; + int y1=INDENT_TOP; + int x2=ClientAreaWidth()-(INDENT_RIGHT+BUTTON_WIDTH+CONTROLS_GAP_X); + int y2=y1+EDIT_HEIGHT; +//--- create + if(!m_edit.Create(m_chart_id,m_name+"Edit",m_subwin,x1,y1,x2,y2)) + return(false); + if(!m_edit.ReadOnly(true)) + return(false); + if(!Add(m_edit)) + return(false); + m_edit.Alignment(WND_ALIGN_WIDTH,INDENT_LEFT,0,INDENT_RIGHT+BUTTON_WIDTH+CONTROLS_GAP_X,0); +//--- succeed + return(true); + } +//+------------------------------------------------------------------+ +//| Create the "Button1" button | +//+------------------------------------------------------------------+ +bool CPanelDialog::CreateButton1(void) + { +//--- coordinates + int x1=ClientAreaWidth()-(INDENT_RIGHT+BUTTON_WIDTH); + int y1=INDENT_TOP; + int x2=x1+BUTTON_WIDTH; + int y2=y1+BUTTON_HEIGHT; +//--- create + if(!m_button1.Create(m_chart_id,m_name+"Button1",m_subwin,x1,y1,x2,y2)) + return(false); + if(!m_button1.Text("Button1")) + return(false); + if(!Add(m_button1)) + return(false); + m_button1.Alignment(WND_ALIGN_RIGHT,0,0,INDENT_RIGHT,0); +//--- succeed + return(true); + } +//+------------------------------------------------------------------+ +//| Create the "Button2" button | +//+------------------------------------------------------------------+ +bool CPanelDialog::CreateButton2(void) + { +//--- coordinates + int x1=ClientAreaWidth()-(INDENT_RIGHT+BUTTON_WIDTH); + int y1=INDENT_TOP+BUTTON_HEIGHT+CONTROLS_GAP_Y; + int x2=x1+BUTTON_WIDTH; + int y2=y1+BUTTON_HEIGHT; +//--- create + if(!m_button2.Create(m_chart_id,m_name+"Button2",m_subwin,x1,y1,x2,y2)) + return(false); + if(!m_button2.Text("Button2")) + return(false); + if(!Add(m_button2)) + return(false); + m_button2.Alignment(WND_ALIGN_RIGHT,0,0,INDENT_RIGHT,0); +//--- succeed + return(true); + } +//+------------------------------------------------------------------+ +//| Create the "Button3" fixed button | +//+------------------------------------------------------------------+ +bool CPanelDialog::CreateButton3(void) + { +//--- coordinates + int x1=ClientAreaWidth()-(INDENT_RIGHT+BUTTON_WIDTH); + int y1=ClientAreaHeight()-(INDENT_BOTTOM+BUTTON_HEIGHT); + int x2=x1+BUTTON_WIDTH; + int y2=y1+BUTTON_HEIGHT; +//--- create + if(!m_button3.Create(m_chart_id,m_name+"Button3",m_subwin,x1,y1,x2,y2)) + return(false); + if(!m_button3.Text("Locked")) + return(false); + if(!Add(m_button3)) + return(false); + m_button3.Locking(true); + m_button3.Alignment(WND_ALIGN_RIGHT|WND_ALIGN_BOTTOM,0,0,INDENT_RIGHT,INDENT_BOTTOM); +//--- succeed + return(true); + } +//+------------------------------------------------------------------+ +//| Create the "RadioGroup" element | +//+------------------------------------------------------------------+ +bool CPanelDialog::CreateRadioGroup(void) + { + int sx=(ClientAreaWidth()-(INDENT_LEFT+INDENT_RIGHT+BUTTON_WIDTH))/3-CONTROLS_GAP_X; +//--- coordinates + int x1=INDENT_LEFT; + int y1=INDENT_TOP+EDIT_HEIGHT+CONTROLS_GAP_Y; + int x2=x1+sx; + int y2=ClientAreaHeight()-INDENT_BOTTOM; +//--- create + if(!m_radio_group.Create(m_chart_id,m_name+"RadioGroup",m_subwin,x1,y1,x2,y2)) + return(false); + if(!Add(m_radio_group)) + return(false); + m_radio_group.Alignment(WND_ALIGN_HEIGHT,0,y1,0,INDENT_BOTTOM); +//--- fill out with strings + for(int i=0;i<4;i++) + if(!m_radio_group.AddItem("Item "+IntegerToString(i),1<^to{sA{Rqcf7Os&vxT-@3&# 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[i]) + { + //--- switch to SHORT + ExtDirectionLong=false; + ExtSARBuffer[i]=GetHigh(i,ExtLastRevPos,high); + ExtEPBuffer[i]=low[i]; + ExtLastRevPos=i; + ExtAFBuffer[i]=ExtSarStep; + } + } + else + { + if(ExtSARBuffer[i]ExtEPBuffer[i-1] && i!=ExtLastRevPos) + { + ExtEPBuffer[i]=high[i]; + ExtAFBuffer[i]=ExtAFBuffer[i-1]+ExtSarStep; + if(ExtAFBuffer[i]>ExtSarMaximum) + ExtAFBuffer[i]=ExtSarMaximum; + } + else + { + //--- when we haven't reversed + if(i!=ExtLastRevPos) + { + ExtAFBuffer[i]=ExtAFBuffer[i-1]; + ExtEPBuffer[i]=ExtEPBuffer[i-1]; + } + } + //--- calculate SAR for tomorrow + ExtSARBuffer[i+1]=ExtSARBuffer[i]+ExtAFBuffer[i]*(ExtEPBuffer[i]-ExtSARBuffer[i]); + //--- check for SAR + if(ExtSARBuffer[i+1]>low[i] || ExtSARBuffer[i+1]>low[i-1]) + ExtSARBuffer[i+1]=MathMin(low[i],low[i-1]); + } + else + { + //--- check for new Low + if(low[i]ExtSarMaximum) + ExtAFBuffer[i]=ExtSarMaximum; + } + else + { + //--- when we haven't reversed + if(i!=ExtLastRevPos) + { + ExtAFBuffer[i]=ExtAFBuffer[i-1]; + ExtEPBuffer[i]=ExtEPBuffer[i-1]; + } + } + //--- calculate SAR for tomorrow + ExtSARBuffer[i+1]=ExtSARBuffer[i]+ExtAFBuffer[i]*(ExtEPBuffer[i]-ExtSARBuffer[i]); + //--- check for SAR + if(ExtSARBuffer[i+1]low[i]) + result=low[i]; +//--- + return(result); + } +//+------------------------------------------------------------------+ diff --git a/BKPS/14031206/Indicators/Examples/Price_Channel.ex5 b/BKPS/14031206/Indicators/Examples/Price_Channel.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..308f6e8a3797bc5ec368fcda3e9c42a96a3531a3 GIT binary patch literal 9070 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 O9dLtKcw8-g_`d*}$#9SW literal 0 HcmV?d00001 diff --git a/BKPS/14031206/Indicators/Examples/Price_Channel.mq5 b/BKPS/14031206/Indicators/Examples/Price_Channel.mq5 new file mode 100644 index 0000000..28e3bc6 --- /dev/null +++ b/BKPS/14031206/Indicators/Examples/Price_Channel.mq5 @@ -0,0 +1,106 @@ +//+------------------------------------------------------------------+ +//| Price_Channell.mq5 | +//| Copyright 2000-2025, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2000-2025, MetaQuotes Ltd." +#property link "https://www.mql5.com" +//--- indicator settings +#property indicator_chart_window +#property indicator_buffers 3 +#property indicator_plots 2 +#property indicator_type1 DRAW_FILLING +#property indicator_type2 DRAW_LINE +#property indicator_color1 DodgerBlue,Gray +#property indicator_color2 Blue +#property indicator_label1 "Channel upper;Channel lower" +#property indicator_label2 "Channel median" +//--- input parameters +input int InpChannelPeriod=22; // Period +//--- indicator buffers +double ExtHighBuffer[]; +double ExtLowBuffer[]; +double ExtMiddBuffer[]; +//+------------------------------------------------------------------+ +//| Custom indicator initialization function | +//+------------------------------------------------------------------+ +void OnInit() + { +//--- indicator buffers mapping + SetIndexBuffer(0,ExtHighBuffer,INDICATOR_DATA); + SetIndexBuffer(1,ExtLowBuffer,INDICATOR_DATA); + SetIndexBuffer(2,ExtMiddBuffer,INDICATOR_DATA); +//--- set accuracy + IndicatorSetInteger(INDICATOR_DIGITS,_Digits); +//--- set first bar from what index will be drawn + PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,InpChannelPeriod); +//--- line shifts when drawing + PlotIndexSetInteger(0,PLOT_SHIFT,1); + PlotIndexSetInteger(1,PLOT_SHIFT,1); +//--- name for DataWindow and indicator label + string short_name=StringFormat("Price Channel(%d)",InpChannelPeriod); + IndicatorSetString(INDICATOR_SHORTNAME,short_name); + short_name=StringFormat("Channel(%d) upper;Channel(%d) lower",InpChannelPeriod,InpChannelPeriod); + PlotIndexSetString(0,PLOT_LABEL,short_name); + short_name=StringFormat("Median(%d)",InpChannelPeriod); + PlotIndexSetString(1,PLOT_LABEL,short_name); +//--- set drawing line empty value + PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0.0); + PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,0.0); + } +//+------------------------------------------------------------------+ +//| Price Channell | +//+------------------------------------------------------------------+ +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[]) + { + if(rates_totalfrom_index-range && i>=0; i--) + if(resfrom_index-range && i>=0; i--) + if(res>array[i]) + res=array[i]; + return(res); + } +//+------------------------------------------------------------------+ diff --git a/BKPS/14031206/Indicators/Examples/ROC.ex5 b/BKPS/14031206/Indicators/Examples/ROC.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..56f318ca02c71980f62dd52cd3e3e9b2e90cd29c GIT binary patch literal 9180 zcmdURQ*b2!ll6^l+s2KP8z&RnwkMj{wmq?JPwdIW&cwK}ZO-g``?mYP|5e+kx~fm3 zs!u<)qz*TU9VEb>d{CC6w;07@N%PIma|5Z%^ssQ(YGj9Kw>%XkR zzsLf>`oCBBKg0i{*zMm1Tmk$5;6Hf&H&_7<0B3;xKjo|d^M7g`{?F+7|GlWB1(9cq zf;6@}w6yef846#MQ!SLruVK{l;*TGU-9Ydjs6NF2w?iI{P5FYHdlsdJ*rLzmAn!1 zV>FVBd2uXQk`X)O`eF2Je7+6f&KNK8Ie~rVNHDOv7DkIbR4a{&fLQ_)Z!%_6V8Gnq8s58Q82Py256d$n({NbIG3m-YNFvY z<8+uC7;}@P+58rmA;Qo{|G;8!5rubC#u4RZ+ErLZS4{&`sfRAX3IsHOu`wUK@*oZt zXLsA-M}!yArcP78mS;;X{~>9Fo$<^C2F!4P9NmLnI;ft&s)%Aw#!PTAQvD4@gR4xUL2b zI@dDmBA{3L_sHo(&O|u1lb=%zws{RyzuPX&s^0Xr$VhFta39Nf& zJJ!1bf4tAJ9XieiFrhQUaS)73FelvE(JcMXwl zb3$7DG)~jbu|c!8cGDCS($xf?Kd%}frpr)cjGSbY!m4sj7=GVp_|NgCTbu_QK5W~6L8sK#P-o+!m5-><%-*m|-1FTvQzmuiJi7cY8 zp{PK$TPbF;U-4ikJ1RQ2RP=bGs9$tchSJ0#o)q`#TYlOVkOUqfDYDI@15JkT>`P0B z>t@?4k!lmo{3?Zthsvq2Te@yFQt?cX{!STvbwj7S!d;wTaO7|Por8vh+d$*{(V!ee zQ!BJv>m6D~ksmtUmsD6k>zwqez5Y7STg79yM}@L-K*F)ZF+`&MKwvrz&G(_Kh6uyi zY`=<(I@xlg^>V1*Kh(u?E38R3NpBpn)4C%F6R-8ULX{qCh&hV0`-sDH8}*G<@n6YU zP1h~^;~)~!@K<`n$Yx{kGNh}#bbTQWAou$2UwXq0R1{DM4Jp2hz>xPc@)f(!mXVjV zvA3worTIM*zhYgduZIqsRQy`r-$Jzp-R(itP*#;rZ?L^%xxVGr{uV z;Y8U1TC9*BlW1gQKFh<~NZCJqI0x#QWF(bhwMXF1Q3tQDr}Bc$!9QD(MPrs$7LITR z8{PLf`&9wB0)`BB>blt8hyB*fj8IvxVxpv8`|~mb-69FEm$-_NhE$A<>|aec%q!c? zA)sa$+@g?sz|5k!{Ct#BXx|{DE9`VzQV7R`4}SJLx(I0$qoHO6&pM1CzA?;L!BuYu zfhd!iAPasRyY}xq5lx{5_N}TwJ6ptDGhK<8(nR z4tdNw29)&<3KEP$YR&fWjInhD*UVqi{(kYt;Ik!R&} zUS(b_))H=lVL*@hOzOH50P~5v({!4wOLPL-OW;^`? z=X-|j?B+V8bNBnBn?2XmC$21>%t+h#>Vhx^8PYJ?L_sXVyW1YttqGGg%AZzZOyLh0 z{8dc8tIke#Qq7^xRoV_h92QmLf-T75D9P)nFG3CdAanM#b3q+#HJMVC+A*CE#gqpN z!5UGlM(-zIex2={&QmBv$(1+!)KA&`)O_*F!yV8K+xL_U82K(r{;=nlN1?_qQZawS z#=T*gU+@`=thBP#s#OluR+9X$jXAC=^|M3wdpvwwM9MMK3{c{C+fexiPlrv47<#ny zej@;LC%&Qhbg{`qawsd^NdigX4nsmKw|UMqXqo@k+1F+@bWAIgas2e+w2uSqIx0s+ zOJr5K&0|s3fJpo-ol>cr(EaUc(qjDshsa}FWPOAp2uFI-uJDiDH#zv$JA$+hhskoL zu0^2WZoLPL6L~v68w%z34Pv3KtYBVX+a0#lk6Tn2*7uaytRBi z-wsygHf6Qewbc;AS?=nkk3LV)DJZG<%JHqujO%eChXz>(fF1Ig;Q=GM26*>Sx;c~- zZ(CUUu|8W@^P@4&tn||e;6}>Ygb+gV0;(f3qjlP6ImgSSmjP4t&xF{2VW9tv7-2T} z>10M?vJTBQQN&umf^5$^|4wg8UwHVfoo0eI}m^ZSKsKl3u7O{#73ukvcmKy{%HL1y6S)q>$!ULTd- z)hUT+H?QkfB)?2((iVl)ulQs=9x;&HEc>2S?;;$o8YapqDgHA|d>9GgA$YfhGALd% zTe`*7`Ur?K7R=J#l1f#IWdrpqqPNg+z*N#fz(` zJJqOtUzcpx{i_Ffk?4!Ok;7d%dPnimsL=NIxifE(j#y>>-PL=XvyYU$r~XE zE4E~+SGdpnZrP`gk{ReE>!xdp)!}^Wa%+me>hbfS;zRN3N97Y>ySf56yjt5!=`vSK z9(^?0=mr=%7IEtxV>Ue_CMlTaj?dM+wGnD9hSEpqFj(?{QG*E2==4FTj_-2w(2Cps z424M(tDTEV)+Wj_g`vj3SB%XN=GbV%9cwi$6HQz2HI4&$vJk3xg8a{TUR;`A0B$0Q zqZW$+i~d|(dFKrwe`L`s2I{UtdvrF)vOXhARmgw#ILw#NuExm1d4=^Weo>}r9-+DV z1vzZBjV7N=%C9+v>b<=tuj5b^0SJwaiV@lT+ z?S|C3{F^;&T1)8;&s#l0-C}bVci=_6PIFUYyn=_X9c7-1hhVE%d)}x{K~;Qy;;axh zXluCHUhjg+9^8>Dd)I>u!$mX0%u^Z=8z2y7@5m?AE_H{kEG!4hC%9@bZ1&9|5sDa1 zJRQCao=(2l)M$u(?MjknOvi^V2<}hy^&rp1@+GEPtZcNP#(|in>~Hi!hYm1 zDW1gGWi|&0V!ksJ?LctY$*Ery28)VdTxW6`wW5mLfXk!Ps1w0rO_wA??ql)UvvVeN zxG=YTJo;P1`OB;4J<2j+oCP(RCl)X9@O#A?mci6i@$!0*4f^CM#3R<4_?f=|dp=WR zAU|MZd|Q7IQ*g)46=>Py@Q}Ak>^y)n@cvlvL6>;E0rF8qDxxa7J)!?|oj5TL}n{}cS zgO$xsFj#&So|LRu9B*)&TWU6b;Bg$z5NY{?GUYHcw&bjjFZK%NOKNa_dgWRyNrjB^Z*O9FUP_>VliG^wjyTc- z825;1SYdGyHM` zMXe?9*%mUiY02jFg^byZfY#kCtb0^x6ZrcSrfPgSwW-rU>gneN+< z=zkHoJP7&y*tKg5VP`FTBt*e68MrjVXnt3|`WcNThP6j&(b_$=j#pWKl{lt&n;we? zx%IU_GF)x#fV@=_z_~+qwaL?7jF$5K;haP7gpyK3r*1qj(<%bD+%KH2!@vCO@?0o; z?Q$yC*L9SArUK2K2MKNAez!KX=6j69H57f?k4xntlCAZ@8aOmPITa#h@APOD)I7<$ z&_LcaCWv{MKLpOG8do#YHb=Akw_NV;d>5L+;@~?(+YJNa$s7P!U8zL(2^?JuTN-0% zBOPr9?KRDDQQU`QCiUza+I={YB|jR>&;{GR1!p;;Jc#cEsj9U&yQy}88Wi{=#Bx1a z0V?kKN@g&2`TEs6cB}7Vaqy}ry+Kyb>@Slj&W~OIDXJlJ#Yq>ZPMSUZ_9${ZYxotX z=}}NbZ}50E48j;|zSV$}|Jbsh8LWL4w)O7~KNwt}A4=)MivuMC6jhac1o)rWbA;wy&xBZKO+`mF+iLo#}ap`o#alQL*=P)}LD@mMWTdi4<-Mi^yY_*t-xz^D6QM`F5O(tuvd2Wn$JonkQ+hzvC zj%zQ-LJ~lVIQyas_6LC+yiB)d4!RtririPSwR8g{yGIZ3w6DtbaA%wmRkE_D1ziDRw<`9~6 z!i#P$j)G%vES`TEJse|}L+?Rm9{DB?H(HO2&-ilK_3qoBTbr!}{;025nvGT@gju$b z{8tuJ>;5<`F-jK!aDrv}Y)y6EzcbzPvu(HtL=8+Mf7C)3X$V9ExA#k_5foQ3QNBe# zj=+18P0&FDptrw*TJ9`WY_A((qOk1XuUX6LYxll?#xFO2c?804wgIN}Q!MWb#rm{NP1{^+fHl{V;?k zvViGddbi&i%Fhy`;B#?Q!oQX$Vn4{+LxzPD=YUK@1;lb)bX6^5BSJdlx%ifJ7PcV& z`gs)E**q_$Lro{9KN7fKw{ebkqB0-kKT?3?d9lLfuOirD+PqM1PdlnQA8pd4cKn<> zv-%hQ44da8gdnK(+&aQqy=Weyjs_un!1IIgz>EsEajOCB?uX+tpN^q-yZ*OZ?tL)H zVp%R4#;pc8zYxdK^(aWpS>+$hcq&$wN8FUS`uyQ~lB%W7fu!O!F{4)5B?-0rCmG9Q zH_tk_xM3e^%8}KT540zgjjwpPqIiT_m8mE*b!W*%srn%f-4=~nU8~BdzMo$-i>5;< z7%UUmeHT(*3h%A&CJ)5s>BBuVNYNpP`rw#3gsOWByMN9T_9>s!2E?Ji15?ui(AD@9^#yD zCfq(%b!PGq6m|{OFSWfh>DO&zX+^eQu)7n3wy8prZfb$xV9>&`?R3^d7DE_5Avx)+ z8^E}0}MmlG-D1JwI)u@jKb z0wV&KS+g-_xs_9U;J?XB%R2(B6mu^!mG2X2$o2BI6FGp_IG_0T+JH?(5E89+LoM+I zDGpdICL!eM=6cQt`N3>CV0Q(V6w?c42(GsHzBm*zb9Tmct+xY%;!*K6G*`IJ$x}hs zB$!z|LFYNbFK4$OG65P%S@l@=FMaf&Bf zGnK*yeE|f_9*CNsr*_~2#jC-YxA1GG%~pZ3E%S3j@Z^pY;_+0%$h+73e8T3v z9VbuzryEoa(s|0>yjI$16Ha2NGktxbZ`+2Lp_y<`DX@1ji-hGBX2|vu5KIjI1XCKY za|&^=2RBcD-GU*e1P}u+ZL`!~pz#OUX4Q$=vg>y|*wV=q4i+LXCHOq{tL!V}8fP+^ z3DBiPDuQa@xLgph;Cli`zBnCwpeLJ`xEA=E!+soD(N)`BQk{X@oMHx74esj7HozN;fK2i8;tKPfv9V^*9v@iZ&qZ;-L}eWy z#3DU@?kFg2hA9WH5aA$Msjvj=6RvVaoK2bL7$jMV?kU^aTe$7s(piu$9^G?h(S7+n zxXW-nA*Ajf+Ow?ijcj7IJDGn*vTwW$w&U^Irb1&{VK_@EXrx;dJE*>r+kAH^L9*0| zgSNoY(LFZ7oDo}qx6VG!8U147AZnLGC_zTxZQppyy>>SqdDSr3R|g(X=IA!aZczo+r5%UkX zbhap^kCjg^0vP=m#213aL}B)Wqw`cc8xbD8xo7>oqNvAxca|FKat=XQlG`~3>Cvj9 z0vwF!h~;E)zdTqg2Yaf4*Vld6VZ)gcZCpQnpj**;np238v^9xN43@$1hN(w2aVMdk zb0SmG{Z1cz{_f=I=5LFL9y4Mp-okbN8T^ufKb~I@v+&-!^oF^ERYy2|g6PIH4J*SJ zbt%halkjGgKaPG+^GC@h9Q=yaa=DPx?y|ItHYU{PyYs{0*MY1oI>;K36eJT3&GD4F zRDb_TkVZ+Nwo^)o2QibSb1@OZvqF(cM05rUo*AsoaOtY-V0bEcpNofMi)V+#SvndX z4um~FLEC&xx4ZY{=bJQZVUS;e-Pqd^-rap4wra1Zt7#=lu@#gu8y`i%amj9NKNT@k0*YvlV2m+B*R*$)~f-Za{)hw@x%+Vcw4PagbQ?(drl{x z$@k|nrOs9XGA6mpP8vY4)kr4NtX6Ll>`^z-Vke;KHUfhh*e%BV7Fvy5{+>}@DKv~G zUJizjimTnW7VT7gGVifsE(i#9_fhb+&seU{aT>g*xG$YjP{x}1nHl8JbSn&8Wp+qK zFIgtYc(<2ZHP6i8FA5KzB4Z6vupp*J>ZcHpgFr%G1(?$QoUV|O-oF(tzO>1+od5L7 zZEPp^_NbqqB~nC_T_G110=ma<;Dd(q3Wn2b#w|_?#OxMRDn+ix?)s=ivpXMk;N23z z7>;6*Yc>j#LAS8(763Ps7qKYpVPXq`IlT<3!O@~^CRYP~GuGNdqyA3@4k5QHHe$p)F!nSMfpe{(wD3e@S@j7^fkl;^okq)H{@FJ|u`Nt? zN&V>QZJhgP)lk;VSV7-Ka5=&~eAFd^75Z$q$hdG}M1s;ae&`t<_J&w%fYiXkED`=dd5Rkpg<0oS zF55ZMcE4Z$_k#6szk!~J3_w)SsiDdq^5J_69^58@<1Qlh$*@CvdWKTwYqSF)Ec0|t#8BSvBru!cEV#wSIbE{iQke4Q5 z_i&hEi)o*o`|PgAtLW6oBukGELVyDQIFX(2&p&1I#jUJOC0NAJ9g$HdvbEWgeDo@m zexp~Uv2t%1k(0?PBeNGs>U%}EouhOc4qj}U(x7nUXeYc8%{@SI{f*s8=5bhz$0*KS z|FQIB;B3?Qz%G0J;QcvjLc=KGBv^Y3@os&ty%kGF&3RP}9<7Zr9=)g2sH-e+sRB6@ znS35yVA|_LwI0dja-(_2E2eOL$7zr*u%(irJTBjP_SLPXEhK|^_^AI?jlRPHdNLAJ zS$!0*vQ%Njy5?hhGi08l@vF1FVuydf5k}MGd*n!7!hALd#Sc4lHO=l0xTsO@dN%m!hDkJ*Sm`pp5I6(*j;u^b6 ztNQWztTwbt3PwbtL1j5ch?r7Icf;-*AMDviykjcSYTe-=qQo5jNz)AYSpRE>3LR3# zjQg~X_SB@Hru3-`U9jTgckLuU#EM7`YcGO4(ozo+fNaII(LPYgd?DlH&}JF?}oZuMYl`G->5$6LlIlVIj^7JJkzoNp-zojI`1;4 zsW(0Y(vi6M#u%V-m#LBJjZzu|v~?%WrYQ0zM9XDnj0!T1OG~_<(}0SQgPbE!uNa@@ z{plUR$`;YzC+neVgYUkf(_rRx=))fBlTs6)4+n~OpyL%s__Ae+mYG}4_B_gvs{mZs z#B-z$k%d89qjNziq$RHOPCSvbLE%9rNRLPSOoONAv=WbN`;9*~7mr)=ARPR1oJW88{Archl`1P}vQ08IY_`u~Yo0PFy|e_1(z$v@QqpagLKR|EXVoc?8H z|3$_ChW~Ei{|x_+W8l9Va02iE82`cbf4~5+0XP7x|2by>82xi=^MA(A|L;bNk$l`) zTznB`xcaOj$xW3#td__#C9bS~be4EBG1VFdm}D<9gB=?LZ8?pf zEy4o<8_B!e6S&DA1x+CM6BYsU*KDU4Y&*fuy46^F12xFE&V z$X*xhQfjf%aso{`S$#9s9ovb$=~V3kh02aJx37L{Xv->XFNOFecci)ns%7K8Q1|!+ zQ}VnPYCgSfB2!#dP%e@BC+&4DbvEFMapc4S(jFn;F+QW#@}XOlbMv`wTcwhJ3XLkjxZa^A zs!idyn)tx8OCa##I@L1$8N5Q?){T!YAIx(X9O1d9G_QQ(vCOz2P);6xqSfyA_yukt zVqtO<;ncDWw?DXHW6Q6jVuYrLU+J8+5kdcQO_#h@_fY>zTSlPNy>QA|1Pg3BI};Um z?u4hO@UR!(c4NNxl2pRP_Bo4MS2ld!Fut>xy-tMha~=+54($P?2gi|}V+@Yk?3dFs z^4FPUZ~w5a+eJ1^9Ce?4KLf<(#8Q&eqPPh|NJH!JlW1Rpk_v>%s4D#FiC=lG5B9oC zjvty0PP()>T`k}16l9f{HdQDctW%IF-37CCeZ;gR@!PIKT?G9@bv=_M{!1@Oxy`3k zc+;J7**vP->-Y|HlE&E?M^>oj4L;Y@%Ne3!GbBi+1Un5(!!#enUh@tmb_DE7fhPpN zoNUqhF6#P5jnraqlT8SyewhV>H!of2hs^d3k)?)7kMk0jWZ7W?fw-W>9*MbKMmKQ7 zEsoU87y#`p``0jC+A49WVrpMNKdoaV!mVvB3GE4#+;ui@>!GatYm~82k(u4ihrrqb z0kThom3G0Bo#ax&;u5_#zGkP zt43{t5lwZ_uTm%`9?K;R0`jzms16c~ZA@fE#H3mi=|+wk)L6G$moF+I#trbu#AJFY zN8_2JG2$j!$dGuf(vhYTNFn53%)1pozuoIa-zt+~ke7>^TAA=OXNeI$L7r~|9+$t_-Jaii}3mP=C4HpX%%xGN?l_L z7HxW)Epr4P*g*8GWK(Y87Kk44MrCegH$*5X3SYk>e%=mb`di8vr|HD2t0-)^-C!fM zdB)41cJ8FEQS>3bKXRr=-20Pp2+Xr`J7S!GuRhU8d6G5MSW04{s=Ebw&X#t6j0*48 z!UfkWgCV2xFV-$~wW#gUUfe&FDsDvN+J6s7p9rJERQL_S1ltL^5_BUFS~r<{^5nb8 z8+i)fy2aX~Fu*|{>FM?IPr=IGxhfN4q9dVYD+CNInXwBUYyB!RQxf7AMrJNWVIn2? z05NR6kU&ll=Dhfo-(gl^#KY{T(`POTtL2u^pIT;3Zd2`Lb*n=W#SG4V%}I_5U)v(3 zypd`P!(UN!<(a&q5cNE5!&nC1@nRWbCTHFrfSBXKm$Y}FUapJTxDV8=b6VGeUngJ| zhl^A+fHDFs^^EGyt0^{aR{lsI6>mx=b{jH@;Bcg$(C zAeXjV#%Y5Lzb!A4WY*LUc=DD>_qN`mTy9A?&|SU`!6XBge{3qKN^g`6e{tAc5XL^#kB5N^ejAN~J)MOwc z)=?v#bg!~&AwI9z9jD;E{*ZJi@U&QlK!<1%3BqY5> z@~F%(1pXMW1A(uZycU$NkOq?bh0g-LMmKKq+r74P;|Z66k78}rU(vDCb}{x+0r{w% z@@adi8SzI*KPxGoj;~~8%vIEEwjB|<|GD%#iErtIsr#U+rPC9VB^XFuqvzDSz=2D( z+Kmrb?MklJ3XQim5Yo@9rbT1(@ax#O<0g@y$XV=&MBO=*<~yJ&vhi*b>_myY0w&Eh z<`^kVzXY)ABKds3c&EJ-kip>XIjsA`(nJ6IK?hFSkSyD=sM=uH2{aH5j)c#;K~OiS z_Y%)Kba1(|^?4y38Mre?VUnCngKXRR>bX%{GJePFVKC}#@JXGPmmsp-n9i2ifkBQ{ z#m88Vu&4vlc*>$aX-!c7z%o?GrxE6ZosNtNM}huvy4C9sGQf=ntCDy)sRqYa!F(Jm znGt_?qVh+RFwzt#`{7eY>9oKIr|{<1A|OJ?!SDB+-b9rrg`#>4XZdN-h@ICUxB4OF zOLzKs2$G19{?WLrya)q)j3L)=U3L&WE?gY{)qpm|!!go_CnRFMe&tN*qDBU3blvKJ zdMkmu8W6bC@UdYasw_>Eja37(QL6Ry(Vxd;8^@_o!UU?w+pOS!3l8n7)fmS{s4~x2 z5=?g6OC=bPWqNstqb`+pKS%AsXbs%_v$g0-H&@5UmX}BFfm=!ew}LxVer;u(tDB$o z0}6L4Cp0JewHeV>&}!egMUx&p9}OQIXufJ-`hd(8@jdK`hO=g#vZ(dt;xXdh14 zDWhHG)HTKHFba%JS*dR?y;g$DXO4}K^45-2qPz<;*!@}2cqzQq>7e5?{8oXC9N%$a zXUcKnor%R+a-04txQFw(5{?EwJHY>06opq>K*Om%gYU)Pj#Cv}4WcM}q*IVzhiVDD zD3AKh3k*SG#&@9M+V!DnMfjao2`12#^IO2vM&G(9|K-=^VY*SZ&b+ic@5USQdK8jr ztu-(tJ`S0M?=#)q}i(*}=WjOco72oZ0 zj(-H}o0Z@<6q~Tnxsqbhm!6~Ij6^Ymk?Q$@GZaQHTt|{n%W+fd4_%a8)3*01R)6AwiPgXPYx-W6*v*@-R%CG zL}6x}y~{dQxbsNv7eN=9)3f3yZzN{Msu+w3HrKqUm|HPhz+D??sDz!Zd?|XOJ35l% zcCSEJg-A&NzxO>R0cF;c03&?`NJZ07gvu}!X&e5#sWJ%QUS#KmY6w32RqK1sW&mO=Te>-MWsPzjzFjqgkWqkm4pFFL{gm z$cx&+WSvmFed3*)E@i+c>wZGQ5lwH!9RqbdfWoy*#?F^$U0V zXM*cr?Q=3t66K*|(Vv`a4;fuBY$-mwlfeD`34_(*X57s^Hv=PwPJ1OwYJ zJmo45?)ZW%Y)rxGQWQ+$g?O;KS4c>f!!PMT6>;Sbb`3Y)lje#JcI(nO&N`cMm=8VqF^qvKi=jlfZVxu$VZ-(?GrN`+XX_?`*Oxm zs**pVHkZh3N9+Dmi5tpI_pW2OKevWy*nf^9>qt~v+DsPfsPS=zj|}m)0^dECP7U-t zUcyRymX^lt-!Mk7^T&a9`$v4q9Hl)Q<>gSx3pT5g8(v^4p|{{oYITMTD^%)hCccoA z7jIKB%7;y3K9fS!yU?hmuX`Z-N^7tYJA!jG(+qZnc;~`0fiuRwO5H1CfhYxGufq(5 zD4+RRJJn7pJcv^FNjkepx+T5^VjmVT-67jeqR|1d=#(Z(f*p4FRnWH6FRP`2&I-)= zt6R(qyZVJoYZ`<#FCaan7_U$VnJ=Sbk)x|rniHvys!qoJB#0?Odx8(+i)unUdM)L_ zqP>rE$A`h(vdDhEnBvXB3%3oE*Cn=D*61Al65|OcVLngkfS==B959hC=U=a^1;W>C#1&lUrld=WMc(olSC2 zgOy#wInjP3=#thpqgk0P9%h+j+I$q}Z(#ES$bqs-5|DRbcI4NN&dsQ++8> zh_(CNVih_EvF>43sEiAumCLR2!;8HyR#ypbImUiu%7019_|vuS0&^j9;{-V)=G%*k zbB(zY!geR2P>?=PrkF`$uS}sK(OsG&5N!~s`*K|fp4pQAr?$I^b#jdIi7)JrLAC(g zylL^mDwy0=;8c-z+7HLTiesS=R7gnx=us1N3a_d$+)GpU7-I;tLtX3v*G=l;ysk_1 zu}UJSoguEEtg+*bZ8NmDuqufG1aa!vn8Kk6RKboxLd5sBE9Q-W#S%H+ww(NaO(Du# zF37!&kyje@{bPDg{4x!aQ7h?OSk81es4gCC(xkv+btTY3lT77zK4O^yC^#Ll2b;M$ zTsg)$sgezH^d|P~~9ZDFLfL%WdnH>-;UT-eTb$+k*&Tuz+U5j$T zYmb)+4Jn-c*mDGddo8)BsrE7_Dm99k@mHMVOZSwIK@q>(AoKBjxLm${%R9TeGM0%aP-Y5#Es8w%cDEB+ z^50Qe#)M+|L-fX%JTv0t zJjFdxuiv!Bb329`*BlAYcuFj~ORxl5QMh!wXm^HlKiT17_NVJ~Jk}^o&xnK2hHq1U zz{9hRFisKQoGtYy+ra^UX)U{868R@`qZv=`W4Q#&JW79Qw1Q4IA;1U(`OrMe)Lk6w zzF`rsXm5H8aEK{iP&(P`Jsc!W1beCGe)L>cISl3bOR{zc_?UH+luAZ&&<8Oc8j%c_ znGMB9X*lEHMTRw&TdSzLsQi9j+%|Bsn^-?LMtt)Cj+Ha=-W_|&QEtfHbSy&dwwr2m zQn474d+@EpON1Dpwl)-rv7Y2B#DJ(&?mHd7;Ad-cCn}PHZDBr!FJ3Kwm2#1PpcbZ9 z-`IEhAdhVmAqGvzX-4t2Vqej3x0kkTk`}}VviLXtWzg93eMWCQI)I^fZX!@!PMfn; z-geaUJ!aS(j+i3O`PO{j6~>S7bo0^WfmoVpAd{0DU#W~RPb;ZLk79_cDZc0}x~#5F zz$f>U>SDb*A4!lCd6)%Rlh`o)f zhsQqmdCbDIn6V{1ZktS;Cvh;<1cSA^n5dgo4;I7~EnrE5|LT3|X>Gpx#o!`{wY5rI zA2JfcLB0{dF@v{gG`fyTqDV}bgA+e6=-~KIbh#;heH&*3wMB=-?j; z*Ra|?zGMMKpfDSkvvfG?udYcxHLUm(Nq@?UBm1$m_dbO_pA@$h_nZ&;q{YIhgaPTI z5+w<`$LdbMpF)1oO9K9x^1=fVHjQ59{+hy2vJ_d6xmhe3$0H(D>+3%QUvx57sU&b# zs0RU;78JjaE##4`2`cCC%TcQ?`}9O+=Fy;@_#w5YwmNa460-c*y9i1F_yY-+4|oYN zQxY?V@Uc}%_Hrzfn|*HV|LDEF_FzxQN9UV0MKwbD^+W#_04)qTY35-}7IeeqFVbD} zn1pgfY&szv-2HjBz1XxJGAH~eU4zI(;u_Lp*H-bpi+5Sv!E1BVSG#NwpG|z}g@h;# zzpoj%oTP)QCK>6*0~Ym|P!Z8vStQ3q%K0doa>r?|8bPqS8cmTWQ+)j~0vrgFG+f$;4OU$OyOMnD`h|L10^9wZM;L3@Iy_ChM+Kp&Mn zQJe3<((ZoetrgaoW+@{M-bA3R3$Z0?$i=bBj0>N3egF1K4>Y4w&rhi;lUAVh^3XG% zY=s*+`0c0-L0CbiUE@2cw`w_@P6{w>zIH*_T*V7mja`c2iQo=5oBmwDe~ZFp-ms|+ zN^<0feHV5Vq~9i5OR<@MA7g%ZP5Q?3xFM9_=A$k?!X6iZaTsd5wdPCi)kBHxVA#`? zSfj=yD{6Q}l0XR$W9=@8h1NhQ-UH26rUQngWB0>1fR+}CpGaHd)?T>8UdcqtOG*rv z$FOQ3e}My?fDM43#lBO@EYpVJ{1}%3+tK03utjRowtf8423@29QNo2+5rwPZ(e5T$ z1e0lSyFl@WQc(E3LSc75Mzejk-KN{rap_k6wQ6;pVURW@@vG>z!-Samp6flFQ+eua zq9PF#0>EpA|D@b~9jgttF^jm(9C|4m&wc$g(KStX+fg#!4M!KSh1P1$R=oeZ^TW^| z1vm0|V}XB)gzrS2#8;NcQMg`+*XmrY{TjrXh}snF@N`{|&P)=!n;VbXRl@~jf&!HK zME~E6awl{XyeY@=FXk!2^#BR0$A@@?dNeesHU2Ke=8=!P-xsl4Hdt$R6L$QxV&7P1 z#M}eRS1_T_bLoK9xzK>&NlF4d6j+k1z$*04R(Ici5182R!Bz84O|(xYPSeDVLRr3H zd(!7f{;}qEHu}D-!9eV!9?9VGT8o{MZ7#8XtoVq@wi6Sz%frVcJP5v> zBSq>7#d8SsR1^lfJYjhOJ&JcZNl#hGz(0>%+s2aXwWlBh#Z$60qs)GsCU|UfJfR1g zZ(@9n9T3E&8L}cO6IQQde}+i&;l+Q_84E<8Y_L&uCtYUgyc(u(re|CDx84V4!*HSX zCJK2}qRgcZ-d{5~NsFU`BL>;7I7}u&e3gf-fU^z)3G6Xth{d^F)1zB0%o!V%A<_!n zlCeVP*&!At#yxMBv}R%`Wv%U1J+|1*?y*lDvUS0qq5THp1Ajt$NcVT}5DQrobQVV8 zuxV}RPx5Y*1o4()L?`Blx$wJaITPWhAm(1x{^9ehVtSqDaUA30gnMJ2ct}|7#nY@= zGZmNK$S#crqXt9N)nKLn*_ILC!m~&U5qmJJzCmv@8`*~`^3=Jrj0W+y7eOQi8g}b! z$+o+3iNJ7dgjC)kSQ;a=fBXBo2tNI7F=d5|WthKUBgR|w9RDlL`KQ{=eCGCKxb@Le zZraTU6Kc7}&`J!X9+uA8N6T!z0pem)SZ;2#h`@VV+r6qJ+#8$4=HGs71KAZ~^JM2l z-=~h)-X78RUT}ofcf~B7j0r`&aBn8Nol(};WEow#uQd|dMwu80x0Tsv*wcZiOi7=< z_Xt!A$KN{L9s^O_HrOm@kV3$OM`BPCUqMdDxS#DaCm;R>1?EK#GPXmZ%DgN_q=P>p zMupa3=4(f-2%`t-oKA>wwXk#CUm`J5rhIafW#41J`%>zurxx<}ArU;km+>eMHs<6Y z_-5h^aTkb{ZH#GXjI*|gt!j6W3=&3Qd9Csesna)>)cSe&AMHY)KiCVhNsHX!yK!eP zL-Bo@YBPgIZB{|wwDn)zMHCcoq;C~+^`A(2u_=D_m}L(eojSCIPhAOAl-GdoojfK zX^E6rF(UFjZ`y(U*?&=fCJw&x*<{aSX|MFfk71RKjM$c!RB_TvX#TL}SN=O2<({$m zTQDWS#7L#kUj|XvaFWlHBaihe<9^|%_eVQi7{}4L?rNR_E^!O}2~7OLsUnAJ1aN8v zzn(xV8DSlgbk{5_)m%d3?&FX1b+N5K{SnG8cL8QF30!zpIwgBDnB2Io@-}xSBU0F4 zZL#)Z{9m$=j2Ltzp{OiVGCP#mtT2U9+qn`6=ry|ya^{VqQqp1{91kzX%r%!JBUfIt zM%eiuVrD?sjb19X`3M;XsKZ`d;UG<~gi9m|3m0z69GLa}Rghi)S1$eiqq;V;WIb+u zB>DAJUMY%Tv)~eITMl)SgKV4b9cLx(xI0 z8H(nl->e$y7gr{JxD=pU+x#QF5TZp=nv{?^@~<}O1n93OqfJzXq0Ud&&u@-X!4x^g zepfE!RlSS|D0>nZ+KbZ^ET)n>G4BY2e91)L&mmB=FM^Txw1SEZIsSlpxh($zCu>6P z*2t+gIviYrD{ND_8OYXEfG`%1V&xPBCEN3%lh2>cWe5i#eR_du(Y8qm9;U@*L6vDB z`rbRAjVSmc(plLB=^wow50n9ux|Jxnn0e-3lfoC2OLpbdNP4$@SF8nkm9`O<0gZ<8 zPyEtA9y~_)sbKO2?(~(@cUIo_SXrvZPVAM4r(;!onoGWbbHvb5e0{XU6JR*$*kC3d z#hP3mvh4Wr2;?b>0zAfsH=*;)*!9hq1I6#$J$i@yIa1Z|$VBKsPpqM0)r>K{~C223tXw$0*>}n zAp{RJbA$c0pBOCsWcBD%KShD}7ub;@`B_{vj;sk_nAc3`VRO9CSoF$JZ-={tsc_c3 zg^8EA)RlRYi2B5FeAM~G-Jr3y#AOO~EcZh_CTMwiMvF!Ho+CVtcs{;w=4&_tXa>mn z%u1pPLldztgsAhCK@&v)1mtQyyNaTH^d8|WP(pL;K@l2hJd**MD8XV|(|eNk>Aojj zqOSBgN>-G9ncmM(Cpn8CbJp&uc54}vxy(nj;h8l-))-qi0eh7Vf9ah{W64Oo^fdLp zoXCCCKgnv76P9yH@6FEL#F3mjx)-6k+2sy1cVlVAIMA;(>|RJ^YD7kGs1vRCKUQNp z9xh^14Q42ry0FYCZTbTp zXqxRf5t*#QaR10FQZ5uNwkpNJ<}QL2hv!cf*j|%p8P{xy(;+PBz)UEkf&-}z={w<-@T8>)VRrw#o8vi{WnaKzRExgLjj8K z>!f3{lfrg)f zhXhGG%^}dqt}7#Xm8#Jf_Bp=~?^XL)-9K0UAf!`~&LVgP+5^0?wFX-m^~oVJLm*GX zw%u+_+RaN&XAyzqEerCLH?cuv_e__q!Ke8y>9w$Q#vzI7qMa1afRr>cLxr2`)Xn;1 zQ=;!_>)HaXeNPkg9;gi7r>TGj+RxUbm4{;D;go40y0P;BT+e*`i^7HwVsYSbpf??o zr4UcXXay1p&b*^ziv0pezS%R`Rr>>*f2e4Fgrjy7O0=IYlY@?LPEg&YR$Nuk=$25< z6FX#VE>NxFqDgM~QtOa}K^<-E`{OaOInf&VEPRFq9nVu9N-0fpFHTKv@3n_Tjvp@Y z#QAc#J^?XS6eQ!@of+qjrLf!#G$WbM4+f-*un|u*O!;_jVCIiE7nniO5gaZ)o9V#_ z1H!jrp>k?O#A;I|&bngbV8LM@bXobFK!vf|%dKk2;qt;*@~GtXhwRtBHHYpD#OM;ht0#GEqkbi@-r0^;!^9*7nOHj50V#?m;W`XF-Mnvadp5DJ<9PkO4gxK4KsfM z{yr!grUmJ$G5*SK_4Fg#X@*BPi+azVCVR9) z8Qv<))i!4KPwL(!Z5}nl`Zk_o=vAB+^{b#{pLIGa^WQgue>XwCQ6Db2Xw23ZE~xTd z4|T=t2$}`9{QSTqQ!_$X)1+77+M+o? z+A&;Da0kp@Xlj7lE_V3Vl$iNqr0>Wtqt>CtKU812Zw?_P`-mNd?WsJtdWz>S)blc6 z>tI4&8v;L@MC-bETe0$rcT3j`-A&4_Iv>K5hyk(VxZQiq%=B)AlitUgq4-8cQmK83 z!RmlLKR+i;L`dP#Eo@(YReafd=8Oo=kw_T_{W)P(c@RGM*x8@x5zzfsCoP?I+$LrR z5=#PKI@J^);k*YwQ4O(f#rBRUmT+}jmc3G1Lv*|2`+1aV9(k`VIQ2vY)_gtWIy}$B z-ni<=J*Fq212niHl;sGlcVTck;kf3wA^N#kQEn~9!Vrk8W1Lk4V%nShX<=ex6@<+J z<{~m!E>2juWd&XO(!sVJz}Rl~BB4q{r9Vu;$^1Lwa`~?klrw_RBDv{z1+8d-0<1|F zy4jDC{IzH`?tp|kB%1^L5aAG)n&zE3jk;W1XvV#Fmj@dZCcbNby}G?QXmX@i5O{(O z7#y}r7W^FYT}$d|B#j`(Re~W*4{LCTvY6<9F9K3z3gVkGNy^n$qy%WSDqSoItv0v` z3n;bwgdY3kO3WWI%-{=)c%C$2LUMD)l*PY*68jco@~h#0^?`^rMEi-Jj#Rh|>$Sw1 zzXr3DmGXlH65DZ_NxfvDhQln$C3s5cKc_n28?&M1^TsjXVGaNWhydS=9Ub&jqvnq< zVj8r0So?f2_Cz`Z3@~{G$;&(t5dr;?b{!E{9P9j1{G%(+uvMVLF_~5 zy$!wZmz?}1S}{YH@JKP9gqMVi8aLaN)|F_3Qag(g78TJcLXTe04>_D2C`p_`liXLO zt+AD_y{P(9G=274*Cm9mj6hKIbH)oc^DDaEkz%E|Z`*WtMg=N4(LH+xj>38J$eg_% zjn`6lYujOp>eWf)2|}|A3wOa+ShR02#hbc8e!|OBG6g9XQKqOI$juBSri!8)@ucC8 zdU4K*xI_+gIjo!j@sRv75%B<^Y%5Vgp z${O$*cdt*mY*s2wnKiDgX)S=1!Yl`Jx6Uab5@^e+7td4dYwEr{v(=nMr5KBCAcycJF1#s`vZ~ zN{rq_@oeJGS(8tjbRk=r*mxDOzV_@IX#iUfe=O8-{7#D8Fh+CAY$raUApO^=f^LL|&LH>fzB_-{ke-4-JZzgRNJI*u zpT9)FAn4QpLt5ryHl|ZlHJ9a2eJ_HSvZNO3cGP5sA1b$YCzJ=NxWJyLGCH}oukmQO z!kVCqIE0lG!Hx?qf2_{8u8;!)Hkll6;L3ADYM)m4K7mO*HHU{2V>l>KsHvpM4pu{BAJo~DCfhFh1kC(w=Dhf-ME06Ba)*W!+fAA{|}EOBE5h ztBHJ>92nK1taxA1e{EzS$(*q(xns$wtjC;vyIe8&&RQvON{gn{XKC`&lu35qul%uD z(e=EGtw(0T9T$U-7-*xgl{rzR=jpJcVpTYT&O10AKlj<%*W4TeIRq7yfm{zz9m`ioc9oRG!vWJ6zY_{nuli-p5+X*5mm!!k@B!eQ-M6&qBIoIPRdBaqO6I&O~A-0SlH057QAr~m)} literal 0 HcmV?d00001 diff --git a/BKPS/14031206/Indicators/Examples/RSI.mq5 b/BKPS/14031206/Indicators/Examples/RSI.mq5 new file mode 100644 index 0000000..48fb8a4 --- /dev/null +++ b/BKPS/14031206/Indicators/Examples/RSI.mq5 @@ -0,0 +1,115 @@ +//+------------------------------------------------------------------+ +//| RSI.mq5 | +//| Copyright 2000-2025, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2000-2025, MetaQuotes Ltd." +#property link "https://www.mql5.com" +#property description "Relative Strength Index" +//--- indicator settings +#property indicator_separate_window +#property indicator_minimum 0 +#property indicator_maximum 100 +#property indicator_level1 30 +#property indicator_level2 70 +#property indicator_buffers 3 +#property indicator_plots 1 +#property indicator_type1 DRAW_LINE +#property indicator_color1 DodgerBlue +//--- input parameters +input int InpPeriodRSI=14; // Period +//--- indicator buffers +double ExtRSIBuffer[]; +double ExtPosBuffer[]; +double ExtNegBuffer[]; + +int ExtPeriodRSI; +//+------------------------------------------------------------------+ +//| Custom indicator initialization function | +//+------------------------------------------------------------------+ +void OnInit() + { +//--- check for input + if(InpPeriodRSI<1) + { + ExtPeriodRSI=14; + PrintFormat("Incorrect value for input variable InpPeriodRSI = %d. Indicator will use value %d for calculations.", + InpPeriodRSI,ExtPeriodRSI); + } + else + ExtPeriodRSI=InpPeriodRSI; +//--- indicator buffers mapping + SetIndexBuffer(0,ExtRSIBuffer,INDICATOR_DATA); + SetIndexBuffer(1,ExtPosBuffer,INDICATOR_CALCULATIONS); + SetIndexBuffer(2,ExtNegBuffer,INDICATOR_CALCULATIONS); +//--- set accuracy + IndicatorSetInteger(INDICATOR_DIGITS,2); +//--- sets first bar from what index will be drawn + PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,ExtPeriodRSI); +//--- name for DataWindow and indicator subwindow label + IndicatorSetString(INDICATOR_SHORTNAME,"RSI("+string(ExtPeriodRSI)+")"); + } +//+------------------------------------------------------------------+ +//| Relative Strength Index | +//+------------------------------------------------------------------+ +int OnCalculate(const int rates_total, + const int prev_calculated, + const int begin, + const double &price[]) + { + if(rates_total<=ExtPeriodRSI) + return(0); +//--- preliminary calculations + int pos=prev_calculated-1; + if(pos<=ExtPeriodRSI) + { + double sum_pos=0.0; + double sum_neg=0.0; + //--- first RSIPeriod values of the indicator are not calculated + ExtRSIBuffer[0]=0.0; + ExtPosBuffer[0]=0.0; + ExtNegBuffer[0]=0.0; + for(int i=1; i<=ExtPeriodRSI; i++) + { + ExtRSIBuffer[i]=0.0; + ExtPosBuffer[i]=0.0; + ExtNegBuffer[i]=0.0; + double diff=price[i]-price[i-1]; + sum_pos+=(diff>0?diff:0); + sum_neg+=(diff<0?-diff:0); + } + //--- calculate first visible value + ExtPosBuffer[ExtPeriodRSI]=sum_pos/ExtPeriodRSI; + ExtNegBuffer[ExtPeriodRSI]=sum_neg/ExtPeriodRSI; + if(ExtNegBuffer[ExtPeriodRSI]!=0.0) + ExtRSIBuffer[ExtPeriodRSI]=100.0-(100.0/(1.0+ExtPosBuffer[ExtPeriodRSI]/ExtNegBuffer[ExtPeriodRSI])); + else + { + if(ExtPosBuffer[ExtPeriodRSI]!=0.0) + ExtRSIBuffer[ExtPeriodRSI]=100.0; + else + ExtRSIBuffer[ExtPeriodRSI]=50.0; + } + //--- prepare the position value for main calculation + pos=ExtPeriodRSI+1; + } +//--- the main loop of calculations + for(int i=pos; i0.0?diff:0.0))/ExtPeriodRSI; + ExtNegBuffer[i]=(ExtNegBuffer[i-1]*(ExtPeriodRSI-1)+(diff<0.0?-diff:0.0))/ExtPeriodRSI; + if(ExtNegBuffer[i]!=0.0) + ExtRSIBuffer[i]=100.0-100.0/(1+ExtPosBuffer[i]/ExtNegBuffer[i]); + else + { + if(ExtPosBuffer[i]!=0.0) + ExtRSIBuffer[i]=100.0; + else + ExtRSIBuffer[i]=50.0; + } + } +//--- OnCalculate done. Return new prev_calculated. + return(rates_total); + } +//+------------------------------------------------------------------+ diff --git a/BKPS/14031206/Indicators/Examples/RVI.ex5 b/BKPS/14031206/Indicators/Examples/RVI.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..dd3a9f207a2fdfa095984b1dfff89e2b1e9581a8 GIT binary patch literal 11452 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 B5^w+j literal 0 HcmV?d00001 diff --git a/BKPS/14031206/Indicators/Examples/RVI.mq5 b/BKPS/14031206/Indicators/Examples/RVI.mq5 new file mode 100644 index 0000000..902889f --- /dev/null +++ b/BKPS/14031206/Indicators/Examples/RVI.mq5 @@ -0,0 +1,102 @@ +//+------------------------------------------------------------------+ +//| RVI.mq5 | +//| Copyright 2000-2025, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2000-2025, MetaQuotes Ltd." +#property link "https://www.mql5.com" +#property description "Relative Vigor Index" +//--- indicator settings +#property indicator_separate_window +#property indicator_buffers 2 +#property indicator_plots 2 +#property indicator_type1 DRAW_LINE +#property indicator_type2 DRAW_LINE +#property indicator_color1 Green +#property indicator_color2 Red +#property indicator_label1 "RVI" +#property indicator_label2 "Signal" +//--- input parameters +input int InpRVIPeriod=10; // Period +//--- indicator buffers +double ExtRVIBuffer[]; +double ExtSignalBuffer[]; + +#define TRIANGLE_PERIOD 3 +#define AVERAGE_PERIOD (TRIANGLE_PERIOD*2) +//+------------------------------------------------------------------+ +//| Custom indicator initialization function | +//+------------------------------------------------------------------+ +void OnInit() + { +//--- indicator buffers mapping + SetIndexBuffer(0,ExtRVIBuffer,INDICATOR_DATA); + SetIndexBuffer(1,ExtSignalBuffer,INDICATOR_DATA); + IndicatorSetInteger(INDICATOR_DIGITS,3); +//--- sets first bar from what index will be drawn + PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,(InpRVIPeriod-1)+TRIANGLE_PERIOD); + PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,(InpRVIPeriod-1)+AVERAGE_PERIOD); +//--- name for DataWindow and indicator subwindow label + string short_name=StringFormat("RVI(%d)",InpRVIPeriod); + IndicatorSetString(INDICATOR_SHORTNAME,short_name); + PlotIndexSetString(0,PLOT_LABEL,short_name); + PlotIndexSetString(1,PLOT_LABEL,"Signal("+string(InpRVIPeriod)+")"); + } +//+------------------------------------------------------------------+ +//| Relative Vigor Index | +//+------------------------------------------------------------------+ +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[]) + { + if(rates_total<=InpRVIPeriod+AVERAGE_PERIOD+2) + return(0); + + int i,start; +//--- last counted bar will be recounted + start=InpRVIPeriod+2; + if(prev_calculated>InpRVIPeriod+TRIANGLE_PERIOD+2) + start=prev_calculated-1; +//--- set empty value for uncalculated bars + if(prev_calculated==0) + { + for(i=0; ii-InpRVIPeriod; j--) + { + double value_up=close[j]-open[j]+2*(close[j-1]-open[j-1])+2*(close[j-2]-open[j-2])+close[j-3]-open[j-3]; + double value_down=high[j]-low[j]+2*(high[j-1]-low[j-1])+2*(high[j-2]-low[j-2])+high[j-3]-low[j-3]; + sum_up+=value_up; + sum_down+=value_down; + } + if(sum_down!=0.0) + ExtRVIBuffer[i]=sum_up/sum_down; + else + ExtRVIBuffer[i]=sum_up; + } +//--- signal line counted in the 2-nd buffer + start=InpRVIPeriod+TRIANGLE_PERIOD+2; + if(prev_calculated>InpRVIPeriod+AVERAGE_PERIOD+2) + start=prev_calculated-1; + for(i=start; ih(Z{*O8R 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 + +#property indicator_separate_window +#property indicator_buffers 2 +#property indicator_plots 1 +#property indicator_type1 DRAW_LINE +#property indicator_color1 MediumSeaGreen +#property indicator_style1 STYLE_SOLID +//--- input parametrs +input int InpStdDevPeriod=20; // Period +input int InpStdDevShift=0; // Shift +input ENUM_MA_METHOD InpMAMethod=MODE_SMA; // Method +//--- indicator buffers +double ExtStdDevBuffer[]; +double ExtMABuffer[]; + +int ExtStdDevPeriod,ExtStdDevShift; +//+------------------------------------------------------------------+ +//| Custom indicator initialization function | +//+------------------------------------------------------------------+ +void OnInit() + { +//--- check for input values + if(InpStdDevPeriod<=1) + { + ExtStdDevPeriod=20; + PrintFormat("Incorrect value for input variable InpStdDevPeriod=%d. Indicator will use value %d for calculations.", + InpStdDevPeriod,ExtStdDevPeriod); + } + else + ExtStdDevPeriod=InpStdDevPeriod; + if(InpStdDevShift<0) + { + ExtStdDevShift=0; + PrintFormat("Incorrect value for input variable InpStdDevShift=%d. Indicator will use value %d for calculations.", + InpStdDevShift,ExtStdDevShift); + } + else + ExtStdDevShift=InpStdDevShift; +//--- define indicator buffers as indexes + SetIndexBuffer(0,ExtStdDevBuffer); + SetIndexBuffer(1,ExtMABuffer,INDICATOR_CALCULATIONS); +//--- set indicator short name + string short_name=StringFormat("StdDev(%d)",ExtStdDevPeriod); + IndicatorSetString(INDICATOR_SHORTNAME,short_name); + PlotIndexSetString(0,PLOT_LABEL,short_name); +//--- set index shift + PlotIndexSetInteger(0,PLOT_SHIFT,ExtStdDevShift); + } +//+------------------------------------------------------------------+ +//| Custom indicator iteration function | +//+------------------------------------------------------------------+ +int OnCalculate(const int rates_total,const int prev_calculated,const int begin,const double &price[]) + { + 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 QPVJ8DU+xNrt}){O3*$tHaR2}S literal 0 HcmV?d00001 diff --git a/BKPS/14031206/Indicators/Examples/Stochastic.mq5 b/BKPS/14031206/Indicators/Examples/Stochastic.mq5 new file mode 100644 index 0000000..72320cc --- /dev/null +++ b/BKPS/14031206/Indicators/Examples/Stochastic.mq5 @@ -0,0 +1,142 @@ +//+------------------------------------------------------------------+ +//| Stochastic.mq5 | +//| Copyright 2000-2025, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2000-2025, MetaQuotes Ltd." +#property link "https://www.mql5.com" +//--- indicator settings +#property indicator_separate_window +#property indicator_buffers 4 +#property indicator_plots 2 +#property indicator_type1 DRAW_LINE +#property indicator_type2 DRAW_LINE +#property indicator_color1 LightSeaGreen +#property indicator_color2 Red +#property indicator_style2 STYLE_DOT +//--- input parameters +input int InpKPeriod=5; // K period +input int InpDPeriod=3; // D period +input int InpSlowing=3; // Slowing +//--- indicator buffers +double ExtMainBuffer[]; +double ExtSignalBuffer[]; +double ExtHighesBuffer[]; +double ExtLowesBuffer[]; +//+------------------------------------------------------------------+ +//| Custom indicator initialization function | +//+------------------------------------------------------------------+ +void OnInit() + { +//--- indicator buffers mapping + SetIndexBuffer(0,ExtMainBuffer,INDICATOR_DATA); + SetIndexBuffer(1,ExtSignalBuffer,INDICATOR_DATA); + SetIndexBuffer(2,ExtHighesBuffer,INDICATOR_CALCULATIONS); + SetIndexBuffer(3,ExtLowesBuffer,INDICATOR_CALCULATIONS); +//--- set accuracy + IndicatorSetInteger(INDICATOR_DIGITS,2); +//--- set levels + IndicatorSetInteger(INDICATOR_LEVELS,2); + IndicatorSetDouble(INDICATOR_LEVELVALUE,0,20); + IndicatorSetDouble(INDICATOR_LEVELVALUE,1,80); +//--- set maximum and minimum for subwindow + IndicatorSetDouble(INDICATOR_MINIMUM,0); + IndicatorSetDouble(INDICATOR_MAXIMUM,100); +//--- name for DataWindow and indicator subwindow label + string short_name=StringFormat("Stoch(%d,%d,%d)",InpKPeriod,InpDPeriod,InpSlowing); + IndicatorSetString(INDICATOR_SHORTNAME,short_name); + PlotIndexSetString(0,PLOT_LABEL,"Main"); + PlotIndexSetString(1,PLOT_LABEL,"Signal"); +//--- sets first bar from what index will be drawn + PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,InpKPeriod+InpSlowing-2); + PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,InpKPeriod+InpDPeriod); + } +//+------------------------------------------------------------------+ +//| Stochastic Oscillator | +//+------------------------------------------------------------------+ +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[]) + { + int i,k,start; +//--- check for bars count + if(rates_total<=InpKPeriod+InpDPeriod+InpSlowing) + return(0); +//--- + start=InpKPeriod-1; + if(start+1low[k]) + dmin=low[k]; + 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 txur0p2W^1ZsTG89f<+)g2EeBH(?`)lIok-5v +//--- indicator settings +#property indicator_chart_window +#property indicator_buffers 4 +#property indicator_plots 1 +#property indicator_type1 DRAW_LINE +#property indicator_color1 DarkBlue +#property indicator_width1 1 +#property indicator_label1 "TEMA" +#property indicator_applied_price PRICE_CLOSE +//--- input parameters +input int InpPeriodEMA=14; // EMA period +input int InpShift=0; // Indicator's shift +//--- indicator buffers +double TemaBuffer[]; +double Ema[]; +double EmaOfEma[]; +double EmaOfEmaOfEma[]; +//+------------------------------------------------------------------+ +//| Custom indicator initialization function | +//+------------------------------------------------------------------+ +void OnInit() + { +//--- indicator buffers mapping + SetIndexBuffer(0,TemaBuffer,INDICATOR_DATA); + SetIndexBuffer(1,Ema,INDICATOR_CALCULATIONS); + SetIndexBuffer(2,EmaOfEma,INDICATOR_CALCULATIONS); + SetIndexBuffer(3,EmaOfEmaOfEma,INDICATOR_CALCULATIONS); +//--- sets first bar from what index will be drawn + PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,3*InpPeriodEMA-3); +//--- sets indicator shift + PlotIndexSetInteger(0,PLOT_SHIFT,InpShift); +//--- name for indicator label + string short_name=StringFormat("TEMA(%d)",InpPeriodEMA); + IndicatorSetString(INDICATOR_SHORTNAME,short_name); + PlotIndexSetString(0,PLOT_LABEL,short_name); + } +//+------------------------------------------------------------------+ +//| Triple Exponential Moving Average | +//+------------------------------------------------------------------+ +int OnCalculate(const int rates_total, + const int prev_calculated, + const int begin, + const double &price[]) + { + if(rates_total<3*InpPeriodEMA-3) + return(0); +//--- + int start; + if(prev_calculated==0) + start=0; + else + start=prev_calculated-1; +//--- calculate EMA + ExponentialMAOnBuffer(rates_total,prev_calculated,0,InpPeriodEMA,price,Ema); +//--- calculate EMA on EMA array + ExponentialMAOnBuffer(rates_total,prev_calculated,InpPeriodEMA-1,InpPeriodEMA,Ema,EmaOfEma); +//--- calculate EMA on EMA array on EMA array + ExponentialMAOnBuffer(rates_total,prev_calculated,2*InpPeriodEMA-2,InpPeriodEMA,EmaOfEma,EmaOfEmaOfEma); +//--- calculate TEMA + for(int i=start; i&|!I?)~5Ys=K>()#~nA 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 +//--- indicator settings +#property indicator_separate_window +#property indicator_buffers 4 +#property indicator_plots 1 +#property indicator_type1 DRAW_LINE +#property indicator_color1 Red +#property indicator_width1 1 +#property indicator_label1 "TRIX" +#property indicator_applied_price PRICE_CLOSE +//--- input parameters +input int InpPeriodEMA=14; // EMA period +//--- indicator buffers +double TRIX_Buffer[]; +double EMA[]; +double SecondEMA[]; +double ThirdEMA[]; +//+------------------------------------------------------------------+ +//| Custom indicator initialization function | +//+------------------------------------------------------------------+ +void OnInit() + { +//--- indicator buffers mapping + SetIndexBuffer(0,TRIX_Buffer,INDICATOR_DATA); + SetIndexBuffer(1,EMA,INDICATOR_CALCULATIONS); + SetIndexBuffer(2,SecondEMA,INDICATOR_CALCULATIONS); + SetIndexBuffer(3,ThirdEMA,INDICATOR_CALCULATIONS); +//--- sets first bar from what index will be drawn + PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,3*InpPeriodEMA-3); +//--- name for index label + string short_name=StringFormat("TRIX(%d)",InpPeriodEMA); + IndicatorSetString(INDICATOR_SHORTNAME,short_name); + PlotIndexSetString(0,PLOT_LABEL,short_name); +//--- indicator digits + IndicatorSetInteger(INDICATOR_DIGITS,5); + } +//+------------------------------------------------------------------+ +//| Triple Exponential Average | +//+------------------------------------------------------------------+ +int OnCalculate(const int rates_total, + const int prev_calculated, + const int begin, + const double &price[]) + { + if(rates_total<3*InpPeriodEMA-3) + return(0); +//--- + int start; + if(prev_calculated==0) + { + start=3*(InpPeriodEMA-1); + for(int i=0; iZdW>~Qzw_0Md#jMPV#qqz$e}MGA1OJ6R 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 RD+Y3A1G#HdrDU4({|7)BbhH2f literal 0 HcmV?d00001 diff --git a/BKPS/14031206/Indicators/Examples/Ultimate_Oscillator.mq5 b/BKPS/14031206/Indicators/Examples/Ultimate_Oscillator.mq5 new file mode 100644 index 0000000..4db4146 --- /dev/null +++ b/BKPS/14031206/Indicators/Examples/Ultimate_Oscillator.mq5 @@ -0,0 +1,178 @@ +//+------------------------------------------------------------------+ +//| Ultimate_Oscillator.mq5 | +//| Copyright 2000-2025, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2000-2025, MetaQuotes Ltd." +#property link "https://www.mql5.com" +#include +//--- indicator settings +#property indicator_separate_window +#property indicator_buffers 5 +#property indicator_plots 1 +#property indicator_type1 DRAW_LINE +#property indicator_color1 DodgerBlue +//--- input parameters +input int InpFastPeriod=7; // Fast ATR period +input int InpMiddlePeriod=14; // Middle ATR period +input int InpSlowPeriod=28; // Slow ATR period +input int InpFastK=4; // Fast K +input int InpMiddleK=2; // Middle K +input int InpSlowK=1; // Slow K +//--- indicator buffers +double ExtUOBuffer[]; +double ExtBPBuffer[]; +double ExtFastATRBuffer[]; +double ExtMiddleATRBuffer[]; +double ExtSlowATRBuffer[]; +//--- indicator handles +int ExtFastATRhandle; +int ExtMiddleATRhandle; +int ExtSlowATRhandle; + +double ExtDivider; +int ExtMaxPeriod; +//+------------------------------------------------------------------+ +//| Custom indicator initialization function | +//+------------------------------------------------------------------+ +void OnInit() + { +//--- indicator buffers mapping + SetIndexBuffer(0,ExtUOBuffer,INDICATOR_DATA); + SetIndexBuffer(1,ExtBPBuffer,INDICATOR_CALCULATIONS); + SetIndexBuffer(2,ExtFastATRBuffer,INDICATOR_CALCULATIONS); + SetIndexBuffer(3,ExtMiddleATRBuffer,INDICATOR_CALCULATIONS); + SetIndexBuffer(4,ExtSlowATRBuffer,INDICATOR_CALCULATIONS); +//--- set accuracy + IndicatorSetInteger(INDICATOR_DIGITS,2); +//--- set levels + IndicatorSetInteger(INDICATOR_LEVELS,2); + IndicatorSetDouble(INDICATOR_LEVELVALUE,0,30); + IndicatorSetDouble(INDICATOR_LEVELVALUE,1,70); +//--- set maximum and minimum for subwindow + IndicatorSetDouble(INDICATOR_MINIMUM,0); + IndicatorSetDouble(INDICATOR_MAXIMUM,100); +//--- set first bar from which index will be drawn + PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,InpSlowPeriod-1); +//--- name for DataWindow and indicator subwindow label + string short_name=StringFormat("UOS(%d,%d,%d)",InpFastPeriod,InpMiddlePeriod,InpSlowPeriod); + IndicatorSetString(INDICATOR_SHORTNAME,short_name); +//--- get handles + ExtFastATRhandle=iATR(Symbol(),0,InpFastPeriod); + ExtMiddleATRhandle=iATR(Symbol(),0,InpMiddlePeriod); + ExtSlowATRhandle=iATR(Symbol(),0,InpSlowPeriod); +//--- + ExtDivider=InpFastK+InpMiddleK+InpSlowK; + ExtMaxPeriod=InpSlowPeriod; + if(ExtMaxPeriodrates_total || prev_calculated<0) + to_copy=rates_total; + else + { + to_copy=rates_total-prev_calculated; + if(prev_calculated>0) + to_copy++; + } +//--- get ATR buffers + if(IsStopped()) // checking for stop flag + return(0); + if(CopyBuffer(ExtFastATRhandle,0,0,to_copy,ExtFastATRBuffer)<=0) + { + Print("getting ExtFastATRhandle is failed! Error ",GetLastError()); + return(0); + } + if(IsStopped()) // checking for stop flag + return(0); + if(CopyBuffer(ExtMiddleATRhandle,0,0,to_copy,ExtMiddleATRBuffer)<=0) + { + Print("getting ExtMiddleATRhandle is failed! Error ",GetLastError()); + return(0); + } + if(IsStopped()) // checking for stop flag + return(0); + if(CopyBuffer(ExtSlowATRhandle,0,0,to_copy,ExtSlowATRBuffer)<=0) + { + Print("getting ExtSlowATRhandle is failed! Error ",GetLastError()); + return(0); + } +//--- preliminary calculations + int i,start; + if(prev_calculated==0) + { + ExtBPBuffer[0]=0.0; + ExtUOBuffer[0]=0.0; + //--- set value for first InpSlowPeriod bars + for(i=1; i<=InpSlowPeriod; i++) + { + ExtUOBuffer[i]=0.0; + double true_low=MathMin(low[i],close[i-1]); + ExtBPBuffer[i]=close[i]-true_low; + } + //--- now we are going to calculate from start index in main loop + start=InpSlowPeriod+1; + } + else + start=prev_calculated-1; +//--- the main loop of calculations + for(i=start; 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 && pos0.0) + sum_up+=diff; + else + sum_down+=(-diff); + } + if(sum_up+sum_down!=0.0) + res=(sum_up-sum_down)/(sum_up+sum_down); + } +//--- + return(res); + } +//+------------------------------------------------------------------+ diff --git a/BKPS/14031206/Indicators/Examples/VROC.ex5 b/BKPS/14031206/Indicators/Examples/VROC.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..38a6603c626096c72149577109a3c6b87b58f17b GIT binary patch literal 11132 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 + ExtColorsBuffer[i]=0.0; + else + ExtColorsBuffer[i]=1.0; + } +//--- + } +//+------------------------------------------------------------------+ diff --git a/BKPS/14031206/Indicators/Examples/WPR.ex5 b/BKPS/14031206/Indicators/Examples/WPR.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..c1d72a0d13b32344eea157af42de06ef51cb83f6 GIT binary patch literal 9810 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 literal 0 HcmV?d00001 diff --git a/BKPS/14031206/Indicators/Examples/W_AD.mq5 b/BKPS/14031206/Indicators/Examples/W_AD.mq5 new file mode 100644 index 0000000..e5aca1a --- /dev/null +++ b/BKPS/14031206/Indicators/Examples/W_AD.mq5 @@ -0,0 +1,96 @@ +//+------------------------------------------------------------------+ +//| W_AD.mq5 | +//| Copyright 2000-2025, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2000-2025, MetaQuotes Ltd." +#property link "https://www.mql5.com" +#property description "Larry Williams' Accumulation/Distribution" +//--- indicator settings +#property indicator_separate_window +#property indicator_buffers 1 +#property indicator_plots 1 +#property indicator_type1 DRAW_LINE +#property indicator_color1 LightSeaGreen +//--- indicator buffer +double ExtWADBuffer[]; +//+------------------------------------------------------------------+ +//| Custom indicator initialization function | +//+------------------------------------------------------------------+ +void OnInit() + { +//--- define buffer + SetIndexBuffer(0,ExtWADBuffer); +//--- set draw begin + PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,1); +//--- indicator name + IndicatorSetString(INDICATOR_SHORTNAME,"W_A/D"); +//--- round settings + IndicatorSetInteger(INDICATOR_DIGITS,_Digits); + } +//+------------------------------------------------------------------+ +//| Custom indicator iteration function | +//+------------------------------------------------------------------+ +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[]) + { +//--- + if(rates_total<2) + return(0); +//--- start working + int pos=prev_calculated-1; + if(pos<1) + { + pos=1; + ExtWADBuffer[0]=0.0; + } +//--- main cycle + for(int i=pos; iprev_cl) + ExtWADBuffer[i]=ExtWADBuffer[i-1]+cl-trl; + else + ExtWADBuffer[i]=ExtWADBuffer[i-1]+cl-trh; + } + } +//--- OnCalculate done. Return new prev_calculated. + return(rates_total); + } +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +bool IsEqualDoubles(double d1,double d2,double epsilon) + { + if(epsilon<0.0) + epsilon=-epsilon; + if(epsilon>0.1) + epsilon=0.00001; +//--- + double diff=d1-d2; + if(diff>epsilon || diff<-epsilon) + return(false); +//--- + return(true); + } +//+------------------------------------------------------------------+ diff --git a/BKPS/14031206/Indicators/Examples/ZigZag.ex5 b/BKPS/14031206/Indicators/Examples/ZigZag.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..bfd034c2996c0b0c943d974d71a010fb02584e17 GIT binary patch literal 12604 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 literal 0 HcmV?d00001 diff --git a/BKPS/14031206/Experts/Free Robots/BullishBearish MeetingLines Stoch.mq5 b/BKPS/14031206/Experts/Free Robots/BullishBearish MeetingLines Stoch.mq5 new file mode 100644 index 0000000..de4acc7 --- /dev/null +++ b/BKPS/14031206/Experts/Free Robots/BullishBearish MeetingLines Stoch.mq5 @@ -0,0 +1,662 @@ +//+------------------------------------------------------------------+ +//| BullishBearish MeetingLines Stoch.mq5 | +//| Copyright 2024, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2024, MetaQuotes Ltd." +#property link "https://www.mql5.com" +#property version "1.00" + +#include +#include + +#define SIGNAL_BUY 1 // Buy signal +#define SIGNAL_NOT 0 // no trading signal +#define SIGNAL_SELL -1 // Sell signal + +#define CLOSE_LONG 2 // signal to close Long +#define CLOSE_SHORT -2 // signal to close Short + +//--- Input parameters +input int InpAverBodyPeriod=12; // period for calculating average candlestick size +input int InpStochK =47; // period %K +input int InpStochD =9; // period %D +input int InpStochSlow =13; // smoothing period %K +input ENUM_STO_PRICE InpStochApplied=STO_LOWHIGH; // calculation type +input ENUM_MA_METHOD InpStochMA =MODE_SMA; // smoothing type + +//--- trade parameters +input uint InpDuration=10; // position holding time in bars +input uint InpSL =200; // Stop Loss in points +input uint InpTP =200; // Take Profit in points +input uint InpSlippage=10; // slippage in points +//--- money management parameters +input double InpLot=0.1; // lot +//--- Expert ID +input long InpMagicNumber=123400; // Magic Number + +//--- global variables +int ExtAvgBodyPeriod; // average candlestick calculation period +int ExtSignalOpen=0; // Buy/Sell signal +int ExtSignalClose=0; // signal to close a position +string ExtPatternInfo=""; // current pattern information +string ExtDirection=""; // position opening direction +bool ExtPatternDetected=false; // pattern detected +bool ExtConfirmed=false; // pattern confirmed +bool ExtCloseByTime=true; // requires closing by time +bool ExtCheckPassed=true; // status checking error +//--- indicator handle +int ExtIndicatorHandle=INVALID_HANDLE; + +//--- service objects +CTrade ExtTrade; +CSymbolInfo ExtSymbolInfo; +//+------------------------------------------------------------------+ +//| Expert initialization function | +//+------------------------------------------------------------------+ +int OnInit() + { + Print("InpSL=", InpSL); + Print("InpTP=", InpTP); +//--- set parameters for trading operations + ExtTrade.SetDeviationInPoints(InpSlippage); // slippage + ExtTrade.SetExpertMagicNumber(InpMagicNumber); // Expert Advisor ID + ExtTrade.LogLevel(LOG_LEVEL_ERRORS); // logging level + + ExtAvgBodyPeriod=InpAverBodyPeriod; +//--- indicator initialization + ExtIndicatorHandle=iStochastic(_Symbol, _Period, InpStochK, InpStochD, InpStochSlow, InpStochMA, InpStochApplied); + if(ExtIndicatorHandle==INVALID_HANDLE) + { + Print("Error creating iStochastic indicator"); + return(INIT_FAILED); + } +//--- OK + return(INIT_SUCCEEDED); + } +//+------------------------------------------------------------------+ +//| Expert deinitialization function | +//+------------------------------------------------------------------+ +void OnDeinit(const int reason) + { +//--- release indicator handle + IndicatorRelease(ExtIndicatorHandle); + } +//+------------------------------------------------------------------+ +//| Expert tick function | +//+------------------------------------------------------------------+ +void OnTick() + { +//--- save the next bar start time; all checks at bar opening only + static datetime next_bar_open=0; + +//--- Phase 1 - check the emergence of a new bar and update the status + if(TimeCurrent()>=next_bar_open) + { + //--- get the current state of environment on the new bar + // namely, set the values of global variables: + // ExtPatternDetected - pattern detection + // ExtConfirmed - pattern confirmation + // ExtSignalOpen - signal to open + // ExtSignalClose - signal to close + // ExtPatternInfo - current pattern information + if(CheckState()) + { + //--- set the new bar opening time + next_bar_open=TimeCurrent(); + next_bar_open-=next_bar_open%PeriodSeconds(_Period); + next_bar_open+=PeriodSeconds(_Period); + + //--- report the emergence of a new bar only once within a bar + if(ExtPatternDetected && ExtConfirmed) + Print(ExtPatternInfo); + } + else + { + //--- error getting the status, retry on the next tick + return; + } + } + +//--- Phase 2 - if there is a signal and no position in this direction + if(ExtSignalOpen && !PositionExist(ExtSignalOpen)) + { + Print("\r\nSignal to open position ", ExtDirection); + PositionOpen(); + if(PositionExist(ExtSignalOpen)) + ExtSignalOpen=SIGNAL_NOT; + } + +//--- Phase 3 - close if there is a signal to close + if(ExtSignalClose && PositionExist(ExtSignalClose)) + { + Print("\r\nSignal to close position ", ExtDirection); + CloseBySignal(ExtSignalClose); + if(!PositionExist(ExtSignalClose)) + ExtSignalClose=SIGNAL_NOT; + } + +//--- Phase 4 - close upon expiration + if(ExtCloseByTime && PositionExpiredByTimeExist()) + { + CloseByTime(); + ExtCloseByTime=PositionExpiredByTimeExist(); + } + } +//+------------------------------------------------------------------+ +//| Get the current environment and check for a pattern | +//+------------------------------------------------------------------+ +bool CheckState() + { +//--- check if there is a pattern + if(!CheckPattern()) + { + Print("Error, failed to check pattern"); + return(false); + } + +//--- check for confirmation + if(!CheckConfirmation()) + { + Print("Error, failed to check pattern confirmation"); + return(false); + } +//--- if there is no confirmation, cancel the signal + if(!ExtConfirmed) + ExtSignalOpen=SIGNAL_NOT; + +//--- check if there is a signal to close a position + if(!CheckCloseSignal()) + { + Print("Error, failed to check the closing signal"); + return(false); + } + +//--- if positions are to be closed after certain holding time in bars + if(InpDuration) + ExtCloseByTime=true; // set flag to close upon expiration + +//--- all checks done + return(true); + } +//+------------------------------------------------------------------+ +//| Open a position in the direction of the signal | +//+------------------------------------------------------------------+ +bool PositionOpen() + { + ExtSymbolInfo.Refresh(); + ExtSymbolInfo.RefreshRates(); + + double price=0; +//--- Stop Loss and Take Profit are not set by default + double stoploss=0.0; + double takeprofit=0.0; + + int digits=ExtSymbolInfo.Digits(); + double point=ExtSymbolInfo.Point(); + double spread=ExtSymbolInfo.Ask()-ExtSymbolInfo.Bid(); + +//--- uptrend + if(ExtSignalOpen==SIGNAL_BUY) + { + price=NormalizeDouble(ExtSymbolInfo.Ask(), digits); + //--- if Stop Loss is set + if(InpSL>0) + { + if(spread>=InpSL*point) + { + PrintFormat("StopLoss (%d points) <= current spread = %.0f points. Spread value will be used", InpSL, spread/point); + stoploss = NormalizeDouble(price-spread, digits); + } + else + stoploss = NormalizeDouble(price-InpSL*point, digits); + } + //--- if Take Profit is set + if(InpTP>0) + { + if(spread>=InpTP*point) + { + PrintFormat("TakeProfit (%d points) < current spread = %.0f points. Spread value will be used", InpTP, spread/point); + takeprofit = NormalizeDouble(price+spread, digits); + } + else + takeprofit = NormalizeDouble(price+InpTP*point, digits); + } + + if(!ExtTrade.Buy(InpLot, Symbol(), price, stoploss, takeprofit)) + { + PrintFormat("Failed %s buy %G at %G (sl=%G tp=%G) failed. Ask=%G error=%d", + Symbol(), InpLot, price, stoploss, takeprofit, ExtSymbolInfo.Ask(), GetLastError()); + return(false); + } + } + +//--- downtrend + if(ExtSignalOpen==SIGNAL_SELL) + { + price=NormalizeDouble(ExtSymbolInfo.Bid(), digits); + //--- if Stop Loss is set + if(InpSL>0) + { + if(spread>=InpSL*point) + { + PrintFormat("StopLoss (%d points) <= current spread = %.0f points. Spread value will be used", InpSL, spread/point); + stoploss = NormalizeDouble(price+spread, digits); + } + else + stoploss = NormalizeDouble(price+InpSL*point, digits); + } + //--- if Take Profit is set + if(InpTP>0) + { + if(spread>=InpTP*point) + { + PrintFormat("TakeProfit (%d points) < current spread = %.0f points. Spread value will be used", InpTP, spread/point); + takeprofit = NormalizeDouble(price-spread, digits); + } + else + takeprofit = NormalizeDouble(price-InpTP*point, digits); + } + + if(!ExtTrade.Sell(InpLot, Symbol(), price, stoploss, takeprofit)) + { + PrintFormat("Failed %s sell at %G (sl=%G tp=%G) failed. Bid=%G error=%d", + Symbol(), price, stoploss, takeprofit, ExtSymbolInfo.Bid(), GetLastError()); + ExtTrade.PrintResult(); + Print(" "); + return(false); + } + } + + return(true); + } +//+------------------------------------------------------------------+ +//| Close a position based on the specified signal | +//+------------------------------------------------------------------+ +void CloseBySignal(int type_close) + { +//--- if there is no signal to close, return successful completion + if(type_close==SIGNAL_NOT) + return; +//--- if there are no positions opened by our EA + if(PositionExist(ExtSignalClose)==0) + return; + +//--- closing direction + long type; + switch(type_close) + { + case CLOSE_SHORT: + type=POSITION_TYPE_SELL; + break; + case CLOSE_LONG: + type=POSITION_TYPE_BUY; + break; + default: + Print("Error! Signal to close not detected"); + return; + } + +//--- check all positions and close ours based on the signal + int positions=PositionsTotal(); + for(int i=positions-1; i>=0; i--) + { + ulong ticket=PositionGetTicket(i); + if(ticket!=0) + { + //--- get the name of the symbol and the position id (magic) + string symbol=PositionGetString(POSITION_SYMBOL); + long magic =PositionGetInteger(POSITION_MAGIC); + //--- if they correspond to our values + if(symbol==Symbol() && magic==InpMagicNumber) + { + if(PositionGetInteger(POSITION_TYPE)==type) + { + ExtTrade.PositionClose(ticket, InpSlippage); + ExtTrade.PrintResult(); + Print(" "); + } + } + } + } + } +//+------------------------------------------------------------------+ +//| Close positions upon holding time expiration in bars | +//+------------------------------------------------------------------+ +void CloseByTime() + { +//--- if there are no positions opened by our EA + if(PositionExist(ExtSignalOpen)==0) + return; + +//--- check all positions and close ours based on the holding time in bars + int positions=PositionsTotal(); + for(int i=positions-1; i>=0; i--) + { + ulong ticket=PositionGetTicket(i); + if(ticket!=0) + { + //--- get the name of the symbol and the position id (magic) + string symbol=PositionGetString(POSITION_SYMBOL); + long magic =PositionGetInteger(POSITION_MAGIC); + //--- if they correspond to our values + if(symbol==Symbol() && magic==InpMagicNumber) + { + //--- position opening time + datetime open_time=(datetime)PositionGetInteger(POSITION_TIME); + //--- check position holding time in bars + if(BarsHold(open_time)>=(int)InpDuration) + { + Print("\r\nTime to close position #", ticket); + ExtTrade.PositionClose(ticket, InpSlippage); + ExtTrade.PrintResult(); + Print(" "); + } + } + } + } + } +//+------------------------------------------------------------------+ +//| Returns true if there are open positions | +//+------------------------------------------------------------------+ +bool PositionExist(int signal_direction) + { + bool check_type=(signal_direction!=SIGNAL_NOT); + +//--- what positions to search + ENUM_POSITION_TYPE search_type=WRONG_VALUE; + if(check_type) + switch(signal_direction) + { + case SIGNAL_BUY: + search_type=POSITION_TYPE_BUY; + break; + case SIGNAL_SELL: + search_type=POSITION_TYPE_SELL; + break; + case CLOSE_LONG: + search_type=POSITION_TYPE_BUY; + break; + case CLOSE_SHORT: + search_type=POSITION_TYPE_SELL; + break; + default: + //--- entry direction is not specified; nothing to search + return(false); + } + +//--- go through the list of all positions + int positions=PositionsTotal(); + for(int i=0; i=(int)InpDuration)) + return(true); + } + } + } + +//--- open position not found + return(false); + } + +//+------------------------------------------------------------------+ +//| Checks position closing time in bars | +//+------------------------------------------------------------------+ +int BarsHold(datetime open_time) + { +//--- first run a basic simple check + if(TimeCurrent()-open_timeAvgBody(1)) && // long black + (Open(2)-Close(2)>AvgBody(1)) && + (Open(1)-Close(1)>AvgBody(1)) && + (MidPoint(2)AvgBody(1)) && // long white + (Close(2)-Open(2)>AvgBody(1)) && + (Close(1)-Open(1)>AvgBody(1)) && + (MidPoint(2)>MidPoint(3)) && // higher midpoints + (MidPoint(1)>MidPoint(2))) + { + ExtPatternDetected=true; + ExtSignalOpen=SIGNAL_BUY; + ExtPatternInfo="\r\n3 White Soldiers detected"; + ExtDirection="Buy"; + return(true); + } + +//--- result of checking + return(ExtCheckPassed); + } +//+------------------------------------------------------------------+ +//| Returns true in case of successful confirmation check | +//+------------------------------------------------------------------+ +bool CheckConfirmation() + { + ExtConfirmed=false; +//--- if there is no pattern, do not search for confirmation + if(!ExtPatternDetected) + return(true); + +//--- get the value of the stochastic indicator to confirm the signal + double signal=StochSignal(1); + if(signal==EMPTY_VALUE) + { + //--- failed to get indicator value, check failed + return(false); + } + +//--- check the Buy signal + if(ExtSignalOpen==SIGNAL_BUY && (signal<30)) + { + ExtConfirmed=true; + ExtPatternInfo+="\r\n Confirmed: StochSignal<30"; + } + +//--- check the Sell signal + if(ExtSignalOpen==SIGNAL_SELL && (signal>70)) + { + ExtConfirmed=true; + ExtPatternInfo+="\r\n Confirmed: StochSignal>70"; + } + +//--- successful completion of the check + return(true); + } +//+------------------------------------------------------------------+ +//| Check if there is a signal to close | +//+------------------------------------------------------------------+ +bool CheckCloseSignal() + { + ExtSignalClose=false; +//--- if there is a signal to enter the market, do not check the signal to close + if(ExtSignalOpen!=SIGNAL_NOT) + return(true); + +//--- check if there is a signal to close a long position + if(((StochSignal(1)<80) && (StochSignal(2)>80))|| // 80 crossed downwards + ((StochSignal(1)<20) && (StochSignal(2)>20))) // 20 crossed downwards + { + //--- there is a signal to close a long position + ExtSignalClose=CLOSE_LONG; + ExtDirection="Long"; + } + +//--- check if there is a signal to close a short position + if((((StochSignal(1)>20) && (StochSignal(2)<20)) || // 20 crossed upwards + ((StochSignal(1)>80) && (StochSignal(2)<80)))) // 80 crossed upwards + { + //--- there is a signal to close a short position + ExtSignalClose=CLOSE_SHORT; + ExtDirection="Short"; + } + +//--- successful completion of the check + return(true); + } +//+------------------------------------------------------------------+ +//| Stochastic indicator value at the specified bar | +//+------------------------------------------------------------------+ +double StochSignal(int index) + { + double indicator_values[]; + if(CopyBuffer(ExtIndicatorHandle, SIGNAL_LINE, index, 1, indicator_values)<0) + { + //--- if the copying fails, report the error code + PrintFormat("Failed to copy data from the iStochastic indicator, error code %d", GetLastError()); + return(EMPTY_VALUE); + } + return(indicator_values[0]); + } +//+------------------------------------------------------------------+ diff --git a/BKPS/14031206/Experts/Free Robots/DarkCloud PiercingLine CCI.ex5 b/BKPS/14031206/Experts/Free Robots/DarkCloud PiercingLine CCI.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..47b510ea6c1294c155953d4a57162e35340ce58e GIT binary patch literal 43580 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 +#include + +#define SIGNAL_BUY 1 // Buy signal +#define SIGNAL_NOT 0 // no trading signal +#define SIGNAL_SELL -1 // Sell signal + +#define CLOSE_LONG 2 // signal to close Long +#define CLOSE_SHORT -2 // signal to close Short + +//--- Input parameters +input int InpAverBodyPeriod=12; // period for calculating average candlestick size +input int InpMAPeriod =5; // Trend MA period +input int InpPeriodCCI =37; // CCI period +input ENUM_APPLIED_PRICE InpPrice=PRICE_CLOSE; // price type + +//--- trade parameters +input uint InpDuration=10; // position holding time in bars +input uint InpSL =200; // Stop Loss in points +input uint InpTP =200; // Take Profit in points +input uint InpSlippage=10; // slippage in points +//--- money management parameters +input double InpLot=0.1; // lot +//--- Expert ID +input long InpMagicNumber=120500; // Magic Number + +//--- global variables +int ExtAvgBodyPeriod; // average candlestick calculation period +int ExtSignalOpen =0; // Buy/Sell signal +int ExtSignalClose =0; // signal to close a position +string ExtPatternInfo =""; // current pattern information +string ExtDirection =""; // position opening direction +bool ExtPatternDetected=false; // pattern detected +bool ExtConfirmed =false; // pattern confirmed +bool ExtCloseByTime =true; // requires closing by time +bool ExtCheckPassed =true; // status checking error +//--- indicator handles +int ExtIndicatorHandle=INVALID_HANDLE; +int ExtTrendMAHandle=INVALID_HANDLE; + +//--- service objects +CTrade ExtTrade; +CSymbolInfo ExtSymbolInfo; +//+------------------------------------------------------------------+ +//| Expert initialization function | +//+------------------------------------------------------------------+ +int OnInit() + { + Print("InpSL=", InpSL); + Print("InpTP=", InpTP); +//--- set parameters for trading operations + ExtTrade.SetDeviationInPoints(InpSlippage); // slippage + ExtTrade.SetExpertMagicNumber(InpMagicNumber); // Expert Advisor ID + ExtTrade.LogLevel(LOG_LEVEL_ERRORS); // logging level + + ExtAvgBodyPeriod=InpAverBodyPeriod; +//--- indicator initialization + ExtIndicatorHandle=iCCI(_Symbol, _Period, InpPeriodCCI, InpPrice); + if(ExtIndicatorHandle==INVALID_HANDLE) + { + Print("Error creating CCI indicator"); + return(INIT_FAILED); + } + +//--- trend moving average + ExtTrendMAHandle=iMA(_Symbol, _Period, InpMAPeriod,0, MODE_SMA,PRICE_CLOSE); + if(ExtIndicatorHandle==INVALID_HANDLE) + { + Print("Error creating Moving Average indicator"); + return(INIT_FAILED); + } + +//--- OK + return(INIT_SUCCEEDED); + } +//+------------------------------------------------------------------+ +//| Expert deinitialization function | +//+------------------------------------------------------------------+ +void OnDeinit(const int reason) + { +//--- release indicator handle + IndicatorRelease(ExtIndicatorHandle); + } +//+------------------------------------------------------------------+ +//| Expert tick function | +//+------------------------------------------------------------------+ +void OnTick() + { +//--- save the next bar start time; all checks at bar opening only + static datetime next_bar_open=0; + +//--- Phase 1 - check the emergence of a new bar and update the status + if(TimeCurrent()>=next_bar_open) + { + //--- get the current state of environment on the new bar + // namely, set the values of global variables: + // ExtPatternDetected - pattern detection + // ExtConfirmed - pattern confirmation + // ExtSignalOpen - signal to open + // ExtSignalClose - signal to close + // ExtPatternInfo - current pattern information + if(CheckState()) + { + //--- set the new bar opening time + next_bar_open=TimeCurrent(); + next_bar_open-=next_bar_open%PeriodSeconds(_Period); + next_bar_open+=PeriodSeconds(_Period); + + //--- report the emergence of a new bar only once within a bar + if(ExtPatternDetected && ExtConfirmed) + Print(ExtPatternInfo); + } + else + { + //--- error getting the status, retry on the next tick + return; + } + } + +//--- Phase 2 - if there is a signal and no position in this direction + if(ExtSignalOpen && !PositionExist(ExtSignalOpen)) + { + Print("\r\nSignal to open position ", ExtDirection); + PositionOpen(); + if(PositionExist(ExtSignalOpen)) + ExtSignalOpen=SIGNAL_NOT; + } + +//--- Phase 3 - close if there is a signal to close + if(ExtSignalClose && PositionExist(ExtSignalClose)) + { + Print("\r\nSignal to close position ", ExtDirection); + CloseBySignal(ExtSignalClose); + if(!PositionExist(ExtSignalClose)) + ExtSignalClose=SIGNAL_NOT; + } + +//--- Phase 4 - close upon expiration + if(ExtCloseByTime && PositionExpiredByTimeExist()) + { + CloseByTime(); + ExtCloseByTime=PositionExpiredByTimeExist(); + } + } +//+------------------------------------------------------------------+ +//| Get the current environment and check for a pattern | +//+------------------------------------------------------------------+ +bool CheckState() + { +//--- check if there is a pattern + if(!CheckPattern()) + { + Print("Error, failed to check pattern"); + return(false); + } + +//--- check for confirmation + if(!CheckConfirmation()) + { + Print("Error, failed to check pattern confirmation"); + return(false); + } +//--- if there is no confirmation, cancel the signal + if(!ExtConfirmed) + ExtSignalOpen=SIGNAL_NOT; + +//--- check if there is a signal to close a position + if(!CheckCloseSignal()) + { + Print("Error, failed to check the closing signal"); + return(false); + } + +//--- if positions are to be closed after certain holding time in bars + if(InpDuration) + ExtCloseByTime=true; // set flag to close upon expiration + +//--- all checks done + return(true); + } +//+------------------------------------------------------------------+ +//| Open a position in the direction of the signal | +//+------------------------------------------------------------------+ +bool PositionOpen() + { + ExtSymbolInfo.Refresh(); + ExtSymbolInfo.RefreshRates(); + + double price=0; +//--- Stop Loss and Take Profit are not set by default + double stoploss=0.0; + double takeprofit=0.0; + + int digits=ExtSymbolInfo.Digits(); + double point=ExtSymbolInfo.Point(); + double spread=ExtSymbolInfo.Ask()-ExtSymbolInfo.Bid(); + +//--- uptrend + if(ExtSignalOpen==SIGNAL_BUY) + { + price=NormalizeDouble(ExtSymbolInfo.Ask(), digits); + //--- if Stop Loss is set + if(InpSL>0) + { + if(spread>=InpSL*point) + { + PrintFormat("StopLoss (%d points) <= current spread = %.0f points. Spread value will be used", InpSL, spread/point); + stoploss = NormalizeDouble(price-spread, digits); + } + else + stoploss = NormalizeDouble(price-InpSL*point, digits); + } + //--- if Take Profit is set + if(InpTP>0) + { + if(spread>=InpTP*point) + { + PrintFormat("TakeProfit (%d points) < current spread = %.0f points. Spread value will be used", InpTP, spread/point); + takeprofit = NormalizeDouble(price+spread, digits); + } + else + takeprofit = NormalizeDouble(price+InpTP*point, digits); + } + + if(!ExtTrade.Buy(InpLot, Symbol(), price, stoploss, takeprofit)) + { + PrintFormat("Failed %s buy %G at %G (sl=%G tp=%G) failed. Ask=%G error=%d", + Symbol(), InpLot, price, stoploss, takeprofit, ExtSymbolInfo.Ask(), GetLastError()); + return(false); + } + } + +//--- downtrend + if(ExtSignalOpen==SIGNAL_SELL) + { + price=NormalizeDouble(ExtSymbolInfo.Bid(), digits); + //--- if Stop Loss is set + if(InpSL>0) + { + if(spread>=InpSL*point) + { + PrintFormat("StopLoss (%d points) <= current spread = %.0f points. Spread value will be used", InpSL, spread/point); + stoploss = NormalizeDouble(price+spread, digits); + } + else + stoploss = NormalizeDouble(price+InpSL*point, digits); + } + //--- if Take Profit is set + if(InpTP>0) + { + if(spread>=InpTP*point) + { + PrintFormat("TakeProfit (%d points) < current spread = %.0f points. Spread value will be used", InpTP, spread/point); + takeprofit = NormalizeDouble(price-spread, digits); + } + else + takeprofit = NormalizeDouble(price-InpTP*point, digits); + } + + if(!ExtTrade.Sell(InpLot, Symbol(), price, stoploss, takeprofit)) + { + PrintFormat("Failed %s sell at %G (sl=%G tp=%G) failed. Bid=%G error=%d", + Symbol(), price, stoploss, takeprofit, ExtSymbolInfo.Bid(), GetLastError()); + ExtTrade.PrintResult(); + Print(" "); + return(false); + } + } + + return(true); + } +//+------------------------------------------------------------------+ +//| Close a position based on the specified signal | +//+------------------------------------------------------------------+ +void CloseBySignal(int type_close) + { +//--- if there is no signal to close, return successful completion + if(type_close==SIGNAL_NOT) + return; +//--- if there are no positions opened by our EA + if(PositionExist(ExtSignalClose)==0) + return; + +//--- closing direction + long type; + switch(type_close) + { + case CLOSE_SHORT: + type=POSITION_TYPE_SELL; + break; + case CLOSE_LONG: + type=POSITION_TYPE_BUY; + break; + default: + Print("Error! Signal to close not detected"); + return; + } + +//--- check all positions and close ours based on the signal + int positions=PositionsTotal(); + for(int i=positions-1; i>=0; i--) + { + ulong ticket=PositionGetTicket(i); + if(ticket!=0) + { + //--- get the name of the symbol and the position id (magic) + string symbol=PositionGetString(POSITION_SYMBOL); + long magic =PositionGetInteger(POSITION_MAGIC); + //--- if they correspond to our values + if(symbol==Symbol() && magic==InpMagicNumber) + { + if(PositionGetInteger(POSITION_TYPE)==type) + { + ExtTrade.PositionClose(ticket, InpSlippage); + ExtTrade.PrintResult(); + Print(" "); + } + } + } + } + } +//+------------------------------------------------------------------+ +//| Close positions upon holding time expiration in bars | +//+------------------------------------------------------------------+ +void CloseByTime() + { +//--- if there are no positions opened by our EA + if(PositionExist(ExtSignalOpen)==0) + return; + +//--- check all positions and close ours based on the holding time in bars + int positions=PositionsTotal(); + for(int i=positions-1; i>=0; i--) + { + ulong ticket=PositionGetTicket(i); + if(ticket!=0) + { + //--- get the name of the symbol and the position id (magic) + string symbol=PositionGetString(POSITION_SYMBOL); + long magic =PositionGetInteger(POSITION_MAGIC); + //--- if they correspond to our values + if(symbol==Symbol() && magic==InpMagicNumber) + { + //--- position opening time + datetime open_time=(datetime)PositionGetInteger(POSITION_TIME); + //--- check position holding time in bars + if(BarsHold(open_time)>=(int)InpDuration) + { + Print("\r\nTime to close position #", ticket); + ExtTrade.PositionClose(ticket, InpSlippage); + ExtTrade.PrintResult(); + Print(" "); + } + } + } + } + } +//+------------------------------------------------------------------+ +//| Returns true if there are open positions | +//+------------------------------------------------------------------+ +bool PositionExist(int signal_direction) + { + bool check_type=(signal_direction!=SIGNAL_NOT); + +//--- what positions to search + ENUM_POSITION_TYPE search_type=WRONG_VALUE; + if(check_type) + switch(signal_direction) + { + case SIGNAL_BUY: + search_type=POSITION_TYPE_BUY; + break; + case SIGNAL_SELL: + search_type=POSITION_TYPE_SELL; + break; + case CLOSE_LONG: + search_type=POSITION_TYPE_BUY; + break; + case CLOSE_SHORT: + search_type=POSITION_TYPE_SELL; + break; + default: + //--- entry direction is not specified; nothing to search + return(false); + } + +//--- go through the list of all positions + int positions=PositionsTotal(); + for(int i=0; i=(int)InpDuration)) + return(true); + } + } + } +//--- open position not found + return(false); + } +//+------------------------------------------------------------------+ +//| Checks position closing time in bars | +//+------------------------------------------------------------------+ +int BarsHold(datetime open_time) + { +//--- first run a basic simple check + if(TimeCurrent()-open_timeAvgBody(1)) && // long body of the white candlestick (long white) + (Close(1)Open(2)) && // close within the previous candlestick body (white) + (MidOpenClose(2)>CloseAvg(2)) && // uptrend + (Open(1)>High(2))) // open above the previous day's High price (open at new high) + { + ExtPatternDetected=true; + ExtSignalOpen=SIGNAL_SELL; + ExtPatternInfo="\r\nDark Cloud Cover detected"; + ExtDirection="Sell"; + return(true); + } + +//--- check Piercing Line + if((Close(1)-Open(1)>AvgBody(1)) && // long body of the white candlestick (long white) + (Open(2)-Close(2)>AvgBody(1)) && // long body of the previous black candlestick (long black) + (Close(1)>Close(2)) && // close within the body + (Close(1)50)) + { + ExtConfirmed=true; + ExtPatternInfo+="\r\n Confirmed: CCI>50"; + } + +//--- successful completion of the check + return(true); + } +//+------------------------------------------------------------------+ +//| Check if there is a signal to close | +//+------------------------------------------------------------------+ +bool CheckCloseSignal() + { + ExtSignalClose=false; +//--- if there is a signal to enter the market, do not check the signal to close + if(ExtSignalOpen!=SIGNAL_NOT) + return(true); + +//--- check if there is a signal to close a long position + if(((CCI(1)<80) && (CCI(2)>80)) || ((CCI(1)<-80) && (CCI(2)>-80))) + { + //--- there is a signal to close a long position + ExtSignalClose=CLOSE_LONG; + ExtDirection="Long"; + } + +//--- check if there is a signal to close a short position + if(((CCI(1)>-80) && (CCI(2)<-80)) || ((CCI(1)>80) && (CCI(2)<80))) + { + //--- there is a signal to close a short position + ExtSignalClose=CLOSE_SHORT; + ExtDirection="Short"; + } + +//--- successful completion of the check + return(true); + } +//+------------------------------------------------------------------+ +//| CCI indicator value at the specified bar | +//+------------------------------------------------------------------+ +double CCI(int index) + { + double indicator_values[]; + if(CopyBuffer(ExtIndicatorHandle, 0, index, 1, indicator_values)<0) + { + //--- if the copying fails, report the error code + PrintFormat("Failed to copy data from the CCI indicator, error code %d", GetLastError()); + return(EMPTY_VALUE); + } + return(indicator_values[0]); + } +//+------------------------------------------------------------------+ +//| SMA value at the specified bar | +//+------------------------------------------------------------------+ +double CloseAvg(int index) + { + double indicator_values[]; + if(CopyBuffer(ExtTrendMAHandle, 0, index, 1, indicator_values)<0) + { + //--- if the copying fails, report the error code + PrintFormat("Failed to copy data from the Simple Moving Average indicator, error code %d", GetLastError()); + return(EMPTY_VALUE); + } + return(indicator_values[0]); + } +//+------------------------------------------------------------------+ diff --git a/BKPS/14031206/Experts/Free Robots/DarkCloud PiercingLine MFI.ex5 b/BKPS/14031206/Experts/Free Robots/DarkCloud PiercingLine MFI.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..eb06d9c7b53e748315da48029b0cf32956719f3e GIT binary patch literal 43124 zcmdSAQ>-vd&?b0n+qP}nwr$(CZQJ&HY}>YNpZ)&X%*`a5Z1!%e(kY}GPhWMqszfzd zfgAxKkO4pd{v$wu>`fBXNpg!|vh|AX`Z2LSk= z0T6&o@qdO~(j_CfF%{xu8F^U*nH8xIuv(k5y7)r@JGDxBU}WQrBbo4TzIB-Y&pcrO zdjJOjPXH$XO8|2K3jh}Y0stlehW`c&0L_28EP&~MK0^RS0N4K_UH-G2|MSZHrM`rvFA;W+C z|CM~@=gB;&STN`%&7{;r(Di_sz-s1y(^x*fhsy`oV*1sZR(C}2Dz%#&&r^fiF~Z4vWP zEgwyQ<9fp4amV1?f6Hx)%Y^_!s`6GkrOu?m8@I*UmY`~)J+t?Xxr?LwN`1p{A#z@e zLgTE%XW(?23@`@*R(T0wt zo(l$xAlvP}6c^vCX7;BXX*AJEz6Ao;+sq4Keg*sWG7eFYE!jeR%9=*X0|PJ!*p1n$ zfH9}RMq);@|N@5qyVWQnC6SGx}a;FxLR)*k$ac{H1T-aaIrzHs%wQGD-X!Q zqZIuRSRjymGmz_OxcNi?4H9f=1Rp-5R82!HLLu{7C1Rrf1ks7Bc(NhVUW)l40>hAS z@8hv6&3g58ux`AX3;6ik%iOUC6ohr$8rXLHEDoIK6f|l9N2GVM5DKAv`nrwbm))_Z``bv;0FNjIAl%~n%!D_K1(ZYR%NhZI2v2KJtUzqM+dM$mT` zl*8=bGQJRmI$0Kyzsq7mWwZ&D8n??C=7N;=!qHnB6EYxq580oisOoaH8w_eYZ6_iuWT*&T>ccu4~+65rAwzFLVbbgE%^_$}+^SjWKYsb7v=x=Y8a2CO4y3L-9x}q5|G+M94 zcW8n!J=r`pMwhkhEML^r$P~BIisISl2J$d}F>~3x=?+j`S}WHKHTF(*%8c2OrB7k) zN8{X*XXXU)8^64veV^bzw7M@2_*N-97BI!cwSY?^U)}Zo72rLedB&@mCStuKO=O|2 zQ&4NslAm;&!4d*wd0y8N$LvF*wD1gC*h3fLYRAc!Uv?78bdJqd>!+LmH|C&oG#x;N z)*s}B24-1om>XGMY2;MxLK0Oi7waW92r+m_uyf8Y(OwuNhP+*LVvke`1|pEW(uR>y z;`0%iF*1rRq$a8d1H6Ur5qO2M)x(@?E+2I{&B?hzuvE}1D%Nph`+W6Wy8xLLJhLcw zel7tF3+~^oC5oVmbrA?=)kt-0HSrHH@RNm7Z)7K^Of?SwS@z<>Tmb6jTIe>*=YrXQ z7%jc8&Fq(CR_r*CN*j7@T?K-3H1cowu8zs;7El9B!b%nidJV~!l*&y89cue4<3(b} z)s8i&@ml4p@0KAH{SfCW@j8d|;}%`^9Kn*1)gtS_3pj(i#Qb;6HdtZKy?~-AmG&=e z*!PD;cAY6^twe>U6HHAPDa={sLv{$xHkq?1*xC1^(uXU+26J*z``SV!${}Oj1z}zU z+r%9LZh}@?Iyn6Es>Xz9E9lRkOM18PcqU9Ar>=C!V71#xDPb++r=k}Y5->%2%%XvB zhlG-bRIu#|N5chfK?lSh+;z@MM!;wUF_512_5o+xTbsPjjausX9PVKUSoPRsLmAu} zc)r0!1PT^d%x^+a%OkEDvC43ZBW(6j|@mq#c;a4<~oX!4PXg5?eg5k zH0X^`)WTzXFcQUr(4osHL6rU_B<12Gy(l>goq56q*4e%!igPs;a>{;$lQ-w+JCpE~ z*7YnTPE8?G5PH-jRFd}(abw?}ynB6i7Dnw4Ib8ewmx<`fV@;s^ZA92E(#!;dNW zNl50;l+db_xl-!r+3~%%sk3ergOn;3vSDx&^Tu5uS=81UA4kw240M`cQP)>9!9m~o73d14$(xN4#R;<)r%wafEu8SNN3sJ(Hf zx)}hzmB&PtBc%*NzlSda%5?jV5bn+CWXV<^Z$gV|yO{0#^>*~r6#D|pdKK&2DvDja z5@L)jvz==VVs;umF=5f4_IdO>o>~h)SjWFc1+SrPgOluT=gS*dMD!}}=idm1;Y7=P zaK}!Y1WYwfv?Q3L{9`y7FMP#tPil_UUZt7?m^Ys z9wagDb;%HMkuzYi(x-{bHwPLNHV^D>xD?@BEo*Qr?ZjY*MIzT=Bhb*QazOxeNOe@( zjGQFL4PY%wXxdz)llOV`I#}H!2Jxi>G zl1R03wUjaYgxE<@#LGo!^(V(#m(w1EWeYJkn0bDNsZrG)qvWKOOB7cP@jLCKBTf-* zCidy@Z=^-}fM3DiKkfi$WQ7+506nWI@>Ei0SBgK>dYP&aM{h{ZcvO+uHfVx|8FkAQ zd=HDR0rk$sPK^^OCkQ}zU#Z9%_IY1tHceMFp7!AzF)9gX5>nfBjocBCcNh{$mX*W{ z5w)?n*~~`U+3pC9)RXk*jGlqV`VgnHjku%BPG)LukTcejXw*x@tDCAFKmz;+Y!eF;JrEf zEjj!KlV^W`CC(!fEmbI`5i?HxeisA5zwKlC2Os3=VZxu*p~?2?hb@lKD3EmLt?LbL z3mJmEZb)?+=VpRL6Z^g%1}1i7D@dtPA+CXl?BtqZ$X3GBCHMEB#ELF%6lM)P-_`1n z0YKfqO0p_wzU?xJ>u`XgeDu@Oftw(%l#lz=zu^l8S?}5o_{j^+!AGNbud-AsEdw7} zxD>Fs>6?a1u9TqvU^+>Zj?~T@bgl_0KY?rhaL}f27Im3*0&D9@tqb@s4dmJMX0a+U zp+=pRVR$Hm>4uT;;Un_x7C5TYIr8CVtq`#q+1!&FzQz|2MFA5~>^`;FKl}y%V*F#z zZ@ix^8#hV;U*zfwXYoMf@DkuK%Uml#C=C371X*th4NJ!IDnGbD`xybN&(~s}czK`5A#IRH zMhMreQ-xj_;{U|?%WX)JYI3+2s0R3uJ~_G4r{md_%n~KP%haE$<}z|GMy>_F+@`6f zx%wd>ISt0p5Yn+BQPr=wCvGRZ(VYtFw~V$RCkCYhZGk4-;oza=Ud}kN=Ss>3r3#X| z@_HpIB#$vfE|Da%Fy-)ZgF55?azrSx5Dqo;q~?e+79#kfS5x{2I2Y*$SlKcB(zY!X zZ1m?Fv`-znQAyCG(T_?ufT)en330~GQ3W2jwZ#k^Gr|@<+VtZomOWtCY&k%&SO7tp zj$1V8%U12#aUUtFQcs%)-s`*#pMsG;D` z0y!Qk*k4XQCLj7MiXⓈ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 H!mj@Z>lmr| literal 0 HcmV?d00001 diff --git a/BKPS/14031206/Experts/Free Robots/DarkCloud PiercingLine MFI.mq5 b/BKPS/14031206/Experts/Free Robots/DarkCloud PiercingLine MFI.mq5 new file mode 100644 index 0000000..b739422 --- /dev/null +++ b/BKPS/14031206/Experts/Free Robots/DarkCloud PiercingLine MFI.mq5 @@ -0,0 +1,681 @@ +//+------------------------------------------------------------------+ +//| DarkCloud PiercingLine MFI.mq5 | +//| Copyright 2024, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2024, MetaQuotes Ltd." +#property link "https://www.mql5.com" +#property version "1.00" + +#include +#include + +#define SIGNAL_BUY 1 // Buy signal +#define SIGNAL_NOT 0 // no trading signal +#define SIGNAL_SELL -1 // Sell signal + +#define CLOSE_LONG 2 // signal to close Long +#define CLOSE_SHORT -2 // signal to close Short + +//--- Input parameters +input int InpAverBodyPeriod=12; // period for calculating average candlestick size +input int InpMAPeriod =5; // Trend MA period +input int InpPeriodMFI =37; // MFI period +input ENUM_APPLIED_VOLUME InpVolume=VOLUME_TICK; // volume type + +//--- trade parameters +input uint InpDuration=10; // position holding time in bars +input uint InpSL =200; // Stop Loss in points +input uint InpTP =200; // Take Profit in points +input uint InpSlippage=10; // slippage in points +//--- money management parameters +input double InpLot=0.1; // lot +//--- Expert ID +input long InpMagicNumber=122600; // Magic Number + +//--- global variables +int ExtAvgBodyPeriod; // average candlestick calculation period +int ExtSignalOpen =0; // Buy/Sell signal +int ExtSignalClose =0; // signal to close a position +string ExtPatternInfo =""; // current pattern information +string ExtDirection =""; // position opening direction +bool ExtPatternDetected=false; // pattern detected +bool ExtConfirmed =false; // pattern confirmed +bool ExtCloseByTime =true; // requires closing by time +bool ExtCheckPassed =true; // status checking error +//--- indicator handles +int ExtIndicatorHandle=INVALID_HANDLE; +int ExtTrendMAHandle=INVALID_HANDLE; + +//--- service objects +CTrade ExtTrade; +CSymbolInfo ExtSymbolInfo; +//+------------------------------------------------------------------+ +//| Expert initialization function | +//+------------------------------------------------------------------+ +int OnInit() + { + Print("InpSL=", InpSL); + Print("InpTP=", InpTP); +//--- set parameters for trading operations + ExtTrade.SetDeviationInPoints(InpSlippage); // slippage + ExtTrade.SetExpertMagicNumber(InpMagicNumber); // Expert Advisor ID + ExtTrade.LogLevel(LOG_LEVEL_ERRORS); // logging level + + ExtAvgBodyPeriod=InpAverBodyPeriod; +//--- indicator initialization + ExtIndicatorHandle=iMFI(_Symbol, _Period, InpPeriodMFI, InpVolume); + if(ExtIndicatorHandle==INVALID_HANDLE) + { + Print("Error creating MFI indicator"); + return(INIT_FAILED); + } + +//--- trend moving average + ExtTrendMAHandle=iMA(_Symbol, _Period, InpMAPeriod,0, MODE_SMA,PRICE_CLOSE); + if(ExtIndicatorHandle==INVALID_HANDLE) + { + Print("Error creating Moving Average indicator"); + return(INIT_FAILED); + } + +//--- OK + return(INIT_SUCCEEDED); + } +//+------------------------------------------------------------------+ +//| Expert deinitialization function | +//+------------------------------------------------------------------+ +void OnDeinit(const int reason) + { +//--- release indicator handle + IndicatorRelease(ExtIndicatorHandle); + } +//+------------------------------------------------------------------+ +//| Expert tick function | +//+------------------------------------------------------------------+ +void OnTick() + { +//--- save the next bar start time; all checks at bar opening only + static datetime next_bar_open=0; + +//--- Phase 1 - check the emergence of a new bar and update the status + if(TimeCurrent()>=next_bar_open) + { + //--- get the current state of environment on the new bar + // namely, set the values of global variables: + // ExtPatternDetected - pattern detection + // ExtConfirmed - pattern confirmation + // ExtSignalOpen - signal to open + // ExtSignalClose - signal to close + // ExtPatternInfo - current pattern information + if(CheckState()) + { + //--- set the new bar opening time + next_bar_open=TimeCurrent(); + next_bar_open-=next_bar_open%PeriodSeconds(_Period); + next_bar_open+=PeriodSeconds(_Period); + + //--- report the emergence of a new bar only once within a bar + if(ExtPatternDetected && ExtConfirmed) + Print(ExtPatternInfo); + } + else + { + //--- error getting the status, retry on the next tick + return; + } + } + +//--- Phase 2 - if there is a signal and no position in this direction + if(ExtSignalOpen && !PositionExist(ExtSignalOpen)) + { + Print("\r\nSignal to open position ", ExtDirection); + PositionOpen(); + if(PositionExist(ExtSignalOpen)) + ExtSignalOpen=SIGNAL_NOT; + } + +//--- Phase 3 - close if there is a signal to close + if(ExtSignalClose && PositionExist(ExtSignalClose)) + { + Print("\r\nSignal to close position ", ExtDirection); + CloseBySignal(ExtSignalClose); + if(!PositionExist(ExtSignalClose)) + ExtSignalClose=SIGNAL_NOT; + } + +//--- Phase 4 - close upon expiration + if(ExtCloseByTime && PositionExpiredByTimeExist()) + { + CloseByTime(); + ExtCloseByTime=PositionExpiredByTimeExist(); + } + } +//+------------------------------------------------------------------+ +//| Get the current environment and check for a pattern | +//+------------------------------------------------------------------+ +bool CheckState() + { +//--- check if there is a pattern + if(!CheckPattern()) + { + Print("Error, failed to check pattern"); + return(false); + } + +//--- check for confirmation + if(!CheckConfirmation()) + { + Print("Error, failed to check pattern confirmation"); + return(false); + } +//--- if there is no confirmation, cancel the signal + if(!ExtConfirmed) + ExtSignalOpen=SIGNAL_NOT; + +//--- check if there is a signal to close a position + if(!CheckCloseSignal()) + { + Print("Error, failed to check the closing signal"); + return(false); + } + +//--- if positions are to be closed after certain holding time in bars + if(InpDuration) + ExtCloseByTime=true; // set flag to close upon expiration + +//--- all checks done + return(true); + } +//+------------------------------------------------------------------+ +//| Open a position in the direction of the signal | +//+------------------------------------------------------------------+ +bool PositionOpen() + { + ExtSymbolInfo.Refresh(); + ExtSymbolInfo.RefreshRates(); + + double price=0; +//--- Stop Loss and Take Profit are not set by default + double stoploss=0.0; + double takeprofit=0.0; + + int digits=ExtSymbolInfo.Digits(); + double point=ExtSymbolInfo.Point(); + double spread=ExtSymbolInfo.Ask()-ExtSymbolInfo.Bid(); + +//--- uptrend + if(ExtSignalOpen==SIGNAL_BUY) + { + price=NormalizeDouble(ExtSymbolInfo.Ask(), digits); + //--- if Stop Loss is set + if(InpSL>0) + { + if(spread>=InpSL*point) + { + PrintFormat("StopLoss (%d points) <= current spread = %.0f points. Spread value will be used", InpSL, spread/point); + stoploss = NormalizeDouble(price-spread, digits); + } + else + stoploss = NormalizeDouble(price-InpSL*point, digits); + } + //--- if Take Profit is set + if(InpTP>0) + { + if(spread>=InpTP*point) + { + PrintFormat("TakeProfit (%d points) < current spread = %.0f points. Spread value will be used", InpTP, spread/point); + takeprofit = NormalizeDouble(price+spread, digits); + } + else + takeprofit = NormalizeDouble(price+InpTP*point, digits); + } + + if(!ExtTrade.Buy(InpLot, Symbol(), price, stoploss, takeprofit)) + { + PrintFormat("Failed %s buy %G at %G (sl=%G tp=%G) failed. Ask=%G error=%d", + Symbol(), InpLot, price, stoploss, takeprofit, ExtSymbolInfo.Ask(), GetLastError()); + return(false); + } + } + +//--- downtrend + if(ExtSignalOpen==SIGNAL_SELL) + { + price=NormalizeDouble(ExtSymbolInfo.Bid(), digits); + //--- if Stop Loss is set + if(InpSL>0) + { + if(spread>=InpSL*point) + { + PrintFormat("StopLoss (%d points) <= current spread = %.0f points. Spread value will be used", InpSL, spread/point); + stoploss = NormalizeDouble(price+spread, digits); + } + else + stoploss = NormalizeDouble(price+InpSL*point, digits); + } + //--- if Take Profit is set + if(InpTP>0) + { + if(spread>=InpTP*point) + { + PrintFormat("TakeProfit (%d points) < current spread = %.0f points. Spread value will be used", InpTP, spread/point); + takeprofit = NormalizeDouble(price-spread, digits); + } + else + takeprofit = NormalizeDouble(price-InpTP*point, digits); + } + + if(!ExtTrade.Sell(InpLot, Symbol(), price, stoploss, takeprofit)) + { + PrintFormat("Failed %s sell at %G (sl=%G tp=%G) failed. Bid=%G error=%d", + Symbol(), price, stoploss, takeprofit, ExtSymbolInfo.Bid(), GetLastError()); + ExtTrade.PrintResult(); + Print(" "); + return(false); + } + } + + return(true); + } +//+------------------------------------------------------------------+ +//| Close a position based on the specified signal | +//+------------------------------------------------------------------+ +void CloseBySignal(int type_close) + { +//--- if there is no signal to close, return successful completion + if(type_close==SIGNAL_NOT) + return; +//--- if there are no positions opened by our EA + if(PositionExist(ExtSignalClose)==0) + return; + +//--- closing direction + long type; + switch(type_close) + { + case CLOSE_SHORT: + type=POSITION_TYPE_SELL; + break; + case CLOSE_LONG: + type=POSITION_TYPE_BUY; + break; + default: + Print("Error! Signal to close not detected"); + return; + } +//--- check all positions and close ours based on the signal + int positions=PositionsTotal(); + for(int i=positions-1; i>=0; i--) + { + ulong ticket=PositionGetTicket(i); + if(ticket!=0) + { + //--- get the name of the symbol and the position id (magic) + string symbol=PositionGetString(POSITION_SYMBOL); + long magic =PositionGetInteger(POSITION_MAGIC); + //--- if they correspond to our values + if(symbol==Symbol() && magic==InpMagicNumber) + { + if(PositionGetInteger(POSITION_TYPE)==type) + { + ExtTrade.PositionClose(ticket, InpSlippage); + ExtTrade.PrintResult(); + Print(" "); + } + } + } + } + } +//+------------------------------------------------------------------+ +//| Close positions upon holding time expiration in bars | +//+------------------------------------------------------------------+ +void CloseByTime() + { +//--- if there are no positions opened by our EA + if(PositionExist(ExtSignalOpen)==0) + return; + +//--- check all positions and close ours based on the holding time in bars + int positions=PositionsTotal(); + for(int i=positions-1; i>=0; i--) + { + ulong ticket=PositionGetTicket(i); + if(ticket!=0) + { + //--- get the name of the symbol and the position id (magic) + string symbol=PositionGetString(POSITION_SYMBOL); + long magic =PositionGetInteger(POSITION_MAGIC); + //--- if they correspond to our values + if(symbol==Symbol() && magic==InpMagicNumber) + { + //--- position opening time + datetime open_time=(datetime)PositionGetInteger(POSITION_TIME); + //--- check position holding time in bars + if(BarsHold(open_time)>=(int)InpDuration) + { + Print("\r\nTime to close position #", ticket); + ExtTrade.PositionClose(ticket, InpSlippage); + ExtTrade.PrintResult(); + Print(" "); + } + } + } + } + } +//+------------------------------------------------------------------+ +//| Returns true if there are open positions | +//+------------------------------------------------------------------+ +bool PositionExist(int signal_direction) + { + bool check_type=(signal_direction!=SIGNAL_NOT); + +//--- what positions to search + ENUM_POSITION_TYPE search_type=WRONG_VALUE; + if(check_type) + switch(signal_direction) + { + case SIGNAL_BUY: + search_type=POSITION_TYPE_BUY; + break; + case SIGNAL_SELL: + search_type=POSITION_TYPE_SELL; + break; + case CLOSE_LONG: + search_type=POSITION_TYPE_BUY; + break; + case CLOSE_SHORT: + search_type=POSITION_TYPE_SELL; + break; + default: + //--- entry direction is not specified; nothing to search + return(false); + } + +//--- go through the list of all positions + int positions=PositionsTotal(); + for(int i=0; i=(int)InpDuration)) + return(true); + } + } + } +//--- open position not found + return(false); + } +//+------------------------------------------------------------------+ +//| Checks position closing time in bars | +//+------------------------------------------------------------------+ +int BarsHold(datetime open_time) + { +//--- first run a basic simple check + if(TimeCurrent()-open_timeAvgBody(1)) && // long body of the white candlestick (long white) + (Close(1)Open(2)) && // close within the previous candlestick body (white) + (MidOpenClose(2)>CloseAvg(2)) && // uptrend + (Open(1)>High(2))) // open above the previous day's High price (open at new high) + { + ExtPatternDetected=true; + ExtSignalOpen=SIGNAL_SELL; + ExtPatternInfo="\r\nDark Cloud Cover detected"; + ExtDirection="Sell"; + return(true); + } + +//--- check Piercing Line + if((Close(1)-Open(1)>AvgBody(1)) && // long body of the white candlestick (long white) + (Open(2)-Close(2)>AvgBody(1)) && // long body of the previous black candlestick (long black) + (Close(1)>Close(2)) && // close within the body + (Close(1)60)) + { + ExtConfirmed=true; + ExtPatternInfo+="\r\n Confirmed: MFI>60"; + } + +//--- successful completion of the check + return(true); + } +//+------------------------------------------------------------------+ +//| Check if there is a signal to close | +//+------------------------------------------------------------------+ +bool CheckCloseSignal() + { + ExtSignalClose=false; +//--- if there is a signal to enter the market, do not check the signal to close + if(ExtSignalOpen!=SIGNAL_NOT) + return(true); + +//--- check if there is a signal to close a long position + if(((MFI(1)<70) && (MFI(2)>70)) || ((MFI(1)<30) && (MFI(2)>30))) + { + //--- there is a signal to close a long position + ExtSignalClose=CLOSE_LONG; + ExtDirection="Long"; + } + +//--- check if there is a signal to close a short position + if(((MFI(1)>30) && (MFI(2)<30)) || ((MFI(1)>70) && (MFI(2)<70))) + { + //--- there is a signal to close a short position + ExtSignalClose=CLOSE_SHORT; + ExtDirection="Short"; + } + +//--- successful completion of the check + return(true); + } +//+------------------------------------------------------------------+ +//| MFI indicator value at the specified bar | +//+------------------------------------------------------------------+ +double MFI(int index) + { + double indicator_values[]; + if(CopyBuffer(ExtIndicatorHandle, 0, index, 1, indicator_values)<0) + { + //--- if the copying fails, report the error code + PrintFormat("Failed to copy data from the MFI indicator, error code %d", GetLastError()); + return(EMPTY_VALUE); + } + return(indicator_values[0]); + } +//+------------------------------------------------------------------+ +//| SMA value at the specified bar | +//+------------------------------------------------------------------+ +double CloseAvg(int index) + { + double indicator_values[]; + if(CopyBuffer(ExtTrendMAHandle, 0, index, 1, indicator_values)<0) + { + //--- if the copying fails, report the error code + PrintFormat("Failed to copy data from the Simple Moving Average indicator, error code %d", GetLastError()); + return(EMPTY_VALUE); + } + return(indicator_values[0]); + } +//+------------------------------------------------------------------+ diff --git a/BKPS/14031206/Experts/Free Robots/DarkCloud PiercingLine RSI.ex5 b/BKPS/14031206/Experts/Free Robots/DarkCloud PiercingLine RSI.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..1186178a12019016daf7ae298706973f9d79a46b GIT binary patch literal 44374 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 literal 0 HcmV?d00001 diff --git a/BKPS/14031206/Experts/Free Robots/DarkCloud PiercingLine RSI.mq5 b/BKPS/14031206/Experts/Free Robots/DarkCloud PiercingLine RSI.mq5 new file mode 100644 index 0000000..4a83bb3 --- /dev/null +++ b/BKPS/14031206/Experts/Free Robots/DarkCloud PiercingLine RSI.mq5 @@ -0,0 +1,683 @@ +//+------------------------------------------------------------------+ +//| DarkCloud PiercingLine RSI.mq5 | +//| Copyright 2024, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2024, MetaQuotes Ltd." +#property link "https://www.mql5.com" +#property version "1.00" + +#include +#include + +#define SIGNAL_BUY 1 // Buy signal +#define SIGNAL_NOT 0 // no trading signal +#define SIGNAL_SELL -1 // Sell signal + +#define CLOSE_LONG 2 // signal to close Long +#define CLOSE_SHORT -2 // signal to close Short + +//--- Input parameters +input int InpAverBodyPeriod=12; // period for calculating average candlestick size +input int InpMAPeriod =5; // Trend MA period +input int InpPeriodRSI =37; // RSI period +input ENUM_APPLIED_PRICE InpPrice=PRICE_CLOSE; // price type + +//--- trade parameters +input uint InpDuration=10; // position holding time in bars +input uint InpSL =200; // Stop Loss in points +input uint InpTP =200; // Take Profit in points +input uint InpSlippage=10; // slippage in points +//--- money management parameters +input double InpLot=0.1; // lot +//--- Expert ID +input long InpMagicNumber=120700; // Magic Number + +//--- global variables +int ExtAvgBodyPeriod; // average candlestick calculation period +int ExtSignalOpen =0; // Buy/Sell signal +int ExtSignalClose =0; // signal to close a position +string ExtPatternInfo =""; // current pattern information +string ExtDirection =""; // position opening direction +bool ExtPatternDetected=false; // pattern detected +bool ExtConfirmed =false; // pattern confirmed +bool ExtCloseByTime =true; // requires closing by time +bool ExtCheckPassed =true; // status checking error +//--- indicator handles +int ExtIndicatorHandle=INVALID_HANDLE; +int ExtTrendMAHandle=INVALID_HANDLE; + +//--- service objects +CTrade ExtTrade; +CSymbolInfo ExtSymbolInfo; +//+------------------------------------------------------------------+ +//| Expert initialization function | +//+------------------------------------------------------------------+ +int OnInit() + { + Print("InpSL=", InpSL); + Print("InpTP=", InpTP); +//--- set parameters for trading operations + ExtTrade.SetDeviationInPoints(InpSlippage); // slippage + ExtTrade.SetExpertMagicNumber(InpMagicNumber); // Expert Advisor ID + ExtTrade.LogLevel(LOG_LEVEL_ERRORS); // logging level + + ExtAvgBodyPeriod=InpAverBodyPeriod; +//--- indicator initialization + ExtIndicatorHandle=iRSI(_Symbol, _Period, InpPeriodRSI, InpPrice); + if(ExtIndicatorHandle==INVALID_HANDLE) + { + Print("Error creating CCI indicator"); + return(INIT_FAILED); + } + +//--- trend moving average + ExtTrendMAHandle=iMA(_Symbol, _Period, InpMAPeriod,0, MODE_SMA,PRICE_CLOSE); + if(ExtIndicatorHandle==INVALID_HANDLE) + { + Print("Error creating Moving Average indicator"); + return(INIT_FAILED); + } + +//--- OK + return(INIT_SUCCEEDED); + } +//+------------------------------------------------------------------+ +//| Expert deinitialization function | +//+------------------------------------------------------------------+ +void OnDeinit(const int reason) + { +//--- release indicator handle + IndicatorRelease(ExtIndicatorHandle); + } +//+------------------------------------------------------------------+ +//| Expert tick function | +//+------------------------------------------------------------------+ +void OnTick() + { +//--- save the next bar start time; all checks at bar opening only + static datetime next_bar_open=0; + +//--- Phase 1 - check the emergence of a new bar and update the status + if(TimeCurrent()>=next_bar_open) + { + //--- get the current state of environment on the new bar + // namely, set the values of global variables: + // ExtPatternDetected - pattern detection + // ExtConfirmed - pattern confirmation + // ExtSignalOpen - signal to open + // ExtSignalClose - signal to close + // ExtPatternInfo - current pattern information + if(CheckState()) + { + //--- set the new bar opening time + next_bar_open=TimeCurrent(); + next_bar_open-=next_bar_open%PeriodSeconds(_Period); + next_bar_open+=PeriodSeconds(_Period); + + //--- report the emergence of a new bar only once within a bar + if(ExtPatternDetected && ExtConfirmed) + Print(ExtPatternInfo); + } + else + { + //--- error getting the status, retry on the next tick + return; + } + } + +//--- Phase 2 - if there is a signal and no position in this direction + if(ExtSignalOpen && !PositionExist(ExtSignalOpen)) + { + Print("\r\nSignal to open position ", ExtDirection); + PositionOpen(); + if(PositionExist(ExtSignalOpen)) + ExtSignalOpen=SIGNAL_NOT; + } + +//--- Phase 3 - close if there is a signal to close + if(ExtSignalClose && PositionExist(ExtSignalClose)) + { + Print("\r\nSignal to close position ", ExtDirection); + CloseBySignal(ExtSignalClose); + if(!PositionExist(ExtSignalClose)) + ExtSignalClose=SIGNAL_NOT; + } + +//--- Phase 4 - close upon expiration + if(ExtCloseByTime && PositionExpiredByTimeExist()) + { + CloseByTime(); + ExtCloseByTime=PositionExpiredByTimeExist(); + } + } +//+------------------------------------------------------------------+ +//| Get the current environment and check for a pattern | +//+------------------------------------------------------------------+ +bool CheckState() + { +//--- check if there is a pattern + if(!CheckPattern()) + { + Print("Error, failed to check pattern"); + return(false); + } + +//--- check for confirmation + if(!CheckConfirmation()) + { + Print("Error, failed to check pattern confirmation"); + return(false); + } +//--- if there is no confirmation, cancel the signal + if(!ExtConfirmed) + ExtSignalOpen=SIGNAL_NOT; + +//--- check if there is a signal to close a position + if(!CheckCloseSignal()) + { + Print("Error, failed to check the closing signal"); + return(false); + } + +//--- if positions are to be closed after certain holding time in bars + if(InpDuration) + ExtCloseByTime=true; // set flag to close upon expiration + +//--- all checks done + return(true); + } +//+------------------------------------------------------------------+ +//| Open a position in the direction of the signal | +//+------------------------------------------------------------------+ +bool PositionOpen() + { + ExtSymbolInfo.Refresh(); + ExtSymbolInfo.RefreshRates(); + + double price=0; +//--- Stop Loss and Take Profit are not set by default + double stoploss=0.0; + double takeprofit=0.0; + + int digits=ExtSymbolInfo.Digits(); + double point=ExtSymbolInfo.Point(); + double spread=ExtSymbolInfo.Ask()-ExtSymbolInfo.Bid(); + +//--- uptrend + if(ExtSignalOpen==SIGNAL_BUY) + { + price=NormalizeDouble(ExtSymbolInfo.Ask(), digits); + //--- if Stop Loss is set + if(InpSL>0) + { + if(spread>=InpSL*point) + { + PrintFormat("StopLoss (%d points) <= current spread = %.0f points. Spread value will be used", InpSL, spread/point); + stoploss = NormalizeDouble(price-spread, digits); + } + else + stoploss = NormalizeDouble(price-InpSL*point, digits); + } + //--- if Take Profit is set + if(InpTP>0) + { + if(spread>=InpTP*point) + { + PrintFormat("TakeProfit (%d points) < current spread = %.0f points. Spread value will be used", InpTP, spread/point); + takeprofit = NormalizeDouble(price+spread, digits); + } + else + takeprofit = NormalizeDouble(price+InpTP*point, digits); + } + + if(!ExtTrade.Buy(InpLot, Symbol(), price, stoploss, takeprofit)) + { + PrintFormat("Failed %s buy %G at %G (sl=%G tp=%G) failed. Ask=%G error=%d", + Symbol(), InpLot, price, stoploss, takeprofit, ExtSymbolInfo.Ask(), GetLastError()); + return(false); + } + } + +//--- downtrend + if(ExtSignalOpen==SIGNAL_SELL) + { + price=NormalizeDouble(ExtSymbolInfo.Bid(), digits); + //--- if Stop Loss is set + if(InpSL>0) + { + if(spread>=InpSL*point) + { + PrintFormat("StopLoss (%d points) <= current spread = %.0f points. Spread value will be used", InpSL, spread/point); + stoploss = NormalizeDouble(price+spread, digits); + } + else + stoploss = NormalizeDouble(price+InpSL*point, digits); + } + //--- if Take Profit is set + if(InpTP>0) + { + if(spread>=InpTP*point) + { + PrintFormat("TakeProfit (%d points) < current spread = %.0f points. Spread value will be used", InpTP, spread/point); + takeprofit = NormalizeDouble(price-spread, digits); + } + else + takeprofit = NormalizeDouble(price-InpTP*point, digits); + } + + if(!ExtTrade.Sell(InpLot, Symbol(), price, stoploss, takeprofit)) + { + PrintFormat("Failed %s sell at %G (sl=%G tp=%G) failed. Bid=%G error=%d", + Symbol(), price, stoploss, takeprofit, ExtSymbolInfo.Bid(), GetLastError()); + ExtTrade.PrintResult(); + Print(" "); + return(false); + } + } + + return(true); + } +//+------------------------------------------------------------------+ +//| Close a position based on the specified signal | +//+------------------------------------------------------------------+ +void CloseBySignal(int type_close) + { +//--- if there is no signal to close, return successful completion + if(type_close==SIGNAL_NOT) + return; +//--- if there are no positions opened by our EA + if(PositionExist(ExtSignalClose)==0) + return; + +//--- closing direction + long type; + switch(type_close) + { + case CLOSE_SHORT: + type=POSITION_TYPE_SELL; + break; + case CLOSE_LONG: + type=POSITION_TYPE_BUY; + break; + default: + Print("Error! Signal to close not detected"); + return; + } + +//--- check all positions and close ours based on the signal + int positions=PositionsTotal(); + for(int i=positions-1; i>=0; i--) + { + ulong ticket=PositionGetTicket(i); + if(ticket!=0) + { + //--- get the name of the symbol and the position id (magic) + string symbol=PositionGetString(POSITION_SYMBOL); + long magic =PositionGetInteger(POSITION_MAGIC); + //--- if they correspond to our values + if(symbol==Symbol() && magic==InpMagicNumber) + { + if(PositionGetInteger(POSITION_TYPE)==type) + { + ExtTrade.PositionClose(ticket, InpSlippage); + ExtTrade.PrintResult(); + Print(" "); + } + } + } + } + } +//+------------------------------------------------------------------+ +//| Close positions upon holding time expiration in bars | +//+------------------------------------------------------------------+ +void CloseByTime() + { +//--- if there are no positions opened by our EA + if(PositionExist(ExtSignalOpen)==0) + return; + +//--- check all positions and close ours based on the holding time in bars + int positions=PositionsTotal(); + for(int i=positions-1; i>=0; i--) + { + ulong ticket=PositionGetTicket(i); + if(ticket!=0) + { + //--- get the name of the symbol and the position id (magic) + string symbol=PositionGetString(POSITION_SYMBOL); + long magic =PositionGetInteger(POSITION_MAGIC); + //--- if they correspond to our values + if(symbol==Symbol() && magic==InpMagicNumber) + { + //--- position opening time + datetime open_time=(datetime)PositionGetInteger(POSITION_TIME); + //--- check position holding time in bars + if(BarsHold(open_time)>=(int)InpDuration) + { + Print("\r\nTime to close position #", ticket); + ExtTrade.PositionClose(ticket, InpSlippage); + ExtTrade.PrintResult(); + Print(" "); + } + } + } + } + } +//+------------------------------------------------------------------+ +//| Returns true if there are open positions | +//+------------------------------------------------------------------+ +bool PositionExist(int signal_direction) + { + bool check_type=(signal_direction!=SIGNAL_NOT); + +//--- what positions to search + ENUM_POSITION_TYPE search_type=WRONG_VALUE; + if(check_type) + switch(signal_direction) + { + case SIGNAL_BUY: + search_type=POSITION_TYPE_BUY; + break; + case SIGNAL_SELL: + search_type=POSITION_TYPE_SELL; + break; + case CLOSE_LONG: + search_type=POSITION_TYPE_BUY; + break; + case CLOSE_SHORT: + search_type=POSITION_TYPE_SELL; + break; + default: + //--- entry direction is not specified; nothing to search + return(false); + } + +//--- go through the list of all positions + int positions=PositionsTotal(); + for(int i=0; i=(int)InpDuration)) + return(true); + } + } + } + +//--- open position not found + return(false); + } +//+------------------------------------------------------------------+ +//| Checks position closing time in bars | +//+------------------------------------------------------------------+ +int BarsHold(datetime open_time) + { +//--- first run a basic simple check + if(TimeCurrent()-open_timeAvgBody(1)) && // long body of the white candlestick (long white) + (Close(1)Open(2)) && // close within the previous candlestick body (white) + (MidOpenClose(2)>CloseAvg(2)) && // uptrend + (Open(1)>High(2))) // open above the previous day's High price (open at new high) + { + ExtPatternDetected=true; + ExtSignalOpen=SIGNAL_SELL; + ExtPatternInfo="\r\nDark Cloud Cover detected"; + ExtDirection="Sell"; + return(true); + } + +//--- check Piercing Line + if((Close(1)-Open(1)>AvgBody(1)) && // long body of the white candlestick (long white) + (Open(2)-Close(2)>AvgBody(1)) && // long body of the previous black candlestick (long black) + (Close(1)>Close(2)) && // close within the body + (Close(1)60)) + { + ExtConfirmed=true; + ExtPatternInfo+="\r\n Confirmed: RSI>60"; + } + +//--- successful completion of the check + return(true); + } +//+------------------------------------------------------------------+ +//| Check if there is a signal to close | +//+------------------------------------------------------------------+ +bool CheckCloseSignal() + { + ExtSignalClose=false; +//--- if there is a signal to enter the market, do not check the signal to close + if(ExtSignalOpen!=SIGNAL_NOT) + return(true); + +//--- check if there is a signal to close a long position + if(((RSI(1)<70) && (RSI(2)>70)) || ((RSI(1)<30) && (RSI(2)>30))) + { + //--- there is a signal to close a long position + ExtSignalClose=CLOSE_LONG; + ExtDirection="Long"; + } + +//--- check if there is a signal to close a short position + if(((RSI(1)>30) && (RSI(2)<30)) || ((RSI(1)>70) && (RSI(2)<70))) + { + //--- there is a signal to close a short position + ExtSignalClose=CLOSE_SHORT; + ExtDirection="Short"; + } + +//--- successful completion of the check + return(true); + } +//+------------------------------------------------------------------+ +//| RSI indicator value at the specified bar | +//+------------------------------------------------------------------+ +double RSI(int index) + { + double indicator_values[]; + if(CopyBuffer(ExtIndicatorHandle, 0, index, 1, indicator_values)<0) + { + //--- if the copying fails, report the error code + PrintFormat("Failed to copy data from the RSI indicator, error code %d", GetLastError()); + return(EMPTY_VALUE); + } + return(indicator_values[0]); + } +//+------------------------------------------------------------------+ +//| SMA value at the specified bar | +//+------------------------------------------------------------------+ +double CloseAvg(int index) + { + double indicator_values[]; + if(CopyBuffer(ExtTrendMAHandle, 0, index, 1, indicator_values)<0) + { + //--- if the copying fails, report the error code + PrintFormat("Failed to copy data from the Simple Moving Average indicator, error code %d", GetLastError()); + return(EMPTY_VALUE); + } + return(indicator_values[0]); + } +//+------------------------------------------------------------------+ diff --git a/BKPS/14031206/Experts/Free Robots/DarkCloud PiercingLine Stoch.ex5 b/BKPS/14031206/Experts/Free Robots/DarkCloud PiercingLine Stoch.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..6ab76fed41d0edba4d44ade4cff4698d4b6ea304 GIT binary patch literal 44614 zcmdS9V~j3N@Gkg{ZQHi3Gq%qep3yrqXKdTHZQHhO+qS*G|J~eAH=Ats+g7Dh)laI^ z{d79%bXSRMaDdtYpwR%}fd2#paQMIM|M>s6a8~yfEvWCY5NP$8zkjd4{crq#Tg3nE z{6AP%C;;Gp8o-x;`u_-VTc;dEYE_HndNz&`%aQb8QdP}$z;mXdT_9{=ALX{f3D?

NFHE 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 C|HbG4 literal 0 HcmV?d00001 diff --git a/BKPS/14031206/Experts/Advisors/ExpertMAPSARSizeOptimized.mq5 b/BKPS/14031206/Experts/Advisors/ExpertMAPSARSizeOptimized.mq5 new file mode 100644 index 0000000..e7da4e7 --- /dev/null +++ b/BKPS/14031206/Experts/Advisors/ExpertMAPSARSizeOptimized.mq5 @@ -0,0 +1,176 @@ +//+------------------------------------------------------------------+ +//| ExpertMAPSARSizeOptimized.mq5 | +//| Copyright 2000-2025, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2000-2025, MetaQuotes Ltd." +#property link "https://www.mql5.com" +#property version "1.00" +//+------------------------------------------------------------------+ +//| Include | +//+------------------------------------------------------------------+ +#include +#include +#include +#include +//+------------------------------------------------------------------+ +//| Inputs | +//+------------------------------------------------------------------+ +//--- inputs for expert +input string Inp_Expert_Title ="ExpertMAPSARSizeOptimized"; +int Expert_MagicNumber =27893; +bool Expert_EveryTick =false; +//--- inputs for signal +input int Inp_Signal_MA_Period =12; +input int Inp_Signal_MA_Shift =6; +input ENUM_MA_METHOD Inp_Signal_MA_Method =MODE_SMA; +input ENUM_APPLIED_PRICE Inp_Signal_MA_Applied =PRICE_CLOSE; +//--- inputs for trailing +input double Inp_Trailing_ParabolicSAR_Step =0.02; +input double Inp_Trailing_ParabolicSAR_Maximum =0.2; +//--- inputs for money +input double Inp_Money_SizeOptimized_DecreaseFactor=3.0; +input double Inp_Money_SizeOptimized_Percent =10.0; +//+------------------------------------------------------------------+ +//| Global expert object | +//+------------------------------------------------------------------+ +CExpert ExtExpert; +//+------------------------------------------------------------------+ +//| Initialization function of the expert | +//+------------------------------------------------------------------+ +int OnInit(void) + { +//--- Initializing expert + if(!ExtExpert.Init(Symbol(),Period(),Expert_EveryTick,Expert_MagicNumber)) + { + //--- failed + printf(__FUNCTION__+": error initializing expert"); + ExtExpert.Deinit(); + return(-1); + } +//--- Creation of signal object + CSignalMA *signal=new CSignalMA; + if(signal==NULL) + { + //--- failed + printf(__FUNCTION__+": error creating signal"); + ExtExpert.Deinit(); + return(-2); + } +//--- Add signal to expert (will be deleted automatically)) + if(!ExtExpert.InitSignal(signal)) + { + //--- failed + printf(__FUNCTION__+": error initializing signal"); + ExtExpert.Deinit(); + return(-3); + } +//--- Set signal parameters + signal.PeriodMA(Inp_Signal_MA_Period); + signal.Shift(Inp_Signal_MA_Shift); + signal.Method(Inp_Signal_MA_Method); + signal.Applied(Inp_Signal_MA_Applied); +//--- Check signal parameters + if(!signal.ValidationSettings()) + { + //--- failed + printf(__FUNCTION__+": error signal parameters"); + ExtExpert.Deinit(); + return(-4); + } +//--- Creation of trailing object + CTrailingPSAR *trailing=new CTrailingPSAR; + if(trailing==NULL) + { + //--- failed + printf(__FUNCTION__+": error creating trailing"); + ExtExpert.Deinit(); + return(-5); + } +//--- Add trailing to expert (will be deleted automatically)) + if(!ExtExpert.InitTrailing(trailing)) + { + //--- failed + printf(__FUNCTION__+": error initializing trailing"); + ExtExpert.Deinit(); + return(-6); + } +//--- Set trailing parameters + trailing.Step(Inp_Trailing_ParabolicSAR_Step); + trailing.Maximum(Inp_Trailing_ParabolicSAR_Maximum); +//--- Check trailing parameters + if(!trailing.ValidationSettings()) + { + //--- failed + printf(__FUNCTION__+": error trailing parameters"); + ExtExpert.Deinit(); + return(-7); + } +//--- Creation of money object + CMoneySizeOptimized *money=new CMoneySizeOptimized; + if(money==NULL) + { + //--- failed + printf(__FUNCTION__+": error creating money"); + ExtExpert.Deinit(); + return(-8); + } +//--- Add money to expert (will be deleted automatically)) + if(!ExtExpert.InitMoney(money)) + { + //--- failed + printf(__FUNCTION__+": error initializing money"); + ExtExpert.Deinit(); + return(-9); + } +//--- Set money parameters + money.DecreaseFactor(Inp_Money_SizeOptimized_DecreaseFactor); + money.Percent(Inp_Money_SizeOptimized_Percent); +//--- Check money parameters + if(!money.ValidationSettings()) + { + //--- failed + printf(__FUNCTION__+": error money parameters"); + ExtExpert.Deinit(); + return(-10); + } +//--- Tuning of all necessary indicators + if(!ExtExpert.InitIndicators()) + { + //--- failed + printf(__FUNCTION__+": error initializing indicators"); + ExtExpert.Deinit(); + return(-11); + } +//--- succeed + return(INIT_SUCCEEDED); + } +//+------------------------------------------------------------------+ +//| Deinitialization function of the expert | +//+------------------------------------------------------------------+ +void OnDeinit(const int reason) + { + ExtExpert.Deinit(); + } +//+------------------------------------------------------------------+ +//| Function-event handler "tick" | +//+------------------------------------------------------------------+ +void OnTick(void) + { + ExtExpert.OnTick(); + } +//+------------------------------------------------------------------+ +//| Function-event handler "trade" | +//+------------------------------------------------------------------+ +void OnTrade(void) + { + ExtExpert.OnTrade(); + } +//+------------------------------------------------------------------+ +//| Function-event handler "timer" | +//+------------------------------------------------------------------+ +void OnTimer(void) + { + ExtExpert.OnTimer(); + } +//+------------------------------------------------------------------+ diff --git a/BKPS/14031206/Experts/Examples/ChartInChart/ChartInChart.ex5 b/BKPS/14031206/Experts/Examples/ChartInChart/ChartInChart.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..f6b7f77db683dfaadbf8fdb976aa204610c31ad5 GIT binary patch literal 18276 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 bX?ZnXcKGOoW!;1#-jS|&iC~0mS1^gNnmrfZ literal 0 HcmV?d00001 diff --git a/BKPS/14031206/Experts/Examples/ChartInChart/ChartInChart.mq5 b/BKPS/14031206/Experts/Examples/ChartInChart/ChartInChart.mq5 new file mode 100644 index 0000000000000000000000000000000000000000..3ae10829b653b97ae370e06b0cf5ff9c7fcb8a13 GIT binary patch literal 30544 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 VIjM}W{H>X${Eth`3(jVa`hVyemIeR- literal 0 HcmV?d00001 diff --git a/BKPS/14031206/Experts/Examples/Controls/Controls.ex5 b/BKPS/14031206/Experts/Examples/Controls/Controls.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..9417181e561e636b283e1c1502d42ba56887daf1 GIT binary patch literal 170410 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≷E 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�D(d_aM<9t1c##V8Cia(poN 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